Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 6794)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -130,6 +130,7 @@
     REG_KEY("TV Playback", "NEXTAUDIO", "Switch to the next audio track", "+");
     REG_KEY("TV Playback", "PREVAUDIO", "Switch to the previous audio track", "-");
     REG_KEY("TV Playback", "SUBCHANNELSEP", "Separator for HDTV subchannels", "_");
+    REG_KEY("TV Playback", "JUMPPREV", "Jump to previously played recording", "");
     
     REG_KEY("TV Editing", "CLEARMAP", "Clear editing cut points", "C,Q,Home");
     REG_KEY("TV Editing", "INVERTMAP", "Invert Begin/End cut points", "I");
@@ -504,8 +505,15 @@
 
 }
 
+void TV::setLastProgram(ProgramInfo *rcinfo)
+{
+    lastProgram = rcinfo;
+}
+
 int TV::Playback(ProgramInfo *rcinfo)
 {
+    jumpToProgram = false;
+
     if (internalState != kState_None)
         return 0;
 
@@ -1852,6 +1860,13 @@
         {
             ClearOSD();
         }
+        else if (action == "JUMPPREV")
+        {
+            nvp->SetBookmark();
+            exitPlayer = true;
+            wantsToQuit = true;
+            jumpToProgram = true;
+        }
         else if (action == "ESCAPE")
         {
             if (GetOSD() && ClearOSD())
@@ -4230,6 +4245,13 @@
             SetAutoCommercialSkip(action.right(1).toInt());
         else if (action == "QUEUETRANSCODE")
             DoQueueTranscode();
+        else if (action == "JUMPPREV")
+        {
+            nvp->SetBookmark();
+            exitPlayer = true;
+            wantsToQuit = true;
+            jumpToProgram = true;
+        }
         else
         {
             cout << "unknown menu action selected: " << action << endl;
@@ -4303,6 +4325,9 @@
     }
     else if (StateIsPlaying(internalState))
     {
+        if (lastProgram != NULL)
+            item = new OSDGenericTree(treeMenu, tr("Jump to Previous Recording"), "JUMPPREV");
+
         item = new OSDGenericTree(treeMenu, tr("Edit Recording"), "TOGGLEEDIT");
 
         if (JobQueue::IsJobQueuedOrRunning(JOB_TRANSCODE,
Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 6794)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -109,6 +109,9 @@
     OSD *GetOSD(void);
 
     bool IsErrored(void) { return errored; }
+
+    void setLastProgram(ProgramInfo *rcinfo);
+    bool getJumpToProgram(void) { return jumpToProgram; }
   public slots:
     void HandleOSDClosed(int osdType);
 
@@ -339,6 +342,8 @@
     ProgramInfo *playbackinfo;  ///< info sent in via Playback()
     QString      inputFilename; ///< playbackinfo->pathname
     int          playbackLen;   ///< initial playbackinfo->CalculateLength()
+    ProgramInfo *lastProgram;   ///< last program played with this player
+    bool         jumpToProgram;
 
     // Video Players
     NuppelVideoPlayer *nvp;
Index: programs/mythfrontend/playbackbox.cpp
===================================================================
--- programs/mythfrontend/playbackbox.cpp	(revision 6794)
+++ programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -125,6 +125,7 @@
     popup = NULL;
     curitem = NULL;
     delitem = NULL;
+    lastProgram = NULL;
 
     // titleView controls showing titles in group list 
     titleView = true;
@@ -1786,6 +1787,8 @@
     state = kKilling; // stop preview playback and don't restart it
     playingSomething = true;
 
+    tv->setLastProgram(lastProgram);
+
     if (tv->Playback(tvrec))
     {
         while (tv->GetState() != kState_None)
@@ -1795,8 +1798,26 @@
             usleep(100000);
             qApp->lock();
         }
+        while (tv->getJumpToProgram())
+        {
+            ProgramInfo *tmpProgram = new ProgramInfo(*lastProgram);
+            lastProgram = new ProgramInfo(*tvrec);
+            tvrec = tmpProgram;
+            if (tv->Playback(tvrec))
+            {
+                while (tv->GetState() != kState_None)
+                {
+                    qApp->unlock();
+                    qApp->processEvents();
+                    usleep(100000);
+                    qApp->lock();
+                }
+            }
+        }
     }
 
+    lastProgram = new ProgramInfo(*rec);
+
     playingSomething = false;
     state = kStarting; // restart playback preview
     setEnabled(true);
Index: programs/mythfrontend/playbackbox.h
===================================================================
--- programs/mythfrontend/playbackbox.h	(revision 6794)
+++ programs/mythfrontend/playbackbox.h	(working copy)
@@ -157,6 +158,8 @@
     ProgramInfo *curitem;
     ProgramInfo *delitem;
 
+    ProgramInfo *lastProgram;
+
     void LoadWindow(QDomElement &);
     XMLParse *theme;
     QDomElement xmldata;
