diff --git a/mythtv/programs/mythfrontend/main.cpp b/mythtv/programs/mythfrontend/main.cpp
index 259e020..c2a1d48 100644
--- a/mythtv/programs/mythfrontend/main.cpp
+++ b/mythtv/programs/mythfrontend/main.cpp
@@ -1,4 +1,3 @@
-#include <unistd.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <cerrno>
@@ -75,6 +74,9 @@ using namespace std;
 #include "mythversion.h"
 #include "taskqueue.h"
 
+
+#include "standardsettings.h"
+
 // Video
 #include "cleanup.h"
 #include "globals.h"
@@ -138,8 +140,16 @@ namespace
 
             if (passwordValid)
             {
-                VideoGeneralSettings settings;
-                settings.exec();
+                MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
+                StandardSettingDialog *ssd = new StandardSettingDialog(mainStack, "videogeneralsettings");
+
+                if (ssd->Create())
+                {
+                    ssd->loadSettings(new VideoGeneralSettings());
+                    mainStack->AddScreen(ssd);
+                }
+                else
+                    delete ssd;
             }
             else
             {
diff --git a/mythtv/programs/mythfrontend/mythfrontend.pro b/mythtv/programs/mythfrontend/mythfrontend.pro
index 7c71469..dde9b2d 100644
--- a/mythtv/programs/mythfrontend/mythfrontend.pro
+++ b/mythtv/programs/mythfrontend/mythfrontend.pro
@@ -39,7 +39,7 @@ HEADERS += videoplayercommand.h         videopopups.h
 HEADERS += videofilter.h                videolist.h
 HEADERS += videoplayersettings.h        videodlg.h
 HEADERS += videoglobalsettings.h        upnpscanner.h
-HEADERS += commandlineparser.h
+HEADERS += commandlineparser.h          standardsettings.h
 
 SOURCES += main.cpp playbackbox.cpp viewscheduled.cpp audiogeneralsettings.cpp
 SOURCES += globalsettings.cpp manualschedule.cpp programrecpriority.cpp
@@ -60,7 +60,7 @@ SOURCES += videoplayercommand.cpp       videopopups.cpp
 SOURCES += videofilter.cpp              videolist.cpp
 SOURCES += videoplayersettings.cpp      videodlg.cpp
 SOURCES += videoglobalsettings.cpp      upnpscanner.cpp
-SOURCES += commandlineparser.cpp
+SOURCES += commandlineparser.cpp        standardsettings.cpp
 
 HEADERS += serviceHosts/frontendServiceHost.h
 HEADERS += services/frontend.h
diff --git a/mythtv/programs/mythfrontend/videoglobalsettings.cpp b/mythtv/programs/mythfrontend/videoglobalsettings.cpp
index 0365bfc..55bd18d 100644
--- a/mythtv/programs/mythfrontend/videoglobalsettings.cpp
+++ b/mythtv/programs/mythfrontend/videoglobalsettings.cpp
@@ -9,12 +9,14 @@
 #include "videodlg.h"
 #include "videoglobalsettings.h"
 
+#include "mythlogging.h"
+
 namespace
 {
 // General Settings
-HostComboBox *VideoDefaultParentalLevel()
+HostComboBoxSetting *VideoDefaultParentalLevel()
 {
-    HostComboBox *gc = new HostComboBox("VideoDefaultParentalLevel");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("VideoDefaultParentalLevel");
     gc->setLabel(QObject::tr("Starting Parental Level"));
     gc->addSelection(QObject::tr("4 - Highest"),
                      QString::number(ParentalLevel::plHigh));
@@ -33,9 +35,9 @@ const char *password_clue =
     QT_TRANSLATE_NOOP("QObject", "Setting this value to all numbers will make your life "
                 "much easier.");
 
-HostLineEdit *VideoAdminPassword()
+HostTextEditSetting *VideoAdminPassword()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoAdminPassword");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoAdminPassword");
     gc->setLabel(QObject::tr("Parental Level 4 PIN"));
     gc->setHelpText(QString("%1 %2")
         .arg(QObject::tr("This PIN is used to enter Parental Control "
@@ -44,9 +46,9 @@ HostLineEdit *VideoAdminPassword()
     return gc;
 }
 
-HostLineEdit *VideoAdminPasswordThree()
+HostTextEditSetting *VideoAdminPasswordThree()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoAdminPasswordThree");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoAdminPasswordThree");
     gc->setLabel(QObject::tr("Parental Level 3 PIN"));
     gc->setHelpText(QString("%1 %2")
         .arg(QObject::tr("This PIN is used to enter Parental Control Level 3."))
@@ -54,9 +56,9 @@ HostLineEdit *VideoAdminPasswordThree()
     return gc;
 }
 
-HostLineEdit *VideoAdminPasswordTwo()
+HostTextEditSetting *VideoAdminPasswordTwo()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoAdminPasswordTwo");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoAdminPasswordTwo");
     gc->setLabel(QObject::tr("Parental Level 2 PIN"));
     gc->setHelpText(QString("%1 %2")
         .arg(QObject::tr("This PIN is used to enter Parental Control Level 2."))
@@ -64,9 +66,9 @@ HostLineEdit *VideoAdminPasswordTwo()
     return gc;
 }
 
-HostCheckBox *VideoAggressivePC()
+HostCheckBoxSetting *VideoAggressivePC()
 {
-    HostCheckBox *gc = new HostCheckBox("VideoAggressivePC");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("VideoAggressivePC");
     gc->setLabel(QObject::tr("Aggressive Parental Control"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If set, you will not be able to return "
@@ -76,9 +78,9 @@ HostCheckBox *VideoAggressivePC()
     return gc;
 }
 
-HostLineEdit *VideoStartupDirectory()
+HostTextEditSetting *VideoStartupDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoStartupDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoStartupDir");
     gc->setLabel(QObject::tr("Directories that hold videos"));
     gc->setValue(DEFAULT_VIDEOSTARTUP_DIR);
     gc->setHelpText(QObject::tr("Multiple directories can be separated by ':'. "
@@ -87,9 +89,9 @@ HostLineEdit *VideoStartupDirectory()
     return gc;
 }
 
-HostLineEdit *VideoArtworkDirectory()
+HostTextEditSetting *VideoArtworkDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("VideoArtworkDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("VideoArtworkDir");
     gc->setLabel(QObject::tr("Directory that holds movie posters"));
     gc->setValue(GetConfDir() + "/Video/Artwork");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
@@ -98,9 +100,9 @@ HostLineEdit *VideoArtworkDirectory()
     return gc;
 }
 
-HostLineEdit *VideoScreenshotDirectory()
+HostTextEditSetting *VideoScreenshotDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.screenshotDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("mythvideo.screenshotDir");
     gc->setLabel(QObject::tr("Directory that holds movie screenshots"));
     gc->setValue(GetConfDir() + "/Video/Screenshots");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
@@ -109,9 +111,9 @@ HostLineEdit *VideoScreenshotDirectory()
     return gc;
 }
 
-HostLineEdit *VideoBannerDirectory()
+HostTextEditSetting *VideoBannerDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.bannerDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("mythvideo.bannerDir");
     gc->setLabel(QObject::tr("Directory that holds movie/TV Banners"));
     gc->setValue(GetConfDir() + "/Video/Banners");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
@@ -120,9 +122,9 @@ HostLineEdit *VideoBannerDirectory()
     return gc;
 }
 
-HostLineEdit *VideoFanartDirectory()
+HostTextEditSetting *VideoFanartDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.fanartDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("mythvideo.fanartDir");
     gc->setLabel(QObject::tr("Directory that holds movie fanart"));
     gc->setValue(GetConfDir() + "/Video/Fanart");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
@@ -131,9 +133,9 @@ HostLineEdit *VideoFanartDirectory()
     return gc;
 }
 
-HostLineEdit *TrailerDirectory()
+HostTextEditSetting *TrailerDirectory()
 {
-    HostLineEdit *gc = new HostLineEdit("mythvideo.TrailersDir");
+    HostTextEditSetting *gc = new HostTextEditSetting("mythvideo.TrailersDir");
     gc->setLabel(QObject::tr("Directory that holds movie trailers"));
     gc->setValue(GetConfDir() + "/Video/Trailers");
     gc->setHelpText(QObject::tr("This directory must exist, and the user "
@@ -148,9 +150,9 @@ HostLineEdit *TrailerDirectory()
 
 // General Settings
 
-HostComboBox *SetOnInsertDVD()
+HostComboBoxSetting *SetOnInsertDVD()
 {
-    HostComboBox *gc = new HostComboBox("DVDOnInsertDVD");
+    HostComboBoxSetting *gc = new HostComboBoxSetting("DVDOnInsertDVD");
     gc->setLabel(QObject::tr("On DVD insertion"));
     gc->addSelection(QObject::tr("Display mythdvd menu"),"1");
     gc->addSelection(QObject::tr("Do nothing"),"0");
@@ -160,9 +162,9 @@ HostComboBox *SetOnInsertDVD()
     return gc;
 }
 
-HostCheckBox *VideoTreeRemember()
+HostCheckBoxSetting *VideoTreeRemember()
 {
-    HostCheckBox *gc = new HostCheckBox("mythvideo.VideoTreeRemember");
+    HostCheckBoxSetting *gc = new HostCheckBoxSetting("mythvideo.VideoTreeRemember");
     gc->setLabel(QObject::tr("Video Tree remembers last selected position"));
     gc->setValue(false);
     gc->setHelpText(QObject::tr("If set, the current position in the Video "
@@ -170,142 +172,89 @@ HostCheckBox *VideoTreeRemember()
     return gc;
 }
 
-struct ConfigPage
-{
-    typedef std::vector<ConfigurationGroup *> PageList;
-
-  protected:
-    ConfigPage(PageList &pl) : m_pl(pl)
-    {
-    }
-
-    void Add(ConfigurationGroup *page)
-    {
-        m_pl.push_back(page);
-    }
-
-  private:
-    ConfigPage(const ConfigPage &);
-    ConfigPage &operator=(const ConfigPage &);
-
-  private:
-    PageList &m_pl;
-};
-
-struct VConfigPage : public ConfigPage
-{
-    VConfigPage(PageList &pl, bool luselabel = true, bool luseframe  = true,
-                bool lzeroMargin = false, bool lzeroSpace = false) :
-        ConfigPage(pl)
-    {
-        m_vc_page = new VerticalConfigurationGroup(luselabel, luseframe,
-                                                   lzeroMargin, lzeroSpace);
-        Add(m_vc_page);
-    }
 
-    VerticalConfigurationGroup *operator->()
-    {
-        return m_vc_page;
-    }
 
-  private:
-    VerticalConfigurationGroup *m_vc_page;
-};
 
-class RatingsToPL : public TriggeredConfigurationGroup
+HostCheckBoxSetting *RatingsToPL()
 {
-  public:
-    RatingsToPL() : TriggeredConfigurationGroup(false)
+    HostCheckBoxSetting *r2pl =
+            new HostCheckBoxSetting("mythvideo.ParentalLevelFromRating");
+    r2pl->setLabel(QObject::tr("Enable automatic Parental Level from "
+                               "rating"));
+    r2pl->setValue(false);
+    r2pl->setHelpText(QObject::tr("If enabled, searches will automatically "
+                                  "set the Parental Level to the one "
+                                  "matching the rating below."));
+
+    typedef std::map<ParentalLevel::Level, QString> r2pl_map;
+    r2pl_map r2pl_defaults;
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLowest,
+            QObject::tr("G", "PL 1 default search string.")));
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLow,
+            QObject::tr("PG", "PL 2 default search string.")));
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plMedium,
+            QObject::tr("PG-13", "PL3 default search string.")));
+    r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plHigh,
+            QObject::tr("R:NC-17", "PL4 default search string.")));
+
+    for (ParentalLevel pl(ParentalLevel::plLowest);
+         pl.GetLevel() <= ParentalLevel::plHigh && pl.good(); ++pl)
     {
-        HostCheckBox *r2pl =
-                new HostCheckBox("mythvideo.ParentalLevelFromRating");
-        r2pl->setLabel(QObject::tr("Enable automatic Parental Level from "
-                                   "rating"));
-        r2pl->setValue(false);
-        r2pl->setHelpText(QObject::tr("If enabled, searches will automatically "
-                                      "set the Parental Level to the one "
-                                      "matching the rating below."));
-        addChild(r2pl);
-        setTrigger(r2pl);
-
-        typedef std::map<ParentalLevel::Level, QString> r2pl_map;
-        r2pl_map r2pl_defaults;
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLowest,
-                tr("G", "PL 1 default search string.")));
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plLow,
-                tr("PG", "PL 2 default search string.")));
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plMedium,
-                tr("PG-13", "PL3 default search string.")));
-        r2pl_defaults.insert(r2pl_map::value_type(ParentalLevel::plHigh,
-                tr("R:NC-17", "PL4 default search string.")));
-
-        VerticalConfigurationGroup *vcg = new VerticalConfigurationGroup(true);
-
-        for (ParentalLevel pl(ParentalLevel::plLowest);
-             pl.GetLevel() <= ParentalLevel::plHigh && pl.good(); ++pl)
+        HostTextEditSetting *hle = new HostTextEditSetting(QString("mythvideo.AutoR2PL%1")
+                                             .arg(pl.GetLevel()));
+        hle->setLabel(QObject::tr("Level %1").arg(pl.GetLevel()));
+        hle->setHelpText(QObject::tr("Ratings containing these strings "
+                                     "(separated by :) will be assigned "
+                                     "to Parental Level %1.")
+                         .arg(pl.GetLevel()));
+
+        r2pl_map::const_iterator def_setting =
+                r2pl_defaults.find(pl.GetLevel());
+        if (def_setting != r2pl_defaults.end())
         {
-            HostLineEdit *hle = new HostLineEdit(QString("mythvideo.AutoR2PL%1")
-                                                 .arg(pl.GetLevel()));
-            hle->setLabel(QObject::tr("Level %1").arg(pl.GetLevel()));
-            hle->setHelpText(QObject::tr("Ratings containing these strings "
-                                         "(separated by :) will be assigned "
-                                         "to Parental Level %1.")
-                             .arg(pl.GetLevel()));
-
-            r2pl_map::const_iterator def_setting =
-                    r2pl_defaults.find(pl.GetLevel());
-            if (def_setting != r2pl_defaults.end())
-            {
-                hle->setValue(def_setting->second);
-            }
-
-            vcg->addChild(hle);
+            hle->setValue(def_setting->second);
         }
 
-        addTarget("0", new VerticalConfigurationGroup(true));
-        addTarget("1", vcg);
+        r2pl->addTargetedChild("1", hle);
     }
-};
 
-} // namespace
+    return r2pl;
+}
+
+}
 
 VideoGeneralSettings::VideoGeneralSettings()
+    :GroupSetting()
 {
-    ConfigPage::PageList pages;
-
-    VConfigPage page1(pages, false);
-    page1->addChild(VideoStartupDirectory());
-    page1->addChild(TrailerDirectory());
-    page1->addChild(VideoArtworkDirectory());
-    page1->addChild(VideoScreenshotDirectory());
-    page1->addChild(VideoBannerDirectory());
-    page1->addChild(VideoFanartDirectory());
-
-    VConfigPage page2(pages, false);
-    page2->addChild(SetOnInsertDVD());
-    page2->addChild(VideoTreeRemember());
-
-    // page 3
-    VerticalConfigurationGroup *pctrl =
-            new VerticalConfigurationGroup(true, false);
+    setLabel(QObject::tr("General settings"));
+
+    setHelpText(QObject::tr("TODO add a descrition for this group of settings"));
+    
+
+    addChild(VideoStartupDirectory());
+    addChild(TrailerDirectory());
+    addChild(VideoArtworkDirectory());
+    addChild(VideoScreenshotDirectory());
+    addChild(VideoBannerDirectory());
+    addChild(VideoFanartDirectory());
+
+    addChild(SetOnInsertDVD());
+    addChild(VideoTreeRemember());
+
+    GroupSetting *pctrl =
+            new GroupSetting();
     pctrl->setLabel(QObject::tr("Parental Control Settings"));
+
+    pctrl->setHelpText(QObject::tr("TODO add a description for this group of setting"));
     pctrl->addChild(VideoDefaultParentalLevel());
     pctrl->addChild(VideoAdminPassword());
     pctrl->addChild(VideoAdminPasswordThree());
     pctrl->addChild(VideoAdminPasswordTwo());
     pctrl->addChild(VideoAggressivePC());
-    VConfigPage page3(pages, false);
-    page3->addChild(pctrl);
 
-    VConfigPage page4(pages, false);
-    page4->addChild(new RatingsToPL());
+    addChild(pctrl);
+
+    addChild(RatingsToPL());
 
-    int page_num = 1;
-    for (ConfigPage::PageList::const_iterator p = pages.begin();
-         p != pages.end(); ++p, ++page_num)
-    {
-        (*p)->setLabel(QObject::tr("General Settings (%1/%2)").arg(page_num)
-                       .arg(pages.size()));
-        addChild(*p);
-    }
 }
+
diff --git a/mythtv/programs/mythfrontend/videoglobalsettings.h b/mythtv/programs/mythfrontend/videoglobalsettings.h
index 9f621e6..de155db 100644
--- a/mythtv/programs/mythfrontend/videoglobalsettings.h
+++ b/mythtv/programs/mythfrontend/videoglobalsettings.h
@@ -3,7 +3,9 @@
 
 #include "settings.h"
 
-class VideoGeneralSettings : public ConfigurationWizard
+#include "standardsettings.h"
+
+class VideoGeneralSettings : public GroupSetting
 {
   public:
     VideoGeneralSettings();
