Index: mythbuild/mythtv/libs/libmyth/programinfo.h
===================================================================
--- mythbuild.orig/mythtv/libs/libmyth/programinfo.h
+++ mythbuild/mythtv/libs/libmyth/programinfo.h
@@ -192,7 +192,8 @@ enum AvailableStatusType {
     asPendingDelete,
     asFileNotFound,
     asZeroByte,
-    asDeleted
+    asDeleted,
+    asFutureRecording
 };
 
 enum WatchListStatus {
Index: mythbuild/mythtv/libs/libmyth/remoteutil.cpp
===================================================================
--- mythbuild.orig/mythtv/libs/libmyth/remoteutil.cpp
+++ mythbuild/mythtv/libs/libmyth/remoteutil.cpp
@@ -11,7 +11,7 @@
 #include "storagegroup.h"
 #include "mythevent.h"
 
-vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype)
+vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype, int upcomingLevel)
 {
     QString str = "QUERY_RECORDINGS ";
     if (deltype)
@@ -23,11 +23,14 @@ vector<ProgramInfo *> *RemoteGetRecorded
 
     vector<ProgramInfo *> *info = new vector<ProgramInfo *>;
 
-    if (!RemoteGetRecordingList(info, strlist))
+    if (!RemoteGetRecordingList(info, strlist, upcomingLevel))
     {
         delete info;
         return NULL;
     }
+
+//    VERBOSE(VB_GENERAL, QString("Got %1 items for upcomingLevel %2")
+//             .arg(info->size()).arg(upcomingLevel));
  
     return info;
 }
@@ -191,7 +194,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;
@@ -215,7 +218,44 @@ int RemoteGetRecordingList(vector<Progra
         }
     }
 
-    return numrecordings;
+    int numupcomingrecordings = 0;
+
+    if (upcomingLevel > 0)
+    {
+        QString str = "QUERY_GETALLPENDING";
+
+        QStringList upcomingRecordings(str);
+
+        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.begin() + 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(const ProgramInfo *pginfo)
Index: mythbuild/mythtv/libs/libmyth/remoteutil.h
===================================================================
--- mythbuild.orig/mythtv/libs/libmyth/remoteutil.h
+++ mythbuild/mythtv/libs/libmyth/remoteutil.h
@@ -30,7 +30,7 @@ class MPUBLIC FileSystemInfo
     int weight;
 };
 
-MPUBLIC vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype);
+MPUBLIC vector<ProgramInfo *> *RemoteGetRecordedList(bool deltype, int upcomingLevel = 0);
 MPUBLIC vector<FileSystemInfo> RemoteGetFreeSpace(void);
 MPUBLIC bool RemoteGetLoad(float load[3]);
 MPUBLIC bool RemoteGetUptime(time_t &uptime);
@@ -47,7 +47,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(const ProgramInfo *pginfo);
 MPUBLIC void RemoteSendMessage(const QString &message);
 MPUBLIC void RemoteSendEvent(const MythEvent &event);
Index: mythbuild/mythtv/programs/mythfrontend/playbackbox.cpp
===================================================================
--- mythbuild.orig/mythtv/programs/mythfrontend/playbackbox.cpp
+++ mythbuild/mythtv/programs/mythfrontend/playbackbox.cpp
@@ -267,13 +267,15 @@ static QString extract_main_state(const 
     if (pginfo.recstatus == rsRecording)
         state = "running";
 
-    if (((pginfo.recstatus != rsRecording) &&
+    if (((pginfo.recstatus < rsRecording) &&
          (pginfo.availableStatus != asAvailable) &&
          (pginfo.availableStatus != asNotYetAvailable)) ||
         (player && player->IsSameProgram(0, &pginfo)))
     {
         state = "disabled";
     }
+    if (pginfo.recstatus > rsRecording)
+        state = "future";
 
     return state;
 }
@@ -381,6 +383,7 @@ PlaybackBox::PlaybackBox(MythScreenStack
       m_watchGroupName(tr("Watch List")),
       m_watchGroupLabel(m_watchGroupName.toLower()),
       m_viewMask(VIEW_TITLES),
+      m_showUpcomingLevel(1), // 1 = recording or conflicting, 2 = important (inactive), 3 = all
 
       // General m_popupMenu support
       m_popupMenu(NULL),
@@ -421,6 +424,13 @@ PlaybackBox::PlaybackBox(MythScreenStack
                                     "DisplayGroupDefaultViewMask",
                                     VIEW_TITLES | VIEW_WATCHED);
 
+    /* Values for showUpcomingLevel
+        1 - recording or conflicting
+        2 - important (inactive rules)
+        3 - all
+     */
+    m_showUpcomingLevel = gContext->GetNumSetting("ShowUpcomingLevel", 1);
+
     // Translate these external settings into mask values
     if (gContext->GetNumSetting("PlaybackWatchList", 1) &&
         !(m_viewMask & VIEW_WATCHLIST))
@@ -567,12 +577,17 @@ bool PlaybackBox::Create()
     }
 
     BuildFocusList();
-    m_programInfoCache.ScheduleLoad();
+    ScheduleLoad();
     LoadInBackground();
 
     return true;
 }
 
+void PlaybackBox::ScheduleLoad(void)
+{
+    m_programInfoCache.ScheduleLoad( (m_viewMask & PlaybackBox::VIEW_UPCOMING) ? m_showUpcomingLevel: 0);
+}
+
 void PlaybackBox::Load(void)
 {
     m_programInfoCache.WaitForLoadToComplete();
@@ -817,9 +832,13 @@ void PlaybackBox::UpdateUIListItem(
 
     item->DisplayState(rating, "ratingstate");
 
-    QString oldimgfile = item->GetImage("preview");
-    if (oldimgfile.isEmpty() || force_preview_reload)
-        m_helper.GetPreviewImage(*pginfo);
+    QString oldimgfile;
+    if (pginfo->recstatus <= rsRecording)
+    {
+        oldimgfile = item->GetImage("preview");
+        if (oldimgfile.isEmpty() || force_preview_reload)
+            m_helper.GetPreviewImage(*pginfo);
+    }
 
     if ((GetFocusWidget() == m_recordingList) && is_sel)
     {
@@ -842,8 +861,13 @@ void PlaybackBox::UpdateUIListItem(
 
         if (m_previewImage)
         {
-            m_previewImage->SetFilename(oldimgfile);
-            m_previewImage->Load();
+            if (pginfo->recstatus <= rsRecording)
+            {
+                m_previewImage->SetFilename(oldimgfile);
+                m_previewImage->Load();
+            }
+            else
+                m_previewImage->Reset();
         }
 
         if (m_fanart || m_banner || m_coverart)
@@ -1210,6 +1234,7 @@ void PlaybackBox::updateRecList(MythUIBu
     subtitleFlags[SUB_NORMAL] = "subtitles";
     subtitleFlags[SUB_HARDHEAR] = "cc";
 
+    MythUIButtonListItem *toSelect = NULL;
     ProgramList::iterator it = progList.begin();
     for (; it != progList.end(); ++it)
     {
@@ -1220,6 +1245,9 @@ void PlaybackBox::updateRecList(MythUIBu
         MythUIButtonListItem *item =
             new PlaybackBoxListItem(this, m_recordingList, *it);
 
+        if ( toSelect == NULL && (*it)->recstatus < rsWillRecord)
+            toSelect = item;
+
         QString state = extract_main_state(**it, m_player);
 
         item->SetFontState(state);
@@ -1277,6 +1305,9 @@ void PlaybackBox::updateRecList(MythUIBu
         }
     }
 
+    if (toSelect)
+        m_recordingList->SetItemCurrent(toSelect);
+
     if (m_noRecordingsText)
     {
         if (!progList.empty())
@@ -1297,10 +1328,12 @@ static bool save_position(
     QStringList &groupSelPref, QStringList &itemSelPref,
     QStringList &itemTopPref)
 {
+    VERBOSE(VB_GENERAL, QString("Saving rlcount = %1").arg(recordingList->GetCount()));
     MythUIButtonListItem *prefSelGroup = groupList->GetItemCurrent();
     if (!prefSelGroup)
         return false;
 
+    VERBOSE(VB_GENERAL, QString("Saving 1 prefSelGroup '%1'").arg(prefSelGroup->GetData().toString()));
     groupSelPref.push_back(prefSelGroup->GetData().toString());
     for (int i = groupList->GetCurrentPos();
          i < groupList->GetCount(); i++)
@@ -1311,6 +1344,7 @@ static bool save_position(
     }
 
     int curPos = recordingList->GetCurrentPos();
+    VERBOSE(VB_GENERAL, QString("Saving 2 curPos %1").arg(curPos));
     for (int i = curPos; (i >= 0) && (i < recordingList->GetCount()); i++)
     {
         MythUIButtonListItem *item = recordingList->GetItemAt(i);
@@ -1327,6 +1361,7 @@ static bool save_position(
     }
 
     int topPos = recordingList->GetTopItemPos();
+    VERBOSE(VB_GENERAL, QString("Saving 3 topPos %1").arg(topPos));
     for (int i = topPos + 1; i >= topPos - 1; i--)
     {
         if (i >= 0 && i < recordingList->GetCount())
@@ -1346,6 +1381,7 @@ static bool save_position(
         }
     }
 
+    VERBOSE(VB_GENERAL, "Saving done");
     return true;
 }
 
@@ -1354,6 +1390,7 @@ static void restore_position(
     const QStringList &groupSelPref, const QStringList &itemSelPref,
     const QStringList &itemTopPref)
 {
+    VERBOSE(VB_GENERAL, QString("Trying to restore"));
     // If possible reselect the item selected before,
     // otherwise select the nearest available item.
     MythUIButtonListItem *prefSelGroup = groupList->GetItemCurrent();
@@ -1366,9 +1403,12 @@ static void restore_position(
 
     // the group is selected in UpdateUIGroupList()
     QString groupname = prefSelGroup->GetData().toString();
+    VERBOSE(VB_GENERAL, QString("Trying to restore groupname = '%1'").arg(groupname));
 
     // find best selection
     int sel = -1;
+
+    VERBOSE(VB_GENERAL, QString("Trying to restore itemSelPref.size() = %1").arg((uint)itemSelPref.size()));
     for (uint i = 0; i+1 < (uint)itemSelPref.size(); i+=2)
     {
         if (itemSelPref[i] != groupname)
@@ -1390,6 +1430,7 @@ static void restore_position(
 
     // find best top item
     int top = -1;
+    VERBOSE(VB_GENERAL, QString("Trying to restore itemTopPref.size() = %1").arg((uint)itemTopPref.size()));
     for (uint i = 0; i+1 < (uint)itemTopPref.size(); i+=2)
     {
         if (itemTopPref[i] != groupname)
@@ -1411,14 +1452,14 @@ static void restore_position(
 
     if (sel >= 0)
     {
-        //VERBOSE(VB_IMPORTANT, QString("Reselect success (%1,%2)")
-        //        .arg(sel).arg(top));
+        VERBOSE(VB_IMPORTANT, QString("Reselect success (%1,%2)")
+                .arg(sel).arg(top));
         recordingList->SetItemCurrent(sel, top);
     }
     else
     {
-        //VERBOSE(VB_GENERAL, QString("Reselect failure (%1,%2)")
-        //        .arg(sel).arg(top));
+        VERBOSE(VB_GENERAL, QString("Reselect failure (%1,%2)")
+                .arg(sel).arg(top));
     }
 }
 
@@ -1498,6 +1539,9 @@ bool PlaybackBox::UpdateUILists(void)
         vector<ProgramInfo*> list;
         bool newest_first = (0==m_allOrder) || (kDeleteBox==m_type);
         m_programInfoCache.GetOrdered(list, newest_first);
+
+        VERBOSE(VB_GENERAL, QString("Got %1 items in list from m_programInfoCache").arg(list.size()));
+
         vector<ProgramInfo*>::const_iterator it = list.begin();
         for ( ; it != list.end(); ++it)
         {
@@ -1528,6 +1572,10 @@ bool PlaybackBox::UpdateUILists(void)
                     (p->programflags & FL_WATCHED))
                     continue;
 
+                if ((! (m_viewMask & VIEW_RECORDED)) &&
+                    p->recstatus < rsWillRecord)
+                    continue;
+
                 if (m_viewMask != VIEW_NONE &&
                     (p->recgroup != "LiveTV" || m_recGroup == "LiveTV"))
                     m_progLists[""].push_front(p);
@@ -2013,6 +2061,13 @@ void PlaybackBox::deleteSelected(MythUIB
     if (!pginfo)
         return;
 
+    if (pginfo->recstatus >= rsWillRecord)
+    {
+        EditRecording(pginfo);
+        UpdateUILists();
+        return;
+    }
+
     bool undelete_possible =
             gContext->GetNumSetting("AutoExpireInsteadOfDelete", 0);
 
@@ -2182,6 +2237,15 @@ bool PlaybackBox::Play(const ProgramInfo
     if (m_player)
         return true;
 
+    if (asFutureRecording == rec.availableStatus || rec.recstatus >= rsWillRecord)
+    {
+        ProgramInfo *tmppi = CurrentItem();
+        EditRecording(tmppi);
+
+        UpdateUILists();
+        return false;
+    }
+
     if ((asAvailable != rec.availableStatus) || (0 == rec.filesize) ||
         (rec.GetRecordBasename() == rec.pathname))
     {
@@ -3755,6 +3819,53 @@ bool PlaybackBox::keyPressEvent(QKeyEven
                      ShowGroupPopup();
              }
         }
+
+        else if (action == "5") // not Yellow button / ":"
+        {
+                /* Values
+                    1 - recording
+                    2 - important
+                    3 - all
+                 */
+
+                if (++m_showUpcomingLevel == 4)
+                    m_showUpcomingLevel = 1;
+
+                gContext->SaveSetting("ShowUpcomingLevel", (int)m_showUpcomingLevel);
+                ScheduleLoad();
+                UpdateUILists();
+        }
+        else if (action == "6") // not Green button / ";"
+        {
+
+            // Cycle through ( Recorded Only / Both / Upcoming Only )
+
+            if (m_viewMask & PlaybackBox::VIEW_RECORDED)
+            {
+                if (m_viewMask & PlaybackBox::VIEW_UPCOMING)
+                    // Both -> Upcoming Only
+                    m_viewMask = m_viewMaskToggle(m_viewMask, VIEW_RECORDED);
+                else
+                    // Recorded Only -> Both
+                    m_viewMask = m_viewMaskToggle(m_viewMask, VIEW_UPCOMING);
+            }
+            else
+            {
+                // Upcoming Only -> Recorded Only
+                if (m_viewMask & PlaybackBox::VIEW_UPCOMING)
+                    // Turn of Upcoming view
+                    m_viewMask = m_viewMaskToggle(m_viewMask, VIEW_UPCOMING);
+
+                if (!(m_viewMask & PlaybackBox::VIEW_RECORDED))
+                    // Turn on Recorded view
+                    m_viewMask = m_viewMaskToggle(m_viewMask, VIEW_RECORDED);
+            }
+
+            saveViewChanges();
+            ScheduleLoad();
+            UpdateUILists();
+        }
+
         else if (action == "NEXTFAV")
         {
             if (GetFocusWidget() == m_groupList)
@@ -3840,6 +3951,11 @@ void PlaybackBox::customEvent(QEvent *ev
         MythEvent *me = (MythEvent *)event;
         QString message = me->Message();
 
+        if (message.left(15) == "SCHEDULE_CHANGE")
+        {
+
+            ScheduleLoad();
+        }
         if (message.left(21) == "RECORDING_LIST_CHANGE")
         {
             QStringList tokens = message.simplified().split(" ");
@@ -3873,7 +3989,7 @@ void PlaybackBox::customEvent(QEvent *ev
             }
             else
             {
-                m_programInfoCache.ScheduleLoad();
+                ScheduleLoad();
             }
         }
         else if (message.left(15) == "NETWORK_CONTROL")
@@ -3930,7 +4046,7 @@ void PlaybackBox::customEvent(QEvent *ev
         }
         else if (message == "RECONNECT_SUCCESS")
         {
-            m_programInfoCache.ScheduleLoad();
+            ScheduleLoad();
         }
         else if (message == "LOCAL_PBB_DELETE_RECORDINGS")
         {
@@ -4113,7 +4229,7 @@ void PlaybackBox::HandleRecordingRemoveE
         VERBOSE(VB_IMPORTANT, LOC_WARN +
                 QString("Failed to remove %1:%2, reloading list")
                 .arg(chanid).arg(recstartts.toString(Qt::ISODate)));
-        m_programInfoCache.ScheduleLoad();
+        ScheduleLoad();
         return;
     }
 
Index: mythbuild/mythtv/programs/mythfrontend/playbackbox.h
===================================================================
--- mythbuild.orig/mythtv/programs/mythfrontend/playbackbox.h
+++ mythbuild/mythtv/programs/mythfrontend/playbackbox.h
@@ -86,6 +86,8 @@ class PlaybackBox : public ScheduleCommo
         VIEW_SEARCHES   =  0x0010,
         VIEW_LIVETVGRP  =  0x0020,
         // insert new entries above here
+        VIEW_RECORDED   =  0x2000,
+        VIEW_UPCOMING   =  0x4000,
         VIEW_WATCHED    =  0x8000
     } ViewMask;
 
@@ -203,6 +205,7 @@ class PlaybackBox : public ScheduleCommo
     void toggleWatchListView(bool setOn) { toggleView(VIEW_WATCHLIST, setOn); }
     void toggleSearchView(bool setOn)    { toggleView(VIEW_SEARCHES, setOn); }
     void toggleLiveTVView(bool setOn)    { toggleView(VIEW_LIVETVGRP, setOn); }
+    void toggleUpcomingView(bool setOn)   { toggleView(VIEW_UPCOMING, setOn); }
     void toggleWatchedView(bool setOn)   { toggleView(VIEW_WATCHED, setOn); }
 
     void setGroupFilter(const QString &newRecGroup);
@@ -259,6 +262,8 @@ class PlaybackBox : public ScheduleCommo
     void coverartLoad(void);
 
   private:
+    void ScheduleLoad(void);
+
     bool UpdateUILists(void);
     void UpdateUIGroupList(const QStringList &groupPreferences);
     void UpdateUIRecGroupList(void);
@@ -382,6 +387,7 @@ class PlaybackBox : public ScheduleCommo
     QString             m_watchGroupName;
     QString             m_watchGroupLabel;
     ViewMask            m_viewMask;
+    int                 m_showUpcomingLevel;
 
     // Popup support //////////////////////////////////////////////////////////
     // General popup support
Index: mythbuild/mythtv/programs/mythfrontend/playbackboxhelper.cpp
===================================================================
--- mythbuild.orig/mythtv/programs/mythfrontend/playbackboxhelper.cpp
+++ mythbuild/mythtv/programs/mythfrontend/playbackboxhelper.cpp
@@ -165,9 +165,14 @@ bool PBHEventHandler::event(QEvent *e)
                 return true;
 
             AvailableStatusType availableStatus = asAvailable;
+
+            if (evinfo.recstatus >= rsWillRecord)
+            {
+                availableStatus = asFutureRecording;
+            }
             // Note IsFileReadable() implicitly calls GetPlaybackURL
             // when necessary, we rely on this.
-            if (!evinfo.IsFileReadable())
+            else if (!evinfo.IsFileReadable())
             {
                 VERBOSE(VB_IMPORTANT, LOC_ERR +
                         QString("CHECK_AVAILABILITY '%1' "
@@ -186,10 +191,13 @@ bool PBHEventHandler::event(QEvent *e)
             }
 
             QStringList list;
-            list.push_back(evinfo.MakeUniqueKey());
-            list.push_back(evinfo.pathname);            
-            MythEvent *e0 = new MythEvent("SET_PLAYBACK_URL", list);
-            QCoreApplication::postEvent(m_pbh.m_listener, e0);
+            if (availableStatus != asFutureRecording)
+            {
+                list.push_back(evinfo.MakeUniqueKey());
+                list.push_back(evinfo.pathname);
+                MythEvent *e0 = new MythEvent("SET_PLAYBACK_URL", list);
+                QCoreApplication::postEvent(m_pbh.m_listener, e0);
+            }
 
             list.clear();
             list.push_back(evinfo.MakeUniqueKey());
Index: mythbuild/mythtv/programs/mythfrontend/programinfocache.cpp
===================================================================
--- mythbuild.orig/mythtv/programs/mythfrontend/programinfocache.cpp
+++ mythbuild/mythtv/programs/mythfrontend/programinfocache.cpp
@@ -11,6 +11,7 @@
 #include "programinfo.h"
 #include "remoteutil.h"
 #include "mythevent.h"
+#include "mythverbose.h"
 
 typedef vector<ProgramInfo*> *VPI_ptr;
 static void free_vec(VPI_ptr &v)
@@ -28,11 +29,12 @@ static void free_vec(VPI_ptr &v)
 class ProgramInfoLoader : public QRunnable
 {
   public:
-    ProgramInfoLoader(ProgramInfoCache &c) : m_cache(c) {}
+    ProgramInfoLoader(ProgramInfoCache &c, int upcomingLevel) : m_cache(c), ul(upcomingLevel) {}
 
-    void run(void) { m_cache.Load(); }
+    void run(void) { m_cache.Load(ul); }
 
     ProgramInfoCache &m_cache;
+    int ul;
 };
 
 ProgramInfoCache::ProgramInfoCache(QObject *o) :
@@ -52,7 +54,7 @@ ProgramInfoCache::~ProgramInfoCache()
     free_vec(m_next_cache);
 }
 
-void ProgramInfoCache::ScheduleLoad(void)
+void ProgramInfoCache::ScheduleLoad(int upcomingLevel)
 {
     QMutexLocker locker(&m_lock);
     if (!m_load_is_queued)
@@ -60,11 +62,11 @@ void ProgramInfoCache::ScheduleLoad(void
         m_load_is_queued = true;
         m_loads_in_progress++;
         QThreadPool::globalInstance()->start(
-            new ProgramInfoLoader(*this));
+            new ProgramInfoLoader(*this, upcomingLevel));
     }
 }
 
-void ProgramInfoCache::Load(void)
+void ProgramInfoCache::Load(int upcomingLevel)
 {
     QMutexLocker locker(&m_lock);
     m_load_is_queued = false;
@@ -73,7 +75,7 @@ void ProgramInfoCache::Load(void)
     /**/
     // the param to RemoteGetRecordedList doesn't actually matter
     // we sort the list later anyway.
-    vector<ProgramInfo*> *tmp = RemoteGetRecordedList(false);
+    vector<ProgramInfo*> *tmp = RemoteGetRecordedList(false, upcomingLevel);
     /**/
     locker.relock();
 
@@ -119,6 +121,10 @@ void ProgramInfoCache::Refresh(void)
         vector<ProgramInfo*>::iterator it = m_next_cache->begin();
         for (; it != m_next_cache->end(); ++it)
         {
+
+//            VERBOSE(VB_GENERAL, QString("Processing %1")
+//                     .arg((*it)->toString()));
+
             PICKey k((*it)->chanid.toUInt(), (*it)->recstartts);
             m_cache[k] = *it;
         }
Index: mythbuild/mythtv/programs/mythfrontend/programinfocache.h
===================================================================
--- mythbuild.orig/mythtv/programs/mythfrontend/programinfocache.h
+++ mythbuild/mythtv/programs/mythfrontend/programinfocache.h
@@ -27,7 +27,7 @@ class ProgramInfoCache
     ProgramInfoCache(QObject *o);
     ~ProgramInfoCache();
 
-    void ScheduleLoad(void);
+    void ScheduleLoad(int level);
     bool IsLoadInProgress(void) const;
     void WaitForLoadToComplete(void) const;
 
@@ -42,11 +42,12 @@ class ProgramInfoCache
     void GetOrdered(vector<ProgramInfo*> &list, bool newest_first = false);
     /// \note This must only be called from the UI thread.
     bool empty(void) const { return m_cache.empty(); }
+    bool size(void) const { return m_cache.size(); }
     ProgramInfo *GetProgramInfo(uint chanid, const QDateTime &recstartts) const;
     ProgramInfo *GetProgramInfo(const QString &piKey) const;
 
   private:
-    void Load(void);
+    void Load(int upcomingLevel);
     void Clear(void);
 
   private:
Index: mythbuild/mythtv/themes/MythCenter-wide/base.xml
===================================================================
--- mythbuild.orig/mythtv/themes/MythCenter-wide/base.xml
+++ mythbuild/mythtv/themes/MythCenter-wide/base.xml
@@ -85,9 +85,15 @@
         <color>#666666</color>
     </font>
     <font name="basesmall_running_selected" from="basesmallbold">
-        <color>#00FF00</color>
+        <color>#FF0000</color>
     </font>
     <font name="basesmall_running" from="basesmall">
+        <color>#DD1111</color>
+    </font>
+    <font name="basesmall_future_selected" from="basesmallbold">
+        <color>#00FF00</color>
+    </font>
+    <font name="basesmall_future" from="basesmall">
         <color>#11DD11</color>
     </font>
     <font name="basesmall_textedit" from="basesmall">
@@ -259,6 +265,7 @@
                     <font state="warning">basesmall_warning</font>
                     <font state="normal">basesmall_normal</font>
                     <font state="running">basesmall_running</font>
+                    <font state="future">basesmall_future</font>
                     <align>vcenter</align>
                 </textarea>
             </state>
@@ -278,6 +285,7 @@
                     <font state="warning">basesmall_warning_selected</font>
                     <font state="normal">basesmall_normal_selected</font>
                     <font state="running">basesmall_running_selected</font>
+                    <font state="future">basesmall_future_selected</font>
                     <align>vcenter</align>
                 </textarea>
             </state>
Index: mythbuild/mythtv/themes/MythCenter-wide/recordings-ui.xml
===================================================================
--- mythbuild.orig/mythtv/themes/MythCenter-wide/recordings-ui.xml
+++ mythbuild/mythtv/themes/MythCenter-wide/recordings-ui.xml
@@ -86,36 +86,41 @@
             <spacing>0</spacing>
             <statetype name="buttonitem">
                 <state name="active">
-                <area>0,0,100%,30</area>
-                <statetype name="status">
-                    <position>0,2</position>
-                    <state name="disabled">
-                        <imagetype name="statusimage">
-                            <filename>schedule_disabled.png</filename>
-                        </imagetype>
-                    </state>
-                    <state name="error">
-                        <imagetype name="statusimage">
-                            <filename>schedule_conflict.png</filename>
-                        </imagetype>
-                    </state>
-                    <state name="warning">
-                        <imagetype name="statusimage">
-                            <filename>schedule_other.png</filename>
-                        </imagetype>
-                    </state>
-<!--                <state name="normal">
-                        <imagetype name="statusimage">
-                            <filename>schedule_record.png</filename>
-                        </imagetype>
-                    </state> -->
-                    <state name="running">
-                        <imagetype name="statusimage">
-                            <filename>schedule_recording.png</filename>
-                        </imagetype>
-                    </state>
-                    <state name="marked"></state>
-                </statetype>
+                    <area>0,0,100%,30</area>
+                    <statetype name="status">
+                        <position>0,2</position>
+                        <state name="disabled">
+                            <imagetype name="statusimage">
+                                <filename>schedule_disabled.png</filename>
+                            </imagetype>
+                        </state>
+                        <state name="error">
+                            <imagetype name="statusimage">
+                                <filename>schedule_conflict.png</filename>
+                            </imagetype>
+                        </state>
+                        <state name="warning">
+                            <imagetype name="statusimage">
+                                <filename>schedule_other.png</filename>
+                            </imagetype>
+                        </state>
+                        <state name="future">
+                            <imagetype name="statusimage">
+                                <filename>schedule_other.png</filename>
+                            </imagetype>
+                        </state>
+    <!--                <state name="normal">
+                            <imagetype name="statusimage">
+                                <filename>schedule_record.png</filename>
+                            </imagetype>
+                        </state> -->
+                        <state name="running">
+                            <imagetype name="statusimage">
+                                <filename>schedule_recording.png</filename>
+                            </imagetype>
+                        </state>
+                        <state name="marked"></state>
+                    </statetype>
                     <textarea name="titlesubtitle" from="buttontext">
                         <area>32,2,656,28</area>
                         <align>vcenter</align>
@@ -147,7 +152,27 @@
                         <state name="no" />
                     </statetype>
                 </state>
-                <state name="selectedinactive" from="active" />
+                <state name="selectedinactive" from="active">
+                    <textarea name="titlesubtitle" from="buttontext">
+                        <area>32,2,656,28</area>
+                        <font>basesmall_normal</font>
+                        <font state="disabled">basesmall_disabled</font>
+                        <font state="error">basesmall_error</font>
+                        <font state="warning">basesmall_warning</font>
+                        <font state="normal">basesmall_normal</font>
+                        <font state="running">basesmall_running</font>
+                        <font state="future">basesmall_future</font>
+                        <align>vcenter</align>
+                    </textarea>
+                    <textarea name="shortdate" from="titlesubtitle">
+                        <area>634,2,120,28</area>
+                        <align>right,vcenter</align>
+                    </textarea>
+                    <textarea name="starttime" from="shortdate">
+                        <area>760,2,114,28</area>
+                        <align>right,vcenter</align>
+                    </textarea>
+                </state>
                 <state name="selectedactive" from="active">
                     <shape name="selectbar">
                         <area>26,0,854,30</area>
@@ -160,6 +185,7 @@
                         <font state="warning">basesmall_warning_selected</font>
                         <font state="normal">basesmall_normal_selected</font>
                         <font state="running">basesmall_running_selected</font>
+                        <font state="future">basesmall_future_selected</font>
                         <align>vcenter</align>
                     </textarea>
                     <textarea name="shortdate" from="titlesubtitle">
@@ -487,6 +513,7 @@
                         <font state="warning">basesmall_warning_selected</font>
                         <font state="normal">basesmall_normal_selected</font>
                         <font state="running">basesmall_running_selected</font>
+                        <font state="future">basesmall_future_selected</font>
                         <align>vcenter</align>
                     </textarea>
                     <textarea name="shortdate" from="titlesubtitle">
