Index: libs/libmythtv/cardutil.h
===================================================================
--- libs/libmythtv/cardutil.h	(revision 8994)
+++ libs/libmythtv/cardutil.h	(working copy)
@@ -70,6 +70,8 @@
 
     static int          GetCardID(const QString &videodevice,
                                   QString hostname = QString::null);
+    static uint         GetChildCardID(uint cardid);
+    static uint         GetParentCardID(uint cardid);
 
     static bool         IsCardTypePresent(const QString &strType);
 
@@ -81,6 +83,7 @@
     static bool         GetVideoDevice(uint cardid, QString& device,
                                        QString& vbi);
     static QString      GetVideoDevice(uint cardid);
+    static QString      GetVideoDevice(uint cardid, uint sourceid);
 
     static QString      GetDefaultInput(uint cardid);
     static QString      GetInputName(uint cardid, uint sourceid);
@@ -96,7 +99,8 @@
                                       QString             device,
                                       QString             cardtype,
                                       QStringList        &inputLabels,
-                                      vector<CardInput*> &cardInputs);
+                                      vector<CardInput*> &cardInputs,
+                                      int                 parentid = 0);
     // DTV info
     static bool         GetTimeouts(uint cardid,
                                     uint &signal_timeout,
@@ -119,6 +123,7 @@
   private:
     static QStringList  probeV4LInputs(QString device);
     static QStringList  probeDVBInputs(QString device, int diseqctype = -1);
+    static QStringList  probeChildInputs(QString device);
 
     static QStringList  fillDVBInputs(int dvb_diseqc_type);
     static DiSEqCList   fillDVBInputsDiSEqC(int dvb_diseqc_type);
Index: libs/libmythtv/videosource.h
===================================================================
--- libs/libmythtv/videosource.h	(revision 8994)
+++ libs/libmythtv/videosource.h	(working copy)
@@ -262,6 +262,7 @@
     DVBCardType        *cardtype;
     SignalTimeout      *signal_timeout;
     ChannelTimeout     *channel_timeout;
+    TransButtonSetting *buttonAnalog;
 };
 
 class CaptureCardGroup: public VerticalConfigurationGroup,
@@ -277,13 +278,15 @@
 class CaptureCard: public ConfigurationWizard {
     Q_OBJECT
 public:
-    CaptureCard();
+    CaptureCard(bool use_card_group = true);
 
     int  getCardID(void) const { return id->intValue(); }
 
     void loadByID(int id);
+    void setParentID(int id);
 
     static void fillSelections(SelectSetting* setting);
+    static void fillSelections(SelectSetting* setting, bool no_children);
 
     void load() {
         ConfigurationWizard::load();
@@ -291,6 +294,7 @@
 
 public slots:
     void DiSEqCPanel();
+    void analogPanel();
     void recorderOptionsPanel();
 
 private:
@@ -306,6 +310,16 @@
         };
     };
 
+    class ParentID: public CCSetting
+    {
+      public:
+        ParentID(const CaptureCard &parent) : CCSetting(parent, "parentid")
+        {
+            setValue("0");
+            setVisible(false);
+        }
+    };
+
     class Hostname: public HostnameSetting, public CCSetting {
     public:
         Hostname(const CaptureCard& parent): CCSetting(parent, "hostname") {};
@@ -313,6 +327,7 @@
 
 private:
     ID       *id;
+    ParentID *parentid;
 };
 
 class CardInput;
@@ -414,6 +429,7 @@
 };
 
 class CardID;
+class ChildID;
 class InputName;
 class SourceID;
 class DVBLNBChooser;
@@ -436,6 +452,7 @@
     QString getSourceName(void) const;
 
     void fillDiseqcSettingsInput(QString _pos, QString _port);
+    void SetChildCardID(uint);
 
     virtual void save();
     virtual void save(QString /*destination*/) { save(); }
@@ -465,6 +482,7 @@
 
     ID              *id;
     CardID          *cardid;
+    ChildID         *childid;
     InputName       *inputname;
     SourceID        *sourceid;
     DVBLNBChooser   *lnbsettings;
Index: libs/libmythtv/cardutil.cpp
===================================================================
--- libs/libmythtv/cardutil.cpp	(revision 8994)
+++ libs/libmythtv/cardutil.cpp	(working copy)
@@ -216,6 +216,30 @@
     return QString::null;
 }
 
+QString CardUtil::GetVideoDevice(uint cardid, uint sourceid)
+{
+    QString device = QString::null;
+
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("SELECT videodevice "
+                  "FROM capturecard, cardinput "
+                  "WHERE sourceid         = :SOURCEID AND "
+                  "      cardinput.cardid = :CARDID   AND "
+                  "      ( ( cardinput.childcardid != '0' AND "
+                  "          cardinput.childcardid  = capturecard.cardid ) OR "
+                  "        ( cardinput.childcardid  = '0' AND "
+                  "          cardinput.cardid       = capturecard.cardid ) )");
+    query.bindValue(":CARDID", cardid);
+    query.bindValue(":SOURCEID", sourceid);
+
+    if (!query.exec() || !query.isActive())
+        MythContext::DBError("CardUtil::GetVideoDevice() 2", query);
+    else if (query.next())
+        device = query.value(0).toString();
+
+    return device;    
+}
+
 /** \fn CardUtil::GetCardID(const QString&, QString)
  *  \brief Returns the cardid of the card that uses the specified
  *         videodevice, and optionally a non-local hostname.
@@ -244,6 +268,44 @@
     return -1;
 }
 
+uint CardUtil::GetChildCardID(uint cardid)
+{
+    // check if child card definition does exist
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare(
+        "SELECT cardid "
+        "FROM capturecard "
+        "WHERE parentid = :CARDID");
+    query.bindValue(":CARDID", cardid);
+
+    int ret = 0;
+    if (!query.exec() || !query.isActive())
+        MythContext::DBError("CaptureCard::GetChildCardID()", query);
+    else if (query.next())
+        ret = query.value(0).toInt();
+
+    return ret;
+}
+
+uint CardUtil::GetParentCardID(uint cardid)
+{
+    // check if child card definition does exists
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare(
+        "SELECT parentid "
+        "FROM capturecard "
+        "WHERE cardid = :CARDID");
+    query.bindValue(":CARDID", cardid);
+
+    int ret = 0;
+    if (!query.exec() || !query.isActive())
+        MythContext::DBError("CaptureCard::GetParentCardID()", query);
+    else if (query.next())
+        ret = query.value(0).toInt();
+
+    return ret;
+}
+
 /** \fn CardUtil::GetVideoDevice(uint, QString&, QString&)
  *  \brief Returns the the video device associated with the card id
  *  \param nCardID card id to check
@@ -510,6 +572,8 @@
     else
         ret += probeV4LInputs(device);
 
+    ret += probeChildInputs(device);
+
     return ret;
 }
 
@@ -567,6 +631,30 @@
     return ret;
 }
 
+QStringList CardUtil::probeChildInputs(QString device)
+{
+    QStringList ret;
+
+    int cardid = CardUtil::GetCardID(device);
+    if (cardid <= 0)
+        return ret;
+
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("SELECT videodevice, cardtype "
+                  "FROM capturecard "
+                  "WHERE parentid = :CARDID");
+    query.bindValue(":CARDID", cardid);
+
+    if (!query.exec() || !query.isActive())
+        return ret;
+
+    while (query.next())
+        ret += probeInputs(query.value(0).toString(),
+                           query.value(1).toString());
+
+    return ret;
+}
+
 QValueList<DVBDiSEqCInput>
 CardUtil::fillDVBInputsDiSEqC(int dvb_diseqc_type)
 {
@@ -677,9 +765,10 @@
     QString             device,
     QString             cardtype,
     QStringList        &inputLabels,
-    vector<CardInput*> &cardInputs)
+    vector<CardInput*> &cardInputs,
+    int                 parentid)
 {
-    int rcardid = cardid;
+    int rcardid = (parentid) ? parentid : cardid;
     QStringList inputs;
 
     if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype))
@@ -687,13 +776,15 @@
     else if ("DVB" != cardtype)
         inputs += probeV4LInputs(device);
 
-    QString dev_label = GetDeviceLabel(cardid, cardtype, device);
+    QString dev_label = (parentid) ? " -> " : "";
+    dev_label += GetDeviceLabel(cardid, cardtype, device);
 
     QStringList::iterator it = inputs.begin();
     for (; it != inputs.end(); ++it)
     {
         CardInput* cardinput = new CardInput(true);
         cardinput->loadByInput(rcardid, (*it));
+        cardinput->SetChildCardID((parentid) ? cardid : 0);
         inputLabels.push_back(
             dev_label + QString(" (%1) -> %2")
             .arg(*it).arg(cardinput->getSourceName()));
@@ -711,10 +802,31 @@
             CardInput* cardinput = new CardInput(true);
             cardinput->loadByInput(rcardid, (*it).input);
             cardinput->fillDiseqcSettingsInput((*it).position,(*it).port);
+            cardinput->SetChildCardID((parentid) ? cardid : 0);
             inputLabels.push_back(
                 dev_label + QString(" (%1) -> %2")
                 .arg((*it).input).arg(cardinput->getSourceName()));
             cardInputs.push_back(cardinput);            
         }
     }
+
+    if (parentid)
+        return;
+
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("SELECT cardid, videodevice, cardtype "
+                  "FROM capturecard "
+                  "WHERE parentid = :CARDID");
+    query.bindValue(":CARDID", cardid);
+
+    if (!query.exec() || !query.isActive())
+        return;
+
+    while (query.next())
+    {
+        GetCardInputs(query.value(0).toUInt(),
+                      query.value(1).toString(),
+                      query.value(2).toString(),
+                      inputLabels, cardInputs, cardid);
+    }
 }
Index: libs/libmythtv/videosource.cpp
===================================================================
--- libs/libmythtv/videosource.cpp	(revision 8994)
+++ libs/libmythtv/videosource.cpp	(working copy)
@@ -1012,23 +1012,39 @@
     TriggeredConfigurationGroup::triggerChanged(own);
 }
 
-CaptureCard::CaptureCard() 
+CaptureCard::CaptureCard(bool use_card_group) 
 {
     // must be first
     addChild(id = new ID());
-    addChild(new CaptureCardGroup(*this));
+    addChild(parentid = new ParentID(*this));
+    if (use_card_group)
+        addChild(new CaptureCardGroup(*this));
     addChild(new Hostname(*this));
 }
 
+void CaptureCard::setParentID(int id)
+{
+    parentid->setValue(QString::number(id));
+}
+
 void CaptureCard::fillSelections(SelectSetting* setting) 
 {
+    CaptureCard::fillSelections(setting, false);
+}
+
+void CaptureCard::fillSelections(SelectSetting* setting, bool no_children) 
+{
     MSqlQuery query(MSqlQuery::InitCon());
-    query.prepare(
+    QString qstr =
         "SELECT cardtype, videodevice, cardid, "
         "       firewire_port, firewire_node, "
         "       dbox2_port, dbox2_host, dbox2_httpport "
         "FROM capturecard "
-        "WHERE hostname = :HOSTNAME");
+        "WHERE hostname = :HOSTNAME";
+    if (no_children)
+        qstr += " AND parentid='0'";
+
+    query.prepare(qstr);
     query.bindValue(":HOSTNAME", gContext->GetHostName());
 
     if (query.exec() && query.isActive() && query.size() > 0)
@@ -1117,6 +1133,16 @@
     };
 };
 
+class ChildID: public CISetting
+{
+  public:
+    ChildID(const CardInput &parent) : CISetting(parent, "childcardid")
+    {
+        setValue("0");
+        setVisible(false);
+    }
+};
+
 class InputDisplayName: public LineEditSetting, public CISetting
 {
   public:
@@ -1425,6 +1451,9 @@
 
     addChild(group);
 
+    childid = new ChildID(*this);
+    addChild(childid);
+
     setName("CardInput");
     connect(scan,     SIGNAL(pressed()), SLOT(channelScanner()));
     connect(srcfetch, SIGNAL(pressed()), SLOT(sourceFetch()));
@@ -1437,6 +1466,11 @@
     return sourceid->getSelectionLabel();
 }
 
+void CardInput::SetChildCardID(uint ccid)
+{
+    childid->setValue(QString::number(ccid));
+}
+
 void CardInput::channelScanner(void)
 {
     uint srcid = sourceid->getValue().toUInt();
@@ -1595,7 +1629,7 @@
     clearSelections();
     addSelection(QObject::tr("(New capture card)"), "0");
     addSelection(QObject::tr("(Delete all capture cards)"), "-1");
-    CaptureCard::fillSelections(this);
+    CaptureCard::fillSelections(this, true);
 }
 
 MythDialog* CaptureCardEditor::dialogWidget(MythMainWindow* parent,
@@ -1813,7 +1847,8 @@
     query.prepare(
         "SELECT cardid, videodevice, cardtype "
         "FROM capturecard "
-        "WHERE hostname = :HOSTNAME");
+        "WHERE hostname = :HOSTNAME AND "
+        "      parentid = '0'");
     query.bindValue(":HOSTNAME", gContext->GetHostName());
 
     if (!query.exec() || !query.isActive() || !query.size())
@@ -1894,6 +1929,10 @@
             cardname->setValue(name);
             signal_timeout->setValue(500);
             channel_timeout->setValue(3000);
+
+            if (name.left(6) == "pcHDTV")
+                buttonAnalog->setVisible(true);
+
             break;
         default:
             fEnable = false;
@@ -1979,12 +2018,17 @@
     TransButtonSetting *buttonDiSEqC = new TransButtonSetting();
     buttonDiSEqC->setLabel(tr("DiSEqC"));
 
+    buttonAnalog = new TransButtonSetting();
+    buttonAnalog->setLabel(tr("Analog Options"));
+    buttonAnalog->setVisible(false);
+
     TransButtonSetting *buttonRecOpt = new TransButtonSetting();
     buttonRecOpt->setLabel(tr("Recording Options"));    
 
     HorizontalConfigurationGroup *advcfg = 
         new HorizontalConfigurationGroup(false, false, true, true);
     advcfg->addChild(buttonDiSEqC);
+    advcfg->addChild(buttonAnalog);
     advcfg->addChild(buttonRecOpt);
     addChild(advcfg);
 
@@ -2000,6 +2044,8 @@
             this,         SLOT(  probeCard   (const QString&)));
     connect(buttonDiSEqC, SIGNAL(pressed()),
             &parent,      SLOT(  DiSEqCPanel()));
+    connect(buttonAnalog, SIGNAL(pressed()),
+            &parent,      SLOT(  analogPanel()));
     connect(buttonRecOpt, SIGNAL(pressed()),
             &parent,      SLOT(  recorderOptionsPanel()));
     connect(diseqctype,   SIGNAL(valueChanged(const QString&)),
@@ -2018,6 +2064,28 @@
     }
 }
 
+void CaptureCard::analogPanel()
+{
+    reload();
+
+    uint    cardid       = getCardID();
+    uint    child_cardid = CardUtil::GetChildCardID(cardid);
+    QString devname = "Unknown";
+    QString dev = CardUtil::GetVideoDevice(cardid);
+    if (!dev.isEmpty())
+        devname = QString("[ DVB : %1 ]").arg(devname);
+
+    CaptureCard *card = new CaptureCard(false);
+    card->addChild(new V4LConfigurationGroup(*card));
+    if (child_cardid)
+        card->loadByID(child_cardid);
+    else
+        card->setParentID(cardid);
+    card->setLabel(tr("Analog Options for ") + devname);
+    card->exec();
+    delete card;
+}
+
 void CaptureCard::recorderOptionsPanel()
 {
     reload();
Index: libs/libmythtv/scanwizardhelpers.h
===================================================================
--- libs/libmythtv/scanwizardhelpers.h	(revision 8994)
+++ libs/libmythtv/scanwizardhelpers.h	(working copy)
@@ -204,7 +204,7 @@
   public:
     enum Type
     {
-        Error_Open,
+        Error_Open = 0,
         Error_Probe,
         FullScan_Analog,
         FullScan_ATSC,
Index: libs/libmythtv/scanwizard.cpp
===================================================================
--- libs/libmythtv/scanwizard.cpp	(revision 8994)
+++ libs/libmythtv/scanwizard.cpp	(working copy)
@@ -307,7 +307,9 @@
 {
     uint signal_timeout  = 1000;
     uint channel_timeout = 40000;
-    int  cardid  = parent->captureCard();
+    int  ccardid = parent->captureCard();
+    int  pcardid = CardUtil::GetParentCardID(ccardid);
+    int  cardid  = (pcardid) ? pcardid : ccardid;
     nScanType    = parent->scanType();
     nVideoSource = parent->videoSource();
     tunerthread_running = false;
@@ -316,7 +318,7 @@
             QString("type(%1) src(%2) cardid(%3)")
             .arg(nScanType).arg(nVideoSource).arg(cardid));
 
-    CardUtil::GetTimeouts(cardid, signal_timeout, channel_timeout);
+    CardUtil::GetTimeouts(ccardid, signal_timeout, channel_timeout);
  
     if (nScanType == ScanTypeSetting::FullScan_Analog)
     {
@@ -392,12 +394,12 @@
     {
         nMultiplexToTuneTo = parent->paneSingle->GetMultiplex();
 
-        QString device = CardUtil::GetVideoDevice(cardid);
+        QString device = CardUtil::GetVideoDevice(cardid, nVideoSource);
         if (device.isEmpty())
             return;
 
         QString cn, card_type;
-        int nCardType = CardUtil::GetCardType(cardid, cn, card_type);
+        int nCardType = CardUtil::GetCardType(ccardid, cn, card_type);
         (void) nCardType;
 #ifdef USING_DVB
         if (CardUtil::IsDVB(cardid))
Index: libs/libmythtv/dbcheck.cpp
===================================================================
--- libs/libmythtv/dbcheck.cpp	(revision 8994)
+++ 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 = "1124";
+const QString currentDatabaseVersion = "1125";
 
 static bool UpdateDBVersionNumber(const QString &newnumber);
 static bool performActualUpdate(const QString updates[], QString version,
@@ -2016,6 +2016,17 @@
             return false;
     }
 
+    if (dbver == "1124")
+    {
+        const QString updates[] = {
+"ALTER TABLE capturecard ADD parentid int(10) NOT NULL DEFAULT 0;",
+"ALTER TABLE cardinput ADD childcardid int(10) NOT NULL DEFAULT 0;",
+""
+};
+        if (!performActualUpdate(updates, "1125", dbver))
+            return false;
+    }
+
 // Drop xvmc_buffer_settings table in 0.20
 // Drop dvb_dmx_buf_size and dvb_pkt_buf_size columns of channel in 0.20
 
Index: libs/libmythtv/tv_rec.cpp
===================================================================
--- libs/libmythtv/tv_rec.cpp	(revision 8994)
+++ libs/libmythtv/tv_rec.cpp	(working copy)
@@ -3366,6 +3366,18 @@
  */
 void TVRec::TuningShutdowns(const TuningRequest &request)
 {
+    uint curCardID = 0, newCardID = 0;
+    if (channel && !request.input.isEmpty())
+    {
+        int current_input = channel->GetCurrentInputNum();
+        int new_input     = channel->GetInputByName(request.input);
+        curCardID = channel->GetInputCardID(current_input);
+        newCardID = channel->GetInputCardID(new_input);
+        VERBOSE(VB_IMPORTANT, LOC +
+                "Real Tuner: <"<<curCardID<<":"<<newCardID<<">");
+    }
+    bool force_teardown = curCardID != newCardID;
+
 #ifdef USING_DVB_EIT
     if (!(request.flags & kFlagEITScan) && HasFlags(kFlagEITScannerRunning))
     {
@@ -3394,7 +3406,7 @@
 
     // At this point any waits are canceled.
 
-    if ((request.flags & kFlagNoRec))
+    if ((request.flags & kFlagNoRec) || force_teardown)
     {
         if (HasFlags(kFlagDummyRecorderRunning))
         {
@@ -3419,7 +3431,24 @@
         CloseChannel();
         // At this point the channel is shut down
     }
+    
+    if (force_teardown)
+    {
+        VERBOSE(VB_IMPORTANT, "Recreating channel...");
+        channel->Close();
+        delete channel;
+        channel = NULL;
+        GetDevices(newCardID, genOpt, dvbOpt, fwOpt, dboxOpt);
+        genOpt.defaultinput = request.input;
+        QString startchannum = request.channel;
+        if (startchannum.isEmpty())
+            startchannum = GetStartChannel(newCardID, request.input);
+        CreateChannel(startchannum);
 
+        if (!(request.flags & kFlagNoRec))
+            channel->Open();
+    }
+
     if (ringBuffer && (request.flags & kFlagKillRingBuffer))
     {
         VERBOSE(VB_RECORD, LOC + "Tearing down RingBuffer");
@@ -3735,7 +3764,7 @@
             SetFlags(kFlagRingBufferReady);
         }
         else
-            ok = SwitchLiveTVRingBuffer(true, !had_dummyrec);
+            ok = SwitchLiveTVRingBuffer(true, !had_dummyrec && recorder);
         if (!ok)
         {
             VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to create RingBuffer 2");
@@ -3826,7 +3855,7 @@
     if (GetV4LChannel())
         channel->SetFd(recorder->GetVideoFd());
 
-    SetFlags(kFlagRecorderRunning);
+    SetFlags(kFlagRecorderRunning | kFlagRingBufferReady);
 
     if (!tvchain)
         autoRunJobs = init_jobs(rec, profile, runJobOnHostOnly,
Index: libs/libmythtv/channelbase.h
===================================================================
--- libs/libmythtv/channelbase.h	(revision 8994)
+++ libs/libmythtv/channelbase.h	(working copy)
@@ -25,16 +25,16 @@
     InputBase() :
         name(QString::null),            startChanNum(QString::null),
         tuneToChannel(QString::null),   externalChanger(QString::null),
-        sourceid(0),
+        sourceid(0),                    cardid(0),
         inputNumV4L(-1),
         videoModeV4L1(0),               videoModeV4L2(0) {}
 
     InputBase(QString _name,            QString _startChanNum,
               QString _tuneToChannel,   QString _externalChanger,
-              uint    _sourceid) :
+              uint    _sourceid,        uint    _cardid) :
         name(_name),                    startChanNum(_startChanNum),
         tuneToChannel(_tuneToChannel),  externalChanger(_externalChanger),
-        sourceid(_sourceid),
+        sourceid(_sourceid),            cardid(_cardid),
         inputNumV4L(-1),
         videoModeV4L1(0),               videoModeV4L2(0) {}
 
@@ -46,6 +46,7 @@
     QString tuneToChannel;   // for using a cable box & S-Video/Composite
     QString externalChanger; // for using a cable box...
     uint    sourceid;        // associated channel listings source
+    uint    cardid;          // input card id
     int     inputNumV4L;
     int     videoModeV4L1;
     int     videoModeV4L2;
@@ -95,9 +96,10 @@
         { return inputs[GetNextInputNum()]->name; }
     virtual QString GetNextInputStartChan(void)
         { return inputs[GetNextInputNum()]->startChanNum; }
-    virtual QStringList GetConnectedInputs(void) const;
+    virtual uint GetInputCardID(int inputNum) const;
     virtual QString GetOrdering(void) const
         { return channelorder; }
+    virtual QStringList GetConnectedInputs(void) const;
     /// \brief Returns true iff commercial detection is not required
     //         on current channel, for BBC, CBC, etc.
     bool IsCommercialFree(void) const { return commfree; }
Index: libs/libmythtv/scanwizardhelpers.cpp
===================================================================
--- libs/libmythtv/scanwizardhelpers.cpp	(revision 8994)
+++ libs/libmythtv/scanwizardhelpers.cpp	(working copy)
@@ -218,25 +218,33 @@
     clearSelections();
 
     MSqlQuery query(MSqlQuery::InitCon());
-
-    QString thequery = QString(
+    query.prepare(
         "SELECT DISTINCT cardtype, videodevice, capturecard.cardid "
         "FROM capturecard, videosource, cardinput "
-        "WHERE videosource.sourceid = %1 AND "
+        "WHERE videosource.sourceid = :SOURCEID            AND "
         "      cardinput.sourceid   = videosource.sourceid AND "
-        "      cardinput.cardid     = capturecard.cardid AND "
-        "      capturecard.cardtype in " CARDTYPES " AND "
-        "      capturecard.hostname = '%2';")
-        .arg(nSourceID).arg(gContext->GetHostName());
-    query.prepare(thequery);
+        "      capturecard.cardtype in " CARDTYPES "       AND "
+        "      capturecard.hostname = :HOSTNAME            AND "
+        "      ( ( cardinput.childcardid != '0' AND "
+        "          cardinput.childcardid  = capturecard.cardid ) OR "
+        "        ( cardinput.childcardid  = '0' AND "
+        "          cardinput.cardid       = capturecard.cardid ) "
+        "      )");
+    query.bindValue(":SOURCEID", nSourceID);
+    query.bindValue(":HOSTNAME", gContext->GetHostName());
 
-    if (query.exec() && query.isActive() && query.size() > 0)
+    if (!query.exec() || !query.isActive())
     {
-        while (query.next())
-            addSelection("[ " + query.value(0).toString() + " : " +
-                         query.value(1).toString() + " ]",
-                         query.value(2).toString());
+        MythContext::DBError("CaptureCardSetting::refresh()", query);
+        return;
     }
+
+    while (query.next())
+    {
+        addSelection("[ " + query.value(0).toString() + " : " +
+                     query.value(1).toString() + " ]",
+                     query.value(2).toString());
+    }
 }
 
 void CaptureCardSetting::sourceID(const QString& str)
Index: libs/libmythtv/channelbase.cpp
===================================================================
--- libs/libmythtv/channelbase.cpp	(revision 8994)
+++ libs/libmythtv/channelbase.cpp	(working copy)
@@ -169,6 +169,14 @@
     return ok;
 }
 
+uint ChannelBase::GetInputCardID(int inputNum) const
+{
+    InputMap::const_iterator it = inputs.find(inputNum);
+    if (it != inputs.end())
+        return (*it)->cardid;
+    return 0;    
+}
+
 bool ChannelBase::ChangeExternalChannel(const QString &channum)
 {
     InputMap::const_iterator it = inputs.find(currentInputID);
@@ -387,7 +395,13 @@
     if (GetDevice().isEmpty())
         return -1;
 
-    return CardUtil::GetCardID(GetDevice());
+    int tmpcardid = CardUtil::GetCardID(GetDevice());
+    if (tmpcardid > 0)
+    {
+        uint pcardid = CardUtil::GetParentCardID(tmpcardid);
+        tmpcardid = (pcardid) ? pcardid : tmpcardid;
+    }
+    return tmpcardid;
 }
 
 /** \fn DVBChannel::InitializeInputs(void)
@@ -410,7 +424,7 @@
         "SELECT cardinputid, "
         "       inputname,   startchan, "
         "       tunechan,    externalcommand, "
-        "       sourceid "
+        "       sourceid,    childcardid "
         "FROM cardinput "
         "WHERE cardid = :CARDID");
     query.bindValue(":CARDID", cardid);
@@ -431,10 +445,14 @@
 
     while (query.next())
     {
+        // If there is a childcardid use it instead of cardid
+        uint inputcardid = query.value(6).toUInt();
+        inputcardid = (inputcardid) ? inputcardid : cardid;
+
         inputs[query.value(0).toUInt()] = new InputBase(
             query.value(1).toString(), query.value(2).toString(),
             query.value(3).toString(), query.value(4).toString(),
-            query.value(5).toUInt());
+            query.value(5).toUInt(),   inputcardid);
     }
 
     // Set initial input to first connected input
@@ -446,9 +464,9 @@
     for (it = inputs.begin(); it != inputs.end(); ++it)
     {
         VERBOSE(VB_CHANNEL, LOC + QString("Input #%1: '%2' schan(%3) "
-                                          "sourceid(%4)")
+                                          "sourceid(%4) ccid(%5)")
                 .arg(it.key()).arg((*it)->name).arg((*it)->startChanNum)
-                .arg((*it)->sourceid));
+                .arg((*it)->sourceid).arg((*it)->cardid));
     }
     VERBOSE(VB_CHANNEL, LOC + QString("Current Input #%1: '%2'")
             .arg(GetCurrentInputNum()).arg(GetCurrentInput()));
Index: libs/libmythtv/analogscan.cpp
===================================================================
--- libs/libmythtv/analogscan.cpp	(revision 8994)
+++ libs/libmythtv/analogscan.cpp	(working copy)
@@ -81,7 +81,7 @@
     struct CHANLIST *flist   = NULL;
     uint count               = 0;
 
-    QString device = CardUtil::GetVideoDevice(cardid);
+    QString device = CardUtil::GetVideoDevice(cardid, sourceid);
     QString input  = CardUtil::GetInputName(cardid, sourceid);
     if (device.isEmpty() || input.isEmpty())
         goto do_scan_end;
Index: programs/mythfrontend/statusbox.cpp
===================================================================
--- programs/mythfrontend/statusbox.cpp	(revision 8994)
+++ programs/mythfrontend/statusbox.cpp	(working copy)
@@ -739,7 +739,9 @@
     MSqlQuery query(MSqlQuery::InitCon());
     query.prepare(
         "SELECT cardid, cardtype, videodevice "
-        "FROM capturecard ");
+        "FROM capturecard "
+        "WHERE parentid='0'");
+
     if (!query.exec() || !query.isActive())
     {
         MythContext::DBError("StatusBox::doTunerStatus()", query);
Index: programs/mythbackend/main.cpp
===================================================================
--- programs/mythbackend/main.cpp	(revision 8994)
+++ programs/mythbackend/main.cpp	(working copy)
@@ -108,7 +108,10 @@
         }
     }
 
-    query.exec("SELECT cardid,hostname FROM capturecard ORDER BY cardid;");
+    query.exec("SELECT cardid, hostname "
+               "FROM capturecard "
+               "WHERE parentid = '0' "
+               "ORDER BY cardid");
 
     if (query.isActive() && query.size())
     {
