diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index 9d8f4dc..ca68af7 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -44,7 +44,7 @@ import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.gui.download.DownloadDialog;
 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
-import org.openstreetmap.josm.gui.preferences.server.ProxyPreference;
+import org.openstreetmap.josm.gui.preferences.server.ServerAccessPreference;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.DefaultProxySelector;
@@ -515,7 +515,7 @@ public class MainApplication extends Main {
                 ed.setContent(message);
 
                 if (ed.showDialog().getValue() == 1) {
-                    PreferencesAction.forPreferenceSubTab(null, null, ProxyPreference.class).run();
+                    PreferencesAction.forPreferenceTab(null, null, ServerAccessPreference.class).run();
                 }
             }
             return hasErrors;
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index ce51a59..6a95064 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -708,7 +708,7 @@ public class MainMenu extends JMenuBar {
 
         add(presetsMenu, presetSearchAction);
         add(presetsMenu, presetSearchPrimitiveAction);
-        add(presetsMenu, PreferencesAction.forPreferenceSubTab(tr("Preset preferences"),
+        add(presetsMenu, PreferencesAction.forPreferenceTab(tr("Preset preferences"),
                 tr("Click to open the tagging presets tab in the preferences"), TaggingPresetPreference.class));
         presetsMenu.addSeparator();
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
index bb96cf4..e32d480 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
@@ -69,6 +69,7 @@ import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintStyleLoader;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
 import org.openstreetmap.josm.gui.mappaint.StyleSource;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
+import org.openstreetmap.josm.gui.preferences.PreferenceDialog;
 import org.openstreetmap.josm.gui.preferences.SourceEntry;
 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
 import org.openstreetmap.josm.gui.util.FileFilterAllFiles;
@@ -94,7 +95,7 @@ public class MapPaintDialog extends ToggleDialog implements Main.WindowSwitchLis
     protected MoveUpDownAction downAction;
     protected JCheckBox cbWireframe;
 
-    public static final JosmAction PREFERENCE_ACTION = PreferencesAction.forPreferenceSubTab(
+    public static final JosmAction PREFERENCE_ACTION = PreferencesAction.forPreferenceTab(
             tr("Map paint preferences"), null, MapPaintPreference.class, "dialogs/mappaintpreference");
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java b/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
index ddadb97..8916e6a 100644
--- a/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
+++ b/src/org/openstreetmap/josm/gui/preferences/DefaultTabPreferenceSetting.java
@@ -1,133 +1,131 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences;
-
-import java.awt.Component;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.tools.GBC;
-
-public abstract class DefaultTabPreferenceSetting extends DefaultPreferenceSetting implements TabPreferenceSetting {
-
-    private final String iconName;
-    private final String description;
-    private final String title;
-    private final JTabbedPane tabpane;
-    private final Map<SubPreferenceSetting, Component> subSettingMap;
-    
-    /**
-     * Constructs a new {@code DefaultTabPreferenceSetting}.
-     */
-    public DefaultTabPreferenceSetting() {
-        this(null, null, null);
-    }
-
-    public DefaultTabPreferenceSetting(String iconName, String title, String description) {
-        this(iconName, title, description, false);
-    }
-
-    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert) {
-        this(iconName, title, description, isExpert, null);
-    }
-
-    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert, JTabbedPane tabpane) {
-        super(isExpert);
-        this.iconName = iconName;
-        this.description = description;
-        this.title = title;
-        this.tabpane = tabpane;
-        this.subSettingMap = tabpane != null ? new HashMap<SubPreferenceSetting, Component>() : null;
-    }
-
-    @Override
-    public String getIconName() {
-        return iconName;
-    }
-
-    @Override
-    public String getTooltip() {
-        if (getDescription() != null) {
-            return "<html>"+getDescription()+"</html>";
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public String getTitle() {
-        return title;
-    }
-
-    /**
-     * Get the inner tab pane, if any.
-     * @return The JTabbedPane contained in this tab preference settings, or null if none is set.
-     * @since 5631
-     */
-    public final JTabbedPane getTabPane() {
-        return tabpane;
-    }
-    
-    protected final void createPreferenceTabWithScrollPane(PreferenceTabbedPane gui, JPanel panel) {
-        GBC a = GBC.eol().insets(-5,0,0,0);
-        a.anchor = GBC.EAST;
-        
-        JScrollPane scrollPane = new JScrollPane(panel);
-        scrollPane.setBorder(null);
-
-        JPanel tab = gui.createPreferenceTab(this);
-        tab.add(scrollPane, GBC.eol().fill(GBC.BOTH));
-        tab.add(GBC.glue(0,10), a);
-    }
-
-    @Override
-    public boolean selectSubTab(SubPreferenceSetting subPref) {
-        if (tabpane != null && subPref != null) {
-            Component tab = getSubTab(subPref);
-            if (tab != null) {
-                try {
-                    tabpane.setSelectedComponent(tab);
-                    return true;
-                } catch (IllegalArgumentException e) {
-                    // Ignore exception and return false below
-                    Main.debug(Main.getErrorMessage(e));
-                }
-            }
-        }
-        return false;
-    }
-    
-    @Override
-    public final void addSubTab(SubPreferenceSetting sub, String title, Component component) {
-        addSubTab(sub, title, component, null);
-    }
-    
-    @Override
-    public final void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip) {
-        if (tabpane != null && component != null) {
-            tabpane.addTab(title, null, component, tip);
-            registerSubTab(sub, component);
-        }
-    }
-    
-    @Override
-    public final void registerSubTab(SubPreferenceSetting sub, Component component) {
-        if (subSettingMap != null && sub != null && component != null) {
-            subSettingMap.put(sub, component);
-        }
-    }
-    
-    @Override
-    public final Component getSubTab(SubPreferenceSetting sub) {
-        return subSettingMap != null ? subSettingMap.get(sub) : null;
-    }
-}
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.GBC;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public abstract class DefaultTabPreferenceSetting extends DefaultPreferenceSetting implements TabPreferenceSetting {
+
+    private final String iconName;
+    private final String description;
+    private final String title;
+    private final JTabbedPane tabpane;
+    private final Map<SubPreferenceSetting, Component> subSettingMap;
+
+    /**
+     * Constructs a new {@code DefaultTabPreferenceSetting}.
+     */
+    public DefaultTabPreferenceSetting() {
+        this(null, null, null);
+    }
+
+    public DefaultTabPreferenceSetting(String iconName, String title, String description) {
+        this(iconName, title, description, false);
+    }
+
+    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert) {
+        this(iconName, title, description, isExpert, null);
+    }
+
+    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert, JTabbedPane tabpane) {
+        super(isExpert);
+        this.iconName = iconName;
+        this.description = description;
+        this.title = title;
+        this.tabpane = tabpane;
+        this.subSettingMap = tabpane != null ? new HashMap<SubPreferenceSetting, Component>() : null;
+    }
+
+    @Override
+    public String getIconName() {
+        return iconName;
+    }
+
+    @Override
+    public String getTooltip() {
+        if (getDescription() != null) {
+            return "<html>"+getDescription()+"</html>";
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * Get the inner tab pane, if any.
+     * @return The JTabbedPane contained in this tab preference settings, or null if none is set.
+     * @since 5631
+     */
+    public final JTabbedPane getTabPane() {
+        return tabpane;
+    }
+
+    protected final void createPreferenceTabWithScrollPane(PreferenceTabbedPane gui, JPanel panel) {
+        GBC a = GBC.eol().insets(-5,0,0,0);
+        a.anchor = GBC.EAST;
+
+        JScrollPane scrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+        scrollPane.setBorder(null);
+
+        JPanel tab = gui.createPreferenceTab(this);
+        tab.add(scrollPane, GBC.eol().fill(GBC.BOTH));
+        tab.add(GBC.glue(0,10), a);
+    }
+
+    @Override
+    public boolean selectSubTab(SubPreferenceSetting subPref) {
+        if (tabpane != null && subPref != null) {
+            Component tab = getSubTab(subPref);
+            if (tab != null) {
+                try {
+                    tabpane.setSelectedComponent(tab);
+                    return true;
+                } catch (IllegalArgumentException e) {
+                    // Ignore exception and return false below
+                    Main.debug(Main.getErrorMessage(e));
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public final void addSubTab(SubPreferenceSetting sub, String title, Component component) {
+        addSubTab(sub, title, component, null);
+    }
+
+    @Override
+    public final void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip) {
+        if (tabpane != null && component != null) {
+            tabpane.addTab(title, null, component, tip);
+            registerSubTab(sub, component);
+        }
+    }
+
+    @Override
+    public final void registerSubTab(SubPreferenceSetting sub, Component component) {
+        if (subSettingMap != null && sub != null && component != null) {
+            subSettingMap.put(sub, component);
+        }
+    }
+
+    @Override
+    public final Component getSubTab(SubPreferenceSetting sub) {
+        return subSettingMap != null ? subSettingMap.get(sub) : null;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java b/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
index ea5b74c..56946c7 100644
--- a/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
+++ b/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
@@ -35,25 +35,23 @@ import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
 import org.openstreetmap.josm.gui.preferences.advanced.AdvancedPreference;
 import org.openstreetmap.josm.gui.preferences.audio.AudioPreference;
 import org.openstreetmap.josm.gui.preferences.display.ColorPreference;
-import org.openstreetmap.josm.gui.preferences.display.DisplayPreference;
 import org.openstreetmap.josm.gui.preferences.display.DrawingPreference;
+import org.openstreetmap.josm.gui.preferences.display.GPXSettingsPanel;
 import org.openstreetmap.josm.gui.preferences.display.LafPreference;
 import org.openstreetmap.josm.gui.preferences.display.LanguagePreference;
 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
 import org.openstreetmap.josm.gui.preferences.map.BackupPreference;
 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
-import org.openstreetmap.josm.gui.preferences.map.MapPreference;
 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.preferences.plugin.PluginPreference;
+import org.openstreetmap.josm.gui.preferences.plugin.PluginUpdatePolicyPanel;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
+import org.openstreetmap.josm.gui.preferences.server.ProxyPreferencesPanel;
 import org.openstreetmap.josm.gui.preferences.remotecontrol.RemoteControlPreference;
-import org.openstreetmap.josm.gui.preferences.server.AuthenticationPreference;
-import org.openstreetmap.josm.gui.preferences.server.ProxyPreference;
 import org.openstreetmap.josm.gui.preferences.server.ServerAccessPreference;
 import org.openstreetmap.josm.gui.preferences.shortcut.ShortcutPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorTagCheckerRulesPreference;
-import org.openstreetmap.josm.gui.preferences.validator.ValidatorTestsPreference;
 import org.openstreetmap.josm.plugins.PluginDownloadTask;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.plugins.PluginInformation;
@@ -238,19 +236,11 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
     }
 
     /**
-     * Returns the {@code DisplayPreference} object.
-     * @return the {@code DisplayPreference} object.
+     * Returns the {@code DrawingPreference} object.
+     * @return the {@code DrawingPreference} object.
      */
-    public final DisplayPreference getDisplayPreference() {
-        return getSetting(DisplayPreference.class);
-    }
-
-    /**
-     * Returns the {@code MapPreference} object.
-     * @return the {@code MapPreference} object.
-     */
-    public final MapPreference getMapPreference() {
-        return getSetting(MapPreference.class);
+    public final DrawingPreference getDrawingPreference() {
+        return getSetting(DrawingPreference.class);
     }
 
     /**
@@ -427,7 +417,11 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
         int position = index;
         for (PreferenceTab tab : tabs) {
             if (tab.getTabPreferenceSetting().equals(tps)) {
-                insertTab(null, icon, tab.getComponent(), tps.getTooltip(), position++);
+                if (tps instanceof IconPreferenceSetting) {
+                    insertTab(null, icon, tab.getComponent(), tps.getTooltip(), position++);
+                } else {
+                    insertTab(tps.getTitle(), null, tab.getComponent(), tps.getTooltip(), position++);
+                }
             }
         }
     }
@@ -455,7 +449,11 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
                         addGUITabsForSetting(icon, tps);
                     } else {
                         // If it has not been initialized, create an empty tab with only icon and tooltip
-                        addTab(null, icon, new PreferencePanel(tps), tps.getTooltip());
+                        if (tps instanceof IconPreferenceSetting) {
+                            addTab(null, icon, new PreferencePanel(tps), tps.getTooltip());
+                        } else {
+                            addTab(tps.getTitle(), null, new PreferencePanel(tps), tps.getTooltip());
+                        }
                     }
                 }
             } else if (!(setting instanceof SubPreferenceSetting)) {
@@ -489,35 +487,74 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
         return null;
     }
 
+    static class IconPreferenceSetting extends DefaultTabPreferenceSetting {
+
+        public static class Factory implements PreferenceSettingFactory {
+
+            private final String iconName, title, description;
+
+            public Factory(String iconName, String title, String description) {
+                this.iconName = iconName;
+                this.title = title;
+                this.description = description;
+            }
+
+            @Override
+            public PreferenceSetting createPreferenceSetting() {
+                return new IconPreferenceSetting(iconName, title, description);
+            }
+        }
+
+        public IconPreferenceSetting(String iconName, String title, String description) {
+            super(iconName, title, description);
+        }
+
+        @Override
+        public void addGui(PreferenceTabbedPane gui) {
+            createPreferenceTabWithScrollPane(gui, new JPanel());
+        }
+
+        @Override
+        public boolean ok() {
+            return false;
+        }
+    }
+
     static {
+
         // order is important!
-        settingsFactory.add(new DisplayPreference.Factory());
+        settingsFactory.add(new IconPreferenceSetting.Factory("map", tr("Mapping"), tr("Various settings that influence the visual representation of geodata.")));
         settingsFactory.add(new DrawingPreference.Factory());
-        settingsFactory.add(new ColorPreference.Factory());
-        settingsFactory.add(new LafPreference.Factory());
-        settingsFactory.add(new LanguagePreference.Factory());
-        settingsFactory.add(new ServerAccessPreference.Factory());
-        settingsFactory.add(new AuthenticationPreference.Factory());
-        settingsFactory.add(new ProxyPreference.Factory());
-        settingsFactory.add(new MapPreference.Factory());
+        settingsFactory.add(new GPXSettingsPanel.Factory());
         settingsFactory.add(new ProjectionPreference.Factory());
         settingsFactory.add(new MapPaintPreference.Factory());
         settingsFactory.add(new TaggingPresetPreference.Factory());
+        settingsFactory.add(new ImageryPreference.Factory());
+
+        settingsFactory.add(new IconPreferenceSetting.Factory("connection", tr("Server"), tr("Connection Settings for the OSM server.")));
+        settingsFactory.add(new ServerAccessPreference.Factory());
+        settingsFactory.add(new ProxyPreferencesPanel.Factory());
+
+        settingsFactory.add(new IconPreferenceSetting.Factory("display", tr("User Interface"), tr("Various settings that influence the visual representation of the whole program.")));
+        settingsFactory.add(new ColorPreference.Factory());
+        settingsFactory.add(new LafPreference.Factory());
+        settingsFactory.add(new LanguagePreference.Factory());
         settingsFactory.add(new BackupPreference.Factory());
-        settingsFactory.add(new PluginPreference.Factory());
         settingsFactory.add(Main.toolbar);
-        settingsFactory.add(new AudioPreference.Factory());
         settingsFactory.add(new ShortcutPreference.Factory());
+
+        settingsFactory.add(new IconPreferenceSetting.Factory("advanced", tr("Advanced Preferences"), tr("Modify advanced JOSM configuration.")));
+        settingsFactory.add(new AudioPreference.Factory());
         settingsFactory.add(new ValidatorPreference.Factory());
-        settingsFactory.add(new ValidatorTestsPreference.Factory());
         settingsFactory.add(new ValidatorTagCheckerRulesPreference.Factory());
         settingsFactory.add(new RemoteControlPreference.Factory());
-        settingsFactory.add(new ImageryPreference.Factory());
-
-        PluginHandler.getPreferenceSetting(settingsFactory);
-
-        // always the last: advanced tab
         settingsFactory.add(new AdvancedPreference.Factory());
+
+        settingsFactory.add(new IconPreferenceSetting.Factory("plugin", tr("Plugins"), tr("Install new plugins or configure installed plugins.")));
+        settingsFactory.add(new PluginPreference.Factory());
+        settingsFactory.add(new PluginUpdatePolicyPanel.Factory());
+        PluginHandler.getPreferenceSetting(settingsFactory);
+
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
index e9dc2ea..5f1a048 100644
--- a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
+++ b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
@@ -569,7 +569,7 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
         private String movingComponent;
 
         public Settings(DefaultMutableTreeNode rootActionsNode) {
-            super("toolbar", tr("Toolbar customization"), tr("Customize the elements on the toolbar."));
+            super("toolbar", tr("Toolbar"), tr("Customize the elements on the toolbar."));
             actionsTreeModel = new DefaultTreeModel(rootActionsNode);
             actionsTree = new JTree(actionsTreeModel);
         }
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java b/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java
index d77879e..1073514 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java
@@ -41,18 +41,17 @@ import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
 
 /**
  * Color preferences.
  */
-public class ColorPreference implements SubPreferenceSetting {
+public class ColorPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code ColorPreference}.
@@ -72,6 +71,10 @@ public class ColorPreference implements SubPreferenceSetting {
     private JButton defaultSet;
     private JButton remove;
 
+    public ColorPreference() {
+        super(null, tr("Colors"), tr("Change colors used in program dialogs and in map paint styles."));
+    }
+
     /**
      * Set the colors to be shown in the preference table. This method creates a table model if
      * none exists and overwrites all existing values.
@@ -250,7 +253,8 @@ public class ColorPreference implements SubPreferenceSetting {
         buttonPanel.add(defaultSet, GBC.std().insets(5,5,5,0));
         buttonPanel.add(defaultAll, GBC.std().insets(0,5,0,0));
         buttonPanel.add(remove, GBC.std().insets(0,5,0,0));
-        gui.getDisplayPreference().addSubTab(this, tr("Colors"), panel);
+
+        createPreferenceTabWithScrollPane(gui, panel);
     }
 
     Boolean isRemoveColor(int row) {
@@ -296,9 +300,4 @@ public class ColorPreference implements SubPreferenceSetting {
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getDisplayPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java b/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
index ea83113..6d678cb 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
@@ -12,21 +12,19 @@ import javax.swing.Box;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.tools.GBC;
 
 /**
  * Map drawing preferences.
  */
-public class DrawingPreference implements SubPreferenceSetting {
+public class DrawingPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code DrawingPreference}.
@@ -38,7 +36,6 @@ public class DrawingPreference implements SubPreferenceSetting {
         }
     }
 
-    private GPXSettingsPanel gpxPanel;
     private JCheckBox directionHint = new JCheckBox(tr("Draw Direction Arrows"));
     private JCheckBox headArrow = new JCheckBox(tr("Only on the head of a way."));
     private JCheckBox onewayArrow = new JCheckBox(tr("Draw oneway arrows."));
@@ -55,16 +52,13 @@ public class DrawingPreference implements SubPreferenceSetting {
     private JCheckBox useWireframeAntialiasing = new JCheckBox(tr("Smooth map graphics in wireframe mode (antialiasing)"));
     private JCheckBox outlineOnly = new JCheckBox(tr("Draw only outlines of areas"));
 
-    @Override
+    public DrawingPreference() {
+        super(null, tr("OSM Data"), tr("Settings that control the drawing of OSM data."));
+    }
+
     public void addGui(PreferenceTabbedPane gui) {
-        gpxPanel = new GPXSettingsPanel();
-        gui.addValidationListener(gpxPanel);
-        JPanel panel = gpxPanel;
 
-        JScrollPane scrollpane = new JScrollPane(panel);
-        scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
-        gui.getDisplayPreference().addSubTab(this, tr("GPS Points"), scrollpane);
-        panel = new JPanel(new GridBagLayout());
+        JPanel panel = new JPanel(new GridBagLayout());
         panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
 
         // directionHint
@@ -164,14 +158,11 @@ public class DrawingPreference implements SubPreferenceSetting {
         ExpertToggleAction.addVisibilitySwitcher(discardableKeys);
 
         panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
-        scrollpane = new JScrollPane(panel);
-        scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
-        gui.getDisplayPreference().addSubTab(this, tr("OSM Data"), scrollpane);
+        createPreferenceTabWithScrollPane(gui, panel);
     }
 
     @Override
     public boolean ok() {
-        boolean restart = gpxPanel.savePreferences();
         Main.pref.put("draw.data.area_outline_only", outlineOnly.isSelected());
         Main.pref.put("draw.segment.direction", directionHint.isSelected());
         Main.pref.put("draw.segment.head_only", headArrow.isSelected());
@@ -194,16 +185,11 @@ public class DrawingPreference implements SubPreferenceSetting {
             vn = 0;
         }
         Main.pref.putInteger("mappaint.node.virtual-size", vn);
-        return restart;
+        return false;
     }
 
     @Override
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getDisplayPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
index 039d28f..9cb1619 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
@@ -24,6 +24,10 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
 import org.openstreetmap.josm.gui.layer.markerlayer.Marker.TemplateEntryProperty;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.ValidationListener;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -36,6 +40,30 @@ import org.openstreetmap.josm.tools.template_engine.TemplateParser;
  */
 public class GPXSettingsPanel extends JPanel implements ValidationListener {
 
+    public static class Factory implements PreferenceSettingFactory {
+
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new DefaultTabPreferenceSetting(null, tr("GPS Points"), tr("Settings that control the drawing of GPS tracks.")) {
+
+                private GPXSettingsPanel gpx;
+
+                @Override
+                public void addGui(PreferenceTabbedPane gui) {
+                    gpx = new GPXSettingsPanel();
+                    createPreferenceTabWithScrollPane(gui, gpx);
+                    gui.addValidationListener(gpx);
+                }
+
+                @Override
+                public boolean ok() {
+                    gpx.savePreferences();
+                    return false;
+                }
+            };
+        }
+    }
+
     private static final int WAYPOINT_LABEL_CUSTOM = 6;
     private static final String[] LABEL_PATTERN_TEMPLATE = new String[] {Marker.LABEL_PATTERN_AUTO, Marker.LABEL_PATTERN_NAME,
         Marker.LABEL_PATTERN_DESC, "{special:everything}", "?{ '{name}' | '{desc}' | '{formattedWaypointOffset}' }", ""};
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java b/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
index bd52c7b..1b7e230 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
@@ -13,7 +13,6 @@ import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 import javax.swing.ListCellRenderer;
 import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
@@ -21,19 +20,18 @@ import javax.swing.UIManager.LookAndFeelInfo;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.tools.GBC;
 
 /**
  * Look-and-feel preferences.
  */
-public class LafPreference implements SubPreferenceSetting {
+public class LafPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code LafPreference}.
@@ -56,6 +54,10 @@ public class LafPreference implements SubPreferenceSetting {
     private JCheckBox modeless = new JCheckBox(tr("Modeless working (Potlatch style)"));
     private JCheckBox dynamicButtons = new JCheckBox(tr("Dynamic buttons in side menus"));
 
+    public LafPreference() {
+        super(null, tr("Look and Feel"), tr("Change the Look and Feel of the program"));
+    }
+
     @Override
     public void addGui(PreferenceTabbedPane gui) {
         lafCombo = new JosmComboBox<>(UIManager.getInstalledLookAndFeels());
@@ -127,9 +129,9 @@ public class LafPreference implements SubPreferenceSetting {
         panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
         panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
 
-        JScrollPane scrollpane = new JScrollPane(panel);
-        scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
-        gui.getDisplayPreference().addSubTab(this, tr("Look and Feel"), scrollpane);
+        panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
+
+        createPreferenceTabWithScrollPane(gui, panel);
     }
 
     @Override
@@ -148,9 +150,4 @@ public class LafPreference implements SubPreferenceSetting {
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getDisplayPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java b/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java
index 6e48d83..5654275 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/LanguagePreference.java
@@ -1,36 +1,30 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.preferences.display;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-
-import javax.swing.Box;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JPanel;
-import javax.swing.ListCellRenderer;
-
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.I18n;
 
+import javax.swing.BorderFactory;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.ListCellRenderer;
+import java.awt.Component;
+import java.awt.GridBagLayout;
+import java.util.List;
+import java.util.Locale;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 /**
  * Language preferences.
  */
-public class LanguagePreference implements SubPreferenceSetting {
+public class LanguagePreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code LanguagePreference}.
@@ -43,78 +37,53 @@ public class LanguagePreference implements SubPreferenceSetting {
     }
 
     /** the combo box with the available locales */
-    private JosmComboBox<Locale> langCombo;
+    private JList<Locale> langCombo;
+
+    public LanguagePreference() {
+        super(null, tr("Language"), tr("Change the language of JOSM."));
+    }
 
     @Override
     public void addGui(final PreferenceTabbedPane gui) {
-        LanguageComboBoxModel model = new LanguageComboBoxModel();
-        // Selecting the language BEFORE the JComboBox listens to model changes speed up initialization by ~35ms (see #7386)
-        // See https://stackoverflow.com/questions/3194958/fast-replacement-for-jcombobox-basiccomboboxui
-        model.selectLanguage(Main.pref.get("language"));
-        langCombo = new JosmComboBox<>(model);
-        langCombo.setRenderer(new LanguageCellRenderer());
+        List<Locale> tr = I18n.getAvailableTranslationsAsList();
+        tr.add(0, null);
+        langCombo = new JList<>(tr.toArray(new Locale[tr.size()]));
+        langCombo.setCellRenderer(new LanguageCellRenderer());
+        langCombo.setVisibleRowCount(langCombo.getModel().getSize());
+        selectLanguage(Main.pref.get("language"));
 
-        LafPreference lafPreference = gui.getSetting(LafPreference.class);
-        final JPanel panel = lafPreference.panel;
-        panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
-        panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
-        panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
-        panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
+        final JPanel panel = new JPanel(new GridBagLayout());
+        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+        panel.add(langCombo, GBC.eol().fill(GBC.BOTH));
+        createPreferenceTabWithScrollPane(gui, panel);
+    }
 
-        TabPreferenceSetting tabPref = lafPreference.getTabPreferenceSetting(gui);
-        tabPref.registerSubTab(this, tabPref.getSubTab(lafPreference));
+    protected void selectLanguage(final String languageCode) {
+        if (languageCode == null || languageCode.isEmpty()) {
+            langCombo.setSelectedIndex(0);
+        } else {
+            langCombo.setSelectedValue(Locale.forLanguageTag(languageCode), true);
+        }
     }
 
     @Override
     public boolean ok() {
-        if(langCombo.getSelectedItem() == null)
+        if (langCombo.getSelectedValue() == null) {
             return Main.pref.put("language", null);
-        else
-            return Main.pref.put("language",
-                    ((Locale)langCombo.getSelectedItem()).toString());
-    }
-
-    private static class LanguageComboBoxModel extends DefaultComboBoxModel<Locale> {
-        private final List<Locale> data = new ArrayList<>();
-
-        public LanguageComboBoxModel(){
-            data.add(0,null);
-            data.addAll(Arrays.asList(I18n.getAvailableTranslations()));
-        }
-
-        public void selectLanguage(String language) {
-            setSelectedItem(null);
-            if (language != null) {
-                for (Locale locale: data) {
-                    if (locale == null) {
-                        continue;
-                    }
-                    if (locale.toString().equals(language)) {
-                        setSelectedItem(locale);
-                        return;
-                    }
-                }
-            }
-        }
-
-        @Override
-        public Locale getElementAt(int index) {
-            return data.get(index);
-        }
-
-        @Override
-        public int getSize() {
-            return data.size();
+        } else {
+            return Main.pref.put("language", langCombo.getSelectedValue().toString());
         }
     }
 
     private static class LanguageCellRenderer implements ListCellRenderer<Locale> {
         private final DefaultListCellRenderer dispatch;
+
         public LanguageCellRenderer() {
             this.dispatch = new DefaultListCellRenderer();
         }
+
         @Override
-        public Component getListCellRendererComponent(JList<? extends Locale> list, Locale l, 
+        public Component getListCellRendererComponent(JList<? extends Locale> list, Locale l,
                 int index, boolean isSelected, boolean cellHasFocus) {
             return dispatch.getListCellRendererComponent(list,
                     l == null ? tr("Default (Auto determined)") : l.getDisplayName(l),
@@ -126,9 +95,4 @@ public class LanguagePreference implements SubPreferenceSetting {
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getSetting(LafPreference.class).getTabPreferenceSetting(gui);
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/BackupPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/BackupPreference.java
index d9dd1d0..b9cfb3c 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/BackupPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/BackupPreference.java
@@ -17,6 +17,7 @@ import javax.swing.JSeparator;
 
 import org.openstreetmap.josm.data.AutosaveTask;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
@@ -30,7 +31,7 @@ import org.openstreetmap.josm.tools.GBC;
 /**
  * Preference settings for data layer autosave.
  */
-public class BackupPreference implements SubPreferenceSetting {
+public class BackupPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code BackupPreference}.
@@ -112,9 +113,23 @@ public class BackupPreference implements SubPreferenceSetting {
         autosaveEnabled.actionPerformed(null);
 
         panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
-        JScrollPane sp = GuiHelper.embedInVerticalScrollPane(panel);
 
-        gui.getMapPreference().addSubTab(this, tr("File backup"), sp, tr("Configure whether to create backup files"));
+        createPreferenceTabWithScrollPane(gui, panel);
+    }
+
+    @Override
+    public String getIconName() {
+        return null;
+    }
+
+    @Override
+    public String getTitle() {
+        return tr("File backup");
+    }
+
+    @Override
+    public String getTooltip() {
+        return tr("Configure whether to create backup files");
     }
 
     @Override
@@ -130,12 +145,12 @@ public class BackupPreference implements SubPreferenceSetting {
     }
 
     @Override
+    public String getDescription() {
+        return getTooltip();
+    }
+
+    @Override
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getMapPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
index 07ff540..f7f2fb0 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
@@ -13,13 +13,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.TreeSet;
-
 import javax.swing.BorderFactory;
 import javax.swing.JCheckBox;
 import javax.swing.JPanel;
-
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
@@ -37,7 +36,7 @@ import org.openstreetmap.josm.tools.Utils;
 /**
  * Preference settings for map paint styles.
  */
-public class MapPaintPreference implements SubPreferenceSetting {
+public class MapPaintPreference extends DefaultTabPreferenceSetting {
     private SourceEditor sources;
     private JCheckBox enableIconDefault;
 
@@ -64,8 +63,12 @@ public class MapPaintPreference implements SubPreferenceSetting {
         }
     }
 
+    public MapPaintPreference() {
+        super(null, tr("Map Paint Styles"), tr("Styles for rendering the OSM data."));
+    }
+
     @Override
-    public void addGui(PreferenceTabbedPane gui) {
+    public void addGui(final PreferenceTabbedPane gui) {
         enableIconDefault = new JCheckBox(tr("Enable built-in icon defaults"),
                 Main.pref.getBoolean("mappaint.icon.enable-defaults", true));
 
@@ -77,9 +80,10 @@ public class MapPaintPreference implements SubPreferenceSetting {
         panel.add(sources, GBC.eol().fill(GBC.BOTH));
         panel.add(enableIconDefault, GBC.eol().insets(11,2,5,0));
 
-        final MapPreference mapPref = gui.getMapPreference();
-        mapPref.addSubTab(this, tr("Map Paint Styles"), panel);
-        sources.deferLoading(mapPref, panel);
+        //createPreferenceTabWithScrollPane(gui, panel);
+        gui.createPreferenceTab(this).add(panel, GBC.eol().fill(GBC.BOTH));
+
+        sources.initiallyLoadAvailableSources();
     }
 
     static class MapPaintSourceEditor extends SourceEditor {
@@ -313,9 +317,4 @@ public class MapPaintPreference implements SubPreferenceSetting {
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getMapPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java
deleted file mode 100644
index 45b6b19..0000000
--- a/src/org/openstreetmap/josm/gui/preferences/map/MapPreference.java
+++ /dev/null
@@ -1,42 +0,0 @@
-//License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.map;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.JTabbedPane;
-
-import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.tools.GBC;
-
-/**
- * Map preferences, including map paint styles, tagging presets and autosave sub-preferences.
- */
-public final class MapPreference extends DefaultTabPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code MapPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new MapPreference();
-        }
-    }
-    
-    private MapPreference() {
-        super("map", tr("Map Settings"), tr("Settings for the map projection and data interpretation."), false, new JTabbedPane());
-    }
-    
-    @Override
-    public boolean ok() {
-        return false;
-    }
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        gui.createPreferenceTab(this).add(getTabPane(), GBC.eol().fill(GBC.BOTH));
-    }
-}
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
index 034bd25..2d08175 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
@@ -12,15 +12,15 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import javax.swing.BorderFactory;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-
+import javax.swing.JSeparator;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
@@ -29,6 +29,10 @@ import org.openstreetmap.josm.gui.preferences.SourceEditor;
 import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
 import org.openstreetmap.josm.gui.preferences.SourceEntry;
 import org.openstreetmap.josm.gui.preferences.SourceProvider;
+import org.openstreetmap.josm.gui.tagging.TaggingPreset;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetMenu;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetSeparator;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 import org.openstreetmap.josm.gui.preferences.SourceType;
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
@@ -40,7 +44,7 @@ import org.xml.sax.SAXParseException;
 /**
  * Preference settings for tagging presets.
  */
-public final class TaggingPresetPreference implements SubPreferenceSetting {
+public class TaggingPresetPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code TaggingPresetPreference}.
@@ -53,7 +57,7 @@ public final class TaggingPresetPreference implements SubPreferenceSetting {
     }
 
     private TaggingPresetPreference() {
-        super();
+        super(null, tr("Tagging Presets"), tr("Presets give meaning to OSM tag combinations."));
     }
 
     private static final List<SourceProvider> presetSourceProviders = new ArrayList<>();
@@ -160,7 +164,7 @@ public final class TaggingPresetPreference implements SubPreferenceSetting {
     };
 
     @Override
-    public void addGui(PreferenceTabbedPane gui) {
+    public void addGui(final PreferenceTabbedPane gui) {
         sortMenu = new JCheckBox(tr("Sort presets menu"),
                 Main.pref.getBoolean("taggingpreset.sortmenu", false));
 
@@ -169,10 +173,11 @@ public final class TaggingPresetPreference implements SubPreferenceSetting {
         panel.add(sortMenu, GBC.eol().insets(5,5,5,0));
         sources = new TaggingPresetSourceEditor();
         panel.add(sources, GBC.eol().fill(GBC.BOTH));
-        final MapPreference mapPref = gui.getMapPreference();
-        mapPref.addSubTab(this, tr("Tagging Presets"), panel);
-        sources.deferLoading(mapPref, panel);
-        gui.addValidationListener(validationListener);
+
+        //createPreferenceTabWithScrollPane(gui, panel);
+        gui.createPreferenceTab(this).add(panel, GBC.eol().fill(GBC.BOTH));
+
+        sources.initiallyLoadAvailableSources();
     }
 
     static class TaggingPresetSourceEditor extends SourceEditor {
@@ -304,9 +309,4 @@ public final class TaggingPresetPreference implements SubPreferenceSetting {
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getMapPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
index 7cc984d..ce8fa95 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
@@ -30,7 +30,6 @@ import javax.swing.JList;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 import javax.swing.event.DocumentEvent;
@@ -45,7 +44,6 @@ import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.PreferencePanel;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
@@ -73,7 +71,7 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
     }
 
     private PluginPreference() {
-        super("plugin", tr("Plugins"), tr("Configure available plugins."), false, new JTabbedPane());
+        super("plugin", tr("Plugins"), tr("Configure available plugins."));
     }
 
     /**
@@ -148,7 +146,6 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
     private PluginListPanel pnlPluginPreferences;
     private PluginPreferencesModel model;
     private JScrollPane spPluginPreferences;
-    private PluginUpdatePolicyPanel pnlPluginUpdatePolicy;
 
     /**
      * is set to true if this preference pane has been selected
@@ -210,14 +207,6 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
         return pnl;
     }
 
-    protected JTabbedPane buildContentPane() {
-        JTabbedPane pane = getTabPane();
-        pnlPluginUpdatePolicy = new PluginUpdatePolicyPanel();
-        pane.addTab(tr("Plugins"), buildPluginListPanel());
-        pane.addTab(tr("Plugin update policy"), pnlPluginUpdatePolicy);
-        return pane;
-    }
-
     @Override
     public void addGui(final PreferenceTabbedPane gui) {
         GridBagConstraints gc = new GridBagConstraints();
@@ -225,8 +214,7 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
         gc.weighty = 1.0;
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.fill = GridBagConstraints.BOTH;
-        PreferencePanel plugins = gui.createPreferenceTab(this);
-        plugins.add(buildContentPane(), gc);
+        gui.createPreferenceTab(this).add(buildPluginListPanel(), gc);
         readLocalPluginInformation();
         pluginPreferencesActivated = true;
     }
@@ -277,7 +265,6 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
     public boolean ok() {
         if (! pluginPreferencesActivated)
             return false;
-        pnlPluginUpdatePolicy.rememberInPreferences();
         if (model.isActivePluginsChanged()) {
             LinkedList<String> l = new LinkedList<>(model.getSelectedPluginNames());
             Collections.sort(l);
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
index 68053cc..f0c9a39 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
@@ -18,10 +18,15 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.tools.GBC;
 
 /**
  * A panel for configuring whether JOSM shall update plugins at startup.
@@ -29,6 +34,30 @@ import org.openstreetmap.josm.gui.widgets.JosmTextField;
  */
 public class PluginUpdatePolicyPanel extends JPanel {
 
+    /**
+     * Factory used to create a new {@code PluginUpdatePolicy}.
+     */
+    public static class Factory implements PreferenceSettingFactory {
+
+        protected final PluginUpdatePolicyPanel panel = new PluginUpdatePolicyPanel();
+
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new DefaultTabPreferenceSetting(null, tr("Plugin update policy"), tr("Change the policy for updating plugins.")) {
+                @Override
+                public void addGui(PreferenceTabbedPane gui) {
+                    gui.createPreferenceTab(this).add(panel, GBC.std().fill(GBC.BOTH));
+                }
+
+                @Override
+                public boolean ok() {
+                    panel.rememberInPreferences();
+                    return false;
+                }
+            };
+        }
+    }
+
     private enum Policy {
         ASK ("ask"),
         ALWAYS("always"),
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java b/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
index 5307b3f..52ccaa2 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
@@ -14,12 +14,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import javax.swing.BorderFactory;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
+import javax.swing.*;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
@@ -30,11 +25,10 @@ import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.data.projection.CustomProjection;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -54,7 +48,7 @@ import org.openstreetmap.josm.tools.GBC;
  *    a manual implementation of the projection. Use {@link CustomProjection}
  *    if possible.
  */
-public class ProjectionPreference implements SubPreferenceSetting {
+public class ProjectionPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code ProjectionPreference}.
@@ -66,6 +60,10 @@ public class ProjectionPreference implements SubPreferenceSetting {
         }
     }
 
+    private ProjectionPreference() {
+        super("map", tr("Map Projection"), tr("Settings for the map projection and data interpretation."));
+    }
+
     private static List<ProjectionChoice> projectionChoices = new ArrayList<>();
     private static Map<String, ProjectionChoice> projectionChoicesById = new HashMap<>();
 
@@ -337,8 +335,7 @@ public class ProjectionPreference implements SubPreferenceSetting {
         projPanel.add(unitsCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
         projPanel.add(GBC.glue(1,1), GBC.std().fill(GBC.HORIZONTAL).weight(1.0, 1.0));
 
-        JScrollPane scrollpane = new JScrollPane(projPanel);
-        gui.getMapPreference().addSubTab(this, tr("Map Projection"), scrollpane);
+        createPreferenceTabWithScrollPane(gui, projPanel);
 
         selectedProjectionChanged(pc);
     }
@@ -350,7 +347,7 @@ public class ProjectionPreference implements SubPreferenceSetting {
         projectionName.setText(proj.toString());
         Bounds b = proj.getWorldBoundsLatLon();
         CoordinateFormat cf = CoordinateFormat.getDefaultFormat();
-        bounds.setText(b.getMin().lonToString(cf)+", "+b.getMin().latToString(cf)+" : "+b.getMax().lonToString(cf)+", "+b.getMax().latToString(cf));
+        bounds.setText(b.getMin().lonToString(cf) + ", " + b.getMin().latToString(cf) + " : " + b.getMax().lonToString(cf) + ", " + b.getMax().latToString(cf));
         boolean showCode = true;
         boolean showName = false;
         if (pc instanceof SubPrefsOptions) {
@@ -404,7 +401,7 @@ public class ProjectionPreference implements SubPreferenceSetting {
         id = pc.getId();
         PROP_PROJECTION.put(id);
         PROP_SUB_PROJECTION.put(pref);
-        Main.pref.putCollection("projection.sub."+id, pref);
+        Main.pref.putCollection("projection.sub." + id, pref);
         pc.setPreferences(pref);
         Projection proj = pc.getProjection();
         Main.setProjection(proj);
@@ -476,11 +473,6 @@ public class ProjectionPreference implements SubPreferenceSetting {
         return false;
     }
 
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
-        return gui.getMapPreference();
-    }
-
     /**
      * Selects the given projection.
      * @param projection The projection to select.
diff --git a/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java b/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java
index 989a9ed..d748885 100644
--- a/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java
@@ -113,7 +113,8 @@ public final class RemoteControlPreference extends DefaultTabPreferenceSetting {
         };
         enableRemoteControl.addActionListener(remoteControlEnabled);
         remoteControlEnabled.actionPerformed(null);
-        createPreferenceTabWithScrollPane(gui, remote);
+        //createPreferenceTabWithScrollPane(gui, remote);
+        gui.createPreferenceTab(this).add(remote, GBC.eol().fill(GBC.BOTH));
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java b/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java
deleted file mode 100644
index 88f8176..0000000
--- a/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreference.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.server;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
-import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-
-/**
- * Authentication sub-preferences in server preferences.
- * @since 6523
- */
-public final class AuthenticationPreference implements SubPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code AuthenticationPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new AuthenticationPreference();
-        }
-    }
-
-    AuthenticationPreferencesPanel pnlAuthPreferences;
-
-    private AuthenticationPreference() {
-        super();
-    }
-
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        pnlAuthPreferences = new AuthenticationPreferencesPanel();
-        gui.getServerPreference().addApiUrlChangeListener(pnlAuthPreferences);
-        gui.getServerPreference().addSubTab(this, tr("Authentication"),
-                pnlAuthPreferences.getVerticalScrollPane(),
-                tr("Configure your identity and how to authenticate at the OSM server"));
-    }
-
-    @Override
-    public boolean ok() {
-        pnlAuthPreferences.saveToPreferences();
-        return false;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return false;
-    }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getServerPreference();
-    }
-}
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java
index ddbaa4b..2fea5cf 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreference.java
@@ -16,17 +16,7 @@ import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
  * Proxy sub-preferences in server preferences.
  * @since 6523
  */
-public final class ProxyPreference implements SubPreferenceSetting {
-
-    /**
-     * Factory used to create a new {@code ProxyPreference}.
-     */
-    public static class Factory implements PreferenceSettingFactory {
-        @Override
-        public PreferenceSetting createPreferenceSetting() {
-            return new ProxyPreference();
-        }
-    }
+public final class ProxyPreference {
 
     private static Set<ProxyPreferenceListener> listeners = new HashSet<>();
     
@@ -36,33 +26,6 @@ public final class ProxyPreference implements SubPreferenceSetting {
         super();
     }
 
-    @Override
-    public void addGui(PreferenceTabbedPane gui) {
-        pnlProxyPreferences = new ProxyPreferencesPanel();
-        gui.getServerPreference().addSubTab(this, tr("Proxy settings"),
-                pnlProxyPreferences.getVerticalScrollPane(),
-                tr("Configure whether to use a proxy server"));
-    }
-
-    @Override
-    public boolean ok() {
-        pnlProxyPreferences.saveToPreferences();
-        for (ProxyPreferenceListener listener : listeners) {
-            listener.proxyPreferenceChanged();
-        }
-        return false;
-    }
-
-    @Override
-    public boolean isExpert() {
-        return false;
-    }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getServerPreference();
-    }
-    
     /**
      * Adds a new ProxyPreferenceListener.
      * @param listener the listener to add
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
index 5e179a8..731d5b9 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
@@ -17,7 +17,7 @@ import java.net.ProxySelector;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.swing.BorderFactory;
+import javax.swing.Box;
 import javax.swing.ButtonGroup;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -25,6 +25,10 @@ import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.gui.widgets.JosmPasswordField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -40,6 +44,31 @@ import org.openstreetmap.josm.tools.GBC;
  */
 public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
 
+    public static class Factory implements PreferenceSettingFactory {
+
+        @Override
+        public PreferenceSetting createPreferenceSetting() {
+            return new DefaultTabPreferenceSetting(null, tr("Proxy settings"), tr("Configure whether to use a proxy server")) {
+
+                private ProxyPreferencesPanel pnlProxyPreferences;
+
+                @Override
+                public void addGui(PreferenceTabbedPane gui) {
+                    //createPreferenceTabWithScrollPane(gui, pnlProxyPreferences = new ProxyPreferencesPanel());
+                    pnlProxyPreferences = new ProxyPreferencesPanel();
+                    gui.createPreferenceTab(this).add(pnlProxyPreferences, GBC.eol().fill(GBC.BOTH));
+                    pnlProxyPreferences.initFromPreferences();
+                }
+
+                @Override
+                public boolean ok() {
+                    pnlProxyPreferences.saveToPreferences();
+                    return false;
+                }
+            };
+        }
+    }
+
     /**
      * The proxy policy is how JOSM will use proxy information.
      */
@@ -392,8 +421,8 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
      */
     public ProxyPreferencesPanel() {
         setLayout(new GridBagLayout());
-        setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
-        add(buildProxySettingsPanel(), GBC.eop().anchor(GridBagConstraints.NORTHWEST).fill(GridBagConstraints.BOTH));
+        add(buildProxySettingsPanel(), GBC.eop().fill(GBC.HORIZONTAL));
+        add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
 
         initFromPreferences();
         updateEnabledState();
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreference.java b/src/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreference.java
index e1f3fce..5445834 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreference.java
@@ -3,110 +3,74 @@ package org.openstreetmap.josm.gui.preferences.server;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.BorderLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.JPanel;
-import javax.swing.JTabbedPane;
-
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
+import org.openstreetmap.josm.tools.GBC;
+import java.awt.GridBagLayout;
+import javax.swing.Box;
+import javax.swing.JPanel;
 
-/**
- * Connection preferences, including authentication and proxy sub-preferences.
- */
-public final class ServerAccessPreference extends DefaultTabPreferenceSetting {
+public class ServerAccessPreference extends DefaultTabPreferenceSetting {
 
-    /**
-     * Factory used to create a new {@code ServerAccessPreference}.
-     */
     public static class Factory implements PreferenceSettingFactory {
-        @Override
         public PreferenceSetting createPreferenceSetting() {
             return new ServerAccessPreference();
         }
     }
 
     private ServerAccessPreference() {
-        super("connection", tr("Connection Settings"), tr("Connection Settings for the OSM server."), false, new JTabbedPane());
+        super("connection", tr("Connection Settings"),
+                tr("Connection Settings for the OSM server as well as your identity and how to authenticate at the OSM server."));
     }
 
-    /** indicates whether to use the default OSM URL or not */
     private OsmApiUrlInputPanel pnlApiUrlPreferences;
 
-    /**
-     * Builds the tabbed pane with the server preferences
-     *
-     * @return panel with server preferences tabs
-     */
-    protected JPanel buildTabbedServerPreferences() {
-        JPanel pnl = new JPanel(new BorderLayout());
-        pnl.add(getTabPane(), BorderLayout.CENTER);
-        return pnl;
-    }
+    /** indicates whether to use the default OSM URL or not */
+    /** panel for configuring authentication preferences */
+    private AuthenticationPreferencesPanel pnlAuthPreferences;
 
     /**
      * Builds the panel for entering the server access preferences
      *
-     * @return preferences panel for server settings
+     * @return
      */
     protected JPanel buildContentPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
 
-        // the checkbox for the default UL
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gc.weightx = 1.0;
-        gc.insets = new Insets(0,0,0,0);
-        pnlApiUrlPreferences = new OsmApiUrlInputPanel();
-        pnl.add(pnlApiUrlPreferences, gc);
+        pnl.add(pnlApiUrlPreferences = new OsmApiUrlInputPanel(), GBC.eop().fill(GBC.HORIZONTAL));
+        pnl.add(pnlAuthPreferences = new AuthenticationPreferencesPanel(), GBC.eop().fill(GBC.HORIZONTAL));
+        pnl.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
 
-        // the remaining access properties
-        gc.gridy = 1;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.weightx = 1.0;
-        gc.weighty = 1.0;
-        gc.insets = new Insets(10,0,3,3);
-        pnl.add(buildTabbedServerPreferences(), gc);
+        // let the AuthPreferencesPanel know when the API URL changes
+        pnlApiUrlPreferences.addPropertyChangeListener(pnlAuthPreferences);
 
         HelpUtil.setHelpContext(pnl, HelpUtil.ht("/Preferences/Connection"));
         return pnl;
     }
 
-    /**
-     * Adds a listener that will be notified of API URL change.
-     * @param listener the listener
-     * @since 6523
-     */
-    public final void addApiUrlChangeListener(PropertyChangeListener listener) {
-        pnlApiUrlPreferences.addPropertyChangeListener(listener);
-    }
-
-    @Override
     public void addGui(PreferenceTabbedPane gui) {
-        GridBagConstraints gc = new GridBagConstraints();
-        gc.fill = GridBagConstraints.BOTH;
-        gc.weightx = 1.0;
-        gc.weighty = 1.0;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gui.createPreferenceTab(this).add(buildContentPanel(), gc);
+        //createPreferenceTabWithScrollPane(gui, buildContentPanel());
+        gui.createPreferenceTab(this).add(buildContentPanel(), GBC.eol().fill(GBC.BOTH));
+        initFromPreferences();
+    }
 
+    /**
+     * Initializes the configuration panel with values from the preferences
+     */
+    public void initFromPreferences() {
         pnlApiUrlPreferences.initFromPreferences();
+        pnlAuthPreferences.initFromPreferences();
     }
 
     /**
      * Saves the values to the preferences
      */
-    @Override
     public boolean ok() {
         pnlApiUrlPreferences.saveToPreferences();
+        pnlAuthPreferences.saveToPreferences();
         return false;
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreference.java b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreference.java
index 6b15d40..22d3489 100644
--- a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreference.java
@@ -3,15 +3,31 @@ package org.openstreetmap.josm.gui.preferences.validator;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.data.validation.OsmValidator;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
 import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.tools.GBC;
 
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
 /**
  * Preference settings for the validator.
  *
@@ -62,13 +78,90 @@ public final class ValidatorPreference extends DefaultTabPreferenceSetting {
      */
     public static final String PREF_FILTER_BY_SELECTION = PREFIX + ".selectionFilter";
 
+    private JCheckBox prefUseIgnore;
+    private JCheckBox prefUseLayer;
+    private JCheckBox prefOtherUpload;
+    private JCheckBox prefOther;
+
+    /** The list of all tests */
+    private Collection<Test> allTests;
+
     @Override
     public void addGui(PreferenceTabbedPane gui) {
-        gui.createPreferenceTab(this).add(getTabPane(), GBC.eol().fill(GBC.BOTH));
+        JPanel testPanel = new JPanel(new GridBagLayout());
+        testPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+
+        prefUseIgnore = new JCheckBox(tr("Use ignore list."), Main.pref.getBoolean(ValidatorPreference.PREF_USE_IGNORE, true));
+        prefUseIgnore.setToolTipText(tr("Use the ignore list to suppress warnings."));
+        testPanel.add(prefUseIgnore, GBC.eol());
+
+        prefUseLayer = new JCheckBox(tr("Use error layer."), Main.pref.getBoolean(ValidatorPreference.PREF_LAYER, true));
+        prefUseLayer.setToolTipText(tr("Use the error layer to display problematic elements."));
+        testPanel.add(prefUseLayer, GBC.eol());
+
+        prefOther = new JCheckBox(tr("Show informational level."), ValidatorPreference.PREF_OTHER.get());
+        prefOther.setToolTipText(tr("Show the informational tests."));
+        testPanel.add(prefOther, GBC.eol());
+
+        prefOtherUpload = new JCheckBox(tr("Show informational level on upload."), Main.pref.getBoolean(ValidatorPreference.PREF_OTHER_UPLOAD, false));
+        prefOtherUpload.setToolTipText(tr("Show the informational tests in the upload check windows."));
+        testPanel.add(prefOtherUpload, GBC.eol());
+
+        ActionListener otherUploadEnabled = new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                prefOtherUpload.setEnabled(prefOther.isSelected());
+            }
+        };
+        prefOther.addActionListener(otherUploadEnabled);
+        otherUploadEnabled.actionPerformed(null);
+
+        GBC a = GBC.eol().insets(-5,0,0,0);
+        a.anchor = GBC.EAST;
+        testPanel.add( new JLabel(tr("On demand")), GBC.std() );
+        testPanel.add( new JLabel(tr("On upload")), a );
+
+        allTests = OsmValidator.getTests();
+        for (Test test: allTests) {
+            test.addGui(testPanel);
+        }
+
+        createPreferenceTabWithScrollPane(gui, testPanel);
     }
 
     @Override
     public boolean ok() {
+        Collection<String> tests = new LinkedList<>();
+        Collection<String> testsBeforeUpload = new LinkedList<>();
+
+        for (Test test : allTests) {
+            test.ok();
+            String name = test.getClass().getSimpleName();
+            if(!test.enabled)
+                tests.add(name);
+            if(!test.testBeforeUpload)
+                testsBeforeUpload.add(name);
+        }
+
+        // Initializes all tests but MapCSSTagChecker because it is initialized
+        // later in ValidatorTagCheckerRulesPreference.ok(),
+        // after its list of rules has been saved to preferences
+        List<Test> testsToInitialize = new ArrayList<>(allTests);
+        testsToInitialize.remove(OsmValidator.getTest(MapCSSTagChecker.class));
+        OsmValidator.initializeTests(testsToInitialize);
+
+        Main.pref.putCollection(ValidatorPreference.PREF_SKIP_TESTS, tests);
+        Main.pref.putCollection(ValidatorPreference.PREF_SKIP_TESTS_BEFORE_UPLOAD, testsBeforeUpload);
+        Main.pref.put(ValidatorPreference.PREF_USE_IGNORE, prefUseIgnore.isSelected());
+        ValidatorPreference.PREF_OTHER.put(prefOther.isSelected());
+        Main.pref.put(ValidatorPreference.PREF_OTHER_UPLOAD, prefOtherUpload.isSelected());
+        Main.pref.put(ValidatorPreference.PREF_LAYER, prefUseLayer.isSelected());
         return false;
     }
+
+    @Override
+    public boolean isExpert() {
+        return false;
+    }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
index 295503c..2430a29 100644
--- a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
@@ -14,6 +14,7 @@ import java.util.Map;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
+import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
@@ -22,14 +23,13 @@ import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
 import org.openstreetmap.josm.gui.preferences.SourceEntry;
 import org.openstreetmap.josm.gui.preferences.SourceProvider;
 import org.openstreetmap.josm.gui.preferences.SourceType;
-import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
-import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+import org.openstreetmap.josm.tools.GBC;
 
 /**
  * The general validator preferences, allowing to enable/disable tests.
  * @since 6669
  */
-public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting {
+public class ValidatorTagCheckerRulesPreference extends DefaultTabPreferenceSetting {
 
     /**
      * Factory used to create a new {@code ValidatorTagCheckerRulesPreference}.
@@ -41,6 +41,10 @@ public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting
         }
     }
 
+    private ValidatorTagCheckerRulesPreference() {
+        super("validator", tr("Tag checker rules"), tr("Choose Tag checker rules to enable"));
+    }
+
     private static final List<SourceProvider> ruleSourceProviders = new ArrayList<>();
 
     /**
@@ -48,7 +52,7 @@ public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting
      * @param provider The rule source provider
      * @return {@code true}, if the provider has been added, {@code false} otherwise
      */
-    public static final boolean registerSourceProvider(SourceProvider provider) {
+    public static boolean registerSourceProvider(SourceProvider provider) {
         if (provider != null)
             return ruleSourceProviders.add(provider);
         return false;
@@ -178,12 +182,8 @@ public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting
 
     @Override
     public void addGui(PreferenceTabbedPane gui) {
-        final ValidatorPreference valPref = gui.getValidatorPreference();
         sources = new TagCheckerRulesSourceEditor();
-        
-        valPref.addSubTab(this, tr("Tag checker rules"),
-                sources, tr("Choose Tag checker rules to enable"));
-        sources.deferLoading(valPref, sources);
+        gui.createPreferenceTab(this).add(sources, GBC.eol().fill(GBC.BOTH));
     }
 
     @Override
@@ -203,9 +203,4 @@ public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting
     public boolean isExpert() {
         return false;
     }
-
-    @Override
-    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
-        return gui.getValidatorPreference();
-    }
 }
diff --git a/src/org/openstreetmap/josm/tools/I18n.java b/src/org/openstreetmap/josm/tools/I18n.java
index a995204..6dc0c23 100644
--- a/src/org/openstreetmap/josm/tools/I18n.java
+++ b/src/org/openstreetmap/josm/tools/I18n.java
@@ -10,10 +10,10 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.jar.JarInputStream;
@@ -321,28 +321,34 @@ public final class I18n {
 
     /**
      * Get a list of all available JOSM Translations.
-     * @return an array of locale objects.
+     * @return a sorted list of locale objects.
      */
-    public static final Locale[] getAvailableTranslations() {
-        Collection<Locale> v = new ArrayList<>(languages.size());
-        if(getTranslationFile("en") != null)
-        {
+    public static final List<Locale> getAvailableTranslationsAsList() {
+        List<Locale> v = new ArrayList<>(languages.size());
+        if (getTranslationFile("en") != null) {
             for (String loc : languages.keySet()) {
-                if(getTranslationFile(loc) != null) {
+                if (getTranslationFile(loc) != null) {
                     v.add(LanguageInfo.getLocale(loc));
                 }
             }
         }
         v.add(Locale.ENGLISH);
-        Locale[] l = new Locale[v.size()];
-        l = v.toArray(l);
-        Arrays.sort(l, new Comparator<Locale>() {
+        Collections.sort(v, new Comparator<Locale>() {
             @Override
             public int compare(Locale o1, Locale o2) {
                 return o1.toString().compareTo(o2.toString());
             }
         });
-        return l;
+        return v;
+    }
+
+    /**
+     * Get an array of all available JOSM Translations.
+     * @return an array of locale objects.
+     */
+    public static final Locale[] getAvailableTranslations() {
+        List<Locale> locales = getAvailableTranslationsAsList();
+        return locales.toArray(new Locale[locales.size()]);
     }
 
     public static boolean hasCode(String code)
