Index: rockbox_svn/apps/filetree.c
===================================================================
--- rockbox_svn.orig/apps/filetree.c
+++ rockbox_svn/apps/filetree.c
@@ -528,7 +528,7 @@ int ft_enter(struct tree_context* c)
                 font_load(buf, FONT_RECORD);
                 set_file(buf, (char *)global_settings.recordfont, MAX_FILENAME);
 #endif
-                
+                /* dont set userfonts because of the buffer problem */
                 break;
 
             case TREE_ATTR_KBD:
Index: rockbox_svn/apps/settings.c
===================================================================
--- rockbox_svn.orig/apps/settings.c
+++ rockbox_svn/apps/settings.c
@@ -52,6 +52,7 @@
 #include "system.h"
 #include "misc.h"
 #include "timefuncs.h"
+#include "sprintf.h"
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
 #include "font.h"
@@ -673,6 +674,70 @@ void settings_apply(void)
            }
 
     }
+    /* Load all user fonts */
+    if ( global_settings.userfont1[0] &&
+         global_settings.userfont1[0] != 0xff ) {
+        snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                 global_settings.userfont1);
+        font_load(buf, FONT_USER1);
+    }
+    else
+        font_reset(FONT_USER1);
+    
+    if ( global_settings.userfont2[0] &&
+         global_settings.userfont2[0] != 0xff ) {
+        snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                    global_settings.userfont2);
+        font_load(buf, FONT_USER2);
+    }
+    else
+        font_reset(FONT_USER2);
+    
+    if ( global_settings.userfont3[0] &&
+         global_settings.userfont3[0] != 0xff ) {
+         snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                    global_settings.userfont3);
+        font_load(buf, FONT_USER3);
+    }
+    else
+        font_reset(FONT_USER3);
+    
+    if ( global_settings.userfont4[0] &&
+         global_settings.userfont4[0] != 0xff ) {
+            snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                       global_settings.userfont4);
+        font_load(buf, FONT_USER4);
+    }
+    else
+        font_reset(FONT_USER4);
+       
+    if ( global_settings.userfont5[0] &&
+         global_settings.userfont5[0] != 0xff ) {
+        snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                       global_settings.userfont5);
+        font_load(buf, FONT_USER5);
+    }
+    else
+        font_reset(FONT_USER5);
+       
+    if ( global_settings.userfont6[0] &&
+         global_settings.userfont6[0] != 0xff ) {
+        snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                       global_settings.userfont6);
+        font_load(buf, FONT_USER6);
+    }
+    else
+        font_reset(FONT_USER6);
+       
+    if ( global_settings.userfont7[0] &&
+         global_settings.userfont7[0] != 0xff ) {
+        snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
+                       global_settings.userfont7);
+        font_load(buf, FONT_USER7);
+     }
+     else
+        font_reset(FONT_USER7);
+        
     if ( global_settings.kbd_file[0] &&
          global_settings.kbd_file[0] != 0xff ) {
         snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd",
@@ -823,6 +888,13 @@ void theme_settings_reset(void)
 	global_settings.fg_color=LCD_DEFAULT_FG;
 	global_settings.bg_color=LCD_DEFAULT_BG;
 #endif
+	global_settings.userfont1[0] = '\0';
+	global_settings.userfont2[0] = '\0';
+	global_settings.userfont3[0] = '\0';
+	global_settings.userfont4[0] = '\0';
+	global_settings.userfont5[0] = '\0';
+	global_settings.userfont6[0] = '\0';
+	global_settings.userfont7[0] = '\0';
 }
 
 bool settings_load_config(const char* file, bool apply)
Index: rockbox_svn/apps/settings.h
===================================================================
--- rockbox_svn.orig/apps/settings.h
+++ rockbox_svn/apps/settings.h
@@ -285,6 +285,14 @@ struct user_settings
     unsigned char recordfont[MAX_FILENAME+1];
 #endif
 
+    unsigned char userfont1[MAX_FILENAME+1];
+    unsigned char userfont2[MAX_FILENAME+1];
+    unsigned char userfont3[MAX_FILENAME+1];
+    unsigned char userfont4[MAX_FILENAME+1];
+    unsigned char userfont5[MAX_FILENAME+1];
+    unsigned char userfont6[MAX_FILENAME+1];
+    unsigned char userfont7[MAX_FILENAME+1];    
+    
 #ifdef CONFIG_TUNER
     unsigned char fmr_file[MAX_FILENAME+1]; /* last fmr preset */
 #endif
Index: rockbox_svn/firmware/export/font.h
===================================================================
--- rockbox_svn.orig/firmware/export/font.h
+++ rockbox_svn/firmware/export/font.h
@@ -31,7 +31,7 @@
 /* fonts > 45kb in size go through the font/glyph cache code */
 #ifndef MAX_FONT_SIZE
 #if LCD_HEIGHT > 64
-#define MAX_FONT_SIZE   45000
+#define MAX_FONT_SIZE   55000
 #else
 #define MAX_FONT_SIZE   4000
 #endif
@@ -51,6 +51,13 @@
 #ifdef HAVE_RECORDING
 #define GLYPH_CACHE_FILE_RECORD "/.rockbox/.glyphcache-record"
 #endif
+#define GLYPH_CACHE_FILE_USER1 "/.rockbox/.glyphcache-user1"
+#define GLYPH_CACHE_FILE_USER2 "/.rockbox/.glyphcache-user2"
+#define GLYPH_CACHE_FILE_USER3 "/.rockbox/.glyphcache-user3"
+#define GLYPH_CACHE_FILE_USER4 "/.rockbox/.glyphcache-user4"
+#define GLYPH_CACHE_FILE_USER5 "/.rockbox/.glyphcache-user5"
+#define GLYPH_CACHE_FILE_USER6 "/.rockbox/.glyphcache-user6"
+#define GLYPH_CACHE_FILE_USER7 "/.rockbox/.glyphcache-user7"
 
 /*
  * Fonts are specified by number, and used for display
@@ -73,6 +80,13 @@ enum {
 #ifdef HAVE_RECORDING
     FONT_RECORD,   /* Recording font */
 #endif
+    FONT_USER1,    /* User custom fonts for use in wps */
+    FONT_USER2,    /* User custom fonts for use in wps */
+    FONT_USER3,    /* User custom fonts for use in wps */
+    FONT_USER4,    /* User custom fonts for use in wps */
+    FONT_USER5,    /* User custom fonts for use in wps */
+    FONT_USER6,    /* User custom fonts for use in wps */
+    FONT_USER7,    /* User custom fonts for use in wps */
     MAXFONTS
 };
 
Index: rockbox_svn/firmware/font.c
===================================================================
--- rockbox_svn.orig/firmware/font.c
+++ rockbox_svn/firmware/font.c
@@ -55,6 +55,13 @@ static struct font tunerfont;
 #ifdef HAVE_RECORDING
 static struct font recordfont;
 #endif
+static struct font userfont1;
+static struct font userfont2;
+static struct font userfont3;
+static struct font userfont4;
+static struct font userfont5;
+static struct font userfont6;
+static struct font userfont7;
 
 /* system font table, in order of FONT_xxx definition */
 static struct font* sysfonts[MAXFONTS] = {
@@ -66,8 +73,15 @@ static struct font* sysfonts[MAXFONTS] =
     &tunerfont,
 #endif
 #ifdef HAVE_RECORDING
-    &recordfont
+    &recordfont,
 #endif
+    &userfont1,
+    &userfont2,
+    &userfont3,
+    &userfont4,
+    &userfont5,
+    &userfont6,
+    &userfont7
  };
 
 /* static buffer allocation structures */
@@ -543,9 +557,9 @@ const unsigned char* font_get_bits(struc
     char_code -= pf->firstchar;
 
     if (font <= 0 || fntfile[font-1].font_fd < 0) /* sysfont */
-	bits = pf->bits + (pf->offset?pf->offset[char_code]:(((pf->height + 7) / 8) * pf->maxwidth * char_code));
+    	bits = pf->bits + (pf->offset?pf->offset[char_code]:(((pf->height + 7) / 8) * pf->maxwidth * char_code));
     else
-	bits = (unsigned char*)font_cache_get(&sys_font_cache[font-1], char_code, load_cache_entry, pf, font-1)->bitmap;
+    	bits = (unsigned char*)font_cache_get(&sys_font_cache[font-1], char_code, load_cache_entry, pf, font-1)->bitmap;
         
     return bits;
 }
@@ -598,6 +612,27 @@ void glyph_cache_save(int font)
 		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_RECORD, 0);
 		break;
 #endif
+	    case 5:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER1, 0);
+		break;
+	    case 6:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER2, 0);
+		break;
+	    case 7:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER3, 0);
+		break;
+	    case 8:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER4, 0);
+		break;
+	    case 9:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER5, 0);
+		break;
+	    case 10:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER6, 0);
+		break;
+	    case 11:
+		fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER7, 0);
+		break;
 	    default:
 		return;
 	}
@@ -642,6 +677,27 @@ void glyph_cache_load(int font)
 		fd = open(GLYPH_CACHE_FILE_RECORD, O_RDONLY|O_BINARY);
 		break;
 #endif
+	    case 5:
+		fd = open(GLYPH_CACHE_FILE_USER1, O_RDONLY|O_BINARY);
+		break;
+	    case 6:
+		fd = open(GLYPH_CACHE_FILE_USER2, O_RDONLY|O_BINARY);
+		break;
+	    case 7:
+		fd = open(GLYPH_CACHE_FILE_USER3, O_RDONLY|O_BINARY);
+		break;
+	    case 8:
+		fd = open(GLYPH_CACHE_FILE_USER4, O_RDONLY|O_BINARY);
+		break;
+	    case 9:
+		fd = open(GLYPH_CACHE_FILE_USER5, O_RDONLY|O_BINARY);
+		break;
+	    case 10:
+		fd = open(GLYPH_CACHE_FILE_USER6, O_RDONLY|O_BINARY);
+		break;
+	    case 11:
+		fd = open(GLYPH_CACHE_FILE_USER7, O_RDONLY|O_BINARY);
+		break;
 	    default:
 		return;
 	}
