commit 4c72a54cb0b2745713595adaecfc1bad548c03e0
Author: Thomas Schöpping <tschoepp@cit-ec.uni-bielefeld.de>
Date:   Mon Jul 15 13:21:06 2019 +0200

    Massive overhaul:
    - updated to a new version of AMiRo-LLD
    - tests (formerly unit tests) are now split onto multiple parts:
      - there are "global" tests for each driver etc.
      - there is an individual part for each module, e.g. if there are multiple instances of the same periphery
    - a lot of minor enhancements

diff --git a/amiroos.h b/amiroos.h
index fa9b740..251d8d2 100644
--- a/amiroos.h
+++ b/amiroos.h
@@ -90,7 +90,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "core/inc/aos_shell.h"
 #include "core/inc/aos_system.h"
 #include "core/inc/aos_thread.h"
-#include "core/inc/aos_unittest.h"
+#include "core/inc/aos_test.h"
 
 /* module specifications */
 #include <module.h>
diff --git a/amiroos.mk b/amiroos.mk
new file mode 100644
index 0000000..da99b7b
--- /dev/null
+++ b/amiroos.mk
@@ -0,0 +1,97 @@
+################################################################################
+# AMiRo-OS is an operating system designed for the Autonomous Mini Robot       #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2016..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).                              #
+################################################################################
+
+
+
+# absolute path to this directory
+AMIROOS_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+# set AMiRo-OS path variable
+AMIROOS := $(AMIROOS_DIR:/=)
+
+# load bootloader files
+include $(AMIROOS)/bootloader/bootloader.mk
+
+# load kernel files
+include $(AMIROOS)/kernel/kernel.mk
+
+# load peryphery LLD files
+include $(AMIROOS)/periphery-lld/periphery-lld.mk
+
+# load AMiRo-OS files
+include $(AMIROOS)/modules/modules.mk
+include $(AMIROOS)/core/core.mk
+include $(AMIROOS)/test/test.mk
+
+# inclusion directories
+AMIROOS_INC = $(CONFDIR) \
+              $(AMIROOS) \
+              $(AMIROOS_BOOTLOADER_INC) \
+              $(AMIROOS_KERNEL_INC) \
+              $(AMIROOS_PERIPHERYLLD_INC) \
+              $(AMIROOS_MODULES_INC) \
+              $(AMIROOS_CORE_INC) \
+              $(AMIROOS_TEST_INC) \
+              $(MODULE_INC) \
+              $(APPS_INC)
+
+# C sources that can be compiled in ARM or THUMB mode depending on the global setting
+AMIROOS_CSRC = $(AMIROOS_BOOTLOADER_CSRC) \
+               $(AMIROOS_KERNEL_CSRC) \
+               $(AMIROOS_PERIPHERYLLD_CSRC) \
+               $(AMIROOS_MODULES_CSRC) \
+               $(AMIROOS_CORE_CSRC) \
+               $(AMIROOS_TEST_CSRC) \
+               $(MODULE_CSRC) \
+               $(APPS_CSRC)
+
+# C++ sources that can be compiled in ARM or THUMB mode depending on the global setting
+AMIROOS_CPPSRC = $(AMIROOS_BOOTLOADER_CPPSRC) \
+                 $(AMIROOS_KERNEL_CPPSRC) \
+                 $(AMIROOS_PERIPHERYLLD_CPPSRC) \
+                 $(AMIROOS_MODULES_CPPSRC) \
+                 $(AMIROOS_CORE_CPPSRC) \
+                 $(AMIROOS_TEST_CPPSRC) \
+                 $(MODULE_CPPSRC) \
+                 $(APPS_CPPSRC)
+
+# ASM source files
+AMIROOS_ASMSRC = $(AMIROOS_BOOTLOADER_ASMSRC) \
+                 $(AMIROOS_KERNEL_ASMSRC) \
+                 $(AMIROOS_PERIPHERYLLD_ASMSRC) \
+                 $(AMIROOS_MODULES_ASMSRC) \
+                 $(AMIROOS_CORE_ASMSRC) \
+                 $(AMIROOS_TEST_ASMSRC) \
+                 $(MODULE_ASMSRC) \
+                 $(APPS_ASMSRC)
+
+# ASM with preprocessor source files here
+AMIROOS_ASMXSRC = $(AMIROOS_BOOTLOADER_ASMXSRC) \
+                  $(AMIROOS_KERNEL_ASMXSRC) \
+                  $(AMIROOS_PERIPHERYLLD_ASMXSRC) \
+                  $(AMIROOS_MODULES_ASMXSRC) \
+                  $(AMIROOS_CORE_ASMXSRC) \
+                  $(AMIROOS_TEST_ASMXSRC) \
+                  $(MODULE_ASMXSRC) \
+                  $(APPS_ASMXSRC)
+
diff --git a/bootloader/AMiRo-BLT b/bootloader/AMiRo-BLT
index e687187..591c0fd 160000
--- a/bootloader/AMiRo-BLT
+++ b/bootloader/AMiRo-BLT
@@ -1 +1 @@
-Subproject commit e687187fa4dbbfab6c4abfb180dfaf8f3829dfa6
+Subproject commit 591c0fd3a0677d69b3e1c89fa9e202797cb04a36
diff --git a/bootloader/bootloader.mk b/bootloader/bootloader.mk
index fc7b408..f5c6f7b 100644
--- a/bootloader/bootloader.mk
+++ b/bootloader/bootloader.mk
@@ -24,12 +24,16 @@
 
 
 # the path to this makefile
-BOOTLOADER_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+AMIROOS_BOOTLOADER_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
 
-# the interface for the bootloader
-BOOTLOADERINC = $(BOOTLOADER_DIR)AMiRo-BLT/Target/Source/AMiRo
+# set AMiRo-BLT path variable
+AMIROBLT := $(AMIROOS_BOOTLOADER_DIR)AMiRo-BLT
 
-include $(BOOTLOADER_DIR)AMiRo-BLT/Target/Modules/moduleids.mk
+# include paths
+AMIROOS_BOOTLOADER_INC = $(AMIROBLT)/Target/Source/AMiRo
+
+# load module ID constants
+include $(AMIROBLT)/Target/Modules/moduleids.mk
 
 # some flashing parameters
 ifeq ($(OS),Windows_NT)
@@ -52,20 +56,20 @@ endif
 FLASH_BAUDRATE ?= 115200
 
 # set the flashing tool, the command to call it, arguments, and file extensions
-ifneq ($(wildcard $(BOOTLOADER_DIR)AMiRo-BLT/Host/Source/SerialBoot/build/SerialBoot),)
+ifneq ($(wildcard $(AMIROBLT)/Host/Source/SerialBoot/build/SerialBoot),)
 	# if AMiRo-BLT project is available, use SerialBoot
-	FLASHTOOL = SerialBoot
-	FLASHTOOL_CMD = $(BOOTLOADER_DIR)AMiRo-BLT/Host/Source/SerialBoot/build/SerialBoot
-	FLASHTOOL_EXT = srec
+	FLASHTOOL := SerialBoot
+	FLASHTOOL_CMD := $(AMIROBLT)/Host/Source/SerialBoot/build/SerialBoot
+	FLASHTOOL_EXT := srec
 	FLASHTOOL_ARGS = -d$(FLASH_PORT) -b$(FLASH_BAUDRATE) $(foreach module,$(FLASH_MODULES),-T$($(module)_ID_HEX) $(BUILDDIR)/$(module).$(FLASHTOOL_EXT))
 else
 	# the default tool to use is stm32flash
 	ifneq ($(words $(FLASH_MODULES)),1)
 		FLASH_MODULES := $(firstword $(FLASH_MODULES))
 	endif
-	FLASHTOOL = stm32flash
-	FLASHTOOL_CMD = stm32flash
-	FLASHTOOL_EXT = hex
+	FLASHTOOL := stm32flash
+	FLASHTOOL_CMD := stm32flash
+	FLASHTOOL_EXT := hex
 	FLASHTOOL_ARGS = $(FLASH_PORT) -i "rts,-dtr,-rts":"rts,dtr,-rts" -R -b $(FLASH_BAUDRATE) -w $(BUILDDIR)/$(FLASH_MODULES).$(FLASHTOOL_EXT)
 endif
 
diff --git a/core/core.mk b/core/core.mk
index c647a16..a1c9dbc 100644
--- a/core/core.mk
+++ b/core/core.mk
@@ -27,11 +27,11 @@
 AMIROOS_CORE_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
 
 # include paths
-AMIROOSCOREINC = $(AMIROOS_CORE_DIR)inc
+AMIROOS_CORE_INC = $(AMIROOS_CORE_DIR)inc
 
 # C source files
-AMIROOSCORECSRC = $(wildcard $(AMIROOS_CORE_DIR)src/*.c)
+AMIROOS_CORE_CSRC = $(wildcard $(AMIROOS_CORE_DIR)src/*.[Cc])
 
 # C++ source files
-AMIROOSCORECPPSRC = $(wildcard $(AMIROOS_CORE_DIR)src/*.c?*)
+AMIROOS_CORE_CPPSRC = $(wildcard $(AMIROOS_CORE_DIR)src/*.[Cc]?*)
 
diff --git a/core/inc/aos_shell.h b/core/inc/aos_shell.h
index 4cc23fd..b54f46b 100644
--- a/core/inc/aos_shell.h
+++ b/core/inc/aos_shell.h
@@ -195,6 +195,10 @@ typedef struct aos_shellstream {
 
 /**
  * @brief   Shell command calback type.
+ *
+ * @param[in] stream  Stream to print to.
+ * @param[in] argc    Number of arguments.
+ * @param[in] argv    List of arguments.
  */
 typedef int (*aos_shellcmdcb_t)(BaseSequentialStream* stream, int argc, char* argv[]);
 
@@ -373,6 +377,19 @@ typedef struct aos_shell {
 /* MACROS                                                                     */
 /******************************************************************************/
 
+/**
+ * @brief   Initializes a shell command object.
+ *
+ * @param[in] var       Name of the object variable to be initialized.
+ * @param[in] name      Shell command name.
+ * @param[in] callback  Pointer to the callback function.
+ */
+#define AOS_SHELL_COMMAND(var, name, callback) aos_shellcommand_t var = {     \
+  /* name     */ name,                                                        \
+  /* callback */ callback,                                                    \
+  /* next     */ NULL,                                                        \
+}
+
 /******************************************************************************/
 /* EXTERN DECLARATIONS                                                        */
 /******************************************************************************/
diff --git a/core/inc/aos_test.h b/core/inc/aos_test.h
new file mode 100644
index 0000000..bf72354
--- /dev/null
+++ b/core/inc/aos_test.h
@@ -0,0 +1,175 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+/**
+ * @file    aos_test.h
+ * @brief   Test structures and interfaces.
+ *
+ * @addtogroup aos_unittests
+ * @{
+ */
+
+#ifndef AMIROOS_TEST_H
+#define AMIROOS_TEST_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/*
+ * forward declarations
+ */
+typedef struct aos_testresult aos_testresult_t;
+typedef struct aos_test aos_test_t;
+
+/**
+ * @brief   Test interface function definition.
+ *
+ * @param[in] stream  The stream to use for printing messages.
+ * @param[in] ut      The object to run the test on.
+ *
+ * @return    Result containing the number of passed and failed tests.
+ */
+typedef aos_testresult_t (*aos_testfunction_t)(BaseSequentialStream* stream, const aos_test_t* test);
+
+/**
+ * @brief   Wrapper interface definition to allow programmatical shell-like call
+ *          of the test.
+ * @details While the first three arguments (stream, argc and argv) as well as
+ *          the return value are identical to a shell command, the additional
+ *          optional argument (result) is set by the function.
+ *
+ * @param[in]   stream  Stream to print to.
+ * @param[in]   argc    Number of arguments given.
+ * @param[in]   argv    List of arguments.
+ * @param[out]  result  Result of the test (optional).
+ *
+ * @return    Execution status of the function, which can be passed on to a
+ *            shell callback.
+ */
+typedef int (*aos_testshellcallback_t)(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+
+/**
+ * @brief   Test result struct.
+ */
+struct aos_testresult {
+  /**
+   * @brief   Number of passed tests.
+   */
+  uint32_t passed;
+
+  /**
+   * @brief   Number of failed tests.
+   */
+  uint32_t failed;
+};
+
+/**
+ * @brief   Test definition struct.
+ */
+struct aos_test {
+  /**
+   * @brief   Name of the test.
+   */
+  const char* name;
+
+  /**
+   * @brief   Further information about the test.
+   */
+  const char* info;
+
+  /**
+   * @brief   Callback function to serve as wrapper between shell and test.
+   *
+   * @details The purpose of this wrapper is to be able to execute tests
+   *          programatically exactly like a shell command from the CLI. It
+   *          should handle any required setup depending on given arguments and
+   *          eventually execute the test.
+   */
+  aos_testshellcallback_t shellcb;
+
+  /**
+   * @brief   Callback function to run that executes the test.
+   */
+  aos_testfunction_t testfunc;
+
+  /**
+   * @brief   Further test specific data.
+   */
+  void* data;
+};
+
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+#define AOS_TEST(var, name, info, shellcb, testfunc, data) aos_test_t var = { \
+  /* name     */ name,                                                        \
+  /* info     */ info,                                                        \
+  /* shellcb  */ shellcb,                                                     \
+  /* testfunc */ testfunc,                                                    \
+  /* data     */ data,                                                        \
+}
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestResultAdd(aos_testresult_t a, aos_testresult_t b);
+  uint32_t aosTestResultTotal(const aos_testresult_t* result);
+  float aosTestResultRatio(const aos_testresult_t* result);
+  void aosTestResultPrintSummary(BaseSequentialStream* stream, const aos_testresult_t* result, const char* heading);
+  aos_testresult_t aosTestRun(BaseSequentialStream* stream, const aos_test_t* test, const char* note);
+  void aosTestPassed(BaseSequentialStream* stream, aos_testresult_t* result);
+  void aosTestPassedMsg(BaseSequentialStream* stream, aos_testresult_t* result, const char* fmt, ...);
+  void aosTestFailed(BaseSequentialStream* stream, aos_testresult_t* result);
+  void aosTestFailedMsg(BaseSequentialStream* stream, aos_testresult_t* result, const char* fmt, ...);
+  void aosTestInfoMsg(BaseSequentialStream* stream, const char* fmt, ...);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_H */
+
+/** @} */
diff --git a/core/inc/aos_unittest.h b/core/inc/aos_unittest.h
deleted file mode 100644
index a3e7631..0000000
--- a/core/inc/aos_unittest.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-/**
- * @file    aos_unittest.h
- * @brief   Unittest structures.
- *
- * @addtogroup aos_unittests
- * @{
- */
-
-#ifndef AMIROOS_UNITTEST_H
-#define AMIROOS_UNITTEST_H
-
-#include <amiroos.h>
-
-#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/*
- * forward declarations
- */
-typedef struct aos_utresult aos_utresult_t;
-typedef struct aos_unittest aos_unittest_t;
-
-/**
- * @brief   Unit test interface function definition.
- *
- * @param[in] stream  The stream to use for printing messages.
- * @param[in] ut      The object to run the test on.
- *
- * @return    A result containing the number of passed and failed tests.
- */
-typedef aos_utresult_t (*aos_utfunction_t)(BaseSequentialStream*, aos_unittest_t*);
-
-/**
- * @brief   Unit test result struct.
- */
-struct aos_utresult {
-  /**
-   * @brief   Number of passed tests.
-   */
-  uint32_t passed;
-
-  /**
-   * @brief   Number of failed tests.
-   */
-  uint32_t failed;
-};
-
-/**
- * @brief   Unit test definition struct.
- */
-struct aos_unittest {
-  /**
-   * @brief   Name of the unit test.
-   */
-  const char* name;
-
-  /**
-   * @brief   Further information about the test.
-   */
-  const char* info;
-
-  /**
-   * @brief   Callback function to run that executes the unit test.
-   */
-  aos_utfunction_t testfunc;
-
-  /**
-   * @brief   Shell command to add to an shell command list.
-   */
-  aos_shellcommand_t shellcmd;
-
-  /**
-   * @brief   Further test specific data.
-   */
-  void* data;
-};
-
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  uint32_t aosUtResultTotal(aos_utresult_t* result);
-  float aosUtResultRatio(aos_utresult_t* result);
-  void aosUtResultPrintSummary(BaseSequentialStream* stream, aos_utresult_t* result, char* heading);
-  void aosUtObjectInit(aos_unittest_t* ut, char* name, char* info, aos_utfunction_t func, void* data, char* shellname, aos_shellcmdcb_t shellcb);
-  aos_utresult_t aosUtRun(BaseSequentialStream* stream, aos_unittest_t* ut, char* note);
-  void aosUtPassed(BaseSequentialStream* stream, aos_utresult_t* result);
-  void aosUtPassedMsg(BaseSequentialStream* stream, aos_utresult_t* result, const char* fmt, ...);
-  void aosUtFailed(BaseSequentialStream* stream, aos_utresult_t* result);
-  void aosUtFailedMsg(BaseSequentialStream* stream, aos_utresult_t* result, const char* fmt, ...);
-  void aosUtInfoMsg(BaseSequentialStream* stream, const char* fmt, ...);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
-
-#endif /* AMIROOS_UNITTEST_H */
-
-/** @} */
diff --git a/core/src/aos_main.cpp b/core/src/aos_main.cpp
index 9aff409..37a8c1c 100644
--- a/core/src/aos_main.cpp
+++ b/core/src/aos_main.cpp
@@ -996,11 +996,11 @@ int main(void)
 #endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4_ARGS) */
 #endif /* defined(AMIROOS_CFG_MAIN_INIT_HOOK_4) */
 
-  /* periphery communication initialization */
+  /* periphery communication interfaces initialization */
   // module specific initialization (if any)
-#if defined(MODULE_INIT_PERIPHERY_COMM)
-  MODULE_INIT_PERIPHERY_COMM();
-#endif /* defined(MODULE_INIT_PERIPHERY_COMM) */
+#if defined(MODULE_INIT_PERIPHERY_IF)
+  MODULE_INIT_PERIPHERY_IF();
+#endif /* defined(MODULE_INIT_PERIPHERY_IF) */
 #if ((SSSP_STAGE3_ENABLE == true) && (HAL_USE_CAN == TRUE))
   // CAN
   if (MODULE_HAL_CAN.state == CAN_STOP) {
@@ -1339,10 +1339,10 @@ int main(void)
 #endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3_ARGS) */
 #endif /* defined(AMIROOS_CFG_MAIN_SHUTDOWN_HOOK_3) */
 
-  /* stop all periphery communication */
-#if defined(MODULE_SHUTDOWN_PERIPHERY_COMM)
-  MODULE_SHUTDOWN_PERIPHERY_COMM();
-#endif /* defined(MODULE_SHUTDOWN_PERIPHERY_COMM) */
+  /* stop all periphery communication interfaces */
+#if defined(MODULE_SHUTDOWN_PERIPHERY_IF)
+  MODULE_SHUTDOWN_PERIPHERY_IF();
+#endif /* defined(MODULE_SHUTDOWN_PERIPHERY_IF) */
 #if (HAL_USE_CAN == TRUE)
   if (MODULE_HAL_CAN.state != CAN_STOP) {
     canStop(&MODULE_HAL_CAN);
diff --git a/core/src/aos_system.c b/core/src/aos_system.c
index 3450b97..6917d4b 100644
--- a/core/src/aos_system.c
+++ b/core/src/aos_system.c
@@ -147,43 +147,27 @@ static char* _shell_arglist[AMIROOS_CFG_SHELL_MAXARGS];
 /**
  * @brief   Shell command to retrieve system information.
  */
-static aos_shellcommand_t _shellcmd_info = {
-  /* name     */ "module:info",
-  /* callback */ _shellcmd_infocb,
-  /* next     */ NULL,
-};
+static AOS_SHELL_COMMAND(_shellcmd_info, "module:info", _shellcmd_infocb);
 
 /**
  * @brief   Shell command to set or retrieve system configuration.
  */
-static aos_shellcommand_t _shellcmd_config = {
-  /* name     */ "module:config",
-  /* callback */ _shellcmd_configcb,
-  /* next     */ NULL,
-};
+static AOS_SHELL_COMMAND(_shellcmd_config, "module:config", _shellcmd_configcb);
 
 /**
  * @brief   Shell command to shutdown the system.
  */
-static aos_shellcommand_t _shellcmd_shutdown = {
 #if (AMIROOS_CFG_SSSP_ENABLE == true)
-  /* name     */ "system:shutdown",
+static AOS_SHELL_COMMAND(_shellcmd_shutdown, "system:shutdown", _shellcmd_shutdowncb);
 #else /* (AMIROOS_CFG_SSSP_ENABLE == true) */
-  /* name     */ "module:shutdown",
+static AOS_SHELL_COMMAND(_shellcmd_shutdown, "module:shutdown", _shellcmd_shutdowncb);
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
-  /* callback */ _shellcmd_shutdowncb,
-  /* next     */ NULL,
-};
 
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 /**
  * @brief   Shell kommand to run a test of the ChibiOS/RT kernel.
  */
-static aos_shellcommand_t _shellcmd_kerneltest = {
-  /* name     */ "kernel:test",
-  /* callback */ _shellcmd_kerneltestcb,
-  /* next     */ NULL,
-};
+static AOS_SHELL_COMMAND(_shellcmd_kerneltest, "kernel:test", _shellcmd_kerneltestcb);
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 #endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
 
@@ -561,7 +545,7 @@ static int _shellcmd_infocb(BaseSequentialStream* stream, int argc, char* argv[]
 #if (AMIROOS_CFG_DBG == true)
   chprintf(stream, "\tthread stack size:      %u bytes\n", aosThdGetStacksize(aos.shell.thread));
 #if (CH_DBG_FILL_THREADS == TRUE)
-  chprintf(stream, "\tstack peak utilization: %u bytes (%.2f%%)\n", aosThdGetStackPeakUtilization(aos.shell.thread), (float)aosThdGetStackPeakUtilization(aos.shell.thread) / (float)aosThdGetStacksize(aos.shell.thread) * 100.0f);
+  chprintf(stream, "\tstack peak utilization: %u bytes (%.2f%%)\n", aosThdGetStackPeakUtilization(aos.shell.thread), (float)(aosThdGetStackPeakUtilization(aos.shell.thread)) / (float)(aosThdGetStacksize(aos.shell.thread)) * 100.0f);
 #endif /* (CH_DBG_FILL_THREADS == TRUE) */
 #endif /* (AMIROOS_CFG_DBG == true) */
   _printSystemInfoSeparator(stream, '=', SYSTEM_INFO_WIDTH);
diff --git a/core/src/aos_test.c b/core/src/aos_test.c
new file mode 100644
index 0000000..3f3cfc0
--- /dev/null
+++ b/core/src/aos_test.c
@@ -0,0 +1,286 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+/**
+ * @file    aos_test.c
+ * @brief   Test code.
+ * @details Functions to initialize and run tests,
+ *          as well as utility functions to be used in tests.
+ *
+ * @addtogroup aos_tests
+ * @{
+ */
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <string.h>
+#include <stdarg.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   Adds two result objects.
+ *
+ * @param[in] a   The first summand.
+ * @param[in] b   The second summand.
+ *
+ * @return    Resulting sum of both summands added.
+ */
+inline aos_testresult_t aosTestResultAdd(aos_testresult_t a, aos_testresult_t b)
+{
+  a.passed += b.passed;
+  a.failed += b.failed;
+
+  return a;
+}
+
+/**
+ * @brief   Retrieve the total number of tests (passed and failed).
+ *
+ * @param[in] result    The result object to evaluate.
+ *
+ * @return  Number of total tests executed.
+ */
+inline uint32_t aosTestResultTotal(const aos_testresult_t* result)
+{
+  aosDbgCheck(result != NULL);
+
+  return result->passed + result->failed;
+}
+
+/**
+ * @brief   Retrieve the ratio of passed tests.
+ *
+ * @param[in] result    The result object to evaluate.
+ *
+ * @return  Ratio of passed tests to total tests as float in range [0, 1].
+ */
+inline float aosTestResultRatio(const aos_testresult_t *result)
+{
+  aosDbgCheck(result != NULL);
+
+  if (aosTestResultTotal(result) > 0) {
+    return (float)result->passed / (float)(aosTestResultTotal(result));
+  } else {
+    return 1.0f;
+  }
+}
+
+/**
+ * @brief   Print the summary of a test.
+ * @details The summary consists of:
+ *          - total numer of tests executed
+ *          - absolute number of passed tests
+ *          - absolute number of failed tests
+ *          - relative ratio of passed tests
+ *
+ * @param[in] stream    Stream to print the result to.
+ * @param[in] result    Result to evaluate and print.
+ * @param[in] heading   Optional heading (defaults to "summary").
+ */
+void aosTestResultPrintSummary(BaseSequentialStream *stream, const aos_testresult_t* result, const char* heading)
+{
+  aosDbgCheck(stream != NULL);
+  aosDbgCheck(result != NULL);
+
+  chprintf(stream, "%s:\n", (heading != NULL) ? heading : "summary");
+  chprintf(stream, "\ttotal:  %3u\n", aosTestResultTotal(result));
+  chprintf(stream, "\tpassed: %3u\n", result->passed);
+  chprintf(stream, "\tfailed: %3u\n", result->failed);
+  chprintf(stream, "\tratio:  %3u%%\n", (uint8_t)(aosTestResultRatio(result) * 100.0f)); // implicitly rounded off by cast to integer
+
+  return;
+}
+
+/**
+ * @brief   Run a test.
+ *
+ * @param[in] stream  A stream for printing messages.
+ * @param[in] test    Test to execute.
+ * @param[in] note    Optional note string.
+ *
+ * @return    Result of the test.
+ */
+aos_testresult_t aosTestRun(BaseSequentialStream *stream, const aos_test_t *test, const char* note)
+{
+  aosDbgCheck(stream != NULL);
+  aosDbgCheck(test != NULL);
+
+  // print name heading
+  {
+    chprintf(stream, "\n");
+    const int nchars = chprintf(stream, "%s test\n", test->name);
+    for (int c = 0; c < nchars-1; ++c) {
+      chprintf(stream, "=");
+    }
+    chprintf(stream, "\n");
+  }
+
+  // print info (if any)
+  if (test->info != NULL) {
+    chprintf(stream, "info: %s\n", test->info);
+  }
+  // print note (if any)
+  if (note != NULL) {
+    chprintf(stream, "note: %s\n", note);
+  }
+  chprintf(stream, "\n");
+
+  // run test
+  aos_testresult_t result = test->testfunc(stream, test);
+
+  // print summary
+  aosTestResultPrintSummary(stream, &result, NULL);
+
+  return result;
+}
+
+/**
+ * @brief   Helper function for passed tests.
+ * @details Prints a message that the test was passed and modifies the result accordigly.
+ *
+ * @param[in] stream      Stream to print the message to.
+ * @param[in,out] result  Result object to modify.
+ */
+void aosTestPassed(BaseSequentialStream *stream, aos_testresult_t* result)
+{
+  aosDbgCheck(stream != NULL);
+  aosDbgCheck(result != NULL);
+
+  ++result->passed;
+  chprintf(stream, "\tPASSED\n");
+  chprintf(stream, "\n");
+
+  return;
+}
+
+/**
+ * @brief   Helper function for passed tests.
+ * @details Prints a message that the test was passed, an additional custom message, and modifies the result accordigly.
+ *
+ * @param[in] stream      Stream to print the message to.
+ * @param[in,out] result  Result object to modify.
+ * @param[in] fmt         Formatted message string.
+ */
+void aosTestPassedMsg(BaseSequentialStream *stream, aos_testresult_t* result, const char *fmt, ...)
+{
+  aosDbgCheck(stream != NULL);
+  aosDbgCheck(result != NULL);
+
+  va_list ap;
+
+  ++result->passed;
+  chprintf(stream, "\tPASSED\t");
+  va_start(ap, fmt);
+  chvprintf(stream, fmt, ap);
+  va_end(ap);
+  chprintf(stream, "\n");
+
+  return;
+}
+
+/**
+ * @brief   Helper function for failed tests.
+ * @details Prints a message that the test was failed and modifies the result accordigly.
+ *
+ * @param[in] stream      Stream to print the message to.
+ * @param[in,out] result  Result object to modify.
+ */
+void aosTestFailed(BaseSequentialStream *stream, aos_testresult_t* result)
+{
+  aosDbgCheck(stream != NULL);
+  aosDbgCheck(result != NULL);
+
+  ++result->failed;
+  chprintf(stream, "\tFAILED\n");
+  chprintf(stream, "\n");
+
+  return;
+}
+
+/**
+ * @brief   Helper function for failed tests.
+ * @details Prints a message that the test was failed, an additional custom message, and modifies the result accordigly.
+ *
+ * @param[in] stream      Stream to print the message to.
+ * @param[in,out] result  Result object to modify.
+ * @param[in] fmt         Formatted message string.
+ */
+void aosTestFailedMsg(BaseSequentialStream *stream, aos_testresult_t* result, const char *fmt, ...)
+{
+  aosDbgCheck(stream != NULL);
+  aosDbgCheck(result != NULL);
+
+  va_list ap;
+
+  ++result->failed;
+  chprintf(stream, "\tFAILED\t");
+  va_start(ap, fmt);
+  chvprintf(stream, fmt, ap);
+  va_end(ap);
+  chprintf(stream, "\n");
+
+  return;
+}
+
+/**
+ * @brief   Helper function for information messages.
+ *
+ * @param[in] stream  Strean to rpint the message to.
+ * @param[in] fmt     Formatted message string.
+ */
+void aosTestInfoMsg(BaseSequentialStream* stream, const char* fmt, ...)
+{
+  aosDbgCheck(stream != NULL);
+
+  va_list ap;
+  va_start(ap, fmt);
+  chvprintf(stream, fmt, ap);
+  va_end(ap);
+  chprintf(stream, "\n");
+
+  return;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+/** @} */
diff --git a/core/src/aos_unittest.c b/core/src/aos_unittest.c
deleted file mode 100644
index 849ea1e..0000000
--- a/core/src/aos_unittest.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-/**
- * @file    aos_unittest.c
- * @brief   Unittest code.
- * @details Functions to initialize and run unittests, 
- *          as well as utility functions to be used in unittests.
- *
- * @addtogroup aos_unittests
- * @{
- */
-
-#include <amiroos.h>
-#include <string.h>
-
-#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   Retrieve the total number of tests (passed and failed).
- *
- * @param[in] result    The result object to evaluate.
- *
- * @return  Number of total tests executed.
- */
-inline uint32_t aosUtResultTotal(aos_utresult_t *result)
-{
-  aosDbgCheck(result != NULL);
-
-  return result->passed + result->failed;
-}
-
-/**
- * @brief   Retrieve the ratio of passed tests.
- *
- * @param[in] result    The result object to evaluate.
- *
- * @return  Ratio of passed tests to total tests as float in range [0, 1].
- */
-inline float aosUtResultRatio(aos_utresult_t *result)
-{
-  aosDbgCheck(result != NULL);
-
-  if (aosUtResultTotal(result) > 0) {
-    return (float)result->passed / (float)aosUtResultTotal(result);
-  } else {
-    return 1.0f;
-  }
-}
-
-/**
- * @brief   Print the summary of a test.
- * @details The summary consists of:
- *          - total numer of tests executed
- *          - absolute number of passed tests
- *          - absolute number of failed tests
- *          - relative ratio of passed tests
- *
- * @param[in] stream    Stream to print the result to.
- * @param[in] result    Result to evaluate and print.
- * @param[in] heading   Optional heading (defaults to "summary").
- */
-void aosUtResultPrintSummary(BaseSequentialStream *stream, aos_utresult_t *result, char* heading)
-{
-  aosDbgCheck(stream != NULL);
-  aosDbgCheck(result != NULL);
-
-  chprintf(stream, "%s:\n", (heading != NULL) ? heading : "summary");
-  chprintf(stream, "\ttotal:  %3u\n", aosUtResultTotal(result));
-  chprintf(stream, "\tpassed: %3u\n", result->passed);
-  chprintf(stream, "\tfailed: %3u\n", result->failed);
-  chprintf(stream, "\tratio:  %3u%%\n", (uint8_t)(aosUtResultRatio(result) * 100.0f));
-
-  return;
-}
-
-/**
- * @brief   Initialize a unit test object.
- *
- * @param[in] ut          The unit test object to initialize.
- * @param[in] name        name of the unit test.
- * @param[in] info        Optional information string.
- * @param[in] func        Unit test calback function.
- * @param[in] data        Optional data for the unit test.
- * @param[in] shellname   Name of the shell command
- * @param[in] shellcb     Callback for the shell command.
- */
-void aosUtObjectInit(aos_unittest_t* ut, char* name, char* info, aos_utfunction_t func, void* data, char* shellname, aos_shellcmdcb_t shellcb)
-{
-  aosDbgCheck(ut != NULL);
-  aosDbgCheck(name != NULL && strlen(name) > 0);
-  aosDbgCheck(func != NULL);
-  aosDbgCheck(shellname != NULL && strlen(shellname) > 0);
-  aosDbgCheck(shellcb != NULL);
-
-  ut->name = name;
-  ut->info = info;
-  ut->testfunc = func;
-  ut->shellcmd.name = shellname;
-  ut->shellcmd.callback = shellcb;
-  ut->shellcmd.next = NULL;
-  ut->data = data;
-
-  return;
-}
-
-/**
- * @brief   Run an unit test.
- *
- * @param[in] stream  A stream for printing messages.
- * @param[in] ut      Unit test to execute.
- * @param[in] note    Optional note string.
- *
- * @return    Result of the test.
- */
-aos_utresult_t aosUtRun(BaseSequentialStream *stream, aos_unittest_t *ut, char *note)
-{
-  aosDbgCheck(stream != NULL);
-  aosDbgCheck(ut != NULL);
-
-  // print name heading
-  {
-    chprintf(stream, "\n");
-    const int nchars = chprintf(stream, "%s unit test\n", ut->name);
-    for (int c = 0; c < nchars-1; ++c) {
-      chprintf(stream, "=");
-    }
-    chprintf(stream, "\n");
-  }
-
-  // print info (if any)
-  if (ut->info != NULL) {
-    chprintf(stream, "info: %s\n", ut->info);
-  }
-  // print note (if any)
-  if (note != NULL) {
-    chprintf(stream, "note: %s\n", note);
-  }
-  chprintf(stream, "\n");
-
-  // run test
-  aos_utresult_t result = ut->testfunc(stream, ut);
-
-  // print summary
-  aosUtResultPrintSummary(stream, &result, NULL);
-
-  return result;
-}
-
-/**
- * @brief   Helper function for passed tests.
- * @details Prints a message that the test was passed and modifies the result accordigly.
- *
- * @param[in] stream      Stream to print the message to.
- * @param[in,out] result  Result object to modify.
- */
-void aosUtPassed(BaseSequentialStream *stream, aos_utresult_t* result)
-{
-  aosDbgCheck(stream != NULL);
-  aosDbgCheck(result != NULL);
-
-  ++result->passed;
-  chprintf(stream, "\tPASSED\n");
-  chprintf(stream, "\n");
-
-  return;
-}
-
-/**
- * @brief   Helper function for passed tests.
- * @details Prints a message that the test was passed, an additional custom message, and modifies the result accordigly.
- *
- * @param[in] stream      Stream to print the message to.
- * @param[in,out] result  Result object to modify.
- * @param[in] fmt         Formatted message string.
- */
-void aosUtPassedMsg(BaseSequentialStream *stream, aos_utresult_t* result, const char *fmt, ...)
-{
-  aosDbgCheck(stream != NULL);
-  aosDbgCheck(result != NULL);
-
-  va_list ap;
-
-  ++result->passed;
-  chprintf(stream, "\tPASSED\t");
-  va_start(ap, fmt);
-  chvprintf(stream, fmt, ap);
-  va_end(ap);
-  chprintf(stream, "\n");
-
-  return;
-}
-
-/**
- * @brief   Helper function for failed tests.
- * @details Prints a message that the test was failed and modifies the result accordigly.
- *
- * @param[in] stream      Stream to print the message to.
- * @param[in,out] result  Result object to modify.
- */
-void aosUtFailed(BaseSequentialStream *stream, aos_utresult_t* result)
-{
-  aosDbgCheck(stream != NULL);
-  aosDbgCheck(result != NULL);
-
-  ++result->failed;
-  chprintf(stream, "\tFAILED\n");
-  chprintf(stream, "\n");
-
-  return;
-}
-
-/**
- * @brief   Helper function for failed tests.
- * @details Prints a message that the test was failed, an additional custom message, and modifies the result accordigly.
- *
- * @param[in] stream      Stream to print the message to.
- * @param[in,out] result  Result object to modify.
- * @param[in] fmt         Formatted message string.
- */
-void aosUtFailedMsg(BaseSequentialStream *stream, aos_utresult_t* result, const char *fmt, ...)
-{
-  aosDbgCheck(stream != NULL);
-  aosDbgCheck(result != NULL);
-
-  va_list ap;
-
-  ++result->failed;
-  chprintf(stream, "\tFAILED\t");
-  va_start(ap, fmt);
-  chvprintf(stream, fmt, ap);
-  va_end(ap);
-  chprintf(stream, "\n");
-
-  return;
-}
-
-/**
- * @brief   Helper function for information messages.
- *
- * @param[in] stream  Strean to rpint the message to.
- * @param[in] fmt     Formatted message string.
- */
-void aosUtInfoMsg(BaseSequentialStream* stream, const char* fmt, ...)
-{
-  aosDbgCheck(stream != NULL);
-
-  va_list ap;
-  va_start(ap, fmt);
-  chvprintf(stream, fmt, ap);
-  va_end(ap);
-  chprintf(stream, "\n");
-
-  return;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
-
-/** @} */
diff --git a/kernel/kernel.mk b/kernel/kernel.mk
index 0f51d4a..5009cb0 100644
--- a/kernel/kernel.mk
+++ b/kernel/kernel.mk
@@ -1,3 +1,94 @@
+################################################################################
+# AMiRo-OS is an operating system designed for the Autonomous Mini Robot       #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2016..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).                              #
+################################################################################
+
+
+
 # set kernel path variable
-AMIROOS_KERNEL = $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))/ChibiOS
+AMIROOS_KERNEL_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+# set ChibiOS path variable
+CHIBIOS := $(AMIROOS_KERNEL_DIR)ChibiOS
+
+# load licensing files
+include $(CHIBIOS)/os/license/license.mk
+
+# load startup files
+## must be loaded by each module individually
+
+# load HAL-OSAL files
+include $(CHIBIOS)/os/hal/hal.mk
+## platform.mk must be loaded by each module individually
+include $(CHIBIOS)/os/hal/osal/rt/osal.mk
+include $(CHIBIOS)/os/hal/lib/streams/streams.mk
+
+# load RTOS files
+include $(CHIBIOS)/os/rt/rt.mk
+## compiler port must be loaded by each module individually
+
+## load auto-build files in ./source recursively.
+#include $(CHIBIOS)/tools/mk/autobuild.mk
+
+# load test files
+include $(CHIBIOS)/test/lib/test.mk
+include $(CHIBIOS)/test/rt/rt_test.mk
+include $(CHIBIOS)/test/oslib/oslib_test.mk
+
+# include paths
+AMIROOS_KERNEL_INC = $(ALLINC) \
+                     $(TESTINC) \
+                     $(CHIBIOS)/os/hal/lib/streams
+
+# C source files
+AMIROOS_KERNEL_CSRC = $(ALLCSRC) \
+                      $(CHIBIOS)/os/various/syscalls.c \
+                      $(CHIBIOS)/os/various/evtimer.c \
+                      $(TESTSRC)
+
+# C++ source files
+AMIROOS_KERNEL_CPPSRC = $(ALLCPPSRC) \
+                        $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp
+
+# ASM source files
+AMIROOS_KERNEL_ASMSRC = $(ALLASMSRC)
+
+# ASM with preprocessor source files
+AMIROOS_KERNEL_ASMXSRC = $(ALLXASMSRC)
+
+### Information forwarded to ChibiOS ###
+# Inclusion directories.
+INCDIR = $(AMIROOS_INC)
+
+# C sources that can be compiled in ARM or THUMB mode depending on the global
+# setting.
+CSRC = $(AMIROOS_CSRC)
+
+# C++ sources that can be compiled in ARM or THUMB mode depending on the global
+# setting.
+CPPSRC = $(AMIROOS_CPPSRC)
+
+# List ASM source files here.
+ASMSRC = $(AMIROOS_ASMSRC)
+
+# List ASM with preprocessor source files here.
+ASMXSRC = $(AMIROOS_ASMXSRC)
 
diff --git a/modules/DiWheelDrive_1-1/Makefile b/modules/DiWheelDrive_1-1/Makefile
index 2218186..f623128 100644
--- a/modules/DiWheelDrive_1-1/Makefile
+++ b/modules/DiWheelDrive_1-1/Makefile
@@ -112,100 +112,71 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m3
+MCU := cortex-m3
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F103xE.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F103xE.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/A3906/v1 \
+                            $(AMIROLLD)/drivers/AT24C01B/v1 \
+                            $(AMIROLLD)/drivers/HMC5883L/v1 \
+                            $(AMIROLLD)/drivers/INA219/v1 \
+                            $(AMIROLLD)/drivers/L3G4200D/v1 \
+                            $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/LIS331DLH/v1 \
+                            $(AMIROLLD)/drivers/LTC4412/v1 \
+                            $(AMIROLLD)/drivers/PCA9544A/v1 \
+                            $(AMIROLLD)/drivers/TPS6211x/v1 \
+                            $(AMIROLLD)/drivers/VCNL4020/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/A3906_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/AT24C01B_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/HMC5883L_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/L3G4200D_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LIS331DLH_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LTC4412_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PCA9544A_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS6211x_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/VCNL4020_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 # Create an additional .srec image file.
diff --git a/modules/DiWheelDrive_1-1/alldconf.h b/modules/DiWheelDrive_1-1/alldconf.h
index 9a2c97b..a9d0072 100644
--- a/modules/DiWheelDrive_1-1/alldconf.h
+++ b/modules/DiWheelDrive_1-1/alldconf.h
@@ -43,61 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-/**
- * @brief   Enable flag for the A3906 motor driver.
- */
-#define AMIROLLD_CFG_A3906                      1
-
-/**
- * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
- */
-#define AMIROLLD_CFG_AT24C01B                   1
-
-/**
- * @brief   Enable flag for the MHC5883L compass.
- */
-#define AMIROLLD_CFG_HMC5883L                   1
-
-/**
- * @brief   Enable flag for the INA219 power monitor.
- */
-#define AMIROLLD_CFG_INA219                     1
-
-/**
- * @brief   Enable flag for the L3G4200D gyroscope.
- */
-#define AMIROLLD_CFG_L3G4200D                   1
-
-/**
- * @brief   Enable flag for the status LED.
- */
-#define AMIROLLD_CFG_LED                        1
-
-/**
- * @brief   Enable flag for the LIS331DLH accelerometer.
- */
-#define AMIROLLD_CFG_LIS331DLH                  1
-
-/**
- * @brief   Enable flag for the LTC4412 power path controller.
- */
-#define AMIROLLD_CFG_LTC4412                    1
-
-/**
- * @brief   Enable flag for the PCA9544A I2C multiplexer.
- */
-#define AMIROLLD_CFG_PCA9544A                   1
-
-/**
- * @brief   Enable flag for the TPS62113 step-down converter.
- */
-#define AMIROLLD_CFG_TPS6211x                   1
-
-/**
- * @brief   Enable flag for the VCNL4020 proximity sensor.
- */
-#define AMIROLLD_CFG_VCNL4020                   1
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/DiWheelDrive_1-1/halconf.h b/modules/DiWheelDrive_1-1/halconf.h
index 6bee851..dc2d320 100644
--- a/modules/DiWheelDrive_1-1/halconf.h
+++ b/modules/DiWheelDrive_1-1/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/DiWheelDrive_1-1/module.c b/modules/DiWheelDrive_1-1/module.c
index 77f7e43..0cf6a90 100644
--- a/modules/DiWheelDrive_1-1/module.c
+++ b/modules/DiWheelDrive_1-1/module.c
@@ -145,7 +145,7 @@ ROMCONST apalControlGpio_t moduleGpioLed = {
   /* GPIO */ &_gpioLed,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ LED_LLD_GPIO_ACTIVE_STATE,
+    /* active state   */ APAL_GPIO_ACTIVE_LOW,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -415,383 +415,201 @@ VCNL4020Driver moduleLldProximity = {
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <string.h>
 
 /*
  * A3906 (motor driver)
  */
-static int _utShellCmdCb_AlldA3906(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_A3906.h>
+static int _testA3906ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldA3906, NULL);
-  return AOS_OK;
+  return moduleTestA3906ShellCb(stream, argc, argv, NULL);
 }
-static ut_a3906data_t _utA3906Data = {
-  /* driver           */ &moduleLldMotors,
-  /* PWM information  */ {
-    /* driver   */ &MODULE_HAL_PWM_DRIVE,
-    /* channels */ {
-      /* left wheel forward   */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_FORWARD,
-      /* left wheel backward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_BACKWARD,
-      /* right wheel forward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_FORWARD,
-      /* right wheel backward */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_BACKWARD,
-    },
-  },
-  /* QEI information  */ {
-    /* left wheel               */ &MODULE_HAL_QEI_LEFT_WHEEL,
-    /* right wheel              */ &MODULE_HAL_QEI_RIGHT_WHEEL,
-    /* increment per revolution */ MODULE_HAL_QEI_INCREMENTS_PER_REVOLUTION,
-  },
-  /* Wheel diameter   */ {
-    /* left wheel   */ 0.05571f,
-    /* right wheel  */ 0.05571f,
-  },
-  /* timeout          */ 10 * MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldA3906  = {
-  /* name           */ "A3906",
-  /* info           */ "motor driver",
-  /* test function  */ utAlldA3906Func,
-  /* shell command  */ {
-    /* name     */ "unittest:MotorDriver",
-    /* callback */ _utShellCmdCb_AlldA3906,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utA3906Data,
-};
+AOS_SHELL_COMMAND(moduleTestA3906ShellCmd, "test:MotorDriver", _testA3906ShellCmdCb);
 
 /*
- * AT24C01B (EEPROM)
+ * AT24C01BN-SH-B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT24C01B.h>
+static int _testAt24co1bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
-  return AOS_OK;
+  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
 }
-static ut_at24c01bdata_t _utAlldAt24c01bData = {
-  /* driver   */ &moduleLldEeprom,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldAt24c01b = {
-  /* name           */ "AT24C01B",
-  /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01b,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt24c01bData,
-};
+AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24co1bShellCmdCb);
 
 /*
  * HMC5883L (compass)
  */
-static int _utShellCmdCb_AlldHmc5883l(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_HMC5883L.h>
+static int _testHmc5883lShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldHmc5883l, NULL);
-  return AOS_OK;
+  return moduleTestHmc5883lShellCb(stream, argc, argv, NULL);
 }
-static ut_hmc5883ldata_t _utHmc5883lData = {
-  /* HMC driver   */ &moduleLldCompass,
-  /* event source */ &aos.events.io,
-  /* event flags  */ MODULE_OS_IOEVENTFLAGS_COMPASSDRDY,
-  /* timeout      */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldHmc5883l = {
-  /* name           */ "HMC5883L",
-  /* info           */ "compass",
-  /* test function  */ utAlldHmc5883lFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:Compass",
-    /* callback */ _utShellCmdCb_AlldHmc5883l,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utHmc5883lData,
-};
+AOS_SHELL_COMMAND(moduleTestHmc5883lShellCmd, "test:Compass", _testHmc5883lShellCmdCb);
 
 /*
  * INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_INA219.h>
+static int _testIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldIna219, "VDD (3.3V)");
-  return AOS_OK;
+  return moduleTestIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_ina219data_t _utIna219Data = {
-  /* driver           */ &moduleLldPowerMonitorVdd,
-  /* expected voltage */ 3.3f,
-  /* tolerance        */ 0.05f,
-  /* timeout */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldIna219 = {
-  /* name           */ "INA219",
-  /* info           */ "power monitor",
-  /* test function  */ utAlldIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldIna219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utIna219Data,
-};
+AOS_SHELL_COMMAND(moduleTestIna219ShellCmd, "test:PowerMonitor", _testIna219ShellCmdCb);
 
 /*
  * L3G4200D (gyroscope)
  */
-static int _utShellCmdCb_AlldL3g4200d(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_L3G4200D.h>
+static int _testL3g4200dShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  spiStart(((ut_l3g4200ddata_t*)moduleUtAlldL3g4200d.data)->l3gd->spid, ((ut_l3g4200ddata_t*)moduleUtAlldL3g4200d.data)->spiconf);
-  aosUtRun(stream, &moduleUtAlldL3g4200d, NULL);
-  spiStop(((ut_l3g4200ddata_t*)moduleUtAlldL3g4200d.data)->l3gd->spid);
-  return AOS_OK;
+  return moduleTestL3g4200dShellCb(stream, argc, argv, NULL);
 }
-static ut_l3g4200ddata_t _utL3g4200dData = {
-  /* driver            */ &moduleLldGyroscope,
-  /* SPI configuration */ &moduleHalSpiGyroscopeConfig,
-  /* event source */ &aos.events.io,
-  /* event flags  */ MODULE_OS_IOEVENTFLAGS_GYRODRDY,
-};
-aos_unittest_t moduleUtAlldL3g4200d = {
-  /* name           */ "L3G4200D",
-  /* info           */ "Gyroscope",
-  /* test function  */ utAlldL3g4200dFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:Gyroscope",
-    /* callback */ _utShellCmdCb_AlldL3g4200d,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utL3g4200dData,
-};
+AOS_SHELL_COMMAND(moduleTestL3g4200dShellCmd, "test:Gyroscope", _testL3g4200dShellCmdCb);
 
 /*
  * Status LED
  */
-static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLed, NULL);
-  return AOS_OK;
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLed = {
-  /* name           */ "LED",
-  /* info           */ NULL,
-  /* test function  */ utAlldLedFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StatusLED",
-    /* callback */ _utShellCmdCb_AlldLed,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStatusLed,
-};
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:StatusLED", _testLedShellCmdCb);
 
 /*
  * LIS331DLH (accelerometer)
  */
-static int _utShellCmdCb_AlldLis331dlh(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LIS331DLH.h>
+static int _testLis331dlhShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  spiStart(((ut_lis331dlhdata_t*)moduleUtAlldLis331dlh.data)->lisd->spid, ((ut_lis331dlhdata_t*)moduleUtAlldLis331dlh.data)->spiconf);
-  aosUtRun(stream, &moduleUtAlldLis331dlh, NULL);
-  spiStop(((ut_lis331dlhdata_t*)moduleUtAlldLis331dlh.data)->lisd->spid);
-  return AOS_OK;
+  return moduleTestLis331dlhShellCb(stream, argc, argv, NULL);
 }
-static ut_lis331dlhdata_t _utLis331dlhData = {
-  /* driver            */ &moduleLldAccelerometer,
-  /* SPI configuration */ &moduleHalSpiAccelerometerConfig,
-  /* event source */ &aos.events.io,
-  /* event flags  */ MODULE_OS_IOEVENTFLAGS_ACCELINT,
-};
-aos_unittest_t moduleUtAlldLis331dlh = {
-  /* name           */ "LIS331DLH",
-  /* info           */ "Accelerometer",
-  /* test function  */ utAlldLis331dlhFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:Accelerometer",
-    /* callback */ _utShellCmdCb_AlldLis331dlh,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utLis331dlhData,
-};
+AOS_SHELL_COMMAND(moduleTestLis331dlhShellCmd, "test:Accelerometer", _testLis331dlhShellCmdCb);
 
 /*
  * LTC4412 (power path controller)
  */
-static int _utShellCmdCb_AlldLtc4412(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LTC4412.h>
+static int _testLtc4412ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLtc4412, NULL);
-  return AOS_OK;
+  return moduleTestLtc4412ShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLtc4412 = {
-  /* name           */ "LTC4412",
-  /* info           */ "Power path controller",
-  /* test function  */ utAlldLtc4412Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerPathController",
-    /* callback */ _utShellCmdCb_AlldLtc4412,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldPowerPathController,
-};
+AOS_SHELL_COMMAND(moduleTestLtc4412ShellCmd, "test:PowerPathController", _testLtc4412ShellCmdCb);
 
 /*
  * PCA9544A (I2C multiplexer)
  */
-static int _utShellCmdCb_AlldPca9544a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCA9544A.h>
+static int _testPca9544aShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldPca9544a, NULL);
-  return AOS_OK;
+  return moduleTestPca9544aShellCb(stream, argc, argv, NULL);
 }
-static ut_pca9544adata_t _utPca9544aData = {
-  /* driver  */ &moduleLldI2cMultiplexer,
-  /* timeout */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPca9544a = {
-  /* name           */ "PCA9544A",
-  /* info           */ "I2C multiplexer",
-  /* test function  */ utAlldPca9544aFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:I2CMultiplexer",
-    /* callback */ _utShellCmdCb_AlldPca9544a,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utPca9544aData,
-};
+AOS_SHELL_COMMAND(moduleTestPca9544aShellCmd, "test:I2CMultiplexer", _testPca9544aShellCmdCb);
 
 /*
  * TPS62113 (step-down converter)
  */
-static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TPS6211x.h>
+static int _testTps6211xShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTps62113, NULL);
-  return AOS_OK;
+  return moduleTestTps6211xShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldTps62113 = {
-  /* name           */ "TPS62113",
-  /* info           */ "Step down converter",
-  /* test function  */ utAlldTps6211xFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StepDownConverter",
-    /* callback */ _utShellCmdCb_AlldTps62113,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStepDownConverterVdrive,
-};
+AOS_SHELL_COMMAND(moduleTestTps62113ShellCmd, "test:StepDownConverter", _testTps6211xShellCmdCb);
 
 /*
  * VCNL4020 (proximity sensor)
  */
-static void _utAlldVcnl4020_disableInterrupt(VCNL4020Driver* vcnl)
+#include <module_test_VCNL4020.h>
+static int _testVcnl4020ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  uint8_t intstatus;
-  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  if (intstatus) {
-    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  }
-  return;
+  return moduleTestVcnl4020ShellCb(stream, argc, argv, NULL);
 }
-static int _utShellCmdCb_AlldVcnl4020(BaseSequentialStream* stream, int argc, char* argv[])
+AOS_SHELL_COMMAND(moduleTestVcnl4020ShellCmd, "test:ProximitySensor", _testVcnl4020ShellCmdCb);
+
+/*
+ * entire module
+ */
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  enum {
-    UNKNOWN,
-    FL, FR, WL, WR,
-  } sensor = UNKNOWN;
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "--frontleft") == 0 || strcmp(argv[1], "-fl") == 0) {
-      sensor = FL;
-    } else if (strcmp(argv[1], "--frontright") == 0 || strcmp(argv[1], "-fr") == 0) {
-      sensor = FR;
-    } else if (strcmp(argv[1], "--wheelleft") == 0 || strcmp(argv[1], "-wl") == 0) {
-      sensor = WL;
-    } else if (strcmp(argv[1], "--wheelright") == 0 || strcmp(argv[1], "-wr") == 0) {
-      sensor = WR;
-    }
-  }
-  if (sensor != UNKNOWN) {
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    switch (sensor) {
-      case FL:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "front left sensor");
-        break;
-      case FR:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "front right sensor");
-        break;
-      case WL:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "left wheel sensor");
-        break;
-      case WR:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "right wheel sensor");
-        break;
-      default:
-        break;
-    }
-    return AOS_OK;
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  --frontleft, -fl\n");
-  chprintf(stream, "    Test front left proximity sensor.\n");
-  chprintf(stream, "  --frontrigt, -fr\n");
-  chprintf(stream, "    Test front right proximity sensor.\n");
-  chprintf(stream, "  --wheelleft, -wl\n");
-  chprintf(stream, "    Test left wheel proximity sensor.\n");
-  chprintf(stream, "  --wheelright, -wr\n");
-  chprintf(stream, "    Test right wheel proximity sensor.\n");
-  return AOS_INVALIDARGUMENTS;
+  (void)argc;
+  (void)argv;
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* A3906 (motor driver) */
+  status |= moduleTestA3906ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* AT24C01B (EEPROM) */
+  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* HMC5883L (compass) */
+  status |= moduleTestHmc5883lShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* INA219 (power monitor) */
+  status |= moduleTestIna219ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* L3G4200D (gyroscope) */
+  status |= moduleTestL3g4200dShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* Status LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* LIS331DLH (accelerometer) */
+  status |= moduleTestLis331dlhShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* LTC4412 (power path controller) */
+  status |= moduleTestLtc4412ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* PCA9544A (I2C multiplexer) */
+  status |= moduleTestPca9544aShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS62113 (step-down converter) */
+  status |= moduleTestTps6211xShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* VCNL4020 (proximity sensor) */
+  // wheel left
+  targv[1] = "-wl";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // front left
+  targv[1] = "-fl";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // front right
+  targv[1] = "-fr";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // wheel right
+  targv[1] = "-wr";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
 }
-static ut_vcnl4020data_t _utVcnl4020Data = {
-  /* driver       */ &moduleLldProximity,
-  /* timeout      */ MICROSECONDS_PER_SECOND,
-  /* event source */ &aos.events.io,
-  /* event flags  */ MODULE_OS_IOEVENTFLAGS_IRINT,
-};
-aos_unittest_t moduleUtAlldVcnl4020 = {
-  /* name           */ "VCNL4020",
-  /* info           */ "proximity sensor",
-  /* test function  */ utAlldVcnl4020Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Proximity",
-    /* callback */ _utShellCmdCb_AlldVcnl4020,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utVcnl4020Data,
-};
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/DiWheelDrive_1-1/module.h b/modules/DiWheelDrive_1-1/module.h
index e47d147..a6168ec 100644
--- a/modules/DiWheelDrive_1-1/module.h
+++ b/modules/DiWheelDrive_1-1/module.h
@@ -332,27 +332,28 @@ extern ROMCONST char* moduleShellPrompt;
 }
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
-  /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldA3906.shellcmd);                \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldHmc5883l.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldL3g4200d.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLed.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLis331dlh.shellcmd);            \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLtc4412.shellcmd);              \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldPca9544a.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldVcnl4020.shellcmd);             \
+  /* initialize tests and add to shell */                                     \
+  aosShellAddCommand(&aos.shell, &moduleTestA3906ShellCmd);                   \
+  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestHmc5883lShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestIna219ShellCmd);                  \
+  aosShellAddCommand(&aos.shell, &moduleTestL3g4200dShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestLis331dlhShellCmd);               \
+  aosShellAddCommand(&aos.shell, &moduleTestLtc4412ShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestPca9544aShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestTps62113ShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestVcnl4020ShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
 
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
@@ -378,7 +379,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
   /* PWM */                                                                   \
   pwmStop(&MODULE_HAL_PWM_DRIVE);                                             \
   /* QEI */                                                                   \
@@ -510,77 +511,71 @@ extern VCNL4020Driver moduleLldProximity;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_alld_A3906_v1.h>
-#include <ut_alld_AT24C01B_v1.h>
-#include <ut_alld_HMC5883L_v1.h>
-#include <ut_alld_INA219_v1.h>
-#include <ut_alld_L3G4200D_v1.h>
-#include <ut_alld_LED_v1.h>
-#include <ut_alld_LIS331DLH_v1.h>
-#include <ut_alld_LTC4412_v1.h>
-#include <ut_alld_PCA9544A_v1.h>
-#include <ut_alld_TPS6211x_v1.h>
-#include <ut_alld_VCNL4020_v1.h>
 
 /**
- * @brief   A3906 (motor driver) unit test object.
+ * @brief   A3906 (motor driver) test command.
  */
-extern aos_unittest_t moduleUtAlldA3906;
+extern aos_shellcommand_t moduleTestA3906ShellCmd;
 
 /**
- * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
+ * @brief   AT24C01BN-SH-B (EEPROM) test command.
  */
-extern aos_unittest_t moduleUtAlldAt24c01b;
+extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
 
 /**
- * @brief   HMC5883L (compass) unit test object.
+ * @brief   HMC5883L (compass) test command.
  */
-extern aos_unittest_t moduleUtAlldHmc5883l;
+extern aos_shellcommand_t moduleTestHmc5883lShellCmd;
 
 /**
- * @brief   INA219 (power monitor) unit test object.
+ * @brief   INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldIna219;
+extern aos_shellcommand_t moduleTestIna219ShellCmd;
 
 /**
- * @brief   L3G4200D (gyroscope) unit test object.
+ * @brief   L3G4200D (gyroscope) test command.
  */
-extern aos_unittest_t moduleUtAlldL3g4200d;
+extern aos_shellcommand_t moduleTestL3g4200dShellCmd;
 
 /**
- * @brief   Status LED unit test object.
+ * @brief   Status LED test command.
  */
-extern aos_unittest_t moduleUtAlldLed;
+extern aos_shellcommand_t moduleTestLedShellCmd;
 
 /**
- * @brief   LIS331DLH (accelerometer) unit test object.
+ * @brief   LIS331DLH (accelerometer) test command.
  */
-extern aos_unittest_t moduleUtAlldLis331dlh;
+extern aos_shellcommand_t moduleTestLis331dlhShellCmd;
 
 /**
- * @brief   LTC4412 (power path controller) unit test object.
+ * @brief   LTC4412 (power path controller) test command.
  */
-extern aos_unittest_t moduleUtAlldLtc4412;
+extern aos_shellcommand_t moduleTestLtc4412ShellCmd;
 
 /**
- * @brief   PCA9544A (I2C multiplexer) unit test object.
+ * @brief   PCA9544A (I2C multiplexer) test command.
  */
-extern aos_unittest_t moduleUtAlldPca9544a;
+extern aos_shellcommand_t moduleTestPca9544aShellCmd;
 
 /**
- * @brief   TPS62113 (step-down converter) unit test object.
+ * @brief   TPS62113 (step-down converter) test command.
  */
-extern aos_unittest_t moduleUtAlldTps62113;
+extern aos_shellcommand_t moduleTestTps62113ShellCmd;
 
 /**
- * @brief   VCNL4020 (proximity sensor) unit test object.
+ * @brief   VCNL4020 (proximity sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldVcnl4020;
+extern aos_shellcommand_t moduleTestVcnl4020ShellCmd;
+
+/**
+ * @brief   Entire module test command.
+ */
+extern aos_shellcommand_t moduleTestAllShellCmd;
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/DiWheelDrive_1-1/test/A3906/module_test_A3906.c b/modules/DiWheelDrive_1-1/test/A3906/module_test_A3906.c
new file mode 100644
index 0000000..e9407ce
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/A3906/module_test_A3906.c
@@ -0,0 +1,89 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_A3906.h>
+#include <aos_test_A3906.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_a3906data_t _data = {
+  /* driver           */ &moduleLldMotors,
+  /* PWM information  */ {
+    /* driver   */ &MODULE_HAL_PWM_DRIVE,
+    /* channels */ {
+      /* left wheel forward   */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_FORWARD,
+      /* left wheel backward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_BACKWARD,
+      /* right wheel forward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_FORWARD,
+      /* right wheel backward */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_BACKWARD,
+    },
+  },
+  /* QEI information  */ {
+    /* left wheel               */ &MODULE_HAL_QEI_LEFT_WHEEL,
+    /* right wheel              */ &MODULE_HAL_QEI_RIGHT_WHEEL,
+    /* increment per revolution */ MODULE_HAL_QEI_INCREMENTS_PER_REVOLUTION,
+  },
+  /* Wheel diameter   */ {
+    /* left wheel   */ 0.05571f,
+    /* right wheel  */ 0.05571f,
+  },
+  /* timeout          */ 10 * MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "A3906", "motor driver", moduleTestA3906ShellCb, aosTestA3906Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestA3906ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/A3906/module_test_A3906.h b/modules/DiWheelDrive_1-1/test/A3906/module_test_A3906.h
new file mode 100644
index 0000000..21143a4
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/A3906/module_test_A3906.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_A3906_H
+#define MODULE_TEST_A3906_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestA3906ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_A3906_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/AT24C01B/module_test_AT24C01B.c b/modules/DiWheelDrive_1-1/test/AT24C01B/module_test_AT24C01B.c
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/AT24C01B/module_test_AT24C01B.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_AT24C01B.h>
+#include <aos_test_AT24C01B.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at24c01bdata_t _data = {
+  /* driver   */ &moduleLldEeprom,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "AT24C01BN-SH-B", "1kbit EEPROM", moduleTestAt24c01bShellCb, aosTestAt24c01bFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/AT24C01B/module_test_AT24C01B.h b/modules/DiWheelDrive_1-1/test/AT24C01B/module_test_AT24C01B.h
new file mode 100644
index 0000000..6764c0d
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/AT24C01B/module_test_AT24C01B.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT24C01B_H
+#define MODULE_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_AT24C01B_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/HMC5883L/module_test_HMC5883L.c b/modules/DiWheelDrive_1-1/test/HMC5883L/module_test_HMC5883L.c
new file mode 100644
index 0000000..bd6fa19
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/HMC5883L/module_test_HMC5883L.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_HMC5883L.h>
+#include <aos_test_HMC5883L.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_hmc5883ldata_t _data = {
+  /* HMC driver   */ &moduleLldCompass,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_COMPASSDRDY,
+  /* timeout      */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "HMC5883L", "compass", moduleTestHmc5883lShellCb, aosTestHmc5883lFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestHmc5883lShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/HMC5883L/module_test_HMC5883L.h b/modules/DiWheelDrive_1-1/test/HMC5883L/module_test_HMC5883L.h
new file mode 100644
index 0000000..396979b
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/HMC5883L/module_test_HMC5883L.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_HMC5883L_H
+#define MODULE_TEST_HMC5883L_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestHmc5883lShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_HMC5883L_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/INA219/module_test_INA219.c b/modules/DiWheelDrive_1-1/test/INA219/module_test_INA219.c
new file mode 100644
index 0000000..a74321d
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/INA219/module_test_INA219.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_INA219.h>
+#include <aos_test_INA219.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_ina219data_t _data = {
+  /* driver           */ &moduleLldPowerMonitorVdd,
+  /* expected voltage */ 3.3f,
+  /* tolerance        */ 0.05f,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "INA219", "power monitor", moduleTestIna219ShellCb, aosTestIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/INA219/module_test_INA219.h b/modules/DiWheelDrive_1-1/test/INA219/module_test_INA219.h
new file mode 100644
index 0000000..08c3462
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/INA219/module_test_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_INA219_H
+#define MODULE_TEST_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_INA219_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/L3G4200D/module_test_L3G4200D.c b/modules/DiWheelDrive_1-1/test/L3G4200D/module_test_L3G4200D.c
new file mode 100644
index 0000000..67f170c
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/L3G4200D/module_test_L3G4200D.c
@@ -0,0 +1,75 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_L3G4200D.h>
+#include <aos_test_L3G4200D.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_l3g4200ddata_t _data = {
+  /* driver            */ &moduleLldGyroscope,
+  /* SPI configuration */ &moduleHalSpiGyroscopeConfig,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_GYRODRDY,
+};
+
+static AOS_TEST(_test, "L3G4200D", "Gyroscope", moduleTestL3g4200dShellCb, aosTestL3g4200dFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestL3g4200dShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  spiStart(_data.l3gd->spid, _data.spiconf);
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+  spiStop(_data.l3gd->spid);
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/L3G4200D/module_test_L3G4200D.h b/modules/DiWheelDrive_1-1/test/L3G4200D/module_test_L3G4200D.h
new file mode 100644
index 0000000..58da41e
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/L3G4200D/module_test_L3G4200D.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_L3G4200D_H
+#define MODULE_TEST_L3G4200D_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestL3g4200dShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_L3G4200D_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/LED/module_test_LED.c b/modules/DiWheelDrive_1-1/test/LED/module_test_LED.c
new file mode 100644
index 0000000..cd97c0f
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldStatusLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/LED/module_test_LED.h b/modules/DiWheelDrive_1-1/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/LIS331DLH/module_test_LIS331DLH.c b/modules/DiWheelDrive_1-1/test/LIS331DLH/module_test_LIS331DLH.c
new file mode 100644
index 0000000..7ea0cdc
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/LIS331DLH/module_test_LIS331DLH.c
@@ -0,0 +1,75 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LIS331DLH.h>
+#include <aos_test_LIS331DLH.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_lis331dlhdata_t _data = {
+  /* driver            */ &moduleLldAccelerometer,
+  /* SPI configuration */ &moduleHalSpiAccelerometerConfig,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_ACCELINT,
+};
+
+static AOS_TEST(_test, "LIS331DLH", "Accelerometer", moduleTestLis331dlhShellCb, aosTestLis331dlhFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLis331dlhShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  spiStart(_data.lisd->spid, _data.spiconf);
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+  spiStop(_data.lisd->spid);
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/LIS331DLH/module_test_LIS331DLH.h b/modules/DiWheelDrive_1-1/test/LIS331DLH/module_test_LIS331DLH.h
new file mode 100644
index 0000000..9e8a433
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/LIS331DLH/module_test_LIS331DLH.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LIS331DLH_H
+#define MODULE_TEST_LIS331DLH_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLis331dlhShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LIS331DLH_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/LTC4412/module_test_LTC4412.c b/modules/DiWheelDrive_1-1/test/LTC4412/module_test_LTC4412.c
new file mode 100644
index 0000000..7a12d79
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/LTC4412/module_test_LTC4412.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LTC4412.h>
+#include <aos_test_LTC4412.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+static aos_test_ltc4412data_t _data = {
+  /* driver */ &moduleLldPowerPathController,
+};
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static AOS_TEST(_test, "LTC4412", "power path controller", moduleTestLtc4412ShellCb, aosTestLtc4412Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLtc4412ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/LTC4412/module_test_LTC4412.h b/modules/DiWheelDrive_1-1/test/LTC4412/module_test_LTC4412.h
new file mode 100644
index 0000000..fa9d971
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/LTC4412/module_test_LTC4412.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LTC4412_H
+#define MODULE_TEST_LTC4412_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLtc4412ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LTC4412_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/PCA9544A/module_test_PCA9544A.c b/modules/DiWheelDrive_1-1/test/PCA9544A/module_test_PCA9544A.c
new file mode 100644
index 0000000..df9e278
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/PCA9544A/module_test_PCA9544A.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_PCA9544A.h>
+#include <aos_test_PCA9544A.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pca9544adata_t _data = {
+  /* driver  */ &moduleLldI2cMultiplexer,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "PCA9544A", "I2C multiplexer", moduleTestPca9544aShellCb, aosTestPca9544aFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/PCA9544A/module_test_PCA9544A.h b/modules/DiWheelDrive_1-1/test/PCA9544A/module_test_PCA9544A.h
new file mode 100644
index 0000000..2f43a9a
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/PCA9544A/module_test_PCA9544A.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PCA9544A_H
+#define MODULE_TEST_PCA9544A_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_PCA9544A_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/TPS6211x/module_test_TPS6211x.c b/modules/DiWheelDrive_1-1/test/TPS6211x/module_test_TPS6211x.c
new file mode 100644
index 0000000..b492bd1
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/TPS6211x/module_test_TPS6211x.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS6211x.h>
+#include <aos_test_TPS6211x.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps6211xbdata_t _data = {
+  /* driver */ &moduleLldStepDownConverterVdrive,
+};
+
+static AOS_TEST(_test, "TPS62113", "step-down converter", moduleTestTps6211xShellCb, aosTestTps6211xFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/TPS6211x/module_test_TPS6211x.h b/modules/DiWheelDrive_1-1/test/TPS6211x/module_test_TPS6211x.h
new file mode 100644
index 0000000..de34ee8
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/TPS6211x/module_test_TPS6211x.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS6211x_H
+#define MODULE_TEST_TPS6211x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS6211x_H */
+
diff --git a/modules/DiWheelDrive_1-1/test/VCNL4020/module_test_VCNL4020.c b/modules/DiWheelDrive_1-1/test/VCNL4020/module_test_VCNL4020.c
new file mode 100644
index 0000000..5d1670f
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/VCNL4020/module_test_VCNL4020.c
@@ -0,0 +1,149 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_VCNL4020.h>
+#include <aos_test_VCNL4020.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_vcnl4020data_t _data = {
+  /* driver       */ &moduleLldProximity,
+  /* timeout      */ MICROSECONDS_PER_SECOND,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_IRINT,
+};
+
+static AOS_TEST(_test, "VCNL4020", "proximity sensor", moduleTestVcnl4020ShellCb, aosTestVcnl4020Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+static void _disableInterrupt(VCNL4020Driver* vcnl)
+{
+  uint8_t intstatus;
+  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, _data.timeout);
+  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, _data.timeout);
+  if (intstatus) {
+    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, _data.timeout);
+  }
+  return;
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FL, FR, WL, WR,
+  } sensor = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "--frontleft") == 0 || strcmp(argv[1], "-fl") == 0) {
+      sensor = FL;
+    } else if (strcmp(argv[1], "--frontright") == 0 || strcmp(argv[1], "-fr") == 0) {
+      sensor = FR;
+    } else if (strcmp(argv[1], "--wheelleft") == 0 || strcmp(argv[1], "-wl") == 0) {
+      sensor = WL;
+    } else if (strcmp(argv[1], "--wheelright") == 0 || strcmp(argv[1], "-wr") == 0) {
+      sensor = WR;
+    }
+  }
+
+  // handle valid sensor
+  if (sensor != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    switch (sensor) {
+      case FL:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, _data.timeout);
+        res = aosTestRun(stream, &_test, "front left");
+        break;
+      case FR:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, _data.timeout);
+        res = aosTestRun(stream, &_test, "front right");
+        break;
+      case WL:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, _data.timeout);
+        res = aosTestRun(stream, &_test, "left wheel");
+        break;
+      case WR:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, _data.timeout);
+        res = aosTestRun(stream, &_test, "right wheel");
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --frontleft, -fl\n");
+    chprintf(stream, "    Test front left proximity sensor.\n");
+    chprintf(stream, "  --frontrigt, -fr\n");
+    chprintf(stream, "    Test front right proximity sensor.\n");
+    chprintf(stream, "  --wheelleft, -wl\n");
+    chprintf(stream, "    Test left wheel proximity sensor.\n");
+    chprintf(stream, "  --wheelright, -wr\n");
+    chprintf(stream, "    Test right wheel proximity sensor.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-1/test/VCNL4020/module_test_VCNL4020.h b/modules/DiWheelDrive_1-1/test/VCNL4020/module_test_VCNL4020.h
new file mode 100644
index 0000000..5f70df7
--- /dev/null
+++ b/modules/DiWheelDrive_1-1/test/VCNL4020/module_test_VCNL4020.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_VCNL4020_H
+#define MODULE_TEST_VCNL4020_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_VCNL4020_H */
+
diff --git a/modules/DiWheelDrive_1-2/Makefile b/modules/DiWheelDrive_1-2/Makefile
index 2218186..2a7498b 100644
--- a/modules/DiWheelDrive_1-2/Makefile
+++ b/modules/DiWheelDrive_1-2/Makefile
@@ -112,100 +112,67 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m3
+MCU := cortex-m3
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F103xE.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F103xE.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/A3906/v1 \
+                            $(AMIROLLD)/drivers/AT24C01B/v1 \
+                            $(AMIROLLD)/drivers/BNO055/v1 \
+                            $(AMIROLLD)/drivers/INA219/v1 \
+                            $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/LTC4412/v1 \
+                            $(AMIROLLD)/drivers/PCA9544A/v1 \
+                            $(AMIROLLD)/drivers/TPS6211x/v1 \
+                            $(AMIROLLD)/drivers/VCNL4020/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/A3906_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/AT24C01B_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/BNO055_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LTC4412_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PCA9544A_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS6211x_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/VCNL4020_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 # Create an additional .srec image file.
diff --git a/modules/DiWheelDrive_1-2/alldconf.h b/modules/DiWheelDrive_1-2/alldconf.h
index c26ee9a..621cb15 100644
--- a/modules/DiWheelDrive_1-2/alldconf.h
+++ b/modules/DiWheelDrive_1-2/alldconf.h
@@ -43,51 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-/**
- * @brief   Enable flag for the A3906 motor driver.
- */
-#define AMIROLLD_CFG_A3906                      1
-
-/**
- * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
- */
-#define AMIROLLD_CFG_AT24C01B                   1
-
-/**
- * @brief   Enable flag for the BNO055 IMU.
- */
-#define AMIROLLD_CFG_BNO055                     1
-
-/**
- * @brief   Enable flag for the INA219 power monitor.
- */
-#define AMIROLLD_CFG_INA219                     1
-
-/**
- * @brief   Enable flag for the status LED.
- */
-#define AMIROLLD_CFG_LED                        1
-
-/**
- * @brief   Enable flag for the LTC4412 power path controller.
- */
-#define AMIROLLD_CFG_LTC4412                    1
-
-/**
- * @brief   Enable flag for the PCA9544A I2C multiplexer.
- */
-#define AMIROLLD_CFG_PCA9544A                   1
-
-/**
- * @brief   Enable flag for the TPS62113 step-down converter.
- */
-#define AMIROLLD_CFG_TPS6211x                   1
-
-/**
- * @brief   Enable flag for the VCNL4020 proximity sensor.
- */
-#define AMIROLLD_CFG_VCNL4020                   1
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/DiWheelDrive_1-2/halconf.h b/modules/DiWheelDrive_1-2/halconf.h
index 4e223f7..ab1f622 100644
--- a/modules/DiWheelDrive_1-2/halconf.h
+++ b/modules/DiWheelDrive_1-2/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/DiWheelDrive_1-2/module.c b/modules/DiWheelDrive_1-2/module.c
index 96041bb..70384c5 100644
--- a/modules/DiWheelDrive_1-2/module.c
+++ b/modules/DiWheelDrive_1-2/module.c
@@ -127,7 +127,7 @@ ROMCONST apalControlGpio_t moduleGpioLed = {
   /* GPIO */ &_gpioLed,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ LED_LLD_GPIO_ACTIVE_STATE,
+    /* active state   */ APAL_GPIO_ACTIVE_LOW,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -367,6 +367,8 @@ AT24C01BDriver moduleLldEeprom = {
   /* I²C address  */ AT24C01B_LLD_I2C_ADDR_FIXED,
 };
 
+// TODO: BNO055
+
 INA219Driver moduleLldPowerMonitorVdd = {
   /* I2C Driver       */ &MODULE_HAL_I2C_PROX_EEPROM_PWRMTR,
   /* I²C address      */ INA219_LLD_I2C_ADDR_FIXED,
@@ -400,295 +402,163 @@ VCNL4020Driver moduleLldProximity = {
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <string.h>
 
 /*
  * A3906 (motor driver)
  */
-static int _utShellCmdCb_AlldA3906(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_A3906.h>
+static int _testA3906ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldA3906, NULL);
-  return AOS_OK;
+  return moduleTestA3906ShellCb(stream, argc, argv, NULL);
 }
-static ut_a3906data_t _utA3906Data = {
-  /* driver           */ &moduleLldMotors,
-  /* PWM information  */ {
-    /* driver   */ &MODULE_HAL_PWM_DRIVE,
-    /* channels */ {
-      /* left wheel forward   */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_FORWARD,
-      /* left wheel backward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_BACKWARD,
-      /* right wheel forward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_FORWARD,
-      /* right wheel backward */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_BACKWARD,
-    },
-  },
-  /* QEI information  */ {
-    /* left wheel               */ &MODULE_HAL_QEI_LEFT_WHEEL,
-    /* right wheel              */ &MODULE_HAL_QEI_RIGHT_WHEEL,
-    /* increment per revolution */ MODULE_HAL_QEI_INCREMENTS_PER_REVOLUTION,
-  },
-  /* Wheel diameter   */ {
-    /* left wheel   */ 0.05571f,
-    /* right wheel  */ 0.05571f,
-  },
-  /* timeout          */ 10 * MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldA3906  = {
-  /* name           */ "A3906",
-  /* info           */ "motor driver",
-  /* test function  */ utAlldA3906Func,
-  /* shell command  */ {
-    /* name     */ "unittest:MotorDriver",
-    /* callback */ _utShellCmdCb_AlldA3906,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utA3906Data,
-};
+AOS_SHELL_COMMAND(moduleTestA3906ShellCmd, "test:MotorDriver", _testA3906ShellCmdCb);
 
 /*
- * AT24C01B (EEPROM)
+ * AT24C01BN-SH-B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT24C01B.h>
+static int _testAt24co1bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
-  return AOS_OK;
+  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
 }
-static ut_at24c01bdata_t _utAlldAt24c01bData = {
-  /* driver   */ &moduleLldEeprom,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldAt24c01b = {
-  /* name           */ "AT24C01B",
-  /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01b,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt24c01bData,
-};
+AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24co1bShellCmdCb);
+
+// TODO: BNO055
 
 /*
  * INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_INA219.h>
+static int _testIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldIna219, "VDD (3.3V)");
-  return AOS_OK;
+  return moduleTestIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_ina219data_t _utIna219Data = {
-  /* driver           */ &moduleLldPowerMonitorVdd,
-  /* expected voltage */ 3.3f,
-  /* tolerance        */ 0.05f,
-  /* timeout */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldIna219 = {
-  /* name           */ "INA219",
-  /* info           */ "power monitor",
-  /* test function  */ utAlldIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldIna219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utIna219Data,
-};
+AOS_SHELL_COMMAND(moduleTestIna219ShellCmd, "test:PowerMonitor", _testIna219ShellCmdCb);
 
 /*
  * Status LED
  */
-static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLed, NULL);
-  return AOS_OK;
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLed = {
-  /* name           */ "LED",
-  /* info           */ NULL,
-  /* test function  */ utAlldLedFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StatusLED",
-    /* callback */ _utShellCmdCb_AlldLed,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStatusLed,
-};
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:StatusLED", _testLedShellCmdCb);
 
 /*
  * LTC4412 (power path controller)
  */
-static int _utShellCmdCb_AlldLtc4412(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LTC4412.h>
+static int _testLtc4412ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLtc4412, NULL);
-  return AOS_OK;
+  return moduleTestLtc4412ShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLtc4412 = {
-  /* name           */ "LTC4412",
-  /* info           */ "Power path controller",
-  /* test function  */ utAlldLtc4412Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerPathController",
-    /* callback */ _utShellCmdCb_AlldLtc4412,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldPowerPathController,
-};
+AOS_SHELL_COMMAND(moduleTestLtc4412ShellCmd, "test:PowerPathController", _testLtc4412ShellCmdCb);
 
 /*
  * PCA9544A (I2C multiplexer)
  */
-static int _utShellCmdCb_AlldPca9544a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCA9544A.h>
+static int _testPca9544aShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldPca9544a, NULL);
-  return AOS_OK;
+  return moduleTestPca9544aShellCb(stream, argc, argv, NULL);
 }
-static ut_pca9544adata_t _utPca9544aData = {
-  /* driver  */ &moduleLldI2cMultiplexer,
-  /* timeout */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPca9544a = {
-  /* name           */ "PCA9544A",
-  /* info           */ "I2C multiplexer",
-  /* test function  */ utAlldPca9544aFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:I2CMultiplexer",
-    /* callback */ _utShellCmdCb_AlldPca9544a,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utPca9544aData,
-};
+AOS_SHELL_COMMAND(moduleTestPca9544aShellCmd, "test:I2CMultiplexer", _testPca9544aShellCmdCb);
 
 /*
  * TPS62113 (step-down converter)
  */
-static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TPS6211x.h>
+static int _testTps6211xShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTps62113, NULL);
-  return AOS_OK;
+  return moduleTestTps6211xShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldTps62113 = {
-  /* name           */ "TPS62113",
-  /* info           */ "Step down converter",
-  /* test function  */ utAlldTps6211xFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StepDownConverter",
-    /* callback */ _utShellCmdCb_AlldTps62113,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStepDownConverterVdrive,
-};
+AOS_SHELL_COMMAND(moduleTestTps62113ShellCmd, "test:StepDownConverter", _testTps6211xShellCmdCb);
 
 /*
  * VCNL4020 (proximity sensor)
  */
-static void _utAlldVcnl4020_disableInterrupt(VCNL4020Driver* vcnl)
+#include <module_test_VCNL4020.h>
+static int _testVcnl4020ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  uint8_t intstatus;
-  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  if (intstatus) {
-    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  }
-  return;
+  return moduleTestVcnl4020ShellCb(stream, argc, argv, NULL);
 }
-static int _utShellCmdCb_AlldVcnl4020(BaseSequentialStream* stream, int argc, char* argv[])
+AOS_SHELL_COMMAND(moduleTestVcnl4020ShellCmd, "test:ProximitySensor", _testVcnl4020ShellCmdCb);
+
+/*
+ * entire module
+ */
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  enum {
-    UNKNOWN,
-    FL, FR, WL, WR,
-  } sensor = UNKNOWN;
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "--frontleft") == 0 || strcmp(argv[1], "-fl") == 0) {
-      sensor = FL;
-    } else if (strcmp(argv[1], "--frontright") == 0 || strcmp(argv[1], "-fr") == 0) {
-      sensor = FR;
-    } else if (strcmp(argv[1], "--wheelleft") == 0 || strcmp(argv[1], "-wl") == 0) {
-      sensor = WL;
-    } else if (strcmp(argv[1], "--wheelright") == 0 || strcmp(argv[1], "-wr") == 0) {
-      sensor = WR;
-    }
-  }
-  if (sensor != UNKNOWN) {
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    switch (sensor) {
-      case FL:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "front left sensor");
-        break;
-      case FR:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "front right sensor");
-        break;
-      case WL:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "left wheel sensor");
-        break;
-      case WR:
-        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "right wheel sensor");
-        break;
-      default:
-        break;
-    }
-    return AOS_OK;
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  --frontleft, -fl\n");
-  chprintf(stream, "    Test front left proximity sensor.\n");
-  chprintf(stream, "  --frontrigt, -fr\n");
-  chprintf(stream, "    Test front right proximity sensor.\n");
-  chprintf(stream, "  --wheelleft, -wl\n");
-  chprintf(stream, "    Test left wheel proximity sensor.\n");
-  chprintf(stream, "  --wheelright, -wr\n");
-  chprintf(stream, "    Test right wheel proximity sensor.\n");
-  return AOS_INVALIDARGUMENTS;
+  (void)argc;
+  (void)argv;
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* A3906 (motor driver) */
+  status |= moduleTestA3906ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* AT24C01B (EEPROM) */
+  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  // TODO: BNO055
+
+  /* INA219 (power monitor) */
+  status |= moduleTestIna219ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* Status LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* LTC4412 (power path controller) */
+  status |= moduleTestLtc4412ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* PCA9544A (I2C multiplexer) */
+  status |= moduleTestPca9544aShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS62113 (step-down converter) */
+  status |= moduleTestTps6211xShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* VCNL4020 (proximity sensor) */
+  // wheel left
+  targv[1] = "-wl";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // front left
+  targv[1] = "-fl";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // front right
+  targv[1] = "-fr";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // wheel right
+  targv[1] = "-wr";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
 }
-static ut_vcnl4020data_t _utVcnl4020Data = {
-  /* driver       */ &moduleLldProximity,
-  /* timeout      */ MICROSECONDS_PER_SECOND,
-  /* event source */ &aos.events.io,
-  /* event flags  */ MODULE_OS_IOEVENTFLAGS_IRINT,
-};
-aos_unittest_t moduleUtAlldVcnl4020 = {
-  /* name           */ "VCNL4020",
-  /* info           */ "proximity sensor",
-  /* test function  */ utAlldVcnl4020Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Proximity",
-    /* callback */ _utShellCmdCb_AlldVcnl4020,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utVcnl4020Data,
-};
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/DiWheelDrive_1-2/module.h b/modules/DiWheelDrive_1-2/module.h
index d5e3bbe..0a7d01e 100644
--- a/modules/DiWheelDrive_1-2/module.h
+++ b/modules/DiWheelDrive_1-2/module.h
@@ -306,24 +306,26 @@ extern ROMCONST char* moduleShellPrompt;
 }
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
-  /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldA3906.shellcmd);                \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLed.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLtc4412.shellcmd);              \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldPca9544a.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldVcnl4020.shellcmd);             \
+  /* initialize tests and add to shell */                                     \
+  aosShellAddCommand(&aos.shell, &moduleTestA3906ShellCmd);                   \
+  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
+  /* TODO: add BNO055 test command */                                         \
+  aosShellAddCommand(&aos.shell, &moduleTestIna219ShellCmd);                  \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestLtc4412ShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestPca9544aShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestTps62113ShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestVcnl4020ShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
 
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
@@ -347,7 +349,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
   /* PWM */                                                                   \
   pwmStop(&MODULE_HAL_PWM_DRIVE);                                             \
   /* QEI */                                                                   \
@@ -410,6 +412,7 @@ extern ROMCONST char* moduleShellPrompt;
 /*===========================================================================*/
 #include <alld_A3906.h>
 #include <alld_AT24C01B.h>
+// TODO: add BNO055 IMU
 #include <alld_INA219.h>
 #include <alld_LED.h>
 #include <alld_LTC4412.h>
@@ -417,8 +420,6 @@ extern ROMCONST char* moduleShellPrompt;
 #include <alld_TPS6211x.h>
 #include <alld_VCNL4020.h>
 
-// TODO: add BNO055 IMU
-
 /**
  * @brief   Motor driver.
  */
@@ -429,6 +430,8 @@ extern A3906Driver moduleLldMotors;
  */
 extern AT24C01BDriver moduleLldEeprom;
 
+// TODO: add BNO055 IMU
+
 /**
  * @brief   Power monitor (VDD) driver.
  */
@@ -463,61 +466,58 @@ extern VCNL4020Driver moduleLldProximity;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_alld_A3906_v1.h>
-#include <ut_alld_AT24C01B_v1.h>
-#include <ut_alld_INA219_v1.h>
-#include <ut_alld_LED_v1.h>
-#include <ut_alld_LTC4412_v1.h>
-#include <ut_alld_PCA9544A_v1.h>
-#include <ut_alld_TPS6211x_v1.h>
-#include <ut_alld_VCNL4020_v1.h>
 
-// TODO: add BNO055 IMU
+/**
+ * @brief   A3906 (motor driver) test command.
+ */
+extern aos_shellcommand_t moduleTestA3906ShellCmd;
 
 /**
- * @brief   A3906 (motor driver) unit test object.
+ * @brief   AT24C01BN-SH-B (EEPROM) test command.
  */
-extern aos_unittest_t moduleUtAlldA3906;
+extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
+
+// TODO: add BNO055
 
 /**
- * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
+ * @brief   INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldAt24c01b;
+extern aos_shellcommand_t moduleTestIna219ShellCmd;
 
 /**
- * @brief   INA219 (power monitor) unit test object.
+ * @brief   Status LED test command.
  */
-extern aos_unittest_t moduleUtAlldIna219;
+extern aos_shellcommand_t moduleTestLedShellCmd;
 
 /**
- * @brief   Status LED unit test object.
+ * @brief   LTC4412 (power path controller) test command.
  */
-extern aos_unittest_t moduleUtAlldLed;
+extern aos_shellcommand_t moduleTestLtc4412ShellCmd;
 
 /**
- * @brief   LTC4412 (power path controller) unit test object.
+ * @brief   PCA9544A (I2C multiplexer) test command.
  */
-extern aos_unittest_t moduleUtAlldLtc4412;
+extern aos_shellcommand_t moduleTestPca9544aShellCmd;
 
 /**
- * @brief   PCA9544A (I2C multiplexer) unit test object.
+ * @brief   TPS62113 (step-down converter) test command.
  */
-extern aos_unittest_t moduleUtAlldPca9544a;
+extern aos_shellcommand_t moduleTestTps62113ShellCmd;
 
 /**
- * @brief   TPS62113 (step-down converter) unit test object.
+ * @brief   VCNL4020 (proximity sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldTps62113;
+extern aos_shellcommand_t moduleTestVcnl4020ShellCmd;
 
 /**
- * @brief   VCNL4020 (proximity sensor) unit test object.
+ * @brief   Entire module test command.
  */
-extern aos_unittest_t moduleUtAlldVcnl4020;
+extern aos_shellcommand_t moduleTestAllShellCmd;
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/DiWheelDrive_1-2/test/A3906/module_test_A3906.c b/modules/DiWheelDrive_1-2/test/A3906/module_test_A3906.c
new file mode 100644
index 0000000..e9407ce
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/A3906/module_test_A3906.c
@@ -0,0 +1,89 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_A3906.h>
+#include <aos_test_A3906.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_a3906data_t _data = {
+  /* driver           */ &moduleLldMotors,
+  /* PWM information  */ {
+    /* driver   */ &MODULE_HAL_PWM_DRIVE,
+    /* channels */ {
+      /* left wheel forward   */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_FORWARD,
+      /* left wheel backward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_LEFT_BACKWARD,
+      /* right wheel forward  */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_FORWARD,
+      /* right wheel backward */ MODULE_HAL_PWM_DRIVE_CHANNEL_RIGHT_BACKWARD,
+    },
+  },
+  /* QEI information  */ {
+    /* left wheel               */ &MODULE_HAL_QEI_LEFT_WHEEL,
+    /* right wheel              */ &MODULE_HAL_QEI_RIGHT_WHEEL,
+    /* increment per revolution */ MODULE_HAL_QEI_INCREMENTS_PER_REVOLUTION,
+  },
+  /* Wheel diameter   */ {
+    /* left wheel   */ 0.05571f,
+    /* right wheel  */ 0.05571f,
+  },
+  /* timeout          */ 10 * MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "A3906", "motor driver", moduleTestA3906ShellCb, aosTestA3906Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestA3906ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/A3906/module_test_A3906.h b/modules/DiWheelDrive_1-2/test/A3906/module_test_A3906.h
new file mode 100644
index 0000000..21143a4
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/A3906/module_test_A3906.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_A3906_H
+#define MODULE_TEST_A3906_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestA3906ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_A3906_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/AT24C01B/module_test_AT24C01B.c b/modules/DiWheelDrive_1-2/test/AT24C01B/module_test_AT24C01B.c
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/AT24C01B/module_test_AT24C01B.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_AT24C01B.h>
+#include <aos_test_AT24C01B.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at24c01bdata_t _data = {
+  /* driver   */ &moduleLldEeprom,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "AT24C01BN-SH-B", "1kbit EEPROM", moduleTestAt24c01bShellCb, aosTestAt24c01bFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/AT24C01B/module_test_AT24C01B.h b/modules/DiWheelDrive_1-2/test/AT24C01B/module_test_AT24C01B.h
new file mode 100644
index 0000000..6764c0d
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/AT24C01B/module_test_AT24C01B.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT24C01B_H
+#define MODULE_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_AT24C01B_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/INA219/module_test_INA219.c b/modules/DiWheelDrive_1-2/test/INA219/module_test_INA219.c
new file mode 100644
index 0000000..a74321d
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/INA219/module_test_INA219.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_INA219.h>
+#include <aos_test_INA219.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_ina219data_t _data = {
+  /* driver           */ &moduleLldPowerMonitorVdd,
+  /* expected voltage */ 3.3f,
+  /* tolerance        */ 0.05f,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "INA219", "power monitor", moduleTestIna219ShellCb, aosTestIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/INA219/module_test_INA219.h b/modules/DiWheelDrive_1-2/test/INA219/module_test_INA219.h
new file mode 100644
index 0000000..08c3462
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/INA219/module_test_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_INA219_H
+#define MODULE_TEST_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_INA219_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/LED/module_test_LED.c b/modules/DiWheelDrive_1-2/test/LED/module_test_LED.c
new file mode 100644
index 0000000..cd97c0f
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldStatusLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/LED/module_test_LED.h b/modules/DiWheelDrive_1-2/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/LTC4412/module_test_LTC4412.c b/modules/DiWheelDrive_1-2/test/LTC4412/module_test_LTC4412.c
new file mode 100644
index 0000000..7a12d79
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/LTC4412/module_test_LTC4412.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LTC4412.h>
+#include <aos_test_LTC4412.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+static aos_test_ltc4412data_t _data = {
+  /* driver */ &moduleLldPowerPathController,
+};
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static AOS_TEST(_test, "LTC4412", "power path controller", moduleTestLtc4412ShellCb, aosTestLtc4412Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLtc4412ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/LTC4412/module_test_LTC4412.h b/modules/DiWheelDrive_1-2/test/LTC4412/module_test_LTC4412.h
new file mode 100644
index 0000000..fa9d971
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/LTC4412/module_test_LTC4412.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LTC4412_H
+#define MODULE_TEST_LTC4412_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLtc4412ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LTC4412_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/PCA9544A/module_test_PCA9544A.c b/modules/DiWheelDrive_1-2/test/PCA9544A/module_test_PCA9544A.c
new file mode 100644
index 0000000..df9e278
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/PCA9544A/module_test_PCA9544A.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_PCA9544A.h>
+#include <aos_test_PCA9544A.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pca9544adata_t _data = {
+  /* driver  */ &moduleLldI2cMultiplexer,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "PCA9544A", "I2C multiplexer", moduleTestPca9544aShellCb, aosTestPca9544aFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/PCA9544A/module_test_PCA9544A.h b/modules/DiWheelDrive_1-2/test/PCA9544A/module_test_PCA9544A.h
new file mode 100644
index 0000000..2f43a9a
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/PCA9544A/module_test_PCA9544A.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PCA9544A_H
+#define MODULE_TEST_PCA9544A_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_PCA9544A_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/TPS6211x/module_test_TPS6211x.c b/modules/DiWheelDrive_1-2/test/TPS6211x/module_test_TPS6211x.c
new file mode 100644
index 0000000..b492bd1
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/TPS6211x/module_test_TPS6211x.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS6211x.h>
+#include <aos_test_TPS6211x.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps6211xbdata_t _data = {
+  /* driver */ &moduleLldStepDownConverterVdrive,
+};
+
+static AOS_TEST(_test, "TPS62113", "step-down converter", moduleTestTps6211xShellCb, aosTestTps6211xFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/TPS6211x/module_test_TPS6211x.h b/modules/DiWheelDrive_1-2/test/TPS6211x/module_test_TPS6211x.h
new file mode 100644
index 0000000..de34ee8
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/TPS6211x/module_test_TPS6211x.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS6211x_H
+#define MODULE_TEST_TPS6211x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS6211x_H */
+
diff --git a/modules/DiWheelDrive_1-2/test/VCNL4020/module_test_VCNL4020.c b/modules/DiWheelDrive_1-2/test/VCNL4020/module_test_VCNL4020.c
new file mode 100644
index 0000000..5d1670f
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/VCNL4020/module_test_VCNL4020.c
@@ -0,0 +1,149 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_VCNL4020.h>
+#include <aos_test_VCNL4020.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_vcnl4020data_t _data = {
+  /* driver       */ &moduleLldProximity,
+  /* timeout      */ MICROSECONDS_PER_SECOND,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_IRINT,
+};
+
+static AOS_TEST(_test, "VCNL4020", "proximity sensor", moduleTestVcnl4020ShellCb, aosTestVcnl4020Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+static void _disableInterrupt(VCNL4020Driver* vcnl)
+{
+  uint8_t intstatus;
+  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, _data.timeout);
+  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, _data.timeout);
+  if (intstatus) {
+    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, _data.timeout);
+  }
+  return;
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FL, FR, WL, WR,
+  } sensor = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "--frontleft") == 0 || strcmp(argv[1], "-fl") == 0) {
+      sensor = FL;
+    } else if (strcmp(argv[1], "--frontright") == 0 || strcmp(argv[1], "-fr") == 0) {
+      sensor = FR;
+    } else if (strcmp(argv[1], "--wheelleft") == 0 || strcmp(argv[1], "-wl") == 0) {
+      sensor = WL;
+    } else if (strcmp(argv[1], "--wheelright") == 0 || strcmp(argv[1], "-wr") == 0) {
+      sensor = WR;
+    }
+  }
+
+  // handle valid sensor
+  if (sensor != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    switch (sensor) {
+      case FL:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH3, _data.timeout);
+        res = aosTestRun(stream, &_test, "front left");
+        break;
+      case FR:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH0, _data.timeout);
+        res = aosTestRun(stream, &_test, "front right");
+        break;
+      case WL:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH2, _data.timeout);
+        res = aosTestRun(stream, &_test, "left wheel");
+        break;
+      case WR:
+        pca9544a_lld_setchannel(&moduleLldI2cMultiplexer, PCA9544A_LLD_CH1, _data.timeout);
+        res = aosTestRun(stream, &_test, "right wheel");
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --frontleft, -fl\n");
+    chprintf(stream, "    Test front left proximity sensor.\n");
+    chprintf(stream, "  --frontrigt, -fr\n");
+    chprintf(stream, "    Test front right proximity sensor.\n");
+    chprintf(stream, "  --wheelleft, -wl\n");
+    chprintf(stream, "    Test left wheel proximity sensor.\n");
+    chprintf(stream, "  --wheelright, -wr\n");
+    chprintf(stream, "    Test right wheel proximity sensor.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/DiWheelDrive_1-2/test/VCNL4020/module_test_VCNL4020.h b/modules/DiWheelDrive_1-2/test/VCNL4020/module_test_VCNL4020.h
new file mode 100644
index 0000000..5f70df7
--- /dev/null
+++ b/modules/DiWheelDrive_1-2/test/VCNL4020/module_test_VCNL4020.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_VCNL4020_H
+#define MODULE_TEST_VCNL4020_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_VCNL4020_H */
+
diff --git a/modules/LightRing_1-0/Makefile b/modules/LightRing_1-0/Makefile
index 2218186..fb415bb 100644
--- a/modules/LightRing_1-0/Makefile
+++ b/modules/LightRing_1-0/Makefile
@@ -112,100 +112,55 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m3
+MCU := cortex-m3
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F103xE.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F103xE.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/AT24C01B/v1 \
+                            $(AMIROLLD)/drivers/TLC5947/v1 \
+                            $(AMIROLLD)/drivers/TPS20xxB/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/AT24C01B_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TLC5947_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS20xxB_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 # Create an additional .srec image file.
diff --git a/modules/LightRing_1-0/alldconf.h b/modules/LightRing_1-0/alldconf.h
index 8790738..79fa42d 100644
--- a/modules/LightRing_1-0/alldconf.h
+++ b/modules/LightRing_1-0/alldconf.h
@@ -43,21 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-/**
- * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
- */
-#define AMIROLLD_CFG_AT24C01B                   1
-
-/**
- * @brief   Enable flag for the TLC5947 LED driver.
- */
-#define AMIROLLD_CFG_TLC5947                    1
-
-/**
- * @brief   Enable flag for the TPS2051BDBV power switch.
- */
-#define AMIROLLD_CFG_TPS20xxB                   1
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/LightRing_1-0/halconf.h b/modules/LightRing_1-0/halconf.h
index d62c369..be0ef62 100644
--- a/modules/LightRing_1-0/halconf.h
+++ b/modules/LightRing_1-0/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/LightRing_1-0/module.c b/modules/LightRing_1-0/module.c
index 553c8ea..867d225 100644
--- a/modules/LightRing_1-0/module.c
+++ b/modules/LightRing_1-0/module.c
@@ -78,6 +78,8 @@ SPIConfig moduleHalSpiWlConfig = {
   /* CR2                         */ SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN,
 };
 
+/** @} */
+
 /*===========================================================================*/
 /**
  * @name GPIO definitions
@@ -271,81 +273,74 @@ TPS20xxBDriver moduleLldPowerSwitchLaser = {
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 
 /*
- * EEPROM (AT24C01B)
+ * AT24C01BN-SH-B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT24C01B.h>
+static int _testAt24co1bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
-  return AOS_OK;
+  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
 }
-static ut_at24c01bdata_t _utAlldAt24c01bData = {
-  /* driver   */ &moduleLldEeprom,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldAt24c01b = {
-  /* name           */ "AT24C01B",
-  /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01b,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt24c01bData,
-};
+AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24co1bShellCmdCb);
 
 /*
- * LED PWM driver (TLC5947)
+ * TLC5947 (24 channel PWM LED driver)
  */
-static int _utShellCmdCb_Tlc5947(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TLC5947.h>
+static int _testTlc5947ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTlc5947, NULL);
-  return AOS_OK;
+  return moduleTestTlc5947ShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldTlc5947 = {
-  /* info           */ "TLC5947",
-  /* name           */ "LED PWM driver",
-  /* test function  */ utAlldTlc5947Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Lights",
-    /* callback */ _utShellCmdCb_Tlc5947,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldLedPwm,
-};
+AOS_SHELL_COMMAND(moduleTestTlc5947ShellCmd, "test:Lights", _testTlc5947ShellCmdCb);
+
+/*
+ * TPS2051BDBV (Current-limited power switch)
+ */
+#include <module_test_TPS20xxB.h>
+static int _testTps2051bdbvShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestTps20xxbShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestTps2051bdbvShellCmd, "test:PowerSwitch", _testTps2051bdbvShellCmdCb);
 
 /*
- * power switch (TPS2051BDBV)
+ * entire module
  */
-static int _utShellCmdCb_Tps2051bdbv(BaseSequentialStream* stream, int argc, char* argv[])
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream,&moduleUtAlldTps2051bdbv, NULL);
-  return AOS_OK;
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* AT24C01B (EEPROM) */
+  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TLC5947 (24 channel LED PWM driver) */
+  status |= moduleTestTlc5947ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS2051BDBV (Current-limited power switch) */
+  status |= moduleTestTps20xxbShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
 }
-aos_unittest_t moduleUtAlldTps2051bdbv = {
-  /* info           */ "TPS2051BDBV",
-  /* name           */ "current-limited power switch",
-  /* test function  */ utAlldTps20xxbFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerSwitch",
-    /* callback */ _utShellCmdCb_Tps2051bdbv,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldPowerSwitchLaser,
-};
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/LightRing_1-0/module.h b/modules/LightRing_1-0/module.h
index 9031297..6e36371 100644
--- a/modules/LightRing_1-0/module.h
+++ b/modules/LightRing_1-0/module.h
@@ -217,19 +217,20 @@ extern ROMCONST char* moduleShellPrompt;
 }
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
-  /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTlc5947.shellcmd);              \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps2051bdbv.shellcmd);          \
+  /* initialize tests and add to shell */                                     \
+  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestTlc5947ShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestTps2051bdbvShellCmd);             \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
 
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
@@ -244,7 +245,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
   /* SPI */                                                                   \
   spiStop(&MODULE_HAL_SPI_LIGHT);                                             \
   spiStop(&MODULE_HAL_SPI_WL);                                                \
@@ -310,7 +311,7 @@ extern ROMCONST char* moduleShellPrompt;
 extern AT24C01BDriver moduleLldEeprom;
 
 /**
- * @brief   LED PWM driver.
+ * @brief   24 channel PWM LED driver.
  */
 extern TLC5947Driver moduleLldLedPwm;
 
@@ -323,30 +324,31 @@ extern TPS20xxBDriver moduleLldPowerSwitchLaser;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_alld_AT24C01B_v1.h>
-#include <ut_alld_TLC5947_v1.h>
-#include <ut_alld_TPS20xxB_v1.h>
 
 /**
- * @brief   EEPROM unit test object.
+ * @brief   AT24C01BN-SH-B (EEPROM) test command.
  */
-extern aos_unittest_t moduleUtAlldAt24c01b;
+extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
 
 /**
- * @brief   LED PWM driver unit test object.
+ * @brief   TLC5947 (24 channel PWM LED driver) test command
  */
-extern aos_unittest_t moduleUtAlldTlc5947;
+extern aos_shellcommand_t moduleTestTlc5947ShellCmd;
 
 /**
- * @brief   Current-limited power switch (Laser output)
+ * @brief   TPS2051BDBV (Current-limited power switch) test command
  */
-extern aos_unittest_t moduleUtAlldTps2051bdbv;
+extern aos_shellcommand_t moduleTestTps2051bdbvShellCmd;
 
+/**
+ * @brief   Entire module test command.
+ */
+extern aos_shellcommand_t moduleTestAllShellCmd;
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/LightRing_1-0/test/AT24C01B/module_test_AT24C01B.c b/modules/LightRing_1-0/test/AT24C01B/module_test_AT24C01B.c
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/modules/LightRing_1-0/test/AT24C01B/module_test_AT24C01B.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_AT24C01B.h>
+#include <aos_test_AT24C01B.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at24c01bdata_t _data = {
+  /* driver   */ &moduleLldEeprom,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "AT24C01BN-SH-B", "1kbit EEPROM", moduleTestAt24c01bShellCb, aosTestAt24c01bFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-0/test/AT24C01B/module_test_AT24C01B.h b/modules/LightRing_1-0/test/AT24C01B/module_test_AT24C01B.h
new file mode 100644
index 0000000..6764c0d
--- /dev/null
+++ b/modules/LightRing_1-0/test/AT24C01B/module_test_AT24C01B.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT24C01B_H
+#define MODULE_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_AT24C01B_H */
+
diff --git a/modules/LightRing_1-0/test/TLC5947/module_test_TLC5947.c b/modules/LightRing_1-0/test/TLC5947/module_test_TLC5947.c
new file mode 100644
index 0000000..80730a8
--- /dev/null
+++ b/modules/LightRing_1-0/test/TLC5947/module_test_TLC5947.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TLC5947.h>
+#include <aos_test_TLC5947.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tlc5947data_t _data = {
+  /* driver   */ &moduleLldLedPwm,
+};
+
+static AOS_TEST(_test, "TLC5947", "24 channel PWM LED driver", moduleTestTlc5947ShellCb, aosTestTlc5947Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTlc5947ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-0/test/TLC5947/module_test_TLC5947.h b/modules/LightRing_1-0/test/TLC5947/module_test_TLC5947.h
new file mode 100644
index 0000000..c56ba72
--- /dev/null
+++ b/modules/LightRing_1-0/test/TLC5947/module_test_TLC5947.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TLC5947_H
+#define MODULE_TEST_TLC5947_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestTlc5947ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TLC5947_H */
+
diff --git a/modules/LightRing_1-0/test/TPS20xxB/module_test_TPS20xxB.c b/modules/LightRing_1-0/test/TPS20xxB/module_test_TPS20xxB.c
new file mode 100644
index 0000000..96717f1
--- /dev/null
+++ b/modules/LightRing_1-0/test/TPS20xxB/module_test_TPS20xxB.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS20xxB.h>
+#include <aos_test_TPS20xxB.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps20xxbdata_t _data = {
+  /* driver   */ &moduleLldPowerSwitchLaser,
+};
+
+static AOS_TEST(_test, "TPS2051BDBV", "current-limited power switch", moduleTestTps20xxbShellCb, aosTestTps20xxbFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps20xxbShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-0/test/TPS20xxB/module_test_TPS20xxB.h b/modules/LightRing_1-0/test/TPS20xxB/module_test_TPS20xxB.h
new file mode 100644
index 0000000..09aa079
--- /dev/null
+++ b/modules/LightRing_1-0/test/TPS20xxB/module_test_TPS20xxB.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS20xxB_H
+#define MODULE_TEST_TPS20xxB_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestTps20xxbShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS20xxB_H */
+
diff --git a/modules/LightRing_1-2/Makefile b/modules/LightRing_1-2/Makefile
index 2218186..0d50ddd 100644
--- a/modules/LightRing_1-2/Makefile
+++ b/modules/LightRing_1-2/Makefile
@@ -112,100 +112,59 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m3
+MCU := cortex-m3
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F103xE.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F103xE.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/AT24C01B/v1 \
+                            $(AMIROLLD)/drivers/INA219/v1 \
+                            $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/MIC9404x/v1 \
+                            $(AMIROLLD)/drivers/TLC5947/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/AT24C01B_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/MIC9404x_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TLC5947_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 # Create an additional .srec image file.
diff --git a/modules/LightRing_1-2/alldconf.h b/modules/LightRing_1-2/alldconf.h
index 136aaa7..2f3ac50 100644
--- a/modules/LightRing_1-2/alldconf.h
+++ b/modules/LightRing_1-2/alldconf.h
@@ -44,34 +44,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
 /**
- * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
+ * @brief   TLC5947 chained configuration
  */
-#define AMIROLLD_CFG_AT24C01B                   1
-
-/**
- * @brief   Enable flag for the INA219 power monitor.
- */
-#define AMIROLLD_CFG_INA219                     1
-
-/**
- * @brief   Enable flag for the status LED.
- */
-#define AMIROLLD_CFG_LED                        1
-
-/**
- * @brief   Enable flag for the MIC94042 high-side load switches.
- */
-#define AMIROLLD_CFG_MIC9404x                   1
-
-/**
- * @brief   Enable flag for the SN75C3221E RS232 Transceiver.
- */
-#define AMIROLLD_CFG_SNx5C3221E                 1
-
-/**
- * @brief   Enable flag for the TLC5947 LED driver.
- */
-#define AMIROLLD_CFG_TLC5947                    1
 #define TLC5947_LLD_CHAINED                     3
 
 #endif /* ALLDCONF_H */
diff --git a/modules/LightRing_1-2/halconf.h b/modules/LightRing_1-2/halconf.h
index 2f3f81e..f5c3744 100644
--- a/modules/LightRing_1-2/halconf.h
+++ b/modules/LightRing_1-2/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/LightRing_1-2/module.c b/modules/LightRing_1-2/module.c
index e7abe54..8416448 100644
--- a/modules/LightRing_1-2/module.c
+++ b/modules/LightRing_1-2/module.c
@@ -298,7 +298,7 @@ ROMCONST apalControlGpio_t moduleGpioLed = {
   /* GPIO */ &_gpioLed,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ LED_LLD_GPIO_ACTIVE_STATE,
+    /* active state   */ APAL_GPIO_ACTIVE_LOW,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -461,6 +461,8 @@ MIC9404xDriver moduleLldPowerSwitchVsys = {
   /* power enable GPIO  */ &moduleGpioSwVsysEn,
 };
 
+// TODO: add SNx5C3221E
+
 TLC5947Driver moduleLldLedPwm = {
   /* SPI driver         */ &MODULE_HAL_SPI_LIGHT,
   /* BLANK signal GPIO  */ &moduleGpioLightBlank,
@@ -471,177 +473,296 @@ TLC5947Driver moduleLldLedPwm = {
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <string.h>
 
 /*
- * EEPROM (AT24C01B)
+ * AT24C01BN-SH-B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT24C01B.h>
+static int _testAt24co1bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
-  return AOS_OK;
+  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
 }
-static ut_at24c01bdata_t _utAlldAt24c01bData = {
-  /* driver   */ &moduleLldEeprom,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldAt24c01b = {
-  /* name           */ "AT24C01B",
-  /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01b,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt24c01bData,
-};
+AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24co1bShellCmdCb);
 
 /*
  * INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_INA219.h>
+static int _testIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldIna219, "VLED (4.2V)");
-  return AOS_OK;
+  return moduleTestIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_ina219data_t _utIna219Data = {
-  /* driver           */ &moduleLldPowerMonitorVled,
-  /* expected voltage */ 4.2f,
-  /* tolerance        */ 0.2f,
-  /* timeout */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldIna219 = {
-  /* name           */ "INA219",
-  /* info           */ "power monitor",
-  /* test function  */ utAlldIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldIna219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utIna219Data,
-};
+AOS_SHELL_COMMAND(moduleTestIna219ShellCmd, "test:PowerMonitor", _testIna219ShellCmdCb);
 
 /*
  * Status LED
  */
-static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLed, NULL);
-  return AOS_OK;
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLed = {
-  /* name           */ "LED",
-  /* info           */ NULL,
-  /* test function  */ utAlldLedFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StatusLED",
-    /* callback */ _utShellCmdCb_AlldLed,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStatusLed,
-};
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:StatusLED", _testLedShellCmdCb);
 
 /*
- * Power switch driver (MIC9404x)
+ * MIC9404x (power switch)
  */
-static int _utShellCmdCb_Mic9404x(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_MIC9404x.h>
+static int _testMic9404xShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "1.8V") == 0) {
-      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV18;
-      aosUtRun(stream, &moduleUtAlldMic9404x, "1.8V");
-      moduleUtAlldMic9404x.data = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "3.3V") == 0) {
-      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV33;
-      aosUtRun(stream, &moduleUtAlldMic9404x, "3.3V");
-      moduleUtAlldMic9404x.data = NULL;
-      return AOS_OK;
-    }
-// The 4.2V switch is disabled due to a hardware bug.
-//    else if (strcmp(argv[1], "4.2V") == 0) {
-//      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV42;
-//      aosUtRun(stream, &moduleUtAlldMic9404x, "4.2V");
-//      moduleUtAlldMic9404x.data = NULL;
-//      return AOS_OK;
-//    }
-    else if (strcmp(argv[1], "5.0V") == 0) {
-      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV50;
-      aosUtRun(stream, &moduleUtAlldMic9404x, "5.0V");
-      moduleUtAlldMic9404x.data = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VSYS") == 0) {
-      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchVsys;
-      aosUtRun(stream, &moduleUtAlldMic9404x, "VSYS");
-      moduleUtAlldMic9404x.data = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  1.8V\n");
-  chprintf(stream, "    Test power switch for 1.8V supply.\n");
-  chprintf(stream, "  3.3V\n");
-  chprintf(stream, "    Test power switch for 3.3V supply.\n");
-// The 4.2V switch is disabled due to a hardware bug.
-//  chprintf(stream, "  4.2V\n");
-//  chprintf(stream, "    Test power switch for 4.2V supply.\n");
-  chprintf(stream, "  5.0V\n");
-  chprintf(stream, "    Test power switch for 5.0V supply.\n");
-  chprintf(stream, "  VSYS\n");
-  chprintf(stream, "    Test power switch for VSYS supply.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestMic9404xShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldMic9404x = {
-  /* info           */ "MIC9404x",
-  /* name           */ "power swicth driver",
-  /* test function  */ utAlldMic9404xFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerSwitch",
-    /* callback */ _utShellCmdCb_Mic9404x,
-    /* next     */ NULL,
-  },
-  /* data           */ NULL,
-};
+AOS_SHELL_COMMAND(moduleTestMic9404xShellCmd, "test:PowerSwitch", _testMic9404xShellCmdCb);
+
+// TODO: add SNx5C3221E
+
+/*
+ * TLC5947 (24 channel PWM LED driver)
+ */
+#include <module_test_TLC5947.h>
+static int _testTlc5947ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestTlc5947ShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestTlc5947ShellCmd, "test:Lights", _testTlc5947ShellCmdCb);
 
 /*
- * LED PWM driver (TLC5947)
+ * entire module
  */
-static int _utShellCmdCb_Tlc5947(BaseSequentialStream* stream, int argc, char* argv[])
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldTlc5947, NULL);
-  return AOS_OK;
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* AT24C01B (EEPROM) */
+  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* INA219 (power monitor) */
+  status |= moduleTestIna219ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* Status LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* MIC9404x (power switch) */
+  // 1.8V
+  targv[1] = "1.8V";
+  status |= moduleTestMic9404xShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // 3.3V
+  targv[1] = "3.3V";
+  status |= moduleTestMic9404xShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+// The 4.2V switch is disabled due to a hardware bug.
+//  // 4.2V
+//  targv[1] = "4.2V";
+//  status |= moduleTestMic9404xShellCb(stream, 2, targv, &result_test);
+//  result_total = aosTestResultAdd(result_total, result_test);
+  // 5.0V
+  targv[1] = "5.0V";
+  status |= moduleTestMic9404xShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  //VSYS
+  targv[1] = "VSYS";
+  status |= moduleTestMic9404xShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  // TODO: add SNx5C3221E
+
+  /* TLC5947 (24 channel PWM LED driver) */
+  status |= moduleTestTlc5947ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
 }
-aos_unittest_t moduleUtAlldTlc5947 = {
-  /* info           */ "TLC5947",
-  /* name           */ "LED PWM driver",
-  /* test function  */ utAlldTlc5947Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Lights",
-    /* callback */ _utShellCmdCb_Tlc5947,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldLedPwm,
-};
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
+
+
+
+
+//#include <string.h>
+
+///*
+// * EEPROM (AT24C01B)
+// */
+//static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+//{
+//  (void)argc;
+//  (void)argv;
+//  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
+//  return AOS_OK;
+//}
+//static ut_at24c01bdata_t _utAlldAt24c01bData = {
+//  /* driver   */ &moduleLldEeprom,
+//  /* timeout  */ MICROSECONDS_PER_SECOND,
+//};
+//aos_unittest_t moduleUtAlldAt24c01b = {
+//  /* name           */ "AT24C01B",
+//  /* info           */ "1kbit EEPROM",
+//  /* test function  */ utAlldAt24c01bFunc,
+//  /* shell command  */ {
+//    /* name     */ "unittest:EEPROM",
+//    /* callback */ _utShellCmdCb_AlldAt24c01b,
+//    /* next     */ NULL,
+//  },
+//  /* data           */ &_utAlldAt24c01bData,
+//};
+
+///*
+// * INA219 (power monitor)
+// */
+//static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
+//{
+//  (void)argc;
+//  (void)argv;
+//  aosUtRun(stream, &moduleUtAlldIna219, "VLED (4.2V)");
+//  return AOS_OK;
+//}
+//static ut_ina219data_t _utIna219Data = {
+//  /* driver           */ &moduleLldPowerMonitorVled,
+//  /* expected voltage */ 4.2f,
+//  /* tolerance        */ 0.2f,
+//  /* timeout */ MICROSECONDS_PER_SECOND,
+//};
+//aos_unittest_t moduleUtAlldIna219 = {
+//  /* name           */ "INA219",
+//  /* info           */ "power monitor",
+//  /* test function  */ utAlldIna219Func,
+//  /* shell command  */ {
+//    /* name     */ "unittest:PowerMonitor",
+//    /* callback */ _utShellCmdCb_AlldIna219,
+//    /* next     */ NULL,
+//  },
+//  /* data           */ &_utIna219Data,
+//};
+
+///*
+// * Status LED
+// */
+//static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
+//{
+//  (void)argc;
+//  (void)argv;
+//  aosUtRun(stream, &moduleUtAlldLed, NULL);
+//  return AOS_OK;
+//}
+//aos_unittest_t moduleUtAlldLed = {
+//  /* name           */ "LED",
+//  /* info           */ NULL,
+//  /* test function  */ utAlldLedFunc,
+//  /* shell command  */ {
+//    /* name     */ "unittest:StatusLED",
+//    /* callback */ _utShellCmdCb_AlldLed,
+//    /* next     */ NULL,
+//  },
+//  /* data           */ &moduleLldStatusLed,
+//};
+
+///*
+// * Power switch driver (MIC9404x)
+// */
+//static int _utShellCmdCb_Mic9404x(BaseSequentialStream* stream, int argc, char* argv[])
+//{
+//  // evaluate arguments
+//  if (argc == 2) {
+//    if (strcmp(argv[1], "1.8V") == 0) {
+//      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV18;
+//      aosUtRun(stream, &moduleUtAlldMic9404x, "1.8V");
+//      moduleUtAlldMic9404x.data = NULL;
+//      return AOS_OK;
+//    }
+//    else if (strcmp(argv[1], "3.3V") == 0) {
+//      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV33;
+//      aosUtRun(stream, &moduleUtAlldMic9404x, "3.3V");
+//      moduleUtAlldMic9404x.data = NULL;
+//      return AOS_OK;
+//    }
+//// The 4.2V switch is disabled due to a hardware bug.
+////    else if (strcmp(argv[1], "4.2V") == 0) {
+////      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV42;
+////      aosUtRun(stream, &moduleUtAlldMic9404x, "4.2V");
+////      moduleUtAlldMic9404x.data = NULL;
+////      return AOS_OK;
+////    }
+//    else if (strcmp(argv[1], "5.0V") == 0) {
+//      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchV50;
+//      aosUtRun(stream, &moduleUtAlldMic9404x, "5.0V");
+//      moduleUtAlldMic9404x.data = NULL;
+//      return AOS_OK;
+//    }
+//    else if (strcmp(argv[1], "VSYS") == 0) {
+//      moduleUtAlldMic9404x.data = &moduleLldPowerSwitchVsys;
+//      aosUtRun(stream, &moduleUtAlldMic9404x, "VSYS");
+//      moduleUtAlldMic9404x.data = NULL;
+//      return AOS_OK;
+//    }
+//  }
+//  // print help
+//  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+//  chprintf(stream, "Options:\n");
+//  chprintf(stream, "  1.8V\n");
+//  chprintf(stream, "    Test power switch for 1.8V supply.\n");
+//  chprintf(stream, "  3.3V\n");
+//  chprintf(stream, "    Test power switch for 3.3V supply.\n");
+//// The 4.2V switch is disabled due to a hardware bug.
+////  chprintf(stream, "  4.2V\n");
+////  chprintf(stream, "    Test power switch for 4.2V supply.\n");
+//  chprintf(stream, "  5.0V\n");
+//  chprintf(stream, "    Test power switch for 5.0V supply.\n");
+//  chprintf(stream, "  VSYS\n");
+//  chprintf(stream, "    Test power switch for VSYS supply.\n");
+//  return AOS_INVALIDARGUMENTS;
+//}
+//aos_unittest_t moduleUtAlldMic9404x = {
+//  /* info           */ "MIC9404x",
+//  /* name           */ "power swicth driver",
+//  /* test function  */ utAlldMic9404xFunc,
+//  /* shell command  */ {
+//    /* name     */ "unittest:PowerSwitch",
+//    /* callback */ _utShellCmdCb_Mic9404x,
+//    /* next     */ NULL,
+//  },
+//  /* data           */ NULL,
+//};
+
+///*
+// * LED PWM driver (TLC5947)
+// */
+//static int _utShellCmdCb_Tlc5947(BaseSequentialStream* stream, int argc, char* argv[])
+//{
+//  (void)argc;
+//  (void)argv;
+//  aosUtRun(stream, &moduleUtAlldTlc5947, NULL);
+//  return AOS_OK;
+//}
+//aos_unittest_t moduleUtAlldTlc5947 = {
+//  /* info           */ "TLC5947",
+//  /* name           */ "LED PWM driver",
+//  /* test function  */ utAlldTlc5947Func,
+//  /* shell command  */ {
+//    /* name     */ "unittest:Lights",
+//    /* callback */ _utShellCmdCb_Tlc5947,
+//    /* next     */ NULL,
+//  },
+//  /* data           */ &moduleLldLedPwm,
+//};
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/LightRing_1-2/module.h b/modules/LightRing_1-2/module.h
index fd221db..ffb29a4 100644
--- a/modules/LightRing_1-2/module.h
+++ b/modules/LightRing_1-2/module.h
@@ -298,18 +298,19 @@ extern ROMCONST char* moduleShellPrompt;
  * @brief   Unit test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
-  /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLed.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldMic9404x.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTlc5947.shellcmd);              \
+  /* initialize tests and add to shell */                                     \
+  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestIna219ShellCmd);                  \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestMic9404xShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestTlc5947ShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
 
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
@@ -324,7 +325,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
   /* SPI */                                                                   \
   spiStop(&MODULE_HAL_SPI_LIGHT);                                             \
   /* I2C */                                                                   \
@@ -393,7 +394,7 @@ extern ROMCONST char* moduleShellPrompt;
 #include <alld_INA219.h>
 #include <alld_LED.h>
 #include <alld_MIC9404x.h>
-//#include <alld_SNx5C3221E.h>
+// TODO: add SNx5C3221E
 #include <alld_TLC5947.h>
 
 /**
@@ -437,8 +438,10 @@ extern MIC9404xDriver moduleLldPowerSwitchV50;
  */
 extern MIC9404xDriver moduleLldPowerSwitchVsys;
 
+// TODO: add SNx5C3221E
+
 /**
- * @brief   LED PWM driver.
+ * @brief   24 channel PWM LED driver.
  */
 extern TLC5947Driver moduleLldLedPwm;
 
@@ -446,42 +449,43 @@ extern TLC5947Driver moduleLldLedPwm;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_alld_AT24C01B_v1.h>
-#include <ut_alld_INA219_v1.h>
-#include <ut_alld_LED_v1.h>
-#include <ut_alld_MIC9404x_v1.h>
-//#include <ut_alld_SNx5C3221E_v1.h>
-#include <ut_alld_TLC5947_v1.h>
 
 /**
- * @brief   EEPROM unit test object.
+ * @brief   AT24C01BN-SH-B (EEPROM) test command.
  */
-extern aos_unittest_t moduleUtAlldAt24c01b;
+extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
 
 /**
- * @brief   INA219 (power monitor) unit test object.
+ * @brief   INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldIna219;
+extern aos_shellcommand_t moduleTestIna219ShellCmd;
 
 /**
- * @brief   Status LED unit test object.
+ * @brief   Status LED test command.
  */
-extern aos_unittest_t moduleUtAlldLed;
+extern aos_shellcommand_t moduleTestLedShellCmd;
+
+/**
+ * @brief   MIC9404x (power switch) test command.
+ */
+extern aos_shellcommand_t moduleTestMic9404xShellCmd;
+
+// TODO: add SNx5C3221E
 
 /**
- * @brief   Power switch unit test object.
+ * @brief   TLC5947 (24 channel PWM LED driver) test command.
  */
-extern aos_unittest_t moduleUtAlldMic9404x;
+extern aos_shellcommand_t moduleTestTlc5947ShellCmd;
 
 /**
- * @brief   LED PWM driver unit test object.
+ * @brief   Entire module test command.
  */
-extern aos_unittest_t moduleUtAlldTlc5947;
+extern aos_shellcommand_t moduleTestAllShellCmd;
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/LightRing_1-2/test/AT24C01B/module_test_AT24C01B.c b/modules/LightRing_1-2/test/AT24C01B/module_test_AT24C01B.c
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/modules/LightRing_1-2/test/AT24C01B/module_test_AT24C01B.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_AT24C01B.h>
+#include <aos_test_AT24C01B.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at24c01bdata_t _data = {
+  /* driver   */ &moduleLldEeprom,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "AT24C01BN-SH-B", "1kbit EEPROM", moduleTestAt24c01bShellCb, aosTestAt24c01bFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-2/test/AT24C01B/module_test_AT24C01B.h b/modules/LightRing_1-2/test/AT24C01B/module_test_AT24C01B.h
new file mode 100644
index 0000000..6764c0d
--- /dev/null
+++ b/modules/LightRing_1-2/test/AT24C01B/module_test_AT24C01B.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT24C01B_H
+#define MODULE_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_AT24C01B_H */
+
diff --git a/modules/LightRing_1-2/test/INA219/module_test_INA219.c b/modules/LightRing_1-2/test/INA219/module_test_INA219.c
new file mode 100644
index 0000000..bda325b
--- /dev/null
+++ b/modules/LightRing_1-2/test/INA219/module_test_INA219.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_INA219.h>
+#include <aos_test_INA219.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_ina219data_t _data = {
+  /* driver           */ &moduleLldPowerMonitorVled,
+  /* expected voltage */ 4.2f,
+  /* tolerance        */ 0.2f,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "INA219", "power monitor", moduleTestIna219ShellCb, aosTestIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-2/test/INA219/module_test_INA219.h b/modules/LightRing_1-2/test/INA219/module_test_INA219.h
new file mode 100644
index 0000000..08c3462
--- /dev/null
+++ b/modules/LightRing_1-2/test/INA219/module_test_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_INA219_H
+#define MODULE_TEST_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_INA219_H */
+
diff --git a/modules/LightRing_1-2/test/LED/module_test_LED.c b/modules/LightRing_1-2/test/LED/module_test_LED.c
new file mode 100644
index 0000000..cd97c0f
--- /dev/null
+++ b/modules/LightRing_1-2/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldStatusLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-2/test/LED/module_test_LED.h b/modules/LightRing_1-2/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/LightRing_1-2/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/LightRing_1-2/test/MIC9404x/module_test_MIC9404x.c b/modules/LightRing_1-2/test/MIC9404x/module_test_MIC9404x.c
new file mode 100644
index 0000000..2425c6e
--- /dev/null
+++ b/modules/LightRing_1-2/test/MIC9404x/module_test_MIC9404x.c
@@ -0,0 +1,148 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_MIC9404x.h>
+#include <aos_test_MIC9404x.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_mic9404data_t _data = {
+  /* driver */ NULL,
+};
+
+static AOS_TEST(_test, "MIC9404x", "power switch", moduleTestMic9404xShellCb, aosTestMic9404xFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestMic9404xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    V18,
+    V33,
+// The 4.2V switch is disabled due to a hardware bug.
+//  V42,
+    V50,
+    VSYS,
+  } mic = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "1.8V") == 0) {
+      mic = V18;
+    } else if (strcmp(argv[1], "3.3V") == 0) {
+      mic = V33;
+// The 4.2V switch is disabled due to a hardware bug.
+//  } else if (strcmp(argv[1], "4.2V") == 0) {
+//    mic = V42;
+    } else if (strcmp(argv[1], "5.0V") == 0) {
+      mic = V50;
+    } else if (strcmp(argv[1], "VSYS") == 0) {
+      mic = VSYS;
+    }
+  }
+
+  // handle valid power switch
+  if (mic != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (mic) {
+      case V18:
+        _data.driver = &moduleLldPowerSwitchV18;
+        aosTestRun(stream, &_test, "1.8V");
+        _data.driver = NULL;
+        break;
+      case V33:
+        _data.driver = &moduleLldPowerSwitchV33;
+        aosTestRun(stream, &_test, "3.3V");
+        _data.driver = NULL;
+        break;
+// The 4.2V switch is disabled due to a hardware bug.
+//    case V42:
+//      _data.driver = &moduleLldPowerSwitchV42;
+//      aosTestRun(stream, &_test, "4.2V");
+//      _data.driver = NULL;
+//      break;
+      case V50:
+        _data.driver = &moduleLldPowerSwitchV50;
+        aosTestRun(stream, &_test, "5.0V");
+        _data.driver = NULL;
+        break;
+      case VSYS:
+        _data.driver = &moduleLldPowerSwitchVsys;
+        aosTestRun(stream, &_test, "VSYS");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  1.8V\n");
+    chprintf(stream, "    Test power switch for 1.8V supply.\n");
+    chprintf(stream, "  3.3V\n");
+    chprintf(stream, "    Test power switch for 3.3V supply.\n");
+// The 4.2V switch is disabled due to a hardware bug.
+//  chprintf(stream, "  4.2V\n");
+//  chprintf(stream, "    Test power switch for 4.2V supply.\n");
+    chprintf(stream, "  5.0V\n");
+    chprintf(stream, "    Test power switch for 5.0V supply.\n");
+    chprintf(stream, "  VSYS\n");
+    chprintf(stream, "    Test power switch for VSYS supply.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-2/test/MIC9404x/module_test_MIC9404x.h b/modules/LightRing_1-2/test/MIC9404x/module_test_MIC9404x.h
new file mode 100644
index 0000000..cc676fd
--- /dev/null
+++ b/modules/LightRing_1-2/test/MIC9404x/module_test_MIC9404x.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_MIC9404x_H
+#define MODULE_TEST_MIC9404x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestMic9404xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_MIC9404x_H */
+
diff --git a/modules/LightRing_1-2/test/TLC5947/module_test_TLC5947.c b/modules/LightRing_1-2/test/TLC5947/module_test_TLC5947.c
new file mode 100644
index 0000000..80730a8
--- /dev/null
+++ b/modules/LightRing_1-2/test/TLC5947/module_test_TLC5947.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TLC5947.h>
+#include <aos_test_TLC5947.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tlc5947data_t _data = {
+  /* driver   */ &moduleLldLedPwm,
+};
+
+static AOS_TEST(_test, "TLC5947", "24 channel PWM LED driver", moduleTestTlc5947ShellCb, aosTestTlc5947Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTlc5947ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/LightRing_1-2/test/TLC5947/module_test_TLC5947.h b/modules/LightRing_1-2/test/TLC5947/module_test_TLC5947.h
new file mode 100644
index 0000000..c56ba72
--- /dev/null
+++ b/modules/LightRing_1-2/test/TLC5947/module_test_TLC5947.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TLC5947_H
+#define MODULE_TEST_TLC5947_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestTlc5947ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TLC5947_H */
+
diff --git a/modules/NUCLEO-F103RB/Makefile b/modules/NUCLEO-F103RB/Makefile
index 514af80..082d9fd 100644
--- a/modules/NUCLEO-F103RB/Makefile
+++ b/modules/NUCLEO-F103RB/Makefile
@@ -112,100 +112,55 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
 MCU = cortex-m3
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F103xB.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F103xB.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/button/v1
+#                            $(AMIROLLD)/drivers/DW1000/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/button_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1
+#                    $(AMIROOS_TEST_DIR)periphery-lld/DW1000_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 #                                                                              #
diff --git a/modules/NUCLEO-F103RB/alldconf.h b/modules/NUCLEO-F103RB/alldconf.h
index 606722c..a1e4ea4 100644
--- a/modules/NUCLEO-F103RB/alldconf.h
+++ b/modules/NUCLEO-F103RB/alldconf.h
@@ -43,12 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-/**
- * @brief   Enable flag for the DW1000 UWB transmitter.
- * @note    Uncomment this if the device is attached.
- */
-//#define AMIROLLD_CFG_DW1000                     1
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/NUCLEO-F103RB/aosconf.h b/modules/NUCLEO-F103RB/aosconf.h
index 6483502..0d7b9db 100644
--- a/modules/NUCLEO-F103RB/aosconf.h
+++ b/modules/NUCLEO-F103RB/aosconf.h
@@ -84,7 +84,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @note    Any mandatory events (e.g. for SSSP) are enabled implicitely despite this configuration.
  */
 #if !defined(OS_CFG_MAIN_LOOP_IOEVENT_MASK)
-  #define AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK    (MODULE_OS_IOEVENTFLAGS_DW1000_IRQn | MODULE_OS_IOEVENTFLAGS_USERBUTTON)
+  #define AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK    MODULE_OS_IOEVENTFLAGS_USERBUTTON
+//  #define AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK    (MODULE_OS_IOEVENTFLAGS_DW1000_IRQn | MODULE_OS_IOEVENTFLAGS_USERBUTTON)
 #else /* !defined(OS_CFG_MAIN_LOOP_IOEVENT_MASK) */
   #define AMIROOS_CFG_MAIN_LOOP_IOEVENT_MASK    OS_CFG_MAIN_LOOP_IOEVENT_MASK
 #endif /* !defined(OS_CFG_MAIN_LOOP_IOEVENT_MASK) */
diff --git a/modules/NUCLEO-F103RB/board.c b/modules/NUCLEO-F103RB/board.c
index 7968e7f..44c0770 100644
--- a/modules/NUCLEO-F103RB/board.c
+++ b/modules/NUCLEO-F103RB/board.c
@@ -18,6 +18,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "hal.h"
 
+/*===========================================================================*/
+/* Driver local definitions.                                                 */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported variables.                                                */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local variables and types.                                         */
+/*===========================================================================*/
+
 /**
  * @brief   PAL setup.
  * @details Digital I/O ports static configuration as defined in @p board.h.
@@ -34,6 +46,18 @@ const PALConfig pal_default_config =
 };
 #endif
 
+/*===========================================================================*/
+/* Driver local functions.                                                   */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver interrupt handlers.                                                */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported functions.                                                */
+/*===========================================================================*/
+
 /*
  * Early initialization code.
  * This initialization must be performed just after stack setup and before
diff --git a/modules/NUCLEO-F103RB/board.h b/modules/NUCLEO-F103RB/board.h
index 9b4c995..371783c 100644
--- a/modules/NUCLEO-F103RB/board.h
+++ b/modules/NUCLEO-F103RB/board.h
@@ -19,6 +19,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef BOARD_H
 #define BOARD_H
 
+/*===========================================================================*/
+/* Driver constants.                                                         */
+/*===========================================================================*/
+
 /*
  * Setup for the ST NUCLEO64-F103RB board.
  */
@@ -51,6 +55,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define STM32F103xB
 
 /*
+ * Identifiers for optional peripherals.
+ */
+#define BOARD_DW1000_CONNECTED      false
+
+/*
  * IO pins assignments.
  */
 #define GPIOA_ARD_A0                0U
@@ -211,6 +220,21 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define LINE_OSC_IN                 PAL_LINE(GPIOD, GPIOH_OSC_IN)
 #define LINE_OSC_OUT                PAL_LINE(GPIOD, GPIOH_OSC_OUT)
 
+/*===========================================================================*/
+/* Driver pre-compile time settings.                                         */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks.                                       */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver data structures and types.                                         */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver macros.                                                            */
+/*===========================================================================*/
 
 /*
  * I/O ports initial setup, this configuration is established soon after reset
@@ -295,6 +319,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define usb_lld_disconnect_bus(usbp)
 
+/*===========================================================================*/
+/* External declarations.                                                    */
+/*===========================================================================*/
+
 #if !defined(_FROM_ASM_)
 #ifdef __cplusplus
 extern "C" {
diff --git a/modules/NUCLEO-F103RB/halconf.h b/modules/NUCLEO-F103RB/halconf.h
index d2636a0..aa28d78 100644
--- a/modules/NUCLEO-F103RB/halconf.h
+++ b/modules/NUCLEO-F103RB/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/NUCLEO-F103RB/module.c b/modules/NUCLEO-F103RB/module.c
index 11fcafd..b147329 100644
--- a/modules/NUCLEO-F103RB/module.c
+++ b/modules/NUCLEO-F103RB/module.c
@@ -24,7 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
 
 /*===========================================================================*/
 /**
@@ -49,7 +49,7 @@ SerialConfig moduleHalProgIfConfig = {
   /* CR1      */ 0,
 };
 
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
 
 /*! SPI (high and low speed) configuration for DW1000 */
 SPIConfig moduleHalSpiUwbHsConfig = {
@@ -70,7 +70,7 @@ SPIConfig moduleHalSpiUwbLsConfig = {
   /* CR2                         */ 0,
 };
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /** @} */
 
@@ -85,7 +85,7 @@ SPIConfig moduleHalSpiUwbLsConfig = {
  * @brief   LED output signal GPIO.
  */
 static apalGpio_t _gpioLed = {
-  /* line */ PAL_LINE(GPIOA, GPIOA_LED_GREEN),
+  /* line */ LINE_LED_GREEN,
 };
 ROMCONST apalControlGpio_t moduleGpioLed = {
   /* GPIO */ &_gpioLed,
@@ -96,7 +96,7 @@ ROMCONST apalControlGpio_t moduleGpioLed = {
   },
 };
 
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
 
 /**
  * @brief   DW1000 reset output signal GPIO.
@@ -145,13 +145,13 @@ ROMCONST apalControlGpio_t moduleGpioSpiChipSelect = {
   },
 };
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /**
  * @brief   User button input signal GPIO.
  */
 static apalGpio_t _gpioUserButton = {
-  /* line */ PAL_LINE(GPIOC, GPIOC_BUTTON),
+  /* line */ LINE_BUTTON,
 };
 ROMCONST apalControlGpio_t moduleGpioUserButton = {
   /* GPIO */ &_gpioUserButton,
@@ -184,6 +184,7 @@ ROMCONST char* moduleShellPrompt = "NUCLEO-F103RB";
  */
 /*===========================================================================*/
 
+/** @} */
 
 /*===========================================================================*/
 /**
@@ -192,7 +193,7 @@ ROMCONST char* moduleShellPrompt = "NUCLEO-F103RB";
  */
 /*===========================================================================*/
 
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
 
 /*! @brief TODO: Manual implementation of SPI configuration. Somehow, it is necessary in NUCLEO-F103RB  */
 void dw1000_spi_init(void){
@@ -203,7 +204,7 @@ void dw1000_spi_init(void){
   apalGpioWrite(moduleGpioSpiChipSelect.gpio, APAL_GPIO_LOW);
 }
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 /** @} */
 
 /*===========================================================================*/
@@ -213,7 +214,15 @@ void dw1000_spi_init(void){
  */
 /*===========================================================================*/
 
-#if defined(AMIROLLD_CFG_DW1000)
+LEDDriver moduleLldLed = {
+  /* LED enable Gpio */ &moduleGpioLed,
+};
+
+ButtonDriver moduleLldUserButton = {
+  /* Button Gpio  */ &moduleGpioUserButton,
+};
+
+#if (BOARD_DW1000_CONNECTED == true)
 
 DW1000Driver moduleLldDw1000 = {
   /* SPI driver         */ &MODULE_HAL_SPI_UWB,
@@ -221,18 +230,39 @@ DW1000Driver moduleLldDw1000 = {
   /* RESET DW1000       */ &moduleGpioDw1000Reset,
 };
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
+
 /** @} */
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 
-#if defined(AMIROLLD_CFG_DW1000)
+/*
+ * LED
+ */
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:LED", _testLedShellCmdCb);
+
+/*
+ * User button
+ */
+#include <module_test_button.h>
+static int _testButtonShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestButtonShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestButtonShellCmd, "test:button", _testButtonShellCmdCb);
+
+#if (BOARD_DW1000_CONNECTED == true) || defined(__DOXYGEN__)
 
 /*
  * UwB Driver (DW1000)
@@ -255,7 +285,39 @@ aos_unittest_t moduleUtAlldDw1000 = {
   },
   /* data           */ &moduleLldDw1000,
 };
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
+
+/*
+ * entire module
+ */
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  (void)argc;
+  (void)argv;
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* User button */
+  status |= moduleTestButtonShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* DW1000 */
+  //TODO
+
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
+}
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/NUCLEO-F103RB/module.h b/modules/NUCLEO-F103RB/module.h
index 344337c..4ede7fd 100644
--- a/modules/NUCLEO-F103RB/module.h
+++ b/modules/NUCLEO-F103RB/module.h
@@ -36,7 +36,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /*===========================================================================*/
 
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
 
 #if defined(__cplusplus)
 extern "C" {
@@ -48,7 +48,7 @@ void dw1000_spi_init(void);
 }
 #endif /* defined(__cplusplus) */
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 
 /** @} */
@@ -75,15 +75,13 @@ extern SerialConfig moduleHalProgIfConfig;
  */
 #define MODULE_HAL_RTC                          RTCD1
 
-
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
 
 /**
  * @brief   SPI interface driver for the motion sensors (gyroscope and accelerometer).
  */
 #define MODULE_HAL_SPI_UWB                      SPID2
 
-
 /**
  * @brief   Configuration for the SPI interface driver to communicate with the LED driver.
  */
@@ -94,11 +92,10 @@ extern SPIConfig moduleHalSpiUwbHsConfig;
  */
 extern SPIConfig moduleHalSpiUwbLsConfig;
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /** @} */
 
-
 /*===========================================================================*/
 /**
  * @name GPIO definitions
@@ -111,7 +108,8 @@ extern SPIConfig moduleHalSpiUwbLsConfig;
  */
 extern ROMCONST apalControlGpio_t moduleGpioLed;
 
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
+
 /**
  * @brief   DW1000 reset output signal
  * @note    the reset pin should be drived as low by MCU to activate.
@@ -130,7 +128,7 @@ extern ROMCONST apalControlGpio_t moduleGpioDw1000Irqn;
  */
 extern ROMCONST apalControlGpio_t moduleGpioSpiChipSelect ;
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /**
  * @brief   User button input signal.
@@ -146,17 +144,20 @@ extern ROMCONST apalControlGpio_t moduleGpioUserButton;
  */
 /*===========================================================================*/
 
+#if (BOARD_DW1000_CONNECTED == true)
+
 /**
  * @brief   Event flag to be call dwt_isr() interrupt.
  */
 #define MODULE_OS_IOEVENTFLAGS_DW1000_IRQn      AOS_IOEVENT_FLAG(PAL_PAD(LINE_ARD_D6))
 
+#endif /* (BOARD_DW1000_CONNECTED == true) */
+
 /**
  * @brief   Event flag to be set on a USER_BUTTON interrupt.
  */
 #define MODULE_OS_IOEVENTFLAGS_USERBUTTON       AOS_IOEVENT_FLAG(PAL_PAD(LINE_BUTTON))
 
-
 #if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 /**
  * @brief   Shell prompt text.
@@ -174,72 +175,75 @@ extern ROMCONST char* moduleShellPrompt;
   palEnableLineEvent(moduleGpioUserButton.gpio->line, APAL2CH_EDGE(moduleGpioUserButton.meta.edge));                \
   MODULE_INIT_INTERRUPTS_DW1000();                                            \
 }
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
   #define MODULE_INIT_INTERRUPTS_DW1000() {                                   \
     palSetLineCallback(moduleGpioDw1000Irqn.gpio->line, aosSysGetStdIntCallback(), &moduleGpioDw1000Irqn.gpio->line); \
     palEnableLineEvent(moduleGpioDw1000Irqn.gpio->line, APAL2CH_EDGE(moduleGpioDw1000Irqn.meta.edge));                \
   }
-#else /* defined(AMIROLLD_CFG_DW1000) */
+#else /* (BOARD_DW1000_CONNECTED == true) */
   #define MODULE_INIT_INTERRUPTS_DW1000() {                                   \
   }
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
-  /* add unit-test shell commands */                                          \
+  /* initialize tests and add to shell */                                     \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestButtonShellCmd);                  \
   MODULE_INIT_TESTS_DW1000();                                                 \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
   #define MODULE_INIT_TESTS_DW1000() {                                        \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldDw1000.shellcmd);             \
+    aosShellAddCommand(&aos.shell, &moduleTestDw1000ShellCmd);                \
   }
-#else /* defined(AMIROLLD_CFG_DW1000) */
+#else /* (BOARD_DW1000_CONNECTED == true) */
   #define MODULE_INIT_TESTS_DW1000() {                                        \
   }
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
-  MODULE_INIT_PERIPHERY_COMM_DW1000();                                        \
+  MODULE_INIT_PERIPHERY_IF_DW1000();                                          \
 }
-#if defined(AMIROLLD_CFG_DW1000)
-  #define MODULE_INIT_PERIPHERY_COMM_DW1000() {                               \
+#if (BOARD_DW1000_CONNECTED == true)
+  #define MODULE_INIT_PERIPHERY_IF_DW1000() {                                 \
     /* SPI init */                                                            \
     dw1000_spi_init();                                                        \
     spiStart(&MODULE_HAL_SPI_UWB, &moduleHalSpiUwbLsConfig);                  \
   }
-#else /* defined(AMIROLLD_CFG_DW1000) */
-  #define MODULE_INIT_PERIPHERY_COMM_DW1000() {                               \
+#else /* (BOARD_DW1000_CONNECTED == true) */
+  #define MODULE_INIT_PERIPHERY_IF_DW1000() {                                 \
   }
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
-  MODULE_SHUTDOWN_PERIPHERY_COMM_DW1000();                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
+  MODULE_SHUTDOWN_PERIPHERY_IF_DW1000();                                      \
 }
-#if defined(AMIROLLD_CFG_DW1000)
-#define MODULE_SHUTDOWN_PERIPHERY_COMM_DW1000() {                             \
+#if (BOARD_DW1000_CONNECTED == true)
+#define MODULE_SHUTDOWN_PERIPHERY_IF_DW1000() {                               \
   /* SPI */                                                                   \
   spiStop(&MODULE_HAL_SPI_UWB);                                               \
 }
-#else /* defined(AMIROLLD_CFG_DW1000) */
-  #define MODULE_SHUTDOWN_PERIPHERY_COMM_DW1000() {                           \
+#else /* (BOARD_DW1000_CONNECTED == true) */
+  #define MODULE_SHUTDOWN_PERIPHERY_IF_DW1000() {                             \
   }
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /**
- * @brief   HOOK to call process_deca_irq() func when the dw1000 interrupt pin is activated.
+ * @brief   HOOK to toggle the LEDs when the user button is pressed.
  */
 #define MODULE_MAIN_LOOP_IO_EVENT(eventflags) {                               \
   if (eventflags & MODULE_OS_IOEVENTFLAGS_USERBUTTON) {                       \
@@ -249,17 +253,20 @@ extern ROMCONST char* moduleShellPrompt;
   }                                                                           \
   MODULE_MAIN_LOOP_IO_EVENT_DW1000();                                         \
 }
-#if defined(AMIROLLD_CFG_DW1000)
+#if (BOARD_DW1000_CONNECTED == true)
+  /**
+   * @brief   HOOK to call process_deca_irq() func when the dw1000 interrupt pin is activated.
+   */
   #define MODULE_MAIN_LOOP_IO_EVENT_DW1000() {                                \
     if(eventflags & MODULE_OS_IOEVENTFLAGS_DW1000_IRQn) {                     \
       /*apalGpioToggle(moduleGpioLedGreen.gpio); // just for debug  */        \
       process_deca_irq();                                                     \
     }                                                                         \
   }
-#else /* defined(AMIROLLD_CFG_DW1000) */
+#else /* (BOARD_DW1000_CONNECTED == true) */
   #define MODULE_MAIN_LOOP_IO_EVENT_DW1000() {                                \
   }
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /** @} */
 
@@ -278,32 +285,60 @@ extern ROMCONST char* moduleShellPrompt;
  * @{
  */
 /*===========================================================================*/
-#if defined(AMIROLLD_CFG_DW1000)
+#include <alld_LED.h>
+#include <alld_button.h>
+
+/**
+ * @brief   LED driver.
+ */
+extern LEDDriver moduleLldLed;
+
+/**
+ * @brief   Button driver.
+ */
+extern ButtonDriver moduleLldUserButton;
+
+#if (BOARD_DW1000_CONNECTED == true)
+
 #include <alld_DW1000.h>
 
 extern DW1000Driver moduleLldDw1000;
 
-#endif /* defined(AMIROLLD_CFG_DW1000) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
 
 /** @} */
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 
-#if defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1)
-#include <ut_alld_DW1000_v1.h>
+/**
+ * @brief   LED test command.
+ */
+extern aos_shellcommand_t moduleTestLedShellCmd;
+
+/**
+ * @brief   User button test command.
+ */
+extern aos_shellcommand_t moduleTestButtonShellCmd;
+
+#if (BOARD_DW1000_CONNECTED == true)
 
 /**
- * @brief   DW1000 unit test object.
+ * @brief   DW1000 (UWB transmitter) test command.
  */
-extern aos_unittest_t moduleUtAlldDw1000;
+extern aos_shellcommand_t moduleTestDw1000ShellCmd;
 
-#endif /* defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1) */
+#endif /* (BOARD_DW1000_CONNECTED == true) */
+
+/**
+ * @brief   Entire module test command.
+ */
+extern aos_shellcommand_t moduleTestAllShellCmd;
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/NUCLEO-F103RB/test/LED/module_test_LED.c b/modules/NUCLEO-F103RB/test/LED/module_test_LED.c
new file mode 100644
index 0000000..96c8a1b
--- /dev/null
+++ b/modules/NUCLEO-F103RB/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/NUCLEO-F103RB/test/LED/module_test_LED.h b/modules/NUCLEO-F103RB/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/NUCLEO-F103RB/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/NUCLEO-F103RB/test/button/module_test_button.c b/modules/NUCLEO-F103RB/test/button/module_test_button.c
new file mode 100644
index 0000000..9990b53
--- /dev/null
+++ b/modules/NUCLEO-F103RB/test/button/module_test_button.c
@@ -0,0 +1,72 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_button.h>
+#include <aos_test_button.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_buttondata_t _data = {
+  /* button       */ &moduleLldUserButton,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_USERBUTTON,
+};
+
+static AOS_TEST(_test, "button", NULL, moduleTestButtonShellCb, aosTestButtonFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestButtonShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/NUCLEO-F103RB/test/button/module_test_button.h b/modules/NUCLEO-F103RB/test/button/module_test_button.h
new file mode 100644
index 0000000..d7ebc43
--- /dev/null
+++ b/modules/NUCLEO-F103RB/test/button/module_test_button.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BUTTON_H
+#define MODULE_TEST_BUTTON_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestButtonShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BUTTON_H */
+
diff --git a/modules/NUCLEO-F401RE/Makefile b/modules/NUCLEO-F401RE/Makefile
index 10d18eb..417c9a7 100644
--- a/modules/NUCLEO-F401RE/Makefile
+++ b/modules/NUCLEO-F401RE/Makefile
@@ -112,100 +112,52 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
 MCU = cortex-m4
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F401xE.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F401xE.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/button/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/LED_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 #                                                                              #
diff --git a/modules/NUCLEO-F401RE/halconf.h b/modules/NUCLEO-F401RE/halconf.h
index a3dbdfe..950d241 100644
--- a/modules/NUCLEO-F401RE/halconf.h
+++ b/modules/NUCLEO-F401RE/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/NUCLEO-F401RE/module.c b/modules/NUCLEO-F401RE/module.c
index 106240d..68063b1 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 <amiroos.h>
+#include "module.h"
 
 /*===========================================================================*/
 /**
@@ -123,7 +123,7 @@ ROMCONST char* moduleShellPrompt = "NUCLEO-F401RE";
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
diff --git a/modules/NUCLEO-F401RE/module.h b/modules/NUCLEO-F401RE/module.h
index e84cbac..eeb5f7a 100644
--- a/modules/NUCLEO-F401RE/module.h
+++ b/modules/NUCLEO-F401RE/module.h
@@ -120,7 +120,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
 }
@@ -128,7 +128,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
 }
 
 /**
@@ -164,7 +164,7 @@ extern ROMCONST char* moduleShellPrompt;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
diff --git a/modules/NUCLEO-F767ZI/Makefile b/modules/NUCLEO-F767ZI/Makefile
index 3d95361..381e77f 100644
--- a/modules/NUCLEO-F767ZI/Makefile
+++ b/modules/NUCLEO-F767ZI/Makefile
@@ -112,100 +112,51 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
 MCU = cortex-m4
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F76xxI.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f7xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F7xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F76xxI.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/button/v1
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/LED_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 #                                                                              #
diff --git a/modules/NUCLEO-F767ZI/halconf.h b/modules/NUCLEO-F767ZI/halconf.h
index 8a0e20a..7c76048 100644
--- a/modules/NUCLEO-F767ZI/halconf.h
+++ b/modules/NUCLEO-F767ZI/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/NUCLEO-F767ZI/module.c b/modules/NUCLEO-F767ZI/module.c
index fa5d9aa..bb5d9ae 100644
--- a/modules/NUCLEO-F767ZI/module.c
+++ b/modules/NUCLEO-F767ZI/module.c
@@ -153,7 +153,7 @@ ROMCONST char* moduleShellPrompt = "NUCLEO-F767ZI";
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
diff --git a/modules/NUCLEO-F767ZI/module.h b/modules/NUCLEO-F767ZI/module.h
index 71c3d3e..6e95b2c 100644
--- a/modules/NUCLEO-F767ZI/module.h
+++ b/modules/NUCLEO-F767ZI/module.h
@@ -28,7 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define AMIROOS_MODULE_H
 
 #include <amiroos.h>
-#include <math.h>
 
 /*===========================================================================*/
 /**
@@ -131,7 +130,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
 }
@@ -139,7 +138,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
 }
 
 /**
@@ -177,7 +176,7 @@ extern ROMCONST char* moduleShellPrompt;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
diff --git a/modules/NUCLEO-L476RG/Makefile b/modules/NUCLEO-L476RG/Makefile
index d4f68bc..67f7791 100644
--- a/modules/NUCLEO-L476RG/Makefile
+++ b/modules/NUCLEO-L476RG/Makefile
@@ -112,100 +112,55 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m4
+MCU := cortex-m4
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT := $(MODULEDIR)/STM32L476xG.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32L476xG.ld
-
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/button/v1 \
+                            $(AMIROLLD)/drivers/MPU6050/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/button_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/MPU6050_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 #                                                                              #
diff --git a/modules/NUCLEO-L476RG/alldconf.h b/modules/NUCLEO-L476RG/alldconf.h
index 333b9d3..25e56bd 100644
--- a/modules/NUCLEO-L476RG/alldconf.h
+++ b/modules/NUCLEO-L476RG/alldconf.h
@@ -43,12 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-/**
- * @brief   Enable flag for the MPU6050 proximity sensor.
- * @note    Uncomment this if the device is attached.
- */
-//#define AMIROLLD_CFG_MPU6050                    1
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/NUCLEO-L476RG/board.h b/modules/NUCLEO-L476RG/board.h
index 5b08883..6691707 100644
--- a/modules/NUCLEO-L476RG/board.h
+++ b/modules/NUCLEO-L476RG/board.h
@@ -60,6 +60,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define STM32L476xx
 
 /*
+ * Identifiers for optional peripherals.
+ */
+#define BOARD_MPU6050_CONNECTED     false
+
+
+/*
  * IO pins assignments.
  */
 #define GPIOA_ARD_A0                0U
diff --git a/modules/NUCLEO-L476RG/halconf.h b/modules/NUCLEO-L476RG/halconf.h
index 7665d81..4f640a9 100644
--- a/modules/NUCLEO-L476RG/halconf.h
+++ b/modules/NUCLEO-L476RG/halconf.h
@@ -33,8 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include <alldconf.h>
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
@@ -82,12 +81,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   Enables the I2C subsystem.
  */
 #if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
-// enable if MPU6050 demo is enabled
-#if defined(AMIROLLD_CFG_MPU6050)
 #define HAL_USE_I2C                         TRUE
-#else
-#define HAL_USE_I2C                         FALSE
-#endif
 #endif
 
 /**
diff --git a/modules/NUCLEO-L476RG/module.c b/modules/NUCLEO-L476RG/module.c
index ab805f1..5500b4d 100644
--- a/modules/NUCLEO-L476RG/module.c
+++ b/modules/NUCLEO-L476RG/module.c
@@ -49,15 +49,15 @@ SerialConfig moduleHalProgIfConfig = {
   /* CR1      */ 0,
 };
 
-#if defined(AMIROLLD_CFG_MPU6050)
+#if (BOARD_MPU6050_CONNECTED == true)
 
 I2CConfig moduleHalI2c3Config = {
-  /* timing reg */ 0, // configured later in MODULE_INIT_PERIPHERY_COMM_MPU6050() hook
+  /* timing reg */ 0, // configured later in MODULE_INIT_PERIPHERY_IF_MPU6050() hook
   /* CR1        */ 0,
   /* CR2        */ 0,
 };
 
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
 /** @} */
 
@@ -129,52 +129,101 @@ ROMCONST char* moduleShellPrompt = "NUCLEO-L476RG";
  */
 /*===========================================================================*/
 
-#if defined(AMIROLLD_CFG_MPU6050)
+LEDDriver moduleLldLed = {
+  /* LED enable Gpio */ &moduleGpioLed,
+};
+
+ButtonDriver moduleLldUserButton = {
+  /* Button Gpio  */ &moduleGpioUserButton,
+};
+
+#if (BOARD_MPU6050_CONNECTED == true)
 
 MPU6050Driver moduleLldMpu6050 = {
   /* I2C Driver       */ &MODULE_HAL_I2C3,
   /* I²C address      */ MPU6050_LLD_I2C_ADDR_FIXED,
 };
 
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
 /** @} */
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 
-#if defined(AMIROLLD_CFG_MPU6050)
+/*
+ * LED
+ */
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:LED", _testLedShellCmdCb);
+
+/*
+ * User button
+ */
+#include <module_test_button.h>
+static int _testButtonShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestButtonShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestButtonShellCmd, "test:button", _testButtonShellCmdCb);
+
+#if (BOARD_MPU6050_CONNECTED == true) || defined(__DOXYGEN__)
+
+/*
+ * MPU6050 (accelerometer & gyroscope)
+ */
+#include <module_test_MPU6050.h>
+static int _testMpu6050ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestMpu6050ShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestMpu6050ShellCmd, "test:IMU", _testMpu6050ShellCmdCb);
+
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
-/* MPU6050 */
-static int _utShellCmdCb_AlldMpu6050(BaseSequentialStream* stream, int argc, char* argv[])
+/*
+ * entire module
+ */
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldMpu6050, NULL);
-  return AOS_OK;
-}
-static ut_mpu6050data_t _utAlldMpu6050Data = {
-   /* driver */ &moduleLldMpu6050,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldMpu6050 = {
-  /* name           */ "MPU6050",
-  /* info           */ "accelerometer and gyroscope",
-  /* test function  */ utAlldMpu6050Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Accelerometer&Gyroscope",
-    /* callback */ _utShellCmdCb_AlldMpu6050,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldMpu6050Data
-};
 
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* User button */
+  status |= moduleTestButtonShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* MPU6050 (accelerometer & gyroscope) */
+#if (BOARD_MPU6050_CONNECTED == true)
+  status |= moduleTestMpu6050ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
+
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
+}
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/NUCLEO-L476RG/module.h b/modules/NUCLEO-L476RG/module.h
index c38d503..cc370d1 100644
--- a/modules/NUCLEO-L476RG/module.h
+++ b/modules/NUCLEO-L476RG/module.h
@@ -28,7 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define AMIROOS_MODULE_H
 
 #include <amiroos.h>
-#include <math.h>
 
 /*===========================================================================*/
 /**
@@ -61,7 +60,7 @@ extern SerialConfig moduleHalProgIfConfig;
  */
 #define MODULE_HAL_RTC                          RTCD1
 
-#if defined(AMIROLLD_CFG_MPU6050)
+#if (BOARD_MPU6050_CONNECTED == true) || defined(__DOXYGEN__)
 
 /**
  * @brief   I2C driver to access multiplexer, proximity sensors 5 to 8, power monitors for VSYS4.2, VIO 5.0 and VDD, EEPROM, touch sensor, and fuel gauge (front battery).
@@ -73,7 +72,7 @@ extern SerialConfig moduleHalProgIfConfig;
  */
 extern I2CConfig moduleHalI2c3Config;
 
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
 /** @} */
 
@@ -126,32 +125,35 @@ extern ROMCONST char* moduleShellPrompt;
 }
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
-  /* add unit-test shell commands */                                          \
+  /* initialize tests and add to shell */                                     \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestButtonShellCmd);                  \
   MODULE_INIT_TEST_MPU6050();                                                 \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
-#if defined(AMIROLLD_CFG_MPU6050)
+#if (BOARD_MPU6050_CONNECTED == true)
   #define MODULE_INIT_TEST_MPU6050() {                                        \
     /* add unit-test shell commands */                                        \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldMpu6050.shellcmd);            \
+    aosShellAddCommand(&aos.shell, &moduleTestMpu6050ShellCmd);               \
   }
-#else /* defined(AMIROLLD_CFG_MPU6050) */
+#else /* (BOARD_MPU6050_CONNECTED == true) */
   #define MODULE_INIT_TEST_MPU6050() {}
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* MPU6050 demo */                                                          \
-  MODULE_INIT_PERIPHERY_COMM_MPU6050();                                       \
+  MODULE_INIT_PERIPHERY_IF_MPU6050();                                         \
 }
-#if defined(AMIROLLD_CFG_MPU6050)
-  #define MODULE_INIT_PERIPHERY_COMM_MPU6050() {                              \
+#if (BOARD_MPU6050_CONNECTED == true)
+  #define MODULE_INIT_PERIPHERY_IF_MPU6050() {                                \
     /* maximum I2C frequency is 1MHz for this MCU */                          \
     uint32_t i2c3_freq = 1000000;                                             \
     /* find minimum amon all devices connected to this bus */                 \
@@ -170,19 +172,19 @@ extern ROMCONST char* moduleShellPrompt;
     moduleHalI2c3Config.timingr |= ((((moduleHalI2c3Config.timingr & I2C_TIMINGR_SDADEL_Msk) >> I2C_TIMINGR_SDADEL_Pos) * 2) + 1) << I2C_TIMINGR_SCLDEL_Pos;  \
     /* now we can start the I2C driver */                                     \
     chSysLock();                                                              \
-    palSetLineMode(LINE_ARD_A4, PAL_MODE_ALTERNATE(4));                \
-    palSetLineMode(LINE_ARD_A5, PAL_MODE_ALTERNATE(4));                \
+    palSetLineMode(LINE_ARD_A4, PAL_MODE_ALTERNATE(4));                       \
+    palSetLineMode(LINE_ARD_A5, PAL_MODE_ALTERNATE(4));                       \
     chSysUnlock();                                                            \
     i2cStart(&MODULE_HAL_I2C3, &moduleHalI2c3Config);                         \
   }
-#else /* defined(AMIROLLD_CFG_MPU6050) */
-  #define MODULE_INIT_PERIPHERY_COMM_MPU6050() {}
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#else /* (BOARD_MPU6050_CONNECTED == true) */
+  #define MODULE_INIT_PERIPHERY_IF_MPU6050() {}
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
 }
 
 /**
@@ -190,9 +192,9 @@ extern ROMCONST char* moduleShellPrompt;
  */
 #define MODULE_MAIN_LOOP_IO_EVENT(eventflags) {                               \
   if (eventflags & MODULE_OS_IOEVENTFLAGS_USERBUTTON) {                       \
-    apalControlGpioState_t buttonstate;                                       \
-    apalControlGpioGet(&moduleGpioUserButton, &buttonstate);                  \
-    apalControlGpioSet(&moduleGpioLed, buttonstate);                          \
+    button_lld_state_t buttonstate;                                           \
+    button_lld_get(&moduleLldUserButton, &buttonstate);                       \
+    led_lld_set(&moduleLldLed, (buttonstate == BUTTON_LLD_STATE_PRESSED) ? LED_LLD_STATE_ON : LED_LLD_STATE_OFF); \
   }                                                                           \
 }
 
@@ -213,8 +215,20 @@ extern ROMCONST char* moduleShellPrompt;
  * @{
  */
 /*===========================================================================*/
+#include <alld_LED.h>
+#include <alld_button.h>
 
-#if defined(AMIROLLD_CFG_MPU6050)
+/**
+ * @brief   LED driver.
+ */
+extern LEDDriver moduleLldLed;
+
+/**
+ * @brief   Button driver.
+ */
+extern ButtonDriver moduleLldUserButton;
+
+#if (BOARD_MPU6050_CONNECTED == true) || defined(__DOXYGEN__)
 
 #include <alld_MPU6050.h>
 
@@ -223,28 +237,41 @@ extern ROMCONST char* moduleShellPrompt;
  */
 extern MPU6050Driver moduleLldMpu6050;
 
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
 
 /** @} */
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
 
-#if defined(AMIROLLD_CFG_MPU6050)
+/**
+ * @brief   LED test command.
+ */
+extern aos_shellcommand_t moduleTestLedShellCmd;
+
+/**
+ * @brief   User button test command.
+ */
+extern aos_shellcommand_t moduleTestButtonShellCmd;
 
-#include <ut_alld_MPU6050_v1.h>
+#if (BOARD_MPU6050_CONNECTED == true) || defined(__DOXYGEN__)
 
 /**
- * @brief   MPU6050 unit test object.
+ * @brief   MPU6050 (Accelerometer & Gyroscope) test command.
  */
-extern aos_unittest_t moduleUtAlldMpu6050;
+extern aos_shellcommand_t moduleTestMpu6050ShellCmd;
 
-#endif /* defined(AMIROLLD_CFG_MPU6050) */
+#endif /* (BOARD_MPU6050_CONNECTED == true) */
+
+/**
+ * @brief   Entire module test command.
+ */
+extern aos_shellcommand_t moduleTestAllShellCmd;
 
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
diff --git a/modules/NUCLEO-L476RG/test/LED/module_test_LED.c b/modules/NUCLEO-L476RG/test/LED/module_test_LED.c
new file mode 100644
index 0000000..96c8a1b
--- /dev/null
+++ b/modules/NUCLEO-L476RG/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/NUCLEO-L476RG/test/LED/module_test_LED.h b/modules/NUCLEO-L476RG/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/NUCLEO-L476RG/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/NUCLEO-L476RG/test/MPU6050/module_test_MPU6050.c b/modules/NUCLEO-L476RG/test/MPU6050/module_test_MPU6050.c
new file mode 100644
index 0000000..a5fac39
--- /dev/null
+++ b/modules/NUCLEO-L476RG/test/MPU6050/module_test_MPU6050.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_MPU6050_CONNECTED == true)) || defined(__DOXYGEN__)
+
+#include <module_test_MPU6050.h>
+#include <aos_test_MPU6050.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_mpu6050data_t _data = {
+  /* driver   */ &moduleLldMpu6050,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "MPU6050", "Accelerometer & Gyroscope", moduleTestMpu6050ShellCb, aosTestMpu6050Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestMpu6050ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_MPU6050_CONNECTED == true) */
diff --git a/modules/NUCLEO-L476RG/test/MPU6050/module_test_MPU6050.h b/modules/NUCLEO-L476RG/test/MPU6050/module_test_MPU6050.h
new file mode 100644
index 0000000..828e485
--- /dev/null
+++ b/modules/NUCLEO-L476RG/test/MPU6050/module_test_MPU6050.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_MPU5040_H
+#define MODULE_TEST_MPU5040_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_MPU6050_CONNECTED == true)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestMpu6050ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_MPU6050_CONNECTED == true) */
+
+#endif /* MODULE_TEST_MPU5040_H */
+
diff --git a/modules/NUCLEO-L476RG/test/button/module_test_button.c b/modules/NUCLEO-L476RG/test/button/module_test_button.c
new file mode 100644
index 0000000..9990b53
--- /dev/null
+++ b/modules/NUCLEO-L476RG/test/button/module_test_button.c
@@ -0,0 +1,72 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_button.h>
+#include <aos_test_button.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_buttondata_t _data = {
+  /* button       */ &moduleLldUserButton,
+  /* event source */ &aos.events.io,
+  /* event flags  */ MODULE_OS_IOEVENTFLAGS_USERBUTTON,
+};
+
+static AOS_TEST(_test, "button", NULL, moduleTestButtonShellCb, aosTestButtonFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestButtonShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/NUCLEO-L476RG/test/button/module_test_button.h b/modules/NUCLEO-L476RG/test/button/module_test_button.h
new file mode 100644
index 0000000..d7ebc43
--- /dev/null
+++ b/modules/NUCLEO-L476RG/test/button/module_test_button.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BUTTON_H
+#define MODULE_TEST_BUTTON_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestButtonShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BUTTON_H */
+
diff --git a/modules/PowerManagement_1-1/Makefile b/modules/PowerManagement_1-1/Makefile
index 09773b1..edcaf66 100644
--- a/modules/PowerManagement_1-1/Makefile
+++ b/modules/PowerManagement_1-1/Makefile
@@ -112,100 +112,76 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m4
+MCU := cortex-m4
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F405xG.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F405xG.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/AT24C01B/v1 \
+                            $(AMIROLLD)/drivers/AT42QT1050/v1 \
+                            $(AMIROLLD)/drivers/bq241xx/v1 \
+                            $(AMIROLLD)/drivers/bq27500/v1 \
+                            $(AMIROLLD)/drivers/INA219/v1 \
+                            $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/MPR121/v1 \
+                            $(AMIROLLD)/drivers/PCA9544A/v1 \
+                            $(AMIROLLD)/drivers/PCAL6524/v1 \
+                            $(AMIROLLD)/drivers/PKxxxExxx/v1 \
+                            $(AMIROLLD)/drivers/TPS6211x/v1 \
+                            $(AMIROLLD)/drivers/VCNL4020/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)lld/adc \
+                    $(AMIROOS_TEST_DIR)periphery-lld/AT24C01B_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/AT42QT1050_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/bq241xx_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/bq27500_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/bq27500_v1_bq241xx_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/MPR121_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PCA9544A_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PCAL6524_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PKxxxExxx_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS6211x_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS6211x_v1_INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/VCNL4020_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 # Create an additional .srec image file.
diff --git a/modules/PowerManagement_1-1/alldconf.h b/modules/PowerManagement_1-1/alldconf.h
index a40490a..3273f0e 100644
--- a/modules/PowerManagement_1-1/alldconf.h
+++ b/modules/PowerManagement_1-1/alldconf.h
@@ -43,100 +43,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-// required to differentiate between various sensor rings
-#include <board.h>
-
-/**
- * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
- */
-#define AMIROLLD_CFG_AT24C01B                   1
-
-/**
- * @brief   Enable flag for the BQ24103A charger.
- */
-#define AMIROLLD_CFG_BQ241xx                    1
-
 /**
- * @brief   Enable flag for the BQ27500 fuel gauge.
+ * @brief   BQ27500 hardware version
  */
-#define AMIROLLD_CFG_BQ27500                    1
 #define BQ27500_LLD_HWVERSION                   120
 
 /**
- * @brief   Enable flag for the INA219 power monitor.
- */
-#define AMIROLLD_CFG_INA219                     1
-
-/**
- * @brief   Enable flag for the status LED.
+ * @brief   PKLCS1212E4001 frequency specification
  */
-#define AMIROLLD_CFG_LED                        1
-
-/**
- * @brief   Enable flag for the PKLCS1212E4001 buzzer.
- */
-#define AMIROLLD_CFG_PKxxxExxx                  1
 #define PKxxxExxx_LLD_FREQUENCY_MIN             2000
 #define PKxxxExxx_LLD_FREQUENCY_SPEC            4000
 #define PKxxxExxx_LLD_FREQUENCY_MAX             6000
 
-/**
- * @brief   Enable flag for the TPS2051BDBV power switch.
- */
-#define AMIROLLD_CFG_TPS20xxB                   1
-
-/**
- * @brief   Enable flag for the TPS62113 step-down converter.
- */
-#define AMIROLLD_CFG_TPS6211x                   1
-
-#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
-
-/**
- * @brief   Enable flag for the MPR121 touch sensor.
- */
-#define AMIROLLD_CFG_MPR121                     1
-
-/**
- * @brief   Enable flag for the PCA9544A I2C multiplexer.
- */
-#define AMIROLLD_CFG_PCA9544A                   1
-
-/**
- * @brief   Enable flag for the VCNL4020 proximity sensor.
- */
-#define AMIROLLD_CFG_VCNL4020                   1
-
-#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
-
-#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
-
-/**
- * @brief   Enable flag for the PCAL6524 GPIO extender
- */
-#define AMIROLLD_CFG_PCAL6524                   1
-
-/**
- * @brief   Enable flag for the AT42Q1050 touch sensor.
- */
-#define AMIROLLD_CFG_AT42QT1050                 1
-
-#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
-
-#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
-
-/**
- * @brief   Enable flag for the PCAL6524 GPIO extender
- */
-#define AMIROLLD_CFG_PCAL6524                   1
-
-/**
- * @brief   Enable flag for the AT42Q1050 touch sensor.
- */
-#define AMIROLLD_CFG_AT42QT1050                 1
-
-#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/PowerManagement_1-1/board.h b/modules/PowerManagement_1-1/board.h
index e20f053..2547413 100644
--- a/modules/PowerManagement_1-1/board.h
+++ b/modules/PowerManagement_1-1/board.h
@@ -90,7 +90,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /*
  * Configuration macro to define which type of sensor ring is attached.
  */
+#if !defined(BOARD_SENSORRING) || defined(__DOXYGEN__)
 #define BOARD_SENSORRING                BOARD_PROXIMITYSENSOR
+#endif
 
 /*
  * IO pins assignments.
diff --git a/modules/PowerManagement_1-1/halconf.h b/modules/PowerManagement_1-1/halconf.h
index d3d5100..a083a21 100644
--- a/modules/PowerManagement_1-1/halconf.h
+++ b/modules/PowerManagement_1-1/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/PowerManagement_1-1/module.c b/modules/PowerManagement_1-1/module.c
index 4b38320..f584017 100644
--- a/modules/PowerManagement_1-1/module.c
+++ b/modules/PowerManagement_1-1/module.c
@@ -246,7 +246,7 @@ ROMCONST apalControlGpio_t moduleGpioLed = {
   /* GPIO */ &_gpioLed,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ LED_LLD_GPIO_ACTIVE_STATE,
+    /* active state   */ APAL_GPIO_ACTIVE_LOW,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -682,614 +682,143 @@ AT42QT1050Driver moduleLldTouch = {
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <string.h>
 
 /*
- * ADC
+ * ADC (VSYS)
  */
-static int _utShellCmdCb_Adc(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_adc.h>
+static int _testAdcShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAdcVsys, NULL);
-  return AOS_OK;
+  return moduleTestAdcShellCb(stream, argc, argv, NULL);
 }
-static ut_adcdata_t _utAdcVsysData = {
-  /* driver               */ &MODULE_HAL_ADC_VSYS,
-  /* ADC conversion group */ &moduleHalAdcVsysConversionGroup,
-};
-aos_unittest_t moduleUtAdcVsys = {
-  /* name           */ "ADC",
-  /* info           */ "VSYS",
-  /* test function  */ utAdcFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:ADC",
-    /* callback */ _utShellCmdCb_Adc,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAdcVsysData,
-};
+AOS_SHELL_COMMAND(moduleTestAdcShellCmd, "test:ADC", _testAdcShellCmdCb);
 
 /*
- * AT24C01B (EEPROM)
+ * AT24C01BN-SH-B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT24C01B.h>
+static int _testAt24c01bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
-  return AOS_OK;
+  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
 }
-static ut_at24c01bdata_t _utAlldAt24c01bData = {
-  /* driver   */ &moduleLldEeprom,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldAt24c01b = {
-  /* name           */ "AT24C01B",
-  /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01b,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt24c01bData,
-};
+AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24c01bShellCmdCb);
 
 /*
  * bq24103a (battery charger)
  */
-static int _utShellCmdCb_AlldBq24103a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_bq241xx.h>
+static int _testBq241xxShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // local variables
-  bool print_help = false;
-
-  // evaluate argument
-  if (argc == 2) {
-    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      moduleUtAlldBq24103a.data = &moduleLldBatteryChargerFront;
-      aosUtRun(stream, &moduleUtAlldBq24103a, "front battery");
-      moduleUtAlldBq24103a.data = NULL;
-    }
-    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      moduleUtAlldBq24103a.data = &moduleLldBatteryChargerRear;
-      aosUtRun(stream, &moduleUtAlldBq24103a, "rear battery");
-      moduleUtAlldBq24103a.data = NULL;
-    }
-    else {
-      print_help = true;
-    }
-  } else {
-    print_help = true;
-  }
-
-  // print help or just return
-  if (print_help) {
-    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-    chprintf(stream, "Options:\n");
-    chprintf(stream, "  --front, -f\n");
-    chprintf(stream, "    Test the front battery charger.\n");
-    chprintf(stream, "  --rear, -r\n");
-    chprintf(stream, "    Test the rear battery charger.\n");
-    return AOS_INVALIDARGUMENTS;
-  } else {
-    return AOS_OK;
-  }
+  return moduleTestBq241xxShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldBq24103a = {
-  /* name           */ "bq24103a",
-  /* info           */ "battery charger",
-  /* test function  */ utAlldBq241xxFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:BatteryCharger",
-    /* callback */ _utShellCmdCb_AlldBq24103a,
-    /* next     */ NULL,
-  },
-  /* data           */ NULL,
-};
+AOS_SHELL_COMMAND(moduleTestBq241xxShellCmd, "test:BatteryCharger", _testBq241xxShellCmdCb);
 
 /*
  * bq27500 (fuel gauge)
  */
-static int _utShellCmdCb_AlldBq27500(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_bq27500.h>
+static int _testBq27500ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = &moduleLldFuelGaugeFront;
-      aosUtRun(stream, &moduleUtAlldBq27500, "front battery");
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = &moduleLldFuelGaugeRear;
-      aosUtRun(stream, &moduleUtAlldBq27500, "rear battery");
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  --front, -f\n");
-  chprintf(stream, "    Test the front battery fuel gauge.\n");
-  chprintf(stream, "  --rear, -r\n");
-  chprintf(stream, "    Test the rear battery fuel gauge.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestBq27500ShellCb(stream, argc, argv, NULL);
 }
-static ut_bq27500data_t _utAlldBq27500Data = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldBq27500 = {
-  /* name           */ "bq27500",
-  /* info           */ "fuel gauge",
-  /* test function  */ utAlldBq27500Func,
-  /* shell command  */ {
-    /* name     */ "unittest:FuelGauge",
-    /* callback */ _utShellCmdCb_AlldBq27500,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldBq27500Data,
-};
+AOS_SHELL_COMMAND(moduleTestBq27500ShellCmd, "test:FuelGauge", _testBq27500ShellCmdCb);
 
 /*
  * bq27500 (fuel gauge) in combination with bq24103a (battery charger)
  */
-static int _utShellCmdCb_AlldBq27500Bq24103a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_bq27500_bq241xx.h>
+static int _testBq27500Bq241xxShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeFront;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerFront;
-      aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "front battery");
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeRear;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerRear;
-      aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "rear battery");
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  --front, -f\n");
-  chprintf(stream, "    Test the front battery fuel gauge and charger.\n");
-  chprintf(stream, "  --rear, -r\n");
-  chprintf(stream, "    Test the rear battery fuel gauge and charger.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestBq27500Bq241xxShellCb(stream, argc, argv, NULL);
 }
-static ut_bq27500bq241xxdata_t _utAlldBq27500Bq24103aData= {
-  /* bq27500 driver   */ NULL,
-  /* bq24103a driver  */ NULL,
-  /* timeout          */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldBq27500Bq24103a = {
-  /* name           */ "BQ27500 & BQ24103A",
-  /* info           */ "fuel gauge & battery charger",
-  /* test function  */ utAlldBq27500Bq241xxFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:FuelGauge&BatteryCharger",
-    /* callback */ _utShellCmdCb_AlldBq27500Bq24103a,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldBq27500Bq24103aData,
-};
+AOS_SHELL_COMMAND(moduleTestBq27500Bq241xxShellCmd, "test:FuelGauge&BatteryCharger", _testBq27500Bq241xxShellCmdCb);
 
 /*
  * INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_INA219.h>
+static int _testIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "VDD") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVdd;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 3.3f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VDD (3.3V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VIO1.8") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio18;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 1.8f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VIO (1.8V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VIO3.3") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio33;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 3.3f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VIO (3.3V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VSYS4.2") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVsys42;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 4.2f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VSYS (4.2V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VIO5.0") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio50;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 5.0f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VIO (5.0V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  VDD\n");
-  chprintf(stream, "    Test VDD (3.3V) power monitor.\n");
-  chprintf(stream, "  VIO1.8\n");
-  chprintf(stream, "    Test VIO 1.8V power monitor.\n");
-  chprintf(stream, "  VIO3.3\n");
-  chprintf(stream, "    Test VIO 3.3V power monitor.\n");
-  chprintf(stream, "  VSYS4.2\n");
-  chprintf(stream, "    Test VSYS 4.2V power monitor.\n");
-  chprintf(stream, "  VIO5.0\n");
-  chprintf(stream, "    Test VIO 5.0V power monitor.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_ina219data_t _utAlldIna219Data = {
-  /* driver           */ NULL,
-  /* expected voltage */ 0.0f,
-  /* tolerance        */ 0.05f,
-  /* timeout          */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldIna219 = {
-  /* name           */ "INA219",
-  /* info           */ "power monitor",
-  /* test function  */ utAlldIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldIna219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldIna219Data,
-};
+AOS_SHELL_COMMAND(moduleTestIna219ShellCmd, "test:PowerMonitor", _testIna219ShellCmdCb);
 
 /*
  * Status LED
  */
-static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLed, NULL);
-  return AOS_OK;
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLed = {
-  /* name           */ "LED",
-  /* info           */ NULL,
-  /* test function  */ utAlldLedFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StatusLED",
-    /* callback */ _utShellCmdCb_AlldLed,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStatusLed,
-};
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:StatusLED", _testLedShellCmdCb);
 
 /*
  * PKLCS1212E4001 (buzzer)
  */
-static int _utShellCmdCb_AlldPklcs1212e4001(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PKxxxExxx.h>
+static int _testPkxxxexxxShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldPklcs1212e4001, NULL);
-  return AOS_OK;
+  return moduleTestPkxxxexxxShellCb(stream, argc, argv, NULL);
 }
-static ut_pkxxxexxx_t _utAlldPklcs1212e4001Data = {
-  /* PWM driver   */ &MODULE_HAL_PWM_BUZZER,
-  /* PWM channel  */ MODULE_HAL_PWM_BUZZER_CHANNEL
-};
-aos_unittest_t moduleUtAlldPklcs1212e4001 = {
-  /* name           */ "PKLCS1212E4001",
-  /* info           */ "buzzer",
-  /* test function  */ utAlldPkxxxexxxFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:Buzzer",
-    /* callback */ _utShellCmdCb_AlldPklcs1212e4001,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPklcs1212e4001Data,
-};
+AOS_SHELL_COMMAND(moduleTestPkxxxexxxShellCmd, "test:Buzzer", _testPkxxxexxxShellCmdCb);
 
 /*
  * TPS62113 (step-down converter)
  */
-static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TPS6211x.h>
+static int _testTps6211xShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // Although there are four TPS62113 on the PCB, they all share the same input signal.
-  // A sa result, no additional shell arguments need to be evaluated.
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTps62113, NULL);
-  return AOS_OK;
+  return moduleTestTps6211xShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldTps62113 = {
-  /* name           */ "TPS62113",
-  /* info           */ "step-down converter",
-  /* test function  */ utAlldTps6211xFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StepDownConverter",
-    /* callback */ _utShellCmdCb_AlldTps62113,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStepDownConverter,
-};
+AOS_SHELL_COMMAND(moduleTestTps6211xShellCmd, "test:StepDownConverter", _testTps6211xShellCmdCb);
 
 /*
- * TPS62113 (step-donw converter) in combination with INA219 (power monitor)
+ * TPS62113 (step-sown converter) in combination with INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldTps62113Ina219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TPS6211x_INA219.h>
+static int _testTps6211xIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTps62113Ina219, "VSYS (4.2V)");
-  return AOS_OK;
+  return moduleTestTps6211xIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_tps6211xina219data_t _utAlldTps62113Ina219Data = {
-  /* TPS62113 */ &moduleLldStepDownConverter,
-  /* INA219   */ &moduleLldPowerMonitorVsys42,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldTps62113Ina219 = {
-  /* name           */ "TPS62113 & INA219",
-  /* info           */ "step-down converter & power monitor",
-  /* test function  */ utAlldTps6211xIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:StepDownConverter&PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldTps62113Ina219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldTps62113Ina219Data,
-};
+AOS_SHELL_COMMAND(moduleTestTps6211xIna219ShellCmd, "test:StepDownConverter&PowerMonitor", _testTps6211xIna219ShellCmdCb);
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
 /*
  * MPR121 (touch sensor)
  */
-static int _utShellCmdCb_AlldMpr121(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_MPR121.h>
+static int _testMpr121ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldMpr121, NULL);
-  return AOS_OK;
+  return moduleTestMpr121ShellCb(stream, argc, argv, NULL);
 }
-static ut_mpr121data_t _utAlldMpr121Data= {
-  /* MPR121 driver  */ &moduleLldTouch,
-  /* timeout        */ MICROSECONDS_PER_SECOND,
-  /* event source   */ &aos.events.io,
-  /* event flags    */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
-};
-aos_unittest_t moduleUtAlldMpr121 = {
-  /* name           */ "MPR121",
-  /* info           */ "touch sensor",
-  /* test function  */ utAlldMpr121Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Touch",
-    /* callback */ _utShellCmdCb_AlldMpr121,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldMpr121Data,
-};
+AOS_SHELL_COMMAND(moduleTestMpr121ShellCmd, "test:Touch", _testMpr121ShellCmdCb);
 
 /*
  * PCA9544A (I2C multiplexer)
  */
-static int _utShellCmdCb_AlldPca5944a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCA9544A.h>
+static int _testPca9544aShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "#1") == 0) {
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = &moduleLldI2cMultiplexer1;
-      aosUtRun(stream, &moduleUtAlldPca9544a, "I2C bus #1");
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "#2") == 0) {
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = &moduleLldI2cMultiplexer2;
-      aosUtRun(stream, &moduleUtAlldPca9544a, "I2C bus #2");
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  #1\n");
-  chprintf(stream, "    Test the multiplexer on the I2C bus #1.\n");
-  chprintf(stream, "  #2\n");
-  chprintf(stream, "    Test the multiplexer on the I2C bus #2.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestPca9544aShellCb(stream, argc, argv, NULL);
 }
-static ut_pca9544adata_t _utAlldPca9544aData = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPca9544a = {
-  /* name           */ "PCA9544A",
-  /* info           */ "I2C multiplexer",
-  /* test function  */ utAlldPca9544aFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:I2CMultiplexer",
-    /* callback */ _utShellCmdCb_AlldPca5944a,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPca9544aData,
-};
+AOS_SHELL_COMMAND(moduleTestPca9544aShellCmd, "test:I2CMultiplexer", _testPca9544aShellCmdCb);
 
 /*
  * VCNL4020 (proximity sensor)
  */
-static void _utAlldVcnl4020_disableInterrupt(VCNL4020Driver* vcnl)
+#include <module_test_VCNL4020.h>
+static int _testVcnl4020ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  uint8_t intstatus;
-  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  if (intstatus) {
-    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  }
-  return;
+  return moduleTestVcnl4020ShellCb(stream, argc, argv, NULL);
 }
-static int _utShellCmdCb_AlldVcnl4020(BaseSequentialStream* stream, int argc, char* argv[])
-{
-  enum {
-    UNKNOWN,
-    NNE, ENE, ESE, SSE, SSW,WSW,WNW, NNW,
-  } sensor = UNKNOWN;
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "-nne") == 0) {
-      sensor = NNE;
-    } else if (strcmp(argv[1], "-ene") == 0) {
-      sensor = ENE;
-    } else if (strcmp(argv[1], "-ese") == 0) {
-      sensor = ESE;
-    } else if (strcmp(argv[1], "-sse") == 0) {
-      sensor = SSE;
-    } else if (strcmp(argv[1], "-ssw") == 0) {
-      sensor = SSW;
-    } else if (strcmp(argv[1], "-wsw") == 0) {
-      sensor = WSW;
-    } else if (strcmp(argv[1], "-wnw") == 0) {
-      sensor = WNW;
-    } else if (strcmp(argv[1], "-nnw") == 0) {
-      sensor = NNW;
-    }
-  }
-  if (sensor != UNKNOWN) {
-    PCA9544ADriver* mux = NULL;
-    switch (sensor) {
-      case SSE:
-      case SSW:
-      case WSW:
-      case WNW:
-        mux = &moduleLldI2cMultiplexer1;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = &moduleLldProximity1;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
-        break;
-      case NNW:
-      case NNE:
-      case ENE:
-      case ESE:
-        mux = &moduleLldI2cMultiplexer2;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = &moduleLldProximity2;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
-        break;
-      default:
-        break;
-    }
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    switch (sensor) {
-      case NNE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-northeast sensor");
-        break;
-      case ENE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "east-northeast sensor");
-        break;
-      case ESE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-southeast sensor");
-        break;
-      case SSE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "south-southeast sensor");
-        break;
-      case SSW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "south-southwest sensor");
-        break;
-      case WSW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "west-southwest sensor");
-        break;
-      case WNW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "west-northwest sensor");
-        break;
-      case NNW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-northwest sensor");
-        break;
-      default:
-        break;
-    }
-    ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = NULL;
-    ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = 0;
-    return AOS_OK;
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  -nne\n");
-  chprintf(stream, "    Test north-northeast sensor.\n");
-  chprintf(stream, "  -ene\n");
-  chprintf(stream, "    Test east-northeast sensor.\n");
-  chprintf(stream, "  -ese\n");
-  chprintf(stream, "    Test east-southeast sensor.\n");
-  chprintf(stream, "  -sse\n");
-  chprintf(stream, "    Test south-southeast sensor.\n");
-  chprintf(stream, "  -ssw\n");
-  chprintf(stream, "    Test south-southwest sensor.\n");
-  chprintf(stream, "  -wsw\n");
-  chprintf(stream, "    Test west-southwest sensor.\n");
-  chprintf(stream, "  -wnw\n");
-  chprintf(stream, "    Test west-northwest sensor.\n");
-  chprintf(stream, "  -nnw\n");
-  chprintf(stream, "    Test north-northwest sensor.\n");
-  return AOS_INVALIDARGUMENTS;
-}
-static ut_vcnl4020data_t _utAlldVcnl4020Data = {
-  /* driver       */ NULL,
-  /* timeout      */ MICROSECONDS_PER_SECOND,
-  /* event source */ &aos.events.io,
-  /* event flags  */ 0,
-};
-aos_unittest_t moduleUtAlldVcnl4020 = {
-  /* name           */ "VCNL4020",
-  /* info           */ "proximity sensor",
-  /* test function  */ utAlldVcnl4020Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Proximity",
-    /* callback */ _utShellCmdCb_AlldVcnl4020,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldVcnl4020Data,
-};
+AOS_SHELL_COMMAND(moduleTestVcnl4020ShellCmd, "test:Proximity", _testVcnl4020ShellCmdCb);
 
 #endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
 
@@ -1298,75 +827,22 @@ aos_unittest_t moduleUtAlldVcnl4020 = {
 /*
  * PCAL6524 (GPIO extender)
  */
-static int _utShellCmdCb_AlldPcal6524(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCAL6524.h>
+static int _testPcal6524ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "#1") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender1;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #1");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "#2") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender2;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #2");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  #1\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #1.\n");
-  chprintf(stream, "  #2\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #2.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestPcal6524ShellCb(stream, argc, argv, NULL);
 }
-static ut_pcal6524data_t _utAlldPcal6524Data = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPcal6524 = {
-  /* name           */ "PCAL6524",
-  /* info           */ "GPIO extender",
-  /* test function  */ utAlldPcal6524Func,
-  /* shell command  */ {
-    /* name     */ "unittest:GPIOExtender",
-    /* callback */ _utShellCmdCb_AlldPcal6524,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPcal6524Data,
-};
+AOS_SHELL_COMMAND(moduleTestPcal6524ShellCmd, "test:GPIOExtenter", _testPcal6524ShellCmdCb);
 
 /*
  * AT42QT1050 (touch sensor)
  */
-static int _utShellCmdCb_AlldAt42qt1050(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT42QT1050.h>
+static int _testAt42qt1050ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt42qt1050, NULL);
-  return AOS_OK;
+  return moduleTestAt42qt1050ShellCb(stream, argc, argv, NULL);
 }
-static ut_at42qt1050data_t _utAlldAt42qt1050Data= {
-  /* AT42QT1050 driver  */ &moduleLldTouch,
-  /* timeout            */ MICROSECONDS_PER_SECOND,
-  /* event source       */ &aos.events.io,
-  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
-};
-aos_unittest_t moduleUtAlldAt42qt1050 = {
-  /* name           */ "AT42QT1050",
-  /* info           */ "touch sensor",
-  /* test function  */ utAlldAt42qt1050Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Touch",
-    /* callback */ _utShellCmdCb_AlldAt42qt1050,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt42qt1050Data,
-};
+AOS_SHELL_COMMAND(moduleTestAt42qt1050ShellCmd, "test:Touch", _testAt42qt1050ShellCmdCb);
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
 
@@ -1375,78 +851,218 @@ aos_unittest_t moduleUtAlldAt42qt1050 = {
 /*
  * PCAL6524 (GPIO extender)
  */
-static int _utShellCmdCb_AlldPcal6524(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCAL6524.h>
+static int _testPcal6524ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "#1") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender1;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #1");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "#2") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender2;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #2");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  #1\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #1.\n");
-  chprintf(stream, "  #2\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #2.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestPcal6524ShellCb(stream, argc, argv, NULL);
 }
-static ut_pcal6524data_t _utAlldPcal6524Data = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPcal6524 = {
-  /* name           */ "PCAL6524",
-  /* info           */ "GPIO extender",
-  /* test function  */ utAlldPcal6524Func,
-  /* shell command  */ {
-    /* name     */ "unittest:GPIOExtender",
-    /* callback */ _utShellCmdCb_AlldPcal6524,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPcal6524Data,
-};
+AOS_SHELL_COMMAND(moduleTestPcal6524ShellCmd, "test:GPIOExtenter", _testPcal6524ShellCmdCb);
 
 /*
  * AT42QT1050 (touch sensor)
  */
-static int _utShellCmdCb_AlldAt42qt1050(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT42QT1050.h>
+static int _testAt42qt1050ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestAt42qt1050ShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestAt42qt1050ShellCmd, "test:Touch", _testAt42qt1050ShellCmdCb);
+
+#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
+
+/*
+ * entire module
+ */
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt42qt1050, NULL);
-  return AOS_OK;
-}
-static ut_at42qt1050data_t _utAlldAt42qt1050Data= {
-  /* AT42QT1050 driver  */ &moduleLldTouch,
-  /* timeout            */ MICROSECONDS_PER_SECOND,
-  /* event source       */ &aos.events.io,
-  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
-};
-aos_unittest_t moduleUtAlldAt42qt1050 = {
-  /* name           */ "AT42QT1050",
-  /* info           */ "touch sensor",
-  /* test function  */ utAlldAt42qt1050Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Touch",
-    /* callback */ _utShellCmdCb_AlldAt42qt1050,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt42qt1050Data,
-};
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* ADC */
+  status |= moduleTestAdcShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* AT24C01BN-SH-B (EEPROM) */
+  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* bq24103a (battery charger) */
+  // front
+  targv[1] = "-f";
+  status |= moduleTestBq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // rear
+  targv[1] = "-r";
+  status |= moduleTestBq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* bq27500 (fuel gauge) */
+  // front
+  targv[1] = "-f";
+  status |= moduleTestBq27500ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // rear
+  targv[1] = "-r";
+  status |= moduleTestBq27500ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* bq 27500 (fuel gauge) in combination with bq24103a (battery charger) */
+  // front
+  targv[1] = "-f";
+  status |= moduleTestBq27500Bq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // rear
+  targv[1] = "-r";
+  status |= moduleTestBq27500Bq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* INA219 (power monitor) */
+  // VDD
+  targv[1] = "VDD";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VIO 1.8V
+  targv[1] = "VIO1.8";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VIO 3.3V
+  targv[1] = "VIO3.3";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VSYS 4.2V
+  targv[1] = "VSYS4.2";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VIO 5.0V
+  targv[1] = "VIO5.0";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* status LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* PKLCS1212E4001 (buzzer) */
+  status |= moduleTestPkxxxexxxShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS62113 (step-down converter) */
+  status |= moduleTestTps6211xShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS62113 (step-down converter) in combination with INA219 (power monitor) */
+  status |= moduleTestTps6211xIna219ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)
+
+  /* MPR121 (touch sensor) */
+  status |= moduleTestMpr121ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* PCA9544A (I2C multiplexer) */
+  // #1
+  targv[1] = "#1";
+  status |= moduleTestPca9544aShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // #2
+  targv[1] = "#2";
+  status |= moduleTestPca9544aShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* VCNL4020 (proximity sensor) */
+  // north-northeast
+  targv[1] = "-nne";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // east-northeast
+  targv[1] = "-ene";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // east-southeast
+  targv[1] = "-ese";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // south-southeast
+  targv[1] = "-sse";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // south-southwest
+  targv[1] = "-ssw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // west-southwest
+  targv[1] = "-wsw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // west-northwest
+  targv[1] = "-wnw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // west-northwest
+  targv[1] = "-nnw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X)
+
+  /* PCAL6524 (GPIO extender) */
+  // #1
+  targv[1] = "#1";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // #2
+  targv[1] = "#2";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* AT42QT1050 (touch sensor) */
+  status |= moduleTestAt42qt1050ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
+
+#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)
+
+  /* PCAL6524 (GPIO extender) */
+  // #1
+  targv[1] = "#1";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // #2
+  targv[1] = "#2";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* AT42QT1050 (touch sensor) */
+  status |= moduleTestAt42qt1050ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
 
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
+}
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
+
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
 /** @} */
diff --git a/modules/PowerManagement_1-1/module.h b/modules/PowerManagement_1-1/module.h
index 7bffc82..94a083f 100644
--- a/modules/PowerManagement_1-1/module.h
+++ b/modules/PowerManagement_1-1/module.h
@@ -429,37 +429,38 @@ extern ROMCONST char* moduleShellPrompt;
 }
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
   /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAdcVsys.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldBq24103a.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500.shellcmd);              \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500Bq24103a.shellcmd);      \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldPklcs1212e4001.shellcmd);       \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLed.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113Ina219.shellcmd);       \
+  aosShellAddCommand(&aos.shell, &moduleTestAdcShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestBq241xxShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestBq27500ShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestBq27500Bq241xxShellCmd);          \
+  aosShellAddCommand(&aos.shell, &moduleTestIna219ShellCmd);                  \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestPkxxxexxxShellCmd);               \
+  aosShellAddCommand(&aos.shell, &moduleTestTps6211xShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestTps6211xIna219ShellCmd);          \
   MODULE_INIT_TEST_SENSORRING();                                              \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
   #define MODULE_INIT_TEST_SENSORRING() {                                     \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldPca9544a.shellcmd);           \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldMpr121.shellcmd);             \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldVcnl4020.shellcmd);           \
+    aosShellAddCommand(&aos.shell, &moduleTestPca9544aShellCmd);              \
+    aosShellAddCommand(&aos.shell, &moduleTestMpr121ShellCmd);                \
+    aosShellAddCommand(&aos.shell, &moduleTestVcnl4020ShellCmd);              \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
   #define MODULE_INIT_TEST_SENSORRING() {                                     \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldPcal6524.shellcmd);           \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldAt42qt1050.shellcmd);         \
+    aosShellAddCommand(&aos.shell, &moduleTestPcal6524ShellCmd);              \
+    aosShellAddCommand(&aos.shell, &moduleTestAt42qt1050ShellCmd);            \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
   #define MODULE_INIT_TEST_SENSORRING() {                                     \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldPcal6524.shellcmd);           \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldAt42qt1050.shellcmd);         \
+    aosShellAddCommand(&aos.shell, &moduleTestPcal6524ShellCmd);              \
+    aosShellAddCommand(&aos.shell, &moduleTestAt42qt1050ShellCmd);            \
   }
 #else /* (BOARD_SENSORRING == ?) */
   #define MODULE_INIT_TEST_SENSORRING()         {}
@@ -468,8 +469,8 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
-  MODULE_INIT_PERIPHERY_COMM_SENSORRING();                                    \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
+  MODULE_INIT_PERIPHERY_IF_SENSORRING();                                      \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
@@ -492,7 +493,7 @@ extern ROMCONST char* moduleShellPrompt;
   pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
 }
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
@@ -500,25 +501,25 @@ extern ROMCONST char* moduleShellPrompt;
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (MPR121_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? MPR121_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT42QT1050_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT42QT1050_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT42QT1050_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT42QT1050_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
   }
 #else /* (BOARD_SENSORRING == ?) */
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {}
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {}
 #endif /* (BOARD_SENSORRING == ?) */
 
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
   /* PWM */                                                                   \
   pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
   /* ADC */                                                                   \
@@ -736,129 +737,114 @@ extern AT42QT1050Driver moduleLldTouch;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_lld_adc.h>
-#include <ut_alld_AT24C01B_v1.h>
-#include <ut_alld_bq241xx_v1.h>
-#include <ut_alld_bq27500_v1.h>
-#include <ut_alld_bq27500_v1_bq241xx_v1.h>
-#include <ut_alld_INA219_v1.h>
-#include <ut_alld_LED_v1.h>
-#include <ut_alld_PKxxxExxx_v1.h>
-#include <ut_alld_TPS6211x_v1.h>
-#include <ut_alld_TPS6211x_v1_INA219_v1.h>
 
 /**
- * @brief   ADC unit test object.
+ * @brief   ADC test command.
  */
-extern aos_unittest_t moduleUtAdcVsys;
+extern aos_shellcommand_t moduleTestAdcShellCmd;
 
 /**
- * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
+ * @brief   AT24C01BN-SH-B (EEPROM) test command.
  */
-extern aos_unittest_t moduleUtAlldAt24c01b;
+extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
 
 /**
- * @brief   BQ24103A (battery charger) unit test object.
+ * @brief   bq24103a (battery charger) test command.
  */
-extern aos_unittest_t moduleUtAlldBq24103a;
+extern aos_shellcommand_t moduleTestBq241xxShellCmd;
 
 /**
- * @brief   BQ27500 (fuel gauge) unit test object.
+ * @brief   bq27500 (fuel gauge) test command.
  */
-extern aos_unittest_t moduleUtAlldBq27500;
+extern aos_shellcommand_t moduleTestBq27500ShellCmd;
 
 /**
- * @brief   BQ27500 (fuela gauge) in combination with BQ24103A (battery charger) unit test object.
+ * @brief   bq27500 (fuel gauge) in combination with bq24103a (battery charger) test command.
  */
-extern aos_unittest_t moduleUtAlldBq27500Bq24103a;
+extern aos_shellcommand_t moduleTestBq27500Bq241xxShellCmd;
 
 /**
- * @brief   INA219 (power monitor) unit test object.
+ * @brief   INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldIna219;
+extern aos_shellcommand_t moduleTestIna219ShellCmd;
 
 /**
- * @brief   Status LED unit test object.
+ * @brief   Status LED test command.
  */
-extern aos_unittest_t moduleUtAlldLed;
+extern aos_shellcommand_t moduleTestLedShellCmd;
 
 /**
- * @brief   PKLCS1212E4001 (buzzer) unit test object.
+ * @brief   PKLCS1212E4001 (buzzer) test command.
  */
-extern aos_unittest_t moduleUtAlldPklcs1212e4001;
+extern aos_shellcommand_t moduleTestPkxxxexxxShellCmd;
 
 /**
- * @brief   TPS62113 (step-down converter) unit test object.
+ * @brief   TPS62113 (step-down converter) test command.
  */
-extern aos_unittest_t moduleUtAlldTps62113;
+extern aos_shellcommand_t moduleTestTps6211xShellCmd;
 
 /**
- * @brief   TPS62113 (step-sown converter) in combination with INA219 (power monitor) unit test object.
+ * @brief   TPS62113 (step-sown converter) in combination with INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldTps62113Ina219;
+extern aos_shellcommand_t moduleTestTps6211xIna219ShellCmd;
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
-#include <ut_alld_MPR121_v1.h>
-#include <ut_alld_PCA9544A_v1.h>
-#include <ut_alld_VCNL4020_v1.h>
-
 /**
- * @brief   MPR121 (touch sensor) unit test object.
+ * @brief   MPR121 (touch sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldMpr121;
+extern aos_shellcommand_t moduleTestMpr121ShellCmd;
 
 /**
- * @brief   PCA9544A (I2C multiplexer) unit test object.
+ * @brief   PCA9544A (I2C multiplexer) test command.
  */
-extern aos_unittest_t moduleUtAlldPca9544a;
+extern aos_shellcommand_t moduleTestPca9544aShellCmd;
 
 /**
- * @brief   VCNL4020 (proximity sensor) unit test object.
+ * @brief   VCNL4020 (proximity sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldVcnl4020;
+extern aos_shellcommand_t moduleTestVcnl4020ShellCmd;
 
 #endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
 
-#include <ut_alld_PCAL6524_v1.h>
-#include <ut_alld_AT42QT1050_v1.h>
-
 /**
- * @brief   PCAL6524 (GPIO extender) unit test object.
+ * @brief   PCAL6524 (GPIO extender) test command.
  */
-extern aos_unittest_t moduleUtAlldPcal6524;
+extern aos_shellcommand_t moduleTestPcal6524ShellCmd;
 
 /**
- * @brief   AT42QT1050 (touch sensor) unit test object.
+ * @brief   AT42QT1050 (touch sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldAt42qt1050;
+extern aos_shellcommand_t moduleTestAt42qt1050ShellCmd;
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
 
-#include <ut_alld_PCAL6524_v1.h>
-#include <ut_alld_AT42QT1050_v1.h>
-
 /**
- * @brief   PCAL6524 (GPIO extender) unit test object.
+ * @brief   PCAL6524 (GPIO extender) test command.
  */
-extern aos_unittest_t moduleUtAlldPcal6524;
+extern aos_shellcommand_t moduleTestPcal6524ShellCmd;
 
 /**
- * @brief   AT42QT1050 (touch sensor) unit test object.
+ * @brief   AT42QT1050 (touch sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldAt42qt1050;
+extern aos_shellcommand_t moduleTestAt42qt1050ShellCmd;
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
 
+/**
+ * @brief   Entire module test command.
+ */
+extern aos_shellcommand_t moduleTestAllShellCmd;
+
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
 /** @} */
diff --git a/modules/PowerManagement_1-1/test/AT24C01B/module_test_AT24C01B.c b/modules/PowerManagement_1-1/test/AT24C01B/module_test_AT24C01B.c
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/AT24C01B/module_test_AT24C01B.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_AT24C01B.h>
+#include <aos_test_AT24C01B.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at24c01bdata_t _data = {
+  /* driver   */ &moduleLldEeprom,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "AT24C01BN-SH-B", "1kbit EEPROM", moduleTestAt24c01bShellCb, aosTestAt24c01bFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/AT24C01B/module_test_AT24C01B.h b/modules/PowerManagement_1-1/test/AT24C01B/module_test_AT24C01B.h
new file mode 100644
index 0000000..6764c0d
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/AT24C01B/module_test_AT24C01B.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT24C01B_H
+#define MODULE_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_AT24C01B_H */
+
diff --git a/modules/PowerManagement_1-1/test/AT42QT1050/module_test_AT42QT1050.c b/modules/PowerManagement_1-1/test/AT42QT1050/module_test_AT42QT1050.c
new file mode 100644
index 0000000..6c373f7
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/AT42QT1050/module_test_AT42QT1050.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+#include <module_test_AT42QT1050.h>
+#include <aos_test_AT42QT1050.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at42qt1050data_t _data = {
+  /* AT42QT1050 driver  */ &moduleLldTouch,
+  /* timeout            */ MICROSECONDS_PER_SECOND,
+  /* event source       */ &aos.events.io,
+  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
+};
+
+static AOS_TEST(_test, "AT42QT1050", "touch sensor", moduleTestAt42qt1050ShellCb, aosTestAt42qt1050Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt42qt1050ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
diff --git a/modules/PowerManagement_1-1/test/AT42QT1050/module_test_AT42QT1050.h b/modules/PowerManagement_1-1/test/AT42QT1050/module_test_AT42QT1050.h
new file mode 100644
index 0000000..0652a64
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/AT42QT1050/module_test_AT42QT1050.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT42QT1050_H
+#define MODULE_TEST_AT42QT1050_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt42qt1050ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
+
+#endif /* MODULE_TEST_AT42QT1050_H */
+
diff --git a/modules/PowerManagement_1-1/test/INA219/module_test_INA219.c b/modules/PowerManagement_1-1/test/INA219/module_test_INA219.c
new file mode 100644
index 0000000..ed95007
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/INA219/module_test_INA219.c
@@ -0,0 +1,153 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_INA219.h>
+#include <aos_test_INA219.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_ina219data_t _data = {
+  /* driver           */ NULL,
+  /* expected voltage */ 0.0f,
+  /* tolerance        */ 0.05f,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "INA219", "power monitor", moduleTestIna219ShellCb, aosTestIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    VDD, VIO18, VIO33, VSYS42, VIO50,
+  } monitor = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "VDD") == 0) {
+      monitor = VDD;
+    } else if (strcmp(argv[1], "VIO1.8") == 0) {
+      monitor = VIO18;
+    } else if (strcmp(argv[1], "VIO3.3") == 0) {
+      monitor = VIO33;
+    } else if (strcmp(argv[1], "VSYS4.2") == 0) {
+      monitor = VSYS42;
+    } else if (strcmp(argv[1], "VIO5.0") == 0) {
+      monitor = VIO50;
+    }
+  }
+
+  // handle valid monitor
+  if (monitor != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (monitor) {
+      case VDD:
+        _data.inad = &moduleLldPowerMonitorVdd;
+        _data.v_expected = 3.3f;
+        res = aosTestRun(stream, &_test, "VDD (3.3V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VIO18:
+        _data.inad = &moduleLldPowerMonitorVio18;
+        _data.v_expected = 1.8f;
+        res = aosTestRun(stream, &_test, "VIO (1.8V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VIO33:
+        _data.inad = &moduleLldPowerMonitorVio33;
+        _data.v_expected = 3.3f;
+        res = aosTestRun(stream, &_test, "VIO (3.3V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VSYS42:
+        _data.inad = &moduleLldPowerMonitorVsys42;
+        _data.v_expected = 4.2f;
+        res = aosTestRun(stream, &_test, "VSYS (4.2V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VIO50:
+        _data.inad = &moduleLldPowerMonitorVio50;
+        _data.v_expected = 5.0f;
+        res = aosTestRun(stream, &_test, "VIO (5.0V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  VDD\n");
+    chprintf(stream, "    Test VDD (3.3V) power monitor.\n");
+    chprintf(stream, "  VIO1.8\n");
+    chprintf(stream, "    Test VIO 1.8V power monitor.\n");
+    chprintf(stream, "  VIO3.3\n");
+    chprintf(stream, "    Test VIO 3.3V power monitor.\n");
+    chprintf(stream, "  VSYS4.2\n");
+    chprintf(stream, "    Test VSYS 4.2V power monitor.\n");
+    chprintf(stream, "  VIO5.0\n");
+    chprintf(stream, "    Test VIO 5.0V power monitor.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/INA219/module_test_INA219.h b/modules/PowerManagement_1-1/test/INA219/module_test_INA219.h
new file mode 100644
index 0000000..08c3462
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/INA219/module_test_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_INA219_H
+#define MODULE_TEST_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_INA219_H */
+
diff --git a/modules/PowerManagement_1-1/test/LED/module_test_LED.c b/modules/PowerManagement_1-1/test/LED/module_test_LED.c
new file mode 100644
index 0000000..cd97c0f
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldStatusLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/LED/module_test_LED.h b/modules/PowerManagement_1-1/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/PowerManagement_1-1/test/MPR121/module_test_MPR121.c b/modules/PowerManagement_1-1/test/MPR121/module_test_MPR121.c
new file mode 100644
index 0000000..f678f43
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/MPR121/module_test_MPR121.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+#include <module_test_MPR121.h>
+#include <aos_test_MPR121.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_mpr121data_t _data= {
+  /* MPR121 driver  */ &moduleLldTouch,
+  /* timeout        */ MICROSECONDS_PER_SECOND,
+  /* event source   */ &aos.events.io,
+  /* event flags    */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
+};
+
+static AOS_TEST(_test, "MPR121", "touch sensor", moduleTestMpr121ShellCb, aosTestMpr121Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestMpr121ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
diff --git a/modules/PowerManagement_1-1/test/MPR121/module_test_MPR121.h b/modules/PowerManagement_1-1/test/MPR121/module_test_MPR121.h
new file mode 100644
index 0000000..1a02010
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/MPR121/module_test_MPR121.h
@@ -0,0 +1,65 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_MPR121_H
+#define MODULE_TEST_MPR121_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestMpr121ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#endif /* MODULE_TEST_MPR121_H */
diff --git a/modules/PowerManagement_1-1/test/PCA9544A/module_test_PCA9544A.c b/modules/PowerManagement_1-1/test/PCA9544A/module_test_PCA9544A.c
new file mode 100644
index 0000000..cc09082
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/PCA9544A/module_test_PCA9544A.c
@@ -0,0 +1,114 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+#include <module_test_PCA9544A.h>
+#include <aos_test_PCA9544A.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pca9544adata_t _data = {
+  /* driver  */ NULL,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "PCA9544A", "I2C multiplexer", moduleTestPca9544aShellCb, aosTestPca9544aFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    MUX1, MUX2,
+  } mux = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "#1") == 0) {
+      mux = MUX1;
+    } else if (strcmp(argv[1], "#2") == 0) {
+      mux = MUX2;
+    }
+  }
+
+  // handle valid mux
+  if (mux != UNKNOWN) {
+    aos_testresult_t res = {0 ,0};
+
+    switch (mux) {
+      case MUX1:
+        _data.driver = &moduleLldI2cMultiplexer1;
+        res = aosTestRun(stream, &_test, "I2C bus #1");
+        _data.driver = NULL;
+        break;
+      case MUX2:
+        _data.driver = &moduleLldI2cMultiplexer2;
+        res = aosTestRun(stream, &_test, "I2C bus #2");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  #1\n");
+    chprintf(stream, "    Test the multiplexer on the I2C bus #1.\n");
+    chprintf(stream, "  #2\n");
+    chprintf(stream, "    Test the multiplexer on the I2C bus #2.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
diff --git a/modules/PowerManagement_1-1/test/PCA9544A/module_test_PCA9544A.h b/modules/PowerManagement_1-1/test/PCA9544A/module_test_PCA9544A.h
new file mode 100644
index 0000000..f8a021d
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/PCA9544A/module_test_PCA9544A.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PCA9544A_H
+#define MODULE_TEST_PCA9544A_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#endif /* MODULE_TEST_PCA9544A_H */
+
diff --git a/modules/PowerManagement_1-1/test/PCAL6524/module_test_PCAL6524.c b/modules/PowerManagement_1-1/test/PCAL6524/module_test_PCAL6524.c
new file mode 100644
index 0000000..53717a4
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/PCAL6524/module_test_PCAL6524.c
@@ -0,0 +1,114 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+#include <module_test_PCAL6524.h>
+#include <aos_test_PCAL6524.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pcal6524data_t _data = {
+  /* driver   */ NULL,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "PCAL6524", "GPIO extender", moduleTestPcal6524ShellCb, aosTestPcal6524Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPcal6524ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    GPIOEXTENDER1, GPIOEXTENDER2,
+  } extender = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "#1") == 0) {
+      extender = GPIOEXTENDER1;
+    } else if (strcmp(argv[1], "#2") == 0) {
+      extender = GPIOEXTENDER2;
+    }
+  }
+
+  // handle valid extender
+  if (extender != UNKNOWN) {
+    aos_testresult_t res = {0 ,0};
+
+    switch (extender) {
+      case GPIOEXTENDER1:
+        _data.pcal6524d = &moduleLldGpioExtender1;
+        res = aosTestRun(stream, &_test, "I2C bus #1");
+        _data.pcal6524d = NULL;
+        break;
+      case GPIOEXTENDER2:
+        _data.pcal6524d = &moduleLldGpioExtender2;
+        res = aosTestRun(stream, &_test, "I2C bus #2");
+        _data.pcal6524d = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  #1\n");
+    chprintf(stream, "    Test the GPIO extender for the I2C bus #1.\n");
+    chprintf(stream, "  #2\n");
+    chprintf(stream, "    Test the GPIO extender for the I2C bus #2.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
diff --git a/modules/PowerManagement_1-1/test/PCAL6524/module_test_PCAL6524.h b/modules/PowerManagement_1-1/test/PCAL6524/module_test_PCAL6524.h
new file mode 100644
index 0000000..5a7f701
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/PCAL6524/module_test_PCAL6524.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PCAL6524_H
+#define MODULE_TEST_PCAL6524_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPcal6524ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
+
+#endif /* MODULE_TEST_PCAL6524_H */
+
diff --git a/modules/PowerManagement_1-1/test/PKxxxExxx/module_test_PKxxxExxx.c b/modules/PowerManagement_1-1/test/PKxxxExxx/module_test_PKxxxExxx.c
new file mode 100644
index 0000000..de034a3
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/PKxxxExxx/module_test_PKxxxExxx.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_PKxxxExxx.h>
+#include <aos_test_PKxxxExxx.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pkxxxexxxdata_t _data = {
+  /* PWM driver   */ &MODULE_HAL_PWM_BUZZER,
+  /* PWM channel  */ MODULE_HAL_PWM_BUZZER_CHANNEL
+};
+
+static AOS_TEST(_test, "PKLCS1212E4001", "buzzer", moduleTestPkxxxexxxShellCb, aosTestPkxxxexxxFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPkxxxexxxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/PKxxxExxx/module_test_PKxxxExxx.h b/modules/PowerManagement_1-1/test/PKxxxExxx/module_test_PKxxxExxx.h
new file mode 100644
index 0000000..c0a8600
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/PKxxxExxx/module_test_PKxxxExxx.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PKxxxExxx_H
+#define MODULE_TEST_PKxxxExxx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPkxxxexxxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_PKxxxExxx_H */
+
diff --git a/modules/PowerManagement_1-1/test/TPS6211x/module_test_TPS6211x.c b/modules/PowerManagement_1-1/test/TPS6211x/module_test_TPS6211x.c
new file mode 100644
index 0000000..e7a6250
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/TPS6211x/module_test_TPS6211x.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS6211x.h>
+#include <aos_test_TPS6211x.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps6211xbdata_t _data = {
+  /* driver */ &moduleLldStepDownConverter,
+};
+
+static AOS_TEST(_test, "TPS62113", "step-down converter", moduleTestTps6211xShellCb, aosTestTps6211xFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/TPS6211x/module_test_TPS6211x.h b/modules/PowerManagement_1-1/test/TPS6211x/module_test_TPS6211x.h
new file mode 100644
index 0000000..de34ee8
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/TPS6211x/module_test_TPS6211x.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS6211x_H
+#define MODULE_TEST_TPS6211x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS6211x_H */
+
diff --git a/modules/PowerManagement_1-1/test/TPS6211x_INA219/module_test_TPS6211x_INA219.c b/modules/PowerManagement_1-1/test/TPS6211x_INA219/module_test_TPS6211x_INA219.c
new file mode 100644
index 0000000..a2b95d9
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/TPS6211x_INA219/module_test_TPS6211x_INA219.c
@@ -0,0 +1,72 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS6211x_INA219.h>
+#include <aos_test_TPS6211x_INA219.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps6211xina219data_t _data = {
+  /* TPS6211x */ &moduleLldStepDownConverter,
+  /* INA219   */ &moduleLldPowerMonitorVsys42,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "TPS62113 & INA219", "step-down converter & power monitor", moduleTestTps6211xIna219ShellCb, aosTestTps6211xIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps6211xIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/TPS6211x_INA219/module_test_TPS6211x_INA219.h b/modules/PowerManagement_1-1/test/TPS6211x_INA219/module_test_TPS6211x_INA219.h
new file mode 100644
index 0000000..1357595
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/TPS6211x_INA219/module_test_TPS6211x_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS6211x_INA219_H
+#define MODULE_TEST_TPS6211x_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestTps6211xIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS6211x_INA219_H */
+
diff --git a/modules/PowerManagement_1-1/test/VCNL4020/module_test_VCNL4020.c b/modules/PowerManagement_1-1/test/VCNL4020/module_test_VCNL4020.c
new file mode 100644
index 0000000..913e762
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/VCNL4020/module_test_VCNL4020.c
@@ -0,0 +1,203 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+#include <module_test_VCNL4020.h>
+#include <aos_test_VCNL4020.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_vcnl4020data_t _data = {
+  /* driver       */ NULL,
+  /* timeout      */ MICROSECONDS_PER_SECOND,
+  /* event source */ &aos.events.io,
+  /* event flags  */ 0,
+};
+
+static AOS_TEST(_test, "VCNL4020", "proximity sensor", moduleTestVcnl4020ShellCb, aosTestVcnl4020Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+static void _disableInterrupt(VCNL4020Driver* vcnl)
+{
+  uint8_t intstatus;
+  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, _data.timeout);
+  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, _data.timeout);
+  if (intstatus) {
+    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, _data.timeout);
+  }
+  return;
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    NNE, ENE, ESE, SSE, SSW, WSW, WNW, NNW,
+  } sensor = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "-nne") == 0) {
+      sensor = NNE;
+    } else if (strcmp(argv[1], "-ene") == 0) {
+      sensor = ENE;
+    } else if (strcmp(argv[1], "-ese") == 0) {
+      sensor = ESE;
+    } else if (strcmp(argv[1], "-sse") == 0) {
+      sensor = SSE;
+    } else if (strcmp(argv[1], "-ssw") == 0) {
+      sensor = SSW;
+    } else if (strcmp(argv[1], "-wsw") == 0) {
+      sensor = WSW;
+    } else if (strcmp(argv[1], "-wnw") == 0) {
+      sensor = WNW;
+    } else if (strcmp(argv[1], "-nnw") == 0) {
+      sensor = NNW;
+    }
+  }
+
+  // handle valid sensor
+  if (sensor != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+    PCA9544ADriver* mux = NULL;
+    switch (sensor) {
+      case SSE:
+      case SSW:
+      case WSW:
+      case WNW:
+        mux = &moduleLldI2cMultiplexer1;
+        _data.vcnld = &moduleLldProximity1;
+        _data.evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
+        break;
+      case NNW:
+      case NNE:
+      case ENE:
+      case ESE:
+        mux = &moduleLldI2cMultiplexer2;
+        _data.vcnld = &moduleLldProximity2;
+        _data.evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
+        break;
+      default:
+        break;
+    }
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    switch (sensor) {
+      case NNE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, _data.timeout);
+        res = aosTestRun(stream, &_test, "north-northeast sensor (I2C #2)");
+        break;
+      case ENE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, _data.timeout);
+        res = aosTestRun(stream, &_test, "east-northeast sensor (I2C #2)");
+        break;
+      case ESE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, _data.timeout);
+        res = aosTestRun(stream, &_test, "east-southeast sensor (I2C #2)");
+        break;
+      case SSE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, _data.timeout);
+        res = aosTestRun(stream, &_test, "south-southeast sensor (I2C #1)");
+        break;
+      case SSW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, _data.timeout);
+        res = aosTestRun(stream, &_test, "south-southwest sensor (I2C #1)");
+        break;
+      case WSW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, _data.timeout);
+        res = aosTestRun(stream, &_test, "west-southwest sensor (I2C #1)");
+        break;
+      case WNW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, _data.timeout);
+        res = aosTestRun(stream, &_test, "west-northwest sensor (I2C #1)");
+        break;
+      case NNW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, _data.timeout);
+        res = aosTestRun(stream, &_test, "north-northwest sensor (I2C #2)");
+        break;
+      default:
+        break;
+    }
+    _data.vcnld = NULL;
+    _data.evtflags = 0;
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  -nne\n");
+    chprintf(stream, "    Test north-northeast sensor.\n");
+    chprintf(stream, "  -ene\n");
+    chprintf(stream, "    Test east-northeast sensor.\n");
+    chprintf(stream, "  -ese\n");
+    chprintf(stream, "    Test east-southeast sensor.\n");
+    chprintf(stream, "  -sse\n");
+    chprintf(stream, "    Test south-southeast sensor.\n");
+    chprintf(stream, "  -ssw\n");
+    chprintf(stream, "    Test south-southwest sensor.\n");
+    chprintf(stream, "  -wsw\n");
+    chprintf(stream, "    Test west-southwest sensor.\n");
+    chprintf(stream, "  -wnw\n");
+    chprintf(stream, "    Test west-northwest sensor.\n");
+    chprintf(stream, "  -nnw\n");
+    chprintf(stream, "    Test north-northwest sensor.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
diff --git a/modules/PowerManagement_1-1/test/VCNL4020/module_test_VCNL4020.h b/modules/PowerManagement_1-1/test/VCNL4020/module_test_VCNL4020.h
new file mode 100644
index 0000000..b10636e
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/VCNL4020/module_test_VCNL4020.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_VCNL4020_H
+#define MODULE_TEST_VCNL4020_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#endif /* MODULE_TEST_VCNL4020_H */
+
diff --git a/modules/PowerManagement_1-1/test/adc/module_test_adc.c b/modules/PowerManagement_1-1/test/adc/module_test_adc.c
new file mode 100644
index 0000000..8b51169
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/adc/module_test_adc.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_adc.h>
+#include <aos_test_adc.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_adcdata_t _data = {
+  /* driver               */ &MODULE_HAL_ADC_VSYS,
+  /* ADC conversion group */ &moduleHalAdcVsysConversionGroup,
+};
+
+static AOS_TEST(_test, "ADC", "VSYS", moduleTestAdcShellCb, aosTestAdcFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAdcShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/adc/module_test_adc.h b/modules/PowerManagement_1-1/test/adc/module_test_adc.h
new file mode 100644
index 0000000..b049959
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/adc/module_test_adc.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_ADC_H
+#define MODULE_TEST_ADC_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestAdcShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_ADC_H */
+
diff --git a/modules/PowerManagement_1-1/test/bq241xx/module_test_bq241xx.c b/modules/PowerManagement_1-1/test/bq241xx/module_test_bq241xx.c
new file mode 100644
index 0000000..8ed149e
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/bq241xx/module_test_bq241xx.c
@@ -0,0 +1,113 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_bq241xx.h>
+#include <aos_test_bq241xx.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_bq241xxdata_t _data = {
+  /* driver   */ NULL,
+};
+
+static AOS_TEST(_test, "bq24103a", "battery charger", moduleTestBq241xxShellCb, aosTestBq241xxFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestBq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FRONT, REAR,
+  } charger = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
+      charger = FRONT;
+    } else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
+      charger = REAR;
+    }
+  }
+
+  // handle valid charger
+  if (charger != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (charger) {
+      case FRONT:
+        _data.driver = &moduleLldBatteryChargerFront;
+        res = aosTestRun(stream, &_test, "front battery");
+        _data.driver = NULL;
+        break;
+      case REAR:
+        _data.driver = &moduleLldBatteryChargerRear;
+        res = aosTestRun(stream, &_test, "rear battery");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --front, -f\n");
+    chprintf(stream, "    Test the front battery charger.\n");
+    chprintf(stream, "  --rear, -r\n");
+    chprintf(stream, "    Test the rear battery charger.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+   }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/bq241xx/module_test_bq241xx.h b/modules/PowerManagement_1-1/test/bq241xx/module_test_bq241xx.h
new file mode 100644
index 0000000..39af892
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/bq241xx/module_test_bq241xx.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BQ241xx_H
+#define MODULE_TEST_BQ241xx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestBq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BQ241xx_H */
+
diff --git a/modules/PowerManagement_1-1/test/bq27500/module_test_bq27500.c b/modules/PowerManagement_1-1/test/bq27500/module_test_bq27500.c
new file mode 100644
index 0000000..9ac8e82
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/bq27500/module_test_bq27500.c
@@ -0,0 +1,114 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_bq27500.h>
+#include <aos_test_bq27500.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_bq27500data_t _data = {
+  /* driver   */ NULL,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "bq27500", "fuel gauge", moduleTestBq27500ShellCb, aosTestBq27500Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestBq27500ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FRONT, REAR,
+  } charger = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
+      charger = FRONT;
+    } else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
+      charger = REAR;
+    }
+  }
+
+  // handle valid charger
+  if (charger != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (charger) {
+      case FRONT:
+        _data.driver = &moduleLldFuelGaugeFront;
+        res = aosTestRun(stream, &_test, "front battery");
+        _data.driver = NULL;
+        break;
+      case REAR:
+        _data.driver = &moduleLldFuelGaugeRear;
+        res = aosTestRun(stream, &_test, "rear battery");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --front, -f\n");
+    chprintf(stream, "    Test the front battery fuel gauge.\n");
+    chprintf(stream, "  --rear, -r\n");
+    chprintf(stream, "    Test the rear battery fuel gauge.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+   }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/bq27500/module_test_bq27500.h b/modules/PowerManagement_1-1/test/bq27500/module_test_bq27500.h
new file mode 100644
index 0000000..edbc0ca
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/bq27500/module_test_bq27500.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BQ27500_H
+#define MODULE_TEST_BQ27500_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestBq27500ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BQ27500_H */
+
diff --git a/modules/PowerManagement_1-1/test/bq27500_bq241xx/module_test_bq27500_bq241xx.c b/modules/PowerManagement_1-1/test/bq27500_bq241xx/module_test_bq27500_bq241xx.c
new file mode 100644
index 0000000..a286f4d
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/bq27500_bq241xx/module_test_bq27500_bq241xx.c
@@ -0,0 +1,119 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_bq27500_bq241xx.h>
+#include <aos_test_bq27500_bq241xx.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_bq27500bq241xxdata_t _data = {
+  /* bq27500 driver   */ NULL,
+  /* bq24103a driver  */ NULL,
+  /* timeout          */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "bq27500 & bq24103a", "fuel gauge & battery charger", moduleTestBq27500Bq241xxShellCb, aosTestBq27500Bq241xxFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestBq27500Bq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FRONT, REAR,
+  } charger = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
+      charger = FRONT;
+    } else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
+      charger = REAR;
+    }
+  }
+
+  // handle valid charger
+  if (charger != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (charger) {
+      case FRONT:
+        _data.bq27500 = &moduleLldFuelGaugeFront;
+        _data.bq241xx = &moduleLldBatteryChargerFront;
+        res = aosTestRun(stream, &_test, "front battery");
+        _data.bq27500 = NULL;
+        _data.bq241xx = NULL;
+        break;
+      case REAR:
+        _data.bq27500 = &moduleLldFuelGaugeRear;
+        _data.bq241xx = &moduleLldBatteryChargerRear;
+        res = aosTestRun(stream, &_test, "rear battery");
+        _data.bq27500 = NULL;
+        _data.bq241xx = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --front, -f\n");
+    chprintf(stream, "    Test the front battery fuel gauge and charger.\n");
+    chprintf(stream, "  --rear, -r\n");
+    chprintf(stream, "    Test the rear battery fuel gauge and charger.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+   }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-1/test/bq27500_bq241xx/module_test_bq27500_bq241xx.h b/modules/PowerManagement_1-1/test/bq27500_bq241xx/module_test_bq27500_bq241xx.h
new file mode 100644
index 0000000..85d97f8
--- /dev/null
+++ b/modules/PowerManagement_1-1/test/bq27500_bq241xx/module_test_bq27500_bq241xx.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BQ27500_BQ241xx_H
+#define MODULE_TEST_BQ27500_BQ241xx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestBq27500Bq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BQ27500_BQ241xx_H */
+
diff --git a/modules/PowerManagement_1-2/Makefile b/modules/PowerManagement_1-2/Makefile
index 09773b1..edcaf66 100644
--- a/modules/PowerManagement_1-2/Makefile
+++ b/modules/PowerManagement_1-2/Makefile
@@ -112,100 +112,76 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
-MCU = cortex-m4
+MCU := cortex-m4
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F405xG.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F405xG.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/AT24C01B/v1 \
+                            $(AMIROLLD)/drivers/AT42QT1050/v1 \
+                            $(AMIROLLD)/drivers/bq241xx/v1 \
+                            $(AMIROLLD)/drivers/bq27500/v1 \
+                            $(AMIROLLD)/drivers/INA219/v1 \
+                            $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/MPR121/v1 \
+                            $(AMIROLLD)/drivers/PCA9544A/v1 \
+                            $(AMIROLLD)/drivers/PCAL6524/v1 \
+                            $(AMIROLLD)/drivers/PKxxxExxx/v1 \
+                            $(AMIROLLD)/drivers/TPS6211x/v1 \
+                            $(AMIROLLD)/drivers/VCNL4020/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)lld/adc \
+                    $(AMIROOS_TEST_DIR)periphery-lld/AT24C01B_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/AT42QT1050_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/bq241xx_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/bq27500_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/bq27500_v1_bq241xx_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/LED_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/MPR121_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PCA9544A_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PCAL6524_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/PKxxxExxx_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS6211x_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/TPS6211x_v1_INA219_v1 \
+                    $(AMIROOS_TEST_DIR)periphery-lld/VCNL4020_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 # Create an additional .srec image file.
diff --git a/modules/PowerManagement_1-2/alldconf.h b/modules/PowerManagement_1-2/alldconf.h
index 7a8f4b1..99c1b1c 100644
--- a/modules/PowerManagement_1-2/alldconf.h
+++ b/modules/PowerManagement_1-2/alldconf.h
@@ -43,100 +43,18 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 #define AMIROLLD_CFG_TIME_SIZE                  32
 
-// required to differentiate between various sensor rings
-#include <board.h>
-
-/**
- * @brief   Enable flag for the AT24C01BN-SH-B EEPROM.
- */
-#define AMIROLLD_CFG_AT24C01B                   1
-
-/**
- * @brief   Enable flag for the BQ24103A charger.
- */
-#define AMIROLLD_CFG_BQ241xx                    1
-
 /**
- * @brief   Enable flag for the BQ27500 fuel gauge.
+ * @brief   BQ27500 hardware version
  */
-#define AMIROLLD_CFG_BQ27500                    1
 #define BQ27500_LLD_HWVERSION                   130
 
 /**
- * @brief   Enable flag for the INA219 power monitor.
- */
-#define AMIROLLD_CFG_INA219                     1
-
-/**
- * @brief   Enable flag for the status LED.
+ * @brief   PKLCS1212E4001 frequency specification
  */
-#define AMIROLLD_CFG_LED                        1
-
-/**
- * @brief   Enable flag for the PKLCS1212E4001 buzzer.
- */
-#define AMIROLLD_CFG_PKxxxExxx                  1
 #define PKxxxExxx_LLD_FREQUENCY_MIN             2000
 #define PKxxxExxx_LLD_FREQUENCY_SPEC            4000
 #define PKxxxExxx_LLD_FREQUENCY_MAX             6000
 
-/**
- * @brief   Enable flag for the TPS2051BDBV power switch.
- */
-#define AMIROLLD_CFG_TPS20xxB                   1
-
-/**
- * @brief   Enable flag for the TPS62113 step-down converter.
- */
-#define AMIROLLD_CFG_TPS6211x                   1
-
-#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
-
-/**
- * @brief   Enable flag for the MPR121 touch sensor.
- */
-#define AMIROLLD_CFG_MPR121                     1
-
-/**
- * @brief   Enable flag for the PCA9544A I2C multiplexer.
- */
-#define AMIROLLD_CFG_PCA9544A                   1
-
-/**
- * @brief   Enable flag for the VCNL4020 proximity sensor.
- */
-#define AMIROLLD_CFG_VCNL4020                   1
-
-#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
-
-#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
-
-/**
- * @brief   Enable flag for the PCAL6524 GPIO extender
- */
-#define AMIROLLD_CFG_PCAL6524                   1
-
-/**
- * @brief   Enable flag for the AT42Q1050 touch sensor.
- */
-#define AMIROLLD_CFG_AT42QT1050                 1
-
-#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
-
-#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
-
-/**
- * @brief   Enable flag for the PCAL6524 GPIO extender
- */
-#define AMIROLLD_CFG_PCAL6524                   1
-
-/**
- * @brief   Enable flag for the AT42Q1050 touch sensor.
- */
-#define AMIROLLD_CFG_AT42QT1050                 1
-
-#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
-
 #endif /* ALLDCONF_H */
 
 /** @} */
diff --git a/modules/PowerManagement_1-2/board.h b/modules/PowerManagement_1-2/board.h
index 47c201b..685304b 100644
--- a/modules/PowerManagement_1-2/board.h
+++ b/modules/PowerManagement_1-2/board.h
@@ -90,7 +90,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /*
  * Configuration macro to define which type of sensor ring is attached.
  */
+#if !defined(BOARD_SENSORRING) || defined(__DOXYGEN__)
 #define BOARD_SENSORRING                BOARD_PROXIMITYSENSOR
+#endif
 
 /*
  * IO pins assignments.
diff --git a/modules/PowerManagement_1-2/halconf.h b/modules/PowerManagement_1-2/halconf.h
index 97a4b46..a63b05f 100644
--- a/modules/PowerManagement_1-2/halconf.h
+++ b/modules/PowerManagement_1-2/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/PowerManagement_1-2/module.c b/modules/PowerManagement_1-2/module.c
index b7c3ec6..6926136 100644
--- a/modules/PowerManagement_1-2/module.c
+++ b/modules/PowerManagement_1-2/module.c
@@ -261,7 +261,7 @@ ROMCONST apalControlGpio_t moduleGpioLed = {
   /* GPIO */ &_gpioLed,
   /* meta */ {
     /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
-    /* active state   */ LED_LLD_GPIO_ACTIVE_STATE,
+    /* active state   */ APAL_GPIO_ACTIVE_LOW,
     /* interrupt edge */ APAL_GPIO_EDGE_NONE,
   },
 };
@@ -697,614 +697,143 @@ AT42QT1050Driver moduleLldTouch = {
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <string.h>
 
 /*
- * ADC
+ * ADC (VSYS)
  */
-static int _utShellCmdCb_Adc(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_adc.h>
+static int _testAdcShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAdcVsys, NULL);
-  return AOS_OK;
+  return moduleTestAdcShellCb(stream, argc, argv, NULL);
 }
-static ut_adcdata_t _utAdcVsysData = {
-  /* driver               */ &MODULE_HAL_ADC_VSYS,
-  /* ADC conversion group */ &moduleHalAdcVsysConversionGroup,
-};
-aos_unittest_t moduleUtAdcVsys = {
-  /* name           */ "ADC",
-  /* info           */ "VSYS",
-  /* test function  */ utAdcFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:ADC",
-    /* callback */ _utShellCmdCb_Adc,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAdcVsysData,
-};
+AOS_SHELL_COMMAND(moduleTestAdcShellCmd, "test:ADC", _testAdcShellCmdCb);
 
 /*
- * AT24C01B (EEPROM)
+ * AT24C01BN-SH-B (EEPROM)
  */
-static int _utShellCmdCb_AlldAt24c01b(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT24C01B.h>
+static int _testAt24c01bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt24c01b, NULL);
-  return AOS_OK;
+  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
 }
-static ut_at24c01bdata_t _utAlldAt24c01bData = {
-  /* driver   */ &moduleLldEeprom,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldAt24c01b = {
-  /* name           */ "AT24C01B",
-  /* info           */ "1kbit EEPROM",
-  /* test function  */ utAlldAt24c01bFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:EEPROM",
-    /* callback */ _utShellCmdCb_AlldAt24c01b,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt24c01bData,
-};
+AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24c01bShellCmdCb);
 
 /*
  * bq24103a (battery charger)
  */
-static int _utShellCmdCb_AlldBq24103a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_bq241xx.h>
+static int _testBq241xxShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // local variables
-  bool print_help = false;
-
-  // evaluate argument
-  if (argc == 2) {
-    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      moduleUtAlldBq24103a.data = &moduleLldBatteryChargerFront;
-      aosUtRun(stream, &moduleUtAlldBq24103a, "front battery");
-      moduleUtAlldBq24103a.data = NULL;
-    }
-    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      moduleUtAlldBq24103a.data = &moduleLldBatteryChargerRear;
-      aosUtRun(stream, &moduleUtAlldBq24103a, "rear battery");
-      moduleUtAlldBq24103a.data = NULL;
-    }
-    else {
-      print_help = true;
-    }
-  } else {
-    print_help = true;
-  }
-
-  // print help or just return
-  if (print_help) {
-    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-    chprintf(stream, "Options:\n");
-    chprintf(stream, "  --front, -f\n");
-    chprintf(stream, "    Test the front battery charger.\n");
-    chprintf(stream, "  --rear, -r\n");
-    chprintf(stream, "    Test the rear battery charger.\n");
-    return AOS_INVALIDARGUMENTS;
-  } else {
-    return AOS_OK;
-  }
+  return moduleTestBq241xxShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldBq24103a = {
-  /* name           */ "bq24103a",
-  /* info           */ "battery charger",
-  /* test function  */ utAlldBq241xxFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:BatteryCharger",
-    /* callback */ _utShellCmdCb_AlldBq24103a,
-    /* next     */ NULL,
-  },
-  /* data           */ NULL,
-};
+AOS_SHELL_COMMAND(moduleTestBq241xxShellCmd, "test:BatteryCharger", _testBq241xxShellCmdCb);
 
 /*
  * bq27500 (fuel gauge)
  */
-static int _utShellCmdCb_AlldBq27500(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_bq27500.h>
+static int _testBq27500ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = &moduleLldFuelGaugeFront;
-      aosUtRun(stream, &moduleUtAlldBq27500, "front battery");
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = &moduleLldFuelGaugeRear;
-      aosUtRun(stream, &moduleUtAlldBq27500, "rear battery");
-      ((ut_bq27500data_t*)moduleUtAlldBq27500.data)->driver = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  --front, -f\n");
-  chprintf(stream, "    Test the front battery fuel gauge.\n");
-  chprintf(stream, "  --rear, -r\n");
-  chprintf(stream, "    Test the rear battery fuel gauge.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestBq27500ShellCb(stream, argc, argv, NULL);
 }
-static ut_bq27500data_t _utAlldBq27500Data = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldBq27500 = {
-  /* name           */ "bq27500",
-  /* info           */ "fuel gauge",
-  /* test function  */ utAlldBq27500Func,
-  /* shell command  */ {
-    /* name     */ "unittest:FuelGauge",
-    /* callback */ _utShellCmdCb_AlldBq27500,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldBq27500Data,
-};
+AOS_SHELL_COMMAND(moduleTestBq27500ShellCmd, "test:FuelGauge", _testBq27500ShellCmdCb);
 
 /*
  * bq27500 (fuel gauge) in combination with bq24103a (battery charger)
  */
-static int _utShellCmdCb_AlldBq27500Bq24103a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_bq27500_bq241xx.h>
+static int _testBq27500Bq241xxShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeFront;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerFront;
-      aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "front battery");
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = &moduleLldFuelGaugeRear;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = &moduleLldBatteryChargerRear;
-      aosUtRun(stream, &moduleUtAlldBq27500Bq24103a, "rear battery");
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq27500 = NULL;
-      ((ut_bq27500bq241xxdata_t*)moduleUtAlldBq27500Bq24103a.data)->bq241xx = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  --front, -f\n");
-  chprintf(stream, "    Test the front battery fuel gauge and charger.\n");
-  chprintf(stream, "  --rear, -r\n");
-  chprintf(stream, "    Test the rear battery fuel gauge and charger.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestBq27500Bq241xxShellCb(stream, argc, argv, NULL);
 }
-static ut_bq27500bq241xxdata_t _utAlldBq27500Bq24103aData= {
-  /* bq27500 driver   */ NULL,
-  /* bq24103a driver  */ NULL,
-  /* timeout          */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldBq27500Bq24103a = {
-  /* name           */ "BQ27500 & BQ24103A",
-  /* info           */ "fuel gauge & battery charger",
-  /* test function  */ utAlldBq27500Bq241xxFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:FuelGauge&BatteryCharger",
-    /* callback */ _utShellCmdCb_AlldBq27500Bq24103a,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldBq27500Bq24103aData,
-};
+AOS_SHELL_COMMAND(moduleTestBq27500Bq241xxShellCmd, "test:FuelGauge&BatteryCharger", _testBq27500Bq241xxShellCmdCb);
 
 /*
  * INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldIna219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_INA219.h>
+static int _testIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "VDD") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVdd;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 3.3f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VDD (3.3V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VIO1.8") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio18;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 1.8f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VIO (1.8V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VIO3.3") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio33;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 3.3f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VIO (3.3V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VSYS4.2") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVsys42;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 4.2f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VSYS (4.2V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "VIO5.0") == 0) {
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = &moduleLldPowerMonitorVio50;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 5.0f;
-      aosUtRun(stream, &moduleUtAlldIna219, "VIO (5.0V)");
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->inad = NULL;
-      ((ut_ina219data_t*)moduleUtAlldIna219.data)->v_expected = 0.0f;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  VDD\n");
-  chprintf(stream, "    Test VDD (3.3V) power monitor.\n");
-  chprintf(stream, "  VIO1.8\n");
-  chprintf(stream, "    Test VIO 1.8V power monitor.\n");
-  chprintf(stream, "  VIO3.3\n");
-  chprintf(stream, "    Test VIO 3.3V power monitor.\n");
-  chprintf(stream, "  VSYS4.2\n");
-  chprintf(stream, "    Test VSYS 4.2V power monitor.\n");
-  chprintf(stream, "  VIO5.0\n");
-  chprintf(stream, "    Test VIO 5.0V power monitor.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_ina219data_t _utAlldIna219Data = {
-  /* driver           */ NULL,
-  /* expected voltage */ 0.0f,
-  /* tolerance        */ 0.05f,
-  /* timeout          */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldIna219 = {
-  /* name           */ "INA219",
-  /* info           */ "power monitor",
-  /* test function  */ utAlldIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldIna219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldIna219Data,
-};
+AOS_SHELL_COMMAND(moduleTestIna219ShellCmd, "test:PowerMonitor", _testIna219ShellCmdCb);
 
 /*
  * Status LED
  */
-static int _utShellCmdCb_AlldLed(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_LED.h>
+static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldLed, NULL);
-  return AOS_OK;
+  return moduleTestLedShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldLed = {
-  /* name           */ "LED",
-  /* info           */ NULL,
-  /* test function  */ utAlldLedFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StatusLED",
-    /* callback */ _utShellCmdCb_AlldLed,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStatusLed,
-};
+AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:StatusLED", _testLedShellCmdCb);
 
 /*
  * PKLCS1212E4001 (buzzer)
  */
-static int _utShellCmdCb_AlldPklcs1212e4001(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PKxxxExxx.h>
+static int _testPkxxxexxxShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldPklcs1212e4001, NULL);
-  return AOS_OK;
+  return moduleTestPkxxxexxxShellCb(stream, argc, argv, NULL);
 }
-static ut_pkxxxexxx_t _utAlldPklcs1212e4001Data = {
-  /* PWM driver   */ &MODULE_HAL_PWM_BUZZER,
-  /* PWM channel  */ MODULE_HAL_PWM_BUZZER_CHANNEL
-};
-aos_unittest_t moduleUtAlldPklcs1212e4001 = {
-  /* name           */ "PKLCS1212E4001",
-  /* info           */ "buzzer",
-  /* test function  */ utAlldPkxxxexxxFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:Buzzer",
-    /* callback */ _utShellCmdCb_AlldPklcs1212e4001,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPklcs1212e4001Data,
-};
+AOS_SHELL_COMMAND(moduleTestPkxxxexxxShellCmd, "test:Buzzer", _testPkxxxexxxShellCmdCb);
 
 /*
  * TPS62113 (step-down converter)
  */
-static int _utShellCmdCb_AlldTps62113(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TPS6211x.h>
+static int _testTps6211xShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // Although there are four TPS62113 on the PCB, they all share the same input signal.
-  // A sa result, no additional shell arguments need to be evaluated.
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTps62113, NULL);
-  return AOS_OK;
+  return moduleTestTps6211xShellCb(stream, argc, argv, NULL);
 }
-aos_unittest_t moduleUtAlldTps62113 = {
-  /* name           */ "TPS62113",
-  /* info           */ "step-down converter",
-  /* test function  */ utAlldTps6211xFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:StepDownConverter",
-    /* callback */ _utShellCmdCb_AlldTps62113,
-    /* next     */ NULL,
-  },
-  /* data           */ &moduleLldStepDownConverter,
-};
+AOS_SHELL_COMMAND(moduleTestTps6211xShellCmd, "test:StepDownConverter", _testTps6211xShellCmdCb);
 
 /*
- * TPS62113 (step-donw converter) in combination with INA219 (power monitor)
+ * TPS62113 (step-sown converter) in combination with INA219 (power monitor)
  */
-static int _utShellCmdCb_AlldTps62113Ina219(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_TPS6211x_INA219.h>
+static int _testTps6211xIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldTps62113Ina219, "VSYS (4.2V)");
-  return AOS_OK;
+  return moduleTestTps6211xIna219ShellCb(stream, argc, argv, NULL);
 }
-static ut_tps6211xina219data_t _utAlldTps62113Ina219Data = {
-  /* TPS62113 */ &moduleLldStepDownConverter,
-  /* INA219   */ &moduleLldPowerMonitorVsys42,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldTps62113Ina219 = {
-  /* name           */ "TPS62113 & INA219",
-  /* info           */ "step-down converter & power monitor",
-  /* test function  */ utAlldTps6211xIna219Func,
-  /* shell command  */ {
-    /* name     */ "unittest:StepDownConverter&PowerMonitor",
-    /* callback */ _utShellCmdCb_AlldTps62113Ina219,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldTps62113Ina219Data,
-};
+AOS_SHELL_COMMAND(moduleTestTps6211xIna219ShellCmd, "test:StepDownConverter&PowerMonitor", _testTps6211xIna219ShellCmdCb);
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
 /*
  * MPR121 (touch sensor)
  */
-static int _utShellCmdCb_AlldMpr121(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_MPR121.h>
+static int _testMpr121ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldMpr121, NULL);
-  return AOS_OK;
+  return moduleTestMpr121ShellCb(stream, argc, argv, NULL);
 }
-static ut_mpr121data_t _utAlldMpr121Data= {
-  /* MPR121 driver  */ &moduleLldTouch,
-  /* timeout        */ MICROSECONDS_PER_SECOND,
-  /* event source   */ &aos.events.io,
-  /* event flags    */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
-};
-aos_unittest_t moduleUtAlldMpr121 = {
-  /* name           */ "MPR121",
-  /* info           */ "touch sensor",
-  /* test function  */ utAlldMpr121Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Touch",
-    /* callback */ _utShellCmdCb_AlldMpr121,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldMpr121Data,
-};
+AOS_SHELL_COMMAND(moduleTestMpr121ShellCmd, "test:Touch", _testMpr121ShellCmdCb);
 
 /*
  * PCA9544A (I2C multiplexer)
  */
-static int _utShellCmdCb_AlldPca5944a(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCA9544A.h>
+static int _testPca9544aShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "#1") == 0) {
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = &moduleLldI2cMultiplexer1;
-      aosUtRun(stream, &moduleUtAlldPca9544a, "I2C bus #1");
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "#2") == 0) {
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = &moduleLldI2cMultiplexer2;
-      aosUtRun(stream, &moduleUtAlldPca9544a, "I2C bus #2");
-      ((ut_pca9544adata_t*)moduleUtAlldPca9544a.data)->driver = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  #1\n");
-  chprintf(stream, "    Test the multiplexer on the I2C bus #1.\n");
-  chprintf(stream, "  #2\n");
-  chprintf(stream, "    Test the multiplexer on the I2C bus #2.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestPca9544aShellCb(stream, argc, argv, NULL);
 }
-static ut_pca9544adata_t _utAlldPca9544aData = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPca9544a = {
-  /* name           */ "PCA9544A",
-  /* info           */ "I2C multiplexer",
-  /* test function  */ utAlldPca9544aFunc,
-  /* shell command  */ {
-    /* name     */ "unittest:I2CMultiplexer",
-    /* callback */ _utShellCmdCb_AlldPca5944a,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPca9544aData,
-};
+AOS_SHELL_COMMAND(moduleTestPca9544aShellCmd, "test:I2CMultiplexer", _testPca9544aShellCmdCb);
 
 /*
  * VCNL4020 (proximity sensor)
  */
-static void _utAlldVcnl4020_disableInterrupt(VCNL4020Driver* vcnl)
+#include <module_test_VCNL4020.h>
+static int _testVcnl4020ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  uint8_t intstatus;
-  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  if (intstatus) {
-    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-  }
-  return;
+  return moduleTestVcnl4020ShellCb(stream, argc, argv, NULL);
 }
-static int _utShellCmdCb_AlldVcnl4020(BaseSequentialStream* stream, int argc, char* argv[])
-{
-  enum {
-    UNKNOWN,
-    NNE, ENE, ESE, SSE, SSW,WSW,WNW, NNW,
-  } sensor = UNKNOWN;
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "-nne") == 0) {
-      sensor = NNE;
-    } else if (strcmp(argv[1], "-ene") == 0) {
-      sensor = ENE;
-    } else if (strcmp(argv[1], "-ese") == 0) {
-      sensor = ESE;
-    } else if (strcmp(argv[1], "-sse") == 0) {
-      sensor = SSE;
-    } else if (strcmp(argv[1], "-ssw") == 0) {
-      sensor = SSW;
-    } else if (strcmp(argv[1], "-wsw") == 0) {
-      sensor = WSW;
-    } else if (strcmp(argv[1], "-wnw") == 0) {
-      sensor = WNW;
-    } else if (strcmp(argv[1], "-nnw") == 0) {
-      sensor = NNW;
-    }
-  }
-  if (sensor != UNKNOWN) {
-    PCA9544ADriver* mux = NULL;
-    switch (sensor) {
-      case SSE:
-      case SSW:
-      case WSW:
-      case WNW:
-        mux = &moduleLldI2cMultiplexer1;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = &moduleLldProximity1;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
-        break;
-      case NNW:
-      case NNE:
-      case ENE:
-      case ESE:
-        mux = &moduleLldI2cMultiplexer2;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = &moduleLldProximity2;
-        ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
-        break;
-      default:
-        break;
-    }
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-    _utAlldVcnl4020_disableInterrupt(((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld);
-    switch (sensor) {
-      case NNE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-northeast sensor");
-        break;
-      case ENE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "east-northeast sensor");
-        break;
-      case ESE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-southeast sensor");
-        break;
-      case SSE:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "south-southeast sensor");
-        break;
-      case SSW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "south-southwest sensor");
-        break;
-      case WSW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "west-southwest sensor");
-        break;
-      case WNW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "west-northwest sensor");
-        break;
-      case NNW:
-        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->timeout);
-        aosUtRun(stream, &moduleUtAlldVcnl4020, "north-northwest sensor");
-        break;
-      default:
-        break;
-    }
-    ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->vcnld = NULL;
-    ((ut_vcnl4020data_t*)moduleUtAlldVcnl4020.data)->evtflags = 0;
-    return AOS_OK;
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  -nne\n");
-  chprintf(stream, "    Test north-northeast sensor.\n");
-  chprintf(stream, "  -ene\n");
-  chprintf(stream, "    Test east-northeast sensor.\n");
-  chprintf(stream, "  -ese\n");
-  chprintf(stream, "    Test east-southeast sensor.\n");
-  chprintf(stream, "  -sse\n");
-  chprintf(stream, "    Test south-southeast sensor.\n");
-  chprintf(stream, "  -ssw\n");
-  chprintf(stream, "    Test south-southwest sensor.\n");
-  chprintf(stream, "  -wsw\n");
-  chprintf(stream, "    Test west-southwest sensor.\n");
-  chprintf(stream, "  -wnw\n");
-  chprintf(stream, "    Test west-northwest sensor.\n");
-  chprintf(stream, "  -nnw\n");
-  chprintf(stream, "    Test north-northwest sensor.\n");
-  return AOS_INVALIDARGUMENTS;
-}
-static ut_vcnl4020data_t _utAlldVcnl4020Data = {
-  /* driver       */ NULL,
-  /* timeout      */ MICROSECONDS_PER_SECOND,
-  /* event source */ &aos.events.io,
-  /* event flags  */ 0,
-};
-aos_unittest_t moduleUtAlldVcnl4020 = {
-  /* name           */ "VCNL4020",
-  /* info           */ "proximity sensor",
-  /* test function  */ utAlldVcnl4020Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Proximity",
-    /* callback */ _utShellCmdCb_AlldVcnl4020,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldVcnl4020Data,
-};
+AOS_SHELL_COMMAND(moduleTestVcnl4020ShellCmd, "test:Proximity", _testVcnl4020ShellCmdCb);
 
 #endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
 
@@ -1313,75 +842,22 @@ aos_unittest_t moduleUtAlldVcnl4020 = {
 /*
  * PCAL6524 (GPIO extender)
  */
-static int _utShellCmdCb_AlldPcal6524(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCAL6524.h>
+static int _testPcal6524ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "#1") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender1;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #1");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "#2") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender2;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #2");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  #1\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #1.\n");
-  chprintf(stream, "  #2\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #2.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestPcal6524ShellCb(stream, argc, argv, NULL);
 }
-static ut_pcal6524data_t _utAlldPcal6524Data = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPcal6524 = {
-  /* name           */ "PCAL6524",
-  /* info           */ "GPIO extender",
-  /* test function  */ utAlldPcal6524Func,
-  /* shell command  */ {
-    /* name     */ "unittest:GPIOExtender",
-    /* callback */ _utShellCmdCb_AlldPcal6524,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPcal6524Data,
-};
+AOS_SHELL_COMMAND(moduleTestPcal6524ShellCmd, "test:GPIOExtenter", _testPcal6524ShellCmdCb);
 
 /*
  * AT42QT1050 (touch sensor)
  */
-static int _utShellCmdCb_AlldAt42qt1050(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT42QT1050.h>
+static int _testAt42qt1050ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  (void)argc;
-  (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt42qt1050, NULL);
-  return AOS_OK;
+  return moduleTestAt42qt1050ShellCb(stream, argc, argv, NULL);
 }
-static ut_at42qt1050data_t _utAlldAt42qt1050Data= {
-  /* AT42QT1050 driver  */ &moduleLldTouch,
-  /* timeout            */ MICROSECONDS_PER_SECOND,
-  /* event source       */ &aos.events.io,
-  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
-};
-aos_unittest_t moduleUtAlldAt42qt1050 = {
-  /* name           */ "AT42QT1050",
-  /* info           */ "touch sensor",
-  /* test function  */ utAlldAt42qt1050Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Touch",
-    /* callback */ _utShellCmdCb_AlldAt42qt1050,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt42qt1050Data,
-};
+AOS_SHELL_COMMAND(moduleTestAt42qt1050ShellCmd, "test:Touch", _testAt42qt1050ShellCmdCb);
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
 
@@ -1390,78 +866,218 @@ aos_unittest_t moduleUtAlldAt42qt1050 = {
 /*
  * PCAL6524 (GPIO extender)
  */
-static int _utShellCmdCb_AlldPcal6524(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_PCAL6524.h>
+static int _testPcal6524ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
-  // evaluate arguments
-  if (argc == 2) {
-    if (strcmp(argv[1], "#1") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender1;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #1");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-    else if (strcmp(argv[1], "#2") == 0) {
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = &moduleLldGpioExtender2;
-      aosUtRun(stream, &moduleUtAlldPcal6524, "I2C bus #2");
-      ((ut_pcal6524data_t*)moduleUtAlldPcal6524.data)->pcal6524d = NULL;
-      return AOS_OK;
-    }
-  }
-  // print help
-  chprintf(stream, "Usage: %s OPTION\n", argv[0]);
-  chprintf(stream, "Options:\n");
-  chprintf(stream, "  #1\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #1.\n");
-  chprintf(stream, "  #2\n");
-  chprintf(stream, "    Test the GPIO extender on the I2C bus #2.\n");
-  return AOS_INVALIDARGUMENTS;
+  return moduleTestPcal6524ShellCb(stream, argc, argv, NULL);
 }
-static ut_pcal6524data_t _utAlldPcal6524Data = {
-  /* driver   */ NULL,
-  /* timeout  */ MICROSECONDS_PER_SECOND,
-};
-aos_unittest_t moduleUtAlldPcal6524 = {
-  /* name           */ "PCAL6524",
-  /* info           */ "GPIO extender",
-  /* test function  */ utAlldPcal6524Func,
-  /* shell command  */ {
-    /* name     */ "unittest:GPIOExtender",
-    /* callback */ _utShellCmdCb_AlldPcal6524,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldPcal6524Data,
-};
+AOS_SHELL_COMMAND(moduleTestPcal6524ShellCmd, "test:GPIOExtenter", _testPcal6524ShellCmdCb);
 
 /*
  * AT42QT1050 (touch sensor)
  */
-static int _utShellCmdCb_AlldAt42qt1050(BaseSequentialStream* stream, int argc, char* argv[])
+#include <module_test_AT42QT1050.h>
+static int _testAt42qt1050ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
+{
+  return moduleTestAt42qt1050ShellCb(stream, argc, argv, NULL);
+}
+AOS_SHELL_COMMAND(moduleTestAt42qt1050ShellCmd, "test:Touch", _testAt42qt1050ShellCmdCb);
+
+#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
+
+/*
+ * entire module
+ */
+static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
 {
   (void)argc;
   (void)argv;
-  aosUtRun(stream, &moduleUtAlldAt42qt1050, NULL);
-  return AOS_OK;
-}
-static ut_at42qt1050data_t _utAlldAt42qt1050Data= {
-  /* AT42QT1050 driver  */ &moduleLldTouch,
-  /* timeout            */ MICROSECONDS_PER_SECOND,
-  /* event source       */ &aos.events.io,
-  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
-};
-aos_unittest_t moduleUtAlldAt42qt1050 = {
-  /* name           */ "AT42QT1050",
-  /* info           */ "touch sensor",
-  /* test function  */ utAlldAt42qt1050Func,
-  /* shell command  */ {
-    /* name     */ "unittest:Touch",
-    /* callback */ _utShellCmdCb_AlldAt42qt1050,
-    /* next     */ NULL,
-  },
-  /* data           */ &_utAlldAt42qt1050Data,
-};
+
+  int status = AOS_OK;
+  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
+  aos_testresult_t result_test = {0, 0};
+  aos_testresult_t result_total = {0, 0};
+
+  /* ADC */
+  status |= moduleTestAdcShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* AT24C01BN-SH-B (EEPROM) */
+  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* bq24103a (battery charger) */
+  // front
+  targv[1] = "-f";
+  status |= moduleTestBq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // rear
+  targv[1] = "-r";
+  status |= moduleTestBq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* bq27500 (fuel gauge) */
+  // front
+  targv[1] = "-f";
+  status |= moduleTestBq27500ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // rear
+  targv[1] = "-r";
+  status |= moduleTestBq27500ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* bq 27500 (fuel gauge) in combination with bq24103a (battery charger) */
+  // front
+  targv[1] = "-f";
+  status |= moduleTestBq27500Bq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // rear
+  targv[1] = "-r";
+  status |= moduleTestBq27500Bq241xxShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* INA219 (power monitor) */
+  // VDD
+  targv[1] = "VDD";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VIO 1.8V
+  targv[1] = "VIO1.8";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VIO 3.3V
+  targv[1] = "VIO3.3";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VSYS 4.2V
+  targv[1] = "VSYS4.2";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // VIO 5.0V
+  targv[1] = "VIO5.0";
+  status |= moduleTestIna219ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* status LED */
+  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* PKLCS1212E4001 (buzzer) */
+  status |= moduleTestPkxxxexxxShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS62113 (step-down converter) */
+  status |= moduleTestTps6211xShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* TPS62113 (step-down converter) in combination with INA219 (power monitor) */
+  status |= moduleTestTps6211xIna219ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+#if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)
+
+  /* MPR121 (touch sensor) */
+  status |= moduleTestMpr121ShellCb(stream, 0, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+  /* PCA9544A (I2C multiplexer) */
+  // #1
+  targv[1] = "#1";
+  status |= moduleTestPca9544aShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // #2
+  targv[1] = "#2";
+  status |= moduleTestPca9544aShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* VCNL4020 (proximity sensor) */
+  // north-northeast
+  targv[1] = "-nne";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // east-northeast
+  targv[1] = "-ene";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // east-southeast
+  targv[1] = "-ese";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // south-southeast
+  targv[1] = "-sse";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // south-southwest
+  targv[1] = "-ssw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // west-southwest
+  targv[1] = "-wsw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // west-northwest
+  targv[1] = "-wnw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // west-northwest
+  targv[1] = "-nnw";
+  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+#endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X)
+
+  /* PCAL6524 (GPIO extender) */
+  // #1
+  targv[1] = "#1";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // #2
+  targv[1] = "#2";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* AT42QT1050 (touch sensor) */
+  status |= moduleTestAt42qt1050ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+
+#endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
+
+#if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)
+
+  /* PCAL6524 (GPIO extender) */
+  // #1
+  targv[1] = "#1";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  // #2
+  targv[1] = "#2";
+  status |= moduleTestPcal6524ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
+  targv[1] = "";
+
+  /* AT42QT1050 (touch sensor) */
+  status |= moduleTestAt42qt1050ShellCb(stream, 2, targv, &result_test);
+  result_total = aosTestResultAdd(result_total, result_test);
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
 
+  // print total result
+  chprintf(stream, "\n");
+  aosTestResultPrintSummary(stream, &result_total, "entire module");
+
+  return status;
+}
+AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
+
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
 /** @} */
diff --git a/modules/PowerManagement_1-2/module.h b/modules/PowerManagement_1-2/module.h
index 468e72f..9c20fcc 100644
--- a/modules/PowerManagement_1-2/module.h
+++ b/modules/PowerManagement_1-2/module.h
@@ -434,37 +434,38 @@ extern ROMCONST char* moduleShellPrompt;
 }
 
 /**
- * @brief   Unit test initialization hook.
+ * @brief   Test initialization hook.
  */
 #define MODULE_INIT_TESTS() {                                                 \
   /* add unit-test shell commands */                                          \
-  aosShellAddCommand(&aos.shell, &moduleUtAdcVsys.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldAt24c01b.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldBq24103a.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500.shellcmd);              \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldBq27500Bq24103a.shellcmd);      \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldIna219.shellcmd);               \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldPklcs1212e4001.shellcmd);       \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldLed.shellcmd);                  \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113.shellcmd);             \
-  aosShellAddCommand(&aos.shell, &moduleUtAlldTps62113Ina219.shellcmd);       \
+  aosShellAddCommand(&aos.shell, &moduleTestAdcShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestAt24c01bShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestBq241xxShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestBq27500ShellCmd);                 \
+  aosShellAddCommand(&aos.shell, &moduleTestBq27500Bq241xxShellCmd);          \
+  aosShellAddCommand(&aos.shell, &moduleTestIna219ShellCmd);                  \
+  aosShellAddCommand(&aos.shell, &moduleTestLedShellCmd);                     \
+  aosShellAddCommand(&aos.shell, &moduleTestPkxxxexxxShellCmd);               \
+  aosShellAddCommand(&aos.shell, &moduleTestTps6211xShellCmd);                \
+  aosShellAddCommand(&aos.shell, &moduleTestTps6211xIna219ShellCmd);          \
   MODULE_INIT_TEST_SENSORRING();                                              \
+  aosShellAddCommand(&aos.shell, &moduleTestAllShellCmd);                     \
 }
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
   #define MODULE_INIT_TEST_SENSORRING() {                                     \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldPca9544a.shellcmd);           \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldMpr121.shellcmd);             \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldVcnl4020.shellcmd);           \
+    aosShellAddCommand(&aos.shell, &moduleTestPca9544aShellCmd);              \
+    aosShellAddCommand(&aos.shell, &moduleTestMpr121ShellCmd);                \
+    aosShellAddCommand(&aos.shell, &moduleTestVcnl4020ShellCmd);              \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
   #define MODULE_INIT_TEST_SENSORRING() {                                     \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldPcal6524.shellcmd);           \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldAt42qt1050.shellcmd);         \
+    aosShellAddCommand(&aos.shell, &moduleTestPcal6524ShellCmd);              \
+    aosShellAddCommand(&aos.shell, &moduleTestAt42qt1050ShellCmd);            \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
   #define MODULE_INIT_TEST_SENSORRING() {                                     \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldPcal6524.shellcmd);           \
-    aosShellAddCommand(&aos.shell, &moduleUtAlldAt42qt1050.shellcmd);         \
+    aosShellAddCommand(&aos.shell, &moduleTestPcal6524ShellCmd);              \
+    aosShellAddCommand(&aos.shell, &moduleTestAt42qt1050ShellCmd);            \
   }
 #else /* (BOARD_SENSORRING == ?) */
   #define MODULE_INIT_TEST_SENSORRING()         {}
@@ -473,8 +474,8 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
-  MODULE_INIT_PERIPHERY_COMM_SENSORRING();                                    \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
+  MODULE_INIT_PERIPHERY_IF_SENSORRING();                                      \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
   /* I2C */                                                                   \
@@ -497,7 +498,7 @@ extern ROMCONST char* moduleShellPrompt;
   pwmStart(&MODULE_HAL_PWM_BUZZER, &moduleHalPwmBuzzerConfig);                \
 }
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (VCNL4020_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? VCNL4020_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCA9544A_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCA9544A_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
@@ -505,25 +506,25 @@ extern ROMCONST char* moduleShellPrompt;
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (MPR121_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? MPR121_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed; \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT42QT1050_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT42QT1050_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
   }
 #elif (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {                           \
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {                             \
     moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm18Pm33GaugeRearConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (PCAL6524_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? PCAL6524_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
     moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed = (AT42QT1050_LLD_I2C_MAXFREQUENCY < moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed) ? AT42QT1050_LLD_I2C_MAXFREQUENCY : moduleHalI2cSrPm42Pm50PmVddEepromGaugeFrontConfig.clock_speed;  \
   }
 #else /* (BOARD_SENSORRING == ?) */
-  #define MODULE_INIT_PERIPHERY_COMM_SENSORRING() {}
+  #define MODULE_INIT_PERIPHERY_IF_SENSORRING() {}
 #endif /* (BOARD_SENSORRING == ?) */
 
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
   /* PWM */                                                                   \
   pwmStop(&MODULE_HAL_PWM_BUZZER);                                            \
   /* ADC */                                                                   \
@@ -741,129 +742,114 @@ extern AT42QT1050Driver moduleLldTouch;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
 #if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
-#include <ut_lld_adc.h>
-#include <ut_alld_AT24C01B_v1.h>
-#include <ut_alld_bq241xx_v1.h>
-#include <ut_alld_bq27500_v1.h>
-#include <ut_alld_bq27500_v1_bq241xx_v1.h>
-#include <ut_alld_INA219_v1.h>
-#include <ut_alld_LED_v1.h>
-#include <ut_alld_PKxxxExxx_v1.h>
-#include <ut_alld_TPS6211x_v1.h>
-#include <ut_alld_TPS6211x_v1_INA219_v1.h>
 
 /**
- * @brief   ADC unit test object.
+ * @brief   ADC test command.
  */
-extern aos_unittest_t moduleUtAdcVsys;
+extern aos_shellcommand_t moduleTestAdcShellCmd;
 
 /**
- * @brief   AT24C01BN-SH-B (EEPROM) unit test object.
+ * @brief   AT24C01BN-SH-B (EEPROM) test command.
  */
-extern aos_unittest_t moduleUtAlldAt24c01b;
+extern aos_shellcommand_t moduleTestAt24c01bShellCmd;
 
 /**
- * @brief   BQ24103A (battery charger) unit test object.
+ * @brief   bq24103a (battery charger) test command.
  */
-extern aos_unittest_t moduleUtAlldBq24103a;
+extern aos_shellcommand_t moduleTestBq241xxShellCmd;
 
 /**
- * @brief   BQ27500 (fuel gauge) unit test object.
+ * @brief   bq27500 (fuel gauge) test command.
  */
-extern aos_unittest_t moduleUtAlldBq27500;
+extern aos_shellcommand_t moduleTestBq27500ShellCmd;
 
 /**
- * @brief   BQ27500 (fuela gauge) in combination with BQ24103A (battery charger) unit test object.
+ * @brief   bq27500 (fuel gauge) in combination with bq24103a (battery charger) test command.
  */
-extern aos_unittest_t moduleUtAlldBq27500Bq24103a;
+extern aos_shellcommand_t moduleTestBq27500Bq241xxShellCmd;
 
 /**
- * @brief   INA219 (power monitor) unit test object.
+ * @brief   INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldIna219;
+extern aos_shellcommand_t moduleTestIna219ShellCmd;
 
 /**
- * @brief   Status LED unit test object.
+ * @brief   Status LED test command.
  */
-extern aos_unittest_t moduleUtAlldLed;
+extern aos_shellcommand_t moduleTestLedShellCmd;
 
 /**
- * @brief   PKLCS1212E4001 (buzzer) unit test object.
+ * @brief   PKLCS1212E4001 (buzzer) test command.
  */
-extern aos_unittest_t moduleUtAlldPklcs1212e4001;
+extern aos_shellcommand_t moduleTestPkxxxexxxShellCmd;
 
 /**
- * @brief   TPS62113 (step-down converter) unit test object.
+ * @brief   TPS62113 (step-down converter) test command.
  */
-extern aos_unittest_t moduleUtAlldTps62113;
+extern aos_shellcommand_t moduleTestTps6211xShellCmd;
 
 /**
- * @brief   TPS62113 (step-sown converter) in combination with INA219 (power monitor) unit test object.
+ * @brief   TPS62113 (step-sown converter) in combination with INA219 (power monitor) test command.
  */
-extern aos_unittest_t moduleUtAlldTps62113Ina219;
+extern aos_shellcommand_t moduleTestTps6211xIna219ShellCmd;
 
 #if (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) || defined(__DOXYGEN__)
 
-#include <ut_alld_MPR121_v1.h>
-#include <ut_alld_PCA9544A_v1.h>
-#include <ut_alld_VCNL4020_v1.h>
-
 /**
- * @brief   MPR121 (touch sensor) unit test object.
+ * @brief   MPR121 (touch sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldMpr121;
+extern aos_shellcommand_t moduleTestMpr121ShellCmd;
 
 /**
- * @brief   PCA9544A (I2C multiplexer) unit test object.
+ * @brief   PCA9544A (I2C multiplexer) test command.
  */
-extern aos_unittest_t moduleUtAlldPca9544a;
+extern aos_shellcommand_t moduleTestPca9544aShellCmd;
 
 /**
- * @brief   VCNL4020 (proximity sensor) unit test object.
+ * @brief   VCNL4020 (proximity sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldVcnl4020;
+extern aos_shellcommand_t moduleTestVcnl4020ShellCmd;
 
 #endif /* (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || defined(__DOXYGEN__)
 
-#include <ut_alld_PCAL6524_v1.h>
-#include <ut_alld_AT42QT1050_v1.h>
-
 /**
- * @brief   PCAL6524 (GPIO extender) unit test object.
+ * @brief   PCAL6524 (GPIO extender) test command.
  */
-extern aos_unittest_t moduleUtAlldPcal6524;
+extern aos_shellcommand_t moduleTestPcal6524ShellCmd;
 
 /**
- * @brief   AT42QT1050 (touch sensor) unit test object.
+ * @brief   AT42QT1050 (touch sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldAt42qt1050;
+extern aos_shellcommand_t moduleTestAt42qt1050ShellCmd;
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) */
 
 #if (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) || defined(__DOXYGEN__)
 
-#include <ut_alld_PCAL6524_v1.h>
-#include <ut_alld_AT42QT1050_v1.h>
-
 /**
- * @brief   PCAL6524 (GPIO extender) unit test object.
+ * @brief   PCAL6524 (GPIO extender) test command.
  */
-extern aos_unittest_t moduleUtAlldPcal6524;
+extern aos_shellcommand_t moduleTestPcal6524ShellCmd;
 
 /**
- * @brief   AT42QT1050 (touch sensor) unit test object.
+ * @brief   AT42QT1050 (touch sensor) test command.
  */
-extern aos_unittest_t moduleUtAlldAt42qt1050;
+extern aos_shellcommand_t moduleTestAt42qt1050ShellCmd;
 
 #endif /* (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X) */
 
+/**
+ * @brief   Entire module test command.
+ */
+extern aos_shellcommand_t moduleTestAllShellCmd;
+
 #endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
 
 /** @} */
diff --git a/modules/PowerManagement_1-2/test/AT24C01B/module_test_AT24C01B.c b/modules/PowerManagement_1-2/test/AT24C01B/module_test_AT24C01B.c
new file mode 100644
index 0000000..ee88d4c
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/AT24C01B/module_test_AT24C01B.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_AT24C01B.h>
+#include <aos_test_AT24C01B.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at24c01bdata_t _data = {
+  /* driver   */ &moduleLldEeprom,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "AT24C01BN-SH-B", "1kbit EEPROM", moduleTestAt24c01bShellCb, aosTestAt24c01bFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/AT24C01B/module_test_AT24C01B.h b/modules/PowerManagement_1-2/test/AT24C01B/module_test_AT24C01B.h
new file mode 100644
index 0000000..6764c0d
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/AT24C01B/module_test_AT24C01B.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT24C01B_H
+#define MODULE_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt24c01bShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_AT24C01B_H */
+
diff --git a/modules/PowerManagement_1-2/test/AT42QT1050/module_test_AT42QT1050.c b/modules/PowerManagement_1-2/test/AT42QT1050/module_test_AT42QT1050.c
new file mode 100644
index 0000000..6c373f7
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/AT42QT1050/module_test_AT42QT1050.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+#include <module_test_AT42QT1050.h>
+#include <aos_test_AT42QT1050.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_at42qt1050data_t _data = {
+  /* AT42QT1050 driver  */ &moduleLldTouch,
+  /* timeout            */ MICROSECONDS_PER_SECOND,
+  /* event source       */ &aos.events.io,
+  /* event flags        */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
+};
+
+static AOS_TEST(_test, "AT42QT1050", "touch sensor", moduleTestAt42qt1050ShellCb, aosTestAt42qt1050Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAt42qt1050ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
diff --git a/modules/PowerManagement_1-2/test/AT42QT1050/module_test_AT42QT1050.h b/modules/PowerManagement_1-2/test/AT42QT1050/module_test_AT42QT1050.h
new file mode 100644
index 0000000..0652a64
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/AT42QT1050/module_test_AT42QT1050.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_AT42QT1050_H
+#define MODULE_TEST_AT42QT1050_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestAt42qt1050ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
+
+#endif /* MODULE_TEST_AT42QT1050_H */
+
diff --git a/modules/PowerManagement_1-2/test/INA219/module_test_INA219.c b/modules/PowerManagement_1-2/test/INA219/module_test_INA219.c
new file mode 100644
index 0000000..ed95007
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/INA219/module_test_INA219.c
@@ -0,0 +1,153 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_INA219.h>
+#include <aos_test_INA219.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_ina219data_t _data = {
+  /* driver           */ NULL,
+  /* expected voltage */ 0.0f,
+  /* tolerance        */ 0.05f,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "INA219", "power monitor", moduleTestIna219ShellCb, aosTestIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    VDD, VIO18, VIO33, VSYS42, VIO50,
+  } monitor = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "VDD") == 0) {
+      monitor = VDD;
+    } else if (strcmp(argv[1], "VIO1.8") == 0) {
+      monitor = VIO18;
+    } else if (strcmp(argv[1], "VIO3.3") == 0) {
+      monitor = VIO33;
+    } else if (strcmp(argv[1], "VSYS4.2") == 0) {
+      monitor = VSYS42;
+    } else if (strcmp(argv[1], "VIO5.0") == 0) {
+      monitor = VIO50;
+    }
+  }
+
+  // handle valid monitor
+  if (monitor != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (monitor) {
+      case VDD:
+        _data.inad = &moduleLldPowerMonitorVdd;
+        _data.v_expected = 3.3f;
+        res = aosTestRun(stream, &_test, "VDD (3.3V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VIO18:
+        _data.inad = &moduleLldPowerMonitorVio18;
+        _data.v_expected = 1.8f;
+        res = aosTestRun(stream, &_test, "VIO (1.8V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VIO33:
+        _data.inad = &moduleLldPowerMonitorVio33;
+        _data.v_expected = 3.3f;
+        res = aosTestRun(stream, &_test, "VIO (3.3V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VSYS42:
+        _data.inad = &moduleLldPowerMonitorVsys42;
+        _data.v_expected = 4.2f;
+        res = aosTestRun(stream, &_test, "VSYS (4.2V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      case VIO50:
+        _data.inad = &moduleLldPowerMonitorVio50;
+        _data.v_expected = 5.0f;
+        res = aosTestRun(stream, &_test, "VIO (5.0V)");
+        _data.inad = NULL;
+        _data.v_expected = 0.0f;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  VDD\n");
+    chprintf(stream, "    Test VDD (3.3V) power monitor.\n");
+    chprintf(stream, "  VIO1.8\n");
+    chprintf(stream, "    Test VIO 1.8V power monitor.\n");
+    chprintf(stream, "  VIO3.3\n");
+    chprintf(stream, "    Test VIO 3.3V power monitor.\n");
+    chprintf(stream, "  VSYS4.2\n");
+    chprintf(stream, "    Test VSYS 4.2V power monitor.\n");
+    chprintf(stream, "  VIO5.0\n");
+    chprintf(stream, "    Test VIO 5.0V power monitor.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/INA219/module_test_INA219.h b/modules/PowerManagement_1-2/test/INA219/module_test_INA219.h
new file mode 100644
index 0000000..08c3462
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/INA219/module_test_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_INA219_H
+#define MODULE_TEST_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_INA219_H */
+
diff --git a/modules/PowerManagement_1-2/test/LED/module_test_LED.c b/modules/PowerManagement_1-2/test/LED/module_test_LED.c
new file mode 100644
index 0000000..cd97c0f
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/LED/module_test_LED.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_LED.h>
+#include <aos_test_LED.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_leddata_t _data = {
+  /* LED  */ &moduleLldStatusLed,
+};
+
+static AOS_TEST(_test, "LED", NULL, moduleTestLedShellCb, aosTestLedFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/LED/module_test_LED.h b/modules/PowerManagement_1-2/test/LED/module_test_LED.h
new file mode 100644
index 0000000..f9ae6c5
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/LED/module_test_LED.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_LED_H
+#define MODULE_TEST_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestLedShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_LED_H */
+
diff --git a/modules/PowerManagement_1-2/test/MPR121/module_test_MPR121.c b/modules/PowerManagement_1-2/test/MPR121/module_test_MPR121.c
new file mode 100644
index 0000000..f678f43
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/MPR121/module_test_MPR121.c
@@ -0,0 +1,73 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+#include <module_test_MPR121.h>
+#include <aos_test_MPR121.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_mpr121data_t _data= {
+  /* MPR121 driver  */ &moduleLldTouch,
+  /* timeout        */ MICROSECONDS_PER_SECOND,
+  /* event source   */ &aos.events.io,
+  /* event flags    */ MODULE_OS_IOEVENTFLAGS_TOUCHINT,
+};
+
+static AOS_TEST(_test, "MPR121", "touch sensor", moduleTestMpr121ShellCb, aosTestMpr121Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestMpr121ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
diff --git a/modules/PowerManagement_1-2/test/MPR121/module_test_MPR121.h b/modules/PowerManagement_1-2/test/MPR121/module_test_MPR121.h
new file mode 100644
index 0000000..1a02010
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/MPR121/module_test_MPR121.h
@@ -0,0 +1,65 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_MPR121_H
+#define MODULE_TEST_MPR121_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestMpr121ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#endif /* MODULE_TEST_MPR121_H */
diff --git a/modules/PowerManagement_1-2/test/PCA9544A/module_test_PCA9544A.c b/modules/PowerManagement_1-2/test/PCA9544A/module_test_PCA9544A.c
new file mode 100644
index 0000000..cc09082
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/PCA9544A/module_test_PCA9544A.c
@@ -0,0 +1,114 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+#include <module_test_PCA9544A.h>
+#include <aos_test_PCA9544A.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pca9544adata_t _data = {
+  /* driver  */ NULL,
+  /* timeout */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "PCA9544A", "I2C multiplexer", moduleTestPca9544aShellCb, aosTestPca9544aFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    MUX1, MUX2,
+  } mux = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "#1") == 0) {
+      mux = MUX1;
+    } else if (strcmp(argv[1], "#2") == 0) {
+      mux = MUX2;
+    }
+  }
+
+  // handle valid mux
+  if (mux != UNKNOWN) {
+    aos_testresult_t res = {0 ,0};
+
+    switch (mux) {
+      case MUX1:
+        _data.driver = &moduleLldI2cMultiplexer1;
+        res = aosTestRun(stream, &_test, "I2C bus #1");
+        _data.driver = NULL;
+        break;
+      case MUX2:
+        _data.driver = &moduleLldI2cMultiplexer2;
+        res = aosTestRun(stream, &_test, "I2C bus #2");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  #1\n");
+    chprintf(stream, "    Test the multiplexer on the I2C bus #1.\n");
+    chprintf(stream, "  #2\n");
+    chprintf(stream, "    Test the multiplexer on the I2C bus #2.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
diff --git a/modules/PowerManagement_1-2/test/PCA9544A/module_test_PCA9544A.h b/modules/PowerManagement_1-2/test/PCA9544A/module_test_PCA9544A.h
new file mode 100644
index 0000000..f8a021d
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/PCA9544A/module_test_PCA9544A.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PCA9544A_H
+#define MODULE_TEST_PCA9544A_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPca9544aShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#endif /* MODULE_TEST_PCA9544A_H */
+
diff --git a/modules/PowerManagement_1-2/test/PCAL6524/module_test_PCAL6524.c b/modules/PowerManagement_1-2/test/PCAL6524/module_test_PCAL6524.c
new file mode 100644
index 0000000..53717a4
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/PCAL6524/module_test_PCAL6524.c
@@ -0,0 +1,114 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+#include <module_test_PCAL6524.h>
+#include <aos_test_PCAL6524.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pcal6524data_t _data = {
+  /* driver   */ NULL,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "PCAL6524", "GPIO extender", moduleTestPcal6524ShellCb, aosTestPcal6524Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPcal6524ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    GPIOEXTENDER1, GPIOEXTENDER2,
+  } extender = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "#1") == 0) {
+      extender = GPIOEXTENDER1;
+    } else if (strcmp(argv[1], "#2") == 0) {
+      extender = GPIOEXTENDER2;
+    }
+  }
+
+  // handle valid extender
+  if (extender != UNKNOWN) {
+    aos_testresult_t res = {0 ,0};
+
+    switch (extender) {
+      case GPIOEXTENDER1:
+        _data.pcal6524d = &moduleLldGpioExtender1;
+        res = aosTestRun(stream, &_test, "I2C bus #1");
+        _data.pcal6524d = NULL;
+        break;
+      case GPIOEXTENDER2:
+        _data.pcal6524d = &moduleLldGpioExtender2;
+        res = aosTestRun(stream, &_test, "I2C bus #2");
+        _data.pcal6524d = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  #1\n");
+    chprintf(stream, "    Test the GPIO extender for the I2C bus #1.\n");
+    chprintf(stream, "  #2\n");
+    chprintf(stream, "    Test the GPIO extender for the I2C bus #2.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
diff --git a/modules/PowerManagement_1-2/test/PCAL6524/module_test_PCAL6524.h b/modules/PowerManagement_1-2/test/PCAL6524/module_test_PCAL6524.h
new file mode 100644
index 0000000..5a7f701
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/PCAL6524/module_test_PCAL6524.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PCAL6524_H
+#define MODULE_TEST_PCAL6524_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X))) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPcal6524ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && ((BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L0X) || (BOARD_SENSORRING == BOARD_DISTANCESENSOR_VL53L1X)) */
+
+#endif /* MODULE_TEST_PCAL6524_H */
+
diff --git a/modules/PowerManagement_1-2/test/PKxxxExxx/module_test_PKxxxExxx.c b/modules/PowerManagement_1-2/test/PKxxxExxx/module_test_PKxxxExxx.c
new file mode 100644
index 0000000..de034a3
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/PKxxxExxx/module_test_PKxxxExxx.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_PKxxxExxx.h>
+#include <aos_test_PKxxxExxx.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_pkxxxexxxdata_t _data = {
+  /* PWM driver   */ &MODULE_HAL_PWM_BUZZER,
+  /* PWM channel  */ MODULE_HAL_PWM_BUZZER_CHANNEL
+};
+
+static AOS_TEST(_test, "PKLCS1212E4001", "buzzer", moduleTestPkxxxexxxShellCb, aosTestPkxxxexxxFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestPkxxxexxxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/PKxxxExxx/module_test_PKxxxExxx.h b/modules/PowerManagement_1-2/test/PKxxxExxx/module_test_PKxxxExxx.h
new file mode 100644
index 0000000..c0a8600
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/PKxxxExxx/module_test_PKxxxExxx.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_PKxxxExxx_H
+#define MODULE_TEST_PKxxxExxx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestPkxxxexxxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_PKxxxExxx_H */
+
diff --git a/modules/PowerManagement_1-2/test/TPS6211x/module_test_TPS6211x.c b/modules/PowerManagement_1-2/test/TPS6211x/module_test_TPS6211x.c
new file mode 100644
index 0000000..e7a6250
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/TPS6211x/module_test_TPS6211x.c
@@ -0,0 +1,70 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS6211x.h>
+#include <aos_test_TPS6211x.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps6211xbdata_t _data = {
+  /* driver */ &moduleLldStepDownConverter,
+};
+
+static AOS_TEST(_test, "TPS62113", "step-down converter", moduleTestTps6211xShellCb, aosTestTps6211xFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/TPS6211x/module_test_TPS6211x.h b/modules/PowerManagement_1-2/test/TPS6211x/module_test_TPS6211x.h
new file mode 100644
index 0000000..de34ee8
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/TPS6211x/module_test_TPS6211x.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS6211x_H
+#define MODULE_TEST_TPS6211x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestTps6211xShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS6211x_H */
+
diff --git a/modules/PowerManagement_1-2/test/TPS6211x_INA219/module_test_TPS6211x_INA219.c b/modules/PowerManagement_1-2/test/TPS6211x_INA219/module_test_TPS6211x_INA219.c
new file mode 100644
index 0000000..a2b95d9
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/TPS6211x_INA219/module_test_TPS6211x_INA219.c
@@ -0,0 +1,72 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_TPS6211x_INA219.h>
+#include <aos_test_TPS6211x_INA219.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_tps6211xina219data_t _data = {
+  /* TPS6211x */ &moduleLldStepDownConverter,
+  /* INA219   */ &moduleLldPowerMonitorVsys42,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "TPS62113 & INA219", "step-down converter & power monitor", moduleTestTps6211xIna219ShellCb, aosTestTps6211xIna219Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestTps6211xIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/TPS6211x_INA219/module_test_TPS6211x_INA219.h b/modules/PowerManagement_1-2/test/TPS6211x_INA219/module_test_TPS6211x_INA219.h
new file mode 100644
index 0000000..1357595
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/TPS6211x_INA219/module_test_TPS6211x_INA219.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_TPS6211x_INA219_H
+#define MODULE_TEST_TPS6211x_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestTps6211xIna219ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_TPS6211x_INA219_H */
+
diff --git a/modules/PowerManagement_1-2/test/VCNL4020/module_test_VCNL4020.c b/modules/PowerManagement_1-2/test/VCNL4020/module_test_VCNL4020.c
new file mode 100644
index 0000000..913e762
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/VCNL4020/module_test_VCNL4020.c
@@ -0,0 +1,203 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+#include <module_test_VCNL4020.h>
+#include <aos_test_VCNL4020.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_vcnl4020data_t _data = {
+  /* driver       */ NULL,
+  /* timeout      */ MICROSECONDS_PER_SECOND,
+  /* event source */ &aos.events.io,
+  /* event flags  */ 0,
+};
+
+static AOS_TEST(_test, "VCNL4020", "proximity sensor", moduleTestVcnl4020ShellCb, aosTestVcnl4020Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+static void _disableInterrupt(VCNL4020Driver* vcnl)
+{
+  uint8_t intstatus;
+  vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTCTRL, 0, _data.timeout);
+  vcnl4020_lld_readreg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, &intstatus, _data.timeout);
+  if (intstatus) {
+    vcnl4020_lld_writereg(vcnl, VCNL4020_LLD_REGADDR_INTSTATUS, intstatus, _data.timeout);
+  }
+  return;
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    NNE, ENE, ESE, SSE, SSW, WSW, WNW, NNW,
+  } sensor = UNKNOWN;
+
+  // evaluate arguments
+  if (argc == 2) {
+    if (strcmp(argv[1], "-nne") == 0) {
+      sensor = NNE;
+    } else if (strcmp(argv[1], "-ene") == 0) {
+      sensor = ENE;
+    } else if (strcmp(argv[1], "-ese") == 0) {
+      sensor = ESE;
+    } else if (strcmp(argv[1], "-sse") == 0) {
+      sensor = SSE;
+    } else if (strcmp(argv[1], "-ssw") == 0) {
+      sensor = SSW;
+    } else if (strcmp(argv[1], "-wsw") == 0) {
+      sensor = WSW;
+    } else if (strcmp(argv[1], "-wnw") == 0) {
+      sensor = WNW;
+    } else if (strcmp(argv[1], "-nnw") == 0) {
+      sensor = NNW;
+    }
+  }
+
+  // handle valid sensor
+  if (sensor != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+    PCA9544ADriver* mux = NULL;
+    switch (sensor) {
+      case SSE:
+      case SSW:
+      case WSW:
+      case WNW:
+        mux = &moduleLldI2cMultiplexer1;
+        _data.vcnld = &moduleLldProximity1;
+        _data.evtflags = MODULE_OS_IOEVENTFLAGS_IRINT2;
+        break;
+      case NNW:
+      case NNE:
+      case ENE:
+      case ESE:
+        mux = &moduleLldI2cMultiplexer2;
+        _data.vcnld = &moduleLldProximity2;
+        _data.evtflags = MODULE_OS_IOEVENTFLAGS_IRINT1;
+        break;
+      default:
+        break;
+    }
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, _data.timeout);
+    _disableInterrupt(_data.vcnld);
+    switch (sensor) {
+      case NNE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, _data.timeout);
+        res = aosTestRun(stream, &_test, "north-northeast sensor (I2C #2)");
+        break;
+      case ENE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, _data.timeout);
+        res = aosTestRun(stream, &_test, "east-northeast sensor (I2C #2)");
+        break;
+      case ESE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, _data.timeout);
+        res = aosTestRun(stream, &_test, "east-southeast sensor (I2C #2)");
+        break;
+      case SSE:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, _data.timeout);
+        res = aosTestRun(stream, &_test, "south-southeast sensor (I2C #1)");
+        break;
+      case SSW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH1, _data.timeout);
+        res = aosTestRun(stream, &_test, "south-southwest sensor (I2C #1)");
+        break;
+      case WSW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH3, _data.timeout);
+        res = aosTestRun(stream, &_test, "west-southwest sensor (I2C #1)");
+        break;
+      case WNW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH2, _data.timeout);
+        res = aosTestRun(stream, &_test, "west-northwest sensor (I2C #1)");
+        break;
+      case NNW:
+        pca9544a_lld_setchannel(mux, PCA9544A_LLD_CH0, _data.timeout);
+        res = aosTestRun(stream, &_test, "north-northwest sensor (I2C #2)");
+        break;
+      default:
+        break;
+    }
+    _data.vcnld = NULL;
+    _data.evtflags = 0;
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  -nne\n");
+    chprintf(stream, "    Test north-northeast sensor.\n");
+    chprintf(stream, "  -ene\n");
+    chprintf(stream, "    Test east-northeast sensor.\n");
+    chprintf(stream, "  -ese\n");
+    chprintf(stream, "    Test east-southeast sensor.\n");
+    chprintf(stream, "  -sse\n");
+    chprintf(stream, "    Test south-southeast sensor.\n");
+    chprintf(stream, "  -ssw\n");
+    chprintf(stream, "    Test south-southwest sensor.\n");
+    chprintf(stream, "  -wsw\n");
+    chprintf(stream, "    Test west-southwest sensor.\n");
+    chprintf(stream, "  -wnw\n");
+    chprintf(stream, "    Test west-northwest sensor.\n");
+    chprintf(stream, "  -nnw\n");
+    chprintf(stream, "    Test north-northwest sensor.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+  }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
diff --git a/modules/PowerManagement_1-2/test/VCNL4020/module_test_VCNL4020.h b/modules/PowerManagement_1-2/test/VCNL4020/module_test_VCNL4020.h
new file mode 100644
index 0000000..b10636e
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/VCNL4020/module_test_VCNL4020.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_VCNL4020_H
+#define MODULE_TEST_VCNL4020_H
+
+#include <amiroos.h>
+
+#if ((AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR)) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestVcnl4020ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && (BOARD_SENSORRING == BOARD_PROXIMITYSENSOR) */
+
+#endif /* MODULE_TEST_VCNL4020_H */
+
diff --git a/modules/PowerManagement_1-2/test/adc/module_test_adc.c b/modules/PowerManagement_1-2/test/adc/module_test_adc.c
new file mode 100644
index 0000000..8b51169
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/adc/module_test_adc.c
@@ -0,0 +1,71 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_adc.h>
+#include <aos_test_adc.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_adcdata_t _data = {
+  /* driver               */ &MODULE_HAL_ADC_VSYS,
+  /* ADC conversion group */ &moduleHalAdcVsysConversionGroup,
+};
+
+static AOS_TEST(_test, "ADC", "VSYS", moduleTestAdcShellCb, aosTestAdcFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestAdcShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  (void)argc;
+  (void)argv;
+
+  if (result != NULL) {
+    *result = aosTestRun(stream, &_test, NULL);
+  } else {
+    aosTestRun(stream, &_test, NULL);
+  }
+
+  return AOS_OK;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/adc/module_test_adc.h b/modules/PowerManagement_1-2/test/adc/module_test_adc.h
new file mode 100644
index 0000000..b049959
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/adc/module_test_adc.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_ADC_H
+#define MODULE_TEST_ADC_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  int moduleTestAdcShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_ADC_H */
+
diff --git a/modules/PowerManagement_1-2/test/bq241xx/module_test_bq241xx.c b/modules/PowerManagement_1-2/test/bq241xx/module_test_bq241xx.c
new file mode 100644
index 0000000..8ed149e
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/bq241xx/module_test_bq241xx.c
@@ -0,0 +1,113 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_bq241xx.h>
+#include <aos_test_bq241xx.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_bq241xxdata_t _data = {
+  /* driver   */ NULL,
+};
+
+static AOS_TEST(_test, "bq24103a", "battery charger", moduleTestBq241xxShellCb, aosTestBq241xxFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestBq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FRONT, REAR,
+  } charger = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
+      charger = FRONT;
+    } else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
+      charger = REAR;
+    }
+  }
+
+  // handle valid charger
+  if (charger != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (charger) {
+      case FRONT:
+        _data.driver = &moduleLldBatteryChargerFront;
+        res = aosTestRun(stream, &_test, "front battery");
+        _data.driver = NULL;
+        break;
+      case REAR:
+        _data.driver = &moduleLldBatteryChargerRear;
+        res = aosTestRun(stream, &_test, "rear battery");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --front, -f\n");
+    chprintf(stream, "    Test the front battery charger.\n");
+    chprintf(stream, "  --rear, -r\n");
+    chprintf(stream, "    Test the rear battery charger.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+   }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/bq241xx/module_test_bq241xx.h b/modules/PowerManagement_1-2/test/bq241xx/module_test_bq241xx.h
new file mode 100644
index 0000000..39af892
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/bq241xx/module_test_bq241xx.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BQ241xx_H
+#define MODULE_TEST_BQ241xx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestBq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BQ241xx_H */
+
diff --git a/modules/PowerManagement_1-2/test/bq27500/module_test_bq27500.c b/modules/PowerManagement_1-2/test/bq27500/module_test_bq27500.c
new file mode 100644
index 0000000..9ac8e82
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/bq27500/module_test_bq27500.c
@@ -0,0 +1,114 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_bq27500.h>
+#include <aos_test_bq27500.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_bq27500data_t _data = {
+  /* driver   */ NULL,
+  /* timeout  */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "bq27500", "fuel gauge", moduleTestBq27500ShellCb, aosTestBq27500Func, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestBq27500ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FRONT, REAR,
+  } charger = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
+      charger = FRONT;
+    } else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
+      charger = REAR;
+    }
+  }
+
+  // handle valid charger
+  if (charger != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (charger) {
+      case FRONT:
+        _data.driver = &moduleLldFuelGaugeFront;
+        res = aosTestRun(stream, &_test, "front battery");
+        _data.driver = NULL;
+        break;
+      case REAR:
+        _data.driver = &moduleLldFuelGaugeRear;
+        res = aosTestRun(stream, &_test, "rear battery");
+        _data.driver = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --front, -f\n");
+    chprintf(stream, "    Test the front battery fuel gauge.\n");
+    chprintf(stream, "  --rear, -r\n");
+    chprintf(stream, "    Test the rear battery fuel gauge.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+   }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/bq27500/module_test_bq27500.h b/modules/PowerManagement_1-2/test/bq27500/module_test_bq27500.h
new file mode 100644
index 0000000..edbc0ca
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/bq27500/module_test_bq27500.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BQ27500_H
+#define MODULE_TEST_BQ27500_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestBq27500ShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BQ27500_H */
+
diff --git a/modules/PowerManagement_1-2/test/bq27500_bq241xx/module_test_bq27500_bq241xx.c b/modules/PowerManagement_1-2/test/bq27500_bq241xx/module_test_bq27500_bq241xx.c
new file mode 100644
index 0000000..a286f4d
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/bq27500_bq241xx/module_test_bq27500_bq241xx.c
@@ -0,0 +1,119 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <module_test_bq27500_bq241xx.h>
+#include <aos_test_bq27500_bq241xx.h>
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+static aos_test_bq27500bq241xxdata_t _data = {
+  /* bq27500 driver   */ NULL,
+  /* bq24103a driver  */ NULL,
+  /* timeout          */ MICROSECONDS_PER_SECOND,
+};
+
+static AOS_TEST(_test, "bq27500 & bq24103a", "fuel gauge & battery charger", moduleTestBq27500Bq241xxShellCb, aosTestBq27500Bq241xxFunc, &_data);
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+int moduleTestBq27500Bq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result)
+{
+  enum {
+    UNKNOWN,
+    FRONT, REAR,
+  } charger = UNKNOWN;
+
+  // evaluate argument
+  if (argc == 2) {
+    if (strcmp(argv[1], "-f") == 0 || strcmp(argv[1], "--front") == 0) {
+      charger = FRONT;
+    } else if (strcmp(argv[1], "-r") == 0 || strcmp(argv[1], "--rear") == 0) {
+      charger = REAR;
+    }
+  }
+
+  // handle valid charger
+  if (charger != UNKNOWN) {
+    aos_testresult_t res = {0, 0};
+
+    switch (charger) {
+      case FRONT:
+        _data.bq27500 = &moduleLldFuelGaugeFront;
+        _data.bq241xx = &moduleLldBatteryChargerFront;
+        res = aosTestRun(stream, &_test, "front battery");
+        _data.bq27500 = NULL;
+        _data.bq241xx = NULL;
+        break;
+      case REAR:
+        _data.bq27500 = &moduleLldFuelGaugeRear;
+        _data.bq241xx = &moduleLldBatteryChargerRear;
+        res = aosTestRun(stream, &_test, "rear battery");
+        _data.bq27500 = NULL;
+        _data.bq241xx = NULL;
+        break;
+      default:
+        break;
+    }
+    if (result != NULL) {
+      *result = res;
+    }
+    return AOS_OK;
+  }
+  // handle invalid arguments
+  else {
+    // print help
+    chprintf(stream, "Usage: %s OPTION\n", argv[0]);
+    chprintf(stream, "Options:\n");
+    chprintf(stream, "  --front, -f\n");
+    chprintf(stream, "    Test the front battery fuel gauge and charger.\n");
+    chprintf(stream, "  --rear, -r\n");
+    chprintf(stream, "    Test the rear battery fuel gauge and charger.\n");
+    if (result != NULL) {
+      result->passed = 0;
+      result->failed = 0;
+    }
+    return AOS_INVALIDARGUMENTS;
+   }
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/modules/PowerManagement_1-2/test/bq27500_bq241xx/module_test_bq27500_bq241xx.h b/modules/PowerManagement_1-2/test/bq27500_bq241xx/module_test_bq27500_bq241xx.h
new file mode 100644
index 0000000..85d97f8
--- /dev/null
+++ b/modules/PowerManagement_1-2/test/bq27500_bq241xx/module_test_bq27500_bq241xx.h
@@ -0,0 +1,66 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 MODULE_TEST_BQ27500_BQ241xx_H
+#define MODULE_TEST_BQ27500_BQ241xx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+   int moduleTestBq27500Bq241xxShellCb(BaseSequentialStream* stream, int argc, char* argv[], aos_testresult_t* result);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* MODULE_TEST_BQ27500_BQ241xx_H */
+
diff --git a/modules/STM32F407G-DISC1/Makefile b/modules/STM32F407G-DISC1/Makefile
index 2f66a3d..6733968 100644
--- a/modules/STM32F407G-DISC1/Makefile
+++ b/modules/STM32F407G-DISC1/Makefile
@@ -112,100 +112,52 @@ endif
 # Project, target, sources and paths                                           #
 #                                                                              #
 
-# Absolute path to the project
-PROJECT_PATH := $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
+# Absolute path to the project.
+PROJECT_PATH := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# Define project name here
-PROJECT := $(patsubst $(abspath $(dir $(abspath $(lastword $(MAKEFILE_LIST))))..)/%,%,$(PROJECT_PATH))
+# Project name.
+PROJECT := $(notdir $(PROJECT_PATH))
 
 # Target settings.
 MCU = cortex-m4
 
-# Imported source files and paths.
-include ../../kernel/kernel.mk
-CHIBIOS    := $(AMIROOS_KERNEL)
-CONFDIR    := .
+# Module specific paths and directories.
+MODULEDIR := .
+CONFDIR := $(MODULEDIR)
 ifeq ($(BUILDDIR),)
   BUILDDIR := $(PROJECT_PATH)/build
 endif
-DEPDIR     := $(dir $(BUILDDIR)).dep
-AMIROOS    := ../..
-# Licensing files.
-include $(CHIBIOS)/os/license/license.mk
-# Startup files.
+DEPDIR := $(dir $(BUILDDIR)).dep
+
+# Linker script.
+LDSCRIPT= STM32F407xG.ld
+
+# General AMiRo-OS files.
+include ../../amiroos.mk
+
+# Module specific ChibiOS files.
 include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk
-# HAL-OSAL files (optional).
-include $(CHIBIOS)/os/hal/hal.mk
 include $(CHIBIOS)/os/hal/ports/STM32/STM32F4xx/platform.mk
-include $(CHIBIOS)/os/hal/osal/rt/osal.mk
-include $(CHIBIOS)/os/hal/lib/streams/streams.mk
-# RTOS files (optional).
-include $(CHIBIOS)/os/rt/rt.mk
 include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
-# Auto-build files in ./source recursively.
-include $(CHIBIOS)/tools/mk/autobuild.mk
-# Other files (optional).
-include $(CHIBIOS)/test/lib/test.mk
-include $(CHIBIOS)/test/rt/rt_test.mk
-include $(CHIBIOS)/test/oslib/oslib_test.mk
-# AMiRo-BLT files
-include ../../bootloader/bootloader.mk
-# AMiRo-LLD files
-include ../../periphery-lld/periphery-lld.mk
-# AMiRo-OS files
-include ../modules.mk
-include $(AMIROOS)/core/core.mk
-include $(AMIROOS)/unittests/unittests.mk
-
-# Define linker script file here
-LDSCRIPT= STM32F407xG.ld
 
-# C sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CSRC = $(ALLCSRC) \
-       $(CHIBIOS)/os/various/syscalls.c \
-       $(CHIBIOS)/os/various/evtimer.c \
-       $(TESTSRC) \
-       board.c \
-       $(PERIPHERYLLDCSRC) \
-       $(UNITTESTSCSRC) \
-       $(AMIROOSCORECSRC) \
-       $(MODULESCSRC) \
-       module.c \
-       $(APPSCSRC)
-
-# C++ sources that can be compiled in ARM or THUMB mode depending on the global
-# setting.
-CPPSRC = $(ALLCPPSRC) \
-         $(CHIBIOS)/os/various/cpp_wrappers/syscalls_cpp.cpp \
-         $(AMIROOSCORECPPSRC) \
-         $(APPSCPPSRC)
-
-# List ASM source files here.
-ASMSRC = $(ALLASMSRC) \
-         $(APPSASMSRC)
-
-# List ASM with preprocessor source files here.
-ASMXSRC = $(ALLXASMSRC) \
-          $(APPSASMXSRC)
-
-# Inclusion directories.
-INCDIR = $(CONFDIR) \
-         $(ALLINC) \
-         $(TESTINC) \
-         $(CHIBIOS)/os/hal/lib/streams \
-         $(BOOTLOADERINC) \
-         $(PERIPHERYLLDINC) \
-         $(AMIROOS) \
-         $(UNITTESTSINC) \
-         $(AMIROOSCOREINC) \
-         $(MODULESINC) \
-         $(APPSINC)
-
-# Define C warning options here.
+# Periphery LLDs.
+AMIROOS_PERIPHERYLLD_INC += $(AMIROLLD)/drivers/LED/v1 \
+                            $(AMIROLLD)/drivers/button/v1
+
+# Tests.
+AMIROOS_TEST_INC += $(AMIROOS_TEST_DIR)periphery-lld/LED_v1
+
+# Module specific inclusion directories
+MODULE_INC = $(MODULEDIR) \
+             $(wildcard $(MODULEDIR)/test/*)
+
+# Module specific C source files.
+MODULE_CSRC = $(wildcard $(MODULE_INC:%=%/*.[Cc]))
+
+# C warning options.
 CWARN = -Wall -Wextra -Wundef -Wstrict-prototypes
 
-# Define C++ warning options here.
+# C++ warning options.
 CPPWARN = -Wall -Wextra -Wundef
 
 #                                                                              #
diff --git a/modules/STM32F407G-DISC1/halconf.h b/modules/STM32F407G-DISC1/halconf.h
index c87a173..2f234c0 100644
--- a/modules/STM32F407G-DISC1/halconf.h
+++ b/modules/STM32F407G-DISC1/halconf.h
@@ -33,7 +33,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define _CHIBIOS_HAL_CONF_
 #define _CHIBIOS_HAL_CONF_VER_7_0_
 
-#include "mcuconf.h"
+#include <mcuconf.h>
 
 /**
  * @brief   Enables the PAL subsystem.
diff --git a/modules/STM32F407G-DISC1/module.c b/modules/STM32F407G-DISC1/module.c
index 244b961..596d301 100644
--- a/modules/STM32F407G-DISC1/module.c
+++ b/modules/STM32F407G-DISC1/module.c
@@ -168,7 +168,7 @@ ROMCONST char* moduleShellPrompt = "STM32F407Discovery";
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
diff --git a/modules/STM32F407G-DISC1/module.h b/modules/STM32F407G-DISC1/module.h
index 3092959..6de5237 100644
--- a/modules/STM32F407G-DISC1/module.h
+++ b/modules/STM32F407G-DISC1/module.h
@@ -162,7 +162,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interfaces initialization hook.
  */
-#define MODULE_INIT_PERIPHERY_COMM() {                                        \
+#define MODULE_INIT_PERIPHERY_IF() {                                          \
   /* serial driver */                                                         \
   sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
 }
@@ -170,7 +170,7 @@ extern ROMCONST char* moduleShellPrompt;
 /**
  * @brief   Periphery communication interface deinitialization hook.
  */
-#define MODULE_SHUTDOWN_PERIPHERY_COMM() {                                    \
+#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
 }
 
 /**
@@ -209,7 +209,7 @@ extern ROMCONST char* moduleShellPrompt;
 
 /*===========================================================================*/
 /**
- * @name Unit tests (UT)
+ * @name Tests
  * @{
  */
 /*===========================================================================*/
diff --git a/modules/modules.mk b/modules/modules.mk
index e0206d5..7e0272d 100644
--- a/modules/modules.mk
+++ b/modules/modules.mk
@@ -24,11 +24,11 @@
 
 
 # absolute path to this directory
-MODULES_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+AMIROOS_MODULES_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
 
 # include paths
-MODULESINC = $(MODULES_DIR)
+AMIROOS_MODULES_INC = $(AMIROOS_MODULES_DIR:/=)
 
 # C source files
-MODULESCSRC =
+AMIROOS_MODULES_CSRC =
 
diff --git a/periphery-lld/AMiRo-LLD b/periphery-lld/AMiRo-LLD
index 1473a57..9466e34 160000
--- a/periphery-lld/AMiRo-LLD
+++ b/periphery-lld/AMiRo-LLD
@@ -1 +1 @@
-Subproject commit 1473a57f96b8bcbcac3400ca3458b7a08fed5881
+Subproject commit 9466e34d0601c3e9e7c0627a1bf5d8e88bf40a92
diff --git a/periphery-lld/periphery-lld.mk b/periphery-lld/periphery-lld.mk
index d0c0442..79e276d 100644
--- a/periphery-lld/periphery-lld.mk
+++ b/periphery-lld/periphery-lld.mk
@@ -24,15 +24,16 @@
 
 
 # absolute path to this directory
-PERIPHERYLLD_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+AMIRO_PERIPHERYLLD_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
 
-include $(PERIPHERYLLD_DIR)AMiRo-LLD/Makefile
+# set AMiRo-LLD path variable
+AMIROLLD := $(AMIRO_PERIPHERYLLD_DIR)AMiRo-LLD
 
-# include path
-PERIPHERYLLDINC = $(AMIROLLD_INC) \
-                  $(PERIPHERYLLD_DIR:/=)
+# include paths
+AMIROOS_PERIPHERYLLD_INC = $(AMIROLLD) \
+                           $(AMIRO_PERIPHERYLLD_DIR:/=)
 
-# C sources
-PERIPHERYLLDCSRC = $(AMIROLLD_CSRC) \
-                   $(PERIPHERYLLD_DIR)periphAL.c
+# C source files
+AMIROOS_PERIPHERYLLD_CSRC = $(AMIROLLD_CSRC) \
+                            $(wildcard $(AMIROOS_PERIPHERYLLD_INC:%=%/*.[Cc]))
 
diff --git a/test/lld/adc/aos_test_adc.c b/test/lld/adc/aos_test_adc.c
new file mode 100644
index 0000000..d72bc1c
--- /dev/null
+++ b/test/lld/adc/aos_test_adc.c
@@ -0,0 +1,177 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_adc.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == TRUE) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/**
+ * @brief   Event mask of the ADC analog watchdog event.
+ */
+#define _adcWdgEventmask                        EVENT_MASK(31)
+
+/**
+ * @brief   ADC analog watchdog threshold (9.0V).
+ */
+#define _adcWdgThreshold                        (uint16_t)(9.0f / 5.0f / 3.3f * ((1 << 12) - 1) + 0.5f)
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/**
+ * @brief   Pointer to the thread listening for an ADC analog watchdog event.
+ */
+static thread_t* _listener;
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/**
+ * @brief   Helper function to convert ADC sample value to volts.
+ *
+ * @param[in] adc   ADC sample value.
+ *
+ * @return          Converted value in volts.
+ */
+static inline float _adc2volt(adcsample_t adc) {
+  return (float)adc / ((1 << 12) - 1) * 3.3f * 5.0f;
+}
+
+/**
+ * @brief   ADC analog watchdog callback function.
+ *
+ * @param[in] adcp  ADC driver.
+ * @param[in] err   ADC error value.
+ */
+static void _adcAwdCb(ADCDriver* adcp, adcerror_t err)
+{
+  (void)adcp;
+
+  if (err == ADC_ERR_WATCHDOG) {
+    chSysLockFromISR();
+    if (_listener != NULL) {
+      chEvtSignalI(_listener, _adcWdgEventmask);
+      _listener = NULL;
+    }
+    chSysUnlockFromISR();
+  }
+
+  return;
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   ADC test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestAdcFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_adcdata_t*)(test->data))->driver != NULL && ((aos_test_adcdata_t*)(test->data))->convgroup != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  adcsample_t buffer[1] = {0};
+  bool wdgpassed = false;
+  eventmask_t eventmask = 0;
+  ADCConversionGroup conversionGroup = *(((aos_test_adcdata_t*)(test->data))->convgroup);
+  conversionGroup.circular = true;
+  conversionGroup.end_cb = NULL;
+  conversionGroup.end_cb = NULL;
+  conversionGroup.htr = ADC_HTR_HT;
+  conversionGroup.ltr = 0;
+
+  chprintf(stream, "reading voltage for five seconds...\n");
+  adcStartConversion(((aos_test_adcdata_t*)(test->data))->driver, &conversionGroup, buffer, 1);
+  for (uint8_t s = 0; s < 5; ++s) {
+    aosThdSSleep(1);
+    chprintf(stream, "\tVSYS = %fV\n", _adc2volt(buffer[0]));
+  }
+  adcStopConversion(((aos_test_adcdata_t*)(test->data))->driver);
+  if (buffer[0] != 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "detecting external power...\n");
+  conversionGroup.error_cb = _adcAwdCb;
+  conversionGroup.htr = _adcWdgThreshold;
+  conversionGroup.ltr = _adcWdgThreshold;
+  _listener = chThdGetSelfX();
+  adcStartConversion(((aos_test_adcdata_t*)(test->data))->driver, &conversionGroup, buffer, 1);
+  eventmask = chEvtWaitOneTimeout(_adcWdgEventmask, chTimeS2I(5));
+  if (eventmask == _adcWdgEventmask) {
+    aosTestPassedMsg(stream, &result, "%fV %c 9V\n", _adc2volt(buffer[0]), (buffer[0] > _adcWdgThreshold) ? '>' : '<');
+    wdgpassed = true;
+  } else {
+    adcStopConversion(((aos_test_adcdata_t*)(test->data))->driver);
+    aosTestFailed(stream, &result);
+    wdgpassed = false;
+  }
+
+  if (wdgpassed) {
+    for (uint8_t i = 0; i < 2; ++i) {
+      if (buffer[0] > _adcWdgThreshold) {
+        chprintf(stream, "Remove external power within ten seconds.\n");
+        conversionGroup.htr = ADC_HTR_HT;
+        conversionGroup.ltr = _adcWdgThreshold;
+      } else {
+        chprintf(stream, "Connect external power within ten seconds.\n");
+        conversionGroup.htr = _adcWdgThreshold;
+        conversionGroup.ltr = 0;
+      }
+      aosThdMSleep(100); // wait some time so the ADC wil trigger again immediately due to noise
+      _listener = chThdGetSelfX();
+      adcStartConversion(((aos_test_adcdata_t*)(test->data))->driver, &conversionGroup, buffer, 1);
+      eventmask = chEvtWaitOneTimeout(_adcWdgEventmask, chTimeS2I(10));
+      if (eventmask == _adcWdgEventmask) {
+        aosTestPassedMsg(stream, &result, "%fV %c 9V\n", _adc2volt(buffer[0]), (buffer[0] > _adcWdgThreshold) ? '>' : '<');
+      } else {
+        adcStopConversion(((aos_test_adcdata_t*)(test->data))->driver);
+        aosTestFailed(stream, &result);
+        break;
+      }
+    }
+  }
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == TRUE) */
diff --git a/test/lld/adc/aos_test_adc.h b/test/lld/adc/aos_test_adc.h
new file mode 100644
index 0000000..49f90e4
--- /dev/null
+++ b/test/lld/adc/aos_test_adc.h
@@ -0,0 +1,80 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_ADC_H
+#define AMIROOS_TEST_ADC_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == TRUE) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  ADCDriver* driver;
+
+  /**
+   * @brief   Pointer to the conversion group to use.
+   */
+  ADCConversionGroup* convgroup;
+} aos_test_adcdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestAdcFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == TRUE) */
+
+#endif /* AMIROOS_TEST_ADC_H */
+
diff --git a/test/periphery-lld/A3906_v1/aos_test_A3906.c b/test/periphery-lld/A3906_v1/aos_test_A3906.c
new file mode 100644
index 0000000..fd6c47a
--- /dev/null
+++ b/test/periphery-lld/A3906_v1/aos_test_A3906.c
@@ -0,0 +1,290 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_A3906.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <stdlib.h>
+#include <math.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/**
+ * @brief   Interval to poll QEI in certain tests.
+ */
+#define QEI_POLL_INTERVAL_MS          100
+
+/**
+ * @brief   Threshold for QEI differences.
+ * @details Differences smaller than or equal to this value are neglected (interpreted as zero).
+ *          The value can be interpreted as encoder ticks per second (tps).
+ * @note    The expected value is about 7000 tps and a jitter of up to ±2% is ok.
+ */
+#define QEI_DIFF_THRESHOLD            (apalQEICount_t)(7000 * 0.02f)
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/**
+ * @brief   Enumerator to distinguish between left and right wheel.
+ */
+typedef enum {
+  WHEEL_LEFT    = 0,  /**< left wheel identifier */
+  WHEEL_RIGHT   = 1,  /**< right wheel identifier */
+} wheel_t;
+
+/**
+ * @brief   Enumerator to distinguish directions.
+ */
+typedef enum {
+  DIRECTION_FORWARD   = 0,  /**< forward direction identifier */
+  DIRECTION_BACKWARD  = 1,  /**< backward direction identifier */
+} direction_t;
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/**
+ * @brief   helper function to test each wheel and direction separately.
+ *
+ * @param[in] stream      Stream for input/output.
+ * @param[in] data        Test meta data.
+ * @param[in] wheel       Wheel to test.
+ * @param[in] direction   Direction to test.
+ * @param[in,out] result  Result variable to modify.
+ */
+void _wheelDirectionTest(BaseSequentialStream* stream, aos_test_a3906data_t* data, wheel_t wheel, direction_t direction, aos_testresult_t* result)
+{
+  // local variables
+  uint32_t status;
+  bool qei_valid;
+  apalQEICount_t qei_count[2];
+  apalQEIDirection_t qei_direction;
+  uint32_t timeout_counter;
+
+  chprintf(stream, "%s wheel %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
+  qei_valid = false;
+  status = apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
+  // increase PWM incrementally and read QEI data
+  for (apalPWMwidth_t pwm_width = APAL_PWM_WIDTH_MIN; pwm_width < APAL_PWM_WIDTH_MAX; ++pwm_width) {
+    status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                                pwm_width);
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
+    qei_valid = qei_valid || (qei_count[0] != qei_count[1]);
+    aosThdUSleep(5 * MICROSECONDS_PER_SECOND / (APAL_PWM_WIDTH_MAX - APAL_PWM_WIDTH_MIN));
+    qei_count[0] = qei_count[1];
+  }
+  status |= qei_valid ? 0x00 : 0x10;
+  status |= apalQEIGetDirection((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_direction);
+  status |= (qei_direction == ((direction == DIRECTION_FORWARD) ? APAL_QEI_DIRECTION_UP : APAL_QEI_DIRECTION_DOWN)) ? 0x00 : 0x20;
+
+  // let the wheel spin free until it stops
+  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                              0);
+  qei_count[0] = 0;
+  qei_count[1] = 0;
+  timeout_counter = 0;
+  do {
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
+    aosThdMSleep(1);
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
+    ++timeout_counter;
+  } while ((qei_count[0] != qei_count[1]) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
+  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
+
+  // report result
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, result);
+  } else {
+    aosTestFailedMsg(stream, result, "0x%08X\n", status);
+  }
+
+  return;
+}
+
+void _wheelSpeedTest(BaseSequentialStream* stream, aos_test_a3906data_t* data, wheel_t wheel, direction_t direction, aos_testresult_t* result)
+{
+  // local variables
+  uint32_t status;
+  apalQEICount_t qei_range;
+  apalQEICount_t qei_count[2] = {0};
+  apalQEICount_t qei_increments[2] = {0};
+  apalQEICount_t qei_increments_diff = 0;
+  uint32_t timeout_counter = 0;
+  uint32_t stable_counter = 0;
+
+  chprintf(stream, "%s wheel full speed %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
+  // spin up the wheel with full speed
+  status = apalQEIGetRange((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_range);
+  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                             APAL_PWM_WIDTH_MAX);
+  aosThdMSleep(100);
+  do {
+    // read QEI data to determine speed
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
+    aosThdMSleep(QEI_POLL_INTERVAL_MS);
+    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
+    timeout_counter += QEI_POLL_INTERVAL_MS;
+    qei_increments[0] = qei_increments[1];
+    qei_increments[1] = (direction == DIRECTION_FORWARD) ?
+                          ((qei_count[1] > qei_count[0]) ? (qei_count[1] - qei_count[0]) : (qei_count[1] + (qei_range - qei_count[0]))) :
+                          ((qei_count[0] > qei_count[1]) ? (qei_count[0] - qei_count[1]) : (qei_count[0] + (qei_range - qei_count[1])));
+    qei_increments_diff = abs((int32_t)qei_increments[0] - (int32_t)qei_increments[1]) * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
+    stable_counter = ((qei_increments[0] != 0 || qei_increments[1] != 0) && qei_increments_diff <= QEI_DIFF_THRESHOLD) ? stable_counter+1 : 0;
+    if (qei_increments[0] != 0 && stable_counter == 0) {
+      chprintf(stream, "\tunstable speed? jitter of %u tps is above threshold (%u tps).\n", qei_increments_diff, QEI_DIFF_THRESHOLD);
+    }
+  } while ((stable_counter* QEI_POLL_INTERVAL_MS < MILLISECONDS_PER_SECOND) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
+  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
+                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
+                             APAL_PWM_WIDTH_OFF);
+  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
+
+  // report results
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, result);
+    const float tps = qei_increments[1] * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
+    const float rpm = tps * SECONDS_PER_MINUTE / (float)data->qei.increments_per_revolution;
+    const float velocity = tps / (float)data->qei.increments_per_revolution * ((wheel == WHEEL_LEFT) ? data->wheel_diameter.left : data->wheel_diameter.right) * acos(-1);
+    chprintf(stream, "\t%f tps\n", tps);
+    chprintf(stream, "\t%f RPM\n", rpm);
+    chprintf(stream, "\t%f m/s\n", velocity);
+    chprintf(stream, "\n");
+  }
+  else {
+    aosTestFailedMsg(stream, result, "0x%08X\n", status);
+  }
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   A3905 test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestA3906Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck((test->data != NULL) &&
+              (((aos_test_a3906data_t*)test->data)->driver != NULL) &&
+              (((aos_test_a3906data_t*)test->data)->pwm.driver != NULL) &&
+              (((aos_test_a3906data_t*)test->data)->qei.left != NULL) &&
+              (((aos_test_a3906data_t*)test->data)->qei.right != NULL));
+
+
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status = 0;
+  a3906_lld_power_t power_state;
+  apalQEICount_t qei_count[2][2];
+  uint32_t timeout_counter;
+  uint32_t stable_counter;
+
+  chprintf(stream, "enable power...\n");
+  power_state = A3906_LLD_POWER_ON;
+  status = a3906_lld_set_power(((aos_test_a3906data_t*)test->data)->driver, power_state);
+  status |= a3906_lld_get_power(((aos_test_a3906data_t*)test->data)->driver, &power_state);
+  status |= (power_state != A3906_LLD_POWER_ON) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  _wheelDirectionTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
+
+  _wheelDirectionTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
+
+  _wheelDirectionTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
+
+  _wheelDirectionTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
+
+  _wheelSpeedTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
+
+  _wheelSpeedTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
+
+  _wheelSpeedTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
+
+  _wheelSpeedTest(stream, (aos_test_a3906data_t*)test->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
+
+  chprintf(stream, "disable power...\n");
+  power_state = A3906_LLD_POWER_OFF;
+  status = a3906_lld_set_power(((aos_test_a3906data_t*)test->data)->driver, power_state);
+  status |= a3906_lld_get_power(((aos_test_a3906data_t*)test->data)->driver, &power_state);
+  status |= (power_state != A3906_LLD_POWER_OFF) ? 0x10 : 0x00;
+  qei_count[WHEEL_LEFT][0] = 0;
+  qei_count[WHEEL_LEFT][1] = 0;
+  qei_count[WHEEL_RIGHT][0] = 0;
+  qei_count[WHEEL_RIGHT][1] = 0;
+  timeout_counter = 0;
+  stable_counter = 0;
+  do {
+    status |= apalQEIGetPosition(((aos_test_a3906data_t*)test->data)->qei.left, &qei_count[WHEEL_LEFT][0]);
+    status |= apalQEIGetPosition(((aos_test_a3906data_t*)test->data)->qei.right, &qei_count[WHEEL_RIGHT][0]);
+    aosThdMSleep(1);
+    status |= apalQEIGetPosition(((aos_test_a3906data_t*)test->data)->qei.left, &qei_count[WHEEL_LEFT][1]);
+    status |= apalQEIGetPosition(((aos_test_a3906data_t*)test->data)->qei.right, &qei_count[WHEEL_RIGHT][1]);
+    ++timeout_counter;
+    stable_counter = (qei_count[WHEEL_LEFT][0] == qei_count[WHEEL_LEFT][1] && qei_count[WHEEL_RIGHT][0] == qei_count[WHEEL_RIGHT][1]) ? stable_counter+1 : 0;
+  } while((stable_counter < 100) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= ((aos_test_a3906data_t*)test->data)->timeout));
+  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > ((aos_test_a3906data_t*)test->data)->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // stop the PWM
+  a3906_lld_set_pwm(((aos_test_a3906data_t*)test->data)->pwm.driver, ((aos_test_a3906data_t*)test->data)->pwm.channel.left_forward, APAL_PWM_WIDTH_OFF);
+  a3906_lld_set_pwm(((aos_test_a3906data_t*)test->data)->pwm.driver, ((aos_test_a3906data_t*)test->data)->pwm.channel.left_backward, APAL_PWM_WIDTH_OFF);
+  a3906_lld_set_pwm(((aos_test_a3906data_t*)test->data)->pwm.driver, ((aos_test_a3906data_t*)test->data)->pwm.channel.right_forward, APAL_PWM_WIDTH_OFF);
+  a3906_lld_set_pwm(((aos_test_a3906data_t*)test->data)->pwm.driver, ((aos_test_a3906data_t*)test->data)->pwm.channel.right_backward, APAL_PWM_WIDTH_OFF);
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(A3906Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/A3906_v1/aos_test_A3906.h b/test/periphery-lld/A3906_v1/aos_test_A3906.h
new file mode 100644
index 0000000..03423f4
--- /dev/null
+++ b/test/periphery-lld/A3906_v1/aos_test_A3906.h
@@ -0,0 +1,151 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_A3906_H
+#define AMIROOS_TEST_A3906_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_A3906.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  A3906Driver* driver;
+
+  /**
+   * @brief   PWM driver information.
+   */
+  struct {
+    /**
+     * @brief   The PWM driver to use.
+     */
+    apalPWMDriver_t* driver;
+
+    /**
+     * @brief   PWM channel information.
+     */
+    struct {
+      /**
+     * @brief   PWM channel for the left wheel forward direction.
+     */
+      apalPWMchannel_t left_forward;
+
+      /**
+     * @brief   PWM channel for the left wheel backward direction.
+     */
+      apalPWMchannel_t left_backward;
+
+      /**
+     * @brief   PWM channel for the right wheel forward direction.
+     */
+      apalPWMchannel_t right_forward;
+
+      /**
+     * @brief   PWM channel for the right wheel backward direction.
+     */
+      apalPWMchannel_t right_backward;
+    } channel;
+  } pwm;
+
+  /**
+   * @brief   QEI driver information
+   */
+  struct {
+    /**
+     * @brief   QEI driver for the left wheel.
+     */
+    apalQEIDriver_t* left;
+
+    /**
+     * @brief   QEI driver for the right wheel.
+     */
+    apalQEIDriver_t* right;
+
+    /**
+     * @brief   QEI increments per wheel revolution.
+     */
+    apalQEICount_t increments_per_revolution;
+  } qei;
+
+  /**
+   * @brief   Wheel diameter information.
+   */
+  struct {
+    /**
+     * @brief   Left wheel diameter in m.
+     */
+    float left;
+
+    /**
+     * @brief   Right wheel diameter in m.
+     */
+    float right;
+  } wheel_diameter;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} aos_test_a3906data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestA3906Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_A3906_H */
diff --git a/test/periphery-lld/AT24C01B_v1/aos_test_AT24C01B.c b/test/periphery-lld/AT24C01B_v1/aos_test_AT24C01B.c
new file mode 100644
index 0000000..b230837
--- /dev/null
+++ b/test/periphery-lld/AT24C01B_v1/aos_test_AT24C01B.c
@@ -0,0 +1,227 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_AT24C01B.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/**
+ * @brief   EEPROM address for page write/read access.
+ */
+#define _pageAddress                  (AT24C01B_LLD_SIZE_BYTES - 2*AT24C01B_LLD_PAGE_SIZE_BYTES)
+
+/**
+ * @brief   EEPROM address for byte write/read access.
+ */
+#define _byteAddress                  (_pageAddress + AT24C01B_LLD_PAGE_SIZE_BYTES - 1)
+
+/**
+ * @brief   Offset for overflow tests.
+ */
+#define _overflowOffset               3
+
+/**
+ * @brief   EEPROM address for page write/read access with overflow.
+ */
+#define _overflowAddress              (_pageAddress + _overflowOffset)
+
+/**
+ * @brief   Test data byte.
+ */
+#define _bytedata                     0xA5
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   AT24C01B test function.
+ *
+ * @param[in] stream  Stream for inout/outout.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestAt24c01bFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_at24c01bdata_t*)(test->data))->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status = 0;
+  uint8_t page_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
+  uint8_t original_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
+  uint8_t read_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
+  size_t errors = 0;
+  for (size_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; ++dataIdx) {
+    page_data[dataIdx] = dataIdx;
+  }
+
+  chprintf(stream, "reading byte...\n");
+  status = at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, original_data, 1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing byte...\n");
+  status = at24c01b_lld_write_byte(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, _bytedata, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  while (at24c01b_lld_poll_ack(((aos_test_at24c01bdata_t*)(test->data))->driver, ((aos_test_at24c01bdata_t*)(test->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, &read_data[0], 1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  status |= (read_data[0] == _bytedata) ? 0x00 : 0x20;
+  status = at24c01b_lld_write_byte(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, (uint8_t)~_bytedata, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  while (at24c01b_lld_poll_ack(((aos_test_at24c01bdata_t*)(test->data))->driver, ((aos_test_at24c01bdata_t*)(test->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, &read_data[1], 1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  status |= (read_data[1] == (uint8_t)~_bytedata) ? 0x00 : 0x40;
+  status |= at24c01b_lld_write_byte(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, original_data[0], ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  while (at24c01b_lld_poll_ack(((aos_test_at24c01bdata_t*)(test->data))->driver, ((aos_test_at24c01bdata_t*)(test->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _byteAddress, &read_data[2], 1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  status |= (read_data[2] == original_data[0]) ? 0x00 : 0x80;
+  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading page...\n");
+  status = at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _pageAddress, original_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing page...\n");
+  status = at24c01b_lld_write_page(((aos_test_at24c01bdata_t*)(test->data))->driver, _pageAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  while (at24c01b_lld_poll_ack(((aos_test_at24c01bdata_t*)(test->data))->driver, ((aos_test_at24c01bdata_t*)(test->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _pageAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  errors = 0;
+  for (size_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "reading page at current address...\n");
+  // set address counter to UT_ALLD_AT24C01B_PAGE_ADDRESS
+  status = at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _pageAddress-1, read_data, 1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_WARNING) {
+    // on STM32F1 platform the address gets incremented by 2 after reading
+    status = at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _pageAddress-2, read_data, 1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  }
+  // read page from the current address
+  status = at24c01b_lld_read_current_address(((aos_test_at24c01bdata_t*)(test->data))->driver, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < 8; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "writing page with overflow (7 bytes)...\n");
+  status = at24c01b_lld_write_page(((aos_test_at24c01bdata_t*)(test->data))->driver, _overflowAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES-1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  while (at24c01b_lld_poll_ack(((aos_test_at24c01bdata_t*)(test->data))->driver, ((aos_test_at24c01bdata_t*)(test->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _overflowAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset-1, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES-1; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "writing page with overflow (8 bytes)...\n");
+  status = at24c01b_lld_write_page(((aos_test_at24c01bdata_t*)(test->data))->driver, _overflowAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  while (at24c01b_lld_poll_ack(((aos_test_at24c01bdata_t*)(test->data))->driver, ((aos_test_at24c01bdata_t*)(test->data))->timeout) == APAL_STATUS_FAILURE) {
+    continue;
+  }
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _overflowAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  status |= at24c01b_lld_read(((aos_test_at24c01bdata_t*)(test->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; dataIdx++) {
+    if (read_data[dataIdx] != page_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_OK && errors == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
+  }
+
+  chprintf(stream, "write back original data...\n");
+  status = at24c01b_lld_write_page(((aos_test_at24c01bdata_t*)(test->data))->driver, _pageAddress, original_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((aos_test_at24c01bdata_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT24C01BDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/AT24C01B_v1/aos_test_AT24C01B.h b/test/periphery-lld/AT24C01B_v1/aos_test_AT24C01B.h
new file mode 100644
index 0000000..e3763a4
--- /dev/null
+++ b/test/periphery-lld/AT24C01B_v1/aos_test_AT24C01B.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_AT24C01B_H
+#define AMIROOS_TEST_AT24C01B_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_AT24C01B.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  AT24C01BDriver* driver;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} aos_test_at24c01bdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestAt24c01bFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_AT24C01B_H */
diff --git a/test/periphery-lld/AT42QT1050_v1/aos_test_AT42QT1050.c b/test/periphery-lld/AT42QT1050_v1/aos_test_AT42QT1050.c
new file mode 100644
index 0000000..b20c9d1
--- /dev/null
+++ b/test/periphery-lld/AT42QT1050_v1/aos_test_AT42QT1050.c
@@ -0,0 +1,358 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_AT42QT1050.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+void print_settings(apalExitStatus_t* status, BaseSequentialStream* stream, const aos_test_t* test) {
+    chprintf(stream, "settings...\n");
+
+    uint8_t test8;
+    at42qt1050_lld_register_t txbuf;
+    *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_LOWPOWERMODE, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    chprintf(stream, "\tmeasurement inverval %d ms\n", test8*8);
+
+    *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_MAXONDURATION, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    chprintf(stream, "\tMax on duration %d ms\n", test8*160);
+
+    *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_FINFOUTMAXCALGUARD, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    chprintf(stream, "\tFast In %d, Fast Out, %d MaxCal %d\n\tGuard channel ",
+             test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_FI,     //enter fast mode whenever an unfiltered signal value is detected
+             test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_FO,     //DI of 4 (global setting for all keys)
+             test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_MAXCAL);//recalibrate ALL KEYS after a Max On Duration timeout vs. individually
+
+    //guard channel (which gets priority filtering)
+    if((test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_GUARD) > AT42QT1050_LLD_NUM_KEYS-1)
+        chprintf(stream, "off");
+    else
+        chprintf(stream, " %d", test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_GUARD);
+
+    chprintf(stream, "\n\n\tkey\tgroup\tintegr.\tdelay\tthresh.\tpulse\tscale\n");
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+        chprintf(stream, "\t%d\t", key);
+        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_INTEGRATOR_AKS_0, key);
+        *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        if(!((at42qt1050_lld_detectionintegratoraksreg_t)test8).aks)
+            chprintf(stream, "none\t");
+        else
+            chprintf(stream, "%d\t", ((at42qt1050_lld_detectionintegratoraksreg_t)test8).aks);
+
+        if(!((at42qt1050_lld_detectionintegratoraksreg_t)test8).detection_integrator)
+            chprintf(stream, "off");
+        else
+            chprintf(stream, "%d", ((at42qt1050_lld_detectionintegratoraksreg_t)test8).detection_integrator);
+
+        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_CHARGESHAREDELAY_0, key);
+        *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        chprintf(stream, "\t+%d", test8);
+
+        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
+        *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        chprintf(stream, "\t%d", test8);
+
+        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_PULSE_SCALE_0, key);
+        *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &test8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        chprintf(stream, "\t%d\t%d\n", ((at42qt1050_lld_pulsescalereg_t)test8).pulse, ((at42qt1050_lld_pulsescalereg_t)test8).scale);
+    }
+
+}
+
+void show_live(const uint8_t first_key, apalExitStatus_t* status,
+               BaseSequentialStream* stream, const aos_test_t* test) {
+
+    apalDbgAssert(first_key<5);
+
+    event_listener_t event_listener;
+    aos_timestamp_t tcurrent, tend ,tdemo_end;
+
+    //stop demo after 15 seconds
+    aosSysGetUptime(&tcurrent);
+    tdemo_end = tcurrent + 15*MICROSECONDS_PER_SECOND;
+
+    uint8_t keyStatus, detectionStatus;
+    uint16_t signal, reference;
+    uint8_t threshold[AT42QT1050_LLD_NUM_KEYS];
+
+    chprintf(stream, "key, count, ref, signal, [threshold], \033[31mtouch\n\033[0m");
+
+    //get thresholds
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
+        *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &threshold[key], ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    }
+    chEvtRegister(((aos_test_at42qt1050data_t*)test->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
+    while(true) {
+        aosSysGetUptime(&tcurrent);
+
+        for (uint8_t key = first_key; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+
+            //highlight touched key
+            *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_KEYSTATUS, &keyStatus, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+            if((key == 0 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY0)
+                    || (key == 1 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY1)
+                    || (key == 2 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY2)
+                    || (key == 3 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY3)
+                    || (key == 4 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY4))
+                chprintf(stream, "\033[31m"); //red
+            else
+                chprintf(stream, "\033[0m"); //black
+
+            *status |= at42qt1050_lld_read_keyssignal(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, key, &signal, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+            *status |= at42qt1050_lld_read_referencedata(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, key, &reference, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+
+            const uint16_t dist = (signal<reference?0:signal-reference);
+            chprintf(stream, "\033[Kkey %d, %d\t0x%04X 0x%04X [", key, dist, reference, signal);
+            uint16_t stars=0;
+            for(; stars < dist; stars++) {
+                chprintf(stream, "0");
+                if(stars > 40) {           //max_stars = 40
+                    chprintf(stream, "+"); //more than max_stars
+                    break;
+                }
+            }
+            for(; stars < threshold[key]; stars++)
+                chprintf(stream, " ");
+            if(stars == threshold[key])
+                chprintf(stream, "]");
+            chprintf(stream, "\n\033[0m");
+        }
+
+        //wait 1/3 second for a touch event
+        tend = tcurrent + (MICROSECONDS_PER_SECOND/3);
+        const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(tend));
+        const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
+        if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((aos_test_at42qt1050data_t*)test->data)->evtflags) {
+            // interrupt detected
+            chprintf(stream, "interrupt ");
+        } // else: timeout
+
+        *status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_DETECTIONSTATUS, &detectionStatus, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        if(detectionStatus & AT42QT1050_LLD_DETECTIONSTATUS_TOUCH)
+            chprintf(stream, "touch ");
+        if(detectionStatus & AT42QT1050_LLD_DETECTIONSTATUS_OVERFLOW)
+            chprintf(stream, "overflow ");
+        if(detectionStatus & AT42QT1050_LLD_DETECTIONSTATUS_CALIBRATE)
+            chprintf(stream, "calibrate");
+        chprintf(stream, "\033[K");
+
+        if(tcurrent > tdemo_end)
+            break;
+
+        chprintf(stream, "\033[%dF", 5-first_key); //cursor up
+    }
+    chEvtUnregister(((aos_test_at42qt1050data_t*)test->data)->evtsource, &event_listener);
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestAt42qt1050Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+    aosDbgCheck(test->data != NULL && ((aos_test_at42qt1050data_t*)test->data)->at42qt1050d != NULL);
+
+    // local variables
+    aos_testresult_t result = {0, 0};
+    apalExitStatus_t status;
+    uint8_t test_8;
+    bool error;
+
+    chprintf(stream, "read register...\n");
+    error = false;
+    status = at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_CHIPID, &test_8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    chprintf(stream, "\t\tchip ID: 0x%02X\n", test_8);
+    if (test_8 != AT42QT1050_LLD_CHIPID)
+        error = true;
+    status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_FIRMWAREVERSION, &test_8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    chprintf(stream, "\t\tfirmware version: %u.%u (0x%02X)\n", ((at42qt1050_lld_firmwarereg_t)test_8).major, ((at42qt1050_lld_firmwarereg_t)test_8).minor, test_8);
+    if (status == APAL_STATUS_SUCCESS && !error) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    chprintf(stream, "write and readback threshold data...\n");
+    status = APAL_STATUS_OK;
+    const uint8_t threshold_test = 0x40;
+    error = false;
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
+        status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, threshold_test , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &test_8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        if(test_8 != threshold_test)
+            error = true;
+    }
+    if (status == APAL_STATUS_SUCCESS  &&  !error) {
+        aosTestPassedMsg(stream, &result, "Set thresholds successfull to 0x%04X\n", threshold_test);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    chprintf(stream, "guarding...\nincrease charge_delay0\ndisable multitouch\n");
+
+    //channel 0 is to big to be charged in the default cycle
+    status = at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_CHARGESHAREDELAY_0, 128 , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+
+    //set all channel to group 1 -> only 1 simultaneous touch in group = single touch
+    at42qt1050_lld_detectionintegratoraksreg_t detectionintegrator;
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_INTEGRATOR_AKS_0, key);
+        detectionintegrator.aks = 1;                  //on touch per group-id simultaneous
+        detectionintegrator.detection_integrator = 4; //4 times > threshold => touchevent
+        status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, detectionintegrator.raw, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    }
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    chprintf(stream, "reset device...\n");
+    status = at42qt1050_lld_reset(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, ((aos_test_at42qt1050data_t*)test->data)->timeout, true);
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    chprintf(stream, "read threshold data again...\n");
+    status = APAL_STATUS_OK;
+    const uint8_t threshold_default = 20;
+    error = false;
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
+        status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, &test_8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        if(test_8 != threshold_default)
+            error = true;
+    }
+
+    if (status == APAL_STATUS_SUCCESS && !error) {
+        aosTestPassedMsg(stream, &result, "threshold 0x%04X = default\n", threshold_default);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    chprintf(stream, "demo of default configuration:\n");
+    status = APAL_STATUS_OK;
+    show_live(0, &status, stream, test);
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    status = APAL_STATUS_OK;
+    chprintf(stream, "write configuration...\npuls + scale + threshold 8\n");
+    at42qt1050_lld_pulsescalereg_t pulse_scale;
+    //values stored as exponent of 2
+    pulse_scale.pulse = 0; // accumulate #pulses -> increase resolution & time to acquire
+    pulse_scale.scale = 0; // scale = average factor n: NewAvg = (NewData/n) + [OldAvg*(n-1/n)] -> decrease noise
+    status  = at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_0, pulse_scale.raw , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    pulse_scale.pulse = 1;
+    status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_3, pulse_scale.raw , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+
+    pulse_scale.pulse = 4;
+    status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, pulse_scale.raw , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_2, pulse_scale.raw , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+
+    status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_4, pulse_scale.raw , ((aos_test_at42qt1050data_t*)test->data)->timeout);
+
+    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
+        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
+        status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, txbuf, 8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    }
+    chprintf(stream, "disable guard key\n");
+    status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_INTEGRATOR_AKS_0, 0 , ((aos_test_at42qt1050data_t*)test->data)->timeout); //disable key
+    status |= at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_FINFOUTMAXCALGUARD, 8 , ((aos_test_at42qt1050data_t*)test->data)->timeout); //disable feature
+
+    chprintf(stream, "calibrate...\n");
+    status = at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_RESET_CALIBRATE, AT42QT1050_LLD_RESETCALIBRATE_CALIBRATE, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+
+
+
+    //wait for calibration to complete
+    error = true;
+    for(uint8_t i=0; i<0xFF; i++) {
+        usleep(10);
+        status |= at42qt1050_lld_read_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_DETECTIONSTATUS, &test_8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+        if(!(test_8 & AT42QT1050_LLD_DETECTIONSTATUS_CALIBRATE)) {
+            error = false;
+            break;
+        }
+    }
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+    chprintf(stream, "demo of custom configuration:\n");
+    status = APAL_STATUS_OK;
+    show_live(1, &status, stream, test);
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    status = APAL_STATUS_OK;
+    print_settings(&status, stream, test);
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    chprintf(stream, "shutdown touch\n");
+    test_8 = 0; //Power down
+    status = at42qt1050_lld_write_reg(((aos_test_at42qt1050data_t*)test->data)->at42qt1050d, AT42QT1050_LLD_REG_LOWPOWERMODE, test_8, ((aos_test_at42qt1050data_t*)test->data)->timeout);
+    if (status == APAL_STATUS_SUCCESS) {
+        aosTestPassed(stream, &result);
+    } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+
+    aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT42QT1050Driver));
+
+    return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/AT42QT1050_v1/aos_test_AT42QT1050.h b/test/periphery-lld/AT42QT1050_v1/aos_test_AT42QT1050.h
new file mode 100644
index 0000000..afd24df
--- /dev/null
+++ b/test/periphery-lld/AT42QT1050_v1/aos_test_AT42QT1050.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_AT42QT1050_H
+#define AMIROOS_TEST_AT42QT1050_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_AT42QT1050.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the AT42QT1050 driver to use.
+   */
+  AT42QT1050Driver* at42qt1050d;
+
+  /**
+   * @brief   Timeout value (in µs).
+   */
+  apalTime_t timeout;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} aos_test_at42qt1050data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestAt42qt1050Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_AT42QT1050_H */
diff --git a/test/periphery-lld/DW1000_v1/aos_test_DW1000.c b/test/periphery-lld/DW1000_v1/aos_test_DW1000.c
new file mode 100644
index 0000000..84bbd0e
--- /dev/null
+++ b/test/periphery-lld/DW1000_v1/aos_test_DW1000.c
@@ -0,0 +1,405 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_DW1000.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <aos_debug.h>
+#include <chprintf.h>
+#include <aos_thread.h>
+#include <math.h>
+#include <module.h>
+#include <alld_DW1000.h>
+#include <deca_instance.h>
+
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+//#define TEST_SNIPPETS_DW1000   // switch between test and demo apps
+
+#define SWS1_SHF_MODE 0x02  //short frame mode (6.81M)
+#define SWS1_CH5_MODE 0x04  //channel 5 mode
+#define SWS1_ANC_MODE 0x08  //anchor mode
+#define SWS1_A1A_MODE 0x10  //anchor/tag address A1
+#define SWS1_A2A_MODE 0x20  //anchor/tag address A2
+#define SWS1_A3A_MODE 0x40  //anchor/tag address A3
+
+#define S1_SWITCH_ON  (1)
+#define S1_SWITCH_OFF (0)
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+uint8_t s1switch = 0;
+int instance_anchaddr = 0;
+int dr_mode = 0;
+int chan, tagaddr, ancaddr;
+int instance_mode = ANCHOR;
+
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/*! @brief Change the SPI speed configuration on the fly */
+void setHighSpeed_SPI(bool speedValue, DW1000Driver* drv){
+
+  spiStop(drv->spid);
+
+  if (speedValue == FALSE){
+    spiStart(drv->spid, &moduleHalSpiUwbLsConfig);  // low speed spi configuration
+  }
+  else{
+    spiStart(drv->spid, &moduleHalSpiUwbHsConfig); // high speed spi configuration
+  }
+}
+
+/*! @brief entry point to the IRQn event in DW1000 module
+ *
+ * */
+void process_deca_irq(void){
+  do{
+    dwt_isr();
+    //while IRS line active (ARM can only do edge sensitive interrupts)
+  }while(port_CheckEXT_IRQ() == 1);
+}
+
+/*! @brief Check the current value of GPIO pin and return the value */
+apalGpioState_t port_CheckEXT_IRQ(void) {
+  apalGpioState_t  val;
+  apalGpioRead(moduleGpioDw1000Irqn.gpio, &val);
+  return val;
+}
+
+/*! @brief Manually set the chip select pin of the SPI */
+void set_SPI_chip_select(void){
+  apalGpioWrite(moduleGpioSpiChipSelect.gpio, APAL_GPIO_HIGH);
+}
+
+/*! @brief Manually reset the chip select pin of the SPI */
+void clear_SPI_chip_select(void){
+  apalGpioWrite(moduleGpioSpiChipSelect.gpio, APAL_GPIO_LOW);
+}
+
+/*! @brief Manually reset the DW1000 module  */
+void reset_DW1000(void){
+
+  // Set the pin as output
+  palSetLineMode(moduleGpioDw1000Reset.gpio->line, APAL_GPIO_DIRECTION_OUTPUT);
+
+  //drive the RSTn pin low
+  apalGpioWrite(moduleGpioDw1000Reset.gpio, APAL_GPIO_LOW);
+
+  //put the pin back to tri-state ... as input
+//  palSetLineMode(moduleGpioDw1000Reset.gpio->line, APAL_GPIO_DIRECTION_INPUT); // TODO:
+
+  aosThdMSleep(2);
+}
+
+/*! @brief Configure instance tag/anchor/etc... addresses */
+void addressconfigure(uint8_t s1switch, uint8_t mode){
+  uint16_t instAddress ;
+
+  instance_anchaddr = (((s1switch & SWS1_A1A_MODE) << 2) + (s1switch & SWS1_A2A_MODE) + ((s1switch & SWS1_A3A_MODE) >> 2)) >> 4;
+
+  if(mode == ANCHOR) {
+    if(instance_anchaddr > 3) {
+      instAddress = GATEWAY_ANCHOR_ADDR | 0x4 ; //listener
+    }
+    else {
+      instAddress = GATEWAY_ANCHOR_ADDR | (uint16_t)instance_anchaddr;
+    }
+  }
+  else{
+    instAddress = (uint16_t)instance_anchaddr;
+  }
+
+  instancesetaddresses(instAddress);
+}
+
+/*! @brief returns the use case / operational mode */
+int decarangingmode(uint8_t s1switch){
+  int mode = 0;
+
+  if(s1switch & SWS1_SHF_MODE)  {
+    mode = 1;
+  }
+
+  if(s1switch & SWS1_CH5_MODE) {
+    mode = mode + 2;
+  }
+
+  return mode;
+}
+
+/*! @brief Check connection setting and initialize DW1000 module */
+int32_t inittestapplication(uint8_t s1switch, DW1000Driver* drv){
+  uint32_t devID ;
+  int result;
+
+  setHighSpeed_SPI(FALSE, drv);          //low speed spi max. ~4M
+  devID = instancereaddeviceid() ;
+
+  if(DWT_DEVICE_ID != devID) {
+    clear_SPI_chip_select();
+    Sleep(1);
+    set_SPI_chip_select();
+    Sleep(7);
+    devID = instancereaddeviceid() ;
+    if(DWT_DEVICE_ID != devID){
+      return(-1) ;
+    }    
+    dwt_softreset();
+  }
+
+    reset_DW1000();  //reset the DW1000 by driving the RSTn line low
+
+  if((s1switch & SWS1_ANC_MODE) == 0){
+    instance_mode = TAG;
+  }
+  else{
+    instance_mode = ANCHOR;
+  }
+
+  result = instance_init(drv) ;
+
+  if (0 > result){
+    return(-1) ;
+  }
+
+  setHighSpeed_SPI(TRUE, drv);       // high speed spi max. ~ 20M
+  devID = instancereaddeviceid() ;
+
+  if (DWT_DEVICE_ID != devID){
+    return(-1) ;
+  }
+
+  addressconfigure(s1switch, (uint8_t)instance_mode) ;
+
+  if((instance_mode == ANCHOR) && (instance_anchaddr > 0x3)){
+    instance_mode = LISTENER;
+  }
+
+  instancesetrole(instance_mode) ;       // Set this instance role
+  dr_mode = decarangingmode(s1switch);
+  chan = chConfig[dr_mode].channelNumber ;
+  instance_config(&chConfig[dr_mode], &sfConfig[dr_mode], drv) ;
+
+  return (int32_t)devID;
+}
+
+/*! @brief Main Entry point to Initialization of UWB DW1000 configuration  */
+#pragma GCC optimize ("O3")
+int UWB_Init(DW1000Driver* drv){
+
+  /*! Software defined Configurartion for TAG, ANC, and other settings as needed */
+  s1switch = S1_SWITCH_OFF << 1  // (on = 6.8 Mbps, off = 110 kbps)
+           | S1_SWITCH_OFF << 2  // (on = CH5, off = CH2)
+           | S1_SWITCH_OFF << 3  // (on = Anchor, off = TAG)
+           | S1_SWITCH_OFF << 4  // (configure Tag or anchor ID no.)
+           | S1_SWITCH_OFF << 5  // (configure Tag or anchor ID no.)
+           | S1_SWITCH_OFF << 6  // (configure Tag or anchor ID no.)
+           | S1_SWITCH_OFF << 7; // Not use in this demo
+
+
+  port_DisableEXT_IRQ();           //disable ScenSor IRQ until we configure the device
+
+  if(inittestapplication(s1switch, drv) == -1) {
+    return (-1); //error
+  }
+
+  aosThdMSleep(5);
+
+  port_EnableEXT_IRQ();  //enable DW1000 IRQ before starting
+
+  return 0;
+}
+
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+
+aos_testresult_t aosTestDw1000Func(BaseSequentialStream* stream, aos_test_t* test) {
+
+  aosDbgCheck(test->data != NULL && ((aos_test_dw1000data_t*)test->data)->driver != NULL);
+
+  aos_testresult_t result = {0, 0};
+
+  chprintf(stream, "init DW1000...\n");
+  dwt_initialise(DWT_LOADUCODE, ((aos_test_dw1000data_t*)test->data)->driver);
+  aosThdMSleep(5);
+
+
+/*! Test snippets for DW1000.
+ * @Note: Event IRQ for DW1000 should be tested separately
+ */
+#if defined(TEST_SNIPPETS_DW1000)
+
+  uint32_t actual_deviceId;
+
+  port_DisableEXT_IRQ();
+
+  setHighSpeed_SPI(false, ((aos_test_dw1000data_t*)test->data)->driver);
+  chprintf(stream, "expected device ID (LS SPI): 0xDECA0130\n");
+  aosThdMSleep(5);
+  actual_deviceId = instancereaddeviceid();
+  chprintf(stream, "actual read ID: 0x%x\n", actual_deviceId);
+  aosThdMSleep(5);
+
+  //if the read of device ID fails, the DW1000 could be asleep
+  if(DWT_DEVICE_ID != actual_deviceId){
+
+    clear_SPI_chip_select();
+    aosThdMSleep(1);
+    set_SPI_chip_select();
+    aosThdMSleep(7);
+    actual_deviceId = instancereaddeviceid() ;
+
+    if(DWT_DEVICE_ID != actual_deviceId){
+      chprintf(stream, "SPI is not working or Unsupported Device ID\n");
+      chprintf(stream, "actual device ID is: 0x%x\n", actual_deviceId);
+      chprintf(stream, "expected device ID: 0xDECA0130\n");
+      aosThdMSleep(5);
+    }
+
+    //clear the sleep bit - so that after the hard reset below the DW does not go into sleep
+    dwt_softreset();
+  }
+
+  /*! Test1: Low speed SPI result */
+  if (actual_deviceId == DWT_DEVICE_ID){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  reset_DW1000();
+
+  chprintf(stream, "initialise instance for DW1000\n");
+  aosThdSleep(1);
+
+  int x_init = instance_init(((aos_test_dw1000data_t*)test->data)->driver) ;
+
+  if (0 != x_init){
+    chprintf(stream, "init error with return value: %d\n", x_init);
+    aosThdSleep(1);
+  }
+  else {
+    chprintf(stream, "init success with return value: %d\n", x_init);
+    aosThdSleep(1);
+  }
+
+  /*! Test2: Initialization  result*/
+  if (x_init == 0){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  setHighSpeed_SPI(true, ((aos_test_dw1000data_t*)test->data)->driver);
+
+  chprintf(stream, "expected device ID (HS SPI): 0xDECA0130\n");
+  actual_deviceId = instancereaddeviceid();
+  chprintf(stream, "actual read ID: 0x%x\n", actual_deviceId);
+  aosThdMSleep(1);
+
+  /*! Test3: High speed SPI result*/
+  if (actual_deviceId == DWT_DEVICE_ID){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  port_EnableEXT_IRQ();
+  reset_DW1000();
+
+  chprintf(stream, "initialise the configuration for UWB application\n");
+  aosThdSleep(1);
+
+  int uwb_init = UWB_Init(((aos_test_dw1000data_t*)test->data)->driver);
+
+  if (0 != uwb_init){
+    chprintf(stream, "UWB config error with return value: %d\n", uwb_init);
+    aosThdSleep(1);
+  }
+  else {
+    chprintf(stream, "UWB config success with return value: %d\n", uwb_init);
+    aosThdSleep(1);
+  }
+
+  /*! Test4: UWB configuration result
+   * If all the four tests are passed, the module is ready to run.
+   * Note that the interrupt IRQn should be tested separately.
+   */
+  if (uwb_init == 0){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  /************** End of TEST_SNIPPETS_DW1000*****************/
+
+#else /* defined(TEST_SNIPPETS_DW1000) */
+
+
+  /*! RUN THE STATE MACHINE DEMO APP (RTLS) */
+
+  chprintf(stream, "initialise the State Machine\n");
+  aosThdSleep(2);
+
+  /* Initialize UWB system with user defined configuration  */
+  int uwb_init = UWB_Init(((aos_test_dw1000data_t*)test->data)->driver);
+
+  if (0 != uwb_init){
+    chprintf(stream, "error in UWB config with return value: %d\n", uwb_init);
+  }
+  else {
+    chprintf(stream, "succeed the init of UWB config\n");
+  }
+  aosThdSleep(1);
+
+  chprintf(stream, "running the RTLS demo application ...\n");
+  aosThdSleep(1);
+
+  /*! Run the localization system demo app as a thread */
+  while(1){
+    instance_run();
+//    aosThdUSleep(10);
+  }
+
+#endif  /* defined(TEST_SNIPPETS_DW1000) */
+
+  return result;
+}
+
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/DW1000_v1/aos_test_DW1000.h b/test/periphery-lld/DW1000_v1/aos_test_DW1000.h
new file mode 100644
index 0000000..efb5666
--- /dev/null
+++ b/test/periphery-lld/DW1000_v1/aos_test_DW1000.h
@@ -0,0 +1,95 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_DW1000_H
+#define AMIROOS_TEST_DW1000_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_DW1000.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  DW1000Driver* driver;
+
+} aos_test_dw1000data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestDw1000Func(BaseSequentialStream* stream, aos_test_t* test);
+
+  extern uint8_t s1switch;
+  extern int instance_anchaddr;
+  extern int dr_mode;
+  extern int chan, tagaddr, ancaddr;
+  extern int instance_mode;
+
+  int UWB_Init(DW1000Driver* drv);
+  int32_t inittestapplication(uint8_t s1switch, DW1000Driver* drv);
+  int decarangingmode(uint8_t s1switch);
+  void addressconfigure(uint8_t s1switch, uint8_t mode);
+  void set_SPI_chip_select(void);
+  void clear_SPI_chip_select(void);
+  void reset_DW1000(void);
+  void setHighSpeed_SPI(bool speedValue, DW1000Driver* drv);
+  apalGpioState_t port_CheckEXT_IRQ(void) ;
+  void process_deca_irq(void);
+
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_DW1000_H */
diff --git a/test/periphery-lld/HMC5883L_v1/aos_test_HMC5883L.c b/test/periphery-lld/HMC5883L_v1/aos_test_HMC5883L.c
new file mode 100644
index 0000000..a382b44
--- /dev/null
+++ b/test/periphery-lld/HMC5883L_v1/aos_test_HMC5883L.c
@@ -0,0 +1,215 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_HMC5883L.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   HMC5338L test function.
+ *
+ * @param[in] stream  Stream for intput/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestHmc5883lFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && (((aos_test_hmc5883ldata_t*)(test->data))->drdyEvtSrc != NULL));
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t rxbuffer[3];
+  uint8_t data;
+  uint8_t conf = 0x70;
+  hmc5883l_lld_config_t cfg;
+  uint16_t mdata[3];
+  uint8_t state;
+  eventmask_t event_mask = 0;
+  event_listener_t el;
+  uint16_t data_reads = 0;
+  aos_timestamp_t start;
+  aos_timestamp_t t;
+
+  chprintf(stream, "check ID...\n");
+  status = hmc5883l_lld_check(((aos_test_hmc5883ldata_t*)test->data)->driver, rxbuffer, 3, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && rxbuffer[0] == HMC5883L_LLD_IDENTIFICATION_A
+                                   && rxbuffer[1] == HMC5883L_LLD_IDENTIFICATION_B
+                                   && rxbuffer[2] == HMC5883L_LLD_IDENTIFICATION_C) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    ++result.failed;
+    chprintf(stream, "\t\tstatus: %d, idA: %d, idB: %d, idC: %d\n", status, rxbuffer[0], rxbuffer[1], rxbuffer[2]);
+    chprintf(stream, "\t\texpected idA: %d, idB: %d, idC: %d\n", HMC5883L_LLD_IDENTIFICATION_A, HMC5883L_LLD_IDENTIFICATION_B, HMC5883L_LLD_IDENTIFICATION_C);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = hmc5883l_lld_read_register(((aos_test_hmc5883ldata_t*)test->data)->driver, HMC5883L_LLD_REGISTER_IDENTIFICATION_A, &data, 1, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && data == HMC5883L_LLD_IDENTIFICATION_A) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write register...\n");
+  status = hmc5883l_lld_write_register(((aos_test_hmc5883ldata_t*)test->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &conf, 1, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  status |= hmc5883l_lld_read_register(((aos_test_hmc5883ldata_t*)test->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &data, 1, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  if ((status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) && data == 0x70) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n, data: d", status, data);
+  }
+
+  chprintf(stream, "read configuration\n");
+  status = hmc5883l_lld_read_config(((aos_test_hmc5883ldata_t*)test->data)->driver, &cfg, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write configuration\n");
+  cfg.avg = HMC5883L_LLD_AVG1;
+  cfg.outrate = HMC5883L_LLD_75_HZ;
+  cfg.mbias = HMC5883L_LLD_MB_NORMAL;
+  cfg.gain = HMC5883L_LLD_GN_0_GA;
+  cfg.highspeed = HMC5883L_LLD_HS_DISABLE;
+  cfg.mode = HMC5883L_LLD_MM_CONTINUOUS;
+  status = hmc5883l_lld_write_config(((aos_test_hmc5883ldata_t*)test->data)->driver, cfg, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  status |= hmc5883l_lld_read_config(((aos_test_hmc5883ldata_t*)test->data)->driver, &cfg, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  if (status == APAL_STATUS_OK &&
+      cfg.avg == HMC5883L_LLD_AVG1 &&
+      cfg.outrate == HMC5883L_LLD_75_HZ &&
+      cfg.mbias == HMC5883L_LLD_MB_NORMAL &&
+      cfg.gain == HMC5883L_LLD_GN_0_GA &&
+      cfg.highspeed == HMC5883L_LLD_HS_DISABLE &&
+      cfg.mode == HMC5883L_LLD_MM_CONTINUOUS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read all data for five seconds...\n");
+  status = hmc5883l_lld_set_register(((aos_test_hmc5883ldata_t*)test->data)->driver,HMC5883L_LLD_REGISTER_MODE,HMC5883L_LLD_MM_CONTINUOUS,((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= hmc5883l_lld_read_data(((aos_test_hmc5883ldata_t*)test->data)->driver, mdata, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+    chprintf(stream, "\t\tX = 0x%04X\tY = 0x%04X\tZ = 0x%04X\n",mdata[0],mdata[1],mdata[2]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read status...\n");
+  status = hmc5883l_lld_read_lock(((aos_test_hmc5883ldata_t*)test->data)->driver, &state, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  chprintf(stream, "\t\tsensor lock: %d\n", state);
+  status |= hmc5883l_lld_read_rdy(((aos_test_hmc5883ldata_t*)test->data)->driver, &state, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  chprintf(stream, "\t\tsensor rdy: %d\n", state);
+  status |= hmc5883l_lld_read_status(((aos_test_hmc5883ldata_t*)test->data)->driver, &state, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  chprintf(stream, "\t\tsensor status: %d\n", state);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "interrupt (partial data read)...\n");
+  chEvtRegister(((aos_test_hmc5883ldata_t*)test->data)->drdyEvtSrc, &el, 0);
+  status = hmc5883l_lld_write_config(((aos_test_hmc5883ldata_t*)test->data)->driver, cfg, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  aosThdSSleep(1);
+  status |= hmc5883l_lld_read_data(((aos_test_hmc5883ldata_t*)test->data)->driver, mdata, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  aosThdMSleep(10);
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
+  status |= hmc5883l_lld_read_register(((aos_test_hmc5883ldata_t*)test->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_MSB, &data, 1, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  aosThdMSleep(10);
+  status |= hmc5883l_lld_read_register(((aos_test_hmc5883ldata_t*)test->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_LSB, &data, 1, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  aosThdMSleep(10);
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
+  chprintf(stream, "\t\teventmask = 0x%08X (should be 0)\n", event_mask);
+  if (event_mask != EVENT_MASK(0)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "interrupt (full data read)...\n");
+  status |= hmc5883l_lld_read_data(((aos_test_hmc5883ldata_t*)test->data)->driver, mdata, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(100 * MICROSECONDS_PER_MILLISECOND));
+  chprintf(stream, "\t\teventmask = 0x%08X (should be 1)\n", event_mask);
+  if (event_mask == EVENT_MASK(0)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read data based on interrupt...\n");
+  status = hmc5883l_lld_read_config(((aos_test_hmc5883ldata_t*)test->data)->driver, &cfg, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  uint8_t mode = HMC5883L_LLD_MM_SINGLE;
+  cfg.mode = mode;
+  status |= hmc5883l_lld_write_config(((aos_test_hmc5883ldata_t*)test->data)->driver, cfg, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  aosSysGetUptime(&start);
+  aosSysGetUptime(&t);
+  status |= hmc5883l_lld_read_data(((aos_test_hmc5883ldata_t*)test->data)->driver, mdata, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+  while (t - start < MICROSECONDS_PER_SECOND) {
+    event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(1000));
+    if (event_mask == EVENT_MASK(0)) {
+      status |= hmc5883l_lld_read_data(((aos_test_hmc5883ldata_t*)test->data)->driver, mdata, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+      data_reads++;
+      status = hmc5883l_lld_write_register(((aos_test_hmc5883ldata_t*)test->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A+2, &mode, 1, ((aos_test_hmc5883ldata_t*)test->data)->timeout);
+    }
+    aosSysGetUptime(&t);
+  }
+  chEvtUnregister(((aos_test_hmc5883ldata_t*)test->data)->drdyEvtSrc, &el);
+  aosTestInfoMsg(stream,"Read data %u times in a second\n", data_reads);
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(HMC5883LDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/HMC5883L_v1/aos_test_HMC5883L.h b/test/periphery-lld/HMC5883L_v1/aos_test_HMC5883L.h
new file mode 100644
index 0000000..9178bdf
--- /dev/null
+++ b/test/periphery-lld/HMC5883L_v1/aos_test_HMC5883L.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_HMC5883L_H
+#define AMIROOS_TEST_HMC5883L_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_HMC5883L.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Constum data structure for this test.
+ */
+typedef struct {
+  /**
+   * @brief   HMC5338L driver to use.
+   */
+  HMC5883LDriver* driver;
+
+  /**
+   * @brief   Event source for certain tests.
+   */
+  event_source_t *drdyEvtSrc;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+
+  /**
+   * @brief   Timeout value in microseconds.
+   */
+  apalTime_t timeout;
+} aos_test_hmc5883ldata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestHmc5883lFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_HMC5883L_H */
diff --git a/test/periphery-lld/INA219_v1/aos_test_INA219.c b/test/periphery-lld/INA219_v1/aos_test_INA219.c
new file mode 100644
index 0000000..c1db278
--- /dev/null
+++ b/test/periphery-lld/INA219_v1/aos_test_INA219.c
@@ -0,0 +1,191 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_INA219.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <math.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestIna219Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_ina219data_t*)(test->data))->inad != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  int32_t status;
+  uint16_t data[6];
+  uint16_t write_data = 0x1011;
+  uint16_t new_data[6];
+  uint16_t reset_data;
+  uint16_t test_calib = 0;
+  int16_t usensor_data = 0;
+  uint16_t busready = 0;
+  uint32_t power = 0;
+  int32_t shunt;
+  uint32_t bus;
+
+  chprintf(stream, "read registers...\n");
+  status = ina219_lld_read_register(((aos_test_ina219data_t*)test->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, data, 6, ((aos_test_ina219data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "write registers...\n");
+  status = ina219_lld_write_register(((aos_test_ina219data_t*)test->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &write_data, 1, ((aos_test_ina219data_t*)test->data)->timeout);
+  status |= ina219_lld_read_register(((aos_test_ina219data_t*)test->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, new_data, 6, ((aos_test_ina219data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && new_data[0] == write_data) {
+    uint8_t errors = 0;
+    for (uint8_t dataIdx = 1; dataIdx < 6; dataIdx++) {
+      if (new_data[dataIdx] != data[dataIdx]) {
+        ++errors;
+      }
+    }
+    if (errors == 0) {
+      aosTestPassed(stream, &result);
+    } else {
+      aosTestFailed(stream, &result);
+    }
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "reset...\n");
+  status = ina219_lld_reset(((aos_test_ina219data_t*)test->data)->inad, ((aos_test_ina219data_t*)test->data)->timeout);
+  status |= ina219_lld_read_register(((aos_test_ina219data_t*)test->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &reset_data, 1, ((aos_test_ina219data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && reset_data == 0x399F) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    ++result.failed;
+  }
+
+  chprintf(stream, "read config...\n");
+  ina219_lld_cfg_t ina_config;
+  status = ina219_lld_read_config(((aos_test_ina219data_t*)test->data)->inad, &ina_config, ((aos_test_ina219data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "write config...\n");
+  ina_config.data = 0x7FFu;
+  status = ina219_lld_write_config(((aos_test_ina219data_t*)test->data)->inad, ina_config, ((aos_test_ina219data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+
+  chprintf(stream, "calibrate...\n");
+  ina219_lld_calib_input_t calib_in;
+  calib_in.shunt_resistance_0 = 0.1f;
+  calib_in.max_expected_current_A = 0.075f;
+  calib_in.current_lsb_uA = 10;
+  calib_in.cfg_reg = ina_config;
+  ina219_lld_calib_output_t calib_out;
+  status = ina219_lld_calibration(((aos_test_ina219data_t*)test->data)->inad, &calib_in, &calib_out);
+  status |= ina219_lld_write_calibration(((aos_test_ina219data_t*)test->data)->inad, calib_out.calibration & 0xFFFEu, ((aos_test_ina219data_t*)test->data)->timeout);
+  status |= ina219_lld_write_calibration(((aos_test_ina219data_t*)test->data)->inad, 0xA000, ((aos_test_ina219data_t*)test->data)->timeout);
+  ina219_lld_cfg_t test_config;
+  ((aos_test_ina219data_t*)test->data)->inad->current_lsb_uA = 0xA;
+  status |= ina219_lld_read_config(((aos_test_ina219data_t*)test->data)->inad, &test_config, ((aos_test_ina219data_t*)test->data)->timeout);
+  status |= ina219_lld_read_calibration(((aos_test_ina219data_t*)test->data)->inad, &test_calib, ((aos_test_ina219data_t*)test->data)->timeout);
+  while (!busready || power == 0) {
+    aosThdMSleep(20);
+    status |= ina219_lld_bus_conversion_ready(((aos_test_ina219data_t*)test->data)->inad, &busready, ((aos_test_ina219data_t*)test->data)->timeout);
+    status |= ina219_lld_read_power(((aos_test_ina219data_t*)test->data)->inad, &power, ((aos_test_ina219data_t*)test->data)->timeout);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read shunt voltage...\n");
+  status = ina219_lld_read_shunt_voltage(((aos_test_ina219data_t*)test->data)->inad, &shunt, ((aos_test_ina219data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tshunt voltage: %fV\n", (float)shunt/1000000.f);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read bus voltage (%u%% tolerance)...\n", (uint8_t)(((aos_test_ina219data_t*)test->data)->tolerance * 100.f + 0.5f));
+  status = ina219_lld_read_bus_voltage(((aos_test_ina219data_t*)test->data)->inad, &bus, ((aos_test_ina219data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tbus voltage: %fV\n", (float)bus/1000000.f);
+  if ((status == APAL_STATUS_SUCCESS) && (fabs(((float)bus/1000000.f) - ((aos_test_ina219data_t*)test->data)->v_expected) < ((aos_test_ina219data_t*)test->data)->v_expected * ((aos_test_ina219data_t*)test->data)->tolerance)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read power...\n");
+  status = ina219_lld_read_power(((aos_test_ina219data_t*)test->data)->inad, &power, ((aos_test_ina219data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tpower: %fW\n", (float)(power)/1000000.f);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read current...\n");
+  status = ina219_lld_read_current(((aos_test_ina219data_t*)test->data)->inad, &usensor_data, ((aos_test_ina219data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tcurrent: %fA\n", (float)(usensor_data)/1000000.f);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  aosTestInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(INA219Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/INA219_v1/aos_test_INA219.h b/test/periphery-lld/INA219_v1/aos_test_INA219.h
new file mode 100644
index 0000000..9b7dab0
--- /dev/null
+++ b/test/periphery-lld/INA219_v1/aos_test_INA219.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_INA219_H
+#define AMIROOS_TEST_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_INA219.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   INA219 driver to use.
+   */
+  INA219Driver *inad;
+
+  /**
+   * @brief   Expected voltage to be measured.
+   */
+  float v_expected;
+
+  /**
+   * @brief   Tolerance (relative) of measurement.
+   */
+  float tolerance;
+
+  /**
+   * @brief   Timeout delay for certain tests.
+   */
+  apalTime_t timeout;
+} aos_test_ina219data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestIna219Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_INA219_H */
diff --git a/test/periphery-lld/L3G4200D_v1/aos_test_L3G4200D.c b/test/periphery-lld/L3G4200D_v1/aos_test_L3G4200D.c
new file mode 100644
index 0000000..d1788f3
--- /dev/null
+++ b/test/periphery-lld/L3G4200D_v1/aos_test_L3G4200D.c
@@ -0,0 +1,288 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_L3G4200D.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   L3G4200D test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestL3g4200dFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_l3g4200ddata_t*)(test->data)) != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t data = 0;
+  uint8_t write_data[5];
+  uint8_t read_data[5];
+  int16_t sdata[3];
+  uint8_t status_reg;
+  eventmask_t event_mask;
+  bool success = false;
+  uint8_t fifo = 0x5F;
+  event_listener_t el;
+
+  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
+    write_data[dataIdx] = (dataIdx+1)*11;
+  }
+  write_data[4] = 0;
+
+  chprintf(stream, "check identity...\n");
+  status = l3g4200d_lld_read_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, L3G4200D_LLD_REGISTER_WHO_AM_I, &data, 1);
+  if(status == APAL_STATUS_SUCCESS && data == L3G4200D_LLD_WHO_AM_I){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+  }
+
+  chprintf(stream, "write register...\n");
+  status = l3g4200d_lld_write_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 1);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = l3g4200d_lld_read_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, &data, 1);
+  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+  }
+
+  chprintf(stream, "write multiple registers...\n");
+  status = l3g4200d_lld_write_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 5);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read multiple registers...\n");
+  status = l3g4200d_lld_read_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, read_data, 5);
+  uint8_t errors = 0;
+  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+    if (read_data[dataIdx] != write_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_SUCCESS && errors == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
+    }
+    aosTestFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
+  }
+
+  chprintf(stream, "read config...\n");
+  l3g4200d_lld_cfg_t cfg;
+  status = l3g4200d_lld_read_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &cfg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "write config...\n");
+  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_100_HZ | L3G4200D_LLD_BW_12_5 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
+  //cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
+  cfg.registers.ctrl_reg3 = 0x07;
+  cfg.registers.ctrl_reg5 |= L3G4200D_LLD_FIFO_EN;
+  status = l3g4200d_lld_write_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, cfg);
+  uint8_t reg1 = cfg.data[0];
+  status |= l3g4200d_lld_read_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &cfg);
+  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read gyro data for five seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= l3g4200d_lld_read_all_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, sdata, &cfg);
+    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read X axis for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint32_t i = 0; i <= 5; i++) {
+    status |= l3g4200d_lld_read_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &(sdata[0]), L3G4200D_LLD_X_AXIS, &cfg);
+    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Y axis for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint32_t i = 0; i <= 5; i++) {
+    status |= l3g4200d_lld_read_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Y_AXIS, &cfg);
+    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Z axis for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint32_t i = 0; i <= 5; i++) {
+    status |= l3g4200d_lld_read_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Z_AXIS, &cfg);
+    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+  aosThdMSleep(10);
+
+  chprintf(stream, "read status register...\n");
+  status = l3g4200d_lld_read_status_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &status_reg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read interrupt config...\n");
+  l3g4200d_lld_int_cfg_t int_cfg;
+  status = l3g4200d_lld_read_int_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &int_cfg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "write interrupt config...\n");
+  int_cfg.registers.int1_tsh_xh = 10;
+  status = l3g4200d_lld_write_int_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, int_cfg);
+  l3g4200d_lld_int_cfg_t int_cfg2;
+  status |= l3g4200d_lld_read_int_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, &int_cfg2);
+  if (status == APAL_STATUS_SUCCESS && int_cfg.registers.int1_tsh_xh == 10) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "interrupt test: read fifo until empty...\n");
+  chEvtRegister(((aos_test_l3g4200ddata_t*)(test->data))->src, &el, 0);
+  status = l3g4200d_lld_write_fifo_ctrl_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd,fifo);
+  fifo = 0;
+  status |= l3g4200d_lld_read_fifo_ctrl_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd,&fifo);
+  status |= l3g4200d_lld_read_all_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, sdata, &cfg);
+  chEvtGetAndClearFlags(&el);
+  aosThdSSleep(1);
+  chEvtGetAndClearFlags(&el);
+  success = false;
+  for (uint8_t i = 0; i < 200; i++) {
+    status |= l3g4200d_lld_read_all_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, sdata, &cfg);
+    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
+    status |= l3g4200d_lld_read_fifo_src_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd,&fifo);
+    if (event_mask != 0 && ((fifo & L3G4200D_LLD_EMPTY) || fifo == 0)) {
+      success = true;
+      break;
+    }
+    aosThdMSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS && success) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  fifo = 0x4A;
+  status |= l3g4200d_lld_write_fifo_ctrl_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd,fifo);
+  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
+  cfg.registers.ctrl_reg3 = 0x04;
+  status |= l3g4200d_lld_write_config(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, cfg);
+  chprintf(stream, "interrupt test: wait until wtm reached...\n");
+  for (uint8_t i = 0; i < 200; i++) {
+    status |= l3g4200d_lld_read_all_data(((aos_test_l3g4200ddata_t*)(test->data))->l3gd, sdata, &cfg);
+    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
+    status |= l3g4200d_lld_read_fifo_src_register(((aos_test_l3g4200ddata_t*)(test->data))->l3gd,&fifo);
+    if (event_mask != 0 && (fifo & L3G4200D_LLD_WTM)) {
+      success = true;
+      break;
+    }
+    aosThdMSleep(10);
+  }
+  if (status == APAL_STATUS_SUCCESS && success) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chEvtUnregister(((aos_test_l3g4200ddata_t*)(test->data))->src, &el);
+  aosThdMSleep(10);
+
+  aosTestInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(L3G4200DDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/L3G4200D_v1/aos_test_L3G4200D.h b/test/periphery-lld/L3G4200D_v1/aos_test_L3G4200D.h
new file mode 100644
index 0000000..d33a4c4
--- /dev/null
+++ b/test/periphery-lld/L3G4200D_v1/aos_test_L3G4200D.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_L3G4200D_H
+#define AMIROOS_TEST_L3G4200D_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_L3G4200D.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   L3G4200D driver to use.
+   */
+  L3G4200DDriver *l3gd;
+
+  /**
+   * @brief   SPI configuratoin.
+   */
+  SPIConfig *spiconf;
+
+  /**
+   * @brief   Event source for certain tests.
+   */
+  event_source_t *src;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} aos_test_l3g4200ddata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestL3g4200dFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_L3G4200D_H */
diff --git a/test/periphery-lld/LED_v1/aos_test_LED.c b/test/periphery-lld/LED_v1/aos_test_LED.c
new file mode 100644
index 0000000..812bf76
--- /dev/null
+++ b/test/periphery-lld/LED_v1/aos_test_LED.c
@@ -0,0 +1,106 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_LED.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   LED test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestLedFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_leddata_t*)test->data)->led != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  int32_t status = AOS_OK;
+
+  chprintf(stream, "lighting up for two seconds...\n");
+  led_lld_state_t state = LED_LLD_STATE_ON;
+  status = led_lld_set(((aos_test_leddata_t*)test->data)->led, state);
+  aosThdSSleep(2);
+  status |= led_lld_get(((aos_test_leddata_t*)test->data)->led, &state);
+  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_ON) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "turning off for two seconds...\n");
+  state = LED_LLD_STATE_OFF;
+  status = led_lld_set(((aos_test_leddata_t*)test->data)->led, state);
+  aosThdSSleep(2);
+  status |= led_lld_get(((aos_test_leddata_t*)test->data)->led, &state);
+  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_OFF) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "toggling for two seconds...\n");
+  status = led_lld_set(((aos_test_leddata_t*)test->data)->led, LED_LLD_STATE_ON);
+  for (uint32_t i = 0; i < 2000/100; ++i) {
+    status |= led_lld_toggle(((aos_test_leddata_t*)test->data)->led);
+    status |= led_lld_get(((aos_test_leddata_t*)test->data)->led, &state);
+    status |= ((uint8_t)state != (i & 0x01u)) ? APAL_STATUS_ERROR : APAL_STATUS_OK;
+    aosThdMSleep(100);
+  }
+  status = led_lld_set(((aos_test_leddata_t*)test->data)->led, LED_LLD_STATE_OFF);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LEDDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/LED_v1/aos_test_LED.h b/test/periphery-lld/LED_v1/aos_test_LED.h
new file mode 100644
index 0000000..882e275
--- /dev/null
+++ b/test/periphery-lld/LED_v1/aos_test_LED.h
@@ -0,0 +1,77 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TESTS_LED_H
+#define AMIROOS_TESTS_LED_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_LED.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  LEDDriver* led;
+
+} aos_test_leddata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestLedFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TESTS_LED_H */
diff --git a/test/periphery-lld/LIS331DLH_v1/aos_test_LIS331DLH.c b/test/periphery-lld/LIS331DLH_v1/aos_test_LIS331DLH.c
new file mode 100644
index 0000000..c17560b
--- /dev/null
+++ b/test/periphery-lld/LIS331DLH_v1/aos_test_LIS331DLH.c
@@ -0,0 +1,255 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_LIS331DLH.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   LIS331DLH test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestLis331dlhFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_lis331dlhdata_t*)(test->data)) != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  int32_t status;
+  uint8_t data = 0;
+  uint8_t write_data[5];
+  uint8_t read_data[5];
+  uint8_t errors = 0;
+  uint8_t reg1;
+  int16_t sdata[3];
+  uint8_t status_reg;
+  lis331dlh_lld_int_cfg_t intcfg;
+  event_listener_t el;
+  eventmask_t event_mask;
+  uint8_t success = 0;
+
+  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
+    write_data[dataIdx] = (dataIdx+1)*11;
+  }
+  write_data[4] = 0;
+
+  chprintf(stream, "check identity...\n");
+  status = lis331dlh_lld_read_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, LIS331DLH_LLD_REGISTER_WHO_AM_I, &data, 1);
+  if (status == APAL_STATUS_SUCCESS &&
+      data == LIS331DLH_LLD_WHO_AM_I) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    aosTestFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+    ++result.failed;
+  }
+
+  chprintf(stream, "write register...\n");
+  status = lis331dlh_lld_write_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 1);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = lis331dlh_lld_read_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, &data, 1);
+  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    aosTestFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
+    ++result.failed;
+  }
+
+  chprintf(stream, "write multiple registers...\n");
+  status = lis331dlh_lld_write_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 5);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read multiple registers...\n");
+  status = lis331dlh_lld_read_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, read_data, 5);
+  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+    if (read_data[dataIdx] != write_data[dataIdx]) {
+      ++errors;
+    }
+  }
+  if (status == APAL_STATUS_SUCCESS &&
+      errors == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed\n");
+    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
+      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
+    }
+    aosTestFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
+  }
+
+  chprintf(stream, "read config...\n");
+  lis331dlh_lld_cfg_t cfg;
+  status = lis331dlh_lld_read_config(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &cfg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "write config...\n");
+  cfg.registers.ctrl_reg1 = LIS331DLH_LLD_PM_ODR |
+      LIS331DLH_LLD_DR_1000HZ_780LP |
+      LIS331DLH_LLD_X_AXIS_ENABLE |
+      LIS331DLH_LLD_Y_AXIS_ENABLE |
+      LIS331DLH_LLD_Z_AXIS_ENABLE;
+  cfg.registers.ctrl_reg3 = 0x00;
+  status = lis331dlh_lld_write_config(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &cfg);
+  reg1 = cfg.data[0];
+  lis331dlh_lld_read_config(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &cfg);
+  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_all_data(((aos_test_lis331dlhdata_t*)(test->data))->lisd, sdata, &cfg);
+    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read X acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_data(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &(sdata[0]), LIS331DLH_LLD_X_AXIS, &cfg);
+    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Y acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_data(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Y_AXIS, &cfg);
+    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read Z acceleration for five seconds...\n");
+  status = APAL_STATUS_SUCCESS;
+  for (uint8_t i = 0; i < 5; ++i) {
+    status |= lis331dlh_lld_read_data(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Z_AXIS, &cfg);
+    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read status register...\n");
+  status = lis331dlh_lld_read_status_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &status_reg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "interrupt...\n");
+  intcfg.cfg_reg = LIS331DLH_LLD_INT_CFG_X_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Y_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Z_HIGH_ENABLE;
+  intcfg.threshold = 10;
+  intcfg.duration = 1;
+  lis331dlh_lld_write_int_config(((aos_test_lis331dlhdata_t*)(test->data))->lisd, &intcfg, LIS331DLH_LLD_INT1);
+  aosThdSSleep(1);
+  chEvtRegister(((aos_test_lis331dlhdata_t*)(test->data))->src, &el, 3);
+  chprintf(stream, "\t\tmove the AMiRo now to generate interrupts\n");
+  aosThdSSleep(1);
+  for (uint8_t i = 0; i < 10; i++) {
+    event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
+    status |= lis331dlh_lld_read_all_data(((aos_test_lis331dlhdata_t*)(test->data))->lisd, sdata, &cfg);
+    status = lis331dlh_lld_read_register(((aos_test_lis331dlhdata_t*)(test->data))->lisd, LIS331DLH_LLD_REGISTER_INT1_SOURCE, &data, 1);
+    eventflags_t flags = chEvtGetAndClearFlags(&el);
+    if (event_mask == EVENT_MASK(3) && (flags & ((aos_test_lis331dlhdata_t*)(test->data))->evtflags)) {
+      ++success;
+      chprintf(stream, "\t\tX = %6d INTERRUPT\n", sdata[0]);
+    } else {
+      chprintf(stream, "\t\tX = %6d\n", sdata[0]);
+    }
+    aosThdSSleep(1);
+  }
+  event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
+  chEvtUnregister(((aos_test_lis331dlhdata_t*)(test->data))->src, &el);
+  if (status == APAL_STATUS_SUCCESS && success > 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  aosTestInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(LIS331DLHDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/LIS331DLH_v1/aos_test_LIS331DLH.h b/test/periphery-lld/LIS331DLH_v1/aos_test_LIS331DLH.h
new file mode 100644
index 0000000..07230da
--- /dev/null
+++ b/test/periphery-lld/LIS331DLH_v1/aos_test_LIS331DLH.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_LIS331DLH_H
+#define AMIROOS_TEST_LIS331DLH_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_LIS331DLH.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Accelerometer driver to use.
+   */
+  LIS331DLHDriver *lisd;
+
+  /**
+   * @brief   SPI configuratoin.
+   */
+  SPIConfig *spiconf;
+
+  /**
+   * @brief   Event source for certain tests.
+   */
+  event_source_t *src;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} aos_test_lis331dlhdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestLis331dlhFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_LIS331DLH_H */
diff --git a/test/periphery-lld/LTC4412_v1/aos_test_LTC4412.c b/test/periphery-lld/LTC4412_v1/aos_test_LTC4412.c
new file mode 100644
index 0000000..2f5f5e1
--- /dev/null
+++ b/test/periphery-lld/LTC4412_v1/aos_test_LTC4412.c
@@ -0,0 +1,88 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_LTC4412.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestLtc4412Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_ltc4412data_t*)test->data)->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0,0};
+  int32_t status;
+
+  chprintf(stream, "read ctrl pin...\n");
+  ltc4412_lld_ctrl_t ctrl;
+  status = ltc4412_lld_get_ctrl(((aos_test_ltc4412data_t*)test->data)->driver, &ctrl);
+  if(status == APAL_STATUS_SUCCESS){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write ctrl pin...\n");
+  status = ltc4412_lld_set_ctrl(((aos_test_ltc4412data_t*)test->data)->driver, LTC4412_LLD_CTRL_ACTIVE);
+  status |= ltc4412_lld_get_ctrl(((aos_test_ltc4412data_t*)test->data)->driver, &ctrl);
+  if (status == APAL_STATUS_SUCCESS && ctrl == LTC4412_LLD_CTRL_ACTIVE) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read stat pin...\n");
+  ltc4412_lld_stat_t stat;
+  status = ltc4412_lld_get_stat(((aos_test_ltc4412data_t*)test->data)->driver, &stat);
+  if(status == APAL_STATUS_SUCCESS){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LTC4412Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/LTC4412_v1/aos_test_LTC4412.h b/test/periphery-lld/LTC4412_v1/aos_test_LTC4412.h
new file mode 100644
index 0000000..8018156
--- /dev/null
+++ b/test/periphery-lld/LTC4412_v1/aos_test_LTC4412.h
@@ -0,0 +1,77 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_LTC4412_H
+#define AMIROOS_TEST_LTC4412_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_LTC4412.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  LTC4412Driver* driver;
+
+} aos_test_ltc4412data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestLtc4412Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_LTC4412_H */
diff --git a/test/periphery-lld/MIC9404x_v1/aos_test_MIC9404x.c b/test/periphery-lld/MIC9404x_v1/aos_test_MIC9404x.c
new file mode 100644
index 0000000..8347b88
--- /dev/null
+++ b/test/periphery-lld/MIC9404x_v1/aos_test_MIC9404x.c
@@ -0,0 +1,119 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_MIC9404x.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   MIC9404x test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestMic9404xFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_mic9404data_t*)test->data)->driver != NULL);
+
+  // local variables
+  mic9404x_lld_state_t state_orig;
+  mic9404x_lld_state_t state;
+  aos_testresult_t result = {0, 0};
+  uint32_t status = APAL_STATUS_OK;
+
+  chprintf(stream, "reading current status...\n");
+  status = mic9404x_lld_get(((aos_test_mic9404data_t*)test->data)->driver, &state_orig);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassedMsg(stream, &result, "power %s\n", (state_orig == MIC9404x_LLD_STATE_ON) ? "enabled" : "disabled");
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  state = state_orig;
+  for (uint8_t i = 0; i < 2; ++i) {
+    if (state == MIC9404x_LLD_STATE_ON) {
+      chprintf(stream, "disabling for five seconds...\n");
+      status = mic9404x_lld_set(((aos_test_mic9404data_t*)test->data)->driver, MIC9404x_LLD_STATE_OFF);
+      status |= mic9404x_lld_get(((aos_test_mic9404data_t*)test->data)->driver, &state);
+      if (state == MIC9404x_LLD_STATE_OFF) {
+        aosThdSSleep(5);
+        status |= mic9404x_lld_get(((aos_test_mic9404data_t*)test->data)->driver, &state);
+      }
+      if ((status == APAL_STATUS_OK) && (state == MIC9404x_LLD_STATE_OFF)) {
+        aosTestPassed(stream, &result);
+      } else {
+        aosTestFailed(stream, &result);
+        break;
+      }
+    } else {
+      chprintf(stream, "enabling for five seconds...\n");
+      status = mic9404x_lld_set(((aos_test_mic9404data_t*)test->data)->driver, MIC9404x_LLD_STATE_ON);
+      status |= mic9404x_lld_get(((aos_test_mic9404data_t*)test->data)->driver, &state);
+      if (state == MIC9404x_LLD_STATE_ON) {
+        aosThdSSleep(5);
+        status |= mic9404x_lld_get(((aos_test_mic9404data_t*)test->data)->driver, &state);
+      }
+      if ((status == APAL_STATUS_OK) && (state == MIC9404x_LLD_STATE_ON)) {
+        aosTestPassed(stream, &result);
+      } else {
+        aosTestFailed(stream, &result);
+        break;
+      }
+    }
+  }
+  // restore original state
+  if (state != state_orig) {
+    status = mic9404x_lld_set(((aos_test_mic9404data_t*)test->data)->driver, state);
+    if (status != APAL_STATUS_OK) {
+      chprintf(stream, "\t\tWARNING: failed to restore original status!\n");
+    }
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(MIC9404xDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/MIC9404x_v1/aos_test_MIC9404x.h b/test/periphery-lld/MIC9404x_v1/aos_test_MIC9404x.h
new file mode 100644
index 0000000..4df8694
--- /dev/null
+++ b/test/periphery-lld/MIC9404x_v1/aos_test_MIC9404x.h
@@ -0,0 +1,77 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_MIC9404x_H
+#define AMIROOS_TEST_MIC9404x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_MIC9404x.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  MIC9404xDriver* driver;
+
+} aos_test_mic9404data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestMic9404xFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_MIC9404x_H */
diff --git a/test/periphery-lld/MPR121_v1/aos_test_MPR121.c b/test/periphery-lld/MPR121_v1/aos_test_MPR121.c
new file mode 100644
index 0000000..343f4e1
--- /dev/null
+++ b/test/periphery-lld/MPR121_v1/aos_test_MPR121.c
@@ -0,0 +1,187 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_MPR121.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestMpr121Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_mpr121data_t*)test->data)->mprd != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  mpr121_lld_config_t cfg;
+  uint8_t data = 0;
+  uint8_t wdata = 0;
+  uint8_t rdata = 0;
+  uint16_t edata[4] = {0};
+  uint8_t tstate = 0;
+  event_listener_t event_listener;
+  aos_timestamp_t tstart, tcurrent, tend;
+
+  chprintf(stream, "soft reset...\n");
+  status = mpr121_lld_soft_reset(((aos_test_mpr121data_t*)test->data)->mprd, ((aos_test_mpr121data_t*)test->data)->timeout);
+  status |= mpr121_lld_read_config(((aos_test_mpr121data_t*)test->data)->mprd, &cfg, ((aos_test_mpr121data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && cfg.registers.ele_config == 0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read register...\n");
+  status = mpr121_lld_read_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((aos_test_mpr121data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tdata: 0x%02X\n", data);
+  if (status == APAL_STATUS_SUCCESS && data == (MPR121_LLD_CDT_0_5 | MPR121_LLD_ESI_16)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write register...\n");
+  wdata = MPR121_LLD_CDT_32 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_16;
+  status = mpr121_lld_write_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &wdata, ((aos_test_mpr121data_t*)test->data)->timeout);
+  aosThdMSleep(500);
+  status |= mpr121_lld_read_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((aos_test_mpr121data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tdata: 0x%02X\n", rdata);
+  status |= mpr121_lld_write_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((aos_test_mpr121data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && rdata == wdata) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read config...\n");
+  status = mpr121_lld_read_config(((aos_test_mpr121data_t*)test->data)->mprd, &cfg, ((aos_test_mpr121data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && cfg.registers.config_1 == 0x10 && cfg.registers.config_2 == 0x24) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\t\tconfig 1: 0x%02X\n", cfg.registers.config_1);
+    chprintf(stream, "\t\tconfig 2: 0x%02X\n", cfg.registers.config_2);
+    mpr121_lld_read_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_CONFIG_1, 0, 1, &rdata, ((aos_test_mpr121data_t*)test->data)->timeout);
+    chprintf(stream, "\t\tconfig 1: 0x%02X\n", rdata);
+    mpr121_lld_read_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((aos_test_mpr121data_t*)test->data)->timeout);
+    chprintf(stream, "\t\tconfig 2: 0x%02X\n", rdata);
+    for (uint8_t valueIdx = 0; valueIdx < 8; valueIdx++) {
+      chprintf(stream, "\t\tdata %d: 0x%02X\n", valueIdx, cfg.values[valueIdx]);
+    }
+    chprintf(stream, "ele_config: 0x%02X\n", cfg.registers.ele_config);
+    chprintf(stream, "config_1: 0x%02X\n", cfg.registers.config_1);
+    chprintf(stream, "config_2: 0x%02X\n", cfg.registers.config_2);
+    chprintf(stream, "target_level: 0x%02X\n", cfg.registers.target_level);
+    chprintf(stream, "low_side_limit: 0x%02X\n", cfg.registers.low_side_limit);
+    chprintf(stream, "up_side_limit: 0x%02X\n", cfg.registers.up_side_limit);
+    chprintf(stream, "auto_config_2: 0x%02X\n", cfg.registers.auto_config_2);
+    chprintf(stream, "auto_config_1: 0x%02X\n", cfg.registers.auto_config_1);
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write config...\n");
+  cfg.registers.ele_config = MPR121_LLD_CL_ON_ALL | MPR121_LLD_ELEPROX_0 | 4;
+  cfg.registers.config_1 = MPR121_LLD_FFI_18 | 16;
+  cfg.registers.config_2 = MPR121_LLD_CDT_1 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_32;
+  cfg.registers.up_side_limit = 0x96u;
+  cfg.registers.low_side_limit = 0x58u;
+  cfg.registers.target_level = 0x68u;
+  cfg.registers.auto_config_1 = MPR121_LLD_FFI_18 | MPR121_LLD_RETRY_2 | MPR121_LLD_BVA_ON_ALL | MPR121_LLD_AC_RECONF_EN;
+  status = mpr121_lld_write_config(((aos_test_mpr121data_t*)test->data)->mprd, cfg, ((aos_test_mpr121data_t*)test->data)->timeout);
+  aosThdMSleep(500);
+  status |= mpr121_lld_read_config(((aos_test_mpr121data_t*)test->data)->mprd, &cfg, ((aos_test_mpr121data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && cfg.registers.up_side_limit == 0x96u) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read filtered data for ten seconds...\n");
+  chprintf(stream, "(values should change if you touch the sensors now)\n");
+  for (uint8_t i = 0; i < 10; i++) {
+    status = mpr121_lld_read_filtered_data(((aos_test_mpr121data_t*)test->data)->mprd, 0, 4, edata, ((aos_test_mpr121data_t*)test->data)->timeout);
+    chprintf(stream, "\t\t0x%04X | 0x%04X | 0x%04X | 0x%04X\n", edata[0], edata[1], edata[2], edata[3]);
+    aosThdSSleep(1);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "test interrupts...\n");
+  status = AOS_OK;
+  chEvtRegister(((aos_test_mpr121data_t*)test->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
+  aosSysGetUptime(&tstart);
+  tend = tstart + (30 * MICROSECONDS_PER_SECOND);
+  do {
+    aosSysGetUptime(&tcurrent);
+    const aos_timestamp_t ttimeout = MICROSECONDS_PER_SECOND - ((tcurrent - tstart) % MICROSECONDS_PER_SECOND);
+    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(ttimeout));
+    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
+    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((aos_test_mpr121data_t*)test->data)->evtflags) {
+      // interrupt detected
+      status |= mpr121_lld_read_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((aos_test_mpr121data_t*)test->data)->timeout);
+      chprintf(stream, "\t\tinterrupt detected\n");
+      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
+    }
+    else if (emask == 0) {
+      // timeout
+      status |= mpr121_lld_read_register(((aos_test_mpr121data_t*)test->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((aos_test_mpr121data_t*)test->data)->timeout);
+      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
+    }
+    aosSysGetUptime(&tcurrent);
+  } while (tcurrent < tend);
+  chEvtUnregister(((aos_test_mpr121data_t*)test->data)->evtsource, &event_listener);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(MPR121Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/MPR121_v1/aos_test_MPR121.h b/test/periphery-lld/MPR121_v1/aos_test_MPR121.h
new file mode 100644
index 0000000..30cf936
--- /dev/null
+++ b/test/periphery-lld/MPR121_v1/aos_test_MPR121.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_MPR121_H
+#define AMIROOS_TEST_MPR121_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_MPR121.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the MPR121 driver to use.
+   */
+  MPR121Driver* mprd;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} aos_test_mpr121data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestMpr121Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_MPR121_H */
diff --git a/test/periphery-lld/MPU6050_v1/aos_test_MPU6050.c b/test/periphery-lld/MPU6050_v1/aos_test_MPU6050.c
new file mode 100644
index 0000000..dc0d56a
--- /dev/null
+++ b/test/periphery-lld/MPU6050_v1/aos_test_MPU6050.c
@@ -0,0 +1,65 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_MPU6050.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestMpu6050Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+    aos_testresult_t result = {0, 0};
+
+    uint8_t data[1] = {0};
+    int32_t status = 0;
+
+    status = mpu6050_lld_read_register(((aos_test_mpu6050data_t*)test->data)->mpu, MPU6050_LLD_WHO_AM_I, data, 1, ((aos_test_mpu6050data_t*)test->data)->timeout);
+    if (status == APAL_STATUS_OK && data[0] == MPU6050_I_AM) {
+      aosTestPassed(stream, &result);
+    } else {
+      aosTestFailedMsg(stream, &result, "0x%08X | 0x%02X\n", status, data[0]);
+    }
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/MPU6050_v1/aos_test_MPU6050.h b/test/periphery-lld/MPU6050_v1/aos_test_MPU6050.h
new file mode 100644
index 0000000..ecae056
--- /dev/null
+++ b/test/periphery-lld/MPU6050_v1/aos_test_MPU6050.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_MPU6050_H
+#define AMIROOS_TEST_MPU6050_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_MPU6050.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   MPU6050 driver to use.
+   */
+  MPU6050Driver *mpu;
+
+  /**
+   * @brief   Timeout delay for certain tests.
+   */
+  apalTime_t timeout;
+} aos_test_mpu6050data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestMpu6050Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_MPU6050_H */
diff --git a/test/periphery-lld/PCA9544A_v1/aos_test_PCA9544A.c b/test/periphery-lld/PCA9544A_v1/aos_test_PCA9544A.c
new file mode 100644
index 0000000..6246621
--- /dev/null
+++ b/test/periphery-lld/PCA9544A_v1/aos_test_PCA9544A.c
@@ -0,0 +1,123 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_PCA9544A.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestPca9544aFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_pca9544adata_t*)test->data)->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0,0};
+  int32_t status;
+  uint8_t ctrlreg;
+  pca9544a_lld_intstatus_t interrupt;
+  pca9544a_lld_chid_t channel;
+  uint8_t test_mask = 0x00u;
+
+  chprintf(stream, "reading control register...\n");
+  status = pca9544a_lld_read(((aos_test_pca9544adata_t*)test->data)->driver, &ctrlreg, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing control register...\n");
+  status = APAL_STATUS_OK;
+  status |= pca9544a_lld_write(((aos_test_pca9544adata_t*)test->data)->driver, (uint8_t)(PCA9544A_LLD_CTRLREG_EN), ((aos_test_pca9544adata_t*)test->data)->timeout);
+  status |= pca9544a_lld_read(((aos_test_pca9544adata_t*)test->data)->driver, &ctrlreg, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  if ((status == APAL_STATUS_OK  || status == APAL_STATUS_WARNING) && ctrlreg == PCA9544A_LLD_CTRLREG_EN) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, ctrlreg);
+  }
+
+  chprintf(stream, "reading interrupt status...\n");
+  status = pca9544a_lld_getintstatus(((aos_test_pca9544adata_t*)test->data)->driver, &interrupt, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassedMsg(stream, &result, "0x%08X\n", interrupt);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading current channel...\n");
+  status = pca9544a_lld_getcurrentchannel(((aos_test_pca9544adata_t*)test->data)->driver, &channel, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassedMsg(stream, &result, "0x%08X\n", channel);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "setting current channel...\n");
+  status = APAL_STATUS_OK;
+  status |= pca9544a_lld_setchannel(((aos_test_pca9544adata_t*)test->data)->driver, PCA9544A_LLD_CH0, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((aos_test_pca9544adata_t*)test->data)->driver, &channel, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH0) ? 0x01u : 0x00u;
+  status |= pca9544a_lld_setchannel(((aos_test_pca9544adata_t*)test->data)->driver, PCA9544A_LLD_CH1, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((aos_test_pca9544adata_t*)test->data)->driver, &channel, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH1) ? 0x02u : 0x00u;
+  status |= pca9544a_lld_setchannel(((aos_test_pca9544adata_t*)test->data)->driver, PCA9544A_LLD_CH2, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((aos_test_pca9544adata_t*)test->data)->driver, &channel, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH2) ? 0x04u : 0x00u;
+  status |= pca9544a_lld_setchannel(((aos_test_pca9544adata_t*)test->data)->driver, PCA9544A_LLD_CH3, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((aos_test_pca9544adata_t*)test->data)->driver, &channel, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH3) ? 0x08u : 0x00u;
+  status |= pca9544a_lld_setchannel(((aos_test_pca9544adata_t*)test->data)->driver, PCA9544A_LLD_CH_NONE, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  status |= pca9544a_lld_getcurrentchannel(((aos_test_pca9544adata_t*)test->data)->driver, &channel, ((aos_test_pca9544adata_t*)test->data)->timeout);
+  test_mask |= (channel != PCA9544A_LLD_CH_NONE) ? 0x10u : 0x00u;
+  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && test_mask == 0x00u) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, test_mask);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(PCA9544ADriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/PCA9544A_v1/aos_test_PCA9544A.h b/test/periphery-lld/PCA9544A_v1/aos_test_PCA9544A.h
new file mode 100644
index 0000000..7704fdb
--- /dev/null
+++ b/test/periphery-lld/PCA9544A_v1/aos_test_PCA9544A.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_PCA9544A_H
+#define AMIROOS_TEST_PCA9544A_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_PCA9544A.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  PCA9544ADriver *driver;
+
+  /**
+   * @brief   Timeout for bus communication.
+   */
+  apalTime_t timeout;
+} aos_test_pca9544adata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestPca9544aFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_PCA9544A_H */
diff --git a/test/periphery-lld/PCAL6524_v1/aos_test_PCAL6524.c b/test/periphery-lld/PCAL6524_v1/aos_test_PCAL6524.c
new file mode 100644
index 0000000..81f1cab
--- /dev/null
+++ b/test/periphery-lld/PCAL6524_v1/aos_test_PCAL6524.c
@@ -0,0 +1,164 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_PCAL6524.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestPcal6524Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck((test->data != NULL) && (((aos_test_pcal6524data_t*)test->data)->pcal6524d != NULL));
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t buffer[24];
+  memset(buffer, 0xAA, sizeof(buffer));
+
+// This test is currently not supported. See PCAL6524 driver implementation for further information.
+//  chprintf(stream, "reading device ID...\n");
+//  status = pcal6524_lld_read_id(((aos_test_pcal6524data_t*)test->data)->pcal6524d, buffer, ((aos_test_pcal6524data_t*)test->data)->timeout);
+//  chprintf(stream, "\t\traw: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
+//  chprintf(stream, "\t\tname:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->name);
+//  chprintf(stream, "\t\tpart:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->part);
+//  chprintf(stream, "\t\trevision: 0x%01X\n", ((pcal6524_lld_deviceid_t*)buffer)->revision);
+//  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+//    aosTestPassed(stream, &result);
+//  } else {
+//    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+//  }
+
+  chprintf(stream, "reading register...\n");
+  status = pcal6524_lld_read_reg(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer, ((aos_test_pcal6524data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tdebounce count: %u\n", buffer[0]);
+  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing register...\n");
+  buffer[3] = 0xFF;
+  status = pcal6524_lld_write_reg(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[3], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  status |= pcal6524_lld_read_reg(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[4], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  status |= pcal6524_lld_write_reg(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[0], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  status |= pcal6524_lld_read_reg(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[1], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
+      ((buffer[1] == buffer[0]) && (buffer[4] == buffer[3]))) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading group...\n");
+  status = pcal6524_lld_read_group(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, buffer, ((aos_test_pcal6524data_t*)test->data)->timeout);
+  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
+           (((uint16_t)buffer[0]) << 8) | buffer[1],
+           (((uint16_t)buffer[2]) << 8) | buffer[3],
+           (((uint16_t)buffer[4]) << 8) | buffer[5]);
+  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing group...\n");
+  memset(&buffer[6], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
+  status = pcal6524_lld_write_group(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[6], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  status |= pcal6524_lld_read_group(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[12], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  status |= pcal6524_lld_write_group(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[0], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  status |= pcal6524_lld_read_group(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[18], ((aos_test_pcal6524data_t*)test->data)->timeout);
+  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
+      ((memcmp(&buffer[12], &buffer[6], 6) == 0) && (memcmp(&buffer[18], &buffer[0], 6) == 0))) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading continuously...\n");
+  // read the following registers continously (24 bytes):
+  // output 0-3 + polarity inversions 0-3 + configuration 0-3 + output drive strength 0A-2B + input latch 0-3 + pupd enable 0-3 + pupd selection 0-3
+  status = pcal6524_lld_read_continuous(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((aos_test_pcal6524data_t*)test->data)->timeout);
+  chprintf(stream, "\t\toutput: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
+  chprintf(stream, "\t\tpolarity inversion: 0x%02X 0x%02X 0x%02X\n", buffer[3], buffer[4], buffer[5]);
+  chprintf(stream, "\t\tconfiguration: 0x%02X 0x%02X 0x%02X\n", buffer[6], buffer[7], buffer[8]);
+  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
+           (((uint16_t)buffer[9]) << 8) | buffer[10],
+           (((uint16_t)buffer[11]) << 8) | buffer[12],
+           (((uint16_t)buffer[13]) << 8) | buffer[14]);
+  chprintf(stream, "\t\tinput latch: 0x%02X 0x%02X 0x%02X\n", buffer[15], buffer[16], buffer[17]);
+  chprintf(stream, "\t\tpupd enable: 0x%02X 0x%02X 0x%02X\n", buffer[18], buffer[19], buffer[20]);
+  chprintf(stream, "\t\tpupd selection: 0x%02X 0x%02X 0x%02X\n", buffer[21], buffer[22], buffer[23]);
+  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing continuously...\n");
+  {
+    uint8_t writebuffer[24];
+    uint8_t readbuffer[2][24];
+    // copy the read configuration but set the output drive strength to factor 0.25
+    memcpy(writebuffer, buffer, sizeof(buffer));
+    memset(&writebuffer[9], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
+    status = pcal6524_lld_write_continuous(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, writebuffer, 24, ((aos_test_pcal6524data_t*)test->data)->timeout);
+    status |= pcal6524_lld_read_continuous(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[0], 24, ((aos_test_pcal6524data_t*)test->data)->timeout);
+    status |= pcal6524_lld_write_continuous(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((aos_test_pcal6524data_t*)test->data)->timeout);
+    status |= pcal6524_lld_read_continuous(((aos_test_pcal6524data_t*)test->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[1], 24, ((aos_test_pcal6524data_t*)test->data)->timeout);
+    if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
+        ((memcmp(writebuffer, readbuffer[0], 24) == 0) && (memcmp(buffer, readbuffer[1], 24) == 0))) {
+      aosTestPassed(stream, &result);
+    } else {
+      aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+  }
+
+  aosTestInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(PCAL6524Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/PCAL6524_v1/aos_test_PCAL6524.h b/test/periphery-lld/PCAL6524_v1/aos_test_PCAL6524.h
new file mode 100644
index 0000000..63c733a
--- /dev/null
+++ b/test/periphery-lld/PCAL6524_v1/aos_test_PCAL6524.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_PCAL6524_H
+#define AMIROOS_TEST_PCAL6524_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_PCAL6524.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   pointer to the PCAL6524 driver to use.
+   */
+  PCAL6524Driver* pcal6524d;
+
+  /**
+   * @brief   Timeout value (in µs).
+   */
+  apalTime_t timeout;
+} aos_test_pcal6524data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestPcal6524Func(BaseSequentialStream* stream, const aos_test_t *test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_PCAL6524_H */
diff --git a/test/periphery-lld/PKxxxExxx_v1/aos_test_PKxxxExxx.c b/test/periphery-lld/PKxxxExxx_v1/aos_test_PKxxxExxx.c
new file mode 100644
index 0000000..45716f5
--- /dev/null
+++ b/test/periphery-lld/PKxxxExxx_v1/aos_test_PKxxxExxx.c
@@ -0,0 +1,79 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_PKxxxExxx.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestPkxxxexxxFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_pkxxxexxxdata_t*)test->data)->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+
+  chprintf(stream, "checking PWM configuration...\n");
+  status = pkxxxexxx_lld_checkPWMconfiguration(((aos_test_pkxxxexxxdata_t*)test->data)->driver);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    // abort at this point
+    return result;
+  }
+
+  chprintf(stream, "buzzing for one second...\n");
+  status = pkxxxexxx_lld_enable(((aos_test_pkxxxexxxdata_t*)test->data)->driver, ((aos_test_pkxxxexxxdata_t*)test->data)->channel, true);
+  aosThdSSleep(1);
+  status |= pkxxxexxx_lld_enable(((aos_test_pkxxxexxxdata_t*)test->data)->driver, ((aos_test_pkxxxexxxdata_t*)test->data)->channel, false);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  return result;
+}
+
+#endif /* AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/PKxxxExxx_v1/aos_test_PKxxxExxx.h b/test/periphery-lld/PKxxxExxx_v1/aos_test_PKxxxExxx.h
new file mode 100644
index 0000000..ece8a75
--- /dev/null
+++ b/test/periphery-lld/PKxxxExxx_v1/aos_test_PKxxxExxx.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_PKxxxExxx_H
+#define AMIROOS_TEST_PKxxxExxx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_PKxxxExxx.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the PWM driver.
+   */
+  apalPWMDriver_t* driver;
+
+  /**
+   * @brief   PWM channel to use.
+   */
+  apalPWMchannel_t channel;
+} aos_test_pkxxxexxxdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestPkxxxexxxFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_PKxxxExxx_H */
diff --git a/test/periphery-lld/TLC5947_v1/aos_test_TLC5947.c b/test/periphery-lld/TLC5947_v1/aos_test_TLC5947.c
new file mode 100644
index 0000000..ec8dcbc
--- /dev/null
+++ b/test/periphery-lld/TLC5947_v1/aos_test_TLC5947.c
@@ -0,0 +1,199 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_TLC5947.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   TLC9547 test function
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestTlc5947Func(BaseSequentialStream *stream, const aos_test_t *test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_tlc5947data_t*)test->data)->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  int32_t status = 0;
+  tlc5947_lld_blank_t blank;
+  tlc5947_lld_buffer_t buffer;
+
+  chprintf(stream, "reading blank pin...\n");
+  status = tlc5947_lld_getBlank(((aos_test_tlc5947data_t*)test->data)->driver, &blank);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassedMsg(stream, &result, "blank is %s\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabled" : "disabled");
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // enabling/disabling blank pin
+  for (uint8_t i = 0; i < 2; ++i) {
+    blank = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
+    tlc5947_lld_blank_t blank_after = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
+    chprintf(stream, "%s blank pin...\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabling" : "disabling");
+    status = tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, blank);
+    status |= tlc5947_lld_getBlank(((aos_test_tlc5947data_t*)test->data)->driver, &blank_after);
+    if (status == APAL_STATUS_OK && blank_after == blank) {
+      aosTestPassed(stream, &result);
+    } else {
+      aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    }
+  }
+
+  chprintf(stream, "setting all black and dimming white...\n");
+  status = tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_ENABLE);
+  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
+  status |= tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+  status |= tlc5947_lld_update(((aos_test_tlc5947data_t*)test->data)->driver);
+  status |= tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_DISABLE);
+  for (uint8_t bit = 0; bit < TLC5947_LLD_PWM_RESOLUTION_BITS; ++bit) {
+    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+      tlc5947_lld_setBuffer(&buffer, channel, (1 << (bit+1)) - 1);
+    }
+    status |= tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+    status |= tlc5947_lld_update(((aos_test_tlc5947data_t*)test->data)->driver);
+    aosThdMSleep(100);
+  }
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "NOT dimming black again...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t bit = TLC5947_LLD_PWM_RESOLUTION_BITS; bit > 0; --bit) {
+    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+      tlc5947_lld_setBuffer(&buffer, channel, (1 << bit) - 1);
+    }
+    status |= tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_ENABLE);
+    status |= tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+    status |= tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_ENABLE);
+    // Grayscale data is not updated this time (tlc5947_lld_update() not called).
+    // TODO: For some reason the PWMs are updated nevertheless.
+    aosThdMSleep(100);
+  }
+  status |= tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_ENABLE);
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "setting each channel incrementally...\n");
+  status = APAL_STATUS_OK;
+  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
+  status |= tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+  status |= tlc5947_lld_update(((aos_test_tlc5947data_t*)test->data)->driver);
+  status |= tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_DISABLE);
+  for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+    uint16_t value = 0x0000u;
+    for (uint8_t byte = 0; byte < 3; ++byte) {
+      switch (byte) {
+        case 0:
+          value |= 0x00Fu;
+          break;
+        case 1:
+          value |= 0x0F0u;
+          break;
+        case 2:
+          value |= 0xF00u;
+          break;
+      }
+      tlc5947_lld_setBuffer(&buffer, channel, value);
+      status |= tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+      status |= tlc5947_lld_update(((aos_test_tlc5947data_t*)test->data)->driver);
+      aosThdSleep(10.0f / TLC5947_LLD_NUM_CHANNELS / 3.0f);
+      tlc5947_lld_setBuffer(&buffer, channel, 0);
+    }
+  }
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "setting one color after another...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t color = 0; color < 3; ++color) {
+    for (uint8_t channel = color; channel < TLC5947_LLD_NUM_CHANNELS; channel += 3) {
+      const uint16_t val = 0xAF5u; // some deterministic value with high entropy
+      tlc5947_lld_setBuffer(&buffer, channel, val);
+      status |= tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+      status |= tlc5947_lld_update(((aos_test_tlc5947data_t*)test->data)->driver);
+      status |= (tlc5947_lld_getBuffer(&buffer, channel) != val) ? ((int32_t)1 << 30) : 0;
+      if (status != APAL_STATUS_OK) {
+        break;
+      } else {
+        aosThdSleep(10.0f / TLC5947_LLD_NUM_CHANNELS / 3.0f);
+      }
+    }
+    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
+      tlc5947_lld_setBuffer(&buffer, channel, 0);
+    }
+  }
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // turn LEDs off
+  tlc5947_lld_setBlank(((aos_test_tlc5947data_t*)test->data)->driver, TLC5947_LLD_BLANK_ENABLE);
+  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
+  tlc5947_lld_write(((aos_test_tlc5947data_t*)test->data)->driver, &buffer);
+  tlc5947_lld_update(((aos_test_tlc5947data_t*)test->data)->driver);
+
+  aosTestInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(TLC5947Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/TLC5947_v1/aos_test_TLC5947.h b/test/periphery-lld/TLC5947_v1/aos_test_TLC5947.h
new file mode 100644
index 0000000..ebe033a
--- /dev/null
+++ b/test/periphery-lld/TLC5947_v1/aos_test_TLC5947.h
@@ -0,0 +1,77 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_TLC5947_H
+#define AMIROOS_TEST_TLC5947_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_TLC5947.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  TLC5947Driver* driver;
+
+} aos_test_tlc5947data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestTlc5947Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_TLC5947_H */
diff --git a/test/periphery-lld/TPS20xxB_v1/aos_test_TPS20xxB.c b/test/periphery-lld/TPS20xxB_v1/aos_test_TPS20xxB.c
new file mode 100644
index 0000000..91f66f9
--- /dev/null
+++ b/test/periphery-lld/TPS20xxB_v1/aos_test_TPS20xxB.c
@@ -0,0 +1,103 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_TPS20xxB.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   TPS20xxB test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestTps20xxbFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_tps20xxbdata_t*)test->data)->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status = AOS_OK;
+  tps20xxb_lld_enable_t en;
+  tps20xxb_lld_overcurrent_t oc;
+
+  chprintf(stream, "write laser enable...\n");
+  status = tps20xxb_lld_set_enable(((aos_test_tps20xxbdata_t*)test->data)->driver, TPS20xxB_LLD_ENABLE);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read laser enable...\n");
+  status = tps20xxb_lld_read_enable(((aos_test_tps20xxbdata_t*)test->data)->driver, &en);
+  if (status == APAL_STATUS_SUCCESS && en == TPS20xxB_LLD_ENABLE) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "read laser oc...\n");
+  status = tps20xxb_lld_read_overcurrent(((aos_test_tps20xxbdata_t*)test->data)->driver, &oc);
+  if (status == APAL_STATUS_SUCCESS && oc == TPS20xxB_LLD_NO_OVERCURRENT) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  chprintf(stream, "disable laser...\n");
+  status = tps20xxb_lld_set_enable(((aos_test_tps20xxbdata_t*)test->data)->driver, TPS20xxB_LLD_DISABLE);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailed(stream, &result);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS20xxBDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/TPS20xxB_v1/aos_test_TPS20xxB.h b/test/periphery-lld/TPS20xxB_v1/aos_test_TPS20xxB.h
new file mode 100644
index 0000000..fb480fe
--- /dev/null
+++ b/test/periphery-lld/TPS20xxB_v1/aos_test_TPS20xxB.h
@@ -0,0 +1,77 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_TPS20xxB_H
+#define AMIROOS_TEST_TPS20xxB_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_TPS20xxB.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  TPS20xxBDriver* driver;
+
+} aos_test_tps20xxbdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestTps20xxbFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_TPS20xxB_H */
diff --git a/test/periphery-lld/TPS6211x_v1/aos_test_TPS6211x.c b/test/periphery-lld/TPS6211x_v1/aos_test_TPS6211x.c
new file mode 100644
index 0000000..0e74bbf
--- /dev/null
+++ b/test/periphery-lld/TPS6211x_v1/aos_test_TPS6211x.c
@@ -0,0 +1,80 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_TPS6211x.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestTps6211xFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_tps6211xbdata_t*)test->data)->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0,0};
+  int32_t status;
+  tps6211x_lld_power_en_t power;
+
+  chprintf(stream, "read pin...\n");
+  status = tps6211x_lld_get_power_en(((aos_test_tps6211xbdata_t*)test->data)->driver, &power);
+  if(status == APAL_STATUS_SUCCESS){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write pin...\n");
+  status = tps6211x_lld_set_power_en(((aos_test_tps6211xbdata_t*)test->data)->driver, TPS6211x_LLD_POWER_ENABLED);
+  status |= tps6211x_lld_get_power_en(((aos_test_tps6211xbdata_t*)test->data)->driver, &power);
+  if(status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_ENABLED){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS6211xDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/TPS6211x_v1/aos_test_TPS6211x.h b/test/periphery-lld/TPS6211x_v1/aos_test_TPS6211x.h
new file mode 100644
index 0000000..f0e8800
--- /dev/null
+++ b/test/periphery-lld/TPS6211x_v1/aos_test_TPS6211x.h
@@ -0,0 +1,77 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_TPS6211x_H
+#define AMIROOS_TEST_TPS6211x_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_TPS6211x.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  TPS6211xDriver* driver;
+
+} aos_test_tps6211xbdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestTps6211xFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_TPS6211x_H */
diff --git a/test/periphery-lld/TPS6211x_v1_INA219_v1/aos_test_TPS6211x_INA219.c b/test/periphery-lld/TPS6211x_v1_INA219_v1/aos_test_TPS6211x_INA219.c
new file mode 100644
index 0000000..26b74b8
--- /dev/null
+++ b/test/periphery-lld/TPS6211x_v1_INA219_v1/aos_test_TPS6211x_INA219.c
@@ -0,0 +1,88 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_TPS6211x_INA219.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestTps6211xIna219Func(BaseSequentialStream *stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_tps6211xina219data_t*)test->data)->tps6211x != NULL && ((aos_test_tps6211xina219data_t*)test->data)->ina219 != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  tps6211x_lld_power_en_t power;
+  uint32_t v_buson, v_busoff;
+
+  chprintf(stream, "read pin...\n");
+  status = tps6211x_lld_get_power_en(((aos_test_tps6211xina219data_t*)test->data)->tps6211x, &power);
+  aosThdSSleep(1);
+  status |= ina219_lld_read_bus_voltage(((aos_test_tps6211xina219data_t*)test->data)->ina219, &v_buson, ((aos_test_tps6211xina219data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_ENABLED) {
+    aosTestPassedMsg(stream, &result, "enabled, %fV\n", (float)v_buson / 1000000.0f);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write pin...\n");
+  status = tps6211x_lld_set_power_en(((aos_test_tps6211xina219data_t*)test->data)->tps6211x, TPS6211x_LLD_POWER_DISABLED);
+  status |= tps6211x_lld_get_power_en(((aos_test_tps6211xina219data_t*)test->data)->tps6211x, &power);
+  aosThdSSleep(1);
+  status |= ina219_lld_read_bus_voltage(((aos_test_tps6211xina219data_t*)test->data)->ina219, &v_busoff, ((aos_test_tps6211xina219data_t*)test->data)->timeout);
+  status |= tps6211x_lld_set_power_en(((aos_test_tps6211xina219data_t*)test->data)->tps6211x, TPS6211x_LLD_POWER_ENABLED);
+  if (status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_DISABLED) {
+    chprintf(stream, "\tdisabled, %fV\n", (float)v_busoff / 1000000.0f);
+    if (v_buson > v_busoff) {
+      aosTestPassed(stream, &result);
+    } else {
+      aosTestFailedMsg(stream, &result, "on: %fV; off: %fV\n", (float)v_buson / 1000000.0f, (float)v_busoff / 1000000.0f);
+    }
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/TPS6211x_v1_INA219_v1/aos_test_TPS6211x_INA219.h b/test/periphery-lld/TPS6211x_v1_INA219_v1/aos_test_TPS6211x_INA219.h
new file mode 100644
index 0000000..d0d80ed
--- /dev/null
+++ b/test/periphery-lld/TPS6211x_v1_INA219_v1/aos_test_TPS6211x_INA219.h
@@ -0,0 +1,87 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_TPS6211x_INA219_H
+#define AMIROOS_TEST_TPS6211x_INA219_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_TPS6211x.h>
+#include <alld_INA219.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   TPS62113 driver to use.
+   */
+  TPS6211xDriver* tps6211x;
+
+  /**
+   * @brief   INA219 driver to use.
+   */
+  INA219Driver* ina219;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} aos_test_tps6211xina219data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestTps6211xIna219Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_TPS6211x_INA219_H */
diff --git a/test/periphery-lld/VCNL4020_v1/aos_test_VCNL4020.c b/test/periphery-lld/VCNL4020_v1/aos_test_VCNL4020.c
new file mode 100644
index 0000000..35694b1
--- /dev/null
+++ b/test/periphery-lld/VCNL4020_v1/aos_test_VCNL4020.c
@@ -0,0 +1,242 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_VCNL4020.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+#define INTERRUPT_THRESHOLD           0x2000
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestVcnl4020Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck((test->data != NULL) &&
+              (((aos_test_vcnl4020data_t*)(test->data))->vcnld != NULL) &&
+              (((aos_test_vcnl4020data_t*)(test->data))->evtsource != NULL));
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  uint8_t reg_buf[4] = {0};
+  uint8_t* reg_8 = (uint8_t*)(reg_buf);
+  uint16_t* reg_16 = (uint16_t*)(reg_buf);
+  event_listener_t event_listener;
+  aos_timestamp_t tcurrent, tend;
+
+  chprintf(stream, "reading register...\n");
+  status = vcnl4020_lld_readreg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_IDREV, &reg_8[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && reg_8[0] == 0x21u) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; 0x%08X\n", status, reg_8[0]);
+  }
+
+  chprintf(stream, "writing register...\n");
+  status = vcnl4020_lld_writereg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, VCNL4020_LLD_PROXRATEREG_250_HZ, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_readreg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, &reg_8[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= (reg_8[0] == VCNL4020_LLD_PROXRATEREG_250_HZ) ? 0x0000 : 0x0100;
+  status |= vcnl4020_lld_writereg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED), ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_readreg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, &reg_8[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= (reg_8[0] & (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED)) ? 0x0000 : 0x0200;
+  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, 0x%02X\n", status, reg_8[0]);
+  }
+
+  chprintf(stream, "reading ambient light for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 10; ++i) {
+    aosThdSSleep(1);
+    status |= vcnl4020_lld_readals(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+    chprintf(stream, "\t\tambient light: 0x%04X\n", reg_16[0]);
+  }
+  status |= (reg_16[0] == 0x0000) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading proximity for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 10; ++i) {
+    aosThdSSleep(1);
+    status |= vcnl4020_lld_readprox(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[1], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+    chprintf(stream, "\t\tproximity: 0x%04X\n", reg_16[1]);
+  }
+  status |= (reg_16[1] == 0x0000) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading ambient light and proximity for ten seconds...\n");
+  status = APAL_STATUS_OK;
+  for (uint8_t i = 0; i < 10; ++i) {
+    aosThdSSleep(1);
+    status |= vcnl4020_lld_readalsandprox(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], &reg_16[1], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+    chprintf(stream, "\t\tambient light: 0x%04X\tproximity: 0x%04X\n", reg_16[0], reg_16[1]);
+  }
+  status |= (reg_16[0] == 0x0000 || reg_16[1] == 0x0000) ? 0x10 : 0x00;
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading low threshold register...\n");
+  status = vcnl4020_lld_readlth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading high threshold register...\n");
+  status = vcnl4020_lld_readhth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[1], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassedMsg(stream, &result, "0x%04X\n", reg_16[1]);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "reading both threshold registers...\n");
+  status = vcnl4020_lld_readth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], &reg_16[1], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_OK) {
+    aosTestPassedMsg(stream, &result, "low: 0x%04X; high: 0x%04X\n", reg_16[0], reg_16[1]);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "writing low threshold register...\n");
+  status = vcnl4020_lld_writelth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, 0xFFFFu, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_readlth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_OK && reg_16[0] == 0xFFFFu) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[0]);
+  }
+
+  chprintf(stream, "writing high threshold register...\n");
+  status = vcnl4020_lld_writehth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, 0xFFFFu, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_readhth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[1], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_OK && reg_16[1] == 0xFFFFu) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[1]);
+  }
+
+  chprintf(stream, "writing both threshold registers...\n");
+  status = vcnl4020_lld_writeth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, 0x5555u, 0xAAAAu, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_readth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], &reg_16[1], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_OK && reg_16[0] == 0x5555u && reg_16[1] == 0xAAAAu) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, 0x%04X, 0x%04X\n", status, reg_16[0], reg_16[1]);
+  }
+
+  chprintf(stream, "test interrupts...\n");
+  chprintf(stream, "(thresholds are 0x%04X and 0x%04X)\n", 0, INTERRUPT_THRESHOLD);
+  chEvtRegister(((aos_test_vcnl4020data_t*)(test->data))->evtsource, &event_listener, INTERRUPT_EVENT_ID);
+  aosSysGetUptime(&tend);
+  tend += 30 * MICROSECONDS_PER_SECOND;
+  status = vcnl4020_lld_writeth(((aos_test_vcnl4020data_t*)(test->data))->vcnld, 0x0000, INTERRUPT_THRESHOLD, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_writereg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, VCNL4020_LLD_INTCTRLREG_THRES_EN, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  do {
+    // read proximity data, interrupt event information and interrupt status
+    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(10*MICROSECONDS_PER_MILLISECOND));
+    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
+    status |= vcnl4020_lld_readprox(((aos_test_vcnl4020data_t*)(test->data))->vcnld, &reg_16[0], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+    status |= vcnl4020_lld_readreg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
+        eflags == ((aos_test_vcnl4020data_t*)(test->data))->evtflags &&
+        reg_8[2] == VCNL4020_LLD_INTSTATUSREG_THHIGH) {
+      // true positive (correct case)
+      chprintf(stream, "\t\tinterrupt detected: prox = 0x%04X\n", reg_16[0]);
+      aosThdMSleep(100);
+    }
+    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
+             eflags != ((aos_test_vcnl4020data_t*)(test->data))->evtflags &&
+             reg_8[2] != VCNL4020_LLD_INTSTATUSREG_THHIGH) {
+      // true negative (correct case)
+      // do nothing, just keep on looping
+    }
+    else if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
+             eflags == ((aos_test_vcnl4020data_t*)(test->data))->evtflags &&
+             reg_8[2] != 0 ) {
+      // false positive
+      status |= 0x1000;
+      chprintf(stream, "\t\tfalse positive: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
+    }
+    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
+             eflags != ((aos_test_vcnl4020data_t*)(test->data))->evtflags &&
+             reg_8[2] == 0) {
+      // false negative
+      status |= 0x2000;
+      chprintf(stream, "\t\tfalse negative: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
+    } // any other events are just ignored
+    // reset interrupt status
+    if (reg_8[2] != 0) {
+      status |= vcnl4020_lld_writereg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+    }
+    aosSysGetUptime(&tcurrent);
+  } while (tcurrent < tend);
+  chEvtUnregister(((aos_test_vcnl4020data_t*)(test->data))->evtsource, &event_listener);
+  status |= vcnl4020_lld_writereg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_readreg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  status |= vcnl4020_lld_writereg(((aos_test_vcnl4020data_t*)(test->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((aos_test_vcnl4020data_t*)(test->data))->timeout);
+  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosTestInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(VCNL4020Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/VCNL4020_v1/aos_test_VCNL4020.h b/test/periphery-lld/VCNL4020_v1/aos_test_VCNL4020.h
new file mode 100644
index 0000000..1ad6f9b
--- /dev/null
+++ b/test/periphery-lld/VCNL4020_v1/aos_test_VCNL4020.h
@@ -0,0 +1,91 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_VCNL4020_H
+#define AMIROOS_TEST_VCNL4020_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_VCNL4020.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   VCNL4020 driver to use.
+   */
+  VCNL4020Driver *vcnld;
+
+  /**
+   * @brief   Timeout for certain tests.
+   */
+  apalTime_t timeout;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} aos_test_vcnl4020data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestVcnl4020Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_VCNL4020_H */
diff --git a/test/periphery-lld/bq241xx_v1/aos_test_bq241xx.c b/test/periphery-lld/bq241xx_v1/aos_test_bq241xx.c
new file mode 100644
index 0000000..bf30bf3
--- /dev/null
+++ b/test/periphery-lld/bq241xx_v1/aos_test_bq241xx.c
@@ -0,0 +1,97 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_bq241xx.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+
+aos_testresult_t aosTestBq241xxFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  bq241xx_lld_enable_t en[3];
+  bq241xx_lld_charge_state_t charge;
+
+  chprintf(stream, "read enable pin...\n");
+  status = bq241xx_lld_get_enabled(((aos_test_bq241xxdata_t*)test->data)->driver, &en[0]);
+  chprintf(stream, "\t\tcurrently %s\n", (en[0] == BQ241xx_LLD_ENABLED) ? "enabled" : "disabled");
+  if(status == APAL_STATUS_SUCCESS){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "write enable pin...\n");
+  status = bq241xx_lld_set_enabled(((aos_test_bq241xxdata_t*)test->data)->driver, (en[0] == BQ241xx_LLD_ENABLED) ? BQ241xx_LLD_DISABLED : BQ241xx_LLD_ENABLED);
+  aosThdMSleep(1);
+  status |= bq241xx_lld_get_enabled(((aos_test_bq241xxdata_t*)test->data)->driver, &en[1]);
+  status |= bq241xx_lld_set_enabled(((aos_test_bq241xxdata_t*)test->data)->driver, en[0]);
+  aosThdMSleep(1);
+  status |= bq241xx_lld_get_enabled(((aos_test_bq241xxdata_t*)test->data)->driver, &en[2]);
+  if(status == APAL_STATUS_SUCCESS && en[0] != en[1] && en[0] == en[2] && en[1] != en[2]){
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, %u-%u\n", status, en[1], en[2]);
+  }
+
+  chprintf(stream, "read status pin...\n");
+  aosThdMSleep(500);
+  status = bq241xx_lld_get_charge_status(((aos_test_bq241xxdata_t*)test->data)->driver, &charge);
+  chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ241xxDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/bq241xx_v1/aos_test_bq241xx.h b/test/periphery-lld/bq241xx_v1/aos_test_bq241xx.h
new file mode 100644
index 0000000..8cbaf10
--- /dev/null
+++ b/test/periphery-lld/bq241xx_v1/aos_test_bq241xx.h
@@ -0,0 +1,76 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_BQ241xx_H
+#define AMIROOS_TEST_BQ241xx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_bq241xx.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  BQ241xxDriver* driver;
+} aos_test_bq241xxdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestBq241xxFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_BQ241xx_H */
diff --git a/test/periphery-lld/bq27500_v1/aos_test_bq27500.c b/test/periphery-lld/bq27500_v1/aos_test_bq27500.c
new file mode 100644
index 0000000..02a2ba8
--- /dev/null
+++ b/test/periphery-lld/bq27500_v1/aos_test_bq27500.c
@@ -0,0 +1,557 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_bq27500.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <string.h>
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+// change saved unseal keys to test bruteforcing
+#if defined(BQ27500_TEST_BRUTEFORCE)
+
+#if defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY0)
+#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY0
+#define BQ27500_LLD_DEFAULT_UNSEAL_KEY0 0x1234
+#endif /* defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY0) */
+
+#if defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY1)
+#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY1
+#define BQ27500_LLD_DEFAULT_UNSEAL_KEY1 0x5678
+#endif /* defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY1) */
+
+#endif /* defined(BQ27500_TEST_BRUTEFORCE) */
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+bq27500_lld_control_status_t _try_unseal(BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
+  uint16_t dst;
+  bq27500_lld_control_status_t ctrl;
+  bq27500_lld_send_ctnl_data(driver, key1, timeout);
+  aosThdUSleep(1);
+  bq27500_lld_send_ctnl_data(driver, key0, timeout);
+  aosThdUSleep(1);
+  bq27500_lld_sub_command_call(driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, timeout);
+  aosThdUSleep(1);
+  bq27500_lld_std_command(driver, BQ27500_LLD_STD_CMD_Control, &dst, timeout);
+  bq27500_lld_sub_command_read(driver, &ctrl.value, timeout);
+  return ctrl;
+}
+
+uint8_t _bruteforce_sealed_key_bitflips(BaseSequentialStream* stream, BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
+  bq27500_lld_control_status_t ctrl;
+  uint16_t k0;
+  uint16_t k1 = key1;
+  for (uint8_t i = 0; i < 16; i++) {
+    k0 = key0 ^ (1 << i); // flip bit i
+    ctrl = _try_unseal(driver, k0, k1, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+      return 1;
+    }
+  }
+  k0 = key0;
+  for (uint8_t i = 0; i < 16; i++) {
+    k1 = key1 ^ (1 << i); // flip bit i
+    ctrl = _try_unseal(driver, k0, k1, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+      return 1;
+    }
+  }
+  return 0;
+}
+
+void _bruteforce_sealed_key(BaseSequentialStream* stream, BQ27500Driver* driver, apalTime_t timeout) {
+  chprintf(stream, "start bruteforcing sealed keys...\n");
+  bq27500_lld_control_status_t ctrl;
+  uint16_t key0_reversed = 0x7236;
+  uint16_t key1_reversed = 0x1404;
+  uint16_t key0 = BQ27500_LLD_DEFAULT_UNSEAL_KEY0;
+  uint16_t key1 = BQ27500_LLD_DEFAULT_UNSEAL_KEY1;
+  uint16_t k0 = key0;
+  uint16_t k1 = key1;
+
+  // testing default keys in different orders
+  chprintf(stream, "\ttry reversed byte order and different key order...\n");
+  // default unseal keys
+  ctrl = _try_unseal(driver, k0, k1, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  // default unseal keys in reversed order
+  ctrl = _try_unseal(driver, k1, k0, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  // byte reversed keys
+  k0 = key0_reversed;
+  k1 = key1_reversed;
+  ctrl = _try_unseal(driver, k0, k1, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  // byte reversed keys in reversed order
+  ctrl = _try_unseal(driver, k1, k0, timeout);
+  if (ctrl.content.ss == 0x0) {
+    chprintf(stream, "\t\tSUCCESS!\n");
+    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
+    return;
+  }
+  chprintf(stream, "\t\tfailed\n");
+
+
+  // testing single bit flips of the default keys in different orders
+  chprintf(stream, "\ttry single bit flips of default keys...\n");
+  // default unseal keys
+  uint8_t result = 0;
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key0, key1, timeout);
+  if (result == 1) {
+    return;
+  }
+  // default unseal keys in reversed order
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key1, key0, timeout);
+  if (result == 1) {
+    return;
+  }
+  // byte reversed keys
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key0_reversed, key1_reversed, timeout);
+  if (result == 1) {
+    return;
+  }
+  // byte reversed keys in reversed order
+  result = _bruteforce_sealed_key_bitflips(stream, driver, key1_reversed, key0_reversed, timeout);
+  if (result == 1) {
+    return;
+  }
+  chprintf(stream, "\t\tfailed\n");
+
+
+  // bruteforcing one of the keys, assuming only one of them was changed
+  chprintf(stream, "\ttry bruteforcing a single key...\n");
+  // default unseal key0
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key0, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 1/8\n");
+  // reversed unseal key0
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key0_reversed, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0_reversed, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 2/8\n");
+  // default unseal key0 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key0, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 3/8\n");
+  // reversed unseal key0 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key0_reversed, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0_reversed);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 4/8\n");
+  // default unseal key1
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key1, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 5/8\n");
+  // reversed unseal key1
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, i, key1_reversed, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1_reversed);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 6/8\n");
+  // default unseal key1 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key1, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 7/8\n");
+  // reversed unseal key1 in reversed order
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    ctrl = _try_unseal(driver, key1_reversed, i, timeout);
+    if (ctrl.content.ss == 0x0) {
+      chprintf(stream, "\t\tSUCCESS!\n");
+      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1_reversed, i);
+      return;
+    }
+  }
+  chprintf(stream, "\t\tkey failed. 8/8\n");
+  chprintf(stream, "\t\tfailed\n");
+
+
+  // full bruteforce
+  chprintf(stream, "\tbruteforcing both keys...\t");
+  for (uint32_t i = 0; i <= 0xFFFF; i++) {
+    chprintf(stream, "\t\ti: %u\n", i);
+    for (uint32_t j = 0; j <= 0xFFFF; j++) {
+      ctrl = _try_unseal(driver, i, j, timeout);
+      if (ctrl.content.ss == 0x0) {
+        chprintf(stream, "\t\tSUCCESS!\n");
+        chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, j);
+        return;
+      }
+    }
+  }
+
+  chprintf(stream, "\t\tfailed, no keys could be found");
+}
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+aos_testresult_t aosTestBq27500Func(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_bq27500data_t*)(test->data))->driver != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  bq27500_lld_batlow_t bl;
+  bq27500_lld_batgood_t bg;
+  uint16_t dst;
+  bq27500_lld_flags_t flags;
+  uint16_t subdata = 0;
+  uint8_t original_length;
+  char original_name[8+1];
+  uint8_t val = 0x00;
+  uint8_t block[32];
+  char new_name[] = "test";
+  uint8_t new_lenght;
+  char name[8+1] = {'\0'};
+  uint8_t sum = 0;
+  bool success;
+  bool success2;
+
+  chprintf(stream, "read battery low gpio...\n");
+  status = bq27500_lld_read_batlow(((aos_test_bq27500data_t*)test->data)->driver, &bl);
+  chprintf(stream, "\t\tbattery low: 0x%X\n", bl);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "read battery good gpio...\n");
+  status = bq27500_lld_read_batgood(((aos_test_bq27500data_t*)test->data)->driver, &bg);
+  chprintf(stream, "\t\tbattery good: 0x%X\n", bg);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "std command FLAGS...\n");
+  status = bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Flags, &flags.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tflags: 0x%04X\n", flags.value);
+  chprintf(stream, "\t\tbattery detected: 0x%X\n", flags.content.bat_det);
+  chprintf(stream, "\t\tbattery fully charged: 0x%X\n", flags.content.fc);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "std command CTNL...\n");
+  status = bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "sub command: CTRL Status...\n");
+  aosThdUSleep(1);
+  status = bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdUSleep(1);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdUSleep(1);
+  bq27500_lld_control_status_t ctrl;
+  status |= bq27500_lld_sub_command_read(((aos_test_bq27500data_t*)test->data)->driver, &ctrl.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tdst: 0x%X\n", ctrl.value);
+  chprintf(stream, "\t\tsleep: 0x%X\n", ctrl.content.sleep);
+  chprintf(stream, "\t\thibernate: 0x%X\n", ctrl.content.hibernate);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "sub command: firmware version...\n");
+  status = bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_FW_VERSION, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1);
+  bq27500_lld_version_t version;
+  status |= bq27500_lld_sub_command_read(((aos_test_bq27500data_t*)test->data)->driver, &version.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tfirmware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "sub command: hardware version...\n");
+  status = bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_HW_VERSION, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_sub_command_read(((aos_test_bq27500data_t*)test->data)->driver, &version.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\thardware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "ext command: device name length...\n");
+  status = bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tdevice name length: %d\n", original_length);
+  if (status == APAL_STATUS_SUCCESS && original_length <= 8) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    original_length = 8;
+  }
+
+  chprintf(stream, "ext command: device name (read)...\n");
+  status = bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)original_name, original_length, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  original_name[original_length] = '\0';
+  chprintf(stream, "\t\tdevice name: %s\n", original_name);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "battery info std commands...\n");
+  status = bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Temperature, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\ttemperature: %fK (%fC)\n", (float)dst/10.0f, (float)dst/10.0f-273.5f);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_FullAvailableCapacity, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tfull available capacity: %umAh\n", dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_FullChargeCapacity, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tfull charge capacity: %umAh\n", dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_RemainingCapacity, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tremaining capacity: %umAh\n", dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Voltage, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tvoltage: %umV\n", dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_AverageCurrent, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\taverage current: %dmA\n", (int8_t)dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_AveragePower, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\taverage power: %dmW\n", (int8_t)dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_StateOfCharge, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tstate of charge: %u%%\n", dst);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  if (dst != (uint16_t)~0) {
+    chprintf(stream, "\t\ttime to full: %umin\n", dst);
+  } else {
+    chprintf(stream, "\t\ttime to full: (not charging)\n", dst);
+  }
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_TimeToEmpty, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  if (dst != (uint16_t)~0) {
+    chprintf(stream, "\t\ttime to empty: %umin\n", dst);
+  } else {
+    chprintf(stream, "\t\ttime to empty: (not discharging)\n", dst);
+  }
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "check sealed state...\n");
+  status = bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  status |= bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_sub_command_read(((aos_test_bq27500data_t*)test->data)->driver, &ctrl.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  chprintf(stream, "\t\tsealed: 0x%X\n", ctrl.content.ss);
+  chprintf(stream, "\t\tfull access sealed: 0x%X\n", ctrl.content.fas);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "unseale...\n");
+  status = bq27500_lld_send_ctnl_data(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY1, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_send_ctnl_data(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  status |= bq27500_lld_sub_command_read(((aos_test_bq27500data_t*)test->data)->driver, &ctrl.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x0) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+    _bruteforce_sealed_key(stream, ((aos_test_bq27500data_t*)test->data)->driver, ((aos_test_bq27500data_t*)test->data)->timeout);
+  }
+
+  chprintf(stream, "read device name from data flash...\n");
+  status = bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  val = 0x30;
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  val = 0;
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, original_length, 13, ((aos_test_bq27500data_t*)test->data)->timeout);
+  block[original_length] = '\0';
+  chprintf(stream, "\t\tdevice name: %s\n", block);
+  if (status == APAL_STATUS_SUCCESS && (strcmp((char*)block, (char*)original_name) == 0)) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\t\tread data: ");
+    for (uint8_t blockIdx = 0; blockIdx < original_length; blockIdx++) {
+      chprintf(stream, "0x%02X\n", block[blockIdx]);
+    }
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  chprintf(stream, "change device name in data flash to \"test\"...\n");
+  status = bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)new_name, 5, 13, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  // compute blockdata checksum
+  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
+  // write checksum to BlockDataChecksum, triggering the write of BlackData
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &new_lenght, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  // read out device name, to see if changing it was successfull
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, new_lenght, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  name[new_lenght] = '\0';
+  chprintf(stream, "\t\tdevice name: %s\n", name);
+  success = (strcmp(name, new_name) == 0);
+
+  // change device name back to original name
+  val = 0x00;
+  status = bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  val = 0x30;
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  val = 0;
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)original_name, 7, 13, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  // compute blockdata checksum
+  sum = 0;
+  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
+  // write checksum to BlockDataChecksum, triggering the write of BlackData
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(1000);
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  // read device name, to see if changing it back to the original name was successfull
+  status |= bq27500_lld_ext_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, original_length, 0, ((aos_test_bq27500data_t*)test->data)->timeout);
+  success2 = (strcmp(name, original_name) == 0);
+  name[original_length] = '\0';
+  chprintf(stream, "\t\tchanged back to name: %s, original_name: %s\n", name, original_name);
+  if (status == APAL_STATUS_OK && ((success && success2) || (ctrl.content.sleep == 0))) {
+    aosTestPassed(stream, &result);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X, changing: 0x%X - changing back: 0x%X\n", status, success, success2);
+  }
+
+  chprintf(stream, "seal...\n");
+  status = bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_SEALED, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_std_command(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_sub_command_call(((aos_test_bq27500data_t*)test->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((aos_test_bq27500data_t*)test->data)->timeout);
+  aosThdMSleep(50);
+  status |= bq27500_lld_sub_command_read(((aos_test_bq27500data_t*)test->data)->driver, &ctrl.value, ((aos_test_bq27500data_t*)test->data)->timeout);
+  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x1) {
+    aosTestPassed(stream, &result);
+  } else {
+    chprintf(stream, "\tfailed (0x%X)\n", status);
+    aosTestFailedMsg(stream, &result, "0x%08X, ctrl 0x%X\n", status, subdata);
+    ++result.failed;
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ27500Driver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
diff --git a/test/periphery-lld/bq27500_v1/aos_test_bq27500.h b/test/periphery-lld/bq27500_v1/aos_test_bq27500.h
new file mode 100644
index 0000000..489a8e8
--- /dev/null
+++ b/test/periphery-lld/bq27500_v1/aos_test_bq27500.h
@@ -0,0 +1,81 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_BQ2750_H
+#define AMIROOS_TEST_BQ2750_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_bq27500.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  BQ27500Driver *driver;
+
+  /**
+   * @brief   Timeout value (in us);
+   */
+  apalTime_t timeout;
+} aos_test_bq27500data_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestBq27500Func(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_BQ2750_H */
diff --git a/test/periphery-lld/bq27500_v1_bq241xx_v1/aos_test_bq27500_bq241xx.c b/test/periphery-lld/bq27500_v1_bq241xx_v1/aos_test_bq27500_bq241xx.c
new file mode 100644
index 0000000..0f2836e
--- /dev/null
+++ b/test/periphery-lld/bq27500_v1_bq241xx_v1/aos_test_bq27500_bq241xx.c
@@ -0,0 +1,156 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_bq27500_bq241xx.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+
+aos_testresult_t aosTestBq27500Bq241xxFunc(BaseSequentialStream *stream, const aos_test_t *test)
+{
+  aosDbgCheck(test->data != NULL && ((aos_test_bq27500bq241xxdata_t*)test->data)->bq27500 != NULL && ((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  uint32_t status;
+  uint16_t dst;
+  bq27500_lld_flags_t flags;
+  bq27500_lld_batgood_t bg;
+  bq241xx_lld_enable_t charger_enabled;
+  uint32_t sleeptime_s;
+  bq241xx_lld_charge_state_t charge;
+
+  chprintf(stream, "check for battery...\n");
+  status = bq27500_lld_std_command(((aos_test_bq27500bq241xxdata_t*)test->data)->bq27500, BQ27500_LLD_STD_CMD_Flags, &dst, ((aos_test_bq27500bq241xxdata_t*)test->data)->timeout);
+  flags.value = dst;
+  chprintf(stream, "\t\tbattery detected: %s\n", flags.content.bat_det ? "yes" : "no");
+  chprintf(stream, "\t\tbattery fully charged: %s\n", flags.content.fc ? "yes" : "no");
+  status |= bq27500_lld_read_batgood(((aos_test_bq27500bq241xxdata_t*)test->data)->bq27500, &bg);
+  chprintf(stream, "\t\tbattery good: %s\n", (bg == BQ27500_LLD_BATTERY_GOOD) ? "yes" : "no");
+  if (status == APAL_STATUS_SUCCESS) {
+    if (!flags.content.bat_det) {
+      aosTestPassedMsg(stream, &result, "no battery detected, aborting\n");
+      return result;
+    } else if (!bg) {
+      aosTestPassedMsg(stream, &result, "battery damaged, aborting\n");
+      return result;
+    } else {
+      aosTestPassed(stream, &result);
+    }
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; aborting\n", status);
+    return result;
+  }
+
+  chprintf(stream, "get current charger setting...\n");
+  status = bq241xx_lld_get_enabled(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, &charger_enabled);
+  if (status == APAL_STATUS_SUCCESS) {
+    aosTestPassedMsg(stream, &result, "currently %s\n", (charger_enabled == BQ241xx_LLD_ENABLED) ? "enabled" : "disabled");
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+  }
+
+  // disable/enable charger
+  for (uint8_t iteration = 0; iteration < 2; ++iteration) {
+    if (charger_enabled == BQ241xx_LLD_ENABLED) {
+      sleeptime_s = 120;
+      chprintf(stream, "disable charger...\n");
+      status = bq241xx_lld_set_enabled(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, BQ241xx_LLD_DISABLED);
+      aosThdSSleep(1);
+      status |= bq241xx_lld_get_enabled(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, &charger_enabled);
+      status |= (charger_enabled == BQ241xx_LLD_DISABLED) ? 0x0000 : 0x0100;
+      for (uint32_t s = 0; s < sleeptime_s; ++s) {
+        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
+        aosThdSSleep(1);
+        for (int c = 0; c < nchars; ++c) {
+          chprintf(stream, "\b \b");
+        }
+      }
+      status |= bq241xx_lld_get_charge_status(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, &charge);
+      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
+      status |= bq27500_lld_std_command(((aos_test_bq27500bq241xxdata_t*)test->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((aos_test_bq27500bq241xxdata_t*)test->data)->timeout);
+      if (status == APAL_STATUS_SUCCESS) {
+        if (dst == 0xFFFF || dst == 0) {
+          aosTestPassedMsg(stream, &result, "battery %sfull\n", flags.content.fc ? "" : "not ");
+        } else {
+          aosTestFailedMsg(stream, &result, "battery %sfull but charging (TTF = %umin)\n", flags.content.fc ? "" : "not ", dst);
+        }
+      } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+      }
+    }
+    else { /* charger_enabled != BQ241xx_LLD_ENABLED */
+      sleeptime_s = 90;
+      chprintf(stream, "enable charger...\n");
+      status = bq241xx_lld_set_enabled(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, BQ241xx_LLD_ENABLED);
+      aosThdSSleep(1);
+      status |= bq241xx_lld_get_enabled(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, &charger_enabled);
+      status |= (charger_enabled == BQ241xx_LLD_ENABLED) ? 0x0000 : 0x0100;
+      for (uint32_t s = 0; s < sleeptime_s; ++s) {
+        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
+        aosThdSSleep(1);
+        for (int c = 0; c < nchars; ++c) {
+          chprintf(stream, "\b \b");
+        }
+      }
+      status |= bq241xx_lld_get_charge_status(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, &charge);
+      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
+      status |= bq27500_lld_std_command(((aos_test_bq27500bq241xxdata_t*)test->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((aos_test_bq27500bq241xxdata_t*)test->data)->timeout);
+      if (status == APAL_STATUS_SUCCESS) {
+        if (((dst == 0xFFFF || dst == 0) && flags.content.fc) || (!(dst == 0xFFFF || dst == 0) && !flags.content.fc)) {
+          aosTestPassedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
+        } else {
+          aosTestFailedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
+        }
+      } else {
+        aosTestFailedMsg(stream, &result, "0x%08X\n", status);
+      }
+    }
+
+    bq241xx_lld_get_enabled(((aos_test_bq27500bq241xxdata_t*)test->data)->bq241xx, &charger_enabled);
+  }
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/bq27500_v1_bq241xx_v1/aos_test_bq27500_bq241xx.h b/test/periphery-lld/bq27500_v1_bq241xx_v1/aos_test_bq27500_bq241xx.h
new file mode 100644
index 0000000..321deb3
--- /dev/null
+++ b/test/periphery-lld/bq27500_v1_bq241xx_v1/aos_test_bq27500_bq241xx.h
@@ -0,0 +1,87 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TEST_BQ27500_BQ241xx_H
+#define AMIROOS_TEST_BQ27500_BQ241xx_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_bq27500.h>
+#include <alld_bq241xx.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   BQ27500 driver to use.
+   */
+  BQ27500Driver* bq27500;
+
+  /**
+   * @brief   BQ24103A driver to use.
+   */
+  BQ241xxDriver* bq241xx;
+
+  /**
+   * @brief   Timeout value (in us).
+   */
+  apalTime_t timeout;
+} aos_test_bq27500bq241xxdata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestBq27500Bq241xxFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TEST_BQ27500_BQ241xx_H */
diff --git a/test/periphery-lld/button_v1/aos_test_button.c b/test/periphery-lld/button_v1/aos_test_button.c
new file mode 100644
index 0000000..a857206
--- /dev/null
+++ b/test/periphery-lld/button_v1/aos_test_button.c
@@ -0,0 +1,103 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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/>.
+*/
+
+#include <amiroos.h>
+#include <aos_test_button.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+/******************************************************************************/
+/* LOCAL DEFINITIONS                                                          */
+/******************************************************************************/
+
+#define INTERRUPT_EVENT_ID            1
+
+/******************************************************************************/
+/* EXPORTED VARIABLES                                                         */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL TYPES                                                                */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL VARIABLES                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* LOCAL FUNCTIONS                                                            */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXPORTED FUNCTIONS                                                         */
+/******************************************************************************/
+
+/**
+ * @brief   Button test function.
+ *
+ * @param[in] stream  Stream for input/output.
+ * @param[in] test    Test object.
+ *
+ * @return            Test result value.
+ */
+aos_testresult_t aosTestButtonFunc(BaseSequentialStream* stream, const aos_test_t* test)
+{
+  aosDbgCheck(test->data != NULL &&
+      ((aos_test_buttondata_t*)test->data)->button != NULL &&
+      ((aos_test_buttondata_t*)test->data)->evtsource != NULL);
+
+  // local variables
+  aos_testresult_t result = {0, 0};
+  int32_t status = AOS_OK;
+  unsigned int count = 0;
+  button_lld_state_t bstate;
+  event_listener_t evtlistener;
+  aos_timestamp_t tcurrent, tend;
+
+  chprintf(stream, "test interrupts for ten seconds...\n");
+  chEvtRegister(((aos_test_buttondata_t*)test->data)->evtsource, &evtlistener, INTERRUPT_EVENT_ID);
+  aosSysGetUptime(&tend);
+  tend += 10 * MICROSECONDS_PER_SECOND;
+  do {
+    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(MICROSECONDS_PER_SECOND));
+    const eventflags_t eflags = chEvtGetAndClearFlags(&evtlistener);
+    status |= button_lld_get(((aos_test_buttondata_t*)test->data)->button, &bstate);
+    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
+        eflags == ((aos_test_buttondata_t*)test->data)->evtflags) {
+      // a correct event was detected
+      chprintf(stream, "\t\tinterrupt detected: %s\n", (bstate == BUTTON_LLD_STATE_PRESSED) ? "pressed" : "released");
+      ++count;
+    } else {
+      // no button event was detected (usually timeout)
+      chprintf(stream, "\t\twaiting for event...\n");
+    }
+    aosSysGetUptime(&tcurrent);
+  } while (tcurrent < tend);
+  chEvtUnregister(((aos_test_buttondata_t*)test->data)->evtsource, &evtlistener);
+  if (status == APAL_STATUS_OK && count > 0) {
+    aosTestPassedMsg(stream, &result, "%u events detected\n", count);
+  } else {
+    aosTestFailedMsg(stream, &result, "0x%08X; %u\n", status, count);
+  }
+
+  aosTestInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(ButtonDriver));
+
+  return result;
+}
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
diff --git a/test/periphery-lld/button_v1/aos_test_button.h b/test/periphery-lld/button_v1/aos_test_button.h
new file mode 100644
index 0000000..0b076cb
--- /dev/null
+++ b/test/periphery-lld/button_v1/aos_test_button.h
@@ -0,0 +1,86 @@
+/*
+AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2016..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 AMIROOS_TESTS_BUTTON_H
+#define AMIROOS_TESTS_BUTTON_H
+
+#include <amiroos.h>
+
+#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
+
+#include <alld_button.h>
+
+/******************************************************************************/
+/* CONSTANTS                                                                  */
+/******************************************************************************/
+
+/******************************************************************************/
+/* SETTINGS                                                                   */
+/******************************************************************************/
+
+/******************************************************************************/
+/* CHECKS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* DATA STRUCTURES AND TYPES                                                  */
+/******************************************************************************/
+
+/**
+ * @brief   Custom data structure for the test.
+ */
+typedef struct {
+  /**
+   * @brief   Pointer to the driver to use.
+   */
+  ButtonDriver* button;
+
+  /**
+   * @brief   Event source to listen to.
+   */
+  event_source_t* evtsource;
+
+  /**
+   * @brief   Event flags to watch.
+   */
+  eventflags_t evtflags;
+} aos_test_buttondata_t;
+
+/******************************************************************************/
+/* MACROS                                                                     */
+/******************************************************************************/
+
+/******************************************************************************/
+/* EXTERN DECLARATIONS                                                        */
+/******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* defined(__cplusplus) */
+  aos_testresult_t aosTestButtonFunc(BaseSequentialStream* stream, const aos_test_t* test);
+#if defined(__cplusplus)
+}
+#endif /* defined(__cplusplus) */
+
+/******************************************************************************/
+/* INLINE FUNCTIONS                                                           */
+/******************************************************************************/
+
+#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
+
+#endif /* AMIROOS_TESTS_BUTTON_H */
diff --git a/test/test.mk b/test/test.mk
new file mode 100644
index 0000000..4c48778
--- /dev/null
+++ b/test/test.mk
@@ -0,0 +1,34 @@
+################################################################################
+# AMiRo-OS is an operating system designed for the Autonomous Mini Robot       #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2016..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).                              #
+################################################################################
+
+
+
+# absolute path to this directory
+AMIROOS_TEST_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
+
+# include path
+AMIROOS_TEST_INC =
+
+# C sources
+AMIROOS_TEST_CSRC = $(wildcard $(AMIROOS_TEST_INC:%=%/*.[Cc]))
+
diff --git a/unittests/lld/inc/ut_lld_adc.h b/unittests/lld/inc/ut_lld_adc.h
deleted file mode 100644
index cd3c5e8..0000000
--- a/unittests/lld/inc/ut_lld_adc.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_LLD_ADC_H
-#define AMIROOS_UT_LLD_ADC_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == TRUE) && (defined(BOARD_POWERMANAGEMENT_1_1) || defined(BOARD_POWERMANAGEMENT_1_2)) && (HAL_USE_ADC == TRUE)) || defined(__DOXYGEN__)
-
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  ADCDriver* driver;
-
-  /**
-   * @brief   Pointer to the conversion group to use.
-   */
-  ADCConversionGroup* convgroup;
-} ut_adcdata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAdcFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == TRUE) && (defined(BOARD_POWERMANAGEMENT_1_1) || defined(BOARD_POWERMANAGEMENT_1_2)) && (HAL_USE_ADC == TRUE) */
-
-#endif /* AMIROOS_UT_LLD_ADC_H */
-
diff --git a/unittests/lld/src/ut_lld_adc.c b/unittests/lld/src/ut_lld_adc.c
deleted file mode 100644
index 1aef7c7..0000000
--- a/unittests/lld/src/ut_lld_adc.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_lld_adc.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == TRUE) && (defined(BOARD_POWERMANAGEMENT_1_1) || defined(BOARD_POWERMANAGEMENT_1_2)) && (HAL_USE_ADC == TRUE)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/**
- * @brief   Event mask of the ADC analog watchdog event.
- */
-#define _adcWdgEventmask                        EVENT_MASK(31)
-
-/**
- * @brief   ADC analog watchdog threshold (9.0V).
- */
-#define _adcWdgThreshold                        (uint16_t)(9.0f / 5.0f / 3.3f * ((1 << 12) - 1) + 0.5f)
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/**
- * @brief   Pointer to the thread listening for an ADC analog watchdog event.
- */
-static thread_t* _listener;
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/**
- * @brief   Helper function to convert ADC sample value to volts.
- *
- * @param[in] adc   ADC sample value.
- *
- * @return          Converted value in volts.
- */
-static inline float _adc2volt(adcsample_t adc) {
-  return (float)adc / ((1 << 12) - 1) * 3.3f * 5.0f;
-}
-
-/**
- * @brief   ADC analog watchdog callback function.
- *
- * @param[in] adcp  ADC driver.
- * @param[in] err   ADC error value.
- */
-static void _adcAwdCb(ADCDriver* adcp, adcerror_t err)
-{
-  (void)adcp;
-
-  if (err == ADC_ERR_WATCHDOG) {
-    chSysLockFromISR();
-    if (_listener != NULL) {
-      chEvtSignalI(_listener, _adcWdgEventmask);
-      _listener = NULL;
-    }
-    chSysUnlockFromISR();
-  }
-
-  return;
-}
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   ADC unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAdcFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_adcdata_t*)(ut->data))->driver != NULL && ((ut_adcdata_t*)(ut->data))->convgroup != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  adcsample_t buffer[1] = {0};
-  bool wdgpassed = false;
-  eventmask_t eventmask = 0;
-  ADCConversionGroup conversionGroup = *(((ut_adcdata_t*)(ut->data))->convgroup);
-  conversionGroup.circular = true;
-  conversionGroup.end_cb = NULL;
-  conversionGroup.end_cb = NULL;
-  conversionGroup.htr = ADC_HTR_HT;
-  conversionGroup.ltr = 0;
-
-  chprintf(stream, "reading voltage for five seconds...\n");
-  adcStartConversion(((ut_adcdata_t*)(ut->data))->driver, &conversionGroup, buffer, 1);
-  for (uint8_t s = 0; s < 5; ++s) {
-    aosThdSSleep(1);
-    chprintf(stream, "\tVSYS = %fV\n", _adc2volt(buffer[0]));
-  }
-  adcStopConversion(((ut_adcdata_t*)(ut->data))->driver);
-  if (buffer[0] != 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "detecting external power...\n");
-  conversionGroup.error_cb = _adcAwdCb;
-  conversionGroup.htr = _adcWdgThreshold;
-  conversionGroup.ltr = _adcWdgThreshold;
-  _listener = chThdGetSelfX();
-  adcStartConversion(((ut_adcdata_t*)(ut->data))->driver, &conversionGroup, buffer, 1);
-  eventmask = chEvtWaitOneTimeout(_adcWdgEventmask, chTimeS2I(5));
-  if (eventmask == _adcWdgEventmask) {
-    aosUtPassedMsg(stream, &result, "%fV %c 9V\n", _adc2volt(buffer[0]), (buffer[0] > _adcWdgThreshold) ? '>' : '<');
-    wdgpassed = true;
-  } else {
-    adcStopConversion(((ut_adcdata_t*)(ut->data))->driver);
-    aosUtFailed(stream, &result);
-    wdgpassed = false;
-  }
-
-  if (wdgpassed) {
-    for (uint8_t i = 0; i < 2; ++i) {
-      if (buffer[0] > _adcWdgThreshold) {
-        chprintf(stream, "Remove external power within ten seconds.\n");
-        conversionGroup.htr = ADC_HTR_HT;
-        conversionGroup.ltr = _adcWdgThreshold;
-      } else {
-        chprintf(stream, "Connect external power within ten seconds.\n");
-        conversionGroup.htr = _adcWdgThreshold;
-        conversionGroup.ltr = 0;
-      }
-      aosThdMSleep(100); // wait some time so the ADC wil trigger again immediately due to noise
-      _listener = chThdGetSelfX();
-      adcStartConversion(((ut_adcdata_t*)(ut->data))->driver, &conversionGroup, buffer, 1);
-      eventmask = chEvtWaitOneTimeout(_adcWdgEventmask, chTimeS2I(10));
-      if (eventmask == _adcWdgEventmask) {
-        aosUtPassedMsg(stream, &result, "%fV %c 9V\n", _adc2volt(buffer[0]), (buffer[0] > _adcWdgThreshold) ? '>' : '<');
-      } else {
-        adcStopConversion(((ut_adcdata_t*)(ut->data))->driver);
-        aosUtFailed(stream, &result);
-        break;
-      }
-    }
-  }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == TRUE) && (defined(BOARD_POWERMANAGEMENT_1_1) || defined(BOARD_POWERMANAGEMENT_1_2)) && (HAL_USE_ADC == TRUE) */
diff --git a/unittests/periphery-lld/inc/ut_alld_A3906_v1.h b/unittests/periphery-lld/inc/ut_alld_A3906_v1.h
deleted file mode 100644
index 788cd8d..0000000
--- a/unittests/periphery-lld/inc/ut_alld_A3906_v1.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_A3906_V1_H
-#define AMIROOS_UT_ALLD_A3906_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_A3906.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  A3906Driver* driver;
-
-  /**
-   * @brief   PWM driver information.
-   */
-  struct {
-    /**
-     * @brief   The PWM driver to use.
-     */
-    apalPWMDriver_t* driver;
-
-    /**
-     * @brief   PWM channel information.
-     */
-    struct {
-      /**
-     * @brief   PWM channel for the left wheel forward direction.
-     */
-      apalPWMchannel_t left_forward;
-
-      /**
-     * @brief   PWM channel for the left wheel backward direction.
-     */
-      apalPWMchannel_t left_backward;
-
-      /**
-     * @brief   PWM channel for the right wheel forward direction.
-     */
-      apalPWMchannel_t right_forward;
-
-      /**
-     * @brief   PWM channel for the right wheel backward direction.
-     */
-      apalPWMchannel_t right_backward;
-    } channel;
-  } pwm;
-
-  /**
-   * @brief   QEI driver information
-   */
-  struct {
-    /**
-     * @brief   QEI driver for the left wheel.
-     */
-    apalQEIDriver_t* left;
-
-    /**
-     * @brief   QEI driver for the right wheel.
-     */
-    apalQEIDriver_t* right;
-
-    /**
-     * @brief   QEI increments per wheel revolution.
-     */
-    apalQEICount_t increments_per_revolution;
-  } qei;
-
-  /**
-   * @brief   Wheel diameter information.
-   */
-  struct {
-    /**
-     * @brief   Left wheel diameter in m.
-     */
-    float left;
-
-    /**
-     * @brief   Right wheel diameter in m.
-     */
-    float right;
-  } wheel_diameter;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_a3906data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldA3906Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_A3906_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_AT24C01B_v1.h b/unittests/periphery-lld/inc/ut_alld_AT24C01B_v1.h
deleted file mode 100644
index e239c4e..0000000
--- a/unittests/periphery-lld/inc/ut_alld_AT24C01B_v1.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_AT24C01B_V1_H
-#define AMIROOS_UT_ALLD_AT24C01B_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT24C01B) && (AMIROLLD_CFG_AT24C01B == 1)) || defined(__DOXYGEN__)
-
-#include <alld_AT24C01B.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  AT24C01BDriver* driver;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_at24c01bdata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldAt24c01bFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT24C01B) && (AMIROLLD_CFG_AT24C01B == 1) */
-
-#endif /* AMIROOS_UT_ALLD_AT24C01B_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_AT42QT1050_v1.h b/unittests/periphery-lld/inc/ut_alld_AT42QT1050_v1.h
deleted file mode 100644
index 3619d2b..0000000
--- a/unittests/periphery-lld/inc/ut_alld_AT42QT1050_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_AT42QT1050_V1_H
-#define AMIROOS_UT_ALLD_AT42QT1050_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_AT42QT1050.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the AT42QT1050 driver to use.
-   */
-  AT42QT1050Driver* at42qt1050d;
-
-  /**
-   * @brief   Timeout value (in µs).
-   */
-  apalTime_t timeout;
-
-  /**
-   * @brief   Event source to listen to.
-   */
-  event_source_t* evtsource;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_at42qt1050data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldAt42qt1050Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_AT42QT1050_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_DW1000_v1.h b/unittests/periphery-lld/inc/ut_alld_DW1000_v1.h
deleted file mode 100755
index c0b8407..0000000
--- a/unittests/periphery-lld/inc/ut_alld_DW1000_v1.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_DW1000_V1_LLD_H
-#define AMIROOS_UT_ALLD_DW1000_V1_LLD_H
-
-#include <aos_unittest.h>
-#include <amiro-lld.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_DW1000.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldDw1000Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-
-  extern uint8_t s1switch;
-  extern int instance_anchaddr;
-  extern int dr_mode;
-  extern int chan, tagaddr, ancaddr;
-  extern int instance_mode;
-
-  int UWB_Init(DW1000Driver* drv);
-  int32_t inittestapplication(uint8_t s1switch, DW1000Driver* drv);
-  int decarangingmode(uint8_t s1switch);
-  void addressconfigure(uint8_t s1switch, uint8_t mode);
-  void set_SPI_chip_select(void);
-  void clear_SPI_chip_select(void);
-  void reset_DW1000(void);
-  void setHighSpeed_SPI(bool speedValue, DW1000Driver* drv);
-  apalGpioState_t port_CheckEXT_IRQ(void) ;
-  void process_deca_irq(void);
-
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_DW1000_V1_LLD_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_HMC5883L_v1.h b/unittests/periphery-lld/inc/ut_alld_HMC5883L_v1.h
deleted file mode 100644
index e8917bb..0000000
--- a/unittests/periphery-lld/inc/ut_alld_HMC5883L_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_HMC5883L_V1_H
-#define AMIROOS_UT_ALLD_HMC5883L_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1)) || defined(__DOXYGEN__)
-
-#include <alld_HMC5883L.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Constum data structure for this unit test.
- */
-typedef struct {
-  /**
-   * @brief   HMC5338L driver to use.
-   */
-  HMC5883LDriver* driver;
-
-  /**
-   * @brief   Event source for certain tests.
-   */
-  event_source_t *drdyEvtSrc;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-
-  /**
-   * @brief   Timeout value in microseconds.
-   */
-  apalTime_t timeout;
-} ut_hmc5883ldata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldHmc5883lFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1) */
-
-#endif /* AMIROOS_UT_ALLD_HMC5883L_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_INA219_v1.h b/unittests/periphery-lld/inc/ut_alld_INA219_v1.h
deleted file mode 100644
index 86f0297..0000000
--- a/unittests/periphery-lld/inc/ut_alld_INA219_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_INA219_V1_H
-#define AMIROOS_UT_ALLD_INA219_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_INA219.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   INA219 driver to use.
-   */
-  INA219Driver *inad;
-
-  /**
-   * @brief   Expected voltage to be measured.
-   */
-  float v_expected;
-
-  /**
-   * @brief   Tolerance (relative) of measurement.
-   */
-  float tolerance;
-
-  /**
-   * @brief   Timeout delay for certain tests.
-   */
-  apalTime_t timeout;
-} ut_ina219data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_INA219_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_L3G4200D_v1.h b/unittests/periphery-lld/inc/ut_alld_L3G4200D_v1.h
deleted file mode 100644
index 1ed7d78..0000000
--- a/unittests/periphery-lld/inc/ut_alld_L3G4200D_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_L3G4200D_V1_H
-#define AMIROOS_UT_ALLD_L3G4200D_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1)) || defined(__DOXYGEN__)
-
-#include <alld_L3G4200D.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   L3G4200D driver to use.
-   */
-  L3G4200DDriver *l3gd;
-
-  /**
-   * @brief   SPI configuratoin.
-   */
-  SPIConfig *spiconf;
-
-  /**
-   * @brief   Event source for certain tests.
-   */
-  event_source_t *src;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_l3g4200ddata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldL3g4200dFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1) */
-
-#endif /* AMIROOS_UT_ALLD_L3G4200D_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_LED_v1.h b/unittests/periphery-lld/inc/ut_alld_LED_v1.h
deleted file mode 100644
index 1d3d1c3..0000000
--- a/unittests/periphery-lld/inc/ut_alld_LED_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_LED_V1_H
-#define AMIROOS_UT_ALLD_LED_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1)) || defined(__DOXYGEN__)
-
-#include <alld_LED.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldLedFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1) */
-
-#endif /* AMIROOS_UT_ALLD_LED_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_LIS331DLH_v1.h b/unittests/periphery-lld/inc/ut_alld_LIS331DLH_v1.h
deleted file mode 100644
index 91c35cc..0000000
--- a/unittests/periphery-lld/inc/ut_alld_LIS331DLH_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_LIS331DLH_V1_H
-#define AMIROOS_UT_ALLD_LIS331DLH_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1)) || defined(__DOXYGEN__)
-
-#include <alld_LIS331DLH.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Accelerometer driver to use.
-   */
-  LIS331DLHDriver *lisd;
-
-  /**
-   * @brief   SPI configuratoin.
-   */
-  SPIConfig *spiconf;
-
-  /**
-   * @brief   Event source for certain tests.
-   */
-  event_source_t *src;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_lis331dlhdata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldLis331dlhFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1) */
-
-#endif /* AMIROOS_UT_ALLD_LIS331DLH_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_LTC4412_v1.h b/unittests/periphery-lld/inc/ut_alld_LTC4412_v1.h
deleted file mode 100644
index 00fa63b..0000000
--- a/unittests/periphery-lld/inc/ut_alld_LTC4412_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_LTC4412_V1_H
-#define AMIROOS_UT_ALLD_LTC4412_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_LTC4412.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldLtc4412Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_LTC4412_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_MIC9404x_v1.h b/unittests/periphery-lld/inc/ut_alld_MIC9404x_v1.h
deleted file mode 100644
index b21cba6..0000000
--- a/unittests/periphery-lld/inc/ut_alld_MIC9404x_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_MIC9404x_V1_H
-#define AMIROOS_UT_ALLD_MIC9404x_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MIC9404x) && (AMIROLLD_CFG_MIC9404x == 1)) || defined(__DOXYGEN__)
-
-#include <alld_MIC9404x.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldMic9404xFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MIC9404x) && (AMIROLLD_CFG_MIC9404x == 1) */
-
-#endif /* AMIROOS_UT_ALLD_MIC9404x_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_MPR121_v1.h b/unittests/periphery-lld/inc/ut_alld_MPR121_v1.h
deleted file mode 100644
index a7e5da7..0000000
--- a/unittests/periphery-lld/inc/ut_alld_MPR121_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_MPR121_V1_H
-#define AMIROOS_UT_ALLD_MPR121_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_MPR121.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the MPR121 driver to use.
-   */
-  MPR121Driver* mprd;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-
-  /**
-   * @brief   Event source to listen to.
-   */
-  event_source_t* evtsource;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_mpr121data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldMpr121Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_MPR121_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_MPU6050_v1.h b/unittests/periphery-lld/inc/ut_alld_MPU6050_v1.h
deleted file mode 100644
index 99b49c6..0000000
--- a/unittests/periphery-lld/inc/ut_alld_MPU6050_v1.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_MPU6050_V1_H
-#define AMIROOS_UT_ALLD_MPU6050_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_MPU6050.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   MPU6050 driver to use.
-   */
-  MPU6050Driver *mpu;
-
-  /**
-   * @brief   Timeout delay for certain tests.
-   */
-  apalTime_t timeout;
-} ut_mpu6050data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldMpu6050Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_MPU6050_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_PCA9544A_v1.h b/unittests/periphery-lld/inc/ut_alld_PCA9544A_v1.h
deleted file mode 100644
index 98921d9..0000000
--- a/unittests/periphery-lld/inc/ut_alld_PCA9544A_v1.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_PCA9544A_V1_H
-#define AMIROOS_UT_ALLD_PCA9544A_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1)) || defined(__DOXYGEN__)
-
-#include <alld_PCA9544A.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  PCA9544ADriver *driver;
-
-  /**
-   * @brief   Timeout for bus communication.
-   */
-  apalTime_t timeout;
-} ut_pca9544adata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldPca9544aFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1) */
-
-#endif /* AMIROOS_UT_ALLD_PCA9544A_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_PCAL6524_v1.h b/unittests/periphery-lld/inc/ut_alld_PCAL6524_v1.h
deleted file mode 100644
index e2bab5d..0000000
--- a/unittests/periphery-lld/inc/ut_alld_PCAL6524_v1.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_PCAL6524_V1_H
-#define AMIROOS_UT_ALLD_PCAL6524_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_PCAL6524.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   pointer to the PCAL6524 driver to use.
-   */
-  PCAL6524Driver* pcal6524d;
-
-  /**
-   * @brief   Timeout value (in µs).
-   */
-  apalTime_t timeout;
-} ut_pcal6524data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldPcal6524Func(BaseSequentialStream* stream, aos_unittest_t *ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_PCAL6524_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_PKxxxExxx_v1.h b/unittests/periphery-lld/inc/ut_alld_PKxxxExxx_v1.h
deleted file mode 100644
index 98caf71..0000000
--- a/unittests/periphery-lld/inc/ut_alld_PKxxxExxx_v1.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_PKXXXEXXX_V1_H
-#define AMIROOS_UT_ALLD_PKXXXEXXX_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1)) || defined(__DOXYGEN__)
-
-#include <alld_PKxxxExxx.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the PWM driver.
-   */
-  apalPWMDriver_t* driver;
-
-  /**
-   * @brief   PWM channel to use.
-   */
-  apalPWMchannel_t channel;
-} ut_pkxxxexxx_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldPkxxxexxxFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1) */
-
-#endif /* AMIROOS_UT_ALLD_PKXXXEXXX_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TLC5947_v1.h b/unittests/periphery-lld/inc/ut_alld_TLC5947_v1.h
deleted file mode 100644
index 0c10096..0000000
--- a/unittests/periphery-lld/inc/ut_alld_TLC5947_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_TLC5947_V1_H
-#define AMIROOS_UT_ALLD_TLC5947_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_TLC5947.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldTlc5947Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_TLC5947_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TPS20xxB_v1.h b/unittests/periphery-lld/inc/ut_alld_TPS20xxB_v1.h
deleted file mode 100644
index 689f5c3..0000000
--- a/unittests/periphery-lld/inc/ut_alld_TPS20xxB_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_TPS20XXB_V1_H
-#define AMIROOS_UT_ALLD_TPS20XXB_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1)) || defined(__DOXYGEN__)
-
-#include <alld_TPS20xxB.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldTps20xxbFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1) */
-
-#endif /* AMIROOS_UT_ALLD_TPS20XXB_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1.h b/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1.h
deleted file mode 100644
index e7630d2..0000000
--- a/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_TPS6211X_V1_H
-#define AMIROOS_UT_ALLD_TPS6211X_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1)) || defined(__DOXYGEN__)
-
-#include <alld_TPS6211x.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldTps6211xFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) */
-
-#endif /* AMIROOS_UT_ALLD_TPS6211X_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1_INA219_v1.h b/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1_INA219_v1.h
deleted file mode 100644
index e646849..0000000
--- a/unittests/periphery-lld/inc/ut_alld_TPS6211x_v1_INA219_v1.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_TPS6211X_V1_INA219_V1_H
-#define AMIROOS_UT_ALLD_TPS6211X_V1_INA219_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_TPS6211x.h>
-#include <alld_INA219.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   TPS62113 driver to use.
-   */
-  TPS6211xDriver* tps6211x;
-
-  /**
-   * @brief   INA219 driver to use.
-   */
-  INA219Driver* ina219;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_tps6211xina219data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldTps6211xIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_TPS6211X_V1_INA219_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_VCNL4020_v1.h b/unittests/periphery-lld/inc/ut_alld_VCNL4020_v1.h
deleted file mode 100644
index bc7e1f7..0000000
--- a/unittests/periphery-lld/inc/ut_alld_VCNL4020_v1.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_VCNL4020_V1_H
-#define AMIROOS_UT_ALLD_VCNL4020_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_VCNL4020.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   VCNL4020 driver to use.
-   */
-  VCNL4020Driver *vcnld;
-
-  /**
-   * @brief   Timeout for certain tests.
-   */
-  apalTime_t timeout;
-
-  /**
-   * @brief   Event source to listen to.
-   */
-  event_source_t* evtsource;
-
-  /**
-   * @brief   Event flags to watch.
-   */
-  eventflags_t evtflags;
-} ut_vcnl4020data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldVcnl4020Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_VCNL4020_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq241xx_v1.h b/unittests/periphery-lld/inc/ut_alld_bq241xx_v1.h
deleted file mode 100644
index 0804dbf..0000000
--- a/unittests/periphery-lld/inc/ut_alld_bq241xx_v1.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_BQ241XX_V1_H
-#define AMIROOS_UT_ALLD_BQ241XX_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
-
-#include <alld_bq241xx.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldBq241xxFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1) */
-
-#endif /* AMIROOS_UT_ALLD_BQ241XX_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq27500_v1.h b/unittests/periphery-lld/inc/ut_alld_bq27500_v1.h
deleted file mode 100644
index 591acdf..0000000
--- a/unittests/periphery-lld/inc/ut_alld_bq27500_v1.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_BQ27500_V1_H
-#define AMIROOS_UT_ALLD_BQ27500_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1)) || defined(__DOXYGEN__)
-
-#include <alld_bq27500.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   Pointer to the driver to use.
-   */
-  BQ27500Driver *driver;
-
-  /**
-   * @brief   Timeout value (in us);
-   */
-  apalTime_t timeout;
-} ut_bq27500data_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldBq27500Func(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) */
-
-#endif /* AMIROOS_UT_ALLD_BQ27500_V1_H */
diff --git a/unittests/periphery-lld/inc/ut_alld_bq27500_v1_bq241xx_v1.h b/unittests/periphery-lld/inc/ut_alld_bq27500_v1_bq241xx_v1.h
deleted file mode 100644
index 9f79180..0000000
--- a/unittests/periphery-lld/inc/ut_alld_bq27500_v1_bq241xx_v1.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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 AMIROOS_UT_ALLD_BQ27500_V1_BQ241xx_V1_H
-#define AMIROOS_UT_ALLD_BQ27500_V1_BQ241xx_V1_H
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
-
-#include <alld_bq27500.h>
-#include <alld_bq241xx.h>
-
-/******************************************************************************/
-/* CONSTANTS                                                                  */
-/******************************************************************************/
-
-/******************************************************************************/
-/* SETTINGS                                                                   */
-/******************************************************************************/
-
-/******************************************************************************/
-/* CHECKS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* DATA STRUCTURES AND TYPES                                                  */
-/******************************************************************************/
-
-/**
- * @brief   Custom data structure for the unit test.
- */
-typedef struct {
-  /**
-   * @brief   BQ27500 driver to use.
-   */
-  BQ27500Driver* bq27500;
-
-  /**
-   * @brief   BQ24103A driver to use.
-   */
-  BQ241xxDriver* bq241xx;
-
-  /**
-   * @brief   Timeout value (in us).
-   */
-  apalTime_t timeout;
-} ut_bq27500bq241xxdata_t;
-
-/******************************************************************************/
-/* MACROS                                                                     */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXTERN DECLARATIONS                                                        */
-/******************************************************************************/
-
-#if defined(__cplusplus)
-extern "C" {
-#endif /* defined(__cplusplus) */
-  aos_utresult_t utAlldBq27500Bq241xxFunc(BaseSequentialStream* stream, aos_unittest_t* ut);
-#if defined(__cplusplus)
-}
-#endif /* defined(__cplusplus) */
-
-/******************************************************************************/
-/* INLINE FUNCTIONS                                                           */
-/******************************************************************************/
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ24103A) && (AMIROLLD_CFG_BQ24103A == 1) */
-
-#endif /* AMIROOS_UT_ALLD_BQ27500_V1_BQ241xx_V1_H */
diff --git a/unittests/periphery-lld/src/ut_alld_A3906_v1.c b/unittests/periphery-lld/src/ut_alld_A3906_v1.c
deleted file mode 100644
index 5cc6504..0000000
--- a/unittests/periphery-lld/src/ut_alld_A3906_v1.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_A3906_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1)) || defined(__DOXYGEN__)
-
-#include <stdlib.h>
-#include <math.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/**
- * @brief   Interval to poll QEI in certain tests.
- */
-#define QEI_POLL_INTERVAL_MS          100
-
-/**
- * @brief   Threshold for QEI differences.
- * @details Differences smaller than or equal to this value are neglected (interpreted as zero).
- *          The value can be interpreted as encoder ticks per second (tps).
- * @note    The expected value is about 7000 tps and a jitter of up to ±2% is ok.
- */
-#define QEI_DIFF_THRESHOLD            (apalQEICount_t)(7000 * 0.02f)
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/**
- * @brief   Enumerator to distinguish between left and right wheel.
- */
-typedef enum {
-  WHEEL_LEFT    = 0,  /**< left wheel identifier */
-  WHEEL_RIGHT   = 1,  /**< right wheel identifier */
-} wheel_t;
-
-/**
- * @brief   Enumerator to distinguish directions.
- */
-typedef enum {
-  DIRECTION_FORWARD   = 0,  /**< forward direction identifier */
-  DIRECTION_BACKWARD  = 1,  /**< backward direction identifier */
-} direction_t;
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/**
- * @brief   helper function to test each wheel and direction separately.
- *
- * @param[in] stream      Stream for input/output.
- * @param[in] data        Unit test meta data.
- * @param[in] wheel       Wheel to test.
- * @param[in] direction   Direction to test.
- * @param[in,out] result  Result variable to modify.
- */
-void _wheelDirectionTest(BaseSequentialStream* stream, ut_a3906data_t* data, wheel_t wheel, direction_t direction, aos_utresult_t* result)
-{
-  // local variables
-  uint32_t status;
-  bool qei_valid;
-  apalQEICount_t qei_count[2];
-  apalQEIDirection_t qei_direction;
-  uint32_t timeout_counter;
-
-  chprintf(stream, "%s wheel %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
-  qei_valid = false;
-  status = apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
-  // increase PWM incrementally and read QEI data
-  for (apalPWMwidth_t pwm_width = APAL_PWM_WIDTH_MIN; pwm_width < APAL_PWM_WIDTH_MAX; ++pwm_width) {
-    status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                                  ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                                pwm_width);
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
-    qei_valid = qei_valid || (qei_count[0] != qei_count[1]);
-    aosThdUSleep(5 * MICROSECONDS_PER_SECOND / (APAL_PWM_WIDTH_MAX - APAL_PWM_WIDTH_MIN));
-    qei_count[0] = qei_count[1];
-  }
-  status |= qei_valid ? 0x00 : 0x10;
-  status |= apalQEIGetDirection((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_direction);
-  status |= (qei_direction == ((direction == DIRECTION_FORWARD) ? APAL_QEI_DIRECTION_UP : APAL_QEI_DIRECTION_DOWN)) ? 0x00 : 0x20;
-
-  // let the wheel spin free until it stops
-  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                                ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                              0);
-  qei_count[0] = 0;
-  qei_count[1] = 0;
-  timeout_counter = 0;
-  do {
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
-    aosThdMSleep(1);
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
-    ++timeout_counter;
-  } while ((qei_count[0] != qei_count[1]) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
-  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
-
-  // report result
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, result);
-  } else {
-    aosUtFailedMsg(stream, result, "0x%08X\n", status);
-  }
-
-  return;
-}
-
-void _wheelSpeedTest(BaseSequentialStream* stream, ut_a3906data_t* data, wheel_t wheel, direction_t direction, aos_utresult_t* result)
-{
-  // local variables
-  uint32_t status;
-  apalQEICount_t qei_range;
-  apalQEICount_t qei_count[2] = {0};
-  apalQEICount_t qei_increments[2] = {0};
-  apalQEICount_t qei_increments_diff = 0;
-  uint32_t timeout_counter = 0;
-  uint32_t stable_counter = 0;
-
-  chprintf(stream, "%s wheel full speed %s...\n", (wheel == WHEEL_LEFT) ? "left" : "right", (direction == DIRECTION_FORWARD) ? "forward" : "backward");
-  // spin up the wheel with full speed
-  status = apalQEIGetRange((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_range);
-  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                             APAL_PWM_WIDTH_MAX);
-  aosThdMSleep(100);
-  do {
-    // read QEI data to determine speed
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[0]);
-    aosThdMSleep(QEI_POLL_INTERVAL_MS);
-    status |= apalQEIGetPosition((wheel == WHEEL_LEFT) ? data->qei.left : data->qei.right, &qei_count[1]);
-    timeout_counter += QEI_POLL_INTERVAL_MS;
-    qei_increments[0] = qei_increments[1];
-    qei_increments[1] = (direction == DIRECTION_FORWARD) ?
-                          ((qei_count[1] > qei_count[0]) ? (qei_count[1] - qei_count[0]) : (qei_count[1] + (qei_range - qei_count[0]))) :
-                          ((qei_count[0] > qei_count[1]) ? (qei_count[0] - qei_count[1]) : (qei_count[0] + (qei_range - qei_count[1])));
-    qei_increments_diff = abs((int32_t)qei_increments[0] - (int32_t)qei_increments[1]) * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
-    stable_counter = ((qei_increments[0] != 0 || qei_increments[1] != 0) && qei_increments_diff <= QEI_DIFF_THRESHOLD) ? stable_counter+1 : 0;
-    if (qei_increments[0] != 0 && stable_counter == 0) {
-      chprintf(stream, "\tunstable speed? jitter of %u tps is above threshold (%u tps).\n", qei_increments_diff, QEI_DIFF_THRESHOLD);
-    }
-  } while ((stable_counter* QEI_POLL_INTERVAL_MS < MILLISECONDS_PER_SECOND) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= data->timeout));
-  status |= a3906_lld_set_pwm(data->pwm.driver, (wheel == WHEEL_LEFT) ?
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.left_forward : data->pwm.channel.left_backward) :
-                               ((direction == DIRECTION_FORWARD) ? data->pwm.channel.right_forward : data->pwm.channel.right_backward),
-                             APAL_PWM_WIDTH_OFF);
-  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > data->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
-
-  // report results
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, result);
-    const float tps = qei_increments[1] * ((float)MILLISECONDS_PER_SECOND / (float)QEI_POLL_INTERVAL_MS);
-    const float rpm = tps * SECONDS_PER_MINUTE / (float)data->qei.increments_per_revolution;
-    const float velocity = tps / (float)data->qei.increments_per_revolution * ((wheel == WHEEL_LEFT) ? data->wheel_diameter.left : data->wheel_diameter.right) * acos(-1);
-    chprintf(stream, "\t%f tps\n", tps);
-    chprintf(stream, "\t%f RPM\n", rpm);
-    chprintf(stream, "\t%f m/s\n", velocity);
-    chprintf(stream, "\n");
-  }
-  else {
-    aosUtFailedMsg(stream, result, "0x%08X\n", status);
-  }
-}
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   A3905 unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldA3906Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck((ut->data != NULL) &&
-              (((ut_a3906data_t*)ut->data)->driver != NULL) &&
-              (((ut_a3906data_t*)ut->data)->pwm.driver != NULL) &&
-              (((ut_a3906data_t*)ut->data)->qei.left != NULL) &&
-              (((ut_a3906data_t*)ut->data)->qei.right != NULL));
-
-
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = 0;
-  a3906_lld_power_t power_state;
-  apalQEICount_t qei_count[2][2];
-  uint32_t timeout_counter;
-  uint32_t stable_counter;
-
-  chprintf(stream, "enable power...\n");
-  power_state = A3906_LLD_POWER_ON;
-  status = a3906_lld_set_power(((ut_a3906data_t*)ut->data)->driver, power_state);
-  status |= a3906_lld_get_power(((ut_a3906data_t*)ut->data)->driver, &power_state);
-  status |= (power_state != A3906_LLD_POWER_ON) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
-
-  _wheelDirectionTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_FORWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_FORWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_LEFT, DIRECTION_BACKWARD, &result);
-
-  _wheelSpeedTest(stream, (ut_a3906data_t*)ut->data, WHEEL_RIGHT, DIRECTION_BACKWARD, &result);
-
-  chprintf(stream, "disable power...\n");
-  power_state = A3906_LLD_POWER_OFF;
-  status = a3906_lld_set_power(((ut_a3906data_t*)ut->data)->driver, power_state);
-  status |= a3906_lld_get_power(((ut_a3906data_t*)ut->data)->driver, &power_state);
-  status |= (power_state != A3906_LLD_POWER_OFF) ? 0x10 : 0x00;
-  qei_count[WHEEL_LEFT][0] = 0;
-  qei_count[WHEEL_LEFT][1] = 0;
-  qei_count[WHEEL_RIGHT][0] = 0;
-  qei_count[WHEEL_RIGHT][1] = 0;
-  timeout_counter = 0;
-  stable_counter = 0;
-  do {
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.left, &qei_count[WHEEL_LEFT][0]);
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.right, &qei_count[WHEEL_RIGHT][0]);
-    aosThdMSleep(1);
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.left, &qei_count[WHEEL_LEFT][1]);
-    status |= apalQEIGetPosition(((ut_a3906data_t*)ut->data)->qei.right, &qei_count[WHEEL_RIGHT][1]);
-    ++timeout_counter;
-    stable_counter = (qei_count[WHEEL_LEFT][0] == qei_count[WHEEL_LEFT][1] && qei_count[WHEEL_RIGHT][0] == qei_count[WHEEL_RIGHT][1]) ? stable_counter+1 : 0;
-  } while((stable_counter < 100) && (timeout_counter * MICROSECONDS_PER_MILLISECOND <= ((ut_a3906data_t*)ut->data)->timeout));
-  status |= (timeout_counter * MICROSECONDS_PER_MILLISECOND > ((ut_a3906data_t*)ut->data)->timeout) ? APAL_STATUS_TIMEOUT : 0x00;
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // stop the PWM
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.left_forward, APAL_PWM_WIDTH_OFF);
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.left_backward, APAL_PWM_WIDTH_OFF);
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.right_forward, APAL_PWM_WIDTH_OFF);
-  a3906_lld_set_pwm(((ut_a3906data_t*)ut->data)->pwm.driver, ((ut_a3906data_t*)ut->data)->pwm.channel.right_backward, APAL_PWM_WIDTH_OFF);
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(A3906Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_A3906) && (AMIROLLD_CFG_A3906 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_AT24C01B_v1.c b/unittests/periphery-lld/src/ut_alld_AT24C01B_v1.c
deleted file mode 100644
index 0e94197..0000000
--- a/unittests/periphery-lld/src/ut_alld_AT24C01B_v1.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_AT24C01B_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT24C01B) && (AMIROLLD_CFG_AT24C01B == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/**
- * @brief   EEPROM address for page write/read access.
- */
-#define _pageAddress                  (AT24C01B_LLD_SIZE_BYTES - 2*AT24C01B_LLD_PAGE_SIZE_BYTES)
-
-/**
- * @brief   EEPROM address for byte write/read access.
- */
-#define _byteAddress                  (_pageAddress + AT24C01B_LLD_PAGE_SIZE_BYTES - 1)
-
-/**
- * @brief   Offset for overflow tests.
- */
-#define _overflowOffset               3
-
-/**
- * @brief   EEPROM address for page write/read access with overflow.
- */
-#define _overflowAddress              (_pageAddress + _overflowOffset)
-
-/**
- * @brief   Test data byte.
- */
-#define _bytedata                     0xA5
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   AT24C01B unit test function.
- *
- * @param[in] stream  Stream for inout/outout.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldAt24c01bFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_at24c01bdata_t*)(ut->data))->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = 0;
-  uint8_t page_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
-  uint8_t original_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
-  uint8_t read_data[AT24C01B_LLD_PAGE_SIZE_BYTES];
-  size_t errors = 0;
-  for (size_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; ++dataIdx) {
-    page_data[dataIdx] = dataIdx;
-  }
-
-  chprintf(stream, "reading byte...\n");
-  status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, original_data, 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing byte...\n");
-  status = at24c01b_lld_write_byte(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, _bytedata, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, &read_data[0], 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  status |= (read_data[0] == _bytedata) ? 0x00 : 0x20;
-  status = at24c01b_lld_write_byte(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, (uint8_t)~_bytedata, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, &read_data[1], 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  status |= (read_data[1] == (uint8_t)~_bytedata) ? 0x00 : 0x40;
-  status |= at24c01b_lld_write_byte(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, original_data[0], ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _byteAddress, &read_data[2], 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  status |= (read_data[2] == original_data[0]) ? 0x00 : 0x80;
-  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading page...\n");
-  status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, original_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing page...\n");
-  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (size_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "reading page at current address...\n");
-  // set address counter to UT_ALLD_AT24C01B_PAGE_ADDRESS
-  status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress-1, read_data, 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_WARNING) {
-    // on STM32F1 platform the address gets incremented by 2 after reading
-    status = at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress-2, read_data, 1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  }
-  // read page from the current address
-  status = at24c01b_lld_read_current_address(((ut_at24c01bdata_t*)(ut->data))->driver, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < 8; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "writing page with overflow (7 bytes)...\n");
-  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES-1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset-1, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES-1; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "writing page with overflow (8 bytes)...\n");
-  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, page_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  while (at24c01b_lld_poll_ack(((ut_at24c01bdata_t*)(ut->data))->driver, ((ut_at24c01bdata_t*)(ut->data))->timeout) == APAL_STATUS_FAILURE) {
-    continue;
-  }
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress, read_data, AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  status |= at24c01b_lld_read(((ut_at24c01bdata_t*)(ut->data))->driver, _overflowAddress-_overflowOffset, read_data+(AT24C01B_LLD_PAGE_SIZE_BYTES-_overflowOffset), _overflowOffset, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < AT24C01B_LLD_PAGE_SIZE_BYTES; dataIdx++) {
-    if (read_data[dataIdx] != page_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_OK && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; %u\n", status, errors);
-  }
-
-  chprintf(stream, "write back original data...\n");
-  status = at24c01b_lld_write_page(((ut_at24c01bdata_t*)(ut->data))->driver, _pageAddress, original_data, AT24C01B_LLD_PAGE_SIZE_BYTES, ((ut_at24c01bdata_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT24C01BDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_USE_AT24C01B) && (AMIROLLD_USE_AT24C01B == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_AT42QT1050_v1.c b/unittests/periphery-lld/src/ut_alld_AT42QT1050_v1.c
deleted file mode 100644
index 91c8376..0000000
--- a/unittests/periphery-lld/src/ut_alld_AT42QT1050_v1.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_AT42QT1050_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_AT42QT1050) && (AMIROLLD_CFG_AT42QT1050 == 1)) || defined(__DOXYGEN__)
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-#define INTERRUPT_EVENT_ID            1
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-void print_settings(apalExitStatus_t* status, BaseSequentialStream* stream, aos_unittest_t* ut) {
-    chprintf(stream, "settings...\n");
-
-    uint8_t test8;
-    at42qt1050_lld_register_t txbuf;
-    *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_LOWPOWERMODE, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\tmeasurement inverval %d ms\n", test8*8);
-
-    *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_MAXONDURATION, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\tMax on duration %d ms\n", test8*160);
-
-    *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_FINFOUTMAXCALGUARD, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\tFast In %d, Fast Out, %d MaxCal %d\n\tGuard channel ",
-             test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_FI,     //enter fast mode whenever an unfiltered signal value is detected
-             test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_FO,     //DI of 4 (global setting for all keys)
-             test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_MAXCAL);//recalibrate ALL KEYS after a Max On Duration timeout vs. individually
-
-    //guard channel (which gets priority filtering)
-    if((test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_GUARD) > AT42QT1050_LLD_NUM_KEYS-1)
-        chprintf(stream, "off");
-    else
-        chprintf(stream, " %d", test8 & AT42QT1050_LLD_FINFOUTMAXCALGUARD_GUARD);
-
-    chprintf(stream, "\n\n\tkey\tgroup\tintegr.\tdelay\tthresh.\tpulse\tscale\n");
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-        chprintf(stream, "\t%d\t", key);
-        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_INTEGRATOR_AKS_0, key);
-        *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        if(!((at42qt1050_lld_detectionintegratoraksreg_t)test8).aks)
-            chprintf(stream, "none\t");
-        else
-            chprintf(stream, "%d\t", ((at42qt1050_lld_detectionintegratoraksreg_t)test8).aks);
-
-        if(!((at42qt1050_lld_detectionintegratoraksreg_t)test8).detection_integrator)
-            chprintf(stream, "off");
-        else
-            chprintf(stream, "%d", ((at42qt1050_lld_detectionintegratoraksreg_t)test8).detection_integrator);
-
-        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_CHARGESHAREDELAY_0, key);
-        *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        chprintf(stream, "\t+%d", test8);
-
-        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
-        *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        chprintf(stream, "\t%d", test8);
-
-        txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_PULSE_SCALE_0, key);
-        *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &test8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        chprintf(stream, "\t%d\t%d\n", ((at42qt1050_lld_pulsescalereg_t)test8).pulse, ((at42qt1050_lld_pulsescalereg_t)test8).scale);
-    }
-
-}
-
-void show_live(const uint8_t first_key, apalExitStatus_t* status,
-               BaseSequentialStream* stream, aos_unittest_t* ut) {
-
-    apalDbgAssert(first_key<5);
-
-    event_listener_t event_listener;
-    aos_timestamp_t tcurrent, tend ,tdemo_end;
-
-    //stop demo after 15 seconds
-    aosSysGetUptime(&tcurrent);
-    tdemo_end = tcurrent + 15*MICROSECONDS_PER_SECOND;
-
-    uint8_t keyStatus, detectionStatus;
-    uint16_t signal, reference;
-    uint8_t threshold[AT42QT1050_LLD_NUM_KEYS];
-
-    chprintf(stream, "key, count, ref, signal, [threshold], \033[31mtouch\n\033[0m");
-
-    //get thresholds
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
-        *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &threshold[key], ((ut_at42qt1050data_t*)ut->data)->timeout);
-    }
-    chEvtRegister(((ut_at42qt1050data_t*)ut->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
-    while(true) {
-        aosSysGetUptime(&tcurrent);
-
-        for (uint8_t key = first_key; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-
-            //highlight touched key
-            *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_KEYSTATUS, &keyStatus, ((ut_at42qt1050data_t*)ut->data)->timeout);
-            if((key == 0 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY0)
-                    || (key == 1 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY1)
-                    || (key == 2 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY2)
-                    || (key == 3 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY3)
-                    || (key == 4 && keyStatus&AT42QT1050_LLD_KEYSTATUS_KEY4))
-                chprintf(stream, "\033[31m"); //red
-            else
-                chprintf(stream, "\033[0m"); //black
-
-            *status |= at42qt1050_lld_read_keyssignal(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, key, &signal, ((ut_at42qt1050data_t*)ut->data)->timeout);
-            *status |= at42qt1050_lld_read_referencedata(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, key, &reference, ((ut_at42qt1050data_t*)ut->data)->timeout);
-
-            const uint16_t dist = (signal<reference?0:signal-reference);
-            chprintf(stream, "\033[Kkey %d, %d\t0x%04X 0x%04X [", key, dist, reference, signal);
-            uint16_t stars=0;
-            for(; stars < dist; stars++) {
-                chprintf(stream, "0");
-                if(stars > 40) {           //max_stars = 40
-                    chprintf(stream, "+"); //more than max_stars
-                    break;
-                }
-            }
-            for(; stars < threshold[key]; stars++)
-                chprintf(stream, " ");
-            if(stars == threshold[key])
-                chprintf(stream, "]");
-            chprintf(stream, "\n\033[0m");
-        }
-
-        //wait 1/3 second for a touch event
-        tend = tcurrent + (MICROSECONDS_PER_SECOND/3);
-        const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(tend));
-        const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
-        if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((ut_at42qt1050data_t*)ut->data)->evtflags) {
-            // interrupt detected
-            chprintf(stream, "interrupt ");
-        } // else: timeout
-
-        *status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_DETECTIONSTATUS, &detectionStatus, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        if(detectionStatus & AT42QT1050_LLD_DETECTIONSTATUS_TOUCH)
-            chprintf(stream, "touch ");
-        if(detectionStatus & AT42QT1050_LLD_DETECTIONSTATUS_OVERFLOW)
-            chprintf(stream, "overflow ");
-        if(detectionStatus & AT42QT1050_LLD_DETECTIONSTATUS_CALIBRATE)
-            chprintf(stream, "calibrate");
-        chprintf(stream, "\033[K");
-
-        if(tcurrent > tdemo_end)
-            break;
-
-        chprintf(stream, "\033[%dF", 5-first_key); //cursor up
-    }
-    chEvtUnregister(((ut_at42qt1050data_t*)ut->data)->evtsource, &event_listener);
-}
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldAt42qt1050Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-    aosDbgCheck(ut->data != NULL && ((ut_at42qt1050data_t*)ut->data)->at42qt1050d != NULL);
-
-    // local variables
-    aos_utresult_t result = {0, 0};
-    apalExitStatus_t status;
-    uint8_t test_8;
-    bool error;
-
-    chprintf(stream, "read register...\n");
-    error = false;
-    status = at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_CHIPID, &test_8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tchip ID: 0x%02X\n", test_8);
-    if (test_8 != AT42QT1050_LLD_CHIPID)
-        error = true;
-    status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_FIRMWAREVERSION, &test_8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tfirmware version: %u.%u (0x%02X)\n", ((at42qt1050_lld_firmwarereg_t)test_8).major, ((at42qt1050_lld_firmwarereg_t)test_8).minor, test_8);
-    if (status == APAL_STATUS_SUCCESS && !error) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    chprintf(stream, "write and readback threshold data...\n");
-    status = APAL_STATUS_OK;
-    const uint8_t threshold_test = 0x40;
-    error = false;
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
-        status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, threshold_test , ((ut_at42qt1050data_t*)ut->data)->timeout);
-        status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &test_8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        if(test_8 != threshold_test)
-            error = true;
-    }
-    if (status == APAL_STATUS_SUCCESS  &&  !error) {
-        aosUtPassedMsg(stream, &result, "Set thresholds successfull to 0x%04X\n", threshold_test);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    chprintf(stream, "guarding...\nincrease charge_delay0\ndisable multitouch\n");
-
-    //channel 0 is to big to be charged in the default cycle
-    status = at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_CHARGESHAREDELAY_0, 128 , ((ut_at42qt1050data_t*)ut->data)->timeout);
-
-    //set all channel to group 1 -> only 1 simultaneous touch in group = single touch
-    at42qt1050_lld_detectionintegratoraksreg_t detectionintegrator;
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_INTEGRATOR_AKS_0, key);
-        detectionintegrator.aks = 1;                  //on touch per group-id simultaneous
-        detectionintegrator.detection_integrator = 4; //4 times > threshold => touchevent
-        status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, detectionintegrator.raw, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    }
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    chprintf(stream, "reset device...\n");
-    status = at42qt1050_lld_reset(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, ((ut_at42qt1050data_t*)ut->data)->timeout, true);
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    chprintf(stream, "read threshold data again...\n");
-    status = APAL_STATUS_OK;
-    const uint8_t threshold_default = 20;
-    error = false;
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
-        status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, &test_8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        if(test_8 != threshold_default)
-            error = true;
-    }
-
-    if (status == APAL_STATUS_SUCCESS && !error) {
-        aosUtPassedMsg(stream, &result, "threshold 0x%04X = default\n", threshold_default);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    chprintf(stream, "demo of default configuration:\n");
-    status = APAL_STATUS_OK;
-    show_live(0, &status, stream, ut);
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    status = APAL_STATUS_OK;
-    chprintf(stream, "write configuration...\npuls + scale + threshold 8\n");
-    at42qt1050_lld_pulsescalereg_t pulse_scale;
-    //values stored as exponent of 2
-    pulse_scale.pulse = 0; // accumulate #pulses -> increase resolution & time to acquire
-    pulse_scale.scale = 0; // scale = average factor n: NewAvg = (NewData/n) + [OldAvg*(n-1/n)] -> decrease noise
-    status  = at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_0, pulse_scale.raw , ((ut_at42qt1050data_t*)ut->data)->timeout);
-    pulse_scale.pulse = 1;
-    status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_3, pulse_scale.raw , ((ut_at42qt1050data_t*)ut->data)->timeout);
-
-    pulse_scale.pulse = 4;
-    status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_1, pulse_scale.raw , ((ut_at42qt1050data_t*)ut->data)->timeout);
-    status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_2, pulse_scale.raw , ((ut_at42qt1050data_t*)ut->data)->timeout);
-
-    status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_PULSE_SCALE_4, pulse_scale.raw , ((ut_at42qt1050data_t*)ut->data)->timeout);
-
-    for (uint8_t key = 0; key < AT42QT1050_LLD_NUM_KEYS; ++key) {
-        const at42qt1050_lld_register_t txbuf = at42qt1050_lld_addr_calc(AT42QT1050_LLD_REG_NEGATIVETHRESHOLD_0, key);
-        status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, txbuf, 8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    }
-    chprintf(stream, "disable guard key\n");
-    status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_INTEGRATOR_AKS_0, 0 , ((ut_at42qt1050data_t*)ut->data)->timeout); //disable key
-    status |= at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_FINFOUTMAXCALGUARD, 8 , ((ut_at42qt1050data_t*)ut->data)->timeout); //disable feature
-
-    chprintf(stream, "calibrate...\n");
-    status = at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_RESET_CALIBRATE, AT42QT1050_LLD_RESETCALIBRATE_CALIBRATE, ((ut_at42qt1050data_t*)ut->data)->timeout);
-
-
-
-    //wait for calibration to complete
-    error = true;
-    for(uint8_t i=0; i<0xFF; i++) {
-        usleep(10);
-        status |= at42qt1050_lld_read_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_DETECTIONSTATUS, &test_8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-        if(!(test_8 & AT42QT1050_LLD_DETECTIONSTATUS_CALIBRATE)) {
-            error = false;
-            break;
-        }
-    }
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-    chprintf(stream, "demo of custom configuration:\n");
-    status = APAL_STATUS_OK;
-    show_live(1, &status, stream, ut);
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    status = APAL_STATUS_OK;
-    print_settings(&status, stream, ut);
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    chprintf(stream, "shutdown touch\n");
-    test_8 = 0; //Power down
-    status = at42qt1050_lld_write_reg(((ut_at42qt1050data_t*)ut->data)->at42qt1050d, AT42QT1050_LLD_REG_LOWPOWERMODE, test_8, ((ut_at42qt1050data_t*)ut->data)->timeout);
-    if (status == APAL_STATUS_SUCCESS) {
-        aosUtPassed(stream, &result);
-    } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-
-    aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(AT42QT1050Driver));
-
-    return result;
-}
-
-#endif
diff --git a/unittests/periphery-lld/src/ut_alld_DW1000_v1.c b/unittests/periphery-lld/src/ut_alld_DW1000_v1.c
deleted file mode 100755
index bfe52b1..0000000
--- a/unittests/periphery-lld/src/ut_alld_DW1000_v1.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1)) || defined(__DOXYGEN__)
-
-#include <aos_debug.h>
-#include <chprintf.h>
-#include <aos_thread.h>
-#include <math.h>
-#include <module.h>
-#include <alld_DW1000.h>
-#include <v1/deca_instance_v1.h>
-
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-//#define UNIT_TEST_SNIPPETS_DW1000   // switch between unit test and demo apps
-
-#define SWS1_SHF_MODE 0x02  //short frame mode (6.81M)
-#define SWS1_CH5_MODE 0x04  //channel 5 mode
-#define SWS1_ANC_MODE 0x08  //anchor mode
-#define SWS1_A1A_MODE 0x10  //anchor/tag address A1
-#define SWS1_A2A_MODE 0x20  //anchor/tag address A2
-#define SWS1_A3A_MODE 0x40  //anchor/tag address A3
-
-#define S1_SWITCH_ON  (1)
-#define S1_SWITCH_OFF (0)
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-uint8_t s1switch = 0;
-int instance_anchaddr = 0;
-int dr_mode = 0;
-int chan, tagaddr, ancaddr;
-int instance_mode = ANCHOR;
-
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/*! @brief Change the SPI speed configuration on the fly */
-void setHighSpeed_SPI(bool speedValue, DW1000Driver* drv){
-
-  spiStop(drv->spid);
-
-  if (speedValue == FALSE){
-    spiStart(drv->spid, &moduleHalSpiUwbLsConfig);  // low speed spi configuration
-  }
-  else{
-    spiStart(drv->spid, &moduleHalSpiUwbHsConfig); // high speed spi configuration
-  }
-}
-
-/*! @brief entry point to the IRQn event in DW1000 module
- *
- * */
-void process_deca_irq(void){
-  do{
-    dwt_isr();
-    //while IRS line active (ARM can only do edge sensitive interrupts)
-  }while(port_CheckEXT_IRQ() == 1);
-}
-
-/*! @brief Check the current value of GPIO pin and return the value */
-apalGpioState_t port_CheckEXT_IRQ(void) {
-  apalGpioState_t  val;
-  apalGpioRead(moduleGpioDw1000Irqn.gpio, &val);
-  return val;
-}
-
-/*! @brief Manually set the chip select pin of the SPI */
-void set_SPI_chip_select(void){
-  apalGpioWrite(moduleGpioSpiChipSelect.gpio, APAL_GPIO_HIGH);
-}
-
-/*! @brief Manually reset the chip select pin of the SPI */
-void clear_SPI_chip_select(void){
-  apalGpioWrite(moduleGpioSpiChipSelect.gpio, APAL_GPIO_LOW);
-}
-
-/*! @brief Manually reset the DW1000 module  */
-void reset_DW1000(void){
-
-  // Set the pin as output
-  palSetLineMode(moduleGpioDw1000Reset.gpio->line, APAL_GPIO_DIRECTION_OUTPUT);
-
-  //drive the RSTn pin low
-  apalGpioWrite(moduleGpioDw1000Reset.gpio, APAL_GPIO_LOW);
-
-  //put the pin back to tri-state ... as input
-//  palSetLineMode(moduleGpioDw1000Reset.gpio->line, APAL_GPIO_DIRECTION_INPUT); // TODO:
-
-  aosThdMSleep(2);
-}
-
-/*! @brief Configure instance tag/anchor/etc... addresses */
-void addressconfigure(uint8_t s1switch, uint8_t mode){
-  uint16_t instAddress ;
-
-  instance_anchaddr = (((s1switch & SWS1_A1A_MODE) << 2) + (s1switch & SWS1_A2A_MODE) + ((s1switch & SWS1_A3A_MODE) >> 2)) >> 4;
-
-  if(mode == ANCHOR) {
-    if(instance_anchaddr > 3) {
-      instAddress = GATEWAY_ANCHOR_ADDR | 0x4 ; //listener
-    }
-    else {
-      instAddress = GATEWAY_ANCHOR_ADDR | (uint16_t)instance_anchaddr;
-    }
-  }
-  else{
-    instAddress = (uint16_t)instance_anchaddr;
-  }
-
-  instancesetaddresses(instAddress);
-}
-
-/*! @brief returns the use case / operational mode */
-int decarangingmode(uint8_t s1switch){
-  int mode = 0;
-
-  if(s1switch & SWS1_SHF_MODE)  {
-    mode = 1;
-  }
-
-  if(s1switch & SWS1_CH5_MODE) {
-    mode = mode + 2;
-  }
-
-  return mode;
-}
-
-/*! @brief Check connection setting and initialize DW1000 module */
-int32_t inittestapplication(uint8_t s1switch, DW1000Driver* drv){
-  uint32_t devID ;
-  int result;
-
-  setHighSpeed_SPI(FALSE, drv);          //low speed spi max. ~4M
-  devID = instancereaddeviceid() ;
-
-  if(DWT_DEVICE_ID != devID) {
-    clear_SPI_chip_select();
-    Sleep(1);
-    set_SPI_chip_select();
-    Sleep(7);
-    devID = instancereaddeviceid() ;
-    if(DWT_DEVICE_ID != devID){
-      return(-1) ;
-    }    
-    dwt_softreset();
-  }
-
-    reset_DW1000();  //reset the DW1000 by driving the RSTn line low
-
-  if((s1switch & SWS1_ANC_MODE) == 0){
-    instance_mode = TAG;
-  }
-  else{
-    instance_mode = ANCHOR;
-  }
-
-  result = instance_init(drv) ;
-
-  if (0 > result){
-    return(-1) ;
-  }
-
-  setHighSpeed_SPI(TRUE, drv);       // high speed spi max. ~ 20M
-  devID = instancereaddeviceid() ;
-
-  if (DWT_DEVICE_ID != devID){
-    return(-1) ;
-  }
-
-  addressconfigure(s1switch, (uint8_t)instance_mode) ;
-
-  if((instance_mode == ANCHOR) && (instance_anchaddr > 0x3)){
-    instance_mode = LISTENER;
-  }
-
-  instancesetrole(instance_mode) ;       // Set this instance role
-  dr_mode = decarangingmode(s1switch);
-  chan = chConfig[dr_mode].channelNumber ;
-  instance_config(&chConfig[dr_mode], &sfConfig[dr_mode], drv) ;
-
-  return (int32_t)devID;
-}
-
-/*! @brief Main Entry point to Initialization of UWB DW1000 configuration  */
-#pragma GCC optimize ("O3")
-int UWB_Init(DW1000Driver* drv){
-
-  /*! Software defined Configurartion for TAG, ANC, and other settings as needed */
-  s1switch = S1_SWITCH_OFF << 1  // (on = 6.8 Mbps, off = 110 kbps)
-           | S1_SWITCH_OFF << 2  // (on = CH5, off = CH2)
-           | S1_SWITCH_OFF << 3  // (on = Anchor, off = TAG)
-           | S1_SWITCH_OFF << 4  // (configure Tag or anchor ID no.)
-           | S1_SWITCH_OFF << 5  // (configure Tag or anchor ID no.)
-           | S1_SWITCH_OFF << 6  // (configure Tag or anchor ID no.)
-           | S1_SWITCH_OFF << 7; // Not use in this demo
-
-
-  port_DisableEXT_IRQ();           //disable ScenSor IRQ until we configure the device
-
-  if(inittestapplication(s1switch, drv) == -1) {
-    return (-1); //error
-  }
-
-  aosThdMSleep(5);
-
-  port_EnableEXT_IRQ();  //enable DW1000 IRQ before starting
-
-  return 0;
-}
-
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-
-aos_utresult_t utAlldDw1000Func(BaseSequentialStream* stream, aos_unittest_t* ut) {
-
-  aosDbgCheck(ut->data != NULL);
-
-  aos_utresult_t result = {0, 0};
-
-  chprintf(stream, "init DW1000...\n");
-  dwt_initialise(DWT_LOADUCODE, (DW1000Driver*) ut->data);
-  aosThdMSleep(5);
-
-
-/*! Unit Test snippets for DW1000.
- * @Note: Event IRQ for DW1000 should be tested separately
- */
-#if defined(UNIT_TEST_SNIPPETS_DW1000)
-
-  uint32_t actual_deviceId;
-
-  port_DisableEXT_IRQ();
-
-  setHighSpeed_SPI(false, (DW1000Driver*) ut->data);
-  chprintf(stream, "expected device ID (LS SPI): 0xDECA0130\n");
-  aosThdMSleep(5);
-  actual_deviceId = instancereaddeviceid();
-  chprintf(stream, "actual read ID: 0x%x\n", actual_deviceId);
-  aosThdMSleep(5);
-
-  //if the read of device ID fails, the DW1000 could be asleep
-  if(DWT_DEVICE_ID != actual_deviceId){
-
-    clear_SPI_chip_select();
-    aosThdMSleep(1);
-    set_SPI_chip_select();
-    aosThdMSleep(7);
-    actual_deviceId = instancereaddeviceid() ;
-
-    if(DWT_DEVICE_ID != actual_deviceId){
-      chprintf(stream, "SPI is not working or Unsupported Device ID\n");
-      chprintf(stream, "actual device ID is: 0x%x\n", actual_deviceId);
-      chprintf(stream, "expected device ID: 0xDECA0130\n");
-      aosThdMSleep(5);
-    }
-
-    //clear the sleep bit - so that after the hard reset below the DW does not go into sleep
-    dwt_softreset();
-  }
-
-  /*! UT1: Low speed SPI result */
-  if (actual_deviceId == DWT_DEVICE_ID){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  reset_DW1000();
-
-  chprintf(stream, "initialise instance for DW1000\n");
-  aosThdSleep(1);
-
-  int x_init = instance_init((DW1000Driver*) ut->data) ;
-
-  if (0 != x_init){
-    chprintf(stream, "init error with return value: %d\n", x_init);
-    aosThdSleep(1);
-  }
-  else {
-    chprintf(stream, "init success with return value: %d\n", x_init);
-    aosThdSleep(1);
-  }
-
-  /*! UT2: Initialization  result*/
-  if (x_init == 0){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  setHighSpeed_SPI(true, (DW1000Driver*) ut->data);
-
-  chprintf(stream, "expected device ID (HS SPI): 0xDECA0130\n");
-  actual_deviceId = instancereaddeviceid();
-  chprintf(stream, "actual read ID: 0x%x\n", actual_deviceId);
-  aosThdMSleep(1);
-
-  /*! UT3: High speed SPI result*/
-  if (actual_deviceId == DWT_DEVICE_ID){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  port_EnableEXT_IRQ();
-  reset_DW1000();
-
-  chprintf(stream, "initialise the configuration for UWB application\n");
-  aosThdSleep(1);
-
-  int uwb_init = UWB_Init((DW1000Driver*) ut->data);
-
-  if (0 != uwb_init){
-    chprintf(stream, "UWB config error with return value: %d\n", uwb_init);
-    aosThdSleep(1);
-  }
-  else {
-    chprintf(stream, "UWB config success with return value: %d\n", uwb_init);
-    aosThdSleep(1);
-  }
-
-  /*! UT4: UWB configuration result
-   * If all the four unit tests are passed, the module is ready to run.
-   * Note that the interrupt IRQn should be tested separately.
-   */
-  if (uwb_init == 0){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  /************** End of UNIT_TEST_SNIPPETS_DW1000*****************/
-
-#else /* defined(UNIT_TEST_SNIPPETS_DW1000) */
-
-
-  /*! RUN THE STATE MACHINE DEMO APP (RTLS) */
-
-  chprintf(stream, "initialise the State Machine\n");
-  aosThdSleep(2);
-
-  /* Initialize UWB system with user defined configuration  */
-  int uwb_init = UWB_Init((DW1000Driver*) ut->data);
-
-  if (0 != uwb_init){
-    chprintf(stream, "error in UWB config with return value: %d\n", uwb_init);
-  }
-  else {
-    chprintf(stream, "succeed the init of UWB config\n");
-  }
-  aosThdSleep(1);
-
-  chprintf(stream, "running the RTLS demo application ...\n");
-  aosThdSleep(1);
-
-  /*! Run the localization system demo app as a thread */
-  while(1){
-    instance_run();
-//    aosThdUSleep(10);
-  }
-
-#endif  /* defined(UNIT_TEST_SNIPPETS_DW1000) */
-
-  return result;
-}
-
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_HMC5883L_v1.c b/unittests/periphery-lld/src/ut_alld_HMC5883L_v1.c
deleted file mode 100644
index 8b06fa4..0000000
--- a/unittests/periphery-lld/src/ut_alld_HMC5883L_v1.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_HMC5883L_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   HMC5338L unit test function.
- *
- * @param[in] stream  Stream for intput/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldHmc5883lFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && (((ut_hmc5883ldata_t*)(ut->data))->drdyEvtSrc != NULL));
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t rxbuffer[3];
-  uint8_t data;
-  uint8_t conf = 0x70;
-  hmc5883l_lld_config_t cfg;
-  uint16_t mdata[3];
-  uint8_t state;
-  eventmask_t event_mask = 0;
-  event_listener_t el;
-  uint16_t data_reads = 0;
-  aos_timestamp_t start;
-  aos_timestamp_t t;
-
-  chprintf(stream, "check ID...\n");
-  status = hmc5883l_lld_check(((ut_hmc5883ldata_t*)ut->data)->driver, rxbuffer, 3, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && rxbuffer[0] == HMC5883L_LLD_IDENTIFICATION_A
-                                   && rxbuffer[1] == HMC5883L_LLD_IDENTIFICATION_B
-                                   && rxbuffer[2] == HMC5883L_LLD_IDENTIFICATION_C) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    ++result.failed;
-    chprintf(stream, "\t\tstatus: %d, idA: %d, idB: %d, idC: %d\n", status, rxbuffer[0], rxbuffer[1], rxbuffer[2]);
-    chprintf(stream, "\t\texpected idA: %d, idB: %d, idC: %d\n", HMC5883L_LLD_IDENTIFICATION_A, HMC5883L_LLD_IDENTIFICATION_B, HMC5883L_LLD_IDENTIFICATION_C);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_IDENTIFICATION_A, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && data == HMC5883L_LLD_IDENTIFICATION_A) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write register...\n");
-  status = hmc5883l_lld_write_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &conf, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if ((status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) && data == 0x70) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n, data: d", status, data);
-  }
-
-  chprintf(stream, "read configuration\n");
-  status = hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write configuration\n");
-  cfg.avg = HMC5883L_LLD_AVG1;
-  cfg.outrate = HMC5883L_LLD_75_HZ;
-  cfg.mbias = HMC5883L_LLD_MB_NORMAL;
-  cfg.gain = HMC5883L_LLD_GN_0_GA;
-  cfg.highspeed = HMC5883L_LLD_HS_DISABLE;
-  cfg.mode = HMC5883L_LLD_MM_CONTINUOUS;
-  status = hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  status |= hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK &&
-      cfg.avg == HMC5883L_LLD_AVG1 &&
-      cfg.outrate == HMC5883L_LLD_75_HZ &&
-      cfg.mbias == HMC5883L_LLD_MB_NORMAL &&
-      cfg.gain == HMC5883L_LLD_GN_0_GA &&
-      cfg.highspeed == HMC5883L_LLD_HS_DISABLE &&
-      cfg.mode == HMC5883L_LLD_MM_CONTINUOUS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read all data for five seconds...\n");
-  status = hmc5883l_lld_set_register(((ut_hmc5883ldata_t*)ut->data)->driver,HMC5883L_LLD_REGISTER_MODE,HMC5883L_LLD_MM_CONTINUOUS,((ut_hmc5883ldata_t*)ut->data)->timeout);
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tX = 0x%04X\tY = 0x%04X\tZ = 0x%04X\n",mdata[0],mdata[1],mdata[2]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read status...\n");
-  status = hmc5883l_lld_read_lock(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsensor lock: %d\n", state);
-  status |= hmc5883l_lld_read_rdy(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsensor rdy: %d\n", state);
-  status |= hmc5883l_lld_read_status(((ut_hmc5883ldata_t*)ut->data)->driver, &state, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsensor status: %d\n", state);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "interrupt (partial data read)...\n");
-  chEvtRegister(((ut_hmc5883ldata_t*)ut->data)->drdyEvtSrc, &el, 0);
-  status = hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdSSleep(1);
-  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdMSleep(10);
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
-  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_MSB, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdMSleep(10);
-  status |= hmc5883l_lld_read_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_DATA_OUT_X_LSB, &data, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosThdMSleep(10);
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), TIME_IMMEDIATE);
-  chprintf(stream, "\t\teventmask = 0x%08X (should be 0)\n", event_mask);
-  if (event_mask != EVENT_MASK(0)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "interrupt (full data read)...\n");
-  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(100 * MICROSECONDS_PER_MILLISECOND));
-  chprintf(stream, "\t\teventmask = 0x%08X (should be 1)\n", event_mask);
-  if (event_mask == EVENT_MASK(0)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read data based on interrupt...\n");
-  status = hmc5883l_lld_read_config(((ut_hmc5883ldata_t*)ut->data)->driver, &cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  uint8_t mode = HMC5883L_LLD_MM_SINGLE;
-  cfg.mode = mode;
-  status |= hmc5883l_lld_write_config(((ut_hmc5883ldata_t*)ut->data)->driver, cfg, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  aosSysGetUptime(&start);
-  aosSysGetUptime(&t);
-  status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-  while (t - start < MICROSECONDS_PER_SECOND) {
-    event_mask = chEvtWaitOneTimeout(EVENT_MASK(0), chTimeUS2I(1000));
-    if (event_mask == EVENT_MASK(0)) {
-      status |= hmc5883l_lld_read_data(((ut_hmc5883ldata_t*)ut->data)->driver, mdata, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-      data_reads++;
-      status = hmc5883l_lld_write_register(((ut_hmc5883ldata_t*)ut->data)->driver, HMC5883L_LLD_REGISTER_CONFIG_A+2, &mode, 1, ((ut_hmc5883ldata_t*)ut->data)->timeout);
-    }
-    aosSysGetUptime(&t);
-  }
-  chEvtUnregister(((ut_hmc5883ldata_t*)ut->data)->drdyEvtSrc, &el);
-  aosUtInfoMsg(stream,"Read data %u times in a second\n", data_reads);
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(HMC5883LDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_HMC5883L) && (AMIROLLD_CFG_HMC5883L == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_INA219_v1.c b/unittests/periphery-lld/src/ut_alld_INA219_v1.c
deleted file mode 100644
index de481f9..0000000
--- a/unittests/periphery-lld/src/ut_alld_INA219_v1.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_INA219_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
-
-#include <math.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldIna219Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_ina219data_t*)(ut->data))->inad != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint16_t data[6];
-  uint16_t write_data = 0x1011;
-  uint16_t new_data[6];
-  uint16_t reset_data;
-  uint16_t test_calib = 0;
-  int16_t usensor_data = 0;
-  uint16_t busready = 0;
-  uint32_t power = 0;
-  int32_t shunt;
-  uint32_t bus;
-
-  chprintf(stream, "read registers...\n");
-  status = ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, data, 6, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write registers...\n");
-  status = ina219_lld_write_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &write_data, 1, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, new_data, 6, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && new_data[0] == write_data) {
-    uint8_t errors = 0;
-    for (uint8_t dataIdx = 1; dataIdx < 6; dataIdx++) {
-      if (new_data[dataIdx] != data[dataIdx]) {
-        ++errors;
-      }
-    }
-    if (errors == 0) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailed(stream, &result);
-    }
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "reset...\n");
-  status = ina219_lld_reset(((ut_ina219data_t*)ut->data)->inad, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_read_register(((ut_ina219data_t*)ut->data)->inad, INA219_LLD_REGISTER_CONFIGURATION, &reset_data, 1, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && reset_data == 0x399F) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    ++result.failed;
-  }
-
-  chprintf(stream, "read config...\n");
-  ina219_lld_cfg_t ina_config;
-  status = ina219_lld_read_config(((ut_ina219data_t*)ut->data)->inad, &ina_config, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write config...\n");
-  ina_config.data = 0x7FFu;
-  status = ina219_lld_write_config(((ut_ina219data_t*)ut->data)->inad, ina_config, ((ut_ina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-
-  chprintf(stream, "calibrate...\n");
-  ina219_lld_calib_input_t calib_in;
-  calib_in.shunt_resistance_0 = 0.1;
-  calib_in.max_expected_current_A = 0.075;
-  calib_in.current_lsb_uA = 10;
-  calib_in.cfg_reg = ina_config;
-  ina219_lld_calib_output_t calib_out;
-  status = ina219_lld_calibration(((ut_ina219data_t*)ut->data)->inad, &calib_in, &calib_out);
-  status |= ina219_lld_write_calibration(((ut_ina219data_t*)ut->data)->inad, calib_out.calibration & 0xFFFEu, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_write_calibration(((ut_ina219data_t*)ut->data)->inad, 0xA000, ((ut_ina219data_t*)ut->data)->timeout);
-  ina219_lld_cfg_t test_config;
-  ((ut_ina219data_t*)ut->data)->inad->current_lsb_uA = 0xA;
-  status |= ina219_lld_read_config(((ut_ina219data_t*)ut->data)->inad, &test_config, ((ut_ina219data_t*)ut->data)->timeout);
-  status |= ina219_lld_read_calibration(((ut_ina219data_t*)ut->data)->inad, &test_calib, ((ut_ina219data_t*)ut->data)->timeout);
-  while (!busready || power == 0) {
-    aosThdMSleep(20);
-    status |= ina219_lld_bus_conversion_ready(((ut_ina219data_t*)ut->data)->inad, &busready, ((ut_ina219data_t*)ut->data)->timeout);
-    status |= ina219_lld_read_power(((ut_ina219data_t*)ut->data)->inad, &power, ((ut_ina219data_t*)ut->data)->timeout);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read shunt voltage...\n");
-  status = ina219_lld_read_shunt_voltage(((ut_ina219data_t*)ut->data)->inad, &shunt, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tshunt voltage: %fV\n", (float)shunt/1000000.f);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read bus voltage (%u%% tolerance)...\n", (uint8_t)(((ut_ina219data_t*)ut->data)->tolerance * 100.f + 0.5f));
-  status = ina219_lld_read_bus_voltage(((ut_ina219data_t*)ut->data)->inad, &bus, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tbus voltage: %fV\n", (float)bus/1000000.f);
-  if ((status == APAL_STATUS_SUCCESS) && (fabs(((float)bus/1000000.f) - ((ut_ina219data_t*)ut->data)->v_expected) < ((ut_ina219data_t*)ut->data)->v_expected * ((ut_ina219data_t*)ut->data)->tolerance)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read power...\n");
-  status = ina219_lld_read_power(((ut_ina219data_t*)ut->data)->inad, &power, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tpower: %fW\n", (float)(power)/1000000.f);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read current...\n");
-  status = ina219_lld_read_current(((ut_ina219data_t*)ut->data)->inad, &usensor_data, ((ut_ina219data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tcurrent: %fA\n", (float)(usensor_data)/1000000.f);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(INA219Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_L3G4200D_v1.c b/unittests/periphery-lld/src/ut_alld_L3G4200D_v1.c
deleted file mode 100644
index 8b13602..0000000
--- a/unittests/periphery-lld/src/ut_alld_L3G4200D_v1.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_L3G4200D_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   L3G4200D unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldL3g4200dFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_l3g4200ddata_t*)(ut->data)) != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t data = 0;
-  uint8_t write_data[5];
-  uint8_t read_data[5];
-  int16_t sdata[3];
-  uint8_t status_reg;
-  eventmask_t event_mask;
-  bool success = false;
-  uint8_t fifo = 0x5F;
-  event_listener_t el;
-
-  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
-    write_data[dataIdx] = (dataIdx+1)*11;
-  }
-  write_data[4] = 0;
-
-  chprintf(stream, "check identity...\n");
-  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_WHO_AM_I, &data, 1);
-  if(status == APAL_STATUS_SUCCESS && data == L3G4200D_LLD_WHO_AM_I){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-  }
-
-  chprintf(stream, "write register...\n");
-  status = l3g4200d_lld_write_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 1);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, &data, 1);
-  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-  }
-
-  chprintf(stream, "write multiple registers...\n");
-  status = l3g4200d_lld_write_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, write_data, 5);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read multiple registers...\n");
-  status = l3g4200d_lld_read_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, L3G4200D_LLD_REGISTER_CTRL_REG1, read_data, 5);
-  uint8_t errors = 0;
-  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-    if (read_data[dataIdx] != write_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_SUCCESS && errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
-    }
-    aosUtFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
-  }
-
-  chprintf(stream, "read config...\n");
-  l3g4200d_lld_cfg_t cfg;
-  status = l3g4200d_lld_read_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &cfg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write config...\n");
-  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_100_HZ | L3G4200D_LLD_BW_12_5 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
-  //cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
-  cfg.registers.ctrl_reg3 = 0x07;
-  cfg.registers.ctrl_reg5 |= L3G4200D_LLD_FIFO_EN;
-  status = l3g4200d_lld_write_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, cfg);
-  uint8_t reg1 = cfg.data[0];
-  status |= l3g4200d_lld_read_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &cfg);
-  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read gyro data for five seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read X axis for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint32_t i = 0; i <= 5; i++) {
-    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_X_AXIS, &cfg);
-    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Y axis for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint32_t i = 0; i <= 5; i++) {
-    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Y_AXIS, &cfg);
-    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Z axis for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint32_t i = 0; i <= 5; i++) {
-    status |= l3g4200d_lld_read_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &(sdata[0]), L3G4200D_LLD_Z_AXIS, &cfg);
-    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-  aosThdMSleep(10);
-
-  chprintf(stream, "read status register...\n");
-  status = l3g4200d_lld_read_status_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &status_reg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read interrupt config...\n");
-  l3g4200d_lld_int_cfg_t int_cfg;
-  status = l3g4200d_lld_read_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &int_cfg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write interrupt config...\n");
-  int_cfg.registers.int1_tsh_xh = 10;
-  status = l3g4200d_lld_write_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, int_cfg);
-  l3g4200d_lld_int_cfg_t int_cfg2;
-  status |= l3g4200d_lld_read_int_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, &int_cfg2);
-  if (status == APAL_STATUS_SUCCESS && int_cfg.registers.int1_tsh_xh == 10) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "interrupt test: read fifo until empty...\n");
-  chEvtRegister(((ut_l3g4200ddata_t*)(ut->data))->src, &el, 0);
-  status = l3g4200d_lld_write_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,fifo);
-  fifo = 0;
-  status |= l3g4200d_lld_read_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
-  status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-  chEvtGetAndClearFlags(&el);
-  aosThdSSleep(1);
-  chEvtGetAndClearFlags(&el);
-  success = false;
-  for (uint8_t i = 0; i < 200; i++) {
-    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
-    status |= l3g4200d_lld_read_fifo_src_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
-    if (event_mask != 0 && ((fifo & L3G4200D_LLD_EMPTY) || fifo == 0)) {
-      success = true;
-      break;
-    }
-    aosThdMSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS && success) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  fifo = 0x4A;
-  status |= l3g4200d_lld_write_fifo_ctrl_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,fifo);
-  cfg.registers.ctrl_reg1 = L3G4200D_LLD_PD | L3G4200D_LLD_DR_800_HZ | L3G4200D_LLD_BW_20 | L3G4200D_LLD_ZEN | L3G4200D_LLD_YEN | L3G4200D_LLD_XEN;
-  cfg.registers.ctrl_reg3 = 0x04;
-  status |= l3g4200d_lld_write_config(((ut_l3g4200ddata_t*)(ut->data))->l3gd, cfg);
-  chprintf(stream, "interrupt test: wait until wtm reached...\n");
-  for (uint8_t i = 0; i < 200; i++) {
-    status |= l3g4200d_lld_read_all_data(((ut_l3g4200ddata_t*)(ut->data))->l3gd, sdata, &cfg);
-    event_mask = chEvtWaitAnyTimeout(~0, TIME_IMMEDIATE);
-    status |= l3g4200d_lld_read_fifo_src_register(((ut_l3g4200ddata_t*)(ut->data))->l3gd,&fifo);
-    if (event_mask != 0 && (fifo & L3G4200D_LLD_WTM)) {
-      success = true;
-      break;
-    }
-    aosThdMSleep(10);
-  }
-  if (status == APAL_STATUS_SUCCESS && success) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chEvtUnregister(((ut_l3g4200ddata_t*)(ut->data))->src, &el);
-  aosThdMSleep(10);
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(L3G4200DDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_L3G4200D) && (AMIROLLD_CFG_L3G4200D == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_LED_v1.c b/unittests/periphery-lld/src/ut_alld_LED_v1.c
deleted file mode 100644
index 86daeb6..0000000
--- a/unittests/periphery-lld/src/ut_alld_LED_v1.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_LED_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   LED unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldLedFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = AOS_OK;
-
-  chprintf(stream, "lighting up for two seconds...\n");
-  led_lld_state_t state = LED_LLD_STATE_ON;
-  status = led_lld_set((LEDDriver*)ut->data, state);
-  aosThdSSleep(2);
-  status |= led_lld_get((LEDDriver*)ut->data, &state);
-  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_ON) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "turning off for two seconds...\n");
-  state = LED_LLD_STATE_OFF;
-  status = led_lld_set((LEDDriver*)ut->data, state);
-  aosThdSSleep(2);
-  status |= led_lld_get((LEDDriver*)ut->data, &state);
-  if (status == APAL_STATUS_OK && state == LED_LLD_STATE_OFF) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "toggling for two seconds...\n");
-  status = led_lld_set((LEDDriver*)ut->data, LED_LLD_STATE_ON);
-  for (uint32_t i = 0; i < 2000/100; ++i) {
-    status |= led_lld_toggle((LEDDriver*)ut->data);
-    status |= led_lld_get((LEDDriver*)ut->data, &state);
-    status |= ((uint8_t)state != (i & 0x01u)) ? APAL_STATUS_ERROR : APAL_STATUS_OK;
-    aosThdMSleep(100);
-  }
-  status = led_lld_set((LEDDriver*)ut->data, LED_LLD_STATE_OFF);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LEDDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LED) && (AMIROLLD_CFG_LED == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_LIS331DLH_v1.c b/unittests/periphery-lld/src/ut_alld_LIS331DLH_v1.c
deleted file mode 100644
index ab25b91..0000000
--- a/unittests/periphery-lld/src/ut_alld_LIS331DLH_v1.c
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_LIS331DLH_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   LIS331DLH unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldLis331dlhFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_lis331dlhdata_t*)(ut->data)) != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t data = 0;
-  uint8_t write_data[5];
-  uint8_t read_data[5];
-  uint8_t errors = 0;
-  uint8_t reg1;
-  int16_t sdata[3];
-  uint8_t status_reg;
-  lis331dlh_lld_int_cfg_t intcfg;
-  event_listener_t el;
-  eventmask_t event_mask;
-  uint8_t success = 0;
-
-  for (uint8_t dataIdx = 0; dataIdx < 4; dataIdx++) {
-    write_data[dataIdx] = (dataIdx+1)*11;
-  }
-  write_data[4] = 0;
-
-  chprintf(stream, "check identity...\n");
-  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_WHO_AM_I, &data, 1);
-  if (status == APAL_STATUS_SUCCESS &&
-      data == LIS331DLH_LLD_WHO_AM_I) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-    ++result.failed;
-  }
-
-  chprintf(stream, "write register...\n");
-  status = lis331dlh_lld_write_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 1);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, &data, 1);
-  if (status == APAL_STATUS_SUCCESS && data == write_data[0]) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    aosUtFailedMsg(stream, &result, "0x%08X, data: %d\n", status, data);
-    ++result.failed;
-  }
-
-  chprintf(stream, "write multiple registers...\n");
-  status = lis331dlh_lld_write_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, write_data, 5);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read multiple registers...\n");
-  status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_CTRL_REG1, read_data, 5);
-  for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-    if (read_data[dataIdx] != write_data[dataIdx]) {
-      ++errors;
-    }
-  }
-  if (status == APAL_STATUS_SUCCESS &&
-      errors == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed\n");
-    for (uint8_t dataIdx = 0; dataIdx < 5; dataIdx++) {
-      chprintf(stream, "\t\tStatus: %d, CTRL_REG%d: %d, write_data: %d\n", status, dataIdx+1, read_data[dataIdx], write_data[dataIdx]);
-    }
-    aosUtFailedMsg(stream, &result, "0x%08X, errors: %d\n", status, errors);
-  }
-
-  chprintf(stream, "read config...\n");
-  lis331dlh_lld_cfg_t cfg;
-  status = lis331dlh_lld_read_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "write config...\n");
-  cfg.registers.ctrl_reg1 = LIS331DLH_LLD_PM_ODR |
-      LIS331DLH_LLD_DR_1000HZ_780LP |
-      LIS331DLH_LLD_X_AXIS_ENABLE |
-      LIS331DLH_LLD_Y_AXIS_ENABLE |
-      LIS331DLH_LLD_Z_AXIS_ENABLE;
-  cfg.registers.ctrl_reg3 = 0x00;
-  status = lis331dlh_lld_write_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
-  reg1 = cfg.data[0];
-  lis331dlh_lld_read_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &cfg);
-  if (status == APAL_STATUS_SUCCESS && cfg.data[0] == reg1) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_all_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, sdata, &cfg);
-    chprintf(stream, "\t\tX = %6d\tY = %6d\tZ = %6d\n", sdata[0], sdata[1], sdata[2]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read X acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_X_AXIS, &cfg);
-    chprintf(stream, "\t\tX = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Y acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Y_AXIS, &cfg);
-    chprintf(stream, "\t\tY = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read Z acceleration for five seconds...\n");
-  status = APAL_STATUS_SUCCESS;
-  for (uint8_t i = 0; i < 5; ++i) {
-    status |= lis331dlh_lld_read_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, &(sdata[0]), LIS331DLH_LLD_Z_AXIS, &cfg);
-    chprintf(stream, "\t\tZ = %6d\n", sdata[0]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read status register...\n");
-  status = lis331dlh_lld_read_status_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, &status_reg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "interrupt...\n");
-  intcfg.cfg_reg = LIS331DLH_LLD_INT_CFG_X_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Y_HIGH_ENABLE | LIS331DLH_LLD_INT_CFG_Z_HIGH_ENABLE;
-  intcfg.threshold = 10;
-  intcfg.duration = 1;
-  lis331dlh_lld_write_int_config(((ut_lis331dlhdata_t*)(ut->data))->lisd, &intcfg, LIS331DLH_LLD_INT1);
-  aosThdSSleep(1);
-  chEvtRegister(((ut_lis331dlhdata_t*)(ut->data))->src, &el, 3);
-  chprintf(stream, "\t\tmove the AMiRo now to generate interrupts\n");
-  aosThdSSleep(1);
-  for (uint8_t i = 0; i < 10; i++) {
-    event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
-    status |= lis331dlh_lld_read_all_data(((ut_lis331dlhdata_t*)(ut->data))->lisd, sdata, &cfg);
-    status = lis331dlh_lld_read_register(((ut_lis331dlhdata_t*)(ut->data))->lisd, LIS331DLH_LLD_REGISTER_INT1_SOURCE, &data, 1);
-    eventflags_t flags = chEvtGetAndClearFlags(&el);
-    if (event_mask == EVENT_MASK(3) && (flags & ((ut_lis331dlhdata_t*)(ut->data))->evtflags)) {
-      ++success;
-      chprintf(stream, "\t\tX = %6d INTERRUPT\n", sdata[0]);
-    } else {
-      chprintf(stream, "\t\tX = %6d\n", sdata[0]);
-    }
-    aosThdSSleep(1);
-  }
-  event_mask = chEvtWaitOneTimeout(EVENT_MASK(3), TIME_IMMEDIATE);
-  chEvtUnregister(((ut_lis331dlhdata_t*)(ut->data))->src, &el);
-  if (status == APAL_STATUS_SUCCESS && success > 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(LIS331DLHDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LIS331DLH) && (AMIROLLD_CFG_LIS331DLH == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_LTC4412_v1.c b/unittests/periphery-lld/src/ut_alld_LTC4412_v1.c
deleted file mode 100644
index 06bc0df..0000000
--- a/unittests/periphery-lld/src/ut_alld_LTC4412_v1.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_LTC4412_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldLtc4412Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0,0};
-  uint32_t status;
-
-  chprintf(stream, "read ctrl pin...\n");
-  ltc4412_lld_ctrl_t ctrl;
-  status = ltc4412_lld_get_ctrl((LTC4412Driver*)ut->data, &ctrl);
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write ctrl pin...\n");
-  status = ltc4412_lld_set_ctrl((LTC4412Driver*)ut->data, LTC4412_LLD_CTRL_ACTIVE);
-  status |= ltc4412_lld_get_ctrl((LTC4412Driver*)ut->data, &ctrl);
-  if (status == APAL_STATUS_SUCCESS && ctrl == LTC4412_LLD_CTRL_ACTIVE) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read stat pin...\n");
-  ltc4412_lld_stat_t stat;
-  status = ltc4412_lld_get_stat((LTC4412Driver*)ut->data, &stat);
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(LTC4412Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_LTC4412) && (AMIROLLD_CFG_LTC4412 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_MIC9404x_v1.c b/unittests/periphery-lld/src/ut_alld_MIC9404x_v1.c
deleted file mode 100644
index e6c5f62..0000000
--- a/unittests/periphery-lld/src/ut_alld_MIC9404x_v1.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_MIC9404x_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MIC9404x) && (AMIROLLD_CFG_MIC9404x == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   MIC9404x unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldMic9404xFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  mic9404x_lld_state_t state_orig;
-  mic9404x_lld_state_t state;
-  aos_utresult_t result = {0, 0};
-  uint32_t status = APAL_STATUS_OK;
-
-  chprintf(stream, "reading current status...\n");
-  status = mic9404x_lld_get((MIC9404xDriver*)ut->data, &state_orig);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "power %s\n", (state_orig == MIC9404x_LLD_STATE_ON) ? "enabled" : "disabled");
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  state = state_orig;
-  for (uint8_t i = 0; i < 2; ++i) {
-    if (state == MIC9404x_LLD_STATE_ON) {
-      chprintf(stream, "disabling for five seconds...\n");
-      status = mic9404x_lld_set((MIC9404xDriver*)ut->data, MIC9404x_LLD_STATE_OFF);
-      status |= mic9404x_lld_get((MIC9404xDriver*)ut->data, &state);
-      if (state == MIC9404x_LLD_STATE_OFF) {
-        aosThdSSleep(5);
-        status |= mic9404x_lld_get((MIC9404xDriver*)ut->data, &state);
-      }
-      if ((status == APAL_STATUS_OK) && (state == MIC9404x_LLD_STATE_OFF)) {
-        aosUtPassed(stream, &result);
-      } else {
-        aosUtFailed(stream, &result);
-        break;
-      }
-    } else {
-      chprintf(stream, "enabling for five seconds...\n");
-      status = mic9404x_lld_set((MIC9404xDriver*)ut->data, MIC9404x_LLD_STATE_ON);
-      status |= mic9404x_lld_get((MIC9404xDriver*)ut->data, &state);
-      if (state == MIC9404x_LLD_STATE_ON) {
-        aosThdSSleep(5);
-        status |= mic9404x_lld_get((MIC9404xDriver*)ut->data, &state);
-      }
-      if ((status == APAL_STATUS_OK) && (state == MIC9404x_LLD_STATE_ON)) {
-        aosUtPassed(stream, &result);
-      } else {
-        aosUtFailed(stream, &result);
-        break;
-      }
-    }
-  }
-  // restore original state
-  if (state != state_orig) {
-    status = mic9404x_lld_set((MIC9404xDriver*)ut->data, state);
-    if (status != APAL_STATUS_OK) {
-      chprintf(stream, "\t\tWARNING: failed to restore original status!\n");
-    }
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(MIC9404xDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MIC9404x) && (AMIROLLD_CFG_MIC9404x == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_MPR121_v1.c b/unittests/periphery-lld/src/ut_alld_MPR121_v1.c
deleted file mode 100644
index adfe2fc..0000000
--- a/unittests/periphery-lld/src/ut_alld_MPR121_v1.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_MPR121_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-#define INTERRUPT_EVENT_ID            1
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldMpr121Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_mpr121data_t*)ut->data)->mprd != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  mpr121_lld_config_t cfg;
-  uint8_t data, wdata, rdata;
-  uint16_t edata[4];
-  uint8_t tstate = 0;
-  event_listener_t event_listener;
-  aos_timestamp_t tstart, tcurrent, tend;
-
-  chprintf(stream, "soft reset...\n");
-  status = mpr121_lld_soft_reset(((ut_mpr121data_t*)ut->data)->mprd, ((ut_mpr121data_t*)ut->data)->timeout);
-  status |= mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && cfg.registers.ele_config == 0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read register...\n");
-  status = mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((ut_mpr121data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdata: 0x%02X\n", data);
-  if (status == APAL_STATUS_SUCCESS && data == (MPR121_LLD_CDT_0_5 | MPR121_LLD_ESI_16)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write register...\n");
-  wdata = MPR121_LLD_CDT_32 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_16;
-  status = mpr121_lld_write_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &wdata, ((ut_mpr121data_t*)ut->data)->timeout);
-  aosThdMSleep(500);
-  status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdata: 0x%02X\n", rdata);
-  status |= mpr121_lld_write_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &data, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && rdata == wdata) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read config...\n");
-  status = mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && cfg.registers.config_1 == 0x10 && cfg.registers.config_2 == 0x24) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\t\tconfig 1: 0x%02X\n", cfg.registers.config_1);
-    chprintf(stream, "\t\tconfig 2: 0x%02X\n", cfg.registers.config_2);
-    mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_1, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tconfig 1: 0x%02X\n", rdata);
-    mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_CONFIG_2, 0, 1, &rdata, ((ut_mpr121data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\tconfig 2: 0x%02X\n", rdata);
-    for (uint8_t valueIdx = 0; valueIdx < 8; valueIdx++) {
-      chprintf(stream, "\t\tdata %d: 0x%02X\n", valueIdx, cfg.values[valueIdx]);
-    }
-    chprintf(stream, "ele_config: 0x%02X\n", cfg.registers.ele_config);
-    chprintf(stream, "config_1: 0x%02X\n", cfg.registers.config_1);
-    chprintf(stream, "config_2: 0x%02X\n", cfg.registers.config_2);
-    chprintf(stream, "target_level: 0x%02X\n", cfg.registers.target_level);
-    chprintf(stream, "low_side_limit: 0x%02X\n", cfg.registers.low_side_limit);
-    chprintf(stream, "up_side_limit: 0x%02X\n", cfg.registers.up_side_limit);
-    chprintf(stream, "auto_config_2: 0x%02X\n", cfg.registers.auto_config_2);
-    chprintf(stream, "auto_config_1: 0x%02X\n", cfg.registers.auto_config_1);
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write config...\n");
-  cfg.registers.ele_config = MPR121_LLD_CL_ON_ALL | MPR121_LLD_ELEPROX_0 | 4;
-  cfg.registers.config_1 = MPR121_LLD_FFI_18 | 16;
-  cfg.registers.config_2 = MPR121_LLD_CDT_1 | MPR121_LLD_SFI_10 | MPR121_LLD_ESI_32;
-  cfg.registers.up_side_limit = 0x96u;
-  cfg.registers.low_side_limit = 0x58u;
-  cfg.registers.target_level = 0x68u;
-  cfg.registers.auto_config_1 = MPR121_LLD_FFI_18 | MPR121_LLD_RETRY_2 | MPR121_LLD_BVA_ON_ALL | MPR121_LLD_AC_RECONF_EN;
-  status = mpr121_lld_write_config(((ut_mpr121data_t*)ut->data)->mprd, cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  aosThdMSleep(500);
-  status |= mpr121_lld_read_config(((ut_mpr121data_t*)ut->data)->mprd, &cfg, ((ut_mpr121data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && cfg.registers.up_side_limit == 0x96u) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read filtered data for ten seconds...\n");
-  chprintf(stream, "(values should change if you touch the sensors now)\n");
-  for (uint8_t i = 0; i < 10; i++) {
-    status = mpr121_lld_read_filtered_data(((ut_mpr121data_t*)ut->data)->mprd, 0, 4, edata, ((ut_mpr121data_t*)ut->data)->timeout);
-    chprintf(stream, "\t\t0x%04X | 0x%04X | 0x%04X | 0x%04X\n", edata[0], edata[1], edata[2], edata[3]);
-    aosThdSSleep(1);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "test interrupts...\n");
-  status = AOS_OK;
-  chEvtRegister(((ut_mpr121data_t*)ut->data)->evtsource, &event_listener, INTERRUPT_EVENT_ID);
-  aosSysGetUptime(&tstart);
-  tend = tstart + (30 * MICROSECONDS_PER_SECOND);
-  do {
-    aosSysGetUptime(&tcurrent);
-    const aos_timestamp_t ttimeout = MICROSECONDS_PER_SECOND - ((tcurrent - tstart) % MICROSECONDS_PER_SECOND);
-    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(ttimeout));
-    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
-    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) && eflags == ((ut_mpr121data_t*)ut->data)->evtflags) {
-      // interrupt detected
-      status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((ut_mpr121data_t*)ut->data)->timeout);
-      chprintf(stream, "\t\tinterrupt detected\n");
-      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
-    }
-    else if (emask == 0) {
-      // timeout
-      status |= mpr121_lld_read_register(((ut_mpr121data_t*)ut->data)->mprd, MPR121_LLD_REGISTER_TOUCH_STATUS, 0, 1, &tstate, ((ut_mpr121data_t*)ut->data)->timeout);
-      chprintf(stream, "\t\ttstate: %X %X %X %X\n", tstate & 1, (tstate >> 1) & 1, (tstate >> 2) & 1, (tstate >> 3) & 1);
-    }
-    aosSysGetUptime(&tcurrent);
-  } while (tcurrent < tend);
-  chEvtUnregister(((ut_mpr121data_t*)ut->data)->evtsource, &event_listener);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(MPR121Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPR121) && (AMIROLLD_CFG_MPR121 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_MPU6050_v1.c b/unittests/periphery-lld/src/ut_alld_MPU6050_v1.c
deleted file mode 100644
index b58d666..0000000
--- a/unittests/periphery-lld/src/ut_alld_MPU6050_v1.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_MPU6050_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldMpu6050Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-    aos_utresult_t result = {0, 0};
-
-    uint8_t data[1] = {0};
-    uint32_t status = 0;
-
-    status = mpu6050_lld_read_register(((ut_mpu6050data_t*)ut->data)->mpu, MPU6050_LLD_WHO_AM_I, data, 1, ((ut_mpu6050data_t*)ut->data)->timeout);
-    if (status == APAL_STATUS_OK && data[0] == MPU6050_I_AM) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "0x%08X | 0x%02X\n", status, data[0]);
-    }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_PCA9544A_v1.c b/unittests/periphery-lld/src/ut_alld_PCA9544A_v1.c
deleted file mode 100644
index e28ca10..0000000
--- a/unittests/periphery-lld/src/ut_alld_PCA9544A_v1.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_PCA9544A_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldPca9544aFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_pca9544adata_t*)ut->data)->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0,0};
-  uint32_t status;
-  uint8_t ctrlreg;
-  pca9544a_lld_intstatus_t interrupt;
-  pca9544a_lld_chid_t channel;
-  uint8_t test_mask = 0x00u;
-
-  chprintf(stream, "reading control register...\n");
-  status = pca9544a_lld_read(((ut_pca9544adata_t*)ut->data)->driver, &ctrlreg, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing control register...\n");
-  status = APAL_STATUS_OK;
-  status |= pca9544a_lld_write(((ut_pca9544adata_t*)ut->data)->driver, (uint8_t)(PCA9544A_LLD_CTRLREG_EN), ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_read(((ut_pca9544adata_t*)ut->data)->driver, &ctrlreg, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if ((status == APAL_STATUS_OK  || status == APAL_STATUS_WARNING) && ctrlreg == PCA9544A_LLD_CTRLREG_EN) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, ctrlreg);
-  }
-
-  chprintf(stream, "reading interrupt status...\n");
-  status = pca9544a_lld_getintstatus(((ut_pca9544adata_t*)ut->data)->driver, &interrupt, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassedMsg(stream, &result, "0x%08X\n", interrupt);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading current channel...\n");
-  status = pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassedMsg(stream, &result, "0x%08X\n", channel);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "setting current channel...\n");
-  status = APAL_STATUS_OK;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH0, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH0) ? 0x01u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH1, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH1) ? 0x02u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH2, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH2) ? 0x04u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH3, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH3) ? 0x08u : 0x00u;
-  status |= pca9544a_lld_setchannel(((ut_pca9544adata_t*)ut->data)->driver, PCA9544A_LLD_CH_NONE, ((ut_pca9544adata_t*)ut->data)->timeout);
-  status |= pca9544a_lld_getcurrentchannel(((ut_pca9544adata_t*)ut->data)->driver, &channel, ((ut_pca9544adata_t*)ut->data)->timeout);
-  test_mask |= (channel != PCA9544A_LLD_CH_NONE) ? 0x10u : 0x00u;
-  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && test_mask == 0x00u) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%X\n", status, test_mask);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(PCA9544ADriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCA9544A) && (AMIROLLD_CFG_PCA9544A == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_PCAL6524_v1.c b/unittests/periphery-lld/src/ut_alld_PCAL6524_v1.c
deleted file mode 100644
index d85aecb..0000000
--- a/unittests/periphery-lld/src/ut_alld_PCAL6524_v1.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_PCAL6524_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1)) || defined(__DOXYGEN__)
-
-#include <string.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldPcal6524Func(BaseSequentialStream* stream, aos_unittest_t *ut)
-{
-  aosDbgCheck((ut->data != NULL) &&
-              (((ut_pcal6524data_t*)ut->data)->pcal6524d != NULL));
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t buffer[24];
-  memset(buffer, 0xAA, sizeof(buffer));
-
-// This test is currently not supported. See PCAL6524 driver implementation for further information.
-//  chprintf(stream, "reading device ID...\n");
-//  status = pcal6524_lld_read_id(((ut_pcal6524data_t*)ut->data)->pcal6524d, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
-//  chprintf(stream, "\t\traw: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
-//  chprintf(stream, "\t\tname:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->name);
-//  chprintf(stream, "\t\tpart:     0x%03X\n", ((pcal6524_lld_deviceid_t*)buffer)->part);
-//  chprintf(stream, "\t\trevision: 0x%01X\n", ((pcal6524_lld_deviceid_t*)buffer)->revision);
-//  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-//    aosUtPassed(stream, &result);
-//  } else {
-//    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-//  }
-
-  chprintf(stream, "reading register...\n");
-  status = pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdebounce count: %u\n", buffer[0]);
-  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing register...\n");
-  buffer[3] = 0xFF;
-  status = pcal6524_lld_write_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[3], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[4], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_write_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, buffer[0], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_reg(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_SWITCHDEBOUNCECOUNT, &buffer[1], ((ut_pcal6524data_t*)ut->data)->timeout);
-  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
-      ((buffer[1] == buffer[0]) && (buffer[4] == buffer[3]))) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading group...\n");
-  status = pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, buffer, ((ut_pcal6524data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
-           (((uint16_t)buffer[0]) << 8) | buffer[1],
-           (((uint16_t)buffer[2]) << 8) | buffer[3],
-           (((uint16_t)buffer[4]) << 8) | buffer[5]);
-  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing group...\n");
-  memset(&buffer[6], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
-  status = pcal6524_lld_write_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[6], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[12], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_write_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[0], ((ut_pcal6524data_t*)ut->data)->timeout);
-  status |= pcal6524_lld_read_group(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUTDRIVESTRENGTH_P0A, &buffer[18], ((ut_pcal6524data_t*)ut->data)->timeout);
-  if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
-      ((memcmp(&buffer[12], &buffer[6], 6) == 0) && (memcmp(&buffer[18], &buffer[0], 6) == 0))) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading continuously...\n");
-  // read the following registers continously (24 bytes):
-  // output 0-3 + polarity inversions 0-3 + configuration 0-3 + output drive strength 0A-2B + input latch 0-3 + pupd enable 0-3 + pupd selection 0-3
-  status = pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\toutput: 0x%02X 0x%02X 0x%02X\n", buffer[0], buffer[1], buffer[2]);
-  chprintf(stream, "\t\tpolarity inversion: 0x%02X 0x%02X 0x%02X\n", buffer[3], buffer[4], buffer[5]);
-  chprintf(stream, "\t\tconfiguration: 0x%02X 0x%02X 0x%02X\n", buffer[6], buffer[7], buffer[8]);
-  chprintf(stream, "\t\toutput drive strength: 0x%04X 0x%04X 0x%04X\n",
-           (((uint16_t)buffer[9]) << 8) | buffer[10],
-           (((uint16_t)buffer[11]) << 8) | buffer[12],
-           (((uint16_t)buffer[13]) << 8) | buffer[14]);
-  chprintf(stream, "\t\tinput latch: 0x%02X 0x%02X 0x%02X\n", buffer[15], buffer[16], buffer[17]);
-  chprintf(stream, "\t\tpupd enable: 0x%02X 0x%02X 0x%02X\n", buffer[18], buffer[19], buffer[20]);
-  chprintf(stream, "\t\tpupd selection: 0x%02X 0x%02X 0x%02X\n", buffer[21], buffer[22], buffer[23]);
-  if ((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing continuously...\n");
-  {
-    uint8_t writebuffer[24];
-    uint8_t readbuffer[2][24];
-    // copy the read configuration but set the output drive strength to factor 0.25
-    memcpy(writebuffer, buffer, sizeof(buffer));
-    memset(&writebuffer[9], PCAL6524_LL_OUTPUTDRIVESTRENGTH_0_25, 6);
-    status = pcal6524_lld_write_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, writebuffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    status |= pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[0], 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    status |= pcal6524_lld_write_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, buffer, 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    status |= pcal6524_lld_read_continuous(((ut_pcal6524data_t*)ut->data)->pcal6524d, PCAL6524_LLD_CMD_OUTPUT_P0, readbuffer[1], 24, ((ut_pcal6524data_t*)ut->data)->timeout);
-    if (((status == APAL_STATUS_OK) || (status == APAL_STATUS_WARNING)) &&
-        ((memcmp(writebuffer, readbuffer[0], 24) == 0) && (memcmp(buffer, readbuffer[1], 24) == 0))) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(PCAL6524Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PCAL6524) && (AMIROLLD_CFG_PCAL6524 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_PKxxxExxx_v1.c b/unittests/periphery-lld/src/ut_alld_PKxxxExxx_v1.c
deleted file mode 100644
index be29dc4..0000000
--- a/unittests/periphery-lld/src/ut_alld_PKxxxExxx_v1.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_PKxxxExxx_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldPkxxxexxxFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_pkxxxexxx_t*)ut->data)->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-
-  chprintf(stream, "checking PWM configuration...\n");
-  status = pkxxxexxx_lld_checkPWMconfiguration(((ut_pkxxxexxx_t*)ut->data)->driver);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    // abort at this point
-    return result;
-  }
-
-  chprintf(stream, "buzzing for one second...\n");
-  status = pkxxxexxx_lld_enable(((ut_pkxxxexxx_t*)ut->data)->driver, ((ut_pkxxxexxx_t*)ut->data)->channel, true);
-  aosThdSSleep(1);
-  status |= pkxxxexxx_lld_enable(((ut_pkxxxexxx_t*)ut->data)->driver, ((ut_pkxxxexxx_t*)ut->data)->channel, false);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  return result;
-}
-
-#endif /* AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_PKxxxExxx) && (AMIROLLD_CFG_PKxxxExxx == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_TLC5947_v1.c b/unittests/periphery-lld/src/ut_alld_TLC5947_v1.c
deleted file mode 100644
index bf931e2..0000000
--- a/unittests/periphery-lld/src/ut_alld_TLC5947_v1.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_TLC5947_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1)) || defined(__DOXYGEN__)
-
-#include <string.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   TLC9547 unit test function
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldTlc5947Func(BaseSequentialStream *stream, aos_unittest_t *ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  int32_t status = 0;
-  tlc5947_lld_blank_t blank;
-  tlc5947_lld_buffer_t buffer;
-
-  chprintf(stream, "reading blank pin...\n");
-  status = tlc5947_lld_getBlank((TLC5947Driver*)ut->data, &blank);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "blank is %s\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabled" : "disabled");
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // enabling/disabling blank pin
-  for (uint8_t i = 0; i < 2; ++i) {
-    blank = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
-    tlc5947_lld_blank_t blank_after = (blank == TLC5947_LLD_BLANK_ENABLE) ? TLC5947_LLD_BLANK_DISABLE : TLC5947_LLD_BLANK_ENABLE;
-    chprintf(stream, "%s blank pin...\n", (blank == TLC5947_LLD_BLANK_ENABLE) ? "enabling" : "disabling");
-    status = tlc5947_lld_setBlank((TLC5947Driver*)ut->data, blank);
-    status |= tlc5947_lld_getBlank((TLC5947Driver*)ut->data, &blank_after);
-    if (status == APAL_STATUS_OK && blank_after == blank) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    }
-  }
-
-  chprintf(stream, "setting all black and dimming white...\n");
-  status = tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
-  status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-  status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_DISABLE);
-  for (uint8_t bit = 0; bit < TLC5947_LLD_PWM_RESOLUTION_BITS; ++bit) {
-    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-      tlc5947_lld_setBuffer(&buffer, channel, (1 << (bit+1)) - 1);
-    }
-    status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-    status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-    aosThdMSleep(100);
-  }
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "NOT dimming black again...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t bit = TLC5947_LLD_PWM_RESOLUTION_BITS; bit > 0; --bit) {
-    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-      tlc5947_lld_setBuffer(&buffer, channel, (1 << bit) - 1);
-    }
-    status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-    status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-    status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-    // Grayscale data is not updated this time (tlc5947_lld_update() not called).
-    // TODO: For some reason the PWMs are updated nevertheless.
-    aosThdMSleep(100);
-  }
-  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "setting each channel incrementally...\n");
-  status = APAL_STATUS_OK;
-  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
-  status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-  status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-  status |= tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_DISABLE);
-  for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-    uint16_t value = 0x0000u;
-    for (uint8_t byte = 0; byte < 3; ++byte) {
-      switch (byte) {
-        case 0:
-          value |= 0x00Fu;
-          break;
-        case 1:
-          value |= 0x0F0u;
-          break;
-        case 2:
-          value |= 0xF00u;
-          break;
-      }
-      tlc5947_lld_setBuffer(&buffer, channel, value);
-      status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-      status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-      aosThdSleep(10.0f / TLC5947_LLD_NUM_CHANNELS / 3.0f);
-      tlc5947_lld_setBuffer(&buffer, channel, 0);
-    }
-  }
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "setting one color after another...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t color = 0; color < 3; ++color) {
-    for (uint8_t channel = color; channel < TLC5947_LLD_NUM_CHANNELS; channel += 3) {
-      const uint16_t val = 0xAF5u; // some deterministic value with high entropy
-      tlc5947_lld_setBuffer(&buffer, channel, val);
-      status |= tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-      status |= tlc5947_lld_update((TLC5947Driver*)ut->data);
-      status |= (tlc5947_lld_getBuffer(&buffer, channel) != val) ? ((int32_t)1 << 30) : 0;
-      if (status != APAL_STATUS_OK) {
-        break;
-      } else {
-        aosThdSleep(10.0f / TLC5947_LLD_NUM_CHANNELS / 3.0f);
-      }
-    }
-    for (uint8_t channel = 0; channel < TLC5947_LLD_NUM_CHANNELS; ++channel) {
-      tlc5947_lld_setBuffer(&buffer, channel, 0);
-    }
-  }
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // turn LEDs off
-  tlc5947_lld_setBlank((TLC5947Driver*)ut->data, TLC5947_LLD_BLANK_ENABLE);
-  memset(buffer.data, 0, TLC5947_LLD_BUFFER_SIZE);
-  tlc5947_lld_write((TLC5947Driver*)ut->data, &buffer);
-  tlc5947_lld_update((TLC5947Driver*)ut->data);
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(TLC5947Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TLC5947) && (AMIROLLD_CFG_TLC5947 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_TPS20xxB_v1.c b/unittests/periphery-lld/src/ut_alld_TPS20xxB_v1.c
deleted file mode 100644
index 8538469..0000000
--- a/unittests/periphery-lld/src/ut_alld_TPS20xxB_v1.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_TPS20xxB_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-/**
- * @brief   TPS20xxB unit test function.
- *
- * @param[in] stream  Stream for input/output.
- * @param[in] ut      Unit test object.
- *
- * @return            Unit test result value.
- */
-aos_utresult_t utAlldTps20xxbFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status = AOS_OK;
-  tps20xxb_lld_enable_t en;
-  tps20xxb_lld_overcurrent_t oc;
-
-  chprintf(stream, "write laser enable...\n");
-  status = tps20xxb_lld_set_enable((TPS20xxBDriver*)ut->data, TPS20xxB_LLD_ENABLE);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read laser enable...\n");
-  status = tps20xxb_lld_read_enable((TPS20xxBDriver*)ut->data, &en);
-  if (status == APAL_STATUS_SUCCESS && en == TPS20xxB_LLD_ENABLE) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "read laser oc...\n");
-  status = tps20xxb_lld_read_overcurrent((TPS20xxBDriver*)ut->data, &oc);
-  if (status == APAL_STATUS_SUCCESS && oc == TPS20xxB_LLD_NO_OVERCURRENT) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  chprintf(stream, "disable laser...\n");
-  status = tps20xxb_lld_set_enable((TPS20xxBDriver*)ut->data, TPS20xxB_LLD_DISABLE);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailed(stream, &result);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS20xxBDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS20xxB) && (AMIROLLD_CFG_TPS20xxB == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_TPS6211x_v1.c b/unittests/periphery-lld/src/ut_alld_TPS6211x_v1.c
deleted file mode 100644
index 23b52c2..0000000
--- a/unittests/periphery-lld/src/ut_alld_TPS6211x_v1.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_TPS6211x_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldTps6211xFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0,0};
-  uint32_t status;
-  tps6211x_lld_power_en_t power;
-
-  chprintf(stream, "read pin...\n");
-  status = tps6211x_lld_get_power_en((TPS6211xDriver*)ut->data, &power);
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write pin...\n");
-  status = tps6211x_lld_set_power_en((TPS6211xDriver*)ut->data, TPS6211x_LLD_POWER_ENABLED);
-  status |= tps6211x_lld_get_power_en((TPS6211xDriver*)ut->data, &power);
-  if(status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_ENABLED){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(TPS6211xDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_TPS6211x_v1_INA219_v1.c b/unittests/periphery-lld/src/ut_alld_TPS6211x_v1_INA219_v1.c
deleted file mode 100644
index ab8d424..0000000
--- a/unittests/periphery-lld/src/ut_alld_TPS6211x_v1_INA219_v1.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_TPS6211x_v1_INA219_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldTps6211xIna219Func(BaseSequentialStream *stream, aos_unittest_t *ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_tps6211xina219data_t*)ut->data)->tps6211x != NULL && ((ut_tps6211xina219data_t*)ut->data)->ina219 != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  tps6211x_lld_power_en_t power;
-  uint32_t v_buson, v_busoff;
-
-  chprintf(stream, "read pin...\n");
-  status = tps6211x_lld_get_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, &power);
-  aosThdSSleep(1);
-  status |= ina219_lld_read_bus_voltage(((ut_tps6211xina219data_t*)ut->data)->ina219, &v_buson, ((ut_tps6211xina219data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_ENABLED) {
-    aosUtPassedMsg(stream, &result, "enabled, %fV\n", (float)v_buson / 1000000.0f);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write pin...\n");
-  status = tps6211x_lld_set_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, TPS6211x_LLD_POWER_DISABLED);
-  status |= tps6211x_lld_get_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, &power);
-  aosThdSSleep(1);
-  status |= ina219_lld_read_bus_voltage(((ut_tps6211xina219data_t*)ut->data)->ina219, &v_busoff, ((ut_tps6211xina219data_t*)ut->data)->timeout);
-  status |= tps6211x_lld_set_power_en(((ut_tps6211xina219data_t*)ut->data)->tps6211x, TPS6211x_LLD_POWER_ENABLED);
-  if (status == APAL_STATUS_SUCCESS && power == TPS6211x_LLD_POWER_DISABLED) {
-    chprintf(stream, "\tdisabled, %fV\n", (float)v_busoff / 1000000.0f);
-    if (v_buson > v_busoff) {
-      aosUtPassed(stream, &result);
-    } else {
-      aosUtFailedMsg(stream, &result, "on: %fV; off: %fV\n", (float)v_buson / 1000000.0f, (float)v_busoff / 1000000.0f);
-    }
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_TPS6211x) && (AMIROLLD_CFG_TPS6211x == 1) && defined(AMIROLLD_CFG_INA219) && (AMIROLLD_CFG_INA219 == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_VCNL4020_v1.c b/unittests/periphery-lld/src/ut_alld_VCNL4020_v1.c
deleted file mode 100644
index 07fac88..0000000
--- a/unittests/periphery-lld/src/ut_alld_VCNL4020_v1.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_VCNL4020_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-#define INTERRUPT_EVENT_ID            1
-
-#define INTERRUPT_THRESHOLD           0x2000
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldVcnl4020Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck((ut->data != NULL) &&
-              (((ut_vcnl4020data_t*)(ut->data))->vcnld != NULL) &&
-              (((ut_vcnl4020data_t*)(ut->data))->evtsource != NULL));
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint8_t reg_buf[4];
-  uint8_t* reg_8 = (uint8_t*)(reg_buf);
-  uint16_t* reg_16 = (uint16_t*)(reg_buf);
-  event_listener_t event_listener;
-  aos_timestamp_t tcurrent, tend;
-
-  chprintf(stream, "reading register...\n");
-  status = vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_IDREV, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if ((status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) && reg_8[0] == 0x21u) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; 0x%08X\n", status, reg_8[0]);
-  }
-
-  chprintf(stream, "writing register...\n");
-  status = vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, VCNL4020_LLD_PROXRATEREG_250_HZ, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_PROXRATE, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= (reg_8[0] == VCNL4020_LLD_PROXRATEREG_250_HZ) ? 0x0000 : 0x0100;
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED), ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_CMD, &reg_8[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= (reg_8[0] & (VCNL4020_LLD_CMDREG_ALSEN | VCNL4020_LLD_CMDREG_PROXEN | VCNL4020_LLD_CMDREG_SELFTIMED)) ? 0x0000 : 0x0200;
-  if (status == APAL_STATUS_OK || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%02X\n", status, reg_8[0]);
-  }
-
-  chprintf(stream, "reading ambient light for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 10; ++i) {
-    aosThdSSleep(1);
-    status |= vcnl4020_lld_readals(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    chprintf(stream, "\t\tambient light: 0x%04X\n", reg_16[0]);
-  }
-  status |= (reg_16[0] == 0x0000) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading proximity for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 10; ++i) {
-    aosThdSSleep(1);
-    status |= vcnl4020_lld_readprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    chprintf(stream, "\t\tproximity: 0x%04X\n", reg_16[1]);
-  }
-  status |= (reg_16[1] == 0x0000) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading ambient light and proximity for ten seconds...\n");
-  status = APAL_STATUS_OK;
-  for (uint8_t i = 0; i < 10; ++i) {
-    aosThdSSleep(1);
-    status |= vcnl4020_lld_readalsandprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    chprintf(stream, "\t\tambient light: 0x%04X\tproximity: 0x%04X\n", reg_16[0], reg_16[1]);
-  }
-  status |= (reg_16[0] == 0x0000 || reg_16[1] == 0x0000) ? 0x10 : 0x00;
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading low threshold register...\n");
-  status = vcnl4020_lld_readlth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading high threshold register...\n");
-  status = vcnl4020_lld_readhth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "0x%04X\n", reg_16[1]);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "reading both threshold registers...\n");
-  status = vcnl4020_lld_readth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK) {
-    aosUtPassedMsg(stream, &result, "low: 0x%04X; high: 0x%04X\n", reg_16[0], reg_16[1]);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "writing low threshold register...\n");
-  status = vcnl4020_lld_writelth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0xFFFFu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readlth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK && reg_16[0] == 0xFFFFu) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[0]);
-  }
-
-  chprintf(stream, "writing high threshold register...\n");
-  status = vcnl4020_lld_writehth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0xFFFFu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readhth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK && reg_16[1] == 0xFFFFu) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X\n", status, reg_16[1]);
-  }
-
-  chprintf(stream, "writing both threshold registers...\n");
-  status = vcnl4020_lld_writeth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0x5555u, 0xAAAAu, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readth(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], &reg_16[1], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_OK && reg_16[0] == 0x5555u && reg_16[1] == 0xAAAAu) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, 0x%04X, 0x%04X\n", status, reg_16[0], reg_16[1]);
-  }
-
-  chprintf(stream, "test interrupts...\n");
-  chprintf(stream, "(thresholds are 0x%04X and 0x%04X)\n", 0, INTERRUPT_THRESHOLD);
-  chEvtRegister(((ut_vcnl4020data_t*)(ut->data))->evtsource, &event_listener, INTERRUPT_EVENT_ID);
-  aosSysGetUptime(&tend);
-  tend += 30 * MICROSECONDS_PER_SECOND;
-  status = vcnl4020_lld_writeth(((ut_vcnl4020data_t*)(ut->data))->vcnld, 0x0000, INTERRUPT_THRESHOLD, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, VCNL4020_LLD_INTCTRLREG_THRES_EN, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  do {
-    // read proximity data, interrupt event information and interrupt status
-    const eventmask_t emask = chEvtWaitOneTimeout(EVENT_MASK(INTERRUPT_EVENT_ID), chTimeUS2I(10*MICROSECONDS_PER_MILLISECOND));
-    const eventflags_t eflags = chEvtGetAndClearFlags(&event_listener);
-    status |= vcnl4020_lld_readprox(((ut_vcnl4020data_t*)(ut->data))->vcnld, &reg_16[0], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
-        eflags == ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-        reg_8[2] == VCNL4020_LLD_INTSTATUSREG_THHIGH) {
-      // true positive (correct case)
-      chprintf(stream, "\t\tinterrupt detected: prox = 0x%04X\n", reg_16[0]);
-      aosThdMSleep(100);
-    }
-    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
-             eflags != ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-             reg_8[2] != VCNL4020_LLD_INTSTATUSREG_THHIGH) {
-      // true negative (correct case)
-      // do nothing, just keep on looping
-    }
-    else if (emask == EVENT_MASK(INTERRUPT_EVENT_ID) &&
-             eflags == ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-             reg_8[2] != 0 ) {
-      // false positive
-      status |= 0x1000;
-      chprintf(stream, "\t\tfalse positive: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
-    }
-    else if (emask != EVENT_MASK(INTERRUPT_EVENT_ID) &&
-             eflags != ((ut_vcnl4020data_t*)(ut->data))->evtflags &&
-             reg_8[2] == 0) {
-      // false negative
-      status |= 0x2000;
-      chprintf(stream, "\t\tfalse negative: intstatus = 0x%02X; prox = 0x%04X\n", reg_8[2], reg_16[0]);
-    } // any other events are just ignored
-    // reset interrupt status
-    if (reg_8[2] != 0) {
-      status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-    }
-    aosSysGetUptime(&tcurrent);
-  } while (tcurrent < tend);
-  chEvtUnregister(((ut_vcnl4020data_t*)(ut->data))->evtsource, &event_listener);
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTCTRL, 0, ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_readreg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, &reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  status |= vcnl4020_lld_writereg(((ut_vcnl4020data_t*)(ut->data))->vcnld, VCNL4020_LLD_REGADDR_INTSTATUS, reg_8[2], ((ut_vcnl4020data_t*)(ut->data))->timeout);
-  if (status == APAL_STATUS_SUCCESS || status == APAL_STATUS_WARNING) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream, "driver object memory footprint: %u bytes\n", sizeof(VCNL4020Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_VCNL4020) && (AMIROLLD_CFG_VCNL4020 == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_bq241xx_v1.c b/unittests/periphery-lld/src/ut_alld_bq241xx_v1.c
deleted file mode 100644
index 200b2c4..0000000
--- a/unittests/periphery-lld/src/ut_alld_bq241xx_v1.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_bq241xx_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-
-aos_utresult_t utAlldBq241xxFunc(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  bq241xx_lld_enable_t en[3];
-  bq241xx_lld_charge_state_t charge;
-
-  chprintf(stream, "read enable pin...\n");
-  status = bq241xx_lld_get_enabled((BQ241xxDriver*)ut->data, &en[0]);
-  chprintf(stream, "\t\tcurrently %s\n", (en[0] == BQ241xx_LLD_ENABLED) ? "enabled" : "disabled");
-  if(status == APAL_STATUS_SUCCESS){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "write enable pin...\n");
-  status = bq241xx_lld_set_enabled((BQ241xxDriver*)ut->data, (en[0] == BQ241xx_LLD_ENABLED) ? BQ241xx_LLD_DISABLED : BQ241xx_LLD_ENABLED);
-  aosThdMSleep(1);
-  status |= bq241xx_lld_get_enabled((BQ241xxDriver*)ut->data, &en[1]);
-  status |= bq241xx_lld_set_enabled((BQ241xxDriver*)ut->data, en[0]);
-  aosThdMSleep(1);
-  status |= bq241xx_lld_get_enabled((BQ241xxDriver*)ut->data, &en[2]);
-  if(status == APAL_STATUS_SUCCESS && en[0] != en[1] && en[0] == en[2] && en[1] != en[2]){
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, %u-%u\n", status, en[1], en[2]);
-  }
-
-  chprintf(stream, "read status pin...\n");
-  aosThdMSleep(500);
-  status = bq241xx_lld_get_charge_status((BQ241xxDriver*)ut->data, &charge);
-  chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ241xxDriver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1) */
diff --git a/unittests/periphery-lld/src/ut_alld_bq27500_v1.c b/unittests/periphery-lld/src/ut_alld_bq27500_v1.c
deleted file mode 100644
index 530f9b1..0000000
--- a/unittests/periphery-lld/src/ut_alld_bq27500_v1.c
+++ /dev/null
@@ -1,557 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_bq27500_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1)) || defined(__DOXYGEN__)
-
-#include <string.h>
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-// change saved unseal keys to test bruteforcing
-#if defined(BQ27500_UT_TEST_BRUTEFORCE)
-
-#if defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY0)
-#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY0
-#define BQ27500_LLD_DEFAULT_UNSEAL_KEY0 0x1234
-#endif /* defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY0) */
-
-#if defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY1)
-#undef BQ27500_LLD_DEFAULT_UNSEAL_KEY1
-#define BQ27500_LLD_DEFAULT_UNSEAL_KEY1 0x5678
-#endif /* defined(BQ27500_LLD_DEFAULT_UNSEAL_KEY1) */
-
-#endif /* defined(BQ27500_UT_TEST_BRUTEFORCE) */
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-bq27500_lld_control_status_t _try_unseal(BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
-  uint16_t dst;
-  bq27500_lld_control_status_t ctrl;
-  bq27500_lld_send_ctnl_data(driver, key1, timeout);
-  aosThdUSleep(1);
-  bq27500_lld_send_ctnl_data(driver, key0, timeout);
-  aosThdUSleep(1);
-  bq27500_lld_sub_command_call(driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, timeout);
-  aosThdUSleep(1);
-  bq27500_lld_std_command(driver, BQ27500_LLD_STD_CMD_Control, &dst, timeout);
-  bq27500_lld_sub_command_read(driver, &ctrl.value, timeout);
-  return ctrl;
-}
-
-uint8_t _bruteforce_sealed_key_bitflips(BaseSequentialStream* stream, BQ27500Driver* driver, uint16_t key0, uint16_t key1, apalTime_t timeout) {
-  bq27500_lld_control_status_t ctrl;
-  uint16_t k0;
-  uint16_t k1 = key1;
-  for (uint8_t i = 0; i < 16; i++) {
-    k0 = key0 ^ (1 << i); // flip bit i
-    ctrl = _try_unseal(driver, k0, k1, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-      return 1;
-    }
-  }
-  k0 = key0;
-  for (uint8_t i = 0; i < 16; i++) {
-    k1 = key1 ^ (1 << i); // flip bit i
-    ctrl = _try_unseal(driver, k0, k1, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-      return 1;
-    }
-  }
-  return 0;
-}
-
-void _bruteforce_sealed_key(BaseSequentialStream* stream, BQ27500Driver* driver, apalTime_t timeout) {
-  chprintf(stream, "start bruteforcing sealed keys...\n");
-  bq27500_lld_control_status_t ctrl;
-  uint16_t key0_reversed = 0x7236;
-  uint16_t key1_reversed = 0x1404;
-  uint16_t key0 = BQ27500_LLD_DEFAULT_UNSEAL_KEY0;
-  uint16_t key1 = BQ27500_LLD_DEFAULT_UNSEAL_KEY1;
-  uint16_t k0 = key0;
-  uint16_t k1 = key1;
-
-  // testing default keys in different orders
-  chprintf(stream, "\ttry reversed byte order and different key order...\n");
-  // default unseal keys
-  ctrl = _try_unseal(driver, k0, k1, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  // default unseal keys in reversed order
-  ctrl = _try_unseal(driver, k1, k0, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  // byte reversed keys
-  k0 = key0_reversed;
-  k1 = key1_reversed;
-  ctrl = _try_unseal(driver, k0, k1, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  // byte reversed keys in reversed order
-  ctrl = _try_unseal(driver, k1, k0, timeout);
-  if (ctrl.content.ss == 0x0) {
-    chprintf(stream, "\t\tSUCCESS!\n");
-    chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", k0, k1);
-    return;
-  }
-  chprintf(stream, "\t\tfailed\n");
-
-
-  // testing single bit flips of the default keys in different orders
-  chprintf(stream, "\ttry single bit flips of default keys...\n");
-  // default unseal keys
-  uint8_t result = 0;
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key0, key1, timeout);
-  if (result == 1) {
-    return;
-  }
-  // default unseal keys in reversed order
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key1, key0, timeout);
-  if (result == 1) {
-    return;
-  }
-  // byte reversed keys
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key0_reversed, key1_reversed, timeout);
-  if (result == 1) {
-    return;
-  }
-  // byte reversed keys in reversed order
-  result = _bruteforce_sealed_key_bitflips(stream, driver, key1_reversed, key0_reversed, timeout);
-  if (result == 1) {
-    return;
-  }
-  chprintf(stream, "\t\tfailed\n");
-
-
-  // bruteforcing one of the keys, assuming only one of them was changed
-  chprintf(stream, "\ttry bruteforcing a single key...\n");
-  // default unseal key0
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key0, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 1/8\n");
-  // reversed unseal key0
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key0_reversed, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key0_reversed, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 2/8\n");
-  // default unseal key0 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key0, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 3/8\n");
-  // reversed unseal key0 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key0_reversed, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key0_reversed);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 4/8\n");
-  // default unseal key1
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key1, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 5/8\n");
-  // reversed unseal key1
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, i, key1_reversed, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, key1_reversed);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 6/8\n");
-  // default unseal key1 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key1, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 7/8\n");
-  // reversed unseal key1 in reversed order
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    ctrl = _try_unseal(driver, key1_reversed, i, timeout);
-    if (ctrl.content.ss == 0x0) {
-      chprintf(stream, "\t\tSUCCESS!\n");
-      chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", key1_reversed, i);
-      return;
-    }
-  }
-  chprintf(stream, "\t\tkey failed. 8/8\n");
-  chprintf(stream, "\t\tfailed\n");
-
-
-  // full bruteforce
-  chprintf(stream, "\tbruteforcing both keys...\t");
-  for (uint32_t i = 0; i <= 0xFFFF; i++) {
-    chprintf(stream, "\t\ti: %u\n", i);
-    for (uint32_t j = 0; j <= 0xFFFF; j++) {
-      ctrl = _try_unseal(driver, i, j, timeout);
-      if (ctrl.content.ss == 0x0) {
-        chprintf(stream, "\t\tSUCCESS!\n");
-        chprintf(stream, "\t\tkey0: 0x%X, key1: 0x%X\n", i, j);
-        return;
-      }
-    }
-  }
-
-  chprintf(stream, "\t\tfailed, no keys could be found");
-}
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-aos_utresult_t utAlldBq27500Func(BaseSequentialStream* stream, aos_unittest_t* ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_bq27500data_t*)(ut->data))->driver != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  bq27500_lld_batlow_t bl;
-  bq27500_lld_batgood_t bg;
-  uint16_t dst;
-  bq27500_lld_flags_t flags;
-  uint16_t subdata = 0;
-  uint8_t original_length;
-  char original_name[8+1];
-  uint8_t val = 0x00;
-  uint8_t block[32];
-  char new_name[] = "test";
-  uint8_t new_lenght;
-  char name[8+1] = {'\0'};
-  uint8_t sum = 0;
-  bool success;
-  bool success2;
-
-  chprintf(stream, "read battery low gpio...\n");
-  status = bq27500_lld_read_batlow(((ut_bq27500data_t*)ut->data)->driver, &bl);
-  chprintf(stream, "\t\tbattery low: 0x%X\n", bl);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "read battery good gpio...\n");
-  status = bq27500_lld_read_batgood(((ut_bq27500data_t*)ut->data)->driver, &bg);
-  chprintf(stream, "\t\tbattery good: 0x%X\n", bg);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "std command FLAGS...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Flags, &flags.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tflags: 0x%04X\n", flags.value);
-  chprintf(stream, "\t\tbattery detected: 0x%X\n", flags.content.bat_det);
-  chprintf(stream, "\t\tbattery fully charged: 0x%X\n", flags.content.fc);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "std command CTNL...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "sub command: CTRL Status...\n");
-  aosThdUSleep(1);
-  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdUSleep(1);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdUSleep(1);
-  bq27500_lld_control_status_t ctrl;
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdst: 0x%X\n", ctrl.value);
-  chprintf(stream, "\t\tsleep: 0x%X\n", ctrl.content.sleep);
-  chprintf(stream, "\t\thibernate: 0x%X\n", ctrl.content.hibernate);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "sub command: firmware version...\n");
-  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_FW_VERSION, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  bq27500_lld_version_t version;
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &version.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tfirmware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "sub command: hardware version...\n");
-  status = bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_HW_VERSION, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &version.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\thardware version: %X%X-%X%X\n", version.content.major_high, version.content.major_low, version.content.minor_high, version.content.minor_low);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "ext command: device name length...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tdevice name length: %d\n", original_length);
-  if (status == APAL_STATUS_SUCCESS && original_length <= 8) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    original_length = 8;
-  }
-
-  chprintf(stream, "ext command: device name (read)...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)original_name, original_length, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  original_name[original_length] = '\0';
-  chprintf(stream, "\t\tdevice name: %s\n", original_name);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "battery info std commands...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Temperature, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\ttemperature: %fK (%fC)\n", (float)dst/10.0f, (float)dst/10.0f-273.5f);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_FullAvailableCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tfull available capacity: %umAh\n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_FullChargeCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tfull charge capacity: %umAh\n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_RemainingCapacity, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tremaining capacity: %umAh\n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Voltage, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tvoltage: %umV\n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_AverageCurrent, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\taverage current: %dmA\n", (int8_t)dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_AveragePower, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\taverage power: %dmW\n", (int8_t)dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_StateOfCharge, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tstate of charge: %u%%\n", dst);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (dst != (uint16_t)~0) {
-    chprintf(stream, "\t\ttime to full: %umin\n", dst);
-  } else {
-    chprintf(stream, "\t\ttime to full: (not charging)\n", dst);
-  }
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_TimeToEmpty, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (dst != (uint16_t)~0) {
-    chprintf(stream, "\t\ttime to empty: %umin\n", dst);
-  } else {
-    chprintf(stream, "\t\ttime to empty: (not discharging)\n", dst);
-  }
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "check sealed state...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  chprintf(stream, "\t\tsealed: 0x%X\n", ctrl.content.ss);
-  chprintf(stream, "\t\tfull access sealed: 0x%X\n", ctrl.content.fas);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "unseale...\n");
-  status = bq27500_lld_send_ctnl_data(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY1, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_send_ctnl_data(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_DEFAULT_UNSEAL_KEY0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x0) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-    _bruteforce_sealed_key(stream, ((ut_bq27500data_t*)ut->data)->driver, ((ut_bq27500data_t*)ut->data)->timeout);
-  }
-
-  chprintf(stream, "read device name from data flash...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0x30;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, original_length, 13, ((ut_bq27500data_t*)ut->data)->timeout);
-  block[original_length] = '\0';
-  chprintf(stream, "\t\tdevice name: %s\n", block);
-  if (status == APAL_STATUS_SUCCESS && (strcmp((char*)block, (char*)original_name) == 0)) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\t\tread data: ");
-    for (uint8_t blockIdx = 0; blockIdx < original_length; blockIdx++) {
-      chprintf(stream, "0x%02X\n", block[blockIdx]);
-    }
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  chprintf(stream, "change device name in data flash to \"test\"...\n");
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)new_name, 5, 13, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  // compute blockdata checksum
-  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
-  // write checksum to BlockDataChecksum, triggering the write of BlackData
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &new_lenght, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  // read out device name, to see if changing it was successfull
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, new_lenght, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  name[new_lenght] = '\0';
-  chprintf(stream, "\t\tdevice name: %s\n", name);
-  success = (strcmp(name, new_name) == 0);
-
-  // change device name back to original name
-  val = 0x00;
-  status = bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataControl, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0x30;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashClass, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  val = 0;
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DataFlashBlock, BQ27500_LLD_EXT_CMD_WRITE, &val, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_WRITE, (uint8_t*)original_name, 7, 13, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockData, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)block, 32, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  // compute blockdata checksum
-  sum = 0;
-  status |= bq27500_lld_compute_blockdata_checksum(block, &sum);
-  // write checksum to BlockDataChecksum, triggering the write of BlackData
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_BlockDataCheckSum, BQ27500_LLD_EXT_CMD_WRITE, &sum, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(1000);
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceNameLength, BQ27500_LLD_EXT_CMD_READ, &original_length, 1, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  // read device name, to see if changing it back to the original name was successfull
-  status |= bq27500_lld_ext_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_EXT_CMD_DeviceName, BQ27500_LLD_EXT_CMD_READ, (uint8_t*)name, original_length, 0, ((ut_bq27500data_t*)ut->data)->timeout);
-  success2 = (strcmp(name, original_name) == 0);
-  name[original_length] = '\0';
-  chprintf(stream, "\t\tchanged back to name: %s, original_name: %s\n", name, original_name);
-  if (status == APAL_STATUS_OK && ((success && success2) || (ctrl.content.sleep == 0))) {
-    aosUtPassed(stream, &result);
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X, changing: 0x%X - changing back: 0x%X\n", status, success, success2);
-  }
-
-  chprintf(stream, "seal...\n");
-  status = bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_SEALED, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_std_command(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_STD_CMD_Control, &dst, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_sub_command_call(((ut_bq27500data_t*)ut->data)->driver, BQ27500_LLD_SUB_CMD_CONTROL_STATUS, ((ut_bq27500data_t*)ut->data)->timeout);
-  aosThdMSleep(50);
-  status |= bq27500_lld_sub_command_read(((ut_bq27500data_t*)ut->data)->driver, &ctrl.value, ((ut_bq27500data_t*)ut->data)->timeout);
-  if (status == APAL_STATUS_SUCCESS && ctrl.content.ss == 0x1) {
-    aosUtPassed(stream, &result);
-  } else {
-    chprintf(stream, "\tfailed (0x%X)\n", status);
-    aosUtFailedMsg(stream, &result, "0x%08X, ctrl 0x%X\n", status, subdata);
-    ++result.failed;
-  }
-
-  aosUtInfoMsg(stream,"driver object memory footprint: %u bytes\n", sizeof(BQ27500Driver));
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) */
-
diff --git a/unittests/periphery-lld/src/ut_alld_bq27500_v1_bq241xx_v1.c b/unittests/periphery-lld/src/ut_alld_bq27500_v1_bq241xx_v1.c
deleted file mode 100644
index dfc1172..0000000
--- a/unittests/periphery-lld/src/ut_alld_bq27500_v1_bq241xx_v1.c
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
-AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2016..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/>.
-*/
-
-#include <amiroos.h>
-#include <ut_alld_bq27500_v1_bq241xx_v1.h>
-
-#if ((AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1)) || defined(__DOXYGEN__)
-
-/******************************************************************************/
-/* LOCAL DEFINITIONS                                                          */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED VARIABLES                                                         */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL TYPES                                                                */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL VARIABLES                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* LOCAL FUNCTIONS                                                            */
-/******************************************************************************/
-
-/******************************************************************************/
-/* EXPORTED FUNCTIONS                                                         */
-/******************************************************************************/
-
-
-aos_utresult_t utAlldBq27500Bq241xxFunc(BaseSequentialStream *stream, aos_unittest_t *ut)
-{
-  aosDbgCheck(ut->data != NULL && ((ut_bq27500bq241xxdata_t*)ut->data)->bq27500 != NULL && ((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx != NULL);
-
-  // local variables
-  aos_utresult_t result = {0, 0};
-  uint32_t status;
-  uint16_t dst;
-  bq27500_lld_flags_t flags;
-  bq27500_lld_batgood_t bg;
-  bq241xx_lld_enable_t charger_enabled;
-  uint32_t sleeptime_s;
-  bq241xx_lld_charge_state_t charge;
-
-  chprintf(stream, "check for battery...\n");
-  status = bq27500_lld_std_command(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_Flags, &dst, ((ut_bq27500bq241xxdata_t*)ut->data)->timeout);
-  flags.value = dst;
-  chprintf(stream, "\t\tbattery detected: %s\n", flags.content.bat_det ? "yes" : "no");
-  chprintf(stream, "\t\tbattery fully charged: %s\n", flags.content.fc ? "yes" : "no");
-  status |= bq27500_lld_read_batgood(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, &bg);
-  chprintf(stream, "\t\tbattery good: %s\n", (bg == BQ27500_LLD_BATTERY_GOOD) ? "yes" : "no");
-  if (status == APAL_STATUS_SUCCESS) {
-    if (!flags.content.bat_det) {
-      aosUtPassedMsg(stream, &result, "no battery detected, aborting\n");
-      return result;
-    } else if (!bg) {
-      aosUtPassedMsg(stream, &result, "battery damaged, aborting\n");
-      return result;
-    } else {
-      aosUtPassed(stream, &result);
-    }
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X; aborting\n", status);
-    return result;
-  }
-
-  chprintf(stream, "get current charger setting...\n");
-  status = bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
-  if (status == APAL_STATUS_SUCCESS) {
-    aosUtPassedMsg(stream, &result, "currently %s\n", (charger_enabled == BQ241xx_LLD_ENABLED) ? "enabled" : "disabled");
-  } else {
-    aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-  }
-
-  // disable/enable charger
-  for (uint8_t iteration = 0; iteration < 2; ++iteration) {
-    if (charger_enabled == BQ241xx_LLD_ENABLED) {
-      sleeptime_s = 120;
-      chprintf(stream, "disable charger...\n");
-      status = bq241xx_lld_set_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, BQ241xx_LLD_DISABLED);
-      aosThdSSleep(1);
-      status |= bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
-      status |= (charger_enabled == BQ241xx_LLD_DISABLED) ? 0x0000 : 0x0100;
-      for (uint32_t s = 0; s < sleeptime_s; ++s) {
-        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
-        aosThdSSleep(1);
-        for (int c = 0; c < nchars; ++c) {
-          chprintf(stream, "\b \b");
-        }
-      }
-      status |= bq241xx_lld_get_charge_status(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charge);
-      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
-      status |= bq27500_lld_std_command(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500bq241xxdata_t*)ut->data)->timeout);
-      if (status == APAL_STATUS_SUCCESS) {
-        if (dst == 0xFFFF || dst == 0) {
-          aosUtPassedMsg(stream, &result, "battery %sfull\n", flags.content.fc ? "" : "not ");
-        } else {
-          aosUtFailedMsg(stream, &result, "battery %sfull but charging (TTF = %umin)\n", flags.content.fc ? "" : "not ", dst);
-        }
-      } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-      }
-    }
-    else { /* charger_enabled != BQ241xx_LLD_ENABLED */
-      sleeptime_s = 90;
-      chprintf(stream, "enable charger...\n");
-      status = bq241xx_lld_set_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, BQ241xx_LLD_ENABLED);
-      aosThdSSleep(1);
-      status |= bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
-      status |= (charger_enabled == BQ241xx_LLD_ENABLED) ? 0x0000 : 0x0100;
-      for (uint32_t s = 0; s < sleeptime_s; ++s) {
-        int nchars = chprintf(stream, "%us / %us", s, sleeptime_s);
-        aosThdSSleep(1);
-        for (int c = 0; c < nchars; ++c) {
-          chprintf(stream, "\b \b");
-        }
-      }
-      status |= bq241xx_lld_get_charge_status(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charge);
-      chprintf(stream, "\t\tcharge status: %scharging\n", (charge == BQ241xx_LLD_CHARGING) ? "" : "not ");
-      status |= bq27500_lld_std_command(((ut_bq27500bq241xxdata_t*)ut->data)->bq27500, BQ27500_LLD_STD_CMD_TimeToFull, &dst, ((ut_bq27500bq241xxdata_t*)ut->data)->timeout);
-      if (status == APAL_STATUS_SUCCESS) {
-        if (((dst == 0xFFFF || dst == 0) && flags.content.fc) || (!(dst == 0xFFFF || dst == 0) && !flags.content.fc)) {
-          aosUtPassedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
-        } else {
-          aosUtFailedMsg(stream, &result, "battery %sfull and %scharging (TTF = %umin)\n", flags.content.fc ? "" : "not ", (dst != 0xFFFF || dst != 0) ? "" : "not ", dst);
-        }
-      } else {
-        aosUtFailedMsg(stream, &result, "0x%08X\n", status);
-      }
-    }
-
-    bq241xx_lld_get_enabled(((ut_bq27500bq241xxdata_t*)ut->data)->bq241xx, &charger_enabled);
-  }
-
-  return result;
-}
-
-#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) && defined(AMIROLLD_CFG_BQ27500) && (AMIROLLD_CFG_BQ27500 == 1) && defined(AMIROLLD_CFG_BQ241xx) && (AMIROLLD_CFG_BQ241xx == 1) */
diff --git a/unittests/unittests.mk b/unittests/unittests.mk
deleted file mode 100644
index 10fe749..0000000
--- a/unittests/unittests.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-################################################################################
-# AMiRo-OS is an operating system designed for the Autonomous Mini Robot       #
-# (AMiRo) platform.                                                            #
-# Copyright (C) 2016..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).                              #
-################################################################################
-
-
-
-# absolute path to this directory
-UNITTESTS_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
-
-# include path
-UNITTESTSINC = $(UNITTESTS_DIR)lld/inc \
-               $(UNITTESTS_DIR)periphery-lld/inc
-
-# C sources
-UNITTESTSCSRC = $(wildcard $(UNITTESTS_DIR)lld/src/*.c) \
-                $(wildcard $(UNITTESTS_DIR)periphery-lld/src/*.c)
-
