Index: mythtv/libs/libmythtv/channelbase.cpp
===================================================================
--- mythtv.orig/libs/libmythtv/channelbase.cpp
+++ mythtv/libs/libmythtv/channelbase.cpp
@@ -35,6 +35,7 @@ ChannelBase::ChannelBase(TVRec *parent)
     pParent(parent), channelorder("channum + 0"), curchannelname(""),
     currentInputID(-1), commfree(false), cardid(0),
     currentATSCMajorChannel(-1), currentATSCMinorChannel(-1),
+    currentOriginalNetworkID(-1), currentTransportID(-1),
     currentProgramNum(-1)
 {
 }
Index: mythtv/libs/libmythtv/channelbase.h
===================================================================
--- mythtv.orig/libs/libmythtv/channelbase.h
+++ mythtv/libs/libmythtv/channelbase.h
@@ -159,6 +159,13 @@ class ChannelBase
     /// \brief Returns minor channel, -1 if unknown.
     virtual int GetMinorChannel(void) const
         { return currentATSCMinorChannel; };
+    /// \brief Returns DVB original_network_id, -1 if unknown.
+    virtual int GetOriginalNetworkID(void) const
+        { return currentOriginalNetworkID; };
+    /// \brief Returns DVB transport_stream_id, -1 if unknown.
+    virtual int GetTransportID(void) const
+        { return currentTransportID; };
+	//                            
 
     // \brief Set cardid for scanning
     void SetCardID(uint _cardid) { cardid = _cardid; }
@@ -186,6 +193,8 @@ class ChannelBase
     int     currentATSCMajorChannel;
     int     currentATSCMinorChannel;
     int     currentProgramNum;
+    int     currentOriginalNetworkID;
+    int     currentTransportID;
 };
 
 #endif
Index: mythtv/libs/libmythtv/dtvsignalmonitor.cpp
===================================================================
--- mythtv.orig/libs/libmythtv/dtvsignalmonitor.cpp
+++ mythtv/libs/libmythtv/dtvsignalmonitor.cpp
@@ -191,6 +191,30 @@ void DTVSignalMonitor::SetProgramNumber(
     }
 }
 
+void DTVSignalMonitor::SetDVBService(int onid, int tsid, int sid)
+{
+    DBG_SM(QString("SetDVBService(original_network_id: %1, transport_id: %2, "
+                   "service_id: %3)")
+           .arg(onid).arg(tsid).arg(sid), "");
+    if (onid != originalNetworkID || tsid != transportID || sid != programNumber)
+    {
+        cerr << "setting desired streams" << endl;
+        RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch |
+                    kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch   );
+        originalNetworkID = onid;
+        transportID       = tsid;
+        programNumber     = sid;
+        if (GetDVBStreamData())
+        {
+            cerr << "Activating SDT monitoring" << endl;
+            GetDVBStreamData()->SetDesiredService(originalNetworkID, transportID, programNumber);
+            AddFlags(kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForSDT);
+            GetDVBStreamData()->AddListeningPID(DVB_SDT_PID);
+        }
+    }
+}
+
+
 void DTVSignalMonitor::SetStreamData(MPEGStreamData *data)
 {
     if (stream_data)
@@ -377,8 +401,13 @@ void DTVSignalMonitor::HandleSDT(uint, c
     DBG_SM("SetSDT()", QString("tsid = %1 orig_net_id = %2")
            .arg(sdt->TSID()).arg(sdt->OriginalNetworkID()));
     AddFlags(kDTVSigMon_SDTSeen);
-    if (!GetDVBStreamData())
+    int onid = sdt->OriginalNetworkID();
+    int tsid = sdt->TSID();
+    if (onid == originalNetworkID && tsid == transportID)
+    {
+        AddFlags(kDTVSigMon_SDTMatch);
         return;
+    }
 }
 
 ATSCStreamData *DTVSignalMonitor::GetATSCStreamData()
Index: mythtv/libs/libmythtv/dtvsignalmonitor.h
===================================================================
--- mythtv.orig/libs/libmythtv/dtvsignalmonitor.h
+++ mythtv/libs/libmythtv/dtvsignalmonitor.h
@@ -37,6 +37,11 @@ class DTVSignalMonitor : public SignalMo
     void SetProgramNumber(int progNum);
     int  GetProgramNumber() const { return programNumber; }
 
+    void SetDVBService(int onid, int tsid, int sid);
+    int  GetServiceID() const         { return programNumber; }
+    int  GetTransportID() const       { return transportID; }
+    int  GetOriginalNetworkID() const { return originalNetworkID; }
+
     void SetFTAOnly(bool fta)    { ignoreEncrypted = fta;  }
     bool GetFTAOnly() const      { return ignoreEncrypted; }
 
@@ -111,6 +116,8 @@ class DTVSignalMonitor : public SignalMo
     int                majorChannel;
     int                minorChannel;
     int                programNumber;
+    int                transportID;
+    int                originalNetworkID;
     bool               ignoreEncrypted;
     QString            error;
 };
Index: mythtv/libs/libmythtv/dvbchannel.cpp
===================================================================
--- mythtv.orig/libs/libmythtv/dvbchannel.cpp
+++ mythtv/libs/libmythtv/dvbchannel.cpp
@@ -296,11 +296,15 @@ bool DVBChannel::GetChannelOptions(const
     // Reset Channel data
     currentATSCMajorChannel = currentATSCMinorChannel = -1;
     currentProgramNum = -1;
+    currentOriginalNetworkID = currentTransportID = -1;
 
     QString thequery =
-        QString("SELECT chanid, serviceid, mplexid, atscsrcid, cardinputid "
-                "FROM channel, cardinput, capturecard "
+        QString("SELECT chanid, serviceid, channel.mplexid, atscsrcid, "
+                "       cardinputid, networkid, transportid "
+                "FROM channel, cardinput, capturecard, dtv_multiplex "
                 "WHERE channel.channum='%1' AND "
+                "      channel.mplexid    = dtv_multiplex.mplexid AND "
+                "      channel.sourceid   = dtv_multiplex.sourceid AND "
                 "      cardinput.sourceid = channel.sourceid AND "
                 "      capturecard.cardid = cardinput.cardid AND "
                 "      capturecard.cardtype = 'DVB' AND "
@@ -332,9 +336,15 @@ bool DVBChannel::GetChannelOptions(const
                 currentATSCMinorChannel = query.value(3).toInt() & 0xff;
                 currentProgramNum = -1;
             }
+            else if (query.value(5).toInt() > 0)
+            {
+                currentOriginalNetworkID = query.value(5).toInt();
+                currentTransportID       = query.value(6).toInt();
+            }
         }
     }
 
+
     if (!found)
     {
         VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to find channel in database.");
Index: mythtv/libs/libmythtv/tv_rec.cpp
===================================================================
--- mythtv.orig/libs/libmythtv/tv_rec.cpp
+++ mythtv/libs/libmythtv/tv_rec.cpp
@@ -1630,9 +1630,11 @@ bool TVRec::SetupDTVSignalMonitor(void)
         return true;
     }
 
-    // Check if this is an MPEG Channel
+    // Check if this is an DVB channel
+    uint onid = channel->GetOriginalNetworkID();
+    uint tsid = channel->GetTransportID();       
     int progNum = channel->GetProgramNumber();
-    if (progNum >= 0)
+    if (onid > 0 && tsid > 0 && progNum >= 0)
     {
         uint neededVideo = 0;
         uint neededAudio = 0;
@@ -1640,7 +1642,7 @@ bool TVRec::SetupDTVSignalMonitor(void)
         DVBStreamData *dsd = dynamic_cast<DVBStreamData*>(sd);
         if (!dsd)
         {
-            sd = dsd = new DVBStreamData();
+            sd = dsd = new DVBStreamData(onid, tsid, progNum);
             sd->SetCaching(true);
             if (GetDTVRecorder())
                 GetDTVRecorder()->SetStreamData(dsd);
@@ -1656,7 +1658,8 @@ bool TVRec::SetupDTVSignalMonitor(void)
             neededAudio = (setting->getValue() == "audio") ? 1 : 0;
         }
 
-        QString msg = QString("MPEG program number: %1").arg(progNum);
+        QString msg = QString("DVB service %1 on original_network_id %2 transport_stream_id %3")
+                          .arg(progNum).arg(onid).arg(tsid);
         VERBOSE(VB_RECORD, LOC + msg);
 
 #ifdef USING_DVB
@@ -1671,10 +1674,47 @@ bool TVRec::SetupDTVSignalMonitor(void)
             GetCaptureCardNum(), channel->GetCurrentInput());
 
         sm->SetStreamData(sd);
-        sm->SetProgramNumber(progNum);
+        sm->SetDVBService(onid, tsid, progNum);
         sd->SetVideoStreamsRequired(neededVideo);
         sd->SetVideoStreamsRequired(neededAudio);
         sm->SetFTAOnly(fta);
+
+        sm->AddFlags(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForSDT);
+
+        VERBOSE(VB_RECORD, LOC + "Successfully set up DVB table monitoring.");
+        return true;
+    }
+
+    // Check if this is an MPEG channel
+    if (progNum >= 0)
+    {
+        if (!sd)
+        {
+            sd = new MPEGStreamData(progNum, true);
+            sd->SetCaching(true);
+            if (GetDTVRecorder())
+                GetDTVRecorder()->SetStreamData(sd);
+        }
+
+        QString msg = QString("MPEG program number: %1").arg(progNum);
+        VERBOSE(VB_RECORD, LOC + msg);
+
+#ifdef USING_DVB
+        // Some DVB devices munge the PMT and/or PAT so the CRC check fails.
+        // We need to tell the stream data class to not check the CRC on 
+        // these devices.
+        if (GetDVBChannel())
+            sd->SetIgnoreCRC(GetDVBChannel()->HasCRCBug());
+#endif // USING_DVB
+
+        bool fta = CardUtil::IgnoreEncrypted(
+            GetCaptureCardNum(), channel->GetCurrentInput());
+
+        sm->SetStreamData(sd);
+        sm->SetProgramNumber(progNum);
+        sd->SetVideoStreamsRequired(1);
+        sm->SetFTAOnly(fta);
+
         sm->AddFlags(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT);
 
         VERBOSE(VB_RECORD, LOC + "Successfully set up MPEG table monitoring.");
Index: mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
===================================================================
--- mythtv.orig/libs/libmythtv/mpeg/dvbstreamdata.cpp
+++ mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
@@ -7,8 +7,11 @@ using namespace std;
 #include "dvbtables.h"
 #include "eithelper.h"
 
-DVBStreamData::DVBStreamData(bool cacheTables)
-    : MPEGStreamData(-1, cacheTables),
+// service_id is equal to the mrogram_number in the PMT
+DVBStreamData::DVBStreamData(int desired_onid, int desired_tsid,
+                             int desired_program, bool cacheTables)
+    : MPEGStreamData(desired_program, cacheTables),
+      _desired_onid(desired_onid), _desired_tsid(desired_tsid),
       _dvb_eit_dishnet_long(false),
       _nit_version(-2), _nito_version(-2)
 {
@@ -20,7 +23,7 @@ DVBStreamData::DVBStreamData(bool cacheT
 
 DVBStreamData::~DVBStreamData()
 {
-    Reset();
+    Reset(_desired_onid, _desired_tsid, _desired_program);
 
     QMutexLocker locker(&_listener_lock);
     _dvb_main_listeners.clear();
@@ -29,6 +32,38 @@ DVBStreamData::~DVBStreamData()
     _dvb_has_eit.clear();
 }
 
+void DVBStreamData::SetDesiredService(int onid, int tsid, int sid)
+{
+    bool reset    = true;
+    int networkID = 0;
+
+    if (HasCachedAllSDT(tsid, true))
+    {
+        const sdt_ptr_t first_sdt = GetCachedSDT(tsid, 0, true);
+        networkID = first_sdt->OriginalNetworkID();
+        if (networkID == onid)
+        {
+            reset = false;
+            _desired_onid = onid;
+            _desired_tsid = tsid;
+            uint last_section = first_sdt->LastSection();
+            ProcessSDT(_desired_tsid, first_sdt);
+            ReturnCachedTable(first_sdt);
+            for (uint i = 1; i <= last_section; ++i)
+            {
+                const sdt_ptr_t sdt = GetCachedSDT(_desired_tsid, i, true);
+                ProcessSDT(_desired_tsid, sdt);
+                ReturnCachedTable(sdt);
+            }
+            SetDesiredProgram(sid);
+        }
+    }
+
+    if (reset)
+        Reset(onid, tsid, sid);
+}
+
+
 /** \fn DVBStreamData::IsRedundant(uint,const PSIPTable&) const
  *  \brief Returns true if table already seen.
  *  \todo This is just a stub.
@@ -114,9 +149,12 @@ bool DVBStreamData::IsRedundant(uint pid
     return false;
 }
 
-void DVBStreamData::Reset(void)
+void DVBStreamData::Reset(int desired_onid, int desired_tsid, int desired_sid)
 {
-    MPEGStreamData::Reset(-1);
+    MPEGStreamData::Reset(desired_sid);
+
+    _desired_onid = desired_onid;
+    _desired_tsid = desired_tsid;
 
     SetVersionNIT(-1,0);
     _sdt_versions.clear();
Index: mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
===================================================================
--- mythtv.orig/libs/libmythtv/mpeg/dvbstreamdata.h
+++ mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
@@ -22,10 +22,16 @@ typedef QMap<uint, bool>                
 class DVBStreamData : virtual public MPEGStreamData
 {
   public:
-    DVBStreamData(bool cacheTables = false);
+    DVBStreamData(int desired_onid, int desired_tsid,
+                  int desired_program, bool cacheTables = false);
     ~DVBStreamData();
 
-    void Reset();
+    void Reset(int desired_onid, int desired_tsid, int desired_sid);
+
+    // DVB table monitoring
+    void SetDesiredService(int onid, int tsid, int sid);
+    int DesiredOriginalNetworkID(void) const       { return _desired_onid; }
+    int DesiredTransportID(void) const             { return _desired_tsid; }
 
     // Table processing
     bool HandleTables(uint pid, const PSIPTable&);
@@ -157,6 +163,10 @@ class DVBStreamData : virtual public MPE
     void CacheSDT(ServiceDescriptionTable*);
 
   private:
+    /// DVB table monitoring
+    int                       _desired_onid;
+    int                       _desired_tsid;
+    
     /// Decode DishNet's long-term DVB EIT
     bool                      _dvb_eit_dishnet_long;
     /// Tell us if the DVB service has EIT
Index: mythtv/libs/libmythtv/mpeg/scanstreamdata.cpp
===================================================================
--- mythtv.orig/libs/libmythtv/mpeg/scanstreamdata.cpp
+++ mythtv/libs/libmythtv/mpeg/scanstreamdata.cpp
@@ -7,7 +7,7 @@
 ScanStreamData::ScanStreamData()
     : MPEGStreamData(-1, true),
       ATSCStreamData(-1,-1, true),
-      DVBStreamData(true)
+      DVBStreamData(-1, -1, -1, true)
 {
 }
 
@@ -36,7 +36,7 @@ void ScanStreamData::Reset(void)
 {
     MPEGStreamData::Reset(-1);
     ATSCStreamData::Reset(-1,-1);
-    DVBStreamData::Reset();
+    DVBStreamData::Reset(-1, -1, -1);
 
     AddListeningPID(MPEG_PAT_PID);
     AddListeningPID(ATSC_PSIP_PID);
