diff -Naur busybox.orig/console-tools/Config.in busybox/console-tools/Config.in
--- busybox.orig/console-tools/Config.in	2008-07-15 22:00:21 +0000
+++ busybox/console-tools/Config.in	2008-08-05 23:00:00 +0000
@@ -43,6 +43,13 @@
 	help
 	  This program loads a console font from standard input.
 
+config FEATURE_LOADFONT_MAP
+	bool "Support loading of console screen map"
+	default n
+	depends on LOADFONT
+	help
+	  Allows to load console screen map. Useful for i18n.
+
 config LOADKMAP
 	bool "loadkmap"
 	default n
diff -Naur busybox.orig/console-tools/loadfont.c busybox/console-tools/loadfont.c
--- busybox.orig/console-tools/loadfont.c	2008-07-15 22:00:21 +0000
+++ busybox/console-tools/loadfont.c	2008-08-05 22:51:36 +0000
@@ -26,7 +26,7 @@
 	unsigned char charsize;         /* Character size */
 };
 
-#define PSF_MAGIC_OK(x)	((x).magic1 == PSF_MAGIC1 && (x).magic2 == PSF_MAGIC2)
+#define PSF_MAGIC_OK(x)	((x)->magic1 == PSF_MAGIC1 && (x)->magic2 == PSF_MAGIC2)
 
 static void do_loadfont(int fd, unsigned char *inbuf, int unit, int fontsize)
 {
@@ -96,86 +96,156 @@
 	xioctl(fd, PIO_UNIMAP, &ud);
 }
 
-static void loadnewfont(int fd)
+#if ENABLE_FEATURE_LOADFONT_MAP
+static int ctoi(char *s)
+{
+	int i = -1;
+
+	if (
+		(strncmp(s,"0x",2) == 0 || strncmp(s,"U+",2) == 0) && 
+	    	(strspn(s+2,"0123456789abcdefABCDEF") == strlen(s+2))
+	)
+		(void)sscanf(s+2,"%x",&i);
+
+	else if ((*s == '0') &&
+		 (strspn(s,"01234567") == strlen(s)))
+		(void)sscanf(s,"%o",&i);
+
+	else if (strspn(s,"0123456789") == strlen(s)) 
+		(void)sscanf(s,"%d",&i);
+
+	else if ((strlen(s) == 3) && (s[0] == '\'') && (s[2] == '\''))
+		i=s[1];
+
+#if 0
+	else if (s[0] == '\'') {
+		int err;
+		char *s1 = s+1;
+
+		i = from_utf8(&s1, 0, &err);
+		if (err || s1[0] != '\'' || s1[1] != 0)
+			return -1;
+	}
+#endif
+
+	return i;
+}
+#endif
+
+int loadfont_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int loadfont_main(int argc UNUSED_PARAM, char **argv)
 {
 	enum { INBUF_SIZE = 32*1024 + 1 };
 
 	int unit;
-	unsigned inputlth, offset;
-	/* Was on stack, but 32k is a bit too much: */
-	unsigned char *inbuf = xmalloc(INBUF_SIZE);
+	unsigned inputlth;
+	int fontsize;
+	int hastable;
+	int fd;
+	struct psf_header *psfhdr;
+	unsigned head0, head = head;
+	USE_FEATURE_LOADFONT_MAP(
+		char *mapfile;
+	)
+
+	opt_complementary = "=0"; // no arguments allowed!
+#if ENABLE_FEATURE_LOADFONT_MAP
+	getopt32(argv, "m:", &mapfile);
+#else
+	getopt32(argv, "");
+#endif
 
 	/*
 	 * We used to look at the length of the input file
 	 * with stat(); now that we accept compressed files,
 	 * just read the entire file.
 	 */
-	inputlth = full_read(STDIN_FILENO, inbuf, INBUF_SIZE);
-	if (inputlth < 0)
+	inputlth = INBUF_SIZE;
+	psfhdr = (struct psf_header *) xmalloc_read(STDIN_FILENO, &inputlth);
+	if (!psfhdr)
 		bb_perror_msg_and_die("error reading input font");
 	if (inputlth >= INBUF_SIZE)
 		bb_error_msg_and_die("font too large");
 
 	/* test for psf first */
-	{
-		struct psf_header psfhdr;
-		int fontsize;
-		int hastable;
-		unsigned head0, head;
-
-		if (inputlth < sizeof(struct psf_header))
-			goto no_psf;
-
-		psfhdr = *(struct psf_header *) &inbuf[0];
-
-		if (!PSF_MAGIC_OK(psfhdr))
-			goto no_psf;
-
-		if (psfhdr.mode > PSF_MAXMODE)
+	if (inputlth >= sizeof(struct psf_header) && PSF_MAGIC_OK(psfhdr)) {
+		if (psfhdr->mode > PSF_MAXMODE)
 			bb_error_msg_and_die("unsupported psf file mode");
-		fontsize = ((psfhdr.mode & PSF_MODE512) ? 512 : 256);
+		fontsize = ((psfhdr->mode & PSF_MODE512) ? 512 : 256);
 #if !defined(PIO_FONTX) || defined(__sparc__)
 		if (fontsize != 256)
 			bb_error_msg_and_die("only fontsize 256 supported");
 #endif
-		hastable = (psfhdr.mode & PSF_MODEHASTAB);
-		unit = psfhdr.charsize;
+		hastable = (psfhdr->mode & PSF_MODEHASTAB);
+		unit = psfhdr->charsize;
 		head0 = sizeof(struct psf_header);
 
 		head = head0 + fontsize * unit;
 		if (head > inputlth || (!hastable && head != inputlth))
 			bb_error_msg_and_die("input file: bad length");
-		do_loadfont(fd, inbuf + head0, unit, fontsize);
-		if (hastable)
-			do_loadtable(fd, inbuf + head, inputlth - head, fontsize);
-		return;
-	}
-
- no_psf:
-	/* file with three code pages? */
-	if (inputlth == 9780) {
-		offset = 40;
-		unit = 16;
 	} else {
-		/* bare font */
-		if (inputlth & 0377)
-			bb_error_msg_and_die("bad input file size");
-		offset = 0;
-		unit = inputlth / 256;
+		/* file with three code pages? */
+		if (inputlth == 9780) {
+			head0 = 40;
+			unit = 16;
+		} else {
+			/* bare font */
+			if (inputlth & 0377)
+				bb_error_msg_and_die("input file: bad length");
+			head0 = 0;
+			unit = inputlth / 256;
+		}
+		fontsize = 256;
+		hastable = 0;
 	}
-	do_loadfont(fd, inbuf + offset, unit, 256);
-}
-
-int loadfont_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int loadfont_main(int argc, char **argv UNUSED_PARAM)
-{
-	int fd;
 
-	if (argc != 1)
-		bb_show_usage();
-
-	fd = xopen(CURRENT_VC, O_RDWR);
-	loadnewfont(fd);
+	fd = get_console_fd();
+	do_loadfont(fd, (unsigned char *)psfhdr + head0, unit, fontsize);
+	if (hastable)
+		do_loadtable(fd, (unsigned char *)psfhdr + head, inputlth - head, fontsize);
+
+	// load the console map, if any
+#if ENABLE_FEATURE_LOADFONT_MAP
+	if (option_mask32 & 1) {
+		char *token[2];
+		parser_t *parser = config_open2(mapfile, xfopen_for_read);
+		int unicode = 0; // at least one unicode character is met?
+		
+		// fill vanilla map
+#define asciis ((unsigned char *)psfhdr)
+#define unicodes ((unsigned short *)psfhdr)
+		for (int i = 0; i < E_TABSZ; i++)
+			unicodes[i] = 0xF000 + i;
+
+		while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL | PARSE_MIN_DIE)) {
+			// parse code/value pair
+			int a = ctoi(token[0]);
+			int b = ctoi(token[1]);
+//bb_error_msg("[%d]->[%d]", a, b);
+			if (a < 0 || a >= E_TABSZ ||
+			    b < 0 || b > 65535)
+				bb_error_msg_and_die("map format");
+			// patch map
+			unicodes[a] = b;
+			// unicode character is met?
+			if (b > 255)
+				unicode++;
+		}
+		if (ENABLE_FEATURE_CLEAN_UP)
+			config_close(parser);
+		// set map
+//bb_error_msg("unicode[%d]", unicode);
+		head = PIO_UNISCRNMAP;
+		if (!unicode) {
+			for (int i = 0; i < E_TABSZ; i++)
+				asciis[i] = unicodes[i];
+			head = PIO_SCRNMAP;
+		}
+		xioctl(fd, head, unicodes);
+#undef asciis
+#undef unicodes
+	}
+#endif
 
 	return EXIT_SUCCESS;
 }
diff -Naur busybox.orig/include/usage.h busybox/include/usage.h
--- busybox.orig/include/usage.h	2008-08-04 19:03:01 +0000
+++ busybox/include/usage.h	2008-08-05 22:58:55 +0000
@@ -2119,9 +2119,11 @@
 #define load_policy_full_usage ""
 
 #define loadfont_trivial_usage \
-       "< font"
+       "[-m mapfile] < font"
 #define loadfont_full_usage "\n\n" \
-       "Load a console font from standard input"
+       "Load a console font from standard input\n" \
+     "\nOptions:" \
+     "\n	-m mapfile	Load console screen map from mapfile"
 #define loadfont_example_usage \
        "$ loadfont < /etc/i18n/fontname\n"
 
