Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 23339)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -59,7 +59,6 @@
 
 typedef QMap<QString,InfoMap>    DDValueMap;
 typedef QMap<QString,DDValueMap> DDKeyMap;
-typedef ProgramInfo * (*EMBEDRETURNPROGRAM)(void *, bool);
 typedef void (*EMBEDRETURNVOID) (void *, bool);
 typedef void (*EMBEDRETURNVOIDEPG) (uint, const QString &, TV *, bool, bool, int);
 typedef void (*EMBEDRETURNVOIDFINDER) (TV *, bool, bool);
@@ -311,7 +310,7 @@
 
     bool eventFilter(QObject *o, QEvent *e);
     static QStringList lastProgramStringList;
-    static EMBEDRETURNPROGRAM RunPlaybackBoxPtr;
+    static EMBEDRETURNVOID RunPlaybackBoxPtr;
     static EMBEDRETURNVOID RunViewScheduledPtr;
     static EMBEDRETURNVOIDEPG RunProgramGuidePtr;
     static EMBEDRETURNVOIDFINDER RunProgramFinderPtr;
@@ -342,6 +341,8 @@
     void ForceNextStateNone(PlayerContext*);
     void ScheduleStateChange(PlayerContext*);
     void SetErrored(PlayerContext*);
+    void PrepToSwitchToRecordedProgram(PlayerContext*,
+                                        ProgramInfo*);
     void PrepareToExitPlayer(PlayerContext*, int line,
                              bool bookmark = true) const;
     void SetExitPlayer(bool set_it, bool wants_to) const;
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 23339)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -113,7 +113,7 @@
 /**
  * \brief function pointer for RunPlaybackBox in playbackbox.cpp
  */
-EMBEDRETURNPROGRAM TV::RunPlaybackBoxPtr = NULL;
+EMBEDRETURNVOID TV::RunPlaybackBoxPtr = NULL;
 
 /**
  * \brief function pointer for RunViewScheduled in viewscheduled.cpp
@@ -440,7 +440,7 @@
 {
     QString name(string);
     if (name == "playbackbox")
-        RunPlaybackBoxPtr = (EMBEDRETURNPROGRAM)lptr;
+        RunPlaybackBoxPtr = (EMBEDRETURNVOID)lptr;
     else if (name == "viewscheduled")
         RunViewScheduledPtr = (EMBEDRETURNVOID)lptr;
     else if (name == "programguide")
@@ -3087,6 +3087,18 @@
     errorRecoveryTimerId = StartTimer(1, __LINE__);
 }
 
+void TV::PrepToSwitchToRecordedProgram(PlayerContext *ctx,
+                                        ProgramInfo *p)
+{
+    VERBOSE(VB_GENERAL, LOC +
+                    QString("Switchin to program: %1: %2")
+                            .arg(p->title).arg(p->subtitle));
+    SetLastProgram(p);
+    PrepareToExitPlayer(ctx,__LINE__);
+    jumpToProgram = true;
+    SetExitPlayer(true, true);
+}
+
 void TV::PrepareToExitPlayer(PlayerContext *ctx, int line, bool bookmark) const
 {
     bool bookmark_it = bookmark && IsBookmarkAllowed(ctx);
@@ -8113,7 +8125,6 @@
     }
 
     // Actually show the pop-up UI
-    ProgramInfo *nextProgram = NULL;
     switch (editType)
     {
         case kScheduleProgramGuide:
@@ -8144,7 +8155,7 @@
         }
         case kPlaybackBox:
         {
-            nextProgram = RunPlaybackBoxPtr((void *)this, !pause_active);
+            RunPlaybackBoxPtr((void *)this, !pause_active);
             ignoreKeyPresses = true;
             break;
         }
@@ -8855,6 +8866,7 @@
     if (message.left(11) == "EPG_EXITING" || 
         message.left(18) == "PROGFINDER_EXITING" || 
         message.left(21) == "VIEWSCHEDULED_EXITING" || 
+        message.left(19)   == "PLAYBACKBOX_EXITING" ||
         message.left(22) == "SCHEDULEEDITOR_EXITING")
     {
         GetMythMainWindow()->SetDrawEnabled(false);
@@ -8888,10 +8900,24 @@
         qApp->processEvents();
         DrawUnusedRects();
 
+        isEmbedded = false;
+        ignoreKeyPresses = false;
+
+        if (message.left(19)   == "PLAYBACKBOX_EXITING")
+        {
+            ProgramInfo *p = new ProgramInfo;
+            QStringList nextProgStringList = me->ExtraDataList();
+            if (!nextProgStringList.isEmpty() && 
+                p->FromStringList(nextProgStringList, 0))
+            {
+                PrepToSwitchToRecordedProgram(actx, p);
+            }
+            else
+               delete p;
+        }
+        
         ReturnPlayerLock(actx);
 
-        isEmbedded = false;
-        ignoreKeyPresses = false;
     }
 
     if (message.left(14) == "COMMFLAG_START")
@@ -10997,14 +11023,7 @@
         {
             if (mctx == ctx)
             {
-                VERBOSE(VB_GENERAL, LOC +
-                        QString("Switching to program: %1: %2")
-                        .arg(p->title).arg(p->subtitle));
-
-                SetLastProgram(p);
-                PrepareToExitPlayer(ctx, __LINE__);
-                jumpToProgram = true;
-                SetExitPlayer(true, true);
+                PrepToSwitchToRecordedProgram(ctx, p);
             }
             else
             {
@@ -11042,7 +11061,8 @@
             (wants_pbp ? kPBPLeft : kPIPOff);
     }
 
-    if (db_jump_prefer_osd && (StateIsPlaying(s) || StateIsLiveTV(s)))
+    if ((wants_pbp || wants_pip || db_jump_prefer_osd) && 
+        (StateIsPlaying(s) || StateIsLiveTV(s)))
     {
         QMutexLocker locker(&timerIdLock);
         if (jumpMenuTimerId)
Index: programs/mythfrontend/playbackbox.cpp
===================================================================
--- programs/mythfrontend/playbackbox.cpp	(revision 23339)
+++ programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -319,7 +319,7 @@
     return chanid && recstartts.isValid();
 }
 
-ProgramInfo *PlaybackBox::RunPlaybackBox(void * player, bool showTV)
+void * PlaybackBox::RunPlaybackBox(void * player, bool showTV)
 {
     MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
 
@@ -331,11 +331,7 @@
     else
         delete pbb;
 
-    ProgramInfo *nextProgram = NULL;
-    if (pbb->CurrentItem())
-        nextProgram = new ProgramInfo(*pbb->CurrentItem());
-
-    return nextProgram;
+    return NULL;
 }
 
 PlaybackBox::PlaybackBox(MythScreenStack *parent, QString name, BoxType ltype,
@@ -373,6 +369,7 @@
       m_underNetworkControl(false),
       // Other
       m_player(NULL),
+      m_player_selected_new_show(false),
       m_helper(this)
 {
     m_formatShortDate    = gContext->GetSetting("ShortDateFormat", "M/d");
@@ -468,6 +465,18 @@
         m_coverartTimer->disconnect(this);
         m_coverartTimer = NULL;
     }
+
+    if (m_player)
+    {
+        QStringList nextProgram;
+        ProgramInfo *pginfo = CurrentItem();
+
+        if (pginfo && m_player_selected_new_show)
+            pginfo->ToStringList(nextProgram);
+
+        QString message = QString("PLAYBACKBOX_EXITING");
+        qApp->postEvent(m_player, new MythEvent(message, nextProgram));
+    }
 }
 
 bool PlaybackBox::Create()
@@ -764,7 +773,7 @@
     QString rating = QString::number((int)((pginfo->stars * 10.0) + 0.5));
 
     item->DisplayState(rating, "ratingstate");
-    
+
     QString oldimgfile = item->GetImage("preview");
     if (oldimgfile.isEmpty() || force_preview_reload)
         m_helper.GetPreviewImage(*pginfo);
@@ -1151,7 +1160,7 @@
     subtitleFlags[SUB_ONSCREEN] = "onscreensub";
     subtitleFlags[SUB_NORMAL] = "subtitles";
     subtitleFlags[SUB_HARDHEAR] = "cc";
-    
+
     ProgramList::iterator it = progList.begin();
     for (; it != progList.end(); ++it)
     {
@@ -1193,10 +1202,10 @@
         disp_flag_stat[7] = (*it)->programflags & FL_INUSEPLAYING;
         disp_flag_stat[8] = (*it)->programflags & FL_COMMFLAG;
         disp_flag_stat[9] = (*it)->programflags & FL_TRANSCODED;
-        
+
         for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); ++i)
             item->DisplayState(disp_flag_stat[i]?"yes":"no", disp_flags[i]);
-        
+
         QMap<AudioProps, QString>::iterator ait;
         for (ait = audioFlags.begin(); ait != audioFlags.end(); ++ait)
         {
@@ -1210,7 +1219,7 @@
             if ((*it)->videoproperties & vit.key())
                 item->DisplayState(vit.value(), "videoprops");
         }
-          
+
         QMap<SubtitleTypes, QString>::iterator sit;
         for (sit = subtitleFlags.begin(); sit != subtitleFlags.end(); ++sit)
         {
@@ -1903,8 +1912,10 @@
     if (!pginfo)
         return;
 
-    if (m_player && m_player->IsSameProgram(0, pginfo))
+    if (m_player)
     {
+        if (!m_player->IsSameProgram(0, pginfo))
+            m_player_selected_new_show = true;
         Close();
         return;
     }
@@ -2274,7 +2285,7 @@
     QStringList sgEntries;
 
     // TODO do this in another thread
-    RemoteGetFileList(host, "", &sgEntries, sgroup, true); 
+    RemoteGetFileList(host, "", &sgEntries, sgroup, true);
 
     int regIndex = 0;
     titleIn.replace(' ', "(?:\\s|-|_|\\.)?");
@@ -2348,28 +2359,6 @@
         return QString();
 }
 
-void PlaybackBox::doPIPPlay(void)
-{
-    doPIPPlay(kPIPonTV);
-}
-
-void PlaybackBox::doPBPPlay(void)
-{
-    doPIPPlay(kPBPLeft);
-}
-
-void PlaybackBox::doPIPPlay(PIPState state)
-{
-    if (m_player)
-    {
-        ProgramInfo *pginfo = CurrentItem();
-        m_player->SetNextProgPIPState(state);
-        if (pginfo)
-            pginfo->setIgnoreBookmark(true);
-        Close();
-    }
-}
-
 void PlaybackBox::ShowDeletePopup(DeletePopupType type)
 {
     if (m_popupMenu)
@@ -2944,23 +2933,18 @@
         sameProgram = m_player->IsSameProgram(0, &pginfo);
 
     TVState tvstate = kState_None;
-    if (m_player)
-    {
-        if (!sameProgram && m_player->IsPIPSupported())
-            m_popupMenu->AddButton(tr("Start As PIP"), SLOT(doPIPPlay()));
-        if (!sameProgram && m_player->IsPBPSupported())
-            m_popupMenu->AddButton(tr("Start As PBP"), SLOT(doPBPPlay()));
 
-        tvstate = m_player->GetState(0);
-    }
-    else
+    if (!sameProgram)
     {
         if (pginfo.programflags & FL_BOOKMARK)
             m_popupMenu->AddButton(tr("Play from..."),
-                                        SLOT(showPlayFromPopup()), true);
+                                        SLOT(showPlayFromPopup()), true);
         else
             m_popupMenu->AddButton(tr("Play"), SLOT(playSelected()));
+    }
 
+    if (!m_player)
+    {
         if (m_playList.filter(pginfo.MakeUniqueKey()).size())
             m_popupMenu->AddButton(tr("Remove from Playlist"),
                                         SLOT(togglePlayListItem()));
@@ -4428,9 +4412,9 @@
             tmpItem->SetWatchedFlag(turnOn);
         }
     }
-    
+
     doClearPlaylist();
-    UpdateUILists();    
+    UpdateUILists();
 }
 
 void PlaybackBox::showMetadataEditor()
Index: programs/mythfrontend/playbackbox.h
===================================================================
--- programs/mythfrontend/playbackbox.h	(revision 23339)
+++ programs/mythfrontend/playbackbox.h	(working copy)
@@ -123,7 +123,7 @@
     void customEvent(QEvent *event);
 
     void setInitialRecGroup(QString initialGroup) { m_recGroup = initialGroup; }
-    static ProgramInfo *RunPlaybackBox(void *player, bool);
+    static void * RunPlaybackBox(void *player, bool);
 
   public slots:
     void displayRecGroup(const QString &newRecGroup = "");
@@ -174,9 +174,6 @@
 
     void doPlayFromBeg();
     void doPlayListRandom();
-    void doPIPPlay(void);
-    void doPIPPlay(PIPState state);
-    void doPBPPlay(void);
 
     void askStop();
 
@@ -432,6 +429,7 @@
 
     // Other
     TV                 *m_player;
+    bool                m_player_selected_new_show;
     /// Main helper thread
     PlaybackBoxHelper   m_helper;
 };
