diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c
index 3a43a12..67a6614 100644
--- a/apps/plugins/blackjack.c
+++ b/apps/plugins/blackjack.c
@@ -29,8 +29,8 @@


/* save files */
-#define SCORE_FILE PLUGIN_GAMES_DIR "/blackjack.score"
-#define SAVE_FILE PLUGIN_GAMES_DIR "/blackjack.save"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/blackjack.score"
+#define SAVE_FILE PLUGIN_GAMES_DATA_DIR "/blackjack.save"
#define NUM_SCORES 5

/* final game return status */
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
index 6295862..379aadf 100644
--- a/apps/plugins/brickmania.c
+++ b/apps/plugins/brickmania.c
@@ -450,8 +450,8 @@ CONFIG_KEYPAD == SANSA_M200_PAD
*/

#define CONFIG_FILE_NAME "brickmania.cfg"
-#define SAVE_FILE PLUGIN_GAMES_DIR "/brickmania.save"
-#define SCORE_FILE PLUGIN_GAMES_DIR "/brickmania.score"
+#define SAVE_FILE PLUGIN_GAMES_DATA_DIR "/brickmania.save"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/brickmania.score"
#define NUM_SCORES 5


diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c
index c7af502..1a2f96d 100644
--- a/apps/plugins/bubbles.c
+++ b/apps/plugins/bubbles.c
@@ -30,9 +30,9 @@
#include "lib/highscore.h"

/* files */
-#define SCORE_FILE PLUGIN_GAMES_DIR "/bubbles.score"
-#define SAVE_FILE PLUGIN_GAMES_DIR "/bubbles.save"
-#define DATA_FILE PLUGIN_GAMES_DIR "/bubbles.data"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/bubbles.score"
+#define SAVE_FILE PLUGIN_GAMES_DATA_DIR "/bubbles.save"
+#define DATA_FILE PLUGIN_GAMES_DATA_DIR "/bubbles.data"

/* final game return status */
enum {
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index 1ca4025..11badbd 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -319,8 +319,8 @@
#endif
#endif

-#define MEMO_FILE PLUGIN_APPS_DIR "/.memo"
-#define TEMP_FILE PLUGIN_APPS_DIR "/~temp"
+#define MEMO_FILE PLUGIN_APPS_DATA_DIR "/.memo"
+#define TEMP_FILE PLUGIN_APPS_DATA_DIR "/~temp"

#define X_OFFSET ((LCD_WIDTH%7)/2)
#if LCD_HEIGHT <= 80
diff --git a/apps/plugins/chessbox/chessbox.c b/apps/plugins/chessbox/chessbox.c
index 9638168..4876231 100644
--- a/apps/plugins/chessbox/chessbox.c
+++ b/apps/plugins/chessbox/chessbox.c
@@ -59,7 +59,7 @@ extern const fb_data chessbox_pieces[];
#define YOFS ((LCD_HEIGHT-8*TILE_HEIGHT)/2)

/* save files */
-#define SAVE_FILE PLUGIN_GAMES_DIR "/chessbox.save"
+#define SAVE_FILE PLUGIN_GAMES_DATA_DIR "/chessbox.save"

/* commands enum */
#define COMMAND_NOP 0
diff --git a/apps/plugins/chessbox/chessbox_pgn.c b/apps/plugins/chessbox/chessbox_pgn.c
index 43da92e..846ea41 100644
--- a/apps/plugins/chessbox/chessbox_pgn.c
+++ b/apps/plugins/chessbox/chessbox_pgn.c
@@ -22,8 +22,8 @@
#include "plugin.h"
#include "chessbox_pgn.h"

-#define PGN_FILE PLUGIN_GAMES_DIR "/chessbox.pgn"
-#define LOG_FILE PLUGIN_GAMES_DIR "/chessbox.log"
+#define PGN_FILE PLUGIN_GAMES_DATA_DIR "/chessbox.pgn"
+#define LOG_FILE PLUGIN_GAMES_DATA_DIR "/chessbox.log"
int loghandler;

short kn_offs[8][2] = {{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
diff --git a/apps/plugins/clix.c b/apps/plugins/clix.c
index 0c928e0..193d590 100644
--- a/apps/plugins/clix.c
+++ b/apps/plugins/clix.c
@@ -192,7 +192,7 @@
#define CLIX_BUTTON_CLICK BUTTON_CENTER
#endif

-#define SCORE_FILE PLUGIN_GAMES_DIR "/clix.score"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/clix.score"
#define NUM_SCORES 5
struct highscore highscores[NUM_SCORES];

diff --git a/apps/plugins/disktidy.c b/apps/plugins/disktidy.c
index 995fd6d..d42a62d 100644
--- a/apps/plugins/disktidy.c
+++ b/apps/plugins/disktidy.c
@@ -44,8 +44,8 @@ struct tidy_type {
int tidy_type_count;
bool tidy_loaded_and_changed = false;

-#define DEFAULT_FILES PLUGIN_APPS_DIR "/disktidy.config"
-#define CUSTOM_FILES PLUGIN_APPS_DIR "/disktidy_custom.config"
+#define DEFAULT_FILES PLUGIN_APPS_DATA_DIR "/disktidy.config"
+#define CUSTOM_FILES PLUGIN_APPS_DATA_DIR "/disktidy_custom.config"

void add_item(const char* name, int index)
{
diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c
index 6b64fa7..1bbca81 100644
--- a/apps/plugins/invadrox.c
+++ b/apps/plugins/invadrox.c
@@ -632,7 +632,7 @@ CONFIG_KEYPAD == MROBE500_PAD
#define TARGET_BOTTOM 3
#define TARGET_UFO 4

-#define HISCOREFILE PLUGIN_GAMES_DIR "/invadrox.high"
+#define HISCOREFILE PLUGIN_GAMES_DATA_DIR "/invadrox.high"


/* The time (in ms) for one iteration through the game loop - decrease this
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index 02f8143..2f8d679 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -461,8 +461,8 @@ struct puzzle_level puzzle_levels[NUM_PUZZLE_LEVELS] = {
{4, 7, PUZZLE_TILE_LEFT|PUZZLE_TILE_UP} } },
};

-#define SAVE_FILE PLUGIN_GAMES_DIR "/jewels.save"
-#define SCORE_FILE PLUGIN_GAMES_DIR "/jewels.score"
+#define SAVE_FILE PLUGIN_GAMES_DATA_DIR "/jewels.save"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/jewels.score"
struct highscore highscores[NUM_SCORES];

static bool resume_file = false;
diff --git a/apps/plugins/keybox.c b/apps/plugins/keybox.c
index af41b3f..932fc5f 100644
--- a/apps/plugins/keybox.c
+++ b/apps/plugins/keybox.c
@@ -23,7 +23,7 @@
#include "lib/md5.h"


-#define KEYBOX_FILE PLUGIN_APPS_DIR "/keybox.dat"
+#define KEYBOX_FILE PLUGIN_APPS_DATA_DIR "/keybox.dat"
#define BLOCK_SIZE 8
#define MAX_ENTRIES 12*BLOCK_SIZE /* keep this a multiple of BLOCK_SIZE */
#define FIELD_LEN 32 /* should be enough for anyone ;) */
diff --git a/apps/plugins/lib/configfile.c b/apps/plugins/lib/configfile.c
index 0fb01c6..ab1e21a 100644
--- a/apps/plugins/lib/configfile.c
+++ b/apps/plugins/lib/configfile.c
@@ -23,12 +23,15 @@

static void get_cfg_filename(char* buf, int buf_len, const char* filename)
{
+#ifdef APPLICATION
+ rb->snprintf(buf, buf_len, PLUGIN_DATA_DIR "/%s", filename);
+#else
char *s;
rb->strcpy(buf, rb->plugin_get_current_filename());
s = rb->strrchr(buf, '/');
if (!s) /* should never happen */
{
- rb->snprintf(buf, buf_len, PLUGIN_DIR "/%s", filename);
+ rb->snprintf(buf, buf_len, PLUGIN_DATA_DIR "/%s", filename);
}
else
{
@@ -36,6 +39,7 @@ static void get_cfg_filename(char* buf, int buf_len, const char* filename)
*s = '\0';
rb->strcat(s, filename);
}
+#endif
}

int configfile_save(const char *filename, struct configdata *cfg,
diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c
index caae9dc..97a3b82 100644
--- a/apps/plugins/pictureflow/pictureflow.c
+++ b/apps/plugins/pictureflow/pictureflow.c
@@ -228,7 +228,7 @@ typedef fb_data pix_t;
#define MAX_SLIDES_COUNT 10

#define THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200
-#define CACHE_PREFIX PLUGIN_DEMOS_DIR "/pictureflow"
+#define CACHE_PREFIX PLUGIN_DEMOS_DATA_DIR "/pictureflow"

#define EV_EXIT 9999
#define EV_WAKEUP 1337
diff --git a/apps/plugins/pitch_detector.c b/apps/plugins/pitch_detector.c
index 324a36b..5e68822 100644
--- a/apps/plugins/pitch_detector.c
+++ b/apps/plugins/pitch_detector.c
@@ -311,7 +311,7 @@ static struct tuner_settings
/* Settings loading and saving(adapted from the clock plugin) */
/*=================================================================*/

-#define SETTINGS_FILENAME PLUGIN_APPS_DIR "/.pitch_detector_settings"
+#define SETTINGS_FILENAME PLUGIN_APPS_DATA_DIR "/.pitch_detector_settings"

/* The settings as they exist on the hard disk, so that
* we can know at saving time if changes have been made */
diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c
index d86cb1c..b3767c1 100644
--- a/apps/plugins/rockblox.c
+++ b/apps/plugins/rockblox.c
@@ -800,8 +800,8 @@ bool resume = false;
bool resume_file = false;

/* Rockbox File System only supports full filenames inc dir */
-#define SCORE_FILE PLUGIN_GAMES_DIR "/rockblox.score"
-#define RESUME_FILE PLUGIN_GAMES_DIR "/rockblox.resume"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/rockblox.score"
+#define RESUME_FILE PLUGIN_GAMES_DATA_DIR "/rockblox.resume"
#define NUM_SCORES 5

/* Default High Scores... */
diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c
index 120485a..5e591ca 100644
--- a/apps/plugins/snake.c
+++ b/apps/plugins/snake.c
@@ -254,7 +254,7 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left;
#define BOARD_HEIGHT (LCD_HEIGHT/4)

#define CONFIG_FILE_NAME "snake.cfg"
-#define SCORE_FILE PLUGIN_GAMES_DIR "/snake.score"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/snake.score"
#define NUM_SCORES 5

static int board[BOARD_WIDTH][BOARD_HEIGHT],snakelength;
diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c
index 1b15267..3d8b973 100644
--- a/apps/plugins/snake2.c
+++ b/apps/plugins/snake2.c
@@ -413,7 +413,7 @@ static struct highscore highscores[NUM_SCORES];
#define SOUTH_WEST 4096

#define LEVELS_FILE PLUGIN_GAMES_DIR "/snake2.levels"
-#define SCORE_FILE PLUGIN_GAMES_DIR "/snake2.score"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/snake2.score"

int load_all_levels(void)
{
diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c
index 6fe2b26..4028833 100644
--- a/apps/plugins/sokoban.c
+++ b/apps/plugins/sokoban.c
@@ -29,8 +29,13 @@
#define SOKOBAN_TITLE "Sokoban"

#define SOKOBAN_LEVELS_FILE PLUGIN_GAMES_DIR "/sokoban.levels"
-#define SOKOBAN_SAVE_FILE PLUGIN_GAMES_DIR "/sokoban.save"
+#define SOKOBAN_SAVE_FILE PLUGIN_GAMES_DATA_DIR "/sokoban.save"
+
+#ifdef APPLICATION
+#define SOKOBAN_SAVE_FOLDER PLUGIN_GAMES_DATA_DIR
+#else
#define SOKOBAN_SAVE_FOLDER "/games"
+#endif

#include "pluginbitmaps/sokoban_tiles.h"
#define SOKOBAN_TILESIZE BMPWIDTH_sokoban_tiles
diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c
index 006e073..23ffa8b 100644
--- a/apps/plugins/solitaire.c
+++ b/apps/plugins/solitaire.c
@@ -1293,11 +1293,15 @@ int bouncing_cards( void )
*/
void get_save_filename( char *buf )
{
+#ifdef APPLICATION
+ rb->sprintf(buf, sizeof(buf), PLUGIN_DATA_DIR "/sol.sav");
+#else
char *s;
rb->strcpy( buf, rb->plugin_get_current_filename() );
s = rb->strrchr( buf, '/' ) + 1;
*s = '\0';
rb->strcat( s, "sol.save" );
+#endif
}

int open_save_file( int flags )
diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c
index 2e5600b..4011688 100644
--- a/apps/plugins/spacerocks.c
+++ b/apps/plugins/spacerocks.c
@@ -400,7 +400,7 @@
#define SET_BG(x)
#endif

-#define SCORE_FILE PLUGIN_GAMES_DIR "/spacerocks.score"
+#define SCORE_FILE PLUGIN_GAMES_DATA_DIR "/spacerocks.score"
#define NUM_SCORES 5

static struct highscore highscores[NUM_SCORES];
diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c
index c07cfd9..f70d26b 100644
--- a/apps/plugins/stopwatch.c
+++ b/apps/plugins/stopwatch.c
@@ -32,7 +32,7 @@
#define LAP_Y TIMER_Y+1
#define MAX_LAPS 64

-#define STOPWATCH_FILE PLUGIN_APPS_DIR "/stopwatch.dat"
+#define STOPWATCH_FILE PLUGIN_APPS_DATA_DIR "/stopwatch.dat"

/* variable button definitions */
#if CONFIG_KEYPAD == RECORDER_PAD
diff --git a/apps/plugins/text_viewer/tv_settings.c b/apps/plugins/text_viewer/tv_settings.c
index 20e8212..3ed1576 100644
--- a/apps/plugins/text_viewer/tv_settings.c
+++ b/apps/plugins/text_viewer/tv_settings.c
@@ -54,8 +54,8 @@
* font name MAX_PATH
*/

-#define VIEWER_GLOBAL_SETTINGS_FILE VIEWERS_DIR "/viewer.dat"
-#define TV_GLOBAL_SETTINGS_FILE VIEWERS_DIR "/tv_global.dat"
+#define VIEWER_GLOBAL_SETTINGS_FILE VIEWERS_DATA_DIR "/viewer.dat"
+#define TV_GLOBAL_SETTINGS_FILE VIEWERS_DATA_DIR "/tv_global.dat"

#define TV_GLOBAL_SETTINGS_HEADER "\x54\x56\x47\x53" /* "TVGS" */
#define TV_GLOBAL_SETTINGS_VERSION 0x38
@@ -108,11 +108,11 @@
* ...
* [last file]
*/
-#define VIEWER_SETTINGS_FILE VIEWERS_DIR "/viewer_file.dat"
-#define TV_SETTINGS_FILE VIEWERS_DIR "/tv_file.dat"
+#define VIEWER_SETTINGS_FILE VIEWERS_DATA_DIR "/viewer_file.dat"
+#define TV_SETTINGS_FILE VIEWERS_DATA_DIR "/tv_file.dat"

/* temporary file */
-#define TV_SETTINGS_TMP_FILE VIEWERS_DIR "/tv_file.tmp"
+#define TV_SETTINGS_TMP_FILE VIEWERS_DATA_DIR "/tv_file.tmp"

#define TV_SETTINGS_HEADER "\x54\x56\x53" /* "TVS" */
#define TV_SETTINGS_VERSION 0x39
diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c
index 077a6e9..8877d7f 100644
--- a/apps/plugins/vu_meter.c
+++ b/apps/plugins/vu_meter.c
@@ -467,7 +467,7 @@ void calc_scales(void)
}

void load_settings(void) {
- int fp = rb->open(PLUGIN_DEMOS_DIR "/.vu_meter", O_RDONLY);
+ int fp = rb->open(PLUGIN_DEMOS_DATA_DIR "/.vu_meter", O_RDONLY);
if(fp>=0) {
rb->read(fp, &vumeter_settings, sizeof(struct saved_settings));
rb->close(fp);
@@ -479,7 +479,7 @@ void load_settings(void) {
}

void save_settings(void) {
- int fp = rb->creat(PLUGIN_DEMOS_DIR "/.vu_meter", 0666);
+ int fp = rb->creat(PLUGIN_DEMOS_DATA_DIR "/.vu_meter", 0666);
if(fp >= 0) {
rb->write (fp, &vumeter_settings, sizeof(struct saved_settings));
rb->close(fp);
diff --git a/firmware/common/rbpaths.c b/firmware/common/rbpaths.c
index cb56ab4..1bbed97 100644
--- a/firmware/common/rbpaths.c
+++ b/firmware/common/rbpaths.c
@@ -70,6 +70,7 @@ void paths_init(void)
/* make sure $HOME/.config/rockbox.org exists, it's needed for config.cfg */
#if (CONFIG_PLATFORM & PLATFORM_ANDROID)
mkdir("/sdcard/rockbox");
+ mkdir("/sdcard/rockbox/rocks.data");
#else
char config_dir[MAX_PATH];

@@ -84,6 +85,9 @@ void paths_init(void)
mkdir(config_dir);
snprintf(config_dir, sizeof(config_dir), "%s/.config/rockbox.org", home);
mkdir(config_dir);
+ /* Plugin data directory */
+ snprintf(config_dir, sizeof(config_dir), "%s/.config/rockbox.org/rocks.data", home);
+ mkdir(config_dir);
#endif
}

diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h
index a15c5ae..ade7894 100644
--- a/firmware/export/rbpaths.h
+++ b/firmware/export/rbpaths.h
@@ -76,6 +76,19 @@ extern void paths_init(void);
#define PLUGIN_DEMOS_DIR PLUGIN_DIR "/demos"
#define VIEWERS_DIR PLUGIN_DIR "/viewers"

+#ifdef APPLICATION
+#define PLUGIN_DATA_DIR "/.rockbox/rocks.data"
+#define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR
+#define PLUGIN_APPS_DATA_DIR PLUGIN_DATA_DIR
+#define PLUGIN_DEMOS_DATA_DIR PLUGIN_DATA_DIR
+#define VIEWERS_DATA_DIR PLUGIN_DATA_DIR
+#else
+#define PLUGIN_DATA_DIR PLUGIN_DIR
+#define PLUGIN_GAMES_DATA_DIR PLUGIN_DIR "/games"
+#define PLUGIN_APPS_DATA_DIR PLUGIN_DIR "/apps"
+#define PLUGIN_DEMOS_DATA_DIR PLUGIN_DIR "/demos"
+#define VIEWERS_DATA_DIR PLUGIN_DIR "/viewers"
+#endif

#define WPS_DIR ROCKBOX_DIR "/wps"
#define SBS_DIR WPS_DIR