Index: mythtv-eit/libs/libmythtv/dtvsignalmonitor.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/dtvsignalmonitor.cpp
+++ mythtv-eit/libs/libmythtv/dtvsignalmonitor.cpp
@@ -222,6 +222,9 @@ void DTVSignalMonitor::SetDVBService(uin
 
 void DTVSignalMonitor::SetStreamData(MPEGStreamData *data)
 {
+    if (stream_data == data)
+        return;
+
     if (stream_data)
         stream_data->RemoveMPEGListener(this);
 
Index: mythtv-eit/libs/libmythtv/tv_rec.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/tv_rec.cpp
+++ mythtv-eit/libs/libmythtv/tv_rec.cpp
@@ -110,7 +110,7 @@ static QString load_profile(QString,void
 TVRec::TVRec(int capturecardnum)
        // Various components TVRec coordinates
     : recorder(NULL), channel(NULL), signalMonitor(NULL),
-      scanner(new EITScanner()),
+      scanner(new EITScanner()), streamData(NULL),
       // Configuration variables from database
       eitIgnoresSource(false),      transcodeFirst(false),
       earlyCommFlag(false),         runJobOnHostOnly(false),
@@ -317,6 +317,8 @@ void TVRec::TeardownAll(void)
 
     TeardownRecorder(true);
 
+    SetMPEGStreamData(NULL);
+
     SetRingBuffer(NULL);
 }
 
@@ -1565,12 +1567,12 @@ QString TVRec::GetStartChannel(int cardi
     return startchan;
 }
 
-void GetPidsToCache(DTVSignalMonitor *dtvMon, pid_cache_t &pid_cache)
+void GetPidsToCache(ATSCStreamData *asd, pid_cache_t &pid_cache)
 {
-    if (!dtvMon->GetATSCStreamData())
+    if (!asd)
         return;
 
-    const MasterGuideTable *mgt = dtvMon->GetATSCStreamData()->GetCachedMGT();
+    const MasterGuideTable *mgt = asd->GetCachedMGT();
     if (!mgt)
         return;
 
@@ -1579,10 +1581,10 @@ void GetPidsToCache(DTVSignalMonitor *dt
         pid_cache_item_t item(mgt->TablePID(i), mgt->TableType(i));
         pid_cache.push_back(item);
     }
-    dtvMon->GetATSCStreamData()->ReturnCachedTable(mgt);
+    asd->ReturnCachedTable(mgt);
 }
 
-bool ApplyCachedPids(DTVSignalMonitor *dtvMon, const ChannelBase* channel)
+bool ApplyCachedPids(ATSCStreamData *asd, const ChannelBase* channel)
 {
     pid_cache_t pid_cache;
     channel->GetCachedPids(pid_cache);
@@ -1594,7 +1596,7 @@ bool ApplyCachedPids(DTVSignalMonitor *d
             (it->second == TableID::CVCT))
         {
             vctpid_cached = true;
-            dtvMon->GetATSCStreamData()->AddListeningPID(it->first);
+            asd->AddListeningPID(it->first);
         }
     }
     return vctpid_cached;
@@ -1617,12 +1619,9 @@ bool TVRec::SetupDTVSignalMonitor(void)
     VERBOSE(VB_RECORD, LOC + "Setting up table monitoring.");
 
     DTVSignalMonitor *sm = GetDTVSignalMonitor();
-    MPEGStreamData *sd = NULL;
-    if (GetDTVRecorder())
-    {
-        sd = GetDTVRecorder()->GetStreamData();
+    MPEGStreamData *sd = GetMPEGStreamData();
+    if (sd)
         sd->SetCaching(true);
-    }
 
     // Check if this is an ATSC Channel
     int major = channel->GetMajorChannel();
@@ -1636,6 +1635,7 @@ bool TVRec::SetupDTVSignalMonitor(void)
         if (!asd)
         {
             sd = asd = new ATSCStreamData(major, minor);
+            SetMPEGStreamData(asd);
             sd->SetCaching(true);
             if (GetDTVRecorder())
                 GetDTVRecorder()->SetStreamData(asd);
@@ -1648,7 +1648,7 @@ bool TVRec::SetupDTVSignalMonitor(void)
 
         // Try to get pid of VCT from cache and
         // require MGT if we don't have VCT pid.
-        if (!ApplyCachedPids(sm, channel))
+        if (!ApplyCachedPids(GetATSCStreamData(), channel))
             sm->AddFlags(kDTVSigMon_WaitForMGT);
 
         VERBOSE(VB_RECORD, LOC + "Successfully set up ATSC table monitoring.");
@@ -1669,6 +1669,7 @@ bool TVRec::SetupDTVSignalMonitor(void)
         if (!dsd)
         {
             sd = dsd = new DVBStreamData(netid, tsid, progNum);
+            SetMPEGStreamData(dsd);
             sd->SetCaching(true);
             if (GetDTVRecorder())
                 GetDTVRecorder()->SetStreamData(dsd);
@@ -1716,6 +1717,7 @@ bool TVRec::SetupDTVSignalMonitor(void)
         if (!sd)
         {
             sd = new MPEGStreamData(progNum, true);
+            SetMPEGStreamData(sd);
             sd->SetCaching(true);
             if (GetDTVRecorder())
                 GetDTVRecorder()->SetStreamData(sd);
@@ -1814,7 +1816,7 @@ void TVRec::TeardownSignalMonitor()
     if (dtvMon && channel)
     {
         pid_cache_t pid_cache;
-        GetPidsToCache(dtvMon, pid_cache);
+        GetPidsToCache(GetATSCStreamData(), pid_cache);
         if (pid_cache.size())
             channel->SaveCachedPids(pid_cache);
     }
@@ -3060,7 +3062,7 @@ bool TVRec::TuningOnSameMultiplex(Tuning
 
     if (ChannelUtil::IsOnSameMultiplex(sourceid, newchannum, oldchannum))
     {
-        MPEGStreamData *mpeg = GetDTVRecorder()->GetStreamData();
+        MPEGStreamData *mpeg = GetMPEGStreamData();
         ATSCStreamData *atsc = dynamic_cast<ATSCStreamData*>(mpeg);
 
         if (atsc)
@@ -3164,9 +3166,8 @@ void TVRec::HandleTuning(void)
         TuningFrequency(lastTuningRequest);
     }
 
-    MPEGStreamData *streamData = NULL;
-    bool handle_done = (HasFlags(kFlagWaitingForSignal) &&
-                        !(streamData = TuningSignalCheck()));
+    MPEGStreamData *streamData = GetMPEGStreamData();
+    bool handle_done = (HasFlags(kFlagWaitingForSignal) && !TuningSignalCheck());
 
     // Just because we have signal, we may not have the right transponder.
     if (HasFlags(kFlagWaitingForSignal) && !retune_timer->elapsed() &&
@@ -3344,14 +3345,14 @@ void TVRec::TuningFrequency(const Tuning
 {
     if (request.minorChan)
     {
-        MPEGStreamData *mpeg = GetDTVRecorder()->GetStreamData();
+        MPEGStreamData *mpeg = GetMPEGStreamData();
         ATSCStreamData *atsc = dynamic_cast<ATSCStreamData*>(mpeg);
         channel->SetChannelByString(request.channel);
         atsc->SetDesiredChannel(request.majorChan, request.minorChan);
     }
     else if (request.progNum >= 0)
     {
-        MPEGStreamData *mpeg = GetDTVRecorder()->GetStreamData();
+        MPEGStreamData *mpeg = GetMPEGStreamData();
         channel->SetChannelByString(request.channel);
         mpeg->SetDesiredProgram(request.progNum);
     }
@@ -3446,8 +3447,7 @@ void TVRec::TuningFrequency(const Tuning
         {
             if (request.flags & kFlagEITScan)
             {
-                GetDTVSignalMonitor()->GetStreamData()->
-                    SetVideoStreamsRequired(0);
+                GetMPEGStreamData()->SetVideoStreamsRequired(0);
             }
 
             SetFlags(kFlagSignalMonitorRunning);
@@ -3477,17 +3477,14 @@ void TVRec::TuningFrequency(const Tuning
  *
  *  \return MPEGStreamData pointer if we have a complete lock, NULL otherwise
  */
-MPEGStreamData *TVRec::TuningSignalCheck(void)
+bool TVRec::TuningSignalCheck(void)
 {
     if (!signalMonitor->IsAllGood())
         return NULL;
 
     VERBOSE(VB_RECORD, LOC + "Got good signal");
 
-    // grab useful data from DTV signal monitor before we kill it...
-    MPEGStreamData *streamData = NULL;
-    if (GetDTVSignalMonitor())
-        streamData = GetDTVSignalMonitor()->GetStreamData();
+    MPEGStreamData *streamData = GetMPEGStreamData();
 
     if (!HasFlags(kFlagEITScannerRunning))
     {
@@ -3505,7 +3502,7 @@ MPEGStreamData *TVRec::TuningSignalCheck
         scanner->StartPassiveScan(channel, streamData, eitIgnoresSource);
     }
 
-    return streamData;
+    return true;
 }
 
 static int init_jobs(const ProgramInfo *rec, RecordingProfile &profile,
@@ -4040,3 +4037,33 @@ QString TuningRequest::toString(void) co
         .arg((program != 0) ? "yes" : "no").arg(channel).arg(input)
         .arg(TVRec::FlagToString(flags));
 }
+
+
+void TVRec::SetMPEGStreamData(MPEGStreamData *sd)
+{
+    if (streamData == sd)
+        return;
+
+    if (streamData)
+    {
+        VERBOSE(VB_IMPORTANT, LOC + "Deleting streamData");
+        delete streamData;
+    }
+
+    streamData = sd;
+}
+
+MPEGStreamData *TVRec::GetMPEGStreamData(void)
+{
+    return streamData;
+}
+
+ATSCStreamData *TVRec::GetATSCStreamData(void)
+{
+    return dynamic_cast<ATSCStreamData*>(streamData);
+}
+
+DVBStreamData  *TVRec::GetDVBStreamData(void)
+{
+    return dynamic_cast<DVBStreamData*>(streamData);
+}
Index: mythtv-eit/libs/libmythtv/tv_rec.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/tv_rec.h
+++ mythtv-eit/libs/libmythtv/tv_rec.h
@@ -40,6 +40,8 @@ class DVBChannel;
 class Channel;
 
 class MPEGStreamData;
+class ATSCStreamData;
+class DVBStreamData;
 class ProgramMapTable;
 
 /// Used to request ProgramInfo for channel browsing.
@@ -290,6 +292,11 @@ class TVRec : public QObject
     void TeardownSignalMonitor(void);
     DTVSignalMonitor *GetDTVSignalMonitor(void);
 
+    void SetMPEGStreamData(MPEGStreamData *sd);
+    MPEGStreamData *GetMPEGStreamData(void);
+    ATSCStreamData *GetATSCStreamData(void);
+    DVBStreamData  *GetDVBStreamData(void);
+
     bool HasFlags(uint f) const { return (stateFlags & f) == f; }
     void SetFlags(uint f);
     void ClearFlags(uint f);
@@ -298,7 +305,7 @@ class TVRec : public QObject
     void HandleTuning(void);
     void TuningShutdowns(const TuningRequest&);
     void TuningFrequency(const TuningRequest&);
-    MPEGStreamData *TuningSignalCheck(void);
+    bool TuningSignalCheck(void);
 
     void TuningNewRecorder(MPEGStreamData*);
     void TuningRestartRecorder(void);
@@ -333,6 +340,7 @@ class TVRec : public QObject
     ChannelBase      *channel;
     SignalMonitor    *signalMonitor;
     EITScanner       *scanner;
+    MPEGStreamData   *streamData;
 
     // Various threads
     /// Event processing thread, runs RunTV().
Index: mythtv-eit/libs/libmythtv/dtvsignalmonitor.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/dtvsignalmonitor.h
+++ mythtv-eit/libs/libmythtv/dtvsignalmonitor.h
@@ -55,6 +55,7 @@ class DTVSignalMonitor : public SignalMo
     /// and connects the table signals to the monitor.
     void SetStreamData(MPEGStreamData* data);
 
+  protected:
     /// Returns the MPEG stream data if it exists
     MPEGStreamData *GetStreamData()      { return stream_data; }
     /// Returns the ATSC stream data if it exists
@@ -73,6 +74,7 @@ class DTVSignalMonitor : public SignalMo
     /// Returns the scan stream data if it exists
     const ScanStreamData *GetScanStreamData() const;
 
+  public:
     bool IsAllGood(void) const;
 
     bool WaitForLock(int timeout=-1);
Index: mythtv-eit/libs/libmythtv/dtvrecorder.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/dtvrecorder.h
+++ mythtv-eit/libs/libmythtv/dtvrecorder.h
@@ -40,11 +40,12 @@ class DTVRecorder: public RecorderBase
 
     virtual void SetNextRecording(const ProgramInfo*, RingBuffer*);
     virtual void SetStreamData(MPEGStreamData*) {}
-    virtual MPEGStreamData *GetStreamData(void) { return NULL; }
 
     virtual void Reset();
 
   protected:
+    virtual MPEGStreamData *GetStreamData(void) { return NULL; }
+
     void FinishRecording(void);
     void ResetForNewFile(void);
 
Index: mythtv-eit/libs/libmythtv/dvbrecorder.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/dvbrecorder.h
+++ mythtv-eit/libs/libmythtv/dvbrecorder.h
@@ -80,9 +80,10 @@ class DVBRecorder : public DTVRecorder,
     void HandlePMT(uint pid, const ProgramMapTable*);
 
     void SetStreamData(MPEGStreamData*);
-    MPEGStreamData* GetStreamData(void) { return _stream_data; }
 
   private:
+    MPEGStreamData* GetStreamData(void) { return _stream_data; }
+
     void TeardownAll(void);
 
     uint ProcessDataTS(unsigned char *buffer, uint len);
Index: mythtv-eit/libs/libmythtv/hdhrrecorder.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/hdhrrecorder.h
+++ mythtv-eit/libs/libmythtv/hdhrrecorder.h
@@ -36,8 +36,6 @@ class HDHRRecorder : public DTVRecorder,
     void StartRecording(void);
 
     void SetStreamData(MPEGStreamData*);
-    MPEGStreamData *GetStreamData(void);
-    ATSCStreamData *GetATSCStreamData(void) { return _atsc_stream_data; }
 
     // MPEG Single Program
     void HandleSingleProgramPAT(ProgramAssociationTable *pat);
@@ -49,6 +47,9 @@ class HDHRRecorder : public DTVRecorder,
     void HandleVCT(uint, const VirtualChannelTable*) {}
 
   private:
+    MPEGStreamData *GetStreamData(void);
+    ATSCStreamData *GetATSCStreamData(void) { return _atsc_stream_data; }
+
     void AdjustEITPIDs(void);
     void ProcessTSData(const unsigned char *buffer, int len);
     bool ProcessTSPacket(const TSPacket& tspacket);
Index: mythtv-eit/libs/libmythtv/hdtvrecorder.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/hdtvrecorder.h
+++ mythtv-eit/libs/libmythtv/hdtvrecorder.h
@@ -53,8 +53,6 @@ class HDTVRecorder : public DTVRecorder,
     bool Open(void);
 
     void SetStreamData(MPEGStreamData*);
-    MPEGStreamData* GetStreamData(void);
-    ATSCStreamData* GetATSCStreamData(void) { return _atsc_stream_data; }
 
     void HandleSingleProgramPAT(ProgramAssociationTable*);
     void HandleSingleProgramPMT(ProgramMapTable*);
@@ -64,6 +62,9 @@ class HDTVRecorder : public DTVRecorder,
     void HandleVCT(uint, const VirtualChannelTable*);
 
   private:
+    MPEGStreamData* GetStreamData(void);
+    ATSCStreamData* GetATSCStreamData(void) { return _atsc_stream_data; }
+
     void TeardownAll(void);
 
     int  ProcessData    (const unsigned char *buffer, uint len);
Index: mythtv-eit/libs/libmythtv/dvbrecorder.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/dvbrecorder.cpp
+++ mythtv-eit/libs/libmythtv/dvbrecorder.cpp
@@ -151,6 +151,8 @@ void DVBRecorder::TeardownAll(void)
         delete _input_pmt;
         _input_pmt = NULL;
     }
+
+    SetStreamData(NULL);
 }
 
 void DVBRecorder::SetOption(const QString &name, int value)
@@ -274,10 +276,12 @@ void DVBRecorder::SetStreamData(MPEGStre
     if (data == _stream_data)
         return;
 
-    MPEGStreamData *old_data = _stream_data;
+    if (_stream_data)
+    {
+        _stream_data->RemoveMPEGListener(this);
+    }
+
     _stream_data = data;
-    if (old_data)
-        delete old_data;
 
     if (data)
     {
Index: mythtv-eit/libs/libmythtv/hdhrrecorder.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/hdhrrecorder.cpp
+++ mythtv-eit/libs/libmythtv/hdhrrecorder.cpp
@@ -49,11 +49,9 @@ void HDHRRecorder::TeardownAll(void)
 {
     StopRecording();
     Close();
-    if (_atsc_stream_data)
-    {
-        delete _atsc_stream_data;
-        _atsc_stream_data = NULL;
-    }
+
+    SetStreamData(NULL);
+
 }
 
 void HDHRRecorder::SetOptionsFromProfile(RecordingProfile *profile,
@@ -144,10 +142,13 @@ void HDHRRecorder::SetStreamData(MPEGStr
     if (data == _atsc_stream_data)
         return;
 
-    ATSCStreamData *old_data = _atsc_stream_data;
+    if (_atsc_stream_data)
+    {
+        _atsc_stream_data->RemoveMPEGSPListener(this);
+        _atsc_stream_data->RemoveATSCMainListener(this);
+    }
+
     _atsc_stream_data = data;
-    if (old_data)
-        delete old_data;
 
     if (data)
     {
Index: mythtv-eit/libs/libmythtv/hdtvrecorder.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/hdtvrecorder.cpp
+++ mythtv-eit/libs/libmythtv/hdtvrecorder.cpp
@@ -114,7 +114,9 @@ HDTVRecorder::HDTVRecorder(TVRec *rec)
       _atsc_stream_data(NULL),
       _resync_count(0)
 {
-    SetStreamData(new ATSCStreamData(-1, DEFAULT_SUBCHANNEL));
+    // XXX: Is this necessary?
+    // If yes how should we handle it when TVRec owns the StreamData
+    //SetStreamData(new ATSCStreamData(-1, DEFAULT_SUBCHANNEL));
 
     _buffer_size = TSPacket::SIZE * 1500;
     if ((_buffer = new unsigned char[_buffer_size])) {
@@ -210,10 +212,13 @@ void HDTVRecorder::SetStreamData(MPEGStr
     if (data == _atsc_stream_data)
         return;
 
-    ATSCStreamData *old_data = _atsc_stream_data;
+    if (_atsc_stream_data)
+    {
+        _atsc_stream_data->RemoveMPEGSPListener(this);
+        _atsc_stream_data->RemoveATSCMainListener(this);
+    }
+
     _atsc_stream_data = data;
-    if (old_data)
-        delete old_data;
 
     if (data)
     {
Index: mythtv-eit/libs/libmythtv/siscan.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/siscan.cpp
+++ mythtv-eit/libs/libmythtv/siscan.cpp
@@ -98,6 +98,7 @@ SIScan::SIScan(QString _cardtype, Channe
     : // Set in constructor
       channel(_channel),
       signalMonitor(SignalMonitor::Init(_cardtype, -1, _channel)),
+      scanStreamData(new ScanStreamData()),
       sourceID(_sourceID),
       scanMode(IDLE),
       signalTimeout(signal_timeout),
@@ -121,20 +122,19 @@ SIScan::SIScan(QString _cardtype, Channe
     init_freq_tables();
     current = scanTransports.end();
 
-    // Create a stream data for digital signal monitors
+    // Setup a stream data for digital signal monitors
     DTVSignalMonitor* dtvSigMon = GetDTVSignalMonitor();
     if (dtvSigMon)
     {
         VERBOSE(VB_SIPARSER, LOC + "Connecting up DTVSignalMonitor");
-        ScanStreamData *data = new ScanStreamData();
 
-        dtvSigMon->SetStreamData(data);
+        dtvSigMon->SetStreamData(GetScanStreamData());
         dtvSigMon->AddFlags(kDTVSigMon_WaitForMGT | kDTVSigMon_WaitForVCT |
                             kDTVSigMon_WaitForNIT | kDTVSigMon_WaitForSDT);
 
-        data->AddMPEGListener(this);
-        data->AddATSCMainListener(this);
-        data->AddDVBMainListener(this);
+        GetScanStreamData()->AddMPEGListener(this);
+        GetScanStreamData()->AddATSCMainListener(this);
+        GetScanStreamData()->AddDVBMainListener(this);
     }
 }
 
@@ -144,6 +144,8 @@ SIScan::~SIScan(void)
     VERBOSE(VB_SIPARSER, LOC + "SIScanner Stopped");
     if (signalMonitor)
         delete signalMonitor;
+
+    GetScanStreamData()->RemoveMPEGListener(this);
 }
 
 /** \fn SIScan::ScanServicesSourceID(int)
@@ -221,7 +223,7 @@ void SIScan::HandlePAT(const ProgramAsso
             .arg((*current).FriendlyName));
 
     // Add pmts to list, so we can do MPEG scan properly.
-    ScanStreamData *sd = GetDTVSignalMonitor()->GetScanStreamData();
+    ScanStreamData *sd = GetScanStreamData();
     for (uint i = 0; i < pat->ProgramCount(); i++)
     {
         if (pat->ProgramPID(i)) // don't add NIT "program", MPEG/ATSC safe.
@@ -234,7 +236,7 @@ void SIScan::HandleVCT(uint, const Virtu
     VERBOSE(VB_SIPARSER, LOC + QString("Got a Virtual Channel Table for %1")
             .arg((*current).FriendlyName));
 
-    HandleATSCDBInsertion(GetDTVSignalMonitor()->GetScanStreamData(), true);
+    HandleATSCDBInsertion(GetScanStreamData(), true);
 }
 
 void SIScan::HandleMGT(const MasterGuideTable*)
@@ -242,7 +244,7 @@ void SIScan::HandleMGT(const MasterGuide
     VERBOSE(VB_SIPARSER, LOC + QString("Got the Master Guide for %1")
             .arg((*current).FriendlyName));
 
-    HandleATSCDBInsertion(GetDTVSignalMonitor()->GetScanStreamData(), true);
+    HandleATSCDBInsertion(GetScanStreamData(), true);
 }
 
 void SIScan::HandleSDT(uint, const ServiceDescriptionTable* sdt)
@@ -252,7 +254,7 @@ void SIScan::HandleSDT(uint, const Servi
             .arg((*current).FriendlyName));
     VERBOSE(VB_SIPARSER, LOC + sdt->toString());
 
-    HandleDVBDBInsertion(GetDTVSignalMonitor()->GetScanStreamData(), true);
+    HandleDVBDBInsertion(GetScanStreamData(), true);
 }
 
 void SIScan::HandleNIT(const NetworkInformationTable *nit)
@@ -296,7 +298,7 @@ void SIScan::HandleNIT(const NetworkInfo
         }
     }
 
-    const ScanStreamData *sd = GetDTVSignalMonitor()->GetScanStreamData();
+    const ScanStreamData *sd = GetScanStreamData();
     const DVBStreamData &dsd = *sd;
     if (dsd.HasAllNITSections())
     {
@@ -304,7 +306,7 @@ void SIScan::HandleNIT(const NetworkInfo
         emit TransportScanComplete();
     }
 
-    HandleDVBDBInsertion(GetDTVSignalMonitor()->GetScanStreamData(), true);
+    HandleDVBDBInsertion(GetScanStreamData(), true);
 }
 
 void SIScan::HandleMPEGDBInsertion(const ScanStreamData *sd, bool)
@@ -414,7 +416,7 @@ bool SIScan::HandlePostInsertion(void)
     if (!dtvSigMon)
         return false;
 
-    const ScanStreamData *sd = dtvSigMon->GetScanStreamData();
+    const ScanStreamData *sd = GetScanStreamData();
 
     VERBOSE(VB_SIPARSER, LOC + "HandlePostInsertion() " +
             QString("pat(%1)").arg(sd->HasCachedAnyPAT()));
@@ -697,9 +699,9 @@ void SIScan::ScanTransport(const transpo
     }
 
     // If we have a DTV Signal Monitor, perform table scanner reset
-    if (GetDTVSignalMonitor() && GetDTVSignalMonitor()->GetScanStreamData())
+    if (GetDTVSignalMonitor() && GetScanStreamData())
     {
-        GetDTVSignalMonitor()->GetScanStreamData()->Reset();
+        GetScanStreamData()->Reset();
         GetDTVSignalMonitor()->SetChannel(-1,-1);
     }
 
Index: mythtv-eit/libs/libmythtv/siscan.h
===================================================================
--- mythtv-eit.orig/libs/libmythtv/siscan.h
+++ mythtv-eit/libs/libmythtv/siscan.h
@@ -145,10 +145,13 @@ class SIScan : public QObject,
 
     static QString loc(const SIScan*);
 
+    ScanStreamData *GetScanStreamData(void) { return scanStreamData; }
+
   private:
     // Set in constructor
     ChannelBase      *channel;
     SignalMonitor    *signalMonitor;
+    ScanStreamData   *scanStreamData;
     int               sourceID;
     SCANMODE          scanMode;
     uint              signalTimeout;
Index: mythtv-eit/libs/libmythtv/firewirerecorderbase.cpp
===================================================================
--- mythtv-eit.orig/libs/libmythtv/firewirerecorderbase.cpp
+++ mythtv-eit/libs/libmythtv/firewirerecorderbase.cpp
@@ -19,7 +19,9 @@ const int FirewireRecorderBase::kTimeout
 FirewireRecorderBase::FirewireRecorderBase(TVRec *rec)
     : DTVRecorder(rec), _mpeg_stream_data(NULL)
 {
-    SetStreamData(new MPEGStreamData(1, true));
+    // XXX: Is this necessary?
+    // If yes how should we handle it when TVRec owns the StreamData
+    //SetStreamData(new MPEGStreamData(1, true));
 }
 
 FirewireRecorderBase::~FirewireRecorderBase()
@@ -131,14 +133,13 @@ void FirewireRecorderBase::SetStreamData
     if (data == _mpeg_stream_data)
         return;
 
-    MPEGStreamData *old_data = _mpeg_stream_data;
+    if (_mpeg_stream_data)
+        _mpeg_stream_data->RemoveMPEGSPListener(this);
+
     _mpeg_stream_data = data;
 
     if (data)
         data->AddMPEGSPListener(this);
-
-    if (old_data)
-        delete old_data;
 }
 
 void FirewireRecorderBase::HandleSingleProgramPAT(
