Index: libs/libmythtv/guidegrid.h
===================================================================
--- libs/libmythtv/guidegrid.h	(revision 15719)
+++ libs/libmythtv/guidegrid.h	(working copy)
@@ -38,8 +38,7 @@
     static DBChanList Run(uint           startChanId,
                           const QString &startChanNum,
                           bool           thread = false,
-                          TV            *player = NULL,
-                          bool           allowsecondaryepg = true);
+                          TV            *player = NULL);
 
     DBChanList GetSelection(void) const;
 
@@ -85,7 +84,7 @@
   protected:
     GuideGrid(MythMainWindow *parent,
               uint chanid = 0, QString channum = "",
-              TV *player = NULL, bool allowsecondaryepg = true,
+              TV *player = NULL, 
               const char *name = "GuideGrid");
    ~GuideGrid();
 
Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 15719)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -43,8 +43,8 @@
 typedef QMap<QString,InfoMap>    DDValueMap;
 typedef QMap<QString,DDValueMap> DDKeyMap;
 typedef ProgramInfo * (*RUNPLAYBACKBOX)(void *);
+typedef void (*RUNVIEWSCHEDULED) (void *);
 
-
 class VBIMode
 {
   public:
@@ -75,7 +75,8 @@
     kScheduleProgramGuide = 0,
     kScheduleProgramFinder,
     kScheduledRecording,
-    kPlaybackBox,
+    kViewSchedule,
+    kPlaybackBox
 };
 
 typedef enum
@@ -197,7 +198,9 @@
     /// true if dialog is either videoplayexit, playexit or askdelete dialog
     bool IsVideoExitDialog(void);
     /// true if NVP is near the end
-    bool IsNearEnd(void) { return isnearend; }
+    bool IsNearEnd(void) const { return isnearend; }
+    /// true if tv player is paused
+    bool IsPaused(void) const { return paused; }
 
     // Other queries
     int GetLastRecorderNum(void) const;
@@ -239,6 +242,8 @@
   protected:
     void doEditSchedule(int editType = kScheduleProgramGuide);
     static void *RecordedShowMenuHandler(void *param);
+    static void *ViewScheduledMenuHandler(void *param);
+    void VideoThemeCheck(QString str, bool stayPaused = false);
 
     void RunTV(void);
     static void *EventThread(void *param);
@@ -247,6 +252,7 @@
     bool eventFilter(QObject *o, QEvent *e);
     static QStringList lastProgramStringList;
     static RUNPLAYBACKBOX RunPlaybackBoxPtr;
+    static RUNVIEWSCHEDULED RunViewScheduledPtr;
 
   private:
     bool RequestNextRecorder(bool showDialogs);
Index: libs/libmythtv/guidegrid.cpp
===================================================================
--- libs/libmythtv/guidegrid.cpp	(revision 15719)
+++ libs/libmythtv/guidegrid.cpp	(working copy)
@@ -40,8 +40,7 @@
     uint           chanid,
     const QString &channum,
     bool           thread,
-    TV            *player,
-    bool           allowsecondaryepg)
+    TV            *player)
 {
     DBChanList channel_changed;
 
@@ -52,7 +51,7 @@
 
     GuideGrid *gg = new GuideGrid(gContext->GetMainWindow(),
                                   chanid, channum,
-                                  player, allowsecondaryepg, "guidegrid");
+                                  player, "guidegrid");
 
     gg->Show();
 
@@ -91,8 +90,7 @@
 
 GuideGrid::GuideGrid(MythMainWindow *parent,
                      uint chanid, QString channum,
-                     TV *player, bool allowsecondaryepg,
-                     const char *name)
+                     TV *player, const char *name)
          : MythDialog(parent, name)
 {
     desiredDisplayChans = DISPLAY_CHANS = 6;
@@ -123,14 +121,14 @@
     theme = new XMLParse();
     theme->SetWMult(wmult);
     theme->SetHMult(hmult);
-    if (m_player && m_player->IsRunning() && allowsecondaryepg)
+    if (m_player && m_player->IsRunning() && !m_player->IsPaused())
         theme->LoadTheme(xmldata, "programguide-video");
     else 
         theme->LoadTheme(xmldata, "programguide");
 
     LoadWindow(xmldata);
 
-    if (m_player && m_player->IsRunning() && !allowsecondaryepg)
+    if (m_player && m_player->IsRunning() && m_player->IsPaused())
         videoRect = QRect(0, 0, 1, 1);
 
     showFavorites = gContext->GetNumSetting("EPGShowFavorites", 0);
@@ -202,7 +200,7 @@
 
     int dNum = gContext->GetNumSetting("chanPerPage", 8);
 
-    if (m_player && m_player->IsRunning() && allowsecondaryepg)
+    if (m_player && m_player->IsRunning() && !m_player->IsPaused())
         dNum = dNum * 2 / 3 + 1;
 
     desiredDisplayChans = DISPLAY_CHANS = dNum;
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 15719)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -78,6 +78,10 @@
  */
 RUNPLAYBACKBOX TV::RunPlaybackBoxPtr = NULL;
 
+/**\ brief function pointer for RunViewScheduled in viewscheduled.cpp
+ */
+RUNVIEWSCHEDULED TV::RunViewScheduledPtr = NULL;
+
 /*
  \brief returns true if the recording completed when exiting.
  */
@@ -262,6 +266,8 @@
     QString name(string);
     if (name == "playbackbox")
         RunPlaybackBoxPtr = (RUNPLAYBACKBOX)lptr;
+    else if (name == "viewscheduled")
+        RunViewScheduledPtr = (RUNVIEWSCHEDULED)lptr;
 }
 
 void TV::InitKeys(void)
@@ -406,6 +412,7 @@
     REG_KEY("TV Playback", "PLAY", "Play", "Ctrl+P");
     REG_KEY("TV Playback", "JUMPPREV", "Jump to previously played recording", "");
     REG_KEY("TV Playback", "JUMPREC", "Display menu of recorded programs to jump to", "");
+    REG_KEY("TV Playback", "VIEWSCHEDULED", "Display scheduled recording list", "");
     REG_KEY("TV Playback", "SIGNALMON", "Monitor Signal Quality", "F7");
     REG_KEY("TV Playback", "JUMPTODVDROOTMENU", "Jump to the DVD Root Menu", "");
     REG_KEY("TV Playback", "EXITSHOWNOPROMPTS","Exit Show without any prompts", "");
@@ -3151,6 +3158,8 @@
                 jumpToProgram = true;
             }
         }
+        else if (action == "VIEWSCHEDULED")
+            EmbedWithNewThread(kViewSchedule);
         else if (action == "JUMPREC")
         {
             if (gContext->GetNumSetting("JumpToProgramOSD", 1) 
@@ -5675,14 +5684,50 @@
         nvp->DrawUnusedRects(sync);
 }
 
+void *TV::ViewScheduledMenuHandler(void *param)
+{
+    TV *obj = (TV *)param;
+    obj->doEditSchedule(kViewSchedule);
+    return NULL;
+}
+
 void *TV::RecordedShowMenuHandler(void *param)
 {
     TV *obj = (TV *)param;
     obj->doEditSchedule(kPlaybackBox);
-
     return NULL;
 }
 
+/**
+ * \brief Used by EditSchedule(). Unpauses embedded tv based on whether theme 
+    exists and/or if knob to continued playback is enabled
+ */
+void TV::VideoThemeCheck(QString str, bool stayPaused)
+{   
+    // see if embedded window is allowed
+    bool allowembed = false;
+    if (gContext->GetNumSetting("ContinueEmbeddedTVPlay", 0) ||
+        StateIsLiveTV(GetState()))
+    {
+        allowembed = (nvp && nvp->getVideoOutput() && 
+                nvp->getVideoOutput()->AllowEmbedding());
+    }
+
+    long long margin = (long long)(nvp->GetFrameRate() *
+                        nvp->GetAudioStretchFactor());
+    margin = margin * 5;
+    QDomElement xmldata;
+    XMLParse *theme = new XMLParse();
+    if (allowembed && theme->LoadTheme(xmldata, str) && 
+        !nvp->IsNearEnd(margin) && !stayPaused)
+    {
+        DoPause(false);
+    }
+
+    if (theme)
+        delete theme;
+}
+
 void TV::doEditSchedule(int editType)
 {
     if (!playbackinfo)
@@ -5714,113 +5759,55 @@
     DBChanList changeChannel;
     ProgramInfo *nextProgram = NULL;
 
-    if (StateIsLiveTV(GetState()))
+    bool stayPaused = paused;
+    if (!paused)
+        DoPause(false);
+
+    switch (editType)
     {
-        switch (editType)
+        default:
+        case kScheduleProgramGuide:
+            VideoThemeCheck("programguide-video", stayPaused);
+            GuideGrid::Run(chanid, channum, false, this);
+            break;
+        case kScheduleProgramFinder:
+            RunProgramFind(true, false);
+            break;
+        case kScheduledRecording:
         {
-            default:
-            case kScheduleProgramGuide:
-            {
-                // See if we can provide a channel preview in EPG
-                bool allowsecondary = true;
-                if (nvp && nvp->getVideoOutput())
-                    allowsecondary = nvp->getVideoOutput()->AllowPreviewEPG();
-
-                // Start up EPG
-                changeChannel = GuideGrid::Run(
-                    chanid, channum, false, this, allowsecondary);
-
-                break;
-            }
-            case kPlaybackBox:
-            {
-                bool stayPaused = false;
-                QDomElement pbbxmldata;
-                XMLParse    *theme = new XMLParse();
-                if (!theme->LoadTheme(pbbxmldata, "playback-video"))
-                {
-                    stayPaused = paused;
-                    if (!paused)
-                        DoPause(false);
-                }
-                if (theme)
-                    delete theme;
-                nextProgram = RunPlaybackBoxPtr((void *)this);
-                if (nextProgram)
-                {
-                    setLastProgram(nextProgram);
-                    jumpToProgram = true;
-                    exitPlayer = true;
-                    delete nextProgram;
-                }
-                if (paused && !stayPaused)
-                    DoPause(false);
-                break;
-            }
+            QMutexLocker locker(&pbinfoLock);
+            ScheduledRecording *record = new ScheduledRecording();
+            record->loadByProgram(playbackinfo);
+            record->exec();
+            record->deleteLater();
+            break;
         }
-        if (IsEmbedding())
-            StopEmbeddingOutput();
-    }
-    else
-    {
-        bool stayPaused = paused;
-        if (!paused)
-            DoPause();
-
-        switch (editType)
+        case kViewSchedule:
         {
-            default:
-            case kScheduleProgramGuide:
-                GuideGrid::Run(chanid, channum, false);
-                break;
-            case kScheduleProgramFinder:
-                RunProgramFind(true, false);
-                break;
-            case kScheduledRecording:
-            {
-                QMutexLocker locker(&pbinfoLock);
-                ScheduledRecording *record = new ScheduledRecording();
-                record->loadByProgram(playbackinfo);
-                record->exec();
-                record->deleteLater();
-                break;
-            }
-            case kPlaybackBox:
-            {
-                long long margin = 
-                    (long long)(nvp->GetFrameRate() * nvp->GetAudioStretchFactor());
-                // keep video paused if only 5 seconds left in recording
-                margin = margin * 5; 
-                QDomElement pbbxmldata;
-                XMLParse *theme = new XMLParse();
-                if (theme->LoadTheme(pbbxmldata, "playback-video"))
-                {
-                    if (!stayPaused && paused && !nvp->IsNearEnd(margin))
-                    {
-                        DoPause(false);
-                        stayPaused = true;
-                    }
-                }
-                if (theme)
-                    delete theme;
-                nextProgram = RunPlaybackBoxPtr((void *)this);
-                if (IsEmbedding())
-                    StopEmbeddingOutput();
-                if (nextProgram)
-                {
-                    setLastProgram(nextProgram);
-                    jumpToProgram = true;
-                    exitPlayer = true;
-                    delete nextProgram;
-                }
-                break;
-            }
+            VideoThemeCheck("conflict-video", stayPaused);
+            RunViewScheduledPtr((void *)this);
+            break;
         }
-
-        if (!stayPaused)
-            DoPause();
+        case kPlaybackBox:
+        {
+            VideoThemeCheck("playback-video", stayPaused);
+            nextProgram = RunPlaybackBoxPtr((void *)this);
+        }
     }
 
+    if (!stayPaused && paused)
+        DoPause(false);
+
+    if (IsEmbedding())
+        StopEmbeddingOutput();
+
+    if (nextProgram)
+    {
+        setLastProgram(nextProgram);
+        jumpToProgram = true;
+        exitPlayer = true;
+        delete nextProgram;
+    }
     // Resize the window back to the MythTV Player size
     if (!using_gui_size_for_tv)
     {
@@ -5845,8 +5832,6 @@
  */
 void TV::EmbedWithNewThread(int editType)
 {
-    (void) editType;
-
     if (menurunning != true)
     {
         menurunning = true;
@@ -5855,7 +5840,16 @@
         pthread_attr_init(&attr);
         pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
-        pthread_create(&tid, &attr, TV::RecordedShowMenuHandler, this);
+        switch (editType)
+        {
+            case kViewSchedule:
+                pthread_create(&tid, &attr, TV::ViewScheduledMenuHandler, this);
+                break;
+            case kPlaybackBox:
+                pthread_create(&tid, &attr, TV::RecordedShowMenuHandler, this);
+                break;
+        }
+
         pthread_attr_destroy(&attr);
 
         return;
@@ -7228,6 +7222,8 @@
             jumpToProgram = true;
         }
     }
+    else if (action == "VIEWSCHEDULED")
+        EmbedWithNewThread(kViewSchedule);
     else if (action == "JUMPREC")
     {
         if (gContext->GetNumSetting("JumpToProgramOSD", 1)
@@ -7670,6 +7666,8 @@
 
     item = new OSDGenericTree(treeMenu, tr("Schedule Recordings"));
     subitem = new OSDGenericTree(item, tr("Program Guide"), "GUIDE");
+    subitem = new OSDGenericTree(item, tr("Upcoming Recordings"), 
+                                "VIEWSCHEDULED");
     subitem = new OSDGenericTree(item, tr("Program Finder"), "FINDER");
     subitem = new OSDGenericTree(item, tr("Edit Recording Schedule"),
                                  "SCHEDULE");
Index: libs/libmythtv/videooutbase.h
===================================================================
--- libs/libmythtv/videooutbase.h	(revision 15719)
+++ libs/libmythtv/videooutbase.h	(working copy)
@@ -115,7 +115,7 @@
     int         GetPictureAttribute(PictureAttribute) const;
     virtual void InitPictureAttributes(void);
 
-    bool AllowPreviewEPG(void) { return allowpreviewepg; }
+    bool AllowEmbedding(void) { return allowpreviewepg; }
 
     /// \brief Returns true iff Motion Compensation acceleration is available.
     virtual bool hasMCAcceleration(void) const { return false; }
Index: programs/mythfrontend/playbackbox.cpp
===================================================================
--- programs/mythfrontend/playbackbox.cpp	(revision 15717)
+++ programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -348,7 +348,8 @@
     // theme stuff
     theme->SetWMult(wmult);
     theme->SetHMult(hmult);
-    if (m_player && theme->LoadTheme(xmldata,"playback-video"))
+    if (m_player && !m_player->IsPaused() &&
+        theme->LoadTheme(xmldata,"playback-video"))
     {
         playbackVideoContainer = true;
         previewPixmapEnabled = false;
Index: programs/mythfrontend/viewscheduled.h
===================================================================
--- programs/mythfrontend/viewscheduled.h	(revision 15717)
+++ programs/mythfrontend/viewscheduled.h	(working copy)
@@ -9,13 +9,17 @@
 #include "xmlparse.h"
 #include "programinfo.h"
 
+class TV;
+class Timer;
 
 class ViewScheduled : public MythDialog
 {
     Q_OBJECT
   public:
-    ViewScheduled(MythMainWindow *parent, const char *name = 0);
+    ViewScheduled(MythMainWindow *parent, const char *name = 0,
+                    TV *player = NULL);
     ~ViewScheduled();
+    static void * RunViewScheduled(void *player);
 
   protected slots:
     void edit();
@@ -28,6 +32,7 @@
     void cursorUp(bool page = false);
     void pageDown() { cursorDown(true); }
     void pageUp() { cursorUp(true); }
+    void timeout(void);
 
   protected:
     void paintEvent(QPaintEvent *);
@@ -49,6 +54,7 @@
 
     void LoadWindow(QDomElement &);
     void parseContainer(QDomElement &);
+    void EmbedTVWindow(void);
     XMLParse *theme;
     QDomElement xmldata;
 
@@ -66,6 +72,7 @@
     QRect showLevelRect;
     QRect recStatusRect;
     QRect fullRect;
+    QRect tvRect;
 
     int listsize;
 
@@ -85,6 +92,9 @@
     QMap<int, int> inputref;
     int maxinput;
     int curinput;
+
+    TV *m_player;
+    QTimer *timer;
 };
 
 #endif
Index: programs/mythfrontend/globalsettings.cpp
===================================================================
--- programs/mythfrontend/globalsettings.cpp	(revision 15717)
+++ programs/mythfrontend/globalsettings.cpp	(working copy)
@@ -1907,6 +1907,19 @@
     return gc;
 }
 
+static HostCheckBox *ContinueEmbeddedTVPlay()
+{
+    HostCheckBox *gc = new HostCheckBox("ContinueEmbeddedTVPlay");
+    gc->setLabel(QObject::tr("Continue Playback When Embedded"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr(
+                    "This option, continues TV playback, when the TV window "
+                    "is embedded in the upcoming program list or recorded "
+                    "list. The default is to pause the recorded show when "
+                    "embedded"));
+    return gc;
+}
+
 static HostCheckBox *AutomaticSetWatched()
 {
     HostCheckBox *gc = new HostCheckBox("AutomaticSetWatched");
@@ -4410,6 +4423,7 @@
     column2->addChild(ClearSavedPosition());
     column2->addChild(AltClearSavedPosition());
     column2->addChild(JumpToProgramOSD());
+    column2->addChild(ContinueEmbeddedTVPlay());
     column2->addChild(AutomaticSetWatched());
     columns->addChild(column2);
 
Index: programs/mythfrontend/main.cpp
===================================================================
--- programs/mythfrontend/main.cpp	(revision 15717)
+++ programs/mythfrontend/main.cpp	(working copy)
@@ -802,6 +802,7 @@
     TV::InitKeys();
 
     TV::SetFuncPtr("playbackbox", (void *)PlaybackBox::RunPlaybackBox);
+    TV::SetFuncPtr("viewscheduled", (void *)ViewScheduled::RunViewScheduled);
 }
 
 
Index: programs/mythfrontend/viewscheduled.cpp
===================================================================
--- programs/mythfrontend/viewscheduled.cpp	(revision 15717)
+++ programs/mythfrontend/viewscheduled.cpp	(working copy)
@@ -18,14 +18,31 @@
 #include "scheduledrecording.h"
 #include "customedit.h"
 #include "proglist.h"
-#include "tv.h"
+#include "tv_play.h"
 
 #include "exitcodes.h"
 #include "dialogbox.h"
 #include "mythcontext.h"
 #include "remoteutil.h"
 
-ViewScheduled::ViewScheduled(MythMainWindow *parent, const char *name)
+QWaitCondition vsbIsVisibleCond;
+
+void *ViewScheduled::RunViewScheduled(void *player)
+{
+    qApp->lock();
+
+    ViewScheduled *vsb = new ViewScheduled(gContext->GetMainWindow(),
+                            "view scheduled", (TV*)player);
+    vsb->Show();
+    qApp->unlock();
+    vsbIsVisibleCond.wait();
+    delete vsb;
+
+    return NULL;
+}
+
+ViewScheduled::ViewScheduled(MythMainWindow *parent, const char *name,
+                            TV* player)
              : MythDialog(parent, name)
 {
     dateformat = gContext->GetSetting("ShortDateFormat", "M/d");
@@ -40,12 +57,27 @@
     showLevelRect = QRect(0, 0, 0, 0);
     recStatusRect = QRect(0, 0, 0, 0);
 
+    m_player = player;
     theme = new XMLParse();
     theme->SetWMult(wmult);
     theme->SetHMult(hmult);
-    theme->LoadTheme(xmldata, "conflict");
+    if (m_player && m_player->IsRunning() && !m_player->IsPaused())
+    {
+        if (!theme->LoadTheme(xmldata, "conflict-video"))
+            theme->LoadTheme(xmldata, "conflict");
+    }
+    else
+        theme->LoadTheme(xmldata, "conflict");
     LoadWindow(xmldata);
 
+    if (m_player)
+    {
+        timer = new QTimer(this);
+        connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
+        timer->start(500);
+        EmbedTVWindow();
+    }
+
     LayerSet *container = theme->GetSet("selector");
     if (container)
     {
@@ -84,9 +116,22 @@
     gContext->SaveSetting("ViewSchedShowLevel", !showAll);
     gContext->removeListener(this);
     gContext->removeCurrentLocation();
+
+    if (timer)
+    {
+        timer->deleteLater();
+        timer = NULL;
+    }
+
     delete theme;
 }
 
+void ViewScheduled::timeout(void)
+{
+    if (m_player)
+        EmbedTVWindow();
+}
+
 void ViewScheduled::keyPressEvent(QKeyEvent *e)
 {
     if (inEvent)
@@ -116,7 +161,10 @@
             else if (action == "DETAILS")
                 details();
             else if (action == "ESCAPE" || action == "LEFT")
+            {
+                vsbIsVisibleCond.wakeAll();
                 done(MythDialog::Accepted);
+            }
             else if (action == "UP")
                 cursorUp();
             else if (action == "DOWN")
@@ -196,6 +244,8 @@
         showLevelRect = area;
     if (name.lower() == "status_info")
         recStatusRect = area;
+    if (name.lower() == "tv_video")
+        tvRect = area;
 }
 
 void ViewScheduled::updateBackground(void)
@@ -736,3 +786,13 @@
     }
     curinput = 0;
 }
+
+void ViewScheduled::EmbedTVWindow(void)
+{
+    if (m_player)
+    {
+        m_player->EmbedOutput(this->winId(), tvRect.x(), tvRect.y(),
+                            tvRect.width(), tvRect.height());
+    }
+}
+        
