diff --git a/boards/arduino-due/include/periph_conf.h b/boards/arduino-due/include/periph_conf.h
index 1dce388d692a300816e24e45648d79379d27642f..e833c5abc5bf8163a2f2afee70475fa03deec6df 100644
--- a/boards/arduino-due/include/periph_conf.h
+++ b/boards/arduino-due/include/periph_conf.h
@@ -68,45 +68,37 @@ static const timer_conf_t timer_config[] = {
  */
 static const uart_conf_t uart_config[] = {
     {
-        .dev     = (Uart *)UART,
-        .rx_port = PIOA,
-        .tx_port = PIOA,
-        .rx_pin  = 8,
-        .tx_pin  = 9,
-        .mux     = GPIO_MUX_A,
-        .pmc_id  = ID_UART,
-        .irqn    = UART_IRQn
+        .dev    = (Uart *)UART,
+        .rx_pin = GPIO_PIN(PA, 8),
+        .tx_pin = GPIO_PIN(PA, 9),
+        .mux    = GPIO_MUX_A,
+        .pmc_id = ID_UART,
+        .irqn   = UART_IRQn
     },
     {
-        .dev     = (Uart *)USART0,
-        .rx_port = PIOA,
-        .tx_port = PIOA,
-        .rx_pin  = 10,
-        .tx_pin  = 11,
-        .mux     = GPIO_MUX_A,
-        .pmc_id  = ID_USART0,
-        .irqn    = USART0_IRQn
+        .dev    = (Uart *)USART0,
+        .rx_pin = GPIO_PIN(PA, 10),
+        .tx_pin = GPIO_PIN(PA, 11),
+        .mux    = GPIO_MUX_A,
+        .pmc_id = ID_USART0,
+        .irqn   = USART0_IRQn
     },
     {
-        .dev     = (Uart *)USART1,
-        .rx_port = PIOA,
-        .tx_port = PIOA,
-        .rx_pin  = 12,
-        .tx_pin  = 13,
-        .mux     = GPIO_MUX_A,
-        .pmc_id  = ID_USART1,
-        .irqn    = USART1_IRQn
+        .dev    = (Uart *)USART1,
+        .rx_pin = GPIO_PIN(PA, 12),
+        .tx_pin = GPIO_PIN(PA, 13),
+        .mux    = GPIO_MUX_A,
+        .pmc_id = ID_USART1,
+        .irqn   = USART1_IRQn
     },
     {
-        .dev     = (Uart *)USART3,
-        .rx_port = PIOD,
-        .tx_port = PIOD,
-        .rx_pin  = 4,
-        .tx_pin  = 5,
-        .mux     = GPIO_MUX_B,
-        .pmc_id  = ID_USART3,
-        .irqn    = USART3_IRQn
-    },
+        .dev    = (Uart *)USART3,
+        .rx_pin = GPIO_PIN(PD, 5),
+        .tx_pin = GPIO_PIN(PD, 4),
+        .mux    = GPIO_MUX_B,
+        .pmc_id = ID_USART3,
+        .irqn   = USART3_IRQn
+    }
 };
 
 /* define interrupt vectors */
diff --git a/boards/udoo/include/periph_conf.h b/boards/udoo/include/periph_conf.h
index c00e34921effb9570acc8dd54b9f96d2433a9990..2dbc5770efcc0fb3593295ddbf38a16d5f3c8905 100644
--- a/boards/udoo/include/periph_conf.h
+++ b/boards/udoo/include/periph_conf.h
@@ -66,11 +66,38 @@ static const timer_conf_t timer_config[] = {
  * @{
  */
 static const uart_conf_t uart_config[] = {
-    /* device, rx port, tx port, rx pin, tx pin, mux, PMC bit, IRGn line */
-    {(Uart *)UART,   PIOA, PIOA,  8,  9, GPIO_MUX_A, ID_UART,   UART_IRQn},
-    {(Uart *)USART0, PIOA, PIOA, 10, 11, GPIO_MUX_A, ID_USART0, USART0_IRQn},
-    {(Uart *)USART1, PIOA, PIOA, 12, 13, GPIO_MUX_A, ID_USART1, USART1_IRQn},
-    {(Uart *)USART3, PIOD, PIOD,  4,  5, GPIO_MUX_B, ID_USART3, USART3_IRQn}
+    {
+        .dev    = (Uart *)UART,
+        .rx_pin = GPIO_PIN(PA, 8),
+        .tx_pin = GPIO_PIN(PA, 9),
+        .mux    = GPIO_MUX_A,
+        .pmc_id = ID_UART,
+        .irqn   = UART_IRQn
+    },
+    {
+        .dev    = (Uart *)USART0,
+        .rx_pin = GPIO_PIN(PA, 10),
+        .tx_pin = GPIO_PIN(PA, 11),
+        .mux    = GPIO_MUX_A,
+        .pmc_id = ID_USART0,
+        .irqn   = USART0_IRQn
+    },
+    {
+        .dev    = (Uart *)USART1,
+        .rx_pin = GPIO_PIN(PA, 12),
+        .tx_pin = GPIO_PIN(PA, 13),
+        .mux    = GPIO_MUX_A,
+        .pmc_id = ID_USART1,
+        .irqn   = USART1_IRQn
+    },
+    {
+        .dev    = (Uart *)USART3,
+        .rx_pin = GPIO_PIN(PD, 5),
+        .tx_pin = GPIO_PIN(PD, 4),
+        .mux    = GPIO_MUX_B,
+        .pmc_id = ID_USART3,
+        .irqn   = USART3_IRQn
+    }
 };
 
 /* define interrupt vectors */
diff --git a/cpu/sam3/include/periph_cpu.h b/cpu/sam3/include/periph_cpu.h
index f8553ac08f4657d1fe5cc3fc67938c459e5e58ed..d82b5142d5098613f9d8ad2b75010b048445faa6 100644
--- a/cpu/sam3/include/periph_cpu.h
+++ b/cpu/sam3/include/periph_cpu.h
@@ -204,10 +204,8 @@ typedef struct {
  */
 typedef struct {
     Uart *dev;              /**< U(S)ART device used */
-    Pio *rx_port;           /**< port for RX pin */
-    Pio *tx_port;           /**< port for TX pin */
-    uint8_t rx_pin;         /**< RX pin */
-    uint8_t tx_pin;         /**< TX pin */
+    gpio_t rx_pin;          /**< RX pin */
+    gpio_t tx_pin;          /**< TX pin */
     gpio_mux_t mux;         /**< MUX used for pins */
     uint8_t pmc_id;         /**< bit in the PMC register of the device*/
     uint8_t irqn;           /**< interrupt number of the device */
diff --git a/cpu/sam3/periph/uart.c b/cpu/sam3/periph/uart.c
index 2cb028a9f8f9cfa5d39b43dc9c6d18e679a48b0a..5c6e0d9fd975524151178891b1a6d651eab3f0ce 100644
--- a/cpu/sam3/periph/uart.c
+++ b/cpu/sam3/periph/uart.c
@@ -22,6 +22,7 @@
 #include "cpu.h"
 #include "board.h"
 #include "periph/uart.h"
+#include "periph/gpio.h"
 
 #define ENABLE_DEBUG (0)
 #include "debug.h"
@@ -50,25 +51,28 @@ int uart_init(uart_t uart, uint32_t baudrate, uart_rx_cb_t rx_cb, void *arg)
     /* enable clock */
     uart_poweron(uart);
 
-    /* configure pins
-       TODO: optimize once GPIO refactoring is merged */
-    uart_config[uart].rx_port->PIO_PDR = (1 << uart_config[uart].rx_pin);
-    uart_config[uart].rx_port->PIO_ABSR &= ~(1 << uart_config[uart].rx_pin);
-    uart_config[uart].tx_port->PIO_ABSR |=  (uart_config[uart].mux <<
-                                             uart_config[uart].rx_pin);
-    uart_config[uart].tx_port->PIO_PDR = (1 << uart_config[uart].tx_pin);
-    uart_config[uart].tx_port->PIO_ABSR &= ~(1 << uart_config[uart].tx_pin);
-    uart_config[uart].tx_port->PIO_ABSR |=  (uart_config[uart].mux <<
-                                             uart_config[uart].tx_pin);
+    /* reset configuration */
+    dev->UART_CR = 0;
+    dev->UART_IDR = 0x0000ffff;
+
+    /* configure pins */
+    gpio_init_mux(uart_config[uart].tx_pin, uart_config[uart].mux);
+    if (rx_cb) {
+        gpio_init_mux(uart_config[uart].rx_pin, uart_config[uart].mux);
+    }
 
     /* configure baud rate and set mode to 8N1 */
     dev->UART_BRGR = (CLOCK_CORECLOCK / (16 * baudrate));
     dev->UART_MR = UART_MR_PAR_NO | US_MR_CHRL_8_BIT;
-    dev->UART_CR = UART_CR_RXEN | UART_CR_TXEN | UART_CR_RSTSTA;
 
-    /* enable RX interrupt */
-    NVIC_EnableIRQ(uart_config[uart].irqn);
-    dev->UART_IER = UART_IER_RXRDY;
+    if (rx_cb) {
+        dev->UART_CR = UART_CR_RXEN | UART_CR_TXEN | UART_CR_RSTSTA;
+        NVIC_EnableIRQ(uart_config[uart].irqn);
+        dev->UART_IER = UART_IER_RXRDY;
+    }
+    else {
+        dev->UART_CR = UART_CR_TXEN | UART_CR_RSTSTA;
+    }
 
     return UART_OK;
 }