diff -Naur mythtv-0.27-20131116-g4ca9300-old/mythtv/libs/libmythtv/tv_rec.cpp mythtv-0.27-20131116-g4ca9300-new/mythtv/libs/libmythtv/tv_rec.cpp
--- mythtv-0.27-20131116-g4ca9300-old/mythtv/libs/libmythtv/tv_rec.cpp	2013-11-16 21:30:01.150535794 +0100
+++ mythtv-0.27-20131116-g4ca9300-new/mythtv/libs/libmythtv/tv_rec.cpp	2013-11-16 21:30:13.383820034 +0100
@@ -93,7 +93,7 @@
       // Configuration variables from database
       transcodeFirst(false),
       earlyCommFlag(false),         runJobOnHostOnly(false),
-      eitCrawlIdleStart(60),        eitTransportTimeout(5*60),
+      eitCrawlIdleStart(60),        eitTransportTimeout(5*60),  eitCrawlDuration(240),
       audioSampleRateDB(0),
       overRecordSecNrml(0),         overRecordSecCat(0),
       overRecordCategory(""),
@@ -169,6 +169,10 @@
     eitTransportTimeout =
         max(gCoreContext->GetNumSetting("EITTransportTimeout", 5) * 60, 6);
     eitCrawlIdleStart = gCoreContext->GetNumSetting("EITCrawIdleStart", 60);
+    // eitCrawlDuration currently hardcoded to 240min as I don't want to change DB schema
+    // by introdution of new setting.
+    // eitCrawlDuration  = gCoreContext->GetNumSetting("EITCrawDuration", 240);
+    eitCrawlDuration  = 240;
     audioSampleRateDB = gCoreContext->GetNumSetting("AudioSampleRate");
     overRecordSecNrml = gCoreContext->GetNumSetting("RecordOverTime");
     overRecordSecCat  = gCoreContext->GetNumSetting("CategoryOverTime") * 60;
@@ -1040,6 +1044,8 @@
     {
         scanner->StopActiveScan();
         ClearFlags(kFlagEITScannerRunning);
+        LOG(VB_GENERAL, LOG_INFO, LOC +
+            "EIT active scanner stopped by Recording or LiveTV");
     }
 
     // Handle different state transitions
@@ -1088,11 +1094,55 @@
     internalState = nextState;
     changeState = false;
 
-    eitScanStartTime = MythDate::current();
+    eitScanStartTime = QDateTime::currentDateTime();
     if (scanner && (internalState == kState_None))
     {
-        eitScanStartTime = eitScanStartTime.addSecs(
-            eitCrawlIdleStart + eit_start_rand(cardid, eitTransportTimeout));
+        int start_delay = eit_start_rand(cardid, eitTransportTimeout);
+        // If eitCrawlIdleStart is above 3600 then we enter schedulled mode.
+        // For values 3600 and below we have old behaviour.
+        if (eitCrawlIdleStart <= 3600)
+        {
+            eitScanStartTime = eitScanStartTime.addSecs(
+                eitCrawlIdleStart + start_delay);
+            eitScanEndAT   = eitScanStartTime.addYears(1);
+            LOG(VB_GENERAL, LOG_INFO, LOC +
+                QString("EIT active scan will resume after %1 sec.").arg(eitCrawlIdleStart + start_delay));
+        }
+        else
+        {
+            // Check is current event within active EIT scan window. If it is,
+            // then scanner will be resumed after 60sec.
+            // If not, set start/end times nex nearest window.
+            if ((QDateTime::currentDateTime() < eitScanStartAT) ||
+               (QDateTime::currentDateTime() > eitScanEndAT))
+            {
+                eitScanStartTime.setTime(QTime(0, 0));
+                eitScanStartTime = eitScanStartTime.addSecs(eitCrawlIdleStart);
+                eitScanEndAT = eitScanStartTime.addSecs(eitCrawlDuration*60);
+
+                // distribute scan resume time evenly over eitTransportTimeout
+                eitScanStartTime = eitScanStartTime.addSecs(start_delay);
+
+                eitScanStartAT = eitScanStartTime;
+                // IF we started after window, move start & end
+                // time to next day
+                if (QDateTime::currentDateTime() > eitScanEndAT)
+                {
+                    eitScanStartTime = eitScanStartTime.addDays(1);
+                    eitScanStartAT = eitScanStartAT.addDays(1);
+                    eitScanEndAT = eitScanEndAT.addDays(1);
+                }
+                LOG(VB_GENERAL, LOG_INFO, LOC +
+                    QString("EIT active scan will resume at:%1").arg(eitScanStartTime.toString(Qt::ISODate)));
+            }
+            else
+            {
+                eitScanStartTime = eitScanStartTime.addSecs(60 + start_delay);
+                LOG(VB_GENERAL, LOG_INFO, LOC +
+                    QString("EIT active scan is in %1min. window. If enabled, will (re)start after %2 sec.")
+                    .arg(eitCrawlDuration).arg(60 + start_delay));
+            }
+        }
     }
     else
         eitScanStartTime = eitScanStartTime.addYears(1);
@@ -1266,18 +1316,60 @@
     SetFlags(kFlagRunMainLoop);
     ClearFlags(kFlagExitPlayer | kFlagFinishRecording);
 
-    eitScanStartTime = MythDate::current();
+    eitScanStartTime = QDateTime::currentDateTime();
     // check whether we should use the EITScanner in this TVRec instance
     if (CardUtil::IsEITCapable(genOpt.cardtype) &&
         (!GetDTVChannel() || GetDTVChannel()->IsMaster()) &&
         (dvbOpt.dvb_eitscan || get_use_eit(cardid)))
     {
         scanner = new EITScanner(cardid);
-        eitScanStartTime = eitScanStartTime.addSecs(
-            eitCrawlIdleStart + eit_start_rand(cardid, eitTransportTimeout));
+        int start_delay = eit_start_rand(cardid, eitTransportTimeout);
+
+        if (eitCrawlIdleStart <= 3600)
+        {
+            eitScanStartTime = eitScanStartTime.addSecs(eitCrawlIdleStart + start_delay);
+
+            eitScanEndAT   = eitScanStartTime.addYears(1);
+            LOG(VB_GENERAL, LOG_INFO, LOC +
+                QString("EIT active scan start after %1 sec.").arg(eitCrawlIdleStart + start_delay));
+        }
+        else
+        {
+            // Set initial scan start / end times to
+            // 0:00+eitCrawlIdleStart / eitCrawlIdleStart+eitCrawlDuration.
+            eitScanStartTime.setTime(QTime(0, 0));
+            eitScanStartTime = eitScanStartTime.addSecs(eitCrawlIdleStart);
+            eitScanEndAT = eitScanStartTime.addSecs(eitCrawlDuration*60);
+            eitScanStartAT = eitScanStartTime.addSecs(start_delay);
+
+            // If we are in scan window then delay and randomize start
+            if (QDateTime::currentDateTime() > eitScanStartAT && QDateTime::currentDateTime() < eitScanEndAT)
+            {
+                eitScanStartTime = QDateTime::currentDateTime();
+                eitScanStartTime = eitScanStartTime.addSecs(60 + start_delay);
+                LOG(VB_GENERAL, LOG_INFO, LOC +
+                   QString("EIT scanner is in window & will start: %1").arg(eitScanStartTime.toString(Qt::ISODate)));
+            }
+
+            // If we are started after scan window, then move start & end
+            // times to next day
+            if (QDateTime::currentDateTime() > eitScanEndAT)
+            {
+                eitScanStartTime = eitScanStartTime.addDays(1);
+                eitScanStartAT = eitScanStartAT.addDays(1);
+                eitScanEndAT = eitScanEndAT.addDays(1);
+            }
+
+            LOG(VB_GENERAL, LOG_INFO, LOC +
+                QString("EIT active scan window: %1").arg(eitScanStartAT.toString(Qt::ISODate)) +
+                QString(" <--> %1 ").arg(eitScanEndAT.toString(Qt::ISODate)));
+        }
     }
     else
+    {
         eitScanStartTime = eitScanStartTime.addYears(1);
+        eitScanEndAT = eitScanStartTime;
+    }
 
     while (HasFlags(kFlagRunMainLoop))
     {
@@ -1408,25 +1500,39 @@
         }
 
         if (scanner && channel &&
-            MythDate::current() > eitScanStartTime)
+            (QDateTime::currentDateTime() > eitScanStartTime || QDateTime::currentDateTime() > eitScanEndAT))
         {
             if (!dvbOpt.dvb_eitscan)
             {
                 LOG(VB_EIT, LOG_INFO, LOC +
                     "EIT scanning disabled for this card.");
                 eitScanStartTime = eitScanStartTime.addYears(1);
+                eitScanEndAT = eitScanEndAT.addYears(1);
             }
             else if (!get_use_eit(GetCaptureCardNum()))
             {
                 LOG(VB_EIT, LOG_INFO, LOC +
                     "EIT scanning disabled for all sources on this card.");
                 eitScanStartTime = eitScanStartTime.addYears(1);
+                eitScanEndAT = eitScanEndAT.addYears(1);
             }
             else
             {
-                scanner->StartActiveScan(this, eitTransportTimeout);
-                SetFlags(kFlagEITScannerRunning);
-                eitScanStartTime = MythDate::current().addYears(1);
+                if (QDateTime::currentDateTime() > eitScanStartTime && QDateTime::currentDateTime() < eitScanEndAT)
+                {
+                    scanner->StartActiveScan(this, eitTransportTimeout);
+                    SetFlags(kFlagEITScannerRunning);
+                    eitScanStartTime = MythDate::current().addYears(1);
+                    LOG(VB_GENERAL, LOG_INFO, LOC +
+                        "EIT active scan started.");
+                }
+                else if (QDateTime::currentDateTime() > eitScanEndAT && HasFlags(kFlagEITScannerRunning))
+                {
+                    scanner->StopActiveScan();
+                    ClearFlags(kFlagEITScannerRunning);
+                    LOG(VB_GENERAL, LOG_INFO, LOC +
+                        "EIT active scan stopped by reaching time window.");
+                }
             }
         }
 
diff -Naur mythtv-0.27-20131116-g4ca9300-old/mythtv/libs/libmythtv/tv_rec.h mythtv-0.27-20131116-g4ca9300-new/mythtv/libs/libmythtv/tv_rec.h
--- mythtv-0.27-20131116-g4ca9300-old/mythtv/libs/libmythtv/tv_rec.h	2013-11-16 21:29:46.553948101 +0100
+++ mythtv-0.27-20131116-g4ca9300-new/mythtv/libs/libmythtv/tv_rec.h	2013-11-16 21:30:13.387153351 +0100
@@ -344,6 +344,7 @@
     bool    runJobOnHostOnly;
     int     eitCrawlIdleStart;
     int     eitTransportTimeout;
+    int     eitCrawlDuration;
     int     audioSampleRateDB;
     int     overRecordSecNrml;
     int     overRecordSecCat;
@@ -371,6 +372,8 @@
     TuningQueue    tuningRequests;
     TuningRequest  lastTuningRequest;
     QDateTime      eitScanStartTime;
+    QDateTime      eitScanStartAT;
+    QDateTime      eitScanEndAT;
     mutable QMutex triggerEventLoopLock;
     QWaitCondition triggerEventLoopWait;
     bool           triggerEventLoopSignal;
diff -Naur mythtv-0.27-20131116-g4ca9300-old/mythtv/programs/mythtv-setup/backendsettings.cpp mythtv-0.27-20131116-g4ca9300-new/mythtv/programs/mythtv-setup/backendsettings.cpp
--- mythtv-0.27-20131116-g4ca9300-old/mythtv/programs/mythtv-setup/backendsettings.cpp	2013-11-16 21:29:49.670599570 +0100
+++ mythtv-0.27-20131116-g4ca9300-new/mythtv/programs/mythtv-setup/backendsettings.cpp	2013-11-16 21:30:13.387153351 +0100
@@ -308,12 +308,15 @@
 
 static GlobalSpinBox *EITCrawIdleStart()
 {
-    GlobalSpinBox *gc = new GlobalSpinBox("EITCrawIdleStart", 30, 7200, 30);
+    GlobalSpinBox *gc = new GlobalSpinBox("EITCrawIdleStart", 30, 86400, 20);
     gc->setLabel(QObject::tr("Backend idle before EIT crawl (secs)"));
     gc->setValue(60);
     QString help = QObject::tr(
-        "The minimum number of seconds after a recorder becomes idle "
-        "to wait before MythTV begins collecting EIT listings data.");
+        "The number of seconds for idle recorders when collecting EIT listings begins. "
+        "If this value is higher than 3600 sec, MythTV will switch to schedulled mode"
+        " where collecting starts this number of seconds after midnight and will go"
+        " for 4h time window."
+         );
     gc->setHelpText(help);
     return gc;
 }
