diff -p -r -u -N -X /tmp/diff.exclude -x release.21127.0805a -x release.21127.0805b release.21127.0805a/mythtv/libs/libmythtv/remoteutil.cpp release.21127.0805b/mythtv/libs/libmythtv/remoteutil.cpp
--- mythtv/libs/libmythtv/remoteutil.cpp	2009-08-05 16:51:34.000000000 -0500
+++ mythtv/libs/libmythtv/remoteutil.cpp	2009-08-05 16:53:14.000000000 -0500
@@ -11,6 +11,7 @@
 #include "mythcontext.h"
 #include "remoteencoder.h"
 #include "tv_rec.h"
+#include "mythverbose.h"
 
 uint RemoteGetFlags(uint cardid)
 {
@@ -46,7 +47,7 @@ uint RemoteGetState(uint cardid)
     return strlist[0].toInt();
 }
 
-vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype)
+vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype, int upcomingLevel)
 {
     QString str = "QUERY_RECORDINGS ";
     if (deltype)
@@ -58,7 +59,7 @@ vector<ProgramInfo *> *RemoteGetRecorded
 
     vector<ProgramInfo *> *info = new vector<ProgramInfo *>;
 
-    if (!RemoteGetRecordingList(info, strlist))
+    if (!RemoteGetRecordingList(info, strlist, upcomingLevel))
     {
         delete info;
         return NULL;
@@ -306,7 +307,7 @@ void RemoteGetAllExpiringRecordings(vect
     RemoteGetRecordingList(&expiringlist, strList);
 }
 
-int RemoteGetRecordingList(vector<ProgramInfo *> *reclist, QStringList &strList)
+int RemoteGetRecordingList(vector<ProgramInfo *> *reclist, QStringList &strList, int upcomingLevel)
 {
     if (!gContext->SendReceiveStringList(strList))
         return 0;
@@ -330,7 +331,41 @@ int RemoteGetRecordingList(vector<Progra
         }
     }
 
-    return numrecordings;
+    int numupcomingrecordings = 0;
+
+    if (upcomingLevel > 0)
+    {
+        QStringList upcomingRecordings = "QUERY_GETALLPENDING";
+        if (!gContext->SendReceiveStringList(upcomingRecordings))
+            return 0;
+
+        numupcomingrecordings = upcomingRecordings[1].toInt();
+
+        if (numupcomingrecordings > 0)
+        {
+            if (numupcomingrecordings * NUMPROGRAMLINES + 1 > (int)upcomingRecordings.size())
+            {
+                cerr << "length mismatch between programinfo and upcomingRecordings\n";
+                return 0;
+            }
+
+            QStringList::const_iterator it = upcomingRecordings.at(2);
+            for (int i = 0; i < numupcomingrecordings; i++)
+            {
+                ProgramInfo *pginfo = new ProgramInfo();
+                pginfo->FromStringList(it, upcomingRecordings.end());
+                if (pginfo->recstatus == rsWillRecord || pginfo->recstatus == rsConflict ||
+                    (upcomingLevel >= 2 && pginfo->recstatus == rsInactive) ||
+                    (upcomingLevel >= 3 && pginfo->recstatus >= rsWillRecord))
+
+                    reclist->push_back(pginfo);
+                else
+                    delete pginfo;
+            }
+        }
+    }
+
+    return numrecordings + numupcomingrecordings;
 }
 
 vector<ProgramInfo *> *RemoteGetConflictList(ProgramInfo *pginfo)
diff -p -r -u -N -X /tmp/diff.exclude -x release.21127.0805a -x release.21127.0805b release.21127.0805a/mythtv/libs/libmythtv/remoteutil.h release.21127.0805b/mythtv/libs/libmythtv/remoteutil.h
--- mythtv/libs/libmythtv/remoteutil.h	2009-08-05 16:39:08.000000000 -0500
+++ mythtv/libs/libmythtv/remoteutil.h	2009-08-05 16:53:14.000000000 -0500
@@ -49,7 +49,7 @@ class TunerStatus
 
 MPUBLIC uint RemoteGetState(uint cardid);
 MPUBLIC uint RemoteGetFlags(uint cardid);
-MPUBLIC vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype);
+MPUBLIC vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype, int upcomingLevel = 0);
 MPUBLIC vector<FileSystemInfo> RemoteGetFreeSpace();
 MPUBLIC bool RemoteGetLoad(float load[3]);
 MPUBLIC bool RemoteGetUptime(time_t &uptime);
@@ -71,7 +71,7 @@ void RemoteGetAllScheduledRecordings(vec
 MPUBLIC
 void RemoteGetAllExpiringRecordings(vector<ProgramInfo *> &expiringlist);
 MPUBLIC int RemoteGetRecordingList(vector<ProgramInfo *> *reclist,
-                                   QStringList &strList);
+                                   QStringList &strList, int upcomingLevel = 0);
 MPUBLIC vector<ProgramInfo *> *RemoteGetConflictList(ProgramInfo *pginfo);
 MPUBLIC void RemoteSendMessage(const QString &message);
 MPUBLIC RemoteEncoder *RemoteRequestRecorder(void);
diff -p -r -u -N -X /tmp/diff.exclude -x release.21127.0805a -x release.21127.0805b release.21127.0805a/mythtv/programs/mythfrontend/playbackbox.cpp release.21127.0805b/mythtv/programs/mythfrontend/playbackbox.cpp
--- mythtv/programs/mythfrontend/playbackbox.cpp	2009-08-05 16:51:34.000000000 -0500
+++ mythtv/programs/mythfrontend/playbackbox.cpp	2009-08-05 16:54:11.000000000 -0500
@@ -328,6 +328,14 @@ PlaybackBox::PlaybackBox(BoxType ltype, 
     episodeSort = gContext->GetSetting("PlayBoxEpisodeSort", "Date");
     showWatched = gContext->GetNumSetting("ShowWatched", 1);
 
+    /* Values for showUpcoming
+        0 - none
+        1 - recording or conflicting
+        2 - important (inactive rules)
+        3 - all
+     */
+    showUpcoming = gContext->GetNumSetting("ShowUpcoming", 1);
+
     bool displayCat  = gContext->GetNumSetting("DisplayRecGroupIsCategory", 0);
     int  initialFilt = gContext->GetNumSetting("QueryInitialFilter", 0);
 
@@ -821,9 +829,19 @@ void PlaybackBox::updateSortOrder(QPaint
         {
             QString newtag = "(4) ";
             if (showWatched)
-               newtag += "Hide Watched";
+               newtag += "All";
             else
-               newtag += "Show Watched";
+               newtag += "Watched";
+
+            newtag += " (5) ";
+            switch (showUpcoming)
+            {
+                case 0: newtag += "No Rec"; break;
+                case 1: newtag += "Rec"; break;
+                case 2: newtag += "Impt"; break;
+                case 3: newtag += "All"; break;
+            }
+
             type1->SetText(tr(newtag));
         }
 
@@ -1115,9 +1133,90 @@ void PlaybackBox::drawVideo(QPainter *p)
     if (inTitle && haveGroupInfoSet)
         return;
 
+    // Can't do a preview for an upcoming recording
+    if (curitem && curitem->recstatus >= rsWillRecord)
+    {
+        //VERBOSE(VB_GENERAL, QString("previewVideoState = %1").arg(previewVideoState));
+        // Blank out any existing preview
+        QPixmap pix(blackholeBounds.size());
+        pix.fill(Qt::black);
+
+        // Draw some text in place of the preview
+        {
+            /*
+             *  "Title"
+             *  "Will (not) be recorded on"
+             *  "date / time"
+             *  "(due to a conflict)"
+             */
+
+            
+            QPainter pp(&pix);
+            LayerSet *container = theme->GetSet("video");
+            if (container)
+            {
+                UITextType *type;
+                if ((type = (UITextType *)container->GetType("topline")))
+                    type->SetText(curitem->title);
+
+                if (curitem->recstatus == rsWillRecord)
+                {
+                    int daysout = QDate::currentDate().daysTo(curitem->recstartts.date());
+                    QString t1, t2;
+
+                    if (daysout == 0)
+                    {
+                        t1 = "Will be recorded";
+                        t2 = "Today";
+                    }
+                    else if (daysout == 1)
+                    {
+                        t1 = "Will be recorded";
+                        t2 = "Tomorrow";
+                    }
+                    else
+                    {
+                        t1 = "Will be recorded on";
+                        t2 = curitem->recstartts.date().toString();
+                    }
+
+                    if ((type = (UITextType *)container->GetType("midline")))
+                        type->SetText(t1);
+
+                    if ((type = (UITextType *)container->GetType("botline")))
+                        type->SetText(t2);
+                }
+                else
+                {
+                    if ((type = (UITextType *)container->GetType("midline")))
+                        type->SetText("Will not be recorded");
+
+                    if ((type = (UITextType *)container->GetType("botline")))
+                        type->SetText("");
+                }
+
+                if ((type = (UITextType *)container->GetType("conline")))
+                {
+                    if (curitem->recstatus == rsConflict)
+                        type->SetText("Due to a conflict");
+                    else
+                        type->SetText("");
+                }
+    
+                int i;
+                for (i=0; i < 10 ; i++)
+                    container->Draw(&pp, i, 0);
+            }
+        }
+        p->drawPixmap(blackholeBounds.x(), blackholeBounds.y(), pix);
+
+        if (previewVideoState == kStarting)
+            return;
+    }
+
     /* show a still frame if the user doesn't want a video preview or nvp
      * hasn't started playing the video preview yet */
-    if (curitem && !playingSomething &&
+    if (curitem && curitem->recstatus < rsWillRecord && !playingSomething &&
         (!previewVideoEnabled             ||
          !previewVideoPlaying             ||
          (previewVideoState == kStarting) ||
@@ -1202,6 +1301,7 @@ void PlaybackBox::drawVideo(QPainter *p)
     /* if we have an item we should start playing */
     if (!previewVideoNVP   && previewVideoEnabled  &&
         curitem            && !previewVideoPlaying &&
+        curitem->recstatus < rsWillRecord &&
         (previewVideoState != kKilling) &&
         (previewVideoState != kKilled)  &&
         (previewVideoState != kStarting))
@@ -1635,11 +1735,41 @@ void PlaybackBox::updateShowTitles(QPain
                 if (playList.grep(tempInfo->MakeUniqueKey()).count())
                     ltype->EnableForcedFont(cnt, "tagged");
 
+
                 if (((tempInfo->recstatus != rsRecording) &&
                      (tempInfo->availableStatus != asAvailable) &&
                      (tempInfo->availableStatus != asNotYetAvailable)) ||
                     (m_player && m_player->IsSameProgram(tempInfo)))
                     ltype->EnableForcedFont(cnt, "inactive");
+
+                if (tempInfo->recstatus >= rsWillRecord)
+                {
+                    // Clear size info
+                    QString recinfo = tempInfo->RecStatusChar();
+                    if (tempInfo->recstatus == rsWillRecord)
+                        recinfo = "Card " + recinfo;
+                    if (tempInfo->recstatus == rsConflict)
+                        recinfo = tempInfo->RecStatusText();
+
+                    ltype->SetItemText(cnt, 4, recinfo);
+
+                    QString forceFont="futurerecording";
+                    if (inTitle)
+                    {
+                        if (tempInfo->recstatus == rsConflict)
+                            forceFont = "inactiveconflictfuturerecording";
+                        else
+                            forceFont = "inactivefuturerecording";
+                    }
+                    else if (tempInfo->recstatus == rsConflict)
+                            forceFont = "conflictfuturerecording";
+                    else if (tempInfo->recstatus != rsWillRecord)
+                            forceFont = "inactivefuturerecording";
+
+                    //VERBOSE(VB_GENERAL, QString ("inTitle = %1, recstatus=%2, forceFont = '%3'")
+                    //         .arg(inTitle).arg(tempInfo->recstatus).arg(forceFont));
+                    ltype->EnableForcedFont(cnt, forceFont);
+                }
             }
         }
         else if (ltype)
@@ -1745,20 +1875,25 @@ void PlaybackBox::cursorDown(bool page, 
 {
     if (inTitle == true || newview)
     {
-        titleIndex += (page ? 5 : 1);
+        int new_titleIndex = titleIndex;
+        new_titleIndex += (page ? 5 : 1);
         if (repeatTitles)
-            titleIndex = titleIndex % (int)titleList.count();
+            new_titleIndex = new_titleIndex % (int)titleList.count();
         else
-            titleIndex = min(titleIndex, (int)titleList.count()-1);
+            new_titleIndex = min(new_titleIndex, (int)titleList.count()-1);
         
 
-        progIndex = 0;
+        if (new_titleIndex != titleIndex || newview)
+        {
+            titleIndex = new_titleIndex;
+            SetProgIndex();
 
-        if (newview)
-            inTitle = false;
+            if (newview)
+                inTitle = false;
 
-        paintSkipUpdate = false;
-        update(drawTotalBounds);
+            paintSkipUpdate = false;
+            update(drawTotalBounds);
+        }
     }
     else
     {
@@ -1778,26 +1913,51 @@ void PlaybackBox::cursorDown(bool page, 
     }
 }
 
+void PlaybackBox::SetProgIndex()
+{
+    progIndex = 0;
+    QString newtitle = titleList[titleIndex];
+    // search through the list until we hit the first recorded program
+    ProgramList *l = &progLists[newtitle.lower()];
+    ProgramInfo *p;
+
+    for (int i = 0; i < l->count(); i++)
+    {
+        p = l->at(i);
+        if (p->recstatus < rsWillRecord)
+        {
+            progIndex = i;
+            break;
+        }
+    }
+    VERBOSE(VB_GENERAL, QString("Setting progIndex to %1").arg(progIndex));
+}
+
 void PlaybackBox::cursorUp(bool page, bool newview)
 {
     if (inTitle == true || newview)
     {
-        titleIndex -= (page ? 5 : 1);
+        int new_titleIndex = titleIndex;
+        new_titleIndex -= (page ? 5 : 1);
         if (repeatTitles)
         {
-            titleIndex += 5 * titleList.count();
-            titleIndex = titleIndex % titleList.count();
+            new_titleIndex += 5 * titleList.count();
+            new_titleIndex = new_titleIndex % titleList.count();
         }
         else
-            titleIndex = max(titleIndex, 0);
+            new_titleIndex = max(new_titleIndex, 0);
 
-        progIndex = 0;
+        if (new_titleIndex != titleIndex || newview)
+        {
+            titleIndex = new_titleIndex;
+            SetProgIndex();
 
-        if (newview)
-            inTitle = false;
+            if (newview)
+                inTitle = false;
 
-        paintSkipUpdate = false;
-        update(drawTotalBounds);
+            paintSkipUpdate = false;
+            update(drawTotalBounds);
+        }
     }
     else
     {
@@ -1949,7 +2109,7 @@ bool PlaybackBox::FillList(bool useCache
     {
         clearProgramCache();
 
-        progCache = RemoteGetRecordedList(allOrder == 0 || type == Delete);
+        progCache = RemoteGetRecordedList(allOrder == 0 || type == Delete, showUpcoming);
     }
     else
     {
@@ -2081,7 +2241,8 @@ bool PlaybackBox::FillList(bool useCache
                     progLists[tmpTitle.lower()].setAutoDelete(false);
                 }
 
-                if ((viewMask & VIEW_WATCHLIST) && (p->recgroup != "LiveTV"))
+                if ((viewMask & VIEW_WATCHLIST) && (p->recgroup != "LiveTV") &&
+                    (p->recstatus < rsWillRecord))
                 {
                     if (watchListAutoExpire && !p->GetAutoExpireFromRecorded())
                     {
@@ -2407,12 +2568,13 @@ bool PlaybackBox::FillList(bool useCache
     // Now do pretty much the same thing for the individual shows on
     // the specific program list if needed.
     if (oldtitle != titleList[titleIndex] || oldchanid.isNull())
-        progIndex = 0;
+        SetProgIndex();
     else
     {
         ProgramList *l = &progLists[oldtitle.lower()];
         progIndex = l->count() - 1;
 
+        VERBOSE(VB_GENERAL, QString("oldtitle = %1").arg(oldtitle));
         for (int i = progIndex; i >= 0; i--)
         {
             p = l->at(i);
@@ -2650,6 +2812,14 @@ void PlaybackBox::playSelected()
     if (!curitem)
         return;
 
+    if (curitem->recstatus >= rsWillRecord)
+    {
+        ProgramInfo *temppginfo = new ProgramInfo(*curitem);
+        temppginfo->EditRecording();
+        delete temppginfo;
+        return;
+    }
+
     if (m_player && m_player->IsSameProgram(curitem))
     {
         exitWin();
@@ -2747,7 +2917,7 @@ void PlaybackBox::details()
     if (!curitem)
         return;
 
-    if (curitem->availableStatus != asAvailable)
+    if (curitem->availableStatus != asAvailable && curitem->recstatus < rsWillRecord)
         showAvailablePopup(curitem);
     else
         curitem->showDetails();
@@ -2963,7 +3133,13 @@ void PlaybackBox::showActions(ProgramInf
 
     delitem = new ProgramInfo(*toExp);
 
-    if (fileExists(delitem) == false)
+    if (delitem->recstatus >= rsWillRecord)
+    {
+        ProgramInfo *temppginfo = new ProgramInfo(*delitem);
+        temppginfo->EditRecording();
+        delete temppginfo;
+    }
+    else if (fileExists(delitem) == false)
     {
         QString msg =
             QString("PlaybackBox::showActions(): Error, %1 file not found")
@@ -4467,6 +4643,22 @@ void PlaybackBox::keyPressEvent(QKeyEven
             paintSkipUpdate = false;
             update(drawTotalBounds);
         }
+        else if (action == "5")
+        {
+            /* Values
+                0 - none
+                1 - recording
+                2 - important
+                3 - all
+             */
+
+            if (++showUpcoming == 4)
+                showUpcoming = 0;
+
+            connected = FillList(false); 
+            paintSkipUpdate = false;
+            update(drawTotalBounds);
+        }
         else if (action == "4")
         {
             showWatched = ! showWatched;
@@ -4564,7 +4756,13 @@ void PlaybackBox::customEvent(QCustomEve
         MythEvent *me = (MythEvent *)e;
         QString message = me->Message();
 
-        if (message.left(21) == "RECORDING_LIST_CHANGE")
+        if (message.left(15) == "SCHEDULE_CHANGE")
+        {
+            fillListFromCache = false;
+            if (!fillListTimer->isActive())
+                fillListTimer->start(1000, true);
+        }
+        else if (message.left(21) == "RECORDING_LIST_CHANGE")
         {
             QStringList tokens = QStringList::split(" ", message);
             if (tokens.size() == 1)
diff -p -r -u -N -X /tmp/diff.exclude -x release.21127.0805a -x release.21127.0805b release.21127.0805a/mythtv/programs/mythfrontend/playbackbox.h release.21127.0805b/mythtv/programs/mythfrontend/playbackbox.h
--- mythtv/programs/mythfrontend/playbackbox.h	2009-08-05 16:51:14.000000000 -0500
+++ mythtv/programs/mythfrontend/playbackbox.h	2009-08-05 16:53:14.000000000 -0500
@@ -276,6 +276,7 @@ class PlaybackBox : public MythDialog
 
   private:
     bool FillList(bool useCachedData = false);
+    void SetProgIndex();
     void UpdateProgressBar(void);
 
     QString cutDown(QString, QFont *, int);
@@ -351,6 +352,7 @@ class PlaybackBox : public MythDialog
 
     QString             episodeSort;
     bool                showWatched;
+    int                 showUpcoming;
     
     /// titleView controls showing titles in group list
     bool                titleView;
