Index: libs/libmythtv/cardutil.h
===================================================================
--- libs/libmythtv/cardutil.h	(revision 12244)
+++ libs/libmythtv/cardutil.h	(working copy)
@@ -163,6 +163,7 @@
                                     uint &channel_timeout);
     static bool         IgnoreEncrypted(uint cardid, const QString &inputname);
     static bool         TVOnly(uint cardid, const QString &inputname);
+    static bool         IsInNeedOfExternalInputConf(uint cardid);
 
     // DVB info
     static bool         IsDVB(uint cardid, const QString &_inputname);
Index: libs/libmythtv/videosource.h
===================================================================
--- libs/libmythtv/videosource.h	(revision 12244)
+++ libs/libmythtv/videosource.h	(working copy)
@@ -6,7 +6,6 @@
 
 #include "settings.h"
 #include "datadirect.h"
-#include "diseqcsettings.h"
 
 class SignalTimeout;
 class ChannelTimeout;
@@ -19,6 +18,8 @@
 class ChildID;
 class InputName;
 class SourceID;
+class DiSEqCDevTree;
+class DiSEqCDevSettings;
 
 class VideoSourceDBStorage : public SimpleDBStorage
 {
@@ -412,7 +413,7 @@
     ChannelTimeout     *channel_timeout;
     TransButtonSetting *buttonAnalog;
     DVBTuningDelay     *tuning_delay;
-    DiSEqCDevTree       tree;
+    DiSEqCDevTree      *diseqc_tree;
 };
 
 class CaptureCardGroup : public TriggeredConfigurationGroup
@@ -502,8 +503,7 @@
     const CardInput& parent;
 };
 
-class MPUBLIC CaptureCardEditor :
-    public QObject, public ConfigurationDialog, public Storage
+class MPUBLIC CaptureCardEditor : public QObject, public ConfigurationDialog
 {
     Q_OBJECT
 
@@ -525,8 +525,7 @@
     ListBoxSetting *listbox;
 };
 
-class MPUBLIC VideoSourceEditor :
-    public QObject, public ConfigurationDialog, public Storage
+class MPUBLIC VideoSourceEditor : public QObject, public ConfigurationDialog
 {
     Q_OBJECT
 
@@ -552,8 +551,7 @@
     ListBoxSetting *listbox;
 };
 
-class MPUBLIC CardInputEditor :
-    public QObject, public ConfigurationDialog, public Storage
+class MPUBLIC CardInputEditor : public QObject, public ConfigurationDialog
 {
   public:
     CardInputEditor();
@@ -589,7 +587,8 @@
 {
     Q_OBJECT
   public:
-    CardInput(bool is_dtv_card, bool is_dvb_card, int cardid);
+    CardInput(bool is_dtv_card, bool is_dvb_card,
+              bool is_new_input, int cardid);
 
     int getInputID(void) const { return id->intValue(); };
 
@@ -605,7 +604,6 @@
   public slots:
     void channelScanner();
     void sourceFetch();
-    void diseqcConfig();
     void SetSourceID(const QString &sourceid);
 
   private:
@@ -627,7 +625,7 @@
     StartingChannel *startchan;
     TransButtonSetting *scan;
     TransButtonSetting *srcfetch;
-    DiSEqCDevSettings  settings;
+    DiSEqCDevSettings  *externalInputSettings;
 };
 
 #endif
Index: libs/libmythtv/playgroup.h
===================================================================
--- libs/libmythtv/playgroup.h	(revision 12244)
+++ libs/libmythtv/playgroup.h	(working copy)
@@ -23,11 +23,11 @@
     QString name;
 };
 
-class MPUBLIC PlayGroupEditor :
-    public QObject, public ConfigurationDialog, public Storage
+class MPUBLIC PlayGroupEditor : public QObject, public ConfigurationDialog
 {
     Q_OBJECT
- public:
+
+  public:
     PlayGroupEditor(void);
     virtual int exec(void);
     virtual void load(void);
Index: libs/libmythtv/diseqc.h
===================================================================
--- libs/libmythtv/diseqc.h	(revision 12244)
+++ libs/libmythtv/diseqc.h	(working copy)
@@ -107,6 +107,7 @@
 
     // Gets
     uint GetVoltage(void) const { return m_last_voltage; }
+    bool IsInNeedOfConf(void) const;
 
     // tree management
     void AddDeferredDelete(uint dev_id) { m_delete.push_back(dev_id); }
Index: libs/libmythtv/profilegroup.h
===================================================================
--- libs/libmythtv/profilegroup.h	(revision 12244)
+++ libs/libmythtv/profilegroup.h	(working copy)
@@ -110,7 +110,7 @@
 };
 
 class MPUBLIC ProfileGroupEditor :
-    public QObject, public ConfigurationDialog, public Storage
+    public QObject, public ConfigurationDialog
 {
     Q_OBJECT
   public:
Index: libs/libmythtv/scheduledrecording.h
===================================================================
--- libs/libmythtv/scheduledrecording.h	(revision 12244)
+++ libs/libmythtv/scheduledrecording.h	(working copy)
@@ -262,7 +262,7 @@
 };
 
 class ScheduledRecordingEditor :
-    public QObject, public ConfigurationDialog, public Storage
+    public QObject, public ConfigurationDialog
 {
     Q_OBJECT
 
Index: libs/libmythtv/recordingprofile.h
===================================================================
--- libs/libmythtv/recordingprofile.h	(revision 12244)
+++ libs/libmythtv/recordingprofile.h	(working copy)
@@ -128,7 +128,7 @@
 };
 
 class RecordingProfileEditor :
-    public QObject, public ConfigurationDialog, public Storage
+    public QObject, public ConfigurationDialog
 {
     Q_OBJECT
 
Index: libs/libmythtv/cardutil.cpp
===================================================================
--- libs/libmythtv/cardutil.cpp	(revision 12244)
+++ libs/libmythtv/cardutil.cpp	(working copy)
@@ -9,6 +9,7 @@
 #include "mythcontext.h"
 #include "mythdbcon.h"
 #include "dvbchannel.h"
+#include "diseqcsettings.h"
 
 #ifdef USING_DVB
 #include "dvbtypes.h"
@@ -435,6 +436,18 @@
     return !radioservices;
 }
 
+bool CardUtil::IsInNeedOfExternalInputConf(uint cardid)
+{
+    DiSEqCDev dev;
+    DiSEqCDevTree *diseqc_tree = dev.FindTree(cardid);
+
+    bool needsConf = false;
+    if (diseqc_tree)
+        return diseqc_tree->IsInNeedOfConf();
+
+    return needsConf;
+}
+
 bool CardUtil::hasV4L2(int videofd)
 {
     (void) videofd;
@@ -753,7 +766,7 @@
     QStringList::iterator it = inputs.begin();
     for (; it != inputs.end(); ++it)
     {
-        CardInput* cardinput = new CardInput(is_dtv, false, cardid);
+        CardInput* cardinput = new CardInput(is_dtv, false, false, cardid);
         cardinput->loadByInput(rcardid, (*it));
         cardinput->SetChildCardID((parentid) ? cardid : 0);
         inputLabels.push_back(
@@ -767,14 +780,14 @@
     {
         InputNames list;
         list[0] = "DVBInput";
-        bool needs_conf = DTVDeviceNeedsConfiguration(rcardid);
+        bool needs_conf = IsInNeedOfExternalInputConf(rcardid);
         if (needs_conf)
             list = GetConfiguredDVBInputs(rcardid);
 
         InputNames::const_iterator it;
         for (it = list.begin(); it != list.end(); ++it)
         {
-            CardInput *cardinput = new CardInput(is_dtv, true, rcardid);
+            CardInput *cardinput = new CardInput(is_dtv, true, false, rcardid);
             cardinput->loadByInput(rcardid, *it);
             cardinput->SetChildCardID(parentid ? cardid : 0);
             inputLabels.push_back(
@@ -786,7 +799,7 @@
         // plus add one "new" input
         if (needs_conf)
         {
-            CardInput *newcard = new CardInput(is_dtv, true, rcardid);
+            CardInput *newcard = new CardInput(is_dtv, true, true, rcardid);
             QString newname = QString("DVBInput #%1").arg(list.size() + 1);
             newcard->loadByInput(rcardid, newname);
             newcard->SetChildCardID((parentid) ? cardid : 0);
Index: libs/libmythtv/videosource.cpp
===================================================================
--- libs/libmythtv/videosource.cpp	(revision 12244)
+++ libs/libmythtv/videosource.cpp	(working copy)
@@ -1736,11 +1736,25 @@
     };
 };
 
-CardInput::CardInput(bool isDTVcard, bool isDVBcard, int _cardid)
+CardInput::CardInput(bool isDTVcard,     bool isDVBcard,
+                     bool isNewInput, int _cardid) :
+    id(new ID()),
+    cardid(new CardID(*this)),
+    childid(),
+    inputname(new InputName(*this)),
+    sourceid(new SourceID(*this)),
+    startchan(new StartingChannel(*this)),
+    scan(new TransButtonSetting()),
+    srcfetch(new TransButtonSetting()),
+    externalInputSettings(new DiSEqCDevSettings())
 {
-    (void) _cardid;
+    addChild(id);
 
-    addChild(id = new ID());
+    if (CardUtil::IsInNeedOfExternalInputConf(_cardid))
+    {
+        addChild(new DTVDeviceConfigGroup(*externalInputSettings,
+                                          _cardid, isNewInput));
+    }
 
     ConfigurationGroup *group =
         new VerticalConfigurationGroup(false, false, true, true);
@@ -1749,11 +1763,11 @@
 
     HorizontalConfigurationGroup *ci;
     ci = new HorizontalConfigurationGroup(false, false);
-    ci->addChild(cardid = new CardID(*this));
-    ci->addChild(inputname = new InputName(*this));
+    ci->addChild(cardid);
+    ci->addChild(inputname);
     group->addChild(ci);
     group->addChild(new InputDisplayName(*this));
-    group->addChild(sourceid = new SourceID(*this));
+    group->addChild(sourceid);
     if (!isDVBcard)
     {
         group->addChild(new ExternalChannelCommand(*this));
@@ -1769,30 +1783,19 @@
         group->addChild(chgroup);
     }
 
-#ifdef USING_DVB
     if (isDVBcard)
     {
-        TransButtonSetting *diseqc = new TransButtonSetting();
-        diseqc->setLabel(tr("DVB-S"));
-        diseqc->setHelpText(tr("Input and satellite settings."));
-        diseqc->setVisible(DTVDeviceNeedsConfiguration(_cardid));
-        group->addChild(diseqc);
-        connect(diseqc, SIGNAL(pressed()), SLOT(diseqcConfig()));
-   
         ConfigurationGroup *chgroup = 
             new HorizontalConfigurationGroup(false, false, true, true);
         chgroup->addChild(new RadioServices(*this));
         chgroup->addChild(new DishNetEIT(*this));
         group->addChild(chgroup);
     }
-#endif
 
-    scan = new TransButtonSetting();
     scan->setLabel(tr("Scan for channels"));
     scan->setHelpText(
         tr("Use channel scanner to find channels for this input."));
 
-    srcfetch = new TransButtonSetting();
     srcfetch->setLabel(tr("Fetch channels from listings source"));
     srcfetch->setHelpText(
         tr("This uses the listings data source to "
@@ -1805,7 +1808,6 @@
     sgrp->addChild(srcfetch);
     group->addChild(sgrp);
 
-    startchan = new StartingChannel(*this);
     group->addChild(startchan);
     group->addChild(new InputPriority(*this));
 
@@ -1912,14 +1914,6 @@
     }
 }
 
-void CardInput::diseqcConfig(void)
-{
-#ifdef USING_DVB
-    DTVDeviceConfigWizard wizard(settings, cardid->getValue().toUInt());
-    wizard.exec();
-#endif // USING_DVB
-}
-
 QString CardInputDBStorage::whereClause(MSqlBindings& bindings) 
 {
     QString cardinputidTag(":WHERECARDINPUTID");
@@ -1947,11 +1941,10 @@
 
 void CardInput::loadByID(int inputid) 
 {
+    VERBOSE(VB_IMPORTANT, "CardInput::loadByID("<<inputid<<")");
+    externalInputSettings->Load(inputid);
     id->setValue(inputid);
-#ifdef USING_DVB
-    settings.Load(inputid);
-#endif
-    cfgGrp->load();
+    load();
 }
 
 void CardInput::loadByInput(int _cardid, QString _inputname) 
@@ -1962,21 +1955,21 @@
     query.bindValue(":CARDID", _cardid);
     query.bindValue(":INPUTNAME", _inputname);
 
-    if (query.exec() && query.isActive() && query.size() > 0) 
+    if (query.exec() && query.isActive() && query.next())
     {
-        query.next();
         loadByID(query.value(0).toInt());
     } 
     else 
-    {
-        cfgGrp->load(); // new
+    { // create new input connection
+        load();
         cardid->setValue(QString::number(_cardid));
         inputname->setValue(_inputname);
     }
 }
 
-void CardInput::save() 
+void CardInput::save(void)
 {
+    VERBOSE(VB_IMPORTANT, "CardInput::save()");
 
     if (sourceid->getValue() == "0")
     {
@@ -1988,10 +1981,8 @@
     }
     else
     {
-        cfgGrp->save();
-#ifdef USING_DVB
-        settings.Store(getInputID());
-#endif
+        ConfigurationWizard::save();
+        externalInputSettings->Store(getInputID());
     }
 }
 
@@ -2502,7 +2493,8 @@
 
 DVBConfigurationGroup::DVBConfigurationGroup(CaptureCard& a_parent) :
     VerticalConfigurationGroup(false, true, false, false),
-    parent(a_parent)
+    parent(a_parent),
+    diseqc_tree(new DiSEqCDevTree())
 {
     DVBCardNum* cardnum = new DVBCardNum(parent);
     cardname = new DVBCardName();
@@ -2572,32 +2564,26 @@
 
 void DVBConfigurationGroup::DiSEqCPanel()
 {
-#ifdef USING_DVB
     parent.reload(); // ensure card id is valid
 
-    DTVDeviceTreeWizard diseqcWiz(tree);
+    DTVDeviceTreeWizard diseqcWiz(*diseqc_tree);
     diseqcWiz.exec();
-    defaultinput->fillSelections(DTVDeviceNeedsConfiguration(tree));
-#endif // USING_DVB
+    defaultinput->fillSelections(diseqc_tree->IsInNeedOfConf());
 }
 
 void DVBConfigurationGroup::load()
 {
     VerticalConfigurationGroup::load();
-#ifdef USING_DVB
-    tree.Load(parent.getCardID());
-    defaultinput->fillSelections(DTVDeviceNeedsConfiguration(tree));
-#endif
+    diseqc_tree->Load(parent.getCardID());
+    defaultinput->fillSelections(diseqc_tree->IsInNeedOfConf());
 }
 
 void DVBConfigurationGroup::save()
 {
     VerticalConfigurationGroup::save();
-#ifdef USING_DVB
-    tree.Store(parent.getCardID());
+    diseqc_tree->Store(parent.getCardID());
     DiSEqCDev trees;
     trees.InvalidateTrees();
-#endif
 }
 
 void CaptureCard::reload(void)
Index: libs/libmythtv/diseqcsettings.cpp
===================================================================
--- libs/libmythtv/diseqcsettings.cpp	(revision 12244)
+++ libs/libmythtv/diseqcsettings.cpp	(working copy)
@@ -356,8 +356,20 @@
     return str;
 }
 
-static double AngleToFloat(const QString &angle)
+static double AngleToEdit(double angle, QString &hemi)
 {
+    if (angle > 0.0)
+    {
+        hemi = "E";
+        return angle;
+    }
+
+    hemi = "W";
+    return -angle;
+}
+
+static double AngleToFloat(const QString &angle, bool translated = true)
+{
     if (angle.length() < 2)
         return 0.0;
 
@@ -366,8 +378,12 @@
     if (postfix.isLetter())
     {
         pos = angle.left(angle.length() - 1).toDouble();
-        if (postfix.upper() == DeviceTree::tr("W", "Western Hemisphere"))
+        if ((translated &&
+             (postfix.upper() == DeviceTree::tr("W", "Western Hemisphere"))) ||
+            (!translated && (postfix.upper() == "W")))
+        {
             pos = -pos;
+        }
     }
     else
         pos = angle.toDouble();
@@ -1165,78 +1181,79 @@
 
 //////////////////////////////////////// USALSRotorSetting
 
-class USALSRotorSetting : public LineEditSetting, public Storage
+class USALSRotorSetting : public HorizontalConfigurationGroup
 {
   public:
     USALSRotorSetting(DiSEqCDevDevice &node, DiSEqCDevSettings &settings) :
-        LineEditSetting(this), m_node(node), m_settings(settings)
+        HorizontalConfigurationGroup(false, false, true, true),
+        numeric(new TransLineEditSetting()),
+        hemisphere(new TransComboBoxSetting(false)),
+        m_node(node), m_settings(settings)
     {
-        setLabel(node.GetDescription());
-        QString help = DeviceTree::tr(
-            "The longitude of the satellite you are aiming at, in degrees. "
-            "In the Western hemisphere use 'W' as the suffix. "
-            "In the Eastern hemisphere use 'E' as the suffix. ");
-        setHelpText(help);
+        QString help =
+            DeviceTree::tr(
+                "Locates the satelite you wish to point to "
+                "with the longitude along the Clarke Belt of"
+                "the satellite [-180..180] and its hemisphere.");
+
+        numeric->setLabel(DeviceTree::tr("Longitude (degrees)"));
+        numeric->setHelpText(help);
+        hemisphere->setLabel(DeviceTree::tr("Hemisphere"));
+        hemisphere->addSelection(DeviceTree::tr("Eastern"), "E", false);
+        hemisphere->addSelection(DeviceTree::tr("Western"), "W", true);
+        hemisphere->setHelpText(help);
+
+        addChild(numeric);
+        addChild(hemisphere);
     }
 
     virtual void load(void)
     {
-        setValue(AngleToString(m_settings.GetValue(m_node.GetDeviceID())));
+        double  val  = m_settings.GetValue(m_node.GetDeviceID());
+        QString hemi = QString::null;
+        double  eval = AngleToEdit(val, hemi);
+        numeric->setValue(QString::number(eval));
+        hemisphere->setValue(hemisphere->getValueIndex(hemi));
     }
 
     virtual void save(void)
     {
-        m_settings.SetValue(m_node.GetDeviceID(), AngleToFloat(getValue()));
+        QString val = QString::number(numeric->getValue().toDouble());
+        val += hemisphere->getValue();
+        m_settings.SetValue(m_node.GetDeviceID(), AngleToFloat(val, false));
     }
 
     virtual void save(QString /*destination*/) { }
 
   private:
-    DiSEqCDevDevice   &m_node;
-    DiSEqCDevSettings &m_settings;
+    TransLineEditSetting *numeric;
+    TransComboBoxSetting *hemisphere;
+    DiSEqCDevDevice      &m_node;
+    DiSEqCDevSettings    &m_settings;
 };
 
-//////////////////////////////////////// DTVDeviceNeedsConfiguration
+//////////////////////////////////////// DTVDeviceConfigGroup
 
-bool DTVDeviceNeedsConfiguration(uint cardid)
+DTVDeviceConfigGroup::DTVDeviceConfigGroup(
+    DiSEqCDevSettings &settings, uint cardid, bool switches_enabled) :
+    VerticalConfigurationGroup(false, false, true, true),
+    m_settings(settings), m_switches_enabled(switches_enabled)
 {
-    DiSEqCDev dev;
-    DiSEqCDevTree *diseqc_tree = dev.FindTree(cardid);
-    return diseqc_tree ? DTVDeviceNeedsConfiguration(*diseqc_tree) : false;
-}
+    setLabel(DeviceTree::tr("DTV Device Configuration"));
 
-bool DTVDeviceNeedsConfiguration(DiSEqCDevTree& tree)
-{
-    DiSEqCDevDevice *root = tree.Root();
-    return (root && root->GetDeviceType() != DiSEqCDevDevice::kTypeLNB);
-}
-
-//////////////////////////////////////// DTVDeviceConfigWizard
-
-DTVDeviceConfigWizard::DTVDeviceConfigWizard(DiSEqCDevSettings &settings,
-                                             uint cardid)
-    : m_settings(settings)
-{
-    ConfigurationGroup *group =
-        new VerticalConfigurationGroup(false, false);
-    group->setLabel(DeviceTree::tr("DTV Device Configuration"));
-
     // load
     m_tree.Load(cardid);
 
     // initial UI setup
-    AddNodes(*group, m_tree.Root());
-    SelectNodes();
-
-    addChild(group);
+    AddNodes(this, QString::null, m_tree.Root());
 }
 
-DTVDeviceConfigWizard::~DTVDeviceConfigWizard(void)
+DTVDeviceConfigGroup::~DTVDeviceConfigGroup(void)
 {
 }
 
-void DTVDeviceConfigWizard::AddNodes(ConfigurationGroup &group,
-                                     DiSEqCDevDevice    *node)
+void DTVDeviceConfigGroup::AddNodes(
+    ConfigurationGroup *group, const QString &trigger, DiSEqCDevDevice *node)
 {
     if (!node)
         return;
@@ -1246,8 +1263,7 @@
     {
         case DiSEqCDevDevice::kTypeSwitch:
             setting = new SwitchSetting(*node, m_settings);
-            connect(setting, SIGNAL(valueChanged(const QString&)),
-                    SLOT(SelectNodes()));
+            setting->setEnabled(m_switches_enabled);
             break;
         case DiSEqCDevDevice::kTypeRotor:
         {
@@ -1262,36 +1278,60 @@
             break;
     }
 
-    if (setting)
+    if (!setting)
     {
-        // add this node
-        m_devs[node->GetDeviceID()] = setting;
-        group.addChild(setting);
+        AddChild(group, trigger, new TransLabelSetting());
+        return;
     }
 
-    // add children
+    m_devs[node->GetDeviceID()] = setting;
+
     uint num_ch = node->GetChildCount();
-    for (uint ch = 0; ch < num_ch; ch++)
-        AddNodes(group, node->GetChild(ch));
-}
+    if (DiSEqCDevDevice::kTypeSwitch == node->GetDeviceType())
+    {
+        bool useframe = (node != m_tree.Root());
+        bool zerospace = !useframe;
+        TriggeredConfigurationGroup *cgrp = new TriggeredConfigurationGroup(
+            false, useframe, true, true, false, false, true, zerospace);
 
-void DTVDeviceConfigWizard::SelectNodes(void)
-{
-    cfgGrp->save();
+        cgrp->addChild(setting);
+        cgrp->setTrigger(setting);
 
-    QMap<uint,bool> active;
-    DiSEqCDevDevice *node = m_tree.Root();
-    while (node)
+        for (uint i = 0; i < num_ch; i++)
+            AddNodes(cgrp, QString::number(i), node->GetChild(i));
+
+        AddChild(group, trigger, cgrp);
+        return;
+    }
+
+    if (!num_ch)
     {
-        active[node->GetDeviceID()] = true;
-        node = node->GetSelectedChild(m_settings);
+        AddChild(group, trigger, setting);
+        return;
     }
 
-    devid_to_setting_t::iterator it = m_devs.begin();
-    for (; it != m_devs.end(); ++it)
-        (*it)->setEnabled(active[it.key()]);
+    VerticalConfigurationGroup *cgrp =
+        new VerticalConfigurationGroup(false, false, true, true);
+            
+    AddChild(cgrp, QString::null, setting);
+    for (uint i = 0; i < num_ch; i++)
+        AddNodes(cgrp, QString::null, node->GetChild(i));
+
+    AddChild(group, trigger, cgrp);
 }
 
+void DTVDeviceConfigGroup::AddChild(
+    ConfigurationGroup *group, const QString &trigger, Setting *setting)
+{
+    TriggeredConfigurationGroup *grp =
+        dynamic_cast<TriggeredConfigurationGroup*>(group);
+
+    if (grp && !trigger.isEmpty())
+        grp->addTarget(trigger, setting);
+    else
+        group->addChild(setting);
+}
+
 //////////////////////////////////////// Database Upgrade
 
 enum OLD_DISEQC_TYPES
Index: libs/libmythtv/storagegroup.h
===================================================================
--- libs/libmythtv/storagegroup.h	(revision 12244)
+++ libs/libmythtv/storagegroup.h	(working copy)
@@ -31,7 +31,7 @@
 };
 
 class MPUBLIC StorageGroupEditor :
-    public QObject, public ConfigurationDialog, public Storage
+    public QObject, public ConfigurationDialog
 {
     Q_OBJECT
   public:
@@ -54,7 +54,7 @@
 };
 
 class MPUBLIC StorageGroupListEditor :
-    public QObject, public ConfigurationDialog, public Storage
+    public QObject, public ConfigurationDialog
 {
     Q_OBJECT
   public:
Index: libs/libmythtv/diseqcsettings.h
===================================================================
--- libs/libmythtv/diseqcsettings.h	(revision 12244)
+++ libs/libmythtv/diseqcsettings.h	(working copy)
@@ -12,9 +12,6 @@
 
 typedef QMap<uint, Setting*> devid_to_setting_t;
 
-bool DTVDeviceNeedsConfiguration(uint cardid);
-bool DTVDeviceNeedsConfiguration(DiSEqCDevTree& tree);
-
 class SwitchTypeSetting;
 class SwitchPortsSetting;
 
@@ -136,24 +133,25 @@
     virtual int exec(void);
 };
 
-class DTVDeviceConfigWizard : public QObject, public ConfigurationWizard
+class DTVDeviceConfigGroup : public VerticalConfigurationGroup
 {
-    Q_OBJECT
-
   public:
-    DTVDeviceConfigWizard(DiSEqCDevSettings &settings, uint cardid);
-    ~DTVDeviceConfigWizard(void);
+    DTVDeviceConfigGroup(DiSEqCDevSettings &settings, uint cardid,
+                         bool switches_enabled);
+    ~DTVDeviceConfigGroup(void);
     
-  public slots:
-    void SelectNodes(void);
-  
   protected:
-    void AddNodes(ConfigurationGroup &group, DiSEqCDevDevice *node);
+    void AddNodes(ConfigurationGroup *group, const QString &trigger,
+                  DiSEqCDevDevice *node);
+
+    void AddChild(ConfigurationGroup *group, const QString &trigger,
+                  Setting *setting);
     
   private:
     DiSEqCDevTree       m_tree;
     DiSEqCDevSettings  &m_settings;
     devid_to_setting_t  m_devs;
+    bool                m_switches_enabled;
 };
 
 #endif // _DISEQCSETTINGS_H_
Index: libs/libmythtv/diseqc.cpp
===================================================================
--- libs/libmythtv/diseqc.cpp	(revision 12244)
+++ libs/libmythtv/diseqc.cpp	(working copy)
@@ -114,6 +114,7 @@
 DiSEqCDevSettings::DiSEqCDevSettings()
     : m_input_id((uint) -1)
 {
+    VERBOSE(VB_IMPORTANT, "DiSEqCDevSettings("<< this << ") ctor");
 }
 
 /** \fn DiSEqCDevSettings::Load(uint)
@@ -123,6 +124,9 @@
  */
 bool DiSEqCDevSettings::Load(uint card_input_id)
 {
+    VERBOSE(VB_IMPORTANT, "DiSEqCDevSettings("
+            << this << QString(")::Load(%1)").arg(card_input_id));
+
     if (card_input_id == m_input_id)
         return true;
 
@@ -143,7 +147,14 @@
     }
 
     while (query.next())
+    {
+        VERBOSE(VB_IMPORTANT,
+                QString("DiSEqCDevSettings::Load(%1)")
+                .arg(card_input_id) + QString(" id: %1 val: %2")
+                .arg(query.value(0).toUInt()).arg(query.value(1).toDouble()));
+
         m_config[query.value(0).toUInt()] = query.value(1).toDouble();
+    }
 
     m_input_id = card_input_id;
 
@@ -157,6 +168,9 @@
  */
 bool DiSEqCDevSettings::Store(uint card_input_id) const
 {
+    VERBOSE(VB_IMPORTANT, "DiSEqCDevSettings("
+            << this << QString(")::Store(%1)").arg(card_input_id));
+
     MSqlQuery query(MSqlQuery::InitCon());
 
     // clear out previous settings
@@ -180,6 +194,12 @@
     uint_to_dbl_t::const_iterator it = m_config.begin();
     for (; it != m_config.end(); ++it)
     {
+        VERBOSE(VB_IMPORTANT,
+                QString("INSERT INTO diseqc_config "
+                        "(cardinputid, diseqcid, value) "
+                        "VALUES (%1, %2, %3)")
+                .arg(card_input_id).arg(it.key()).arg(*it));
+
         query.bindValue(":INPUTID", card_input_id);
         query.bindValue(":DEVID",   it.key());
         query.bindValue(":VALUE",   *it);
@@ -200,12 +220,26 @@
  */
 double DiSEqCDevSettings::GetValue(uint devid) const
 {
+    double val = 0.0;
     uint_to_dbl_t::const_iterator it = m_config.find(devid);
-
     if (it != m_config.end())
         return *it;
 
-    return 0.0;
+    bool found = it != m_config.end();
+    VERBOSE(VB_IMPORTANT,
+            "DiSEqCDevSettings(" << this << QString(")::GetValue(%1) -> %2")
+            .arg(devid).arg((found) ? QString::number(val) : "not found"));
+
+    if (!found)
+    {
+        for (it = m_config.begin(); it != m_config.end(); ++it)
+        {
+            VERBOSE(VB_IMPORTANT, QString("id %1 val %2")
+                    .arg(it.key()).arg(*it));
+        }
+    }
+
+    return val;
 }
 
 /**
@@ -715,6 +749,14 @@
     return true;
 }
 
+bool DiSEqCDevTree::IsInNeedOfConf(void) const
+{
+    if (m_root)
+        return m_root->GetDeviceType() != DiSEqCDevDevice::kTypeLNB;
+
+    return false;
+}
+
 bool DiSEqCDevTree::ApplyVoltage(const DiSEqCDevSettings &settings,
                                  const DTVMultiplex      &tuning)
 {
Index: libs/libmyth/settings.cpp
===================================================================
--- libs/libmyth/settings.cpp	(revision 12244)
+++ libs/libmyth/settings.cpp	(working copy)
@@ -1071,7 +1071,7 @@
 int ConfigurationDialog::exec(bool saveOnAccept, bool doLoad) 
 {
     if (doLoad)
-        cfgGrp->load();
+        load();
 
     MythDialog *dialog = dialogWidget(
         gContext->GetMainWindow(), "Configuration Dialog");
@@ -1081,7 +1081,7 @@
     int ret = dialog->exec();
 
     if ((QDialog::Accepted == ret) && saveOnAccept)
-        cfgGrp->save();
+        save();
 
     dialog->deleteLater();
     dialog = NULL;
Index: libs/libmyth/settings.h
===================================================================
--- libs/libmyth/settings.h	(revision 12244)
+++ libs/libmyth/settings.h	(working copy)
@@ -1119,7 +1119,7 @@
  *  \brief A ConfigurationDialog that uses a ConfigurationGroup
  *         all children on one page in a vertical layout.
  */
-class MPUBLIC ConfigurationDialog
+class MPUBLIC ConfigurationDialog : public Storage
 {
   public:
     ConfigurationDialog() : dialog(NULL), cfgGrp(new ConfigurationGroup()) { }
@@ -1132,6 +1132,10 @@
     // Show a dialogWidget, and save if accepted
     virtual int exec(bool saveOnExec = true, bool doLoad = true);
 
+    virtual void load(void) { cfgGrp->load(); }
+    virtual void save(void) { cfgGrp->save(); }
+    virtual void save(QString destination) { cfgGrp->save(destination); }
+
     virtual void addChild(Configurable *child);
 
     virtual Setting *byName(const QString &settingName)
@@ -1149,17 +1153,13 @@
  *  \brief A ConfigurationDialog that uses a ConfigurationGroup
  *         with one child per page.
  */
-class MPUBLIC ConfigurationWizard : public ConfigurationDialog, public Storage
+class MPUBLIC ConfigurationWizard : public ConfigurationDialog
 {
   public:
     ConfigurationWizard() : ConfigurationDialog() {}
 
     virtual MythDialog *dialogWidget(MythMainWindow *parent,
                                      const char *widgetName);
-
-    virtual void load(void) { cfgGrp->load(); }
-    virtual void save(void) { cfgGrp->save(); }
-    virtual void save(QString destination) { cfgGrp->save(destination); }
 };
 
 /** \class JumpConfigurationWizard
