diff --git a/mythtv/programs/mythfrontend/globalsettings.cpp b/mythtv/programs/mythfrontend/globalsettings.cpp
index 7e6fad3..aa01e7a 100644
--- a/mythtv/programs/mythfrontend/globalsettings.cpp
+++ b/mythtv/programs/mythfrontend/globalsettings.cpp
@@ -167,9 +167,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 +182,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 "
@@ -206,9 +206,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 +217,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 +228,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 +239,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 +327,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 +343,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. "
@@ -334,9 +399,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 +410,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 +421,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,7 +432,22 @@ static GlobalCheckBox *DeletedFifoOrder()
     return cb;
 };
 
-class DeletedExpireOptions : public TriggeredConfigurationGroup
+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."));
+
+    cb->addTargetedChild("1",DeletedFifoOrder());
+    cb->addTargetedChild("1",DeletedMaxAge());
+    return cb;
+}
+/*
+
+static DeletedExpireOptions : public TriggeredConfigurationGroup
 {
     public:
      DeletedExpireOptions() :
@@ -399,10 +468,11 @@ class DeletedExpireOptions : public TriggeredConfigurationGroup
              addTarget("0", new HorizontalConfigurationGroup(true));
          };
 };
+*/
 
-static GlobalComboBox *AutoExpireMethod()
+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 +484,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 +495,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 +506,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 +517,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 +544,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 +555,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 +568,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 +580,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 +607,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 +620,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;
@@ -1348,9 +1417,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 +1427,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 +1444,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,9 +1459,9 @@ 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");
@@ -1439,9 +1508,9 @@ static HostSpinBox *YScanDisplacement()
     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 +1520,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 +1533,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 +1546,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 +1558,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 +1570,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(
@@ -1643,9 +1712,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 +1723,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 +1740,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 +1752,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 +1764,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 +1781,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 +1801,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 "
@@ -2219,9 +2288,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 +2302,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 +2316,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 +2327,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 +2351,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,28 +2375,6 @@ 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()
@@ -2563,9 +2613,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 +2623,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 "
@@ -2648,19 +2698,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 +2709,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,6 +2721,19 @@ static HostLineEdit *UDPNotifyPort()
     return ge;
 }
 
+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 HostCheckBox *RealtimePriority()
 {
     HostCheckBox *gc = new HostCheckBox("RealtimePriority");
@@ -2692,21 +2746,9 @@ static HostCheckBox *RealtimePriority()
     return gc;
 }
 
-static HostCheckBox *EnableMediaMon()
+static HostTextEditSetting *IgnoreMedia()
 {
-    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()
-{
-    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,28 +2757,18 @@ 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()
 {
@@ -3245,9 +3277,9 @@ class MacDesktopSettings : public TriggeredConfigurationGroup
 };
 #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,46 +3287,243 @@ 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"));
 
-    VerticalConfigurationGroup *pin =
-        new VerticalConfigurationGroup(false, true, false, false);
+    addChild(new DatabaseGroupSetting());
+
+    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);
 }
 
@@ -3440,19 +3669,17 @@ PlaybackSettings::PlaybackSettings()
 
 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 +3694,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,52 +3723,41 @@ 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()
diff --git a/mythtv/programs/mythfrontend/globalsettings.h b/mythtv/programs/mythfrontend/globalsettings.h
index 93e774a..efdd110 100644
--- a/mythtv/programs/mythfrontend/globalsettings.h
+++ b/mythtv/programs/mythfrontend/globalsettings.h
@@ -7,6 +7,7 @@
 #include "settings.h"
 #include "mythcontext.h"
 #include "videodisplayprofile.h"
+#include "standardsettings.h"
 
 #include <QMutex>
 
@@ -18,19 +19,21 @@ class PlaybackSettings : public ConfigurationWizard
     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();
@@ -42,7 +45,7 @@ class AppearanceSettings : public ConfigurationWizard
     AppearanceSettings();
 };
 
-class MainGeneralSettings : public ConfigurationWizard
+class MainGeneralSettings : public GroupSetting
 {
   public:
     MainGeneralSettings();
diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp
index 259e020..173ddec 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
             {
@@ -898,8 +906,16 @@ 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")
     {
@@ -908,10 +924,18 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     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;
+        /*TODO QStringList strlist( QString("REFRESH_BACKEND") );
+        gCoreContext->SendReceiveStringList(strlist);*/
     }
     else if (sel == "settings playback")
     {
@@ -920,13 +944,29 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     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")
     {
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..d4e61a3
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.cpp
@@ -0,0 +1,639 @@
+#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"
+
+
+MythUIButtonListItem * NewConfigurable::createButton(MythUIButtonList * list)
+{
+    MythUIButtonListItem *item = new MythUIButtonListItem(list, label);
+    updateButton(item);
+    return item;
+}
+
+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();
+}
+
+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->SetText(label);
+    item->SetText(settingValue,"value");
+    item->setDrawArrow (haveSubSettings());
+    item->SetData(qVariantFromValue(this));
+
+}
+
+void StandardSetting::addTargetedChild(const QString &value, StandardSetting * setting)
+{
+    m_targets[value].append(setting);
+    setting->setParent(this);
+}
+
+
+QList<StandardSetting *> *StandardSetting::getSubSettings()
+{
+    if (settingValue.isEmpty())
+        return &m_children;
+    else if (m_targets.contains(settingValue))
+        return &m_targets[settingValue];
+    return NULL;
+}
+
+bool StandardSetting::haveSubSettings()
+{
+    QList<StandardSetting *> * subSettings=getSubSettings();
+    return (subSettings!=NULL && subSettings->size()>0);
+}
+
+void StandardSetting::setValue(const QString &newValue)
+{
+    settingValue = newValue;
+    emit valueChanged(settingValue);
+}
+
+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()
+{
+}
+
+bool GroupSetting::edit(MythScreenType * screen)
+{
+    DialogCompletionEvent *dce =
+            new DialogCompletionEvent("leveldown", 0, "", "");
+    QCoreApplication::postEvent(screen, dce);
+    return true;
+}
+
+
+/*******************************************************************************
+                            Text Setting
+********************************************************************************/
+
+MythUITextEditSetting::MythUITextEditSetting(Storage *_storage):
+    StandardSetting(_storage)
+{
+}
+
+bool MythUITextEditSetting::edit(MythScreenType * screen)
+{
+
+    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);
+        return true;
+    }
+    return false;
+};
+
+void MythUITextEditSetting::resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item)
+{
+    if (settingValue!=dce->GetResultText())
+    {
+        setValue(dce->GetResultText());
+        m_haveChanged=true;
+        this->updateButton(item);
+    }
+}
+
+/*******************************************************************************
+                            ComboBoxSetting
+********************************************************************************/
+
+MythUIComboBoxSetting::MythUIComboBoxSetting(Storage *_storage):
+    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::updateButton(MythUIButtonListItem *item)
+{
+    item->SetText(label);
+    int indexValue = m_values.indexOf(settingValue);
+    if (indexValue >=0)
+        item->SetText(m_labels.value(indexValue),"value");
+    else
+        item->SetText("","value");
+    item->setDrawArrow (haveSubSettings());
+    item->SetData(qVariantFromValue((StandardSetting*)this));
+
+}
+
+bool MythUIComboBoxSetting::edit(MythScreenType * screen)
+{
+    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);
+    }
+
+    return true;
+}
+
+void MythUIComboBoxSetting::resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item)
+{
+    if (dce->GetResult()!=-1 && settingValue!=dce->GetData().toString())
+    {
+        //Why does the polymorphism does not work here
+        StandardSetting::setValue(dce->GetData().toString());
+        m_haveChanged=true;
+        updateButton(item);
+    }
+}
+
+
+/*******************************************************************************
+                            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();
+}
+
+bool MythUISpinBoxSetting::edit(MythScreenType * screen)
+{
+    //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);
+        return true;
+    }
+    return false;
+};
+
+void MythUISpinBoxSetting::resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item)
+{
+    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;
+            this->updateButton(item);
+        }
+    }
+}
+
+/*******************************************************************************
+                           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);
+    if (settingValue=="1")
+        item->setChecked(MythUIButtonListItem::FullChecked);
+    else
+        item->setChecked(MythUIButtonListItem::NotChecked);
+    item->setDrawArrow(haveSubSettings());
+    item->SetData(qVariantFromValue((StandardSetting*)this));
+
+}
+
+bool MythUICheckBoxSetting::edit(MythScreenType * screen)
+{
+    DialogCompletionEvent *dce =
+            new DialogCompletionEvent("editsetting", 0, "", "");
+    QCoreApplication::postEvent(screen, dce);
+    return true;
+
+}
+
+void MythUICheckBoxSetting::resultEdit(DialogCompletionEvent *dce, 
+    MythUIButtonListItem *item)
+{
+    setValue(!boolValue());
+    m_haveChanged=true;
+    updateButton(item);
+}
+
+/*******************************************************************************
+                           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, item);
+                    ss->updateButton(item);
+                }
+            }
+        }
+        else if (resultid == "exit")
+        {
+            int buttonnum = dce->GetResult();
+            if (buttonnum == 0)
+            {
+                Save();
+                MythScreenType::Close();
+            }
+            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())
+            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")
+        {
+            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..83aaba3
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.h
@@ -0,0 +1,380 @@
+#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 MPUBLIC NewConfigurable : public QObject
+{
+    Q_OBJECT
+
+  public:
+    MythUIButtonListItem * createButton(MythUIButtonList * list);
+
+    virtual void updateButton(MythUIButtonListItem *item)=0;
+/*
+    virtual QWidget* configWidget(ConfigurationGroup *cg, QWidget* parent,
+                                  const char* widgetName = 0);
+    virtual void widgetInvalid(QObject*) { }*/
+
+    // A name for looking up the setting
+    /*void setName(QString str) {
+        configName = str;
+        if (label == QString::null)
+            setLabel(str);
+    };
+    QString getName(void) const { return configName; };
+    virtual StandardSetting* byName(const QString &name) = 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) { visible = b; };
+    bool isVisible(void) const { return visible; };
+
+    virtual void setEnabled(bool b) { enabled = b; }
+    bool isEnabled() { return enabled; }*/
+
+    Storage *GetStorage(void) { return storage; }
+
+  public slots:
+    /*virtual void enableOnSet(const QString &val);
+    virtual void enableOnUnset(const QString &val);
+    virtual void widgetDeleted(QObject *obj);*/
+
+  protected:
+    NewConfigurable(Storage *_storage) :
+        /*enabled(true), */storage(_storage),
+        /*configName(""), */label(""), helptext("")/*, visible(true)*/ { }
+    virtual ~NewConfigurable() { }
+
+  protected:
+    /*bool enabled;*/
+    Storage *storage;
+    /*QString configName;*/
+    QString label;
+    QString helptext;
+    /*bool 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);
+
+    // non-const Gets
+    /*virtual StandardSetting *byName(const QString &name)
+        { return (name == configName) ? this : NULL; }*/
+
+    // StorageUser
+    void SetDBValue(const QString &val) { setValue(val); }
+    QString GetDBValue(void) const { return getValue(); }
+
+    //added by xavier
+    //subsettings
+    void addChild(StandardSetting *child);
+    virtual QList<StandardSetting *> *getSubSettings();
+    virtual bool haveSubSettings();
+
+    StandardSetting * getParent();
+    virtual bool edit(MythScreenType * screen)=0;
+    virtual void resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item)=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&);
+
+  protected:
+    StandardSetting(Storage *_storage);
+    virtual ~StandardSetting();
+
+  protected:
+    void setParent(StandardSetting *parent);
+    QString settingValue;
+    void LoadChildren(void);
+    void SaveChildren(void);
+    bool m_haveChanged;
+  private:
+    //added by xavier
+    StandardSetting * m_parent;
+
+    QList<StandardSetting *> m_children;
+    QMap<QString, QList<StandardSetting *> > m_targets;
+    //added by xavier end
+};
+
+Q_DECLARE_METATYPE(StandardSetting *);
+
+
+/*******************************************************************************
+*                           TextEdit Setting                                   *
+*******************************************************************************/
+
+
+class MPUBLIC MythUITextEditSetting : public StandardSetting
+{
+  public:
+    virtual void resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item);
+    virtual bool 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                                   *
+*******************************************************************************/
+
+class MPUBLIC MythUIComboBoxSetting : public StandardSetting
+{
+  public:
+    void setValue(int value);
+    virtual void resultEdit(DialogCompletionEvent *dce, MythUIButtonListItem *item);
+    virtual bool edit(MythScreenType * screen);
+    void addSelection(const QString &label, QString value = QString::null, bool select = false);
+    virtual void updateButton(MythUIButtonListItem *item);
+  protected:
+    MythUIComboBoxSetting (Storage *_storage);
+    ~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) :
+        MythUIComboBoxSetting(this), 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) :
+        MythUIComboBoxSetting(this), 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, MythUIButtonListItem *item);
+    virtual bool 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, MythUIButtonListItem *item);
+    virtual bool 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();/*:StandardSetting(this), NoStorage(){};*/
+
+    virtual void Load(void){StandardSetting::Load();};
+    virtual void Save(void){StandardSetting::Save();};
+    virtual bool edit(MythScreenType * screen);
+    virtual void resultEdit(DialogCompletionEvent *dce, 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;
+};
+
+
+
+#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..f683cfe
--- /dev/null
+++ b/mythtv/themes/default-wide/standardsetting-ui.xml
@@ -0,0 +1,88 @@
+<?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>vertical</layout>
+            <spacing>4</spacing>
+            <wrapstyle>selection</wrapstyle>
+            <statetype name="buttonitem">
+                <area>0,0,100%,25</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>
+                    <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%-40,30</area>
+                        <font>basesmall</font>
+                        <cutdown>yes</cutdown>
+                        <align>right,vcenter</align>
+                    </textarea>
+                    <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="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>
