Index: kernel/arch/abs32le/src/abs32le.c
===================================================================
--- kernel/arch/abs32le/src/abs32le.c	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/abs32le/src/abs32le.c	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -136,5 +136,5 @@
 }
 
-void early_putchar(wchar_t ch)
+void early_putwchar(wchar_t ch)
 {
 }
Index: kernel/arch/amd64/src/asm.S
===================================================================
--- kernel/arch/amd64/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/amd64/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -412,5 +412,5 @@
  *
  */
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 #if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
 
@@ -443,9 +443,9 @@
 	/* Sanity check for the cursor on screen */
 	cmp $2000, %ax
-	jb early_putchar_cursor_ok
+	jb early_putwchar_cursor_ok
 
 		movw $1998, %ax
 
-	early_putchar_cursor_ok:
+	early_putwchar_cursor_ok:
 
 	movw %ax, %bx
@@ -456,5 +456,5 @@
 
 	cmp $0x0a, %al
-	jne early_putchar_backspace
+	jne early_putwchar_backspace
 
 		/* Interpret newline */
@@ -470,20 +470,20 @@
 		subw %dx, %bx
 
-		jmp early_putchar_skip
-
-	early_putchar_backspace:
+		jmp early_putwchar_skip
+
+	early_putwchar_backspace:
 
 		cmp $0x08, %al
-		jne early_putchar_print
+		jne early_putwchar_print
 
 		/* Interpret backspace */
 
 		cmp $0x0000, %bx
-		je early_putchar_skip
+		je early_putwchar_skip
 
 		dec %bx
-		jmp early_putchar_skip
-
-	early_putchar_print:
+		jmp early_putwchar_skip
+
+	early_putwchar_print:
 
 		/* Print character */
@@ -493,9 +493,9 @@
 		inc %bx
 
-	early_putchar_skip:
+	early_putwchar_skip:
 
 	/* Sanity check for the cursor on the last line */
 	cmp $2000, %bx
-	jb early_putchar_no_scroll
+	jb early_putwchar_no_scroll
 
 		/* Scroll the screen (24 rows) */
@@ -513,5 +513,5 @@
 		movw $1920, %bx
 
-	early_putchar_no_scroll:
+	early_putwchar_no_scroll:
 
 	/* Write bits 8 - 15 of the cursor address */
@@ -540,3 +540,3 @@
 
 	ret
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
Index: kernel/arch/arm32/src/asm.S
===================================================================
--- kernel/arch/arm32/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/arm32/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -98,5 +98,5 @@
 	ldmia sp!, {r4, r5, pc}
 
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 	mov pc, lr
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
Index: kernel/arch/ia32/src/asm.S
===================================================================
--- kernel/arch/ia32/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/ia32/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -451,5 +451,5 @@
  *
  */
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 
 #if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
@@ -484,9 +484,9 @@
 	/* Sanity check for the cursor on screen */
 	cmp $2000, %ax
-	jb early_putchar_cursor_ok
+	jb early_putwchar_cursor_ok
 
 		movw $1998, %ax
 
-	early_putchar_cursor_ok:
+	early_putwchar_cursor_ok:
 
 	movw %ax, %bx
@@ -497,5 +497,5 @@
 
 	cmp $0x0a, %al
-	jne early_putchar_backspace
+	jne early_putwchar_backspace
 
 		/* Interpret newline */
@@ -511,20 +511,20 @@
 		subw %dx, %bx
 
-		jmp early_putchar_skip
-
-	early_putchar_backspace:
+		jmp early_putwchar_skip
+
+	early_putwchar_backspace:
 
 		cmp $0x08, %al
-		jne early_putchar_print
+		jne early_putwchar_print
 
 		/* Interpret backspace */
 
 		cmp $0x0000, %bx
-		je early_putchar_skip
+		je early_putwchar_skip
 
 		dec %bx
-		jmp early_putchar_skip
-
-	early_putchar_print:
+		jmp early_putwchar_skip
+
+	early_putwchar_print:
 
 		/* Print character */
@@ -534,9 +534,9 @@
 		inc %bx
 
-	early_putchar_skip:
+	early_putwchar_skip:
 
 	/* Sanity check for the cursor on the last line */
 	cmp $2000, %bx
-	jb early_putchar_no_scroll
+	jb early_putwchar_no_scroll
 
 		/* Scroll the screen (24 rows) */
@@ -554,5 +554,5 @@
 		movw $1920, %bx
 
-	early_putchar_no_scroll:
+	early_putwchar_no_scroll:
 
 	/* Write bits 8 - 15 of the cursor address */
@@ -583,4 +583,4 @@
 
 	ret
-FUNCTION_END(early_putchar)
-
+FUNCTION_END(early_putwchar)
+
Index: kernel/arch/ia64/src/asm.S
===================================================================
--- kernel/arch/ia64/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/ia64/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -191,5 +191,5 @@
 FUNCTION_END(switch_to_userspace)
 
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 	br.ret.sptk.many b0
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
Index: kernel/arch/ia64/src/drivers/ski.c
===================================================================
--- kernel/arch/ia64/src/drivers/ski.c	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/ia64/src/drivers/ski.c	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -58,8 +58,8 @@
 };
 
-static void ski_putchar(outdev_t *, const wchar_t);
+static void ski_putwchar(outdev_t *, const wchar_t);
 
 static outdev_operations_t skidev_ops = {
-	.write = ski_putchar,
+	.write = ski_putwchar,
 	.redraw = NULL,
 	.scroll_up = NULL,
@@ -166,5 +166,5 @@
 }
 
-static void ski_do_putchar(const wchar_t ch)
+static void ski_do_putchar(char ch)
 {
 	asm volatile (
@@ -187,5 +187,5 @@
  *
  */
-static void ski_putchar(outdev_t *dev, const wchar_t ch)
+static void ski_putwchar(outdev_t *dev, wchar_t ch)
 {
 	// TODO FIXME:
@@ -198,6 +198,7 @@
 
 			ski_do_putchar(ch);
-		} else
-			ski_do_putchar(U_SPECIAL);
+		} else {
+			ski_do_putchar('?');
+		}
 	}
 }
Index: kernel/arch/mips32/src/asm.S
===================================================================
--- kernel/arch/mips32/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/mips32/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -296,6 +296,6 @@
 FUNCTION_END(fpu_context_restore)
 
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 	j $ra
 	nop
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
Index: kernel/arch/mips32/src/mach/malta/malta.c
===================================================================
--- kernel/arch/mips32/src/mach/malta/malta.c	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/mips32/src/mach/malta/malta.c	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -81,5 +81,5 @@
     (yamon_print_count_ptr_t) YAMON_SUBR_PRINT_COUNT;
 
-static void yamon_putchar(outdev_t *dev, const wchar_t wch)
+static void yamon_putwchar(outdev_t *dev, const wchar_t wch)
 {
 
@@ -91,5 +91,5 @@
 static outdev_t yamon_outdev;
 static outdev_operations_t yamon_outdev_ops = {
-	.write = yamon_putchar,
+	.write = yamon_putwchar,
 	.redraw = NULL,
 	.scroll_up = NULL,
Index: kernel/arch/ppc32/src/asm.S
===================================================================
--- kernel/arch/ppc32/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/ppc32/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -265,5 +265,5 @@
 	blr
 
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 	blr
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
Index: kernel/arch/riscv64/include/arch/drivers/ucb.h
===================================================================
--- kernel/arch/riscv64/include/arch/drivers/ucb.h	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/riscv64/include/arch/drivers/ucb.h	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -42,5 +42,5 @@
 extern void htif_init(volatile uint64_t *, volatile uint64_t *);
 extern outdev_t *htifout_init(void);
-extern void htif_putchar(outdev_t *, const wchar_t);
+extern void htif_putwchar(outdev_t *, const wchar_t);
 
 #endif
Index: kernel/arch/riscv64/src/asm.S
===================================================================
--- kernel/arch/riscv64/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/riscv64/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -35,7 +35,7 @@
 FUNCTION_END(asm_delay_loop)
 
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 	ret
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
 
 FUNCTION_BEGIN(cpu_halt)
Index: kernel/arch/riscv64/src/drivers/ucb.c
===================================================================
--- kernel/arch/riscv64/src/drivers/ucb.c	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/riscv64/src/drivers/ucb.c	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -42,5 +42,5 @@
 
 static outdev_operations_t htifdev_ops = {
-	.write = htif_putchar,
+	.write = htif_putwchar,
 	.redraw = NULL,
 	.scroll_up = NULL,
@@ -85,5 +85,5 @@
 }
 
-void htif_putchar(outdev_t *dev, const wchar_t ch)
+void htif_putwchar(outdev_t *dev, const wchar_t ch)
 {
 	if (ascii_check(ch))
Index: kernel/arch/sparc64/src/asm.S
===================================================================
--- kernel/arch/sparc64/src/asm.S	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/sparc64/src/asm.S	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -189,6 +189,6 @@
 	mov %g0, %o0  /* return 0 on failure */
 
-FUNCTION_BEGIN(early_putchar)
+FUNCTION_BEGIN(early_putwchar)
 	retl
 	nop
-FUNCTION_END(early_putchar)
+FUNCTION_END(early_putwchar)
Index: kernel/arch/sparc64/src/drivers/niagara.c
===================================================================
--- kernel/arch/sparc64/src/drivers/niagara.c	(revision 904b1bc3e43b98f81bec9e9296b154371c383776)
+++ kernel/arch/sparc64/src/drivers/niagara.c	(revision fc0b2a8b439bd4294aa93f37af1e7fe305fbee77)
@@ -58,9 +58,9 @@
 static niagara_instance_t *instance = NULL;
 
-static void niagara_putchar(outdev_t *, const wchar_t);
+static void niagara_putwchar(outdev_t *, const wchar_t);
 
 /** Character device operations */
 static outdev_operations_t niagara_ops = {
-	.write = niagara_putchar,
+	.write = niagara_putwchar,
 	.redraw = NULL,
 	.scroll_up = NULL,
@@ -96,5 +96,5 @@
 
 /** Write a single character to the standard output. */
-static inline void do_putchar(const char c)
+static inline void do_putchar(char c)
 {
 	/* Repeat until the buffer is non-full */
@@ -104,10 +104,14 @@
 
 /** Write a single character to the standard output. */
-static void niagara_putchar(outdev_t *dev, const wchar_t ch)
+static void niagara_putwchar(outdev_t *dev, wchar_t ch)
 {
 	if ((!outbuf_parea.mapped) || (console_override)) {
-		do_putchar(ch);
-		if (ch == '\n')
-			do_putchar('\r');
+		if (ascii_check(ch)) {
+			do_putchar(ch);
+			if (ch == '\n')
+				do_putchar('\r');
+		} else {
+			do_putchar('?');
+		}
 	}
 }
