Index: uspace/lib/c/generic/str.c
===================================================================
--- uspace/lib/c/generic/str.c	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
+++ uspace/lib/c/generic/str.c	(revision dc5aa568a4c8addb5f59d28700a384a1570b43d0)
@@ -397,4 +397,31 @@
 	
 	return len;
+}
+
+/** Get character display width on a character cell display.
+ *
+ * @param ch	Character
+ * @return	Width of character in cells.
+ */
+size_t chr_width(wchar_t ch)
+{
+	return 1;
+}
+
+/** Get string display width on a character cell display.
+ *
+ * @param str	String
+ * @return	Width of string in cells.
+ */
+size_t str_width(const char *str)
+{
+	size_t width = 0;
+	size_t offset = 0;
+	wchar_t ch;
+	
+	while ((ch = str_decode(str, &offset, STR_NO_LIMIT)) != 0)
+		width += chr_width(ch);
+	
+	return width;
 }
 
Index: uspace/lib/c/include/str.h
===================================================================
--- uspace/lib/c/include/str.h	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
+++ uspace/lib/c/include/str.h	(revision dc5aa568a4c8addb5f59d28700a384a1570b43d0)
@@ -73,4 +73,7 @@
 extern size_t wstr_nlength(const wchar_t *str, size_t size);
 
+extern size_t chr_width(wchar_t ch);
+extern size_t str_width(const char *str);
+
 extern bool ascii_check(wchar_t ch);
 extern bool chr_check(wchar_t ch);
Index: uspace/lib/clui/tinput.c
===================================================================
--- uspace/lib/clui/tinput.c	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
+++ uspace/lib/clui/tinput.c	(revision dc5aa568a4c8addb5f59d28700a384a1570b43d0)
@@ -595,15 +595,15 @@
 {
 	unsigned int i;
-	/* Determine the maximum length of the completion in chars */
-	size_t max_length = 0;
+	/* Determine the maximum width of the completion in chars */
+	size_t max_width = 0;
 	for (i = 0; i < cnum; i++)
-		max_length = max(max_length, str_length(compl[i]));
-	
-	unsigned int cols = max(1, (ti->con_cols + 1) / (max_length + 1));
+		max_width = max(max_width, str_width(compl[i]));
+	
+	unsigned int cols = max(1, (ti->con_cols + 1) / (max_width + 1));
 	unsigned int padding = 0;
-	if ((cols * max_length) + (cols - 1) < ti->con_cols) {
-		padding = ti->con_cols - (cols * max_length) - (cols - 1);
-	}
-	unsigned int col_width = max_length + padding / cols;
+	if ((cols * max_width) + (cols - 1) < ti->con_cols) {
+		padding = ti->con_cols - (cols * max_width) - (cols - 1);
+	}
+	unsigned int col_width = max_width + padding / cols;
 	unsigned int rows = cnum / cols + ((cnum % cols) != 0);
 	
@@ -611,24 +611,26 @@
 	
 	for (row = 0; row < rows; row++) {
-		bool wlc = false;
+		unsigned int display_col = 0;
 		for (col = 0; col < cols; col++) {
 			size_t compl_idx = col * rows + row;
 			if (compl_idx >= cnum)
 				break;
-			if (col)
+			if (col) {
 				printf(" ");
+				display_col++;
+			}
 			printf("%s", compl[compl_idx]);
-			size_t compl_len = str_length(compl[compl_idx]);
-			if (col == cols -1) {
-				wlc = (compl_len == max_length);
-			}
-			else {
-				for (i = compl_len; i < col_width; i++) {
+			size_t compl_width = str_width(compl[compl_idx]);
+			display_col += compl_width;
+			if (col < cols - 1) {
+				for (i = compl_width; i < col_width; i++) {
 					printf(" ");
+					display_col++;
 				}
 			}
 		}
-		if (!wlc) printf("\n");
-	}
+		if ((display_col % ti->con_cols) > 0) printf("\n");
+	}
+	fflush(stdout);
 }
 
