Index: libs/libmythtv/analogscan.h
===================================================================
--- libs/libmythtv/analogscan.h	(revision 11768)
+++ libs/libmythtv/analogscan.h	(working copy)
@@ -48,15 +48,9 @@
 {
    Q_OBJECT
 public:
-    /** 
-      @brief constructs the Analog Scanner
-      @param _sourceid the video source id 
-      @param _cardid the card id to perform the scan on
-     */
-    AnalogScan(unsigned _sourceid, unsigned _cardid);
+    /// @brief constructs the Analog Scanner
+    AnalogScan(uint _cardid, uint _sourceid, const QString &_inputname);
 
-    ~AnalogScan();
-
     /** @brief Stops the scanning thread running */
     void stop();
 
@@ -75,14 +69,15 @@
     /** @brief signals the scan is complete */ 
     void serviceScanComplete();
 
-protected:
+  protected:
+    uint    cardid;
+    uint    sourceid;
+    QString inputname;
+
     bool fRunning;
     bool fStop;
+    uint nTable;
 
-    unsigned sourceid;
-    unsigned cardid;
-    unsigned nTable;
-
     /** @brief adds a found channel to the database
         @param name name of the channel
         @param frequency freqency/frequencyid of the channel
@@ -100,5 +95,8 @@
     void doScan();
     /** @brief Actual thread proc , calls doScan*/
     static void *spawn(void *param);
+
+  private:
+    ~AnalogScan();
 };
 #endif //ANALOGSCAN_H
Index: libs/libmythtv/channeleditor.cpp
===================================================================
--- libs/libmythtv/channeleditor.cpp	(revision 11768)
+++ libs/libmythtv/channeleditor.cpp	(working copy)
@@ -16,6 +16,7 @@
 
 #include "channelsettings.h"
 #include "transporteditor.h"
+#include "sourceutil.h"
 
 #include "scanwizard.h"
 
@@ -261,6 +262,7 @@
     buttonScan = new TransButtonSetting();
     buttonScan->setLabel(QObject::tr("Channel Scanner"));
     buttonScan->setHelpText(QObject::tr("Starts the channel scanner."));
+    buttonScan->setEnabled(SourceUtil::IsAnySourceScanable());
 
     buttonTransportEditor = new TransButtonSetting();
     buttonTransportEditor->setLabel(QObject::tr("Transport Editor"));
@@ -426,11 +428,14 @@
     }
 }
 
-void ChannelEditor::scan()
+void ChannelEditor::scan(void)
 {
 #ifdef USING_BACKEND
-    ScanWizard scanwizard;
-    scanwizard.exec(false,true);
+    int val = source->getValue().toInt();
+    uint sourceid = (val > 0) ? val : 0;
+    ScanWizard *scanwizard = new ScanWizard(sourceid);
+    scanwizard->exec(false, true);
+    scanwizard->deleteLater();
 
     list->fillSelections();
     list->setFocus();
Index: libs/libmythtv/cardutil.h
===================================================================
--- libs/libmythtv/cardutil.h	(revision 11768)
+++ libs/libmythtv/cardutil.h	(working copy)
@@ -118,6 +118,7 @@
 
     static bool         IsCardTypePresent(const QString &strType);
 
+/*
     static QString      GetRawCardType(uint cardid, uint sourceid)
         { return get_on_source("cardtype", cardid, sourceid).upper(); }
     static QString      GetVideoDevice(uint cardid, uint sourceid)
@@ -126,8 +127,7 @@
         { return get_on_source("vbidevice", cardid, sourceid); }
     static uint         GetDBOX2Port(uint cardid, uint sourceid)
         { return get_on_source("dbox2_port", cardid, sourceid).toUInt(); }
-    static uint         GetHDHRTuner(uint cardid, uint sourceid)
-        { return get_on_source("dbox2_port", cardid, sourceid).toUInt(); }
+*/
 
     static QString      GetRawCardType(uint cardid, const QString &input)
         { return get_on_input("cardtype", cardid, input).upper(); }
@@ -135,8 +135,9 @@
         { return get_on_input("videodevice", cardid, input); }
     static QString      GetVBIDevice(uint cardid, const QString &input)
         { return get_on_input("vbidevice", cardid, input); }
+    static uint         GetHDHRTuner(uint cardid, const QString &input)
+        { return get_on_input("dbox2_port", cardid, input).toUInt(); }
 
-
     static int          GetValueInt(const QString &col, uint cid, uint sid)
         { return get_on_source(col, cid, sid).toInt(); }
     static bool         SetValue(const QString &col, uint cid,
Index: libs/libmythtv/videosource.h
===================================================================
--- libs/libmythtv/videosource.h	(revision 11768)
+++ libs/libmythtv/videosource.h	(working copy)
@@ -591,6 +591,7 @@
     void channelScanner();
     void sourceFetch();
     void diseqcConfig();
+    void SetSourceID(const QString &sourceid);
 
   private:
     class ID: public AutoIncrementDBSetting
@@ -600,13 +601,7 @@
         {
             setVisible(false);
             setName("CardInputID");
-        };
-        virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
-                                      const char* widgetName = 0)
-        {
-            (void)cg; (void)parent; (void)widgetName;
-            return NULL;
-        };
+        }
     };
 
     ID              *id;
@@ -615,6 +610,8 @@
     InputName       *inputname;
     SourceID        *sourceid;
     StartingChannel *startchan;
+    TransButtonSetting *scan;
+    TransButtonSetting *srcfetch;
     DiSEqCDevSettings  settings;
 };
 
Index: libs/libmythtv/scanwizardhelpers.h
===================================================================
--- libs/libmythtv/scanwizardhelpers.h	(revision 11768)
+++ libs/libmythtv/scanwizardhelpers.h	(working copy)
@@ -40,6 +40,13 @@
 class ScanWizard;
 class OptionalTypeSetting;
 class VideoSourceSelector;
+class OFDMPane;
+class QPSKPane;
+class DVBS2Pane;
+class ATSCPane;
+class QAMPane;
+class STPane;
+class DVBUtilsImportPane;
 
 /// Max range of the ScanProgressPopup progress bar
 #define PROGRESS_MAX  1000
@@ -87,13 +94,7 @@
         DVBSNR,
         DVBSignalStrength,
         DVBLock,
-        TuneComplete
     };
-    enum TUNING
-    {
-        OK,
-        ERROR_TUNE
-    };
 
     ScannerEvent(TYPE t) : QCustomEvent(t + QEvent::User) { ; }
 
@@ -105,7 +106,10 @@
 
     TYPE    eventType()       const { return (TYPE)(type()-QEvent::User); }
 
-  protected:
+  private:
+    ~ScannerEvent() { }
+
+  private:
     QString str;
     int     intvalue;
 };
@@ -114,23 +118,18 @@
 // Settings Below Here
 // ///////////////////////////////
 
-class MultiplexSetting : public ComboBoxSetting, public Storage
+class MultiplexSetting : public ComboBoxSetting, public TransientStorage
 {
-    Q_OBJECT
-  protected:
-    int nSourceID;
-
   public:
-    MultiplexSetting() : ComboBoxSetting(this), nSourceID(0)
+    MultiplexSetting() : ComboBoxSetting(this), sourceid(0)
         { setLabel(tr("Transport")); }
 
-    virtual void load() { refresh(); }
-    virtual void save() { ; }
-    virtual void save(QString /*destination*/) { }
+    virtual void load(void);
 
-    void refresh();
-  public slots:
-    void sourceID(const QString& str);
+    void SetSourceID(uint _sourceid);
+
+  protected:
+    uint sourceid;
 };
 
 class IgnoreSignalTimeout : public CheckBoxSetting, public TransientStorage
@@ -146,30 +145,38 @@
     }
 };
 
-class CaptureCardSetting : public ComboBoxSetting, public Storage
+class InputSelector : public ComboBoxSetting, public TransientStorage
 {
     Q_OBJECT
-  protected:
-    int nSourceID;
 
   public:
-    CaptureCardSetting() : ComboBoxSetting(this), nSourceID(0)
-    {
-        setLabel(tr("Capture Card"));
-    }
-    virtual void load() { refresh(); }
-    virtual void save() { ; }
-    virtual void save(QString /*destination*/) { }
+    InputSelector(uint _default_cardid, const QString &_default_inputname);
 
-    void refresh();
+    virtual void load(void);
 
+    uint GetParentCardID(void) const;
+    uint GetChildCardID(void) const;
+    uint GetHWCardID(void) const
+        { return GetChildCardID() ? GetChildCardID() : GetParentCardID(); }
+
+    QString GetInputName(void) const;
+
+    static bool Parse(const QString &cardids_inputname,
+                      uint &parent_cardid,
+                      uint &child_cardid,
+                      QString &inputname);
+
   public slots:
-    void sourceID(const QString& str);
+    void SetSourceID(const QString &_sourceid);
+
+  private:
+    uint    sourceid;
+    uint    default_cardid;
+    QString default_inputname;
 };
 
-class ScanCountry: public ComboBoxSetting, public TransientStorage
+class ScanCountry : public ComboBoxSetting, public TransientStorage
 {
-    Q_OBJECT
   public:
     enum Country
     {
@@ -211,44 +218,86 @@
         DVBUtilsImport,
     };
 
-    ScanTypeSetting() : ComboBoxSetting(this), nCaptureCard(-1)
-    {
-        setLabel(QObject::tr("Scan Type"));
-        refresh("");
-    }
+    ScanTypeSetting() : ComboBoxSetting(this), hw_cardid(0)
+        { setLabel(QObject::tr("Scan Type")); }
+
   protected slots:
-    void refresh(const QString&);
+    void SetInput(const QString &cardids_inputname);
+
   protected:
-    int nCaptureCard;
+    uint    hw_cardid;
 };
 
 class ScanOptionalConfig : public TriggeredConfigurationGroup 
 {
     Q_OBJECT
+
   public:
-    ScanOptionalConfig(ScanWizard* wizard, ScanTypeSetting* scanType);
+    ScanOptionalConfig(ScanTypeSetting *_scan_type);
 
+    QString GetATSCFormat(const QString&)    const;
+    QString GetModulation(void)              const;
+    QString GetFrequencyTable(void)          const;
+    bool    DoIgnoreSignalTimeout(void)      const;
+    QString GetFilename(void)                const;
+    uint    GetMultiplex(void)               const;
+    bool    DoDeleteChannels(void)           const;
+    bool    DoRenameChannels(void)           const;
+    QMap<QString,QString> GetStartChan(void) const;
+
+    void SetDefaultATSCFormat(const QString &atscFormat);
+
+  public slots:
+    void SetSourceID(const QString&);
+    void triggerChanged(const QString&);
+
+  private:
+    ScanTypeSetting     *scanType;
     ScanCountry         *country;
     IgnoreSignalTimeout *ignoreSignalTimeoutAll;
-
-  protected slots:
-    void triggerChanged(const QString&);
+    OFDMPane            *paneOFDM;
+    QPSKPane            *paneQPSK;
+    DVBS2Pane           *paneDVBS2;
+    ATSCPane            *paneATSC;
+    QAMPane             *paneQAM;
+    STPane              *paneSingle;
+    DVBUtilsImportPane  *paneDVBUtilsImport;
 };
 
-class ScanWizardScanType: public VerticalConfigurationGroup
+class ScanWizardConfig: public VerticalConfigurationGroup
 {
-    Q_OBJECT
-    friend class ScanWizard;
-
   public:
-    ScanWizardScanType(ScanWizard *_parent, int sourceid);
+    ScanWizardConfig(ScanWizard *_parent,
+                     uint    default_sourceid,  uint default_cardid,
+                     QString default_inputname, bool force_sourceid);
 
+    uint    GetSourceID(void)     const;
+    QString GetATSCFormat(void)   const;
+    QString GetModulation(void)   const { return scanConfig->GetModulation(); }
+    int     GetScanType(void)     const { return scanType->getValue().toInt();}
+    uint    GetParentCardID(void) const { return input->GetParentCardID();    }
+    uint    GetChildCardID(void)  const { return input->GetChildCardID();     }
+    uint    GetHWCardID(void)     const { return input->GetHWCardID();        }
+    QString GetInputName(void)    const { return input->GetInputName();       }
+    QString GetFilename(void)     const { return scanConfig->GetFilename();   }
+    uint    GetMultiplex(void)    const { return scanConfig->GetMultiplex();  }
+    bool DoDeleteChannels(void) const { return scanConfig->DoDeleteChannels();}
+    bool DoRenameChannels(void) const { return scanConfig->DoRenameChannels();}
+    QString GetFrequencyTable(void) const
+        { return scanConfig->GetFrequencyTable(); }
+    QMap<QString,QString> GetStartChan(void) const
+        { return scanConfig->GetStartChan(); }
+    bool    DoIgnoreSignalTimeout(void) const
+        { return scanConfig->DoIgnoreSignalTimeout(); }
+
+    void SetDefaultATSCFormat(const QString &atscFormat)
+        { scanConfig->SetDefaultATSCFormat(atscFormat); }
+
   protected:
-    ScanWizard          *parent;
-    ScanOptionalConfig  *scanConfig;
-    CaptureCardSetting  *capturecard;
     VideoSourceSelector *videoSource;
+    InputSelector       *input;
     ScanTypeSetting     *scanType;
+    ScanOptionalConfig  *scanConfig;
 };
 
 class LogList: public ListBoxSetting, public TransientStorage
@@ -553,15 +602,15 @@
         addChild(right);
     }
 
-    QString frequency()      { return pfrequency->getValue(); }
-    QString bandwidth()      { return pbandwidth->getValue(); }
-    QString inversion()      { return pinversion->getValue(); }
-    QString constellation()  { return pconstellation->getValue(); }
-    QString coderate_lp()    { return pcoderate_lp->getValue(); }
-    QString coderate_hp()    { return pcoderate_hp->getValue(); }
-    QString trans_mode()     { return ptrans_mode->getValue(); }
-    QString guard_interval() { return pguard_interval->getValue(); }
-    QString hierarchy()      { return phierarchy->getValue(); }
+    QString frequency(void)      const { return pfrequency->getValue();     }
+    QString bandwidth(void)      const { return pbandwidth->getValue();     }
+    QString inversion(void)      const { return pinversion->getValue();     }
+    QString constellation(void)  const { return pconstellation->getValue(); }
+    QString coderate_lp(void)    const { return pcoderate_lp->getValue();   }
+    QString coderate_hp(void)    const { return pcoderate_hp->getValue();   }
+    QString trans_mode(void)     const { return ptrans_mode->getValue();    }
+    QString guard_interval(void) const { return pguard_interval->getValue(); }
+    QString hierarchy(void)      const { return phierarchy->getValue();     }
 
   protected:
     ScanFrequency        *pfrequency;
@@ -574,7 +623,7 @@
     ScanGuardInterval    *pguard_interval;
     ScanHierarchy        *phierarchy;
 };
-#ifdef FE_GET_EXTENDED_INFO
+
 class DVBS2Pane : public HorizontalConfigurationGroup
 {
   public:
@@ -610,7 +659,6 @@
     ScanPolarity   *ppolarity;
     ScanModulation *pmodulation;
 };
-#endif
 
 class QPSKPane : public HorizontalConfigurationGroup
 {
@@ -631,11 +679,11 @@
         addChild(right);     
     }
 
-    QString frequency()  { return pfrequency->getValue(); }
-    QString symbolrate() { return psymbolrate->getValue(); }
-    QString inversion()  { return pinversion->getValue(); }
-    QString fec()        { return pfec->getValue(); }
-    QString polarity()   { return ppolarity->getValue(); }
+    QString frequency(void)  const { return pfrequency->getValue();  }
+    QString symbolrate(void) const { return psymbolrate->getValue(); }
+    QString inversion(void)  const { return pinversion->getValue();  }
+    QString fec(void)        const { return pfec->getValue();        }
+    QString polarity(void)   const { return ppolarity->getValue();   }
 
   protected:
     ScanFrequency  *pfrequency;
@@ -664,11 +712,11 @@
         addChild(right);     
     }
 
-    QString frequency()  { return pfrequency->getValue(); }
-    QString symbolrate() { return psymbolrate->getValue(); }
-    QString inversion()  { return pinversion->getValue(); }
-    QString fec()        { return pfec->getValue(); }
-    QString modulation() { return pmodulation->getValue(); }
+    QString frequency(void)  const { return pfrequency->getValue();  }
+    QString symbolrate(void) const { return psymbolrate->getValue(); }
+    QString inversion(void)  const { return pinversion->getValue();  }
+    QString fec(void)        const { return pfec->getValue();        }
+    QString modulation(void) const { return pmodulation->getValue(); }
 
   protected:
     ScanFrequency  *pfrequency;
@@ -691,13 +739,13 @@
 
     QString atscFreqTable(void)  const { return atsc_table->getValue();      }
     QString atscModulation(void) const { return atsc_modulation->getValue(); }
-    QString atscFormat(void)     const { return atsc_format->getValue();     }
+    QString GetATSCFormat(void)  const { return atsc_format->getValue();     }
     bool DoDeleteChannels(void) const
         { return old_channel_treatment->getValue() == "delete"; }
     bool DoRenameChannels(void) const
         { return old_channel_treatment->getValue() == "rename"; }
 
-    void SetDefaultFormat(QString d)
+    void SetDefaultATSCFormat(const QString &d)
     {
         int val = atsc_format->getValueIndex(d);
         atsc_format->setValue(val);
@@ -712,7 +760,6 @@
 
 class STPane : public VerticalConfigurationGroup
 {
-    Q_OBJECT
   public:
     STPane() :
         VerticalConfigurationGroup(false, false, true, false),
@@ -727,7 +774,7 @@
         addChild(ignore_signal_timeout);
     }
 
-    QString atscFormat(void) const { return atsc_format->getValue(); }
+    QString GetATSCFormat(void) const { return atsc_format->getValue(); }
     bool DoDeleteChannels(void) const
         { return old_channel_treatment->getValue() == "delete"; }
     bool DoRenameChannels(void) const
@@ -737,10 +784,15 @@
     bool ignoreSignalTimeout(void) const
         { return ignore_signal_timeout->getValue().toInt(); }
 
-  public slots:
-    void sourceID(const QString &str)
-        { transport_setting->sourceID(str); }
+    void SetDefaultATSCFormat(const QString &d)
+    {
+        int val = atsc_format->getValueIndex(d);
+        atsc_format->setValue(val);
+    }
 
+    void SetSourceID(uint sourceid)
+        { transport_setting->SetSourceID(sourceid); }
+
   protected:
     MultiplexSetting        *transport_setting;
     ScanATSCChannelFormat   *atsc_format;
@@ -777,6 +829,12 @@
     bool DoIgnoreSignalTimeout(void) const
         { return ignore_signal_timeout->getValue().toInt(); }
 
+    void SetDefaultATSCFormat(const QString &d)
+    {
+        int val = atsc_format->getValueIndex(d);
+        atsc_format->setValue(val);
+    }
+
   private:
     TransLineEditSetting    *filename;
     ScanATSCChannelFormat   *atsc_format;
Index: libs/libmythtv/scanwizardscanner.cpp
===================================================================
--- libs/libmythtv/scanwizardscanner.cpp	(revision 11768)
+++ libs/libmythtv/scanwizardscanner.cpp	(working copy)
@@ -71,8 +71,21 @@
 /// Percentage to set to after the first tune
 #define TUNED_PCT     3
 
-const QString ScanWizardScanner::strTitle(QObject::tr("Scanning"));
+QString ScanWizardScanner::kTitle = QString::null;
 
+// kTitel must be initialized after the Qt translation system is initialized...
+static void init_statics(void)
+{
+    static QMutex lock;
+    static bool do_init = true;
+    QMutexLocker locker(&lock);
+    if (do_init)
+    {
+        ScanWizardScanner::kTitle = ScanWizardScanner::tr("Scanning");
+        do_init = false;
+    }
+}
+
 void post_event(QObject *dest, ScannerEvent::TYPE type, int val)
 {
     ScannerEvent* e = new ScannerEvent(type);
@@ -80,45 +93,26 @@
     QApplication::postEvent(dest, e);
 }
 
-DVBChannel *ScanWizardScanner::GetDVBChannel(void)
-{
-#ifdef USING_DVB
-    return dynamic_cast<DVBChannel*>(channel);
-#else
-    return NULL;
-#endif
-}
-
-Channel *ScanWizardScanner::GetChannel(void)
-{
-#ifdef USING_V4L
-    return dynamic_cast<Channel*>(channel);
-#else
-    return NULL;
-#endif
-}
-
-ScanWizardScanner::ScanWizardScanner(ScanWizard *_parent)
+ScanWizardScanner::ScanWizardScanner(void)
     : VerticalConfigurationGroup(false, true, false, false),
-      parent(_parent),
       log(new LogList()),
       channel(NULL),                popupProgress(NULL),
       scanner(NULL),                analogScanner(NULL),
       freeboxScanner(NULL),
-      nScanType(-1),
-      nMultiplexToTuneTo(0),        nVideoSource(0),
       frequency(0),                 modulation("8vsb")
 {
-    setLabel(strTitle);
+    init_statics();
+
+    setLabel(kTitle);
     addChild(log);
 }
 
-void ScanWizardScanner::finish()
+void ScanWizardScanner::Teardown()
 {
     // Join the thread and close the channel
     if (scanner)
     {
-        delete scanner;
+        delete scanner; // TODO we should use deleteLater...
         scanner = NULL;
     }
 
@@ -132,7 +126,7 @@
     if (analogScanner)
     {
         analogScanner->stop();
-        delete analogScanner;
+        analogScanner->deleteLater();
         analogScanner = NULL;
     }
 #endif
@@ -141,10 +135,16 @@
     if (freeboxScanner)
     {
         freeboxScanner->Stop();
-        delete freeboxScanner;
+        freeboxScanner->deleteLater();
         freeboxScanner = NULL;
     }
 #endif
+
+    if (popupProgress)
+    {
+        delete popupProgress; // TODO we should use deleteLater...
+        popupProgress = NULL;
+    }
 }
 
 void ScanWizardScanner::customEvent(QCustomEvent *e)
@@ -160,7 +160,7 @@
     {
         case ScannerEvent::ServiceScanComplete:
             popupProgress->progress(PROGRESS_MAX);
-            cancelScan();
+            Teardown();
             break;
         case ScannerEvent::Update:
             log->updateText(scanEvent->strValue());
@@ -181,20 +181,6 @@
         case ScannerEvent::DVBSignalStrength:
             popupProgress->signalStrength(scanEvent->intValue());
             break;
-        case ScannerEvent::TuneComplete:
-        {
-            if (scanEvent->intValue() == ScannerEvent::OK)
-            {
-                HandleTuneComplete();
-            }
-            else
-            {
-                MythPopupBox::showOkPopup(gContext->GetMainWindow(),
-                                          tr("ScanWizard"),
-                                          tr("Error tuning to transport"));
-                cancelScan();
-            }
-        }
     }
 }
 
@@ -273,132 +259,164 @@
     QApplication::postEvent(this, e);
 }
 
-void ScanWizardScanner::cancelScan()
-{
-    finish();
-    delete popupProgress;
-    popupProgress = NULL;
-}
-
 // full scan of existing transports broken
 // existing transport scan broken
-void ScanWizardScanner::scan()
+void ScanWizardScanner::Scan(
+    int            scantype,
+    uint           parent_cardid,
+    const QString &inputname,
+    uint           sourceid,
+    bool           do_delete_channels,
+    bool           do_rename_channels,
+    bool           do_ignore_signal_timeout,
+    // stuff needed for particular scans
+    uint           mplexid /* TransportScan */,
+    const QMap<QString,QString> &startChan /* NITAddScan */,
+    const QString &mod /* FullScan */,
+    const QString &tbl /* FullScan */,
+    const QString &atsc_format /* any ATSC scan */)
 {
-    int  ccardid = parent->captureCard();
-    int  pcardid = CardUtil::GetParentCardID(ccardid);
-    int  cardid  = (pcardid) ? pcardid : ccardid;
-    nScanType    = parent->scanType();
-    nVideoSource = parent->videoSource();
-    bool do_scan = true;
-    DTVTunerType parse_type = DTVTunerType::kTunerTypeUnknown;
+    nVideoSource = sourceid;
+    PreScanCommon(scantype, parent_cardid, inputname,
+                  sourceid, do_ignore_signal_timeout);
 
-    VERBOSE(VB_SIPARSER, LOC + "scan(): " +
-            QString("type(%1) src(%2) cardid(%3)")
-            .arg(nScanType).arg(nVideoSource).arg(cardid));
+    VERBOSE(VB_SIPARSER, LOC + "HandleTuneComplete()");
 
-    if (nScanType == ScanTypeSetting::FullScan_Analog)
+    if (!scanner)
     {
-        do_scan = false;
-        ScanAnalog(cardid, nVideoSource);
+        VERBOSE(VB_SIPARSER, LOC + "HandleTuneComplete(): "
+                "scanner does not exist...");
+        return;
     }
-    else if (nScanType == ScanTypeSetting::DVBUtilsImport)
+
+    scanner->StartScanner();
+
+    popupProgress->status(tr("Scanning"));
+    popupProgress->progress( (TUNED_PCT * PROGRESS_MAX) / 100 );
+
+    QString std = (ScanTypeSetting::FullScan_ATSC == scantype)? "atsc":"dvbt";
+
+    bool ok = false;
+
+    if (do_delete_channels && (ScanTypeSetting::TransportScan == scantype))
     {
-        ImportDVBUtils(nVideoSource, parent->nCardType, parent->filename());
+        MSqlQuery query(MSqlQuery::InitCon());
+        query.prepare("DELETE FROM channel "
+                      "WHERE sourceid = :SOURCEID AND "
+                      "      mplexid  = :MPLEXID");
+        query.bindValue(":SOURCEID", sourceid);
+        query.bindValue(":MPLEXID",  mplexid);
+        query.exec();
     }
-    else if ((nScanType == ScanTypeSetting::FullScan_ATSC)     ||
-             (nScanType == ScanTypeSetting::FullTransportScan) ||
-             (nScanType == ScanTypeSetting::TransportScan)     ||
-             (nScanType == ScanTypeSetting::FullScan_OFDM))
+    else if (do_delete_channels)
     {
-        ;
+        MSqlQuery query(MSqlQuery::InitCon());
+        query.prepare("DELETE FROM channel "
+                      "WHERE sourceid = :SOURCEID");
+        query.bindValue(":SOURCEID", sourceid);
+        query.exec();
+
+        if (ScanTypeSetting::TransportScan != scantype)
+        {
+            query.prepare("DELETE FROM dtv_multiplex "
+                          "WHERE sourceid = :SOURCEID");
+            query.bindValue(":SOURCEID", sourceid);
+            query.exec();
+        }
     }
-    else if (nScanType == ScanTypeSetting::NITAddScan_OFDM)
+
+    scanner->SetChannelFormat(atsc_format);
+    scanner->SetRenameChannels(do_rename_channels);
+
+    if ((ScanTypeSetting::FullScan_ATSC == scantype) ||
+        (ScanTypeSetting::FullScan_OFDM == scantype))
     {
-        OFDMPane *pane = parent->paneOFDM;
-        startChan.clear();
-        startChan["std"]            = "dvb";
-        startChan["frequency"]      = pane->frequency();
-        startChan["inversion"]      = pane->inversion();
-        startChan["bandwidth"]      = pane->bandwidth();
-        startChan["modulation"]     = "ofdm";
-        startChan["coderate_hp"]    = pane->coderate_hp();
-        startChan["coderate_lp"]    = pane->coderate_lp();
-        startChan["constellation"]  = pane->constellation();
-        startChan["trans_mode"]     = pane->trans_mode();
-        startChan["guard_interval"] = pane->guard_interval();
-        startChan["hierarchy"]      = pane->hierarchy();
+        VERBOSE(VB_SIPARSER, LOC +
+                "ScanTransports("<<std<<", "<<mod<<", "<<tbl<<")");
 
-        parse_type = DTVTunerType::kTunerTypeOFDM;
+        // HACK HACK HACK -- begin
+        // if using QAM we may need additional time... (at least with HD-3000)
+        if ((mod.left(3).lower() == "qam") &&
+            (scanner->GetSignalTimeout() < 1000))
+        {
+            scanner->SetSignalTimeout(1000);
+        }
+        // HACK HACK HACK -- end
+
+        ok = scanner->ScanTransports(sourceid, std, mod, tbl);
     }
-    else if (nScanType == ScanTypeSetting::NITAddScan_QPSK)
+    else if ((ScanTypeSetting::NITAddScan_OFDM == scantype) ||
+             (ScanTypeSetting::NITAddScan_QPSK == scantype) ||
+             (ScanTypeSetting::NITAddScan_QAM  == scantype))
     {
-        QPSKPane *pane = parent->paneQPSK;
-        startChan.clear();
-        startChan["std"]        = "dvb";
-        startChan["frequency"]  = pane->frequency();
-        startChan["inversion"]  = pane->inversion();
-        startChan["symbolrate"] = pane->symbolrate();
-        startChan["fec"]        = pane->fec();
-        startChan["modulation"] = "qpsk";
-        startChan["polarity"]   = pane->polarity();
+        VERBOSE(VB_SIPARSER, LOC + "ScanTransports()");
 
-        parse_type = DTVTunerType::kTunerTypeQPSK;
+        ok = scanner->ScanTransportsStartingOn(sourceid, startChan);
     }
-    else if (nScanType == ScanTypeSetting::NITAddScan_QAM)
+    else if (ScanTypeSetting::FullTransportScan == scantype)
     {
-        QAMPane *pane = parent->paneQAM;
-        startChan.clear();
-        startChan["std"]        = "dvb";
-        startChan["frequency"]  = pane->frequency();
-        startChan["inversion"]  = pane->inversion();
-        startChan["symbolrate"] = pane->symbolrate();
-        startChan["fec"]        = pane->fec();
-        startChan["modulation"] = pane->modulation();
+        VERBOSE(VB_SIPARSER, LOC + "ScanServicesSourceID("<<sourceid<<")");
 
-        parse_type = DTVTunerType::kTunerTypeQAM;
+        ok = scanner->ScanServicesSourceID(sourceid);
+        if (ok)
+        {
+            post_event(this, ScannerEvent::ServicePct,
+                       TRANSPORT_PCT);
+        }
+        else
+        {
+            MythPopupBox::showOkPopup(gContext->GetMainWindow(),
+                                      tr("ScanWizard"),
+                                      tr("Error tuning to transport"));
+            Teardown();
+        }
     }
-    else if (nScanType == ScanTypeSetting::IPTVImport)
+    else if ((ScanTypeSetting::DVBUtilsImport == scantype) && channels.size())
     {
-        do_scan = false;
-        ImportM3U(cardid, nVideoSource);
-    }
-    else
-    {
-        do_scan = false;
-        VERBOSE(VB_SIPARSER, LOC_ERR + "scan(): " +
-                QString("type(%1) src(%2) cardid(%3) not handled")
-                .arg(nScanType).arg(nVideoSource).arg(cardid));
+        ok = true;
 
-        MythPopupBox::showOkPopup(
-            gContext->GetMainWindow(), tr("ScanWizard"),
-            "Programmer Error, see console");
-    }
+        VERBOSE(VB_SIPARSER, LOC + "ScanForChannels("<<sourceid<<")");
 
-    DTVMultiplex tuning;
-    if ((DTVTunerType::kTunerTypeUnknown != parse_type) &&
-        !tuning.ParseTuningParams(
-            parse_type,
-            startChan["frequency"],      startChan["inversion"],
-            startChan["symbolrate"],     startChan["fec"],
-            startChan["polarity"],
-            startChan["coderate_hp"],    startChan["coderate_lp"],
-            startChan["constellation"],  startChan["trans_mode"],
-            startChan["guard_interval"], startChan["hierarchy"],
-            startChan["modulation"],     startChan["bandwidth"]))
+        QString card_type = CardUtil::GetRawCardType(parent_cardid, inputname);
+        QString sub_type  = card_type;
+        if (card_type == "DVB")
+        {
+            QString device = CardUtil::GetVideoDevice(
+                parent_cardid, inputname);
+
+            ok = !device.isEmpty();
+            if (ok)
+                sub_type = CardUtil::ProbeDVBType(device.toUInt()).upper();
+        }
+
+        if (ok)
+        {
+            ok = scanner->ScanForChannels(sourceid, std,
+                                          sub_type, channels);
+        }
+        if (ok)
+        {
+            post_event(this, ScannerEvent::ServicePct,
+                       TRANSPORT_PCT);
+        }
+        else
+        {
+            MythPopupBox::showOkPopup(gContext->GetMainWindow(),
+                                      tr("ScanWizard"),
+                                      tr("Error tuning to transport"));
+            Teardown();
+        }
+    }
+    else if (ScanTypeSetting::TransportScan == scantype)
     {
-        MythPopupBox::showOkPopup(
-            gContext->GetMainWindow(), tr("ScanWizard"),
-            tr("Error parsing parameters"));
+        VERBOSE(VB_SIPARSER, LOC + "ScanTransport("<<mplexid<<")");
 
-        do_scan = false;
+        ok = scanner->ScanTransport(mplexid);
     }
 
-    if (do_scan)
+    if (!ok)
     {
-        PreScanCommon(cardid, nVideoSource);
-        ScannerEvent* e = new ScannerEvent(ScannerEvent::TuneComplete);
-        e->intValue(ScannerEvent::OK);
-        QApplication::postEvent(this, e);
+        VERBOSE(VB_IMPORTANT, "Failed to handle tune complete.");
     }
 }
 
@@ -434,20 +452,26 @@
     }
 }
 
-void ScanWizardScanner::PreScanCommon(uint cardid, uint sourceid)
+void ScanWizardScanner::PreScanCommon(int scantype,
+                                      uint pcardid,
+                                      const QString &inputname,
+                                      uint sourceid,
+                                      bool do_ignore_signal_timeout)
 {
+    uint ccardid         = CardUtil::GetChildCardID(pcardid);
+    uint hw_cardid       = (ccardid) ? ccardid : pcardid;
     uint signal_timeout  = 1000;
     uint channel_timeout = 40000;
-    CardUtil::GetTimeouts(parent->captureCard(),
-                          signal_timeout, channel_timeout);
+    CardUtil::GetTimeouts(hw_cardid, signal_timeout, channel_timeout);
 
-    nMultiplexToTuneTo = parent->paneSingle->GetMultiplex();
-
-    QString device = CardUtil::GetVideoDevice(cardid, sourceid);
+    QString device = CardUtil::GetVideoDevice(pcardid, inputname);
     if (device.isEmpty())
+    {
+        VERBOSE(VB_IMPORTANT, "No Device");
         return;
+    }
 
-    QString card_type = CardUtil::GetRawCardType(cardid, sourceid);
+    QString card_type = CardUtil::GetRawCardType(pcardid, inputname);
 
     if ("DVB" == card_type)
     {
@@ -457,10 +481,10 @@
                          ("OFDM" == sub_type));
 
         // Ugh, Some DVB drivers don't fully support signal monitoring...
-        if (ScanTypeSetting::TransportScan == parent->scanType() ||
-            ScanTypeSetting::FullTransportScan == parent->scanType())
+        if ((ScanTypeSetting::TransportScan     == scantype) ||
+            (ScanTypeSetting::FullTransportScan == scantype))
         {
-            signal_timeout = (parent->ignoreSignalTimeout()) ?
+            signal_timeout = (do_ignore_signal_timeout) ?
                 channel_timeout * 10 : signal_timeout;
         }
 
@@ -482,7 +506,7 @@
 #ifdef USING_HDHOMERUN
     if ("HDHOMERUN" == card_type)
     {
-        uint tuner = CardUtil::GetHDHRTuner(cardid, sourceid);
+        uint tuner = CardUtil::GetHDHRTuner(pcardid, inputname);
         channel = new HDHRChannel(NULL, device, tuner);
     }
 #endif // USING_HDHOMERUN
@@ -494,7 +518,7 @@
     }
 
     // explicitly set the cardid
-    channel->SetCardID(cardid);
+    channel->SetCardID(pcardid);
 
     // If the backend is running this may fail...
     if (!channel->Open())
@@ -503,15 +527,15 @@
         return;
     }
 
-    scanner = new SIScan(card_type, channel, parent->videoSource(),
+    scanner = new SIScan(card_type, channel, sourceid,
                          signal_timeout, channel_timeout);
 
     scanner->SetForceUpdate(true);
 
-    bool ftao = CardUtil::IgnoreEncrypted(cardid, channel->GetCurrentInput());
+    bool ftao = CardUtil::IgnoreEncrypted(pcardid, inputname);
     scanner->SetFTAOnly(ftao);
 
-    bool tvo = CardUtil::TVOnly(cardid, channel->GetCurrentInput());
+    bool tvo = CardUtil::TVOnly(pcardid, inputname);
     scanner->SetTVOnly(tvo);
 
     connect(scanner, SIGNAL(ServiceScanComplete(void)),
@@ -557,11 +581,12 @@
     popupProgress->exec(this);
 }
 
-void ScanWizardScanner::ScanAnalog(uint cardid, uint sourceid)
+void ScanWizardScanner::ScanAnalog(
+    uint cardid, const QString &inputname, uint sourceid)
 {
 #ifdef USING_V4L
     //Create an analog scan object
-    analogScanner    = new AnalogScan(sourceid, cardid);
+    analogScanner = new AnalogScan(cardid, sourceid, inputname);
     popupProgress = new ScanProgressPopup(this, false);
 
     connect(analogScanner, SIGNAL(serviceScanComplete(void)),
@@ -579,16 +604,17 @@
         MythPopupBox::showOkPopup(gContext->GetMainWindow(),
                                   tr("ScanWizard"),
                                   tr("Error starting scan"));
-        cancelScan();
+        Teardown();
     }
 #endif
 }
 
-void ScanWizardScanner::ImportM3U(uint cardid, uint sourceid)
+void ScanWizardScanner::ImportM3U(uint cardid, const QString &inputname,
+                                  uint sourceid)
 {
 #ifdef USING_IPTV
     //Create an analog scan object
-    freeboxScanner = new IPTVChannelFetcher(sourceid, cardid);
+    freeboxScanner = new IPTVChannelFetcher(cardid, inputname, sourceid);
     popupProgress  = new ScanProgressPopup(this, false);
 
     connect(freeboxScanner, SIGNAL(ServiceScanComplete(void)),
@@ -606,178 +632,7 @@
         MythPopupBox::showOkPopup(gContext->GetMainWindow(),
                                   tr("ScanWizard"),
                                   tr("Error starting scan"));
-        cancelScan();
+        Teardown();
     }
 #endif // USING_IPTV
 }
-
-void ScanWizardScanner::HandleTuneComplete(void)
-{
-    VERBOSE(VB_SIPARSER, LOC + "HandleTuneComplete()");
-
-    if (!scanner)
-    {
-        VERBOSE(VB_SIPARSER, LOC + "HandleTuneComplete(): "
-                "Waiting for scan to start.");
-        MythTimer t;
-        t.start();
-        while (!scanner && t.elapsed() < 500)
-            usleep(250);
-        if (!scanner)
-        {
-            VERBOSE(VB_SIPARSER, LOC +
-                    "HandleTuneComplete(): "
-                    "scan() did not start scanner! Aborting.");
-            return;
-        }
-        VERBOSE(VB_SIPARSER, LOC + "HandleTuneComplete(): "
-                "scan() has started scanner.");
-        usleep(5000);
-    }
-
-    scanner->StartScanner();
-
-    popupProgress->status(tr("Scanning"));
-    popupProgress->progress( (TUNED_PCT * PROGRESS_MAX) / 100 );
-
-    QString std     = "dvbt";
-    QString mod     = "ofdm";
-    QString country = parent->country();
-    if (nScanType == ScanTypeSetting::FullScan_ATSC)
-    {
-        std     = "atsc";
-        mod     = parent->paneATSC->atscModulation();
-        country = parent->paneATSC->atscFreqTable();
-    }
-
-    bool ok = false;
-
-    if ((nScanType == ScanTypeSetting::FullScan_ATSC) ||
-        (nScanType == ScanTypeSetting::FullScan_OFDM))
-    {
-        VERBOSE(VB_SIPARSER, LOC +
-                "ScanTransports("<<std<<", "<<mod<<", "<<country<<")");
-        scanner->SetChannelFormat(parent->paneATSC->atscFormat());
-        if (parent->paneATSC->DoDeleteChannels())
-        {
-            MSqlQuery query(MSqlQuery::InitCon());
-            query.prepare("DELETE FROM channel "
-                          "WHERE sourceid = :SOURCEID");
-            query.bindValue(":SOURCEID", nVideoSource);
-            query.exec();
-            query.prepare("DELETE FROM dtv_multiplex "
-                          "WHERE sourceid = :SOURCEID");
-            query.bindValue(":SOURCEID", nVideoSource);
-            query.exec();
-        }
-        scanner->SetRenameChannels(parent->paneATSC->DoRenameChannels());
-
-        // HACK HACK HACK -- begin
-        // if using QAM we may need additional time... (at least with HD-3000)
-        if ((mod.left(3).lower() == "qam") &&
-            (scanner->GetSignalTimeout() < 1000))
-        {
-            scanner->SetSignalTimeout(1000);
-        }
-        // HACK HACK HACK -- end
-
-        ok = scanner->ScanTransports(nVideoSource, std, mod, country);
-    }
-    else if ((nScanType == ScanTypeSetting::NITAddScan_OFDM) ||
-             (nScanType == ScanTypeSetting::NITAddScan_QPSK) ||
-             (nScanType == ScanTypeSetting::NITAddScan_QAM))
-    {
-        VERBOSE(VB_SIPARSER, LOC + "ScanTransports()");
-        scanner->SetRenameChannels(false);
-        ok = scanner->ScanTransportsStartingOn(nVideoSource, startChan);
-    }
-    else if (nScanType == ScanTypeSetting::FullTransportScan)
-    {
-        VERBOSE(VB_SIPARSER, LOC + "ScanServicesSourceID("<<nVideoSource<<")");
-        scanner->SetRenameChannels(false);
-        ok = scanner->ScanServicesSourceID(nVideoSource);
-        if (ok)
-        {
-            post_event(this, ScannerEvent::ServicePct,
-                       TRANSPORT_PCT);
-        }
-        else
-        {
-            post_event(this, ScannerEvent::TuneComplete,
-                       ScannerEvent::ERROR_TUNE);
-        }
-    }
-    else if (nScanType == ScanTypeSetting::DVBUtilsImport && channels.size())
-    {
-        ok = true;
-
-        VERBOSE(VB_SIPARSER, LOC + "ScanForChannels("<<nVideoSource<<")");
-
-        scanner->SetChannelFormat(parent->paneDVBUtilsImport->GetATSCFormat());
-
-        if (parent->paneDVBUtilsImport->DoDeleteChannels())
-        {
-            MSqlQuery query(MSqlQuery::InitCon());
-            query.prepare("DELETE FROM channel "
-                          "WHERE sourceid = :SOURCEID");
-            query.bindValue(":SOURCEID", nVideoSource);
-            query.exec();
-        }
-
-        scanner->SetRenameChannels(
-            parent->paneDVBUtilsImport->DoRenameChannels());
-
-        int  ccardid = parent->captureCard();
-        int  pcardid = CardUtil::GetParentCardID(ccardid);
-        int  cardid  = (pcardid) ? pcardid : ccardid;
-        QString card_type = CardUtil::GetRawCardType(cardid, nVideoSource);
-        QString sub_type = card_type;
-        if (card_type == "DVB")
-        {
-            QString device = CardUtil::GetVideoDevice(cardid, nVideoSource);
-            ok = !device.isEmpty();
-            if (ok)
-                sub_type = CardUtil::ProbeDVBType(device.toUInt()).upper();
-        }
-
-        if (ok)
-        {
-            ok = scanner->ScanForChannels(nVideoSource, std,
-                                          sub_type, channels);
-        }
-        if (ok)
-        {
-            post_event(this, ScannerEvent::ServicePct,
-                       TRANSPORT_PCT);
-        }
-        else
-        {
-            post_event(this, ScannerEvent::TuneComplete,
-                       ScannerEvent::ERROR_TUNE);
-        }
-    }
-    else if (nScanType == ScanTypeSetting::TransportScan)
-    {
-        VERBOSE(VB_SIPARSER, LOC + "ScanTransport("<<nMultiplexToTuneTo<<")");
-        scanner->SetChannelFormat(parent->paneSingle->atscFormat());
-
-        if (parent->paneSingle->DoDeleteChannels())
-        {
-            MSqlQuery query(MSqlQuery::InitCon());
-            query.prepare("DELETE FROM channel "
-                          "WHERE sourceid = :SOURCEID AND "
-                          "      mplexid  = :MPLEXID");
-            query.bindValue(":SOURCEID", nVideoSource);
-            query.bindValue(":MPLEXID",  nMultiplexToTuneTo);
-            query.exec();
-        }
-
-        scanner->SetRenameChannels(parent->paneSingle->DoRenameChannels());
-        ok = scanner->ScanTransport(nMultiplexToTuneTo);
-    }
-
-    if (!ok)
-    {
-        VERBOSE(VB_IMPORTANT, "Failed to handle tune complete.");
-    }
-}
Index: libs/libmythtv/analogscan.cpp
===================================================================
--- libs/libmythtv/analogscan.cpp	(revision 11768)
+++ libs/libmythtv/analogscan.cpp	(working copy)
@@ -45,11 +45,11 @@
 
 #include "analogscan.h"
 
-AnalogScan::AnalogScan(unsigned _sourceid, unsigned _cardid) :
-    fRunning(false),
-    fStop(false),
-    sourceid(_sourceid),
-    cardid(_cardid)
+AnalogScan::AnalogScan(uint _cardid, uint _sourceid,
+                       const QString &_inputname) :
+    cardid(_cardid), sourceid(_sourceid),
+    inputname(QDeepCopy<QString>(_inputname)),
+    fRunning(false), fStop(false), nTable(0)
 {
 }
 
@@ -84,13 +84,12 @@
     struct CHANLIST *flist   = NULL;
     uint count               = 0;
 
-    QString device = CardUtil::GetVideoDevice(cardid, sourceid);
-    QString input  = CardUtil::GetInputName(cardid, sourceid);
-    if (device.isEmpty() || input.isEmpty())
+    QString device = CardUtil::GetVideoDevice(cardid, inputname);
+    if (device.isEmpty() || inputname.isEmpty())
         goto do_scan_end;
 
     VERBOSE(VB_SIPARSER, "AnalogScan::doScan() " +
-            QString("dev(%1) input(%2)").arg(device).arg(input));
+            QString("dev(%1) input(%2)").arg(device).arg(inputname));
 
     channel = new Channel(NULL, device);
     if (!channel->Open())
@@ -101,7 +100,7 @@
     for (uint i = 0; i < count && !fStop; i++, flist++)
     {
         unsigned frequency = flist->freq * 1000;
-        channel->Tune(frequency, input, "analog", QString::null);
+        channel->Tune(frequency, inputname, "analog", QString::null);
         usleep(200000); /* 0.2 sec */
         if (channel->IsTuned())
         {
Index: libs/libmythtv/scanwizard.h
===================================================================
--- libs/libmythtv/scanwizard.h	(revision 11768)
+++ libs/libmythtv/scanwizard.h	(working copy)
@@ -37,55 +37,33 @@
 #include "mythwizard.h"
 #include "settings.h"
 
-class OFDMPane;
-class QPSKPane;
-class ATSCPane;
-class QAMPane;
-class STPane;
-class DVBUtilsImportPane;
-class ScanWizardScanType;
+class ScanWizardConfig;
 class ScanWizardScanner;
 
 class ScanWizard : public QObject, public ConfigurationWizard 
 {
     Q_OBJECT
-    friend class ScanWizardScanType;
-    friend class ScanWizardScanner;
-    friend class ScanOptionalConfig;
 
   public:
-    ScanWizard(int sourceid = -1);
+    ScanWizard(uint    default_sourceid  = 0,
+               uint    default_cardid    = 0,
+               QString default_inputname = QString::null,
+               bool    force_sourceid    = false);
 
     MythDialog *dialogWidget(MythMainWindow *parent, const char *widgetName);
 
   protected slots:
-    void pageSelected(const QString &strTitle);
-    void captureCard(const QString &device);
+    void SetPage(const QString &pageTitle);
+    void SetInput(const QString &cardid_inputname);
 
-  signals:
-    void cardTypeChanged(const QString&);
-
   protected:
-    uint videoSource(void) const;
-    int captureCard(void) const;
-    int scanType(void) const;
-    bool ignoreSignalTimeout(void) const;
-    QString country(void) const;
-    QString filename(void) const;
+    ~ScanWizard() { }
 
-    OFDMPane     *paneOFDM;
-    QPSKPane     *paneQPSK;
-    ATSCPane     *paneATSC;
-    QAMPane      *paneQAM;
-    STPane       *paneSingle;
-    DVBUtilsImportPane *paneDVBUtilsImport;
-
-    int           nVideoDev;
-    unsigned      nCardType;
-    int           nCaptureCard;
-    ScanWizardScanType *configPane;
-    ScanWizardScanner  *scannerPane;
+  protected:
+    uint               lastHWCardID;
+    uint               lastHWCardType;
+    ScanWizardConfig  *configPane;
+    ScanWizardScanner *scannerPane;
 };
 
-
 #endif // SCANWIZARD_H
Index: libs/libmythtv/channeleditor.h
===================================================================
--- libs/libmythtv/channeleditor.h	(revision 11768)
+++ libs/libmythtv/channeleditor.h	(working copy)
@@ -21,7 +21,7 @@
     void del();
     void edit();
     void edit(int);
-    void scan();
+    void scan(void);
     void transportEditor();
     void deleteChannels();
 
Index: libs/libmythtv/sourceutil.h
===================================================================
--- libs/libmythtv/sourceutil.h	(revision 11768)
+++ libs/libmythtv/sourceutil.h	(working copy)
@@ -18,6 +18,7 @@
                                         QString &passwd,  QString &lineupid);
     static bool    IsEncoder(uint sourceid);
     static bool    IsUnscanable(uint sourceid);
+    static bool    IsAnySourceScanable(void);
     static bool    UpdateChannelsFromListings(
         uint sourceid, QString cardtype = QString::null);
 };
Index: libs/libmythtv/videosource.cpp
===================================================================
--- libs/libmythtv/videosource.cpp	(revision 11768)
+++ libs/libmythtv/videosource.cpp	(working copy)
@@ -1707,12 +1707,12 @@
     }
 #endif
 
-    TransButtonSetting *scan = new TransButtonSetting();
+    scan = new TransButtonSetting();
     scan->setLabel(tr("Scan for channels"));
     scan->setHelpText(
         tr("Use channel scanner to find channels for this input."));
 
-    TransButtonSetting *srcfetch = new TransButtonSetting();
+    srcfetch = new TransButtonSetting();
     srcfetch->setLabel(tr("Fetch channels from listings source"));
     srcfetch->setHelpText(
         tr("This uses the listings data source to "
@@ -1735,12 +1735,23 @@
     addChild(childid);
 
     setName("CardInput");
+    SetSourceID("-1");
+
     connect(scan,     SIGNAL(pressed()), SLOT(channelScanner()));
     connect(srcfetch, SIGNAL(pressed()), SLOT(sourceFetch()));
     connect(sourceid, SIGNAL(valueChanged(const QString&)),
             startchan,SLOT(  SetSourceID (const QString&)));
+    connect(sourceid, SIGNAL(valueChanged(const QString&)),
+            this,     SLOT(  SetSourceID (const QString&)));
 }
 
+void CardInput::SetSourceID(const QString &sourceid)
+{
+    bool enable = (sourceid.toInt() > 0);
+    scan->setEnabled(enable);
+    srcfetch->setEnabled(enable);
+}
+
 QString CardInput::getSourceName(void) const
 {
     return sourceid->getSelectionLabel();
@@ -1755,13 +1766,14 @@
 {
     uint srcid = sourceid->getValue().toUInt();
     uint crdid = cardid->getValue().toUInt();
+    QString in = inputname->getValue();
 
 #ifdef USING_BACKEND
     uint num_channels_before = SourceUtil::GetChannelCount(srcid);
 
     save(); // save info for scanner.
 
-    QString cardtype = CardUtil::GetRawCardType(crdid, srcid);
+    QString cardtype = CardUtil::GetRawCardType(crdid, in);
     if (CardUtil::IsUnscanable(cardtype))
     {
         VERBOSE(VB_IMPORTANT, QString("Sorry, %1 cards do not "
@@ -1769,8 +1781,9 @@
         return;
     }
 
-    ScanWizard scanwizard(srcid);
-    scanwizard.exec(false,true);
+    ScanWizard *scanwizard = new ScanWizard(srcid, crdid, in, true);
+    scanwizard->exec(false, true);
+    scanwizard->deleteLater();
 
     if (SourceUtil::GetChannelCount(srcid))
         startchan->SetSourceID(QString::number(srcid));        
Index: libs/libmythtv/scanwizard.cpp
===================================================================
--- libs/libmythtv/scanwizard.cpp	(revision 11768)
+++ libs/libmythtv/scanwizard.cpp	(working copy)
@@ -36,95 +36,152 @@
 #include "cardutil.h"
 #include "videosource.h"
 
-ScanWizard::ScanWizard(int sourceid)
-    : paneOFDM(new OFDMPane()),     paneQPSK(new QPSKPane()),
-      paneATSC(new ATSCPane()),     paneQAM(new QAMPane()),
-      paneSingle(new STPane()),
-      paneDVBUtilsImport(new DVBUtilsImportPane()),
-#ifdef FE_GET_EXTENDED_INFO
-      paneDVBS2(new DVBS2Pane()),
-#endif
-      nVideoDev(-1),                nCardType(CardUtil::ERROR_PROBE),
-      nCaptureCard(-1),
-      configPane(new ScanWizardScanType(this, sourceid)),
-      scannerPane(new ScanWizardScanner(this))
+#define LOC QString("SWiz: ")
+#define LOC_ERR QString("SWiz, Error: ")
+
+ScanWizard::ScanWizard(uint    default_sourceid,  uint default_cardid,
+                       QString default_inputname, bool force_sourceid) :
+    lastHWCardID(0),
+    lastHWCardType(CardUtil::ERROR_PROBE),
+    configPane(new ScanWizardConfig(this,
+                                    default_sourceid,  default_cardid,
+                                    default_inputname, force_sourceid)),
+    scannerPane(new ScanWizardScanner())
 {
     addChild(configPane);
     addChild(scannerPane);
 }
 
-MythDialog* ScanWizard::dialogWidget(MythMainWindow *parent,
-                                     const char *widgetName)
+MythDialog *ScanWizard::dialogWidget(MythMainWindow *parent, const char*)
 {
-    MythWizard* wizard = (MythWizard*)
-        ConfigurationWizard::dialogWidget(parent, widgetName);
+    MythWizard *wizard = (MythWizard*)
+        ConfigurationWizard::dialogWidget(parent, "ScanWizard");
 
-    connect(wizard, SIGNAL(selected(    const QString&)),
-            this,   SLOT(  pageSelected(const QString&)));
+    connect(wizard, SIGNAL(selected(const QString&)),
+            this,   SLOT(  SetPage( const QString&)));
 
     return wizard;
 }
 
-void ScanWizard::pageSelected(const QString& strTitle)
+void ScanWizard::SetPage(const QString &pageTitle)
 {
-    if (strTitle == ScanWizardScanner::strTitle)
-       scannerPane->scan();
-}
+    VERBOSE(VB_SIPARSER, QString("SetPage(%1)").arg(pageTitle));
+    if (pageTitle != ScanWizardScanner::kTitle)
+        return;
 
-void ScanWizard::captureCard(const QString &str)
-{
-    int new_cardid = str.toUInt();
-    //Work out what kind of card we've got
-    //We need to check against the last capture card so that we don't
-    //try and probe a card which is already open by scan()
-    if ((nCaptureCard != new_cardid) ||
-        (nCardType == CardUtil::ERROR_OPEN))
-    {
-        nCaptureCard    = new_cardid;
-        QString subtype = CardUtil::ProbeSubTypeName(nCaptureCard, 0);
-        nCardType       = CardUtil::toCardType(subtype);
-        QString fmt     = SourceUtil::GetChannelFormat(videoSource());
-        paneATSC->SetDefaultFormat(fmt);
-        emit cardTypeChanged(QString::number(nCardType));
-    }
-}
+    QMap<QString,QString> start_chan;
+    DTVTunerType parse_type = DTVTunerType::kTunerTypeUnknown;
 
-uint ScanWizard::videoSource(void) const
-{
-    return configPane->videoSource->getValue().toInt();
-}
+    uint    pcardid   = configPane->GetParentCardID();
+    QString inputname = configPane->GetInputName();
+    uint    sourceid  = configPane->GetSourceID();
+    int     scantype  = configPane->GetScanType();
+    bool    do_scan   = true;
 
-int ScanWizard::captureCard(void) const
-{
-    return configPane->capturecard->getValue().toInt();
-}
+    VERBOSE(VB_SIPARSER, LOC + "SetPage(): " +
+            QString("type(%1) pcardid(%2) inputname(%3)")
+            .arg(scantype).arg(pcardid).arg(inputname));
 
-int ScanWizard::scanType(void) const
-{
-    return configPane->scanType->getValue().toInt();
-}
+    if (scantype == ScanTypeSetting::FullScan_Analog)
+    {
+        do_scan = false;
+        scannerPane->ScanAnalog(pcardid, inputname, sourceid);
+    }
+    else if (scantype == ScanTypeSetting::DVBUtilsImport)
+    {
+        scannerPane->ImportDVBUtils(sourceid, lastHWCardType,
+                                    configPane->GetFilename());
+    }
+    else if (scantype == ScanTypeSetting::NITAddScan_OFDM)
+    {
+        start_chan = configPane->GetStartChan();
+        parse_type = DTVTunerType::kTunerTypeOFDM;
+    }
+    else if (scantype == ScanTypeSetting::NITAddScan_QPSK)
+    {
+        start_chan = configPane->GetStartChan();
+        parse_type = DTVTunerType::kTunerTypeQPSK;
+    }
+    else if (scantype == ScanTypeSetting::NITAddScan_QAM)
+    {
+        start_chan = configPane->GetStartChan();
+        parse_type = DTVTunerType::kTunerTypeQAM;
+    }
+    else if (scantype == ScanTypeSetting::IPTVImport)
+    {
+        do_scan = false;
+        scannerPane->ImportM3U(pcardid, inputname, sourceid);
+    }
+    else if ((scantype == ScanTypeSetting::FullScan_ATSC)     ||
+             (scantype == ScanTypeSetting::FullTransportScan) ||
+             (scantype == ScanTypeSetting::TransportScan)     ||
+             (scantype == ScanTypeSetting::FullScan_OFDM))
+    {
+        ;
+    }
+    else
+    {
+        do_scan = false;
+        VERBOSE(VB_SIPARSER, LOC_ERR + "SetPage(): " +
+                QString("type(%1) src(%2) pcardid(%3) not handled")
+                .arg(scantype).arg(sourceid).arg(pcardid));
 
-bool ScanWizard::ignoreSignalTimeout(void) const
-{
-    bool ts0 = (ScanTypeSetting::TransportScan == scanType());
-    bool vl0 = paneSingle->ignoreSignalTimeout();
+        MythPopupBox::showOkPopup(
+            gContext->GetMainWindow(), tr("ScanWizard"),
+            "Programmer Error, see console");
+    }
 
-    bool ts1 = (ScanTypeSetting::FullTransportScan == scanType());
-    bool vl1 = (configPane->scanConfig->
-                ignoreSignalTimeoutAll->getValue().toInt());
+    // Just verify what we get from the UI...
+    DTVMultiplex tuning;
+    if ((DTVTunerType::kTunerTypeUnknown != parse_type) &&
+        !tuning.ParseTuningParams(
+            parse_type,
+            start_chan["frequency"],      start_chan["inversion"],
+            start_chan["symbolrate"],     start_chan["fec"],
+            start_chan["polarity"],
+            start_chan["coderate_hp"],    start_chan["coderate_lp"],
+            start_chan["constellation"],  start_chan["trans_mode"],
+            start_chan["guard_interval"], start_chan["hierarchy"],
+            start_chan["modulation"],     start_chan["bandwidth"]))
+    {
+        MythPopupBox::showOkPopup(
+            gContext->GetMainWindow(), tr("ScanWizard"),
+            tr("Error parsing parameters"));
 
-    bool ts2 = (ScanTypeSetting::DVBUtilsImport == scanType());
-    bool vl2 = paneDVBUtilsImport->DoIgnoreSignalTimeout();
+        do_scan = false;
+    }
 
-    return (ts0) ? vl0 : ((ts1) ? vl1 : (ts2) ? vl2 : false);
+    if (do_scan)
+    {
+        scannerPane->Scan(
+            configPane->GetScanType(),       configPane->GetParentCardID(),
+            configPane->GetInputName(),      configPane->GetSourceID(),
+            configPane->DoDeleteChannels(),  configPane->DoRenameChannels(),
+            configPane->DoIgnoreSignalTimeout(), configPane->GetMultiplex(),
+            start_chan,                      configPane->GetModulation(),
+            configPane->GetFrequencyTable(), configPane->GetATSCFormat());
+    }
 }
 
-QString ScanWizard::country(void) const
+void ScanWizard::SetInput(const QString &cardids_inputname)
 {
-    return configPane->scanConfig->country->getValue();
-}
+    uint pcardid, ccardid;
+    QString inputname;
+    if (!InputSelector::Parse(cardids_inputname, pcardid, ccardid, inputname))
+        return;
 
-QString ScanWizard::filename(void) const
-{
-    return paneDVBUtilsImport->GetFilename();
+    uint hw_cardid = (ccardid) ? ccardid : pcardid;
+
+    // Work out what kind of card we've got
+    // We need to check against the last capture card so that we don't
+    // try and probe a card which is already open by scan()
+    if ((lastHWCardID != hw_cardid) ||
+        (lastHWCardType == CardUtil::ERROR_OPEN))
+    {
+        lastHWCardID    = hw_cardid;
+        QString subtype = CardUtil::ProbeSubTypeName(hw_cardid, 0);
+        lastHWCardType  = CardUtil::toCardType(subtype);
+        configPane->SetDefaultATSCFormat(
+            SourceUtil::GetChannelFormat(configPane->GetSourceID()));
+    }
 }
Index: libs/libmythtv/scanwizardscanner.h
===================================================================
--- libs/libmythtv/scanwizardscanner.h	(revision 11768)
+++ libs/libmythtv/scanwizardscanner.h	(working copy)
@@ -56,18 +56,33 @@
 
 class ScanWizardScanner : public VerticalConfigurationGroup
 {
-    friend class ScanWizard;
     Q_OBJECT
+
   public:
-    static const QString strTitle;
+    ScanWizardScanner(void);
+    virtual void deleteLater(void)
+        { Teardown(); VerticalConfigurationGroup::deleteLater(); }
 
-    ScanWizardScanner(ScanWizard *_parent);
-    ~ScanWizardScanner() { finish(); }
+    void Scan(int            scantype,
+              uint           parent_cardid,
+              const QString &inputname,
+              uint           sourceid,
+              bool           do_delete_channels,
+              bool           do_rename_channels,
+              bool           do_ignore_signal_timeout,
+              // stuff needed for particular scans
+              uint           mplexid,
+              const QMap<QString,QString> &startChan,
+              const QString &mod,
+              const QString &tbl,
+              const QString &atsc_format);
 
-    void scan(void);
+    void ImportDVBUtils(uint sourceid, int cardtype, const QString &file);
+    void ImportM3U(     uint cardid, const QString &inputname, uint sourceid);
+    void ScanAnalog(    uint cardid, const QString &inputname, uint sourceid);
 
   protected slots:
-    void cancelScan(void);
+    void CancelScan(void) { Teardown(); }
     void scanComplete(void);
     void transportScanComplete(void);
     void updateText(const QString& status);
@@ -80,24 +95,21 @@
     void serviceScanPctComplete(int pct);
 
   protected:
-    void ImportDVBUtils(uint sourceid, int cardtype, const QString &file);
-    void ImportM3U(uint cardid, uint sourceid);
-    void PreScanCommon(uint cardid, uint sourceid);
-    void TunedScanCommon(uint cardid, uint sourceid, bool ok);
-    void ScanAnalog(uint cardid, uint sourceid);
+    ~ScanWizardScanner() { Teardown(); }
+    void Teardown(void);
 
+    void PreScanCommon(int scantype, uint cardid, const QString &inputname,
+                       uint sourceid, bool do_ignore_signal_timeout);
+
     void dvbLock(int);
     void dvbSNR(int);
     void dvbSignalStrength(int);
-    void finish(void);
-    void HandleTuneComplete(void);
     void customEvent(QCustomEvent *e);
 
-    DVBChannel *GetDVBChannel(void);
-    Channel    *GetChannel(void);
+  public:
+    static QString kTitle;
 
   private:
-    ScanWizard        *parent;
     LogList           *log;
     ChannelBase       *channel;
     ScanProgressPopup *popupProgress;
@@ -106,14 +118,11 @@
     AnalogScan        *analogScanner;
     IPTVChannelFetcher *freeboxScanner;
 
-    int                nScanType;
-    int                nMultiplexToTuneTo;
     uint               nVideoSource;
 
     // tranport info
     uint               frequency;
     QString            modulation;
-    QMap<QString,QString> startChan;
 
     // dvb-utils imported channels
     DTVChannelList channels;
Index: libs/libmythtv/iptv/iptvchannelfetcher.cpp
===================================================================
--- libs/libmythtv/iptv/iptvchannelfetcher.cpp	(revision 11768)
+++ libs/libmythtv/iptv/iptvchannelfetcher.cpp	(working copy)
@@ -26,8 +26,10 @@
                          QString       &channum,
                          QString       &name);
 
-IPTVChannelFetcher::IPTVChannelFetcher(uint sourceid, uint cardid) :
-    _sourceid(sourceid),   _cardid(cardid),
+IPTVChannelFetcher::IPTVChannelFetcher(
+    uint cardid, const QString &inputname, uint sourceid) :
+    _cardid(cardid),       _inputname(QDeepCopy<QString>(inputname)),
+    _sourceid(sourceid),
     _chan_cnt(1),          _thread_running(false),
     _stop_now(false),      _lock(false)
 {
@@ -97,7 +99,7 @@
     _thread_running = true;
 
     // Step 1/4 : Get info from DB
-    QString url = CardUtil::GetVideoDevice(_cardid, _sourceid);
+    QString url = CardUtil::GetVideoDevice(_cardid, _inputname);
 
     if (_stop_now || url.isEmpty())
     {
Index: libs/libmythtv/iptv/iptvchannelfetcher.h
===================================================================
--- libs/libmythtv/iptv/iptvchannelfetcher.h	(revision 11768)
+++ libs/libmythtv/iptv/iptvchannelfetcher.h	(working copy)
@@ -18,8 +18,7 @@
     friend void *run_scan_thunk(void *param);
 
   public:
-    IPTVChannelFetcher(uint sourceid, uint cardid);
-    ~IPTVChannelFetcher();
+    IPTVChannelFetcher(uint cardid, const QString &inputname, uint sourceid);
 
     bool Scan(void);
     void Stop(void);
@@ -39,6 +38,7 @@
     void ServiceScanComplete(void);
 
   private:
+    ~IPTVChannelFetcher();
     void SetTotalNumChannels(uint val) { _chan_cnt = (val) ? val : 1; }
     void SetNumChannelsParsed(uint);
     void SetNumChannelsInserted(uint);
@@ -46,8 +46,9 @@
     void RunScan(void);
 
   private:
+    uint      _cardid;
+    QString   _inputname;
     uint      _sourceid;
-    uint      _cardid;
     uint      _chan_cnt;
     bool      _thread_running;
     bool      _stop_now;
Index: libs/libmythtv/scanwizardhelpers.cpp
===================================================================
--- libs/libmythtv/scanwizardhelpers.cpp	(revision 11768)
+++ libs/libmythtv/scanwizardhelpers.cpp	(working copy)
@@ -38,6 +38,7 @@
 #include "frequencies.h"
 #include "videosource.h"
 #include "cardutil.h"
+#include "sourceutil.h"
 #include "scanwizardhelpers.h"
 #include "scanwizardscanner.h"
 #include "scanwizard.h"
@@ -113,7 +114,7 @@
     addChild(cancel);
 
     connect(cancel, SIGNAL(pressed(void)),
-            parent, SLOT(  cancelScan(void)));
+            parent, SLOT(  CancelScan(void)));
 
     //Seem to need to do this as the constructor doesn't seem enough
     setUseLabel(false);
@@ -122,6 +123,7 @@
 
 ScanProgressPopup::~ScanProgressPopup()
 {
+    VERBOSE(VB_IMPORTANT, "~ScanProgressPopup()");
 }
 
 void ScanProgressPopup::signalToNoise(int value)
@@ -149,14 +151,17 @@
     dialog = (ConfigPopupDialogWidget*)
         dialogWidget(gContext->GetMainWindow(), "ScanProgressPopup");
     connect(dialog, SIGNAL(popupDone(void)),
-            parent, SLOT(cancelScan(void)));
+            parent, SLOT(  CancelScan(void)));
     dialog->ShowPopup(this);
 }
 
-void MultiplexSetting::refresh()
+void MultiplexSetting::load(void)
 {
     clearSelections();
-    
+
+    if (!sourceid)
+        return;
+
     MSqlQuery query(MSqlQuery::InitCon());
 
     query.prepare(
@@ -165,7 +170,7 @@
         "FROM dtv_multiplex "
         "WHERE sourceid = :SOURCEID "
         "ORDER by frequency, networkid, transportid");
-    query.bindValue(":SOURCEID", nSourceID);
+    query.bindValue(":SOURCEID", sourceid);
 
     if (!query.exec() || !query.isActive() || query.size() <= 0)
         return;
@@ -202,67 +207,177 @@
     }
 }
 
-void MultiplexSetting::sourceID(const QString& str)
+void MultiplexSetting::SetSourceID(uint _sourceid)
 {
-    nSourceID = str.toInt();
-    refresh();
+    sourceid = _sourceid;
+    load();
 }
 
-void CaptureCardSetting::refresh()
+InputSelector::InputSelector(
+    uint _default_cardid, const QString &_default_inputname) :
+    ComboBoxSetting(this), sourceid(0), default_cardid(_default_cardid),
+    default_inputname(QDeepCopy<QString>(_default_inputname))
 {
+    setLabel(tr("Input"));
+}
+
+void InputSelector::load(void)
+{
     clearSelections();
 
+    if (!sourceid)
+        return;
+
     MSqlQuery query(MSqlQuery::InitCon());
-
-    QString qstr =
-        "SELECT DISTINCT cardtype, videodevice, capturecard.cardid "
-        "FROM capturecard, videosource, cardinput "
-        "WHERE videosource.sourceid = :SOURCEID            AND "
-        "      cardinput.sourceid   = videosource.sourceid AND "
-        "      capturecard.cardtype in ";
-    qstr += card_types() + "       AND "
-        "      capturecard.hostname = :HOSTNAME            AND "
+    query.prepare(
+        "SELECT capturecard.cardid, cardinput.childcardid, "
+        "       cardtype, videodevice, inputname "
+        "FROM capturecard, cardinput, videosource "
+        "WHERE cardinput.sourceid = videosource.sourceid AND "
+        "      hostname           = :HOSTNAME            AND "
+        "      cardinput.sourceid = :SOURCEID            AND "
         "      ( ( cardinput.childcardid != '0' AND "
         "          cardinput.childcardid  = capturecard.cardid ) OR "
         "        ( cardinput.childcardid  = '0' AND "
         "          cardinput.cardid       = capturecard.cardid ) "
-        "      )";
+        "      )");
 
-    query.prepare(qstr);
-    query.bindValue(":SOURCEID", nSourceID);
     query.bindValue(":HOSTNAME", gContext->GetHostName());
+    query.bindValue(":SOURCEID", sourceid);
 
     if (!query.exec() || !query.isActive())
     {
-        MythContext::DBError("CaptureCardSetting::refresh()", query);
+        MythContext::DBError("InputSelector::load()", query);
         return;
     }
 
-    while (query.next())
+    uint which = 0, cnt = 0;
+    for (; query.next(); cnt++)
     {
-        addSelection("[ " + query.value(0).toString() + " : " +
-                     query.value(1).toString() + " ]",
-                     query.value(2).toString());
+        uint parent_cardid = query.value(0).toUInt();
+        uint child_cardid  = query.value(1).toUInt();
+        QString inputname  = query.value(4).toString();
+
+        QString desc = CardUtil::GetDeviceLabel(
+            parent_cardid,
+            query.value(2).toString(), query.value(3).toString());
+
+        if (child_cardid)
+        {
+            MSqlQuery query2(MSqlQuery::InitCon());
+            query2.prepare(
+                "SELECT cardtype, videodevice "
+                "FROM capturecard "
+                "WHERE cardid = :CARDID");
+
+            if (query2.next())
+            {
+                desc += " " + CardUtil::GetDeviceLabel(
+                    child_cardid,
+                    query2.value(0).toString(), query2.value(1).toString());
+            }
+        }
+
+        desc += QString(" (%1)").arg(inputname);
+
+        QString key = QString("%1:%2:%3")
+            .arg(parent_cardid).arg(child_cardid).arg(inputname);
+
+        addSelection(desc, key);
+
+        which = (((default_cardid == parent_cardid) ||
+                  (default_cardid == child_cardid)) &&
+                 (default_inputname == inputname)) ? cnt : which;
     }
+
+    if (cnt)
+        setValue(which);
 }
 
-void CaptureCardSetting::sourceID(const QString& str)
+void InputSelector::SetSourceID(const QString &_sourceid)
 {
-    nSourceID = str.toInt();
-    refresh();
+    if (sourceid != _sourceid.toUInt())
+    {
+        sourceid = _sourceid.toUInt();
+        load();
+    }
 }
 
-void ScanTypeSetting::refresh(const QString& card)
+uint InputSelector::GetParentCardID(void) const
 {
-    int nCard = card.toInt();
+    uint    parent_cardid = 0;
+    uint    child_cardid  = 0;
+    QString inputname     = QString::null;
+
+    Parse(getValue(), parent_cardid, child_cardid, inputname);
+
+    return parent_cardid;
+}
+
+uint InputSelector::GetChildCardID(void) const
+{
+    uint    parent_cardid = 0;
+    uint    child_cardid  = 0;
+    QString inputname     = QString::null;
+
+    Parse(getValue(), parent_cardid, child_cardid, inputname);
+
+    return child_cardid;
+}
+
+QString InputSelector::GetInputName(void) const
+{
+    uint    parent_cardid = 0;
+    uint    child_cardid  = 0;
+    QString inputname = QString::null;
+
+    Parse(getValue(), parent_cardid, child_cardid, inputname);
+
+    return inputname;
+}
+
+bool InputSelector::Parse(const QString &cardids_inputname,
+                          uint &parent_cardid,
+                          uint &child_cardid,
+                          QString &inputname)
+{
+    parent_cardid = 0;
+    child_cardid  = 0;
+    inputname     = QString::null;
+
+    int sep0 = cardids_inputname.find(':');
+    if (sep0 < 1)
+        return false;
+
+    QString child_cardid_inputname = cardids_inputname.mid(sep0 + 1);
+    int sep1 = child_cardid_inputname.find(':');
+    if (sep1 < 1)
+        return false;
+
+    parent_cardid = cardids_inputname.left(sep0).toUInt();
+    child_cardid  = child_cardid_inputname.left(sep1).toUInt();
+    inputname     = child_cardid_inputname.mid(sep1 + 1);
+
+    return true;
+}
+
+void ScanTypeSetting::SetInput(const QString &cardids_inputname)
+{
+    uint pcardid, ccardid;
+    QString inputname;
+    if (!InputSelector::Parse(cardids_inputname, pcardid, ccardid, inputname))
+        return;
+
+    const uint new_cardid = ccardid ? ccardid : pcardid;
+
     // Only refresh if we really have to. If we do it too often
     // Then we end up fighting the scan routine when we want to
     // check the type of dvb card :/
-    if (nCard == nCaptureCard)
+    if (new_cardid == hw_cardid)
         return;
 
-    nCaptureCard    = nCard;
-    QString subtype = CardUtil::ProbeSubTypeName(nCard, 0);
+    hw_cardid       = new_cardid;
+    QString subtype = CardUtil::ProbeSubTypeName(hw_cardid, 0);
     int nCardType   = CardUtil::toCardType(subtype);
     clearSelections();
 
@@ -350,11 +465,16 @@
     addSelection(QObject::tr("Spain"),          "es", country == ES);
 }
 
-ScanOptionalConfig::ScanOptionalConfig(ScanWizard *wizard,
-                                       ScanTypeSetting *scanType) :
-    TriggeredConfigurationGroup(false, false, true, true),
+ScanOptionalConfig::ScanOptionalConfig(ScanTypeSetting *_scan_type) :
+    TriggeredConfigurationGroup(false, false, true, true,
+                                false, false, true, true),
+    scanType(_scan_type),
     country(new ScanCountry()),
-    ignoreSignalTimeoutAll(new IgnoreSignalTimeout())
+    ignoreSignalTimeoutAll(new IgnoreSignalTimeout()),
+    paneOFDM(new OFDMPane()),     paneQPSK(new QPSKPane()),
+    paneDVBS2(new DVBS2Pane()),   paneATSC(new ATSCPane()),
+    paneQAM(new QAMPane()),       paneSingle(new STPane()),
+    paneDVBUtilsImport(new DVBUtilsImportPane())
 {
     setTrigger(scanType);
 
@@ -375,25 +495,25 @@
     addTarget(QString::number(ScanTypeSetting::Error_Probe),
              new ErrorPane(QObject::tr("Failed to probe the card")));
     addTarget(QString::number(ScanTypeSetting::NITAddScan_QAM),
-              wizard->paneQAM);
+              paneQAM);
     addTarget(QString::number(ScanTypeSetting::NITAddScan_QPSK),
-              wizard->paneQPSK);
+              paneQPSK);
     addTarget(QString::number(ScanTypeSetting::NITAddScan_OFDM),
-              wizard->paneOFDM);
+              paneOFDM);
     addTarget(QString::number(ScanTypeSetting::FullScan_ATSC),
-              wizard->paneATSC);
+              paneATSC);
     addTarget(QString::number(ScanTypeSetting::FullScan_OFDM),
               country);
     addTarget(QString::number(ScanTypeSetting::FullScan_Analog),
               new BlankSetting());
     addTarget(QString::number(ScanTypeSetting::TransportScan),
-              wizard->paneSingle);
+              paneSingle);
     addTarget(QString::number(ScanTypeSetting::FullTransportScan),
               scanAllTransports);
     addTarget(QString::number(ScanTypeSetting::IPTVImport),
               new BlankSetting());
     addTarget(QString::number(ScanTypeSetting::DVBUtilsImport),
-              wizard->paneDVBUtilsImport);
+              paneDVBUtilsImport);
 }
 
 void ScanOptionalConfig::triggerChanged(const QString& value)
@@ -401,41 +521,209 @@
     TriggeredConfigurationGroup::triggerChanged(value);
 }
 
-ScanWizardScanType::ScanWizardScanType(ScanWizard *_parent, int sourceid) :
-    VerticalConfigurationGroup(true, true, false, false),
-    parent(_parent)
+void ScanOptionalConfig::SetSourceID(const QString &sourceid)
 {
-    setLabel(tr("Scan Type"));
-    setUseLabel(false);
+    paneSingle->SetSourceID(sourceid.toUInt());
+}
 
-    videoSource = new VideoSourceSelector(
-        (sourceid < 0) ? 0 : sourceid, card_types(), false);
+void ScanOptionalConfig::SetDefaultATSCFormat(const QString &atscFormat)
+{
+    paneATSC->SetDefaultATSCFormat(atscFormat);
+    paneSingle->SetDefaultATSCFormat(atscFormat);
+    paneDVBUtilsImport->SetDefaultATSCFormat(atscFormat);
+}
 
-    capturecard = new CaptureCardSetting();
+QString ScanOptionalConfig::GetATSCFormat(const QString &dfl) const
+{
+    int     st =  scanType->getValue().toInt();
 
-    HorizontalConfigurationGroup *h1 =
-        new HorizontalConfigurationGroup(false,false,true,true);
-    h1->addChild(videoSource);
-    h1->addChild(capturecard);
-    addChild(h1);
-    scanType = new ScanTypeSetting();
+    bool    ts0 = (ScanTypeSetting::FullScan_ATSC  == st);
+    QString vl0 = paneATSC->GetATSCFormat();
+
+    bool    ts1 = (ScanTypeSetting::TransportScan  == st);
+    QString vl1 = paneSingle->GetATSCFormat();
+
+    bool    ts2 = (ScanTypeSetting::DVBUtilsImport == st);
+    QString vl2 = paneDVBUtilsImport->GetATSCFormat();
+
+    return (ts0) ? vl0 : ((ts1) ? vl1 : (ts2) ? vl2 : dfl);
+}
+
+QString ScanOptionalConfig::GetModulation(void) const
+{
+    int     st =  scanType->getValue().toInt();
+
+    bool    ts0 = (ScanTypeSetting::FullScan_ATSC == st);
+    QString vl0 = paneATSC->atscModulation();
+
+    bool    ts1 = (ScanTypeSetting::FullScan_OFDM == st);
+    QString vl1 = "ofdm";
+
+    return (ts0) ? vl0 : ((ts1) ? vl1 : "ofdm");
+}
+
+QString ScanOptionalConfig::GetFrequencyTable(void) const
+{
+    int     st =  scanType->getValue().toInt();
+
+    bool    ts0 = (ScanTypeSetting::FullScan_ATSC == st);
+    QString vl0 = paneATSC->atscFreqTable();
+
+    bool    ts1 = (ScanTypeSetting::FullScan_OFDM == st);
+    QString vl1 = country->getValue();
+
+    return (ts0) ? vl0 : ((ts1) ? vl1 : "vsb8");
+}
+
+bool ScanOptionalConfig::DoIgnoreSignalTimeout(void) const
+{
+    int  st  = scanType->getValue().toInt();
+
+    bool ts0 = (ScanTypeSetting::TransportScan     == st);
+    bool vl0 = paneSingle->ignoreSignalTimeout();
+
+    bool ts1 = (ScanTypeSetting::FullTransportScan == st);
+    bool vl1 = (ignoreSignalTimeoutAll->getValue().toInt());
+
+    bool ts2 = (ScanTypeSetting::DVBUtilsImport    == st);
+    bool vl2 = paneDVBUtilsImport->DoIgnoreSignalTimeout();
+
+    return (ts0) ? vl0 : ((ts1) ? vl1 : (ts2) ? vl2 : false);
+}
+
+bool ScanOptionalConfig::DoDeleteChannels(void) const
+{
+    int  st  = scanType->getValue().toInt();
+
+    bool ts0 = (ScanTypeSetting::FullScan_ATSC  == st);
+    bool vl0 = paneATSC->DoDeleteChannels();
+
+    bool ts1 = (ScanTypeSetting::TransportScan  == st);
+    bool vl1 = paneSingle->DoDeleteChannels();
+
+    bool ts2 = (ScanTypeSetting::DVBUtilsImport == st);
+    bool vl2 = paneDVBUtilsImport->DoDeleteChannels();
+
+    return (ts0) ? vl0 : ((ts1) ? vl1 : (ts2) ? vl2 : false);
+}
+
+bool ScanOptionalConfig::DoRenameChannels(void) const
+{
+    int  st  = scanType->getValue().toInt();
+
+    bool ts0 = (ScanTypeSetting::FullScan_ATSC  == st);
+    bool vl0 = paneATSC->DoRenameChannels();
+
+    bool ts1 = (ScanTypeSetting::TransportScan  == st);
+    bool vl1 = paneSingle->DoRenameChannels();
+
+    bool ts2 = (ScanTypeSetting::DVBUtilsImport == st);
+    bool vl2 = paneDVBUtilsImport->DoRenameChannels();
+
+    return (ts0) ? vl0 : ((ts1) ? vl1 : (ts2) ? vl2 : false);
+}
+
+QString ScanOptionalConfig::GetFilename(void) const
+{
+    return paneDVBUtilsImport->GetFilename();
+}
+
+uint ScanOptionalConfig::GetMultiplex(void) const
+{
+    int mplexid = paneSingle->GetMultiplex();
+    return (mplexid <= 0) ? 0 : mplexid;
+}
+
+QMap<QString,QString> ScanOptionalConfig::GetStartChan(void) const
+{
+    QMap<QString,QString> startChan;
+
+    int st = scanType->getValue().toInt();
+    if (ScanTypeSetting::NITAddScan_OFDM == st)
+    {
+        const OFDMPane *pane = paneOFDM;
+
+        startChan["std"]            = "dvb";
+        startChan["frequency"]      = pane->frequency();
+        startChan["inversion"]      = pane->inversion();
+        startChan["bandwidth"]      = pane->bandwidth();
+        startChan["modulation"]     = "ofdm";
+        startChan["coderate_hp"]    = pane->coderate_hp();
+        startChan["coderate_lp"]    = pane->coderate_lp();
+        startChan["constellation"]  = pane->constellation();
+        startChan["trans_mode"]     = pane->trans_mode();
+        startChan["guard_interval"] = pane->guard_interval();
+        startChan["hierarchy"]      = pane->hierarchy();
+    }
+    else if (ScanTypeSetting::NITAddScan_QPSK == st)
+    {
+        const QPSKPane *pane = paneQPSK;
+
+        startChan["std"]        = "dvb";
+        startChan["frequency"]  = pane->frequency();
+        startChan["inversion"]  = pane->inversion();
+        startChan["symbolrate"] = pane->symbolrate();
+        startChan["fec"]        = pane->fec();
+        startChan["modulation"] = "qpsk";
+        startChan["polarity"]   = pane->polarity();
+    }
+    else if (ScanTypeSetting::NITAddScan_QAM == st)
+    {
+        const QAMPane *pane = paneQAM;
+
+        startChan["std"]        = "dvb";
+        startChan["frequency"]  = pane->frequency();
+        startChan["inversion"]  = pane->inversion();
+        startChan["symbolrate"] = pane->symbolrate();
+        startChan["fec"]        = pane->fec();
+        startChan["modulation"] = pane->modulation();
+    }
+
+    return startChan;
+}
+
+ScanWizardConfig::ScanWizardConfig(
+    ScanWizard *_parent,
+    uint    default_sourceid,  uint default_cardid,
+    QString default_inputname, bool force_sourceid) :
+    VerticalConfigurationGroup(false, true, false, false),
+    videoSource(new VideoSourceSelector(
+                    default_sourceid, card_types(), false)),
+    input(new InputSelector(default_cardid, default_inputname)),
+    scanType(new ScanTypeSetting()),
+    scanConfig(new ScanOptionalConfig(scanType))
+{
+    setLabel(tr("Scan Configuration"));
+
+    addChild(videoSource);
+    addChild(input);
     addChild(scanType);
-    scanConfig = new ScanOptionalConfig(_parent,scanType);
     addChild(scanConfig);
 
     connect(videoSource, SIGNAL(valueChanged(const QString&)),
-        _parent->paneSingle, SLOT(sourceID(const QString&)));
+            scanConfig,  SLOT(  SetSourceID( const QString&)));
+
     connect(videoSource, SIGNAL(valueChanged(const QString&)),
-        capturecard, SLOT(sourceID(const QString&)));
+            input,       SLOT(  SetSourceID( const QString&)));
 
-    //Setup signals to refill the scan types
-    connect(capturecard, SIGNAL(valueChanged(const QString&)),
-        scanType, SLOT(refresh(const QString&)));
+    connect(input,       SIGNAL(valueChanged(const QString&)),
+            scanType,    SLOT(  SetInput(    const QString&)));
 
-    connect(capturecard, SIGNAL(valueChanged(const QString&)),
-        parent, SLOT(captureCard(const QString&)));
+    connect(input,       SIGNAL(valueChanged(const QString&)),
+            _parent,     SLOT(  SetInput(    const QString&)));
 }
 
+uint ScanWizardConfig::GetSourceID(void) const
+{
+    return videoSource->getValue().toInt();
+}
+
+QString ScanWizardConfig::GetATSCFormat(void) const
+{
+    QString dfl = SourceUtil::GetChannelFormat(GetSourceID());
+    return scanConfig->GetATSCFormat(dfl);
+}
+
 LogList::LogList() : ListBoxSetting(this), n(0)
 {
     setSelectionMode(MythListBox::NoSelection);
Index: libs/libmythtv/sourceutil.cpp
===================================================================
--- libs/libmythtv/sourceutil.cpp	(revision 11768)
+++ libs/libmythtv/sourceutil.cpp	(working copy)
@@ -157,6 +157,26 @@
     return types.empty() || unscanable;
 }
 
+bool SourceUtil::IsAnySourceScanable(void)
+{
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("SELECT sourceid FROM videosource");
+
+    if (!query.exec() || !query.isActive())
+    {
+        MythContext::DBError("SourceUtil::IsAnySourceScanable", query);
+        return false;
+    }
+
+    while (query.next())
+    {
+        if (!IsUnscanable(query.value(0).toUInt()))
+            return true;
+    }
+ 
+    return false;
+}
+
 bool SourceUtil::UpdateChannelsFromListings(uint sourceid, QString cardtype)
 {
     QString cmd = "mythfilldatabase --only-update-channels ";
