diff --git a/native/drivers/native-uart0.c b/native/drivers/native-uart0.c
index fc5eed29c3a80bb9a9b71d0a9b2d998f80af0a9a..9f77a72d0c9d2cc3cc67b87d30fad600dcc10135 100644
--- a/native/drivers/native-uart0.c
+++ b/native/drivers/native-uart0.c
@@ -5,6 +5,7 @@
 #include <err.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <stdlib.h>
 
 #include <sys/select.h>
 
@@ -19,7 +20,27 @@ fd_set _native_uart_rfds;
 
 inline int uart0_puts(char *astring, int length)
 {
-    return puts(astring);
+    int nwritten, offset;
+
+    nwritten = 0;
+    offset = 0;
+
+    _native_in_syscall = 1;
+
+    while ((length > 0) &&(nwritten = write(_native_uart_out, astring+offset, length-offset)) > 0) {
+        offset += nwritten;
+    }
+    if (nwritten == -1) {
+        err(EXIT_FAILURE, "uart0_puts: write");
+    }
+    else if ((length > 0) && (nwritten == 0)) {
+        /* XXX: handle properly */
+        errx(EXIT_FAILURE, "uart0_puts: Could not write to stdout. I don't know what to do now.");
+    }
+
+    _native_in_syscall = 0;
+
+    return length;
 }
 
 void _native_handle_uart0_input()