Index: libs/libmythtv/channelutil.h
===================================================================
--- libs/libmythtv/channelutil.h	(revision 12156)
+++ libs/libmythtv/channelutil.h	(working copy)
@@ -198,7 +198,6 @@
      */
     static QString GetServiceName(int chanid);
     static int     GetSourceID(int mplexid);
-    static QString GetInputName(int sourceid);
     static int     GetInputID(int sourceid, int cardid);
     static QString GetDTVPrivateType(uint networkid, const QString &key,
                                      const QString sitype = "dvb");
Index: libs/libmythtv/cardutil.h
===================================================================
--- libs/libmythtv/cardutil.h	(revision 12156)
+++ libs/libmythtv/cardutil.h	(working copy)
@@ -138,7 +138,7 @@
 
 
     static QString      GetDefaultInput(uint cardid);
-    static QString      GetInputName(uint cardid, uint sourceid);
+    static QStringList  GetInputNames(uint cardid, uint sourceid);
 
     static QString      GetDeviceLabel(uint    cardid,
                                        QString cardtype,
Index: libs/libmythtv/scanwizardscanner.cpp
===================================================================
--- libs/libmythtv/scanwizardscanner.cpp	(revision 12156)
+++ libs/libmythtv/scanwizardscanner.cpp	(working copy)
@@ -521,8 +521,8 @@
         return;
     }
 
-    scanner = new SIScan(card_type, channel, sourceid,
-                         signal_timeout, channel_timeout);
+    scanner = new SIScan(card_type, channel, sourceid, signal_timeout,
+                         channel_timeout, inputname);
 
     scanner->SetForceUpdate(true);
 
Index: libs/libmythtv/siscan.cpp
===================================================================
--- libs/libmythtv/siscan.cpp	(revision 12156)
+++ libs/libmythtv/siscan.cpp	(working copy)
@@ -81,10 +81,11 @@
  *   HandleDVBDBInsertion() and HandleMPEGDBInsertion() are similar.
  */
 
-/** \fn SIScan::SIScan(QString,ChannelBase*,int,uint,uint)
+/** \fn SIScan::SIScan(QString,ChannelBase*,int,uint,uint,const QString&)
  */
-SIScan::SIScan(QString _cardtype, ChannelBase* _channel, int _sourceID,
-               uint signal_timeout, uint channel_timeout)
+SIScan::SIScan(const QString &_cardtype, ChannelBase *_channel, int _sourceID,
+               uint signal_timeout, uint channel_timeout,
+               const QString &_inputname)
     : // Set in constructor
       channel(_channel),
       signalMonitor(SignalMonitor::Init(_cardtype, -1, _channel)),
@@ -92,6 +93,7 @@
       scanMode(IDLE),
       signalTimeout(signal_timeout),
       channelTimeout(channel_timeout),
+      inputname(QDeepCopy<QString>(_inputname)),
       // Settable
       ignoreAudioOnlyServices(false),
       ignoreDataServices(false),
@@ -687,9 +689,6 @@
     }
 #endif // USING_DVB
 
-    // TODO we should actually use the input the user specifies...
-    QString inputname = ChannelUtil::GetInputName(item.SourceID);
-
     if (!GetDTVChannel())
         return false;
 
Index: libs/libmythtv/channelutil.cpp
===================================================================
--- libs/libmythtv/channelutil.cpp	(revision 12156)
+++ libs/libmythtv/channelutil.cpp	(working copy)
@@ -699,28 +699,6 @@
     return -1;
 }
 
-/** \fn ChannelUtil::GetInputName(int)
- *  \brief Returns input name for a card input
- *  NOTE: This is BROKEN, it does not specify which card the input is on.
- */
-QString ChannelUtil::GetInputName(int source_id)
-{
-    QString inputname = QString::null;
-
-    MSqlQuery query(MSqlQuery::InitCon());
-    query.prepare("SELECT inputname "
-                  "FROM cardinput "
-                  "WHERE sourceid = :SOURCEID");
-    query.bindValue(":SOURCEID", source_id);
-
-    if (query.exec() && query.isActive() && query.size() > 0)
-    {
-        query.next();
-        inputname = query.value(0).toString();
-    }
-    return inputname;
-}
-
 int ChannelUtil::GetInputID(int source_id, int card_id)
 {
     int input_id = -1;
Index: libs/libmythtv/cardutil.cpp
===================================================================
--- libs/libmythtv/cardutil.cpp	(revision 12156)
+++ libs/libmythtv/cardutil.cpp	(working copy)
@@ -348,9 +348,9 @@
     return str;
 }
 
-QString CardUtil::GetInputName(uint cardid, uint sourceid)
+QStringList CardUtil::GetInputNames(uint cardid, uint sourceid)
 {
-    QString str = QString::null;
+    QStringList list;
     MSqlQuery query(MSqlQuery::InitCon());
     query.prepare("SELECT inputname "
                   "FROM cardinput "
@@ -360,11 +360,16 @@
     query.bindValue(":CARDID",   cardid);
 
     if (!query.exec() || !query.isActive())
-        MythContext::DBError("CardUtil::GetInputName()", query);
-    else if (query.next())
-        str = query.value(0).toString();
+    {
+        MythContext::DBError("CardUtil::GetInputNames()", query);
+    }
+    else
+    {
+        while (query.next())
+            list = query.value(0).toString();
+    }
 
-    return str;
+    return list;
 }
 
 bool CardUtil::GetTimeouts(uint cardid,
Index: libs/libmythtv/siscan.h
===================================================================
--- libs/libmythtv/siscan.h	(revision 12156)
+++ libs/libmythtv/siscan.h	(working copy)
@@ -44,8 +44,9 @@
 {
     Q_OBJECT
   public:
-    SIScan(QString _cardtype, ChannelBase* _channel, int _sourceID,
-           uint signal_timeout, uint channel_timeout);
+    SIScan(const QString &_cardtype, ChannelBase* _channel, int _sourceID,
+           uint signal_timeout, uint channel_timeout,
+           const QString &_inputname);
     ~SIScan();
 
     void StartScanner(void);
@@ -180,6 +181,7 @@
     SCANMODE          scanMode;
     uint              signalTimeout;
     uint              channelTimeout;
+    QString           inputname;
 
     // Settable
     bool              ignoreAudioOnlyServices;
Index: libs/libmythtv/transporteditor.cpp
===================================================================
--- libs/libmythtv/transporteditor.cpp	(revision 12156)
+++ libs/libmythtv/transporteditor.cpp	(working copy)
@@ -188,35 +188,40 @@
     vector<uint>::const_iterator it = cardids.begin();
     for (; it != cardids.end(); ++it)
     {
-        CardUtil::CARD_TYPES nType = CardUtil::ERROR_PROBE;
-        QString inputname = CardUtil::GetInputName(*it, sourceid);
+        QStringList inputnames = CardUtil::GetInputNames(*it, sourceid);
+        QStringList::const_iterator it2 = inputnames.begin();
 
-        if (!inputname.isEmpty())
+        for (; it2 != inputnames.end(); ++it2)
         {
-            QString cardtype = CardUtil::GetRawCardType(*it, inputname);
+            CardUtil::CARD_TYPES nType = CardUtil::ERROR_PROBE;
+            QString cardtype = CardUtil::GetRawCardType(*it, *it2);
             if (cardtype == "DVB")
-                cardtype = CardUtil::ProbeSubTypeName(*it, inputname);
+                cardtype = CardUtil::ProbeSubTypeName(*it, *it2);
             nType = CardUtil::toCardType(cardtype);
-        }
 
-        if ((CardUtil::ERROR_OPEN    == nType) ||
-            (CardUtil::ERROR_UNKNOWN == nType) ||
-            (CardUtil::ERROR_PROBE   == nType))
-        {
-            MythPopupBox::showOkPopup(
-                gContext->GetMainWindow(), 
-                QObject::tr("Transport Editor"), 
-                QObject::tr(
-                    "Failed to probe a capture card connected to this "
-                    "transport's video source. Please make sure the "
-                    "backend is not running."));
+            if ((CardUtil::ERROR_OPEN    == nType) ||
+                (CardUtil::ERROR_UNKNOWN == nType) ||
+                (CardUtil::ERROR_PROBE   == nType))
+            {
+                MythPopupBox::showOkPopup(
+                    gContext->GetMainWindow(), 
+                    QObject::tr("Transport Editor"), 
+                    QObject::tr(
+                        "Failed to probe a capture card connected to this "
+                        "transport's video source. Please make sure the "
+                        "backend is not running."));
 
-            return CardUtil::ERROR_PROBE;
+                return CardUtil::ERROR_PROBE;
+            }
+
+            cardtypes.push_back(nType);
         }
-
-        cardtypes.push_back(nType);
     }
 
+    // This should never happen... (unless DB has changed under us)
+    if (cardtypes.empty())
+        return CardUtil::ERROR_PROBE;
+
     for (uint i = 1; i < cardtypes.size(); i++)
     {
         CardUtil::CARD_TYPES typeA = cardtypes[i - 1];
