diff --git a/boards/nucleo-f334/Makefile.features b/boards/nucleo-f334/Makefile.features
index 53e45310683f633f1d7e4a9079e178ca34a722d3..a283c65cbe8326fd022f263c7eebfcb500651edb 100644
--- a/boards/nucleo-f334/Makefile.features
+++ b/boards/nucleo-f334/Makefile.features
@@ -1,4 +1,6 @@
 FEATURES_PROVIDED += periph_cpuid
+FEATURES_PROVIDED += periph_gpio
+FEATURES_PROVIDED += periph_spi
 FEATURES_PROVIDED += periph_uart
 FEATURES_PROVIDED += cpp
 FEATURES_MCU_GROUP = cortex_m4
diff --git a/boards/nucleo-f334/include/periph_conf.h b/boards/nucleo-f334/include/periph_conf.h
index 8d668f627d7a560b4e012e018824ce4449fd9957..9168aaf099117d16256e9b769ba56e874ffcd386 100644
--- a/boards/nucleo-f334/include/periph_conf.h
+++ b/boards/nucleo-f334/include/periph_conf.h
@@ -14,6 +14,7 @@
  * @brief       Peripheral MCU configuration for the nucleo-f334 board
  *
  * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
+ * @author      Kaspar Schleiser <kaspar.schleiser@fu-berlin.de>
  */
 
 #ifndef __PERIPH_CONF_H
@@ -78,6 +79,89 @@ extern "C" {
 #define UART_0_AF           7
 /** @} */
 
+/**
+ * @name SPI configuration
+ * @{
+ */
+#define SPI_NUMOF           (1U)
+#define SPI_0_EN            1
+#define SPI_IRQ_PRIO        1
+
+/* SPI 0 device config */
+#define SPI_0_DEV               SPI1
+#define SPI_0_CLKEN()           (RCC->APB2ENR |= RCC_APB2ENR_SPI1EN)
+#define SPI_0_CLKDIS()          (RCC->APB2ENR &= ~RCC_APB2ENR_SPI1EN)
+#define SPI_0_IRQ               SPI1_IRQn
+#define SPI_0_IRQ_HANDLER       isr_spi1
+/* SPI 0 pin configuration */
+#define SPI_0_SCK_PORT          GPIOA
+#define SPI_0_SCK_PIN           5
+#define SPI_0_SCK_AF            5
+#define SPI_0_SCK_PORT_CLKEN()  (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MISO_PORT         GPIOA
+#define SPI_0_MISO_PIN          6
+#define SPI_0_MISO_AF           5
+#define SPI_0_MISO_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+#define SPI_0_MOSI_PORT         GPIOA
+#define SPI_0_MOSI_PIN          7
+#define SPI_0_MOSI_AF           5
+#define SPI_0_MOSI_PORT_CLKEN() (RCC->AHBENR |= RCC_AHBENR_GPIOAEN)
+/** @} */
+
+/**
+ * @brief GPIO configuration
+ * @{
+ */
+#define GPIO_NUMOF          3
+#define GPIO_0_EN           1
+#define GPIO_1_EN           1
+#define GPIO_2_EN           1
+#define GPIO_IRQ_PRIO       1
+
+/* IRQ config */
+#define GPIO_IRQ_0          (-1)    /* not configured */
+#define GPIO_IRQ_1          (-1)    /* not configured */
+#define GPIO_IRQ_2          GPIO_2
+#define GPIO_IRQ_3          (-1)    /* not configured */
+#define GPIO_IRQ_4          (-1)    /* not configured */
+#define GPIO_IRQ_5          (-1)    /* not configured */
+#define GPIO_IRQ_6          (-1)    /* not configured */
+#define GPIO_IRQ_7          (-1)    /* not configured */
+#define GPIO_IRQ_8          (-1)    /* not configured */
+#define GPIO_IRQ_9          (-1)    /* not configured */
+#define GPIO_IRQ_10         GPIO_1
+#define GPIO_IRQ_11         (-1)    /* not configured */
+#define GPIO_IRQ_12         (-1)    /* not configured */
+#define GPIO_IRQ_13         GPIO_0
+#define GPIO_IRQ_14         (-1)    /* not configured */
+#define GPIO_IRQ_15         (-1)    /* not configured */
+
+/* GPIO channel 0 config */
+#define GPIO_0_PORT         GPIOC                   /* Used for user button 1 */
+#define GPIO_0_PIN          13
+#define GPIO_0_CLKEN()      (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define GPIO_0_EXTI_CFG1()  (SYSCFG->EXTICR[3] &= ~(SYSCFG_EXTICR4_EXTI13))
+#define GPIO_0_EXTI_CFG2()  (SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC)
+#define GPIO_0_IRQ          EXTI15_10_IRQn
+
+/* GPIO channel 1 config */
+#define GPIO_1_PORT         GPIOC
+#define GPIO_1_PIN          10
+#define GPIO_1_CLKEN()      (RCC->AHBENR |= RCC_AHBENR_GPIOCEN)
+#define GPIO_1_EXTI_CFG1()  (SYSCFG->EXTICR[2] &= ~(SYSCFG_EXTICR3_EXTI10))
+#define GPIO_1_EXTI_CFG2()  (SYSCFG->EXTICR[2] |= SYSCFG_EXTICR3_EXTI10_PC)
+#define GPIO_1_IRQ          EXTI15_10_IRQn
+
+/* GPIO channel 2 config */
+#define GPIO_2_PORT         GPIOD
+#define GPIO_2_PIN          2
+#define GPIO_2_CLKEN()      (RCC->AHBENR |= RCC_AHBENR_GPIODEN)
+#define GPIO_2_EXTI_CFG1()  (SYSCFG->EXTICR[0] &= ~(SYSCFG_EXTICR1_EXTI2))
+#define GPIO_2_EXTI_CFG2()  (SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI2_PD)
+#define GPIO_2_IRQ          EXTI2_TSC_IRQn
+
+/** @} */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpu/stm32f3/periph/gpio.c b/cpu/stm32f3/periph/gpio.c
index 820aa1bab1134ad634ef6150d2def3bcfb62601d..65614884597eeda9a6f9a26eb693b9d2dcea9283 100644
--- a/cpu/stm32f3/periph/gpio.c
+++ b/cpu/stm32f3/periph/gpio.c
@@ -126,6 +126,8 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
             pin = GPIO_11_PIN;
             break;
 #endif
+        default:
+            return -1;
     }
 
     port->MODER &= ~(2 << (2 * pin));           /* set pin to output mode */
@@ -229,6 +231,8 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
             pin = GPIO_11_PIN;
             break;
 #endif
+        default:
+            return -1;
     }
 
     port->MODER &= ~(3 << (2 * pin));           /* configure pin as input */
@@ -597,6 +601,8 @@ int gpio_read(gpio_t dev)
             pin = GPIO_11_PIN;
             break;
 #endif
+        default:
+            return -1;
     }
 
     if (port->MODER & (3 << (pin * 2))) {       /* if configured as output */
@@ -783,7 +789,7 @@ void isr_exti1(void)
     }
 }
 
-void isr_exti2(void)
+void isr_exti2_tsc(void)
 {
     if (EXTI->PR & EXTI_PR_PR2) {
         EXTI->PR |= EXTI_PR_PR2;        /* clear status bit by writing a 1 to it */
diff --git a/cpu/stm32f3/periph/spi.c b/cpu/stm32f3/periph/spi.c
index 2b401e6468a2ad427b0bfcf7884db97610407e3c..1631998a13348e17c21b16b740325baa5c539efe 100644
--- a/cpu/stm32f3/periph/spi.c
+++ b/cpu/stm32f3/periph/spi.c
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2014 Hamburg University of Applied Sciences
  * Copyright (C) 2014 Freie Universität Berlin
+ * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.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
@@ -18,6 +19,7 @@
  * @author      Fabian Nack <nack@inf.fu-berlin.de>
  * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
  * @author      Joakim Gebart <joakim.gebart@eistec.se>
+ * @author      Kaspar Schleiser <kaspar@schleiser.de>
  *
  * @}
  */
@@ -134,7 +136,9 @@ int spi_init_master(spi_t dev, spi_conf_t conf, spi_speed_t speed)
     spi_conf_pins(dev);
 
     /**************** SPI-Init *****************/
+#ifdef CPU_MODEL_STM32F303VC
     spi[dev]->I2SCFGR &= ~(SPI_I2SCFGR_I2SMOD);/* Activate the SPI mode (Reset I2SMOD bit in I2SCFGR register) */
+#endif
     spi[dev]->CR1 = 0;
     spi[dev]->CR2 = 0;
     /* the NSS (chip select) is managed purely by software */
@@ -142,8 +146,12 @@ int spi_init_master(spi_t dev, spi_conf_t conf, spi_speed_t speed)
     spi[dev]->CR1 |= (speed_divider << 3);  /* Define serial clock baud rate. 001 leads to f_PCLK/4 */
     spi[dev]->CR1 |= (SPI_CR1_MSTR);  /* 1: master configuration */
     spi[dev]->CR1 |= (conf);
+
+    spi[dev]->CR2 |= SPI_CR2_FRXTH; /* set FIFO reception threshold to 8bit (default: 16bit) */
+
     /* enable SPI */
     spi[dev]->CR1 |= (SPI_CR1_SPE);
+
     return 0;
 }
 
@@ -194,7 +202,9 @@ int spi_init_slave(spi_t dev, spi_conf_t conf, char(*cb)(char data))
     spi_conf_pins(dev);
 
     /***************** SPI-Init *****************/
+#ifdef CPU_MODEL_STM32F303VC
     spi[dev]->I2SCFGR &= ~(SPI_I2SCFGR_I2SMOD);
+#endif
     spi[dev]->CR1 = 0;
     spi[dev]->CR2 = 0;
     /* enable RXNEIE flag to enable rx buffer not empty interrupt */
@@ -299,20 +309,26 @@ int spi_release(spi_t dev)
 
 int spi_transfer_byte(spi_t dev, char out, char *in)
 {
-    if (dev >= SPI_NUMOF) {
-        return -1;
-    }
+    char tmp;
 
-    while (!(spi[dev]->SR & SPI_SR_TXE));
-    spi[dev]->DR = out;
+    /* recast to uint_8 to force 8bit access */
+    volatile uint8_t *DR = (volatile uint8_t*) &spi[dev]->DR;
 
-    while (!(spi[dev]->SR & SPI_SR_RXNE));
+    /* wait for an eventually previous byte to be readily transferred */
+    while(!(spi[dev]->SR & SPI_SR_TXE));
 
-    if (in != NULL) {
-        *in = spi[dev]->DR;
-    }
-    else {
-        spi[dev]->DR;
+    /* put next byte into the output register */
+    *DR = out;
+
+    /* wait until the current byte was successfully transferred */
+    while(!(spi[dev]->SR & SPI_SR_RXNE) );
+
+    /* read response byte to reset flags */
+    tmp = *DR;
+
+    /* 'return' response byte if wished for */
+    if (in) {
+        *in = tmp;
     }
 
     return 1;
@@ -320,7 +336,6 @@ int spi_transfer_byte(spi_t dev, char out, char *in)
 
 int spi_transfer_bytes(spi_t dev, char *out, char *in, unsigned int length)
 {
-
     int i, trans_ret, trans_bytes = 0;
     char in_temp;