Index: apps/lang/english.lang
===================================================================
--- apps/lang/english.lang	(revision 27409)
+++ apps/lang/english.lang	(working copy)
@@ -4721,14 +4721,11 @@
   desc: Save only on bookmark for each playlist in recent bookmarks
   user: core
   <source>
-    *: "Unique only"
+    *: "deprecated"
   </source>
   <dest>
-    *: "Unique only"
+    *: "deprecated"
   </dest>
-  <voice>
-    *: "Unique only"
-  </voice>
 </phrase>
 <phrase>
   id: LANG_LANGUAGE
@@ -12619,3 +12616,32 @@
     *: "Update on Stop"
   </voice>
 </phrase>
+<phrase>
+  id: LANG_BOOKMARK_SETTINGS_ONE_PER_PLAYLIST
+  desc: Save only one bookmark for a playlist in recent bookmarks
+  user: core
+  <source>
+    *: "One per playlist"
+  </source>
+  <dest>
+    *: "One per playlist"
+  </dest>
+  <voice>
+    *: "One per playlist"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_BOOKMARK_SETTINGS_ONE_PER_TRACK
+  desc: Save only one bookmark for a combination (playlist,track) in recent bookmarks
+  user: core
+  <source>
+    *: "One per track"
+  </source>
+  <dest>
+    *: "One per track"
+  </dest>
+  <voice>
+    *: "One per track"
+  </voice>
+</phrase>
+
Index: apps/settings.h
===================================================================
--- apps/settings.h	(revision 27409)
+++ apps/settings.h	(working copy)
@@ -86,14 +86,16 @@
 
 #define MAX_FILENAME 32
 
-
+/* The values are assigned to the enums so that they correspond to */
+/* setting values in settings_list.c                               */
 enum {
     BOOKMARK_NO = 0,
     BOOKMARK_YES,
     BOOKMARK_ASK,
-    BOOKMARK_UNIQUE_ONLY = 2,
+    BOOKMARK_ONE_PER_PLAYLIST = 2,
     BOOKMARK_RECENT_ONLY_YES,
     BOOKMARK_RECENT_ONLY_ASK,
+    BOOKMARK_ONE_PER_TRACK = 3,
 };
 
 enum
@@ -605,7 +607,8 @@
     int autoloadbookmark;   /* auto load option: 0=off, 1=ask, 2=on */
     int autocreatebookmark; /* auto create option: 0=off, 1=ask, 2=on */
     bool autoupdatebookmark;/* auto update option */
-    int usemrb;             /* use MRB list: 0=No, 1=Yes, 2=One per playlist */
+    int usemrb;             /* use MRB list: 0=No, 1=Yes, 2=One per playlist,
+                                             3=One per playlist and track */
 
 #ifdef HAVE_DIRCACHE
     bool dircache;          /* enable directory cache */
Index: apps/settings_list.c
===================================================================
--- apps/settings_list.c	(revision 27409)
+++ apps/settings_list.c	(working copy)
@@ -997,9 +997,10 @@
                    ID2P(LANG_ASK)),
     CHOICE_SETTING(0, usemrb, LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS,
                    BOOKMARK_NO, "use most-recent-bookmarks",
-                   "off,on,unique only", NULL, 3, ID2P(LANG_SET_BOOL_NO),
+                   "off,on,unique only,one per track", NULL, 4, ID2P(LANG_SET_BOOL_NO),
                    ID2P(LANG_SET_BOOL_YES),
-                   ID2P(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY)),
+                   ID2P(LANG_BOOKMARK_SETTINGS_ONE_PER_PLAYLIST),
+                   ID2P(LANG_BOOKMARK_SETTINGS_ONE_PER_TRACK)),
 #ifdef HAVE_LCD_BITMAP
     /* peak meter */
     STRINGCHOICE_SETTING(0, peak_meter_clip_hold, LANG_PM_CLIP_HOLD, 16,
Index: apps/bookmark.c
===================================================================
--- apps/bookmark.c	(revision 27409)
+++ apps/bookmark.c	(working copy)
@@ -247,6 +247,19 @@
     return true;
 }
 
+/* Get the name of the playlist and the name of the track from a bookmark. */
+/* Returns true iff both were extracted.                                   */
+static bool get_playlist_and_track(const char *bookmark, char **pl_start,
+                  char **pl_end, char **track)
+{
+    *pl_start = strchr(bookmark,'/');
+    if (!(*pl_start))
+        return false;
+    *pl_end = strrchr(bookmark,';');
+    *track = *pl_end + 1;
+    return true;
+}
+
 /* ----------------------------------------------------------------------- */
 /* This function adds a bookmark to a file.                                */
 /* ------------------------------------------------------------------------*/
@@ -256,11 +269,13 @@
     int    temp_bookmark_file = 0;
     int    bookmark_file = 0;
     int    bookmark_count = 0;
-    char*  playlist = NULL;
-    char*  cp;
-    char*  tmp;
-    int    len = 0;
-    bool   unique = false;
+    char   *pl_start, *bm_pl_start;
+    char   *pl_end, *bm_pl_end;
+    int    pl_len, bm_pl_len;
+    char   *track, *bm_track;
+    bool   comp_playlist = false;
+    bool   comp_track = false;
+    bool   equal;
 
     /* Opening up a temp bookmark file */
     snprintf(global_temp_buffer, sizeof(global_temp_buffer),
@@ -270,12 +285,16 @@
     if (temp_bookmark_file < 0)
         return false; /* can't open the temp file */
 
-    if (most_recent && (global_settings.usemrb == BOOKMARK_UNIQUE_ONLY))
+    if (most_recent && ((global_settings.usemrb == BOOKMARK_ONE_PER_PLAYLIST)
+                      || (global_settings.usemrb == BOOKMARK_ONE_PER_TRACK)))
     {
-        playlist = strchr(bookmark,'/');
-        cp = strrchr(bookmark,';');
-        len = cp - playlist;
-        unique = true;
+        if (get_playlist_and_track(bookmark, &pl_start, &pl_end, &track))
+        {
+            comp_playlist = true;
+            pl_len = pl_end - pl_start;
+            if (global_settings.usemrb == BOOKMARK_ONE_PER_TRACK)
+                comp_track = true;
+        }
     }
 
     /* Writing the new bookmark to the begining of the temp file */
@@ -294,12 +313,24 @@
             /* This keeps it from getting too large */
             if (most_recent && (bookmark_count >= MAX_BOOKMARKS))
                 break;
-                        
-            cp  = strchr(global_read_buffer,'/');
-            tmp = strrchr(global_read_buffer,';');
-            if (parse_bookmark(global_read_buffer, false) &&
-               (!unique || len != tmp -cp || strncmp(playlist,cp,len)))
+
+            if (!parse_bookmark(global_read_buffer, false))
+                break;
+            
+            equal = false;
+            if (comp_playlist)
             {
+                if (get_playlist_and_track(global_read_buffer, &bm_pl_start,
+                        &bm_pl_end, &bm_track))
+                {
+                    bm_pl_len = bm_pl_end - bm_pl_start;
+                    equal = (pl_len == bm_pl_len) && !strncmp(pl_start, bm_pl_start, pl_len);
+                    if (equal && comp_track)
+                        equal = !strcmp(track, bm_track);
+                }
+            }
+            if (!equal)
+            {
                 bookmark_count++;
                 write(temp_bookmark_file, global_read_buffer,
                       strlen(global_read_buffer));
Index: manual/appendix/config_file_options.tex
===================================================================
--- manual/appendix/config_file_options.tex	(revision 27409)
+++ manual/appendix/config_file_options.tex	(working copy)
@@ -111,7 +111,7 @@
     autoload bookmarks
                     & off, on           & N/A\\
     use most-recent-bookmarks
-                    & off, on           & N/A\\
+                    & off, on, unique only, one per track & N/A\\
     pause on headphone unplug & off, pause, pause and resume & N/A\\
     rewind duration on pause & 0 to 15  & s\\
     disable autoresume if phones not present & off, on & N/A\\
Index: manual/configure_rockbox/bookmarking.tex
===================================================================
--- manual/configure_rockbox/bookmarking.tex	(revision 27409)
+++ manual/configure_rockbox/bookmarking.tex	(working copy)
@@ -81,10 +81,15 @@
       \item[Yes]
             Keep a list of recently used bookmarks. Each new bookmark is added
             to the list of recent bookmarks.
-      \item[Unique Only]
+      \item[One per playlist]
             Add each new bookmark to the list of recently used bookmarks, but
             only keep one bookmark from the current directory or playlist; any
-            previous entries are removed.
+            previous entries for the playlist are removed.
+      \item[One per track]
+            Add each new bookmark to the list of recently used bookmarks, but
+            only keep one bookmark from the current directory or playlist and
+            the current track; any previous entries for the track within the
+            playlist are removed.
     \end{description}
 \end{description}
 
