diff --git a/mythtv/programs/mythbackend/scheduler.cpp b/mythtv/programs/mythbackend/scheduler.cpp
index 3db2883..8c2a985 100644
--- a/mythtv/programs/mythbackend/scheduler.cpp
+++ b/mythtv/programs/mythbackend/scheduler.cpp
@@ -1220,6 +1220,8 @@ bool Scheduler::TryAnotherShowing(RecordingInfo *p, bool samePriority,
 
         q->SetRecordingStatus(rsWillRecord);
         MarkOtherShowings(q);
+        if (q->GetRecordingStartTime() < livetvTime)
+            livetvTime = q->GetRecordingStartTime();
         PrintRec(p, "     -");
         PrintRec(q, "     +");
         return true;
@@ -1255,6 +1257,7 @@ void Scheduler::SchedNewRecords(void)
             "- = unschedule a showing in favor of another one");
     }
 
+    livetvTime = QDateTime::currentDateTime().addSecs(3600);
     int openEnd = gCoreContext->GetNumSetting("SchedOpenEnd", 0);
 
     RecIter i = worklist.begin();
@@ -1270,18 +1273,9 @@ void Scheduler::SchedNewRecords(void)
             if (!conflict)
             {
                 p->SetRecordingStatus(rsWillRecord);
-
-                if (p->GetRecordingStartTime() < schedTime.addSecs(90))
-                {
-                    QString id = p->MakeUniqueSchedulerKey();
-                    if (!recPendingList.contains(id))
-                        recPendingList[id] = false;
-
-                    livetvTime = (livetvTime < schedTime) ?
-                        schedTime : livetvTime;
-                }
-
                 MarkOtherShowings(p);
+                if (p->GetRecordingStartTime() < livetvTime)
+                    livetvTime = p->GetRecordingStartTime();
                 PrintRec(p, "  +");
             }
             else
@@ -1328,7 +1322,11 @@ void Scheduler::MoveHigherRecords(bool move_this)
         }
 
         if (p->GetRecordingStatus() == rsWillRecord)
+        {
+            if (p->GetRecordingStartTime() < livetvTime)
+                livetvTime = p->GetRecordingStartTime();
             PrintRec(p, "  +");
+        }
     }
 
     i = retrylist.begin();
@@ -1361,7 +1359,11 @@ void Scheduler::MoveHigherRecords(bool move_this)
         }
 
         if (move_this && p->GetRecordingStatus() == rsWillRecord)
+        {
+            if (p->GetRecordingStartTime() < livetvTime)
+                livetvTime = p->GetRecordingStartTime();
             PrintRec(p, "  +");
+        }
     }
 }
 
@@ -1972,7 +1974,7 @@ int Scheduler::CalcTimeToNextHandleRecordingEvent(
         int secs_to_next = curtime.secsTo((*i)->GetRecordingStartTime());
 
         if ((*i)->GetRecordingStatus() == rsWillRecord &&
-            !recPendingList[(*i)->MakeUniqueSchedulerKey()])
+            !recPendingList.contains((*i)->MakeUniqueSchedulerKey()))
             secs_to_next -= 30;
 
         if (secs_to_next < 0)
@@ -2318,13 +2320,12 @@ bool Scheduler::HandleRecording(
         if (!recPendingList.contains(schedid))
         {
             recPendingList[schedid] = false;
-
-            livetvTime = (livetvTime < nextrectime) ?
-                nextrectime : livetvTime;
-
-            m_queueLock.lock();
-            reschedQueue.enqueue(0);
-            m_queueLock.unlock();
+            if (schedTime.secsTo(curtime) > 15)
+            {
+                m_queueLock.lock();
+                reschedQueue.enqueue(0);
+                m_queueLock.unlock();
+            }
         }
     }
 
@@ -2476,6 +2477,7 @@ bool Scheduler::HandleRecording(
             schedLock.unlock();
             recStatus = nexttv->StartRecording(&tempri);
             schedLock.lock();
+            recPendingList.remove(schedid);
 
             // activate auto expirer
             if (m_expirer)
@@ -4926,14 +4928,12 @@ void Scheduler::FillDirectoryInfoCache(bool force)
 
 void Scheduler::SchedPreserveLiveTV(void)
 {
-    if (!livetvTime.isValid())
-        return;
+    int prerollseconds = gCoreContext->GetNumSetting("RecordPreRoll", 0);
+    QDateTime curtime = QDateTime::currentDateTime();
+    int secsleft = curtime.secsTo(livetvTime);
 
-    if (livetvTime < schedTime)
-    {
-        livetvTime = QDateTime();
+    if (secsleft - prerollseconds > 120)
         return;
-    }
 
     livetvpriority = gCoreContext->GetNumSetting("LiveTVPriority", 0);
 
