diff --git a/NEWS b/NEWS
index a48bac467..3ce6b8403 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,7 @@ ver 0.15.7 (2009/??/??)
 * decoders:
   - ffmpeg: don't try to force stereo
 * mapper: fix memory leak when playlist_directory is not set
+* mapper: apply filesystem_charset to playlists
 * command: verify playlist name in the "rm" command
 
 
diff --git a/src/mapper.c b/src/mapper.c
index 5c19021f9..5518cb79e 100644
--- a/src/mapper.c
+++ b/src/mapper.c
@@ -221,14 +221,19 @@ map_spl_path(void)
 char *
 map_spl_utf8_to_fs(const char *name)
 {
-	char *filename, *path;
+	char *filename_utf8, *filename_fs, *path;
 
 	if (playlist_dir == NULL)
 		return NULL;
 
-	filename = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL);
-	path = g_build_filename(playlist_dir, filename, NULL);
-	g_free(filename);
+	filename_utf8 = g_strconcat(name, PLAYLIST_FILE_SUFFIX, NULL);
+	filename_fs = utf8_to_fs_charset(filename_utf8);
+	g_free(filename_utf8);
+	if (filename_fs == NULL)
+		return NULL;
+
+	path = g_build_filename(playlist_dir, filename_fs, NULL);
+	g_free(filename_fs);
 
 	return path;
 }
diff --git a/src/mapper.h b/src/mapper.h
index 2667f1eee..f109de0bd 100644
--- a/src/mapper.h
+++ b/src/mapper.h
@@ -99,6 +99,8 @@ map_spl_path(void);
  * Maps a playlist name (without the ".m3u" suffix) to a file system
  * path.  The return value is allocated on the heap and must be freed
  * with g_free().
+ *
+ * @return the path in file system encoding, or NULL if mapping failed
  */
 char *
 map_spl_utf8_to_fs(const char *name);
diff --git a/src/playlist_save.c b/src/playlist_save.c
index 776d3c385..13dbc721d 100644
--- a/src/playlist_save.c
+++ b/src/playlist_save.c
@@ -71,12 +71,15 @@ spl_save_queue(const char *name_utf8, const struct queue *queue)
 	char *path_fs;
 	FILE *file;
 
+	if (map_spl_path() == NULL)
+		return PLAYLIST_RESULT_DISABLED;
+
 	if (!spl_valid_name(name_utf8))
 		return PLAYLIST_RESULT_BAD_NAME;
 
 	path_fs = map_spl_utf8_to_fs(name_utf8);
 	if (path_fs == NULL)
-		return PLAYLIST_RESULT_DISABLED;
+		return PLAYLIST_RESULT_BAD_NAME;
 
 	if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) {
 		g_free(path_fs);
diff --git a/src/stored_playlist.c b/src/stored_playlist.c
index 131c2098a..5ed7182f6 100644
--- a/src/stored_playlist.c
+++ b/src/stored_playlist.c
@@ -152,9 +152,12 @@ spl_save(GPtrArray *list, const char *utf8path)
 
 	assert(utf8path != NULL);
 
+	if (map_spl_path() == NULL)
+		return PLAYLIST_RESULT_DISABLED;
+
 	path_fs = map_spl_utf8_to_fs(utf8path);
 	if (path_fs == NULL)
-		return PLAYLIST_RESULT_DISABLED;
+		return PLAYLIST_RESULT_BAD_NAME;
 
 	while (!(file = fopen(path_fs, "w")) && errno == EINTR);
 	g_free(path_fs);
@@ -178,7 +181,7 @@ spl_load(const char *utf8path)
 	char buffer[MPD_PATH_MAX];
 	char *path_fs;
 
-	if (!spl_valid_name(utf8path))
+	if (!spl_valid_name(utf8path) || map_spl_path() == NULL)
 		return NULL;
 
 	path_fs = map_spl_utf8_to_fs(utf8path);
@@ -299,12 +302,15 @@ spl_clear(const char *utf8path)
 	char *path_fs;
 	FILE *file;
 
+	if (map_spl_path() == NULL)
+		return PLAYLIST_RESULT_DISABLED;
+
 	if (!spl_valid_name(utf8path))
 		return PLAYLIST_RESULT_BAD_NAME;
 
 	path_fs = map_spl_utf8_to_fs(utf8path);
 	if (path_fs == NULL)
-		return PLAYLIST_RESULT_DISABLED;
+		return PLAYLIST_RESULT_BAD_NAME;
 
 	while (!(file = fopen(path_fs, "w")) && errno == EINTR);
 	g_free(path_fs);
@@ -323,12 +329,15 @@ spl_delete(const char *name_utf8)
 	char *path_fs;
 	int ret;
 
+	if (map_spl_path() == NULL)
+		return PLAYLIST_RESULT_DISABLED;
+
 	if (!spl_valid_name(name_utf8))
 		return PLAYLIST_RESULT_BAD_NAME;
 
 	path_fs = map_spl_utf8_to_fs(name_utf8);
 	if (path_fs == NULL)
-		return PLAYLIST_RESULT_DISABLED;
+		return PLAYLIST_RESULT_BAD_NAME;
 
 	ret = unlink(path_fs);
 	g_free(path_fs);
@@ -373,12 +382,15 @@ spl_append_song(const char *utf8path, struct song *song)
 	struct stat st;
 	char *path_fs;
 
+	if (map_spl_path() == NULL)
+		return PLAYLIST_RESULT_DISABLED;
+
 	if (!spl_valid_name(utf8path))
 		return PLAYLIST_RESULT_BAD_NAME;
 
 	path_fs = map_spl_utf8_to_fs(utf8path);
 	if (path_fs == NULL)
-		return PLAYLIST_RESULT_DISABLED;
+		return PLAYLIST_RESULT_BAD_NAME;
 
 	while (!(file = fopen(path_fs, "a")) && errno == EINTR);
 	g_free(path_fs);
@@ -448,6 +460,9 @@ spl_rename(const char *utf8from, const char *utf8to)
 	char *from_path_fs, *to_path_fs;
 	static enum playlist_result ret;
 
+	if (map_spl_path() == NULL)
+		return PLAYLIST_RESULT_DISABLED;
+
 	if (!spl_valid_name(utf8from) || !spl_valid_name(utf8to))
 		return PLAYLIST_RESULT_BAD_NAME;
 
@@ -457,7 +472,7 @@ spl_rename(const char *utf8from, const char *utf8to)
 	if (from_path_fs != NULL && to_path_fs != NULL)
 		ret = spl_rename_internal(from_path_fs, to_path_fs);
 	else
-		ret = PLAYLIST_RESULT_DISABLED;
+		ret = PLAYLIST_RESULT_BAD_NAME;
 
 	g_free(from_path_fs);
 	g_free(to_path_fs);