diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep
index 9ac61dfb6646628e4e93c944a87077ee38eda4af..322ab0d32f6a753898b3f584924ccd011f45f616 100644
--- a/drivers/Makefile.dep
+++ b/drivers/Makefile.dep
@@ -129,6 +129,11 @@ ifneq (,$(filter kw2xrf,$(USEMODULE)))
     endif
 endif
 
+ifneq (,$(filter hd44780,$(USEMODULE)))
+    FEATURES_REQUIRED += periph_gpio
+    USEMODULE += xtimer
+endif
+
 ifneq (,$(filter lis3dh,$(USEMODULE)))
     FEATURES_REQUIRED += periph_gpio
     FEATURES_REQUIRED += periph_spi
diff --git a/drivers/Makefile.include b/drivers/Makefile.include
index 434371db6d69df8b81334f2b21532bd2f4ed5ae6..096e88bad380131c346dcbf578505b099d5525cf 100644
--- a/drivers/Makefile.include
+++ b/drivers/Makefile.include
@@ -22,6 +22,9 @@ endif
 ifneq (,$(filter isl29125,$(USEMODULE)))
     USEMODULE_INCLUDES += $(RIOTBASE)/drivers/isl29125/include
 endif
+ifneq (,$(filter hd44780,$(USEMODULE)))
+    USEMODULE_INCLUDES += $(RIOTBASE)/drivers/hd44780/include
+endif
 ifneq (,$(filter lps331ap,$(USEMODULE)))
     USEMODULE_INCLUDES += $(RIOTBASE)/drivers/lps331ap/include
 endif
diff --git a/drivers/hd44780/Makefile b/drivers/hd44780/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..48422e909a47d7cd428d10fa73825060ccc8d8c2
--- /dev/null
+++ b/drivers/hd44780/Makefile
@@ -0,0 +1 @@
+include $(RIOTBASE)/Makefile.base
diff --git a/drivers/hd44780/hd44780.c b/drivers/hd44780/hd44780.c
new file mode 100644
index 0000000000000000000000000000000000000000..8b8331120dd15a88b8b5430121905a700c6aa7aa
--- /dev/null
+++ b/drivers/hd44780/hd44780.c
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2017 HAW Hamburg
+ *
+ * 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     drivers_hd44780
+ *
+ * @{
+ * @file
+ * @brief       Driver for the HD44780 LCD
+ *
+ * @note        The display is also known as LCM1602C from Arduino kits
+ *
+ * @author      Sebastian Meiling <s@mlng.net>
+ */
+
+#include <assert.h>
+#include <string.h>
+
+#include "log.h"
+#include "periph/gpio.h"
+#include "xtimer.h"
+
+#include "hd44780.h"
+#include "hd44780_internal.h"
+
+static inline void _command(hd44780_t *dev, uint8_t value);
+static void _pulse(hd44780_t *dev);
+static void _send(hd44780_t *dev, uint8_t value, uint8_t mode);
+static void _write_bits(hd44780_t *dev, uint8_t bits, uint8_t value);
+
+/**
+ * @brief   Send a command to the display
+ *
+ * @param[in]  dev          device descriptor of display to initialize
+ * @param[in]  value        the command
+ */
+static inline void _command(hd44780_t *dev, uint8_t value)
+{
+    _send(dev, value, HD44780_OFF);
+}
+
+/**
+ * @brief   Send a pulse to the display to enable new state
+ *
+ * @param[in]  dev          device descriptor of display to initialize
+ */
+static void _pulse(hd44780_t *dev)
+{
+    gpio_clear(dev->p.enable);
+    xtimer_usleep(HD44780_PULSE_WAIT_SHORT);
+    gpio_set(dev->p.enable);
+    xtimer_usleep(HD44780_PULSE_WAIT_SHORT);
+    gpio_clear(dev->p.enable);
+    xtimer_usleep(HD44780_PULSE_WAIT_LONG);
+}
+
+/**
+ * @brief   Send a data value to the display
+ *
+ * @param[in]  dev          device descriptor of display to initialize
+ * @param[in]  value        the data value, either char or command
+ * @param[in]  state        send state, to distinguish chars and commands
+ */
+static void _send(hd44780_t *dev, uint8_t value, hd44780_state_t state)
+{
+    (state == HD44780_ON) ? gpio_set(dev->p.rs) : gpio_clear(dev->p.rs);
+    /* if RW pin is available, set it to LOW */
+    if (dev->p.rw != HD44780_RW_OFF) {
+        gpio_clear(dev->p.rw);
+    }
+    /* write data in 8Bit or 4Bit mode */
+    if (dev->flag & HD44780_8BITMODE) {
+        _write_bits(dev, 8, value);
+    }
+    else {
+        _write_bits(dev, 4, value>>4);
+        _write_bits(dev, 4, value);
+    }
+}
+
+static void _write_bits(hd44780_t *dev, uint8_t bits, uint8_t value)
+{
+    for (unsigned i = 0; i < bits; ++i) {
+        if ((value >> i) & 0x01) {
+            gpio_set(dev->p.data[i]);
+        }
+        else {
+            gpio_clear(dev->p.data[i]);
+        }
+    }
+    _pulse(dev);
+}
+
+int hd44780_init(hd44780_t *dev, const hd44780_params_t *params)
+{
+    /* write config params to device descriptor */
+    memcpy(&dev->p, params, sizeof(hd44780_params_t));
+    /* verify cols and rows */
+    if ((dev->p.cols > HD44780_MAX_COLS) || (dev->p.rows > HD44780_MAX_ROWS)
+                                         || (dev->p.rows * dev->p.cols > 80)) {
+        LOG_ERROR("hd44780_init: invalid LCD size!\n");
+        return -1;
+    }
+    uint8_t count_pins = 0;
+    /* check which pins are used */
+    for (unsigned i = 0; i < HD44780_MAX_PINS; ++i) {
+        if (dev->p.data[i] != HD44780_RW_OFF) {
+            ++count_pins;
+        }
+    }
+    /* set mode depending on configured pins */
+    if (count_pins < HD44780_MAX_PINS) {
+        dev->flag |= HD44780_4BITMODE;
+    }
+    else {
+        dev->flag |= HD44780_8BITMODE;
+    }
+    /* set flag for 1 or 2 row mode, 4 rows are 2 rows split half */
+    if (dev->p.rows > 1) {
+        dev->flag |= HD44780_2LINE;
+    }
+    else {
+        dev->flag |= HD44780_1LINE;
+    }
+    /* set char size to 5x8 as default, 5x10 is hardly used by LCDs anyway */
+    dev->flag |= HD44780_5x8DOTS;
+    /* calc and set row offsets, depending on number of columns */
+    dev->roff[0] = 0x00;
+    dev->roff[1] = 0x40;
+    dev->roff[2] = 0x00 + dev->p.cols;
+    dev->roff[3] = 0x40 + dev->p.cols;
+
+    gpio_init(dev->p.rs, GPIO_OUT);
+    /* RW (read/write) of LCD not required, set it to HD44780_RW_OFF (255) */
+    if (dev->p.rw != HD44780_RW_OFF) {
+        gpio_init(dev->p.rw, GPIO_OUT);
+    }
+    gpio_init(dev->p.enable, GPIO_OUT);
+    /* configure all data pins as output */
+    for (int i = 0; i < ((dev->flag & HD44780_8BITMODE) ? 8 : 4); ++i) {
+        gpio_init(dev->p.data[i], GPIO_OUT);
+    }
+    /* see hitachi HD44780 datasheet pages 45/46 for init specs */
+    xtimer_usleep(HD44780_INIT_WAIT_XXL);
+    gpio_clear(dev->p.rs);
+    gpio_clear(dev->p.enable);
+    if (dev->p.rw != HD44780_RW_OFF) {
+        gpio_clear(dev->p.rw);
+    }
+    /* put the LCD into 4 bit or 8 bit mode */
+    if (!(dev->flag & HD44780_8BITMODE)) {
+        /* see hitachi HD44780 datasheet figure 24, pg 46 */
+        _write_bits(dev, 4, 0x03);
+        xtimer_usleep(HD44780_INIT_WAIT_LONG);
+
+        _write_bits(dev, 4, 0x03);
+        xtimer_usleep(HD44780_INIT_WAIT_LONG);
+
+        _write_bits(dev, 4, 0x03);
+        xtimer_usleep(HD44780_INIT_WAIT_SHORT);
+
+        _write_bits(dev, 4, 0x02);
+    } else {
+        /* see hitachi HD44780 datasheet page 45 figure 23 */
+        _command(dev, HD44780_FUNCTIONSET | dev->flag);
+        xtimer_usleep(HD44780_INIT_WAIT_LONG);  // wait more than 4.1ms
+
+        _command(dev, HD44780_FUNCTIONSET | dev->flag);
+        xtimer_usleep(HD44780_INIT_WAIT_SHORT);
+
+        _command(dev, HD44780_FUNCTIONSET | dev->flag);
+    }
+    _command(dev, HD44780_FUNCTIONSET | dev->flag);
+
+    /* turn the display on with no cursor or blinking default, and clear */
+    dev->ctrl = HD44780_DISPLAYON | HD44780_CURSOROFF | HD44780_BLINKOFF;
+    hd44780_display(dev, HD44780_ON);
+    hd44780_clear(dev);
+    /* Initialize to default text direction for western languages */
+    dev->mode = HD44780_ENTRYLEFT | HD44780_ENTRYSHIFTDECREMENT;
+    _command(dev, HD44780_ENTRYMODESET | dev->mode);
+
+    return 0;
+}
+
+void hd44780_clear(hd44780_t *dev)
+{
+    _command(dev, HD44780_CLEARDISPLAY);
+    xtimer_usleep(HD44780_CMD_WAIT);
+}
+
+void hd44780_home(hd44780_t *dev)
+{
+    _command(dev, HD44780_RETURNHOME);
+    xtimer_usleep(HD44780_CMD_WAIT);
+}
+
+void hd44780_set_cursor(hd44780_t *dev, uint8_t col, uint8_t row)
+{
+    if (row >= dev->p.rows) {
+        row = dev->p.rows - 1;
+    }
+    _command(dev, HD44780_SETDDRAMADDR | (col + dev->roff[row]));
+}
+
+void hd44780_display(hd44780_t *dev, hd44780_state_t state)
+{
+    if (state == HD44780_ON) {
+        dev->ctrl |= HD44780_DISPLAYON;
+    }
+    else {
+        dev->ctrl &= ~HD44780_DISPLAYON;
+    }
+    _command(dev, HD44780_DISPLAYCONTROL | dev->ctrl);
+}
+
+void hd44780_cursor(hd44780_t *dev, hd44780_state_t state)
+{
+    if (state == HD44780_ON) {
+        dev->ctrl |= HD44780_CURSORON;
+    }
+    else {
+        dev->ctrl &= ~HD44780_CURSORON;
+    }
+    _command(dev, HD44780_DISPLAYCONTROL | dev->ctrl);
+}
+
+void hd44780_blink(hd44780_t *dev, hd44780_state_t state)
+{
+    if (state == HD44780_ON) {
+        dev->ctrl |= HD44780_BLINKON;
+    }
+    else {
+        dev->ctrl &= ~HD44780_BLINKON;
+    }
+    _command(dev, HD44780_DISPLAYCONTROL | dev->ctrl);
+}
+
+void hd44780_scroll_left(hd44780_t *dev)
+{
+    _command(dev, HD44780_CURSORSHIFT | HD44780_DISPLAYMOVE | HD44780_MOVELEFT);
+}
+
+void hd44780_scroll_right(hd44780_t *dev) {
+    _command(dev, HD44780_CURSORSHIFT | HD44780_DISPLAYMOVE | HD44780_MOVERIGHT);
+}
+
+void hd44780_left2right(hd44780_t *dev)
+{
+    dev->mode |= HD44780_ENTRYLEFT;
+    _command(dev, HD44780_ENTRYMODESET | dev->mode);
+}
+
+void hd44780_right2left(hd44780_t *dev)
+{
+    dev->mode &= ~HD44780_ENTRYLEFT;
+    _command(dev, HD44780_ENTRYMODESET | dev->mode);
+}
+
+void hd44780_autoscroll(hd44780_t *dev, hd44780_state_t state)
+{
+    if (state == HD44780_ON) {
+        dev->mode |= HD44780_ENTRYSHIFTINCREMENT;
+    }
+    else {
+        dev->mode &= ~HD44780_ENTRYSHIFTINCREMENT;
+    }
+    _command(dev, HD44780_ENTRYMODESET | dev->mode);
+}
+
+void hd44780_create_char(hd44780_t *dev, uint8_t location, uint8_t charmap[])
+{
+    location &= 0x7; /* 8 locations (0-7) possible */
+    _command(dev, HD44780_SETCGRAMADDR | (location << 3));
+    for (unsigned i = 0; i < HD44780_CGRAM_SIZE; ++i) {
+        hd44780_write(dev, charmap[i]);
+    }
+}
+
+void hd44780_write(hd44780_t *dev, uint8_t value)
+{
+    _send(dev, value, HD44780_ON);
+}
+
+void hd44780_print(hd44780_t *dev, const char *data )
+{
+    while (*data != '\0') {
+        hd44780_write(dev, *data++);
+    }
+}
diff --git a/drivers/hd44780/include/hd44780_internal.h b/drivers/hd44780/include/hd44780_internal.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a4de1541c81f843e79e3a3a67aa2f9931ee126d
--- /dev/null
+++ b/drivers/hd44780/include/hd44780_internal.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 HAW Hamburg
+ *
+ * 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     drivers_hd44780
+ *
+ * @{
+ * @file
+ * @brief       Internal config and parameters for the HD44780 display
+ *
+ * @author      Sebastian Meiling <s@mlng.net>
+ */
+
+#ifndef HD44780_INTERNAL_H
+#define HD44780_INTERNAL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief   HD44780 LCD commands
+ * @{
+ */
+#define HD44780_CLEARDISPLAY            (0x01)
+#define HD44780_RETURNHOME              (0x02)
+#define HD44780_ENTRYMODESET            (0x04)
+#define HD44780_DISPLAYCONTROL          (0x08)
+#define HD44780_CURSORSHIFT             (0x10)
+#define HD44780_FUNCTIONSET             (0x20)
+#define HD44780_SETCGRAMADDR            (0x40)
+#define HD44780_SETDDRAMADDR            (0x80)
+/**@}*/
+
+/**
+ * @brief   HD44780 LCD entry modes flags
+ * @{
+ */
+#define HD44780_ENTRYRIGHT              (0x00)
+#define HD44780_ENTRYLEFT               (0x02)
+#define HD44780_ENTRYSHIFTINCREMENT     (0x01)
+#define HD44780_ENTRYSHIFTDECREMENT     (0x00)
+/**@}*/
+
+/**
+ * @brief   HD44780 LCD control flags
+ * @{
+ */
+#define HD44780_DISPLAYON               (0x04)
+#define HD44780_DISPLAYOFF              (0x00)
+#define HD44780_CURSORON                (0x02)
+#define HD44780_CURSOROFF               (0x00)
+#define HD44780_BLINKON                 (0x01)
+#define HD44780_BLINKOFF                (0x00)
+/**@}*/
+
+/**
+ * @brief   HD44780 display and cursor shift flags
+ * @{
+ */
+#define HD44780_DISPLAYMOVE             (0x08)
+#define HD44780_CURSORMOVE              (0x00)
+#define HD44780_MOVERIGHT               (0x04)
+#define HD44780_MOVELEFT                (0x00)
+/**@}*/
+
+/**
+ * @brief   HD44780 LCD functional flags
+ * @{
+ */
+#define HD44780_8BITMODE                (0x10)
+#define HD44780_4BITMODE                (0x00)
+#define HD44780_2LINE                   (0x08)
+#define HD44780_1LINE                   (0x00)
+#define HD44780_5x10DOTS                (0x04)
+#define HD44780_5x8DOTS                 (0x00)
+/**@}*/
+
+/**
+ * @brief   HD44780 LCD timings
+ * @{
+ */
+#define HD44780_CMD_WAIT                (2000U)
+#define HD44780_INIT_WAIT_XXL           (50000U)
+#define HD44780_INIT_WAIT_LONG          (4500U)
+#define HD44780_INIT_WAIT_SHORT         (150U)
+#define HD44780_PULSE_WAIT_SHORT        (1U)
+#define HD44780_PULSE_WAIT_LONG         (100U)
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HD44780_INTERNAL_H */
diff --git a/drivers/include/hd44780.h b/drivers/include/hd44780.h
new file mode 100644
index 0000000000000000000000000000000000000000..f2286d8038d2adbeba78a734bdbf75aba28e8f96
--- /dev/null
+++ b/drivers/include/hd44780.h
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2017 HAW Hamburg
+ *
+ * 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    drivers_hd44780 HD44780 LCD driver
+  * @ingroup     drivers_displays
+  * @brief       Driver for the Hitachi HD44780 LCD driver
+  *
+  * @note        The driver currently supports direct addressing, no I2C
+  *
+  * @{
+  *
+  * @file
+  * @brief       Interface definition for the HD44780 LCD driver
+  *
+  * @author      Sebastian Meiling <s@mlng.net>
+  */
+#ifndef HD44780_H
+#define HD44780_H
+
+#include <stdint.h>
+
+#include "periph/gpio.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Maximal number of columns supported by the driver
+ */
+#define HD44780_MAX_COLS        (40U)
+
+/**
+ * @brief Maximal number of rows supported by the driver
+ */
+#define HD44780_MAX_ROWS        (4U)
+
+/**
+ * @brief Number of data pins for communication 4 or 8.
+ */
+#define HD44780_MAX_PINS        (8U)
+
+/**
+ * @brief Specific value to turn rw pin off, if unused.
+ */
+#define HD44780_RW_OFF          (255U)
+
+/**
+ * @brief Size of RAM for custom chars
+ *
+ * Generally the driver could support 8 chars of size 5x8 or 4 of size 5x10.
+ * However, most displays only use the former, which is (hard wired) default.
+ */
+#define HD44780_CGRAM_SIZE      (8U)
+
+/**
+ * @brief   Parameters needed for device initialization
+ */
+typedef struct {
+    uint8_t cols;                   /**< number of LCD cols */
+    uint8_t rows;                   /**< number of LCD rows */
+    gpio_t rs;                      /**< rs gpio pin */
+    gpio_t rw;                      /**< rw gpio pin */
+    gpio_t enable;                  /**< enable gpio pin */
+    gpio_t data[8];                 /**< data gpio pins */
+} hd44780_params_t;
+
+/**
+ * @brief   Device descriptor for HD44780 LCD
+ */
+typedef struct {
+    hd44780_params_t p;             /**< LCD config parameters */
+    uint8_t flag;                   /**< LCD functional flags */
+    uint8_t ctrl;                   /**< LCD control flags */
+    uint8_t mode;                   /**< LCD mode flags */
+    uint8_t roff[HD44780_MAX_ROWS]; /**< offsets for LCD rows */
+} hd44780_t;
+
+/**
+ * @brief Simple state values
+ */
+typedef enum {
+    HD44780_OFF,                    /**< disable feature */
+    HD44780_ON                      /**< enable feature */
+} hd44780_state_t;
+
+/**
+ * @brief Initialize the given driver
+ *
+ * @param[out] dev          device descriptor of display to initialize
+ * @param[in]  params       configuration parameters
+ *
+ * @return                  0 on success, otherwise error
+ */
+int hd44780_init(hd44780_t *dev, const hd44780_params_t *params);
+
+/**
+ * @brief Clear display, delete all chars
+ *
+ * @param[in]  dev          device descriptor of LCD
+ */
+void hd44780_clear(hd44780_t *dev);
+
+/**
+ * @brief Reset cursor to row 0 and column 0
+ *
+ * @param[in]  dev          device descriptor of LCD
+ */
+void hd44780_home(hd44780_t *dev);
+
+/**
+ * @brief Set cursor to specific position in column and row
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  col          column position
+ * @param[in]  row          row position
+ */
+void hd44780_set_cursor(hd44780_t *dev, uint8_t col, uint8_t row);
+
+/**
+ * @brief Turn display on or off
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  state        display on or off
+ */
+void hd44780_display(hd44780_t *dev, hd44780_state_t state);
+
+/**
+ * @brief Show cursor, on or off
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  state        cursor on or off
+ */
+void hd44780_cursor(hd44780_t *dev, hd44780_state_t state);
+
+/**
+ * @brief Blink cursor, on or off
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  state        blink on or off
+ */
+void hd44780_blink(hd44780_t *dev, hd44780_state_t state);
+
+/**
+ * @brief Enable left scrolling
+ *
+ * @param[in]  dev          device descriptor of LCD
+ */
+void hd44780_scroll_left(hd44780_t *dev);
+
+/**
+ * @brief Enable right scrolling
+ *
+ * @param[in]  dev          device descriptor of LCD
+ */
+void hd44780_scroll_right(hd44780_t *dev);
+
+/**
+ * @brief set display direction left to right
+ *
+ * @param[in]  dev          device descriptor of LCD
+ */
+void hd44780_left2right(hd44780_t *dev);
+
+/**
+ * @brief set   display direction right to left
+ *
+ * @param[in]  dev          device descriptor of LCD
+ */
+void hd44780_right2left(hd44780_t *dev);
+
+/**
+ * @brief display autoscroll on or off
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  state        scroll on or off
+ */
+void hd44780_autoscroll(hd44780_t *dev, hd44780_state_t state);
+
+/**
+ * @brief Create and store a custom character on display memory
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  location     memory location
+ * @param[in]  charmap      character bitmap
+ *
+ * @pre charmap has to be of size HD44780_CGRAM_SIZE, which is 8 by default
+ */
+void hd44780_create_char(hd44780_t *dev, uint8_t location, uint8_t charmap[]);
+
+/**
+ * @brief Write a single character on the LCD
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  value        the character to print, i.e., memory location
+ */
+void hd44780_write(hd44780_t *dev, uint8_t value);
+
+/**
+ * @brief Write a string on the LCD
+ *
+ * @param[in]  dev          device descriptor of LCD
+ * @param[in]  data         the string to print
+ */
+void hd44780_print(hd44780_t *dev, const char *data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HD44780_H */
+/** @} */
diff --git a/tests/driver_hd44780/Makefile b/tests/driver_hd44780/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..5df7166482564ac3f82cb9f03686a0797686a4db
--- /dev/null
+++ b/tests/driver_hd44780/Makefile
@@ -0,0 +1,14 @@
+APPLICATION = driver_hd44780
+include ../Makefile.tests_common
+
+# the stm32f4discovery does not have the arduino pinout
+BOARD_BLACKLIST := stm32f4discovery
+# currently the test provides config params for arduinos only
+FEATURES_REQUIRED += arduino
+
+USEMODULE += hd44780
+
+test:
+	tests/01-run.py
+
+include $(RIOTBASE)/Makefile.include
diff --git a/tests/driver_hd44780/README.md b/tests/driver_hd44780/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f6846de55e6a442b65b3278f5ffcf14dcebfc733
--- /dev/null
+++ b/tests/driver_hd44780/README.md
@@ -0,0 +1,27 @@
+# About
+
+This is a test application for the HD44780 LCD driver. This display comes with
+many Arduino starter kits under the name of LCM1602C, and typically has 16x2
+columns and rows.
+
+# Details
+
+This test application will initialize the HD44780 driver with the configuration
+as specified in the default `hd44780_params.h` file. To connect the display with
+your board use the following minimal pinout for the LCD (i.e., Arduino here):
+
+- Pin 1 is connected directly to GND.
+- Pin 2 is connected directly to VCC +5V.
+- Pin 3 is used to set LCD contrast, for max use +5V or a 10k potentiometer.
+- Pin 4 (RS or “register select”) is connected to pin 2 on the Arduino
+- Pin 5 (RW or “read/write”) is connected directly to GND, i.e., unused.
+  Also note: if you connect RW to your board that the LCD is driven by 5V, while
+  many boards internally run at 3.3V - so this could fry the board :/
+- Pin 6 (EN or “enable”) is connected to pin 3 on the Arduino.
+- Pins 7 – 10: Not connected.
+- Pin 11 on the LCD is connected to pin 4 on the Arduino.
+- Pin 12 on the LCD is connected to pin 5 on the Arduino.
+- Pin 13 on the LCD is connected to pin 6 on the Arduino.
+- Pin 14 on the LCD is connected to pin 7 on the Arduino.
+- Pin 15 is connected to one end of a 1k resistor, and its other end to VCC +5V.
+- Pin 16 is connected directly to GND.
diff --git a/tests/driver_hd44780/hd44780_params.h b/tests/driver_hd44780/hd44780_params.h
new file mode 100644
index 0000000000000000000000000000000000000000..6fd8c8c147ce12b5e60119c002eef5b0935950fd
--- /dev/null
+++ b/tests/driver_hd44780/hd44780_params.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 HAW Hamburg
+ *
+ * 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     drivers_hd44780
+ *
+ * @{
+ * @file
+ * @brief       Pinout config for the HD44780 display
+ *
+ * @author      Sebastian Meiling <s@mlng.net>
+ */
+#ifndef HD44780_PARAMS_H
+#define HD44780_PARAMS_H
+
+#include "board.h"
+#include "periph/gpio.h"
+
+#include "hd44780.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define HD44780_PARAMS_ARDUINO {    \
+    .cols   = 16,                   \
+    .rows   = 2,                    \
+    .rs     = ARDUINO_PIN_2,        \
+    .rw     = HD44780_RW_OFF,       \
+    .enable = ARDUINO_PIN_3,        \
+    .data   = {ARDUINO_PIN_4, ARDUINO_PIN_5, ARDUINO_PIN_6, ARDUINO_PIN_7,     \
+               HD44780_RW_OFF, HD44780_RW_OFF, HD44780_RW_OFF, HD44780_RW_OFF} \
+}
+
+/**
+ * @brief   LCM1602C configuration
+ */
+static const hd44780_params_t hd44780_params[] =
+{
+    HD44780_PARAMS_ARDUINO,
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* HD44780_PARAMS_H */
+/** @} */
diff --git a/tests/driver_hd44780/main.c b/tests/driver_hd44780/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..693f89bfab340fe7fef8ed294436a219ce4b941f
--- /dev/null
+++ b/tests/driver_hd44780/main.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 HAW Hamburg
+ *
+ * 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       Test application for Arduino LCM1602C LCD
+ *
+ * @author      Sebastian Meiling <s@mlng.net>
+ *
+ * @}
+ */
+
+#include <stdio.h>
+
+#include "xtimer.h"
+#include "hd44780.h"
+#include "hd44780_params.h"
+
+int main(void)
+{
+    hd44780_t dev;
+    /* init display */
+    puts("[START]");
+    if (hd44780_init(&dev, &hd44780_params[0]) != 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+    /* clear screen, reset cursor */
+    hd44780_clear(&dev);
+    hd44780_home(&dev);
+    /* write first line */
+    hd44780_print(&dev, "Hello World ...");
+    xtimer_sleep(1);
+    /* set cursor to second line and write */
+    hd44780_set_cursor(&dev, 0, 1);
+    hd44780_print(&dev, "   RIOT is here!");
+    xtimer_sleep(3);
+    /* clear screen, reset cursor */
+    hd44780_clear(&dev);
+    hd44780_home(&dev);
+    /* write first line */
+    hd44780_print(&dev, "The friendly IoT");
+    /* set cursor to second line and write */
+    hd44780_set_cursor(&dev, 0, 1);
+    hd44780_print(&dev, "Operating System");
+
+    puts("[SUCCESS]");
+
+    return 0;
+}
diff --git a/tests/driver_hd44780/tests/01-run.py b/tests/driver_hd44780/tests/01-run.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e1baaae75cb0b42228a3120140102e37a3a49c0
--- /dev/null
+++ b/tests/driver_hd44780/tests/01-run.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2016 Kaspar Schleiser <kaspar@schleiser.de>
+#               2017 Sebastian Meiling <s@mlng.net>
+#
+# 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.
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.environ['RIOTBASE'], 'dist/tools/testrunner'))
+import testrunner
+
+def testfunc(child):
+    child.expect_exact("[START]")
+    child.expect_exact("[SUCCESS]")
+
+if __name__ == "__main__":
+    sys.exit(testrunner.run(testfunc))