diff --git a/boards/airfy-beacon/Makefile b/boards/airfy-beacon/Makefile
index f8fcbb53a06595771dae356338a7bf2c0673734d..83d059dc34f4a9bff2e7e47049ec6444888db3e9 100644
--- a/boards/airfy-beacon/Makefile
+++ b/boards/airfy-beacon/Makefile
@@ -1,3 +1,4 @@
 MODULE = board
+DIRS = $(RIOTBOARD)/common/nrf51
 
 include $(RIOTBASE)/Makefile.base
diff --git a/boards/airfy-beacon/Makefile.dep b/boards/airfy-beacon/Makefile.dep
index 7de44689f60a6321fa4caa283ad5cd87a40cc13b..babcd96228acee17fb447c6b9fee69a677afcdee 100644
--- a/boards/airfy-beacon/Makefile.dep
+++ b/boards/airfy-beacon/Makefile.dep
@@ -1,3 +1 @@
-ifneq (,$(filter gnrc_netdev_default netdev_default,$(USEMODULE)))
-  USEMODULE += nrfmin
-endif
+include $(RIOTBOARD)/common/nrf51/Makefile.dep
diff --git a/boards/airfy-beacon/Makefile.features b/boards/airfy-beacon/Makefile.features
index 32008a8330aacd939dd6ef4156a0b7955c9bdc78..e5a49575464c3b48b57ab5aa3de3285b194f521f 100644
--- a/boards/airfy-beacon/Makefile.features
+++ b/boards/airfy-beacon/Makefile.features
@@ -1,15 +1,8 @@
 # Put defined MCU peripherals here (in alphabetical order)
 FEATURES_PROVIDED += periph_adc
-FEATURES_PROVIDED += periph_gpio periph_gpio_irq
 FEATURES_PROVIDED += periph_i2c
-FEATURES_PROVIDED += periph_rtt
 FEATURES_PROVIDED += periph_spi
-FEATURES_PROVIDED += periph_timer
 FEATURES_PROVIDED += periph_uart
 
-# Various other features (if any)
-
-# The board MPU family (used for grouping by the CI system)
-FEATURES_MCU_GROUP = cortex_m0_2
-
-include $(RIOTCPU)/nrf51/Makefile.features
+# include common nrf51 based boards features
+include $(RIOTBOARD)/common/nrf51/Makefile.features
diff --git a/boards/airfy-beacon/Makefile.include b/boards/airfy-beacon/Makefile.include
index e4c6cac363b199bcea767008152953e13d4d39d9..e73b42a69b9e70b0a1ab4b59b4f8c426677fe52b 100644
--- a/boards/airfy-beacon/Makefile.include
+++ b/boards/airfy-beacon/Makefile.include
@@ -1,16 +1,18 @@
-# define the used CPU
-export CPU = nrf51
+# define the used CPU model
 export CPU_MODEL = nrf51x22xxaa
 
+# include common nrf51 boards module into the build
+USEMODULE += boards_common_nrf51
+
 # define the default port depending on the host OS
 PORT_LINUX ?= /dev/ttyUSB0
 PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.SLAB_USBtoUART*)))
 
-# setup serial terminal
-include $(RIOTMAKE)/tools/serial.inc.mk
+# this board uses an ST-Link v2 debug adapter
+DEBUG_ADAPTER ?= stlink
+STLINK_VERSION ?= 2
 
-export DEBUG_ADAPTER ?= stlink
-export STLINK_VERSION ?= 2
+PROGRAMMER = openocd
 
-# this board uses openocd
-include $(RIOTMAKE)/tools/openocd.inc.mk
+# include nrf51 boards common configuration
+include $(RIOTBOARD)/common/nrf51/Makefile.include
diff --git a/boards/airfy-beacon/board.c b/boards/airfy-beacon/board.c
deleted file mode 100644
index ef39f2bac02c3635a22eed91eb6e24f9b5bd52e7..0000000000000000000000000000000000000000
--- a/boards/airfy-beacon/board.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2014 Christian Mehlis <mehlis@inf.fu-berlin.de>
- *
- * 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     boards_airfy-beacon
- * @{
- *
- * @file
- * @brief       Board specific implementations for the Airfy Beacon board
- *
- * @author      Christian Mehlis <mehlis@inf.fu-berlin.de>
- *
- * @}
- */
-
-#include "board.h"
-#include "cpu.h"
-
-void board_init(void)
-{
-    /* initialize the CPU */
-    cpu_init();
-}
diff --git a/boards/airfy-beacon/include/board.h b/boards/airfy-beacon/include/board.h
index c83bd8d0eefc8adaaa50f8a528a0e9acde29c639..d5c83e217a473f9bee7a21df3e1592d9903e146d 100644
--- a/boards/airfy-beacon/include/board.h
+++ b/boards/airfy-beacon/include/board.h
@@ -19,27 +19,10 @@
 #ifndef BOARD_H
 #define BOARD_H
 
-#include "cpu.h"
+#include "board_common.h"
 
 #ifdef __cplusplus
- extern "C" {
-#endif
-
-/**
- * @name    Xtimer configuration
- * @{
- */
-#define XTIMER_WIDTH                (24)
-#define XTIMER_BACKOFF              (40)
-/** @} */
-
-/**
- * @brief   Initialize board specific hardware, including clock, LEDs and std-IO
- */
-void board_init(void);
-
-#ifdef __cplusplus
-} /* end extern "C" */
+ extern "C" {}
 #endif
 
 #endif /* BOARD_H */
diff --git a/boards/airfy-beacon/include/periph_conf.h b/boards/airfy-beacon/include/periph_conf.h
index 69d3f16bd6c4e1dd4b61b5adfcab1dcc096fd864..916f3e5494831bfb78b8a5fc08a232e8675c7a10 100644
--- a/boards/airfy-beacon/include/periph_conf.h
+++ b/boards/airfy-beacon/include/periph_conf.h
@@ -21,6 +21,7 @@
 #define PERIPH_CONF_H
 
 #include "periph_cpu.h"
+#include "periph_conf_common.h"
 
 #ifdef __cplusplus
  extern "C" {
@@ -41,20 +42,6 @@
                                              *         2: derived from HFCLK */
 /** @} */
 
-/**
- * @name    Timer configuration
- * @{
- */
-static const timer_conf_t timer_config[] = {
-    /* dev, channels, width */
-    { NRF_TIMER0, 3, TIMER_BITMODE_BITMODE_24Bit, TIMER0_IRQn }
-};
-
-#define TIMER_0_ISR         isr_timer0
-
-#define TIMER_NUMOF         (sizeof(timer_config) / sizeof(timer_config[0]))
-/** @} */
-
 /**
  * @name    UART configuration
  *
@@ -66,16 +53,6 @@ static const timer_conf_t timer_config[] = {
 #define UART_PIN_TX         18
 /** @} */
 
-/**
- * @name    Real time counter configuration
- * @{
- */
-#define RTT_NUMOF           (1U)
-#define RTT_DEV             (1)             /* NRF_RTC1 */
-#define RTT_MAX_VALUE       (0x00ffffff)
-#define RTT_FREQUENCY       (1024)
-/** @} */
-
 /**
  * @name    SPI configuration
  * @{
diff --git a/boards/calliope-mini/Makefile.features b/boards/calliope-mini/Makefile.features
index 937a64258777c6cfa5edeefa7e02ba750f17b7c5..18eeae03c8e00518f108076ee2bd88b0c4a090c7 100644
--- a/boards/calliope-mini/Makefile.features
+++ b/boards/calliope-mini/Makefile.features
@@ -1,14 +1,7 @@
 # Put defined MCU peripherals here (in alphabetical order)
-FEATURES_PROVIDED += periph_gpio periph_gpio_irq
 FEATURES_PROVIDED += periph_i2c
-FEATURES_PROVIDED += periph_rtt
-FEATURES_PROVIDED += periph_timer
 FEATURES_PROVIDED += periph_uart
 FEATURES_PROVIDED += periph_pwm
 
-# Various other features (if any)
-
-# The board MPU family (used for grouping by the CI system)
-FEATURES_MCU_GROUP = cortex_m0_1
-
-include $(RIOTCPU)/nrf51/Makefile.features
+# include common nrf51 based boards features
+include $(RIOTBOARD)/common/nrf51/Makefile.features
diff --git a/boards/calliope-mini/Makefile.include b/boards/calliope-mini/Makefile.include
index 7fe765e3a7129b3efa27613c32ae9a683cc22ffd..6f969e2c20a8ac05f35f4b9daed40606efa07c7b 100644
--- a/boards/calliope-mini/Makefile.include
+++ b/boards/calliope-mini/Makefile.include
@@ -1,16 +1,14 @@
 # define the used CPU
-export CPU = nrf51
 export CPU_MODEL = nrf51x22xxab
 
 # define the default port depending on the host OS
 PORT_LINUX ?= /dev/ttyACM0
 PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.usbmodem*)))
 
-# setup serial terminal
-include $(RIOTMAKE)/tools/serial.inc.mk
-
-# we support flashing through plain fscopy or using JLink
+# this board supports flashing through plain fscopy, using JLink or using
+# openocd
 PROGRAMMER ?= fscopy
+
 ifeq (fscopy,$(PROGRAMMER))
   export FFLAGS =
   export DEBUGGER_FLAGS =
@@ -18,9 +16,9 @@ ifeq (fscopy,$(PROGRAMMER))
   export FLASHER = $(RIOTBOARD)/$(BOARD)/dist/flash.sh
   export DEBUGGER =
   export DEBUGSERVER =
-else ifeq (jlink,$(PROGRAMMER))
-  export JLINK_DEVICE := nrf51822
-  include $(RIOTMAKE)/tools/jlink.inc.mk
-else
-  $(info ERROR: invalid flash tool specified)
+else ifeq (openocd,$(PROGRAMMER))
+  DEBUG_ADAPTER = jlink
 endif
+
+# include nrf51 boards common configuration
+include $(RIOTBOARD)/common/nrf51/Makefile.include
diff --git a/boards/calliope-mini/include/board.h b/boards/calliope-mini/include/board.h
index 553b3a4815d37260c9408dccdc88e139a54c9647..099284158dff7564a15b7a075b680d355a3c0066 100644
--- a/boards/calliope-mini/include/board.h
+++ b/boards/calliope-mini/include/board.h
@@ -22,21 +22,12 @@
 #ifndef BOARD_H
 #define BOARD_H
 
-#include "cpu.h"
-#include "periph_conf.h"
+#include "board_common.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/**
- * @name    Xtimer configuration
- * @{
- */
-#define XTIMER_WIDTH                (24)
-#define XTIMER_BACKOFF              (40)
-/** @} */
-
 /**
  * @name    LED matrix pin configuration
  * @{
@@ -65,11 +56,6 @@ extern "C" {
 #define BTN1_MODE                   GPIO_IN
 /** @} */
 
-/**
- * @brief   Initialize the board, also triggers the CPU initialization
- */
-void board_init(void);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/boards/common/nrf51/Makefile b/boards/common/nrf51/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3a930db95c1831d15896d2540e40f3b63fb5a4c3
--- /dev/null
+++ b/boards/common/nrf51/Makefile
@@ -0,0 +1,3 @@
+MODULE = boards_common_nrf51
+
+include $(RIOTBASE)/Makefile.base
diff --git a/boards/common/nrf51/Makefile.dep b/boards/common/nrf51/Makefile.dep
new file mode 100644
index 0000000000000000000000000000000000000000..7de44689f60a6321fa4caa283ad5cd87a40cc13b
--- /dev/null
+++ b/boards/common/nrf51/Makefile.dep
@@ -0,0 +1,3 @@
+ifneq (,$(filter gnrc_netdev_default netdev_default,$(USEMODULE)))
+  USEMODULE += nrfmin
+endif
diff --git a/boards/common/nrf51/Makefile.features b/boards/common/nrf51/Makefile.features
new file mode 100644
index 0000000000000000000000000000000000000000..e1e4f8a58125e857923b9d4d612e10d1dc6b3483
--- /dev/null
+++ b/boards/common/nrf51/Makefile.features
@@ -0,0 +1,5 @@
+# Put defined MCU peripherals here (in alphabetical order)
+FEATURES_PROVIDED += periph_rtt
+FEATURES_PROVIDED += periph_timer
+
+-include $(RIOTCPU)/nrf51/Makefile.features
diff --git a/boards/common/nrf51/Makefile.include b/boards/common/nrf51/Makefile.include
new file mode 100644
index 0000000000000000000000000000000000000000..ac436a8ae721edb3ee274dde58a4c95cf62af1ff
--- /dev/null
+++ b/boards/common/nrf51/Makefile.include
@@ -0,0 +1,18 @@
+# define the used CPU
+export CPU = nrf51
+
+# setup serial terminal
+include $(RIOTMAKE)/tools/serial.inc.mk
+
+# include common nrf51 headers
+INCLUDES += -I$(RIOTBOARD)/common/nrf51/include
+
+ifeq ($(PROGRAMMER),openocd)
+  # use common openocd configuration for nrf51
+  export OPENOCD_CONFIG = $(RIOTBOARD)/common/nrf51/dist/openocd.cfg
+  include $(RIOTMAKE)/tools/openocd.inc.mk
+else ifeq ($(PROGRAMMER),jlink)
+  # setup JLink for flashing
+  export JLINK_DEVICE := nrf51822
+  include $(RIOTMAKE)/tools/jlink.inc.mk
+endif
diff --git a/boards/yunjia-nrf51822/board.c b/boards/common/nrf51/board.c
similarity index 79%
rename from boards/yunjia-nrf51822/board.c
rename to boards/common/nrf51/board.c
index 43c50241cb73b01fec2c4ed4b56ca8447c4ed00b..e0be8266138efc3d8e414ae5abb9a1a2f53a337b 100644
--- a/boards/yunjia-nrf51822/board.c
+++ b/boards/common/nrf51/board.c
@@ -7,11 +7,11 @@
  */
 
 /**
- * @ingroup     boards_yunjia-nrf51822
+ * @ingroup     boards_common_nrf51
  * @{
  *
  * @file
- * @brief       Board specific implementations for the Yunjia NRF51822 board
+ * @brief       Board initialization for the nRF51 based boards
  *
  * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
  *
diff --git a/boards/airfy-beacon/dist/openocd.cfg b/boards/common/nrf51/dist/openocd.cfg
similarity index 100%
rename from boards/airfy-beacon/dist/openocd.cfg
rename to boards/common/nrf51/dist/openocd.cfg
diff --git a/boards/common/nrf51/include/board_common.h b/boards/common/nrf51/include/board_common.h
new file mode 100644
index 0000000000000000000000000000000000000000..f7bb9d3deea433cca7d5bddf500e44a51e294ca0
--- /dev/null
+++ b/boards/common/nrf51/include/board_common.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 Freie Universität Berlin
+ *               2018 Inria
+ *
+ * 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.
+ */
+
+/**
+ * @defgroup    boards_common_nrf51 NRF51 common
+ * @ingroup     boards_common
+ * @brief       Shared files and configuration for some nRF51 boards.
+ * @{
+ *
+ * @file
+ * @brief       Shared configuration for some nRF51-based boards
+ *
+ * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
+ * @author      Alexandre Abadie <alexandre.abadie@inria.fr>
+ */
+
+#ifndef BOARD_COMMON_H
+#define BOARD_COMMON_H
+
+#include "cpu.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @name    Xtimer configuration
+ * @{
+ */
+#define XTIMER_WIDTH                (24)
+#define XTIMER_BACKOFF              (40)
+/** @} */
+
+/**
+ * @brief   Initialize the platform
+ */
+void board_init(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BOARD_COMMON_H */
+/** @} */
diff --git a/boards/common/nrf51/include/periph_conf_common.h b/boards/common/nrf51/include/periph_conf_common.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4c296d3058e4f08623c50b811a8d345f7ece929
--- /dev/null
+++ b/boards/common/nrf51/include/periph_conf_common.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2018 Inria
+ *
+ * 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     boards_common_nrf51
+ * @{
+ *
+ * @file
+ * @brief       Common peripheral MCU configuration for some nrf51 based boards
+ *
+ * @author      Alexandre Abadie <alexandre.abadie@inria.fr>
+ */
+
+#ifndef PERIPH_CONF_COMMON_H
+#define PERIPH_CONF_COMMON_H
+
+#include "periph_cpu.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/**
+ * @name    Timer configuration
+ * @{
+ */
+static const timer_conf_t timer_config[] = {
+    /* dev, channels, width */
+    { NRF_TIMER0, 3, TIMER_BITMODE_BITMODE_24Bit, TIMER0_IRQn }
+};
+
+#define TIMER_0_ISR         isr_timer0
+
+#define TIMER_NUMOF         (sizeof(timer_config) / sizeof(timer_config[0]))
+/** @} */
+
+/**
+ * @name    Real time counter configuration
+ * @{
+ */
+#define RTT_NUMOF           (1U)
+#define RTT_DEV             (1)             /* NRF_RTC1 */
+#define RTT_MAX_VALUE       (0x00ffffff)
+#define RTT_FREQUENCY       (1024)
+/** @} */
+
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#endif /* PERIPH_CONF_COMMON_H */
diff --git a/boards/microbit/Makefile.dep b/boards/microbit/Makefile.dep
index cb0306f5bf4e7139283aff33c993a9adbe282ead..46de60ee326fd5beef1d2fa828e7ce9b49a4d5d6 100644
--- a/boards/microbit/Makefile.dep
+++ b/boards/microbit/Makefile.dep
@@ -8,6 +8,4 @@ ifneq (,$(filter saul_default,$(USEMODULE)))
   USEMODULE += mma8x5x
 endif
 
-ifneq (,$(filter gnrc_netdev_default netdev_default,$(USEMODULE)))
-  USEMODULE += nrfmin
-endif
+include $(RIOTBOARD)/common/nrf51/Makefile.dep
diff --git a/boards/microbit/Makefile.features b/boards/microbit/Makefile.features
index 2c53068f05f3486548ea4baeb17da24d425173e4..e8d2c5b39d16a4e922373f0b7e308f0546e8e1af 100644
--- a/boards/microbit/Makefile.features
+++ b/boards/microbit/Makefile.features
@@ -1,13 +1,6 @@
 # Put defined MCU peripherals here (in alphabetical order)
-FEATURES_PROVIDED += periph_gpio periph_gpio_irq
 FEATURES_PROVIDED += periph_i2c
-FEATURES_PROVIDED += periph_rtt
-FEATURES_PROVIDED += periph_timer
 FEATURES_PROVIDED += periph_uart
 
-# Various other features (if any)
-
-# The board MPU family (used for grouping by the CI system)
-FEATURES_MCU_GROUP = cortex_m0_1
-
-include $(RIOTCPU)/nrf51/Makefile.features
+# include common nrf51 based boards features
+include $(RIOTBOARD)/common/nrf51/Makefile.features
diff --git a/boards/microbit/Makefile.include b/boards/microbit/Makefile.include
index 6349546dbdc45eb6d3fad57e828b1d7fe31aaf00..8eb617dd3b7dcc83a8ecf8ab054345aaa275ada4 100644
--- a/boards/microbit/Makefile.include
+++ b/boards/microbit/Makefile.include
@@ -1,16 +1,14 @@
 # define the used CPU
-export CPU = nrf51
 export CPU_MODEL = nrf51x22xxab
 
 # define the default port depending on the host OS
 PORT_LINUX ?= /dev/ttyACM0
 PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.SLAB_USBtoUART*)))
 
-# setup serial terminal
-include $(RIOTMAKE)/tools/serial.inc.mk
-
-# we support flashing through plain fscopy or using JLink
+# this board supports flashing through plain fscopy, using JLink or using
+# openocd. Default programmer is fscopy
 PROGRAMMER ?= fscopy
+
 ifeq (fscopy,$(PROGRAMMER))
   export FFLAGS =
   export DEBUGGER_FLAGS =
@@ -18,9 +16,10 @@ ifeq (fscopy,$(PROGRAMMER))
   export FLASHER = $(RIOTBOARD)/$(BOARD)/dist/flash.sh
   export DEBUGGER =
   export DEBUGSERVER =
-else ifeq (jlink,$(PROGRAMMER))
-  export JLINK_DEVICE := nrf51822
-  include $(RIOTMAKE)/tools/jlink.inc.mk
-else
-  $(info ERROR: invalid flash tool specified)
+else ifeq (openocd,$(PROGRAMMER))
+  # this board uses a daplink adapter by default
+  DEBUG_ADAPTER = dap
 endif
+
+# include nrf51 boards common configuration
+include $(RIOTBOARD)/common/nrf51/Makefile.include
diff --git a/boards/microbit/include/board.h b/boards/microbit/include/board.h
index 653428601393e53d365d83003a3230094d0b4616..b7927d85becca8b62705305a2c60e5ad6cc4341d 100644
--- a/boards/microbit/include/board.h
+++ b/boards/microbit/include/board.h
@@ -20,21 +20,12 @@
 #ifndef BOARD_H
 #define BOARD_H
 
-#include "cpu.h"
-#include "periph_conf.h"
+#include "board_common.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/**
- * @name    Xtimer configuration
- * @{
- */
-#define XTIMER_WIDTH                (24)
-#define XTIMER_BACKOFF              (40)
-/** @} */
-
 /**
  * @name    LED matrix pin configuration
  * @{
@@ -79,11 +70,6 @@ extern "C" {
 #define MAG3110_PARAM_ADDR          0x0e
 /** @} */
 
-/**
- * @brief   Initialize the board, also triggers the CPU initialization
- */
-void board_init(void);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/boards/nrf51dongle/Makefile.dep b/boards/nrf51dongle/Makefile.dep
index 7de44689f60a6321fa4caa283ad5cd87a40cc13b..babcd96228acee17fb447c6b9fee69a677afcdee 100644
--- a/boards/nrf51dongle/Makefile.dep
+++ b/boards/nrf51dongle/Makefile.dep
@@ -1,3 +1 @@
-ifneq (,$(filter gnrc_netdev_default netdev_default,$(USEMODULE)))
-  USEMODULE += nrfmin
-endif
+include $(RIOTBOARD)/common/nrf51/Makefile.dep
diff --git a/boards/nrf51dongle/Makefile.features b/boards/nrf51dongle/Makefile.features
index 0b44820578129e5ce353c4842ea76ad44ea4631b..93dbc67187e954e75683965a70387f837013979a 100644
--- a/boards/nrf51dongle/Makefile.features
+++ b/boards/nrf51dongle/Makefile.features
@@ -1,12 +1,5 @@
 # Put defined MCU peripherals here (in alphabetical order)
-FEATURES_PROVIDED += periph_gpio periph_gpio_irq
-FEATURES_PROVIDED += periph_rtt
-FEATURES_PROVIDED += periph_timer
 FEATURES_PROVIDED += periph_uart
 
-# Various other features (if any)
-
-# The board MPU family (used for grouping by the CI system)
-FEATURES_MCU_GROUP = cortex_m0_1
-
-include $(RIOTCPU)/nrf51/Makefile.features
+# include common nrf51 based boards features
+include $(RIOTBOARD)/common/nrf51/Makefile.features
diff --git a/boards/nrf51dongle/Makefile.include b/boards/nrf51dongle/Makefile.include
index 089340c484e10f670bd8b2a361afbac7efda51ea..26796a89501e4bac4b5590f27d15669aff72b977 100644
--- a/boards/nrf51dongle/Makefile.include
+++ b/boards/nrf51dongle/Makefile.include
@@ -1,14 +1,17 @@
 # define the used CPU
-export CPU = nrf51
 export CPU_MODEL = nrf51x22xxab
 
 # define the default port depending on the host OS
 PORT_LINUX ?= /dev/ttyACM0
 PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.SLAB_USBtoUART*)))
 
-# setup JLink for flashing
-export JLINK_DEVICE := nrf51822
-include $(RIOTMAKE)/tools/jlink.inc.mk
+# use jlink to program this board
+PROGRAMMER ?= jlink
 
-# setup serial terminal
-include $(RIOTMAKE)/tools/serial.inc.mk
+# set required jlink debug adapter for openocd if it's used
+ifeq (openocd,$(PROGRAMMER))
+  DEBUG_ADAPTER = jlink
+endif
+
+# include nrf51 boards common configuration
+include $(RIOTBOARD)/common/nrf51/Makefile.include
diff --git a/boards/nrf51dongle/include/board.h b/boards/nrf51dongle/include/board.h
index 5298a776b5c024ce3d4d3fe2d494ba39d100f507..b6392359f54d669b5e63ed5683345ab7d85076d2 100644
--- a/boards/nrf51dongle/include/board.h
+++ b/boards/nrf51dongle/include/board.h
@@ -19,21 +19,12 @@
 #ifndef BOARD_H
 #define BOARD_H
 
-#include "cpu.h"
-#include "periph_conf.h"
+#include "board_common.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/**
- * @name    Xtimer configuration
- * @{
- */
-#define XTIMER_WIDTH                (24)
-#define XTIMER_BACKOFF              (40)
-/** @} */
-
 /**
  * @name    LED pin definitions and handlers
  * @{
@@ -59,11 +50,6 @@ extern "C" {
 #define LED2_TOGGLE         (NRF_GPIO->OUT   ^= LED2_MASK)
 /** @} */
 
-/**
- * @brief   Initialize the board, also triggers the CPU initialization
- */
-void board_init(void);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/boards/nrf51dongle/include/periph_conf.h b/boards/nrf51dongle/include/periph_conf.h
index 3fda308cff902174ad9ca35da80a04ab971ae190..9831276b608bcb8ce7fce7658a28e1fcf79f3f8a 100644
--- a/boards/nrf51dongle/include/periph_conf.h
+++ b/boards/nrf51dongle/include/periph_conf.h
@@ -20,6 +20,7 @@
 #define PERIPH_CONF_H
 
 #include "periph_cpu.h"
+#include "periph_conf_common.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -40,30 +41,6 @@ extern "C" {
                                              *         2: derived from HFCLK */
 /** @} */
 
-/**
- * @name Timer configuration
- * @{
- */
-static const timer_conf_t timer_config[] = {
-    /* dev, channels, width */
-    { NRF_TIMER0, 3, TIMER_BITMODE_BITMODE_24Bit, TIMER0_IRQn }
-};
-
-#define TIMER_0_ISR         isr_timer0
-
-#define TIMER_NUMOF         (sizeof(timer_config) / sizeof(timer_config[0]))
-/** @} */
-
-/**
- * @name    Real time counter configuration
- * @{
- */
-#define RTT_NUMOF           (1U)
-#define RTT_DEV             (1)             /* NRF_RTC1 */
-#define RTT_MAX_VALUE       (0x00ffffff)
-#define RTT_FREQUENCY       (1024)
-/** @} */
-
 /**
  * @name UART configuration
  * @{
diff --git a/boards/nrf6310/Makefile.dep b/boards/nrf6310/Makefile.dep
index 7de44689f60a6321fa4caa283ad5cd87a40cc13b..babcd96228acee17fb447c6b9fee69a677afcdee 100644
--- a/boards/nrf6310/Makefile.dep
+++ b/boards/nrf6310/Makefile.dep
@@ -1,3 +1 @@
-ifneq (,$(filter gnrc_netdev_default netdev_default,$(USEMODULE)))
-  USEMODULE += nrfmin
-endif
+include $(RIOTBOARD)/common/nrf51/Makefile.dep
diff --git a/boards/nrf6310/Makefile.features b/boards/nrf6310/Makefile.features
index 6cec355f5fcd3a7ef2d92ba8c460b48e1047f4af..d2712cafabcd222ed3d34c850cb860be98621893 100644
--- a/boards/nrf6310/Makefile.features
+++ b/boards/nrf6310/Makefile.features
@@ -1,13 +1,8 @@
 # Put defined MCU peripherals here (in alphabetical order)
-FEATURES_PROVIDED += periph_gpio periph_gpio_irq
-FEATURES_PROVIDED += periph_rtt
 FEATURES_PROVIDED += periph_spi
-FEATURES_PROVIDED += periph_timer
 FEATURES_PROVIDED += periph_uart
 
-# Various other features (if any)
-
-# The board MPU family (used for grouping by the CI system)
-FEATURES_MCU_GROUP = cortex_m0_2
+# include common nrf51 based boards features
+include $(RIOTBOARD)/common/nrf51/Makefile.features
 
 include $(RIOTCPU)/nrf51/Makefile.features
diff --git a/boards/nrf6310/Makefile.include b/boards/nrf6310/Makefile.include
index 7cb45a324fc73c797a4aa338a7f7351d6a03c3a3..a70b6acf73fe644132b2a9d781b94b4a4ab3bc30 100644
--- a/boards/nrf6310/Makefile.include
+++ b/boards/nrf6310/Makefile.include
@@ -1,21 +1,17 @@
 # define the used CPU
-export CPU = nrf51
 export CPU_MODEL = nrf51x22xxaa
 
 # set default port depending on operating system
 PORT_LINUX ?= /dev/ttyUSB0
 PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.SLAB_USBtoUART*)))
 
-# define flash and debugging environment
-export FLASHER = $(RIOTBOARD)/$(BOARD)/dist/flash.sh
-export DEBUGGER = $(RIOTBOARD)/$(BOARD)/dist/debug.sh
-export DEBUGSERVER = JLinkGDBServer -device nrf51822 -if SWD
-export RESET = $(RIOTBOARD)/$(BOARD)/dist/reset.sh
+# use jlink to program this board
+PROGRAMMER ?= jlink
 
-HEXFILE = $(BINFILE)
-export FFLAGS = $(BINDIR) $(HEXFILE)
-export DEBUGGER_FLAGS = $(BINDIR) $(ELFFILE)
-export RESET_FLAGS = $(BINDIR)
+# set required debug adapter for openocd if it's used
+ifeq (openocd,$(PROGRAMMER))
+  DEBUG_ADAPTER = jlink
+endif
 
-# setup serial terminal
-include $(RIOTMAKE)/tools/serial.inc.mk
+# include nrf51 boards common configuration
+include $(RIOTBOARD)/common/nrf51/Makefile.include
diff --git a/boards/nrf6310/dist/debug.sh b/boards/nrf6310/dist/debug.sh
deleted file mode 100755
index 24bdbae0f64f06cfd0aec7ab536f4e8d6a901a0a..0000000000000000000000000000000000000000
--- a/boards/nrf6310/dist/debug.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-
-# Start in-circuit debugging on this board: this script starts up the GDB
-# client and connects to a GDB server.
-#
-# Start the GDB server first using the 'make debugserver' target
-
-# @author Hauke Petersen <hauke.petersen@fu-berlin.de>
-
-BINDIR=$1
-ELFFILE=$2
-
-# write GDB config file
-echo "target extended-remote 127.0.0.1:2331" > $BINDIR/gdb.cfg
-
-# run GDB
-arm-none-eabi-gdb -tui -command=$BINDIR/gdb.cfg $ELFFILE
diff --git a/boards/nrf6310/dist/flash.sh b/boards/nrf6310/dist/flash.sh
deleted file mode 100755
index 0f4bbb33c7d77f6e738c07b3e817b2f7c37e3177..0000000000000000000000000000000000000000
--- a/boards/nrf6310/dist/flash.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-# This flash script dynamically generates a file with a set of commands which
-# have to be handed to the flashing script of SEGGER (JLinkExe >4.84).
-# After that, JLinkExe will be executed with that set of commands to flash the
-# latest .bin file to the board.
-
-# @author Timo Ziegler <timo.ziegler@fu-berlin.de>
-# @author Hauke Petersen <hauke.petersen@fu-berlin.de>
-
-BINDIR=$1
-HEXFILE=$2
-
-# setup JLink command file
-echo "device nrf51822" > $BINDIR/burn.seg
-echo "speed 1000" >> $BINDIR/burn.seg
-echo "w4 4001e504 1" >> $BINDIR/burn.seg
-echo "loadbin $HEXFILE 0" >> $BINDIR/burn.seg
-echo "r" >> $BINDIR/burn.seg
-echo "g" >> $BINDIR/burn.seg
-echo "exit" >> $BINDIR/burn.seg
-echo "" >> $BINDIR/burn.seg
-
-# flash new binary to the board
-JLinkExe < $BINDIR/burn.seg
diff --git a/boards/nrf6310/dist/reset.sh b/boards/nrf6310/dist/reset.sh
deleted file mode 100755
index 509f127ea42beeaaf2e4316ab5e76e7be5e408a7..0000000000000000000000000000000000000000
--- a/boards/nrf6310/dist/reset.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-# This script resets a nrf51822 target using JLink called
-# with a pre-defined reset sequence.
-
-# @author Hauke Petersen <hauke.petersen@fu-berlin.de>
-
-BINDIR=$1
-
-# create JLink command file for resetting the board
-echo "device nrf51822" > $BINDIR/reset.seg
-echo "r" >> $BINDIR/reset.seg
-echo "g" >> $BINDIR/reset.seg
-echo "exit" >> $BINDIR/reset.seg
-echo " " >> $BINDIR/reset.seg
-
-# reset the board
-JLinkExe < $BINDIR/reset.seg
diff --git a/boards/nrf6310/include/periph_conf.h b/boards/nrf6310/include/periph_conf.h
index d1afa91ae3d33d267966a5d635e524f7707e4c0a..7f00dffbb4eac20edc484c341d8cf29d686ac459 100644
--- a/boards/nrf6310/include/periph_conf.h
+++ b/boards/nrf6310/include/periph_conf.h
@@ -23,6 +23,7 @@
 #define PERIPH_CONF_H
 
 #include "periph_cpu.h"
+#include "periph_conf_common.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -43,30 +44,6 @@ extern "C" {
                                              *         2: derived from HFCLK */
 /** @} */
 
-/**
- * @name    Timer configuration
- * @{
- */
-static const timer_conf_t timer_config[] = {
-    /* dev, channels, width */
-    { NRF_TIMER0, 3, TIMER_BITMODE_BITMODE_24Bit, TIMER0_IRQn }
-};
-
-#define TIMER_0_ISR         isr_timer0
-
-#define TIMER_NUMOF         (sizeof(timer_config) / sizeof(timer_config[0]))
-/** @} */
-
-/**
- * @name    Real time counter configuration
- * @{
- */
-#define RTT_NUMOF           (1U)
-#define RTT_DEV             (1)             /* NRF_RTC1 */
-#define RTT_MAX_VALUE       (0x00ffffff)
-#define RTT_FREQUENCY       (1024)
-/** @} */
-
 /**
  * @name    UART configuration
  * @{
diff --git a/boards/yunjia-nrf51822/Makefile b/boards/yunjia-nrf51822/Makefile
index f8fcbb53a06595771dae356338a7bf2c0673734d..83d059dc34f4a9bff2e7e47049ec6444888db3e9 100644
--- a/boards/yunjia-nrf51822/Makefile
+++ b/boards/yunjia-nrf51822/Makefile
@@ -1,3 +1,4 @@
 MODULE = board
+DIRS = $(RIOTBOARD)/common/nrf51
 
 include $(RIOTBASE)/Makefile.base
diff --git a/boards/yunjia-nrf51822/Makefile.dep b/boards/yunjia-nrf51822/Makefile.dep
index 7de44689f60a6321fa4caa283ad5cd87a40cc13b..babcd96228acee17fb447c6b9fee69a677afcdee 100644
--- a/boards/yunjia-nrf51822/Makefile.dep
+++ b/boards/yunjia-nrf51822/Makefile.dep
@@ -1,3 +1 @@
-ifneq (,$(filter gnrc_netdev_default netdev_default,$(USEMODULE)))
-  USEMODULE += nrfmin
-endif
+include $(RIOTBOARD)/common/nrf51/Makefile.dep
diff --git a/boards/yunjia-nrf51822/Makefile.features b/boards/yunjia-nrf51822/Makefile.features
index 32008a8330aacd939dd6ef4156a0b7955c9bdc78..e5a49575464c3b48b57ab5aa3de3285b194f521f 100644
--- a/boards/yunjia-nrf51822/Makefile.features
+++ b/boards/yunjia-nrf51822/Makefile.features
@@ -1,15 +1,8 @@
 # Put defined MCU peripherals here (in alphabetical order)
 FEATURES_PROVIDED += periph_adc
-FEATURES_PROVIDED += periph_gpio periph_gpio_irq
 FEATURES_PROVIDED += periph_i2c
-FEATURES_PROVIDED += periph_rtt
 FEATURES_PROVIDED += periph_spi
-FEATURES_PROVIDED += periph_timer
 FEATURES_PROVIDED += periph_uart
 
-# Various other features (if any)
-
-# The board MPU family (used for grouping by the CI system)
-FEATURES_MCU_GROUP = cortex_m0_2
-
-include $(RIOTCPU)/nrf51/Makefile.features
+# include common nrf51 based boards features
+include $(RIOTBOARD)/common/nrf51/Makefile.features
diff --git a/boards/yunjia-nrf51822/Makefile.include b/boards/yunjia-nrf51822/Makefile.include
index e4c6cac363b199bcea767008152953e13d4d39d9..637067fab0d53e020cc0d9ff43146d7e0363ca7d 100644
--- a/boards/yunjia-nrf51822/Makefile.include
+++ b/boards/yunjia-nrf51822/Makefile.include
@@ -1,16 +1,19 @@
-# define the used CPU
-export CPU = nrf51
+# define the used CPU model
 export CPU_MODEL = nrf51x22xxaa
 
+# include common nrf51 boards module into the build
+USEMODULE += boards_common_nrf51
+
 # define the default port depending on the host OS
 PORT_LINUX ?= /dev/ttyUSB0
 PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.SLAB_USBtoUART*)))
 
-# setup serial terminal
-include $(RIOTMAKE)/tools/serial.inc.mk
-
+# This board uses an ST-Link v2 debug adapter
 export DEBUG_ADAPTER ?= stlink
 export STLINK_VERSION ?= 2
 
-# this board uses openocd
-include $(RIOTMAKE)/tools/openocd.inc.mk
+# use openocd to program this board
+PROGRAMMER = openocd
+
+# import nrf51 boards common configuration
+include $(RIOTBOARD)/common/nrf51/Makefile.include
diff --git a/boards/yunjia-nrf51822/dist/openocd.cfg b/boards/yunjia-nrf51822/dist/openocd.cfg
deleted file mode 100644
index d16a15a3ecc0857d53de8e4dca34c3177e0693d4..0000000000000000000000000000000000000000
--- a/boards/yunjia-nrf51822/dist/openocd.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-set WORKAREASIZE 0x4000
-source [find target/nrf51.cfg]
-$_TARGETNAME configure -rtos auto
diff --git a/boards/yunjia-nrf51822/include/board.h b/boards/yunjia-nrf51822/include/board.h
index 0e3d004b38a582d8b6f136d711bd83c007a4ec41..5d4a51e42002b4c8e0ea20a7b0d3b8d379642c13 100644
--- a/boards/yunjia-nrf51822/include/board.h
+++ b/boards/yunjia-nrf51822/include/board.h
@@ -19,27 +19,10 @@
 #ifndef BOARD_H
 #define BOARD_H
 
-#include "cpu.h"
+#include "board_common.h"
 
 #ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @name   Xtimer configuration
- * @{
- */
-#define XTIMER_WIDTH                (24)
-#define XTIMER_BACKOFF              (40)
-/** @} */
-
-/**
- * @brief Initialize board specific hardware, including clock, LEDs and std-IO
- */
-void board_init(void);
-
-#ifdef __cplusplus
-}
+extern "C" {}
 #endif
 
 #endif /* BOARD_H */
diff --git a/boards/yunjia-nrf51822/include/periph_conf.h b/boards/yunjia-nrf51822/include/periph_conf.h
index a74e361f88c4ee0c721223adf432b62b2bd861ae..57538297d019e0f816e14e7c4a7a33c51f20055c 100644
--- a/boards/yunjia-nrf51822/include/periph_conf.h
+++ b/boards/yunjia-nrf51822/include/periph_conf.h
@@ -20,6 +20,7 @@
 #define PERIPH_CONF_H
 
 #include "periph_cpu.h"
+#include "periph_conf_common.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -40,20 +41,6 @@ extern "C" {
                                              *         2: derived from HFCLK */
 /** @} */
 
-/**
- * @name Timer configuration
- * @{
- */
-static const timer_conf_t timer_config[] = {
-    /* dev, channels, width */
-    { NRF_TIMER0, 3, TIMER_BITMODE_BITMODE_24Bit, TIMER0_IRQn }
-};
-
-#define TIMER_0_ISR         isr_timer0
-
-#define TIMER_NUMOF         (sizeof(timer_config) / sizeof(timer_config[0]))
-/** @} */
-
 /**
  * @name UART configuration
  * @{
@@ -64,16 +51,6 @@ static const timer_conf_t timer_config[] = {
 #define UART_PIN_TX         2
 /** @} */
 
-/**
- * @name    Real time counter configuration
- * @{
- */
-#define RTT_NUMOF           (1U)
-#define RTT_DEV             (1)             /* NRF_RTC1 */
-#define RTT_MAX_VALUE       (0x00ffffff)
-#define RTT_FREQUENCY       (1024)
-/** @} */
-
 /**
  * @name SPI configuration
  * @{
diff --git a/cpu/nrf51/Makefile.features b/cpu/nrf51/Makefile.features
index 7d12728b90a68dc1f4ce134b53fd28fe4cb22e6b..1a47295f0667b93a611c00617b7b94d2904c5101 100644
--- a/cpu/nrf51/Makefile.features
+++ b/cpu/nrf51/Makefile.features
@@ -1 +1,3 @@
+FEATURES_PROVIDED += periph_gpio periph_gpio_irq
+
 -include $(RIOTCPU)/nrf5x_common/Makefile.features