diff --git a/mythtv/programs/mythfrontend/globalsettings.cpp b/mythtv/programs/mythfrontend/globalsettings.cpp
index a379b8f..883e894 100644
--- a/mythtv/programs/mythfrontend/globalsettings.cpp
+++ b/mythtv/programs/mythfrontend/globalsettings.cpp
@@ -24,7 +24,7 @@
 #include "mythcorecontext.h"
 #include "mythdbcon.h"
 #include "mythlogging.h"
-#include "dbsettings.h"
+//#include "dbsettings.h"
 #include "mythtranslation.h"
 #include "iso639.h"
 #include "playbackbox.h"
@@ -39,9 +39,216 @@
 #include "mythdirs.h"
 #include "mythuihelper.h"
 
-static HostCheckBox *DecodeExtraAudio()
+/* This class have been copied from settingdb.h/.cpp and modified
+ I believe this is also used by mythtv-setup so
+I did not want to break it by modifying the original*/
+class MythDbSettings: public GroupSetting {
+public:
+    MythDbSettings();
+
+    void Load(void);
+    void Save(void);
+
+protected:
+    TransTextualSetting *dbHostName;
+    TransBoolSetting    *dbHostPing;
+    TransTextualSetting *dbPort;
+    TransTextualSetting *dbName;
+    TransTextualSetting *dbUserName;
+    TransTextualSetting *dbPassword;
+    TransBoolSetting    *localEnabled;
+    TransTextualSetting *localHostName;
+    TransBoolSetting    *wolEnabled;
+    TransRangeSetting   *wolReconnect;
+    TransRangeSetting   *wolRetry;
+    TransTextualSetting *wolCommand;
+}; 
+
+
+
+MythDbSettings::MythDbSettings() :
+    GroupSetting()
 {
-    HostCheckBox *gc = new HostCheckBox("DecodeExtraAudio");
+
+    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."));
+
+    GroupSetting* dbServer = new GroupSetting();
+    dbServer->setLabel(QObject::tr("Database Server Settings"));
+    dbHostName = new TransTextualSetting();
+    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."));
+    dbServer->addChild(dbHostName);
+
+
+    dbHostPing = new TransBoolSetting();
+    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"));
+    dbServer->addChild(dbHostPing);
+
+
+    dbPort = new TransTextualSetting();
+    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)."));
+    dbServer->addChild(dbPort);
+
+    dbName = new TransTextualSetting();
+    dbName->setLabel(QObject::tr("Database name"));
+    dbName->setHelpText(QObject::tr("The name of the database. "
+                                    "This information is required."));
+    dbServer->addChild(dbName);
+
+    dbUserName = new TransTextualSetting();
+    dbUserName->setLabel(QObject::tr("User"));
+    dbUserName->setHelpText(QObject::tr("The user name to use while "
+                                        "connecting to the database. "
+                                        "This information is required."));
+    dbServer->addChild(dbUserName);
+
+    dbPassword = new TransTextualSetting();
+    dbPassword->setLabel(QObject::tr("Password"));
+    dbPassword->setHelpText(QObject::tr("The password to use while "
+                                        "connecting to the database. "
+                                        "This information is required."));
+    dbServer->addChild(dbPassword);
+
+    addChild(dbServer);
+
+    localEnabled = new TransBoolSetting();
+    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."));
+
+    localHostName = new TransTextualSetting(true);
+    localHostName->setLabel(QObject::tr("Custom identifier"));
+    localHostName->setHelpText(QObject::tr("An identifier to use while "
+                                           "saving the settings for this "
+                                           "frontend."));
+    localEnabled->addChild(true, localHostName);
+
+    wolEnabled = new TransBoolSetting();
+    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."));
+
+    wolReconnect = new TransRangeSetting(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->addChild(true, wolReconnect);
+
+    wolRetry = new TransRangeSetting(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->addChild(true, wolReconnect);
+
+    wolCommand = new TransTextualSetting(true);
+    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->addChild(true, wolCommand);
+
+    addChild(wolEnabled);
+}
+
+void MythDbSettings::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());
+//TODO?        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);
+}
+
+void MythDbSettings::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);
+}
+
+static HostBoolSetting *DecodeExtraAudio()
+{
+    HostBoolSetting *gc = new HostBoolSetting("DecodeExtraAudio");
     gc->setLabel(QObject::tr("Extra audio buffering"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("Enable this setting if MythTV is playing "
@@ -53,9 +260,9 @@ static HostCheckBox *DecodeExtraAudio()
     return gc;
 }
 
-static HostComboBox *PIPLocationComboBox()
+static HostListSetting *PIPLocationComboBox()
 {
-    HostComboBox *gc = new HostComboBox("PIPLocation");
+    HostListSetting *gc = new HostListSetting("PIPLocation");
     gc->setLabel(QObject::tr("PIP video location"));
     for (uint loc = 0; loc < kPIP_END; ++loc)
         gc->addSelection(toString((PIPLocation) loc), QString::number(loc));
@@ -63,9 +270,9 @@ static HostComboBox *PIPLocationComboBox()
     return gc;
 }
 
-static HostComboBox *DisplayRecGroup()
+static HostListSetting *DisplayRecGroup()
 {
-    HostComboBox *gc = new HostComboBox("DisplayRecGroup");
+    HostListSetting *gc = new HostListSetting("DisplayRecGroup");
     gc->setLabel(QObject::tr("Default group filter to apply"));
 
     gc->addSelection(QObject::tr("All Programs"), QString("All Programs"));
@@ -102,9 +309,9 @@ static HostComboBox *DisplayRecGroup()
     return gc;
 }
 
-static HostCheckBox *QueryInitialFilter()
+static HostBoolSetting *QueryInitialFilter()
 {
-    HostCheckBox *gc = new HostCheckBox("QueryInitialFilter");
+    HostBoolSetting *gc = new HostBoolSetting("QueryInitialFilter");
     gc->setLabel(QObject::tr("Always prompt for initial group filter"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, always prompt the user for the "
@@ -113,9 +320,9 @@ static HostCheckBox *QueryInitialFilter()
     return gc;
 }
 
-static HostCheckBox *RememberRecGroup()
+static HostBoolSetting *RememberRecGroup()
 {
-    HostCheckBox *gc = new HostCheckBox("RememberRecGroup");
+    HostBoolSetting *gc = new HostBoolSetting("RememberRecGroup");
     gc->setLabel(QObject::tr("Save current group filter when changed"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, remember the last selected filter "
@@ -124,9 +331,9 @@ static HostCheckBox *RememberRecGroup()
     return gc;
 }
 
-static HostCheckBox *UseGroupNameAsAllPrograms()
+static HostBoolSetting *UseGroupNameAsAllPrograms()
 {
-    HostCheckBox *gc = new HostCheckBox("DispRecGroupAsAllProg");
+    HostBoolSetting *gc = new HostBoolSetting("DispRecGroupAsAllProg");
     gc->setLabel(QObject::tr("Show filter name instead of \"All Programs\""));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, use the name of the display "
@@ -135,9 +342,9 @@ static HostCheckBox *UseGroupNameAsAllPrograms()
     return gc;
 }
 
-static HostCheckBox *PBBStartInTitle()
+static HostBoolSetting *PBBStartInTitle()
 {
-    HostCheckBox *gc = new HostCheckBox("PlaybackBoxStartInTitle");
+    HostBoolSetting *gc = new HostBoolSetting("PlaybackBoxStartInTitle");
     gc->setLabel(QObject::tr("Start in group list"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, the focus will "
@@ -146,9 +353,9 @@ static HostCheckBox *PBBStartInTitle()
     return gc;
 }
 
-static HostCheckBox *SmartForward()
+static HostBoolSetting *SmartForward()
 {
-    HostCheckBox *gc = new HostCheckBox("SmartForward");
+    HostBoolSetting *gc = new HostBoolSetting("SmartForward");
     gc->setLabel(QObject::tr("Smart fast forwarding"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, then immediately after "
@@ -157,9 +364,9 @@ static HostCheckBox *SmartForward()
     return gc;
 }
 
-static HostCheckBox *ExactSeeking()
+static HostBoolSetting *ExactSeeking()
 {
-    HostCheckBox *gc = new HostCheckBox("ExactSeeking");
+    HostBoolSetting *gc = new HostBoolSetting("ExactSeeking");
     gc->setLabel(QObject::tr("Seek to exact frame"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, seeking is frame exact, but "
@@ -167,9 +374,9 @@ static HostCheckBox *ExactSeeking()
     return gc;
 }
 
-static GlobalComboBox *CommercialSkipMethod()
+static GlobalListSetting *CommercialSkipMethod()
 {
-    GlobalComboBox *bc = new GlobalComboBox("CommercialSkipMethod");
+    GlobalListSetting *bc = new GlobalListSetting("CommercialSkipMethod");
     bc->setLabel(QObject::tr("Commercial detection method"));
     bc->setHelpText(QObject::tr(
                         "This determines the method used by MythTV to "
@@ -182,9 +389,9 @@ static GlobalComboBox *CommercialSkipMethod()
     return bc;
 }
 
-static GlobalCheckBox *CommFlagFast()
+static GlobalBoolSetting *CommFlagFast()
 {
-    GlobalCheckBox *gc = new GlobalCheckBox("CommFlagFast");
+    GlobalBoolSetting *gc = new GlobalBoolSetting("CommFlagFast");
     gc->setLabel(QObject::tr("Enable experimental speedup of commercial detection"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, experimental commercial detection "
@@ -192,9 +399,9 @@ static GlobalCheckBox *CommFlagFast()
     return gc;
 }
 
-static HostComboBox *AutoCommercialSkip()
+static HostListSetting *AutoCommercialSkip()
 {
-    HostComboBox *gc = new HostComboBox("AutoCommercialSkip");
+    HostListSetting *gc = new HostListSetting("AutoCommercialSkip");
     gc->setLabel(QObject::tr("Automatically skip commercials"));
     gc->addSelection(QObject::tr("Off"), "0");
     gc->addSelection(QObject::tr("Notify, but do not skip"), "2");
@@ -206,9 +413,9 @@ static HostComboBox *AutoCommercialSkip()
     return gc;
 }
 
-static GlobalCheckBox *AutoMetadataLookup()
+static GlobalBoolSetting *AutoMetadataLookup()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoMetadataLookup");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("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 +424,9 @@ static GlobalCheckBox *AutoMetadataLookup()
     return bc;
 }
 
-static GlobalCheckBox *AutoCommercialFlag()
+static GlobalBoolSetting *AutoCommercialFlag()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoCommercialFlag");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("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 +435,9 @@ static GlobalCheckBox *AutoCommercialFlag()
     return bc;
 }
 
-static GlobalCheckBox *AutoTranscode()
+static GlobalBoolSetting *AutoTranscode()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoTranscode");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("AutoTranscode");
     bc->setLabel(QObject::tr("Run transcoder"));
     bc->setValue(false);
     bc->setHelpText(QObject::tr("This is the default value used for the "
@@ -239,21 +446,30 @@ static GlobalCheckBox *AutoTranscode()
     return bc;
 }
 
-static GlobalComboBox *DefaultTranscoder()
+static GlobalListSetting *DefaultTranscoder()
 {
-    GlobalComboBox *bc = new GlobalComboBox("DefaultTranscoder");
-    bc->setLabel(QObject::tr("Default transcoder"));
+    GlobalListSetting *ls = new GlobalListSetting("DefaultTranscoder");
+    ls->setLabel(QObject::tr("Default transcoder"));
+    //begin hack, I did not want to change any code outside of mythfrontend 
+    GlobalComboBox *bc = new GlobalComboBox("DefaultTranscoder");   
     RecordingProfile::fillSelections(bc, RecordingProfile::TranscoderGroup,
-                                     true);
-    bc->setHelpText(QObject::tr("This is the default value used for the "
+                                     true); 
+    uint i;
+    for (i=0; i< bc->size(); i++)
+    {
+        ls->addSelection(bc->GetLabel(i),bc->GetValue(i));
+    }
+    delete bc;
+    //end hack
+    ls->setHelpText(QObject::tr("This is the default value used for the "
                     "transcoder setting when a new scheduled "
                     "recording is created."));
-    return bc;
+    return ls;
 }
 
-static GlobalSpinBox *DeferAutoTranscodeDays()
+static GlobalRangeSetting *DeferAutoTranscodeDays()
 {
-    GlobalSpinBox *gs = new GlobalSpinBox("DeferAutoTranscodeDays", 0, 365, 1);
+    GlobalRangeSetting *gs = new GlobalRangeSetting("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 +478,12 @@ static GlobalSpinBox *DeferAutoTranscodeDays()
     return gs;
 }
 
-static GlobalCheckBox *AutoRunUserJob(uint job_num)
+static GlobalBoolSetting *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);
+    GlobalBoolSetting *bc = new GlobalBoolSetting(dbStr);
     bc->setLabel(label);
     bc->setValue(false);
     bc->setHelpText(QObject::tr("This is the default value used for the "
@@ -278,9 +494,9 @@ static GlobalCheckBox *AutoRunUserJob(uint job_num)
     return bc;
 }
 
-static GlobalCheckBox *AggressiveCommDetect()
+static GlobalBoolSetting *AggressiveCommDetect()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AggressiveCommDetect");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("AggressiveCommDetect");
     bc->setLabel(QObject::tr("Strict commercial detection"));
     bc->setValue(true);
     bc->setHelpText(QObject::tr("Enable stricter commercial detection code. "
@@ -288,9 +504,9 @@ static GlobalCheckBox *AggressiveCommDetect()
     return bc;
 }
 
-static HostSpinBox *CommRewindAmount()
+static HostRangeSetting *CommRewindAmount()
 {
-    HostSpinBox *gs = new HostSpinBox("CommRewindAmount", 0, 10, 1);
+    HostRangeSetting *gs = new HostRangeSetting("CommRewindAmount", 0, 10, 1);
     gs->setLabel(QObject::tr("Commercial skip automatic rewind amount (secs)"));
     gs->setHelpText(QObject::tr("MythTV will automatically rewind "
                     "this many seconds after performing a commercial skip."));
@@ -298,9 +514,9 @@ static HostSpinBox *CommRewindAmount()
     return gs;
 }
 
-static HostSpinBox *CommNotifyAmount()
+static HostRangeSetting *CommNotifyAmount()
 {
-    HostSpinBox *gs = new HostSpinBox("CommNotifyAmount", 0, 10, 1);
+    HostRangeSetting *gs = new HostRangeSetting("CommNotifyAmount", 0, 10, 1);
     gs->setLabel(QObject::tr("Commercial skip notify amount (secs)"));
     gs->setHelpText(QObject::tr("MythTV will act like a commercial "
                     "begins this many seconds early. This can be useful "
@@ -310,9 +526,9 @@ static HostSpinBox *CommNotifyAmount()
     return gs;
 }
 
-static GlobalSpinBox *MaximumCommercialSkip()
+static GlobalRangeSetting *MaximumCommercialSkip()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("MaximumCommercialSkip", 0, 3600, 10);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("MaximumCommercialSkip", 0, 3600, 10);
     bs->setLabel(QObject::tr("Maximum commercial skip (secs)"));
     bs->setHelpText(QObject::tr("MythTV will discourage long manual commercial "
                     "skips. Skips which are longer than this will require the "
@@ -322,9 +538,9 @@ static GlobalSpinBox *MaximumCommercialSkip()
     return bs;
 }
 
-static GlobalSpinBox *MergeShortCommBreaks()
+static GlobalRangeSetting *MergeShortCommBreaks()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("MergeShortCommBreaks", 0, 3600, 5);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("MergeShortCommBreaks", 0, 3600, 5);
     bs->setLabel(QObject::tr("Merge short commercial breaks (secs)"));
     bs->setHelpText(QObject::tr("Treat consecutive commercial breaks shorter "
                     "than this as one break when skipping forward. Useful if "
@@ -334,9 +550,9 @@ static GlobalSpinBox *MergeShortCommBreaks()
     return bs;
 }
 
-static GlobalSpinBox *AutoExpireExtraSpace()
+static GlobalRangeSetting *AutoExpireExtraSpace()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoExpireExtraSpace", 0, 200, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("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 +561,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 GlobalRangeSetting *DeletedMaxAge()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("DeletedMaxAge", 0, 365, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("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 +572,9 @@ static GlobalSpinBox *DeletedMaxAge()
     return bs;
 };
 
-static GlobalCheckBox *DeletedFifoOrder()
+static GlobalBoolSetting *DeletedFifoOrder()
 {
-    GlobalCheckBox *cb = new GlobalCheckBox("DeletedFifoOrder");
+    GlobalBoolSetting *cb = new GlobalBoolSetting("DeletedFifoOrder");
     cb->setLabel(QObject::tr("Expire in deleted order"));
     cb->setValue(false);
     cb->setHelpText(QObject::tr(
@@ -378,31 +583,22 @@ static GlobalCheckBox *DeletedFifoOrder()
     return cb;
 };
 
-class DeletedExpireOptions : public TriggeredConfigurationGroup
-{
-    public:
-     DeletedExpireOptions() :
-         TriggeredConfigurationGroup(false, false, false, false)
-         {
-             setLabel(QObject::tr("DeletedExpireOptions"));
-             Setting* enabled = AutoExpireInsteadOfDelete();
-             addChild(enabled);
-             setTrigger(enabled);
-
-             HorizontalConfigurationGroup* settings =
-                 new HorizontalConfigurationGroup(false);
-             settings->addChild(DeletedFifoOrder());
-             settings->addChild(DeletedMaxAge());
-             addTarget("1", settings);
-
-             // show nothing if fillEnabled is off
-             addTarget("0", new HorizontalConfigurationGroup(true));
-         };
-};
+static GlobalBoolSetting *AutoExpireInsteadOfDelete()
+{
+    GlobalBoolSetting *cb = new GlobalBoolSetting("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->addChild(true, DeletedFifoOrder());
+    cb->addChild(true, DeletedMaxAge());
+    return cb;
+}
 
-static GlobalComboBox *AutoExpireMethod()
+static GlobalListSetting *AutoExpireMethod()
 {
-    GlobalComboBox *bc = new GlobalComboBox("AutoExpireMethod");
+    GlobalListSetting *bc = new GlobalListSetting("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 +610,9 @@ static GlobalComboBox *AutoExpireMethod()
     return bc;
 }
 
-static GlobalCheckBox *AutoExpireWatchedPriority()
+static GlobalBoolSetting *AutoExpireWatchedPriority()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoExpireWatchedPriority");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("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 +621,9 @@ static GlobalCheckBox *AutoExpireWatchedPriority()
     return bc;
 }
 
-static GlobalSpinBox *AutoExpireDayPriority()
+static GlobalRangeSetting *AutoExpireDayPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoExpireDayPriority", 1, 400, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("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 +632,9 @@ static GlobalSpinBox *AutoExpireDayPriority()
     return bs;
 };
 
-static GlobalCheckBox *AutoExpireDefault()
+static GlobalBoolSetting *AutoExpireDefault()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("AutoExpireDefault");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("AutoExpireDefault");
     bc->setLabel(QObject::tr("Auto-Expire default"));
     bc->setValue(true);
     bc->setHelpText(QObject::tr("If enabled, any new recording schedules "
@@ -447,9 +643,9 @@ static GlobalCheckBox *AutoExpireDefault()
     return bc;
 }
 
-static GlobalSpinBox *AutoExpireLiveTVMaxAge()
+static GlobalRangeSetting *AutoExpireLiveTVMaxAge()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoExpireLiveTVMaxAge", 1, 365, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("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 "
@@ -474,9 +670,9 @@ static GlobalSpinBox *MinRecordDiskThreshold()
 }
 #endif
 
-static GlobalCheckBox *RerecordWatched()
+static GlobalBoolSetting *RerecordWatched()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("RerecordWatched");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("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 +681,9 @@ static GlobalCheckBox *RerecordWatched()
     return bc;
 }
 
-static GlobalSpinBox *RecordPreRoll()
+static GlobalRangeSetting *RecordPreRoll()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("RecordPreRoll", 0, 600, 60, true);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("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 +694,9 @@ static GlobalSpinBox *RecordPreRoll()
     return bs;
 }
 
-static GlobalSpinBox *RecordOverTime()
+static GlobalRangeSetting *RecordOverTime()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("RecordOverTime", 0, 1800, 60, true);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("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,9 +706,9 @@ static GlobalSpinBox *RecordOverTime()
     return bs;
 }
 
-static GlobalComboBox *OverTimeCategory()
+static GlobalListSetting *OverTimeCategory()
 {
-    GlobalComboBox *gc = new GlobalComboBox("OverTimeCategory");
+    GlobalListSetting *gc = new GlobalListSetting("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. "
@@ -535,9 +731,9 @@ static GlobalComboBox *OverTimeCategory()
     return gc;
 }
 
-static GlobalSpinBox *CategoryOverTime()
+static GlobalRangeSetting *CategoryOverTime()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("CategoryOverTime",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("CategoryOverTime",
                                           0, 180, 60, true);
     bs->setLabel(QObject::tr("Record past end of show (mins)"));
     bs->setValue(30);
@@ -548,13 +744,12 @@ 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;
@@ -1249,7 +1444,7 @@ void PlaybackProfileConfigs::triggerChanged(const QString &trig)
     TriggeredConfigurationGroup::triggerChanged(trig);
 }
 
-static HostComboBox *PlayBoxOrdering()
+static HostListSetting *PlayBoxOrdering()
 {
     QString str[4] =
     {
@@ -1264,7 +1459,7 @@ static HostComboBox *PlayBoxOrdering()
         "refers to sections (e.g. \"All Programs\") which list "
         "multiple titles. Sections in parentheses are not affected.");
 
-    HostComboBox *gc = new HostComboBox("PlayBoxOrdering");
+    HostListSetting *gc = new HostListSetting("PlayBoxOrdering");
     gc->setLabel(QObject::tr("Episode sort orderings"));
 
     for (int i = 0; i < 4; ++i)
@@ -1276,9 +1471,9 @@ static HostComboBox *PlayBoxOrdering()
     return gc;
 }
 
-static HostComboBox *PlayBoxEpisodeSort()
+static HostListSetting *PlayBoxEpisodeSort()
 {
-    HostComboBox *gc = new HostComboBox("PlayBoxEpisodeSort");
+    HostListSetting *gc = new HostListSetting("PlayBoxEpisodeSort");
     gc->setLabel(QObject::tr("Sort episodes"));
     gc->addSelection(QObject::tr("Record date"), "Date");
     gc->addSelection(QObject::tr("Season/Episode"), "Season");
@@ -1288,9 +1483,9 @@ static HostComboBox *PlayBoxEpisodeSort()
     return gc;
 }
 
-static HostSpinBox *FFRewReposTime()
+static HostRangeSetting *FFRewReposTime()
 {
-    HostSpinBox *gs = new HostSpinBox("FFRewReposTime", 0, 200, 5);
+    HostRangeSetting *gs = new HostRangeSetting("FFRewReposTime", 0, 200, 5);
     gs->setLabel(QObject::tr("Fast forward/rewind reposition amount"));
     gs->setValue(100);
     gs->setHelpText(QObject::tr("When exiting sticky keys fast forward/rewind "
@@ -1301,9 +1496,9 @@ static HostSpinBox *FFRewReposTime()
     return gs;
 }
 
-static HostCheckBox *FFRewReverse()
+static HostBoolSetting *FFRewReverse()
 {
-    HostCheckBox *gc = new HostCheckBox("FFRewReverse");
+    HostBoolSetting *gc = new HostBoolSetting("FFRewReverse");
     gc->setLabel(QObject::tr("Reverse direction in fast forward/rewind"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, pressing the sticky rewind key "
@@ -1314,9 +1509,9 @@ static HostCheckBox *FFRewReverse()
     return gc;
 }
 
-static HostComboBox *MenuTheme()
+static HostListSetting *MenuTheme()
 {
-    HostComboBox *gc = new HostComboBox("MenuTheme");
+    HostListSetting *gc = new HostListSetting("MenuTheme");
     gc->setLabel(QObject::tr("Menu theme"));
 
     QList<ThemeInfo> themelist = GetMythUI()->GetThemes(THEME_MENU);
@@ -1348,9 +1543,9 @@ static HostComboBox MUNUSED *DecodeVBIFormat()
     return gc;
 }
 
-static HostSpinBox *OSDCC708TextZoomPercentage(void)
+static HostRangeSetting *OSDCC708TextZoomPercentage(void)
 {
-    HostSpinBox *gs = new HostSpinBox("OSDCC708TextZoom", 50, 200, 5);
+    HostRangeSetting *gs = new HostRangeSetting("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 +1553,9 @@ static HostSpinBox *OSDCC708TextZoomPercentage(void)
     return gs;
 }
 
-static HostComboBox *SubtitleFont()
+static HostListSetting *SubtitleFont()
 {
-    HostComboBox *hcb = new HostComboBox("OSDSubFont");
+    HostListSetting *hcb = new HostListSetting("OSDSubFont");
     QFontDatabase db;
     QStringList fonts = db.families();
     QStringList hide  = db.families(QFontDatabase::Symbol);
@@ -1375,9 +1570,9 @@ static HostComboBox *SubtitleFont()
     return hcb;
 }
 
-static HostComboBox *SubtitleCodec()
+static HostListSetting *SubtitleCodec()
 {
-    HostComboBox *gc = new HostComboBox("SubtitleCodec");
+    HostListSetting *gc = new HostListSetting("SubtitleCodec");
 
     gc->setLabel(QObject::tr("Subtitle Codec"));
     QList<QByteArray> list = QTextCodec::availableCodecs();
@@ -1390,18 +1585,18 @@ static HostComboBox *SubtitleCodec()
     return gc;
 }
 
-static HostComboBox *ChannelOrdering()
+static HostListSetting *ChannelOrdering()
 {
-    HostComboBox *gc = new HostComboBox("ChannelOrdering");
+    HostListSetting *gc = new HostListSetting("ChannelOrdering");
     gc->setLabel(QObject::tr("Channel ordering"));
     gc->addSelection(QObject::tr("channel number"), "channum");
     gc->addSelection(QObject::tr("callsign"),       "callsign");
     return gc;
 }
 
-static HostSpinBox *VertScanPercentage()
+static HostRangeSetting *VertScanPercentage()
 {
-    HostSpinBox *gs = new HostSpinBox("VertScanPercentage", -100, 100, 1);
+    HostRangeSetting *gs = new HostRangeSetting("VertScanPercentage", -100, 100, 1);
     gs->setLabel(QObject::tr("Vertical scaling"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1410,9 +1605,9 @@ static HostSpinBox *VertScanPercentage()
     return gs;
 }
 
-static HostSpinBox *HorizScanPercentage()
+static HostRangeSetting *HorizScanPercentage()
 {
-    HostSpinBox *gs = new HostSpinBox("HorizScanPercentage", -100, 100, 1);
+    HostRangeSetting *gs = new HostRangeSetting("HorizScanPercentage", -100, 100, 1);
     gs->setLabel(QObject::tr("Horizontal scaling"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1421,27 +1616,27 @@ static HostSpinBox *HorizScanPercentage()
     return gs;
 };
 
-static HostSpinBox *XScanDisplacement()
+static HostRangeSetting *XScanDisplacement()
 {
-    HostSpinBox *gs = new HostSpinBox("XScanDisplacement", -50, 50, 1);
+    HostRangeSetting *gs = new HostRangeSetting("XScanDisplacement", -50, 50, 1);
     gs->setLabel(QObject::tr("Scan displacement (X)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Adjust this to move the image horizontally."));
     return gs;
 }
 
-static HostSpinBox *YScanDisplacement()
+static HostRangeSetting *YScanDisplacement()
 {
-    HostSpinBox *gs = new HostSpinBox("YScanDisplacement", -50, 50, 1);
+    HostRangeSetting *gs = new HostRangeSetting("YScanDisplacement", -50, 50, 1);
     gs->setLabel(QObject::tr("Scan displacement (Y)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Adjust this to move the image vertically."));
     return gs;
 };
 
-static HostCheckBox *CCBackground()
+static HostBoolSetting *CCBackground()
 {
-    HostCheckBox *gc = new HostCheckBox("CCBackground");
+    HostBoolSetting *gc = new HostBoolSetting("CCBackground");
     gc->setLabel(QObject::tr("Black background for closed captioning"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1451,9 +1646,9 @@ static HostCheckBox *CCBackground()
     return gc;
 }
 
-static HostCheckBox *DefaultCCMode()
+static HostBoolSetting *DefaultCCMode()
 {
-    HostCheckBox *gc = new HostCheckBox("DefaultCCMode");
+    HostBoolSetting *gc = new HostBoolSetting("DefaultCCMode");
     gc->setLabel(QObject::tr("Always display closed captioning or subtitles"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1464,9 +1659,9 @@ static HostCheckBox *DefaultCCMode()
     return gc;
 }
 
-static HostCheckBox *PreferCC708()
+static HostBoolSetting *PreferCC708()
 {
-    HostCheckBox *gc = new HostCheckBox("Prefer708Captions");
+    HostBoolSetting *gc = new HostBoolSetting("Prefer708Captions");
     gc->setLabel(QObject::tr("Prefer EIA-708 over EIA-608 captions"));
     gc->setValue(true);
     gc->setHelpText(
@@ -1477,9 +1672,9 @@ static HostCheckBox *PreferCC708()
     return gc;
 }
 
-static HostCheckBox *EnableMHEG()
+static HostBoolSetting *EnableMHEG()
 {
-    HostCheckBox *gc = new HostCheckBox("EnableMHEG");
+    HostBoolSetting *gc = new HostBoolSetting("EnableMHEG");
     gc->setLabel(QObject::tr("Enable interactive TV"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1489,9 +1684,9 @@ static HostCheckBox *EnableMHEG()
     return gc;
 }
 
-static HostCheckBox *PersistentBrowseMode()
+static HostBoolSetting *PersistentBrowseMode()
 {
-    HostCheckBox *gc = new HostCheckBox("PersistentBrowseMode");
+    HostBoolSetting *gc = new HostBoolSetting("PersistentBrowseMode");
     gc->setLabel(QObject::tr("Always use browse mode in Live TV"));
     gc->setValue(true);
     gc->setHelpText(
@@ -1501,9 +1696,9 @@ static HostCheckBox *PersistentBrowseMode()
     return gc;
 }
 
-static HostCheckBox *BrowseAllTuners()
+static HostBoolSetting *BrowseAllTuners()
 {
-    HostCheckBox *gc = new HostCheckBox("BrowseAllTuners");
+    HostBoolSetting *gc = new HostBoolSetting("BrowseAllTuners");
     gc->setLabel(QObject::tr("Browse all channels"));
     gc->setValue(false);
     gc->setHelpText(
@@ -1514,9 +1709,9 @@ static HostCheckBox *BrowseAllTuners()
     return gc;
 }
 
-static HostCheckBox *ClearSavedPosition()
+static HostBoolSetting *ClearSavedPosition()
 {
-    HostCheckBox *gc = new HostCheckBox("ClearSavedPosition");
+    HostBoolSetting *gc = new HostBoolSetting("ClearSavedPosition");
     gc->setLabel(QObject::tr("Clear bookmark on playback"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, automatically clear the "
@@ -1526,9 +1721,9 @@ static HostCheckBox *ClearSavedPosition()
     return gc;
 }
 
-static HostCheckBox *AltClearSavedPosition()
+static HostBoolSetting *AltClearSavedPosition()
 {
-    HostCheckBox *gc = new HostCheckBox("AltClearSavedPosition");
+    HostBoolSetting *gc = new HostBoolSetting("AltClearSavedPosition");
     gc->setLabel(QObject::tr("Alternate clear and save bookmark"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("During playback the SELECT key "
@@ -1539,9 +1734,9 @@ static HostCheckBox *AltClearSavedPosition()
     return gc;
 }
 
-static HostComboBox *PlaybackExitPrompt()
+static HostListSetting *PlaybackExitPrompt()
 {
-    HostComboBox *gc = new HostComboBox("PlaybackExitPrompt");
+    HostListSetting *gc = new HostListSetting("PlaybackExitPrompt");
     gc->setLabel(QObject::tr("Action on playback exit"));
     gc->addSelection(QObject::tr("Just exit"), "0");
     gc->addSelection(QObject::tr("Save position and exit"), "2");
@@ -1555,9 +1750,9 @@ static HostComboBox *PlaybackExitPrompt()
     return gc;
 }
 
-static HostCheckBox *EndOfRecordingExitPrompt()
+static HostBoolSetting *EndOfRecordingExitPrompt()
 {
-    HostCheckBox *gc = new HostCheckBox("EndOfRecordingExitPrompt");
+    HostBoolSetting *gc = new HostBoolSetting("EndOfRecordingExitPrompt");
     gc->setLabel(QObject::tr("Prompt at end of recording"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, a menu will be displayed allowing "
@@ -1566,9 +1761,9 @@ static HostCheckBox *EndOfRecordingExitPrompt()
     return gc;
 }
 
-static HostCheckBox *JumpToProgramOSD()
+static HostBoolSetting *JumpToProgramOSD()
 {
-    HostCheckBox *gc = new HostCheckBox("JumpToProgramOSD");
+    HostBoolSetting *gc = new HostBoolSetting("JumpToProgramOSD");
     gc->setLabel(QObject::tr("Jump to program OSD"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr(
@@ -1580,9 +1775,9 @@ static HostCheckBox *JumpToProgramOSD()
     return gc;
 }
 
-static HostCheckBox *ContinueEmbeddedTVPlay()
+static HostBoolSetting *ContinueEmbeddedTVPlay()
 {
-    HostCheckBox *gc = new HostCheckBox("ContinueEmbeddedTVPlay");
+    HostBoolSetting *gc = new HostBoolSetting("ContinueEmbeddedTVPlay");
     gc->setLabel(QObject::tr("Continue playback when embedded"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr(
@@ -1593,9 +1788,9 @@ static HostCheckBox *ContinueEmbeddedTVPlay()
     return gc;
 }
 
-static HostCheckBox *AutomaticSetWatched()
+static HostBoolSetting *AutomaticSetWatched()
 {
-    HostCheckBox *gc = new HostCheckBox("AutomaticSetWatched");
+    HostBoolSetting *gc = new HostBoolSetting("AutomaticSetWatched");
     gc->setLabel(QObject::tr("Automatically mark a recording as watched"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, when you exit near the end of a "
@@ -1606,9 +1801,9 @@ static HostCheckBox *AutomaticSetWatched()
     return gc;
 }
 
-static HostSpinBox *LiveTVIdleTimeout()
+static HostRangeSetting *LiveTVIdleTimeout()
 {
-    HostSpinBox *gs = new HostSpinBox("LiveTVIdleTimeout", 0, 3600, 1);
+    HostRangeSetting *gs = new HostRangeSetting("LiveTVIdleTimeout", 0, 3600, 1);
     gs->setLabel(QObject::tr("Live TV idle timeout (mins)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr(
@@ -1618,9 +1813,9 @@ static HostSpinBox *LiveTVIdleTimeout()
     return gs;
 }
 
-// static HostCheckBox *PlaybackPreview()
+// static HostBoolSetting *PlaybackPreview()
 // {
-//     HostCheckBox *gc = new HostCheckBox("PlaybackPreview");
+//     HostCheckBox *gc = new HostBoolSetting("PlaybackPreview");
 //     gc->setLabel(QObject::tr("Display live preview of recordings"));
 //     gc->setValue(true);
 //     gc->setHelpText(QObject::tr("If enabled, a preview of the recording "
@@ -1629,9 +1824,9 @@ static HostSpinBox *LiveTVIdleTimeout()
 //     return gc;
 // }
 //
-// static HostCheckBox *HWAccelPlaybackPreview()
+// static HostBoolSetting *HWAccelPlaybackPreview()
 // {
-//     HostCheckBox *gc = new HostCheckBox("HWAccelPlaybackPreview");
+//     HostBoolSetting *gc = new HostBoolSetting("HWAccelPlaybackPreview");
 //     gc->setLabel(QObject::tr("Use HW Acceleration for live recording preview"));
 //     gc->setValue(false);
 //     gc->setHelpText(
@@ -1643,9 +1838,9 @@ static HostSpinBox *LiveTVIdleTimeout()
 //     return gc;
 // }
 
-static HostCheckBox *UseVirtualKeyboard()
+static HostBoolSetting *UseVirtualKeyboard()
 {
-    HostCheckBox *gc = new HostCheckBox("UseVirtualKeyboard");
+    HostBoolSetting *gc = new HostBoolSetting("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 +1849,9 @@ static HostCheckBox *UseVirtualKeyboard()
     return gc;
 }
 
-static HostComboBox *OverrideExitMenu()
+static HostListSetting *OverrideExitMenu()
 {
-    HostComboBox *gc = new HostComboBox("OverrideExitMenu");
+    HostListSetting *gc = new HostListSetting("OverrideExitMenu");
     gc->setLabel(QObject::tr("Customize exit menu options"));
     gc->addSelection(QObject::tr("Default"), "0");
     gc->addSelection(QObject::tr("Show quit"), "1");
@@ -1671,9 +1866,9 @@ static HostComboBox *OverrideExitMenu()
     return gc;
 }
 
-static HostLineEdit *RebootCommand()
+static HostTextualSetting *RebootCommand()
 {
-    HostLineEdit *ge = new HostLineEdit("RebootCommand");
+    HostTextualSetting *ge = new HostTextualSetting("RebootCommand");
     ge->setLabel(QObject::tr("Reboot command"));
     ge->setValue("");
     ge->setHelpText(QObject::tr("Optional. Script to run if you select "
@@ -1683,9 +1878,9 @@ static HostLineEdit *RebootCommand()
     return ge;
 }
 
-static HostLineEdit *HaltCommand()
+static HostTextualSetting *HaltCommand()
 {
-    HostLineEdit *ge = new HostLineEdit("HaltCommand");
+    HostTextualSetting *ge = new HostTextualSetting("HaltCommand");
     ge->setLabel(QObject::tr("Halt command"));
     ge->setValue("");
     ge->setHelpText(QObject::tr("Optional. Script to run if you select "
@@ -1695,9 +1890,9 @@ static HostLineEdit *HaltCommand()
     return ge;
 }
 
-static HostLineEdit *LircDaemonDevice()
+static HostTextualSetting *LircDaemonDevice()
 {
-    HostLineEdit *ge = new HostLineEdit("LircSocket");
+    HostTextualSetting *ge = new HostTextualSetting("LircSocket");
     ge->setLabel(QObject::tr("LIRC daemon socket"));
 
     /* lircd socket moved from /dev/ to /var/run/lirc/ in lirc 0.8.6 */
@@ -1712,18 +1907,18 @@ static HostLineEdit *LircDaemonDevice()
     return ge;
 }
 
-static HostLineEdit *ScreenShotPath()
+static HostTextualSetting *ScreenShotPath()
 {
-    HostLineEdit *ge = new HostLineEdit("ScreenShotPath");
+    HostTextualSetting *ge = new HostTextualSetting("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 HostTextualSetting *SetupPinCode()
 {
-    HostLineEdit *ge = new HostLineEdit("SetupPinCode");
+    HostTextualSetting *ge = new HostTextualSetting("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 +1927,9 @@ static HostLineEdit *SetupPinCode()
     return ge;
 }
 
-static HostCheckBox *SetupPinCodeRequired()
+static HostBoolSetting *SetupPinCodeRequired()
 {
-    HostCheckBox *gc = new HostCheckBox("SetupPinCodeRequired");
+    HostBoolSetting *gc = new HostBoolSetting("SetupPinCodeRequired");
     gc->setLabel(QObject::tr("Require setup PIN") + "    ");
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, you will not be able to return "
@@ -1743,9 +1938,9 @@ static HostCheckBox *SetupPinCodeRequired()
     return gc;
 }
 
-static HostComboBox *XineramaScreen()
+static HostListSetting *XineramaScreen()
 {
-    HostComboBox *gc = new HostComboBox("XineramaScreen", false);
+    HostListSetting *gc = new HostListSetting("XineramaScreen", false);
     int num = MythDisplay::GetNumberXineramaScreens();
     for (int i=0; i<num; ++i)
         gc->addSelection(QString::number(i), QString::number(i));
@@ -1758,9 +1953,9 @@ static HostComboBox *XineramaScreen()
 }
 
 
-static HostComboBox *XineramaMonitorAspectRatio()
+static HostListSetting *XineramaMonitorAspectRatio()
 {
-    HostComboBox *gc = new HostComboBox("XineramaMonitorAspectRatio");
+    HostListSetting *gc = new HostListSetting("XineramaMonitorAspectRatio");
     gc->setLabel(QObject::tr("Monitor aspect ratio"));
     gc->addSelection(QObject::tr("4:3"),   "1.3333");
     gc->addSelection(QObject::tr("16:9"),  "1.7777");
@@ -1771,9 +1966,9 @@ static HostComboBox *XineramaMonitorAspectRatio()
     return gc;
 }
 
-static HostComboBox *LetterboxingColour()
+static HostListSetting *LetterboxingColour()
 {
-    HostComboBox *gc = new HostComboBox("LetterboxColour");
+    HostListSetting *gc = new HostListSetting("LetterboxColour");
     gc->setLabel(QObject::tr("Letterboxing color"));
     for (int m = kLetterBoxColour_Black; m < kLetterBoxColour_END; ++m)
         gc->addSelection(toString((LetterBoxColour)m), QString::number(m));
@@ -1786,9 +1981,9 @@ static HostComboBox *LetterboxingColour()
     return gc;
 }
 
-static HostComboBox *AspectOverride()
+static HostListSetting *AspectOverride()
 {
-    HostComboBox *gc = new HostComboBox("AspectOverride");
+    HostListSetting *gc = new HostListSetting("AspectOverride");
     gc->setLabel(QObject::tr("Video aspect override"));
     for (int m = kAspect_Off; m < kAspect_END; ++m)
         gc->addSelection(toString((AspectOverrideMode)m), QString::number(m));
@@ -1799,9 +1994,9 @@ static HostComboBox *AspectOverride()
     return gc;
 }
 
-static HostComboBox *AdjustFill()
+static HostListSetting *AdjustFill()
 {
-    HostComboBox *gc = new HostComboBox("AdjustFill");
+    HostListSetting *gc = new HostListSetting("AdjustFill");
     gc->setLabel(QObject::tr("Zoom"));
     for (int m = kAdjustFill_Off; m < kAdjustFill_END; ++m)
         gc->addSelection(toString((AdjustFillMode)m), QString::number(m));
@@ -1817,9 +2012,9 @@ static HostComboBox *AdjustFill()
 
 // Theme settings
 
-static HostSpinBox *GuiWidth()
+static HostRangeSetting *GuiWidth()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiWidth", 0, 1920, 8, true);
+    HostRangeSetting *gs = new HostRangeSetting("GuiWidth", 0, 1920, 8, true);
     gs->setLabel(QObject::tr("GUI width (pixels)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The width of the GUI. Do not make the GUI "
@@ -1828,9 +2023,9 @@ static HostSpinBox *GuiWidth()
     return gs;
 }
 
-static HostSpinBox *GuiHeight()
+static HostRangeSetting *GuiHeight()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiHeight", 0, 1600, 8, true);
+    HostRangeSetting *gs = new HostRangeSetting("GuiHeight", 0, 1600, 8, true);
     gs->setLabel(QObject::tr("GUI height (pixels)"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The height of the GUI. Do not make the GUI "
@@ -1839,9 +2034,9 @@ static HostSpinBox *GuiHeight()
     return gs;
 }
 
-static HostSpinBox *GuiOffsetX()
+static HostRangeSetting *GuiOffsetX()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiOffsetX", -3840, 3840, 32, true);
+    HostRangeSetting *gs = new HostRangeSetting("GuiOffsetX", -3840, 3840, 32, true);
     gs->setLabel(QObject::tr("GUI X offset"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The horizontal offset where the GUI will be "
@@ -1849,9 +2044,9 @@ static HostSpinBox *GuiOffsetX()
     return gs;
 }
 
-static HostSpinBox *GuiOffsetY()
+static HostRangeSetting *GuiOffsetY()
 {
-    HostSpinBox *gs = new HostSpinBox("GuiOffsetY", -1600, 1600, 8, true);
+    HostRangeSetting *gs = new HostRangeSetting("GuiOffsetY", -1600, 1600, 8, true);
     gs->setLabel(QObject::tr("GUI Y offset"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("The vertical offset where the GUI will be "
@@ -1883,9 +2078,9 @@ static HostSpinBox *DisplaySizeHeight()
 }
 #endif
 
-static HostCheckBox *GuiSizeForTV()
+static HostBoolSetting *GuiSizeForTV()
 {
-    HostCheckBox *gc = new HostCheckBox("GuiSizeForTV");
+    HostBoolSetting *gc = new HostBoolSetting("GuiSizeForTV");
     gc->setLabel(QObject::tr("Use GUI size for TV playback"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, use the above size for TV, "
@@ -1894,15 +2089,7 @@ static HostCheckBox *GuiSizeForTV()
 }
 
 #if defined(USING_XRANDR) || CONFIG_DARWIN
-static HostCheckBox *UseVideoModes()
-{
-    HostCheckBox *gc = new HostCheckBox("UseVideoModes");
-    gc->setLabel(QObject::tr("Separate video modes for GUI and TV playback"));
-    gc->setValue(false);
-    gc->setHelpText(QObject::tr("Switch X Window video modes for TV. "
-                    "Requires \"xrandr\" support."));
-    return gc;
-}
+
 
 static HostSpinBox *VidModeWidth(int idx)
 {
@@ -2032,6 +2219,17 @@ static HostComboBox *TVVidModeForceAspect(int idx=-1)
     return gc;
 }
 
+static HostCheckBox *UseVideoModes()
+{
+    HostCheckBox *gc = new HostCheckBox("UseVideoModes");
+    gc->setLabel(QObject::tr("Separate video modes for GUI and TV playback"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr("Switch X Window video modes for TV. "
+                    "Requires \"xrandr\" support."));
+
+    return gc;
+}
+
 class VideoModeSettings : public TriggeredConfigurationGroup
 {
   public:
@@ -2084,9 +2282,9 @@ class VideoModeSettings : public TriggeredConfigurationGroup
 };
 #endif
 
-static HostCheckBox *HideMouseCursor()
+static HostBoolSetting *HideMouseCursor()
 {
-    HostCheckBox *gc = new HostCheckBox("HideMouseCursor");
+    HostBoolSetting *gc = new HostBoolSetting("HideMouseCursor");
     gc->setLabel(QObject::tr("Hide mouse cursor in MythTV"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Toggles mouse cursor visibility for touchscreens. "
@@ -2096,9 +2294,9 @@ static HostCheckBox *HideMouseCursor()
 };
 
 
-static HostCheckBox *RunInWindow()
+static HostBoolSetting *RunInWindow()
 {
-    HostCheckBox *gc = new HostCheckBox("RunFrontendInWindow");
+    HostBoolSetting *gc = new HostBoolSetting("RunFrontendInWindow");
     gc->setLabel(QObject::tr("Use window border"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Toggles between windowed and "
@@ -2106,10 +2304,10 @@ static HostCheckBox *RunInWindow()
     return gc;
 }
 
-static HostCheckBox *UseFixedWindowSize()
+static HostBoolSetting *UseFixedWindowSize()
 {
 {
-    HostCheckBox *gc = new HostCheckBox("UseFixedWindowSize");
+    HostBoolSetting *gc = new HostBoolSetting("UseFixedWindowSize");
     gc->setLabel(QObject::tr("Use fixed window size"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr(
@@ -2119,9 +2317,9 @@ static HostCheckBox *UseFixedWindowSize()
 }
 }
 
-static HostComboBox *MythDateFormatCB()
+static HostListSetting *MythDateFormatCB()
 {
-    HostComboBox *gc = new HostComboBox("DateFormat");
+    HostListSetting *gc = new HostListSetting("DateFormat");
     gc->setLabel(QObject::tr("Date format"));
 
     QDate sampdate = QDate::currentDate();
@@ -2160,9 +2358,9 @@ static HostComboBox *MythDateFormatCB()
     return gc;
 }
 
-static HostComboBox *MythShortDateFormat()
+static HostListSetting *MythShortDateFormat()
 {
-    HostComboBox *gc = new HostComboBox("ShortDateFormat");
+    HostListSetting *gc = new HostListSetting("ShortDateFormat");
     gc->setLabel(QObject::tr("Short date format"));
 
     QDate sampdate = QDate::currentDate();
@@ -2199,9 +2397,9 @@ static HostComboBox *MythShortDateFormat()
     return gc;
 }
 
-static HostComboBox *MythTimeFormat()
+static HostListSetting *MythTimeFormat()
 {
-    HostComboBox *gc = new HostComboBox("TimeFormat");
+    HostListSetting *gc = new HostListSetting("TimeFormat");
     gc->setLabel(QObject::tr("Time format"));
 
     QTime samptime = QTime::currentTime();
@@ -2219,9 +2417,9 @@ static HostComboBox *MythTimeFormat()
     return gc;
 }
 
-static HostComboBox *ChannelFormat()
+static HostListSetting *ChannelFormat()
 {
-    HostComboBox *gc = new HostComboBox("ChannelFormat");
+    HostListSetting *gc = new HostListSetting("ChannelFormat");
     gc->setLabel(QObject::tr("Channel format"));
     gc->addSelection(QObject::tr("number"), "<num>");
     gc->addSelection(QObject::tr("number callsign"), "<num> <sign>");
@@ -2233,9 +2431,9 @@ static HostComboBox *ChannelFormat()
     return gc;
 }
 
-static HostComboBox *LongChannelFormat()
+static HostListSetting *LongChannelFormat()
 {
-    HostComboBox *gc = new HostComboBox("LongChannelFormat");
+    HostListSetting *gc = new HostListSetting("LongChannelFormat");
     gc->setLabel(QObject::tr("Long channel format"));
     gc->addSelection(QObject::tr("number"), "<num>");
     gc->addSelection(QObject::tr("number callsign"), "<num> <sign>");
@@ -2247,9 +2445,9 @@ static HostComboBox *LongChannelFormat()
     return gc;
 }
 
-static GlobalCheckBox *LastFreeCard()
+static GlobalBoolSetting *LastFreeCard()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("LastFreeCard");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("LastFreeCard");
     bc->setLabel(QObject::tr("Avoid conflicts between Live TV and "
                  "scheduled shows"));
     bc->setValue(false);
@@ -2259,9 +2457,9 @@ static GlobalCheckBox *LastFreeCard()
     return bc;
 }
 
-static GlobalCheckBox *LiveTVPriority()
+static GlobalBoolSetting *LiveTVPriority()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("LiveTVPriority");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("LiveTVPriority");
     bc->setLabel(QObject::tr("Allow Live TV to move scheduled shows"));
     bc->setValue(false);
     bc->setHelpText(QObject::tr("If enabled, scheduled recordings will "
@@ -2270,20 +2468,9 @@ 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 HostListSetting *ChannelGroupDefault()
 {
-    HostComboBox *gc = new HostComboBox("ChannelGroupDefault");
+    HostListSetting *gc = new HostListSetting("ChannelGroupDefault");
     gc->setLabel(QObject::tr("Default channel group"));
 
     ChannelGroupList changrplist;
@@ -2303,9 +2490,9 @@ static HostComboBox *ChannelGroupDefault()
     return gc;
 }
 
-static HostCheckBox *BrowseChannelGroup()
+static HostBoolSetting *BrowseChannelGroup()
 {
-    HostCheckBox *gc = new HostCheckBox("BrowseChannelGroup");
+    HostBoolSetting *gc = new HostBoolSetting("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 "
@@ -2315,33 +2502,25 @@ static HostCheckBox *BrowseChannelGroup()
     return gc;
 }
 
-// Channel Group Settings
-class ChannelGroupSettings : public TriggeredConfigurationGroup
+static HostBoolSetting *ChannelGroupRememberLast()
 {
-  public:
-    ChannelGroupSettings() : TriggeredConfigurationGroup(false, true, false, false)
-    {
-         setLabel(QObject::tr("Remember last channel group"));
-         setUseLabel(false);
-
-         Setting* RememberChanGrpEnabled = ChannelGroupRememberLast();
-         addChild(RememberChanGrpEnabled);
-         setTrigger(RememberChanGrpEnabled);
+    HostBoolSetting *gc = new HostBoolSetting("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->addChild(false, ChannelGroupDefault());
 
-         ConfigurationGroup* settings = new VerticalConfigurationGroup(false,false);
-         settings->addChild(ChannelGroupDefault());
-         addTarget("0", settings);
+    gc->setValue(false);
 
-         // show nothing if RememberChanGrpEnabled is on
-         addTarget("1", new VerticalConfigurationGroup(true,false));
-     };
-};
+    return gc;
+}
 
 // General RecPriorities settings
 
-static GlobalCheckBox *GRSchedMoveHigher()
+static GlobalBoolSetting *GRSchedMoveHigher()
 {
-    GlobalCheckBox *bc = new GlobalCheckBox("SchedMoveHigher");
+    GlobalBoolSetting *bc = new GlobalBoolSetting("SchedMoveHigher");
     bc->setLabel(QObject::tr("Reschedule higher priorities"));
     bc->setHelpText(QObject::tr("Move higher priority programs to other "
                     "cards and showings when resolving conflicts. This "
@@ -2352,9 +2531,9 @@ static GlobalCheckBox *GRSchedMoveHigher()
     return bc;
 }
 
-static GlobalComboBox *GRSchedOpenEnd()
+static GlobalListSetting *GRSchedOpenEnd()
 {
-    GlobalComboBox *bc = new GlobalComboBox("SchedOpenEnd");
+    GlobalListSetting *bc = new GlobalListSetting("SchedOpenEnd");
     bc->setLabel(QObject::tr("Avoid back to back recordings"));
     bc->setHelpText(QObject::tr("Selects the situations where the scheduler "
                     "will avoid assigning shows to the same card if their "
@@ -2367,9 +2546,9 @@ static GlobalComboBox *GRSchedOpenEnd()
     return bc;
 }
 
-static GlobalSpinBox *GRDefaultStartOffset()
+static GlobalRangeSetting *GRDefaultStartOffset()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("DefaultStartOffset",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("DefaultStartOffset",
                                           -10, 30, 5, true);
     bs->setLabel(QObject::tr("Default 'Start Early' minutes for new "
                              "recording rules"));
@@ -2382,9 +2561,9 @@ static GlobalSpinBox *GRDefaultStartOffset()
     return bs;
 }
 
-static GlobalSpinBox *GRDefaultEndOffset()
+static GlobalRangeSetting *GRDefaultEndOffset()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("DefaultEndOffset",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("DefaultEndOffset",
                                           -10, 30, 5, true);
     bs->setLabel(QObject::tr("Default 'End Late' minutes for new "
                              "recording rules"));
@@ -2397,9 +2576,9 @@ static GlobalSpinBox *GRDefaultEndOffset()
     return bs;
 }
 
-static GlobalSpinBox *GRPrefInputRecPriority()
+static GlobalRangeSetting *GRPrefInputRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("PrefInputPriority", 1, 99, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("PrefInputPriority", 1, 99, 1);
     bs->setLabel(QObject::tr("Preferred input priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
                     "matches the preferred input selected in the 'Scheduling "
@@ -2408,9 +2587,9 @@ static GlobalSpinBox *GRPrefInputRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRHDTVRecPriority()
+static GlobalRangeSetting *GRHDTVRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("HDTVRecPriority", -99, 99, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("HDTVRecPriority", -99, 99, 1);
     bs->setLabel(QObject::tr("HDTV recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
                     "is marked as an HDTV broadcast in the TV listings."));
@@ -2418,9 +2597,9 @@ static GlobalSpinBox *GRHDTVRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRWSRecPriority()
+static GlobalRangeSetting *GRWSRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("WSRecPriority", -99, 99, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("WSRecPriority", -99, 99, 1);
     bs->setLabel(QObject::tr("Widescreen recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
                     "is marked as widescreen in the TV listings."));
@@ -2428,9 +2607,9 @@ static GlobalSpinBox *GRWSRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRAutoRecPriority()
+static GlobalRangeSetting *GRAutoRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AutoRecPriority", -99, 99, 1);
+    GlobalRangeSetting *bs = new GlobalRangeSetting("AutoRecPriority", -99, 99, 1);
     bs->setLabel(QObject::tr("Automatic priority range (+/-)"));
     bs->setHelpText(QObject::tr("Up to this number of priority points may "
                     "be added for titles that are usually watched soon after "
@@ -2440,9 +2619,9 @@ static GlobalSpinBox *GRAutoRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRSignLangRecPriority()
+static GlobalRangeSetting *GRSignLangRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("SignLangRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("SignLangRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Sign language recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2451,9 +2630,9 @@ static GlobalSpinBox *GRSignLangRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GROnScrSubRecPriority()
+static GlobalRangeSetting *GROnScrSubRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("OnScrSubRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("OnScrSubRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("In-vision Subtitles Recording Priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2462,9 +2641,9 @@ static GlobalSpinBox *GROnScrSubRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRCCRecPriority()
+static GlobalRangeSetting *GRCCRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("CCRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("CCRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Subtitles/CC recording priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2474,9 +2653,9 @@ static GlobalSpinBox *GRCCRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRHardHearRecPriority()
+static GlobalRangeSetting *GRHardHearRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("HardHearRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("HardHearRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Hard of hearing priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2486,9 +2665,9 @@ static GlobalSpinBox *GRHardHearRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRAudioDescRecPriority()
+static GlobalRangeSetting *GRAudioDescRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AudioDescRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("AudioDescRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Audio described priority"));
     bs->setHelpText(QObject::tr("Additional priority when a showing "
@@ -2497,9 +2676,9 @@ static GlobalSpinBox *GRAudioDescRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRSingleRecordRecPriority()
+static GlobalRangeSetting *GRSingleRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("SingleRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("SingleRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Single recordings priority"));
     bs->setHelpText(QObject::tr("Single recordings will receive this "
@@ -2508,9 +2687,9 @@ static GlobalSpinBox *GRSingleRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRWeekslotRecordRecPriority()
+static GlobalRangeSetting *GRWeekslotRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("WeekslotRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("WeekslotRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Weekslot recordings priority"));
     bs->setHelpText(QObject::tr("Weekslot recordings will receive this "
@@ -2519,9 +2698,9 @@ static GlobalSpinBox *GRWeekslotRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRTimeslotRecordRecPriority()
+static GlobalRangeSetting *GRTimeslotRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("TimeslotRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("TimeslotRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Timeslot recordings priority"));
     bs->setHelpText(QObject::tr("Timeslot recordings will receive this "
@@ -2530,9 +2709,9 @@ static GlobalSpinBox *GRTimeslotRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRChannelRecordRecPriority()
+static GlobalRangeSetting *GRChannelRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("ChannelRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("ChannelRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Channel recordings priority"));
     bs->setHelpText(QObject::tr("Channel recordings will receive this "
@@ -2541,9 +2720,9 @@ static GlobalSpinBox *GRChannelRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRAllRecordRecPriority()
+static GlobalRangeSetting *GRAllRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("AllRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("AllRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("All recordings priority"));
     bs->setHelpText(QObject::tr("The 'All' recording type will receive this "
@@ -2552,9 +2731,9 @@ static GlobalSpinBox *GRAllRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GRFindOneRecordRecPriority()
+static GlobalRangeSetting *GRFindOneRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("FindOneRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("FindOneRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Find one recordings priority"));
     bs->setHelpText(QObject::tr("Find One, Find Weekly and Find Daily "
@@ -2564,9 +2743,9 @@ static GlobalSpinBox *GRFindOneRecordRecPriority()
     return bs;
 }
 
-static GlobalSpinBox *GROverrideRecordRecPriority()
+static GlobalRangeSetting *GROverrideRecordRecPriority()
 {
-    GlobalSpinBox *bs = new GlobalSpinBox("OverrideRecordRecPriority",
+    GlobalRangeSetting *bs = new GlobalRangeSetting("OverrideRecordRecPriority",
                                             -99, 99, 1);
     bs->setLabel(QObject::tr("Override recordings priority"));
     bs->setHelpText(QObject::tr("Override recordings will receive this "
@@ -2575,9 +2754,9 @@ static GlobalSpinBox *GROverrideRecordRecPriority()
     return bs;
 }
 
-static HostLineEdit *DefaultTVChannel()
+static HostTextualSetting *DefaultTVChannel()
 {
-    HostLineEdit *ge = new HostLineEdit("DefaultTVChannel");
+    HostTextualSetting *ge = new HostTextualSetting("DefaultTVChannel");
     ge->setLabel(QObject::tr("Guide starts at channel"));
     ge->setValue("3");
     ge->setHelpText(QObject::tr("The program guide starts on this channel if "
@@ -2585,9 +2764,9 @@ static HostLineEdit *DefaultTVChannel()
     return ge;
 }
 
-static HostSpinBox *EPGRecThreshold()
+static HostRangeSetting *EPGRecThreshold()
 {
-    HostSpinBox *gs = new HostSpinBox("SelChangeRecThreshold", 1, 600, 1);
+    HostRangeSetting *gs = new HostRangeSetting("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 "
@@ -2596,9 +2775,9 @@ static HostSpinBox *EPGRecThreshold()
     return gs;
 }
 
-static HostComboBox *MythLanguage()
+static HostListSetting *MythLanguage()
 {
-    HostComboBox *gc = new HostComboBox("Language");
+    HostListSetting *gc = new HostListSetting("Language");
     gc->setLabel(QObject::tr("Language"));
 
     QMap<QString, QString> langMap = MythTranslation::getLanguages();
@@ -2620,9 +2799,9 @@ static HostComboBox *MythLanguage()
     return gc;
 }
 
-static void ISO639_fill_selections(SelectSetting *widget, uint i)
+static void ISO639_fill_selections(ListSetting *listSetting, uint i)
 {
-    widget->clearSelections();
+    listSetting->clearSelections();
     QString q = QString("ISO639Language%1").arg(i);
     QString lang = gCoreContext->GetSetting(q, "").toLower();
 
@@ -2643,13 +2822,13 @@ static void ISO639_fill_selections(SelectSetting *widget, uint i)
             desc = desc.left(idx);
 
         const QString il = iso639_key_to_str3(it.key());
-        widget->addSelection(desc, il, il == lang);
+        listSetting->addSelection(desc, il, il == lang);
     }
 }
 
-static GlobalComboBox *ISO639PreferredLanguage(uint i)
+static GlobalListSetting *ISO639PreferredLanguage(uint i)
 {
-    GlobalComboBox *gc = new GlobalComboBox(QString("ISO639Language%1").arg(i));
+    GlobalListSetting *gc = new GlobalListSetting(QString("ISO639Language%1").arg(i));
     gc->setLabel(QObject::tr("Guide language #%1").arg(i+1));
     // We should try to get language from "MythLanguage"
     // then use code 2 to code 3 map in iso639.h
@@ -2660,29 +2839,33 @@ static GlobalComboBox *ISO639PreferredLanguage(uint i)
     return gc;
 }
 
-static HostCheckBox *NetworkControlEnabled()
+static HostRangeSetting *NetworkControlPort()
 {
-    HostCheckBox *gc = new HostCheckBox("NetworkControlEnabled");
+    HostRangeSetting *gs = new HostRangeSetting("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 "
+                    "Control interface will listen on for new connections."));
+    return gs;
+}
+
+static HostBoolSetting *NetworkControlEnabled()
+{
+    HostBoolSetting *gc = new HostBoolSetting("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->addChild(true, NetworkControlPort());
     return gc;
 }
 
-static HostSpinBox *NetworkControlPort()
-{
-    HostSpinBox *gs = new HostSpinBox("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 "
-                    "Control interface will listen on for new connections."));
-    return gs;
-}
 
-static HostLineEdit *UDPNotifyPort()
+
+static HostTextualSetting *UDPNotifyPort()
 {
-    HostLineEdit *ge = new HostLineEdit("UDPNotifyPort");
+    HostTextualSetting *ge = new HostTextualSetting("UDPNotifyPort");
     ge->setLabel(QObject::tr("UDP notify port"));
     ge->setValue("6948");
     ge->setHelpText(QObject::tr("MythTV will listen for "
@@ -2692,9 +2875,9 @@ static HostLineEdit *UDPNotifyPort()
     return ge;
 }
 
-static HostCheckBox *RealtimePriority()
+static HostBoolSetting *RealtimePriority()
 {
-    HostCheckBox *gc = new HostCheckBox("RealtimePriority");
+    HostBoolSetting *gc = new HostBoolSetting("RealtimePriority");
     gc->setLabel(QObject::tr("Enable realtime priority threads"));
     gc->setHelpText(QObject::tr("When running mythfrontend with root "
                     "privileges, some threads can be given enhanced priority. "
@@ -2704,21 +2887,9 @@ static HostCheckBox *RealtimePriority()
     return gc;
 }
 
-static HostCheckBox *EnableMediaMon()
-{
-    HostCheckBox *gc = new HostCheckBox("MonitorDrives");
-    gc->setLabel(QObject::tr("Monitor CD/DVD") +
-                 QObject::tr(" (and other removable devices)"));
-    gc->setHelpText(QObject::tr("This enables support for monitoring "
-                    "your CD/DVD drives for new disks and launching "
-                    "the proper plugin to handle them."));
-    gc->setValue(false);
-    return gc;
-}
-
-static HostLineEdit *IgnoreMedia()
+static HostTextualSetting *IgnoreMedia()
 {
-    HostLineEdit *ge = new HostLineEdit("IgnoreDevices");
+    HostTextualSetting *ge = new HostTextualSetting("IgnoreDevices");
     ge->setLabel(QObject::tr("Ignore devices"));
     ge->setValue("");
     ge->setHelpText(QObject::tr("If there are any devices that you do not want "
@@ -2727,32 +2898,22 @@ static HostLineEdit *IgnoreMedia()
     return ge;
 }
 
-class MythMediaSettings : public TriggeredConfigurationGroup
+static HostBoolSetting *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));
-     };
-};
-
+    HostBoolSetting *gc = new HostBoolSetting("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->addChild(true,IgnoreMedia());
+    gc->setValue(false);
+    return gc;
+}
 
-static HostComboBox *DisplayGroupTitleSort()
+static HostListSetting *DisplayGroupTitleSort()
 {
-    HostComboBox *gc = new HostComboBox("DisplayGroupTitleSort");
+    HostListSetting *gc = new HostListSetting("DisplayGroupTitleSort");
     gc->setLabel(QObject::tr("Sort titles"));
     gc->addSelection(QObject::tr("Alphabetically"),
             QString::number(PlaybackBox::TitleSortAlphabetical));
@@ -2763,21 +2924,9 @@ static HostComboBox *DisplayGroupTitleSort()
     return gc;
 }
 
-static HostCheckBox *PlaybackWatchList()
+static HostBoolSetting *PlaybackWLStart()
 {
-    HostCheckBox *gc = new HostCheckBox("PlaybackWatchList");
-    gc->setLabel(QObject::tr("Include the 'Watch List' group"));
-    gc->setValue(true);
-    gc->setHelpText(QObject::tr("The 'Watch List' is an abbreviated list of "
-                                "recordings sorted to highlight series and "
-                                "shows that need attention in order to "
-                                "keep up to date."));
-    return gc;
-}
-
-static HostCheckBox *PlaybackWLStart()
-{
-    HostCheckBox *gc = new HostCheckBox("PlaybackWLStart");
+    HostBoolSetting *gc = new HostBoolSetting("PlaybackWLStart");
     gc->setLabel(QObject::tr("Start from the Watch List view"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, the 'Watch List' will be the "
@@ -2786,9 +2935,9 @@ static HostCheckBox *PlaybackWLStart()
     return gc;
 }
 
-static HostCheckBox *PlaybackWLAutoExpire()
+static HostBoolSetting *PlaybackWLAutoExpire()
 {
-    HostCheckBox *gc = new HostCheckBox("PlaybackWLAutoExpire");
+    HostBoolSetting *gc = new HostBoolSetting("PlaybackWLAutoExpire");
     gc->setLabel(QObject::tr("Exclude recordings not set for Auto-Expire"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("Set this if you turn off Auto-Expire only "
@@ -2798,9 +2947,9 @@ static HostCheckBox *PlaybackWLAutoExpire()
     return gc;
 }
 
-static HostSpinBox *PlaybackWLMaxAge()
+static HostRangeSetting *PlaybackWLMaxAge()
 {
-    HostSpinBox *gs = new HostSpinBox("PlaybackWLMaxAge", 30, 180, 10);
+    HostRangeSetting *gs = new HostRangeSetting("PlaybackWLMaxAge", 30, 180, 10);
     gs->setLabel(QObject::tr("Maximum days counted in the score"));
     gs->setValue(60);
     gs->setHelpText(QObject::tr("The 'Watch List' scores are based on 1 point "
@@ -2810,9 +2959,9 @@ static HostSpinBox *PlaybackWLMaxAge()
     return gs;
 }
 
-static HostSpinBox *PlaybackWLBlackOut()
+static HostRangeSetting *PlaybackWLBlackOut()
 {
-    HostSpinBox *gs = new HostSpinBox("PlaybackWLBlackOut", 0, 5, 1);
+    HostRangeSetting *gs = new HostRangeSetting("PlaybackWLBlackOut", 0, 5, 1);
     gs->setLabel(QObject::tr("Days to exclude weekly episodes after delete"));
     gs->setValue(2);
     gs->setHelpText(QObject::tr("When an episode is deleted or marked as "
@@ -2823,40 +2972,36 @@ static HostSpinBox *PlaybackWLBlackOut()
     return gs;
 }
 
-class WatchListSettings : public TriggeredConfigurationGroup
+
+static HostBoolSetting *PlaybackWatchList()
 {
-  public:
-     WatchListSettings() :
-         TriggeredConfigurationGroup(false, false, true, true)
-     {
-
-         Setting* watchList = PlaybackWatchList();
-         addChild(watchList);
-         setTrigger(watchList);
-
-         ConfigurationGroup* settings = new VerticalConfigurationGroup(false);
-         settings->addChild(PlaybackWLStart());
-         settings->addChild(PlaybackWLAutoExpire());
-         settings->addChild(PlaybackWLMaxAge());
-         settings->addChild(PlaybackWLBlackOut());
-         addTarget("1", settings);
-
-         addTarget("0", new VerticalConfigurationGroup(true));
-    };
-};
+    HostBoolSetting *gc = new HostBoolSetting("PlaybackWatchList");
+    gc->setLabel(QObject::tr("Include the 'Watch List' group"));
+    gc->setValue(true);
+    gc->setHelpText(QObject::tr("The 'Watch List' is an abbreviated list of "
+                                "recordings sorted to highlight series and "
+                                "shows that need attention in order to "
+                                "keep up to date."));
 
-static HostCheckBox *LCDShowTime()
+    gc->addChild(true,PlaybackWLStart());
+    gc->addChild(true,PlaybackWLAutoExpire());
+    gc->addChild(true,PlaybackWLMaxAge());
+    gc->addChild(true,PlaybackWLBlackOut());
+    return gc;
+}
+
+static HostBoolSetting *LCDShowTime()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowTime");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowTime");
     gc->setLabel(QObject::tr("Display time"));
     gc->setHelpText(QObject::tr("Display current time on idle LCD display. "));
     gc->setValue(true);
     return gc;
 }
 
-static HostCheckBox *LCDShowRecStatus()
+static HostBoolSetting *LCDShowRecStatus()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowRecStatus");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowRecStatus");
     gc->setLabel(QObject::tr("Display recording status"));
     gc->setHelpText(QObject::tr("Display current recordings information on "
                                 "LCD display."));
@@ -2864,18 +3009,18 @@ static HostCheckBox *LCDShowRecStatus()
     return gc;
 }
 
-static HostCheckBox *LCDShowMenu()
+static HostBoolSetting *LCDShowMenu()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowMenu");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowMenu");
     gc->setLabel(QObject::tr("Display menus"));
     gc->setHelpText(QObject::tr("Display selected menu on LCD display. "));
     gc->setValue(true);
     return gc;
 }
 
-static HostSpinBox *LCDPopupTime()
+static HostRangeSetting *LCDPopupTime()
 {
-    HostSpinBox *gs = new HostSpinBox("LCDPopupTime", 1, 300, 1, true);
+    HostRangeSetting *gs = new HostRangeSetting("LCDPopupTime", 1, 300, 1, true);
     gs->setLabel(QObject::tr("Menu pop-up time"));
     gs->setHelpText(QObject::tr("How many seconds the menu will "
                     "remain visible after navigation."));
@@ -2883,9 +3028,9 @@ static HostSpinBox *LCDPopupTime()
     return gs;
 }
 
-static HostCheckBox *LCDShowMusic()
+static HostBoolSetting *LCDShowMusic()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowMusic");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowMusic");
     gc->setLabel(QObject::tr("Display music artist and title"));
     gc->setHelpText(QObject::tr("Display playing artist and song title in "
                     "MythMusic on LCD display."));
@@ -2893,9 +3038,9 @@ static HostCheckBox *LCDShowMusic()
     return gc;
 }
 
-static HostComboBox *LCDShowMusicItems()
+static HostListSetting *LCDShowMusicItems()
 {
-    HostComboBox *gc = new HostComboBox("LCDShowMusicItems");
+    HostListSetting *gc = new HostListSetting("LCDShowMusicItems");
     gc->setLabel(QObject::tr("Items"));
     gc->addSelection(QObject::tr("Artist - Title"), "ArtistTitle");
     gc->addSelection(QObject::tr("Artist [Album] Title"), "ArtistAlbumTitle");
@@ -2903,18 +3048,18 @@ static HostComboBox *LCDShowMusicItems()
     return gc;
 }
 
-static HostCheckBox *LCDShowChannel()
+static HostBoolSetting *LCDShowChannel()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowChannel");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowChannel");
     gc->setLabel(QObject::tr("Display channel information"));
     gc->setHelpText(QObject::tr("Display tuned channel information on LCD display."));
     gc->setValue(true);
     return gc;
 }
 
-static HostCheckBox *LCDShowVolume()
+static HostBoolSetting *LCDShowVolume()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowVolume");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowVolume");
     gc->setLabel(QObject::tr("Display volume information"));
     gc->setHelpText(QObject::tr("Display volume level information "
                                 "on LCD display."));
@@ -2922,18 +3067,18 @@ static HostCheckBox *LCDShowVolume()
     return gc;
 }
 
-static HostCheckBox *LCDShowGeneric()
+static HostBoolSetting *LCDShowGeneric()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDShowGeneric");
+    HostBoolSetting *gc = new HostBoolSetting("LCDShowGeneric");
     gc->setLabel(QObject::tr("Display generic information"));
     gc->setHelpText(QObject::tr("Display generic information on LCD display."));
     gc->setValue(true);
     return gc;
 }
 
-static HostCheckBox *LCDBacklightOn()
+static HostBoolSetting *LCDBacklightOn()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDBacklightOn");
+    HostBoolSetting *gc = new HostBoolSetting("LCDBacklightOn");
     gc->setLabel(QObject::tr("Backlight always on"));
     gc->setHelpText(QObject::tr("Turn on the backlight permanently "
                                 "on the LCD display."));
@@ -2941,27 +3086,27 @@ static HostCheckBox *LCDBacklightOn()
     return gc;
 }
 
-static HostCheckBox *LCDHeartBeatOn()
+static HostBoolSetting *LCDHeartBeatOn()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDHeartBeatOn");
+    HostBoolSetting *gc = new HostBoolSetting("LCDHeartBeatOn");
     gc->setLabel(QObject::tr("Heartbeat always on"));
     gc->setHelpText(QObject::tr("Turn on the LCD heartbeat."));
     gc->setValue(false);
     return gc;
 }
 
-static HostCheckBox *LCDBigClock()
+static HostBoolSetting *LCDBigClock()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDBigClock");
+    HostBoolSetting *gc = new HostBoolSetting("LCDBigClock");
     gc->setLabel(QObject::tr("Display large clock"));
     gc->setHelpText(QObject::tr("On multiline displays try and display the time as large as possible."));
     gc->setValue(false);
     return gc;
 }
 
-static HostLineEdit *LCDKeyString()
+static HostTextualSetting *LCDKeyString()
 {
-    HostLineEdit *ge = new HostLineEdit("LCDKeyString");
+    HostTextualSetting *ge = new HostTextualSetting("LCDKeyString");
     ge->setLabel(QObject::tr("LCD key order"));
     ge->setValue("ABCDEF");
     ge->setHelpText(QObject::tr("Enter the 6 Keypad Return Codes for your "
@@ -2972,67 +3117,36 @@ static HostLineEdit *LCDKeyString()
     return ge;
 }
 
-static HostCheckBox *LCDEnable()
+static HostBoolSetting *LCDEnable()
 {
-    HostCheckBox *gc = new HostCheckBox("LCDEnable");
+    HostBoolSetting *gc = new HostBoolSetting("LCDEnable");
     gc->setLabel(QObject::tr("Enable LCD device"));
     gc->setHelpText(QObject::tr("Use an LCD display to view MythTV status "
                     "information."));
+
+    gc->addChild(true, LCDShowTime());
+    gc->addChild(true, LCDShowMenu());
+    gc->addChild(true, LCDShowMusic());
+    gc->addChild(true, LCDShowMusicItems());
+    gc->addChild(true, LCDShowChannel());
+    gc->addChild(true, LCDShowRecStatus());
+    gc->addChild(true, LCDShowVolume());
+    gc->addChild(true, LCDShowGeneric());
+    gc->addChild(true, LCDBacklightOn());
+    gc->addChild(true, LCDHeartBeatOn());
+    gc->addChild(true, LCDBigClock());
+    gc->addChild(true, LCDKeyString());;
+    gc->addChild(true, LCDPopupTime());
+
     gc->setValue(false);
     return gc;
 }
 
-class LcdSettings : public TriggeredConfigurationGroup
-{
-  public:
-    LcdSettings() : TriggeredConfigurationGroup(false, false,  false, false,
-                                                false, false, false, false)
-    {
-         setLabel(QObject::tr("LCD device display"));
-         setUseLabel(false);
-
-         Setting* lcd_enable = LCDEnable();
-         addChild(lcd_enable);
-         setTrigger(lcd_enable);
-
-         ConfigurationGroup *settings =
-             new VerticalConfigurationGroup(false, true, false, false);
-         ConfigurationGroup *setHoriz =
-             new HorizontalConfigurationGroup(false, false, false, false);
-
-         ConfigurationGroup* setLeft  =
-             new VerticalConfigurationGroup(false, false, false, false);
-         ConfigurationGroup* setRight =
-             new VerticalConfigurationGroup(false, false, false, false);
-
-         setLeft->addChild(LCDShowTime());
-         setLeft->addChild(LCDShowMenu());
-         setLeft->addChild(LCDShowMusic());
-         setLeft->addChild(LCDShowMusicItems());
-         setLeft->addChild(LCDShowChannel());
-         setLeft->addChild(LCDShowRecStatus());
-         setRight->addChild(LCDShowVolume());
-         setRight->addChild(LCDShowGeneric());
-         setRight->addChild(LCDBacklightOn());
-         setRight->addChild(LCDHeartBeatOn());
-         setRight->addChild(LCDBigClock());
-         setRight->addChild(LCDKeyString());
-         setHoriz->addChild(setLeft);
-         setHoriz->addChild(setRight);
-         settings->addChild(setHoriz);
-         settings->addChild(LCDPopupTime());
-
-         addTarget("1", settings);
-
-         addTarget("0", new VerticalConfigurationGroup(true));
-    };
-};
-
 
 #if CONFIG_DARWIN
-static HostCheckBox *MacGammaCorrect()
+static HostBoolSetting *MacGammaCorrect()
 {
-    HostCheckBox *gc = new HostCheckBox("MacGammaCorrect");
+    HostBoolSetting *gc = new HostBoolSetting("MacGammaCorrect");
     gc->setLabel(QObject::tr("Enable gamma correction for video"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If enabled, QuickTime will correct the gamma "
@@ -3041,9 +3155,9 @@ static HostCheckBox *MacGammaCorrect()
     return gc;
 }
 
-static HostCheckBox *MacScaleUp()
+static HostBoolSetting *MacScaleUp()
 {
-    HostCheckBox *gc = new HostCheckBox("MacScaleUp");
+    HostBoolSetting *gc = new HostBoolSetting("MacScaleUp");
     gc->setLabel(QObject::tr("Scale video as necessary"));
     gc->setValue(true);
     gc->setHelpText(QObject::tr("If enabled, video will be scaled to fit your "
@@ -3052,9 +3166,9 @@ static HostCheckBox *MacScaleUp()
     return gc;
 }
 
-static HostSpinBox *MacFullSkip()
+static HostRangeSetting *MacFullSkip()
 {
-    HostSpinBox *gs = new HostSpinBox("MacFullSkip", 0, 30, 1, true);
+    HostRangeSetting *gs = new HostRangeSetting("MacFullSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip in fullscreen mode"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Video displayed in fullscreen or non-windowed "
@@ -3065,22 +3179,9 @@ static HostSpinBox *MacFullSkip()
     return gs;
 }
 
-static HostCheckBox *MacMainEnabled()
+static HostRangeSetting *MacMainSkip()
 {
-    HostCheckBox *gc = new HostCheckBox("MacMainEnabled");
-    gc->setLabel(QObject::tr("Video in main window"));
-    gc->setValue(true);
-    gc->setHelpText(QObject::tr("If enabled, video will be displayed in the "
-                    "main GUI window. Disable this when you only want video "
-                    "on the desktop or in a floating window. Only valid when "
-                    "\"Use GUI size for TV playback\" and \"Run the "
-                    "frontend in a window\" are checked."));
-    return gc;
-}
-
-static HostSpinBox *MacMainSkip()
-{
-    HostSpinBox *gs = new HostSpinBox("MacMainSkip", 0, 30, 1, true);
+    HostRangeSetting *gs = new HostRangeSetting("MacMainSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip"));
     gs->setValue(0);
     gs->setHelpText(QObject::tr("Video in the main window will skip this many "
@@ -3089,9 +3190,9 @@ static HostSpinBox *MacMainSkip()
     return gs;
 }
 
-static HostSpinBox *MacMainOpacity()
+static HostRangeSetting *MacMainOpacity()
 {
-    HostSpinBox *gs = new HostSpinBox("MacMainOpacity", 0, 100, 5, false);
+    HostRangeSetting *gs = new HostRangeSetting("MacMainOpacity", 0, 100, 5, false);
     gs->setLabel(QObject::tr("Opacity"));
     gs->setValue(100);
     gs->setHelpText(QObject::tr("The opacity of the main window. Set to "
@@ -3100,36 +3201,18 @@ static HostSpinBox *MacMainOpacity()
     return gs;
 }
 
-class MacMainSettings : public TriggeredConfigurationGroup
-{
-  public:
-    MacMainSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video in main window"));
-        setUseLabel(false);
-        Setting *gc = MacMainEnabled();
-        addChild(gc);
-        setTrigger(gc);
-
-        VerticalConfigurationGroup *opts =
-            new VerticalConfigurationGroup(false, false);
-        opts->addChild(MacMainSkip());
-        opts->addChild(MacMainOpacity());
-
-        addTarget("1", opts);
-        addTarget("0", new VerticalConfigurationGroup(false, false));
-    }
-};
-
-static HostCheckBox *MacFloatEnabled()
+static HostBoolSetting *MacMainEnabled()
 {
-    HostCheckBox *gc = new HostCheckBox("MacFloatEnabled");
-    gc->setLabel(QObject::tr("Video in floating window"));
-    gc->setValue(false);
-    gc->setHelpText(QObject::tr("If enabled, video will be displayed in a "
-                    "floating window. Only valid when \"Use GUI size for TV "
-                    "playback\" and \"Run the frontend in a window\" are "
-                    "checked."));
+    HostBoolSetting *gc = new HostBoolSetting("MacMainEnabled");
+    gc->setLabel(QObject::tr("Video in main window"));
+    gc->setValue(true);
+    gc->setHelpText(QObject::tr("If enabled, video will be displayed in the "
+                    "main GUI window. Disable this when you only want video "
+                    "on the desktop or in a floating window. Only valid when "
+                    "\"Use GUI size for TV playback\" and \"Run the "
+                    "frontend in a window\" are checked."));
+    gc->addChild(true, MacMainSkip());
+    gc->addChild(true, MacMainOpacity()); 
     return gc;
 }
 
@@ -3155,26 +3238,31 @@ static HostSpinBox *MacFloatOpacity()
     return gs;
 }
 
-class MacFloatSettings : public TriggeredConfigurationGroup
+static HostCheckBox *MacFloatEnabled()
 {
-  public:
-    MacFloatSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video in floating window"));
-        setUseLabel(false);
-        Setting *gc = MacFloatEnabled();
-        addChild(gc);
-        setTrigger(gc);
+    HostCheckBox *gc = new HostCheckBox("MacFloatEnabled");
+    gc->setLabel(QObject::tr("Video in floating window"));
+    gc->setValue(false);
+    gc->setHelpText(QObject::tr("If enabled, video will be displayed in a "
+                    "floating window. Only valid when \"Use GUI size for TV "
+                    "playback\" and \"Run the frontend in a window\" are "
+                    "checked."));
 
-        VerticalConfigurationGroup *opts =
-            new VerticalConfigurationGroup(false, false);
-        opts->addChild(MacFloatSkip());
-        opts->addChild(MacFloatOpacity());
+    gc->addChild(true, MacFloatSkip());
+    gc->addChild(true, MacFloatOpacity());
+    return gc;
+}
 
-        addTarget("1", opts);
-        addTarget("0", new VerticalConfigurationGroup(false, false));
-    }
-};
+static HostSpinBox *MacDockSkip()
+{
+    HostSpinBox *gs = new HostSpinBox("MacDockSkip", 0, 30, 1, true);
+    gs->setLabel(QObject::tr("Frames to skip"));
+    gs->setValue(3);
+    gs->setHelpText(QObject::tr("Video in the dock icon will skip this many "
+                    "frames for each frame drawn. Set to 0 to show "
+                    "every frame."));
+    return gs;
+}
 
 static HostCheckBox *MacDockEnabled()
 {
@@ -3185,37 +3273,22 @@ static HostCheckBox *MacDockEnabled()
                     "application's dock icon. Only valid when \"Use GUI size "
                     "for TV playback\" and \"Run the frontend in a window\" "
                     "are checked."));
+
+    gc->addChild(true, MacDockSkip());
     return gc;
 }
 
-static HostSpinBox *MacDockSkip()
+static HostSpinBox *MacDesktopSkip()
 {
-    HostSpinBox *gs = new HostSpinBox("MacDockSkip", 0, 30, 1, true);
+    HostSpinBox *gs = new HostSpinBox("MacDesktopSkip", 0, 30, 1, true);
     gs->setLabel(QObject::tr("Frames to skip"));
-    gs->setValue(3);
-    gs->setHelpText(QObject::tr("Video in the dock icon will skip this many "
+    gs->setValue(0);
+    gs->setHelpText(QObject::tr("Video on the desktop will skip this many "
                     "frames for each frame drawn. Set to 0 to show "
                     "every frame."));
     return gs;
 }
 
-class MacDockSettings : public TriggeredConfigurationGroup
-{
-  public:
-    MacDockSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video in the dock"));
-        setUseLabel(false);
-        Setting *gc = MacDockEnabled();
-        addChild(gc);
-        setTrigger(gc);
-
-        Setting *skip = MacDockSkip();
-        addTarget("1", skip);
-        addTarget("0", new HorizontalConfigurationGroup(false, false));
-    }
-};
-
 static HostCheckBox *MacDesktopEnabled()
 {
     HostCheckBox *gc = new HostCheckBox("MacDesktopEnabled");
@@ -3225,41 +3298,16 @@ static HostCheckBox *MacDesktopEnabled()
                     "desktop, behind the Finder icons. Only valid when \"Use "
                     "GUI size for TV playback\" and \"Run the frontend in a "
                     "window\" are checked."));
-    return gc;
-}
 
-static HostSpinBox *MacDesktopSkip()
-{
-    HostSpinBox *gs = new HostSpinBox("MacDesktopSkip", 0, 30, 1, true);
-    gs->setLabel(QObject::tr("Frames to skip"));
-    gs->setValue(0);
-    gs->setHelpText(QObject::tr("Video on the desktop will skip this many "
-                    "frames for each frame drawn. Set to 0 to show "
-                    "every frame."));
-    return gs;
+    gc->addChild(true, MacDesktopSkip());
+    return gc;
 }
 
-class MacDesktopSettings : public TriggeredConfigurationGroup
-{
-  public:
-    MacDesktopSettings() : TriggeredConfigurationGroup(false)
-    {
-        setLabel(QObject::tr("Video on the desktop"));
-        setUseLabel(false);
-        Setting *gc = MacDesktopEnabled();
-        addChild(gc);
-        setTrigger(gc);
-
-        Setting *skip = MacDesktopSkip();
-        addTarget("1", skip);
-        addTarget("0", new HorizontalConfigurationGroup(false, false));
-    }
-};
 #endif
 
-static HostCheckBox *WatchTVGuide()
+static HostBoolSetting *WatchTVGuide()
 {
-    HostCheckBox *gc = new HostCheckBox("WatchTVGuide");
+    HostBoolSetting *gc = new HostBoolSetting("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."));
@@ -3269,119 +3317,70 @@ static HostCheckBox *WatchTVGuide()
 
 MainGeneralSettings::MainGeneralSettings()
 {
-    DatabaseSettings::addDatabaseSettings(this);
+    setLabel(QObject::tr("General"));
 
-    VerticalConfigurationGroup *pin =
-        new VerticalConfigurationGroup(false, true, false, false);
+    addChild(new MythDbSettings());
+
+    GroupSetting *pin = new GroupSetting();
     pin->setLabel(QObject::tr("Settings Access"));
     pin->addChild(SetupPinCodeRequired());
     pin->addChild(SetupPinCode());
     addChild(pin);
 
-    VerticalConfigurationGroup *general =
-        new VerticalConfigurationGroup(false, true, false, false);
+    GroupSetting *general = new GroupSetting();
     general->setLabel(QObject::tr("General"));
     general->addChild(UseVirtualKeyboard());
     general->addChild(ScreenShotPath());
     addChild(general);
 
-    VerticalConfigurationGroup *media =
-        new VerticalConfigurationGroup(false, true, false, false);
-    media->setLabel(QObject::tr("Media Monitor"));
-    MythMediaSettings *mediaMon = new MythMediaSettings();
-    media->addChild(mediaMon);
-    addChild(media);
+    addChild(EnableMediaMon());
 
-    VerticalConfigurationGroup *shutdownSettings =
-        new VerticalConfigurationGroup(true, true, false, false);
+    GroupSetting *shutdownSettings = new GroupSetting();
     shutdownSettings->setLabel(QObject::tr("Shutdown/Reboot Settings"));
     shutdownSettings->addChild(OverrideExitMenu());
     shutdownSettings->addChild(HaltCommand());
     shutdownSettings->addChild(RebootCommand());
     addChild(shutdownSettings);
 
-    VerticalConfigurationGroup *remotecontrol =
-        new VerticalConfigurationGroup(false, true, false, false);
+    GroupSetting *remotecontrol = new GroupSetting();
     remotecontrol->setLabel(QObject::tr("Remote Control"));
     remotecontrol->addChild(LircDaemonDevice());
     remotecontrol->addChild(NetworkControlEnabled());
-    remotecontrol->addChild(NetworkControlPort());
     remotecontrol->addChild(UDPNotifyPort());
     addChild(remotecontrol);
 }
 
 PlaybackSettings::PlaybackSettings()
 {
-    uint i = 0, total = 8;
-#if CONFIG_DARWIN
-    total += 2;
-#endif // USING_DARWIN
-
-
-    VerticalConfigurationGroup* general1 =
-        new VerticalConfigurationGroup(false);
-    general1->setLabel(QObject::tr("General Playback") +
-                      QString(" (%1/%2)").arg(++i).arg(total));
-
-    HorizontalConfigurationGroup *columns =
-        new HorizontalConfigurationGroup(false, false, true, true);
-
-    VerticalConfigurationGroup *column1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    column1->addChild(RealtimePriority());
-    column1->addChild(DecodeExtraAudio());
-    column1->addChild(JumpToProgramOSD());
-    columns->addChild(column1);
-
-    VerticalConfigurationGroup *column2 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    column2->addChild(ClearSavedPosition());
-    column2->addChild(AltClearSavedPosition());
-    column2->addChild(AutomaticSetWatched());
-    column2->addChild(ContinueEmbeddedTVPlay());
-    columns->addChild(column2);
-
-    general1->addChild(columns);
-    general1->addChild(LiveTVIdleTimeout());
-    addChild(general1);
-
-    VerticalConfigurationGroup* general2 =
-        new VerticalConfigurationGroup(false);
-    general2->setLabel(QObject::tr("General Playback") +
-                      QString(" (%1/%2)").arg(++i).arg(total));
-
-    HorizontalConfigurationGroup* oscan =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    VerticalConfigurationGroup *ocol1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    VerticalConfigurationGroup *ocol2 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    ocol1->addChild(VertScanPercentage());
-    ocol1->addChild(YScanDisplacement());
-    ocol2->addChild(HorizScanPercentage());
-    ocol2->addChild(XScanDisplacement());
-    oscan->addChild(ocol1);
-    oscan->addChild(ocol2);
-
-    HorizontalConfigurationGroup* aspect_fill =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    aspect_fill->addChild(AspectOverride());
-    aspect_fill->addChild(AdjustFill());
-
-    general2->addChild(oscan);
-    general2->addChild(aspect_fill);
-    general2->addChild(LetterboxingColour());
-    general2->addChild(PIPLocationComboBox());
-    general2->addChild(PlaybackExitPrompt());
-    general2->addChild(EndOfRecordingExitPrompt());
-    addChild(general2);
+    setLabel(QObject::tr("Playback"));
+    GroupSetting * general = new GroupSetting();
+    general->setLabel(QObject::tr("General Playback"));
+    general->addChild(RealtimePriority());
+    general->addChild(DecodeExtraAudio());
+    general->addChild(JumpToProgramOSD());
+    general->addChild(ClearSavedPosition());
+    general->addChild(AltClearSavedPosition());
+    general->addChild(AutomaticSetWatched());
+    general->addChild(ContinueEmbeddedTVPlay());
+    general->addChild(LiveTVIdleTimeout());
+    general->addChild(VertScanPercentage());
+    general->addChild(HorizScanPercentage());
+    general->addChild(YScanDisplacement());
+    general->addChild(XScanDisplacement());
+    general->addChild(AspectOverride());
+    general->addChild(AdjustFill());
+    general->addChild(LetterboxingColour());
+    general->addChild(PIPLocationComboBox());
+    general->addChild(PlaybackExitPrompt());
+    general->addChild(EndOfRecordingExitPrompt());
+    addChild(general);
 
-    QString tmp = QString(" (%1/%2)").arg(++i).arg(total);
-    addChild(new PlaybackProfileConfigs(tmp));
+    //QString tmp = QString(" (%1/%2)").arg(++i).arg(total);
+    addChild(new GroupSetting("PlaybackProfileConfigs TODO"));
+    //TODO addChild(new PlaybackProfileConfigs(tmp));
 
-    VerticalConfigurationGroup* pbox = new VerticalConfigurationGroup(false);
-    pbox->setLabel(QObject::tr("View Recordings") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
+    GroupSetting* pbox = new GroupSetting();
+    pbox->setLabel(QObject::tr("View Recordings"));
     pbox->addChild(PlayBoxOrdering());
     pbox->addChild(PlayBoxEpisodeSort());
     // Disabled until we re-enable live previews
@@ -3390,34 +3389,30 @@ PlaybackSettings::PlaybackSettings()
     pbox->addChild(PBBStartInTitle());
     addChild(pbox);
 
-    VerticalConfigurationGroup* pbox2 = new VerticalConfigurationGroup(false);
-    pbox2->setLabel(QObject::tr("Recording Groups") +
-                    QString(" (%1/%2)").arg(++i).arg(total));
+    GroupSetting* pbox2 = new GroupSetting();
+    pbox2->setLabel(QObject::tr("Recording Groups"));
     pbox2->addChild(DisplayRecGroup());
     pbox2->addChild(QueryInitialFilter());
     pbox2->addChild(RememberRecGroup());
     pbox2->addChild(UseGroupNameAsAllPrograms());
     addChild(pbox2);
 
-    VerticalConfigurationGroup* pbox3 = new VerticalConfigurationGroup(false);
-    pbox3->setLabel(QObject::tr("View Recordings") +
-                    QString(" (%1/%2)").arg(++i).arg(total));
+    GroupSetting* pbox3 = new GroupSetting();
+    pbox3->setLabel(QObject::tr("View Recordings"));
     pbox3->addChild(DisplayGroupTitleSort());
-    pbox3->addChild(new WatchListSettings());
+    addChild(PlaybackWatchList());
     addChild(pbox3);
 
-    VerticalConfigurationGroup* seek = new VerticalConfigurationGroup(false);
-    seek->setLabel(QObject::tr("Seeking") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
+    GroupSetting* seek = new GroupSetting();
+    seek->setLabel(QObject::tr("Seeking"));
     seek->addChild(SmartForward());
     seek->addChild(FFRewReposTime());
     seek->addChild(FFRewReverse());
     seek->addChild(ExactSeeking());
     addChild(seek);
 
-    VerticalConfigurationGroup* comms = new VerticalConfigurationGroup(false);
-    comms->setLabel(QObject::tr("Commercial Skip") +
-                    QString(" (%1/%2)").arg(++i).arg(total));
+    GroupSetting* comms = new GroupSetting();
+    comms->setLabel(QObject::tr("Commercial Skip"));
     comms->addChild(AutoCommercialSkip());
     comms->addChild(CommRewindAmount());
     comms->addChild(CommNotifyAmount());
@@ -3426,45 +3421,32 @@ PlaybackSettings::PlaybackSettings()
     addChild(comms);
 
 #if CONFIG_DARWIN
-    VerticalConfigurationGroup* mac1 = new VerticalConfigurationGroup(false);
-    mac1->setLabel(QObject::tr("Mac OS X Video Settings") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
-    mac1->addChild(MacGammaCorrect());
-    mac1->addChild(MacScaleUp());
-    mac1->addChild(MacFullSkip());
-    addChild(mac1);
-
-    VerticalConfigurationGroup* mac2 = new VerticalConfigurationGroup(false);
-    mac2->setLabel(QObject::tr("Mac OS X Video Settings") +
-                   QString(" (%1/%2)").arg(++i).arg(total));
-    mac2->addChild(new MacMainSettings());
-    mac2->addChild(new MacFloatSettings());
-
-    HorizontalConfigurationGroup *row =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    row->addChild(new MacDockSettings());
-    row->addChild(new MacDesktopSettings());
-    mac2->addChild(row);
-
+    GroupSetting* mac = new GroupSetting();
+    mac->setLabel(QObject::tr("Mac OS X Video Settings"));
+    mac->addChild(MacGammaCorrect());
+    mac->addChild(MacScaleUp());
+    mac->addChild(MacFullSkip());
+    mac->addChild(MacMainEnabled());
+    mac->addChild(MacFloatEnabled());
+    mac->addChild(MacDockEnabled());
+    mac->addChild(MacDesktopSettings());
     addChild(mac2);
 #endif
 }
 
 OSDSettings::OSDSettings()
 {
-    VerticalConfigurationGroup* osd = new VerticalConfigurationGroup(false);
-    osd->setLabel(QObject::tr("On-screen Display"));
+    setLabel(QObject::tr("On-screen Display"));
 
-    osd->addChild(EnableMHEG());
-    osd->addChild(PersistentBrowseMode());
-    osd->addChild(BrowseAllTuners());
-    osd->addChild(CCBackground());
-    osd->addChild(DefaultCCMode());
-    osd->addChild(PreferCC708());
-    osd->addChild(SubtitleFont());
-    osd->addChild(OSDCC708TextZoomPercentage());
-    osd->addChild(SubtitleCodec());
-    addChild(osd);
+    addChild(EnableMHEG());
+    addChild(PersistentBrowseMode());
+    addChild(BrowseAllTuners());
+    addChild(CCBackground());
+    addChild(DefaultCCMode());
+    addChild(PreferCC708());
+    addChild(SubtitleFont());
+    addChild(OSDCC708TextZoomPercentage());
+    addChild(SubtitleCodec());
 
     //VerticalConfigurationGroup *cc = new VerticalConfigurationGroup(false);
     //cc->setLabel(QObject::tr("Closed Captions"));
@@ -3479,8 +3461,9 @@ OSDSettings::OSDSettings()
 
 GeneralSettings::GeneralSettings()
 {
-    VerticalConfigurationGroup* general = new VerticalConfigurationGroup(false);
-    general->setLabel(QObject::tr("General (Basic)"));
+    setLabel(QObject::tr("General"));
+    GroupSetting* general = new GroupSetting();
+    general->setLabel(QObject::tr("Basic"));
     general->addChild(ChannelOrdering());
     general->addChild(ChannelFormat());
     general->addChild(LongChannelFormat());
@@ -3488,91 +3471,68 @@ GeneralSettings::GeneralSettings()
     general->addChild(LiveTVPriority());
     addChild(general);
 
-    VerticalConfigurationGroup* autoexp = new VerticalConfigurationGroup(false);
-    autoexp->setLabel(QObject::tr("General (Auto-Expire)"));
+    GroupSetting* autoexp = new GroupSetting();
+    autoexp->setLabel(QObject::tr("Auto-Expire"));
     autoexp->addChild(AutoExpireMethod());
-
-    VerticalConfigurationGroup *expgrp0 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    expgrp0->addChild(AutoExpireDefault());
-    expgrp0->addChild(RerecordWatched());
-    expgrp0->addChild(AutoExpireWatchedPriority());
-
-    VerticalConfigurationGroup *expgrp1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    expgrp1->addChild(AutoExpireLiveTVMaxAge());
-    expgrp1->addChild(AutoExpireDayPriority());
-    expgrp1->addChild(AutoExpireExtraSpace());
-
-    HorizontalConfigurationGroup *expgrp =
-        new HorizontalConfigurationGroup(false, false, true, true);
-    expgrp->addChild(expgrp0);
-    expgrp->addChild(expgrp1);
-
-    autoexp->addChild(expgrp);
-    autoexp->addChild(new DeletedExpireOptions());
-
+    autoexp->addChild(AutoExpireDefault());
+    autoexp->addChild(RerecordWatched());
+    autoexp->addChild(AutoExpireWatchedPriority());
+    autoexp->addChild(AutoExpireLiveTVMaxAge());
+    autoexp->addChild(AutoExpireDayPriority());
+    autoexp->addChild(AutoExpireExtraSpace());
+    autoexp->addChild(AutoExpireInsteadOfDelete());
     addChild(autoexp);
 
-    VerticalConfigurationGroup* jobs = new VerticalConfigurationGroup(false);
-    jobs->setLabel(QObject::tr("General (Jobs)"));
+    GroupSetting* jobs = new GroupSetting();
+    jobs->setLabel(QObject::tr("Jobs"));
     jobs->addChild(CommercialSkipMethod());
     jobs->addChild(CommFlagFast());
     jobs->addChild(AggressiveCommDetect());
     jobs->addChild(DefaultTranscoder());
     jobs->addChild(DeferAutoTranscodeDays());
 
-    VerticalConfigurationGroup* autogrp0 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    autogrp0->addChild(AutoMetadataLookup());
-    autogrp0->addChild(AutoCommercialFlag());
-    autogrp0->addChild(AutoTranscode());
-
-    VerticalConfigurationGroup* autogrp1 =
-        new VerticalConfigurationGroup(false, false, true, true);
-    autogrp0->addChild(AutoRunUserJob(1));
-    autogrp1->addChild(AutoRunUserJob(2));
-    autogrp1->addChild(AutoRunUserJob(3));
-    autogrp1->addChild(AutoRunUserJob(4));
-
-    HorizontalConfigurationGroup *autogrp =
-        new HorizontalConfigurationGroup(true, true, false, true);
+    GroupSetting* autogrp = new GroupSetting();
     autogrp->setLabel(
         QObject::tr("Default Job Queue Settings for New Scheduled Recordings"));
-    autogrp->addChild(autogrp0);
-    autogrp->addChild(autogrp1);
+    autogrp->addChild(AutoMetadataLookup());
+    autogrp->addChild(AutoCommercialFlag());
+    autogrp->addChild(AutoTranscode());
+    autogrp->addChild(AutoRunUserJob(1));
+    autogrp->addChild(AutoRunUserJob(2));
+    autogrp->addChild(AutoRunUserJob(3));
+    autogrp->addChild(AutoRunUserJob(4));
+
     jobs->addChild(autogrp);
 
     addChild(jobs);
 
-    VerticalConfigurationGroup* general2 = new VerticalConfigurationGroup(false);
-    general2->setLabel(QObject::tr("General (Advanced)"));
+    GroupSetting* general2 = new GroupSetting();
+    general2->setLabel(QObject::tr("Advanced"));
     general2->addChild(RecordPreRoll());
     general2->addChild(RecordOverTime());
     general2->addChild(CategoryOverTimeSettings());
     addChild(general2);
 
-    VerticalConfigurationGroup* changrp = new VerticalConfigurationGroup(false);
-    changrp->setLabel(QObject::tr("General (Channel Groups)"));
-    ChannelGroupSettings *changroupsettings = new ChannelGroupSettings();
-    changrp->addChild(changroupsettings);
+    GroupSetting* changrp = new GroupSetting();
+    changrp->setLabel(QObject::tr("Channel Groups"));
+    changrp->addChild(ChannelGroupRememberLast());
     changrp->addChild(BrowseChannelGroup());
     addChild(changrp);
 }
 
 EPGSettings::EPGSettings()
 {
-    VerticalConfigurationGroup* epg = new VerticalConfigurationGroup(false);
-    epg->setLabel(QObject::tr("Program Guide") + " 1/1");
-    epg->addChild(WatchTVGuide());
-    epg->addChild(DefaultTVChannel());
-    epg->addChild(EPGRecThreshold());
-    addChild(epg);
+    setLabel(QObject::tr("Program Guide"));
+    addChild(WatchTVGuide());
+    addChild(DefaultTVChannel());
+    addChild(EPGRecThreshold());
 }
 
 GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
 {
-    VerticalConfigurationGroup* sched = new VerticalConfigurationGroup(false);
+    setLabel(QObject::tr("Recording Priorities"));
+
+    GroupSetting* sched = new GroupSetting();
     sched->setLabel(QObject::tr("Scheduler Options"));
 
     sched->addChild(GRSchedMoveHigher());
@@ -3585,7 +3545,7 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
     sched->addChild(GRAutoRecPriority());
     addChild(sched);
 
-    VerticalConfigurationGroup* access = new VerticalConfigurationGroup(false);
+    GroupSetting* access = new GroupSetting();
     access->setLabel(QObject::tr("Accessibility Options"));
 
     access->addChild(GRSignLangRecPriority());
@@ -3595,7 +3555,7 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
     access->addChild(GRAudioDescRecPriority());
     addChild(access);
 
-    VerticalConfigurationGroup* rtype = new VerticalConfigurationGroup(false);
+    GroupSetting* rtype = new GroupSetting();
     rtype->setLabel(QObject::tr("Recording Type Priority Settings"));
 
     rtype->addChild(GRSingleRecordRecPriority());
@@ -3610,7 +3570,8 @@ GeneralRecPrioritiesSettings::GeneralRecPrioritiesSettings()
 
 AppearanceSettings::AppearanceSettings()
 {
-    VerticalConfigurationGroup* screen = new VerticalConfigurationGroup(false);
+    setLabel(QObject::tr("Appearance"));
+    GroupSetting* screen = new GroupSetting();
     screen->setLabel(QObject::tr("Theme") + " / " + QObject::tr("Screen Settings"));
 
     screen->addChild(MenuTheme());
@@ -3624,38 +3585,23 @@ AppearanceSettings::AppearanceSettings()
 //    screen->addChild(DisplaySizeHeight());
 //    screen->addChild(DisplaySizeWidth());
 
-    VerticalConfigurationGroup *column1 =
-        new VerticalConfigurationGroup(false, false, false, false);
-
-    column1->addChild(GuiWidth());
-    column1->addChild(GuiHeight());
-    column1->addChild(GuiOffsetX());
-    column1->addChild(GuiOffsetY());
-
-    VerticalConfigurationGroup *column2 =
-        new VerticalConfigurationGroup(false, false, false, false);
-
-    column2->addChild(GuiSizeForTV());
-    column2->addChild(HideMouseCursor());
-    column2->addChild(RunInWindow());
-    column2->addChild(UseFixedWindowSize());
-
-    HorizontalConfigurationGroup *columns =
-        new HorizontalConfigurationGroup(false, false, false, false);
-
-    columns->addChild(column1);
-    columns->addChild(column2);
-
-    screen->addChild(columns);
+    screen->addChild(GuiWidth());
+    screen->addChild(GuiHeight());
+    screen->addChild(GuiOffsetX());
+    screen->addChild(GuiOffsetY());
+    screen->addChild(GuiSizeForTV());
+    screen->addChild(HideMouseCursor());
+    screen->addChild(RunInWindow());
+    screen->addChild(UseFixedWindowSize());
 
     addChild(screen);
 
 #if defined(USING_XRANDR) || CONFIG_DARWIN
     const vector<DisplayResScreen> scr = GetVideoModes();
-    if (!scr.empty())
-        addChild(new VideoModeSettings());
+    /* TODO if (!scr.empty())
+        addChild(new VideoModeSettings()); */
 #endif
-    VerticalConfigurationGroup* dates = new VerticalConfigurationGroup(false);
+    GroupSetting* dates = new GroupSetting();
     dates->setLabel(QObject::tr("Localization"));
     dates->addChild(MythLanguage());
     dates->addChild(ISO639PreferredLanguage(0));
@@ -3665,7 +3611,7 @@ AppearanceSettings::AppearanceSettings()
     dates->addChild(MythTimeFormat());
     addChild(dates);
 
-    addChild(new LcdSettings());
+    addChild(LCDEnable());
 }
 
 // vim:set sw=4 ts=4 expandtab:
diff --git a/mythtv/programs/mythfrontend/globalsettings.h b/mythtv/programs/mythfrontend/globalsettings.h
index 93e774a..f149108 100644
--- a/mythtv/programs/mythfrontend/globalsettings.h
+++ b/mythtv/programs/mythfrontend/globalsettings.h
@@ -7,48 +7,49 @@
 #include "settings.h"
 #include "mythcontext.h"
 #include "videodisplayprofile.h"
+#include "standardsettings.h"
 
 #include <QMutex>
 
 class QFileInfo;
 
-class PlaybackSettings : public ConfigurationWizard
+class PlaybackSettings : public GroupSetting
 {
   public:
     PlaybackSettings();
 };
 
-class OSDSettings: virtual public ConfigurationWizard
+class OSDSettings: virtual public GroupSetting
 {
   public:
     OSDSettings();
 };
 
-class GeneralSettings : public ConfigurationWizard
+class GeneralSettings : public GroupSetting
 {
   public:
     GeneralSettings();
 };
 
-class EPGSettings : public ConfigurationWizard
+class EPGSettings : public GroupSetting
 {
   public:
     EPGSettings();
 };
 
-class AppearanceSettings : public ConfigurationWizard
+class AppearanceSettings : public GroupSetting
 {
   public:
     AppearanceSettings();
 };
 
-class MainGeneralSettings : public ConfigurationWizard
+class MainGeneralSettings : public GroupSetting
 {
   public:
     MainGeneralSettings();
 };
 
-class GeneralRecPrioritiesSettings : public ConfigurationWizard
+class GeneralRecPrioritiesSettings : public GroupSetting
 {
   public:
     GeneralRecPrioritiesSettings();
diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp
index 33a8840..dbd60e0 100644
--- a/mythtv/programs/mythfrontend/main.cpp
+++ b/mythtv/programs/mythfrontend/main.cpp
@@ -829,15 +829,22 @@ static void TVMenuCallback(void *data, QString &selection)
         startPrevious();
     else if (sel == "settings appearance")
     {
-        AppearanceSettings *settings = new AppearanceSettings();
-        DialogCode res = settings->exec();
-        delete settings;
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
 
+        if (gs->Create())
+        {
+            gs->setSettings(new AppearanceSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
+        /* TODO
         if (kDialogCodeRejected != res)
         {
             qApp->processEvents();
             GetMythMainWindow()->JumpTo("Reload Theme");
-        }
+        }*/
     }
     else if (sel == "settings themechooser")
     {
@@ -889,8 +896,16 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     else if (sel == "settings general")
     {
-        GeneralSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
+
+        if (gs->Create())
+        {
+            gs->setSettings(new GeneralSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
     }
     else if (sel == "settings audiogeneral")
     {
@@ -899,25 +914,61 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     else if (sel == "settings maingeneral")
     {
-        MainGeneralSettings mainsettings;
-        mainsettings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
+
+        if (gs->Create())
+        {
+            gs->setSettings(new MainGeneralSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
+
+        /*TODO need to execute this after
         QStringList strlist( QString("REFRESH_BACKEND") );
         gCoreContext->SendReceiveStringList(strlist);
+        */
+        
     }
     else if (sel == "settings playback")
     {
-        PlaybackSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
+
+        if (gs->Create())
+        {
+            gs->setSettings(new PlaybackSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
     }
     else if (sel == "settings osd")
     {
-        OSDSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
+
+        if (gs->Create())
+        {
+            gs->setSettings(new OSDSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
     }
     else if (sel == "settings epg")
     {
-        EPGSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
+
+        if (gs->Create())
+        {
+            gs->setSettings(new EPGSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
     }
     else if (sel == "settings channelgroups")
     {
@@ -926,8 +977,16 @@ static void TVMenuCallback(void *data, QString &selection)
     }
     else if (sel == "settings generalrecpriorities")
     {
-        GeneralRecPrioritiesSettings settings;
-        settings.exec();
+        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+        StandardSettingDialog *gs = new StandardSettingDialog(mainStack, "maingeeralsettings");
+
+        if (gs->Create())
+        {
+            gs->setSettings(new GeneralRecPrioritiesSettings());
+            mainStack->AddScreen(gs);
+        }
+        else
+            delete gs;
     }
     else if (sel == "settings channelrecpriorities")
     {
@@ -1056,6 +1115,7 @@ static bool RunMenu(QString themedir, QString themename)
 // the default values
 static void WriteDefaults()
 {
+/*
     PlaybackSettings ps;
     ps.Load();
     ps.Save();
@@ -1079,7 +1139,7 @@ static void WriteDefaults()
     grs.Save();
     VideoGeneralSettings vgs;
     vgs.Load();
-    vgs.Save();
+    vgs.Save();*/
 }
 
 static int internal_play_media(const QString &mrl, const QString &plot,
diff --git a/mythtv/programs/mythfrontend/mythfrontend.pro b/mythtv/programs/mythfrontend/mythfrontend.pro
index cf985d6..debf109 100644
--- a/mythtv/programs/mythfrontend/mythfrontend.pro
+++ b/mythtv/programs/mythfrontend/mythfrontend.pro
@@ -39,7 +39,9 @@ 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         
+# maingeneralsettingssetup.h  setup_video_general.h
+HEADERS += standardsettings.h
 
 SOURCES += main.cpp playbackbox.cpp viewscheduled.cpp audiogeneralsettings.cpp
 SOURCES += globalsettings.cpp manualschedule.cpp programrecpriority.cpp
@@ -60,7 +62,9 @@ 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        
+#maingeneralsettingssetup.cpp setup_video_general.cpp
+SOURCES += standardsettings.cpp 
 
 macx {
     mac_bundle {
diff --git a/mythtv/programs/mythfrontend/standardsettings.cpp b/mythtv/programs/mythfrontend/standardsettings.cpp
new file mode 100755
index 0000000..b15ee98
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.cpp
@@ -0,0 +1,698 @@
+#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"
+
+
+StandardSetting::StandardSetting(const QString &settingName, const QString &text)
+    : GroupSetting(text),
+    m_settingName(settingName),
+    m_haveChanged(false)
+{
+    this->SetData(QVariant::fromValue((MythGenericTree*)this));
+}
+
+StandardSetting::~StandardSetting()
+{
+}
+
+void StandardSetting::SetDBValue(const QString &text){
+    LOG(VB_GENERAL, LOG_ERR, QString("StandardSettingDialog::SetDBValue(%1) for %2").arg(text).arg(m_settingName));
+    setSettingValue(text);
+};
+
+void StandardSetting::setSettingValue(const QString newValue)
+{
+    m_settingValue=newValue;
+}
+
+const QString StandardSetting::getHelpText()
+{
+    return GetText("help");
+}
+
+const QString StandardSetting::getTextValue() const
+{
+    return GetText("value");
+}
+
+bool StandardSetting::haveChanged()
+{
+    if (m_haveChanged)
+        return true;
+    return GroupSetting::haveChanged();
+}
+
+GroupSetting::GroupSetting(const QString &text)
+    :MythGenericTree (text, 0, true)
+{
+}
+
+void GroupSetting::setLabel(const QString &label)
+{
+    SetText(label);
+}
+
+void GroupSetting::addChild(GroupSetting *standardSetting)
+{
+    addNode(standardSetting);
+}
+void GroupSetting::setHelpText(const QString &description)
+{
+    SetText(description,"help");
+}
+
+//TODO remove the need for this
+void GroupSetting::setScreen(MythScreenType *screen)
+{
+    m_screen = screen;
+
+    QList<MythGenericTree*>::iterator it;
+    QList<MythGenericTree*> *children = this->getAllChildren();
+
+    if (!children)
+        return;
+
+    MythGenericTree *child = NULL;
+
+    for (it = children->begin(); it != children->end(); ++it)
+    {
+        child = *it;
+        if (!child)
+            continue;
+        GroupSetting * setting = dynamic_cast<GroupSetting*>(child);
+        if (setting)
+            setting->setScreen(screen);
+    }
+}
+
+bool GroupSetting::haveChanged()
+{
+
+    QList<MythGenericTree*>::iterator it;
+    QList<MythGenericTree*> *children = this->getAllChildren();
+
+    if (!children)
+        return false;
+
+    MythGenericTree *child = NULL;
+
+    for (it = children->begin(); it != children->end(); ++it)
+    {
+        child = *it;
+        if (!child)
+            continue;
+        GroupSetting * setting = dynamic_cast<GroupSetting*>(child);
+        if (setting && setting->haveChanged())
+            return true;
+    }
+    return false;
+}
+
+void GroupSetting::Save()
+{
+    QList<MythGenericTree*>::iterator it;
+    QList<MythGenericTree*> *children = this->getAllChildren();
+
+    if (!children)
+        return;
+
+    MythGenericTree *child = NULL;
+
+    for (it = children->begin(); it != children->end(); ++it)
+    {
+        child = *it;
+        if (!child)
+            continue;
+        GroupSetting * setting = dynamic_cast<GroupSetting*>(child);
+        if (setting)
+            setting->Save();
+    }
+}
+
+void GroupSetting::Load()
+{
+    QList<MythGenericTree*>::iterator it;
+    QList<MythGenericTree*> *children = this->getAllChildren();
+
+    if (!children)
+        return;
+
+    MythGenericTree *child = NULL;
+
+    for (it = children->begin(); it != children->end(); ++it)
+    {
+        child = *it;
+        if (!child)
+            continue;
+        GroupSetting * setting = dynamic_cast<GroupSetting*>(child);
+        if (setting)
+            setting->Load();
+    }
+}
+
+void GroupSetting::edit()
+{
+    DialogCompletionEvent *dce =
+            new DialogCompletionEvent("editsetting", 0, "", "");
+    QCoreApplication::postEvent(m_screen, dce);
+}
+
+TextualSetting::TextualSetting(const QString &settingName, const QString &text, bool password)
+    : StandardSetting(settingName, text),
+    m_password(password)
+{
+}
+
+void TextualSetting::setValue(const QString &newValue)
+{
+    setSettingValue(newValue);
+}
+
+void TextualSetting::edit()
+{
+    MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
+
+    MythTextInputDialog *settingdialog =
+                                    new MythTextInputDialog(popupStack,
+                                    this->GetText(),FilterNone, m_password,m_settingValue);
+
+    if (settingdialog->Create())
+    {
+        settingdialog->SetReturnEvent(m_screen, "editsetting");
+        popupStack->AddScreen(settingdialog);
+    }
+}
+
+void TextualSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (m_settingValue!=dce->GetResultText())
+    {
+        m_haveChanged=true;
+        setSettingValue(dce->GetResultText());
+    }
+}
+
+void TextualSetting::setSettingValue(const QString newValue)
+{
+    m_settingValue = newValue;
+
+    if (m_password)
+        if (m_settingValue.isEmpty())
+            SetText("","value");
+        else
+            SetText("****","value");
+    else
+        SetText(m_settingValue,"value");
+}
+
+BoolSetting::BoolSetting(const QString &settingName, const QString &text)
+    : StandardSetting(settingName, text)
+{
+}
+
+void BoolSetting::edit()
+{
+    //LOG(VB_GENERAL, LOG_ERR, "BoolSetting::edit()");
+    DialogCompletionEvent *dce =
+            new DialogCompletionEvent("editsetting", 0, "", QVariant::fromValue((MythGenericTree*)this));
+    QCoreApplication::postEvent(m_screen, dce);
+}
+
+void BoolSetting::addChild (bool value, GroupSetting *child)
+{
+    if (value)
+        m_OnChildren.append(child);
+    else
+        m_OffChildren.append(child);
+/*
+    child = StandardSetting::addNode(child);
+    child->SetVisible(m_settingValue=="1");
+    return child;*/
+}
+
+void BoolSetting::setSettingValue(const QString newValue)
+{
+    m_settingValue = newValue;
+
+    QList< GroupSetting * > *nodes = NULL;
+
+    if (m_settingValue=="1")
+    {
+        SetText(QObject::tr("On"),"value");
+        nodes=&m_OnChildren;
+    }
+    else
+    {
+        SetText(QObject::tr("Off"),"value");
+        nodes=&m_OffChildren;
+    }
+
+    QList< MythGenericTree * > *children = getAllChildren ();
+    MythGenericTree *child;
+    foreach(child, *children)
+    {
+        this->removeNode(child);
+    }
+
+
+    GroupSetting *node;
+    foreach(node, *nodes)
+    {
+        this->addNode(node);
+    }
+}
+
+void BoolSetting::setValue(bool newValue)
+{
+    if (newValue)
+        setSettingValue("1");
+    else
+        setSettingValue("0");
+}
+
+void BoolSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (m_settingValue=="1")
+        setSettingValue(m_settingValue="0");
+    else
+        setSettingValue(m_settingValue="1");
+    m_haveChanged=true;
+}
+
+RangeSetting::RangeSetting(const QString &settingName, int min, int max, int step, bool allow_single_step)
+    : StandardSetting(settingName)
+{
+    m_min  = min;
+    m_max  = max;
+}
+
+void RangeSetting::setValue(int newValue)
+{
+    m_settingValue=QString("%1").arg(newValue);
+    update();
+}
+
+void RangeSetting::edit()
+{
+    MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
+
+
+    MythTextInputDialog *settingdialog =
+                                    new MythTextInputDialog(popupStack,
+                                    "Range: " +this->GetText(),(InputFilter)(FilterAlpha | FilterSymbols | FilterPunct) ,false, m_settingValue);
+    if (settingdialog->Create())
+    {
+        settingdialog->SetReturnEvent(m_screen, "editsetting");
+        popupStack->AddScreen(settingdialog);
+    }
+}
+
+void RangeSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (m_settingValue!=dce->GetResultText())
+    {
+        int newValue=dce->GetResultText().toInt();
+        if (newValue< m_min || newValue > m_max)
+        {
+            //TODO display out of bound message;
+            MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
+            MythConfirmationDialog * errorDialog = new MythConfirmationDialog(popupStack, 
+                QObject::tr("out of bound, the value should be between %1 and %2")
+                    .arg(m_min).arg(m_max),false);
+            if (errorDialog->Create())
+                popupStack->AddScreen(errorDialog);
+        }
+        else 
+        {
+            m_haveChanged=true;
+            setSettingValue(dce->GetResultText());
+            
+        }
+        update();
+    }
+}
+
+void RangeSetting::update()
+{
+    SetText(m_settingValue,"value");
+}
+
+ListSetting::ListSetting(const QString &settingName, const QString &text)
+    :StandardSetting(settingName, text)
+{
+    Load();
+}
+
+void ListSetting::setValue(int newValue)
+{
+    QMapIterator<QString, QString> i(m_options);
+    while (i.hasNext())
+    {
+        i.next();
+        if (newValue==0)
+        {
+            setSettingValue(i.key());
+            return;
+        }
+        newValue--;
+    }
+}
+
+void ListSetting::setSettingValue(const QString newValue)
+{
+        LOG(VB_GENERAL, LOG_ERR, QString("ListSetting::setSettingValue(%1) for %2")
+            .arg(newValue).arg(m_settingName));
+    m_settingValue=newValue;
+    if (m_options.contains(m_settingValue))
+    {
+        LOG(VB_GENERAL, LOG_ERR, QString("ListSetting::setSettingValue(%1) for %2 => %3")
+            .arg(newValue).arg(m_settingName).arg(m_options[m_settingValue]));
+        SetText(m_options[m_settingValue],"value");
+    }
+    else
+    {
+        LOG(VB_GENERAL, LOG_ERR, QString("*ListSetting::setSettingValue(%1) for %2")
+            .arg(newValue).arg(m_settingName));
+        SetText(newValue+"*","value");
+    }
+}
+
+
+void ListSetting::addSelection(QString label, QString value, bool select)
+{
+    m_options[value]=label;
+    //TODO do something with select
+        LOG(VB_GENERAL, LOG_ERR, QString("%1 => %2 =? %3")
+            .arg(m_settingName).arg(value).arg(m_settingValue));
+    if (value == m_settingValue && m_options.contains(m_settingValue))
+        SetText(m_options[m_settingValue],"value");
+}
+
+void ListSetting::clearSelections()
+{
+    m_options.clear();
+}
+
+void ListSetting::edit()
+{
+    MythScreenStack *popupStack =
+                            GetMythMainWindow()->GetStack("popup stack");
+
+    MythDialogBox * m_menuPopup =
+            new MythDialogBox(GetText(), popupStack, "optionmenu");
+
+    if (m_menuPopup->Create())
+        popupStack->AddScreen(m_menuPopup);
+
+    m_menuPopup->SetReturnEvent(m_screen, "editsetting");
+
+    //populate the list of choice
+    QMapIterator<QString, QString> i(m_options);
+    while (i.hasNext())
+    {
+        i.next();
+        if (i.key()==m_settingValue)
+            m_menuPopup->AddButton(i.value(),i.key(),false,true);
+        else
+            m_menuPopup->AddButton(i.value(),i.key());
+    }
+}
+
+void ListSetting::resultEdit(DialogCompletionEvent *dce)
+{
+    if (dce->GetResult()!=-1 && m_settingValue!=dce->GetData().toString())
+    {
+        m_haveChanged=true;
+        setSettingValue(dce->GetData().toString());
+    }
+}
+
+MythSpinBoxDialog::MythSpinBoxDialog(MythScreenStack *parent,
+                                         const QString &message,
+                                         const QString &defaultValue)
+   : MythScreenType(parent, "mythspinboxpopup")
+{
+    m_message = message;
+    m_defaultValue = defaultValue;
+    m_spinBox = NULL;
+
+    m_id = "";
+    m_retObject = NULL;
+}
+
+bool MythSpinBoxDialog::Create(void)
+{
+    if (!LoadWindowFromXML("standardsetting-ui.xml", "MythSpinBoxDialog", this))
+        return false;
+
+    MythUIText *messageText = NULL;
+    MythUIButton *okButton = NULL;
+    MythUIButton *cancelButton = NULL;
+
+    bool err = false;
+    UIUtilE::Assign(this, m_spinBox, "input", &err);
+    UIUtilE::Assign(this, messageText, "message", &err);
+    UIUtilE::Assign(this, okButton, "ok", &err);
+    UIUtilW::Assign(this, cancelButton, "cancel");
+    if (!m_spinBox)LOG(VB_GENERAL, LOG_ERR, "spinBox");
+    if (!messageText)LOG(VB_GENERAL, LOG_ERR, "messageText");
+    if (!okButton)LOG(VB_GENERAL, LOG_ERR, "okButton");
+
+    if (err)
+    {
+        LOG(VB_GENERAL, LOG_ERR, "Cannot load screen 'MythSpinBoxDialog'");
+        return false;
+    }
+
+    if (cancelButton)
+        connect(cancelButton, SIGNAL(Clicked()), SLOT(Close()));
+    connect(okButton, SIGNAL(Clicked()), SLOT(sendResult()));
+
+    m_spinBox->SetValue(m_defaultValue);
+
+    messageText->SetText(m_message);
+
+    BuildFocusList();
+
+    return true;
+}
+
+void MythSpinBoxDialog::SetReturnEvent(QObject *retobject,
+                                         const QString &resultid)
+{
+    m_retObject = retobject;
+    m_id = resultid;
+}
+
+void MythSpinBoxDialog::sendResult()
+{
+    QString inputString = m_spinBox->GetValue();
+    emit haveResult(inputString);
+
+    if (m_retObject)
+    {
+        DialogCompletionEvent *dce = new DialogCompletionEvent(m_id, 0,
+                                                            inputString, "");
+        QCoreApplication::postEvent(m_retObject, dce);
+    }
+
+    Close();
+}
+
+void MythSpinBoxDialog::SetRange(int low, int high, int step, uint pageMultiple)
+{
+    if (m_spinBox)
+        m_spinBox->SetRange(low, high, step, pageMultiple);
+}
+
+StandardSettingDialog::StandardSettingDialog(MythScreenStack *parent, const char *name) :
+    MythScreenType(parent, name),
+    m_buttonTree(0),
+    m_title(0),
+    m_grouphelp(0),
+    m_titleList(0),
+    m_selectedSettingLabel(0),
+    m_selectedSettingValue(0),
+    m_selectedSettingHelp(0),
+    m_cancelButton(0),
+    m_saveButton(0),
+    m_menuPopup(0),
+    m_loaded(false),
+    m_editedSetting(0)
+{
+    m_settingsTree=new GroupSetting(name);
+    m_settingsTree->setScreen(this);
+}
+
+StandardSettingDialog::~StandardSettingDialog()
+{
+}
+
+bool StandardSettingDialog::Create(void)
+{
+    LOG(VB_GENERAL, LOG_ERR, "StandardSettingDialog::Create");
+    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_buttonTree,"settingstree",&error);
+
+    UIUtilW::Assign(this, m_selectedSettingLabel, "selectedsettinglabel");
+    UIUtilW::Assign(this, m_selectedSettingValue, "selectedsettingvalue");
+    UIUtilW::Assign(this, m_selectedSettingHelp, "selectedsettinghelp");
+
+    connect(m_buttonTree,SIGNAL(itemSelected(MythUIButtonListItem*)), this,SLOT(settingSelected(MythUIButtonListItem*)));
+    connect(m_buttonTree,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)
+{
+    MythGenericTree * node = qVariantValue<MythGenericTree*>(item->GetData());
+    if (m_title)
+    {
+        if (node)
+        {
+            /*QString newTitle;
+            MythGenericTree * parentNode;
+            while (parentNode = node->getParent())
+            {
+                newTitle=QString("%1 > %2").arg(parentNode->GetText()).arg(newTitle);
+                node = parentNode;
+            }
+            m_title->SetText(newTitle);*/
+            m_title->SetText(node->getParent()->GetText());
+        }
+    }
+
+    if (m_grouphelp)
+    {
+        m_grouphelp->SetText(node->getParent()->GetText("help"));
+    }
+    else
+        LOG(VB_GENERAL, LOG_ERR, "StandardSettingDialog::settingSelected()");
+
+    if (m_selectedSettingLabel)
+        m_selectedSettingLabel->SetText(item->GetText());
+    if (m_selectedSettingValue)
+        m_selectedSettingValue->SetText(item->GetText("value"));
+    if (m_selectedSettingHelp)
+        m_selectedSettingHelp->SetText(item->GetText("help"));
+
+    
+}
+
+void StandardSettingDialog::settingClicked(MythUIButtonListItem *item)
+{
+    MythGenericTree* tree = item->GetData().value<MythGenericTree*>();
+    StandardSetting *ss = dynamic_cast<StandardSetting*>(tree);
+    if (ss)
+    {
+        m_editedSetting=ss;
+        ss->edit();
+    }
+    else 
+    {
+        GroupSetting *gs = dynamic_cast<GroupSetting*>(tree);
+        if (gs)
+        {
+            MythGenericTree *child = gs->getVisibleChildAt(0);
+            if (child)
+            m_buttonTree->SetCurrentNode(child);
+        }
+    }
+}
+
+void StandardSettingDialog::customEvent(QEvent *event)
+{
+    if (event->type() == DialogCompletionEvent::kEventType)
+    {
+        DialogCompletionEvent *dce = (DialogCompletionEvent*)(event);
+        QString resultid  = dce->GetId();
+
+        if (resultid == "editsetting")
+        {
+            if (!m_editedSetting) return;
+            m_editedSetting->resultEdit(dce);
+            m_editedSetting=NULL;
+
+            //Force to refresh the button tree. not very elegant but no choice at the moment
+            MythGenericTree *currentNode = m_buttonTree->GetCurrentNode();
+            m_buttonTree->AssignTree(m_settingsTree);
+            m_buttonTree->SetCurrentNode(currentNode);
+        }
+        else if (resultid == "exit")
+        {
+            int buttonnum = dce->GetResult();
+            if (buttonnum == 0)
+            {
+                Save();
+                MythScreenType::Close();
+            }
+            else if (buttonnum == 1)
+                MythScreenType::Close();
+        }
+    }
+}
+
+void StandardSettingDialog::setSettings(GroupSetting * groupSettings)
+{
+    m_settingsTree=groupSettings;
+    m_settingsTree->setScreen(this);
+    m_settingsTree->Load();
+    m_buttonTree->AssignTree(m_settingsTree);
+        BuildFocusList();
+}
+
+void StandardSettingDialog::Save()
+{
+    if (m_settingsTree)
+        m_settingsTree->Save();
+}
+
+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();
+}
+
+
+
+
+
+
diff --git a/mythtv/programs/mythfrontend/standardsettings.h b/mythtv/programs/mythfrontend/standardsettings.h
new file mode 100755
index 0000000..095057d
--- /dev/null
+++ b/mythtv/programs/mythfrontend/standardsettings.h
@@ -0,0 +1,460 @@
+#ifndef STANDARDSETTINGS_H_
+#define STANDARDSETTINGS_H_
+
+#include "mythuibuttonlist.h"
+#include <mythdialogbox.h>
+#include <mythuibuttontree.h>
+#include <mythgenerictree.h>
+#include <QMap>
+
+/** TODO LIST
+ ListSetting is not properly initialize, it should show the label not the value
+Implement Save method
+*/
+
+/*
+MythUIButtonListItem Type
+
+*TextualSetting
+PasswordSetting
+DirectorySetting
+FileSetting
+*BooleanSetting
+SpinSetting
+GroupSetting
+GroupBooleanSetting
+GroupListSetting
+ListSetting
+ListSetting+refresh
+FreeListSetting
+Button for testing
+*/
+/*
+
+
+class DBSetting
+{
+  public:
+    virtual const QString getSetting(const QString &settingName)=0;
+    virtual void setSetting(const QString &settingName, const QString &settingValue)=0;
+}; 
+
+class HostDBSetting : public DBSetting
+{
+  public:
+    virtual const QString getSetting(const QString &settingName){return "host";};
+    virtual void setSetting(const QString &settingName, const QString &settingValue){};
+};
+
+class GlobalDBSetting : public DBSetting
+{
+  public:
+    virtual const QString getSetting(const QString &settingName){return "global";};
+    virtual void setSetting(const QString &settingName, const QString &settingValue){};
+
+};*/
+
+/**
+ * Group Setting together
+ */
+class GroupSetting : public MythGenericTree, public Storage
+{
+  public:
+    GroupSetting(const QString &text = "");
+    virtual ~GroupSetting(){};
+
+    void setLabel(const QString &label);
+    QString getLabel(){return GetText();};
+    void addChild(GroupSetting *groupSetting);
+    void setHelpText(const QString &description);
+    QString getHelpText(){return GetText("help");};
+
+    void setScreen(MythScreenType *screen);
+
+    void Save();
+    void Load();
+    virtual void edit();
+    //virtual void resultEdit(DialogCompletionEvent *dce);
+    virtual bool haveChanged();
+  protected:
+    const QString getSettingName(){return "";};
+    void setSettingValue(const QString newValue){};
+    MythScreenType *m_screen;
+
+};
+
+
+// allow to set a textual setting
+class StandardSetting : public GroupSetting, public StorageUser
+{
+  public:
+    StandardSetting(const QString &settingName, const QString &text = "");
+    virtual ~StandardSetting();
+
+    const QString getHelpText();
+
+
+    const QString getTextValue() const;
+    const QString getValue() const{return GetText("value");};
+    virtual void resultEdit(DialogCompletionEvent *dce)=0;
+    bool haveChanged();
+
+    void SetDBValue(const QString &text);
+    QString GetDBValue(void) const { return m_settingValue ;};
+
+  protected:
+    //void SaveChildren();
+    //void LoadChildren();
+    //const QString settingName();//{return m_settingName;};
+    virtual void setSettingValue(const QString newValue);//{m_settingValue=newValue;};
+    QString m_settingName;
+    QString m_settingValue;
+
+
+    bool m_haveChanged;
+    //DBSetting * m_DBSetting;
+};
+
+
+/**
+ * Display and edit a textual value
+ */
+class TextualSetting : public StandardSetting
+{
+  public:
+    TextualSetting(const QString &settingName, const QString &text = "", bool password=false);
+    virtual ~TextualSetting(){};
+    void setValue(const QString &newValue);
+    void setSettingValue(const QString newValue);
+    void edit();
+    virtual void resultEdit(DialogCompletionEvent *dce);
+    
+  protected:
+    bool m_password;
+};
+
+class GlobalTextualSetting : public TextualSetting, public GlobalDBStorage
+{
+  public:
+    GlobalTextualSetting(const QString &settingName, const QString &text = "", bool password=false)
+        :TextualSetting(settingName, text, password), GlobalDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        TextualSetting::Load();
+        GlobalDBStorage::Load();
+    }
+    void Save()
+    {
+        TextualSetting::Save();
+        GlobalDBStorage::Save();
+    }
+
+
+
+};
+
+class HostTextualSetting : public TextualSetting, public HostDBStorage
+{
+  public:
+    HostTextualSetting(const QString &settingName, const QString &text = "", bool password=false)
+        :TextualSetting(settingName, text, password), HostDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        TextualSetting::Load();
+        HostDBStorage::Load();
+    }
+
+    void Save()
+    {
+        TextualSetting::Save();
+        HostDBStorage::Save();
+    }
+};
+
+class TransTextualSetting : public TextualSetting, public TransientStorage
+{
+  public:
+    TransTextualSetting(bool password=false)
+        :TextualSetting("", "", password), TransientStorage()
+    {
+    };
+};
+
+
+/**
+ * Display and edit a textual value
+ */
+
+class ListSetting : public StandardSetting
+{
+  public:
+    ListSetting(const QString &settingName, const QString &text = "");
+    virtual ~ListSetting(){};
+    void setValue(int newValue);
+    void setSettingValue(const QString newValue);
+    void addSelection(QString label, QString value, bool select = false);
+    void clearSelections();
+    virtual void edit();
+    virtual void resultEdit(DialogCompletionEvent *dce);
+  private:
+    QMap<QString, QString> m_options;
+};
+
+class GlobalListSetting : public ListSetting, public GlobalDBStorage
+{
+  public:
+    GlobalListSetting(const QString &settingName, const QString &text = "")
+        :ListSetting(settingName, text), GlobalDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        ListSetting::Load();
+        GlobalDBStorage::Load();
+    }
+    void Save()
+    {
+        ListSetting::Save();
+        GlobalDBStorage::Save();
+    }
+};
+
+class HostListSetting : public ListSetting, public HostDBStorage
+{
+  public:
+    HostListSetting(const QString &settingName, const QString &text = "")
+        :ListSetting(settingName, text), HostDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        ListSetting::Load();
+        HostDBStorage::Load();
+    }
+    void Save()
+    {
+        ListSetting::Save();
+        HostDBStorage::Save();
+    }
+};
+
+class TransListSetting : public ListSetting, public TransientStorage
+{
+  public:
+    TransListSetting()
+        :ListSetting("", ""), TransientStorage()
+    {
+    };
+};
+
+/**
+ * Display and edit a textual value
+ */
+
+class BoolSetting : public StandardSetting
+{
+  public:
+    BoolSetting(const QString &settingName, const QString &text = "");
+    virtual ~BoolSetting(){};
+    void setValue(bool newValue);
+    bool boolValue() const{return GetText("value")=="1";};
+    void edit();
+    void resultEdit(DialogCompletionEvent *dce);
+    void addChild (bool value, GroupSetting *child);
+
+  protected:
+    virtual void setSettingValue(const QString newValue);
+  private:
+    QList<GroupSetting *> m_OnChildren;
+    QList<GroupSetting *> m_OffChildren;
+};
+
+class GlobalBoolSetting : public BoolSetting, public GlobalDBStorage
+{
+  public:
+    GlobalBoolSetting(const QString &settingName, const QString &text = "")
+        : BoolSetting(settingName, text), GlobalDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        BoolSetting::Load();
+        GlobalDBStorage::Load();
+    }
+    void Save()
+    {
+        BoolSetting::Save();
+        GlobalDBStorage::Save();
+    }
+};
+
+class HostBoolSetting : public BoolSetting, public HostDBStorage
+{
+  public:
+    HostBoolSetting(const QString &settingName, const QString &text = "")
+        : BoolSetting(settingName, text), HostDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        BoolSetting::Load();
+        HostDBStorage::Load();
+    }
+    void Save()
+    {
+        BoolSetting::Save();
+        HostDBStorage::Save();
+    }
+};
+
+class TransBoolSetting : public BoolSetting, public TransientStorage
+{
+  public:
+    TransBoolSetting()
+        : BoolSetting(""), TransientStorage()
+    {
+    };
+};
+
+
+
+class RangeSetting : public StandardSetting
+{
+  public:
+    RangeSetting(const QString &settingName, int min, int max, int step, bool allow_single_step = false);
+    virtual ~RangeSetting(){};
+    virtual void edit();
+    virtual void resultEdit(DialogCompletionEvent *dce);
+  //  void SetRange(int min, int max);
+    void setValue(int newValue);
+    int intValue() const{return GetText("value").toInt();};
+  protected:
+    void update();
+  private:
+    int m_min;
+    int m_max;
+};
+
+class GlobalRangeSetting: public RangeSetting, public GlobalDBStorage 
+{
+  public:
+    GlobalRangeSetting(const QString &settingName, int min, int max, int step, bool allow_single_step = false)
+        :RangeSetting(settingName, min, max, step, allow_single_step), GlobalDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        RangeSetting::Load();
+        GlobalDBStorage::Load();
+    }
+    void Save()
+    {
+        RangeSetting::Save();
+        GlobalDBStorage::Save();
+    }
+};
+
+class HostRangeSetting: public RangeSetting, public HostDBStorage
+{
+  public:
+    HostRangeSetting(const QString &settingName, int min, int max, int step, bool allow_single_step = false)
+        :RangeSetting(settingName, min, max, step, allow_single_step), HostDBStorage (this, settingName)
+    {
+    };
+    void Load()
+    {
+        RangeSetting::Load();
+        HostDBStorage::Load();
+    }
+    void Save()
+    {
+        RangeSetting::Save();
+        HostDBStorage::Save();
+    }
+};
+
+class TransRangeSetting: public RangeSetting, public TransientStorage
+{
+  public:
+    TransRangeSetting(int min, int max, int step, bool allow_single_step = false)
+        :RangeSetting("", min, max, step, allow_single_step), TransientStorage()
+    {
+    };
+};
+
+
+
+
+
+class /*MUI_PUBLIC*/ MythSpinBoxDialog : public MythScreenType
+{
+    Q_OBJECT
+
+  public:
+    MythSpinBoxDialog(MythScreenStack *parent, const QString &message,
+                        const QString &defaultValue = "");
+
+    bool Create(void);
+
+    void SetRange(int low, int high, int step, uint pageMultiple = 5);
+
+    void SetReturnEvent(QObject *retobject, const QString &resultid);
+
+  signals:
+     void haveResult(QString);
+
+  protected:
+    MythUISpinBox *m_spinBox;
+    QString m_message;
+    QString m_defaultValue;
+    QObject *m_retObject;
+    QString m_id;
+
+  protected slots:
+    void sendResult();
+};
+
+
+
+
+class StandardSettingDialog : public MythScreenType
+{
+    Q_OBJECT
+
+  public:
+
+    StandardSettingDialog(MythScreenStack *parent, const char *name);
+    ~StandardSettingDialog();
+    bool Create(void);
+    virtual void customEvent(QEvent *event);
+    void setSettings(GroupSetting * groupSettings);
+  public slots:
+    void Close(void);
+  protected:
+    GroupSetting *m_settingsTree;
+    MythUIButtonTree *m_buttonTree;
+  private slots:
+    void settingSelected(MythUIButtonListItem *item);
+    void settingClicked(MythUIButtonListItem *item);
+  private:
+    void Save();
+    MythUIText *m_title;
+    MythUIText *m_grouphelp;
+    MythUIButtonList *m_titleList;
+    MythUIText *m_selectedSettingLabel;
+    MythUIText *m_selectedSettingValue;
+    MythUIText *m_selectedSettingHelp;
+    MythUIButton *m_cancelButton;
+    MythUIButton *m_saveButton;
+    MythDialogBox     *m_menuPopup;
+    bool m_loaded;
+    StandardSetting * m_editedSetting;
+};
+
+
+
+#endif
