diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp b/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
index 1115c27..aa84c9e 100644
--- a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
+++ b/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
@@ -48,7 +48,7 @@ class TriggeredItem : public TriggeredConfigurationGroup
 };
 
 AudioDeviceComboBox::AudioDeviceComboBox(AudioConfigSettings *parent) :
-    HostComboBox("AudioOutputDevice", true), m_parent(parent)
+    HostComboBoxSetting("AudioOutputDevice", true), m_parent(parent)
 {
     setLabel(QObject::tr("Audio output device"));
 #ifdef USING_ALSA
@@ -70,6 +70,12 @@ AudioDeviceComboBox::AudioDeviceComboBox(AudioConfigSettings *parent) :
             this, SLOT(AudioDescriptionHelp(const QString&)));
 }
 
+void AudioDeviceComboBox::edit(MythScreenType * screen)
+{
+    AudioRescan();
+    HostComboBoxSetting::edit(screen);
+}
+
 void AudioDeviceComboBox::AudioRescan()
 {
     AudioOutput::ADCVect &vect = m_parent->AudioDeviceVect();
@@ -80,7 +86,6 @@ void AudioDeviceComboBox::AudioRescan()
 
     QString value = getValue();
     clearSelections();
-    resetMaxCount(vect.size());
 
     bool found = false;
     for (it = vect.begin(); it != vect.end(); ++it)
@@ -88,11 +93,8 @@ void AudioDeviceComboBox::AudioRescan()
                      value == it->name ? (found = true) : false);
     if (!found)
     {
-        resetMaxCount(vect.size()+1);
         addSelection(value, value, true);
     }
-        // For some reason, it adds an empty entry, remove it
-    removeSelection(QString::null);
 }
 
 void AudioDeviceComboBox::AudioDescriptionHelp(const QString &device)
@@ -101,29 +103,16 @@ void AudioDeviceComboBox::AudioDescriptionHelp(const QString &device)
     setHelpText(desc);
 }
 
-AudioConfigSettings::AudioConfigSettings(ConfigurationWizard *parent) :
-    VerticalConfigurationGroup(false, true, false, false),
+AudioConfigSettings::AudioConfigSettings() :
+    GroupSetting(),
     m_OutputDevice(NULL),   m_MaxAudioChannels(NULL),
     m_AudioUpmix(NULL),     m_AudioUpmixType(NULL),
     m_AC3PassThrough(NULL), m_DTSPassThrough(NULL),
-    m_EAC3PassThrough(NULL),m_TrueHDPassThrough(NULL), m_DTSHDPassThrough(NULL),
-    m_parent(parent)
+    m_EAC3PassThrough(NULL),m_TrueHDPassThrough(NULL), m_DTSHDPassThrough(NULL)
 {
     setLabel(QObject::tr("Audio System"));
-    setUseLabel(false);
-
-    ConfigurationGroup *devicegroup = new HorizontalConfigurationGroup(false,
-                                                                       false);
-    devicegroup->addChild((m_OutputDevice = new AudioDeviceComboBox(this)));
-        // Rescan button
-    TransButtonSetting *rescan = new TransButtonSetting("rescan");
-    rescan->setLabel(QObject::tr("Rescan"));
-    rescan->setHelpText(QObject::tr("Rescan for available audio devices. "
-                                    "Current entry will be checked and "
-                                    "capability entries populated."));
-    devicegroup->addChild(rescan);
-    connect(rescan, SIGNAL(pressed()), this, SLOT(AudioRescan()));
-    addChild(devicegroup);
+
+    this->addChild((m_OutputDevice = new AudioDeviceComboBox(this)));
 
     QString name = m_OutputDevice->getValue();
     AudioOutput::AudioDeviceConfig *adc =
@@ -139,67 +128,63 @@ AudioConfigSettings::AudioConfigSettings(ConfigurationWizard *parent) :
 
     delete adc;
 
-    ConfigurationGroup *maingroup = new VerticalConfigurationGroup(false,
-                                                                   false);
-    addChild(maingroup);
 
-    m_triggerDigital = new TransCheckBoxSetting();
+    m_triggerDigital = new GroupSetting();
+
     m_AC3PassThrough = AC3PassThrough();
     m_DTSPassThrough = DTSPassThrough();
     m_EAC3PassThrough = EAC3PassThrough();
     m_TrueHDPassThrough = TrueHDPassThrough();
     m_DTSHDPassThrough = DTSHDPassThrough();
 
-    m_cgsettings = new HorizontalConfigurationGroup();
-    m_cgsettings->setLabel(QObject::tr("Digital Audio Capabilities"));
-    m_cgsettings->addChild(m_AC3PassThrough);
-    m_cgsettings->addChild(m_DTSPassThrough);
-    m_cgsettings->addChild(m_EAC3PassThrough);
-    m_cgsettings->addChild(m_TrueHDPassThrough);
-    m_cgsettings->addChild(m_DTSHDPassThrough);
+    m_triggerDigital->setLabel(QObject::tr("Digital Audio Capabilities"));
+    m_triggerDigital->addChild(m_AC3PassThrough);
+    m_triggerDigital->addChild(m_DTSPassThrough);
+    m_triggerDigital->addChild(m_EAC3PassThrough);
+    m_triggerDigital->addChild(m_TrueHDPassThrough);
+    m_triggerDigital->addChild(m_DTSHDPassThrough);
+    addChild(m_triggerDigital);
 
-    TriggeredItem *sub1 = new TriggeredItem(m_triggerDigital, m_cgsettings);
+    addChild((m_MaxAudioChannels = MaxAudioChannels()));
+    addChild((m_AudioUpmix = AudioUpmix()));
+    addChild((m_AudioUpmixType = AudioUpmixType()));
+    addChild(MythControlsVolume());
 
-    maingroup->addChild(sub1);
 
-    maingroup->addChild((m_MaxAudioChannels = MaxAudioChannels()));
-    maingroup->addChild((m_AudioUpmix = AudioUpmix()));
-    maingroup->addChild((m_AudioUpmixType = AudioUpmixType()));
 
-    TransButtonSetting *test = new TransButtonSetting("test");
+
+    addChild(m_advancedSettings = new AudioAdvancedSettings());
+
+    GroupSetting *test = new GroupSetting(/*"test"*/);
     test->setLabel(QObject::tr("Test"));
     test->setHelpText(QObject::tr("Will play a test pattern on all configured "
                                   "speakers"));
-    connect(test, SIGNAL(pressed()), this, SLOT(StartAudioTest()));
+    //connect(test, SIGNAL(pressed()), this, SLOT(StartAudioTest()));
     addChild(test);
 
-    TransButtonSetting *advanced = new TransButtonSetting("advanced");
-    advanced->setLabel(QObject::tr("Advanced Audio Settings"));
-    advanced->setHelpText(QObject::tr("Enable extra audio settings. Under most "
-                                  "usage all options should be left alone"));
-    connect(advanced, SIGNAL(pressed()), this, SLOT(AudioAdvanced()));
-    addChild(advanced);
-
         // Set slots
-    connect(m_MaxAudioChannels, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateVisibility(const QString&)));
-    connect(m_OutputDevice, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateCapabilities(const QString&)));
-    connect(m_AC3PassThrough, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateCapabilities(const QString&)));
-    connect(m_DTSPassThrough, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateCapabilities(const QString&)));
-    connect(m_EAC3PassThrough, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateCapabilities(const QString&)));
-    connect(m_TrueHDPassThrough, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateCapabilities(const QString&)));
-    connect(m_DTSHDPassThrough, SIGNAL(valueChanged(const QString&)),
-            this, SLOT(UpdateCapabilities(const QString&)));
+    connect(m_MaxAudioChannels, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateVisibility(StandardSetting *)));
+    connect(m_OutputDevice, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateCapabilities(StandardSetting *)));
+    connect(m_AC3PassThrough, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateCapabilities(StandardSetting *)));
+    connect(m_DTSPassThrough, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateCapabilities(StandardSetting *)));
+    connect(m_EAC3PassThrough, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateCapabilities(StandardSetting *)));
+    connect(m_TrueHDPassThrough, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateCapabilities(StandardSetting *)));
+    connect(m_DTSHDPassThrough, SIGNAL(valueChanged(StandardSetting *)),
+            this, SLOT(UpdateCapabilities(StandardSetting *)));
     AudioRescan();
 }
 
 void AudioConfigSettings::AudioRescan()
 {
+
+        LOG(VB_GENERAL, LOG_ERR,
+            QString("AudioConfigSettings::AudioRescan()"));
     if (!slotlock.tryLock())
         return;
 
@@ -244,10 +229,10 @@ void AudioConfigSettings::AudioRescan()
                 .arg(name));
     }
     slotlock.unlock();
-    UpdateCapabilities(QString::null);
+    UpdateCapabilities(NULL);
 }
 
-void AudioConfigSettings::UpdateVisibility(const QString &device)
+void AudioConfigSettings::UpdateVisibility(StandardSetting *)
 {
     if (!m_MaxAudioChannels && !m_AudioUpmix && !m_AudioUpmixType)
         return;
@@ -258,7 +243,7 @@ void AudioConfigSettings::UpdateVisibility(const QString &device)
 }
 
 AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
-    const QString &device)
+    StandardSetting *)
 {
     int max_speakers = 8;
     int realmax_speakers = 8;
@@ -290,6 +275,7 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
     }
     else
     {
+
         bool bForceDigital =
             gCoreContext->GetNumSetting("PassThruDeviceOverride", false);
 
@@ -320,9 +306,10 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
             max_speakers = 6;
     }
 
-    m_triggerDigital->setValue(invalid || settingsdigital.canFeature(
+    m_triggerDigital->setEnabled(invalid || settingsdigital.canFeature(
                                    FEATURE_AC3 | FEATURE_DTS | FEATURE_EAC3 |
                                    FEATURE_TRUEHD | FEATURE_DTSHD));
+    
     m_EAC3PassThrough->setEnabled(bEAC3);
     m_TrueHDPassThrough->setEnabled(bTRUEHD);
     m_DTSHDPassThrough->setEnabled(bDTSHD);
@@ -337,7 +324,7 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
 
         // Remove everything and re-add available channels
     m_MaxAudioChannels->clearSelections();
-    m_MaxAudioChannels->resetMaxCount(3);
+//TODO    m_MaxAudioChannels->resetMaxCount(3);
     for (int i = 1; i <= max_speakers; i++)
     {
         if (invalid || settings.IsSupportedChannels(i))
@@ -362,6 +349,9 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
                                              i == cur_speakers);
         }
     }
+
+    m_advancedSettings->setMPCMEnabled(settings.canLPCM() &&
+                                              settings.canPassthrough() >= 0);
         // Return values is used by audio test
         // where we mainly are interested by the number of channels
         // if we support AC3 and/or LPCM
@@ -375,7 +365,7 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
 
 void AudioConfigSettings::AudioAdvanced()
 {
-    QString out  = m_OutputDevice->getValue();
+/*    QString out  = m_OutputDevice->getValue();
     bool invalid = false;
     AudioOutputSettings settings;
 
@@ -383,7 +373,7 @@ void AudioConfigSettings::AudioAdvanced()
     {
         invalid = true;
     }
-    else
+    elsem_MPCM
     {
         settings = audiodevs.value(out).settings;
     }
@@ -397,12 +387,13 @@ void AudioConfigSettings::AudioAdvanced()
         AudioRescan();
         UpdateCapabilities(QString::null);
     }
+*/
 }
 
-HostComboBox *AudioConfigSettings::MaxAudioChannels()
+HostComboBoxSetting *AudioConfigSettings::MaxAudioChannels()
 {
     QString name = "MaxChannels";
-    HostComboBox *gc = new HostComboBox(name, false);
+    HostComboBoxSetting *gc = new HostComboBoxSetting(name, false);
     gc->setLabel(QObject::tr("Speaker configuration"));
     gc->addSelection(QObject::tr("Stereo"), "2", true); // default
     gc->setHelpText(QObject::tr("Select the maximum number of audio "
@@ -411,9 +402,9 @@ HostComboBox *AudioConfigSettings::MaxAudioChannels()
     return gc;
 }
 
-HostCheckBox *AudioConfigSettings::AudioUpmix()
+HostCheckBoxSetting *AudioConfigSettings::AudioUpmix()
 {
-    HostCheckBox *gc = new HostCheckBox("AudioDefaultUpmix");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("AudioDefaultUpmix");
     gc->setLabel(QObject::tr("Upconvert stereo to 5.1 surround"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, MythTV will upconvert stereo "
@@ -422,9 +413,9 @@ HostCheckBox *AudioConfigSettings::AudioUpmix()
     return gc;
 }
 
-HostComboBox *AudioConfigSettings::AudioUpmixType()
+HostComboBoxSetting *AudioConfigSettings::AudioUpmixType()
 {
-    HostComboBox *gc = new HostComboBox("AudioUpmixType",false);
+    HostComboBoxSetting *gc = new HostComboBoxSetting("AudioUpmixType",false);
     gc->setLabel(QObject::tr("Upmix Quality"));
     gc->addSelection(QObject::tr("Good"), "1");
     gc->addSelection(QObject::tr("Best"), "2", true);  // default
@@ -432,9 +423,9 @@ HostComboBox *AudioConfigSettings::AudioUpmixType()
     return gc;
 }
 
-HostCheckBox *AudioConfigSettings::AC3PassThrough()
+HostCheckBoxSetting *AudioConfigSettings::AC3PassThrough()
 {
-    HostCheckBox *gc = new HostCheckBox("AC3PassThru");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("AC3PassThru");
     gc->setLabel(QObject::tr("Dolby Digital"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable if your amplifier or sound decoder "
@@ -443,9 +434,9 @@ HostCheckBox *AudioConfigSettings::AC3PassThrough()
     return gc;
 }
 
-HostCheckBox *AudioConfigSettings::DTSPassThrough()
+HostCheckBoxSetting *AudioConfigSettings::DTSPassThrough()
 {
-    HostCheckBox *gc = new HostCheckBox("DTSPassThru");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("DTSPassThru");
     gc->setLabel(QObject::tr("DTS"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable if your amplifier or sound decoder "
@@ -454,9 +445,9 @@ HostCheckBox *AudioConfigSettings::DTSPassThrough()
     return gc;
 }
 
-HostCheckBox *AudioConfigSettings::EAC3PassThrough()
+HostCheckBoxSetting *AudioConfigSettings::EAC3PassThrough()
 {
-    HostCheckBox *gc = new HostCheckBox("EAC3PassThru");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("EAC3PassThru");
     gc->setLabel(QObject::tr("E-AC3"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable if your amplifier or sound decoder "
@@ -464,9 +455,9 @@ HostCheckBox *AudioConfigSettings::EAC3PassThrough()
     return gc;
 }
 
-HostCheckBox *AudioConfigSettings::TrueHDPassThrough()
+HostCheckBoxSetting *AudioConfigSettings::TrueHDPassThrough()
 {
-    HostCheckBox *gc = new HostCheckBox("TrueHDPassThru");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("TrueHDPassThru");
     gc->setLabel(QObject::tr("TrueHD"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable if your amplifier or sound decoder "
@@ -474,9 +465,9 @@ HostCheckBox *AudioConfigSettings::TrueHDPassThrough()
     return gc;
 }
 
-HostCheckBox *AudioConfigSettings::DTSHDPassThrough()
+HostCheckBoxSetting *AudioConfigSettings::DTSHDPassThrough()
 {
-    HostCheckBox *gc = new HostCheckBox("DTSHDPassThru");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("DTSHDPassThru");
     gc->setLabel(QObject::tr("DTS-HD"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable if your amplifier or sound decoder "
@@ -508,9 +499,120 @@ bool AudioConfigSettings::CheckPassthrough()
     return ok;
 }
 
+//TODO create a interface instead 
+static void fillSelectionsFromDir(HostComboBoxSetting *comboBox, const QDir& dir, bool absPath = true)
+
+{
+    QFileInfoList il = dir.entryInfoList();
+
+    for (QFileInfoList::Iterator it = il.begin();
+                                 it != il.end();
+                                ++it )
+    {
+         QFileInfo &fi = *it;
+
+        if (absPath)
+            comboBox->addSelection( fi.absoluteFilePath() );
+        else
+            comboBox->addSelection( fi.fileName() );
+    }
+}
+
+HostComboBoxSetting *AudioConfigSettings::MixerDevice()
+{
+    HostComboBoxSetting *gc = new HostComboBoxSetting("MixerDevice", true);
+    gc->setLabel(QObject::tr("Mixer device"));
+
+#ifdef USING_OSS
+    QDir dev("/dev", "mixer*", QDir::Name, QDir::System);
+    fillSelectionsFromDir(gc, dev);
+
+    dev.setPath("/dev/sound");
+    if (dev.exists())
+    {
+        fillSelectionsFromDir(gc, dev);
+    }
+#endif
+#ifdef USING_ALSA
+    gc->addSelection("ALSA:default", "ALSA:default");
+#endif
+#ifdef USING_MINGW
+    gc->addSelection("DirectX:", "DirectX:");
+    gc->addSelection("Windows:", "Windows:");
+#endif
+#if !defined(USING_MINGW)
+    gc->addSelection("software", "software");
+    gc->setHelpText(QObject::tr("Setting the mixer device to \"software\" "
+                    "lets MythTV control the volume of all audio at the "
+                    "expense of a slight quality loss."));
+#endif
+
+    return gc;
+}
+
+static const char* MixerControlControls[] = { "PCM",
+                                              "Master" };
+
+HostComboBoxSetting *AudioConfigSettings::MixerControl()
+{
+    HostComboBoxSetting *gc = new HostComboBoxSetting("MixerControl", true);
+    gc->setLabel(QObject::tr("Mixer controls"));
+    for (unsigned int i = 0; i < sizeof(MixerControlControls) / sizeof(char*);
+         ++i)
+    {
+        gc->addSelection(QObject::tr(MixerControlControls[i]),
+                         MixerControlControls[i]);
+    }
+
+    gc->setHelpText(QObject::tr("Changing the volume adjusts the selected mixer."));
+    return gc;
+}
+
+
+//TODO was a slider
+HostSpinBoxSetting *AudioConfigSettings::MixerVolume()
+{
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MasterMixerVolume", 0, 100, 1);
+    gs->setLabel(QObject::tr("Master mixer volume"));
+    gs->setValue(70);
+    gs->setHelpText(QObject::tr("Initial volume for the Master mixer. "
+                    "This affects all sound created by the audio device. "
+                    "Note: Do not set this too low."));
+    return gs;
+}
+
+//TODO was a slider
+HostSpinBoxSetting *AudioConfigSettings::PCMVolume()
+{
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("PCMMixerVolume", 0, 100, 1);
+    gs->setLabel(QObject::tr("PCM mixer volume"));
+    gs->setValue(70);
+    gs->setHelpText(QObject::tr("Initial volume for PCM output. Using the "
+                    "volume keys in MythTV will adjust this parameter."));
+    return gs;
+}
+
+
+HostCheckBoxSetting *AudioConfigSettings::MythControlsVolume()
+{
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MythControlsVolume");
+    gc->setLabel(QObject::tr("Use internal volume controls"));
+    gc->setValue(true);
+    gc->setHelpText(QObject::tr("If enabled, MythTV will control the PCM and "
+                    "master mixer volume. Disable this option if you prefer "
+                    "to control the volume externally (for example, using "
+                    "your amplifier) or if you use an external mixer program."));
+
+    gc->addTargetedChild("1",MixerDevice());
+    gc->addTargetedChild("1",MixerControl());
+    gc->addTargetedChild("1",MixerVolume());
+    gc->addTargetedChild("1",PCMVolume());
+    return gc;
+}
+
 void AudioConfigSettings::StartAudioTest()
 {
-    AudioOutputSettings settings = UpdateCapabilities(QString::null);
+    AudioOutputSettings settings = UpdateCapabilities(NULL);
     
     QString out  = m_OutputDevice->getValue();
     QString passthrough =
@@ -946,124 +1048,9 @@ AudioTestGroup::AudioTestGroup(QString main, QString passthrough,
     addChild(new AudioTest(main, passthrough, channels, settings));
 }
 
-HostCheckBox *AudioMixerSettings::MythControlsVolume()
-{
-    HostCheckBox *gc = new HostCheckBox("MythControlsVolume");
-    gc->setLabel(QObject::tr("Use internal volume controls"));
-    gc->setValue(true);
-    gc->setHelpText(QObject::tr("If enabled, MythTV will control the PCM and "
-                    "master mixer volume. Disable this option if you prefer "
-                    "to control the volume externally (for example, using "
-                    "your amplifier) or if you use an external mixer program."));
-    return gc;
-}
-
-HostComboBox *AudioMixerSettings::MixerDevice()
-{
-    HostComboBox *gc = new HostComboBox("MixerDevice", true);
-    gc->setLabel(QObject::tr("Mixer device"));
-
-#ifdef USING_OSS
-    QDir dev("/dev", "mixer*", QDir::Name, QDir::System);
-    gc->fillSelectionsFromDir(dev);
-
-    dev.setPath("/dev/sound");
-    if (dev.exists())
-    {
-        gc->fillSelectionsFromDir(dev);
-    }
-#endif
-#ifdef USING_ALSA
-    gc->addSelection("ALSA:default", "ALSA:default");
-#endif
-#ifdef USING_MINGW
-    gc->addSelection("DirectX:", "DirectX:");
-    gc->addSelection("Windows:", "Windows:");
-#endif
-#if !defined(USING_MINGW)
-    gc->addSelection("software", "software");
-    gc->setHelpText(QObject::tr("Setting the mixer device to \"software\" "
-                    "lets MythTV control the volume of all audio at the "
-                    "expense of a slight quality loss."));
-#endif
-
-    return gc;
-}
-
-const char* AudioMixerSettings::MixerControlControls[] = { "PCM",
-                                                           "Master" };
-
-HostComboBox *AudioMixerSettings::MixerControl()
-{
-    HostComboBox *gc = new HostComboBox("MixerControl", true);
-    gc->setLabel(QObject::tr("Mixer controls"));
-    for (unsigned int i = 0; i < sizeof(MixerControlControls) / sizeof(char*);
-         ++i)
-    {
-        gc->addSelection(QObject::tr(MixerControlControls[i]),
-                         MixerControlControls[i]);
-    }
-
-    gc->setHelpText(QObject::tr("Changing the volume adjusts the selected mixer."));
-    return gc;
-}
-
-HostSlider *AudioMixerSettings::MixerVolume()
-{
-    HostSlider *gs = new HostSlider("MasterMixerVolume", 0, 100, 1);
-    gs->setLabel(QObject::tr("Master mixer volume"));
-    gs->setValue(70);
-    gs->setHelpText(QObject::tr("Initial volume for the Master mixer. "
-                    "This affects all sound created by the audio device. "
-                    "Note: Do not set this too low."));
-    return gs;
-}
-
-HostSlider *AudioMixerSettings::PCMVolume()
-{
-    HostSlider *gs = new HostSlider("PCMMixerVolume", 0, 100, 1);
-    gs->setLabel(QObject::tr("PCM mixer volume"));
-    gs->setValue(70);
-    gs->setHelpText(QObject::tr("Initial volume for PCM output. Using the "
-                    "volume keys in MythTV will adjust this parameter."));
-    return gs;
-}
-
-AudioMixerSettings::AudioMixerSettings() :
-    TriggeredConfigurationGroup(false, true, false, false)
-{
-    setLabel(QObject::tr("Audio Mixer"));
-    setUseLabel(false);
-
-    Setting *volumeControl = MythControlsVolume();
-    addChild(volumeControl);
-
-        // Mixer settings
-    ConfigurationGroup *settings =
-        new VerticalConfigurationGroup(false, true, false, false);
-    settings->addChild(MixerDevice());
-    settings->addChild(MixerControl());
-    settings->addChild(MixerVolume());
-    settings->addChild(PCMVolume());
-
-    ConfigurationGroup *dummy =
-        new VerticalConfigurationGroup(false, true, false, false);
-
-        // Show Mixer config only if internal volume controls enabled
-    setTrigger(volumeControl);
-    addTarget("0", dummy);
-    addTarget("1", settings);
-}
-
-AudioGeneralSettings::AudioGeneralSettings()
-{
-    addChild(new AudioConfigSettings(this));
-    addChild(new AudioMixerSettings());
-}
-
-HostCheckBox *AudioAdvancedSettings::MPCM()
+HostCheckBoxSetting *AudioAdvancedSettings::MPCM()
 {
-    HostCheckBox *gc = new HostCheckBox("StereoPCM");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("StereoPCM");
     gc->setLabel(QObject::tr("Stereo PCM Only"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable if your amplifier or sound decoder "
@@ -1073,9 +1060,9 @@ HostCheckBox *AudioAdvancedSettings::MPCM()
     return gc;
 }
 
-HostCheckBox *AudioAdvancedSettings::SRCQualityOverride()
+HostCheckBoxSetting *AudioAdvancedSettings::SRCQualityOverride()
 {
-    HostCheckBox *gc = new HostCheckBox("SRCQualityOverride");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("SRCQualityOverride");
     gc->setLabel(QObject::tr("Override SRC quality"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Enable to override audio sample rate "
@@ -1083,9 +1070,9 @@ HostCheckBox *AudioAdvancedSettings::SRCQualityOverride()
     return gc;
 }
 
-HostComboBox *AudioAdvancedSettings::SRCQuality()
+HostComboBoxSetting *AudioAdvancedSettings::SRCQuality()
 {
-    HostComboBox *gc = new HostComboBox("SRCQuality", false);
+    HostComboBoxSetting *gc = new HostComboBoxSetting("SRCQuality", false);
     gc->setLabel(QObject::tr("Sample rate conversion"));
     gc->addSelection(QObject::tr("Disabled"), "-1");
     gc->addSelection(QObject::tr("Fastest"), "0");
@@ -1098,9 +1085,9 @@ HostComboBox *AudioAdvancedSettings::SRCQuality()
     return gc;
 }
 
-HostCheckBox *AudioAdvancedSettings::Audio48kOverride()
+HostCheckBoxSetting *AudioAdvancedSettings::Audio48kOverride()
 {
-    HostCheckBox *gc = new HostCheckBox("Audio48kOverride");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("Audio48kOverride");
     gc->setLabel(QObject::tr("Force audio device output to 48kHz"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Force audio sample rate to 48kHz. "
@@ -1109,9 +1096,9 @@ HostCheckBox *AudioAdvancedSettings::Audio48kOverride()
     return gc;
 }
 
-HostCheckBox *AudioAdvancedSettings::PassThroughOverride()
+HostCheckBoxSetting *AudioAdvancedSettings::PassThroughOverride()
 {
-    HostCheckBox *gc = new HostCheckBox("PassThruDeviceOverride");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("PassThruDeviceOverride");
     gc->setLabel(QObject::tr("Separate digital output device"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Use a distinct digital output device from "
@@ -1120,9 +1107,9 @@ HostCheckBox *AudioAdvancedSettings::PassThroughOverride()
     return gc;
 }
 
-HostComboBox *AudioAdvancedSettings::PassThroughOutputDevice()
+HostComboBoxSetting *AudioAdvancedSettings::PassThroughOutputDevice()
 {
-    HostComboBox *gc = new HostComboBox("PassThruOutputDevice", true);
+    HostComboBoxSetting *gc = new HostComboBoxSetting("PassThruOutputDevice", true);
 
     gc->setLabel(QObject::tr("Digital output device"));
     gc->addSelection(QObject::tr("Default"), "Default");
@@ -1141,9 +1128,9 @@ HostComboBox *AudioAdvancedSettings::PassThroughOutputDevice()
     return gc;
 }
 
-HostCheckBox *AudioAdvancedSettings::SPDIFRateOverride()
+HostCheckBoxSetting *AudioAdvancedSettings::SPDIFRateOverride()
 {
-    HostCheckBox *gc = new HostCheckBox("SPDIFRateOverride");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("SPDIFRateOverride");
     gc->setLabel(QObject::tr("SPDIF 48k rate override"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("ALSA only. By default, let ALSA determine "
@@ -1153,9 +1140,9 @@ HostCheckBox *AudioAdvancedSettings::SPDIFRateOverride()
     return gc;
 }
 
-HostCheckBox *AudioAdvancedSettings::HBRPassthrough()
+HostCheckBoxSetting *AudioAdvancedSettings::HBRPassthrough()
 {
-    HostCheckBox *gc = new HostCheckBox("HBRPassthru");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("HBRPassthru");
     gc->setLabel(QObject::tr("HBR passthrough support"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("HBR support is required for TrueHD and DTS-HD "
@@ -1167,52 +1154,34 @@ HostCheckBox *AudioAdvancedSettings::HBRPassthrough()
     return gc;
 }
 
-AudioAdvancedSettings::AudioAdvancedSettings(bool mpcm)
+void AudioAdvancedSettings::setMPCMEnabled(bool flag)
 {
-    ConfigurationGroup *settings3 =
-        new HorizontalConfigurationGroup(false, false);
+    m_MPCM->setEnabled(flag);
+}
 
+AudioAdvancedSettings::AudioAdvancedSettings()
+{
+
+    setLabel(QObject::tr("Advanced Audio Settings"));
+    setHelpText(QObject::tr("Enable extra audio settings. Under most "
+                                  "usage all options should be left alone"));
     m_PassThroughOverride = PassThroughOverride();
-    TriggeredItem *sub3 =
-        new TriggeredItem(m_PassThroughOverride, PassThroughOutputDevice());
-    settings3->addChild(m_PassThroughOverride);
-    settings3->addChild(sub3);
-
-    ConfigurationGroup *settings4 =
-        new HorizontalConfigurationGroup(false, false);
-    Setting *srcqualityoverride = SRCQualityOverride();
-    TriggeredItem *sub4 =
-        new TriggeredItem(srcqualityoverride, SRCQuality());
-    settings4->addChild(srcqualityoverride);
-    settings4->addChild(sub4);
-
-    ConfigurationGroup *settings5 =
-        new HorizontalConfigurationGroup(false, false);
-    settings5->addChild(Audio48kOverride());
-#if USING_ALSA
-    settings5->addChild(SPDIFRateOverride());
-#endif
+    m_PassThroughOverride->addTargetedChild("1",PassThroughOutputDevice());
+    addChild(m_PassThroughOverride);
 
-    ConfigurationGroup *settings6 =
-        new HorizontalConfigurationGroup(false, false);
-    settings6->addChild(HBRPassthrough());
+    StandardSetting *srcqualityoverride = SRCQualityOverride();
+    srcqualityoverride->addTargetedChild("1",SRCQuality());
 
-    addChild(settings4);
-    addChild(settings5);
-    addChild(settings3);
-    addChild(settings6);
+    addChild(Audio48kOverride());
+#if USING_ALSA
+    addChild(SPDIFRateOverride());
+#endif
 
-    if (mpcm)
-    {
-        ConfigurationGroup *settings7;
-        settings7 = new HorizontalConfigurationGroup(false, false);
-        settings7->addChild(MPCM());
-        addChild(settings7);
-    }
+    addChild(m_MPCM = MPCM());
 }
-
+/*
 AudioAdvancedSettingsGroup::AudioAdvancedSettingsGroup(bool mpcm)
 {
     addChild(new AudioAdvancedSettings(mpcm));
-}
+}*/
 // vim:set sw=4 ts=4 expandtab:
diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.h b/mythtv/programs/mythfrontend/audiogeneralsettings.h
index fe31bd8..1c5affe 100644
--- a/mythtv/programs/mythfrontend/audiogeneralsettings.h
+++ b/mythtv/programs/mythfrontend/audiogeneralsettings.h
@@ -12,16 +12,18 @@
 #include "audiooutput.h"
 #include "mythcontext.h"
 #include "settings.h"
+#include "standardsettings.h"
 #include "mthread.h"
 
 class AudioDeviceComboBox;
+class AudioAdvancedSettings;
 
-class AudioConfigSettings : public VerticalConfigurationGroup
+class AudioConfigSettings : public GroupSetting
 {
     Q_OBJECT
 
   public:
-    AudioConfigSettings(ConfigurationWizard *);
+    AudioConfigSettings();
 
     typedef QMap<QString,AudioOutput::AudioDeviceConfig> ADCMap;
 
@@ -29,48 +31,57 @@ class AudioConfigSettings : public VerticalConfigurationGroup
     AudioOutput::ADCVect &AudioDeviceVect(void) { return devices; };
 
   private slots:
-    void UpdateVisibility(const QString&);
-    AudioOutputSettings UpdateCapabilities(const QString&);
+    void UpdateVisibility(StandardSetting *);
+    AudioOutputSettings UpdateCapabilities(StandardSetting *);
     void AudioRescan();
     void AudioAdvanced();
     void StartAudioTest();
 
   private:
     AudioDeviceComboBox *OutputDevice();
-    HostComboBox        *MaxAudioChannels();
-    HostCheckBox        *AudioUpmix();
-    HostComboBox        *AudioUpmixType();
-    HostCheckBox        *AC3PassThrough();
-    HostCheckBox        *DTSPassThrough();
-    HostCheckBox        *EAC3PassThrough();
-    HostCheckBox        *TrueHDPassThrough();
-    HostCheckBox        *DTSHDPassThrough();
+    HostComboBoxSetting        *MaxAudioChannels();
+    HostCheckBoxSetting        *AudioUpmix();
+    HostComboBoxSetting        *AudioUpmixType();
+    HostCheckBoxSetting        *AC3PassThrough();
+    HostCheckBoxSetting        *DTSPassThrough();
+    HostCheckBoxSetting        *EAC3PassThrough();
+    HostCheckBoxSetting        *TrueHDPassThrough();
+    HostCheckBoxSetting        *DTSHDPassThrough();
+    HostCheckBoxSetting        *MythControlsVolume();
+    HostComboBoxSetting        *MixerDevice();
+    HostComboBoxSetting        *MixerControl();
+    HostSpinBoxSetting         *MixerVolume();
+    HostSpinBoxSetting         *PCMVolume();
     bool                 CheckPassthrough();
 
-    ConfigurationGroup  *m_cgsettings;
-    AudioDeviceComboBox *m_OutputDevice;
-    HostComboBox        *m_MaxAudioChannels;
-    HostCheckBox        *m_AudioUpmix;
-    HostComboBox        *m_AudioUpmixType;
-    CheckBoxSetting     *m_triggerDigital;
-    HostCheckBox        *m_AC3PassThrough;
-    HostCheckBox        *m_DTSPassThrough;
-    HostCheckBox        *m_EAC3PassThrough;
-    HostCheckBox        *m_TrueHDPassThrough;
-    HostCheckBox        *m_DTSHDPassThrough;
+    GroupSetting               *m_cgsettings;
+    AudioDeviceComboBox        *m_OutputDevice;
+    HostComboBoxSetting        *m_MaxAudioChannels;
+    HostCheckBoxSetting        *m_AudioUpmix;
+    HostComboBoxSetting        *m_AudioUpmixType;
+    GroupSetting               *m_triggerDigital;
+    HostCheckBoxSetting        *m_AC3PassThrough;
+    HostCheckBoxSetting        *m_DTSPassThrough;
+    HostCheckBoxSetting        *m_EAC3PassThrough;
+    HostCheckBoxSetting        *m_TrueHDPassThrough;
+    HostCheckBoxSetting        *m_DTSHDPassThrough;
+    AudioAdvancedSettings      *m_advancedSettings;
     ADCMap               audiodevs;
     AudioOutput::ADCVect devices;
     QMutex               slotlock;
-    ConfigurationWizard *m_parent;
+    GroupSetting *m_parent;
+
 };
 
-class AudioDeviceComboBox : public HostComboBox
+class AudioDeviceComboBox : public HostComboBoxSetting
 {
     Q_OBJECT
   public:
     AudioDeviceComboBox(AudioConfigSettings*);
     void AudioRescan();
 
+    virtual void edit(MythScreenType * screen);
+
   private slots:
     void AudioDescriptionHelp(const QString&);
 
@@ -78,49 +89,49 @@ class AudioDeviceComboBox : public HostComboBox
     AudioConfigSettings *m_parent;
 };
 
-class AudioMixerSettings : public TriggeredConfigurationGroup
+class AudioMixerSettings : public GroupSetting
 {
   public:
     AudioMixerSettings();
   private:
-    HostCheckBox       *MythControlsVolume();
-    HostComboBox       *MixerDevice();
-    HostComboBox       *MixerControl();
-    HostSlider         *MixerVolume();
-    HostSlider         *PCMVolume();
-    static const char  *MixerControlControls[];
+    HostCheckBoxSetting *MythControlsVolume();
+    HostComboBoxSetting *MixerDevice();
+    HostComboBoxSetting *MixerControl();
+    HostSpinBoxSetting  *MixerVolume();
+    HostSpinBoxSetting  *PCMVolume();
+    static const char   *MixerControlControls[];
 };
 
-class AudioGeneralSettings : public ConfigurationWizard
+class AudioAdvancedSettings : public GroupSetting
 {
   public:
-    AudioGeneralSettings();
-};
+    AudioAdvancedSettings(/*bool mpcm*/);
+    void setMPCMEnabled(bool flag);
+  private:
 
-class AudioAdvancedSettings : public VerticalConfigurationGroup
-{
-  public:
-    AudioAdvancedSettings(bool mpcm);
-
-    HostCheckBox       *MPCM();
-    HostCheckBox       *SRCQualityOverride();
-    HostComboBox       *SRCQuality();
-    HostCheckBox       *Audio48kOverride();
-    HostCheckBox       *PassThroughOverride();
-    HostComboBox       *PassThroughOutputDevice();
-    HostCheckBox       *SPDIFRateOverride();
-    HostCheckBox       *HBRPassthrough();
-
-    CheckBoxSetting    *m_triggerMPCM;
-    HostCheckBox       *m_MPCM;
-    HostCheckBox       *m_PassThroughOverride;
+    HostCheckBoxSetting       *MPCM();
+    HostCheckBoxSetting       *SRCQualityOverride();
+    HostComboBoxSetting       *SRCQuality();
+    HostCheckBoxSetting       *Audio48kOverride();
+    HostCheckBoxSetting       *PassThroughOverride();
+    HostComboBoxSetting       *PassThroughOutputDevice();
+    HostCheckBoxSetting       *SPDIFRateOverride();
+    HostCheckBoxSetting       *HBRPassthrough();
+
+
+
+    CheckBoxSetting           *m_triggerMPCM;
+    HostCheckBoxSetting       *m_MPCM;
+    HostCheckBoxSetting       *m_PassThroughOverride;  
 };
 
+/*
 class AudioAdvancedSettingsGroup : public ConfigurationWizard
 {
   public:
     AudioAdvancedSettingsGroup(bool mpcm);
 };
+*/
 
 class AudioTestGroup : public ConfigurationWizard
 {
diff --git a/mythtv/programs/mythfrontend/globalsettings.cpp b/mythtv/programs/mythfrontend/globalsettings.cpp
index 7e6fad3..cadd601 100644
--- a/mythtv/programs/mythfrontend/globalsettings.cpp
+++ b/mythtv/programs/mythfrontend/globalsettings.cpp
@@ -3,6 +3,7 @@
 
 // Standard UNIX C headers
 #include <unistd.h>
+#include <cmath>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -39,9 +40,9 @@
 #include "mythdirs.h"
 #include "mythuihelper.h"
 
-static HostCheckBox *DecodeExtraAudio()
+static HostCheckBoxSetting *DecodeExtraAudio()
 {
-    HostCheckBox *gc = new HostCheckBox("DecodeExtraAudio");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("DecodeExtraAudio");
     gc->setLabel(QObject::tr("Extra audio buffering"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("Enable this setting if MythTV is playing "
@@ -53,9 +54,9 @@ static HostCheckBox *DecodeExtraAudio()
     return gc;
 }
 
-static HostComboBox *PIPLocationComboBox()
+static HostComboBoxSetting *PIPLocationComboBox()
 {
-    HostComboBox *gc = new HostComboBox("PIPLocation");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("PIPLocation");
     gc->setLabel(QObject::tr("PIP video location"));
     for (uint loc = 0; loc < kPIP_END; ++loc)
         gc->addSelection(toString((PIPLocation) loc), QString::number(loc));
@@ -63,9 +64,9 @@ static HostComboBox *PIPLocationComboBox()
     return gc;
 }
 
-static HostComboBox *DisplayRecGroup()
+static HostComboBoxSetting *DisplayRecGroup()
 {
-    HostComboBox *gc = new HostComboBox("DisplayRecGroup");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("DisplayRecGroup");
     gc->setLabel(QObject::tr("Default group filter to apply"));
 
     gc->addSelection(QObject::tr("All Programs"), QString("All Programs"));
@@ -99,12 +100,13 @@ static HostComboBox *DisplayRecGroup()
 
     gc->setHelpText(QObject::tr("Default group filter to apply "
                     "on the View Recordings screen."));
+
     return gc;
 }
 
-static HostCheckBox *QueryInitialFilter()
+static HostCheckBoxSetting *QueryInitialFilter()
 {
-    HostCheckBox *gc = new HostCheckBox("QueryInitialFilter");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("QueryInitialFilter");
     gc->setLabel(QObject::tr("Always prompt for initial group filter"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, always prompt the user for the "
@@ -113,9 +115,9 @@ static HostCheckBox *QueryInitialFilter()
     return gc;
 }
 
-static HostCheckBox *RememberRecGroup()
+static HostCheckBoxSetting *RememberRecGroup()
 {
-    HostCheckBox *gc = new HostCheckBox("RememberRecGroup");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("RememberRecGroup");
     gc->setLabel(QObject::tr("Save current group filter when changed"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, remember the last selected filter "
@@ -124,9 +126,9 @@ static HostCheckBox *RememberRecGroup()
     return gc;
 }
 
-static HostCheckBox *UseGroupNameAsAllPrograms()
+static HostCheckBoxSetting *UseGroupNameAsAllPrograms()
 {
-    HostCheckBox *gc = new HostCheckBox("DispRecGroupAsAllProg");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("DispRecGroupAsAllProg");
     gc->setLabel(QObject::tr("Show filter name instead of \"All Programs\""));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, use the name of the display "
@@ -135,9 +137,9 @@ static HostCheckBox *UseGroupNameAsAllPrograms()
     return gc;
 }
 
-static HostCheckBox *PBBStartInTitle()
+static HostCheckBoxSetting *PBBStartInTitle()
 {
-    HostCheckBox *gc = new HostCheckBox("PlaybackBoxStartInTitle");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("PlaybackBoxStartInTitle");
     gc->setLabel(QObject::tr("Start in group list"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, the focus will "
@@ -146,9 +148,9 @@ static HostCheckBox *PBBStartInTitle()
     return gc;
 }
 
-static HostCheckBox *SmartForward()
+static HostCheckBoxSetting *SmartForward()
 {
-    HostCheckBox *gc = new HostCheckBox("SmartForward");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("SmartForward");
     gc->setLabel(QObject::tr("Smart fast forwarding"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, then immediately after "
@@ -157,9 +159,9 @@ static HostCheckBox *SmartForward()
     return gc;
 }
 
-static HostCheckBox *ExactSeeking()
+static HostCheckBoxSetting *ExactSeeking()
 {
-    HostCheckBox *gc = new HostCheckBox("ExactSeeking");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("ExactSeeking");
     gc->setLabel(QObject::tr("Seek to exact frame"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, seeking is frame exact, but "
@@ -167,9 +169,9 @@ static HostCheckBox *ExactSeeking()
     return gc;
 }
 
-static GlobalComboBox *CommercialSkipMethod()
+static GlobalComboBoxSetting *CommercialSkipMethod()
 {
-    GlobalComboBox *bc = new GlobalComboBox("CommercialSkipMethod");
+    GlobalComboBoxSetting *bc = new GlobalComboBoxSetting("CommercialSkipMethod");
     bc->setLabel(QObject::tr("Commercial detection method"));
     bc->setHelpText(QObject::tr(
                         "This determines the method used by MythTV to "
@@ -182,9 +184,9 @@ static GlobalComboBox *CommercialSkipMethod()
     return bc;
 }
 
-static GlobalCheckBox *CommFlagFast()
+static GlobalCheckBoxSetting *CommFlagFast()
 {
-    GlobalCheckBox *gc = new GlobalCheckBox("CommFlagFast");
+    GlobalCheckBoxSetting *gc = new GlobalCheckBoxSetting("CommFlagFast");
     gc->setLabel(QObject::tr("Enable experimental speedup of commercial detection"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, experimental commercial detection "
@@ -192,9 +194,9 @@ static GlobalCheckBox *CommFlagFast()
     return gc;
 }
 
-static HostComboBox *AutoCommercialSkip()
+static HostComboBoxSetting *AutoCommercialSkip()
 {
-    HostComboBox *gc = new HostComboBox("AutoCommercialSkip");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("AutoCommercialSkip");
     gc->setLabel(QObject::tr("Automatically skip commercials"));
     gc->addSelection(QObject::tr("Off"), "0");
     gc->addSelection(QObject::tr("Notify, but do not skip"), "2");
@@ -206,9 +208,9 @@ static HostComboBox *AutoCommercialSkip()
     return gc;
 }
 
-static GlobalCheckBox *AutoMetadataLookup()
+static GlobalCheckBoxSetting *AutoMetadataLookup()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoMetadataLookup");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("AutoMetadataLookup");
     bc->setLabel(QObject::tr("Run metadata lookup"));
     bc->setValue(true);
     bc->setHelpText(QObject::tr("This is the default value used for the "
@@ -217,9 +219,9 @@ static GlobalCheckBox *AutoMetadataLookup()
     return bc;
 }
 
-static GlobalCheckBox *AutoCommercialFlag()
+static GlobalCheckBoxSetting *AutoCommercialFlag()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoCommercialFlag");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("AutoCommercialFlag");
     bc->setLabel(QObject::tr("Run commercial detection"));
     bc->setValue(true);
     bc->setHelpText(QObject::tr("This is the default value used for the "
@@ -228,9 +230,9 @@ static GlobalCheckBox *AutoCommercialFlag()
     return bc;
 }
 
-static GlobalCheckBox *AutoTranscode()
+static GlobalCheckBoxSetting *AutoTranscode()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoTranscode");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("AutoTranscode");
     bc->setLabel(QObject::tr("Run transcoder"));
     bc->setValue(false);
     bc->setHelpText(QObject::tr("This is the default value used for the "
@@ -239,21 +241,86 @@ static GlobalCheckBox *AutoTranscode()
     return bc;
 }
 
-static GlobalComboBox *DefaultTranscoder()
+/*TODO This function is borrowed from RecordingProfile::fillSelections and sligthly modified 
+I will need to change the original to use a pure abstract class instead of SelectSetting
+*/
+static void RecordingProfile_fillSelections(MythUIComboBoxSetting *setting, int group,
+                                      bool foldautodetect)
+{
+    if (!group)
+    {
+       for (uint i = 0; !availProfiles[i].isEmpty(); i++)
+           setting->addSelection(availProfiles[i], availProfiles[i]);
+       return;
+    }
+
+    MSqlQuery result(MSqlQuery::InitCon());
+    result.prepare(
+        "SELECT name, id "
+        "FROM recordingprofiles "
+        "WHERE profilegroup = :GROUP "
+        "ORDER BY id");
+    result.bindValue(":GROUP", group);
+
+    if (!result.exec())
+    {
+        MythDB::DBError("RecordingProfile::fillSelections 1", result);
+        return;
+    }
+    else if (!result.next())
+    {
+        return;
+    }
+
+    if (group == RecordingProfile::TranscoderGroup && foldautodetect)
+    {
+        QString id = QString::number(RecordingProfile::TranscoderAutodetect);
+        setting->addSelection(QObject::tr("Autodetect"), id);
+    }
+
+    do
+    {
+        QString name = result.value(0).toString();
+        QString id   = result.value(1).toString();
+
+        if (group == RecordingProfile::TranscoderGroup)
+        {
+            if (name == "RTjpeg/MPEG4" || name == "MPEG2")
+            {
+                if (!foldautodetect)
+                {
+                    setting->addSelection(
+                        QObject::tr("Autodetect from %1").arg(name), id);
+                }
+            }
+            else
+            {
+                setting->addSelection(name, id);
+            }
+            continue;
+        }
+
+        setting->addSelection(name, id);
+    }
+    while (result.next());
+}
+
+static GlobalComboBoxSetting *DefaultTranscoder()
 {
-    GlobalComboBox *bc = new GlobalComboBox("DefaultTranscoder");
+    GlobalComboBoxSetting *bc = new GlobalComboBoxSetting("DefaultTranscoder");
     bc->setLabel(QObject::tr("Default transcoder"));
-    RecordingProfile::fillSelections(bc, RecordingProfile::TranscoderGroup,
+    RecordingProfile_fillSelections(bc, RecordingProfile::TranscoderGroup,
                                      true);
+
     bc->setHelpText(QObject::tr("This is the default value used for the "
                     "transcoder setting when a new scheduled "
                     "recording is created."));
     return bc;
 }
 
-static GlobalSpinBox *DeferAutoTranscodeDays()
+static GlobalSpinBoxSetting *DeferAutoTranscodeDays()
 {
-    GlobalSpinBox *gs = new GlobalSpinBox("DeferAutoTranscodeDays", 0, 365, 1);
+    GlobalSpinBoxSetting *gs = new GlobalSpinBoxSetting("DeferAutoTranscodeDays", 0, 365, 1);
     gs->setLabel(QObject::tr("Deferral days for auto transcode jobs"));
     gs->setHelpText(QObject::tr("If non-zero, automatic transcode jobs will "
                     "be scheduled to run this many days after a recording "
@@ -262,12 +329,12 @@ static GlobalSpinBox *DeferAutoTranscodeDays()
     return gs;
 }
 
-static GlobalCheckBox *AutoRunUserJob(uint job_num)
+static GlobalCheckBoxSetting *AutoRunUserJob(uint job_num)
 {
     QString dbStr = QString("AutoRunUserJob%1").arg(job_num);
     QString label = QObject::tr("Run user job #%1")
         .arg(job_num);
-    GlobalCheckBox *bc = new GlobalCheckBox(dbStr);
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting(dbStr);
     bc->setLabel(label);
     bc->setValue(false);
     bc->setHelpText(QObject::tr("This is the default value used for the "
@@ -278,9 +345,9 @@ static GlobalCheckBox *AutoRunUserJob(uint job_num)
     return bc;
 }
 
-static GlobalCheckBox *AggressiveCommDetect()
+static GlobalCheckBoxSetting *AggressiveCommDetect()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AggressiveCommDetect");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("AggressiveCommDetect");
     bc->setLabel(QObject::tr("Strict commercial detection"));
     bc->setValue(true);
     bc->setHelpText(QObject::tr("Enable stricter commercial detection code. "
@@ -288,9 +355,9 @@ static GlobalCheckBox *AggressiveCommDetect()
     return bc;
 }
 
-static HostSpinBox *CommRewindAmount()
+static HostSpinBoxSetting *CommRewindAmount()
 {
-    HostSpinBox *gs = new HostSpinBox("CommRewindAmount", 0, 10, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("CommRewindAmount", 0, 10, 1);
     gs->setLabel(QObject::tr("Commercial skip automatic rewind amount (secs)"));
     gs->setHelpText(QObject::tr("MythTV will automatically rewind "
                     "this many seconds after performing a commercial skip."));
@@ -298,9 +365,9 @@ static HostSpinBox *CommRewindAmount()
     return gs;
 }
 
-static HostSpinBox *CommNotifyAmount()
+static HostSpinBoxSetting *CommNotifyAmount()
 {
-    HostSpinBox *gs = new HostSpinBox("CommNotifyAmount", 0, 10, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("CommNotifyAmount", 0, 10, 1);
     gs->setLabel(QObject::tr("Commercial skip notify amount (secs)"));
     gs->setHelpText(QObject::tr("MythTV will act like a commercial "
                     "begins this many seconds early. This can be useful "
@@ -310,9 +377,9 @@ static HostSpinBox *CommNotifyAmount()
     return gs;
 }
 
-static GlobalSpinBox *MaximumCommercialSkip()
+static GlobalSpinBoxSetting *MaximumCommercialSkip()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("MaximumCommercialSkip", 0, 3600, 10);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("MaximumCommercialSkip", 0, 3600, 10);
     bs->setLabel(QObject::tr("Maximum commercial skip (secs)"));
     bs->setHelpText(QObject::tr("MythTV will discourage long manual commercial "
                     "skips. Skips which are longer than this will require the "
@@ -322,9 +389,9 @@ static GlobalSpinBox *MaximumCommercialSkip()
     return bs;
 }
 
-static GlobalSpinBox *MergeShortCommBreaks()
+static GlobalSpinBoxSetting *MergeShortCommBreaks()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("MergeShortCommBreaks", 0, 3600, 5);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("MergeShortCommBreaks", 0, 3600, 5);
     bs->setLabel(QObject::tr("Merge short commercial breaks (secs)"));
     bs->setHelpText(QObject::tr("Treat consecutive commercial breaks shorter "
                     "than this as one break when skipping forward. Useful if "
@@ -334,9 +401,9 @@ static GlobalSpinBox *MergeShortCommBreaks()
     return bs;
 }
 
-static GlobalSpinBox *AutoExpireExtraSpace()
+static GlobalSpinBoxSetting *AutoExpireExtraSpace()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoExpireExtraSpace", 0, 200, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("AutoExpireExtraSpace", 0, 200, 1);
     bs->setLabel(QObject::tr("Extra disk space (GB)"));
     bs->setHelpText(QObject::tr("Extra disk space (in gigabytes) beyond what "
                     "MythTV requires that you want to keep free on the "
@@ -345,20 +412,9 @@ static GlobalSpinBox *AutoExpireExtraSpace()
     return bs;
 };
 
-static GlobalCheckBox *AutoExpireInsteadOfDelete()
-{
-    GlobalCheckBox *cb = new GlobalCheckBox("AutoExpireInsteadOfDelete");
-    cb->setLabel(QObject::tr("Auto-Expire instead of delete recording"));
-    cb->setValue(false);
-    cb->setHelpText(QObject::tr("If enabled, move deleted recordings to the "
-                    "'Deleted' recgroup and turn on autoexpire "
-                    "instead of deleting immediately."));
-    return cb;
-}
-
-static GlobalSpinBox *DeletedMaxAge()
+static GlobalSpinBoxSetting *DeletedMaxAge()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("DeletedMaxAge", 0, 365, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("DeletedMaxAge", 0, 365, 1);
     bs->setLabel(QObject::tr("Deleted max age (days)"));
     bs->setHelpText(QObject::tr("When set to a number greater than zero, "
                     "Auto-Expire will force expiration of Deleted recordings "
@@ -367,9 +423,9 @@ static GlobalSpinBox *DeletedMaxAge()
     return bs;
 };
 
-static GlobalCheckBox *DeletedFifoOrder()
+static GlobalCheckBoxSetting *DeletedFifoOrder()
 {
-    GlobalCheckBox *cb = new GlobalCheckBox("DeletedFifoOrder");
+    GlobalCheckBoxSetting *cb = new GlobalCheckBoxSetting("DeletedFifoOrder");
     cb->setLabel(QObject::tr("Expire in deleted order"));
     cb->setValue(false);
     cb->setHelpText(QObject::tr(
@@ -378,31 +434,23 @@ static GlobalCheckBox *DeletedFifoOrder()
     return cb;
 };
 
-class DeletedExpireOptions : public TriggeredConfigurationGroup
+static GlobalCheckBoxSetting *AutoExpireInsteadOfDelete()
 {
-    public:
-     DeletedExpireOptions() :
-         TriggeredConfigurationGroup(false, false, false, false)
-         {
-             setLabel(QObject::tr("DeletedExpireOptions"));
-             Setting* enabled = AutoExpireInsteadOfDelete();
-             addChild(enabled);
-             setTrigger(enabled);
-
-             HorizontalConfigurationGroup* settings =
-                 new HorizontalConfigurationGroup(false);
-             settings->addChild(DeletedFifoOrder());
-             settings->addChild(DeletedMaxAge());
-             addTarget("1", settings);
-
-             // show nothing if fillEnabled is off
-             addTarget("0", new HorizontalConfigurationGroup(true));
-         };
-};
+    GlobalCheckBoxSetting *cb = new GlobalCheckBoxSetting("AutoExpireInsteadOfDelete");
+    cb->setLabel(QObject::tr("Auto-Expire instead of delete recording"));
+    cb->setValue(false);
+    cb->setHelpText(QObject::tr("If enabled, move deleted recordings to the "
+                    "'Deleted' recgroup and turn on autoexpire "
+                    "instead of deleting immediately."));
 
-static GlobalComboBox *AutoExpireMethod()
+    cb->addTargetedChild("1",DeletedFifoOrder());
+    cb->addTargetedChild("1",DeletedMaxAge());
+    return cb;
+}
+
+static GlobalComboBoxSetting *AutoExpireMethod()
 {
-    GlobalComboBox *bc = new GlobalComboBox("AutoExpireMethod");
+    GlobalComboBoxSetting *bc = new GlobalComboBoxSetting("AutoExpireMethod");
     bc->setLabel(QObject::tr("Auto-Expire method"));
     bc->addSelection(QObject::tr("Oldest show first"), "1");
     bc->addSelection(QObject::tr("Lowest priority first"), "2");
@@ -414,9 +462,9 @@ static GlobalComboBox *AutoExpireMethod()
     return bc;
 }
 
-static GlobalCheckBox *AutoExpireWatchedPriority()
+static GlobalCheckBoxSetting *AutoExpireWatchedPriority()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoExpireWatchedPriority");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("AutoExpireWatchedPriority");
     bc->setLabel(QObject::tr("Watched before unwatched"));
     bc->setValue(false);
     bc->setHelpText(QObject::tr("If enabled, programs that have been marked as "
@@ -425,9 +473,9 @@ static GlobalCheckBox *AutoExpireWatchedPriority()
     return bc;
 }
 
-static GlobalSpinBox *AutoExpireDayPriority()
+static GlobalSpinBoxSetting *AutoExpireDayPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoExpireDayPriority", 1, 400, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("AutoExpireDayPriority", 1, 400, 1);
     bs->setLabel(QObject::tr("Priority weight"));
     bs->setHelpText(QObject::tr("The number of days bonus a program gets for "
                     "each priority point. This is only used when the Weighted "
@@ -436,9 +484,9 @@ static GlobalSpinBox *AutoExpireDayPriority()
     return bs;
 };
 
-static GlobalCheckBox *AutoExpireDefault()
+static GlobalCheckBoxSetting *AutoExpireDefault()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoExpireDefault");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("AutoExpireDefault");
     bc->setLabel(QObject::tr("Auto-Expire default"));
     bc->setValue(true);
     bc->setHelpText(QObject::tr("If enabled, any new recording schedules "
@@ -447,15 +495,15 @@ static GlobalCheckBox *AutoExpireDefault()
     return bc;
 }
 
-static GlobalSpinBox *AutoExpireLiveTVMaxAge()
+static GlobalSpinBoxSetting *AutoExpireLiveTVMaxAge()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoExpireLiveTVMaxAge", 1, 365, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("AutoExpireLiveTVMaxAge", 1, 365, 1);
     bs->setLabel(QObject::tr("Live TV max age (days)"));
     bs->setHelpText(QObject::tr("Auto-Expire will force expiration of Live "
                     "TV recordings when they are this many days old. Live TV "
                     "recordings may also be expired early if necessary to "
                     "free up disk space."));
-    bs->setValue(1);
+    bs->setValue((int)1);
     return bs;
 };
 
@@ -474,9 +522,9 @@ static GlobalSpinBox *MinRecordDiskThreshold()
 }
 #endif
 
-static GlobalCheckBox *RerecordWatched()
+static GlobalCheckBoxSetting *RerecordWatched()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("RerecordWatched");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("RerecordWatched");
     bc->setLabel(QObject::tr("Re-record watched"));
     bc->setValue(false);
     bc->setHelpText(QObject::tr("If enabled, programs that have been marked as "
@@ -485,9 +533,9 @@ static GlobalCheckBox *RerecordWatched()
     return bc;
 }
 
-static GlobalSpinBox *RecordPreRoll()
+static GlobalSpinBoxSetting *RecordPreRoll()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("RecordPreRoll", 0, 600, 60, true);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("RecordPreRoll", 0, 600, 60, true);
     bs->setLabel(QObject::tr("Time to record before start of show "
                  "(secs)"));
     bs->setHelpText(QObject::tr("This global setting allows the recorder "
@@ -498,9 +546,9 @@ static GlobalSpinBox *RecordPreRoll()
     return bs;
 }
 
-static GlobalSpinBox *RecordOverTime()
+static GlobalSpinBoxSetting *RecordOverTime()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("RecordOverTime", 0, 1800, 60, true);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("RecordOverTime", 0, 1800, 60, true);
     bs->setLabel(QObject::tr("Time to record past end of show (secs)"));
     bs->setValue(0);
     bs->setHelpText(QObject::tr("This global setting allows the recorder "
@@ -510,18 +558,20 @@ static GlobalSpinBox *RecordOverTime()
     return bs;
 }
 
-static GlobalComboBox *OverTimeCategory()
+static GlobalComboBoxSetting *OverTimeCategory()
 {
-    GlobalComboBox *gc = new GlobalComboBox("OverTimeCategory");
+    GlobalComboBoxSetting *gc = new GlobalComboBoxSetting("OverTimeCategory");
     gc->setLabel(QObject::tr("Category of shows to be extended"));
     gc->setHelpText(QObject::tr("For a special category (e.g. "
                     "\"Sports event\"), request that shows be autoextended. "
                     "Only works if a show's category can be determined."));
 
     MSqlQuery query(MSqlQuery::InitCon());
+    //TODO We should not have any SQL here
     query.prepare("SELECT DISTINCT category FROM program GROUP BY category;");
 
     gc->addSelection("", "");
+
     if (query.exec())
     {
         while (query.next())
@@ -535,9 +585,9 @@ static GlobalComboBox *OverTimeCategory()
     return gc;
 }
 
-static GlobalSpinBox *CategoryOverTime()
+static GlobalSpinBoxSetting *CategoryOverTime()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("CategoryOverTime",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("CategoryOverTime",
                                           0, 180, 60, true);
     bs->setLabel(QObject::tr("Record past end of show (mins)"));
     bs->setValue(30);
@@ -548,13 +598,10 @@ static GlobalSpinBox *CategoryOverTime()
     return bs;
 }
 
-static VerticalConfigurationGroup *CategoryOverTimeSettings()
+static GroupSetting *CategoryOverTimeSettings()
 {
-    VerticalConfigurationGroup *vcg =
-        new VerticalConfigurationGroup(false, false);
-
+    GroupSetting *vcg = new GroupSetting();
     vcg->setLabel(QObject::tr("Category record over-time"));
-    vcg->setUseLabel(true);
     vcg->addChild(OverTimeCategory());
     vcg->addChild(CategoryOverTime());
     return vcg;
@@ -579,7 +626,7 @@ static QString pad(const QString &str, int len)
 
     return tmp;
 }
-
+/*
 PlaybackProfileItemConfig::PlaybackProfileItemConfig(ProfileItem &_item) :
     item(_item)
 {
@@ -1108,12 +1155,58 @@ void PlaybackProfileConfig::swap(int i, int j)
     labels[i]->setValue(label_j);
     labels[j]->setValue(label_i);
 }
+*/
+
+static HostComboBoxSetting * CurrentPlaybackProfile()
+{
+    HostComboBoxSetting *grouptrigger = new HostComboBoxSetting("DefaultVideoPlaybackProfile");
+    grouptrigger->setLabel(QObject::tr("Current Video Playback Profile"));
 
-PlaybackProfileConfigs::PlaybackProfileConfigs(const QString &str) :
+    QString host = gCoreContext->GetHostName();
+    QStringList profiles = VideoDisplayProfile::GetProfiles(host);
+    if (profiles.empty())
+    {
+        VideoDisplayProfile::CreateProfiles(host);
+        profiles = VideoDisplayProfile::GetProfiles(host);
+    }
+    if (profiles.empty())
+        return grouptrigger;
+
+    if (!profiles.contains("Normal") &&
+        !profiles.contains("High Quality") &&
+        !profiles.contains("Slim"))
+    {
+        VideoDisplayProfile::CreateNewProfiles(host);
+        profiles = VideoDisplayProfile::GetProfiles(host);
+    }
+
+    if (!profiles.contains("VDPAU Normal") &&
+        !profiles.contains("VDPAU High Quality") &&
+        !profiles.contains("VDPAU Slim"))
+    {
+        VideoDisplayProfile::CreateVDPAUProfiles(host);
+        profiles = VideoDisplayProfile::GetProfiles(host);
+    }
+
+    QString profile = VideoDisplayProfile::GetDefaultProfileName(host);
+    if (!profiles.contains(profile))
+    {
+        profile = (profiles.contains("Normal")) ? "Normal" : profiles[0];
+        VideoDisplayProfile::SetDefaultProfileName(profile, host);
+    }
+
+    QStringList::const_iterator it;
+    for (it = profiles.begin(); it != profiles.end(); ++it)
+        grouptrigger->addSelection(ProgramInfo::i18n(*it), *it);
+    return grouptrigger;
+}
+
+/*
+PlaybackProfileConfigs::PlaybackProfileConfigs() :
     TriggeredConfigurationGroup(false, true,  true, true,
                                 false, false, true, true), grouptrigger(NULL)
 {
-    setLabel(QObject::tr("Playback Profiles") + str);
+    setLabel(QObject::tr("Playback Profiles"));
 
     QString host = gCoreContext->GetHostName();
     QStringList profiles = VideoDisplayProfile::GetProfiles(host);
@@ -1247,9 +1340,25 @@ void PlaybackProfileConfigs::btnPress(QString cmd)
 void PlaybackProfileConfigs::triggerChanged(const QString &trig)
 {
     TriggeredConfigurationGroup::triggerChanged(trig);
-}
+}*/
+/*
+class PlaybackProfileConfigsButton : public StandardSetting, public TransientStorage
+{
+  public:
+    PlaybackProfileConfigsButton():StandardSetting(),TransientStorage()
+    {
+        setLabel()
+        
+    };
+
+    virtual void Load(void){StandardSetting::Load();};
+    virtual void Save(void){StandardSetting::Save();};
+    virtual bool edit(MythScreenType * screen);
+    virtual void resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item){};
+    virtual void applyChange(){};
+};*/
 
-static HostComboBox *PlayBoxOrdering()
+static HostComboBoxSetting *PlayBoxOrdering()
 {
     QString str[4] =
     {
@@ -1264,7 +1373,7 @@ static HostComboBox *PlayBoxOrdering()
         "refers to sections (e.g. \"All Programs\") which list "
         "multiple titles. Sections in parentheses are not affected.");
 
-    HostComboBox *gc = new HostComboBox("PlayBoxOrdering");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("PlayBoxOrdering");
     gc->setLabel(QObject::tr("Episode sort orderings"));
 
     for (int i = 0; i < 4; ++i)
@@ -1276,9 +1385,9 @@ static HostComboBox *PlayBoxOrdering()
     return gc;
 }
 
-static HostComboBox *PlayBoxEpisodeSort()
+static HostComboBoxSetting *PlayBoxEpisodeSort()
 {
-    HostComboBox *gc = new HostComboBox("PlayBoxEpisodeSort");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("PlayBoxEpisodeSort");
     gc->setLabel(QObject::tr("Sort episodes"));
     gc->addSelection(QObject::tr("Record date"), "Date");
     gc->addSelection(QObject::tr("Season/Episode"), "Season");
@@ -1288,9 +1397,9 @@ static HostComboBox *PlayBoxEpisodeSort()
     return gc;
 }
 
-static HostSpinBox *FFRewReposTime()
+static HostSpinBoxSetting *FFRewReposTime()
 {
-    HostSpinBox *gs = new HostSpinBox("FFRewReposTime", 0, 200, 5);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("FFRewReposTime", 0, 200, 5);
     gs->setLabel(QObject::tr("Fast forward/rewind reposition amount"));
     gs->setValue(100);
     gs->setHelpText(QObject::tr("When exiting sticky keys fast forward/rewind "
@@ -1301,9 +1410,9 @@ static HostSpinBox *FFRewReposTime()
     return gs;
 }
 
-static HostCheckBox *FFRewReverse()
+static HostCheckBoxSetting *FFRewReverse()
 {
-    HostCheckBox *gc = new HostCheckBox("FFRewReverse");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("FFRewReverse");
     gc->setLabel(QObject::tr("Reverse direction in fast forward/rewind"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, pressing the sticky rewind key "
@@ -1314,9 +1423,9 @@ static HostCheckBox *FFRewReverse()
     return gc;
 }
 
-static HostComboBox *MenuTheme()
+static HostComboBoxSetting *MenuTheme()
 {
-    HostComboBox *gc = new HostComboBox("MenuTheme");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("MenuTheme");
     gc->setLabel(QObject::tr("Menu theme"));
 
     QList<ThemeInfo> themelist = GetMythUI()->GetThemes(THEME_MENU);
@@ -1348,9 +1457,9 @@ static HostComboBox MUNUSED *DecodeVBIFormat()
     return gc;
 }
 
-static HostSpinBox *OSDCC708TextZoomPercentage(void)
+static HostSpinBoxSetting *OSDCC708TextZoomPercentage(void)
 {
-    HostSpinBox *gs = new HostSpinBox("OSDCC708TextZoom", 50, 200, 5);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("OSDCC708TextZoom", 50, 200, 5);
     gs->setLabel(QObject::tr("Subtitle text zoom percentage"));
     gs->setValue(100);
     gs->setHelpText(QObject::tr("Use this to enlarge or shrink text based subtitles."));
@@ -1358,9 +1467,9 @@ static HostSpinBox *OSDCC708TextZoomPercentage(void)
     return gs;
 }
 
-static HostComboBox *SubtitleFont()
+static HostComboBoxSetting *SubtitleFont()
 {
-    HostComboBox *hcb = new HostComboBox("OSDSubFont");
+    HostComboBoxSetting *hcb = new HostComboBoxSetting("OSDSubFont");
     QFontDatabase db;
     QStringList fonts = db.families();
     QStringList hide  = db.families(QFontDatabase::Symbol);
@@ -1375,9 +1484,9 @@ static HostComboBox *SubtitleFont()
     return hcb;
 }
 
-static HostComboBox *SubtitleCodec()
+static HostComboBoxSetting *SubtitleCodec()
 {
-    HostComboBox *gc = new HostComboBox("SubtitleCodec");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("SubtitleCodec");
 
     gc->setLabel(QObject::tr("Subtitle Codec"));
     QList<QByteArray> list = QTextCodec::availableCodecs();
@@ -1390,18 +1499,19 @@ static HostComboBox *SubtitleCodec()
     return gc;
 }
 
-static HostComboBox *ChannelOrdering()
+static HostComboBoxSetting *ChannelOrdering()
 {
-    HostComboBox *gc = new HostComboBox("ChannelOrdering");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("ChannelOrdering");
     gc->setLabel(QObject::tr("Channel ordering"));
     gc->addSelection(QObject::tr("channel number"), "channum");
     gc->addSelection(QObject::tr("callsign"),       "callsign");
     return gc;
 }
 
-static HostSpinBox *VertScanPercentage()
+static HostSpinBoxSetting *VertScanPercentage()
 {
-    HostSpinBox *gs = new HostSpinBox("VertScanPercentage", -100, 100, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("VertScanPercentage", -100, 100, 1);
+    //TODO should this not be 0% -> 200%
     gs->setLabel(QObject::tr("Vertical scaling"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1410,9 +1520,10 @@ static HostSpinBox *VertScanPercentage()
     return gs;
 }
 
-static HostSpinBox *HorizScanPercentage()
+static HostSpinBoxSetting *HorizScanPercentage()
 {
-    HostSpinBox *gs = new HostSpinBox("HorizScanPercentage", -100, 100, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("HorizScanPercentage", -100, 100, 1);
+    //TODO should this not be 0% -> 200%
     gs->setLabel(QObject::tr("Horizontal scaling"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1421,27 +1532,27 @@ static HostSpinBox *HorizScanPercentage()
     return gs;
 };
 
-static HostSpinBox *XScanDisplacement()
+static HostSpinBoxSetting *XScanDisplacement()
 {
-    HostSpinBox *gs = new HostSpinBox("XScanDisplacement", -50, 50, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("XScanDisplacement", -50, 50, 1);
     gs->setLabel(QObject::tr("Scan displacement (X)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Adjust this to move the image horizontally."));
     return gs;
 }
 
-static HostSpinBox *YScanDisplacement()
+static HostSpinBoxSetting *YScanDisplacement()
 {
-    HostSpinBox *gs = new HostSpinBox("YScanDisplacement", -50, 50, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("YScanDisplacement", -50, 50, 1);
     gs->setLabel(QObject::tr("Scan displacement (Y)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Adjust this to move the image vertically."));
     return gs;
 };
 
-static HostCheckBox *CCBackground()
+static HostCheckBoxSetting *CCBackground()
 {
-    HostCheckBox *gc = new HostCheckBox("CCBackground");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("CCBackground");
     gc->setLabel(QObject::tr("Black background for closed captioning"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1451,9 +1562,9 @@ static HostCheckBox *CCBackground()
     return gc;
 }
 
-static HostCheckBox *DefaultCCMode()
+static HostCheckBoxSetting *DefaultCCMode()
 {
-    HostCheckBox *gc = new HostCheckBox("DefaultCCMode");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("DefaultCCMode");
     gc->setLabel(QObject::tr("Always display closed captioning or subtitles"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1464,9 +1575,9 @@ static HostCheckBox *DefaultCCMode()
     return gc;
 }
 
-static HostCheckBox *PreferCC708()
+static HostCheckBoxSetting *PreferCC708()
 {
-    HostCheckBox *gc = new HostCheckBox("Prefer708Captions");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("Prefer708Captions");
     gc->setLabel(QObject::tr("Prefer EIA-708 over EIA-608 captions"));
     gc->setValue(true);
     gc->setHelpText(
@@ -1477,9 +1588,9 @@ static HostCheckBox *PreferCC708()
     return gc;
 }
 
-static HostCheckBox *EnableMHEG()
+static HostCheckBoxSetting *EnableMHEG()
 {
-    HostCheckBox *gc = new HostCheckBox("EnableMHEG");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("EnableMHEG");
     gc->setLabel(QObject::tr("Enable interactive TV"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1489,9 +1600,9 @@ static HostCheckBox *EnableMHEG()
     return gc;
 }
 
-static HostCheckBox *PersistentBrowseMode()
+static HostCheckBoxSetting *PersistentBrowseMode()
 {
-    HostCheckBox *gc = new HostCheckBox("PersistentBrowseMode");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("PersistentBrowseMode");
     gc->setLabel(QObject::tr("Always use browse mode in Live TV"));
     gc->setValue(true);
     gc->setHelpText(
@@ -1501,9 +1612,9 @@ static HostCheckBox *PersistentBrowseMode()
     return gc;
 }
 
-static HostCheckBox *BrowseAllTuners()
+static HostCheckBoxSetting *BrowseAllTuners()
 {
-    HostCheckBox *gc = new HostCheckBox("BrowseAllTuners");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("BrowseAllTuners");
     gc->setLabel(QObject::tr("Browse all channels"));
     gc->setValue(false);
     gc->setHelpText(
@@ -1514,9 +1625,9 @@ static HostCheckBox *BrowseAllTuners()
     return gc;
 }
 
-static HostCheckBox *ClearSavedPosition()
+static HostCheckBoxSetting *ClearSavedPosition()
 {
-    HostCheckBox *gc = new HostCheckBox("ClearSavedPosition");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("ClearSavedPosition");
     gc->setLabel(QObject::tr("Clear bookmark on playback"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, automatically clear the "
@@ -1526,9 +1637,9 @@ static HostCheckBox *ClearSavedPosition()
     return gc;
 }
 
-static HostCheckBox *AltClearSavedPosition()
+static HostCheckBoxSetting *AltClearSavedPosition()
 {
-    HostCheckBox *gc = new HostCheckBox("AltClearSavedPosition");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("AltClearSavedPosition");
     gc->setLabel(QObject::tr("Alternate clear and save bookmark"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("During playback the SELECT key "
@@ -1539,9 +1650,9 @@ static HostCheckBox *AltClearSavedPosition()
     return gc;
 }
 
-static HostComboBox *PlaybackExitPrompt()
+static HostComboBoxSetting *PlaybackExitPrompt()
 {
-    HostComboBox *gc = new HostComboBox("PlaybackExitPrompt");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("PlaybackExitPrompt");
     gc->setLabel(QObject::tr("Action on playback exit"));
     gc->addSelection(QObject::tr("Just exit"), "0");
     gc->addSelection(QObject::tr("Save position and exit"), "2");
@@ -1555,9 +1666,9 @@ static HostComboBox *PlaybackExitPrompt()
     return gc;
 }
 
-static HostCheckBox *EndOfRecordingExitPrompt()
+static HostCheckBoxSetting *EndOfRecordingExitPrompt()
 {
-    HostCheckBox *gc = new HostCheckBox("EndOfRecordingExitPrompt");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("EndOfRecordingExitPrompt");
     gc->setLabel(QObject::tr("Prompt at end of recording"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, a menu will be displayed allowing "
@@ -1566,9 +1677,9 @@ static HostCheckBox *EndOfRecordingExitPrompt()
     return gc;
 }
 
-static HostCheckBox *JumpToProgramOSD()
+static HostCheckBoxSetting *JumpToProgramOSD()
 {
-    HostCheckBox *gc = new HostCheckBox("JumpToProgramOSD");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("JumpToProgramOSD");
     gc->setLabel(QObject::tr("Jump to program OSD"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr(
@@ -1580,9 +1691,9 @@ static HostCheckBox *JumpToProgramOSD()
     return gc;
 }
 
-static HostCheckBox *ContinueEmbeddedTVPlay()
+static HostCheckBoxSetting *ContinueEmbeddedTVPlay()
 {
-    HostCheckBox *gc = new HostCheckBox("ContinueEmbeddedTVPlay");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("ContinueEmbeddedTVPlay");
     gc->setLabel(QObject::tr("Continue playback when embedded"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1593,9 +1704,9 @@ static HostCheckBox *ContinueEmbeddedTVPlay()
     return gc;
 }
 
-static HostCheckBox *AutomaticSetWatched()
+static HostCheckBoxSetting *AutomaticSetWatched()
 {
-    HostCheckBox *gc = new HostCheckBox("AutomaticSetWatched");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("AutomaticSetWatched");
     gc->setLabel(QObject::tr("Automatically mark a recording as watched"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, when you exit near the end of a "
@@ -1606,9 +1717,9 @@ static HostCheckBox *AutomaticSetWatched()
     return gc;
 }
 
-static HostSpinBox *LiveTVIdleTimeout()
+static HostSpinBoxSetting *LiveTVIdleTimeout()
 {
-    HostSpinBox *gs = new HostSpinBox("LiveTVIdleTimeout", 0, 3600, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("LiveTVIdleTimeout", 0, 3600, 1);
     gs->setLabel(QObject::tr("Live TV idle timeout (mins)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1643,9 +1754,9 @@ static HostSpinBox *LiveTVIdleTimeout()
 //     return gc;
 // }
 
-static HostCheckBox *UseVirtualKeyboard()
+static HostCheckBoxSetting *UseVirtualKeyboard()
 {
-    HostCheckBox *gc = new HostCheckBox("UseVirtualKeyboard");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("UseVirtualKeyboard");
     gc->setLabel(QObject::tr("Use line edit virtual keyboards"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, you can use a virtual keyboard "
@@ -1654,9 +1765,9 @@ static HostCheckBox *UseVirtualKeyboard()
     return gc;
 }
 
-static HostComboBox *OverrideExitMenu()
+static HostComboBoxSetting *OverrideExitMenu()
 {
-    HostComboBox *gc = new HostComboBox("OverrideExitMenu");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("OverrideExitMenu");
     gc->setLabel(QObject::tr("Customize exit menu options"));
     gc->addSelection(QObject::tr("Default"), "0");
     gc->addSelection(QObject::tr("Show quit"), "1");
@@ -1671,9 +1782,9 @@ static HostComboBox *OverrideExitMenu()
     return gc;
 }
 
-static HostLineEdit *RebootCommand()
+static HostTextEditSetting *RebootCommand()
 {
-    HostLineEdit *ge = new HostLineEdit("RebootCommand");
+    HostTextEditSetting *ge = new HostTextEditSetting("RebootCommand");
     ge->setLabel(QObject::tr("Reboot command"));
     ge->setValue("");
     ge->setHelpText(QObject::tr("Optional. Script to run if you select "
@@ -1683,9 +1794,9 @@ static HostLineEdit *RebootCommand()
     return ge;
 }
 
-static HostLineEdit *HaltCommand()
+static HostTextEditSetting *HaltCommand()
 {
-    HostLineEdit *ge = new HostLineEdit("HaltCommand");
+    HostTextEditSetting *ge = new HostTextEditSetting("HaltCommand");
     ge->setLabel(QObject::tr("Halt command"));
     ge->setValue("");
     ge->setHelpText(QObject::tr("Optional. Script to run if you select "
@@ -1695,9 +1806,11 @@ static HostLineEdit *HaltCommand()
     return ge;
 }
 
-static HostLineEdit *LircDaemonDevice()
+static HostTextEditSetting *LircDaemonDevice()
 {
-    HostLineEdit *ge = new HostLineEdit("LircSocket");
+// TODO Cannot use File browser as it can be address[:port]
+//    HostFileBrowserSetting *ge = new HostFileBrowserSetting("LircSocket");
+    HostTextEditSetting *ge = new HostTextEditSetting("LircSocket");
     ge->setLabel(QObject::tr("LIRC daemon socket"));
 
     /* lircd socket moved from /dev/ to /var/run/lirc/ in lirc 0.8.6 */
@@ -1712,18 +1825,18 @@ static HostLineEdit *LircDaemonDevice()
     return ge;
 }
 
-static HostLineEdit *ScreenShotPath()
+static HostTextEditSetting *ScreenShotPath()
 {
-    HostLineEdit *ge = new HostLineEdit("ScreenShotPath");
+    HostTextEditSetting *ge = new HostTextEditSetting("ScreenShotPath");
     ge->setLabel(QObject::tr("Screen shot path"));
     ge->setValue("/tmp/");
     ge->setHelpText(QObject::tr("Path to screenshot storage location. Should be writable by the frontend"));
     return ge;
 }
 
-static HostLineEdit *SetupPinCode()
+static HostTextEditSetting *SetupPinCode()
 {
-    HostLineEdit *ge = new HostLineEdit("SetupPinCode");
+    HostTextEditSetting *ge = new HostTextEditSetting("SetupPinCode");
     ge->setLabel(QObject::tr("Setup PIN code"));
     ge->setHelpText(QObject::tr("This PIN is used to control access to the "
                     "setup menus. If you want to use this feature, then "
@@ -1732,9 +1845,9 @@ static HostLineEdit *SetupPinCode()
     return ge;
 }
 
-static HostCheckBox *SetupPinCodeRequired()
+static HostCheckBoxSetting *SetupPinCodeRequired()
 {
-    HostCheckBox *gc = new HostCheckBox("SetupPinCodeRequired");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("SetupPinCodeRequired");
     gc->setLabel(QObject::tr("Require setup PIN") + "    ");
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, you will not be able to return "
@@ -1743,9 +1856,9 @@ static HostCheckBox *SetupPinCodeRequired()
     return gc;
 }
 
-static HostComboBox *XineramaScreen()
+static HostComboBoxSetting *XineramaScreen()
 {
-    HostComboBox *gc = new HostComboBox("XineramaScreen", false);
+    HostComboBoxSetting *gc = new HostComboBoxSetting("XineramaScreen");
     int num = MythDisplay::GetNumberXineramaScreens();
     for (int i=0; i<num; ++i)
         gc->addSelection(QString::number(i), QString::number(i));
@@ -1758,9 +1871,9 @@ static HostComboBox *XineramaScreen()
 }
 
 
-static HostComboBox *XineramaMonitorAspectRatio()
+static HostComboBoxSetting *XineramaMonitorAspectRatio()
 {
-    HostComboBox *gc = new HostComboBox("XineramaMonitorAspectRatio");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("XineramaMonitorAspectRatio");
     gc->setLabel(QObject::tr("Monitor aspect ratio"));
     gc->addSelection(QObject::tr("4:3"),   "1.3333");
     gc->addSelection(QObject::tr("16:9"),  "1.7777");
@@ -1771,9 +1884,9 @@ static HostComboBox *XineramaMonitorAspectRatio()
     return gc;
 }
 
-static HostComboBox *LetterboxingColour()
+static HostComboBoxSetting *LetterboxingColour()
 {
-    HostComboBox *gc = new HostComboBox("LetterboxColour");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("LetterboxColour");
     gc->setLabel(QObject::tr("Letterboxing color"));
     for (int m = kLetterBoxColour_Black; m < kLetterBoxColour_END; ++m)
         gc->addSelection(toString((LetterBoxColour)m), QString::number(m));
@@ -1786,9 +1899,9 @@ static HostComboBox *LetterboxingColour()
     return gc;
 }
 
-static HostComboBox *AspectOverride()
+static HostComboBoxSetting *AspectOverride()
 {
-    HostComboBox *gc = new HostComboBox("AspectOverride");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("AspectOverride");
     gc->setLabel(QObject::tr("Video aspect override"));
     for (int m = kAspect_Off; m < kAspect_END; ++m)
         gc->addSelection(toString((AspectOverrideMode)m), QString::number(m));
@@ -1799,9 +1912,9 @@ static HostComboBox *AspectOverride()
     return gc;
 }
 
-static HostComboBox *AdjustFill()
+static HostComboBoxSetting *AdjustFill()
 {
-    HostComboBox *gc = new HostComboBox("AdjustFill");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("AdjustFill");
     gc->setLabel(QObject::tr("Zoom"));
     for (int m = kAdjustFill_Off; m < kAdjustFill_END; ++m)
         gc->addSelection(toString((AdjustFillMode)m), QString::number(m));
@@ -1817,9 +1930,9 @@ static HostComboBox *AdjustFill()
 
 // Theme settings
 
-static HostSpinBox *GuiWidth()
+static HostSpinBoxSetting *GuiWidth()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiWidth", 0, 1920, 8, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("GuiWidth", 0, 1920, 8, true);
     gs->setLabel(QObject::tr("GUI width (pixels)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The width of the GUI. Do not make the GUI "
@@ -1828,9 +1941,9 @@ static HostSpinBox *GuiWidth()
     return gs;
 }
 
-static HostSpinBox *GuiHeight()
+static HostSpinBoxSetting *GuiHeight()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiHeight", 0, 1600, 8, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("GuiHeight", 0, 1600, 8, true);
     gs->setLabel(QObject::tr("GUI height (pixels)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The height of the GUI. Do not make the GUI "
@@ -1839,9 +1952,9 @@ static HostSpinBox *GuiHeight()
     return gs;
 }
 
-static HostSpinBox *GuiOffsetX()
+static HostSpinBoxSetting *GuiOffsetX()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiOffsetX", -3840, 3840, 32, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("GuiOffsetX", -3840, 3840, 32, true);
     gs->setLabel(QObject::tr("GUI X offset"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The horizontal offset where the GUI will be "
@@ -1849,9 +1962,9 @@ static HostSpinBox *GuiOffsetX()
     return gs;
 }
 
-static HostSpinBox *GuiOffsetY()
+static HostSpinBoxSetting *GuiOffsetY()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiOffsetY", -1600, 1600, 8, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("GuiOffsetY", -1600, 1600, 8, true);
     gs->setLabel(QObject::tr("GUI Y offset"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The vertical offset where the GUI will be "
@@ -1883,9 +1996,9 @@ static HostSpinBox *DisplaySizeHeight()
 }
 #endif
 
-static HostCheckBox *GuiSizeForTV()
+static HostCheckBoxSetting *GuiSizeForTV()
 {
-    HostCheckBox *gc = new HostCheckBox("GuiSizeForTV");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("GuiSizeForTV");
     gc->setLabel(QObject::tr("Use GUI size for TV playback"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, use the above size for TV, "
@@ -1894,45 +2007,33 @@ static HostCheckBox *GuiSizeForTV()
 }
 
 #if defined(USING_XRANDR) || CONFIG_DARWIN
-static HostCheckBox *UseVideoModes()
-{
-    HostCheckBox *gc = new HostCheckBox("UseVideoModes");
-    gc->setLabel(QObject::tr("Separate video modes for GUI and TV playback"));
-    gc->setValue(false);
-    gc->setHelpText(QObject::tr("Switch X Window video modes for TV. "
-                    "Requires \"xrandr\" support."));
-    return gc;
-}
 
-static HostSpinBox *VidModeWidth(int idx)
+static HostSpinBoxSetting *VidModeWidth(int idx)
 {
-    HostSpinBox *gs = new HostSpinBox(QString("VidModeWidth%1").arg(idx),
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting(QString("VidModeWidth%1").arg(idx),
                                             0, 1920, 16, true);
     gs->setLabel((idx<1) ? QObject::tr("In X"): "");
-    gs->setLabelAboveWidget(idx<1);
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Horizontal resolution of video "
                     "which needs a special output resolution."));
     return gs;
 }
 
-static HostSpinBox *VidModeHeight(int idx)
+static HostSpinBoxSetting *VidModeHeight(int idx)
 {
-    HostSpinBox *gs = new HostSpinBox(QString("VidModeHeight%1").arg(idx),
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting(QString("VidModeHeight%1").arg(idx),
                                             0, 1080, 16, true);
     gs->setLabel((idx<1) ? QObject::tr("In Y"): "");
-    gs->setLabelAboveWidget(idx<1);
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Vertical resolution of video "
                     "which needs a special output resolution."));
     return gs;
 }
 
-static HostComboBox *GuiVidModeResolution()
+static HostComboBoxSetting *GuiVidModeResolution()
 {
-    HostComboBox *gc = new HostComboBox("GuiVidModeResolution");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("GuiVidModeResolution");
     gc->setLabel(QObject::tr("GUI"));
-    gc->setLabelAboveWidget(true);
     gc->setHelpText(QObject::tr("Resolution of screen "
                     "when not watching a video."));
 
@@ -1961,7 +2062,7 @@ static HostComboBox *GuiVidModeResolution()
     return gc;
 }
 
-static HostComboBox *TVVidModeResolution(int idx=-1)
+static HostComboBoxSetting *TVVidModeResolution(int idx=-1)
 {
     QString dhelp = QObject::tr("Default screen resolution "
                                 "when watching a video.");
@@ -1970,13 +2071,12 @@ static HostComboBox *TVVidModeResolution(int idx=-1)
 
     QString qstr = (idx<0) ? "TVVidModeResolution" :
         QString("TVVidModeResolution%1").arg(idx);
-    HostComboBox *gc = new HostComboBox(qstr);
+    HostComboBoxSetting *gc = new HostComboBoxSetting(qstr);
     QString lstr = (idx<0) ? QObject::tr("Video output") :
         ((idx<1) ? QObject::tr("Output") : "");
     QString hstr = (idx<0) ? dhelp : ohelp;
 
     gc->setLabel(lstr);
-    gc->setLabelAboveWidget(idx<1);
     gc->setHelpText(hstr);
 
     const vector<DisplayResScreen> scr = GetVideoModes();
@@ -1988,7 +2088,53 @@ static HostComboBox *TVVidModeResolution(int idx=-1)
     return gc;
 }
 
-static HostRefreshRateComboBox *TVVidModeRefreshRate(int idx=-1)
+
+void HostRefreshRateComboBoxSetting::ChangeResolution(StandardSetting * setting)
+{
+    clearSelections();
+    QString resolution = setting->getValue();
+
+    const vector<double> list = GetRefreshRates(resolution);
+    addSelection(QObject::tr("Auto"), "0");
+    int hz50 = -1, hz60 = -1;
+    for (uint i=0; i<list.size(); ++i)
+    {
+        QString sel = QString::number((double) list[i],'f', 3);
+        addSelection(sel+" Hz", sel);
+        hz50 = (fabs(50.0 - list[i]) < 0.01) ? i : hz50;
+        hz60 = (fabs(60.0 - list[i]) < 0.01) ? i : hz60;
+    }
+
+    setValue(0);
+    if ("640x480" == resolution || "720x480" == resolution)
+        setValue(hz60+1);
+    if ("640x576" == resolution || "720x576" == resolution)
+        setValue(hz50+1);
+
+    setEnabled(list.size());
+}
+
+const vector<double> HostRefreshRateComboBoxSetting::GetRefreshRates(const QString &res)
+{
+    QStringList slist = res.split("x");
+    int w = 0, h = 0;
+    bool ok0 = false, ok1 = false;
+    if (2 == slist.size())
+    {
+        w = slist[0].toInt(&ok0);
+        h = slist[1].toInt(&ok1);
+    }
+
+    DisplayRes *display_res = DisplayRes::GetDisplayRes();
+    if (display_res && ok0 && ok1)
+        return display_res->GetRefreshRates(w, h);
+
+    vector<double> list;
+    return list;
+}
+
+
+static HostRefreshRateComboBoxSetting *TVVidModeRefreshRate(int idx=-1)
 {
     QString dhelp = QObject::tr("Default refresh rate "
                                 "when watching a video. "
@@ -1998,18 +2144,17 @@ static HostRefreshRateComboBox *TVVidModeRefreshRate(int idx=-1)
                                 "Leave at \"Auto\" to automatically use the best available");
     QString qstr = (idx<0) ? "TVVidModeRefreshRate" :
         QString("TVVidModeRefreshRate%1").arg(idx);
-    HostRefreshRateComboBox *gc = new HostRefreshRateComboBox(qstr);
+    HostRefreshRateComboBoxSetting *gc = new HostRefreshRateComboBoxSetting(qstr);
     QString lstr = (idx<1) ? QObject::tr("Rate") : "";
     QString hstr = (idx<0) ? dhelp : ohelp;
 
     gc->setLabel(lstr);
-    gc->setLabelAboveWidget(idx<1);
     gc->setHelpText(hstr);
     gc->setEnabled(false);
     return gc;
 }
 
-static HostComboBox *TVVidModeForceAspect(int idx=-1)
+static HostComboBoxSetting *TVVidModeForceAspect(int idx=-1)
 {
     QString dhelp = QObject::tr("Aspect ratio when watching a video.");
     QString ohelp = QObject::tr("Aspect ratio when watching a "
@@ -2017,9 +2162,8 @@ static HostComboBox *TVVidModeForceAspect(int idx=-1)
 
     QString qstr = (idx<0) ? "TVVidModeForceAspect" :
         QString("TVVidModeForceAspect%1").arg(idx);
-    HostComboBox *gc = new HostComboBox(qstr);
+    HostComboBoxSetting *gc = new HostComboBoxSetting(qstr);
     gc->setLabel( (idx<1) ? QObject::tr("Aspect") : "" );
-    gc->setLabelAboveWidget(idx<1);
 
     QString hstr = (idx<0) ? dhelp : ohelp;
     gc->setHelpText(hstr+"  "+
@@ -2032,6 +2176,68 @@ static HostComboBox *TVVidModeForceAspect(int idx=-1)
     return gc;
 }
 
+
+
+class DefaultVideoMode : public GroupSetting
+{
+  public:
+    DefaultVideoMode():GroupSetting()
+    {
+        setLabel(QObject::tr("Video Mode Settings"));
+        m_res = TVVidModeResolution();
+        m_rate = TVVidModeRefreshRate();
+        addChild(GuiVidModeResolution());
+        addChild(m_res);
+        addChild(m_rate);
+        addChild(TVVidModeForceAspect());
+        connect(m_res, SIGNAL(valueChanged(StandardSetting *)),
+                m_rate, SLOT(ChangeResolution(StandardSetting *)));
+   }
+  private:
+    HostComboBoxSetting *m_res;
+    HostRefreshRateComboBoxSetting *m_rate;
+}; 
+
+
+class OverrideVideoMode : public GroupSetting
+{
+  public:
+    OverrideVideoMode (int idx):GroupSetting()
+    {
+        setLabel(QObject::tr("Override video mode #%1").arg(idx));
+        // input side
+        addChild(VidModeWidth(idx));
+        addChild(VidModeHeight(idx));
+        // output side
+        addChild(m_res = TVVidModeResolution(idx));
+        addChild(m_rate = TVVidModeRefreshRate(idx));
+        addChild(TVVidModeForceAspect(idx));
+                connect(m_res, SIGNAL(valueChanged(StandardSetting *)),
+                        m_rate, SLOT(ChangeResolution(StandardSetting *)));
+    }
+  private:
+    HostComboBoxSetting *m_res;
+    HostRefreshRateComboBoxSetting *m_rate;
+};
+
+static HostCheckBoxSetting *UseVideoModes() // replace VideoModeSettings
+{
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("UseVideoModes");
+    gc->setLabel(QObject::tr("Separate video modes for GUI and TV playback"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr("Switch X Window video modes for TV. "
+                    "Requires \"xrandr\" support."));
+
+    gc->addTargetedChild("1",new DefaultVideoMode());
+
+    for (int idx = 0; idx < 3; ++idx)
+    {
+        gc->addTargetedChild("1",new OverrideVideoMode(idx));
+    }
+    return gc;
+}
+
+/*
 class VideoModeSettings : public TriggeredConfigurationGroup
 {
   public:
@@ -2048,7 +2254,7 @@ class VideoModeSettings : public TriggeredConfigurationGroup
         ConfigurationGroup* defaultsettings =
             new HorizontalConfigurationGroup(false, false);
 
-        HostComboBox *res = TVVidModeResolution();
+        HostComboBoxSetting *res = TVVidModeResolution();
         HostRefreshRateComboBox *rate = TVVidModeRefreshRate();
         defaultsettings->addChild(GuiVidModeResolution());
         defaultsettings->addChild(res);
@@ -2081,12 +2287,12 @@ class VideoModeSettings : public TriggeredConfigurationGroup
         addTarget("1", settings);
         addTarget("0", new VerticalConfigurationGroup(true));
     }
-};
+};*/
 #endif
 
-static HostCheckBox *HideMouseCursor()
+static HostCheckBoxSetting *HideMouseCursor()
 {
-    HostCheckBox *gc = new HostCheckBox("HideMouseCursor");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("HideMouseCursor");
     gc->setLabel(QObject::tr("Hide mouse cursor in MythTV"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Toggles mouse cursor visibility for touchscreens. "
@@ -2096,9 +2302,9 @@ static HostCheckBox *HideMouseCursor()
 };
 
 
-static HostCheckBox *RunInWindow()
+static HostCheckBoxSetting *RunInWindow()
 {
-    HostCheckBox *gc = new HostCheckBox("RunFrontendInWindow");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("RunFrontendInWindow");
     gc->setLabel(QObject::tr("Use window border"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Toggles between windowed and "
@@ -2106,10 +2312,10 @@ static HostCheckBox *RunInWindow()
     return gc;
 }
 
-static HostCheckBox *UseFixedWindowSize()
+static HostCheckBoxSetting *UseFixedWindowSize()
 {
 {
-    HostCheckBox *gc = new HostCheckBox("UseFixedWindowSize");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("UseFixedWindowSize");
     gc->setLabel(QObject::tr("Use fixed window size"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr(
@@ -2119,9 +2325,9 @@ static HostCheckBox *UseFixedWindowSize()
 }
 }
 
-static HostComboBox *MythDateFormatCB()
+static HostComboBoxSetting *MythDateFormatCB()
 {
-    HostComboBox *gc = new HostComboBox("DateFormat");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("DateFormat");
     gc->setLabel(QObject::tr("Date format"));
 
     QDate sampdate = QDate::currentDate();
@@ -2160,9 +2366,9 @@ static HostComboBox *MythDateFormatCB()
     return gc;
 }
 
-static HostComboBox *MythShortDateFormat()
+static HostComboBoxSetting *MythShortDateFormat()
 {
-    HostComboBox *gc = new HostComboBox("ShortDateFormat");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("ShortDateFormat");
     gc->setLabel(QObject::tr("Short date format"));
 
     QDate sampdate = QDate::currentDate();
@@ -2199,9 +2405,9 @@ static HostComboBox *MythShortDateFormat()
     return gc;
 }
 
-static HostComboBox *MythTimeFormat()
+static HostComboBoxSetting *MythTimeFormat()
 {
-    HostComboBox *gc = new HostComboBox("TimeFormat");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("TimeFormat");
     gc->setLabel(QObject::tr("Time format"));
 
     QTime samptime = QTime::currentTime();
@@ -2219,9 +2425,9 @@ static HostComboBox *MythTimeFormat()
     return gc;
 }
 
-static HostComboBox *ChannelFormat()
+static HostComboBoxSetting *ChannelFormat()
 {
-    HostComboBox *gc = new HostComboBox("ChannelFormat");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("ChannelFormat");
     gc->setLabel(QObject::tr("Channel format"));
     gc->addSelection(QObject::tr("number"), "<num>");
     gc->addSelection(QObject::tr("number callsign"), "<num> <sign>");
@@ -2233,9 +2439,9 @@ static HostComboBox *ChannelFormat()
     return gc;
 }
 
-static HostComboBox *LongChannelFormat()
+static HostComboBoxSetting *LongChannelFormat()
 {
-    HostComboBox *gc = new HostComboBox("LongChannelFormat");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("LongChannelFormat");
     gc->setLabel(QObject::tr("Long channel format"));
     gc->addSelection(QObject::tr("number"), "<num>");
     gc->addSelection(QObject::tr("number callsign"), "<num> <sign>");
@@ -2247,9 +2453,9 @@ static HostComboBox *LongChannelFormat()
     return gc;
 }
 
-static GlobalCheckBox *LiveTVPriority()
+static GlobalCheckBoxSetting *LiveTVPriority()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("LiveTVPriority");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("LiveTVPriority");
     bc->setLabel(QObject::tr("Allow Live TV to move scheduled shows"));
     bc->setValue(false);
     bc->setHelpText(QObject::tr("If enabled, scheduled recordings will "
@@ -2258,20 +2464,11 @@ static GlobalCheckBox *LiveTVPriority()
     return bc;
 }
 
-static HostCheckBox *ChannelGroupRememberLast()
-{
-    HostCheckBox *gc = new HostCheckBox("ChannelGroupRememberLast");
-    gc->setLabel(QObject::tr("Remember last channel group"));
-    gc->setHelpText(QObject::tr("If enabled, the EPG will initially display "
-                    "only the channels from the last channel group selected. Pressing "
-                    "\"4\" will toggle channel group."));
-    gc->setValue(false);
-    return gc;
-}
 
-static HostComboBox *ChannelGroupDefault()
+
+static HostComboBoxSetting *ChannelGroupDefault()
 {
-    HostComboBox *gc = new HostComboBox("ChannelGroupDefault");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("ChannelGroupDefault");
     gc->setLabel(QObject::tr("Default channel group"));
 
     ChannelGroupList changrplist;
@@ -2291,9 +2488,21 @@ static HostComboBox *ChannelGroupDefault()
     return gc;
 }
 
-static HostCheckBox *BrowseChannelGroup()
+static HostCheckBoxSetting *ChannelGroupRememberLast()
+{
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("ChannelGroupRememberLast");
+    gc->setLabel(QObject::tr("Remember last channel group"));
+    gc->setHelpText(QObject::tr("If enabled, the EPG will initially display "
+                    "only the channels from the last channel group selected. Pressing "
+                    "\"4\" will toggle channel group."));
+    gc->setValue(false);
+    gc->addTargetedChild("0", ChannelGroupDefault());
+    return gc;
+}
+
+static HostCheckBoxSetting *BrowseChannelGroup()
 {
-    HostCheckBox *gc = new HostCheckBox("BrowseChannelGroup");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("BrowseChannelGroup");
     gc->setLabel(QObject::tr("Browse/change channels from Channel Group"));
     gc->setHelpText(QObject::tr("If enabled, Live TV will browse or change "
                     "channels from the selected channel group. The \"All "
@@ -2303,33 +2512,11 @@ static HostCheckBox *BrowseChannelGroup()
     return gc;
 }
 
-// Channel Group Settings
-class ChannelGroupSettings : public TriggeredConfigurationGroup
-{
-  public:
-    ChannelGroupSettings() : TriggeredConfigurationGroup(false, true, false, false)
-    {
-         setLabel(QObject::tr("Remember last channel group"));
-         setUseLabel(false);
-
-         Setting* RememberChanGrpEnabled = ChannelGroupRememberLast();
-         addChild(RememberChanGrpEnabled);
-         setTrigger(RememberChanGrpEnabled);
-
-         ConfigurationGroup* settings = new VerticalConfigurationGroup(false,false);
-         settings->addChild(ChannelGroupDefault());
-         addTarget("0", settings);
-
-         // show nothing if RememberChanGrpEnabled is on
-         addTarget("1", new VerticalConfigurationGroup(true,false));
-     };
-};
-
 // General RecPriorities settings
 
-static GlobalCheckBox *GRSchedMoveHigher()
+static GlobalCheckBoxSetting *GRSchedMoveHigher()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("SchedMoveHigher");
+    GlobalCheckBoxSetting *bc = new GlobalCheckBoxSetting("SchedMoveHigher");
     bc->setLabel(QObject::tr("Reschedule higher priorities"));
     bc->setHelpText(QObject::tr("Move higher priority programs to other "
                     "cards and showings when resolving conflicts. This "
@@ -2340,9 +2527,9 @@ static GlobalCheckBox *GRSchedMoveHigher()
     return bc;
 }
 
-static GlobalComboBox *GRSchedOpenEnd()
+static GlobalComboBoxSetting *GRSchedOpenEnd()
 {
-    GlobalComboBox *bc = new GlobalComboBox("SchedOpenEnd");
+    GlobalComboBoxSetting *bc = new GlobalComboBoxSetting("SchedOpenEnd");
     bc->setLabel(QObject::tr("Avoid back to back recordings"));
     bc->setHelpText(QObject::tr("Selects the situations where the scheduler "
                     "will avoid assigning shows to the same card if their "
@@ -2355,9 +2542,9 @@ static GlobalComboBox *GRSchedOpenEnd()
     return bc;
 }
 
-static GlobalSpinBox *GRDefaultStartOffset()
+static GlobalSpinBoxSetting *GRDefaultStartOffset()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("DefaultStartOffset",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("DefaultStartOffset",
                                           -10, 30, 5, true);
     bs->setLabel(QObject::tr("Default 'Start Early' minutes for new "
                              "recording rules"));
@@ -2370,9 +2557,9 @@ static GlobalSpinBox *GRDefaultStartOffset()
     return bs;
 }
 
-static GlobalSpinBox *GRDefaultEndOffset()
+static GlobalSpinBoxSetting *GRDefaultEndOffset()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("DefaultEndOffset",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("DefaultEndOffset",
                                           -10, 30, 5, true);
     bs->setLabel(QObject::tr("Default 'End Late' minutes for new "
                              "recording rules"));
@@ -2385,9 +2572,9 @@ static GlobalSpinBox *GRDefaultEndOffset()
     return bs;
 }
 
-static GlobalSpinBox *GRPrefInputRecPriority()
+static GlobalSpinBoxSetting *GRPrefInputRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("PrefInputPriority", 1, 99, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("PrefInputPriority", 1, 99, 1);
     bs->setLabel(QObject::tr("Preferred input priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
                     "matches the preferred input selected in the 'Scheduling "
@@ -2396,9 +2583,9 @@ static GlobalSpinBox *GRPrefInputRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRHDTVRecPriority()
+static GlobalSpinBoxSetting *GRHDTVRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("HDTVRecPriority", -99, 99, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("HDTVRecPriority", -99, 99, 1);
     bs->setLabel(QObject::tr("HDTV recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
                     "is marked as an HDTV broadcast in the TV listings."));
@@ -2406,9 +2593,9 @@ static GlobalSpinBox *GRHDTVRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRWSRecPriority()
+static GlobalSpinBoxSetting *GRWSRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("WSRecPriority", -99, 99, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("WSRecPriority", -99, 99, 1);
     bs->setLabel(QObject::tr("Widescreen recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
                     "is marked as widescreen in the TV listings."));
@@ -2416,9 +2603,9 @@ static GlobalSpinBox *GRWSRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRAutoRecPriority()
+static GlobalSpinBoxSetting *GRAutoRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoRecPriority", -99, 99, 1);
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("AutoRecPriority", -99, 99, 1);
     bs->setLabel(QObject::tr("Automatic priority range (+/-)"));
     bs->setHelpText(QObject::tr("Up to this number of priority points may "
                     "be added for titles that are usually watched soon after "
@@ -2428,9 +2615,9 @@ static GlobalSpinBox *GRAutoRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRSignLangRecPriority()
+static GlobalSpinBoxSetting *GRSignLangRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("SignLangRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("SignLangRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Sign language recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2439,9 +2626,9 @@ static GlobalSpinBox *GRSignLangRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GROnScrSubRecPriority()
+static GlobalSpinBoxSetting *GROnScrSubRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("OnScrSubRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("OnScrSubRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("In-vision Subtitles Recording Priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2450,9 +2637,9 @@ static GlobalSpinBox *GROnScrSubRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRCCRecPriority()
+static GlobalSpinBoxSetting *GRCCRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("CCRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("CCRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Subtitles/CC recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2462,9 +2649,9 @@ static GlobalSpinBox *GRCCRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRHardHearRecPriority()
+static GlobalSpinBoxSetting *GRHardHearRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("HardHearRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("HardHearRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Hard of hearing priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2474,9 +2661,9 @@ static GlobalSpinBox *GRHardHearRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRAudioDescRecPriority()
+static GlobalSpinBoxSetting *GRAudioDescRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AudioDescRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("AudioDescRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Audio described priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2485,9 +2672,9 @@ static GlobalSpinBox *GRAudioDescRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRSingleRecordRecPriority()
+static GlobalSpinBoxSetting *GRSingleRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("SingleRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("SingleRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Single recordings priority"));
     bs->setHelpText(QObject::tr("Single recordings will receive this "
@@ -2496,9 +2683,9 @@ static GlobalSpinBox *GRSingleRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRWeekslotRecordRecPriority()
+static GlobalSpinBoxSetting *GRWeekslotRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("WeekslotRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("WeekslotRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Weekslot recordings priority"));
     bs->setHelpText(QObject::tr("Weekslot recordings will receive this "
@@ -2507,9 +2694,9 @@ static GlobalSpinBox *GRWeekslotRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRTimeslotRecordRecPriority()
+static GlobalSpinBoxSetting *GRTimeslotRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("TimeslotRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("TimeslotRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Timeslot recordings priority"));
     bs->setHelpText(QObject::tr("Timeslot recordings will receive this "
@@ -2518,9 +2705,9 @@ static GlobalSpinBox *GRTimeslotRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRChannelRecordRecPriority()
+static GlobalSpinBoxSetting *GRChannelRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("ChannelRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("ChannelRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Channel recordings priority"));
     bs->setHelpText(QObject::tr("Channel recordings will receive this "
@@ -2529,9 +2716,9 @@ static GlobalSpinBox *GRChannelRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRAllRecordRecPriority()
+static GlobalSpinBoxSetting *GRAllRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AllRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("AllRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("All recordings priority"));
     bs->setHelpText(QObject::tr("The 'All' recording type will receive this "
@@ -2540,9 +2727,9 @@ static GlobalSpinBox *GRAllRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRFindOneRecordRecPriority()
+static GlobalSpinBoxSetting *GRFindOneRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("FindOneRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("FindOneRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Find one recordings priority"));
     bs->setHelpText(QObject::tr("Find One, Find Weekly and Find Daily "
@@ -2552,9 +2739,9 @@ static GlobalSpinBox *GRFindOneRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GROverrideRecordRecPriority()
+static GlobalSpinBoxSetting *GROverrideRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("OverrideRecordRecPriority",
+    GlobalSpinBoxSetting *bs = new GlobalSpinBoxSetting("OverrideRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Override recordings priority"));
     bs->setHelpText(QObject::tr("Override recordings will receive this "
@@ -2563,9 +2750,9 @@ static GlobalSpinBox *GROverrideRecordRecPriority()
     return bs;
 }
 
-static HostLineEdit *DefaultTVChannel()
+static HostTextEditSetting *DefaultTVChannel()
 {
-    HostLineEdit *ge = new HostLineEdit("DefaultTVChannel");
+    HostTextEditSetting *ge = new HostTextEditSetting("DefaultTVChannel");
     ge->setLabel(QObject::tr("Guide starts at channel"));
     ge->setValue("3");
     ge->setHelpText(QObject::tr("The program guide starts on this channel if "
@@ -2573,9 +2760,9 @@ static HostLineEdit *DefaultTVChannel()
     return ge;
 }
 
-static HostSpinBox *EPGRecThreshold()
+static HostSpinBoxSetting *EPGRecThreshold()
 {
-    HostSpinBox *gs = new HostSpinBox("SelChangeRecThreshold", 1, 600, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("SelChangeRecThreshold", 1, 600, 1);
     gs->setLabel(QObject::tr("Record threshold"));
     gs->setValue(16);
     gs->setHelpText(QObject::tr("Pressing SELECT on a show that is at least "
@@ -2584,9 +2771,9 @@ static HostSpinBox *EPGRecThreshold()
     return gs;
 }
 
-static HostComboBox *MythLanguage()
+static HostComboBoxSetting *MythLanguage()
 {
-    HostComboBox *gc = new HostComboBox("Language");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("Language");
     gc->setLabel(QObject::tr("Language"));
 
     QMap<QString, QString> langMap = MythTranslation::getLanguages();
@@ -2608,9 +2795,9 @@ static HostComboBox *MythLanguage()
     return gc;
 }
 
-static void ISO639_fill_selections(SelectSetting *widget, uint i)
+static void ISO639_fill_selections(MythUIComboBoxSetting *comboBox, uint i)
 {
-    widget->clearSelections();
+    comboBox->clearSelections();
     QString q = QString("ISO639Language%1").arg(i);
     QString lang = gCoreContext->GetSetting(q, "").toLower();
 
@@ -2631,13 +2818,13 @@ static void ISO639_fill_selections(SelectSetting *widget, uint i)
             desc = desc.left(idx);
 
         const QString il = iso639_key_to_str3(it.key());
-        widget->addSelection(desc, il, il == lang);
+        comboBox->addSelection(desc, il, il == lang);
     }
 }
 
-static GlobalComboBox *ISO639PreferredLanguage(uint i)
+static GlobalComboBoxSetting *ISO639PreferredLanguage(uint i)
 {
-    GlobalComboBox *gc = new GlobalComboBox(QString("ISO639Language%1").arg(i));
+    GlobalComboBoxSetting *gc = new GlobalComboBoxSetting(QString("ISO639Language%1").arg(i));
     gc->setLabel(QObject::tr("Guide language #%1").arg(i+1));
     // We should try to get language from "MythLanguage"
     // then use code 2 to code 3 map in iso639.h
@@ -2648,19 +2835,10 @@ static GlobalComboBox *ISO639PreferredLanguage(uint i)
     return gc;
 }
 
-static HostCheckBox *NetworkControlEnabled()
-{
-    HostCheckBox *gc = new HostCheckBox("NetworkControlEnabled");
-    gc->setLabel(QObject::tr("Enable Network Remote Control interface"));
-    gc->setHelpText(QObject::tr("This enables support for controlling "
-                    "mythfrontend over the network."));
-    gc->setValue(false);
-    return gc;
-}
 
-static HostSpinBox *NetworkControlPort()
+static HostSpinBoxSetting *NetworkControlPort()
 {
-    HostSpinBox *gs = new HostSpinBox("NetworkControlPort", 1025, 65535, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("NetworkControlPort", 1025, 65535, 1);
     gs->setLabel(QObject::tr("Network Remote Control port"));
     gs->setValue(6546);
     gs->setHelpText(QObject::tr("This specifies what port the network remote "
@@ -2668,9 +2846,9 @@ static HostSpinBox *NetworkControlPort()
     return gs;
 }
 
-static HostLineEdit *UDPNotifyPort()
+static HostTextEditSetting *UDPNotifyPort()
 {
-    HostLineEdit *ge = new HostLineEdit("UDPNotifyPort");
+    HostTextEditSetting *ge = new HostTextEditSetting("UDPNotifyPort");
     ge->setLabel(QObject::tr("UDP notify port"));
     ge->setValue("6948");
     ge->setHelpText(QObject::tr("MythTV will listen for "
@@ -2680,9 +2858,22 @@ static HostLineEdit *UDPNotifyPort()
     return ge;
 }
 
-static HostCheckBox *RealtimePriority()
+static HostCheckBoxSetting *NetworkControlEnabled()
 {
-    HostCheckBox *gc = new HostCheckBox("RealtimePriority");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("NetworkControlEnabled");
+    gc->setLabel(QObject::tr("Enable Network Remote Control interface"));
+    gc->setHelpText(QObject::tr("This enables support for controlling "
+                    "mythfrontend over the network."));
+    gc->setValue(false);
+
+    gc->addTargetedChild("1",NetworkControlPort());
+    gc->addTargetedChild("1",UDPNotifyPort());
+    return gc;
+}
+
+static HostCheckBoxSetting *RealtimePriority()
+{
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("RealtimePriority");
     gc->setLabel(QObject::tr("Enable realtime priority threads"));
     gc->setHelpText(QObject::tr("When running mythfrontend with root "
                     "privileges, some threads can be given enhanced priority. "
@@ -2692,21 +2883,9 @@ static HostCheckBox *RealtimePriority()
     return gc;
 }
 
-static HostCheckBox *EnableMediaMon()
-{
-    HostCheckBox *gc = new HostCheckBox("MonitorDrives");
-    gc->setLabel(QObject::tr("Monitor CD/DVD") +
-                 QObject::tr(" (and other removable devices)"));
-    gc->setHelpText(QObject::tr("This enables support for monitoring "
-                    "your CD/DVD drives for new disks and launching "
-                    "the proper plugin to handle them."));
-    gc->setValue(false);
-    return gc;
-}
-
-static HostLineEdit *IgnoreMedia()
+static HostTextEditSetting *IgnoreMedia()
 {
-    HostLineEdit *ge = new HostLineEdit("IgnoreDevices");
+    HostTextEditSetting *ge = new HostTextEditSetting("IgnoreDevices");
     ge->setLabel(QObject::tr("Ignore devices"));
     ge->setValue("");
     ge->setHelpText(QObject::tr("If there are any devices that you do not want "
@@ -2715,32 +2894,21 @@ static HostLineEdit *IgnoreMedia()
     return ge;
 }
 
-class MythMediaSettings : public TriggeredConfigurationGroup
+static HostCheckBoxSetting *EnableMediaMon()
 {
-  public:
-     MythMediaSettings() :
-         TriggeredConfigurationGroup(false, false, true, true)
-     {
-         setLabel(QObject::tr("MythMediaMonitor"));
-         setUseLabel(false);
-
-         Setting* enabled = EnableMediaMon();
-         addChild(enabled);
-         setTrigger(enabled);
-
-         ConfigurationGroup* settings = new VerticalConfigurationGroup(false);
-         settings->addChild(IgnoreMedia());
-         addTarget("1", settings);
-
-         // show nothing if fillEnabled is off
-         addTarget("0", new VerticalConfigurationGroup(true));
-     };
-};
-
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MonitorDrives");
+    gc->setLabel(QObject::tr("Media Monitor"));
+    gc->setHelpText(QObject::tr("This enables support for monitoring "
+                    "your CD/DVD drives for new disks and launching "
+                    "the proper plugin to handle them."));
+    gc->setValue(false);
+    gc->addTargetedChild("1", IgnoreMedia());
+    return gc;
+}
 
-static HostComboBox *DisplayGroupTitleSort()
+static HostComboBoxSetting *DisplayGroupTitleSort()
 {
-    HostComboBox *gc = new HostComboBox("DisplayGroupTitleSort");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("DisplayGroupTitleSort");
     gc->setLabel(QObject::tr("Sort titles"));
     gc->addSelection(QObject::tr("Alphabetically"),
             QString::number(PlaybackBox::TitleSortAlphabetical));
@@ -2751,21 +2919,9 @@ static HostComboBox *DisplayGroupTitleSort()
     return gc;
 }
 
-static HostCheckBox *PlaybackWatchList()
+static HostCheckBoxSetting *PlaybackWLStart()
 {
-    HostCheckBox *gc = new HostCheckBox("PlaybackWatchList");
-    gc->setLabel(QObject::tr("Include the 'Watch List' group"));
-    gc->setValue(true);
-    gc->setHelpText(QObject::tr("The 'Watch List' is an abbreviated list of "
-                                "recordings sorted to highlight series and "
-                                "shows that need attention in order to "
-                                "keep up to date."));
-    return gc;
-}
-
-static HostCheckBox *PlaybackWLStart()
-{
-    HostCheckBox *gc = new HostCheckBox("PlaybackWLStart");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("PlaybackWLStart");
     gc->setLabel(QObject::tr("Start from the Watch List view"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, the 'Watch List' will be the "
@@ -2774,9 +2930,9 @@ static HostCheckBox *PlaybackWLStart()
     return gc;
 }
 
-static HostCheckBox *PlaybackWLAutoExpire()
+static HostCheckBoxSetting *PlaybackWLAutoExpire()
 {
-    HostCheckBox *gc = new HostCheckBox("PlaybackWLAutoExpire");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("PlaybackWLAutoExpire");
     gc->setLabel(QObject::tr("Exclude recordings not set for Auto-Expire"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Set this if you turn off Auto-Expire only "
@@ -2786,9 +2942,9 @@ static HostCheckBox *PlaybackWLAutoExpire()
     return gc;
 }
 
-static HostSpinBox *PlaybackWLMaxAge()
+static HostSpinBoxSetting *PlaybackWLMaxAge()
 {
-    HostSpinBox *gs = new HostSpinBox("PlaybackWLMaxAge", 30, 180, 10);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("PlaybackWLMaxAge", 30, 180, 10);
     gs->setLabel(QObject::tr("Maximum days counted in the score"));
     gs->setValue(60);
     gs->setHelpText(QObject::tr("The 'Watch List' scores are based on 1 point "
@@ -2798,9 +2954,9 @@ static HostSpinBox *PlaybackWLMaxAge()
     return gs;
 }
 
-static HostSpinBox *PlaybackWLBlackOut()
+static HostSpinBoxSetting *PlaybackWLBlackOut()
 {
-    HostSpinBox *gs = new HostSpinBox("PlaybackWLBlackOut", 0, 5, 1);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("PlaybackWLBlackOut", 0, 5, 1);
     gs->setLabel(QObject::tr("Days to exclude weekly episodes after delete"));
     gs->setValue(2);
     gs->setHelpText(QObject::tr("When an episode is deleted or marked as "
@@ -2811,40 +2967,35 @@ static HostSpinBox *PlaybackWLBlackOut()
     return gs;
 }
 
-class WatchListSettings : public TriggeredConfigurationGroup
+static HostCheckBoxSetting *PlaybackWatchList()
 {
-  public:
-     WatchListSettings() :
-         TriggeredConfigurationGroup(false, false, true, true)
-     {
-
-         Setting* watchList = PlaybackWatchList();
-         addChild(watchList);
-         setTrigger(watchList);
-
-         ConfigurationGroup* settings = new VerticalConfigurationGroup(false);
-         settings->addChild(PlaybackWLStart());
-         settings->addChild(PlaybackWLAutoExpire());
-         settings->addChild(PlaybackWLMaxAge());
-         settings->addChild(PlaybackWLBlackOut());
-         addTarget("1", settings);
-
-         addTarget("0", new VerticalConfigurationGroup(true));
-    };
-};
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("PlaybackWatchList");
+    gc->setLabel(QObject::tr("Include the 'Watch List' group"));
+    gc->setValue(true);
+    gc->setHelpText(QObject::tr("The 'Watch List' is an abbreviated list of "
+                                "recordings sorted to highlight series and "
+                                "shows that need attention in order to "
+                                "keep up to date."));
+
+    gc->addTargetedChild("1", PlaybackWLStart());
+    gc->addTargetedChild("1", PlaybackWLAutoExpire());
+    gc->addTargetedChild("1", PlaybackWLMaxAge());
+    gc->addTargetedChild("1", PlaybackWLBlackOut());
+    return gc;
+}
 
-static HostCheckBox *LCDShowTime()
+static HostCheckBoxSetting *LCDShowTime()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowTime");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowTime");
     gc->setLabel(QObject::tr("Display time"));
     gc->setHelpText(QObject::tr("Display current time on idle LCD display. "));
     gc->setValue(true);
     return gc;
 }
 
-static HostCheckBox *LCDShowRecStatus()
+static HostCheckBoxSetting *LCDShowRecStatus()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowRecStatus");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowRecStatus");
     gc->setLabel(QObject::tr("Display recording status"));
     gc->setHelpText(QObject::tr("Display current recordings information on "
                                 "LCD display."));
@@ -2852,18 +3003,18 @@ static HostCheckBox *LCDShowRecStatus()
     return gc;
 }
 
-static HostCheckBox *LCDShowMenu()
+static HostCheckBoxSetting *LCDShowMenu()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowMenu");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowMenu");
     gc->setLabel(QObject::tr("Display menus"));
     gc->setHelpText(QObject::tr("Display selected menu on LCD display. "));
     gc->setValue(true);
     return gc;
 }
 
-static HostSpinBox *LCDPopupTime()
+static HostSpinBoxSetting *LCDPopupTime()
 {
-    HostSpinBox *gs = new HostSpinBox("LCDPopupTime", 1, 300, 1, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("LCDPopupTime", 1, 300, 1, true);
     gs->setLabel(QObject::tr("Menu pop-up time"));
     gs->setHelpText(QObject::tr("How many seconds the menu will "
                     "remain visible after navigation."));
@@ -2871,9 +3022,9 @@ static HostSpinBox *LCDPopupTime()
     return gs;
 }
 
-static HostCheckBox *LCDShowMusic()
+static HostCheckBoxSetting *LCDShowMusic()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowMusic");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowMusic");
     gc->setLabel(QObject::tr("Display music artist and title"));
     gc->setHelpText(QObject::tr("Display playing artist and song title in "
                     "MythMusic on LCD display."));
@@ -2881,9 +3032,9 @@ static HostCheckBox *LCDShowMusic()
     return gc;
 }
 
-static HostComboBox *LCDShowMusicItems()
+static HostComboBoxSetting *LCDShowMusicItems()
 {
-    HostComboBox *gc = new HostComboBox("LCDShowMusicItems");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("LCDShowMusicItems");
     gc->setLabel(QObject::tr("Items"));
     gc->addSelection(QObject::tr("Artist - Title"), "ArtistTitle");
     gc->addSelection(QObject::tr("Artist [Album] Title"), "ArtistAlbumTitle");
@@ -2891,18 +3042,18 @@ static HostComboBox *LCDShowMusicItems()
     return gc;
 }
 
-static HostCheckBox *LCDShowChannel()
+static HostCheckBoxSetting *LCDShowChannel()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowChannel");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowChannel");
     gc->setLabel(QObject::tr("Display channel information"));
     gc->setHelpText(QObject::tr("Display tuned channel information on LCD display."));
     gc->setValue(true);
     return gc;
 }
 
-static HostCheckBox *LCDShowVolume()
+static HostCheckBoxSetting *LCDShowVolume()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowVolume");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowVolume");
     gc->setLabel(QObject::tr("Display volume information"));
     gc->setHelpText(QObject::tr("Display volume level information "
                                 "on LCD display."));
@@ -2910,18 +3061,18 @@ static HostCheckBox *LCDShowVolume()
     return gc;
 }
 
-static HostCheckBox *LCDShowGeneric()
+static HostCheckBoxSetting *LCDShowGeneric()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowGeneric");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDShowGeneric");
     gc->setLabel(QObject::tr("Display generic information"));
     gc->setHelpText(QObject::tr("Display generic information on LCD display."));
     gc->setValue(true);
     return gc;
 }
 
-static HostCheckBox *LCDBacklightOn()
+static HostCheckBoxSetting *LCDBacklightOn()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDBacklightOn");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDBacklightOn");
     gc->setLabel(QObject::tr("Backlight always on"));
     gc->setHelpText(QObject::tr("Turn on the backlight permanently "
                                 "on the LCD display."));
@@ -2929,27 +3080,27 @@ static HostCheckBox *LCDBacklightOn()
     return gc;
 }
 
-static HostCheckBox *LCDHeartBeatOn()
+static HostCheckBoxSetting *LCDHeartBeatOn()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDHeartBeatOn");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDHeartBeatOn");
     gc->setLabel(QObject::tr("Heartbeat always on"));
     gc->setHelpText(QObject::tr("Turn on the LCD heartbeat."));
     gc->setValue(false);
     return gc;
 }
 
-static HostCheckBox *LCDBigClock()
+static HostCheckBoxSetting *LCDBigClock()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDBigClock");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDBigClock");
     gc->setLabel(QObject::tr("Display large clock"));
     gc->setHelpText(QObject::tr("On multiline displays try and display the time as large as possible."));
     gc->setValue(false);
     return gc;
 }
 
-static HostLineEdit *LCDKeyString()
+static HostTextEditSetting *LCDKeyString()
 {
-    HostLineEdit *ge = new HostLineEdit("LCDKeyString");
+    HostTextEditSetting *ge = new HostTextEditSetting("LCDKeyString");
     ge->setLabel(QObject::tr("LCD key order"));
     ge->setValue("ABCDEF");
     ge->setHelpText(QObject::tr("Enter the 6 Keypad Return Codes for your "
@@ -2960,67 +3111,34 @@ static HostLineEdit *LCDKeyString()
     return ge;
 }
 
-static HostCheckBox *LCDEnable()
+static HostCheckBoxSetting *LCDEnable()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDEnable");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("LCDEnable");
     gc->setLabel(QObject::tr("Enable LCD device"));
     gc->setHelpText(QObject::tr("Use an LCD display to view MythTV status "
                     "information."));
     gc->setValue(false);
+    gc->addTargetedChild("1",LCDShowTime());
+    gc->addTargetedChild("1",LCDShowMenu());
+    gc->addTargetedChild("1",LCDShowMusic());
+    gc->addTargetedChild("1",LCDShowMusicItems());
+    gc->addTargetedChild("1",LCDShowChannel());
+    gc->addTargetedChild("1",LCDShowRecStatus());
+    gc->addTargetedChild("1",LCDShowVolume());
+    gc->addTargetedChild("1",LCDShowGeneric());
+    gc->addTargetedChild("1",LCDBacklightOn());
+    gc->addTargetedChild("1",LCDHeartBeatOn());
+    gc->addTargetedChild("1",LCDBigClock());
+    gc->addTargetedChild("1",LCDKeyString());
+    gc->addTargetedChild("1",LCDPopupTime());
     return gc;
 }
 
-class LcdSettings : public TriggeredConfigurationGroup
-{
-  public:
-    LcdSettings() : TriggeredConfigurationGroup(false, false,  false, false,
-                                                false, false, false, false)
-    {
-         setLabel(QObject::tr("LCD device display"));
-         setUseLabel(false);
-
-         Setting* lcd_enable = LCDEnable();
-         addChild(lcd_enable);
-         setTrigger(lcd_enable);
-
-         ConfigurationGroup *settings =
-             new VerticalConfigurationGroup(false, true, false, false);
-         ConfigurationGroup *setHoriz =
-             new HorizontalConfigurationGroup(false, false, false, false);
-
-         ConfigurationGroup* setLeft  =
-             new VerticalConfigurationGroup(false, false, false, false);
-         ConfigurationGroup* setRight =
-             new VerticalConfigurationGroup(false, false, false, false);
-
-         setLeft->addChild(LCDShowTime());
-         setLeft->addChild(LCDShowMenu());
-         setLeft->addChild(LCDShowMusic());
-         setLeft->addChild(LCDShowMusicItems());
-         setLeft->addChild(LCDShowChannel());
-         setLeft->addChild(LCDShowRecStatus());
-         setRight->addChild(LCDShowVolume());
-         setRight->addChild(LCDShowGeneric());
-         setRight->addChild(LCDBacklightOn());
-         setRight->addChild(LCDHeartBeatOn());
-         setRight->addChild(LCDBigClock());
-         setRight->addChild(LCDKeyString());
-         setHoriz->addChild(setLeft);
-         setHoriz->addChild(setRight);
-         settings->addChild(setHoriz);
-         settings->addChild(LCDPopupTime());
-
-         addTarget("1", settings);
-
-         addTarget("0", new VerticalConfigurationGroup(true));
-    };
-};
-
 
 #if CONFIG_DARWIN
-static HostCheckBox *MacGammaCorrect()
+static HostCheckBoxSetting *MacGammaCorrect()
 {
-    HostCheckBox *gc = new HostCheckBox("MacGammaCorrect");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MacGammaCorrect");
     gc->setLabel(QObject::tr("Enable gamma correction for video"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, QuickTime will correct the gamma "
@@ -3029,9 +3147,9 @@ static HostCheckBox *MacGammaCorrect()
     return gc;
 }
 
-static HostCheckBox *MacScaleUp()
+static HostCheckBoxSetting *MacScaleUp()
 {
-    HostCheckBox *gc = new HostCheckBox("MacScaleUp");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MacScaleUp");
     gc->setLabel(QObject::tr("Scale video as necessary"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, video will be scaled to fit your "
@@ -3040,9 +3158,9 @@ static HostCheckBox *MacScaleUp()
     return gc;
 }
 
-static HostSpinBox *MacFullSkip()
+static HostSpinBoxSetting *MacFullSkip()
 {
-    HostSpinBox *gs = new HostSpinBox("MacFullSkip", 0, 30, 1, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacFullSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip in fullscreen mode"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Video displayed in fullscreen or non-windowed "
@@ -3053,22 +3171,11 @@ static HostSpinBox *MacFullSkip()
     return gs;
 }
 
-static HostCheckBox *MacMainEnabled()
-{
-    HostCheckBox *gc = new HostCheckBox("MacMainEnabled");
-    gc->setLabel(QObject::tr("Video in main window"));
-    gc->setValue(true);
-    gc->setHelpText(QObject::tr("If enabled, video will be displayed in the "
-                    "main GUI window. Disable this when you only want video "
-                    "on the desktop or in a floating window. Only valid when "
-                    "\"Use GUI size for TV playback\" and \"Run the "
-                    "frontend in a window\" are checked."));
-    return gc;
-}
 
-static HostSpinBox *MacMainSkip()
+
+static HostSpinBoxSetting *MacMainSkip()
 {
-    HostSpinBox *gs = new HostSpinBox("MacMainSkip", 0, 30, 1, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacMainSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Video in the main window will skip this many "
@@ -3077,9 +3184,9 @@ static HostSpinBox *MacMainSkip()
     return gs;
 }
 
-static HostSpinBox *MacMainOpacity()
+static HostSpinBoxSetting *MacMainOpacity()
 {
-    HostSpinBox *gs = new HostSpinBox("MacMainOpacity", 0, 100, 5, false);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacMainOpacity", 0, 100, 5, false);
     gs->setLabel(QObject::tr("Opacity"));
     gs->setValue(100);
     gs->setHelpText(QObject::tr("The opacity of the main window. Set to "
@@ -3088,42 +3195,25 @@ static HostSpinBox *MacMainOpacity()
     return gs;
 }
 
-class MacMainSettings : public TriggeredConfigurationGroup
+static HostCheckBoxSetting *MacMainEnabled()
 {
-  public:
-    MacMainSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video in main window"));
-        setUseLabel(false);
-        Setting *gc = MacMainEnabled();
-        addChild(gc);
-        setTrigger(gc);
-
-        VerticalConfigurationGroup *opts =
-            new VerticalConfigurationGroup(false, false);
-        opts->addChild(MacMainSkip());
-        opts->addChild(MacMainOpacity());
-
-        addTarget("1", opts);
-        addTarget("0", new VerticalConfigurationGroup(false, false));
-    }
-};
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MacMainEnabled");
+    gc->setLabel(QObject::tr("Video in main window"));
+    gc->setValue(true);
+    gc->setHelpText(QObject::tr("If enabled, video will be displayed in the "
+                    "main GUI window. Disable this when you only want video "
+                    "on the desktop or in a floating window. Only valid when "
+                    "\"Use GUI size for TV playback\" and \"Run the "
+                    "frontend in a window\" are checked."));
 
-static HostCheckBox *MacFloatEnabled()
-{
-    HostCheckBox *gc = new HostCheckBox("MacFloatEnabled");
-    gc->setLabel(QObject::tr("Video in floating window"));
-    gc->setValue(false);
-    gc->setHelpText(QObject::tr("If enabled, video will be displayed in a "
-                    "floating window. Only valid when \"Use GUI size for TV "
-                    "playback\" and \"Run the frontend in a window\" are "
-                    "checked."));
+    gc->addTargetedChild("1", MacMainSkip());
+    gc->addTargetedChild("1", MacMainOpacity());
     return gc;
 }
 
-static HostSpinBox *MacFloatSkip()
+static HostSpinBoxSetting *MacFloatSkip()
 {
-    HostSpinBox *gs = new HostSpinBox("MacFloatSkip", 0, 30, 1, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacFloatSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Video in the floating window will skip "
@@ -3132,9 +3222,9 @@ static HostSpinBox *MacFloatSkip()
     return gs;
 }
 
-static HostSpinBox *MacFloatOpacity()
+static HostSpinBoxSetting *MacFloatOpacity()
 {
-    HostSpinBox *gs = new HostSpinBox("MacFloatOpacity", 0, 100, 5, false);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacFloatOpacity", 0, 100, 5, false);
     gs->setLabel(QObject::tr("Opacity"));
     gs->setValue(100);
     gs->setHelpText(QObject::tr("The opacity of the floating window. Set to "
@@ -3143,316 +3233,520 @@ static HostSpinBox *MacFloatOpacity()
     return gs;
 }
 
-class MacFloatSettings : public TriggeredConfigurationGroup
+static HostCheckBoxSetting *MacFloatEnabled()
 {
-  public:
-    MacFloatSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video in floating window"));
-        setUseLabel(false);
-        Setting *gc = MacFloatEnabled();
-        addChild(gc);
-        setTrigger(gc);
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MacFloatEnabled");
+    gc->setLabel(QObject::tr("Video in floating window"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr("If enabled, video will be displayed in a "
+                    "floating window. Only valid when \"Use GUI size for TV "
+                    "playback\" and \"Run the frontend in a window\" are "
+                    "checked."));
 
-        VerticalConfigurationGroup *opts =
-            new VerticalConfigurationGroup(false, false);
-        opts->addChild(MacFloatSkip());
-        opts->addChild(MacFloatOpacity());
+    gc->addTargetedChild("1", MacFloatSkip());
+    gc->addTargetedChild("1", MacFloatOpacity());
+    return gc;
+}
 
-        addTarget("1", opts);
-        addTarget("0", new VerticalConfigurationGroup(false, false));
-    }
-};
+static HostSpinBoxSetting *MacDockSkip()
+{
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacDockSkip", 0, 30, 1, true);
+    gs->setLabel(QObject::tr("Frames to skip"));
+    gs->setValue(3);
+    gs->setHelpText(QObject::tr("Video in the dock icon will skip this many "
+                    "frames for each frame drawn. Set to 0 to show "
+                    "every frame."));
+    return gs;
+}
 
-static HostCheckBox *MacDockEnabled()
+static HostCheckBoxSetting *MacDockEnabled()
 {
-    HostCheckBox *gc = new HostCheckBox("MacDockEnabled");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MacDockEnabled");
     gc->setLabel(QObject::tr("Video in the dock"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, video will be displayed in the "
                     "application's dock icon. Only valid when \"Use GUI size "
                     "for TV playback\" and \"Run the frontend in a window\" "
                     "are checked."));
+    gc->addTargetedChild("1", MacDockSkip());
+    
     return gc;
 }
 
-static HostSpinBox *MacDockSkip()
+static HostSpinBoxSetting *MacDesktopSkip()
 {
-    HostSpinBox *gs = new HostSpinBox("MacDockSkip", 0, 30, 1, true);
+    HostSpinBoxSetting *gs = new HostSpinBoxSetting("MacDesktopSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip"));
-    gs->setValue(3);
-    gs->setHelpText(QObject::tr("Video in the dock icon will skip this many "
+    gs->setValue(0);
+    gs->setHelpText(QObject::tr("Video on the desktop will skip this many "
                     "frames for each frame drawn. Set to 0 to show "
                     "every frame."));
     return gs;
 }
 
-class MacDockSettings : public TriggeredConfigurationGroup
-{
-  public:
-    MacDockSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video in the dock"));
-        setUseLabel(false);
-        Setting *gc = MacDockEnabled();
-        addChild(gc);
-        setTrigger(gc);
-
-        Setting *skip = MacDockSkip();
-        addTarget("1", skip);
-        addTarget("0", new HorizontalConfigurationGroup(false, false));
-    }
-};
-
-static HostCheckBox *MacDesktopEnabled()
+static HostCheckBoxSetting *MacDesktopEnabled()
 {
-    HostCheckBox *gc = new HostCheckBox("MacDesktopEnabled");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("MacDesktopEnabled");
     gc->setLabel(QObject::tr("Video on the desktop"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, video will be displayed on the "
                     "desktop, behind the Finder icons. Only valid when \"Use "
                     "GUI size for TV playback\" and \"Run the frontend in a "
                     "window\" are checked."));
+
+    gc->addTarget("1", MacDesktopSkip());
+
     return gc;
 }
 
-static HostSpinBox *MacDesktopSkip()
+#endif
+
+static HostCheckBoxSetting *WatchTVGuide()
 {
-    HostSpinBox *gs = new HostSpinBox("MacDesktopSkip", 0, 30, 1, true);
-    gs->setLabel(QObject::tr("Frames to skip"));
-    gs->setValue(0);
-    gs->setHelpText(QObject::tr("Video on the desktop will skip this many "
-                    "frames for each frame drawn. Set to 0 to show "
-                    "every frame."));
-    return gs;
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("WatchTVGuide");
+    gc->setLabel(QObject::tr("Show the program guide when starting Live TV"));
+    gc->setHelpText(QObject::tr("This starts the program guide immediately "
+             "upon starting to watch Live TV."));
+    gc->setValue(false);
+    return gc;
 }
 
-class MacDesktopSettings : public TriggeredConfigurationGroup
+
+/* This code is a duplication the class DatabaseSettings. As it it also use bymythbackend I rewrote here for the time being */
+
+class DatabaseGroupSetting : public GroupSetting
 {
   public:
-    MacDesktopSettings() : TriggeredConfigurationGroup(false)
+    DatabaseGroupSetting(const QString &DBhostOverride = QString::null):GroupSetting()
     {
-        setLabel(QObject::tr("Video on the desktop"));
-        setUseLabel(false);
-        Setting *gc = MacDesktopEnabled();
-        addChild(gc);
-        setTrigger(gc);
-
-        Setting *skip = MacDesktopSkip();
-        addTarget("1", skip);
-        addTarget("0", new HorizontalConfigurationGroup(false, false));
+        m_DBhostOverride = DBhostOverride;
+
+        setLabel(QObject::tr("Database Configuration"));
+
+        MSqlQuery query(MSqlQuery::InitCon());
+        if (query.isConnected())
+            setHelpText(QObject::tr("All database settings take effect when "
+                                       "you restart this program."));
+        else
+            setHelpText(QObject::tr("MythTV could not connect to the database. "
+                                       "Please verify your database settings "
+                                       "below."));
+
+        dbHostName = new TransTextEditSetting();
+        dbHostName->setLabel(QObject::tr("Hostname"));
+        dbHostName->setHelpText(QObject::tr("The host name or IP address of "
+                                        "the machine hosting the database. "
+                                        "This information is required."));
+        addChild(dbHostName);
+
+        dbHostPing = new TransMythUICheckBoxSetting();
+        dbHostPing->setLabel(QObject::tr("Ping test server?"));
+        dbHostPing->setHelpText(QObject::tr("Test basic host connectivity using "
+                                            "the ping command. Turn off if your "
+                                            "host or network don't support ping "
+                                            "(ICMP ECHO) packets"));
+        addChild(dbHostPing);
+
+        dbPort = new TransTextEditSetting();
+        dbPort->setLabel(QObject::tr("Port"));
+        dbPort->setHelpText(QObject::tr("The port number the database is running "
+                                        "on.  Leave blank if using the default "
+                                        "port (3306)."));
+        addChild(dbPort);
+
+        dbName = new TransTextEditSetting();
+        dbName->setLabel(QObject::tr("Database name"));
+        dbName->setHelpText(QObject::tr("The name of the database. "
+                                        "This information is required."));
+        addChild(dbName);
+
+        dbUserName = new TransTextEditSetting();
+        dbUserName->setLabel(QObject::tr("User"));
+        dbUserName->setHelpText(QObject::tr("The user name to use while "
+                                            "connecting to the database. "
+                                            "This information is required."));
+        addChild(dbUserName);
+
+        dbPassword = new TransTextEditSetting();
+        dbPassword->setLabel(QObject::tr("Password"));
+        dbPassword->setHelpText(QObject::tr("The password to use while "
+                                            "connecting to the database. "
+                                            "This information is required."));
+        addChild(dbPassword);
+
+        localEnabled = new TransMythUICheckBoxSetting();
+        localEnabled->setLabel(QObject::tr("Use custom identifier for frontend "
+                                           "preferences"));
+        localEnabled->setHelpText(QObject::tr("If this frontend's host name "
+                                              "changes often, check this box "
+                                              "and provide a network-unique "
+                                              "name to identify it. "
+                                              "If unchecked, the frontend "
+                                              "machine's local host name will "
+                                              "be used to save preferences in "
+                                              "the database."));
+        addChild(localEnabled);
+
+
+        localHostName = new TransTextEditSetting();
+        localHostName->setLabel(QObject::tr("Custom identifier"));
+        localHostName->setHelpText(QObject::tr("An identifier to use while "
+                                               "saving the settings for this "
+                                               "frontend."));
+        localEnabled->addTargetedChild("1", localHostName);
+
+
+        wolEnabled = new TransMythUICheckBoxSetting();
+        wolEnabled->setLabel(QObject::tr("Enable database server wakeup"));
+        wolEnabled->setHelpText(QObject::tr("If enabled, the frontend will use "
+                                            "database wakeup parameters to "
+                                            "reconnect to the database server."));
+        addChild(wolEnabled);
+
+        wolReconnect = new TransMythUISpinBoxSetting(0, 60, 1, true);
+        wolReconnect->setLabel(QObject::tr("Reconnect time"));
+        wolReconnect->setHelpText(QObject::tr("The time in seconds to wait for "
+                                          "the server to wake up."));
+        wolEnabled->addTargetedChild("1",wolReconnect);
+
+
+        wolRetry = new TransMythUISpinBoxSetting(1, 10, 1, true);
+        wolRetry->setLabel(QObject::tr("Retry attempts"));
+        wolRetry->setHelpText(QObject::tr("The number of retries to wake the "
+                                      "server before the frontend gives "
+                                      "up."));
+        wolEnabled->addTargetedChild("1",wolRetry);
+
+        wolCommand = new TransTextEditSetting();
+        wolCommand->setLabel(QObject::tr("Wake command"));
+        wolCommand->setHelpText(QObject::tr("The command executed on this "
+                                        "frontend to wake up the database "
+                                        "server (eg. sudo /etc/init.d/mysql "
+                                        "restart)."));
+        wolEnabled->addTargetedChild("1",wolCommand);
     }
+
+    void Load(void)
+    {
+
+        DatabaseParams params = gContext->GetDatabaseParams();
+
+        if (params.dbHostName.isEmpty() ||
+            params.dbUserName.isEmpty() ||
+            params.dbPassword.isEmpty() ||
+            params.dbName.isEmpty())
+            setHelpText(getHelpText() + "\n" +
+                           QObject::tr("Required fields are"
+                                       " marked with an asterisk (*)."));
+
+        if (params.dbHostName.isEmpty())
+        {
+            dbHostName->setLabel("* " + dbHostName->getLabel());
+            dbHostName->setValue(m_DBhostOverride);
+        }
+        else
+            dbHostName->setValue(params.dbHostName);
+
+        dbHostPing->setValue(params.dbHostPing);
+
+        if (params.dbPort)
+            dbPort->setValue(QString::number(params.dbPort));
+
+        dbUserName->setValue(params.dbUserName);
+        if (params.dbUserName.isEmpty())
+            dbUserName->setLabel("* " + dbUserName->getLabel());
+        dbPassword->setValue(params.dbPassword);
+        if (params.dbPassword.isEmpty())
+            dbPassword->setLabel("* " + dbPassword->getLabel());
+        dbName->setValue(params.dbName);
+        if (params.dbName.isEmpty())
+            dbName->setLabel("* " + dbName->getLabel());
+
+        localEnabled->setValue(params.localEnabled);
+        localHostName->setValue(params.localHostName);
+
+        wolEnabled->setValue(params.wolEnabled);
+        wolReconnect->setValue(params.wolReconnect);
+        wolRetry->setValue(params.wolRetry);
+        wolCommand->setValue(params.wolCommand);
+        //TODO set all the children's m_haveChanged to false 
+    };
+    void Save(void)
+    {
+        DatabaseParams params = gContext->GetDatabaseParams();
+
+        params.dbHostName    = dbHostName->getValue();
+        params.dbHostPing    = dbHostPing->boolValue();
+        params.dbPort        = dbPort->getValue().toInt();
+        params.dbUserName    = dbUserName->getValue();
+        params.dbPassword    = dbPassword->getValue();
+        params.dbName        = dbName->getValue();
+        params.dbType        = "QMYSQL";
+
+        params.localEnabled  = localEnabled->boolValue();
+        params.localHostName = localHostName->getValue();
+
+        params.wolEnabled    = wolEnabled->boolValue();
+        params.wolReconnect  = wolReconnect->intValue();
+        params.wolRetry      = wolRetry->intValue();
+        params.wolCommand    = wolCommand->getValue();
+
+        gContext->SaveDatabaseParams(params);
+        //TODO set all the children's m_haveChanged to false
+    };
+
+  protected:
+    TransTextEditSetting       *dbHostName;
+    TransMythUICheckBoxSetting *dbHostPing;
+    TransTextEditSetting       *dbPort;
+    TransTextEditSetting       *dbName;
+    TransTextEditSetting       *dbUserName;
+    TransTextEditSetting       *dbPassword;
+    TransMythUICheckBoxSetting *localEnabled;
+    TransTextEditSetting       *localHostName;
+    TransMythUICheckBoxSetting *wolEnabled;
+    TransMythUISpinBoxSetting  *wolReconnect;
+    TransMythUISpinBoxSetting  *wolRetry;
+    TransTextEditSetting       *wolCommand;
+
+    QString              m_DBhostOverride;
 };
-#endif
 
-static HostCheckBox *WatchTVGuide()
+/* end of duplicated code form DatabaseSettings */
+
+
+class ShutDownRebootSetting : public GroupValueSetting
 {
-    HostCheckBox *gc = new HostCheckBox("WatchTVGuide");
-    gc->setLabel(QObject::tr("Show the program guide when starting Live TV"));
-    gc->setHelpText(QObject::tr("This starts the program guide immediately "
-             "upon starting to watch Live TV."));
-    gc->setValue(false);
-    return gc;
+  public:
+    ShutDownRebootSetting();
+  private slots:
+    void childChanged(StandardSetting *);
+  private:
+    StandardSetting * m_overrideExitMenu;
+    StandardSetting * m_haltCommand;
+    StandardSetting * m_rebootCommand;
+    
+};
+
+ShutDownRebootSetting::ShutDownRebootSetting()
+    :GroupValueSetting()
+{
+    setLabel(QObject::tr("Shutdown/Reboot Settings"));
+    addChild(m_overrideExitMenu = OverrideExitMenu());
+    addChild(m_haltCommand      = HaltCommand());
+    addChild(m_rebootCommand    = RebootCommand());
+    connect(m_overrideExitMenu,SIGNAL(valueChanged(StandardSetting *)),
+            this,SLOT(childChanged(StandardSetting *)));
 }
 
+void ShutDownRebootSetting::childChanged(StandardSetting *)
+{
+    switch (m_overrideExitMenu->getValue().toInt())
+    {
+        case 2:
+        case 4:
+            m_haltCommand->setEnabled(true);
+            m_rebootCommand->setEnabled(false);
+            break;
+        case 3:
+        case 6:
+            m_haltCommand->setEnabled(true);
+            m_rebootCommand->setEnabled(true);
+            break;
+        case 5:
+            m_haltCommand->setEnabled(false);
+            m_rebootCommand->setEnabled(true);
+            break;
+        case 0:
+        case 1:
+        default:
+            m_haltCommand->setEnabled(false);
+            m_rebootCommand->setEnabled(false);
+            break;
+    }
+}
+
+
 MainGeneralSettings::MainGeneralSettings()
 {
-    DatabaseSettings::addDatabaseSettings(this);
+    //DatabaseSettings::addDatabaseSettings(this);
+    setLabel(QObject::tr("Main Settings"));
+
+    addChild(new DatabaseGroupSetting());
 
-    VerticalConfigurationGroup *pin =
-        new VerticalConfigurationGroup(false, true, false, false);
+    GroupSetting *pin = new GroupSetting();
     pin->setLabel(QObject::tr("Settings Access"));
     pin->addChild(SetupPinCodeRequired());
     pin->addChild(SetupPinCode());
     addChild(pin);
 
-    VerticalConfigurationGroup *general =
-        new VerticalConfigurationGroup(false, true, false, false);
+    GroupSetting *general = new GroupSetting();
     general->setLabel(QObject::tr("General"));
     general->addChild(UseVirtualKeyboard());
     general->addChild(ScreenShotPath());
     addChild(general);
 
-    VerticalConfigurationGroup *media =
-        new VerticalConfigurationGroup(false, true, false, false);
-    media->setLabel(QObject::tr("Media Monitor"));
-    MythMediaSettings *mediaMon = new MythMediaSettings();
-    media->addChild(mediaMon);
-    addChild(media);
-
-    VerticalConfigurationGroup *shutdownSettings =
-        new VerticalConfigurationGroup(true, true, false, false);
-    shutdownSettings->setLabel(QObject::tr("Shutdown/Reboot Settings"));
-    shutdownSettings->addChild(OverrideExitMenu());
-    shutdownSettings->addChild(HaltCommand());
-    shutdownSettings->addChild(RebootCommand());
-    addChild(shutdownSettings);
-
-    VerticalConfigurationGroup *remotecontrol =
-        new VerticalConfigurationGroup(false, true, false, false);
+    addChild(EnableMediaMon());
+
+    addChild(new ShutDownRebootSetting());
+
+    GroupSetting *remotecontrol = new GroupSetting();
     remotecontrol->setLabel(QObject::tr("Remote Control"));
     remotecontrol->addChild(LircDaemonDevice());
     remotecontrol->addChild(NetworkControlEnabled());
-    remotecontrol->addChild(NetworkControlPort());
-    remotecontrol->addChild(UDPNotifyPort());
     addChild(remotecontrol);
 }
 
+void MainGeneralSettings::applyChange()
+{
+    QStringList strlist( QString("REFRESH_BACKEND") );
+    gCoreContext->SendReceiveStringList(strlist);
+}
+
+
+class PlayBackScaling : public GroupValueSetting
+{
+    public:
+        PlayBackScaling();
+    
+    private slots:
+        virtual void childChanged(StandardSetting *);
+    private:
+        StandardSetting * m_VertScan;
+        StandardSetting * m_HorizScan;
+        StandardSetting * m_XScan;
+        StandardSetting * m_YScan;
+};
+
+PlayBackScaling::PlayBackScaling()
+    :GroupValueSetting()
+{
+    setLabel(QObject::tr("Scaling"));
+    addChild(m_VertScan = VertScanPercentage());
+    addChild(m_YScan = YScanDisplacement());
+    addChild(m_HorizScan = HorizScanPercentage());
+    addChild(m_XScan = XScanDisplacement());
+}
+
+
+void PlayBackScaling::childChanged(StandardSetting *)
+{
+    if (   m_VertScan->getValue()=="0"
+        && m_HorizScan->getValue()=="0"
+        && m_YScan->getValue()=="0"
+        && m_XScan->getValue()=="0")
+        setValue(QObject::tr("No scaling"));
+    else
+        setValue(QString("%1%x%2%+%3%+%4%")
+                .arg(m_HorizScan->getValue())
+                .arg(m_VertScan->getValue())
+                .arg(m_XScan->getValue())
+                .arg(m_YScan->getValue()));
+}
+
+
+
 PlaybackSettings::PlaybackSettings()
 {
-    uint i = 0, total = 8;
-#if CONFIG_DARWIN
-    total += 2;
-#endif // USING_DARWIN
+    setLabel(QObject::tr("Playback settings"));
 
+    GroupSetting* general = new GroupSetting();
+    general->setLabel(QObject::tr("General Playback"));
+    general->addChild(RealtimePriority());
+    general->addChild(DecodeExtraAudio());
+    general->addChild(JumpToProgramOSD());
+    general->addChild(ClearSavedPosition());
+    general->addChild(AltClearSavedPosition());
+    general->addChild(AutomaticSetWatched());
+    general->addChild(ContinueEmbeddedTVPlay());
+    general->addChild(LiveTVIdleTimeout());
 
-    VerticalConfigurationGroup* general1 =
-        new VerticalConfigurationGroup(false);
-    general1->setLabel(QObject::tr("General Playback") +
-                      QString(" (%1/%2)").arg(++i).arg(total));
+    general->addChild(new PlayBackScaling());
 
-    HorizontalConfigurationGroup *columns =
-        new HorizontalConfigurationGroup(false, false, true, true);
+    general->addChild(AspectOverride());
+    general->addChild(AdjustFill());
 
-    VerticalConfigurationGroup *column1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    column1->addChild(RealtimePriority());
-    column1->addChild(DecodeExtraAudio());
-    column1->addChild(JumpToProgramOSD());
-    columns->addChild(column1);
+    general->addChild(LetterboxingColour());
+    general->addChild(PIPLocationComboBox());
+    general->addChild(PlaybackExitPrompt());
+    general->addChild(EndOfRecordingExitPrompt());
+    addChild(general);
 
-    VerticalConfigurationGroup *column2 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    column2->addChild(ClearSavedPosition());
-    column2->addChild(AltClearSavedPosition());
-    column2->addChild(AutomaticSetWatched());
-    column2->addChild(ContinueEmbeddedTVPlay());
-    columns->addChild(column2);
-
-    general1->addChild(columns);
-    general1->addChild(LiveTVIdleTimeout());
-    addChild(general1);
-
-    VerticalConfigurationGroup* general2 =
-        new VerticalConfigurationGroup(false);
-    general2->setLabel(QObject::tr("General Playback") +
-                      QString(" (%1/%2)").arg(++i).arg(total));
-
-    HorizontalConfigurationGroup* oscan =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    VerticalConfigurationGroup *ocol1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    VerticalConfigurationGroup *ocol2 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    ocol1->addChild(VertScanPercentage());
-    ocol1->addChild(YScanDisplacement());
-    ocol2->addChild(HorizScanPercentage());
-    ocol2->addChild(XScanDisplacement());
-    oscan->addChild(ocol1);
-    oscan->addChild(ocol2);
-
-    HorizontalConfigurationGroup* aspect_fill =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    aspect_fill->addChild(AspectOverride());
-    aspect_fill->addChild(AdjustFill());
-
-    general2->addChild(oscan);
-    general2->addChild(aspect_fill);
-    general2->addChild(LetterboxingColour());
-    general2->addChild(PIPLocationComboBox());
-    general2->addChild(PlaybackExitPrompt());
-    general2->addChild(EndOfRecordingExitPrompt());
-    addChild(general2);
+    addChild(CurrentPlaybackProfile());
 
-    QString tmp = QString(" (%1/%2)").arg(++i).arg(total);
-    addChild(new PlaybackProfileConfigs(tmp));
 
-    VerticalConfigurationGroup* pbox = new VerticalConfigurationGroup(false);
-    pbox->setLabel(QObject::tr("View Recordings") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
+    GroupSetting* pbox = new GroupSetting();
+    pbox->setLabel(QObject::tr("View Recordings"));
     pbox->addChild(PlayBoxOrdering());
     pbox->addChild(PlayBoxEpisodeSort());
     // Disabled until we re-enable live previews
     // pbox->addChild(PlaybackPreview());
     // pbox->addChild(HWAccelPlaybackPreview());
     pbox->addChild(PBBStartInTitle());
-    addChild(pbox);
 
-    VerticalConfigurationGroup* pbox2 = new VerticalConfigurationGroup(false);
-    pbox2->setLabel(QObject::tr("Recording Groups") +
-                    QString(" (%1/%2)").arg(++i).arg(total));
+
+    GroupSetting* pbox2 = new GroupSetting();
+    pbox2->setLabel(QObject::tr("Recording Groups"));
     pbox2->addChild(DisplayRecGroup());
     pbox2->addChild(QueryInitialFilter());
     pbox2->addChild(RememberRecGroup());
     pbox2->addChild(UseGroupNameAsAllPrograms());
-    addChild(pbox2);
-
-    VerticalConfigurationGroup* pbox3 = new VerticalConfigurationGroup(false);
-    pbox3->setLabel(QObject::tr("View Recordings") +
-                    QString(" (%1/%2)").arg(++i).arg(total));
-    pbox3->addChild(DisplayGroupTitleSort());
-    pbox3->addChild(new WatchListSettings());
-    addChild(pbox3);
-
-    VerticalConfigurationGroup* seek = new VerticalConfigurationGroup(false);
-    seek->setLabel(QObject::tr("Seeking") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
+    pbox->addChild(pbox2);
+
+    pbox->addChild(DisplayGroupTitleSort());
+    pbox->addChild(PlaybackWatchList());
+    addChild(pbox);
+
+    GroupSetting* seek = new GroupSetting();
+    seek->setLabel(QObject::tr("Seeking"));
     seek->addChild(SmartForward());
     seek->addChild(FFRewReposTime());
     seek->addChild(FFRewReverse());
     seek->addChild(ExactSeeking());
     addChild(seek);
 
-    VerticalConfigurationGroup* comms = new VerticalConfigurationGroup(false);
-    comms->setLabel(QObject::tr("Commercial Skip") +
-                    QString(" (%1/%2)").arg(++i).arg(total));
+
+
+    GroupSetting* comms = new GroupSetting();
+    comms->setLabel(QObject::tr("Commercial Skip"));
     comms->addChild(AutoCommercialSkip());
     comms->addChild(CommRewindAmount());
     comms->addChild(CommNotifyAmount());
+    //TODO mixing Host setting with Global setting, not very clear for the user
     comms->addChild(MaximumCommercialSkip());
     comms->addChild(MergeShortCommBreaks());
     addChild(comms);
 
 #if CONFIG_DARWIN
-    VerticalConfigurationGroup* mac1 = new VerticalConfigurationGroup(false);
-    mac1->setLabel(QObject::tr("Mac OS X Video Settings") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
-    mac1->addChild(MacGammaCorrect());
-    mac1->addChild(MacScaleUp());
-    mac1->addChild(MacFullSkip());
-    addChild(mac1);
-
-    VerticalConfigurationGroup* mac2 = new VerticalConfigurationGroup(false);
-    mac2->setLabel(QObject::tr("Mac OS X Video Settings") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
-    mac2->addChild(new MacMainSettings());
-    mac2->addChild(new MacFloatSettings());
-
-    HorizontalConfigurationGroup *row =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    row->addChild(new MacDockSettings());
-    row->addChild(new MacDesktopSettings());
-    mac2->addChild(row);
-
-    addChild(mac2);
+    GroupSetting* ma1 = new GroupSetting(false);
+    mac->setLabel(QObject::tr("Mac OS X Video Settings"));
+    mac->addChild(MacGammaCorrect());
+    mac->addChild(MacScaleUp());
+    mac->addChild(MacFullSkip());
+
+    mac->addChild(MacMainEnabled());
+    mac->addChild(MacFloatEnabled());
+    mac->addChild(MacDockEnabled());
+    mac->addChild(MacDesktopEnabled());
+    mac->addChild(row);
+
+    addChild(mac);
 #endif
 }
 
 OSDSettings::OSDSettings()
 {
-    VerticalConfigurationGroup* osd = new VerticalConfigurationGroup(false);
-    osd->setLabel(QObject::tr("On-screen Display"));
+    setLabel(QObject::tr("On-screen Display"));
 
-    osd->addChild(EnableMHEG());
-    osd->addChild(PersistentBrowseMode());
-    osd->addChild(BrowseAllTuners());
-    osd->addChild(CCBackground());
-    osd->addChild(DefaultCCMode());
-    osd->addChild(PreferCC708());
-    osd->addChild(SubtitleFont());
-    osd->addChild(OSDCC708TextZoomPercentage());
-    osd->addChild(SubtitleCodec());
-    addChild(osd);
+    addChild(EnableMHEG());
+    addChild(PersistentBrowseMode());
+    addChild(BrowseAllTuners());
+    addChild(CCBackground());
+    addChild(DefaultCCMode());
+    addChild(PreferCC708());
+    addChild(SubtitleFont());
+    addChild(OSDCC708TextZoomPercentage());
+    addChild(SubtitleCodec());
 
     //VerticalConfigurationGroup *cc = new VerticalConfigurationGroup(false);
     //cc->setLabel(QObject::tr("Closed Captions"));
@@ -3467,99 +3761,76 @@ OSDSettings::OSDSettings()
 
 GeneralSettings::GeneralSettings()
 {
-    VerticalConfigurationGroup* general = new VerticalConfigurationGroup(false);
-    general->setLabel(QObject::tr("General (Basic)"));
+    setLabel(QObject::tr("General"));
+    GroupSetting* general = new GroupSetting();
+    general->setLabel(QObject::tr("Basic"));
     general->addChild(ChannelOrdering());
     general->addChild(ChannelFormat());
     general->addChild(LongChannelFormat());
+    //LiveTVPriority (backend setting) should probably not be mixed with frontend settings
     general->addChild(LiveTVPriority());
     addChild(general);
 
-    VerticalConfigurationGroup* autoexp = new VerticalConfigurationGroup(false);
-    autoexp->setLabel(QObject::tr("General (Auto-Expire)"));
+    GroupSetting* autoexp = new GroupSetting();
+    autoexp->setLabel(QObject::tr("Auto-Expire"));
     autoexp->addChild(AutoExpireMethod());
-
-    VerticalConfigurationGroup *expgrp0 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    expgrp0->addChild(AutoExpireDefault());
-    expgrp0->addChild(RerecordWatched());
-    expgrp0->addChild(AutoExpireWatchedPriority());
-
-    VerticalConfigurationGroup *expgrp1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    expgrp1->addChild(AutoExpireLiveTVMaxAge());
-    expgrp1->addChild(AutoExpireDayPriority());
-    expgrp1->addChild(AutoExpireExtraSpace());
-
-    HorizontalConfigurationGroup *expgrp =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    expgrp->addChild(expgrp0);
-    expgrp->addChild(expgrp1);
-
-    autoexp->addChild(expgrp);
-    autoexp->addChild(new DeletedExpireOptions());
-
+    autoexp->addChild(AutoExpireDefault());
+    autoexp->addChild(RerecordWatched());
+    autoexp->addChild(AutoExpireWatchedPriority());
+    autoexp->addChild(AutoExpireLiveTVMaxAge());
+    autoexp->addChild(AutoExpireDayPriority());
+    autoexp->addChild(AutoExpireExtraSpace());
+    autoexp->addChild(AutoExpireInsteadOfDelete());
     addChild(autoexp);
 
-    VerticalConfigurationGroup* jobs = new VerticalConfigurationGroup(false);
-    jobs->setLabel(QObject::tr("General (Jobs)"));
+    GroupSetting* jobs = new GroupSetting();
+    jobs->setLabel(QObject::tr("Jobs"));
     jobs->addChild(CommercialSkipMethod());
     jobs->addChild(CommFlagFast());
     jobs->addChild(AggressiveCommDetect());
     jobs->addChild(DefaultTranscoder());
     jobs->addChild(DeferAutoTranscodeDays());
 
-    VerticalConfigurationGroup* autogrp0 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    autogrp0->addChild(AutoMetadataLookup());
-    autogrp0->addChild(AutoCommercialFlag());
-    autogrp0->addChild(AutoTranscode());
-
-    VerticalConfigurationGroup* autogrp1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    autogrp0->addChild(AutoRunUserJob(1));
-    autogrp1->addChild(AutoRunUserJob(2));
-    autogrp1->addChild(AutoRunUserJob(3));
-    autogrp1->addChild(AutoRunUserJob(4));
-
-    HorizontalConfigurationGroup *autogrp =
-        new HorizontalConfigurationGroup(true, true, false, true);
+    GroupSetting *autogrp = new GroupSetting();
     autogrp->setLabel(
         QObject::tr("Default Job Queue Settings for New Scheduled Recordings"));
-    autogrp->addChild(autogrp0);
-    autogrp->addChild(autogrp1);
+    autogrp->addChild(AutoMetadataLookup());
+    autogrp->addChild(AutoCommercialFlag());
+    autogrp->addChild(AutoTranscode());
+    autogrp->addChild(AutoRunUserJob(1));
+    autogrp->addChild(AutoRunUserJob(2));
+    autogrp->addChild(AutoRunUserJob(3));
+    autogrp->addChild(AutoRunUserJob(4));
+
     jobs->addChild(autogrp);
 
     addChild(jobs);
 
-    VerticalConfigurationGroup* general2 = new VerticalConfigurationGroup(false);
-    general2->setLabel(QObject::tr("General (Advanced)"));
+    GroupSetting* general2 = new GroupSetting();
+    general2->setLabel(QObject::tr("Advanced"));
     general2->addChild(RecordPreRoll());
     general2->addChild(RecordOverTime());
     general2->addChild(CategoryOverTimeSettings());
     addChild(general2);
 
-    VerticalConfigurationGroup* changrp = new VerticalConfigurationGroup(false);
-    changrp->setLabel(QObject::tr("General (Channel Groups)"));
-    ChannelGroupSettings *changroupsettings = new ChannelGroupSettings();
-    changrp->addChild(changroupsettings);
+    GroupSetting* changrp = new GroupSetting();
+    changrp->setLabel(QObject::tr("Channel Groups"));
+    changrp->addChild(ChannelGroupRememberLast());
     changrp->addChild(BrowseChannelGroup());
     addChild(changrp);
 }
 
 EPGSettings::EPGSettings()
 {
-    VerticalConfigurationGroup* epg = new VerticalConfigurationGroup(false);
-    epg->setLabel(QObject::tr("Program Guide") + " 1/1");
-    epg->addChild(WatchTVGuide());
-    epg->addChild(DefaultTVChannel());
-    epg->addChild(EPGRecThreshold());
-    addChild(epg);
+    setLabel(QObject::tr("Program Guide"));
+    addChild(WatchTVGuide());
+    addChild(DefaultTVChannel());
+    addChild(EPGRecThreshold());
 }
 
 GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
 {
-    VerticalConfigurationGroup* sched = new VerticalConfigurationGroup(false);
+    GroupSetting* sched = new GroupSetting();
     sched->setLabel(QObject::tr("Scheduler Options"));
 
     sched->addChild(GRSchedMoveHigher());
@@ -3572,7 +3843,7 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
     sched->addChild(GRAutoRecPriority());
     addChild(sched);
 
-    VerticalConfigurationGroup* access = new VerticalConfigurationGroup(false);
+    GroupSetting* access = new GroupSetting();
     access->setLabel(QObject::tr("Accessibility Options"));
 
     access->addChild(GRSignLangRecPriority());
@@ -3582,7 +3853,7 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
     access->addChild(GRAudioDescRecPriority());
     addChild(access);
 
-    VerticalConfigurationGroup* rtype = new VerticalConfigurationGroup(false);
+    GroupSetting* rtype = new GroupSetting();
     rtype->setLabel(QObject::tr("Recording Type Priority Settings"));
 
     rtype->addChild(GRSingleRecordRecPriority());
@@ -3595,10 +3866,54 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
     addChild(rtype);
 }
 
+
+class GuiDimension : public GroupValueSetting
+{
+    public:
+        GuiDimension();
+    
+    private slots:
+        virtual void childChanged(StandardSetting *);
+    private:
+        StandardSetting * m_width;
+        StandardSetting * m_height;
+        StandardSetting * m_offsetX;
+        StandardSetting * m_offsetY;
+};
+
+GuiDimension::GuiDimension()
+    :GroupValueSetting()
+{
+    setLabel(QObject::tr("Gui dimension"));
+    addChild(m_width   = GuiWidth());
+    addChild(m_height  = GuiHeight());
+    addChild(m_offsetX = GuiOffsetX());
+    addChild(m_offsetY = GuiOffsetY());
+}
+
+
+void GuiDimension::childChanged(StandardSetting *)
+{
+    if ((  m_width->getValue()=="0"
+        || m_height->getValue()=="0")
+        && m_offsetX->getValue()=="0"
+        && m_offsetY->getValue()=="0")
+        setValue(QObject::tr("Fullscreen"));
+    else
+        setValue(QString("%1x%2+%3+%4")
+                .arg(m_width->getValue())
+                .arg(m_height->getValue())
+                .arg(m_offsetX->getValue())
+                .arg(m_offsetY->getValue()));
+}
+
+
+
 AppearanceSettings::AppearanceSettings()
 {
-    VerticalConfigurationGroup* screen = new VerticalConfigurationGroup(false);
+    GroupSetting* screen = new GroupSetting();
     screen->setLabel(QObject::tr("Theme") + " / " + QObject::tr("Screen Settings"));
+    addChild(screen);
 
     screen->addChild(MenuTheme());
 
@@ -3611,38 +3926,19 @@ AppearanceSettings::AppearanceSettings()
 //    screen->addChild(DisplaySizeHeight());
 //    screen->addChild(DisplaySizeWidth());
 
-    VerticalConfigurationGroup *column1 =
-        new VerticalConfigurationGroup(false, false, false, false);
-
-    column1->addChild(GuiWidth());
-    column1->addChild(GuiHeight());
-    column1->addChild(GuiOffsetX());
-    column1->addChild(GuiOffsetY());
-
-    VerticalConfigurationGroup *column2 =
-        new VerticalConfigurationGroup(false, false, false, false);
-
-    column2->addChild(GuiSizeForTV());
-    column2->addChild(HideMouseCursor());
-    column2->addChild(RunInWindow());
-    column2->addChild(UseFixedWindowSize());
-
-    HorizontalConfigurationGroup *columns =
-        new HorizontalConfigurationGroup(false, false, false, false);
+    screen->addChild(new GuiDimension());
 
-    columns->addChild(column1);
-    columns->addChild(column2);
-
-    screen->addChild(columns);
-
-    addChild(screen);
+    screen->addChild(GuiSizeForTV());
+    screen->addChild(HideMouseCursor());
+    screen->addChild(RunInWindow());
+    screen->addChild(UseFixedWindowSize());
 
 #if defined(USING_XRANDR) || CONFIG_DARWIN
     const vector<DisplayResScreen> scr = GetVideoModes();
     if (!scr.empty())
-        addChild(new VideoModeSettings());
+        addChild(UseVideoModes());
 #endif
-    VerticalConfigurationGroup* dates = new VerticalConfigurationGroup(false);
+    GroupSetting* dates = new GroupSetting();
     dates->setLabel(QObject::tr("Localization"));
     dates->addChild(MythLanguage());
     dates->addChild(ISO639PreferredLanguage(0));
@@ -3652,7 +3948,13 @@ AppearanceSettings::AppearanceSettings()
     dates->addChild(MythTimeFormat());
     addChild(dates);
 
-    addChild(new LcdSettings());
+    addChild(LCDEnable());
+}
+
+void AppearanceSettings::applyChange()
+{
+    qApp->processEvents();
+    GetMythMainWindow()->JumpTo("Reload Theme");
 }
 
 // vim:set sw=4 ts=4 expandtab:
diff --git a/mythtv/programs/mythfrontend/globalsettings.h b/mythtv/programs/mythfrontend/globalsettings.h
index 93e774a..8c224e6 100644
--- a/mythtv/programs/mythfrontend/globalsettings.h
+++ b/mythtv/programs/mythfrontend/globalsettings.h
@@ -7,48 +7,69 @@
 #include "settings.h"
 #include "mythcontext.h"
 #include "videodisplayprofile.h"
+#include "standardsettings.h"
 
 #include <QMutex>
 
 class QFileInfo;
 
-class PlaybackSettings : public ConfigurationWizard
+class PlaybackSettings : public GroupSetting //ConfigurationWizard
 {
   public:
     PlaybackSettings();
 };
 
-class OSDSettings: virtual public ConfigurationWizard
+//TODO check the purpose of virtual here
+//class OSDSettings: virtual public ConfigurationWizard
+class OSDSettings: public GroupSetting
 {
   public:
     OSDSettings();
 };
 
-class GeneralSettings : public ConfigurationWizard
+class GeneralSettings : public GroupSetting
 {
   public:
     GeneralSettings();
 };
 
-class EPGSettings : public ConfigurationWizard
+class EPGSettings : public GroupSetting
 {
   public:
     EPGSettings();
 };
 
-class AppearanceSettings : public ConfigurationWizard
+class AppearanceSettings : public GroupSetting
 {
   public:
     AppearanceSettings();
+    virtual void applyChange();
 };
 
-class MainGeneralSettings : public ConfigurationWizard
+class HostRefreshRateComboBoxSetting : public HostComboBoxSetting
+{
+    Q_OBJECT
+  public:
+    HostRefreshRateComboBoxSetting(const QString &name) :
+        HostComboBoxSetting(name) { }
+    virtual ~HostRefreshRateComboBoxSetting() { ; }
+
+  public slots:
+    virtual void ChangeResolution(StandardSetting *);
+
+  private:
+    static const vector<double> GetRefreshRates(const QString &resolution);
+};
+
+
+class MainGeneralSettings : public GroupSetting
 {
   public:
     MainGeneralSettings();
+    virtual void applyChange();
 };
 
-class GeneralRecPrioritiesSettings : public ConfigurationWizard
+class GeneralRecPrioritiesSettings : public GroupSetting
 {
   public:
     GeneralRecPrioritiesSettings();
@@ -59,7 +80,7 @@ class XboxSettings : public ConfigurationWizard
   public:
     XboxSettings();
 };
-
+/*
 class PlaybackProfileItemConfig : public QObject, public ConfigurationWizard
 {
     Q_OBJECT
@@ -128,6 +149,7 @@ class PlaybackProfileConfig : public VerticalConfigurationGroup
     vector<TransSpinBoxSetting*> priority;
 };
 
+
 class PlaybackProfileConfigs : public TriggeredConfigurationGroup
 {
     Q_OBJECT
@@ -146,6 +168,6 @@ class PlaybackProfileConfigs : public TriggeredConfigurationGroup
   private:
     QStringList   profiles;
     HostComboBox *grouptrigger;
-};
+};*/
 
 #endif
diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp
index 259e020..9a1ec90 100644
--- a/mythtv/programs/mythfrontend/main.cpp
+++ b/mythtv/programs/mythfrontend/main.cpp
@@ -1,4 +1,3 @@
-#include <unistd.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <cerrno>
@@ -74,6 +73,7 @@ using namespace std;
 #include "themechooser.h"
 #include "mythversion.h"
 #include "taskqueue.h"
+#include "standardsettings.h"
 
 // Video
 #include "cleanup.h"
@@ -138,8 +138,16 @@ namespace
 
             if (passwordValid)
             {
-                VideoGeneralSettings settings;
-                settings.exec();
+                MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+                StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+                if (ssd->Create())
+                {
+                    ssd->loadSettings(new VideoGeneralSettings());
+                    mainStack->AddScreen(ssd);
+                }
+                else
+                    delete ssd;
             }
             else
             {
@@ -838,15 +846,16 @@ static void TVMenuCallback(void *data, QString &selection)
         startPrevious();
     else if (sel == "settings appearance")
     {
-        AppearanceSettings *settings = new AppearanceSettings();
-        DialogCode res = settings->exec();
-        delete settings;
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
 
-        if (kDialogCodeRejected != res)
+        if (ssd->Create())
         {
-            qApp->processEvents();
-            GetMythMainWindow()->JumpTo("Reload Theme");
+            ssd->loadSettings(new AppearanceSettings());
+            mainStack->AddScreen(ssd);
         }
+        else
+            delete ssd;
     }
     else if (sel == "settings themechooser")
     {
@@ -898,35 +907,83 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     else if (sel == "settings general")
     {
-        GeneralSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new GeneralSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings audiogeneral")
     {
-        AudioGeneralSettings audiosettings;
-        audiosettings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new AudioConfigSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings maingeneral")
     {
-        MainGeneralSettings mainsettings;
-        mainsettings.exec();
-        QStringList strlist( QString("REFRESH_BACKEND") );
-        gCoreContext->SendReceiveStringList(strlist);
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new MainGeneralSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings playback")
     {
-        PlaybackSettings settings;
-        settings.exec();
+/*        PlaybackSettings settings;
+        settings.exec();*/
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new PlaybackSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings osd")
     {
-        OSDSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new OSDSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings epg")
     {
-        EPGSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new EPGSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings channelgroups")
     {
@@ -935,8 +992,16 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     else if (sel == "settings generalrecpriorities")
     {
-        GeneralRecPrioritiesSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+        if (ssd->Create())
+        {
+            ssd->loadSettings(new GeneralRecPrioritiesSettings());
+            mainStack->AddScreen(ssd);
+        }
+        else
+            delete ssd;
     }
     else if (sel == "settings channelrecpriorities")
     {
diff --git a/mythtv/programs/mythfrontend/mythfrontend.pro b/mythtv/programs/mythfrontend/mythfrontend.pro
index 7c71469..dde9b2d 100644
--- a/mythtv/programs/mythfrontend/mythfrontend.pro
+++ b/mythtv/programs/mythfrontend/mythfrontend.pro
@@ -39,7 +39,7 @@ HEADERS += videoplayercommand.h         videopopups.h
 HEADERS += videofilter.h                videolist.h
 HEADERS += videoplayersettings.h        videodlg.h
 HEADERS += videoglobalsettings.h        upnpscanner.h
-HEADERS += commandlineparser.h
+HEADERS += commandlineparser.h          standardsettings.h
 
 SOURCES += main.cpp playbackbox.cpp viewscheduled.cpp audiogeneralsettings.cpp
 SOURCES += globalsettings.cpp manualschedule.cpp programrecpriority.cpp
@@ -60,7 +60,7 @@ SOURCES += videoplayercommand.cpp       videopopups.cpp
 SOURCES += videofilter.cpp              videolist.cpp
 SOURCES += videoplayersettings.cpp      videodlg.cpp
 SOURCES += videoglobalsettings.cpp      upnpscanner.cpp
-SOURCES += commandlineparser.cpp
+SOURCES += commandlineparser.cpp        standardsettings.cpp
 
 HEADERS += serviceHosts/frontendServiceHost.h
 HEADERS += services/frontend.h
diff --git a/mythtv/programs/mythfrontend/standardsettings.cpp b/mythtv/programs/mythfrontend/standardsettings.cpp
new file mode 100755
index 0000000..9db9a20
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.cpp
@@ -0,0 +1,719 @@
+#include "standardsettings.h"
+#include <QCoreApplication>
+
+#include <mythcontext.h>
+#include <mythmainwindow.h>
+#include <mythdialogbox.h>
+#include <mythuispinbox.h>
+#include <mythuitext.h>
+#include <mythuibutton.h>
+#include <mythuifilebrowser.h>
+#include "mythlogging.h"
+
+void MythUIButtonListItemSetting::ShouldUpdate(StandardSetting *setting)
+{
+    setting->updateButton(this);
+}
+
+StandardSetting::StandardSetting(Storage *_storage) : 
+    NewConfigurable(_storage),
+    m_haveChanged(false),
+    m_parent(0)
+
+{
+}
+
+StandardSetting::~StandardSetting()
+{   
+    QList<StandardSetting *>::const_iterator i;
+    for (i = m_children.constBegin(); i != m_children.constEnd(); ++i)
+        delete *i;
+    m_children.clear();
+
+    QMap<QString, QList<StandardSetting *> >::const_iterator iMap;
+    for (iMap = m_targets.constBegin(); iMap != m_targets.constEnd(); ++iMap)
+    {
+        for (i = (*iMap).constBegin(); i != (*iMap).constEnd(); ++i)
+            delete *i;
+    }
+    m_targets.clear();
+}
+
+MythUIButtonListItem * StandardSetting::createButton(MythUIButtonList * list)
+{
+    MythUIButtonListItemSetting *item = new MythUIButtonListItemSetting(list, label);
+    item->SetData(qVariantFromValue(this));
+    connect(this, SIGNAL(ShouldRedraw(StandardSetting *)), item, SLOT(ShouldUpdate(StandardSetting *)));
+    updateButton(item);
+    return item;
+}
+
+void StandardSetting::setEnabled(bool b)
+{
+    LOG(VB_GENERAL, LOG_ERR, QString("StandardSetting::setEnabled(%1) for %2")
+        .arg(b)
+        .arg(getLabel()));
+    NewConfigurable::setEnabled(b);
+    emit ShouldRedraw(this);
+}
+
+void StandardSetting::setParent(StandardSetting *parent)
+{
+    m_parent = parent;
+}
+
+StandardSetting * StandardSetting::getParent()
+{
+    return m_parent;
+}
+
+void StandardSetting::addChild(StandardSetting *child)
+{
+    if (!child)return;
+    m_children.append(child);
+    child->setParent(this);
+}
+
+void StandardSetting::updateButton(MythUIButtonListItem *item)
+{
+    item->setEnabled(isEnabled());
+    item->SetText(label);
+    item->SetText(settingValue,"value");
+    item->SetText(getHelpText(),"description");
+    item->setDrawArrow (haveSubSettings());
+
+}
+
+void StandardSetting::addTargetedChild(const QString &value, StandardSetting * setting)
+{
+    m_targets[value].append(setting);
+    setting->setParent(this);
+}
+
+
+QList<StandardSetting *> *StandardSetting::getSubSettings()
+{
+    if (m_targets.contains(settingValue) && m_targets[settingValue].size()>0)
+            return &m_targets[settingValue];
+    return &m_children;
+}
+
+bool StandardSetting::haveSubSettings()
+{
+    QList<StandardSetting *> * subSettings=getSubSettings();
+    return (subSettings!=NULL && subSettings->size()>0);
+}
+
+void StandardSetting::setValue(const QString &newValue)
+{
+    settingValue = newValue;
+    emit valueChanged(this);
+    emit ShouldRedraw(this);
+}
+
+bool StandardSetting::haveChanged()
+{
+    if (m_haveChanged) return true;
+
+    //we check only the relevant children
+    QList<StandardSetting *> *children = getSubSettings();
+    if (children==NULL) return false;
+    QList<StandardSetting *>::const_iterator i;
+    bool haveChanged = false;
+    for (i = children->constBegin(); !haveChanged && i != children->constEnd(); ++i)
+        haveChanged=(*i)->haveChanged();
+
+    return haveChanged;
+}
+
+void StandardSetting::Load(void)
+{
+
+    m_haveChanged=false;
+
+    LoadChildren();
+}
+
+void StandardSetting::LoadChildren(void)
+{
+    QList<StandardSetting *>::const_iterator i;
+    for (i = m_children.constBegin(); i != m_children.constEnd(); ++i)
+        (*i)->Load();
+
+    QMap<QString, QList<StandardSetting *> >::const_iterator iMap;
+    for (iMap = m_targets.constBegin(); iMap != m_targets.constEnd(); ++iMap)
+    {
+        for (i = (*iMap).constBegin(); i != (*iMap).constEnd(); ++i)
+            (*i)->Load();
+    }
+    
+}
+void StandardSetting::Save(void)
+{
+/*
+    Storage *s = GetStorage();
+    if (s)s->Save();*/
+
+    m_haveChanged=false;
+
+    SaveChildren();
+}
+
+void StandardSetting::SaveChildren(void)
+{
+    //we save only the relevant children
+    QList<StandardSetting *> *children = getSubSettings();
+    if (children==NULL) return;
+    QList<StandardSetting *>::const_iterator i;
+    for (i = children->constBegin(); i != children->constEnd(); ++i)
+        (*i)->Save();
+}
+
+/*******************************************************************************
+                            Group Setting
+********************************************************************************/
+GroupSetting::GroupSetting():
+    StandardSetting(this), TransientStorage()
+{
+/*    setLabel("This group need a name");
+    setHelpText("This group need a description");*/
+}
+
+void GroupSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+    DialogCompletionEvent *dce =
+            new DialogCompletionEvent("leveldown", 0, "", "");
+    QCoreApplication::postEvent(screen, dce);
+}
+
+void GroupSetting::updateButton(MythUIButtonListItem *item)
+{
+    item->setEnabled(isEnabled());
+    item->SetText(label);
+    item->SetText(settingValue,"value");
+    item->SetText(getHelpText(),"description");
+    item->setDrawArrow (haveSubSettings());
+}
+
+/*
+void GroupValueSetting::addChild(StandardSetting *child)
+{
+    GroupSetting::addChild(child);
+    connect(child,SIGNAL(valueChanged(StandardSetting *)),
+        this, SLOT(childChanged(StandardSetting *)));
+}*/
+
+
+/*******************************************************************************
+                            Text Setting
+********************************************************************************/
+
+MythUITextEditSetting::MythUITextEditSetting(Storage *_storage):
+    StandardSetting(_storage)
+{
+}
+
+void MythUITextEditSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+    MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
+
+    MythTextInputDialog *settingdialog =
+                                    new MythTextInputDialog(popupStack,
+                                    getLabel(),FilterNone, false,settingValue);
+
+    if (settingdialog->Create())
+    {
+        settingdialog->SetReturnEvent(screen, "editsetting");
+        popupStack->AddScreen(settingdialog);
+    }
+};
+
+void MythUITextEditSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (settingValue!=dce->GetResultText())
+    {
+        setValue(dce->GetResultText());
+        m_haveChanged=true;
+    }
+}
+
+
+/*******************************************************************************
+                            Directory Setting
+********************************************************************************/
+
+MythUIFileBrowserSetting::MythUIFileBrowserSetting(Storage *_storage):
+    StandardSetting(_storage)
+{
+    m_typeFilter = (QDir::AllDirs | QDir::Drives | QDir::Files |
+                    QDir::Readable | QDir::Writable | QDir::Executable);
+    m_nameFilter.clear();
+    m_nameFilter << "*";
+}
+
+void MythUIFileBrowserSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+    MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
+
+    MythUIFileBrowser *settingdialog =
+                                    new MythUIFileBrowser(popupStack,
+                                    settingValue);
+    settingdialog->SetTypeFilter(m_typeFilter);
+    settingdialog->SetNameFilter(m_nameFilter);
+
+    if (settingdialog->Create())
+    {
+        settingdialog->SetReturnEvent(screen, "editsetting");
+        popupStack->AddScreen(settingdialog);
+    }
+};
+
+void MythUIFileBrowserSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (settingValue!=dce->GetResultText())
+    {
+        setValue(dce->GetResultText());
+        m_haveChanged=true;
+    }
+}
+
+/*******************************************************************************
+                            ComboBoxSetting
+********************************************************************************/
+//TODO do something when rw=true
+MythUIComboBoxSetting::MythUIComboBoxSetting(Storage *_storage, bool rw):
+    StandardSetting(_storage),
+    m_isSet(false)
+{
+}
+
+MythUIComboBoxSetting::~MythUIComboBoxSetting()
+{
+    m_labels.clear();
+    m_values.clear();
+}
+
+void MythUIComboBoxSetting::setValue(int value)
+{
+    if (value>=0 && value < m_values.size())
+            StandardSetting::setValue(m_values.at(value));
+}
+
+void MythUIComboBoxSetting::addSelection(const QString &label, QString value,
+                                 bool select)
+{
+    value = (value.isEmpty()) ? label : value;
+    m_labels.push_back(label);
+    m_values.push_back(value);
+
+    if (select || !m_isSet)
+    {
+        StandardSetting::setValue(value);
+        if (!m_isSet) m_isSet = true;
+    }
+}
+
+void MythUIComboBoxSetting::clearSelections()
+{
+    m_labels.clear();
+    m_values.clear();
+}
+
+void MythUIComboBoxSetting::updateButton(MythUIButtonListItem *item)
+{
+    item->setEnabled(isEnabled());
+    item->SetText(label);
+    int indexValue = m_values.indexOf(settingValue);
+    if (indexValue >=0)
+        item->SetText(m_labels.value(indexValue),"value");
+    else
+        item->SetText("","value");
+    item->SetText(getHelpText(),"description");
+    item->setDrawArrow (haveSubSettings());
+}
+
+void MythUIComboBoxSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+    MythScreenStack *popupStack =
+                            GetMythMainWindow()->GetStack("popup stack");
+
+    MythDialogBox * m_menuPopup =
+            new MythDialogBox(getLabel(), popupStack, "optionmenu");
+
+    if (m_menuPopup->Create())
+        popupStack->AddScreen(m_menuPopup);
+
+    m_menuPopup->SetReturnEvent(screen, "editsetting");
+
+    for (int i = 0; i < m_labels.size() && m_values.size(); ++i)
+    {
+        QString value = m_values.at(i);
+        m_menuPopup->AddButton(m_labels.at(i),value,false,value==settingValue);
+    }
+}
+
+void MythUIComboBoxSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (dce->GetResult()!=-1 && settingValue!=dce->GetData().toString())
+    {
+        StandardSetting::setValue(dce->GetData().toString());
+        m_haveChanged=true;
+    }
+}
+
+
+/*******************************************************************************
+                            SpinBox Setting
+********************************************************************************/
+MythUISpinBoxSetting::MythUISpinBoxSetting(Storage *_storage, int min, int max, int step, bool allow_single_step):
+    StandardSetting(_storage),
+    m_min(min),
+    m_max(max),
+    m_step(step),
+    m_allow_single_step(allow_single_step)
+{
+    //we default to 0 unless 0 is out of range
+    if (m_min >0 || m_max < 0)settingValue=m_min;
+}
+
+void MythUISpinBoxSetting::setValue(int value)
+{
+    StandardSetting::setValue(QString::number(value));
+}
+
+int MythUISpinBoxSetting::intValue()
+{
+    return settingValue.toInt();
+}
+
+void MythUISpinBoxSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+
+    MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
+
+    MythSpinBoxDialog *settingdialog =
+                                    new MythSpinBoxDialog(popupStack,
+                                    getLabel());
+
+    if (settingdialog->Create())
+    {
+        settingdialog->SetRange(m_min, m_max, m_step);
+        settingdialog->SetValue(settingValue);
+        settingdialog->SetReturnEvent(screen, "editsetting");
+        popupStack->AddScreen(settingdialog);
+    }
+};
+
+void MythUISpinBoxSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (settingValue!=dce->GetResultText())
+    {
+        bool ok;
+        int value = dce->GetResultText().toInt(&ok);
+        ok = ok && (value>=m_min) && (value<=m_max);
+        if (ok && !m_allow_single_step && m_step>0)
+        {
+            ok = ((value-m_min)%m_step)==0;
+        }
+        if (ok) //TODO give user some feedback
+        {
+            StandardSetting::setValue(dce->GetResultText());
+            m_haveChanged=true;
+        }
+    }
+}
+
+/*******************************************************************************
+                           MythUICheckBoxSetting
+********************************************************************************/
+
+MythUICheckBoxSetting::MythUICheckBoxSetting(Storage *_storage):
+    StandardSetting(_storage)
+{
+}
+
+bool MythUICheckBoxSetting::boolValue()
+{
+    return settingValue=="1";
+}
+
+
+void MythUICheckBoxSetting::setValue(bool value)
+{
+    //Why does the polymorphism does not work here
+    StandardSetting::setValue(value?"1":"0");
+}
+
+void MythUICheckBoxSetting::updateButton(MythUIButtonListItem *item)
+{
+    item->SetText(label);
+    item->setCheckable (true);
+    item->setEnabled(isEnabled());
+    item->SetText("","value");
+    item->SetText(getHelpText(),"description");
+    if (settingValue=="1")
+        item->setChecked(MythUIButtonListItem::FullChecked);
+    else
+        item->setChecked(MythUIButtonListItem::NotChecked);
+    item->setDrawArrow(haveSubSettings());
+}
+
+void MythUICheckBoxSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+    DialogCompletionEvent *dce =
+            new DialogCompletionEvent("editsetting", 0, "", "");
+    QCoreApplication::postEvent(screen, dce);
+}
+
+void MythUICheckBoxSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    setValue(!boolValue());
+    m_haveChanged=true;
+}
+
+/*******************************************************************************
+                           Standard setting dialog
+********************************************************************************/
+
+StandardSettingDialog::StandardSettingDialog(MythScreenStack *parent, const char *name) :
+    MythScreenType(parent, name),
+    m_buttonList(0),
+    m_title(0),
+    m_groupHelp(0),
+    m_selectedSettingHelp(0),
+    m_menuPopup(0),
+    m_settingsTree(0),
+    m_currentGroupSetting(0)
+{
+}
+
+StandardSettingDialog::~StandardSettingDialog()
+{
+    LOG(VB_GENERAL, LOG_ERR, "StandardSettingDialog::~StandardSettingDialog()");
+    if (m_settingsTree!=0)
+        m_settingsTree->deleteLater();
+}
+
+bool StandardSettingDialog::Create(void)
+{
+    if (!LoadWindowFromXML("standardsetting-ui.xml", "settingssetup", this))
+        return false;
+
+    bool error=false;
+    UIUtilE::Assign(this, m_title, "title",&error);
+    UIUtilW::Assign(this, m_groupHelp, "grouphelp",&error);
+    UIUtilE::Assign(this, m_buttonList,"settingslist",&error);
+
+    UIUtilW::Assign(this, m_selectedSettingHelp, "selectedsettinghelp");
+
+    connect(m_buttonList,SIGNAL(itemSelected(MythUIButtonListItem*)), 
+        this,SLOT(settingSelected(MythUIButtonListItem*)));
+    connect(m_buttonList,SIGNAL(itemClicked(MythUIButtonListItem*)), 
+        this,SLOT(settingClicked(MythUIButtonListItem*)));
+
+    if (error)
+    {
+        LOG(VB_GENERAL, LOG_ERR, "error.");
+        return false;
+    }
+    BuildFocusList();
+
+    return true;
+}
+
+void StandardSettingDialog::settingSelected(MythUIButtonListItem *item)
+{ 
+    if (!item)return;
+
+    StandardSetting * setting = qVariantValue<StandardSetting*>(item->GetData());
+    if (setting && m_selectedSettingHelp)
+    {
+        m_selectedSettingHelp->SetText(setting->getHelpText());
+        if (m_selectedSettingHelp->GetText().isEmpty()) m_selectedSettingHelp->SetText("This setting need a description");
+    }
+}
+
+void StandardSettingDialog::settingClicked(MythUIButtonListItem *item)
+{
+    StandardSetting* setting = item->GetData().value<StandardSetting*>();
+    if (setting)
+    {
+        setting->edit(this);
+    }
+}
+
+void StandardSettingDialog::customEvent(QEvent *event)
+{
+    if (event->type() == DialogCompletionEvent::kEventType)
+    {
+        DialogCompletionEvent *dce = (DialogCompletionEvent*)(event);
+        QString resultid  = dce->GetId();
+
+        if (resultid == "leveldown")
+        {
+            //a GroupSetting have been clicked
+            LevelDown();
+        }
+        else if (resultid == "editsetting")
+        {
+            MythUIButtonListItem * item = m_buttonList->GetItemCurrent();
+            if (item)
+            {
+                StandardSetting * ss = item->GetData().value<StandardSetting*>();
+                if (ss)
+                {
+                    ss->resultEdit(dce);
+                }
+            }
+        }
+        else if (resultid == "exit")
+        {
+            int buttonnum = dce->GetResult();
+            if (buttonnum == 0)
+            {
+                Save();
+                MythScreenType::Close();
+                if (m_settingsTree)
+                    m_settingsTree->applyChange();
+            }
+            else if (buttonnum == 1)
+                MythScreenType::Close();
+        }
+    }
+}
+
+void StandardSettingDialog::loadSettings(GroupSetting * groupSettings)
+{
+    //TODO I  probably should do this in the background ?
+    m_settingsTree=groupSettings;
+    if (m_settingsTree)
+        m_settingsTree->Load();
+
+    setCurrentGroupSetting(m_settingsTree);
+}
+
+void StandardSettingDialog::setCurrentGroupSetting(StandardSetting * groupSettings, 
+        StandardSetting * selectedSetting )
+{
+    if (!groupSettings) return;
+
+    m_currentGroupSetting=groupSettings;
+    m_buttonList->Reset();
+
+    m_title->SetText(m_currentGroupSetting->getLabel());
+    if (m_title->GetText().isEmpty()) m_title->SetText("This group need a title");
+    if (m_groupHelp)
+    {
+        m_groupHelp->SetText(m_currentGroupSetting->getHelpText());
+        if (m_groupHelp->GetText().isEmpty()) m_groupHelp->SetText("This group need a description");
+    }
+    if (!m_currentGroupSetting->haveSubSettings())return;
+    QList<StandardSetting *> * settings = m_currentGroupSetting->getSubSettings();
+    if (settings==NULL ) return;
+    QList<StandardSetting *>::const_iterator i;
+    MythUIButtonListItem *selectedItem=0;
+    for (i = settings->constBegin(); i != settings->constEnd(); ++i)
+    {
+        if (selectedSetting == (*i))
+            selectedItem =(*i)->createButton(m_buttonList);
+        else
+            (*i)->createButton(m_buttonList);
+    }
+    if (selectedItem)
+        m_buttonList->SetItemCurrent(selectedItem);
+    settingSelected(m_buttonList->GetItemCurrent());
+
+}
+
+void StandardSettingDialog::Save()
+{
+    if (m_settingsTree)
+        m_settingsTree->Save();
+}
+
+void StandardSettingDialog::LevelUp()
+{
+    if (!m_currentGroupSetting) return;
+    if (m_currentGroupSetting->getParent())
+    {
+        setCurrentGroupSetting(m_currentGroupSetting->getParent(),
+                    m_currentGroupSetting);
+    }
+}
+
+void StandardSettingDialog::LevelDown()
+{
+    MythUIButtonListItem * item = m_buttonList->GetItemCurrent();
+    if (item)
+    {
+        StandardSetting * ss = item->GetData().value<StandardSetting*>();
+        if (ss && ss->haveSubSettings() && ss->isEnabled())
+            setCurrentGroupSetting(ss);
+    }
+}
+
+void StandardSettingDialog::Close(void)
+{
+    if (m_settingsTree->haveChanged())
+    {
+        QString label = tr("Exit ?");
+
+        MythScreenStack *popupStack =
+                                GetMythMainWindow()->GetStack("popup stack");
+
+        MythDialogBox * m_menuPopup =
+                new MythDialogBox(label, popupStack, "exitmenu");
+
+        if (m_menuPopup->Create())
+            popupStack->AddScreen(m_menuPopup);
+
+        m_menuPopup->SetReturnEvent(this, "exit");
+
+        m_menuPopup->AddButton(tr("Save then Exit"));
+        m_menuPopup->AddButton(tr("Exit without saving changes"));
+        m_menuPopup->AddButton(tr("Cancel"));
+    }
+    else
+        MythScreenType::Close();
+}
+
+
+bool StandardSettingDialog::keyPressEvent(QKeyEvent *e)
+{
+    QStringList actions;
+    bool handled = m_buttonList->keyPressEvent(e);
+    if (handled) return true;
+    handled = GetMythMainWindow()->TranslateKeyPress("Global", e, actions);
+
+    for (int i = 0; i < actions.size() && !handled; i++)
+    {
+        QString action = actions[i];
+        handled = true;
+
+        if (action == "LEFT")
+        {
+            if (m_currentGroupSetting 
+                && m_currentGroupSetting==m_settingsTree)
+                Close();
+            else
+                LevelUp();
+        }
+        else if (action == "RIGHT")
+            LevelDown();
+        else
+            handled = MythScreenType::keyPressEvent(e);
+    }
+
+    return handled;
+}
+
+
+
+
+
diff --git a/mythtv/programs/mythfrontend/standardsettings.h b/mythtv/programs/mythfrontend/standardsettings.h
new file mode 100755
index 0000000..740f96f
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.h
@@ -0,0 +1,418 @@
+#ifndef STANDARDSETTINGS_H_
+#define STANDARDSETTINGS_H_
+
+#include "mythuibuttonlist.h"
+#include <mythdialogbox.h>
+#include <mythuibuttontree.h>
+#include <mythgenerictree.h>
+#include <QMap>
+#include "settings.h"
+
+#include "mythlogging.h"
+
+class StandardSetting;
+
+class MythUIButtonListItemSetting : public QObject, public MythUIButtonListItem 
+{
+    Q_OBJECT
+  public:
+        MythUIButtonListItemSetting (MythUIButtonList *lbtype, const QString &text)
+            :MythUIButtonListItem(lbtype,text){}
+  public slots:
+    void ShouldUpdate(StandardSetting *setting);
+};
+
+
+//TODO drop this class and include it in StandardSetting
+class MPUBLIC NewConfigurable : public QObject
+{
+    Q_OBJECT
+
+  public:
+
+    virtual void updateButton(MythUIButtonListItem *item)=0;
+
+    // A label displayed to the user
+    virtual void setLabel(QString str) { label = str; }
+    QString getLabel(void) const { return label; }
+
+    virtual void setHelpText(const QString &str)
+        { helptext = str; }
+    QString getHelpText(void) const { return helptext; }
+
+    void setVisible(bool b) { m_visible = b; };
+    bool isVisible(void) const { return m_visible; };
+
+    virtual void setEnabled(bool b) { m_enabled = b; }
+    bool isEnabled() { return m_enabled; }
+
+    Storage *GetStorage(void) { return storage; }
+
+  protected:
+    NewConfigurable(Storage *_storage) :
+        m_enabled(true), storage(_storage),
+        label(""), helptext(""), m_visible(true) { }
+    virtual ~NewConfigurable() { }
+
+  protected:
+    bool m_enabled;
+    Storage *storage;
+    QString configName;
+    QString label;
+    QString helptext;
+    bool m_visible;
+};
+
+//Copy of Setting class
+class MPUBLIC StandardSetting : public NewConfigurable, public StorageUser
+{
+    Q_OBJECT
+
+  public:
+    // Gets
+    virtual QString getValue(void) const
+        {return settingValue;}
+
+    virtual void updateButton(MythUIButtonListItem *item);
+
+    // StorageUser
+    void SetDBValue(const QString &val) { setValue(val); }
+    QString GetDBValue(void) const { return getValue(); }
+
+    //added by xavier
+    virtual void setEnabled(bool b);
+    MythUIButtonListItem * createButton(MythUIButtonList * list);
+    //subsettings
+    virtual void addChild(StandardSetting *child);
+    virtual QList<StandardSetting *> *getSubSettings();
+    virtual bool haveSubSettings();
+
+    StandardSetting * getParent();
+    virtual void edit(MythScreenType * screen)=0;
+    virtual void resultEdit(DialogCompletionEvent *dce)=0;
+    //must be a better way
+    virtual void Load(void);
+    virtual void Save(void);
+
+
+    void addTargetedChild(const QString &value, StandardSetting * setting);
+    bool haveChanged();
+    //added by xavier end
+  public slots:
+    virtual void setValue(const QString &newValue);
+
+  signals:
+    void valueChanged(StandardSetting *);
+    void ShouldRedraw(StandardSetting *);
+
+  protected:
+    StandardSetting(Storage *_storage);
+    virtual ~StandardSetting();
+
+  protected:
+    void setParent(StandardSetting *parent);
+    QString settingValue;
+    void LoadChildren(void);
+    void SaveChildren(void);
+    bool m_haveChanged;
+  private:
+    StandardSetting * m_parent;
+    QList<StandardSetting *> m_children;
+    QMap<QString, QList<StandardSetting *> > m_targets;
+};
+
+
+/*******************************************************************************
+*                           TextEdit Setting                                   *
+*******************************************************************************/
+
+
+class MPUBLIC MythUITextEditSetting : public StandardSetting
+{
+  public:
+    virtual void resultEdit(DialogCompletionEvent *dce);
+    virtual void edit(MythScreenType * screen);
+  protected:
+    MythUITextEditSetting (Storage *_storage);
+    
+};
+
+
+class MPUBLIC TransTextEditSetting: public MythUITextEditSetting, public TransientStorage
+{
+  public:
+    TransTextEditSetting() :
+        MythUITextEditSetting(this), TransientStorage() { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUITextEditSetting::Load();}
+    virtual void Save(){MythUITextEditSetting::Save();}
+};
+
+
+class MPUBLIC HostTextEditSetting: public MythUITextEditSetting, public HostDBStorage
+{
+  public:
+    HostTextEditSetting(const QString &name) :
+        MythUITextEditSetting(this), HostDBStorage(this, name) { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUITextEditSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUITextEditSetting::Save();HostDBStorage::Save();}
+};
+
+
+/*******************************************************************************
+*                           Directory Setting                                  *
+*******************************************************************************/
+
+
+class MPUBLIC MythUIFileBrowserSetting : public StandardSetting
+{
+  public:
+    virtual void resultEdit(DialogCompletionEvent *dce);
+    virtual void edit(MythScreenType * screen);
+    void SetTypeFilter(QDir::Filters filter) { m_typeFilter = filter; };
+    void SetNameFilter(QStringList filter) { m_nameFilter = filter; };
+  protected:
+    MythUIFileBrowserSetting (Storage *_storage);
+    QDir::Filters      m_typeFilter;
+    QStringList        m_nameFilter;
+    
+};
+
+
+class MPUBLIC HostFileBrowserSetting: public MythUIFileBrowserSetting, public HostDBStorage
+{
+  public:
+    HostFileBrowserSetting(const QString &name) :
+        MythUIFileBrowserSetting(this), HostDBStorage(this, name) { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUIFileBrowserSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUIFileBrowserSetting::Save();HostDBStorage::Save();}
+};
+
+
+/*******************************************************************************
+*                           ComboBox Setting                                   *
+*******************************************************************************/
+//TODO implement rw=true
+class MPUBLIC MythUIComboBoxSetting : public StandardSetting
+{
+  public:
+    void setValue(int value);
+    virtual void resultEdit(DialogCompletionEvent *dce);
+    virtual void edit(MythScreenType * screen);
+    void addSelection(const QString &label, QString value = QString::null, bool select = false);
+    void clearSelections();
+    virtual void updateButton(MythUIButtonListItem *item);
+  protected:
+    MythUIComboBoxSetting (Storage *_storage, bool rw = false);
+    ~MythUIComboBoxSetting();
+
+  private:
+    QVector<QString> m_labels;
+    QVector<QString> m_values;
+    bool m_isSet;
+    
+};
+
+class MPUBLIC HostComboBoxSetting: public MythUIComboBoxSetting, public HostDBStorage
+{
+  public:
+    HostComboBoxSetting(const QString &name, bool rw = false) :
+        MythUIComboBoxSetting(this, rw), HostDBStorage(this, name) { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUIComboBoxSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUIComboBoxSetting::Save();HostDBStorage::Save();}
+};
+
+
+class MPUBLIC GlobalComboBoxSetting: public MythUIComboBoxSetting, public GlobalDBStorage
+{
+  public:
+    GlobalComboBoxSetting(const QString &name, bool rw = false) :
+        MythUIComboBoxSetting(this, rw), GlobalDBStorage(this, name) { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUIComboBoxSetting::Load();GlobalDBStorage::Load();}
+    virtual void Save(){MythUIComboBoxSetting::Save();GlobalDBStorage::Save();}
+};
+
+/*******************************************************************************
+*                           SpinBox Setting                                    *
+*******************************************************************************/
+
+
+class MPUBLIC MythUISpinBoxSetting : public StandardSetting
+{
+  public:
+    void setValue(int value);
+    int intValue();
+    virtual void resultEdit(DialogCompletionEvent *dce);
+    virtual void edit(MythScreenType * screen);
+  protected:
+    MythUISpinBoxSetting (Storage *_storage, int min, int max, int step, bool allow_single_step);
+  private:
+    int m_min;
+    int m_max;
+    int m_step;
+    bool m_allow_single_step;
+    
+};
+
+class MPUBLIC TransMythUISpinBoxSetting: public MythUISpinBoxSetting, public TransientStorage
+{
+  public:
+    TransMythUISpinBoxSetting(int min, int max, int step, bool allow_single_step=false) :
+        MythUISpinBoxSetting(this, min, max, step, allow_single_step), TransientStorage() { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUISpinBoxSetting::Load();}
+    virtual void Save(){MythUISpinBoxSetting::Save();}
+};
+
+class MPUBLIC HostSpinBoxSetting: public MythUISpinBoxSetting, public HostDBStorage
+{
+  public:
+    HostSpinBoxSetting(const QString &name, int min, int max, int step, bool allow_single_step=false) :
+        MythUISpinBoxSetting(this, min, max, step, allow_single_step), HostDBStorage(this, name) { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUISpinBoxSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUISpinBoxSetting::Save();HostDBStorage::Save();}
+};
+
+class MPUBLIC GlobalSpinBoxSetting: public MythUISpinBoxSetting, public GlobalDBStorage
+{
+  public:
+    GlobalSpinBoxSetting(const QString &name, int min, int max, int step, bool allow_single_step=false) :
+        MythUISpinBoxSetting(this, min, max, step, allow_single_step), GlobalDBStorage(this, name) { }
+
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUISpinBoxSetting::Load();GlobalDBStorage::Load();}
+    virtual void Save(){MythUISpinBoxSetting::Save();GlobalDBStorage::Save();}
+};
+
+/*******************************************************************************
+*                           CheckBox Setting                                   *
+*******************************************************************************/
+
+class MPUBLIC MythUICheckBoxSetting : public StandardSetting
+{
+  public:
+    virtual void resultEdit(DialogCompletionEvent *dce);
+    virtual void edit(MythScreenType * screen);
+    virtual void updateButton(MythUIButtonListItem *item);
+    void setValue(bool value);
+    bool boolValue();
+  protected:
+    MythUICheckBoxSetting (Storage *_storage);
+    
+};
+
+class MPUBLIC TransMythUICheckBoxSetting: public MythUICheckBoxSetting, public TransientStorage
+{
+  public:
+    TransMythUICheckBoxSetting() :
+        MythUICheckBoxSetting(this), TransientStorage() { }
+    //Don't want to have to do that but cannot think of a work around
+    /*virtual void Load(){MythUICheckBoxSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUICheckBoxSetting::Save();HostDBStorage::Save();}*/
+};
+
+class MPUBLIC HostCheckBoxSetting: public MythUICheckBoxSetting, public HostDBStorage
+{
+  public:
+    HostCheckBoxSetting(const QString &name, bool rw = true) :
+        MythUICheckBoxSetting(this), HostDBStorage(this, name) { }
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUICheckBoxSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUICheckBoxSetting::Save();HostDBStorage::Save();}
+};
+
+class MPUBLIC GlobalCheckBoxSetting: public MythUICheckBoxSetting, public GlobalDBStorage
+{
+  public:
+    GlobalCheckBoxSetting(const QString &name, bool rw = true) :
+        MythUICheckBoxSetting(this), GlobalDBStorage(this, name) { }
+    //Don't want to have to do that but cannot think of a work around
+    virtual void Load(){MythUICheckBoxSetting::Load();GlobalDBStorage::Load();}
+    virtual void Save(){MythUICheckBoxSetting::Save();GlobalDBStorage::Save();}
+};
+
+/*******************************************************************************
+*                              Group Setting                                   *
+*******************************************************************************/
+
+class GroupSetting : public StandardSetting, public TransientStorage
+{
+  public:
+    GroupSetting();
+
+    virtual void Load(void){StandardSetting::Load();};
+    virtual void Save(void){StandardSetting::Save();};
+    virtual void edit(MythScreenType * screen);
+    virtual void resultEdit(DialogCompletionEvent *dce){};
+    virtual void applyChange(){};
+    virtual void updateButton(MythUIButtonListItem *item);
+};
+
+/**
+ * Upgate the "Value" of a group when a child value changed
+ * This class is done so we can use slots/signal while the class remain private
+ */
+class GroupValueSetting : public GroupSetting
+{
+    Q_OBJECT
+  public:
+    GroupValueSetting():GroupSetting(){};
+  private slots:
+    virtual void childChanged(StandardSetting *setting) = 0;
+    
+};
+
+/*******************************************************************************
+*                            Standard Dialog Setting                            *
+*******************************************************************************/
+
+class StandardSettingDialog : public MythScreenType
+{
+    Q_OBJECT
+
+  public:
+
+    StandardSettingDialog(MythScreenStack *parent, const char *name);
+    virtual ~StandardSettingDialog();
+    bool Create(void);
+    void loadSettings(GroupSetting * groupSettings);
+    virtual void customEvent(QEvent *event);
+    virtual bool keyPressEvent(QKeyEvent *);
+  public slots:
+    void Close(void);
+  protected:
+
+    MythUIButtonList *m_buttonList;
+  private slots:
+    void settingSelected(MythUIButtonListItem *item);
+    void settingClicked(MythUIButtonListItem *item);
+  private:
+    void LevelUp();
+    void LevelDown();
+    void setCurrentGroupSetting(StandardSetting * groupSettings,StandardSetting * selectedSetting=0);
+    void Save();
+    MythUIText      *m_title;
+    MythUIText      *m_groupHelp;
+    MythUIText      *m_selectedSettingHelp;
+    MythDialogBox   *m_menuPopup;
+    GroupSetting    *m_settingsTree;
+    StandardSetting *m_currentGroupSetting;
+    bool m_loaded;
+};
+
+Q_DECLARE_METATYPE(StandardSetting *);
+
+
+#endif
diff --git a/mythtv/programs/mythfrontend/videoglobalsettings.cpp b/mythtv/programs/mythfrontend/videoglobalsettings.cpp
index 0365bfc..efd595f 100644
--- a/mythtv/programs/mythfrontend/videoglobalsettings.cpp
+++ b/mythtv/programs/mythfrontend/videoglobalsettings.cpp
@@ -9,12 +9,14 @@
 #include "videodlg.h"
 #include "videoglobalsettings.h"
 
+#include "mythlogging.h"
+
 namespace
 {
 // General Settings
-HostComboBox *VideoDefaultParentalLevel()
+HostComboBoxSetting *VideoDefaultParentalLevel()
 {
-    HostComboBox *gc = new HostComboBox("VideoDefaultParentalLevel");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("VideoDefaultParentalLevel");
     gc->setLabel(QObject::tr("Starting Parental Level"));
     gc->addSelection(QObject::tr("4 - Highest"),
                      QString::number(ParentalLevel::plHigh));
@@ -33,9 +35,9 @@ const char *password_clue =
     QT_TRANSLATE_NOOP("QObject", "Setting this value to all numbers will make your life "
                 "much easier.");
 
-HostLineEdit *VideoAdminPassword()
+HostTextEditSetting *VideoAdminPassword()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoAdminPassword");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoAdminPassword");
     gc->setLabel(QObject::tr("Parental Level 4 PIN"));
     gc->setHelpText(QString("%1 %2")
         .arg(QObject::tr("This PIN is used to enter Parental Control "
@@ -44,9 +46,9 @@ HostLineEdit *VideoAdminPassword()
     return gc;
 }
 
-HostLineEdit *VideoAdminPasswordThree()
+HostTextEditSetting *VideoAdminPasswordThree()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoAdminPasswordThree");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoAdminPasswordThree");
     gc->setLabel(QObject::tr("Parental Level 3 PIN"));
     gc->setHelpText(QString("%1 %2")
         .arg(QObject::tr("This PIN is used to enter Parental Control Level 3."))
@@ -54,9 +56,9 @@ HostLineEdit *VideoAdminPasswordThree()
     return gc;
 }
 
-HostLineEdit *VideoAdminPasswordTwo()
+HostTextEditSetting *VideoAdminPasswordTwo()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoAdminPasswordTwo");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoAdminPasswordTwo");
     gc->setLabel(QObject::tr("Parental Level 2 PIN"));
     gc->setHelpText(QString("%1 %2")
         .arg(QObject::tr("This PIN is used to enter Parental Control Level 2."))
@@ -64,9 +66,9 @@ HostLineEdit *VideoAdminPasswordTwo()
     return gc;
 }
 
-HostCheckBox *VideoAggressivePC()
+HostCheckBoxSetting *VideoAggressivePC()
 {
-    HostCheckBox *gc = new HostCheckBox("VideoAggressivePC");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("VideoAggressivePC");
     gc->setLabel(QObject::tr("Aggressive Parental Control"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If set, you will not be able to return "
@@ -76,9 +78,10 @@ HostCheckBox *VideoAggressivePC()
     return gc;
 }
 
-HostLineEdit *VideoStartupDirectory()
+//TODO use MythUIFileBrowser but we need to be able to have more than one directory
+HostTextEditSetting *VideoStartupDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoStartupDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoStartupDir");
     gc->setLabel(QObject::tr("Directories that hold videos"));
     gc->setValue(DEFAULT_VIDEOSTARTUP_DIR);
     gc->setHelpText(QObject::tr("Multiple directories can be separated by ':'. "
@@ -87,58 +90,63 @@ HostLineEdit *VideoStartupDirectory()
     return gc;
 }
 
-HostLineEdit *VideoArtworkDirectory()
+HostFileBrowserSetting *VideoArtworkDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoArtworkDir");
+    HostFileBrowserSetting *gc = new HostFileBrowserSetting("VideoArtworkDir");
     gc->setLabel(QObject::tr("Directory that holds movie posters"));
     gc->setValue(GetConfDir() + "/Video/Artwork");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
                     "running the frontend needs to have read/write permission "
                     "to the directory."));
+    gc->SetTypeFilter(QDir::AllDirs | QDir::Hidden);
     return gc;
 }
 
-HostLineEdit *VideoScreenshotDirectory()
+HostFileBrowserSetting *VideoScreenshotDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.screenshotDir");
+    HostFileBrowserSetting *gc = new HostFileBrowserSetting("mythvideo.screenshotDir");
     gc->setLabel(QObject::tr("Directory that holds movie screenshots"));
     gc->setValue(GetConfDir() + "/Video/Screenshots");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
                     "running the frontend needs to have read/write permission "
                     "to the directory."));
+    gc->SetTypeFilter(QDir::AllDirs | QDir::Hidden);
     return gc;
 }
 
-HostLineEdit *VideoBannerDirectory()
+HostFileBrowserSetting *VideoBannerDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.bannerDir");
+    HostFileBrowserSetting *gc = new HostFileBrowserSetting("mythvideo.bannerDir");
     gc->setLabel(QObject::tr("Directory that holds movie/TV Banners"));
     gc->setValue(GetConfDir() + "/Video/Banners");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
                     "running the frontend needs to have read/write permission "
                     "to the directory."));
+    gc->SetTypeFilter(QDir::AllDirs | QDir::Hidden);
     return gc;
 }
 
-HostLineEdit *VideoFanartDirectory()
+HostFileBrowserSetting *VideoFanartDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.fanartDir");
+    HostFileBrowserSetting *gc = new HostFileBrowserSetting("mythvideo.fanartDir");
     gc->setLabel(QObject::tr("Directory that holds movie fanart"));
     gc->setValue(GetConfDir() + "/Video/Fanart");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
                     "running the frontend needs to have read/write permission "
                     "to the directory."));
+    gc->SetTypeFilter(QDir::AllDirs | QDir::Hidden);
     return gc;
 }
 
-HostLineEdit *TrailerDirectory()
+HostFileBrowserSetting *TrailerDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.TrailersDir");
+    HostFileBrowserSetting *gc = new HostFileBrowserSetting("mythvideo.TrailersDir");
     gc->setLabel(QObject::tr("Directory that holds movie trailers"));
     gc->setValue(GetConfDir() + "/Video/Trailers");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
                     "running the frontend needs to have read/write permission "
                     "to the directory."));
+    gc->SetTypeFilter(QDir::AllDirs | QDir::Hidden);
     return gc;
 }
 
@@ -148,9 +156,9 @@ HostLineEdit *TrailerDirectory()
 
 // General Settings
 
-HostComboBox *SetOnInsertDVD()
+HostComboBoxSetting *SetOnInsertDVD()
 {
-    HostComboBox *gc = new HostComboBox("DVDOnInsertDVD");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("DVDOnInsertDVD");
     gc->setLabel(QObject::tr("On DVD insertion"));
     gc->addSelection(QObject::tr("Display mythdvd menu"),"1");
     gc->addSelection(QObject::tr("Do nothing"),"0");
@@ -160,9 +168,9 @@ HostComboBox *SetOnInsertDVD()
     return gc;
 }
 
-HostCheckBox *VideoTreeRemember()
+HostCheckBoxSetting *VideoTreeRemember()
 {
-    HostCheckBox *gc = new HostCheckBox("mythvideo.VideoTreeRemember");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("mythvideo.VideoTreeRemember");
     gc->setLabel(QObject::tr("Video Tree remembers last selected position"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If set, the current position in the Video "
@@ -170,142 +178,85 @@ HostCheckBox *VideoTreeRemember()
     return gc;
 }
 
-struct ConfigPage
-{
-    typedef std::vector<ConfigurationGroup *> PageList;
-
-  protected:
-    ConfigPage(PageList &pl) : m_pl(pl)
-    {
-    }
-
-    void Add(ConfigurationGroup *page)
-    {
-        m_pl.push_back(page);
-    }
 
-  private:
-    ConfigPage(const ConfigPage &);
-    ConfigPage &operator=(const ConfigPage &);
 
-  private:
-    PageList &m_pl;
-};
 
-struct VConfigPage : public ConfigPage
+HostCheckBoxSetting *RatingsToPL()
 {
-    VConfigPage(PageList &pl, bool luselabel = true, bool luseframe  = true,
-                bool lzeroMargin = false, bool lzeroSpace = false) :
-        ConfigPage(pl)
-    {
-        m_vc_page = new VerticalConfigurationGroup(luselabel, luseframe,
-                                                   lzeroMargin, lzeroSpace);
-        Add(m_vc_page);
-    }
-
-    VerticalConfigurationGroup *operator->()
+    HostCheckBoxSetting *r2pl =
+            new HostCheckBoxSetting("mythvideo.ParentalLevelFromRating");
+    r2pl->setLabel(QObject::tr("Enable automatic Parental Level from "
+                               "rating"));
+    r2pl->setValue(false);
+    r2pl->setHelpText(QObject::tr("If enabled, searches will automatically "
+                                  "set the Parental Level to the one "
+                                  "matching the rating below."));
+
+    typedef std::map<ParentalLevel::Level, QString> r2pl_map;
+    r2pl_map r2pl_defaults;
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLowest,
+            QObject::tr("G", "PL 1 default search string.")));
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLow,
+            QObject::tr("PG", "PL 2 default search string.")));
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plMedium,
+            QObject::tr("PG-13", "PL3 default search string.")));
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plHigh,
+            QObject::tr("R:NC-17", "PL4 default search string.")));
+
+    for (ParentalLevel pl(ParentalLevel::plLowest);
+         pl.GetLevel() <= ParentalLevel::plHigh && pl.good(); ++pl)
     {
-        return m_vc_page;
-    }
-
-  private:
-    VerticalConfigurationGroup *m_vc_page;
-};
-
-class RatingsToPL : public TriggeredConfigurationGroup
-{
-  public:
-    RatingsToPL() : TriggeredConfigurationGroup(false)
-    {
-        HostCheckBox *r2pl =
-                new HostCheckBox("mythvideo.ParentalLevelFromRating");
-        r2pl->setLabel(QObject::tr("Enable automatic Parental Level from "
-                                   "rating"));
-        r2pl->setValue(false);
-        r2pl->setHelpText(QObject::tr("If enabled, searches will automatically "
-                                      "set the Parental Level to the one "
-                                      "matching the rating below."));
-        addChild(r2pl);
-        setTrigger(r2pl);
-
-        typedef std::map<ParentalLevel::Level, QString> r2pl_map;
-        r2pl_map r2pl_defaults;
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLowest,
-                tr("G", "PL 1 default search string.")));
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLow,
-                tr("PG", "PL 2 default search string.")));
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plMedium,
-                tr("PG-13", "PL3 default search string.")));
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plHigh,
-                tr("R:NC-17", "PL4 default search string.")));
-
-        VerticalConfigurationGroup *vcg = new VerticalConfigurationGroup(true);
-
-        for (ParentalLevel pl(ParentalLevel::plLowest);
-             pl.GetLevel() <= ParentalLevel::plHigh && pl.good(); ++pl)
+        HostTextEditSetting *hle = new HostTextEditSetting(QString("mythvideo.AutoR2PL%1")
+                                             .arg(pl.GetLevel()));
+        hle->setLabel(QObject::tr("Level %1").arg(pl.GetLevel()));
+        hle->setHelpText(QObject::tr("Ratings containing these strings "
+                                     "(separated by :) will be assigned "
+                                     "to Parental Level %1.")
+                         .arg(pl.GetLevel()));
+
+        r2pl_map::const_iterator def_setting =
+                r2pl_defaults.find(pl.GetLevel());
+        if (def_setting != r2pl_defaults.end())
         {
-            HostLineEdit *hle = new HostLineEdit(QString("mythvideo.AutoR2PL%1")
-                                                 .arg(pl.GetLevel()));
-            hle->setLabel(QObject::tr("Level %1").arg(pl.GetLevel()));
-            hle->setHelpText(QObject::tr("Ratings containing these strings "
-                                         "(separated by :) will be assigned "
-                                         "to Parental Level %1.")
-                             .arg(pl.GetLevel()));
-
-            r2pl_map::const_iterator def_setting =
-                    r2pl_defaults.find(pl.GetLevel());
-            if (def_setting != r2pl_defaults.end())
-            {
-                hle->setValue(def_setting->second);
-            }
-
-            vcg->addChild(hle);
+            hle->setValue(def_setting->second);
         }
 
-        addTarget("0", new VerticalConfigurationGroup(true));
-        addTarget("1", vcg);
+        r2pl->addTargetedChild("1", hle);
     }
-};
 
-} // namespace
+    return r2pl;
+}
+
+}
 
 VideoGeneralSettings::VideoGeneralSettings()
+    :GroupSetting()
 {
-    ConfigPage::PageList pages;
-
-    VConfigPage page1(pages, false);
-    page1->addChild(VideoStartupDirectory());
-    page1->addChild(TrailerDirectory());
-    page1->addChild(VideoArtworkDirectory());
-    page1->addChild(VideoScreenshotDirectory());
-    page1->addChild(VideoBannerDirectory());
-    page1->addChild(VideoFanartDirectory());
-
-    VConfigPage page2(pages, false);
-    page2->addChild(SetOnInsertDVD());
-    page2->addChild(VideoTreeRemember());
-
-    // page 3
-    VerticalConfigurationGroup *pctrl =
-            new VerticalConfigurationGroup(true, false);
+    setLabel(QObject::tr("General settings"));
+
+    addChild(VideoStartupDirectory());
+    addChild(TrailerDirectory());
+    addChild(VideoArtworkDirectory());
+    addChild(VideoScreenshotDirectory());
+    addChild(VideoBannerDirectory());
+    addChild(VideoFanartDirectory());
+
+    addChild(SetOnInsertDVD());
+    addChild(VideoTreeRemember());
+
+    GroupSetting *pctrl =
+            new GroupSetting();
     pctrl->setLabel(QObject::tr("Parental Control Settings"));
+
     pctrl->addChild(VideoDefaultParentalLevel());
     pctrl->addChild(VideoAdminPassword());
     pctrl->addChild(VideoAdminPasswordThree());
     pctrl->addChild(VideoAdminPasswordTwo());
     pctrl->addChild(VideoAggressivePC());
-    VConfigPage page3(pages, false);
-    page3->addChild(pctrl);
 
-    VConfigPage page4(pages, false);
-    page4->addChild(new RatingsToPL());
+    addChild(pctrl);
+
+    addChild(RatingsToPL());
 
-    int page_num = 1;
-    for (ConfigPage::PageList::const_iterator p = pages.begin();
-         p != pages.end(); ++p, ++page_num)
-    {
-        (*p)->setLabel(QObject::tr("General Settings (%1/%2)").arg(page_num)
-                       .arg(pages.size()));
-        addChild(*p);
-    }
 }
+
diff --git a/mythtv/programs/mythfrontend/videoglobalsettings.h b/mythtv/programs/mythfrontend/videoglobalsettings.h
index 9f621e6..de155db 100644
--- a/mythtv/programs/mythfrontend/videoglobalsettings.h
+++ b/mythtv/programs/mythfrontend/videoglobalsettings.h
@@ -3,7 +3,9 @@
 
 #include "settings.h"
 
-class VideoGeneralSettings : public ConfigurationWizard
+#include "standardsettings.h"
+
+class VideoGeneralSettings : public GroupSetting
 {
   public:
     VideoGeneralSettings();
diff --git a/mythtv/themes/default-wide/standardsetting-ui.xml b/mythtv/themes/default-wide/standardsetting-ui.xml
new file mode 100644
index 0000000..03bc4e8
--- /dev/null
+++ b/mythtv/themes/default-wide/standardsetting-ui.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE mythuitheme SYSTEM "http://www.mythtv.org/schema/mythuitheme.dtd">
+
+<!-- theme.xml for the MythCenter theme - by Jeroen Brosens -->
+<mythuitheme>
+    <window name="settingssetup">
+
+        <textarea name="title" from="basetextarea">
+            <area>30,15,100%-30,30</area>
+            <font>baselarge</font>
+            <align>hcenter</align>
+        </textarea>
+
+        <shape name="GroupHelpBackground"> 
+            <area>15,80,100%-15,80</area> 
+            <type>roundbox</type> 
+            <cornerradius>10</cornerradius>
+            <fill color="#FFFFFF" alpha="30" />
+        </shape>
+
+        <!-- optionnal, display the help for the current group of settings -->
+        <textarea name="grouphelp" from="basetextarea">
+            <area>30,90-120,100%-30,60</area>
+            <font>basesmall</font>
+            <align>lefthcenter</align>
+            <multiline>yes</multiline>
+        </textarea>
+
+        <buttonlist name="settingslist"  from="basebuttonlist">
+            <area>100,200,100%-100,100%-160</area>
+            <layout>grid</layout>
+            <spacing>4</spacing>
+            <wrapstyle>selection</wrapstyle>
+            <arrange>stack</arrange>
+            <statetype name="buttonitem">
+                <area>0,0,100%,30</area>
+                <state name="active">
+                    <area>0,0,100%,30</area>
+                    <shape name="buttonbackground">
+                        <area>0,0,100%,100%</area>
+                        <fill style="gradient">
+                            <gradient start="#505050" end="#000000" alpha="200" direction="vertical"  />
+                        </fill>
+                    </shape>
+                    <!--shape name="buttonbackgroundvalue">
+                        <area>50%,0,100%-23,100%</area>
+                        <type>roundbox</type> 
+                        <cornerradius>10</cornerradius>
+                    </shape-->
+                    <textarea name="buttontext">
+                        <area>5,0,50%-10,30</area>
+                        <font>basesmall</font>
+                        <cutdown>yes</cutdown>
+                        <align>left,vcenter</align>
+                    </textarea>
+                    <textarea name="value">
+                        <area>50%+5,0,100%-30,30</area>
+                        <font>basesmall</font>
+                        <cutdown>yes</cutdown>
+                        <align>right,vcenter</align>
+                    </textarea>
+                    <!--textarea name="description">
+                        <area>5,50%,100%-40,100%</area>
+                        <font>basesmall</font>
+                        <cutdown>yes</cutdown>
+                        <multiline>yes</multiline>
+                    </textarea-->
+                    <statetype name="buttoncheck">
+                        <position>100%-46,5</position>
+                        <state type="off">
+                            <imagetype name="checkoff">
+                                <filename>lb-check-empty.png</filename>
+                            </imagetype>
+                        </state>
+                        <state type="half">
+                            <imagetype name="checkhalf">
+                                <filename>lb-check-half.png</filename>
+                            </imagetype>
+                        </state>
+                        <state type="full">
+                            <imagetype name="checkfull">
+                                <filename>lb-check-full.png</filename>
+                            </imagetype>
+                        </state>
+                    </statetype>
+                    <imagetype name="buttonarrow">
+                        <position>100%-23,7</position>
+                        <filename>lb-arrow.png</filename>
+                    </imagetype>
+                </state>
+                <state name="selectedactive" from="active">
+                    <shape name="buttonbackground">
+                        <fill style="gradient">
+                            <gradient start="#52CA38" end="#349838" alpha="255" />
+                        </fill>
+                    </shape>
+                </state>
+                <state name="disabledactive" from="selectedactive">
+                    <!--area>0,0,0,0</area-->
+                    <shape name="buttonbackground">
+                        <fill style="gradient">
+                            <gradient start="#888888" end="#777777" alpha="255" />
+                        </fill>
+                    </shape>
+                    <statetype name="buttoncheck">
+                        <state type="off">
+                            <imagetype name="checkoff">
+                                <grayscale>true</grayscale>
+                                <filename>lb-check-empty-grey.png</filename>
+                            </imagetype>
+                        </state>
+                        <state type="half">
+                            <imagetype name="checkhalf">
+                                <grayscale>true</grayscale>
+                                <filename>lb-check-half.png</filename>
+                            </imagetype>
+                        </state>
+                        <state type="full">
+                            <imagetype name="checkfull">
+                                <grayscale>true</grayscale>
+                                <filename>lb-check-half.png</filename>
+                            </imagetype>
+                        </state>
+                    </statetype>
+                </state>
+                <state name="disabledinactive" from="disabledactive">
+                </state>
+                <state name="selectedinactive" from="active">
+                </state>
+            </statetype>
+        </buttonlist>
+
+        <shape name="HelpBackground"> 
+            <!--area>15,600,100%-30,100</area--> 
+            <area>15,100%-140,100%-15,80</area> 
+            <type>roundbox</type> 
+            <cornerradius>10</cornerradius>
+            <fill color="#000000" alpha="30" />
+        </shape> 
+
+        <!-- optionnal, display the help for the currently selected setting -->
+        <textarea name="selectedsettinghelp" from="basetextarea">
+            <area>30,100%-120,100%-30,60</area>
+            <font>basesmall</font>
+            <multiline>yes</multiline>
+        </textarea>
+    </window>
+</mythuitheme>
