Index: boot/arch/arm32/src/putchar.c
===================================================================
--- boot/arch/arm32/src/putchar.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/arm32/src/putchar.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -193,7 +193,8 @@
 /** Display a character
  *
- * @param ch	Character to display
- */
-void putwchar(const wchar_t ch)
+ * @param ch Character to display
+ *
+ */
+void putuchar(const char32_t ch)
 {
 	if (ch == '\n')
Index: boot/arch/arm64/src/main.c
===================================================================
--- boot/arch/arm64/src/main.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/arm64/src/main.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -99,6 +99,7 @@
  *
  * @param ch Character to display.
- */
-void putwchar(wchar_t ch)
+ *
+ */
+void putuchar(char32_t ch)
 {
 	if (ch == '\n')
Index: boot/arch/ia64/src/putchar.c
===================================================================
--- boot/arch/ia64/src/putchar.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/ia64/src/putchar.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -33,5 +33,5 @@
 #include <arch/ski.h>
 
-void putwchar(const wchar_t ch)
+void putuchar(const char32_t ch)
 {
 #ifdef MACHINE_ski
Index: boot/arch/mips32/src/putchar.c
===================================================================
--- boot/arch/mips32/src/putchar.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/mips32/src/putchar.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -57,5 +57,5 @@
 #endif
 
-void putwchar(const wchar_t ch)
+void putuchar(const char32_t ch)
 {
 	if (ascii_check(ch))
Index: boot/arch/ppc32/src/ofw.c
===================================================================
--- boot/arch/ppc32/src/ofw.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/ppc32/src/ofw.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -39,5 +39,5 @@
 }
 
-void putwchar(wchar_t ch)
+void putuchar(char32_t ch)
 {
 	if (ch == '\n')
Index: boot/arch/riscv64/src/putchar.c
===================================================================
--- boot/arch/riscv64/src/putchar.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/riscv64/src/putchar.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -33,5 +33,5 @@
 #include <arch/ucb.h>
 
-void putwchar(wchar_t ch)
+void putuchar(char32_t ch)
 {
 	if (ascii_check(ch))
Index: boot/arch/sparc64/src/ofw.c
===================================================================
--- boot/arch/sparc64/src/ofw.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/arch/sparc64/src/ofw.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -43,5 +43,5 @@
 #include <str.h>
 
-void putwchar(wchar_t ch)
+void putuchar(char32_t ch)
 {
 	if (ch == '\n')
Index: boot/generic/include/putchar.h
===================================================================
--- boot/generic/include/putchar.h	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/generic/include/putchar.h	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -37,6 +37,7 @@
 
 #include <stddef.h>
+#include <uchar.h>
 
-extern void putwchar(wchar_t);
+extern void putuchar(char32_t);
 
 #endif
Index: boot/generic/include/str.h
===================================================================
--- boot/generic/include/str.h	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/generic/include/str.h	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -38,13 +38,14 @@
 #include <stdbool.h>
 #include <stddef.h>
+#include <uchar.h>
 
 /* Common Unicode characters */
-#define U_SPECIAL      '?'
+#define U_SPECIAL  '?'
 
 /** No size limit constant */
 #define STR_NO_LIMIT  ((size_t) -1)
 
-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 *str, size_t *offset, size_t sz);
+extern errno_t chr_encode(char32_t ch, char *str, size_t *offset, size_t sz);
 
 extern size_t str_size(const char *str);
@@ -52,6 +53,6 @@
 extern size_t str_length(const char *str);
 
-extern bool ascii_check(wchar_t ch);
-extern bool chr_check(wchar_t ch);
+extern bool ascii_check(char32_t ch);
+extern bool chr_check(char32_t ch);
 
 extern int str_cmp(const char *s1, const char *s2);
Index: boot/generic/include/tar.h
===================================================================
--- boot/generic/include/tar.h	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/generic/include/tar.h	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -33,6 +33,6 @@
  */
 
-#ifndef TAR_H_
-#define TAR_H_
+#ifndef BOOT_TAR_H_
+#define BOOT_TAR_H_
 
 #include <stdbool.h>
Index: boot/generic/include/uchar.h
===================================================================
--- boot/generic/include/uchar.h	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
+++ boot/generic/include/uchar.h	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -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 BOOT_UCHAR_H_
+#define BOOT_UCHAR_H_
+
+#include <_bits/uchar.h>
+
+#endif
+
+/** @}
+ */
Index: boot/generic/src/printf_core.c
===================================================================
--- boot/generic/src/printf_core.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/generic/src/printf_core.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -504,5 +504,5 @@
 	while (true) {
 		i = nxt;
-		wchar_t uc = str_decode(fmt, &nxt, STR_NO_LIMIT);
+		char32_t uc = str_decode(fmt, &nxt, STR_NO_LIMIT);
 
 		if (uc == 0)
Index: boot/generic/src/str.c
===================================================================
--- boot/generic/src/str.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/generic/src/str.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -38,5 +38,5 @@
  * strings, called just strings are encoded in UTF-8. Wide strings (encoded
  * in UTF-32) are supported to a limited degree. A single character is
- * represented as wchar_t.@n
+ * represented as char32_t.@n
  *
  * Overview of the terminology:@n
@@ -46,6 +46,6 @@
  *  byte                  8 bits stored in uint8_t (unsigned 8 bit integer)
  *
- *  character             UTF-32 encoded Unicode character, stored in wchar_t
- *                        (signed 32 bit integer), code points 0 .. 1114111
+ *  character             UTF-32 encoded Unicode character, stored in char32_t
+ *                        (unsigned 32 bit integer), code points 0 .. 1114111
  *                        are valid
  *
@@ -57,5 +57,5 @@
  *
  *  wide string           UTF-32 encoded NULL-terminated Unicode string,
- *                        wchar_t *
+ *                        char32_t *
  *
  *  [wide] string size    number of BYTES in a [wide] string (excluding
@@ -96,5 +96,5 @@
  * A specific character inside a [wide] string can be referred to by:@n
  *
- *  pointer (char *, wchar_t *)
+ *  pointer (char *, char32_t *)
  *  byte offset (size_t)
  *  character index (size_t)
@@ -109,11 +109,4 @@
 #include <stdint.h>
 
-/** Check the condition if wchar_t is signed */
-#ifdef __WCHAR_UNSIGNED__
-#define WCHAR_SIGNED_CHECK(cond)  (true)
-#else
-#define WCHAR_SIGNED_CHECK(cond)  (cond)
-#endif
-
 /** Byte mask consisting of lowest @n bits (out of 8) */
 #define LO_MASK_8(n)  ((uint8_t) ((1 << (n)) - 1))
@@ -143,5 +136,5 @@
  *
  */
-wchar_t str_decode(const char *str, size_t *offset, size_t size)
+char32_t str_decode(const char *str, size_t *offset, size_t size)
 {
 	if (*offset + 1 > size)
@@ -180,5 +173,5 @@
 		return U_SPECIAL;
 
-	wchar_t ch = b0 & LO_MASK_8(b0_bits);
+	char32_t ch = b0 & LO_MASK_8(b0_bits);
 
 	/* Decode continuation bytes */
@@ -191,5 +184,5 @@
 
 		/* Shift data bits to ch */
-		ch = (ch << CONT_BITS) | (wchar_t) (b & LO_MASK_8(CONT_BITS));
+		ch = (ch << CONT_BITS) | (char32_t) (b & LO_MASK_8(CONT_BITS));
 		cbytes--;
 	}
@@ -213,5 +206,5 @@
  *         code was invalid.
  */
-errno_t chr_encode(const wchar_t ch, char *str, size_t *offset, size_t size)
+errno_t chr_encode(const char32_t ch, char *str, size_t *offset, size_t size)
 {
 	if (*offset >= size)
@@ -340,7 +333,7 @@
  *
  */
-bool ascii_check(wchar_t ch)
-{
-	if (WCHAR_SIGNED_CHECK(ch >= 0) && (ch <= 127))
+bool ascii_check(char32_t ch)
+{
+	if (ch <= 127)
 		return true;
 
@@ -353,7 +346,7 @@
  *
  */
-bool chr_check(wchar_t ch)
-{
-	if (WCHAR_SIGNED_CHECK(ch >= 0) && (ch <= 1114111))
+bool chr_check(char32_t ch)
+{
+	if (ch <= 1114111)
 		return true;
 
@@ -381,6 +374,6 @@
 int str_cmp(const char *s1, const char *s2)
 {
-	wchar_t c1 = 0;
-	wchar_t c2 = 0;
+	char32_t c1 = 0;
+	char32_t c2 = 0;
 
 	size_t off1 = 0;
@@ -421,5 +414,5 @@
 	size_t dest_off = 0;
 
-	wchar_t ch;
+	char32_t ch;
 	while ((ch = str_decode(src, &src_off, STR_NO_LIMIT)) != 0) {
 		if (chr_encode(ch, dest, &dest_off, size - 1) != EOK)
Index: boot/generic/src/vprintf.c
===================================================================
--- boot/generic/src/vprintf.c	(revision ffccdff0fd3f49751202889e457bdf900721bfad)
+++ boot/generic/src/vprintf.c	(revision 663f445f6ae6d51eff8cb7bcc345d4a411d3ff7e)
@@ -42,5 +42,5 @@
 
 	while (offset < size) {
-		putwchar(str_decode(str, &offset, size));
+		putuchar(str_decode(str, &offset, size));
 		chars++;
 	}
@@ -53,12 +53,12 @@
 	size_t offset = 0;
 	size_t chars = 0;
-	wchar_t uc;
+	char32_t uc;
 
 	while ((uc = str_decode(str, &offset, STR_NO_LIMIT)) != 0) {
-		putwchar(uc);
+		putuchar(uc);
 		chars++;
 	}
 
-	putwchar('\n');
+	putuchar('\n');
 	return chars;
 }
