Index: rockbox/apps/filetree.c
===================================================================
--- rockbox.orig/apps/filetree.c
+++ rockbox/apps/filetree.c
@@ -529,6 +529,70 @@ int ft_enter(struct tree_context* c)
                 set_file(buf, (char *)global_settings.recordfont, MAX_FILENAME);
 #endif
                 
+                /* Custom user fonts to use in the wps */
+				if ( global_settings.userfont1[0] &&
+						global_settings.userfont1[0] != 0xff ) {
+					font_load(buf, FONT_USER1);
+					set_file(buf, (char *)global_settings.userfont1, MAX_FILENAME);
+				}
+
+				if ( global_settings.userfont2[0] &&
+						global_settings.userfont2[0] != 0xff ) {
+					font_load(buf, FONT_USER2);
+					set_file(buf, (char *)global_settings.userfont2, MAX_FILENAME);
+				}
+	
+				if ( global_settings.userfont3[0] &&
+						global_settings.userfont3[0] != 0xff ) {
+					font_load(buf, FONT_USER3);
+					set_file(buf, (char *)global_settings.userfont3, MAX_FILENAME);
+				}
+	
+				if ( global_settings.userfont4[0] &&
+						global_settings.userfont4[0] != 0xff ) {
+					font_load(buf, FONT_USER4);
+					set_file(buf, (char *)global_settings.userfont4, MAX_FILENAME);
+				}
+	
+				if ( global_settings.userfont5[0] &&
+						global_settings.userfont5[0] != 0xff ) {
+					font_load(buf, FONT_USER5);
+					set_file(buf, (char *)global_settings.userfont5, MAX_FILENAME);
+				}
+
+				if ( global_settings.userfont6[0] &&
+						global_settings.userfont6[0] != 0xff ) {
+					font_load(buf, FONT_USER6);
+					set_file(buf, (char *)global_settings.userfont6, MAX_FILENAME);
+				}
+	
+				if ( global_settings.userfont7[0] &&
+						global_settings.userfont7[0] != 0xff ) {
+					font_load(buf, FONT_USER7);
+					set_file(buf, (char *)global_settings.userfont7, MAX_FILENAME);
+				}
+
+/*				font_load(buf, FONT_USER1);
+                set_file(buf, (char *)global_settings.userfont1, MAX_FILENAME);
+                
+                font_load(buf, FONT_USER2);
+                set_file(buf, (char *)global_settings.userfont2, MAX_FILENAME);
+                
+                font_load(buf, FONT_USER3);
+                set_file(buf, (char *)global_settings.userfont3, MAX_FILENAME);
+                
+                font_load(buf, FONT_USER4);
+                set_file(buf, (char *)global_settings.userfont4, MAX_FILENAME);
+                
+                font_load(buf, FONT_USER5);
+                set_file(buf, (char *)global_settings.userfont5, MAX_FILENAME);
+                
+                font_load(buf, FONT_USER6);
+                set_file(buf, (char *)global_settings.userfont6, MAX_FILENAME);
+                
+                font_load(buf, FONT_USER7);
+                set_file(buf, (char *)global_settings.userfont7, MAX_FILENAME);*/
+                
                 break;
 
             case TREE_ATTR_KBD:
Index: rockbox/apps/settings.c
===================================================================
--- rockbox.orig/apps/settings.c
+++ rockbox/apps/settings.c
@@ -51,6 +51,7 @@
 #include "system.h"
 #include "misc.h"
 #include "timefuncs.h"
+#include "sprintf.h"
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
 #include "font.h"
@@ -100,7 +101,7 @@ const char rec_base_directory[] = REC_BA
 #include "eq_menu.h"
 #endif
 
-#define CONFIG_BLOCK_VERSION 56
+#define CONFIG_BLOCK_VERSION 57
 #define CONFIG_BLOCK_SIZE 512
 #define RTC_BLOCK_SIZE 44
 
@@ -996,6 +997,8 @@ void settings_calc_config_sector(void)
 int settings_save( void )
 {
     int i;
+ 	int max_length=MAX_FONT_FILENAME+3+1;
+	char tmp[max_length];
 
     {
         int elapsed_secs;
@@ -1019,25 +1022,52 @@ int settings_save( void )
     strncpy((char *)&config_block[i], (char *)global_settings.lang_file,
             MAX_FILENAME);
     i+= MAX_FILENAME;
-    strncpy((char *)&config_block[i], (char *)global_settings.browserfont,
-            MAX_FILENAME);
-    i+= MAX_FILENAME;
-    strncpy((char *)&config_block[i], (char *)global_settings.wpsfont,
-            MAX_FILENAME);
-    i+= MAX_FILENAME;
-    strncpy((char *)&config_block[i], (char *)global_settings.menufont,
-            MAX_FILENAME);
-    i+= MAX_FILENAME;
+
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.browserfont), (char *)global_settings.browserfont);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.wpsfont), (char *)global_settings.wpsfont);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.menufont), (char *)global_settings.menufont);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+
 #ifdef CONFIG_TUNER
-    strncpy((char *)&config_block[i], (char *)global_settings.tunerfont,
-            MAX_FILENAME);
-    i+= MAX_FILENAME;
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.tunerfont), (char *)global_settings.tunerfont);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
 #endif
 #ifdef HAVE_RECORDING
-    strncpy((char *)&config_block[i], (char *)global_settings.recordfont,
-            MAX_FILENAME);
-    i+= MAX_FILENAME;
-#endif
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.recordfont), (char *)global_settings.recordfont);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+#endif
+    /* Custom user fonts to use in wps */       
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont1), (char *)global_settings.userfont1);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont2), (char *)global_settings.userfont2);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont3), (char *)global_settings.userfont3);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont4), (char *)global_settings.userfont4);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont5), (char *)global_settings.userfont5);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont6), (char *)global_settings.userfont6);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+    snprintf(tmp, max_length, "%02d:%s", (int)strlen(global_settings.userfont7), (char *)global_settings.userfont7);
+    strncpy((char *)&config_block[i], tmp, strlen(tmp));
+    i+= strlen(tmp);
+ 
 #ifdef HAVE_REMOTE_LCD
     strncpy((char *)&config_block[i], (char *)global_settings.rwps_file,
             MAX_FILENAME);
@@ -1305,6 +1335,71 @@ void settings_apply(void)
          font_reset(FONT_RECORD);
 #endif /* HAVE_RECORDING */
 
+   
+ 	 /* Load custom user fonts to use in wps */
+ 	 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",
@@ -1441,6 +1536,9 @@ static void load_bit_table(const struct 
 void settings_load(int which)
 {
     int i;
+	char tmp[MAX_FILENAME];
+	int length;
+	
     DEBUGF( "reload_all_settings()\n" );
 
     /* load the buffer from the RTC (resets it to all-unused if the block
@@ -1480,25 +1578,95 @@ void settings_load(int which)
         strncpy((char *)global_settings.lang_file, (char *)&config_block[i],
                 MAX_FILENAME);
         i+= MAX_FILENAME;
-        strncpy((char *)global_settings.browserfont, (char *)&config_block[i],
-                MAX_FILENAME);
-        i+= MAX_FILENAME;
-        strncpy((char *)global_settings.wpsfont, (char *)&config_block[i],
-                MAX_FILENAME);
-        i+= MAX_FILENAME;
-        strncpy((char *)global_settings.menufont, (char *)&config_block[i],
-                MAX_FILENAME);
-        i+= MAX_FILENAME;
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.browserfont, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.browserfont)+3;
+		DEBUGF("browserfont=%s\n",(char *)global_settings.browserfont);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.wpsfont, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.wpsfont)+3;
+		DEBUGF("wpsfont=%s\n",(char *)global_settings.wpsfont);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.menufont, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.menufont)+3;
+		DEBUGF("menufont=%s\n",(char *)global_settings.menufont);
+
 #ifdef CONFIG_TUNER
-        strncpy((char *)global_settings.tunerfont, (char *)&config_block[i],
-                MAX_FILENAME);
-        i+= MAX_FILENAME;
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.tunerfont, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.tunerfont)+3;
+		DEBUGF("tunerfont=%s\n",(char *)global_settings.tunerfont);
 #endif
 #ifdef HAVE_RECORDING
-        strncpy((char *)global_settings.recordfont, (char *)&config_block[i],
-                MAX_FILENAME);
-        i+= MAX_FILENAME;
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.recordfont, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.recordfont)+3;
+		DEBUGF("recordfont=%s\n",(char *)global_settings.recordfont);
 #endif  
+		/* User custom fonts for use in wps */
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont1, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont1)+3;
+		DEBUGF("userfont1=%s\n",(char *)global_settings.userfont1);
+		
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont2, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont2)+3;
+		DEBUGF("userfont2=%s\n",(char *)global_settings.userfont2);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont3, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont3)+3;
+		DEBUGF("userfont3=%s\n",(char *)global_settings.userfont3);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont4, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont4)+3;
+		DEBUGF("userfont4=%s\n",(char *)global_settings.userfont4);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont5, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont5)+3;
+		DEBUGF("userfont5=%s\n",(char *)global_settings.userfont5);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont6, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont6)+3;
+		DEBUGF("userfont6=%s\n",(char *)global_settings.userfont6);
+
+	    strncpy(tmp, (char *)&config_block[i], 2);
+	    tmp[2]='\0';
+		length=atoi(tmp);
+	    strncpy((char *)global_settings.userfont7, (char *)&config_block[i]+3, length);
+	    i+= strlen((char *)global_settings.userfont7)+3;
+		DEBUGF("userfont7=%s\n",(char *)global_settings.userfont7);
+
+         
 #ifdef HAVE_REMOTE_LCD
         strncpy((char *)global_settings.rwps_file, (char *)&config_block[i],
                 MAX_FILENAME);
@@ -1642,6 +1810,25 @@ static int load_cfg_table(
     return 0; /* indicate not found */
 }
 
+void theme_fonts_reset(void)
+{
+	global_settings.browserfont[0] = '\0';
+    global_settings.wpsfont[0] = '\0';
+    global_settings.menufont[0] = '\0';
+#ifdef CONFIG_TUNER
+    global_settings.tunerfont[0] = '\0';
+#endif
+#ifdef HAVE_RECORDING
+    global_settings.recordfont[0] = '\0';
+#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)
 {
@@ -1653,6 +1840,18 @@ bool settings_load_config(const char* fi
     if (fd < 0)
         return false;
 
+	// MWE reset fonts if loading theme
+	if(strncmp(file, THEME_DIR, strlen(THEME_DIR))==0){
+		theme_fonts_reset();
+#ifdef HAVE_REMOTE_LCD
+		global_settings.rwps_file[0]='\0';
+#endif
+#ifdef HAVE_LCD_COLOR
+		global_settings.fg_color=LCD_DEFAULT_FG;
+		global_settings.bg_color=LCD_DEFAULT_BG;
+#endif
+	}
+
     while (read_line(fd, line, sizeof line) > 0)
     {
         char* name;
@@ -1705,48 +1904,78 @@ bool settings_load_config(const char* fi
         else if (!strcasecmp(name, "browserfont")) {
         	useMultifont=1;
             if (font_load(value, FONT_BROWSER))
-                set_file(value, (char *)global_settings.browserfont, MAX_FILENAME);
+                set_file(value, (char *)global_settings.browserfont, MAX_FONT_FILENAME);
         }
         else if (!strcasecmp(name, "wpsfont")) {
         	useMultifont=1;
             if (font_load(value, FONT_WPS))
-                set_file(value, (char *)global_settings.wpsfont, MAX_FILENAME);
+                set_file(value, (char *)global_settings.wpsfont, MAX_FONT_FILENAME);
         }
         else if (!strcasecmp(name, "menufont")) {
         	useMultifont=1;
             if (font_load(value, FONT_MENU))
-                set_file(value, (char *)global_settings.menufont, MAX_FILENAME);
+                set_file(value, (char *)global_settings.menufont, MAX_FONT_FILENAME);
         }
 #ifdef CONFIG_TUNER
         else if (!strcasecmp(name, "tunerfont")) {
         	useMultifont=1;
             if (font_load(value, FONT_TUNER))
-                set_file(value, (char *)global_settings.tunerfont, MAX_FILENAME);
+                set_file(value, (char *)global_settings.tunerfont, MAX_FONT_FILENAME);
         }
 #endif /* CONFIG_TUNER */
 #ifdef HAVE_RECORDING
         else if (!strcasecmp(name, "recordfont")) {
         	useMultifont=1;
             if (font_load(value, FONT_RECORD))
-                set_file(value, (char *)global_settings.recordfont, MAX_FILENAME);
+                set_file(value, (char *)global_settings.recordfont, MAX_FONT_FILENAME);
         }
 #endif /* HAVE_RECORDING */
+		/* User custom fonts for use in wps */
+        else if (!strcasecmp(name, "userfont1")) {
+            if (font_load(value, FONT_USER1))
+                set_file(value, (char *)global_settings.userfont1, MAX_FONT_FILENAME);
+        }
+        else if (!strcasecmp(name, "userfont2")) {
+            if (font_load(value, FONT_USER2))
+                set_file(value, (char *)global_settings.userfont2, MAX_FONT_FILENAME);
+        }
+        else if (!strcasecmp(name, "userfont3")) {
+            if (font_load(value, FONT_USER3))
+                set_file(value, (char *)global_settings.userfont3, MAX_FONT_FILENAME);
+        }
+        else if (!strcasecmp(name, "userfont4")) {
+            if (font_load(value, FONT_USER4))
+                set_file(value, (char *)global_settings.userfont4, MAX_FONT_FILENAME);
+        }
+        else if (!strcasecmp(name, "userfont5")) {
+            if (font_load(value, FONT_USER5))
+                set_file(value, (char *)global_settings.userfont5, MAX_FONT_FILENAME);
+        }
+        else if (!strcasecmp(name, "userfont6")) {
+            if (font_load(value, FONT_USER6))
+                set_file(value, (char *)global_settings.userfont6, MAX_FONT_FILENAME);
+        }
+        else if (!strcasecmp(name, "userfont7")) {
+            if (font_load(value, FONT_USER7))
+                set_file(value, (char *)global_settings.userfont7, MAX_FONT_FILENAME);
+        }
+
 		// MWE backward comp
 		else if (!strcasecmp(name, "font")) {
 			if(useMultifont==0){			
             	if (font_load(value, FONT_BROWSER))
-             	   set_file(value, (char *)global_settings.browserfont, MAX_FILENAME);
+             	   set_file(value, (char *)global_settings.browserfont, MAX_FONT_FILENAME);
             	if (font_load(value, FONT_WPS))
-            	    set_file(value, (char *)global_settings.wpsfont, MAX_FILENAME);
+            	    set_file(value, (char *)global_settings.wpsfont, MAX_FONT_FILENAME);
            	 	if (font_load(value, FONT_MENU))
-           	     	set_file(value, (char *)global_settings.menufont, MAX_FILENAME);
+           	     	set_file(value, (char *)global_settings.menufont, MAX_FONT_FILENAME);
  #ifdef CONFIG_TUNER
           	 	if (font_load(value, FONT_TUNER))
-          	    	set_file(value, (char *)global_settings.tunerfont, MAX_FILENAME);
+          	    	set_file(value, (char *)global_settings.tunerfont, MAX_FONT_FILENAME);
 #endif /* CONFIG_TUNER */
 #ifdef HAVE_RECORDING
             	if (font_load(value, FONT_RECORD))
-              		set_file(value, (char *)global_settings.recordfont, MAX_FILENAME);
+              		set_file(value, (char *)global_settings.recordfont, MAX_FONT_FILENAME);
 #endif /* HAVE_RECORDING */
 			}
         }
@@ -1931,6 +2160,27 @@ bool settings_save_config(void)
          fdprintf(fd, "recordfont: %s/%s.fnt\r\n", FONT_DIR,
                   global_settings.recordfont);
 #endif /* HAVE_RECORDING */
+    if (global_settings.userfont1[0] != 0)
+        fdprintf(fd, "userfont1: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont1);
+    if (global_settings.userfont2[0] != 0)
+        fdprintf(fd, "userfont2: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont2);
+    if (global_settings.userfont3[0] != 0)
+        fdprintf(fd, "userfont3: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont3);
+    if (global_settings.userfont4[0] != 0)
+        fdprintf(fd, "userfont4: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont4);
+    if (global_settings.userfont5[0] != 0)
+        fdprintf(fd, "userfont5: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont5);
+    if (global_settings.userfont6[0] != 0)
+        fdprintf(fd, "userfont6: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont6);
+    if (global_settings.userfont7[0] != 0)
+        fdprintf(fd, "userfont7: %s/%s.fnt\r\n", FONT_DIR,
+                 global_settings.userfont7);
 #endif /* HAVE_LCD_BITMAP */
 
 #ifdef HAVE_LCD_COLOR
@@ -2043,6 +2293,13 @@ void settings_reset(void) {
 #ifdef HAVE_RECORDING
     global_settings.recordfont[0] = '\0';
 #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';
     global_settings.lang_file[0] = '\0';
 #ifdef HAVE_LCD_COLOR
     global_settings.backdrop_file[0] = '\0';
@@ -2355,3 +2612,4 @@ void settings_apply_trigger(void)
     );
 }
 #endif
+
Index: rockbox/apps/settings.h
===================================================================
--- rockbox.orig/apps/settings.h
+++ rockbox/apps/settings.h
@@ -56,7 +56,7 @@
 #define CODECS_DIR  ROCKBOX_DIR"/codecs"
 
 #define MAX_FILENAME 20
-
+#define MAX_FONT_FILENAME 17
 /* data structures */
 
 #define BOOKMARK_NO  0
@@ -255,15 +255,22 @@ struct user_settings
     int resume_seed;   /* shuffle seed (-1=no resume shuffle 0=sorted
                           >0=shuffled) */
 
-    unsigned char browserfont[MAX_FILENAME+1]; /* UI fonts */
-    unsigned char wpsfont[MAX_FILENAME+1];
-    unsigned char menufont[MAX_FILENAME+1];
+    unsigned char browserfont[MAX_FONT_FILENAME+1]; /* UI fonts */
+    unsigned char wpsfont[MAX_FONT_FILENAME+1];
+    unsigned char menufont[MAX_FONT_FILENAME+1];
 #ifdef CONFIG_TUNER
-    unsigned char tunerfont[MAX_FILENAME+1];
+    unsigned char tunerfont[MAX_FONT_FILENAME+1];
 #endif
 #ifdef HAVE_RECORDING
-    unsigned char recordfont[MAX_FILENAME+1];
+    unsigned char recordfont[MAX_FONT_FILENAME+1];
 #endif
+    unsigned char userfont1[MAX_FONT_FILENAME+1];
+    unsigned char userfont2[MAX_FONT_FILENAME+1];
+    unsigned char userfont3[MAX_FONT_FILENAME+1];
+    unsigned char userfont4[MAX_FONT_FILENAME+1];
+    unsigned char userfont5[MAX_FONT_FILENAME+1];
+    unsigned char userfont6[MAX_FONT_FILENAME+1];
+    unsigned char userfont7[MAX_FONT_FILENAME+1];
 
 #ifdef CONFIG_TUNER
     unsigned char fmr_file[MAX_FILENAME+1]; /* last fmr preset */
Index: rockbox/firmware/export/font.h
===================================================================
--- rockbox.orig/firmware/export/font.h
+++ rockbox/firmware/export/font.h
@@ -30,7 +30,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
@@ -50,6 +50,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
@@ -72,6 +79,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/firmware/font.c
===================================================================
--- rockbox.orig/firmware/font.c
+++ rockbox/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 */
@@ -338,6 +352,7 @@ struct font* font_load(const char *path,
 
     /* open and read entire font file*/
     fntfile[font].font_fd = open(path, O_RDONLY|O_BINARY);
+	
 
     if (fntfile[font].font_fd < 0) {
         DEBUGF("Can't open font: %s\n", path);
@@ -353,7 +368,7 @@ struct font* font_load(const char *path,
     fntfile[font].freeptr = (unsigned char *)(((int)font_membuf[font] + 3) & ~3);
     fntfile[font].fileptr = fntfile[font].freeptr;
 
-
+	DEBUGF("font size: %d\n", size);
     if (size > MAX_FONT_SIZE)
     {
         read(fntfile[font].font_fd, fntfile[font].fileptr, FONT_HEADER_SIZE);
@@ -530,10 +545,11 @@ const unsigned char* font_get_bits(struc
         char_code = pf->defaultchar;
     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));
+    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));
+    }
     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;
 }
@@ -586,6 +602,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;
 	}
@@ -630,6 +667,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;
 	}
