diff --git a/apps/gui/icon.c b/apps/gui/icon.c
index 73c0fb5..cf4f56a 100644
--- a/apps/gui/icon.c
+++ b/apps/gui/icon.c
@@ -237,10 +237,12 @@ static void load_icons(const char* filename, enum Iconset iconset,
     *loaded_ok = false;
     if (!allow_disable || (filename[0] && filename[0] != '-'))
     {
-        char path[MAX_PATH];
+        char path[MAX_PATH], temp[MAX_PATH];
+        const char* file;
         
         snprintf(path, sizeof(path), "%s/%s.bmp", ICON_DIR, filename);
-        size_read = read_bmp_file(path, bmp, IMG_BUFSIZE, bmpformat, NULL);
+        file = get_user_file_path(path, IS_FILE, temp, sizeof(temp));
+        size_read = read_bmp_file(file, bmp, IMG_BUFSIZE, bmpformat, NULL);
         if (size_read > 0)
         {
             *loaded_ok = true;
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index 3a000b2..7bd7999 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -114,13 +114,11 @@ bool skin_backdrops_preload(void)
             if (screen == SCREEN_MAIN && global_settings.backdrop_file[0] &&
                 global_settings.backdrop_file[0] != '-' && filename[0] == '-')
             {
-                char dir[MAX_PATH];
+                char path[MAX_PATH];
                 char* temp = filename+2; /* slightly hacky to get a buffer */
                 size_t size = sizeof(backdrops[i].name) - 2;
-                snprintf(temp, size, "%s/%s.bmp",
-                         get_user_file_path(BACKDROP_DIR, 0, dir, sizeof(dir)),
-                         global_settings.backdrop_file);
-                filename = temp;
+                snprintf(temp, size, BACKDROP_DIR "/%s.bmp", global_settings.backdrop_file);
+                filename = (char*)get_user_file_path(temp, IS_FILE, path, sizeof(path));
             }
             if (*filename && *filename != '-')
             {
@@ -158,6 +156,7 @@ void skin_backdrop_load_setting(void)
 {
     int i;
     char filename[MAX_PATH], dir[MAX_PATH];
+    const char *temp;
     for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++)
     {
         if (backdrops[i].name[0] == '-' && backdrops[i].screen == SCREEN_MAIN)
@@ -167,11 +166,11 @@ void skin_backdrop_load_setting(void)
             {
                 if (!backdrops[i].buffer)
                     backdrops[i].buffer = (char*)skin_buffer_alloc(LCD_BACKDROP_BYTES);
-                snprintf(filename, sizeof filename, "%s/%s.bmp",
-                         get_user_file_path(BACKDROP_DIR, 0, dir, sizeof(dir)),
+                snprintf(filename, sizeof filename, BACKDROP_DIR "/%s.bmp",
                          global_settings.backdrop_file);
+                temp = get_user_file_path(filename, IS_FILE, dir, sizeof(dir));
                 bool loaded = backdrops[i].buffer && 
-                              screens[SCREEN_MAIN].backdrop_load(filename,
+                              screens[SCREEN_MAIN].backdrop_load(temp,
                                                             backdrops[i].buffer);
                 backdrops[i].name[2] = loaded ? '.' : '\0';
                 return;
diff --git a/apps/gui/skin_engine/skin_fonts.c b/apps/gui/skin_engine/skin_fonts.c
index e5081e8..23086cb 100644
--- a/apps/gui/skin_engine/skin_fonts.c
+++ b/apps/gui/skin_engine/skin_fonts.c
@@ -73,7 +73,7 @@ int skin_font_load(char* font_name, int glyphs)
         return FONT_UI_REMOTE;
 #endif
     snprintf(tmp, MAX_PATH, FONT_DIR "/%s.fnt", font_name);
-    get_user_file_path(tmp, FORCE_BUFFER_COPY, filename, sizeof(filename));
+    get_user_file_path(tmp, IS_FILE|FORCE_BUFFER_COPY, filename, sizeof(filename));
     
     for(i=0;i<MAXUSERFONTS;i++)
     {
diff --git a/firmware/common/rbpaths.c b/firmware/common/rbpaths.c
index b63586c..62a23e0 100644
--- a/firmware/common/rbpaths.c
+++ b/firmware/common/rbpaths.c
@@ -42,6 +42,21 @@ void paths_init(void)
 #endif
 }
 
+static bool try_path(const char* filename, unsigned flags)
+{
+    if (flags & IS_FILE)
+    {
+        if (file_exists(filename))
+            return true;
+    }
+    else
+    {
+        if (dir_exists(filename))
+            return true;
+    }
+    return false;
+}
+
 const char* get_user_file_path(const char *path,
                                unsigned flags,
                                char* buf,
@@ -49,7 +64,6 @@ const char* get_user_file_path(const char *path,
 {
     const char *ret = path;
     const char *pos = path;
-    printf("%s(): looking for %s\n", __func__, path);
     /* replace ROCKBOX_DIR in path with $HOME/.config/rockbox.org */
     pos += ROCKBOX_DIR_LEN;
     if (*pos == '/') pos += 1;
@@ -66,19 +80,18 @@ const char* get_user_file_path(const char *path,
      * write access is needed */
     if (flags & NEED_WRITE)
         ret = buf;
-    else
+    else if (try_path(buf, flags))
+        ret = buf;
+        
+    if (ret != buf) /* not found in $HOME, try ROCKBOX_BASE_DIR, !NEED_WRITE only */
     {
-        if (flags & IS_FILE)
-        {
-            if (file_exists(buf))
-                ret = buf;
-        }
-        else
-        {
-            if (dir_exists(buf))
-                ret = buf;
-        }
+        if (snprintf(buf, bufsize, ROCKBOX_SHARE_PATH "/%s", pos) >= (int)bufsize)
+            return NULL;
+
+        if (try_path(buf, flags))
+            ret = buf;
     }
+        
 
     /* make a copy if we're about to return the path*/
     if (UNLIKELY((flags & FORCE_BUFFER_COPY) && (ret != buf)))
@@ -87,6 +100,5 @@ const char* get_user_file_path(const char *path,
         ret = buf;
     }
 
-    printf("%s(): %s\n", __func__, ret);
     return ret;
 }
diff --git a/tools/configure b/tools/configure
index e716439..cff38b0 100755
--- a/tools/configure
+++ b/tools/configure
@@ -86,13 +86,13 @@ app_get_platform() {
     # setup files and paths depending on the platform
     if [ "$app_platform" = "sdl" ]; then
         if [ -z "$PREFIX" ]; then
-            rbdir="/usr/local/share/rockbox"
+            sharedir="/usr/local/share/rockbox"
             bindir="/usr/local/bin"
             bindir_full=$bindir
             libdir="/usr/local/lib"
             libdir_full=$libdir
         else
-            rbdir=`realpath $PREFIX/share/rockbox`
+            sharedir=`realpath $PREFIX/share/rockbox`
             bindir="$PREFIX/bin"
             libdir="$PREFIX/lib"
             if [ -d bindir ]; then
@@ -118,7 +118,7 @@ app_get_platform() {
             echo "environment variable point to the root directory of the Android NDK."
             exit
         fi
-        rbdir="/data/data/org.rockbox/app_rockbox/rockbox"
+        sharedir="/data/data/org.rockbox/app_rockbox/rockbox"
         bindir="/data/data/org.rockbox/lib"
         bindir_full=$bindir
         libdir="/data/data/org.rockbox/app_rockbox"
@@ -3136,6 +3136,7 @@ sed > autoconf.h \
  -e "s<@config_rtc@<$config_rtc<g" \
  -e "s<@have_rtc_alarm@<$have_rtc_alarm<g" \
  -e "s<@RBDIR@<${rbdir}<g" \
+ -e "s<@sharepath@<${sharedir}<g" \
  -e "s<@binpath@<${bindir_full}<g" \
  -e "s<@libpath@<${libdir_full}<g" \
  -e "s<@have_backlight@<$have_backlight<g" \
@@ -3176,6 +3177,7 @@ sed > autoconf.h \
 
 /* root of Rockbox */
 #define ROCKBOX_DIR "@RBDIR@"
+#define ROCKBOX_SHARE_PATH "@sharepath@"
 #define ROCKBOX_BINARY_PATH "@binpath@"
 #define ROCKBOX_LIBRARY_PATH "@libpath@"
 
@@ -3296,6 +3298,7 @@ sed > Makefile \
  -e "s<@RBDIR@<${rbdir}<g" \
  -e "s<@binpath@<${bindir}<g" \
  -e "s<@libpath@<${libdir}<g" \
+ -e "s<@sharepath@<${sharedir}<g" \
  -e "s<@PREFIX@<$PREFIX<g" \
  -e "s<@CMDLINE@<$cmdline<g" \
  -e "s<@SDLCONFIG@<$sdl<g" \
@@ -3363,6 +3366,7 @@ export ENC_OPTS=@ENC_OPTS@
 export ENCODER=@ENCODER@
 export USE_ELF=@USE_ELF@
 export RBDIR=@RBDIR@
+export ROCKBOX_SHARE_PATH=@sharepath@
 export ROCKBOX_BINARY_PATH=@binpath@
 export ROCKBOX_LIBRARY_PATH=@libpath@
 export SDLCONFIG=@SDLCONFIG@
