Index: uspace/srv/hid/output/ctl/serial.c
===================================================================
--- uspace/srv/hid/output/ctl/serial.c	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/ctl/serial.c	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -105,4 +105,11 @@
 }
 
+static void serial_flush(outdev_t *dev)
+{
+	vt100_state_t *state = (vt100_state_t *) dev->data;
+
+	vt100_flush(state);
+}
+
 static outdev_ops_t serial_ops = {
 	.yield = serial_yield,
@@ -111,13 +118,14 @@
 	.get_caps = serial_get_caps,
 	.cursor_update = serial_cursor_update,
-	.char_update = serial_char_update
+	.char_update = serial_char_update,
+	.flush = serial_flush
 };
 
 int serial_init(vt100_putchar_t putchar_fn,
-    vt100_control_puts_t control_puts_fn)
+    vt100_control_puts_t control_puts_fn, vt100_flush_t flush_fn)
 {
 	vt100_state_t *state =
 	    vt100_state_create(SERIAL_COLS, SERIAL_ROWS, putchar_fn,
-	    control_puts_fn);
+	    control_puts_fn, flush_fn);
 	if (state == NULL)
 		return ENOMEM;
Index: uspace/srv/hid/output/ctl/serial.h
===================================================================
--- uspace/srv/hid/output/ctl/serial.h	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/ctl/serial.h	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -36,5 +36,5 @@
 #include "../proto/vt100.h"
 
-extern int serial_init(vt100_putchar_t, vt100_control_puts_t);
+extern int serial_init(vt100_putchar_t, vt100_control_puts_t, vt100_flush_t);
 
 #endif
Index: uspace/srv/hid/output/output.c
===================================================================
--- uspace/srv/hid/output/output.c	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/output.c	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -219,4 +219,6 @@
 		dev->ops.cursor_update(dev, prev_col, prev_row, col, row,
 		    visible);
+		dev->ops.flush(dev);
+
 	}
 	
@@ -342,5 +344,8 @@
 			}
 		}
-	}
+		
+		dev->ops.flush(dev);
+	}
+	
 	
 	async_answer_0(iid, EOK);
@@ -380,6 +385,7 @@
 			}
 		}
-	}
-	
+		dev->ops.flush(dev);
+
+	}
 	async_answer_0(iid, EOK);
 }
Index: uspace/srv/hid/output/output.h
===================================================================
--- uspace/srv/hid/output/output.h	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/output.h	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -52,4 +52,5 @@
 	    sysarg_t prev_row, sysarg_t col, sysarg_t row, bool visible);
 	void (* char_update)(struct outdev *dev, sysarg_t col, sysarg_t row);
+	void (* flush)(struct outdev *dev);
 } outdev_ops_t;
 
Index: uspace/srv/hid/output/port/chardev.c
===================================================================
--- uspace/srv/hid/output/port/chardev.c	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/port/chardev.c	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -46,4 +46,8 @@
 #include "chardev.h"
 
+enum {
+	chardev_buf_size = 4096
+};
+
 static char *console;
 
@@ -53,21 +57,40 @@
 static service_id_t console_cat_id;
 
+static uint8_t chardev_buf[chardev_buf_size];
+static size_t chardev_bused;
+
 static FIBRIL_MUTEX_INITIALIZE(discovery_lock);
 static bool discovery_finished;
 static FIBRIL_CONDVAR_INITIALIZE(discovery_cv);
 
+static void chardev_flush(void)
+{
+	size_t nwr;
+
+	if (chardev_bused == 0)
+		return;
+
+	chardev_write(chardev, chardev_buf, chardev_bused, &nwr);
+	/* XXX Handle error */
+
+	chardev_bused = 0;
+}
+
 static void chardev_putchar(wchar_t ch)
 {
-	uint8_t byte = (uint8_t) ch;
-	size_t nwr;
-	chardev_write(chardev, &byte, 1, &nwr);
-	/* XXX Handle error */
+	if (chardev_bused == chardev_buf_size)
+		chardev_flush();
+	if (!ascii_check(ch))
+		ch = '?';
+	chardev_buf[chardev_bused++] = (uint8_t) ch;
 }
 
 static void chardev_control_puts(const char *str)
 {
-	size_t nwr;
-	chardev_write(chardev, (void *) str, str_size(str), &nwr);
-	/* XXX Handle error */
+	const char *p;
+
+	p = str;
+	while (*p != '\0')
+		chardev_putchar(*p++);
 }
 
@@ -175,5 +198,5 @@
 	}
 
-	serial_init(chardev_putchar, chardev_control_puts);
+	serial_init(chardev_putchar, chardev_control_puts, chardev_flush);
 
 	discovery_finished = true;
Index: uspace/srv/hid/output/port/ega.c
===================================================================
--- uspace/srv/hid/output/port/ega.c	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/port/ega.c	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -169,4 +169,8 @@
 }
 
+static void ega_flush(outdev_t *dev)
+{
+}
+
 static outdev_ops_t ega_ops = {
 	.yield = ega_yield,
@@ -175,5 +179,6 @@
 	.get_caps = ega_get_caps,
 	.cursor_update = ega_cursor_update,
-	.char_update = ega_char_update
+	.char_update = ega_char_update,
+	.flush = ega_flush
 };
 
Index: uspace/srv/hid/output/proto/vt100.c
===================================================================
--- uspace/srv/hid/output/proto/vt100.c	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/proto/vt100.c	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -139,5 +139,6 @@
 
 vt100_state_t *vt100_state_create(sysarg_t cols, sysarg_t rows,
-    vt100_putchar_t putchar_fn, vt100_control_puts_t control_puts_fn)
+    vt100_putchar_t putchar_fn, vt100_control_puts_t control_puts_fn,
+	vt100_flush_t flush_fn)
 {
 	vt100_state_t *state = malloc(sizeof(vt100_state_t));
@@ -147,4 +148,5 @@
 	state->putchar = putchar_fn;
 	state->control_puts = control_puts_fn;
+	state->flush = flush_fn;
 	
 	state->cols = cols;
@@ -228,4 +230,9 @@
 }
 
+void vt100_flush(vt100_state_t *state)
+{
+	state->flush();
+}
+
 /** @}
  */
Index: uspace/srv/hid/output/proto/vt100.h
===================================================================
--- uspace/srv/hid/output/proto/vt100.h	(revision f30052384594e837924dcd017e96ea8752aa676f)
+++ uspace/srv/hid/output/proto/vt100.h	(revision b5abaf7c8551d1f27dee4024aa0f8824ee2e9317)
@@ -37,4 +37,5 @@
 typedef void (* vt100_putchar_t)(wchar_t ch);
 typedef void (* vt100_control_puts_t)(const char *str);
+typedef void (* vt100_flush_t)(void);
 
 typedef struct {
@@ -48,8 +49,9 @@
 	vt100_putchar_t putchar;
 	vt100_control_puts_t control_puts;
+	vt100_flush_t flush;
 } vt100_state_t;
 
 extern vt100_state_t *vt100_state_create(sysarg_t, sysarg_t, vt100_putchar_t,
-    vt100_control_puts_t);
+    vt100_control_puts_t, vt100_flush_t);
 extern void vt100_state_destroy(vt100_state_t *);
 
@@ -62,4 +64,5 @@
 extern void vt100_cursor_visibility(vt100_state_t *, bool);
 extern void vt100_putchar(vt100_state_t *, wchar_t);
+extern void vt100_flush(vt100_state_t *);
 
 #endif
