diff --git a/src/include/vm_types.hpp b/src/include/vm_types.hpp
index 6f8b725..b53fc77 100644
--- a/src/include/vm_types.hpp
+++ b/src/include/vm_types.hpp
@@ -1,6 +1,7 @@
 #define MAX_SLOTS 256
 #define MAX_STACK_SIZE 64
 #define MAX_PRINT_BUFFER 1024
+#define MAX_PRINT_CURSOR MAX_PRINT_BUFFER - 1
 
 #define vt_null 0
 #define vt_identifier 1
@@ -12,6 +13,7 @@
 #define vt_string 7
 
 static char *printBuffer = (char *)malloc(MAX_PRINT_BUFFER);
+static int printBufferCursor = 0;
 
 typedef unsigned char byte;
 typedef unsigned char *byteref;
@@ -181,73 +183,85 @@ class Program
     return 1;
   }
 
-  void printf(const char *format, va_list args)
+  void flush()
   {
+    onSend(printBuffer, printBufferCursor);
+    printBufferCursor = 0;
     os_memset(printBuffer, 0, MAX_PRINT_BUFFER);
-    int len = 0;
+  }
+
+  void putchar(char c)
+  {
+    if (printBufferCursor >= MAX_PRINT_CURSOR)
+    {
+      flush();
+    }
 
+    printBuffer[printBufferCursor++] = c;
+
+    if (c == '\n')
+    {
+      flush();
+    }
+  }
+
+  void putchars(const char *c, int len)
+  {
+    int i = 0;
+
+    for (; i < len; i++)
+    {
+      putchar(c[i]);
+    }
+  }
+
+  void printf(const char *format, va_list args)
+  {
+
+    char *s = va_arg(args, char *);
     char *p = (char *)format;
+    char number[8];
 
     for (; *p; p++)
     {
-      if (len >= MAX_PRINT_BUFFER)
-        break;
-
       if (*p != '%')
       {
-        printBuffer[len++] = (*p);
+        putchar(*p);
         continue;
       }
+
       switch (*++p)
       {
       case 'd':
       {
-        if (sizeof(int) > MAX_PRINT_BUFFER - len)
-        {
-          break;
-        }
-
         int d = va_arg(args, int);
-        int c = os_sprintf(printBuffer + len, "%d", d);
-        len += c - 1;
+        int c = os_sprintf(number, "%d", d);
+        putchars(number, c);
         break;
       }
       case 'x':
       {
         int d = va_arg(args, int);
-        int c = os_sprintf(printBuffer + len, "%02x", d);
-        len += c - 1;
+        int c = os_sprintf(number, "%02x", d);
+        putchars(number, c);
         break;
       }
       case 'c':
       {
         char c = va_arg(args, int);
-        printBuffer[len++] = c;
+        putchar(c);
         break;
       }
       case 's':
       {
         char *s = va_arg(args, char *);
-        int slen = os_strlen(s);
-
-        if (slen > MAX_PRINT_BUFFER - len)
-        {
-          slen = MAX_PRINT_BUFFER - len - 1;
-        }
-
-        os_memcpy(printBuffer + len, s, slen);
-        len += slen;
+        putchars(s, strlen(s));
         break;
       }
       default:
-        printBuffer[len++] = (*p);
+        putchar(*p);
         break;
       }
     }
-
-    if (len)
-    {
-      onSend(printBuffer, len);
-    }
   }
 };
diff --git a/src/index.cpp b/src/index.cpp
index 70ffbe2..1d4afba 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -1,4 +1,4 @@
-#define WITH_DEBUG
+// #define WITH_DEBUG
 #define SERIAL_SPEED 115200
 #define __CHIP_ESP8266__
 
@@ -155,7 +155,6 @@ void onReceive(void *arg, char *data, unsigned short length)
 
 void onSend(char *data, int length)
 {
-  // TRACE("send %d bytes, state %d\n", length, conn->state);
   if (conn->state == ESPCONN_CONNECT || conn->state == ESPCONN_WRITE)
   {
     espconn_send(conn, (uint8 *)data, length);
@@ -164,7 +163,6 @@ void onSend(char *data, int length)
 
 void onHalt()
 {
-  TRACE("halt, state %d\n", conn->state);
   if (conn->state == ESPCONN_CONNECT)
   {
     espconn_disconnect(conn);