Index: libs/libmythtv/libmythtv.pro
===================================================================
--- libs/libmythtv/libmythtv.pro	(revision 11563)
+++ libs/libmythtv/libmythtv.pro	(working copy)
@@ -139,6 +139,7 @@
 HEADERS += playgroup.h              progdetails.h
 HEADERS += channeleditor.h          channelsettings.h
 HEADERS += previewgenerator.h       dvbtransporteditor.h
+HEADERS += playbackbox.h
 
 SOURCES += programinfo.cpp          proglist.cpp
 SOURCES += RingBuffer.cpp
@@ -160,6 +161,7 @@
 SOURCES += progdetails.cpp
 SOURCES += channeleditor.cpp        channelsettings.cpp
 SOURCES += previewgenerator.cpp     dvbtransporteditor.cpp
+SOURCES += playbackbox.cpp
 
 # DiSEqC
 HEADERS += diseqc.h                 diseqcsettings.h
Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 11563)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -68,7 +68,8 @@
 enum scheduleEditTypes {
     kScheduleProgramGuide = 0,
     kScheduleProgramFinder,
-    kScheduledRecording
+    kScheduledRecording,
+    kPlaybackBox,
 };
 
 class MPUBLIC TV : public QObject
@@ -112,12 +113,14 @@
     // Recording commands
     int  PlayFromRecorder(int recordernum);
     int  Playback(ProgramInfo *rcinfo);
+
+    // Various commands
     void setLastProgram(ProgramInfo *rcinfo); 
     ProgramInfo *getLastProgram(void) { return lastProgram; }
     void setInPlayList(bool setting) { inPlaylist = setting; }
     void setUnderNetworkControl(bool setting) { underNetworkControl = setting; }
+    bool IsSameProgram(ProgramInfo *p);
 
-    // Various commands
     void ShowNoRecorderDialog(void);
     void FinishRecording(void);
     void AskAllowRecording(const QStringList&, int, bool);
@@ -194,6 +197,7 @@
     static void *EPGMenuHandler(void *param);
     static void *FinderMenuHandler(void *param);
     static void *ScheduleMenuHandler(void *param);
+    static void *RecordedShowMenuHandler(void *param);
 
     void RunTV(void);
     static void *EventThread(void *param);
@@ -297,7 +301,6 @@
     void SetAutoCommercialSkip(enum commSkipMode skipMode = CommSkipOff);
     void SetManualZoom(bool zoomON = false);
 
-    void DoDisplayJumpMenu(void);
     void SetJumpToProgram(QString progKey = "", int progIndex = 0);
  
     bool ClearOSD(void);
@@ -325,7 +328,6 @@
     void ToggleActiveWindow(void);
     void SwapPIP(void);
     void SwapPIPSoon(void) { needToSwapPIP = true; }
-    void DisplayJumpMenuSoon(void) { needToJumpMenu = true; }
 
     void ToggleAutoExpire(void);
 
@@ -426,7 +428,6 @@
 
     bool ignoreKeys;
     bool needToSwapPIP;
-    bool needToJumpMenu;
     QMap<QString,ProgramList> progLists;
 
     mutable QMutex chanEditMapLock; ///< Lock for chanEditMap and ddMap
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 11563)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -39,6 +39,7 @@
 #include "DVDRingBuffer.h"
 #include "datadirect.h"
 #include "sourceutil.h"
+#include "playbackbox.h"
 
 #ifndef HAVE_ROUND
 #define round(x) ((int) ((x) + 0.5))
@@ -415,7 +416,7 @@
       queuedTranscode(false), getRecorderPlaybackInfo(false),
       adjustingPicture(kAdjustingPicture_None),
       adjustingPictureAttribute(kPictureAttribute_None),
-      ignoreKeys(false), needToSwapPIP(false), needToJumpMenu(false),
+      ignoreKeys(false), needToSwapPIP(false),
       // Channel Editing
       chanEditMapLock(true), ddMapSourceId(0), ddMapLoaderRunning(false),
       // Sleep Timer
@@ -1935,12 +1936,6 @@
             SwapPIP();
             needToSwapPIP = false;
         }
-
-        if (needToJumpMenu)
-        {
-            DoDisplayJumpMenu();
-            needToJumpMenu = false;
-        }
     }
   
     if (!IsErrored() && (GetState() != kState_None))
@@ -2720,7 +2715,7 @@
             jumpToProgram = true;
         }
         else if (action == "JUMPREC")
-            DisplayJumpMenuSoon();
+            EditSchedule(kPlaybackBox);
         else if (action == "SIGNALMON")
         {
             if ((GetState() == kState_WatchingLiveTV) && activerecorder)
@@ -4973,6 +4968,7 @@
     pbinfoLock.unlock();
 
     bool changeChannel = false;
+    ProgramInfo *nextProgram = NULL;
 
     if (StateIsLiveTV(GetState()))
     {
@@ -5002,12 +4998,28 @@
                     RunProgramFind(true, false);
                     break;
             case kScheduledRecording:
+            {
                     pbinfoLock.lock();
                     ScheduledRecording record;
                     record.loadByProgram(playbackinfo);
                     record.exec();
                     pbinfoLock.unlock();
                     break;
+            }
+            case kPlaybackBox:
+            {
+                    pbinfoLock.lock();
+                    nextProgram = PlaybackBox::RunPlaybackBox(this, true);
+                    if (nextProgram)
+                    {
+                        setLastProgram(nextProgram);
+                        jumpToProgram = true;
+                        exitPlayer = true;
+                        delete nextProgram;
+                    }
+                    pbinfoLock.unlock();
+                    break;
+            }
         }
 
         if (!stayPaused)
@@ -5053,6 +5065,14 @@
     return NULL;
 }
 
+void *TV::RecordedShowMenuHandler(void *param)
+{
+    TV *obj = (TV *)param;
+    obj->doEditSchedule(kPlaybackBox);
+
+    return NULL;
+}
+
 void TV::EditSchedule(int editType)
 {
     if (menurunning == true)
@@ -5075,6 +5095,8 @@
         case kScheduledRecording:
                 pthread_create(&tid, &attr, TV::ScheduleMenuHandler, this);
                 break;
+        case kPlaybackBox:
+                pthread_create(&tid, &attr, TV::RecordedShowMenuHandler, this);
     }
 }
 
@@ -6370,7 +6392,7 @@
             jumpToProgram = true;
         }
         else if (action == "JUMPREC")
-            DisplayJumpMenuSoon();
+            EditSchedule(kPlaybackBox);
         else if (action.left(8) == "JUMPPROG")
         {
             SetJumpToProgram(action.section(" ",1,-2),
@@ -6401,78 +6423,6 @@
     }
 }
 
-void TV::DoDisplayJumpMenu(void)
-{
-    if (treeMenu)
-        delete treeMenu;
-
-    treeMenu = new OSDGenericTree(NULL, "treeMenu");
-    OSDGenericTree *item, *subitem;
-
-    // Build jumpMenu of recorded program titles
-    ProgramInfo *p;
-    progLists.clear();
-    vector<ProgramInfo *> *infoList;
-    infoList = RemoteGetRecordedList(false);
-
-    bool LiveTVInAllPrograms = gContext->GetNumSetting("LiveTVInAllPrograms",0);
-
-    if (infoList)
-    {
-        pbinfoLock.lock();
-        vector<ProgramInfo *>::iterator i = infoList->begin();
-        for ( ; i != infoList->end(); i++)
-        {
-            p = *i;
-            //if (p->recgroup != "LiveTV" || LiveTVInAllPrograms)
-            if (p->recgroup == playbackinfo->recgroup)
-                progLists[p->title].prepend(p);
-        }
-        pbinfoLock.unlock();
-
-        QMap<QString,ProgramList>::Iterator Iprog;
-        for (Iprog = progLists.begin(); Iprog != progLists.end(); Iprog++)
-        {
-            ProgramList plist = Iprog.data();
-            int progIndex = plist.count();
-            if (progIndex == 1)
-            {
-                item = new OSDGenericTree(treeMenu, tr(Iprog.key()),
-                    QString("JUMPPROG %1 0").arg(Iprog.key()));
-            } 
-            else 
-            {
-                item = new OSDGenericTree(treeMenu, tr(Iprog.key()));
-                for (int i = 0; i < progIndex; i++)
-                {
-                    p = plist.at(i);
-                    if (p->subtitle != "")
-                        subitem = new OSDGenericTree(item, tr(p->subtitle), 
-                            QString("JUMPPROG %1 %2").arg(Iprog.key()).arg(i));
-                    else 
-                        subitem = new OSDGenericTree(item, tr(p->title), 
-                            QString("JUMPPROG %1 %2").arg(Iprog.key()).arg(i));
-                }
-            }
-        }
-    } 
-
-    if (GetOSD())
-    {
-        ClearOSD();
-
-        OSDListTreeType *tree = GetOSD()->ShowTreeMenu("menu", treeMenu);
-        if (tree)
-        {
-            connect(tree, SIGNAL(itemSelected(OSDListTreeType *,OSDGenericTree *)), 
-                    this, SLOT(TreeMenuSelected(OSDListTreeType *, OSDGenericTree *)));
-
-            connect(tree, SIGNAL(itemEntered(OSDListTreeType *, OSDGenericTree *)),
-                    this, SLOT(TreeMenuEntered(OSDListTreeType *, OSDGenericTree *)));
-        }
-    } 
-}
-
 void TV::ShowOSDTreeMenu(void)
 {
     BuildOSDTreeMenu();
@@ -7443,4 +7393,12 @@
         lastProgram = NULL;
 }
 
+bool TV::IsSameProgram(ProgramInfo *rcinfo)
+{
+    if (rcinfo && playbackinfo)
+        return playbackinfo->IsSameProgram(*rcinfo);
+
+    return false;
+}
+
 /* vim: set expandtab tabstop=4 shiftwidth=4: */
Index: programs/mythfrontend/playbackbox.cpp
===================================================================
--- programs/mythfrontend/playbackbox.cpp	(revision 11563)
+++ programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -16,6 +16,7 @@
 #include <qfileinfo.h>
 #include <qsqldatabase.h>
 #include <qmap.h>
+#include <qwaitcondition.h>
 
 #include <cmath>
 #include <unistd.h>
@@ -50,6 +51,8 @@
 
 #define USE_PREV_GEN_THREAD
 
+QWaitCondition pbbIsVisibleCond;
+
 static int comp_programid(ProgramInfo *a, ProgramInfo *b)
 {
     if (a->programid == b->programid)
@@ -185,8 +188,35 @@
         return (a->startts.date() > b->startts.date() ? 1 : -1);
 }
 
+
+ProgramInfo * PlaybackBox::RunPlaybackBox(TV *player, bool thread)
+{
+    ProgramInfo *nextProgram = NULL;
+    if (thread)
+        qApp->lock();
+
+    PlaybackBox *pbb = new PlaybackBox(PlaybackBox::Play,
+            gContext->GetMainWindow(), "tvplayselect", player);
+    pbb->Show();
+
+    if (thread)
+    {
+        qApp->unlock();
+        pbbIsVisibleCond.wait();
+    }
+    else
+        pbb->exec();
+
+    if (pbb->getSelected())
+        nextProgram = new ProgramInfo(*pbb->getSelected());
+   
+    delete pbb;
+    
+    return nextProgram;
+}
+
 PlaybackBox::PlaybackBox(BoxType ltype, MythMainWindow *parent, 
-                         const char *name)
+                         const char *name, TV *player)
     : MythDialog(parent, name),
       // Settings
       type(ltype),
@@ -248,7 +278,8 @@
       previewPixmapEnabled(false),      previewPixmap(NULL),
       previewSuspend(false),            previewChanid(""),
       // Network Control Variables
-      underNetworkControl(false)
+      underNetworkControl(false),
+      m_player(NULL)
 {
     formatShortDate    = gContext->GetSetting("ShortDateFormat", "M/d");
     formatLongDate     = gContext->GetSetting("DateFormat", "ddd MMMM d");
@@ -263,7 +294,8 @@
     groupnameAsAllProg = gContext->GetNumSetting("DispRecGroupAsAllProg", 0);
     arrowAccel         = gContext->GetNumSetting("UseArrowAccels", 1);
     inTitle            = gContext->GetNumSetting("PlaybackBoxStartInTitle", 0);
-    previewVideoEnabled =gContext->GetNumSetting("PlaybackPreview");
+    if (!player)
+        previewVideoEnabled =gContext->GetNumSetting("PlaybackPreview");
     previewPixmapEnabled=gContext->GetNumSetting("GeneratePreviewPixmaps");
     previewFromBookmark= gContext->GetNumSetting("PreviewFromBookmark");
     drawTransPixmap    = gContext->LoadScalePixmap("trans-backup.png");
@@ -283,6 +315,9 @@
     titleList << "";
     playList.clear();
 
+    if (player)
+        m_player = player;
+
     // recording group stuff
     recGroupType.clear();
     recGroupType[recGroup] = (displayCat) ? "category" : "recgroup";
@@ -369,7 +404,8 @@
     gContext->removeListener(this);
     gContext->removeCurrentLocation();
 
-    killPlayerSafe();
+    if (!m_player)
+        killPlayerSafe();
 
     if (previewVideoRefreshTimer)
     {
@@ -566,7 +602,16 @@
 
 void PlaybackBox::exitWin()
 {
-    killPlayerSafe();
+    if (m_player)
+    {
+        if (curitem)
+            delete curitem;
+        curitem = NULL;
+        pbbIsVisibleCond.wakeAll();
+    }
+    else
+        killPlayerSafe();
+
     accept();
 }
 
@@ -1247,7 +1292,8 @@
                 if (playList.grep(tempInfo->MakeUniqueKey()).count())
                     ltype->EnableForcedFont(cnt, "tagged");
 
-                if (tempInfo->availableStatus != asAvailable)
+                if (tempInfo->availableStatus != asAvailable || 
+                        (m_player && m_player->IsSameProgram(tempInfo)))
                     ltype->EnableForcedFont(cnt, "inactive");
             }
         } 
@@ -2079,10 +2125,19 @@
     if (!curitem)
         return;
 
+    if (m_player && m_player->IsSameProgram(curitem))
+        exitWin();
+
     if (curitem && curitem->availableStatus != asAvailable)
         showAvailablePopup(curitem);
     else
         play(curitem);
+
+    if (m_player)
+    {
+        pbbIsVisibleCond.wakeAll();
+        accept();
+    }
 }
 
 void PlaybackBox::stopSelected()
@@ -2211,7 +2266,7 @@
         popup->addButton(tr("Playlist options"), this,
                          SLOT(showPlaylistPopup()));
     }
-    else
+    else if (!m_player)
     {
         if (inTitle)
         {
@@ -2254,6 +2309,9 @@
     if (!rec)
         return false;
 
+    if (m_player)
+        return true;
+            
     if (fileExists(rec) == false)
     {
         QString msg = 
@@ -2912,20 +2970,26 @@
 
     initPopup(popup, program, "", "");
 
-    QButton *playButton;
+    QButton *playButton = new QButton();
 
-    if (curitem->programflags & FL_BOOKMARK)
-        playButton = popup->addButton(tr("Play from..."), this,
-                                      SLOT(showPlayFromPopup()));
-    else
-        playButton = popup->addButton(tr("Play"), this, SLOT(doPlay()));
+    if (!(m_player && m_player->IsSameProgram(curitem)))
+    {
+        if (curitem->programflags & FL_BOOKMARK)
+            popup->addButton(tr("Play from..."), this,
+                                        SLOT(showPlayFromPopup()));
+        else
+            popup->addButton(tr("Play"), this, SLOT(doPlay()));
+    }
 
-    if (playList.grep(curitem->MakeUniqueKey()).count())
-        popup->addButton(tr("Remove from Playlist"), this,
-                         SLOT(togglePlayListItem()));
-    else
-        popup->addButton(tr("Add to Playlist"), this,
-                         SLOT(togglePlayListItem()));
+    if (!m_player)
+    {
+        if (playList.grep(curitem->MakeUniqueKey()).count())
+            popup->addButton(tr("Remove from Playlist"), this,
+                            SLOT(togglePlayListItem()));
+        else
+            popup->addButton(tr("Add to Playlist"), this,
+                            SLOT(togglePlayListItem()));
+    }
 
     if (program->recstatus == rsRecording)
         popup->addButton(tr("Stop Recording"), this, SLOT(askStop()));
@@ -2941,7 +3005,8 @@
     popup->addButton(tr("Recording Options"), this, SLOT(showRecordingPopup()));
     popup->addButton(tr("Job Options"), this, SLOT(showJobPopup()));
 
-    popup->addButton(tr("Delete"), this, SLOT(askDelete()));
+    if (!(m_player && m_player->IsSameProgram(curitem)))
+        popup->addButton(tr("Delete"), this, SLOT(askDelete()));
 
     popup->ShowPopup(this, SLOT(doCancel()));
 
Index: programs/mythfrontend/mythfrontend.pro
===================================================================
--- programs/mythfrontend/mythfrontend.pro	(revision 11563)
+++ programs/mythfrontend/mythfrontend.pro	(working copy)
@@ -23,11 +23,11 @@
 QMAKE_CLEAN += $(TARGET)
 
 # Input
-HEADERS += manualbox.h playbackbox.h viewscheduled.h globalsettings.h
+HEADERS += manualbox.h viewscheduled.h globalsettings.h
 HEADERS += manualschedule.h programrecpriority.h channelrecpriority.h
 HEADERS += statusbox.h networkcontrol.h
 
-SOURCES += main.cpp manualbox.cpp playbackbox.cpp viewscheduled.cpp
+SOURCES += main.cpp manualbox.cpp viewscheduled.cpp
 SOURCES += globalsettings.cpp manualschedule.cpp programrecpriority.cpp 
 SOURCES += channelrecpriority.cpp statusbox.cpp networkcontrol.cpp
 
Index: programs/mythfrontend/playbackbox.h
===================================================================
--- programs/mythfrontend/playbackbox.h	(revision 11563)
+++ programs/mythfrontend/playbackbox.h	(working copy)
@@ -13,6 +13,7 @@
 #include "xmlparse.h"
 #include "programinfo.h"
 #include "jobqueue.h"
+#include "tv_play.h"
 
 #include <qvaluelist.h>
 #include <pthread.h>
@@ -98,11 +99,13 @@
     } killStateType;
      
 
-    PlaybackBox(BoxType ltype, MythMainWindow *parent, const char *name = 0);
+    PlaybackBox(BoxType ltype, MythMainWindow *parent, const char *name = 0, TV *player = NULL);
    ~PlaybackBox(void);
    
     void customEvent(QCustomEvent *e);
-  
+    static ProgramInfo *RunPlaybackBox(TV *player, bool thread = false);
+    
+    
   protected slots:
     void timeout(void);
 
@@ -246,6 +249,8 @@
     void stop(ProgramInfo *);
     void remove(ProgramInfo *);
     void showActions(ProgramInfo *);
+    ProgramInfo *getSelected(void){ return curitem; }
+        
 
     void togglePlayListItem(ProgramInfo *pginfo);
     void randomizePlayList(void);
@@ -451,6 +456,8 @@
     mutable QMutex      ncLock;
     QValueList<QString> networkControlCommands;
     bool                underNetworkControl;
+    
+    TV                  *m_player;
 };
 
 #endif

