--- apps/tree.c	(.../../../trunk)	(revision 255)
+++ apps/tree.c	(revision 255)
@@ -448,8 +448,8 @@ static void start_resume(bool just_power
         {
             playlist_start(global_settings.resume_index,
                 global_settings.resume_offset);
-
-            start_wps = true;
+            if (*tc.dirfilter < NUM_FILTER_MODES)
+                start_wps = true;
         }
         else return;
     }
@@ -541,6 +541,7 @@ static bool dirbrowse(void)
     bool lastsortcase = global_settings.sort_case;
     bool need_update = true;
     bool exit_func = false;
+    bool exit_menu = false;
     long thumbnail_time = -1; /* for delaying a thumbnail */
 
     unsigned lastbutton = 0;
@@ -638,30 +639,27 @@ static bool dirbrowse(void)
                 break;
 
             case ACTION_TREE_STOP:
-                if (*tc.dirfilter < NUM_FILTER_MODES)
-                {
-                    /* Stop the music if it is playing */
-                    if(audio_status()) {
-                        if (!global_settings.party_mode) {
-                            if (global_settings.fade_on_stop)
-                                fade(0);
-                            bookmark_autobookmark();
-                            audio_stop();
-                        }
+                /* Stop the music if it is playing */
+                if(audio_status()) {
+                    if (!global_settings.party_mode) {
+                        if (global_settings.fade_on_stop)
+                            fade(0);
+                        bookmark_autobookmark();
+                        audio_stop();
                     }
+                }
 #if defined(CONFIG_CHARGING) && \
     (CONFIG_KEYPAD == RECORDER_PAD) && !defined(HAVE_SW_POWEROFF)
-                    else {
-                        if (!charger_inserted()) {
-                            if(shutdown_screen())
-                                reload_dir = true;
-                        } else {
-                            charging_splash();
-                        }
-                        restore = true;
+                else if (*tc.dirfilter < NUM_FILTER_MODES){
+                    if (!charger_inserted()) {
+                        if(shutdown_screen())
+                            reload_dir = true;
+                    } else {
+                        charging_splash();
                     }
-#endif
+                    restore = true;
                 }
+#endif
 #if defined(CONFIG_CHARGING) && !defined(HAVE_POWEROFF_WHILE_CHARGING)
 {
                 static int last_off = 0;
@@ -684,7 +682,16 @@ static bool dirbrowse(void)
                         screens[i].stop_scroll();
                     action_signalscreenchange();
                     if (main_menu())
-                        reload_dir = true;
+                        switch (menureturn(false)){
+                            case MENU_SELECTED_WPS:
+                                start_wps=true;
+                                break;
+                            case MENU_ATTACHED_USB:
+                                reload_dir = true;
+                                break;
+                            default:
+                                break;
+                        }
                     restore = true;
 
                     id3db = check_changed_id3mode(id3db);
@@ -692,7 +699,10 @@ static bool dirbrowse(void)
                         reload_dir = true;
                 }
                 else /* use it as a quick exit instead */
+                {
+                    menureturn(MENU_SELECTED_QEXIT);
                     exit_func = true;
+                }
                 break;
 
             case ACTION_TREE_WPS:
@@ -709,6 +719,14 @@ static bool dirbrowse(void)
                         restore = true;
                     }
                 }
+                else
+                {
+                    if (!audio_status() & AUDIO_STATUS_PLAY)
+                        start_resume(false);
+                    menureturn(MENU_SELECTED_WPS);
+                    exit_menu = true;
+                    exit_func = true;
+                }
                 break;
 #ifdef HAVE_QUICKSCREEN
             case ACTION_STD_QUICKSCREEN:
@@ -843,7 +861,11 @@ static bool dirbrowse(void)
                     if(*tc.dirfilter > NUM_FILTER_MODES)
                         /* leave sub-browsers after usb, doing otherwise
                            might be confusing to the user */
-                        exit_func = true;
+                        {
+                            menureturn(MENU_ATTACHED_USB);
+                            exit_func = true;
+                            exit_menu = true;
+                        }
                     else
                         reload_dir = true;
                 }
@@ -1003,7 +1025,7 @@ static bool dirbrowse(void)
         }
     }
     action_signalscreenchange();
-    return true;
+    return exit_menu;
 }
 
 static int plsize = 0;
@@ -1152,20 +1174,21 @@ bool rockbox_browse(const char *root, in
 {
     static struct tree_context backup;
     int last_context;
-    
+    bool rtrn;
+
     backup = tc;
     reload_dir = true;
     memcpy(tc.currdir, root, sizeof(tc.currdir));
     start_wps = false;
     tc.dirfilter = &dirfilter;
     last_context = curr_context;
-    
-    dirbrowse();
+
+    rtrn = dirbrowse();
 
     tc = backup;
     curr_context = last_context;
-    
-    return false;
+
+    return rtrn;
 }
 
 void tree_init(void)
--- apps/gui/gwps.c	(.../../../trunk)	(revision 255)
+++ apps/gui/gwps.c	(revision 255)
@@ -411,7 +411,8 @@ long gui_wps_show(void)
 #endif
                 action_signalscreenchange();
                 if (main_menu())
-                    return true;
+                    if (menureturn(false) == MENU_ATTACHED_USB)
+                        return true;
 #ifdef HAVE_LCD_COLOR
                 show_wps_backdrop();
 #endif
--- apps/menu.c	(.../../../trunk)	(revision 255)
+++ apps/menu.c	(revision 255)
@@ -41,6 +41,11 @@
 #include "lang.h"
 #include "misc.h"
 #include "action.h"
+#include "splash.h"
+#include "audio.h"
+#include "playlist.h"
+#include "gwps-common.h"
+#include "bookmark.h"
 
 #ifdef HAVE_LCD_BITMAP
 #include "icons.h"
@@ -65,6 +70,34 @@ struct menu {
 static struct menu menus[MAX_MENUS];
 static bool inuse[MAX_MENUS] = { false };
 
+static int reason_return;
+
+int menureturn(int reason)
+{
+    if (reason)
+        reason_return=reason;
+    return reason_return;
+}
+
+static void start_resume(void)
+{
+    if ( global_settings.resume_index != -1 ) {
+        DEBUGF("Resume index %X offset %X\n",
+               global_settings.resume_index,
+               global_settings.resume_offset);
+
+        if (playlist_resume() != -1)
+        {
+            playlist_start(global_settings.resume_index,
+                global_settings.resume_offset);
+        }
+        else return;
+    }
+    else {
+        gui_syncsplash(HZ*2, true, str(LANG_NOTHING_TO_RESUME));
+    }
+}
+
 char * menu_get_itemname(int selected_item, void * data, char *buffer)
 {
     struct menu *local_menus=(struct menu *)data;
@@ -148,15 +181,34 @@ int menu_show(int m)
                 action_signalscreenchange();
                 return gui_synclist_get_sel_pos(&(menus[m].synclist));
 
-
             case ACTION_STD_CANCEL:
-            case ACTION_STD_MENU:
                 exit = true;
                 break;
 
+            case ACTION_STD_MENU:
+                action_signalscreenchange();
+                return menureturn(MENU_SELECTED_QEXIT);
+
+            case ACTION_WPS_STOP:
+                if(audio_status()) {
+                    if (!global_settings.party_mode){
+                        if (global_settings.fade_on_stop)
+                            fade(0);
+                        bookmark_autobookmark();
+                        audio_stop();
+                    }
+                }
+                break;
+
+            case ACTION_WPS_PLAY:
+                if (!audio_status() & AUDIO_STATUS_PLAY)
+                        start_resume();                
+                action_signalscreenchange();
+                return menureturn(MENU_SELECTED_WPS);
+
             default:
                 if(default_event_handler(key) == SYS_USB_CONNECTED)
-                    return MENU_ATTACHED_USB;
+                    return menureturn(MENU_ATTACHED_USB);
                 break;
         }
         gui_syncstatusbar_draw(&statusbars, false);
@@ -176,6 +228,8 @@ bool menu_run(int m)
                 return false;
 
             case MENU_ATTACHED_USB:
+            case MENU_SELECTED_QEXIT:
+            case MENU_SELECTED_WPS:
                 return true;
 
             default:
--- apps/menu.h	(.../../../trunk)	(revision 255)
+++ apps/menu.h	(revision 255)
@@ -26,10 +26,11 @@
 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
     (CONFIG_KEYPAD == IRIVER_H300_PAD)
 #define MENU_EXIT       BUTTON_LEFT
-#define MENU_EXIT2      BUTTON_OFF
 #define MENU_EXIT_MENU  BUTTON_MODE
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_STOP       BUTTON_OFF
+#define MENU_PLAY       BUTTON_ON
 
 #define MENU_RC_EXIT        BUTTON_RC_STOP
 #define MENU_RC_EXIT_MENU   BUTTON_RC_MODE
@@ -40,10 +41,11 @@
 #elif CONFIG_KEYPAD == RECORDER_PAD
 
 #define MENU_EXIT       BUTTON_LEFT
-#define MENU_EXIT2      BUTTON_OFF
 #define MENU_EXIT_MENU  BUTTON_F1
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_PLAY
+#define MENU_STOP       BUTTON_OFF
+#define MENU_PLAY       BUTTON_ON
 
 #define MENU_RC_EXIT    BUTTON_RC_STOP
 #define MENU_RC_ENTER   BUTTON_RC_PLAY
@@ -52,7 +54,7 @@
 #define MENU_EXIT       BUTTON_STOP
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_PLAY
-
+#define MENU_PLAY       BUTTON_ON
 #define MENU_RC_EXIT    BUTTON_RC_STOP
 #define MENU_RC_ENTER   BUTTON_RC_PLAY
 
@@ -60,6 +62,7 @@
 #define MENU_EXIT       BUTTON_LEFT
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
+#define MENU_STOP       BUTTON_OFF
 
 #elif CONFIG_KEYPAD == GMINI100_PAD
 #define MENU_EXIT       BUTTON_LEFT
@@ -67,17 +70,19 @@
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_PLAY
+#define MENU_PLAY       BUTTON_ON
 
 #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
 
-/* TODO: Check menu button assignments */
-
 #define MENU_NEXT       BUTTON_DOWN
 #define MENU_PREV       BUTTON_UP
 #define MENU_EXIT       BUTTON_LEFT
 #define MENU_EXIT_MENU  BUTTON_MENU
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_PLAY       BUTTON_PLAY
+
+/* TODO: Check menu button assignments */
 
 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
 
@@ -95,6 +100,7 @@
 #define MENU_EXIT_MENU  BUTTON_REC
 #define MENU_ENTER      BUTTON_RIGHT
 #define MENU_ENTER2     BUTTON_SELECT
+#define MENU_PLAY       BUTTON_PLAY
 
 #elif CONFIG_KEYPAD == GIGABEAT_PAD
 
@@ -105,6 +111,7 @@
 #define MENU_ENTER2     BUTTON_SELECT
 #define MENU_NEXT       BUTTON_DOWN
 #define MENU_PREV       BUTTON_UP
+#define MENU_PLAY       BUTTON_POWER
 
 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
 
@@ -132,6 +139,8 @@ void put_cursorxy(int x, int y, bool on)
 int menu_show(int m);
 #define MENU_ATTACHED_USB -1
 #define MENU_SELECTED_EXIT -2
+#define MENU_SELECTED_QEXIT -3
+#define MENU_SELECTED_WPS -4
 
 bool menu_run(int menu);
 int menu_cursor(int menu);
@@ -144,5 +153,6 @@ void menu_draw(int menu);
 void menu_insert(int menu, int position, char *desc, bool (*function) (void));
 void menu_set_cursor(int menu, int position);
 void menu_talk_selected(int m);
+int menureturn(int reason);/*used to return the reason for leaving the menu*/
 
 #endif /* End __MENU_H__ */
--- apps/keymaps/keymap-h1x0_h3x0.c	(.../../../trunk)	(revision 255)
+++ apps/keymaps/keymap-h1x0_h3x0.c	(revision 255)
@@ -232,6 +232,13 @@ const struct button_mapping button_conte
     LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
 }; /* button_context_recscreen */
 
+const struct button_mapping button_context_menu[]  = {
+    { ACTION_WPS_PLAY,          BUTTON_ON|BUTTON_REL,           BUTTON_ON },
+    { ACTION_WPS_STOP,          BUTTON_OFF,                     BUTTON_NONE },
+    
+    LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
+}; /* button_context_menu */
+
 /*****************************************************************************
  *    Remote control mappings 
  *****************************************************************************/
@@ -720,8 +727,9 @@ const struct button_mapping* get_context
     switch (context)
     {
         case CONTEXT_STD:
-        case CONTEXT_MAINMENU:
             return button_context_standard;
+        case CONTEXT_MAINMENU:
+            return button_context_menu;
         case CONTEXT_WPS:
             return button_context_wps;
             
