diff --git a/boards/airfy-beacon/include/board.h b/boards/airfy-beacon/include/board.h
index 49b17c03e7ce7f16a76df69e40e56e18d5bcfc78..59db7e7200a560a5ec001245e197c3464269e1fb 100644
--- a/boards/airfy-beacon/include/board.h
+++ b/boards/airfy-beacon/include/board.h
@@ -33,7 +33,7 @@
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xff000000)
+#define XTIMER_WIDTH                (24)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/arduino-mega2560/include/board.h b/boards/arduino-mega2560/include/board.h
index 543266941745d543af0805e03cc2df8f758f3f60..b09d20df4ff0e893247d820bb1b1cdd93f79d6bf 100644
--- a/boards/arduino-mega2560/include/board.h
+++ b/boards/arduino-mega2560/include/board.h
@@ -56,7 +56,7 @@ extern "C" {
  * @brief xtimer configuration values
  * @{
  */
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 #define XTIMER_SHIFT                (2)
 #define XTIMER_BACKOFF              (40)
 /** @} */
diff --git a/boards/cc2650stk/include/board.h b/boards/cc2650stk/include/board.h
index 12754112cadee3a58ee6fae66842657b9f9bc5da..84d4d8980bfc930689173cdd597161bc284298e3 100644
--- a/boards/cc2650stk/include/board.h
+++ b/boards/cc2650stk/include/board.h
@@ -31,7 +31,7 @@ extern "C" {
  * @brief   Xtimer configuration
  * @{
  */
-#define XTIMER_MASK                 (0xFFFF0000)
+#define XTIMER_WIDTH                (16)
 /** @} */
 
 /**
diff --git a/boards/chronos/include/board.h b/boards/chronos/include/board.h
index 00dab1df8a694eb8b69265fb22de61ec918fb147..b4d4de2c0ff03dd52839bc23e99736ec57a3340c 100644
--- a/boards/chronos/include/board.h
+++ b/boards/chronos/include/board.h
@@ -40,7 +40,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 /** @} */
 
 /**
diff --git a/boards/fox/include/board.h b/boards/fox/include/board.h
index e62bf4c7e21e00c037013a85593ed8b5413bc3f0..51540e1ab5a260b28ca1a4ffa42ece339ffbbea9 100644
--- a/boards/fox/include/board.h
+++ b/boards/fox/include/board.h
@@ -36,7 +36,7 @@ extern "C" {
 /**
  * @name Tell the xtimer that we use a 16-bit peripheral timer
  */
-#define XTIMER_MASK         (0xffff0000)
+#define XTIMER_WIDTH        (16)
 
 /**
  * @name Define the interface to the AT86RF231 radio
diff --git a/boards/iotlab-common/include/board_common.h b/boards/iotlab-common/include/board_common.h
index 29babc2b96dc812676c1053b20c263c3d55ee6e7..1ecbf337066f7db78e9b4540e5b0c0afe07fda8d 100644
--- a/boards/iotlab-common/include/board_common.h
+++ b/boards/iotlab-common/include/board_common.h
@@ -46,7 +46,7 @@ extern "C" {
 /**
  * @name Tell the xtimer that we use a 16-bit peripheral timer
  */
-#define XTIMER_MASK         (0xffff0000)
+#define XTIMER_WIDTH        (16)
 
 /**
  * @name Define the interface to the AT86RF231 radio
diff --git a/boards/msb-430-common/include/board_common.h b/boards/msb-430-common/include/board_common.h
index 72d856dcb78b21cfd0773bf7a4b209a2332e62ab..e87fd8eb38bdfaa1c510957a2b8649e4b8d84608 100644
--- a/boards/msb-430-common/include/board_common.h
+++ b/boards/msb-430-common/include/board_common.h
@@ -39,7 +39,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/nrf51dongle/include/board.h b/boards/nrf51dongle/include/board.h
index 3e3ee91c6671b64a1aa9cf94d9070aab2a97708d..c215c3697351d21b71ae08008bfb6a9c46605915 100644
--- a/boards/nrf51dongle/include/board.h
+++ b/boards/nrf51dongle/include/board.h
@@ -34,7 +34,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xff000000)
+#define XTIMER_WIDTH                (24)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/nucleo-f103/include/board.h b/boards/nucleo-f103/include/board.h
index 7641bd1b37631bf9b67d3178ea1951a8a6d6404b..944ba64d1bb7716b91f4ca45b7ba737a52f0870c 100755
--- a/boards/nucleo-f103/include/board.h
+++ b/boards/nucleo-f103/include/board.h
@@ -35,7 +35,7 @@ extern "C" {
 /**
  * @name xtimer configuration
  */
-#define XTIMER_MASK         (0xffff0000)
+#define XTIMER_WIDTH        (16)
 #define XTIMER_BACKOFF      5
 /** @} */
 
diff --git a/boards/pca10000/include/board.h b/boards/pca10000/include/board.h
index 11ee1dcbb3f88609e3a28a2eb975eef1c81c5926..490a8b491d26c79ffa47478f932afe31df49479d 100644
--- a/boards/pca10000/include/board.h
+++ b/boards/pca10000/include/board.h
@@ -34,7 +34,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xff000000)
+#define XTIMER_WIDTH                (24)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/pca10005/include/board.h b/boards/pca10005/include/board.h
index ab8a291f774aad9f99e7ef096f3abfb0e2465f9f..a3d2c2b65652007d7e08b559b60f73f62c30bb81 100644
--- a/boards/pca10005/include/board.h
+++ b/boards/pca10005/include/board.h
@@ -34,7 +34,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xff000000)
+#define XTIMER_WIDTH                (24)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/spark-core/include/board.h b/boards/spark-core/include/board.h
index 3e0895eecd64ff1d02b973fc63d9800574f5ffba..3909af7abf614234f0dbded2f7c31337532b2c2c 100644
--- a/boards/spark-core/include/board.h
+++ b/boards/spark-core/include/board.h
@@ -38,7 +38,7 @@
 /**
  * @name Tell the xtimer that we use a 16-bit peripheral timer
  */
-#define XTIMER_MASK         (0xffff0000)
+#define XTIMER_WIDTH        (16)
 
 /**
  * @brief   Macros for controlling the on-board LEDs
diff --git a/boards/telosb/include/board.h b/boards/telosb/include/board.h
index a3e36ab4738be26100b94309a3771fb79b3907ff..e5136a19f2a6b648fcd744d9421091460e944339 100644
--- a/boards/telosb/include/board.h
+++ b/boards/telosb/include/board.h
@@ -56,7 +56,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/waspmote-pro/include/board.h b/boards/waspmote-pro/include/board.h
index 6ed7ad4f47c0115665c0d23670b605120036ba90..a63f84aaa7fd01e59c249d19b84c1b5a24e71b30 100644
--- a/boards/waspmote-pro/include/board.h
+++ b/boards/waspmote-pro/include/board.h
@@ -154,7 +154,7 @@ extern "C" {
  * @brief xtimer configuration values
  * @{
  */
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 #define XTIMER_SHIFT                (4)
 #define XTIMER_BACKOFF              (40)
 #define XTIMER_TICKS_INIT           (921600ul)
diff --git a/boards/wsn430-common/include/board_common.h b/boards/wsn430-common/include/board_common.h
index 1942986328c6b11cc912aeaafadd27e47c33f358..08734f92f3a9648303edf6cbf415f7aebda8e104 100644
--- a/boards/wsn430-common/include/board_common.h
+++ b/boards/wsn430-common/include/board_common.h
@@ -39,7 +39,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/yunjia-nrf51822/include/board.h b/boards/yunjia-nrf51822/include/board.h
index 22f21e99054bb3a8b28043323085a09fe01397e0..2442f045e57deaf0ed67c5fec959836c3e5116c0 100644
--- a/boards/yunjia-nrf51822/include/board.h
+++ b/boards/yunjia-nrf51822/include/board.h
@@ -33,7 +33,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xff000000)
+#define XTIMER_WIDTH                (24)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/boards/z1/include/board.h b/boards/z1/include/board.h
index 4698181e049a315f6aeae8579ba7f1b4205e5eaa..0e2fde78a1ae4da08a80ebe034501f20893a924f 100644
--- a/boards/z1/include/board.h
+++ b/boards/z1/include/board.h
@@ -50,7 +50,7 @@ extern "C" {
  */
 #define XTIMER                      (0)
 #define XTIMER_CHAN                 (0)
-#define XTIMER_MASK                 (0xffff0000)
+#define XTIMER_WIDTH                (16)
 #define XTIMER_BACKOFF              (40)
 /** @} */
 
diff --git a/sys/include/xtimer.h b/sys/include/xtimer.h
index 1d6bec989997de25517d60ca4a42c54989e067e9..9759fa7c2ca2a98115270abf16c82a6ddfdbc98a 100644
--- a/sys/include/xtimer.h
+++ b/sys/include/xtimer.h
@@ -357,26 +357,38 @@ int xtimer_msg_receive_timeout64(msg_t *msg, uint64_t us);
 #define XTIMER_TICKS_TO_USEC(value) ( (value) << XTIMER_SHIFT )
 #endif
 
-/**
- * @brief set xtimer default timer configuration
- * @{
+/*
+ * Default xtimer configuration
  */
 #ifndef XTIMER
-#define XTIMER (0)
+/**
+ * @brief Underlying hardware timer device to assign to xtimer
+ */
+#define XTIMER TIMER_DEV(0)
+/**
+ * @brief Underlying hardware timer channel to assign to xtimer
+ */
 #define XTIMER_CHAN (0)
 
-#if TIMER_0_MAX_VALUE == 0xffffff
-#define XTIMER_MASK 0xff000000
-#elif TIMER_0_MAX_VALUE == 0xffff
-#define XTIMER_MASK 0xffff0000
+#if (TIMER_0_MAX_VALUE) == 0xfffffful
+#define XTIMER_WIDTH (24)
+#elif (TIMER_0_MAX_VALUE) == 0xffff
+#define XTIMER_WIDTH (16)
 #endif
 
 #endif
+
+#ifndef XTIMER_WIDTH
 /**
- * @}
+ * @brief xtimer timer width
+ *
+ * This value specifies the width (in bits) of the hardware timer used by xtimer.
+ * Default is 32.
  */
+#define XTIMER_WIDTH (32)
+#endif
 
-#ifndef XTIMER_MASK
+#if XTIMER_WIDTH != 32
 /**
  * @brief xtimer timer mask
  *
@@ -384,12 +396,13 @@ int xtimer_msg_receive_timeout64(msg_t *msg, uint64_t us);
  * counts to, e.g., 0xffffffff & ~TIMER_MAXVALUE.
  *
  * For a 16bit timer, the mask would be 0xFFFF0000, for a 24bit timer, the mask
- * would be 0xFF000000. Don't set this for 32bit timers.
- *
- * This is supposed to be defined per-device in e.g., periph_conf.h.
+ * would be 0xFF000000.
  */
+#define XTIMER_MASK ((0xffffffff >> XTIMER_WIDTH) << XTIMER_WIDTH)
+#else
 #define XTIMER_MASK (0)
 #endif
+
 #define XTIMER_MASK_SHIFTED XTIMER_TICKS_TO_USEC(XTIMER_MASK)
 
 #if XTIMER_MASK