diff --git a/boards/chronos/include/periph_conf.h b/boards/chronos/include/periph_conf.h
index 4590bf63b6c5014af6677f5eb56533a3231888e8..3d94c15d1939296bbb33e17077861464e8f97115 100644
--- a/boards/chronos/include/periph_conf.h
+++ b/boards/chronos/include/periph_conf.h
@@ -39,7 +39,8 @@ extern "C" {
  * @brief   Timer configuration
  * @{
  */
-#define TIMER_DEV           (TIMER_A0)
+#define TIMER_NUMOF         (1U)
+#define TIMER_BASE          (TIMER_A0)
 #define TIMER_CHAN          (5)
 #define TIMER_ISR_CC0       (TIMER0_A0_VECTOR)
 #define TIMER_ISR_CCX       (TIMER0_A1_VECTOR)
diff --git a/boards/frdm-k64f/include/periph_conf.h b/boards/frdm-k64f/include/periph_conf.h
index ccdd824cfc8bd45dbdfb9f7c15efac710cbe6407..d57839f96c31ae662e3599ce286fa338cedcb610 100644
--- a/boards/frdm-k64f/include/periph_conf.h
+++ b/boards/frdm-k64f/include/periph_conf.h
@@ -56,7 +56,7 @@ extern "C"
 #define TIMER_0_EN                   1
 #define TIMER_1_EN                   0
 #define TIMER_IRQ_PRIO               1
-#define TIMER_DEV                    PIT
+#define TIMER_BASE                   PIT
 #define TIMER_MAX_VALUE              (0xffffffff)
 #define TIMER_CLOCK                  CLOCK_CORECLOCK
 #define TIMER_CLKEN()                (SIM->SCGC6 |= (SIM_SCGC6_PIT_MASK))
diff --git a/boards/msb-430/include/periph_conf.h b/boards/msb-430/include/periph_conf.h
index 695cbc40db9ba0718a926e39360c98354b5c5202..8a94496653c92ac5ae92151888257d970a53c43d 100644
--- a/boards/msb-430/include/periph_conf.h
+++ b/boards/msb-430/include/periph_conf.h
@@ -39,7 +39,8 @@ extern "C" {
  * @brief   Timer configuration
  * @{
  */
-#define TIMER_DEV           (TIMER_A)
+#define TIMER_NUMOF         (1U)
+#define TIMER_BASE          (TIMER_A)
 #define TIMER_CHAN          (3)
 #define TIMER_ISR_CC0       (TIMERA0_VECTOR)
 #define TIMER_ISR_CCX       (TIMERA1_VECTOR)
diff --git a/boards/msb-430h/include/periph_conf.h b/boards/msb-430h/include/periph_conf.h
index 7ea7c4d2d2f7c88ec4f8e9c38a0069de33d198d5..c323138611021693777dd3208d6bb76242db7eec 100644
--- a/boards/msb-430h/include/periph_conf.h
+++ b/boards/msb-430h/include/periph_conf.h
@@ -41,7 +41,8 @@ extern "C" {
  * @brief   Timer configuration
  * @{
  */
-#define TIMER_DEV           (TIMER_A)
+#define TIMER_NUMOF         (1U)
+#define TIMER_BASE          (TIMER_A)
 #define TIMER_CHAN          (3)
 #define TIMER_ISR_CC0       (TIMERA0_VECTOR)
 #define TIMER_ISR_CCX       (TIMERA1_VECTOR)
diff --git a/boards/mulle/include/periph_conf.h b/boards/mulle/include/periph_conf.h
index 44ba2da6fb7ed696fa5f6f89c0099fd4b4a011bc..8d8a2dd5b9f7d3736c033f984d966bdea0d2c114 100644
--- a/boards/mulle/include/periph_conf.h
+++ b/boards/mulle/include/periph_conf.h
@@ -64,7 +64,7 @@ extern "C"
 #define TIMER_0_EN              1
 #define TIMER_1_EN              0
 #define TIMER_IRQ_PRIO          1
-#define TIMER_DEV               PIT
+#define TIMER_BASE              PIT
 #define TIMER_MAX_VALUE         (0xffffffff)
 #define TIMER_CLOCK             SystemBusClock
 #define TIMER_CLKEN()           (BITBAND_REG32(SIM->SCGC6, SIM_SCGC6_PIT_SHIFT) = 1)
diff --git a/boards/pba-d-01-kw2x/include/periph_conf.h b/boards/pba-d-01-kw2x/include/periph_conf.h
index 18d2123abe602564a23d81aafebeecc37a89b918..221e915203d95e687580410eb8fbd7d283d9fac3 100644
--- a/boards/pba-d-01-kw2x/include/periph_conf.h
+++ b/boards/pba-d-01-kw2x/include/periph_conf.h
@@ -58,7 +58,7 @@ extern "C"
 #define TIMER_0_EN                        1
 #define TIMER_1_EN                        0
 #define TIMER_IRQ_PRIO                    1
-#define TIMER_DEV                         PIT
+#define TIMER_BASE                        PIT
 #define TIMER_MAX_VALUE                   (0xffffffff)
 #define TIMER_CLOCK                       CLOCK_CORECLOCK
 #define TIMER_CLKEN()                     (SIM->SCGC6 |= (SIM_SCGC6_PIT_MASK))
diff --git a/boards/telosb/include/periph_conf.h b/boards/telosb/include/periph_conf.h
index c1ad58a053eb1345c01260019b29afd17370fb8d..383daef3ca4792586079cd29eed943844587ec16 100644
--- a/boards/telosb/include/periph_conf.h
+++ b/boards/telosb/include/periph_conf.h
@@ -39,7 +39,8 @@ extern "C" {
  * @brief   Timer configuration
  * @{
  */
-#define TIMER_DEV           (TIMER_A)
+#define TIMER_NUMOF         (1U)
+#define TIMER_BASE          (TIMER_A)
 #define TIMER_CHAN          (3)
 #define TIMER_ISR_CC0       (TIMERA0_VECTOR)
 #define TIMER_ISR_CCX       (TIMERA1_VECTOR)
diff --git a/boards/wsn430-common/include/periph_conf.h b/boards/wsn430-common/include/periph_conf.h
index 0ab7a6a720d9b57529c0951aa1efa0f46d9b879b..c08015f6861fc41e344079b2f2c6d4c6ce358789 100644
--- a/boards/wsn430-common/include/periph_conf.h
+++ b/boards/wsn430-common/include/periph_conf.h
@@ -39,7 +39,8 @@ extern "C" {
  * @brief   Timer configuration
  * @{
  */
-#define TIMER_DEV           (TIMER_A)
+#define TIMER_NUMOF         (1U)
+#define TIMER_BASE          (TIMER_A)
 #define TIMER_CHAN          (3)
 #define TIMER_ISR_CC0       (TIMERA0_VECTOR)
 #define TIMER_ISR_CCX       (TIMERA1_VECTOR)
diff --git a/boards/z1/include/periph_conf.h b/boards/z1/include/periph_conf.h
index 1ef7ee6f1a5ff02968f00c0aeaf1d8284df45de5..4b9c85c4dfca78e57ed6fda367d290c92e8410b9 100644
--- a/boards/z1/include/periph_conf.h
+++ b/boards/z1/include/periph_conf.h
@@ -39,7 +39,8 @@ extern "C" {
  * @brief   Timer configuration
  * @{
  */
-#define TIMER_DEV           (TIMER_A)
+#define TIMER_NUMOF         (1U)
+#define TIMER_BASE          (TIMER_A)
 #define TIMER_CHAN          (3)
 #define TIMER_ISR_CC0       (TIMERA0_VECTOR)
 #define TIMER_ISR_CCX       (TIMERA1_VECTOR)
diff --git a/cpu/cc430/periph/timer.c b/cpu/cc430/periph/timer.c
index 68d88912751893a20cf830d2022b85c6c97a1d5f..57d6c3011e8b631cf39ffe15841c77c9da2fb453 100644
--- a/cpu/cc430/periph/timer.c
+++ b/cpu/cc430/periph/timer.c
@@ -37,7 +37,7 @@ static void (*isr_cb)(int chan);
 
 int timer_init(tim_t dev, unsigned int us_per_tick, void (*callback)(int))
 {
-    /* using fixed TIMER_DEV for now */
+    /* using fixed TIMER_BASE for now */
     if (dev != 0) {
         return -1;
     }
@@ -47,23 +47,23 @@ int timer_init(tim_t dev, unsigned int us_per_tick, void (*callback)(int))
     }
 
     /* reset the timer A configuration */
-    TIMER_DEV->CTL = CTL_CLR;
+    TIMER_BASE->CTL = CTL_CLR;
     /* save callback */
     isr_cb = callback;
     /* configure timer to use the SMCLK with prescaler of 8 */
-    TIMER_DEV->CTL = (CTL_TASSEL_SMCLK | CTL_ID_DIV8);
+    TIMER_BASE->CTL = (CTL_TASSEL_SMCLK | CTL_ID_DIV8);
     /* configure CC channels */
     for (int i = 0; i < TIMER_CHAN; i++) {
-        TIMER_DEV->CCTL[i] = 0;
+        TIMER_BASE->CCTL[i] = 0;
     }
     /* start the timer in continuous mode */
-    TIMER_DEV->CTL |= CTL_MC_CONT;
+    TIMER_BASE->CTL |= CTL_MC_CONT;
     return 0;
 }
 
 int timer_set(tim_t dev, int channel, unsigned int timeout)
 {
-    uint16_t target = TIMER_DEV->R + (uint16_t)timeout;
+    uint16_t target = TIMER_BASE->R + (uint16_t)timeout;
     return timer_set_absolute(dev, channel, (unsigned int)target);
 }
 
@@ -72,9 +72,9 @@ int timer_set_absolute(tim_t dev, int channel, unsigned int value)
     if (dev != 0 || channel > TIMER_CHAN) {
         return -1;
     }
-    TIMER_DEV->CCR[channel] = value;
-    TIMER_DEV->CCTL[channel] &= ~(CCTL_CCIFG);
-    TIMER_DEV->CCTL[channel] |=  (CCTL_CCIE);
+    TIMER_BASE->CCR[channel] = value;
+    TIMER_BASE->CCTL[channel] &= ~(CCTL_CCIFG);
+    TIMER_BASE->CCTL[channel] |=  (CCTL_CCIE);
     return 0;
 }
 
@@ -83,23 +83,23 @@ int timer_clear(tim_t dev, int channel)
     if (dev != 0 || channel > TIMER_CHAN) {
         return -1;
     }
-    TIMER_DEV->CCTL[channel] &= ~(CCTL_CCIE);
+    TIMER_BASE->CCTL[channel] &= ~(CCTL_CCIE);
     return 0;
 }
 
 unsigned int timer_read(tim_t dev)
 {
-    return (unsigned int)TIMER_DEV->R;
+    return (unsigned int)TIMER_BASE->R;
 }
 
 void timer_start(tim_t dev)
 {
-    TIMER_DEV->CTL |= CTL_MC_CONT;
+    TIMER_BASE->CTL |= CTL_MC_CONT;
 }
 
 void timer_stop(tim_t dev)
 {
-    TIMER_DEV->CTL &= ~(CTL_MC_MASK);
+    TIMER_BASE->CTL &= ~(CTL_MC_MASK);
 }
 
 void timer_irq_enable(tim_t dev)
@@ -121,14 +121,14 @@ void timer_irq_disable(tim_t dev)
 
 void timer_reset(tim_t dev)
 {
-    TIMER_DEV->R = 0;
+    TIMER_BASE->R = 0;
 }
 
 ISR(TIMER_ISR_CC0, isr_timer_a_cc0)
 {
     __enter_isr();
 
-    TIMER_DEV->CCTL[0] &= ~(CCTL_CCIE);
+    TIMER_BASE->CCTL[0] &= ~(CCTL_CCIE);
     isr_cb(0);
 
     __exit_isr();
@@ -138,8 +138,8 @@ ISR(TIMER_ISR_CCX, isr_timer_a_ccx_isr)
 {
     __enter_isr();
 
-    int chan = (int)(TIMER_DEV->IV >> 1);
-    TIMER_DEV->CCTL[chan] &= ~(CCTL_CCIE);
+    int chan = (int)(TIMER_BASE->IV >> 1);
+    TIMER_BASE->CCTL[chan] &= ~(CCTL_CCIE);
     isr_cb(chan);
 
     __exit_isr();
diff --git a/cpu/kinetis_common/doc.txt b/cpu/kinetis_common/doc.txt
index e05b2ebbe3235f10b77d2cd0d1dadfd8c6c91630..dc5d13756d6f1c5d308cd0ee7fb0fa431d104d97 100644
--- a/cpu/kinetis_common/doc.txt
+++ b/cpu/kinetis_common/doc.txt
@@ -288,7 +288,7 @@
  *                  #define TIMER_0_EN              1
  *                  #define TIMER_1_EN              0
  *                  #define TIMER_IRQ_PRIO          1
- *                  #define TIMER_DEV               PIT
+ *                  #define TIMER_BASE              PIT
  *                  #define TIMER_MAX_VALUE         (0xffffffff)
  *                  #define TIMER_CLOCK             CLOCK_CORECLOCK
  *                  #define TIMER_CLKEN()           (SIM->SCGC6 |= (SIM_SCGC6_PIT_MASK))
diff --git a/cpu/kinetis_common/timer.c b/cpu/kinetis_common/timer.c
index b5770722f0fbda934d93bf43fb50bf0fd066145d..62206ac6db49b41b5991ab08a91ceef6d119411c 100644
--- a/cpu/kinetis_common/timer.c
+++ b/cpu/kinetis_common/timer.c
@@ -53,45 +53,45 @@ static timer_conf_t config[TIMER_NUMOF];
 
 inline static void pit_timer_start(uint8_t ch)
 {
-    TIMER_DEV->CHANNEL[ch].TCTRL |= (PIT_TCTRL_TEN_MASK);
+    TIMER_BASE->CHANNEL[ch].TCTRL |= (PIT_TCTRL_TEN_MASK);
 }
 
 inline static void pit_timer_stop(uint8_t ch)
 {
-    TIMER_DEV->CHANNEL[ch].TCTRL &= ~(PIT_TCTRL_TEN_MASK);
+    TIMER_BASE->CHANNEL[ch].TCTRL &= ~(PIT_TCTRL_TEN_MASK);
 }
 
 /** use channel n-1 as prescaler */
 inline static void timer_set_prescaler(uint8_t ch, unsigned int ticks_per_us)
 {
-    TIMER_DEV->CHANNEL[ch].TCTRL = 0x0;
-    TIMER_DEV->CHANNEL[ch].LDVAL = (TIMER_CLOCK / 1e6) / ticks_per_us;
-    TIMER_DEV->CHANNEL[ch].TCTRL = (PIT_TCTRL_TEN_MASK);
+    TIMER_BASE->CHANNEL[ch].TCTRL = 0x0;
+    TIMER_BASE->CHANNEL[ch].LDVAL = (TIMER_CLOCK / 1e6) / ticks_per_us;
+    TIMER_BASE->CHANNEL[ch].TCTRL = (PIT_TCTRL_TEN_MASK);
 }
 
 inline static void timer_set_counter(uint8_t ch)
 {
-    TIMER_DEV->CHANNEL[ch].TCTRL = 0x0;
-    TIMER_DEV->CHANNEL[ch].LDVAL = TIMER_MAX_VALUE;
-    TIMER_DEV->CHANNEL[ch].TCTRL = (PIT_TCTRL_TIE_MASK | PIT_TCTRL_CHN_MASK);
+    TIMER_BASE->CHANNEL[ch].TCTRL = 0x0;
+    TIMER_BASE->CHANNEL[ch].LDVAL = TIMER_MAX_VALUE;
+    TIMER_BASE->CHANNEL[ch].TCTRL = (PIT_TCTRL_TIE_MASK | PIT_TCTRL_CHN_MASK);
 }
 
 inline static uint32_t pit_timer_read(tim_t dev, uint8_t ch)
 {
-    return cu_timer[dev].counter32b + (TIMER_DEV->CHANNEL[ch].LDVAL
-                                       - TIMER_DEV->CHANNEL[ch].CVAL);
+    return cu_timer[dev].counter32b + (TIMER_BASE->CHANNEL[ch].LDVAL
+                                       - TIMER_BASE->CHANNEL[ch].CVAL);
 }
 
 inline static void pit_timer_set_max(uint8_t ch)
 {
     pit_timer_stop(ch);
-    TIMER_DEV->CHANNEL[ch].LDVAL = TIMER_MAX_VALUE;
+    TIMER_BASE->CHANNEL[ch].LDVAL = TIMER_MAX_VALUE;
     pit_timer_start(ch);
 }
 
 int timer_init(tim_t dev, unsigned int ticks_per_us, void (*callback)(int))
 {
-    PIT_Type *timer = TIMER_DEV;
+    PIT_Type *timer = TIMER_BASE;
 
     /* enable timer peripheral clock */
     TIMER_CLKEN();
@@ -152,7 +152,7 @@ int timer_set_absolute(tim_t dev, int channel, unsigned int value)
             pit_timer_stop(TIMER_0_COUNTER_CH);
             cu_timer[dev].counter32b = pit_timer_read(dev, TIMER_0_COUNTER_CH);
             cu_timer[dev].diff = value - cu_timer[dev].counter32b;
-            TIMER_DEV->CHANNEL[TIMER_0_COUNTER_CH].LDVAL = cu_timer[dev].diff;
+            TIMER_BASE->CHANNEL[TIMER_0_COUNTER_CH].LDVAL = cu_timer[dev].diff;
             pit_timer_start(TIMER_0_COUNTER_CH);
             break;
 #endif
@@ -162,7 +162,7 @@ int timer_set_absolute(tim_t dev, int channel, unsigned int value)
             pit_timer_stop(TIMER_1_COUNTER_CH);
             cu_timer[dev].counter32b = pit_timer_read(dev, TIMER_1_COUNTER_CH);
             cu_timer[dev].diff = value - cu_timer[dev].counter32b;
-            TIMER_DEV->CHANNEL[TIMER_1_COUNTER_CH].LDVAL = cu_timer[dev].diff;
+            TIMER_BASE->CHANNEL[TIMER_1_COUNTER_CH].LDVAL = cu_timer[dev].diff;
             pit_timer_start(TIMER_1_COUNTER_CH);
             break;
 #endif
@@ -338,9 +338,9 @@ void timer_reset(tim_t dev)
 
 inline static void pit_timer_irq_handler(tim_t dev, uint8_t ch)
 {
-    cu_timer[dev].counter32b += TIMER_DEV->CHANNEL[ch].LDVAL;
+    cu_timer[dev].counter32b += TIMER_BASE->CHANNEL[ch].LDVAL;
 
-    TIMER_DEV->CHANNEL[ch].TFLG = PIT_TFLG_TIF_MASK;
+    TIMER_BASE->CHANNEL[ch].TFLG = PIT_TFLG_TIF_MASK;
 
     if (cu_timer[dev].diff) {
         if (config[dev].cb != NULL) {
diff --git a/cpu/msp430fxyz/periph/timer.c b/cpu/msp430fxyz/periph/timer.c
index 5f3ee2945cc660f1f11e827bd8b3d4d598b328b0..687d86dc5a8cf538a66a58bd458f0e5446336bf3 100644
--- a/cpu/msp430fxyz/periph/timer.c
+++ b/cpu/msp430fxyz/periph/timer.c
@@ -37,7 +37,7 @@ static void (*isr_cb)(int chan);
 
 int timer_init(tim_t dev, unsigned int us_per_tick, void (*callback)(int))
 {
-    /* using fixed TIMER_DEV for now */
+    /* using fixed TIMER_BASE for now */
     if (dev != 0) {
         return -1;
     }
@@ -47,23 +47,23 @@ int timer_init(tim_t dev, unsigned int us_per_tick, void (*callback)(int))
     }
 
     /* reset the timer A configuration */
-    TIMER_DEV->CTL = TIMER_CTL_CLR;
+    TIMER_BASE->CTL = TIMER_CTL_CLR;
     /* save callback */
     isr_cb = callback;
     /* configure timer to use the SMCLK with prescaler of 8 */
-    TIMER_DEV->CTL = (TIMER_CTL_TASSEL_SMCLK | TIMER_CTL_ID_DIV8);
+    TIMER_BASE->CTL = (TIMER_CTL_TASSEL_SMCLK | TIMER_CTL_ID_DIV8);
     /* configure CC channels */
     for (int i = 0; i < TIMER_CHAN; i++) {
-        TIMER_DEV->CCTL[i] = 0;
+        TIMER_BASE->CCTL[i] = 0;
     }
     /* start the timer in continuous mode */
-    TIMER_DEV->CTL |= TIMER_CTL_MC_CONT;
+    TIMER_BASE->CTL |= TIMER_CTL_MC_CONT;
     return 0;
 }
 
 int timer_set(tim_t dev, int channel, unsigned int timeout)
 {
-    uint16_t target = TIMER_DEV->R + (uint16_t)timeout;
+    uint16_t target = TIMER_BASE->R + (uint16_t)timeout;
     return timer_set_absolute(dev, channel, (unsigned int)target);
 }
 
@@ -72,9 +72,9 @@ int timer_set_absolute(tim_t dev, int channel, unsigned int value)
     if (dev != 0 || channel > TIMER_CHAN) {
         return -1;
     }
-    TIMER_DEV->CCR[channel] = value;
-    TIMER_DEV->CCTL[channel] &= ~(TIMER_CCTL_CCIFG);
-    TIMER_DEV->CCTL[channel] |=  (TIMER_CCTL_CCIE);
+    TIMER_BASE->CCR[channel] = value;
+    TIMER_BASE->CCTL[channel] &= ~(TIMER_CCTL_CCIFG);
+    TIMER_BASE->CCTL[channel] |=  (TIMER_CCTL_CCIE);
     return 0;
 }
 
@@ -83,23 +83,23 @@ int timer_clear(tim_t dev, int channel)
     if (dev != 0 || channel > TIMER_CHAN) {
         return -1;
     }
-    TIMER_DEV->CCTL[channel] &= ~(TIMER_CCTL_CCIE);
+    TIMER_BASE->CCTL[channel] &= ~(TIMER_CCTL_CCIE);
     return 0;
 }
 
 unsigned int timer_read(tim_t dev)
 {
-    return (unsigned int)TIMER_DEV->R;
+    return (unsigned int)TIMER_BASE->R;
 }
 
 void timer_start(tim_t dev)
 {
-    TIMER_DEV->CTL |= TIMER_CTL_MC_CONT;
+    TIMER_BASE->CTL |= TIMER_CTL_MC_CONT;
 }
 
 void timer_stop(tim_t dev)
 {
-    TIMER_DEV->CTL &= ~(TIMER_CTL_MC_MASK);
+    TIMER_BASE->CTL &= ~(TIMER_CTL_MC_MASK);
 }
 
 void timer_irq_enable(tim_t dev)
@@ -121,14 +121,14 @@ void timer_irq_disable(tim_t dev)
 
 void timer_reset(tim_t dev)
 {
-    TIMER_DEV->R = 0;
+    TIMER_BASE->R = 0;
 }
 
 ISR(TIMER_ISR_CC0, isr_timer_a_cc0)
 {
     __enter_isr();
 
-    TIMER_DEV->CCTL[0] &= ~(TIMER_CCTL_CCIE);
+    TIMER_BASE->CCTL[0] &= ~(TIMER_CCTL_CCIE);
     isr_cb(0);
 
     __exit_isr();
@@ -139,7 +139,7 @@ ISR(TIMER_ISR_CCX, isr_timer_a_ccx)
     __enter_isr();
 
     int chan = (int)(TIMER_IVEC->TAIV >> 1);
-    TIMER_DEV->CCTL[chan] &= ~(TIMER_CCTL_CCIE);
+    TIMER_BASE->CCTL[chan] &= ~(TIMER_CCTL_CCIE);
     isr_cb(chan);
 
     __exit_isr();
diff --git a/tests/periph_timer/Makefile b/tests/periph_timer/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..f5458de1dd1a061d89024c7da88ebb5c264afb3a
--- /dev/null
+++ b/tests/periph_timer/Makefile
@@ -0,0 +1,6 @@
+export APPLICATION = periph_timer
+include ../Makefile.tests_common
+
+FEATURES_REQUIRED = periph_timer
+
+include $(RIOTBASE)/Makefile.include
diff --git a/tests/periph_timer/main.c b/tests/periph_timer/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..2020c5b67f9afd0503fbbc99278494135fb34ed0
--- /dev/null
+++ b/tests/periph_timer/main.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 Freie Universität Berlin
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @ingroup     tests
+ * @{
+ *
+ * @file
+ * @brief       Peripheral timer test application
+ *
+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
+ *
+ * @}
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "periph/timer.h"
+
+/**
+ * @brief   Make sure, the maximum number of timers is defined
+ */
+#ifndef TIMER_NUMOF
+#error "TIMER_NUMOF not defined!"
+#endif
+
+#define MAX_CHANNELS        (10U)
+#define TIM_SPEED           (1U)        /* try to run with 1MHz */
+#define CHAN_OFFSET         (5000U)     /* fire every 5ms */
+
+static volatile int fired;
+static volatile uint32_t sw_count;
+static volatile uint32_t timeouts[MAX_CHANNELS];
+
+static void cb(int chan)
+{
+    timeouts[chan] = sw_count;
+    fired++;
+}
+
+static int test_timer(unsigned num)
+{
+    int set = 0;
+
+    /* reset state */
+    sw_count = 0;
+    fired = 0;
+    for (unsigned i = 0; i < MAX_CHANNELS; i++) {
+        timeouts[i] = 0;
+    }
+
+    /* initialize and halt timer */
+    if (timer_init(TIMER_DEV(num), TIM_SPEED, cb) < 0) {
+        printf("TIMER_%u: ERROR on initialization - skipping\n\n", num);
+        return 0;
+    }
+    else {
+        printf("TIMER_%u: initialization successful\n", num);
+    }
+    timer_stop(TIMER_DEV(num));
+    printf("TIMER_%u: stopped\n", num);
+    /* set each available channel */
+    for (unsigned i = 0; i < MAX_CHANNELS; i++) {
+        unsigned timeout = ((i + 1) * CHAN_OFFSET);
+        if (timer_set(TIMER_DEV(num), i, timeout) < 0) {
+            break;
+        }
+        else {
+            ++set;
+            printf("TIMER_%u: set channel %u to %u\n", num, i, timeout);
+        }
+    }
+    if (set == 0) {
+        printf("TIMER_%u: ERROR setting any channel\n\n", num);
+        return 0;
+    }
+    /* start the timer */
+    printf("TIMER_%u: starting\n", num);
+    timer_start(TIMER_DEV(num));
+    /* wait for all channels to fire */
+    do {
+        ++sw_count;
+    } while (fired != set);
+    /* collect results */
+    for (int i = 0; i < fired; i++) {
+        printf("TIMER_%u: channel %i fired at SW count %8u",
+               num, i, (unsigned)timeouts[i]);
+        if (i == 0) {
+            printf(" - init: %8u\n", (unsigned)timeouts[i]);
+        }
+        else {
+            printf(" - diff: %8u\n", (unsigned)(timeouts[i] - timeouts[i - 1]));
+        }
+    }
+    return 1;
+}
+
+int main(void)
+{
+    int res = 0;
+
+    puts("\nTest for peripheral TIMERs\n");
+    puts("This test will test all configured peripheral timers of the\n"
+         "targeted platform. For each timer, it will set each channel with\n"
+         "an incrementing timeout. CH0 set to 5ms, CH1 to 10ms, CH2 to 15ms\n"
+         "and so on.\n"
+         "In the output you should see that every channel fired, after an\n"
+         "evenly distributed amount of time -> the shown diff values should\n"
+         "be pretty much equal (to some jitter...)\n"
+         "This test does however NOT show, if the timeouts were correct in\n"
+         "relation to the expected real-time ~ use e.g. tests/xtimer_msg for\n"
+         "this.\n\n");
+
+    printf("Available timers: %i\n", TIMER_NUMOF);
+
+    /* test all configured timers */
+    for (unsigned i = 0; i < TIMER_NUMOF; i++) {
+        printf("\nTesting TIMER_%u:\n", i);
+        res += test_timer(i);
+    }
+    /* draw conclusion */
+    if (res == TIMER_NUMOF) {
+        puts("\nTEST SUCCEEDED");
+    }
+    else {
+        puts("\nTEST FAILED");
+    }
+
+    return 0;
+}