Index: kernel/generic/src/console/kconsole.c
===================================================================
--- kernel/generic/src/console/kconsole.c	(revision fdfb24eeffcfac57ce3048026b204ef70bf13003)
+++ kernel/generic/src/console/kconsole.c	(revision 888c06e05177b71e23a0f4f5636be16622ad9463)
@@ -39,24 +39,23 @@
  */
 
+#include <adt/list.h>
+#include <arch.h>
 #include <assert.h>
-#include <console/kconsole.h>
-#include <console/console.h>
 #include <console/chardev.h>
 #include <console/cmd.h>
+#include <console/console.h>
+#include <console/kconsole.h>
 #include <console/prompt.h>
+#include <debug.h>
+#include <errno.h>
+#include <halt.h>
+#include <macros.h>
+#include <panic.h>
 #include <stdio.h>
-#include <panic.h>
+#include <stdlib.h>
+#include <str.h>
+#include <symtab.h>
+#include <sysinfo/sysinfo.h>
 #include <typedefs.h>
-#include <adt/list.h>
-#include <arch.h>
-#include <macros.h>
-#include <debug.h>
-#include <halt.h>
-#include <str.h>
-#include <sysinfo/sysinfo.h>
-#include <symtab.h>
-#include <errno.h>
-#include <putchar.h>
-#include <stdlib.h>
 
 /** Simple kernel console.
@@ -158,9 +157,10 @@
 
 /** Print count times a character */
-_NO_TRACE static void print_cc(char32_t ch, size_t count)
-{
-	size_t i;
-	for (i = 0; i < count; i++)
-		putuchar(ch);
+_NO_TRACE static void print_cc(char ch, size_t count)
+{
+	// FIXME: only lock once
+
+	for (size_t i = 0; i < count; i++)
+		putstr(&ch, 1);
 }
 
@@ -347,5 +347,5 @@
 		if (ch == '\n') {
 			/* Enter */
-			putuchar(ch);
+			putstr("\n", 1);
 			break;
 		}
@@ -358,5 +358,5 @@
 			if (wstr_remove(current, position - 1)) {
 				position--;
-				putuchar('\b');
+				putstr("\b", 1);
 				printf("%ls ", current + position);
 				print_cc('\b', wstr_length(current) - position + 1);
@@ -368,8 +368,13 @@
 			/* Tab completion */
 
-			/* Move to the end of the word */
-			for (; (current[position] != 0) && (!isspace(current[position]));
-			    position++)
-				putuchar(current[position]);
+			size_t i = position;
+			while (current[i] && !isspace(current[i]))
+				i++;
+
+			char32_t stash = current[i];
+			current[i] = 0;
+			printf("%ls", &current[position]);
+			current[i] = stash;
+			position = i;
 
 			/*
@@ -430,11 +435,7 @@
 			 */
 			size_t off = 0;
-			size_t i = 0;
-			while ((ch = str_decode(tmp, &off, STR_NO_LIMIT)) != 0) {
+			for (size_t i = 0; (ch = str_decode(tmp, &off, STR_NO_LIMIT)); i++)
 				if (!wstr_linsert(current, ch, position + i, MAX_CMDLINE))
 					break;
-
-				i++;
-			}
 
 			if (found > 1) {
@@ -466,5 +467,5 @@
 			/* Left */
 			if (position > 0) {
-				putuchar('\b');
+				putstr("\b", 1);
 				position--;
 			}
@@ -475,5 +476,5 @@
 			/* Right */
 			if (position < wstr_length(current)) {
-				putuchar(current[position]);
+				printf("%lc", current[position]);
 				position++;
 			}
