Index: libs/libmythtv/hdhrsignalmonitor.cpp
===================================================================
--- libs/libmythtv/hdhrsignalmonitor.cpp	(revision 13272)
+++ libs/libmythtv/hdhrsignalmonitor.cpp	(working copy)
@@ -98,8 +98,6 @@
     if (!GetStreamData())
         return false;
 
-    UpdateListeningForEIT();
-
     const QMap<uint, bool> &listening = GetStreamData()->ListeningPIDs();
 
     // PIDs that need to be added..
Index: libs/libmythtv/hdhrchannel.cpp
===================================================================
--- libs/libmythtv/hdhrchannel.cpp	(revision 13272)
+++ libs/libmythtv/hdhrchannel.cpp	(working copy)
@@ -87,7 +87,9 @@
 
 bool HDHRChannel::EnterPowerSavingMode(void)
 {
+#if 0
     return QString::null != TunerSet("channel", "none", false);
+#endif
 }
 
 bool HDHRChannel::FindDevice(void)
@@ -275,8 +277,7 @@
     if (!inputName.isEmpty())
         return SwitchToInput(inputName, channum);
 
-    ClearDTVInfo();
-    _ignore_filters = false;
+    SetCachedATSCInfo("");
 
     InputMap::const_iterator it = inputs.find(currentInputID);
     if (it == inputs.end())
@@ -331,19 +332,16 @@
     curchannelname = QDeepCopy<QString>(channum);
 
     // Set the major and minor channel for any additional multiplex tuning
-    SetDTVInfo(atsc_major, atsc_minor, netid, tsid, mpeg_prog_num);
+    if (atsc_major || atsc_minor)
+        SetCachedATSCInfo(QString("%1_%2").arg(atsc_major).arg(atsc_minor));
+    else if (mpeg_prog_num >= 0)
+        SetCachedATSCInfo(QString("0-%1").arg(mpeg_prog_num));
+    else
+        SetCachedATSCInfo(QString("%1_0").arg(channum));
 
     // Set this as the future start channel for this source
-    inputs[currentInputID]->startChanNum = QDeepCopy<QString>(curchannelname);
+    inputs[currentInputID]->startChanNum = curchannelname;
 
-    // Turn on the HDHomeRun program filtering if it is supported
-    // and we are tuning to an MPEG program number.
-    if (mpeg_prog_num && (GetTuningMode() == "mpeg"))
-    {
-        QString pnum = QString::number(mpeg_prog_num);
-        _ignore_filters = QString::null != TunerSet("program", pnum, false);
-    }
-
     return true;
 }
 
@@ -529,9 +527,6 @@
     vector<uint> range_min;
     vector<uint> range_max;
 
-    if (_ignore_filters)
-        return true;
-
     for (uint i = 0; i < _pids.size(); i++)
     {
         uint pid_min = _pids[i];
Index: libs/libmythtv/dvbchannel.h
===================================================================
--- libs/libmythtv/dvbchannel.h	(revision 13272)
+++ libs/libmythtv/dvbchannel.h	(working copy)
@@ -72,6 +72,8 @@
 
   private:
     int  GetChanID(void) const;
+    bool InitChannelParams(DTVMultiplex &t,
+                           uint sourceid, const QString &channum);
 
     void CheckOptions(DTVMultiplex &t) const;
     bool CheckModulation(DTVModulation modulation) const;
Index: libs/libmythtv/dtvchannel.h
===================================================================
--- libs/libmythtv/dtvchannel.h	(revision 13272)
+++ libs/libmythtv/dtvchannel.h	(working copy)
@@ -100,6 +100,7 @@
                     uint dvb_orig_netid,
                     uint mpeg_tsid, int mpeg_pnum);
     void ClearDTVInfo(void) { SetDTVInfo(0, 0, 0, 0, -1); }
+    void SetCachedATSCInfo(const QString &chan);
 
     static void GetCachedPids(int chanid, pid_cache_t&);
     static void SaveCachedPids(int chanid, const pid_cache_t&);
Index: libs/libmythtv/dvbchannel.cpp
===================================================================
--- libs/libmythtv/dvbchannel.cpp	(revision 13272)
+++ libs/libmythtv/dvbchannel.cpp	(working copy)
@@ -238,13 +238,11 @@
     QString loc_err = LOC_ERR + tmp;
 
     VERBOSE(VB_CHANNEL, loc);
-
     if (fd_frontend < 0)
     {
         VERBOSE(VB_IMPORTANT, loc_err + "Channel object "
                 "will not open, can not change channels.");
 
-        ClearDTVInfo();
         return false;
     }
 
@@ -254,8 +252,6 @@
         return true;
     }
 
-    ClearDTVInfo();
-
     QString inputName;
     if (!CheckChannel(channum, inputName))
     {
@@ -276,46 +272,22 @@
     if (it == inputs.end())
         return false;
 
-    // Get the input data for the channel
-    QString tvformat, modulation, freqtable, freqid, si_std;
-    int finetune;
-    uint64_t frequency;
-    int mpeg_prog_num;
-    uint atsc_major, atsc_minor, mplexid, tsid, netid;
-
-    if (!ChannelUtil::GetChannelData(
-        (*it)->sourceid, channum,
-        tvformat, modulation, freqtable, freqid,
-        finetune, frequency,
-        si_std, mpeg_prog_num, atsc_major, atsc_minor, tsid, netid,
-        mplexid, commfree))
-    {
-        VERBOSE(VB_IMPORTANT, loc_err +
-                "Unable to find channel in database.");
-
-        return false;
-    }
-
-    // Initialize basic the tuning parameters
+    // Initialize all the tuning parameters
     DTVMultiplex tuning;
-    if (!mplexid || !tuning.FillFromDB(card_type, mplexid))
+    if (!InitChannelParams(tuning, (*it)->sourceid, channum))
     {
         VERBOSE(VB_IMPORTANT, loc_err +
-                "Failed to initialize multiplex options");
+                "Failed to initialize channel options");
 
         return false;
     }
 
-    SetDTVInfo(atsc_major, atsc_minor, netid, tsid, mpeg_prog_num);
-
-    // Try to fix any problems with the multiplex
     CheckOptions(tuning);
 
     if (!Tune(tuning, ""))
     {
         VERBOSE(VB_IMPORTANT, loc_err + "Tuning to frequency.");
 
-        ClearDTVInfo();
         return false;
     }
 
@@ -360,6 +332,42 @@
     return SetChannelByString((*it)->startChanNum);
 }
 
+/** \fn DVBChannel::InitChannelParams(DTVMultiplex&,uint,const QString&)
+ *  \brief Initializes all variables pertaining to a channel.
+ *
+ *  \return true on success and false on failure
+ */
+bool DVBChannel::InitChannelParams(DTVMultiplex  &tuning,
+                                   uint           sourceid,
+                                   const QString &channum)
+{
+    QString tvformat, modulation, freqtable, freqid, si_std;
+    int finetune;
+    uint64_t frequency;
+    uint mplexid;
+
+    if (!ChannelUtil::GetChannelData(
+            sourceid,   channum,
+            tvformat,   modulation,   freqtable,   freqid,
+            finetune,   frequency,
+            si_std,                   currentProgramNum,
+            currentATSCMajorChannel,  currentATSCMinorChannel,
+            currentTransportID,       currentOriginalNetworkID,
+            mplexid,    commfree))
+    {
+        return false;
+    }
+
+    if (currentATSCMinorChannel)
+        currentProgramNum = -1;
+
+    if (mplexid)
+        return tuning.FillFromDB(card_type, mplexid);
+
+    VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to find channel in database.");
+    return false;
+}
+
 /** \fn DVBChannel::CheckOptions(DTVMultiplex&) const
  *  \brief Checks tuning for problems, and tries to fix them.
  */
Index: libs/libmythtv/tv_rec.cpp
===================================================================
--- libs/libmythtv/tv_rec.cpp	(revision 13272)
+++ libs/libmythtv/tv_rec.cpp	(working copy)
@@ -765,8 +765,7 @@
     changeState = false;
 
     eitScanStartTime = QDateTime::currentDateTime();    
-    if ((internalState == kState_None) &&
-        CardUtil::IsEITCapable(genOpt.cardtype))
+    if ((internalState == kState_None) && (genOpt.cardtype == "DVB"))
     {
         // Add some randomness to avoid all cards starting
         // EIT scanning at nearly the same time.
@@ -981,11 +980,8 @@
     MythEvent me("RECORDING_LIST_CHANGE");
     gContext->dispatch(me);
     pauseNotify = true;
+}    
 
-    if (GetDTVChannel())
-        GetDTVChannel()->EnterPowerSavingMode();
-}
-
 DVBRecorder *TVRec::GetDVBRecorder(void)
 {
 #ifdef USING_DVB
@@ -1057,9 +1053,6 @@
         }
         VERBOSE(VB_IMPORTANT, LOC_ERR + msg1 + "\n\t\t\t" + msg2);
     }
-
-    if (GetDTVChannel())
-        GetDTVChannel()->EnterPowerSavingMode();
 }
 
 void TVRec::CloseChannel(void)
@@ -1656,25 +1649,12 @@
         sd->SetCaching(true);
     }
 
-    uint neededVideo = 0;
-    uint neededAudio = 0;
+    QString sistandard = dtvchan->GetSIStandard();
 
-    ProgramInfo *rec = lastTuningRequest.program;
-    RecordingProfile profile;
-    load_profile(genOpt.cardtype, tvchain, rec, profile);
-    const Setting *setting = profile.byName("recordingtype");
-    if (setting)
-    {
-        neededVideo = (setting->getValue() == "tv") ? 1 : 0;
-        neededAudio = (setting->getValue() == "audio") ? 1 : 0;
-    }
-
-    const QString tuningmode = dtvchan->GetTuningMode();
-
     // Check if this is an ATSC Channel
     int major = dtvchan->GetMajorChannel();
     int minor = dtvchan->GetMinorChannel();
-    if ((minor > 0) && (tuningmode == "atsc"))
+    if ((minor > 0) && (sistandard == "atsc"))
     {
         QString msg = QString("ATSC channel: %1_%2").arg(major).arg(minor);
         VERBOSE(VB_RECORD, LOC + msg);
@@ -1691,8 +1671,7 @@
         asd->Reset(major, minor);
         sm->SetStreamData(sd);
         sm->SetChannel(major, minor);
-        sd->SetVideoStreamsRequired(neededVideo);
-        sd->SetAudioStreamsRequired(neededAudio);
+        sd->SetVideoStreamsRequired(1);
 
         // Try to get pid of VCT from cache and
         // require MGT if we don't have VCT pid.
@@ -1706,11 +1685,14 @@
     // Check if this is an DVB channel
     int progNum = dtvchan->GetProgramNumber();
 #ifdef USING_DVB
-    if ((progNum >= 0) && (tuningmode == "dvb"))
+    if ((progNum >= 0) && (sistandard == "dvb"))
     {
         int netid   = dtvchan->GetOriginalNetworkID();
         int tsid    = dtvchan->GetTransportID();
 
+        uint neededVideo = 0;
+        uint neededAudio = 0;
+
         DVBStreamData *dsd = dynamic_cast<DVBStreamData*>(sd);
         if (!dsd)
         {
@@ -1720,6 +1702,16 @@
                 GetDTVRecorder()->SetStreamData(dsd);
         }
 
+        ProgramInfo *rec = lastTuningRequest.program;
+        RecordingProfile profile;
+        load_profile(genOpt.cardtype, tvchain, rec, profile);
+        const Setting *setting = profile.byName("recordingtype");
+        if (setting)
+        {
+            neededVideo = (setting->getValue() == "tv") ? 1 : 0;
+            neededAudio = (setting->getValue() == "audio") ? 1 : 0;
+        }
+
         VERBOSE(VB_RECORD, LOC +
                 QString("DVB service_id %1 on net_id %2 tsid %3")
                 .arg(progNum).arg(netid).arg(tsid));
@@ -1771,9 +1763,7 @@
         sd->Reset(progNum);
         sm->SetStreamData(sd);
         sm->SetProgramNumber(progNum);
-        sd->SetVideoStreamsRequired(neededVideo);
-        sd->SetAudioStreamsRequired(neededAudio);
-
+        sd->SetVideoStreamsRequired(1);
         sm->AddFlags(SignalMonitor::kDTVSigMon_WaitForPAT |
                      SignalMonitor::kDTVSigMon_WaitForPMT |
                      SignalMonitor::kDVBSigMon_WaitForPos);
@@ -1784,7 +1774,7 @@
     }
 
     QString msg = "No valid DTV info, ATSC maj(%1) min(%2), MPEG pn(%3)";
-    VERBOSE(VB_IMPORTANT, LOC_ERR + msg.arg(major).arg(minor).arg(progNum));
+    VERBOSE(VB_RECORD, LOC_ERR + msg.arg(major).arg(minor).arg(progNum));
     return false;
 }
 
@@ -2312,10 +2302,12 @@
     long long bitrate;
     if (genOpt.cardtype == "MPEG")
         bitrate = 10080000LL; // use DVD max bit rate
-    else if (genOpt.cardtype == "DBOX2")
-        bitrate = 10080000LL; // use DVD max bit rate
-    else if (!CardUtil::IsEncoder(genOpt.cardtype))
+    else if (genOpt.cardtype == "HDTV")
         bitrate = 19400000LL; // 1080i
+    else if (genOpt.cardtype == "FIREWIRE")
+        bitrate = 19400000LL; // 1080i
+    else if (genOpt.cardtype == "DVB")
+        bitrate = 19400000LL; // 1080i
     else // frame grabber
         bitrate = 10080000LL; // use DVD max bit rate, probably too big
 
@@ -3390,38 +3382,19 @@
  */
 void TVRec::TuningFrequency(const TuningRequest &request)
 {
-    DTVChannel *dtvchan = GetDTVChannel();
-    if (dtvchan)
+    if (request.minorChan)
     {
-        MPEGStreamData *mpeg = NULL;
-
-        if (GetDTVRecorder())
-            mpeg = GetDTVRecorder()->GetStreamData();
-
-        const QString tuningmode = (HasFlags(kFlagEITScannerRunning)) ?
-            dtvchan->GetSIStandard() :
-            dtvchan->GetSuggestedTuningMode(
-                kState_WatchingLiveTV == internalState);
-
-        dtvchan->SetTuningMode(tuningmode);
-
-        if (request.minorChan && (tuningmode == "atsc"))
-        {
-            channel->SetChannelByString(request.channel);
-
-            ATSCStreamData *atsc = dynamic_cast<ATSCStreamData*>(mpeg);
-            if (atsc)
-                atsc->SetDesiredChannel(request.majorChan, request.minorChan);
-        }
-        else if (request.progNum >= 0)
-        {
-            channel->SetChannelByString(request.channel);
-
-            if (mpeg)
-                mpeg->SetDesiredProgram(request.progNum);
-        }
+        MPEGStreamData *mpeg = GetDTVRecorder()->GetStreamData();
+        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();
+        channel->SetChannelByString(request.channel);
+        mpeg->SetDesiredProgram(request.progNum);
+    }
     if (request.IsOnSameMultiplex())
     {
         QStringList slist;
Index: libs/libmythtv/channel.cpp
===================================================================
--- libs/libmythtv/channel.cpp	(revision 13272)
+++ libs/libmythtv/channel.cpp	(working copy)
@@ -441,7 +441,7 @@
     if (!inputName.isEmpty())
         return ChannelBase::SwitchToInput(inputName, channum);
 
-    ClearDTVInfo();
+    SetCachedATSCInfo("");
 
     InputMap::const_iterator it = inputs.find(currentInputID);
     if (it == inputs.end())
@@ -516,10 +516,13 @@
     InitPictureAttributes();
 
     // Set the major and minor channel for any additional multiplex tuning
-    SetDTVInfo(atsc_major, atsc_minor, netid, tsid, mpeg_prog_num);
+    if (atsc_major || atsc_minor)
+        SetCachedATSCInfo(QString("%1_%2").arg(atsc_major).arg(atsc_minor));
+    else
+        SetCachedATSCInfo(QString("%1_0").arg(channum));
 
     // Set this as the future start channel for this source
-    inputs[currentInputID]->startChanNum = QDeepCopy<QString>(curchannelname);
+    inputs[currentInputID]->startChanNum = curchannelname;
 
     return true;
 }
Index: libs/libmythtv/dtvchannel.cpp
===================================================================
--- libs/libmythtv/dtvchannel.cpp	(revision 13272)
+++ libs/libmythtv/dtvchannel.cpp	(working copy)
@@ -142,3 +142,55 @@
     QMutexLocker locker(&dtvinfo_lock);
     tuningMode = QDeepCopy<QString>(tuning_mode.lower());
 }
+
+void DTVChannel::SetCachedATSCInfo(const QString &chan)
+{
+    int progsep = chan.find("-");
+    int chansep = chan.find("_");
+
+    currentProgramNum        = -1;
+    currentOriginalNetworkID = 0;
+    currentTransportID       = 0;
+    currentATSCMajorChannel  = 0;
+    currentATSCMinorChannel  = 0;
+
+    if (progsep >= 0)
+    {
+        currentProgramNum = chan.right(chan.length() - progsep - 1).toInt();
+        currentATSCMajorChannel = chan.left(progsep).toInt();
+    }
+    else if (chansep >= 0)
+    {
+        currentATSCMinorChannel =
+            chan.right(chan.length() - chansep - 1).toInt();
+        currentATSCMajorChannel = chan.left(chansep).toInt();
+    }
+    else
+    {
+        bool ok;
+        int chanNum = chan.toInt(&ok);
+        if (ok && chanNum >= 10)
+        {
+            currentATSCMinorChannel = chanNum % 10;
+            currentATSCMajorChannel = chanNum / 10;
+        }
+    }
+
+    if (currentATSCMinorChannel > 0)
+    {
+        VERBOSE(VB_CHANNEL, LOC +
+                QString("SetCachedATSCInfo(%2): %3_%4").arg(chan)
+                .arg(currentATSCMajorChannel).arg(currentATSCMinorChannel));
+    }
+    else if ((0 == currentATSCMajorChannel) && (0 == currentProgramNum))
+    {
+        VERBOSE(VB_CHANNEL, LOC +
+                QString("SetCachedATSCInfo(%2): RESET").arg(chan));
+    }
+    else
+    {
+        VERBOSE(VB_CHANNEL, LOC +
+                QString("SetCachedATSCInfo(%2): %3-%4").arg(chan)
+                .arg(currentATSCMajorChannel).arg(currentProgramNum));
+    }
+}
