diff --git a/boards/samr21-xpro/include/gpio_params.h b/boards/samr21-xpro/include/gpio_params.h
index 30ba529089d084fa7336239680df8b4ffd656f88..e1a36f35ccffc31a1efc979afabc4123e5c5aa03 100644
--- a/boards/samr21-xpro/include/gpio_params.h
+++ b/boards/samr21-xpro/include/gpio_params.h
@@ -37,12 +37,14 @@ static const  saul_gpio_params_t saul_gpio_params[] =
     {
         .name = "LED(orange)",
         .pin = LED0_PIN,
-        .mode = GPIO_OUT
+        .mode = GPIO_OUT,
+        .flags = SAUL_GPIO_INVERTED,
     },
     {
         .name = "Button(SW0)",
         .pin  = BTN0_PIN,
-        .mode = BTN0_MODE
+        .mode = BTN0_MODE,
+        .flags = SAUL_GPIO_INVERTED,
     },
 };
 
diff --git a/drivers/.Makefile.dep.swo b/drivers/.Makefile.dep.swo
new file mode 100644
index 0000000000000000000000000000000000000000..db7d17170f1a1549c2bbae151e6b5b0624249bf5
Binary files /dev/null and b/drivers/.Makefile.dep.swo differ
diff --git a/drivers/include/saul/periph.h b/drivers/include/saul/periph.h
index 00a148538fcf4a77f33eb58c6acb771e82f391f2..460a0454775da35f9e388d97fc5da562f0c438ce 100644
--- a/drivers/include/saul/periph.h
+++ b/drivers/include/saul/periph.h
@@ -32,13 +32,20 @@ extern "C" {
 #endif
 
 #ifdef MODULE_SAUL_GPIO
+typedef enum {
+    SAUL_GPIO_INVERTED   = (1 << 0),  /**< pin is used as inverted */
+    SAUL_GPIO_INIT_CLEAR = (1 << 1),  /**< set pin inactive after init */
+    SAUL_GPIO_INIT_SET   = (1 << 2),  /**< set pin active after init */
+} saul_gpio_flags_t;
+
 /**
  * @brief   Direct mapped GPIO configuration values
  */
 typedef struct {
-    const char *name;       /**< name of the device connected to this pin */
-    gpio_t pin;             /**< GPIO pin to initialize and expose */
-    gpio_mode_t mode;       /**< pin mode to use */
+    const char *name;           /**< name of the device connected to this pin */
+    gpio_t pin;                 /**< GPIO pin to initialize and expose */
+    gpio_mode_t mode;           /**< pin mode to use */
+    saul_gpio_flags_t flags;    /**< Configuration flags */
 } saul_gpio_params_t;
 #endif /* MODULE_SAUL_GPIO */
 
diff --git a/drivers/saul/gpio_saul.c b/drivers/saul/gpio_saul.c
index e32511585890a5fe8d87c3e4c12718d9f60008b4..0b5431c811c797242d2f9c6b87ee7e860957c4af 100644
--- a/drivers/saul/gpio_saul.c
+++ b/drivers/saul/gpio_saul.c
@@ -23,12 +23,16 @@
 #include "saul.h"
 #include "phydat.h"
 #include "periph/gpio.h"
+#include "saul/periph.h"
 
 
 static int read(const void *dev, phydat_t *res)
 {
-    gpio_t pin = *((const gpio_t *)dev);
-    res->val[0] = (gpio_read(pin)) ? 1 : 0;
+    const saul_gpio_params_t *p = (const saul_gpio_params_t *)dev;
+    int inverted = (p->flags & SAUL_GPIO_INVERTED);
+
+    res->val[0] = (gpio_read(p->pin)) ? !inverted : inverted;
+
     memset(&(res->val[1]), 0, 2 * sizeof(int16_t));
     res->unit = UNIT_BOOL;
     res->scale = 0;
@@ -37,8 +41,11 @@ static int read(const void *dev, phydat_t *res)
 
 static int write(const void *dev, phydat_t *state)
 {
-    gpio_t pin = *((const gpio_t *)dev);
-    gpio_write(pin, state->val[0]);
+    const saul_gpio_params_t *p = (const saul_gpio_params_t *)dev;
+    int inverted = (p->flags & SAUL_GPIO_INVERTED);
+    int value = (state->val[0] ? !inverted : inverted);
+
+    gpio_write(p->pin, value);
     return 1;
 }
 
diff --git a/sys/auto_init/saul/auto_init_gpio.c b/sys/auto_init/saul/auto_init_gpio.c
index 0632502a29aa5775d60b085d8fad74110d0fe99c..c2a400a4bb80d0edcf2061348c87ef5a7e7bc49d 100644
--- a/sys/auto_init/saul/auto_init_gpio.c
+++ b/sys/auto_init/saul/auto_init_gpio.c
@@ -32,11 +32,6 @@
  */
 #define SAUL_GPIO_NUMOF    (sizeof(saul_gpio_params)/sizeof(saul_gpio_params[0]))
 
-/**
- * @brief   Allocate memory for the device descriptors
- */
-static gpio_t saul_gpios[SAUL_GPIO_NUMOF];
-
 /**
  * @brief   Memory for the registry entries
  */
@@ -60,8 +55,7 @@ void auto_init_gpio(void)
 
         LOG_DEBUG("[auto_init_saul] initializing GPIO #%u\n", i);
 
-        saul_gpios[i] = p->pin;
-        saul_reg_entries[i].dev = &(saul_gpios[i]);
+        saul_reg_entries[i].dev = p;
         saul_reg_entries[i].name = p->name;
         if ((p->mode == GPIO_IN) || (p->mode == GPIO_IN_PD) ||
             (p->mode == GPIO_IN_PU)) {
@@ -72,6 +66,12 @@ void auto_init_gpio(void)
         }
         /* initialize the GPIO pin */
         gpio_init(p->pin, p->mode);
+        /* set initial pin state if configured */
+        if (p->flags & (SAUL_GPIO_INIT_CLEAR | SAUL_GPIO_INIT_SET)) {
+            phydat_t s;
+            s.val[0] = (p->flags & SAUL_GPIO_INIT_SET);
+            saul_reg_entries[i].driver->write(p, &s);
+        }
         /* add to registry */
         saul_reg_add(&(saul_reg_entries[i]));
     }
diff --git a/sys/include/saul_reg.h b/sys/include/saul_reg.h
index 624e1db1b3cbbbd47c7dba94d2fce4bcc5c5ac7e..df9fa19eb3817e4a90565941b32ddebdbe055831 100644
--- a/sys/include/saul_reg.h
+++ b/sys/include/saul_reg.h
@@ -38,7 +38,7 @@ extern "C" {
  */
 typedef struct saul_reg {
     struct saul_reg *next;          /**< pointer to the next device */
-    void *dev;                      /**< pointer to the device descriptor */
+    const void *dev;                /**< pointer to the device descriptor */
     const char *name;               /**< string identifier for the device */
     saul_driver_t const *driver;    /**< the devices read callback */
 } saul_reg_t;