diff -Naur mythtv-master-20111004-g51c8ce1-old/mythtv/libs/libmythtv/tv_rec.cpp mythtv-master-20111004-g51c8ce1-new/mythtv/libs/libmythtv/tv_rec.cpp
--- mythtv-master-20111004-g51c8ce1-old/mythtv/libs/libmythtv/tv_rec.cpp	2011-10-04 20:21:26.000000000 +0200
+++ mythtv-master-20111004-g51c8ce1-new/mythtv/libs/libmythtv/tv_rec.cpp	2011-10-05 11:39:27.000000000 +0200
@@ -88,7 +88,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(""),
@@ -164,6 +164,10 @@
     runJobOnHostOnly  = gCoreContext->GetNumSetting("JobsRunOnRecordHost", 0);
     eitTransportTimeout=gCoreContext->GetNumSetting("EITTransportTimeout", 5) * 60;
     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;
@@ -919,6 +923,32 @@
     }
 }
 
+static int no_capturecards(uint cardid)
+{
+    MSqlQuery query(MSqlQuery::InitCon());
+
+    QString str =
+        "SELECT COUNT(cardid) "
+        "FROM capturecard ";
+
+    if (cardid)
+        str += "WHERE cardid < :CARDID";
+
+    query.prepare(str);
+
+    if (cardid)
+        query.bindValue(":CARDID", cardid);
+
+    if (!query.exec() || !query.isActive())
+    {
+        MythDB::DBError("no_capturecards", query);
+        return -1;
+    }
+    else if (query.next())
+        return query.value(0).toInt();
+    return -1;
+}
+
 #define TRANSITION(ASTATE,BSTATE) \
    ((internalState == ASTATE) && (desiredNextState == BSTATE))
 #define SET_NEXT() do { nextState = desiredNextState; changed = true; } while(0)
@@ -955,6 +985,8 @@
     {
         scanner->StopActiveScan();
         ClearFlags(kFlagEITScannerRunning);
+        LOG(VB_GENERAL, LOG_INFO, LOC +
+            "EIT active scanner stopped by Recording or LiveTV");
     }
 
     // Handle different state transitions
@@ -997,7 +1029,56 @@
 
     eitScanStartTime = QDateTime::currentDateTime();
     if (scanner && (internalState == kState_None))
-        eitScanStartTime = eitScanStartTime.addSecs(eitCrawlIdleStart);
+    {
+        // 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);
+            eitScanEndAT   = eitScanStartTime.addYears(1);
+            LOG(VB_GENERAL, LOG_INFO, LOC +
+                QString("EIT active scan will resume after %1 sec.").arg(eitCrawlIdleStart));
+        }
+        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 to next nearest scan window.
+            if ((QDateTime::currentDateTime() < eitScanStartAT) ||
+               (QDateTime::currentDateTime() > eitScanEndAT))
+            {
+                eitScanStartTime.setTime(QTime(0, 0));
+                eitScanStartTime = eitScanStartTime.addSecs(eitCrawlIdleStart);
+                eitScanEndAT = eitScanStartTime.addSecs(eitCrawlDuration*60);
+                // distribute resume time evenly over eitTransportTimeout
+                int card_pos = no_capturecards(cardid);
+                int no_cards = no_capturecards(0);
+                uint timeout = 0;
+                if (no_cards > 0 && card_pos >= 0)
+                    timeout += eitTransportTimeout * card_pos / no_cards;
+                else
+                    timeout += random() % eitTransportTimeout;
+                eitScanStartTime = eitScanStartTime.addSecs(timeout);
+                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);
+                LOG(VB_GENERAL, LOG_INFO, LOC +
+                    QString("EIT active scan is in %1min. window. If enabled, will (re)start after 60 sec.").arg(eitCrawlDuration));
+            }
+        }
+    }
     else
         eitScanStartTime = eitScanStartTime.addYears(1);
 }
@@ -1142,32 +1223,6 @@
     return false;
 }
 
-static int no_capturecards(uint cardid)
-{
-    MSqlQuery query(MSqlQuery::InitCon());
-
-    QString str =
-        "SELECT COUNT(cardid) "
-        "FROM capturecard ";
-
-    if (cardid)
-        str += "WHERE cardid < :CARDID";
-
-    query.prepare(str);
-
-    if (cardid)
-        query.bindValue(":CARDID", cardid);
-
-    if (!query.exec() || !query.isActive())
-    {
-        MythDB::DBError("no_capturecards", query);
-        return -1;
-    }
-    else if (query.next())
-        return query.value(0).toInt();
-    return -1;
-}
-
 /// \brief Event handling method, contains event loop.
 void TVRec::run(void)
 {
@@ -1182,20 +1237,59 @@
         (dvbOpt.dvb_eitscan || get_use_eit(cardid)))
     {
         scanner = new EITScanner(cardid);
-        uint timeout = eitCrawlIdleStart;
         // get the number of capture cards and the position of the current card
-        // to distribute the the scan start evenly over eitTransportTimeout
+        // to help distribute scan start time evenly over eitTransportTimeout
         int card_pos = no_capturecards(cardid);
         int no_cards = no_capturecards(0);
-        if (no_cards > 0 && card_pos >= 0)
-            timeout += eitTransportTimeout * card_pos / no_cards;
+
+        // If eitCrawlIdleStart is above 3600 then we enter schedulled mode for
+        // EIT active scan. For values 3600 and below we have old behaviour.
+        if (eitCrawlIdleStart <= 3600)
+        {
+            uint timeout = eitCrawlIdleStart;
+            if (no_cards > 0 && card_pos >= 0)
+                timeout += eitTransportTimeout * card_pos / no_cards;
+            else
+                timeout += random() % eitTransportTimeout;
+            eitScanStartTime = eitScanStartTime.addSecs(timeout);
+            eitScanEndAT   = eitScanStartTime.addYears(1);
+            LOG(VB_GENERAL, LOG_INFO, LOC +
+                QString("EIT active scan start after %1 sec.").arg(timeout));
+        }
         else
-            timeout += random() % eitTransportTimeout;
+        {
+            // Set initial scan start/end time to
+            // 0:00+eitCrawlIdleStart/eitCrawlIdleStart+eitCrawlDuration respectively
+            eitScanStartTime.setTime(QTime(0, 0));
+            eitScanStartTime = eitScanStartTime.addSecs(eitCrawlIdleStart);
+            eitScanEndAT = eitScanStartTime.addSecs(eitCrawlDuration*60);
+            // Distribute scan start time evenly over eitTransportTimeout
+            uint timeout = 0;
+            if (no_cards > 0 && card_pos >= 0)
+                timeout += eitTransportTimeout * card_pos / no_cards;
+            else
+                timeout += random() % eitTransportTimeout;
+            eitScanStartTime = eitScanStartTime.addSecs(timeout);
 
-        eitScanStartTime = eitScanStartTime.addSecs(timeout);
+            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 window: %1").arg(eitScanStartAT.toString(Qt::ISODate)) +
+                QString(" <--> %1").arg(eitScanEndAT.toString(Qt::ISODate)));
+        }
     }
     else
+    {
         eitScanStartTime = eitScanStartTime.addYears(1);
+        eitScanEndAT = eitScanStartTime;
+    }
 
     while (HasFlags(kFlagRunMainLoop))
     {
@@ -1327,26 +1421,41 @@
             ClearFlags(kFlagExitPlayer);
         }
 
+        // Check should we start or stop active scan on this card
         if (scanner && channel &&
-            QDateTime::currentDateTime() > 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 = QDateTime::currentDateTime().addYears(1);
+                if (QDateTime::currentDateTime() > eitScanStartTime && QDateTime::currentDateTime() < eitScanEndAT)
+                {
+                    scanner->StartActiveScan(this, eitTransportTimeout);
+                    SetFlags(kFlagEITScannerRunning);
+                    eitScanStartTime = QDateTime::currentDateTime().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-master-20111004-g51c8ce1-old/mythtv/libs/libmythtv/tv_rec.h mythtv-master-20111004-g51c8ce1-new/mythtv/libs/libmythtv/tv_rec.h
--- mythtv-master-20111004-g51c8ce1-old/mythtv/libs/libmythtv/tv_rec.h	2011-10-04 20:21:26.000000000 +0200
+++ mythtv-master-20111004-g51c8ce1-new/mythtv/libs/libmythtv/tv_rec.h	2011-10-05 11:36:45.000000000 +0200
@@ -329,6 +329,7 @@
     bool    runJobOnHostOnly;
     int     eitCrawlIdleStart;
     int     eitTransportTimeout;
+    int     eitCrawlDuration;
     int     audioSampleRateDB;
     int     overRecordSecNrml;
     int     overRecordSecCat;
@@ -355,6 +356,8 @@
     TuningQueue    tuningRequests;
     TuningRequest  lastTuningRequest;
     QDateTime      eitScanStartTime;
+    QDateTime      eitScanStartAT;
+    QDateTime      eitScanEndAT;
     mutable QMutex triggerEventLoopLock;
     QWaitCondition triggerEventLoopWait;
     bool           triggerEventLoopSignal;
diff -Naur mythtv-master-20111004-g51c8ce1-old/mythtv/programs/mythtv-setup/backendsettings.cpp mythtv-master-20111004-g51c8ce1-new/mythtv/programs/mythtv-setup/backendsettings.cpp
--- mythtv-master-20111004-g51c8ce1-old/mythtv/programs/mythtv-setup/backendsettings.cpp	2011-10-04 20:21:43.000000000 +0200
+++ mythtv-master-20111004-g51c8ce1-new/mythtv/programs/mythtv-setup/backendsettings.cpp	2011-10-05 11:36:45.000000000 +0200
@@ -330,12 +330,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;
 }
