diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.cpp b/mythtv/programs/mythfrontend/audiogeneralsettings.cpp
index 1115c27..d41df4f 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,8 +70,16 @@ AudioDeviceComboBox::AudioDeviceComboBox(AudioConfigSettings *parent) :
             this, SLOT(AudioDescriptionHelp(const QString&)));
 }
 
+void AudioDeviceComboBox::edit(MythScreenType * screen)
+{
+    AudioRescan();
+    HostComboBoxSetting::edit(screen);
+}
+
 void AudioDeviceComboBox::AudioRescan()
 {
+    LOG(VB_GENERAL, LOG_ERR,
+        QString("AudioDeviceComboBox::AudioRescan()"));
     AudioOutput::ADCVect &vect = m_parent->AudioDeviceVect();
     AudioOutput::ADCVect::const_iterator it;
 
@@ -80,7 +88,7 @@ void AudioDeviceComboBox::AudioRescan()
 
     QString value = getValue();
     clearSelections();
-    resetMaxCount(vect.size());
+//TODO    resetMaxCount(vect.size());
 
     bool found = false;
     for (it = vect.begin(); it != vect.end(); ++it)
@@ -88,11 +96,11 @@ void AudioDeviceComboBox::AudioRescan()
                      value == it->name ? (found = true) : false);
     if (!found)
     {
-        resetMaxCount(vect.size()+1);
+//TODO        resetMaxCount(vect.size()+1);
         addSelection(value, value, true);
     }
         // For some reason, it adds an empty entry, remove it
-    removeSelection(QString::null);
+//TODO    removeSelection(QString::null);
 }
 
 void AudioDeviceComboBox::AudioDescriptionHelp(const QString &device)
@@ -101,29 +109,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,46 +134,48 @@ 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);
 
-    TriggeredItem *sub1 = new TriggeredItem(m_triggerDigital, m_cgsettings);
+    //m_cgsettings = new GroupSetting();
+    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);
 
-    maingroup->addChild(sub1);
+    /*TriggeredItem *sub1 = new TriggeredItem(m_triggerDigital, m_cgsettings);
 
-    maingroup->addChild((m_MaxAudioChannels = MaxAudioChannels()));
-    maingroup->addChild((m_AudioUpmix = AudioUpmix()));
-    maingroup->addChild((m_AudioUpmixType = AudioUpmixType()));
+    maingroup->addChild(sub1);*/
 
-    TransButtonSetting *test = new TransButtonSetting("test");
+    addChild((m_MaxAudioChannels = MaxAudioChannels()));
+    addChild((m_AudioUpmix = AudioUpmix()));
+    addChild((m_AudioUpmixType = AudioUpmixType()));
+    addChild(MythControlsVolume());
+
+
+    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"));
+   // GroupSetting *advanced = new AudioAdvancedSettings(/*"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);
+    //connect(advanced, SIGNAL(pressed()), this, SLOT(AudioAdvanced()));
+    addChild(advanced);*/
 
         // Set slots
     connect(m_MaxAudioChannels, SIGNAL(valueChanged(const QString&)),
@@ -200,6 +197,9 @@ AudioConfigSettings::AudioConfigSettings(ConfigurationWizard *parent) :
 
 void AudioConfigSettings::AudioRescan()
 {
+
+        LOG(VB_GENERAL, LOG_ERR,
+            QString("AudioConfigSettings::AudioRescan()"));
     if (!slotlock.tryLock())
         return;
 
@@ -260,6 +260,8 @@ void AudioConfigSettings::UpdateVisibility(const QString &device)
 AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
     const QString &device)
 {
+        LOG(VB_GENERAL, LOG_ERR,
+            QString("AudioConfigSettings::UpdateCapabilities"));
     int max_speakers = 8;
     int realmax_speakers = 8;
 
@@ -271,10 +273,15 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
         !m_AC3PassThrough  || !m_DTSPassThrough     ||
         !m_EAC3PassThrough || !m_TrueHDPassThrough  || !m_DTSHDPassThrough)
         return settings;
+        LOG(VB_GENERAL, LOG_ERR,
+            QString("AudioConfigSettings::UpdateCapabilities 2"));
 
     if (!slotlock.tryLock()) // Doing a rescan of channels
         return settings;
 
+        LOG(VB_GENERAL, LOG_ERR,
+            QString("AudioConfigSettings::UpdateCapabilities 3"));
+
     bool bAC3 = true;
     bool bDTS = true;
     bool bLPCM = true;
@@ -290,6 +297,9 @@ AudioOutputSettings AudioConfigSettings::UpdateCapabilities(
     }
     else
     {
+
+        LOG(VB_GENERAL, LOG_ERR,
+            QString("AudioConfigSettings::UpdateCapabilities 4"));
         bool bForceDigital =
             gCoreContext->GetNumSetting("PassThruDeviceOverride", false);
 
@@ -320,9 +330,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 +348,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))
@@ -399,10 +410,10 @@ void AudioConfigSettings::AudioAdvanced()
     }
 }
 
-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 +422,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 +433,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 +443,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 +454,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 +465,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 +475,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 +485,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,6 +519,117 @@ bool AudioConfigSettings::CheckPassthrough()
     return ok;
 }
 
+//TODO create a interface instead 
+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);
@@ -946,124 +1068,9 @@ AudioTestGroup::AudioTestGroup(QString main, QString passthrough,
     addChild(new AudioTest(main, passthrough, channels, settings));
 }
 
-HostCheckBox *AudioMixerSettings::MythControlsVolume()
+HostCheckBoxSetting *AudioAdvancedSettings::MPCM()
 {
-    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()
-{
-    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 +1080,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 +1090,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 +1105,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 +1116,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 +1127,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 +1148,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 +1160,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 "
@@ -1169,50 +1176,27 @@ HostCheckBox *AudioAdvancedSettings::HBRPassthrough()
 
 AudioAdvancedSettings::AudioAdvancedSettings(bool mpcm)
 {
-    ConfigurationGroup *settings3 =
-        new HorizontalConfigurationGroup(false, false);
 
     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(HBRPassthrough());
+    StandardSetting * setting = MPCM();
+    addChild(setting);
+    setting->setEnabled(mpcm);
 }
 
 AudioAdvancedSettingsGroup::AudioAdvancedSettingsGroup(bool mpcm)
 {
-    addChild(new AudioAdvancedSettings(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..b7221d6 100644
--- a/mythtv/programs/mythfrontend/audiogeneralsettings.h
+++ b/mythtv/programs/mythfrontend/audiogeneralsettings.h
@@ -12,16 +12,17 @@
 #include "audiooutput.h"
 #include "mythcontext.h"
 #include "settings.h"
+#include "standardsettings.h"
 #include "mthread.h"
 
 class AudioDeviceComboBox;
 
-class AudioConfigSettings : public VerticalConfigurationGroup
+class AudioConfigSettings : public GroupSetting
 {
     Q_OBJECT
 
   public:
-    AudioConfigSettings(ConfigurationWizard *);
+    AudioConfigSettings();
 
     typedef QMap<QString,AudioOutput::AudioDeviceConfig> ADCMap;
 
@@ -37,40 +38,47 @@ class AudioConfigSettings : public VerticalConfigurationGroup
 
   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;
+    GroupSetting  *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;
+    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;
     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,42 +86,36 @@ 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[];
-};
-
-class AudioGeneralSettings : public ConfigurationWizard
-{
-  public:
-    AudioGeneralSettings();
+    HostCheckBoxSetting *MythControlsVolume();
+    HostComboBoxSetting *MixerDevice();
+    HostComboBoxSetting *MixerControl();
+    HostSpinBoxSetting  *MixerVolume();
+    HostSpinBoxSetting  *PCMVolume();
+    static const char   *MixerControlControls[];
 };
 
-class AudioAdvancedSettings : public VerticalConfigurationGroup
+class AudioAdvancedSettings : public GroupSetting
 {
   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
diff --git a/mythtv/programs/mythfrontend/globalsettings.cpp b/mythtv/programs/mythfrontend/globalsettings.cpp
index 7e6fad3..c8062bf 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"));
@@ -102,9 +103,9 @@ static HostComboBox *DisplayRecGroup()
     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 +114,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 +125,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 +136,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 +147,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 +158,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 +168,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 +183,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 +193,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 +207,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 +218,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 +229,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 +240,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
+*/
+void RecordingProfile_fillSelections(MythUIComboBoxSetting *setting, int group,
+                                      bool foldautodetect)
 {
-    GlobalComboBox *bc = new GlobalComboBox("DefaultTranscoder");
+    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()
+{
+    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 +328,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 +344,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 +354,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 +364,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 +376,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 +388,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 +400,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 +411,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 +422,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 +433,23 @@ static GlobalCheckBox *DeletedFifoOrder()
     return cb;
 };
 
-class DeletedExpireOptions : public TriggeredConfigurationGroup
-{
-    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));
-         };
-};
+static GlobalCheckBoxSetting *AutoExpireInsteadOfDelete()
+{
+    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 +461,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 +472,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 +483,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 +494,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 +521,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 +532,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 +545,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 +557,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 +584,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 +597,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;
@@ -1248,8 +1294,24 @@ void PlaybackProfileConfigs::triggerChanged(const QString &trig)
 {
     TriggeredConfigurationGroup::triggerChanged(trig);
 }
+/*
+class PlaybackProfileConfigsButton : public StandardSetting, public TransientStorage
+{
+  public:
+    PlaybackProfileConfigsButton():StandardSetting(),TransientStorage()
+    {
+        setLabel()
+        
+    };
 
-static HostComboBox *PlayBoxOrdering()
+    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 HostComboBoxSetting *PlayBoxOrdering()
 {
     QString str[4] =
     {
@@ -1264,7 +1326,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 +1338,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 +1350,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 +1363,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 +1376,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 +1410,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 +1420,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 +1437,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 +1452,18 @@ 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);
     gs->setLabel(QObject::tr("Vertical scaling"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1410,9 +1472,9 @@ 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);
     gs->setLabel(QObject::tr("Horizontal scaling"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1421,27 +1483,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 +1513,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 +1526,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 +1539,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 +1551,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 +1563,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 +1576,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 +1588,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 +1601,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 +1617,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 +1628,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 +1642,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 +1655,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 +1668,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 +1705,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 +1716,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 +1733,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 +1745,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 +1757,9 @@ static HostLineEdit *HaltCommand()
     return ge;
 }
 
-static HostLineEdit *LircDaemonDevice()
+static HostTextEditSetting *LircDaemonDevice()
 {
-    HostLineEdit *ge = new HostLineEdit("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 +1774,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 +1794,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 +1805,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 +1820,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 +1833,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 +1848,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 +1861,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 +1879,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 +1890,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 +1901,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 +1911,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 +1945,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 +1956,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 +2011,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 +2020,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 +2037,52 @@ static HostComboBox *TVVidModeResolution(int idx=-1)
     return gc;
 }
 
-static HostRefreshRateComboBox *TVVidModeRefreshRate(int idx=-1)
+
+void HostRefreshRateComboBoxSetting::ChangeResolution(const QString& resolution)
+{
+    clearSelections();
+
+    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 +2092,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 +2110,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 +2124,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(const QString&)),
+                m_rate, SLOT(ChangeResolution(const QString&)));
+   }
+  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(const QString&)),
+                        m_rate, SLOT(ChangeResolution(const QString&)));
+    }
+  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 +2202,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 +2235,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 +2250,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 +2260,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 +2273,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 +2314,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 +2353,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 +2373,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 +2387,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 +2401,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 +2412,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 +2436,21 @@ static HostComboBox *ChannelGroupDefault()
     return gc;
 }
 
-static HostCheckBox *BrowseChannelGroup()
+static HostCheckBoxSetting *ChannelGroupRememberLast()
 {
-    HostCheckBox *gc = new HostCheckBox("BrowseChannelGroup");
+    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()
+{
+    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 +2460,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 +2475,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 +2490,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 +2505,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 +2520,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 +2531,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 +2541,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 +2551,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 +2563,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 +2574,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 +2585,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 +2597,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 +2609,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 +2620,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 +2631,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 +2642,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 +2653,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 +2664,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 +2675,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 +2687,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 +2698,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 +2708,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 +2719,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 +2743,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 +2766,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 +2783,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 +2794,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 +2806,22 @@ static HostLineEdit *UDPNotifyPort()
     return ge;
 }
 
-static HostCheckBox *RealtimePriority()
+static HostCheckBoxSetting *NetworkControlEnabled()
+{
+    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()
 {
-    HostCheckBox *gc = new HostCheckBox("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 +2831,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 +2842,22 @@ 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("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);
+    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 +2868,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 +2879,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 +2891,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 +2903,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 +2916,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 +2952,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 +2971,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 +2981,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 +2991,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 +3010,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 +3029,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 +3060,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 +3096,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 +3107,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 +3120,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 +3133,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 +3144,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 +3171,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,111 +3182,77 @@ 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."));
-    return gc;
-}
 
-static HostSpinBox *MacDesktopSkip()
-{
-    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;
-}
+    gc->addTarget("1", MacDesktopSkip());
 
-class MacDesktopSettings : public TriggeredConfigurationGroup
-{
-  public:
-    MacDesktopSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video on the desktop"));
-        setUseLabel(false);
-        Setting *gc = MacDesktopEnabled();
-        addChild(gc);
-        setTrigger(gc);
+    return gc;
+}
 
-        Setting *skip = MacDesktopSkip();
-        addTarget("1", skip);
-        addTarget("0", new HorizontalConfigurationGroup(false, false));
-    }
-};
 #endif
 
-static HostCheckBox *WatchTVGuide()
+static HostCheckBoxSetting *WatchTVGuide()
 {
-    HostCheckBox *gc = new HostCheckBox("WatchTVGuide");
+    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."));
@@ -3255,204 +3260,366 @@ static HostCheckBox *WatchTVGuide()
     return gc;
 }
 
+
+/* This code is a duplication the clas DatabaseSettings. As it it also use bymythbackend I rewrote here for the time being */
+
+class DatabaseGroupSetting : public GroupSetting
+{
+  public:
+    DatabaseGroupSetting(const QString &DBhostOverride = QString::null):GroupSetting()
+    {
+        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;
+};
+
+/* end of duplicated code form DatabaseSettings */
+
 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);
+    GroupSetting *media = new GroupSetting();
     media->setLabel(QObject::tr("Media Monitor"));
-    MythMediaSettings *mediaMon = new MythMediaSettings();
-    media->addChild(mediaMon);
+    media->addChild(EnableMediaMon());
     addChild(media);
 
-    VerticalConfigurationGroup *shutdownSettings =
-        new VerticalConfigurationGroup(true, true, false, false);
+    GroupSetting *shutdownSettings = new GroupSetting();
     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);
+    GroupSetting *remotecontrol = new GroupSetting();
     remotecontrol->setLabel(QObject::tr("Remote Control"));
     remotecontrol->addChild(LircDaemonDevice());
     remotecontrol->addChild(NetworkControlEnabled());
-    remotecontrol->addChild(NetworkControlPort());
-    remotecontrol->addChild(UDPNotifyPort());
     addChild(remotecontrol);
 }
 
-PlaybackSettings::PlaybackSettings()
+void MainGeneralSettings::applyChange()
 {
-    uint i = 0, total = 8;
-#if CONFIG_DARWIN
-    total += 2;
-#endif // USING_DARWIN
-
-
-    VerticalConfigurationGroup* general1 =
-        new VerticalConfigurationGroup(false);
-    general1->setLabel(QObject::tr("General Playback") +
-                      QString(" (%1/%2)").arg(++i).arg(total));
-
-    HorizontalConfigurationGroup *columns =
-        new HorizontalConfigurationGroup(false, false, true, true);
-
-    VerticalConfigurationGroup *column1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    column1->addChild(RealtimePriority());
-    column1->addChild(DecodeExtraAudio());
-    column1->addChild(JumpToProgramOSD());
-    columns->addChild(column1);
+    QStringList strlist( QString("REFRESH_BACKEND") );
+    gCoreContext->SendReceiveStringList(strlist);
+}
 
-    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);
+PlaybackSettings::PlaybackSettings()
+{
+    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());
+
+    GroupSetting* oscan = new GroupSetting();
+    oscan->setLabel(QObject::tr("Scaling"));
+    oscan->addChild(VertScanPercentage());
+    oscan->addChild(YScanDisplacement());
+    oscan->addChild(HorizScanPercentage());
+    oscan->addChild(XScanDisplacement());
+    general->addChild(oscan);
+
+    GroupSetting* aspect_fill = new GroupSetting();
+    aspect_fill->setLabel(QObject::tr("Aspect ratio & Zoom"));
     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);
-
+    general->addChild(aspect_fill);
+    general->addChild(LetterboxingColour());
+    general->addChild(PIPLocationComboBox());
+    general->addChild(PlaybackExitPrompt());
+    general->addChild(EndOfRecordingExitPrompt());
+    addChild(general);
+/*TODO
     QString tmp = QString(" (%1/%2)").arg(++i).arg(total);
     addChild(new PlaybackProfileConfigs(tmp));
+*/
+
+    //addChild(new PlaybackProfileConfigsButton());
 
-    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 Gloabal 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,41 +3634,28 @@ OSDSettings::OSDSettings()
 
 GeneralSettings::GeneralSettings()
 {
-    VerticalConfigurationGroup* general = new VerticalConfigurationGroup(false);
+    GroupSetting* general = new GroupSetting();
     general->setLabel(QObject::tr("General (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);
+    GroupSetting* autoexp = new GroupSetting();
     autoexp->setLabel(QObject::tr("General (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);
+    GroupSetting* jobs = new GroupSetting();
     jobs->setLabel(QObject::tr("General (Jobs)"));
     jobs->addChild(CommercialSkipMethod());
     jobs->addChild(CommFlagFast());
@@ -3509,57 +3663,46 @@ GeneralSettings::GeneralSettings()
     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);
+    GroupSetting* general2 = new GroupSetting();
     general2->setLabel(QObject::tr("General (Advanced)"));
     general2->addChild(RecordPreRoll());
     general2->addChild(RecordOverTime());
     general2->addChild(CategoryOverTimeSettings());
     addChild(general2);
 
-    VerticalConfigurationGroup* changrp = new VerticalConfigurationGroup(false);
+    GroupSetting* changrp = new GroupSetting();
     changrp->setLabel(QObject::tr("General (Channel Groups)"));
-    ChannelGroupSettings *changroupsettings = new ChannelGroupSettings();
-    changrp->addChild(changroupsettings);
+    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 +3715,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 +3725,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());
@@ -3597,8 +3740,9 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
 
 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 +3755,28 @@ 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);
+    GroupSetting *guiDimension =
+        new GroupSetting();
+    guiDimension->setLabel(QObject::tr("Gui dimension"));
+    //TODO display an helpfull value such as 640x480+10+2
 
-    columns->addChild(column1);
-    columns->addChild(column2);
+    guiDimension->addChild(GuiWidth());
+    guiDimension->addChild(GuiHeight());
+    guiDimension->addChild(GuiOffsetX());
+    guiDimension->addChild(GuiOffsetY());
+    screen->addChild(guiDimension);
 
-    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 +3786,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..68736f7 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(const QString& resolution);
+
+  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();
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..901f121
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.cpp
@@ -0,0 +1,665 @@
+#include "standardsettings.h"
+#include <QCoreApplication>
+
+#include <mythcontext.h>
+#include <mythmainwindow.h>
+#include <mythdialogbox.h>
+#include <mythuispinbox.h>
+#include <mythuitext.h>
+#include <mythuibutton.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(settingValue);
+    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)
+{
+
+/*    Storage *s = GetStorage();
+    if (s)s->Load();*/
+
+    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()
+{
+}
+
+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());
+}
+
+
+/*******************************************************************************
+                            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;
+    }
+}
+
+/*******************************************************************************
+                            ComboBoxSetting
+********************************************************************************/
+//TODO do something when rw=true
+MythUIComboBoxSetting::MythUIComboBoxSetting(Storage *_storage, bool rw):
+    StandardSetting(_storage)
+{
+}
+
+MythUIComboBoxSetting::~MythUIComboBoxSetting()
+{
+    m_labels.clear();
+    m_values.clear();
+}
+
+void MythUIComboBoxSetting::setValue(int value)
+{
+    if (value>=0 && value < m_values.size())
+            //Why does the polymorphism does not work here
+            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)
+    {
+        //Why does the polymorphism does not work here
+        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())
+    {
+        //Why does the polymorphism does not work here
+        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)
+{
+}
+
+void MythUISpinBoxSetting::setValue(int value)
+{
+    StandardSetting::setValue(QString::number(value));
+}
+
+int MythUISpinBoxSetting::intValue()
+{
+    return settingValue.toInt();
+}
+
+void MythUISpinBoxSetting::edit(MythScreenType * screen)
+{
+    if (!isEnabled())return;
+    //TODO use a correct dialog with a spin box
+    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 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)
+    {
+        if (m_selectedSettingHelp)
+            m_selectedSettingHelp->SetText(setting->getHelpText());
+    }
+}
+
+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)
+{
+
+    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_groupHelp) m_groupHelp->SetText(m_currentGroupSetting->getHelpText());
+    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..005274b
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.h
@@ -0,0 +1,370 @@
+#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);
+};
+
+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
+    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(const QString&);
+    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 cannont 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 cannont think of a work around
+    virtual void Load(){MythUITextEditSetting::Load();HostDBStorage::Load();}
+    virtual void Save(){MythUITextEditSetting::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 cannont 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 cannont 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 cannont 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 cannont 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 cannont 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 cannont 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);
+};
+
+/*******************************************************************************
+*                            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..55bd18d 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,9 @@ HostCheckBox *VideoAggressivePC()
     return gc;
 }
 
-HostLineEdit *VideoStartupDirectory()
+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,9 +89,9 @@ HostLineEdit *VideoStartupDirectory()
     return gc;
 }
 
-HostLineEdit *VideoArtworkDirectory()
+HostTextEditSetting *VideoArtworkDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoArtworkDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("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 "
@@ -98,9 +100,9 @@ HostLineEdit *VideoArtworkDirectory()
     return gc;
 }
 
-HostLineEdit *VideoScreenshotDirectory()
+HostTextEditSetting *VideoScreenshotDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.screenshotDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("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 "
@@ -109,9 +111,9 @@ HostLineEdit *VideoScreenshotDirectory()
     return gc;
 }
 
-HostLineEdit *VideoBannerDirectory()
+HostTextEditSetting *VideoBannerDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.bannerDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("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 "
@@ -120,9 +122,9 @@ HostLineEdit *VideoBannerDirectory()
     return gc;
 }
 
-HostLineEdit *VideoFanartDirectory()
+HostTextEditSetting *VideoFanartDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.fanartDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("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 "
@@ -131,9 +133,9 @@ HostLineEdit *VideoFanartDirectory()
     return gc;
 }
 
-HostLineEdit *TrailerDirectory()
+HostTextEditSetting *TrailerDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.TrailersDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("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 "
@@ -148,9 +150,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 +162,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 +172,89 @@ 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
-{
-    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->()
-    {
-        return m_vc_page;
-    }
 
-  private:
-    VerticalConfigurationGroup *m_vc_page;
-};
 
-class RatingsToPL : public TriggeredConfigurationGroup
+HostCheckBoxSetting *RatingsToPL()
 {
-  public:
-    RatingsToPL() : TriggeredConfigurationGroup(false)
+    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)
     {
-        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"));
+
+    setHelpText(QObject::tr("TODO add a descrition for this group of 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->setHelpText(QObject::tr("TODO add a description for this group of setting"));
     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>
