Index: rockbox_svn/apps/filetree.c
===================================================================
--- rockbox_svn.orig/apps/filetree.c
+++ rockbox_svn/apps/filetree.c
@@ -538,6 +538,6 @@ int ft_enter(struct tree_context* c)
                 strcpy(buf_copy, buf);
                 set_file(buf_copy, (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
@@ -905,6 +905,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]) {
         snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd",
                  global_settings.kbd_file);
@@ -1016,6 +1080,13 @@ void settings_reset(void) {
 #if defined (HAVE_RECORDING) && CONFIG_CODEC == SWCODEC
     enc_global_settings_reset();
 #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';
 }
 
 /** Changing setting values **/
Index: rockbox_svn/apps/settings.h
===================================================================
--- rockbox_svn.orig/apps/settings.h
+++ rockbox_svn/apps/settings.h
@@ -416,6 +416,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];        
+
     unsigned char wps_file[MAX_FILENAME+1];  /* last wps */
     unsigned char lang_file[MAX_FILENAME+1]; /* last language */
 
Index: rockbox_svn/firmware/export/font.h
===================================================================
--- rockbox_svn.orig/firmware/export/font.h
+++ rockbox_svn/firmware/export/font.h
@@ -54,6 +54,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
@@ -76,6 +83,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 */
@@ -598,7 +612,28 @@ void glyph_cache_save(int font)
 			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_RECORD);
 			break;
 #endif
-		    default:
+		    case 5:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER1);
+			break;
+		    case 6:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER2);
+			break;
+		    case 7:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER3);
+			break;
+		    case 8:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER4);
+			break;
+		    case 9:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER5);
+			break;
+		    case 10:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER6);
+			break;
+		    case 11:
+			fntfile[font].glyph_fd = creat(GLYPH_CACHE_FILE_USER7);
+			break;		    
+			default:
 			return;
 		}
 	
@@ -632,17 +667,38 @@ void glyph_cache_load(int font)
 		    case 2:
 			fd = open(GLYPH_CACHE_FILE_MENU, O_RDONLY|O_BINARY);
 			break;
-	#ifdef CONFIG_TUNER
+#ifdef CONFIG_TUNER
 		    case 3:
 			fd = open(GLYPH_CACHE_FILE_TUNER, O_RDONLY|O_BINARY);
 			break;
-	#endif
-	#ifdef HAVE_RECORDING
+#endif
+#ifdef HAVE_RECORDING
 		    case 4:
 			fd = open(GLYPH_CACHE_FILE_RECORD, O_RDONLY|O_BINARY);
 			break;
-	#endif
-		    default:
+#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;
 		}
 	
Index: rockbox_svn/apps/settings_list.c
===================================================================
--- rockbox_svn.orig/apps/settings_list.c
+++ rockbox_svn/apps/settings_list.c
@@ -510,6 +510,13 @@ const struct settings_list settings[] = 
         false,"remote reduce ticking", NULL),
 #endif
 #endif
+    FILENAME_SETTING(F_THEMESETTING,userfont1,"userfont1","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,userfont2,"userfont2","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,userfont3,"userfont3","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,userfont4,"userfont4","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,userfont5,"userfont5","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,userfont6,"userfont6","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
+    FILENAME_SETTING(F_THEMESETTING,userfont7,"userfont7","",FONT_DIR "/",".fnt",MAX_FILENAME+1),
 
 #if CONFIG_BACKLIGHT
     OFFON_SETTING(0,bl_filter_first_keypress,
