Index: uspace/lib/c/generic/io/chargrid.c
===================================================================
--- uspace/lib/c/generic/io/chargrid.c	(revision 6ff23ff32c8aa9d6ad8d06f1743ca1b0d68c14bc)
+++ uspace/lib/c/generic/io/chargrid.c	(revision c8afd5a8029517aba09c3f07e907308d90b306a2)
@@ -140,5 +140,5 @@
  *
  */
-sysarg_t chargrid_putchar(chargrid_t *scrbuf, wchar_t ch, bool update)
+sysarg_t chargrid_putwchar(chargrid_t *scrbuf, wchar_t ch, bool update)
 {
 	assert(scrbuf->col < scrbuf->cols);
@@ -199,5 +199,5 @@
 
 	for (sysarg_t i = 0; i < spaces; i++)
-		flush += chargrid_putchar(scrbuf, ' ', true) - 1;
+		flush += chargrid_putwchar(scrbuf, ' ', true) - 1;
 
 	return flush;
@@ -228,10 +228,10 @@
 		scrbuf->row--;
 
-		chargrid_putchar(scrbuf, ' ', false);
+		chargrid_putwchar(scrbuf, ' ', false);
 		return 2;
 	}
 
 	scrbuf->col--;
-	chargrid_putchar(scrbuf, ' ', false);
+	chargrid_putwchar(scrbuf, ' ', false);
 	return 1;
 }
Index: uspace/lib/c/generic/io/io.c
===================================================================
--- uspace/lib/c/generic/io/io.c	(revision 6ff23ff32c8aa9d6ad8d06f1743ca1b0d68c14bc)
+++ uspace/lib/c/generic/io/io.c	(revision c8afd5a8029517aba09c3f07e907308d90b306a2)
@@ -46,4 +46,5 @@
 #include <ipc/loc.h>
 #include <adt/list.h>
+#include <wchar.h>
 #include "../private/io.h"
 #include "../private/stdio.h"
@@ -702,22 +703,40 @@
 }
 
-int fputc(wchar_t c, FILE *stream)
+wint_t fputwc(wchar_t wc, FILE *stream)
 {
 	char buf[STR_BOUNDS(1)];
 	size_t sz = 0;
 
-	if (chr_encode(c, buf, &sz, STR_BOUNDS(1)) == EOK) {
-		size_t wr = fwrite(buf, 1, sz, stream);
-
-		if (wr < sz)
-			return EOF;
-
-		return (int) c;
-	}
-
-	return EOF;
-}
-
-int putchar(wchar_t c)
+	if (chr_encode(wc, buf, &sz, STR_BOUNDS(1)) != EOK) {
+		errno = EILSEQ;
+		return WEOF;
+	}
+
+	size_t wr = fwrite(buf, 1, sz, stream);
+	if (wr < sz)
+		return WEOF;
+
+	return wc;
+}
+
+wint_t putwchar(wchar_t wc)
+{
+	return fputwc(wc, stdout);
+}
+
+int fputc(int c, FILE *stream)
+{
+	unsigned char b;
+	size_t wr;
+
+	b = (unsigned char) c;
+	wr = fwrite(&b, sizeof(b), 1, stream);
+	if (wr < 1)
+		return EOF;
+
+	return b;
+}
+
+int putchar(int c)
 {
 	return fputc(c, stdout);
Index: uspace/lib/c/generic/io/vprintf.c
===================================================================
--- uspace/lib/c/generic/io/vprintf.c	(revision 6ff23ff32c8aa9d6ad8d06f1743ca1b0d68c14bc)
+++ uspace/lib/c/generic/io/vprintf.c	(revision c8afd5a8029517aba09c3f07e907308d90b306a2)
@@ -54,5 +54,5 @@
 
 	while (offset < size) {
-		if (fputc(str[chars], (FILE *) stream) <= 0)
+		if (fputwc(str[chars], (FILE *) stream) <= 0)
 			break;
 
