Index: uspace/srv/fb/ega.c
===================================================================
--- uspace/srv/fb/ega.c	(revision f2b8cdc51775d0938392285312ca1ea65eca2f5b)
+++ uspace/srv/fb/ega.c	(revision b27eb713f5ef13504eb62785a068d0794d63e353)
@@ -84,4 +84,5 @@
 
 static unsigned attr_to_ega_style(const attrs_t *a);
+static uint8_t ega_glyph(wchar_t ch);
 
 static void clrscr(void)
@@ -144,7 +145,7 @@
 }
 
-static void printchar(char c, unsigned int row, unsigned int col)
-{
-	scr_addr[(row * scr_width + col) * 2] = c;
+static void printchar(wchar_t c, unsigned int row, unsigned int col)
+{
+	scr_addr[(row * scr_width + col) * 2] = ega_glyph(c);
 	scr_addr[(row * scr_width + col) * 2 + 1] = style;
 	
@@ -173,5 +174,5 @@
 			dp = &scr_addr[2 * ((y + j) * scr_width + (x + i))];
 
-			dp[0] = field->character;
+			dp[0] = ega_glyph(field->character);
 			dp[1] = attr_to_ega_style(&field->attrs);
 		}
@@ -249,4 +250,12 @@
 }
 
+static uint8_t ega_glyph(wchar_t ch)
+{
+	if (ch >= 0 && ch < 128)
+		return ch;
+
+	return '?';
+}
+
 static void ega_client_connection(ipc_callid_t iid, ipc_call_t *icall)
 {
@@ -254,5 +263,5 @@
 	ipc_callid_t callid;
 	ipc_call_t call;
-	char c;
+	wchar_t c;
 	unsigned int row, col, w, h;
 	int bg_color, fg_color, attr;
Index: uspace/srv/fb/serial_console.c
===================================================================
--- uspace/srv/fb/serial_console.c	(revision f2b8cdc51775d0938392285312ca1ea65eca2f5b)
+++ uspace/srv/fb/serial_console.c	(revision b27eb713f5ef13504eb62785a068d0794d63e353)
@@ -54,8 +54,10 @@
 
 static void serial_sgr(const unsigned int mode);
+void serial_putchar(wchar_t ch);
 
 static int scr_width;
 static int scr_height;
 static bool color = true;	/** True if producing color output. */
+static bool utf8 = false;	/** True if producing UTF8 output. */
 static putc_function_t putc_function;
 
@@ -105,5 +107,24 @@
 void serial_putchar(wchar_t ch)
 {
-	(*putc_function)(ch);
+	uint8_t buf[STR_BOUNDS(1)];
+	size_t offs;
+	size_t i;
+
+	if (utf8 != true) {
+		if (ch >= 0 && ch < 128)
+			(*putc_function)((uint8_t) ch);
+		else 
+			(*putc_function)('?');
+		return;
+	}
+
+	offs = 0;
+	if (chr_encode(ch, buf, &offs, STR_BOUNDS(1)) == EOK) {
+		for (i = 0; i < offs; i++)
+			(*putc_function)(buf[i]);
+	} else {
+		(*putc_function)('?');
+	}
+
 }
 
