Index: apps/tagtree.h
===================================================================
--- apps/tagtree.h	(revision 13092)
+++ apps/tagtree.h	(working copy)
@@ -46,11 +46,7 @@
 bool tagtree_insert_selection_playlist(int position, bool queue);
 char *tagtree_get_title(struct tree_context* c);
 int tagtree_get_attr(struct tree_context* c);
-#ifdef HAVE_LCD_BITMAP
-const unsigned char* tagtree_get_icon(struct tree_context* c);
-#else
-int   tagtree_get_icon(struct tree_context* c);
-#endif
+int tagtree_get_icon(struct tree_context* c);
 int tagtree_get_filename(struct tree_context* c, char *buf, int buflen);
 
 #endif
Index: apps/screen_access.c
===================================================================
--- apps/screen_access.c	(revision 13092)
+++ apps/screen_access.c	(working copy)
@@ -53,6 +53,8 @@
             screen->mono_bitmap=&lcd_remote_mono_bitmap;
             screen->mono_bitmap_part=&lcd_remote_mono_bitmap_part;
             screen->set_drawmode=&lcd_remote_set_drawmode;
+            screen->transparent_bitmap=&lcd_bitmap;
+            screen->transparent_bitmap_part=&lcd_bitmap_part;
 #if LCD_REMOTE_DEPTH > 1
 #if defined(HAVE_LCD_COLOR)
             screen->color_to_native=&lcd_remote_color_to_native;
Index: apps/recorder/icons.h
===================================================================
--- apps/recorder/icons.h	(revision 13092)
+++ apps/recorder/icons.h	(working copy)
@@ -50,7 +50,7 @@
 };
 
 /* If any icons are added to this enum, they must be
-   added to the unused_but_needed enum in ../player/icons.h */
+   added to the unused_but_needed enum in ../player/icons.h 
 enum icons_6x8 {
     Icon_Audio,
     Icon_Folder,
@@ -88,7 +88,7 @@
     Icon_Rockbox,
     Icon6x8Last,
 };
-
+*/
 enum icons_7x8 {
     Icon_Plug,
     Icon_USBPlug,
@@ -144,7 +144,7 @@
 #endif /* CONFIG_CODEC == SWCODEC && defined (HAVE_RECORDING) */
 
 extern const unsigned char bitmap_icons_5x8[Icon5x8Last][5];
-extern const unsigned char bitmap_icons_6x8[Icon6x8Last][6];
+//extern const unsigned char bitmap_icons_6x8[Icon6x8Last][6];
 extern const unsigned char bitmap_icons_7x8[Icon7x8Last][7];
 extern const unsigned char bitmap_icon_disk[];
 
Index: apps/recorder/keyboard.c
===================================================================
--- apps/recorder/keyboard.c	(revision 13092)
+++ apps/recorder/keyboard.c	(working copy)
@@ -654,11 +654,11 @@
                 /* Draw nicer bitmap arrow if room, else settle for "<". */
                 if (text_w >= 6 && pm->font_h >= 8)
                 {
-                    sc->mono_bitmap(bitmap_icons_6x8[Icon_Reverse_Cursor],
+/*                    sc->mono_bitmap(bitmap_icons_6x8[Icon_Reverse_Cursor],
                                     (text_w - 6) / 2,
                                     pm->main_y + (pm->font_h - 8) / 2 ,
                                     6, 8);
-                }
+*/                }
                 else
                 {
                     int w;
@@ -672,11 +672,11 @@
                 /* Draw nicer bitmap arrow if room, else settle for ">". */
                 if (text_w >= 6 && pm->font_h >= 8)
                 {
-                    sc->mono_bitmap(bitmap_icons_6x8[Icon_Cursor],
+/*                    sc->mono_bitmap(bitmap_icons_6x8[Icon_Cursor],
                                     sc->width - text_w + (text_w - 6) / 2,
                                     pm->main_y + (pm->font_h - 8) / 2,
                                     6, 8);
-                }
+  */              }
                 else
                 {
                     sc->putsxy(sc->width - text_w, pm->main_y, ">");
Index: apps/tree.c
===================================================================
--- apps/tree.c	(revision 13092)
+++ apps/tree.c	(working copy)
@@ -219,20 +219,20 @@
 }
 
 
-static void tree_get_fileicon(int selected_item, void * data, ICON * icon)
+static int tree_get_fileicon(int selected_item, void * data)
 {
     struct tree_context * local_tc=(struct tree_context *)data;
 #ifdef HAVE_TAGCACHE
     bool id3db = *(local_tc->dirfilter) == SHOW_ID3DB;
     if (id3db) {
-        *icon = (ICON)tagtree_get_icon(&tc);
+        return tagtree_get_icon(&tc);
     }
     else
 #endif
         {
         struct entry* dc = local_tc->dircache;
         struct entry* e = &dc[selected_item];
-        *icon = (ICON)filetype_get_icon(e->attr);
+        return filetype_get_icon(e->attr);
     }
 }
 
Index: apps/settings.c
===================================================================
--- apps/settings.c	(revision 13092)
+++ apps/settings.c	(working copy)
@@ -1085,13 +1085,13 @@
     else oldvalue = *(bool*)variable;
 
     gui_synclist_init(&lists,value_setting_get_name_cb,(void*)cb_data,false,1);
-    gui_synclist_set_title(&lists, (char*)string,
+    gui_synclist_set_title(&lists, (char*)string,Icon_Questionmark);/*
 #ifdef HAVE_LCD_BITMAP
         bitmap_icons_6x8[Icon_Questionmark]
 #else
         NOICON
 #endif
-    );
+    );*/
     gui_synclist_set_icon_callback(&lists,NULL);
     gui_synclist_set_nb_items(&lists,nb_items);
     gui_synclist_limit_scroll(&lists,true);
Index: apps/gui/list.c
===================================================================
--- apps/gui/list.c	(revision 13092)
+++ apps/gui/list.c	(working copy)
@@ -54,7 +54,7 @@
 static struct gui_list* last_list_displayed[NB_SCREENS];
 
 #define SHOW_LIST_TITLE ((gui_list->title != NULL) && \
-                         (gui_list->display->nb_lines > 1))
+                         (gui_list->display->nb_lines > 2))
 
 static void gui_list_put_selection_in_screen(struct gui_list * gui_list,
                                              bool put_from_end);
@@ -92,7 +92,7 @@
     gui_list->selected_size=selected_size;
     gui_list->title = NULL;
     gui_list->title_width = 0;
-    gui_list->title_icon = NOICON;
+    gui_list->title_icon = Icon_NOICON;
 
     gui_list->last_displayed_selected_item = -1 ;
     gui_list->last_displayed_start_item = -1 ;
@@ -288,7 +288,7 @@
     {
         if (gui_list->title_icon != NOICON && draw_icons)
         {
-            screen_put_iconxy(display, 0, 0, gui_list->title_icon);
+            screen_put_icon(display, 0, 0, gui_list->title_icon);
 #ifdef HAVE_LCD_BITMAP
             text_pos = 8; /* pixels */
 #else
@@ -334,7 +334,7 @@
     if(!draw_cursor)
         icon_pos--;
     else
-        text_pos += CURSOR_WIDTH;
+        text_pos += get_icon_width(display->screen_type);
 
     if(draw_icons)
         text_pos += 8;
@@ -437,12 +437,10 @@
         /* Icons display */
         if(draw_icons)
         {
-            ICON icon;
-            gui_list->callback_get_item_icon(current_item,
-                                             gui_list->data,
-                                             &icon);
-            if(icon)
-                screen_put_iconxy(display, icon_pos, i, icon);
+            enum themable_icons icon;
+            icon = gui_list->callback_get_item_icon(current_item, gui_list->data);
+            if(icon > Icon_NOICON)
+                screen_put_icon(display, icon_pos, i, icon);
         }
     }
 
@@ -737,7 +735,8 @@
  * Set the title and title icon of the list. Setting title to NULL disables
  * both the title and icon. Use NOICON if there is no icon.
  */
-static void gui_list_set_title(struct gui_list * gui_list, char * title, ICON icon)
+static void gui_list_set_title(struct gui_list * gui_list, 
+                               char * title, enum themable_icons icon)
 {
     gui_list->title = title;
     gui_list->title_icon = icon;
@@ -870,7 +869,7 @@
 }
 
 void gui_synclist_set_title(struct gui_synclist * lists,
-                            char * title, ICON icon)
+                            char * title, enum themable_icons icon)
 {
     int i;
     FOR_NB_SCREENS(i)
Index: apps/gui/color_picker.c
===================================================================
--- apps/gui/color_picker.c	(revision 13092)
+++ apps/gui/color_picker.c	(working copy)
@@ -31,7 +31,7 @@
 #include "lang.h"
 #include "splash.h"
 #include "action.h"
-#include "icons.h"
+#include "icon.h"
 
 /* structure for color info */
 struct rgb_pick
@@ -220,13 +220,11 @@
                 /* Draw ">    <" around sliders */
                 int top = text_top + (display->char_height -
                                       SELECTOR_HEIGHT) / 2;
-                display->mono_bitmap(bitmap_icons_6x8[Icon_Cursor],
-                                     MARGIN_LEFT, top,
-                                     SELECTOR_WIDTH, SELECTOR_HEIGHT);
-                display->mono_bitmap(bitmap_icons_6x8[Icon_Reverse_Cursor],
-                                     display->width - MARGIN_RIGHT -
-                                     SELECTOR_WIDTH, top, SELECTOR_WIDTH,
-                                     SELECTOR_HEIGHT);
+                screen_put_iconxy(display, MARGIN_LEFT, top, Icon_Cursor);
+                screen_put_iconxy(display, 
+                                  display->width - MARGIN_RIGHT -
+                                          get_icon_width(display->screen_type), 
+                                          top, Icon_Cursor);
             }
 
             if (display->depth >= 16)
Index: apps/gui/list.h
===================================================================
--- apps/gui/list.h	(revision 13092)
+++ apps/gui/list.h	(working copy)
@@ -49,9 +49,7 @@
  *           the icon after the function returns.
  * Note : we use the ICON type because the real type depends of the plateform
  */
-typedef void list_get_icon(int selected_item,
-                           void * data,
-                           ICON * icon);
+typedef enum themable_icons list_get_icon(int selected_item, void * data);
 /*
  * Text callback
  *  - selected_item : an integer that tells the number of the item to display
@@ -100,7 +98,7 @@
     /* Cache the width of the title string in pixels/characters */
     int title_width;
     /* Optional title icon */
-    ICON title_icon;
+    enum themable_icons title_icon;
 };
 
 /*
@@ -190,7 +188,7 @@
 extern void gui_synclist_limit_scroll(struct gui_synclist * lists, bool scroll);
 extern void gui_synclist_flash(struct gui_synclist * lists);
 extern void gui_synclist_set_title(struct gui_synclist * lists, char * title,
-                                   ICON icon);
+                                   int icon);
 
 /*
  * Do the action implied by the given button,
Index: apps/gui/icon.c
===================================================================
--- apps/gui/icon.c	(revision 13092)
+++ apps/gui/icon.c	(working copy)
@@ -16,42 +16,172 @@
  * KIND, either express or implied.
  *
  ****************************************************************************/
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "inttypes.h"
 #include "config.h"
 #include "icon.h"
 #include "screen_access.h"
 #include "icons.h"
+#include "settings.h"
+#include "bmp.h"
 
-/* Count in letter positions, NOT pixels */
-void screen_put_iconxy(struct screen * display, int x, int y, ICON icon)
+#include <default_icons.h>
+#ifdef HAVE_REMOTE_LCD
+#include <remote_default_icons.h>
+#endif
+
+/* We dont actually do anything with these pointers,
+   but they need to be grouped like this to save code
+   so storing them as void* is ok. (stops compile warning) */
+static const void * inbuilt_icons[NB_SCREENS] = {
+        (void*)default_icons
+#ifdef HAVE_REMOTE_LCD
+      , (void*)remote_default_icons
+#endif
+};
+
+static const int default_width[NB_SCREENS] = {
+      BMPWIDTH_default_icons
+#ifdef HAVE_REMOTE_LCD
+    , BMPWIDTH_remote_default_icons
+#endif
+};
+static const int default_height[NB_SCREENS] = {
+      BMPHEIGHT_default_icons
+#ifdef HAVE_REMOTE_LCD
+    , BMPHEIGHT_remote_default_icons
+#endif
+};
+
+#define MAX_ICON_HEIGHT 24
+#define MAX_ICON_WIDTH 24
+#define IMG_BUFSIZE (MAX_ICON_HEIGHT*MAX_ICON_WIDTH* \
+                      Icon_Last_Themeable*LCD_DEPTH/8)
+static unsigned char icon_buffer[IMG_BUFSIZE][NB_SCREENS];
+static bool use_inbuilt[NB_SCREENS] = {false};
+static int icon_width[NB_SCREENS], icon_height[NB_SCREENS];
+static struct bitmap user_iconset[NB_SCREENS];
+
+/* x,y in letter positions */
+void screen_put_icon(struct screen * display, 
+                       int x, int y, enum themable_icons icon)
 {
-#ifdef HAVE_LCD_BITMAP
+    int xpos, ypos;
     int width, height;
-    int xpos, ypos;
+    int screen = display->screen_type;
     display->getstringsize((unsigned char *)"M", &width, &height);
-    xpos = x*CURSOR_WIDTH;
+    xpos = x*icon_width[screen];
     ypos = y*height + display->getymargin();
 
-    if ( height > CURSOR_HEIGHT )/* center the cursor */
-        ypos += (height - CURSOR_HEIGHT) / 2;
-    if(icon==0)/* Don't display invalid icons */
-        screen_clear_area(display, xpos, ypos, CURSOR_WIDTH, CURSOR_HEIGHT);
+    if ( height > icon_height[screen] )/* center the cursor */
+        ypos += (height - icon_height[screen]) / 2;
+    screen_put_iconxy(display, xpos, ypos, icon);
+}
+
+/* x,y in pixels */
+void screen_put_iconxy(struct screen * display, 
+                       int xpos, int ypos, enum themable_icons icon)
+{
+    int source_width;
+    fb_data *data;
+    int screen = display->screen_type;
+    if (icon == Icon_NOICON)
+    {
+        screen_clear_area(display, xpos, ypos,
+                          icon_width[screen], icon_height[screen]);
+        return;
+    }
+    if (icon > Icon_Last_Themeable) /* its a icon from viewers.config */
+    {
+        return;
+#if 0
+        icon_index = ?
+        draw the icon then return 
+#endif
+    }
+    else if (use_inbuilt[screen])
+    {
+        data = (fb_data *)inbuilt_icons[screen];
+        source_width = default_width[screen];
+    }
     else
-        display->mono_bitmap(icon, xpos, ypos, CURSOR_WIDTH, CURSOR_HEIGHT);
-#else
-    if(icon==-1)
-        display->putc(x, y, ' ');
-    else
-        display->putc(x, y, icon);
+    {
+        data = (fb_data *)user_iconset[screen].data;
+        source_width = user_iconset[screen].width;
+    }
+#ifdef HAVE_REMOTE_LCD
+    if (display->screen_type == SCREEN_REMOTE)
+    {
+        display->mono_bitmap_part((unsigned char *)data, icon_width[screen]*icon, 0,
+                                    source_width, xpos, ypos, 
+                                    icon_width[screen], icon_height[screen]);
+        return;
+    }
 #endif
+#if LCD_DEPTH == 16
+    display->transparent_bitmap_part(data, icon_width[screen]*icon, 0,
+                                     source_width, xpos, ypos, 
+                                     icon_width[screen], icon_height[screen]);
+#else /* LCD_DEPTH < 16 */
+    display->bitmap_part(data, icon_width[screen]*icon, 0,
+                              source_width, xpos, ypos, 
+                              icon_width[screen], icon_height[screen]);
+#endif /* LCD_DEPTH == 16 */
 }
 
 void screen_put_cursorxy(struct screen * display, int x, int y, bool on)
 {
 #ifdef HAVE_LCD_BITMAP
-    screen_put_iconxy(display, x, y, on?bitmap_icons_6x8[Icon_Cursor]:0);
+    screen_put_icon(display, x, y, on?Icon_Cursor:0);
 #else
-    screen_put_iconxy(display, x, y, on?CURSOR_CHAR:-1);
+    screen_put_icon(display, x, y, on?CURSOR_CHAR:-1);
 #endif
 
 }
+
+void load_icons(const char* filename, enum screen_type screen_type)
+{
+    int size_read;
+    if (filename && (icon_buffer[screen_type] == NULL))
+        load_icons(NULL, screen_type); /* force a buffer init an inbuilt icon load before
+                             loading the users iconset */
+    
+    use_inbuilt[screen_type] = true;
+    icon_width[screen_type]  = default_width[screen_type] / Icon_Last_Themeable;
+    icon_height[screen_type] = default_height[screen_type];
+    
+    if (filename != NULL)
+    {
+        user_iconset[screen_type].data = icon_buffer[screen_type];
+        size_read = read_bmp_file((char*)filename, &user_iconset[screen_type],
+                                  IMG_BUFSIZE,
+                                  FORMAT_NATIVE | FORMAT_DITHER);
+        if (size_read > 0)
+        {
+            use_inbuilt[screen_type] = false;
+            icon_width[screen_type]  = user_iconset[screen_type].width
+                                            / Icon_Last_Themeable;
+            icon_height[screen_type] = user_iconset[screen_type].height;
+        }
+    }
+}
+
+
+void icons_init(void)
+{
+    char path[MAX_PATH];
+    snprintf(path, MAX_PATH, "%s/%s.bmp", ICON_DIR, global_settings.icon_file);
+    load_icons(global_settings.icon_file[0]?path:NULL, SCREEN_MAIN);
+#ifdef HAVE_REMOTE_LCD
+    snprintf(path, MAX_PATH, "%s/%s.bmp", ICON_DIR,
+             global_settings.remote_icon_file);
+    load_icons(global_settings.remote_icon_file[0]?path:NULL, SCREEN_REMOTE);
+#endif
+}
+
+int get_icon_width(enum screen_type screen_type)
+{
+    return icon_width[screen_type];
+}
Index: apps/gui/icon.h
===================================================================
--- apps/gui/icon.h	(revision 13092)
+++ apps/gui/icon.h	(working copy)
@@ -25,19 +25,55 @@
 #ifdef HAVE_LCD_BITMAP
 typedef const unsigned char * ICON;
 typedef unsigned char * ICON_NO_CONST;
-#define NOICON NULL
+#define NOICON Icon_NOICON
 #else
 typedef long ICON;
 #define ICON_NO_CONST ICON
-#define NOICON -1
+#define NOICON Icon_NOICON
 #endif
 
-#define Icon_NOICON -1
 
 #define CURSOR_CHAR 0xe10c
-#define CURSOR_WIDTH 6
-#define CURSOR_HEIGHT 8
 
+/* Don't #ifdef icon values, or we wont be able to use the same 
+   cmp for every target. */
+enum themable_icons {
+    Icon_NOICON = -1, /* Dont put this in a .bmp */
+    Icon_Audio,
+    Icon_Folder,
+    Icon_Playlist,
+    Icon_Cursor,
+    Icon_Wps,
+    Icon_Firmware,
+    Icon_Font,
+    Icon_Language,
+    Icon_Config,
+    Icon_Plugin,
+    Icon_Bookmark,
+    Icon_Preset,
+    Icon_Queued,
+    Icon_Moving,
+    Icon_Keyboard,
+    Icon_Reverse_Cursor,
+    Icon_Questionmark,
+    Icon_Menu_setting,
+    Icon_Menu_functioncall,
+    Icon_Submenu,
+    Icon_Submenu_Entered,
+    Icon_Recording,
+    Icon_Voice,
+    Icon_General_settings_menu,
+    Icon_System_menu,
+    Icon_Playback_menu,
+    Icon_Display_menu,
+    Icon_Remote_Display_menu,
+    Icon_Radio_screen,
+    Icon_file_view_menu,
+    Icon_EQ,
+    Icon_Rockbox,
+    Icon_Last_Themeable,
+};
+
 /*
  * Draws a cursor at a given position, if th
  * - screen : the screen where we put the cursor
@@ -49,12 +85,22 @@
 /*
  * Put an icon on a screen at a given position
  * (the position is given in characters)
- * If the given icon is null (HAVE_LCD_BITMAP) or -1 otherwise, the icon
+ * If the given icon is Icon_blank, the icon
  * at the given position will be erased
  * - screen : the screen where we put our icon
- * - x, y : the position, in character, not in pixel !!
+ * - x, y : the position, pixel value !!
  * - icon : the icon to put
  */
-extern void screen_put_iconxy(struct screen * screen, int x, int y, ICON icon);
+extern void screen_put_iconxy(struct screen * screen,
+                              int x, int y, enum themable_icons icon);
+/* as above, but x,y are letter position, NOT PIXEL */
+extern void screen_put_icon(struct screen * screen,
+                              int x, int y, enum themable_icons icon);
 
+void load_icons(const char* filename, enum screen_type screen_type);
+
+void icons_init(void);
+
+int get_icon_width(enum screen_type screen_type);
+
 #endif /*_GUI_ICON_H_*/
Index: apps/menu.c
===================================================================
--- apps/menu.c	(revision 13092)
+++ apps/menu.c	(working copy)
@@ -137,7 +137,7 @@
     return P2STR(menu->callback_and_desc->desc);
 }
 #ifdef HAVE_LCD_BITMAP
-static void menu_get_icon(int selected_item, void * data, ICON * icon)
+static int menu_get_icon(int selected_item, void * data)
 {
     const struct menu_item_ex *menu = (const struct menu_item_ex *)data;
     int menu_icon = Icon_NOICON;
@@ -145,8 +145,7 @@
     
     if ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID)
     {
-        *icon = bitmap_icons_6x8[Icon_Menu_functioncall];
-        return;
+        return Icon_Menu_functioncall;
     }
     menu = menu->submenus[selected_item];
     if (menu->flags&MENU_HAS_DESC)
@@ -154,28 +153,24 @@
     else if (menu->flags&MENU_DYNAMIC_DESC)
         menu_icon = menu->menu_get_name_and_icon->icon_id;
     
-    switch (menu->flags&MENU_TYPE_MASK)
+    if (menu_icon == Icon_NOICON)
     {
-        case MT_SETTING:
-        case MT_SETTING_W_TEXT:
-            *icon = bitmap_icons_6x8[Icon_Menu_setting];
-            break;
-        case MT_MENU:
-            if (menu_icon == Icon_NOICON)
-                *icon = bitmap_icons_6x8[Icon_Submenu];
-            else
-                *icon = bitmap_icons_6x8[menu_icon];
-            break;
-        case MT_FUNCTION_CALL:
-        case MT_RETURN_VALUE:
-            if (menu_icon == Icon_NOICON)
-                *icon = bitmap_icons_6x8[Icon_Menu_functioncall];
-            else 
-                *icon = bitmap_icons_6x8[menu_icon];
-            break;
-        default:
-            *icon = NOICON;
+        switch (menu->flags&MENU_TYPE_MASK)
+        {
+            case MT_SETTING:
+            case MT_SETTING_W_TEXT:
+                menu_icon = Icon_Menu_setting;
+                break;
+            case MT_MENU:
+                    menu_icon = Icon_Submenu;
+                break;
+            case MT_FUNCTION_CALL:
+            case MT_RETURN_VALUE:
+                menu_icon = Icon_Menu_functioncall;
+                break;
+        }
     }
+    return menu_icon;
 }
 #endif
 
@@ -185,7 +180,7 @@
     int i, count = MENU_GET_COUNT(menu->flags);
     int type = (menu->flags&MENU_TYPE_MASK);
     menu_callback_type menu_callback = NULL;
-    ICON icon = NOICON;
+    int icon;
     current_subitems_count = 0;
 
     if (type == MT_OLD_MENU)
@@ -221,9 +216,9 @@
     gui_synclist_init(lists,get_menu_item_name,(void*)menu,false,1);
 #ifdef HAVE_LCD_BITMAP
     if (menu->callback_and_desc->icon_id == Icon_NOICON)
-        icon = bitmap_icons_6x8[Icon_Submenu_Entered];
+        icon = Icon_Submenu_Entered;
     else
-        icon = bitmap_icons_6x8[menu->callback_and_desc->icon_id];
+        icon = menu->callback_and_desc->icon_id;
     gui_synclist_set_title(lists, P2STR(menu->callback_and_desc->desc), icon);  
     gui_synclist_set_icon_callback(lists, menu_get_icon);
 #else
@@ -699,10 +694,10 @@
 }
 
 #ifdef HAVE_LCD_BITMAP
-static void oldmenu_get_icon(int selected_item, void * data, ICON * icon)
+static int oldmenu_get_icon(int selected_item, void * data)
 {
     (void)data; (void)selected_item;
-    *icon = bitmap_icons_6x8[Icon_Menu_functioncall];
+    return Icon_Menu_functioncall;
 }
 #endif
 
@@ -717,7 +712,7 @@
     gui_synclist_select_item(lists, selected);
 #ifdef HAVE_LCD_BITMAP
     gui_synclist_set_title(lists, menus[menu->value].title,
-                           bitmap_icons_6x8[Icon_Submenu_Entered]);
+                           Icon_Submenu_Entered);
     gui_synclist_set_icon_callback(lists, oldmenu_get_icon);
 #endif
 }
Index: apps/settings.h
===================================================================
--- apps/settings.h	(revision 13092)
+++ apps/settings.h	(working copy)
@@ -55,6 +55,7 @@
 #define LANG_DIR    ROCKBOX_DIR "/langs"
 #define WPS_DIR     ROCKBOX_DIR "/wps"
 #define THEME_DIR   ROCKBOX_DIR "/themes"
+#define ICON_DIR    ROCKBOX_DIR "/icons"
 #define PLUGIN_DIR  ROCKBOX_DIR "/rocks"
 #define VIEWERS_DIR  ROCKBOX_DIR "/viewers"
 #define BACKDROP_DIR ROCKBOX_DIR "/backdrops"
@@ -706,7 +707,11 @@
     (defined(HAVE_RECORDING) || CONFIG_TUNER)
     int alarm_wake_up_screen;
 #endif
-
+    /* customizable icons */
+    unsigned char icon_file[MAX_FILENAME+1];
+#ifdef HAVE_REMOTE_LCD
+    unsigned char remote_icon_file[MAX_FILENAME+1];
+#endif
 };
 
 /** global variables **/
Index: apps/bitmaps/remote_native/SOURCES
===================================================================
--- apps/bitmaps/remote_native/SOURCES	(revision 13092)
+++ apps/bitmaps/remote_native/SOURCES	(working copy)
@@ -3,6 +3,7 @@
 #if (LCD_REMOTE_DEPTH == 1)
 remote_rockboxlogo.128x42x1.bmp
 remote_usblogo.104x27x1.bmp
+remote_default_icons.6x8x1.bmp
 #elif (LCD_REMOTE_DEPTH == 2)
 remote_rockboxlogo.128x42x2.bmp
 remote_usblogo.104x27x2.bmp
Index: apps/bitmaps/native/SOURCES
===================================================================
--- apps/bitmaps/native/SOURCES	(revision 13092)
+++ apps/bitmaps/native/SOURCES	(working copy)
@@ -40,4 +40,11 @@
 #endif
 #endif
 
+/* List Icons */
+#if LCD_DEPTH == 16
+default_icons.6x8x16.bmp
+#else
+default_icons.6x8x1.bmp
+#endif
+
 #endif /* HAVE_LCD_BITMAP */
Index: apps/playlist_viewer.c
===================================================================
--- apps/playlist_viewer.c	(revision 13092)
+++ apps/playlist_viewer.c	(working copy)
@@ -570,7 +570,7 @@
 }
 
 
-static void playlist_callback_icons(int selected_item, void *data, ICON * icon)
+static int playlist_callback_icons(int selected_item, void *data)
 {
     struct playlist_viewer * local_viewer=(struct playlist_viewer *)data;
     struct playlist_entry *track=
@@ -578,36 +578,20 @@
     if (track->index == local_viewer->current_playing_track)
     {
         /* Current playing track */
-#ifdef HAVE_LCD_BITMAP
-        *icon=bitmap_icons_6x8[Icon_Audio];
-#else
-        *icon=Icon_Audio;
-#endif
+        return Icon_Audio;
     }
     else if (track->index == local_viewer->move_track)
     {
         /* Track we are moving */
-#ifdef HAVE_LCD_BITMAP
-        *icon=bitmap_icons_6x8[Icon_Moving];
-#else
-        *icon=Icon_Moving;
-#endif
+        return Icon_Moving;
     }
     else if (track->queued)
     {
         /* Queued track */
-#ifdef HAVE_LCD_BITMAP
-        *icon=bitmap_icons_6x8[Icon_Queued];
-#else
-        *icon=Icon_Queued;
-#endif
+        return Icon_Queued;
     }
     else
-#ifdef HAVE_LCD_BITMAP
-        *icon=0;
-#else
-        *icon=-1;
-#endif
+        return Icon_NOICON;
 }
 
 /* Main viewer function.  Filename identifies playlist to be viewed.  If NULL,
@@ -627,13 +611,13 @@
                   &playlist_callback_icons:NULL);
     gui_synclist_set_nb_items(&playlist_lists, viewer.num_tracks);
     gui_synclist_select_item(&playlist_lists, viewer.selected_track);
-    gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST_MENU), 
+    gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST_MENU), Icon_Playlist);/*
 #ifdef HAVE_LCD_BITMAP
                             bitmap_icons_6x8[Icon_Playlist]
 #else
                             NOICON
 #endif
-                          );
+                          );*/
     gui_synclist_draw(&playlist_lists);
     action_signalscreenchange();
     while (!exit)
@@ -797,17 +781,6 @@
     return(buffer);
 }
 
-
-static void playlist_search_callback_icons(int selected_item, void * data, ICON * icon)
-{
-    (void)selected_item;
-    (void)data;
-#ifdef HAVE_LCD_BITMAP
-        *icon=0;
-#else
-        *icon=-1;
-#endif
-}
 bool search_playlist(void)
 {
     char search_str[32] = "";
@@ -848,9 +821,7 @@
     backlight_on();
     gui_synclist_init(&playlist_lists, playlist_search_callback_name,
                                 found_indicies, false, 1);
-    gui_synclist_set_icon_callback(&playlist_lists,
-                  global_settings.playlist_viewer_icons?
-                  &playlist_search_callback_icons:NULL);
+    gui_synclist_set_icon_callback(&playlist_lists, NULL);
     gui_synclist_set_nb_items(&playlist_lists, found_indicies_count);
     gui_synclist_select_item(&playlist_lists, 0);
     gui_synclist_draw(&playlist_lists);
Index: apps/settings_list.c
===================================================================
--- apps/settings_list.c	(revision 13092)
+++ apps/settings_list.c	(working copy)
@@ -1160,6 +1164,14 @@
     {F_T_INT, &global_settings.alarm_wake_up_screen, LANG_ALARM_WAKEUP_SCREEN,
         INT(ALARM_START_WPS), "alarm wakeup screen", ALARM_SETTING_TEXT, UNUSED},
 #endif /* HAVE_RTC_ALARM */
+            
+    /* Customizable icons */
+    FILENAME_SETTING(F_THEMESETTING, icon_file, "iconset", "",
+                     ICON_DIR "/", ".bmp", MAX_FILENAME+1),
+#ifdef HAVE_REMOTE_LCD
+    FILENAME_SETTING(F_THEMESETTING, remote_icon_file, "remote iconset", "",
+                    ICON_DIR "/", ".bmp", MAX_FILENAME+1),
+#endif
 };
 
 const int nb_settings = sizeof(settings)/sizeof(*settings);
Index: apps/plugin.h
===================================================================
--- apps/plugin.h	(revision 13092)
+++ apps/plugin.h	(working copy)
@@ -274,7 +274,7 @@
     void (*gui_synclist_flash)(struct gui_synclist * lists);
     unsigned (*gui_synclist_do_button)(struct gui_synclist * lists,
                                          unsigned button,enum list_wrap wrap);
-    void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, ICON icon);
+    void (*gui_synclist_set_title)(struct gui_synclist *lists, char* title, int icon);
 
     /* button */
     long (*button_get)(bool block);
Index: apps/filetypes.c
===================================================================
--- apps/filetypes.c	(revision 13092)
+++ apps/filetypes.c	(working copy)
@@ -55,7 +55,7 @@
 #define ROCK_EXTENSION "rock"
 
 struct file_type {
-    ICON_NO_CONST  icon; /* the icon which shall be used for it, NOICON if unknown */
+    int  icon; /* the icon which shall be used for it, NOICON if unknown */
     bool  viewer; /* true if the rock is in viewers, false if in rocks */
     unsigned char  attr; /* FILETYPES_MASK >> 8 */ 
     char* plugin; /* Which plugin to use, NULL if unknown, or builtin */
@@ -80,12 +80,12 @@
     filetypes[0].extension = NULL;
     filetypes[0].plugin = NULL;
     filetypes[0].attr   = 0;
-    filetypes[0].icon   = 
+    filetypes[0].icon   = Icon_Folder;/*
 #ifdef HAVE_LCD_BITMAP
                             (ICON_NO_CONST)&bitmap_icons_6x8[Icon_Folder];
 #else
                             (ICON_NO_CONST)Icon_Folder;
-#endif
+#endif*/
     filetype_count = 1;
     read_builtin_types();
     read_config(VIEWERS_CONFIG);
@@ -119,12 +119,12 @@
         filetypes[filetype_count].attr   = types[i].tree_attr>>8;
         if (filetypes[filetype_count].attr > heighest_attr)
             heighest_attr = filetypes[filetype_count].attr;
-        filetypes[filetype_count].icon   = 
+        filetypes[filetype_count].icon   = types[i].icon;/*
 #ifdef HAVE_LCD_BITMAP
                             (ICON_NO_CONST)&bitmap_icons_6x8[types[i].icon];
 #else
                             (ICON_NO_CONST)types[i].icon;
-#endif
+#endif*/
         filetype_count++;
     }
 }
@@ -211,14 +211,14 @@
         }
         if (good_icon)
         {
-            filetypes[filetype_count].icon = 
+       /*     filetypes[filetype_count].icon = 
                                 (ICON_NO_CONST)buffer_alloc(ICON_LENGTH);
             memcpy(filetypes[filetype_count].icon, icon, ICON_LENGTH);
-        }
+        */}
         else 
-            filetypes[filetype_count].icon = NOICON;
+            filetypes[filetype_count].icon = Icon_NOICON;
 #else
-        filetypes[filetype_count].icon = Icon_Unknown;
+        filetypes[filetype_count].icon = Icon_NOICON;
 #endif
         filetype_count++;
     }
@@ -254,12 +254,12 @@
     return -1;
 }
 
-ICON filetype_get_icon(int attr)
+int filetype_get_icon(int attr)
 {
     int index = find_attr(attr);
     if (index < 0)
-        return NOICON;
-    return (ICON)filetypes[index].icon;
+        return Icon_NOICON;
+    return filetypes[index].icon;
 }
 
 char* filetype_get_plugin(const struct entry* file)
Index: apps/filetypes.h
===================================================================
--- apps/filetypes.h	(revision 13092)
+++ apps/filetypes.h	(working copy)
@@ -28,7 +28,7 @@
 
 /* Return the attribute (TREE_ATTR_*) of the file */
 int filetype_get_attr(const char* file);
-ICON filetype_get_icon(int attr);
+int filetype_get_icon(int attr);
 /* return the plugin filename associated with the file */
 char* filetype_get_plugin(const struct entry* file);
 
Index: apps/main.c
===================================================================
--- apps/main.c	(revision 13092)
+++ apps/main.c	(working copy)
@@ -70,6 +70,7 @@
 #include "splash.h"
 #include "eeprom_settings.h"
 #include "scrobbler.h"
+#include "icon.h"
 
 #if (CONFIG_CODEC == SWCODEC)
 #include "playback.h"
@@ -267,6 +268,7 @@
     sleep(HZ/2);
     tree_init();
     filetype_init();
+    icons_init();
     playlist_init();
 
 #if CONFIG_CODEC != SWCODEC
@@ -501,6 +503,7 @@
     playlist_init();
     tree_init();
     filetype_init();
+    icons_init();
     scrobbler_init();
     cuesheet_init();
 
Index: apps/tagtree.c
===================================================================
--- apps/tagtree.c	(revision 13092)
+++ apps/tagtree.c	(working copy)
@@ -1677,20 +1677,12 @@
     return attr;
 }
 
-#ifdef HAVE_LCD_BITMAP
-const unsigned char* tagtree_get_icon(struct tree_context* c)
-#else
-int   tagtree_get_icon(struct tree_context* c)
-#endif
+int tagtree_get_icon(struct tree_context* c)
 {
     int icon = Icon_Folder;
 
     if (tagtree_get_attr(c) == TREE_ATTR_MPA)
         icon = Icon_Audio;
 
-#ifdef HAVE_LCD_BITMAP
-    return bitmap_icons_6x8[icon];
-#else
     return icon;
-#endif
 }
