Index: kernel/generic/include/console/chardev.h
===================================================================
--- kernel/generic/include/console/chardev.h	(revision 128359ebc085c950da1f7e34c3928f12654b438f)
+++ kernel/generic/include/console/chardev.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
@@ -55,5 +55,5 @@
 typedef struct {
 	/** Read character directly from device, assume interrupts disabled. */
-	wchar_t (*poll)(struct indev *);
+	char32_t (*poll)(struct indev *);
 
 	/** Signal out-of-band condition. */
@@ -68,5 +68,5 @@
 	/** Protects everything below. */
 	IRQ_SPINLOCK_DECLARE(lock);
-	wchar_t buffer[INDEV_BUFLEN];
+	char32_t buffer[INDEV_BUFLEN];
 	size_t counter;
 
@@ -82,5 +82,5 @@
 typedef struct {
 	/** Write character to output. */
-	void (*write)(struct outdev *, wchar_t);
+	void (*write)(struct outdev *, char32_t);
 
 	/** Redraw any previously cached characters. */
@@ -112,6 +112,6 @@
 extern void indev_initialize(const char *, indev_t *,
     indev_operations_t *);
-extern void indev_push_character(indev_t *, wchar_t);
-extern wchar_t indev_pop_character(indev_t *);
+extern void indev_push_character(indev_t *, char32_t);
+extern char32_t indev_pop_character(indev_t *);
 extern void indev_signal(indev_t *, indev_signal_t);
 
Index: kernel/generic/include/console/console.h
===================================================================
--- kernel/generic/include/console/console.h	(revision 128359ebc085c950da1f7e34c3928f12654b438f)
+++ kernel/generic/include/console/console.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
@@ -57,5 +57,5 @@
 extern outdev_t *stdout;
 
-extern void early_putwchar(wchar_t);
+extern void early_putuchar(char32_t);
 
 extern indev_t *stdin_wire(void);
@@ -66,8 +66,8 @@
 extern void kio_update(void *);
 extern void kio_flush(void);
-extern void kio_push_char(const wchar_t);
+extern void kio_push_char(const char32_t);
 SPINLOCK_EXTERN(kio_lock);
 
-extern wchar_t getc(indev_t *indev);
+extern char32_t getc(indev_t *indev);
 extern size_t gets(indev_t *indev, char *buf, size_t buflen);
 extern sys_errno_t sys_kio(int cmd, uspace_addr_t buf, size_t size);
Index: kernel/generic/include/printf/printf_core.h
===================================================================
--- kernel/generic/include/printf/printf_core.h	(revision 128359ebc085c950da1f7e34c3928f12654b438f)
+++ kernel/generic/include/printf/printf_core.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
@@ -38,4 +38,5 @@
 #include <stdarg.h>
 #include <stddef.h>
+#include <uchar.h>
 
 /** Structure for specifying output methods for different printf clones. */
@@ -45,5 +46,5 @@
 
 	/* Wide string output function, returns number of printed characters or EOF */
-	int (*wstr_write)(const wchar_t *, size_t, void *);
+	int (*wstr_write)(const char32_t *, size_t, void *);
 
 	/* User data - output stream specification, state, locks, etc. */
Index: kernel/generic/include/putchar.h
===================================================================
--- kernel/generic/include/putchar.h	(revision 128359ebc085c950da1f7e34c3928f12654b438f)
+++ kernel/generic/include/putchar.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
@@ -36,7 +36,7 @@
 #define KERN_PUTCHAR_H_
 
-#include <stddef.h>
+#include <uchar.h>
 
-extern void putwchar(wchar_t);
+extern void putuchar(char32_t);
 
 #endif
Index: kernel/generic/include/str.h
===================================================================
--- kernel/generic/include/str.h	(revision 128359ebc085c950da1f7e34c3928f12654b438f)
+++ kernel/generic/include/str.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
@@ -44,5 +44,5 @@
 
 /* Common Unicode characters */
-#define U_SPECIAL      '?'
+#define U_SPECIAL  '?'
 
 #define U_LEFT_ARROW   0x2190
@@ -69,36 +69,36 @@
 #define STR_BOUNDS(length)  ((length) << 2)
 
-extern wchar_t str_decode(const char *str, size_t *offset, size_t sz);
-extern errno_t chr_encode(wchar_t ch, char *str, size_t *offset, size_t sz);
+extern char32_t str_decode(const char *, size_t *, size_t);
+extern errno_t chr_encode(char32_t, char *, size_t *, size_t);
 
-extern size_t str_size(const char *str);
-extern size_t wstr_size(const wchar_t *str);
+extern size_t str_size(const char *);
+extern size_t wstr_size(const char32_t *);
 
-extern size_t str_lsize(const char *str, size_t max_len);
-extern size_t wstr_lsize(const wchar_t *str, size_t max_len);
+extern size_t str_lsize(const char *, size_t);
+extern size_t wstr_lsize(const char32_t *, size_t);
 
-extern size_t str_length(const char *str);
-extern size_t wstr_length(const wchar_t *wstr);
+extern size_t str_length(const char *);
+extern size_t wstr_length(const char32_t *);
 
-extern size_t str_nlength(const char *str, size_t size);
-extern size_t wstr_nlength(const wchar_t *str, size_t size);
+extern size_t str_nlength(const char *, size_t);
+extern size_t wstr_nlength(const char32_t *, size_t);
 
-extern bool ascii_check(wchar_t ch);
-extern bool chr_check(wchar_t ch);
+extern bool ascii_check(char32_t);
+extern bool chr_check(char32_t);
 
-extern int str_cmp(const char *s1, const char *s2);
-extern int str_lcmp(const char *s1, const char *s2, size_t max_len);
+extern int str_cmp(const char *, const char *);
+extern int str_lcmp(const char *, const char *, size_t);
 
-extern void str_cpy(char *dest, size_t size, const char *src);
-extern void str_ncpy(char *dest, size_t size, const char *src, size_t n);
-extern void wstr_to_str(char *dest, size_t size, const wchar_t *src);
+extern void str_cpy(char *, size_t, const char *);
+extern void str_ncpy(char *, size_t, const char *, size_t);
+extern void wstr_to_str(char *, size_t, const char32_t *);
 
-extern char *str_chr(const char *str, wchar_t ch);
+extern char *str_chr(const char *, char32_t);
 
-extern bool wstr_linsert(wchar_t *str, wchar_t ch, size_t pos, size_t max_pos);
-extern bool wstr_remove(wchar_t *str, size_t pos);
+extern bool wstr_linsert(char32_t *, char32_t, size_t, size_t);
+extern bool wstr_remove(char32_t *, size_t);
 
-extern char *str_dup(const char *src);
-extern char *str_ndup(const char *src, size_t n);
+extern char *str_dup(const char *);
+extern char *str_ndup(const char *, size_t);
 
 extern errno_t str_uint64_t(const char *, char **, unsigned int, bool,
@@ -108,6 +108,6 @@
 extern void bin_order_suffix(const uint64_t, uint64_t *, const char **, bool);
 
-extern const char *str_error(errno_t err);
-extern const char *str_error_name(errno_t err);
+extern const char *str_error(errno_t);
+extern const char *str_error_name(errno_t);
 
 #endif
Index: kernel/generic/include/uchar.h
===================================================================
--- kernel/generic/include/uchar.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
+++ kernel/generic/include/uchar.h	(revision 4db4718dad043fdba9393afca6e05aaf21c99c72)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2020 Martin Decky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup kernel_generic
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _KERN_UCHAR_H_
+#define _KERN_UCHAR_H_
+
+#include <_bits/uchar.h>
+
+#endif
+
+/** @}
+ */
