Index: mythtv/libs/libmythtv/dbcheck.cpp
===================================================================
--- mythtv/libs/libmythtv/dbcheck.cpp   (revision 9481)
+++ mythtv/libs/libmythtv/dbcheck.cpp   (working copy)
@@ -10,7 +10,7 @@
 #include "mythdbcon.h"
 
 /// This is the DB schema version expected by the running MythTV instance.
-const QString currentDatabaseVersion = "1133";
+const QString currentDatabaseVersion = "1134";
 
 static bool UpdateDBVersionNumber(const QString &newnumber);
 static bool performActualUpdate(const QString updates[], QString version,
@@ -2157,6 +2157,35 @@
             return false;
     }
 
+    if (dbver == "1133")
+    {
+        const QString updates[] = {
+// Dish Network
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 4102, 'force_guide_present', 'yes');",
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 4102, 'extended_guide_tid', '229');",  
+
+// Bell ExpressVu
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 256, 'force_guide_present', 'yes');",
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 256, 'guide_on_single_tid', 'yes');",          
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 257, 'force_guide_present', 'yes');",
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 257, 'guide_on_single_tid', 'yes');",
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 256, 'standard_guide_tid', '4');",                
+"INSERT INTO dtv_privatetypes (sitype, networkid, private_type, private_value)"
+" VALUES('dvb', 257, 'standard_guide_tid', '102');",                 
+""
+};
+
+        if (!performActualUpdate(updates, "1134", dbver))
+            return false;
+    }
+
 //"ALTER TABLE capturecard DROP COLUMN dvb_recordts;" in 0.21
 //"ALTER TABLE capturecard DROP COLUMN dvb_hw_decoder;" in 0.21
 //"ALTER TABLE cardinput DROP COLUMN  preference;" in 0.22
Index: mythtv/libs/libmythtv/eitscanner.h
===================================================================
--- mythtv/libs/libmythtv/eitscanner.h  (revision 9481)
+++ mythtv/libs/libmythtv/eitscanner.h  (working copy)
@@ -28,7 +28,7 @@
     void StopPassiveScan(void);
 
     void StartActiveScan(TVRec*, uint max_seconds_per_source,
-                         bool ignore_source);
+                         bool ignore_source, bool limit_transport=false);
 
     void StopActiveScan(void);        
 
Index: mythtv/libs/libmythtv/tv_rec.cpp
===================================================================
--- mythtv/libs/libmythtv/tv_rec.cpp    (revision 9481)
+++ mythtv/libs/libmythtv/tv_rec.cpp    (working copy)
@@ -78,9 +78,6 @@
 #define LOC QString("TVRec(%1): ").arg(cardid)
 #define LOC_ERR QString("TVRec(%1) Error: ").arg(cardid)
 
-/// How many seconds after entering kState_None should we start EIT Scanner
-const uint TVRec::kEITScanStartTimeout = 60; /* 1 minute */
-
 /// How many milliseconds the signal monitor should wait between checks
 const uint TVRec::kSignalMonitoringRate = 50; /* msec */
 
@@ -768,7 +765,8 @@
     {
         // Add some randomness to avoid all cards starting
         // EIT scanning at nearly the same time.
-        uint timeout = kEITScanStartTimeout + random() % 59;
+        uint idle_start = gContext->GetNumSetting("EITCrawIdleStart", 1);
+        uint timeout = (idle_start * 60) + random() % 59;
         eitScanStartTime = eitScanStartTime.addSecs(timeout);
     }
     else
@@ -1207,7 +1205,8 @@
 
     // Add some randomness to avoid all cards starting
     // EIT scanning at nearly the same time.
-    uint timeout = kEITScanStartTimeout + random() % 59;
+    uint idle_start = gContext->GetNumSetting("EITCrawIdleStart", 1);
+    uint timeout = (idle_start * 60) + random() % 59;
     eitScanStartTime = QDateTime::currentDateTime().addSecs(timeout);
 
     while (HasFlags(kFlagRunMainLoop))
@@ -1343,7 +1342,8 @@
             {
                 uint ttMin = gContext->GetNumSetting("EITTransportTimeout", 5);
                 uint ignore = gContext->GetNumSetting("EITIgnoresSource", 0);
-                scanner->StartActiveScan(this, ttMin * 60, ignore);
+                uint tid_limit = gContext->GetNumSetting("EITCrawLimitTransports", 0);
+                scanner->StartActiveScan(this, ttMin * 60, ignore, tid_limit);
                 SetFlags(kFlagEITScannerRunning);
                 eitScanStartTime = QDateTime::currentDateTime().addYears(1);
             }
Index: mythtv/libs/libmythtv/eitscanner.cpp
===================================================================
--- mythtv/libs/libmythtv/eitscanner.cpp        (revision 9481)
+++ mythtv/libs/libmythtv/eitscanner.cpp        (working copy)
@@ -183,7 +183,7 @@
 }
 
 void EITScanner::StartActiveScan(TVRec *_rec, uint max_seconds_per_source,
-                                 bool _ignore_source)
+                                 bool _ignore_source, bool limit_transports)
 {
     rec           = _rec;
     ignore_source = _ignore_source;
@@ -191,17 +191,37 @@
     if (!activeScanChannels.size())
     {
         MSqlQuery query(MSqlQuery::InitCon());
-        query.prepare(
-            "SELECT channum, mplexid "
-            "FROM channel, cardinput, capturecard, videosource "
-            "WHERE cardinput.sourceid   = channel.sourceid AND "
-            "      videosource.sourceid = channel.sourceid AND "
-            "      capturecard.cardid   = cardinput.cardid AND "
-            "      channel.mplexid        IS NOT NULL      AND "
-            "      useonairguide        = 1                AND "
-            "      useeit               = 1                AND "
-            "      cardinput.cardid     = :CARDID "
-            "ORDER BY cardinput.sourceid, atscsrcid");
+
+        if (limit_transports)
+            query.prepare(
+                "SELECT MIN(channum), channel.mplexid                        "
+                "FROM channel, dtv_multiplex, dtv_privatetypes, videosource, "
+                "cardinput, capturecard                                      "
+                "WHERE dtv_multiplex.networkid = dtv_privatetypes.networkid  "
+                "AND videosource.sourceid      = channel.sourceid            "
+                "AND cardinput.sourceid        = channel.sourceid            "
+                "AND capturecard.cardid        = cardinput.cardid            "
+                "AND (private_type             = 'extended_guide_tid'        "
+                "OR   private_type             = 'standard_guide_tid')       "
+                "AND private_value             = transportid                 "
+                "AND channel.mplexid           = dtv_multiplex.mplexid       "
+                "AND useonairguide             = 1                           "
+                "AND useeit                    = 1                           "
+                "AND cardinput.cardid          = :CARDID                     "
+                "GROUP BY transportid");
+        else
+            query.prepare(
+                "SELECT channum, mplexid "
+                "FROM channel, cardinput, capturecard, videosource "
+                "WHERE cardinput.sourceid   = channel.sourceid AND "
+                "      videosource.sourceid = channel.sourceid AND "
+                "      capturecard.cardid   = cardinput.cardid AND "
+                "      channel.mplexid        IS NOT NULL      AND "
+                "      useonairguide        = 1                AND "
+                "      useeit               = 1                AND "
+                "      cardinput.cardid     = :CARDID "
+                "ORDER BY cardinput.sourceid, atscsrcid");
+
         query.bindValue(":CARDID", rec->GetCaptureCardNum());
 
         if (!query.exec() || !query.isActive())
Index: mythtv/libs/libmythtv/tv_rec.h
===================================================================
--- mythtv/libs/libmythtv/tv_rec.h      (revision 9481)
+++ mythtv/libs/libmythtv/tv_rec.h      (working copy)
@@ -372,7 +372,6 @@
     QString      rbFileExt;
 
   public:
-    static const uint kEITScanStartTimeout;
     static const uint kSignalMonitoringRate;
 
     // General State flags
Index: mythtv/setup/backendsettings.cpp
===================================================================
--- mythtv/setup/backendsettings.cpp    (revision 9481)
+++ mythtv/setup/backendsettings.cpp    (working copy)
@@ -252,7 +252,31 @@
     return gc;
 };
 
+static GlobalSpinBox *EITCrawIdleStart()
+{
+    GlobalSpinBox *gc = new GlobalSpinBox("EITCrawIdleStart", 1, 120, 1);
+    gc->setLabel(QObject::tr("Backend Idle Before EIT Craw (mins)"));
+    gc->setValue(1);
+    QString help = QObject::tr(
+        "The amount of idle time, in minutes, to wait before listings "
+        "data is collected.");
+    gc->setHelpText(help);
+    return gc;
+}
 
+static GlobalCheckBox *EITCrawLimitTransports()
+{
+    GlobalCheckBox *gc = new GlobalCheckBox("EITCrawLimitTransports");
+    gc->setLabel(QObject::tr("EIT Craw Limits Transports"));
+    gc->setValue(false);
+    QString help = QObject::tr("If set, listings data collected during "
+                               "idle times will only be for providers which "
+                               "have extended guide information available on "
+                               "selective transports.");
+    gc->setHelpText(help);
+    return gc;
+};
+
 static GlobalSpinBox *WOLbackendReconnectWaitTime()
 {
     GlobalSpinBox *gc = new GlobalSpinBox("WOLbackendReconnectWaitTime", 0, 1200, 5);
@@ -670,6 +694,8 @@
     group2a1->setLabel(QObject::tr("EIT Scanner Options"));                
     group2a1->addChild(EITTransportTimeout());
     group2a1->addChild(EITIgnoresSource());
+    group2a1->addChild(EITCrawIdleStart());
+    group2a1->addChild(EITCrawLimitTransports());
     addChild(group2a1);
 
     VerticalConfigurationGroup* group3 = new VerticalConfigurationGroup(false);
