diff --git a/apps/filetypes.c b/apps/filetypes.c
index 28a2da6..0e0cbd8 100644
--- a/apps/filetypes.c
+++ b/apps/filetypes.c
@@ -182,15 +182,14 @@ static void read_config(const char* config_file);
  * load a colors file from a theme with:
  * filetype colours: filename.colours */
 void read_color_theme_file(void) {
-    char buffer[MAX_PATH], dir[MAX_PATH];
+    char buffer[MAX_PATH];
     int fd;
     char *ext, *color;
     int i;
     for (i = 0; i < MAX_FILETYPES+1; i++) {
         custom_colors[i] = -1;
     }
-    snprintf(buffer, MAX_PATH, "%s/%s.colours",
-             get_user_file_path(THEME_DIR, 0, dir, sizeof(dir)),
+    snprintf(buffer, MAX_PATH, THEME_DIR "/%s.colours",
              global_settings.colors_file);
     fd = open(buffer, O_RDONLY);
     if (fd < 0)
@@ -273,7 +272,6 @@ void read_viewer_theme_file(void)
 
 void  filetype_init(void)
 {
-    char path[MAX_PATH];
     /* set the directory item first */
     filetypes[0].extension = NULL;
     filetypes[0].plugin = NULL;
@@ -282,7 +280,7 @@ void  filetype_init(void)
     
     filetype_count = 1;
     read_builtin_types();
-    read_config(get_user_file_path(VIEWERS_CONFIG, IS_FILE, path, sizeof(path)));
+    read_config(VIEWERS_CONFIG);
 #ifdef HAVE_LCD_BITMAP
     read_viewer_theme_file();
 #endif
diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index e337774..39407bd 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -68,8 +68,7 @@ int skin_backdrop_assign(char* backdrop, char *bmpdir,
     }
     else
     {
-        const char *bd_dir = get_user_file_path(bmpdir, 0, dir, sizeof(dir));
-        get_image_filename(backdrop, bd_dir, filename, sizeof(filename));
+        get_image_filename(backdrop, bmpdir, filename, sizeof(filename));
     }
     for (i=0; i<NB_BDROPS; i++)
     {
@@ -115,13 +114,10 @@ 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(filename, size, BACKDROP_DIR "/%s.bmp", global_settings.backdrop_file);
             }
             if (*filename && *filename != '-')
             {
@@ -161,7 +157,7 @@ void skin_backdrop_unload(int backdrop_id)
 void skin_backdrop_load_setting(void)
 {
     int i;
-    char filename[MAX_PATH], dir[MAX_PATH];
+    char filename[MAX_PATH];
     for(i=0;i<SKINNABLE_SCREENS_COUNT*NB_SCREENS;i++)
     {
         if (backdrops[i].name[0] == '-' && backdrops[i].screen == SCREEN_MAIN)
@@ -171,8 +167,7 @@ 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);
                 bool loaded = backdrops[i].buffer && 
                               screens[SCREEN_MAIN].backdrop_load(filename,
diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c
index 8bf1658..4157587 100644
--- a/apps/gui/skin_engine/skin_engine.c
+++ b/apps/gui/skin_engine/skin_engine.c
@@ -214,9 +214,7 @@ struct gui_wps *skin_get_gwps(enum skinnable_screens skin, enum screen_type scre
         buf[0] = '\0'; /* force it to reload the default */
         if (strcmp(setting, "rockbox_failsafe"))
         {
-            snprintf(buf, sizeof buf, "%s/%s.%s",
-                 get_user_file_path(WPS_DIR, false, path, sizeof(path)),
-                 setting, ext);
+            snprintf(buf, sizeof buf, WPS_DIR "/%s.%s", setting, ext);
         }
         cpu_boost(true);
         skin_load(skin, screen, buf, true);
diff --git a/apps/gui/skin_engine/skin_fonts.c b/apps/gui/skin_engine/skin_fonts.c
index e5081e8..23255aa 100644
--- a/apps/gui/skin_engine/skin_fonts.c
+++ b/apps/gui/skin_engine/skin_fonts.c
@@ -64,7 +64,6 @@ int skin_font_load(char* font_name, int glyphs)
     struct font *pf;
     struct skin_font_info *font = NULL;
     char filename[MAX_PATH];
-    char tmp[MAX_PATH];
     
     if (!strcmp(font_name, global_settings.font_file))
         return FONT_UI;
@@ -72,8 +71,7 @@ int skin_font_load(char* font_name, int glyphs)
     if (!strcmp(font_name, global_settings.remote_font_file))
         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));
+    snprintf(filename, MAX_PATH, FONT_DIR "/%s.fnt", font_name);
     
     for(i=0;i<MAXUSERFONTS;i++)
     {
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index ed475ac..cec5c17 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -1624,8 +1624,7 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
         strlcpy(bmpdir, buf, dot - buf + 1);
     }
     else
-    {   /* fall back to backdrop dir for built-in themes */
-        /* no get_user_file_path(), assuming we ship bmps for built-in themes */
+    {
         snprintf(bmpdir, MAX_PATH, "%s", BACKDROP_DIR);
     }
     /* load the bitmaps that were found by the parsing */
diff --git a/apps/main.c b/apps/main.c
index 950168d..7af4cca 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -172,13 +172,13 @@ int main(void)
 #ifdef AUTOROCK
     {
         char filename[MAX_PATH];
-        const char *file = get_user_file_path(
+        const char *file = 
 #ifdef APPLICATION
                                 ROCKBOX_DIR
 #else
                                 PLUGIN_APPS_DIR
 #endif
-            "/autostart.rock", NEED_WRITE|IS_FILE, filename, sizeof(filename));
+                                    "/autostart.rock";
         if(file_exists(file)) /* no complaint if it doesn't exist */
         {
             plugin_load(file, NULL); /* start if it does */
diff --git a/apps/menus/theme_menu.c b/apps/menus/theme_menu.c
index 66274e2..983eca9 100644
--- a/apps/menus/theme_menu.c
+++ b/apps/menus/theme_menu.c
@@ -246,11 +246,9 @@ static struct browse_folder_info themes = {THEME_DIR, SHOW_CFG};
 
 int browse_folder(void *param)
 {
-    char path[MAX_PATH];
     const struct browse_folder_info *info =
         (const struct browse_folder_info*)param;
-    return rockbox_browse(get_user_file_path(info->dir, 0, path, sizeof(path)),
-                          info->show_options);
+    return rockbox_browse(info->dir, info->show_options);
 }
 
 #ifdef HAVE_LCD_BITMAP
diff --git a/apps/playlist.c b/apps/playlist.c
index a50dac6..6e4ae18 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -1439,12 +1439,7 @@ static int get_next_dir(char *dir, bool is_forward, bool recursion)
     /* process random folder advance */
     if (global_settings.next_folder == FOLDER_ADVANCE_RANDOM)
     {
-        char folder_advance_list[MAX_PATH];
-        get_user_file_path(ROCKBOX_DIR, FORCE_BUFFER_COPY,
-                folder_advance_list, sizeof(folder_advance_list));
-        strlcat(folder_advance_list, "/folder_advance_list.dat",
-                sizeof(folder_advance_list));
-        int fd = open(folder_advance_list, O_RDONLY);
+        int fd = open(ROCKBOX_DIR "/folder_advance_list.dat", O_RDONLY);
         if (fd >= 0)
         {
             char buffer[MAX_PATH];
@@ -1914,8 +1909,7 @@ void playlist_init(void)
     struct playlist_info* playlist = &current_playlist;
 
     playlist->current = true;
-    get_user_file_path(PLAYLIST_CONTROL_FILE, IS_FILE|NEED_WRITE|FORCE_BUFFER_COPY,
-            playlist->control_filename,
+    strlcpy(playlist->control_filename, PLAYLIST_CONTROL_FILE,
             sizeof(playlist->control_filename));
     playlist->fd = -1;
     playlist->control_fd = -1;
diff --git a/apps/playlist_catalog.c b/apps/playlist_catalog.c
index ef44e36..098a4d4 100644
--- a/apps/playlist_catalog.c
+++ b/apps/playlist_catalog.c
@@ -79,11 +79,9 @@ static int initialize_catalog(void)
         /* fall back to default directory if no or invalid config */
         if (default_dir)
         {
-            const char *dir = get_user_file_path(PLAYLIST_CATALOG_DEFAULT_DIR,
-                                    FORCE_BUFFER_COPY|NEED_WRITE,
-                                    playlist_dir, sizeof(playlist_dir));
-            if (!dir_exists(dir))
-                mkdir(dir);
+            strcpy(playlist_dir, PLAYLIST_CATALOG_DEFAULT_DIR);
+            if (!dir_exists(playlist_dir))
+                mkdir(playlist_dir);
         }
 
         playlist_dir_length = strlen(playlist_dir);
diff --git a/apps/settings.c b/apps/settings.c
index 85b0489..848c7c1 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -118,9 +118,7 @@ static bool read_nvram_data(char* buf, int max_len)
     unsigned crc32 = 0xffffffff;
     int var_count = 0, i = 0, buf_pos = 0;
 #ifndef HAVE_RTC_RAM
-    char path[MAX_PATH];
-    int fd = open(get_user_file_path(NVRAM_FILE, IS_FILE|NEED_WRITE,
-                  path, sizeof(path)), O_RDONLY);
+    int fd = open(NVRAM_FILE, O_RDONLY);
     int bytes;
     if (fd < 0)
         return false;
@@ -174,7 +172,6 @@ static bool write_nvram_data(char* buf, int max_len)
     char var_count = 0;
 #ifndef HAVE_RTC_RAM
     int fd;
-    char path[MAX_PATH];
 #endif
     memset(buf,0,max_len);
     /* magic, version */
@@ -198,8 +195,7 @@ static bool write_nvram_data(char* buf, int max_len)
                     max_len-NVRAM_DATA_START-1,0xffffffff);
     memcpy(&buf[4],&crc32,4);
 #ifndef HAVE_RTC_RAM
-    fd = open(get_user_file_path(NVRAM_FILE, IS_FILE|NEED_WRITE,
-                  path, sizeof(path)),O_CREAT|O_TRUNC|O_WRONLY, 0666);
+    fd = open(NVRAM_FILE,O_CREAT|O_TRUNC|O_WRONLY, 0666);
     if (fd >= 0)
     {
         int len = write(fd,buf,max_len);
@@ -230,12 +226,8 @@ void settings_load(int which)
         read_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
     if (which&SETTINGS_HD)
     {
-        const char *file;
-        char path[MAX_PATH];
-        file = get_user_file_path(CONFIGFILE, IS_FILE|NEED_WRITE, path, sizeof(path));
-        settings_load_config(file, false);
-        file = get_user_file_path(FIXEDSETTINGSFILE, IS_FILE, path, sizeof(path));
-        settings_load_config(file, false);
+        settings_load_config(CONFIGFILE, false);
+        settings_load_config(FIXEDSETTINGSFILE, false);
     }
 }
 
@@ -596,11 +588,8 @@ static void flush_global_status_callback(void *data)
 static void flush_config_block_callback(void *data)
 {
     (void)data;
-    char path[MAX_PATH];
     write_nvram_data(nvram_buffer,NVRAM_BLOCK_SIZE);
-    settings_write_config(
-            get_user_file_path(CONFIGFILE, IS_FILE|NEED_WRITE, path, sizeof(path)),
-            SETTINGS_SAVE_CHANGED);
+    settings_write_config(CONFIGFILE, SETTINGS_SAVE_CHANGED);
 }
 
 /*
@@ -644,7 +633,7 @@ int settings_save(void)
 
 bool settings_save_config(int options)
 {
-    char filename[MAX_PATH], path[MAX_PATH];
+    char filename[MAX_PATH];
     const char *folder, *namebase;
     switch (options)
     {
@@ -673,8 +662,6 @@ bool settings_save_config(int options)
             namebase = "config";
             break;
     }
-
-    folder = get_user_file_path(folder, NEED_WRITE, path, sizeof(path));
     create_numbered_filename(filename, folder, namebase, ".cfg", 2
                              IF_CNFN_NUM_(, NULL));
 
@@ -884,13 +871,11 @@ void settings_apply(bool read_disk)
     {
         char buf[MAX_PATH];
 #ifdef HAVE_LCD_BITMAP
-        char dir[MAX_PATH];
-        const char *font_path = get_user_file_path(FONT_DIR, 0, dir, sizeof(dir));
         /* fonts need to be loaded before the WPS */
         if (global_settings.font_file[0]
             && global_settings.font_file[0] != '-') {
             
-            snprintf(buf, sizeof buf, "%s/%s.fnt", font_path,
+            snprintf(buf, sizeof buf, FONT_DIR "/%s.fnt",
                      global_settings.font_file);
             CHART2(">font_load ", global_settings.font_file);
             rc = font_load(NULL, buf);
@@ -903,7 +888,7 @@ void settings_apply(bool read_disk)
 #ifdef HAVE_REMOTE_LCD        
         if ( global_settings.remote_font_file[0]
             && global_settings.remote_font_file[0] != '-') {
-            snprintf(buf, sizeof buf, "%s/%s.fnt", font_path,
+            snprintf(buf, sizeof buf, FONT_DIR "%s.fnt",
                      global_settings.remote_font_file);
             CHART2(">font_load_remoteui ", global_settings.remote_font_file);
             rc = font_load_remoteui(buf);
@@ -915,8 +900,7 @@ void settings_apply(bool read_disk)
             font_load_remoteui(NULL);
 #endif
         if ( global_settings.kbd_file[0]) {
-            snprintf(buf, sizeof buf, "%s/%s.kbd",
-                     get_user_file_path(ROCKBOX_DIR, 0, dir, sizeof(dir)),
+            snprintf(buf, sizeof buf, ROCKBOX_DIR "/%s.kbd",
                      global_settings.kbd_file);
             CHART(">load_kbd");
             load_kbd(buf);
@@ -925,8 +909,6 @@ void settings_apply(bool read_disk)
         else
             load_kbd(NULL);
 #endif /* HAVE_LCD_BITMAP */
-        /* no get_user_file_path() here because we don't really support
-         * langs that don't come with rockbox */
         if ( global_settings.lang_file[0]) {
             snprintf(buf, sizeof buf, LANG_DIR "/%s.lng",
                      global_settings.lang_file);
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 39ed99f..e0b7608 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -73,9 +73,9 @@
 #include "buffer.h"
 #include "crc32.h"
 #include "misc.h"
-#include "filefuncs.h"
 #include "settings.h"
 #include "dir.h"
+#include "filefuncs.h"
 #include "structec.h"
 
 #ifndef __PCTOOL__
@@ -293,17 +293,15 @@ static bool is_dircache_intact(void)
 static int open_tag_fd(struct tagcache_header *hdr, int tag, bool write)
 {
     int fd;
-    char buf[MAX_PATH], path[MAX_PATH];
-    const char * file;
+    char buf[MAX_PATH];
     int rc;
     
     if (TAGCACHE_IS_NUMERIC(tag) || tag < 0 || tag >= TAG_COUNT)
         return -1;
     
     snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, tag);
-    file = get_user_file_path(buf, IS_FILE | NEED_WRITE, path, sizeof(path));
     
-    fd = open(file, write ? O_RDWR : O_RDONLY);
+    fd = open(buf, write ? O_RDWR : O_RDONLY);
     if (fd < 0)
     {
         logf("tag file open failed: tag=%d write=%d file=%s", tag, write, buf);
@@ -328,12 +326,8 @@ static int open_master_fd(struct master_header *hdr, bool write)
 {
     int fd;
     int rc;
-    char path[MAX_PATH];
     
-    fd = open(get_user_file_path(TAGCACHE_FILE_MASTER,
-                                 IS_FILE|NEED_WRITE,
-                                 path, sizeof(path)),
-                    write ? O_RDWR : O_RDONLY);
+    fd = open(TAGCACHE_FILE_MASTER, write ? O_RDWR : O_RDONLY);
     if (fd < 0)
     {
         logf("master file open failed for R/W");
@@ -675,12 +669,10 @@ static bool open_files(struct tagcache_search *tcs, int tag)
 {
     if (tcs->idxfd[tag] < 0)
     {
-        char fn[MAX_PATH], path[MAX_PATH];
-        const char *file;
+        char fn[MAX_PATH];
 
         snprintf(fn, sizeof fn, TAGCACHE_FILE_INDEX, tag);
-        file = get_user_file_path(fn, IS_FILE | NEED_WRITE, path, sizeof(path));
-        tcs->idxfd[tag] = open(file, O_RDONLY);
+        tcs->idxfd[tag] = open(fn, O_RDONLY);
     }
     
     if (tcs->idxfd[tag] < 0)
@@ -1168,17 +1160,14 @@ static void remove_files(void)
     tc_stat.ready = false;
     tc_stat.ramcache = false;
     tc_stat.econ = false;
-    remove(get_user_file_path(TAGCACHE_FILE_MASTER, NEED_WRITE|IS_FILE,
-                              buf, sizeof(buf)));
+    remove(TAGCACHE_FILE_MASTER);
     for (i = 0; i < TAG_COUNT; i++)
     {
-        char buf2[MAX_PATH];
         if (TAGCACHE_IS_NUMERIC(i))
             continue;
-
-        /* database_%d.tcd -> database_0.tcd */
+        
         snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, i);
-        remove(get_user_file_path(buf, NEED_WRITE | IS_FILE, buf2, sizeof(buf2)));
+        remove(buf);
     }
 }
 
@@ -1329,11 +1318,10 @@ bool tagcache_search_add_clause(struct tagcache_search *tcs,
     
     if (!TAGCACHE_IS_NUMERIC(clause->tag) && tcs->idxfd[clause->tag] < 0)
     {
-        char buf[MAX_PATH], path[MAX_PATH];
-        const char *file;
-        snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, clause->tag);
-        file = get_user_file_path(buf, IS_FILE | NEED_WRITE, path, sizeof(path));
-        tcs->idxfd[clause->tag] = open(file, O_RDONLY);
+        char buf[MAX_PATH];
+
+        snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, clause->tag);        
+        tcs->idxfd[clause->tag] = open(buf, O_RDONLY);
     }
     
     tcs->clause[tcs->clause_count] = clause;
@@ -2357,8 +2345,7 @@ static int build_index(int index_type, struct tagcache_header *h, int tmpfd)
     struct master_header   tcmh;
     struct index_entry idxbuf[IDX_BUF_DEPTH];
     int idxbuf_pos;
-    char buf[TAG_MAXLEN+32], path[MAX_PATH];
-    const char *file;
+    char buf[TAG_MAXLEN+32];
     int fd = -1, masterfd;
     bool error = false;
     int init;
@@ -2506,8 +2493,7 @@ static int build_index(int index_type, struct tagcache_header *h, int tmpfd)
          * anything whether the index type is sorted or not.
          */
         snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, index_type);
-        file = get_user_file_path(buf, IS_FILE | NEED_WRITE, path, sizeof(path));
-        fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+        fd = open(buf, O_WRONLY | O_CREAT | O_TRUNC, 0666);
         if (fd < 0)
         {
             logf("%s open fail", buf);
@@ -2527,21 +2513,18 @@ static int build_index(int index_type, struct tagcache_header *h, int tmpfd)
         }
     }
 
-    file = get_user_file_path(TAGCACHE_FILE_MASTER,
-                                            IS_FILE|NEED_WRITE,
-                                            buf, sizeof(buf));
     /* Loading the tag lookup file as "master file". */
     logf("Loading index file");
-    masterfd = open(file, O_RDWR);
+    masterfd = open(TAGCACHE_FILE_MASTER, O_RDWR);
 
     if (masterfd < 0)
     {
         logf("Creating new DB");
-        masterfd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+        masterfd = open(TAGCACHE_FILE_MASTER, O_WRONLY | O_CREAT | O_TRUNC, 0666);
 
         if (masterfd < 0)
         {
-            logf("Failure to create index file (%s)", file);
+            logf("Failure to create index file (%s)", TAGCACHE_FILE_MASTER);
             close(fd);
             return -2;
         }
@@ -2849,8 +2832,6 @@ static bool commit(void)
 {
     struct tagcache_header tch;
     struct master_header   tcmh;
-    char path[MAX_PATH];
-    const char *file;
     int i, len, rc;
     int tmpfd;
     int masterfd;
@@ -2864,10 +2845,7 @@ static bool commit(void)
     while (write_lock)
         sleep(1);
 
-    file = get_user_file_path(TAGCACHE_FILE_TEMP,
-                            IS_FILE|NEED_WRITE, path, sizeof(path));
-
-    tmpfd = open(file, O_RDONLY);
+    tmpfd = open(TAGCACHE_FILE_TEMP, O_RDONLY);
     if (tmpfd < 0)
     {
         logf("nothing to commit");
@@ -2883,7 +2861,7 @@ static bool commit(void)
     {
         logf("incorrect tmpheader");
         close(tmpfd);
-        remove(file);
+        remove(TAGCACHE_FILE_TEMP);
         return false;
     }
 
@@ -2891,7 +2869,7 @@ static bool commit(void)
     {
         logf("nothing to commit");
         close(tmpfd);
-        remove(file);
+        remove(TAGCACHE_FILE_TEMP);
         return true;
     }
 
@@ -2899,8 +2877,7 @@ static bool commit(void)
     tc_stat.ready = check_all_headers();
     
 #ifdef HAVE_EEPROM_SETTINGS
-    remove(get_user_file_path(TAGCACHE_STATEFILE, IS_FILE | NEED_WRITE,
-                path, sizeof(path)));
+    remove(TAGCACHE_STATEFILE);
 #endif
     
     /* At first be sure to unload the ramcache! */
@@ -2990,7 +2967,7 @@ static bool commit(void)
     }
     
     close(tmpfd);
-    remove(file);
+    remove(TAGCACHE_FILE_TEMP);
     
     tc_stat.commit_step = 0;
     
@@ -3410,18 +3387,15 @@ bool tagcache_import_changelog(void)
     struct tagcache_header tch;
     int clfd;
     long masterfd;
-    char buf[MAX(MAX_PATH, 2048)];
-    const char *file;
+    char buf[2048];
     
     if (!tc_stat.ready)
         return false;
     
     while (read_lock)
         sleep(1);
-
-    file = get_user_file_path(TAGCACHE_FILE_CHANGELOG,
-                                   IS_FILE|NEED_WRITE, buf, sizeof(buf));
-    clfd = open(file, O_RDONLY);
+    
+    clfd = open(TAGCACHE_FILE_CHANGELOG, O_RDONLY);
     if (clfd < 0)
     {
         logf("failure to open changelog");
@@ -3463,8 +3437,7 @@ bool tagcache_create_changelog(struct tagcache_search *tcs)
 {
     struct master_header myhdr;
     struct index_entry idx;
-    const char *file;
-    char buf[MAX(TAG_MAXLEN+32, MAX_PATH)];
+    char buf[TAG_MAXLEN+32];
     char temp[32];
     int clfd;
     int i, j;
@@ -3476,9 +3449,7 @@ bool tagcache_create_changelog(struct tagcache_search *tcs)
         return false;
     
     /* Initialize the changelog */
-    file = get_user_file_path(TAGCACHE_FILE_CHANGELOG, IS_FILE | NEED_WRITE,
-                              buf, sizeof(buf));
-    clfd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+    clfd = open(TAGCACHE_FILE_CHANGELOG, O_WRONLY | O_CREAT | O_TRUNC, 0666);
     if (clfd < 0)
     {
         logf("failure to open changelog");
@@ -3796,15 +3767,11 @@ static bool allocate_tagcache(void)
 static bool tagcache_dumpload(void)
 {
     struct statefile_header shdr;
-    char path[MAX_PATH];
-    const char *file;
     int fd, rc;
     long offpos;
     int i;
-
-    file = get_user_file_path(TAGCACHE_STATEFILE, IS_FILE | NEED_WRITE,
-                                    path, sizeof(path));
-    fd = open(file, O_RDONLY);
+    
+    fd = open(TAGCACHE_STATEFILE, O_RDONLY);
     if (fd < 0)
     {
         logf("no tagcache statedump");
@@ -3850,16 +3817,12 @@ static bool tagcache_dumpload(void)
 static bool tagcache_dumpsave(void)
 {
     struct statefile_header shdr;
-    char path[MAX_PATH];
-    const char *file;
     int fd;
     
     if (!tc_stat.ramcache)
         return false;
     
-    file = get_user_file_path(TAGCACHE_STATEFILE, IS_FILE | NEED_WRITE,
-                                    path, sizeof(path));
-    fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+    fd = open(TAGCACHE_STATEFILE, O_WRONLY | O_CREAT | O_TRUNC, 0666);
     if (fd < 0)
     {
         logf("failed to create a statedump");
@@ -3885,8 +3848,7 @@ static bool load_tagcache(void)
     long bytesleft = tc_stat.ramcache_allocated;
     struct index_entry *idx;
     int rc, fd;
-    char *p, path[MAX_PATH];
-    const char *file;
+    char *p;
     int i, tag;
 
 # ifdef HAVE_DIRCACHE
@@ -3897,11 +3859,8 @@ static bool load_tagcache(void)
 # endif
     
     logf("loading tagcache to ram...");
-
-    file = get_user_file_path(TAGCACHE_FILE_MASTER,
-                              IS_FILE|NEED_WRITE,
-                              path, sizeof(path));
-    fd = open(file, O_RDONLY);
+    
+    fd = open(TAGCACHE_FILE_MASTER, O_RDONLY);
     if (fd < 0)
     {
         logf("tagcache open failed");
@@ -4111,14 +4070,12 @@ static bool load_tagcache(void)
 static bool check_deleted_files(void)
 {
     int fd;
-    char buf[TAG_MAXLEN+32], path[MAX_PATH];
-    const char *file;
+    char buf[TAG_MAXLEN+32];
     struct tagfile_entry tfe;
     
     logf("reverse scan...");
     snprintf(buf, sizeof buf, TAGCACHE_FILE_INDEX, tag_filename);
-    file = get_user_file_path(buf, IS_FILE | NEED_WRITE, path, sizeof(path));
-    fd = open(file, O_RDONLY);
+    fd = open(buf, O_RDONLY);
     
     if (fd < 0)
     {
@@ -4278,8 +4235,6 @@ void tagcache_build(const char *path)
 {
     struct tagcache_header header;
     bool ret;
-    char buf[MAX_PATH];
-    const char *file;
 
     curpath[0] = '\0';
     data_size = 0;
@@ -4292,21 +4247,19 @@ void tagcache_build(const char *path)
 #endif
     
     logf("updating tagcache");
-
-    file = get_user_file_path(TAGCACHE_FILE_TEMP,
-                                    IS_FILE|NEED_WRITE, buf, sizeof(buf));
     
-
-    if (file_exists(file))
+    cachefd = open(TAGCACHE_FILE_TEMP, O_RDONLY);
+    if (cachefd >= 0)
     {
         logf("skipping, cache already waiting for commit");
+        close(cachefd);
         return ;
     }
     
-    cachefd = open(file, O_RDWR | O_CREAT | O_TRUNC, 0666);
+    cachefd = open(TAGCACHE_FILE_TEMP, O_RDWR | O_CREAT | O_TRUNC, 0666);
     if (cachefd < 0)
     {
-        logf("master file open failed: %s", file);
+        logf("master file open failed: %s", TAGCACHE_FILE_TEMP);
         return ;
     }
 
@@ -4350,7 +4303,7 @@ void tagcache_build(const char *path)
 #endif
     if (commit())
     {
-        remove(file);
+        remove(TAGCACHE_FILE_TEMP);
         logf("tagcache built!");
     }
 #ifdef __PCTOOL__
@@ -4395,12 +4348,7 @@ void tagcache_unload_ramcache(void)
 {
     tc_stat.ramcache = false;
     /* Just to make sure there is no statefile present. */
-
-#if 0
-    char path[MAX_PATH];
-    remove(get_user_file_path(TAGCACHE_STATEFILE, IS_FILE | NEED_WRITE,
-                path, sizeof(path)));
-#endif
+    // remove(TAGCACHE_STATEFILE);
 }
 #endif
 
@@ -4409,7 +4357,6 @@ static void tagcache_thread(void)
 {
     struct queue_event ev;
     bool check_done = false;
-    char path[MAX_PATH];
 
     /* If the previous cache build/update was interrupted, commit
      * the changes first in foreground. */
@@ -4426,8 +4373,7 @@ static void tagcache_thread(void)
         check_done = tagcache_dumpload();
     }
 
-    remove(get_user_file_path(TAGCACHE_STATEFILE, IS_FILE | NEED_WRITE,
-                path, sizeof(path)));
+    remove(TAGCACHE_STATEFILE);
 # endif
     
     /* Allocate space for the tagcache if found on disk. */
@@ -4460,8 +4406,7 @@ static void tagcache_thread(void)
             
             case Q_REBUILD:
                 remove_files();
-                remove(get_user_file_path(TAGCACHE_FILE_TEMP,
-                                IS_FILE|NEED_WRITE, path, sizeof(path)));
+                remove(TAGCACHE_FILE_TEMP);
                 tagcache_build("/");
                 break;
             
diff --git a/apps/tree.c b/apps/tree.c
index 01a00d1..9235fec 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -261,8 +261,7 @@ static int tree_voice_cb(int selected_item, void * data)
 
 bool check_rockboxdir(void)
 {
-    char path[MAX_PATH];
-    if(!dir_exists(get_user_file_path(ROCKBOX_DIR, 0, path, sizeof(path))))
+    if(!dir_exists(ROCKBOX_DIR))
     {   /* No need to localise this message.
            If .rockbox is missing, it wouldn't work anyway */
         int i;
@@ -1017,10 +1016,9 @@ int rockbox_browse(const char *root, int dirfilter)
         /* If we've found a file to center on, do it */
         if (setting)
         {
-            char current[MAX_PATH], _dir[MAX_PATH];
+            char current[MAX_PATH];;
             /* if setting != NULL, ext and dir are not used uninitialized */
-            snprintf(current, sizeof(current), "%s/%s.%s",
-                     get_user_file_path(dir, 0, _dir, sizeof(_dir)), setting, ext);
+            snprintf(current, sizeof(current), "%s/%s.%s", dir, setting, ext);
             set_current_file(current);
             /* set_current_file changes dirlevel, change it back */
             tc.dirlevel = 0; 
diff --git a/firmware/common/file.c b/firmware/common/file.c
index 53a1a35..4c9eda7 100644
--- a/firmware/common/file.c
+++ b/firmware/common/file.c
@@ -230,6 +230,7 @@ static int open_internal(const char* pathname, int flags, bool use_cache)
 
 int file_open(const char* pathname, int flags)
 {
+    printf("opening: %s\n", pathname);
     /* By default, use the dircache if available. */
     return open_internal(pathname, flags, true);
 }
diff --git a/firmware/common/rbpaths.c b/firmware/common/rbpaths.c
index b63586c..7a47996 100644
--- a/firmware/common/rbpaths.c
+++ b/firmware/common/rbpaths.c
@@ -29,7 +29,6 @@
 #include "string-extra.h"
 #include "filefuncs.h"
 
-
 void paths_init(void)
 {
     /* make sure $HOME/.config/rockbox.org exists, it's needed for config.cfg */
@@ -42,14 +41,28 @@ void paths_init(void)
 #endif
 }
 
-const char* get_user_file_path(const char *path,
+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,
                                const size_t bufsize)
 {
     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 +79,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 +99,5 @@ const char* get_user_file_path(const char *path,
         ret = buf;
     }
 
-    printf("%s(): %s\n", __func__, ret);
     return ret;
 }
diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h
index cd87888..418d76b 100644
--- a/firmware/export/rbpaths.h
+++ b/firmware/export/rbpaths.h
@@ -84,6 +84,20 @@ static inline __attribute__((always_inline)) const char* get_user_file_path(cons
 
 #define paths_init()
 #else /* application */
+#ifndef PLUGIN
+static inline __attribute__((always_inline)) const char* get_user_file_path(const char *path,
+                               unsigned flags,
+                               char* buf,
+                               const size_t bufsize)
+{
+    if (flags & FORCE_BUFFER_COPY)
+    {
+        strlcpy(buf, path, bufsize);
+        return buf;
+    }
+    return path;
+}
+#endif
 
 #define PLUGIN_DIR          ROCKBOX_LIBRARY_PATH "/rockbox/rocks"
 #define CODECS_DIR          ROCKBOX_LIBRARY_PATH "/rockbox/codecs"
@@ -92,7 +106,7 @@ static inline __attribute__((always_inline)) const char* get_user_file_path(cons
 #define PLAYLIST_CATALOG_DEFAULT_DIR ROCKBOX_DIR "/Playlists"
 
 extern void paths_init(void);
-extern const char* get_user_file_path(const char *path,
+extern const char* _get_user_file_path(const char *path,
                                unsigned flags,
                                char* buf,
                                const size_t bufsize);
diff --git a/tools/configure b/tools/configure
index 5f148d8..9b5729f 100755
--- a/tools/configure
+++ b/tools/configure
@@ -88,13 +88,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
@@ -120,7 +120,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"
@@ -3138,6 +3138,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" \
@@ -3178,6 +3179,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@"
 
@@ -3306,6 +3308,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" \
@@ -3373,6 +3376,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@
diff --git a/uisimulator/common/io.c b/uisimulator/common/io.c
index 3591905..410913f 100644
--- a/uisimulator/common/io.c
+++ b/uisimulator/common/io.c
@@ -293,6 +293,11 @@ static const char *get_sim_pathname(const char *name)
 MYDIR *sim_opendir(const char *name)
 {
     DIR_T *dir;
+    char realpath[MAX_PATH];
+    if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN))
+    {
+        name = _get_user_file_path(name, 0, realpath, sizeof(realpath));
+    }
 
     dir = (DIR_T *) OPENDIR(get_sim_pathname(name));
 
@@ -354,8 +359,19 @@ int sim_open(const char *name, int o, ...)
 {
     int opts = rockbox2sim(o);
     int ret;
+    char realpath[MAX_PATH];
     if (num_openfiles >= MAX_OPEN_FILES)
         return -2;
+        
+    printf("opening: %s\n", name);
+    
+    if (!strncmp(ROCKBOX_DIR, name, ROCKBOX_DIR_LEN))
+    {
+        int flags = IS_FILE;
+        if (opts & (O_CREAT|O_RDWR))
+            flags |= NEED_WRITE;
+        name = _get_user_file_path(name, flags, realpath, sizeof(realpath));
+    }
 
     if (opts & O_CREAT)
     {
