Index: /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java	(revision 5465)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java	(revision 5465)
@@ -0,0 +1,122 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JColorChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JTextField;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.io.imagery.OffsetServer;
+import org.openstreetmap.josm.io.imagery.OsmosnimkiOffsetServer;
+import org.openstreetmap.josm.tools.ColorHelper;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * {@code JPanel} giving access to common imagery settings.
+ * @since 5465
+ */
+public class CommonSettingsPanel extends JPanel {
+
+    // Common Settings
+    private final JButton btnFadeColor;
+    private final JSlider fadeAmount = new JSlider(0, 100);
+    private final JosmComboBox sharpen;
+    private final JCheckBox useOffsetServer;
+    private final JTextField offsetServerUrl;
+
+    /**
+     * Constructs a new {@code CommonSettingsPanel}.
+     */
+    public CommonSettingsPanel() {
+        super(new GridBagLayout());
+        
+        this.btnFadeColor = new JButton();
+
+        this.btnFadeColor.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JColorChooser chooser = new JColorChooser(btnFadeColor.getBackground());
+                int answer = JOptionPane.showConfirmDialog(
+                        CommonSettingsPanel.this, chooser,
+                        tr("Choose a color for {0}", tr("imagery fade")),
+                        JOptionPane.OK_CANCEL_OPTION,
+                        JOptionPane.PLAIN_MESSAGE);
+                if (answer == JOptionPane.OK_OPTION) {
+                    Color colFadeColor = chooser.getColor();
+                    btnFadeColor.setBackground(colFadeColor);
+                    btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
+                }
+            }
+        });
+
+        add(new JLabel(tr("Fade Color: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        add(this.btnFadeColor, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Fade amount: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        add(this.fadeAmount, GBC.eol().fill(GBC.HORIZONTAL));
+
+        this.sharpen = new JosmComboBox(new String[] {
+                tr("None"),
+                tr("Soft"),
+                tr("Strong")});
+        add(new JLabel(tr("Sharpen (requires layer re-add): ")));
+        add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        add(this.sharpen, GBC.eol().fill(GBC.HORIZONTAL));
+
+        this.useOffsetServer = new JCheckBox(tr("Use offset server: "));
+        this.offsetServerUrl = new JTextField();
+        this.useOffsetServer.addChangeListener(new ChangeListener() {
+            @Override
+            public void stateChanged(ChangeEvent e) {
+                offsetServerUrl.setEnabled(useOffsetServer.isSelected());
+            }
+        });
+        offsetServerUrl.setEnabled(useOffsetServer.isSelected());
+        add(this.useOffsetServer, GBC.eol().fill(GBC.HORIZONTAL));
+        add(this.offsetServerUrl, GBC.eol().fill(GBC.HORIZONTAL));
+    }
+    
+    /**
+     * Loads the common settings.
+     */
+    public void loadSettings() {
+        Color colFadeColor = ImageryLayer.PROP_FADE_COLOR.get();
+        this.btnFadeColor.setBackground(colFadeColor);
+        this.btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
+        this.fadeAmount.setValue(ImageryLayer.PROP_FADE_AMOUNT.get());
+        this.sharpen.setSelectedIndex(Math.max(0, Math.min(2, ImageryLayer.PROP_SHARPEN_LEVEL.get())));
+        this.useOffsetServer.setSelected(OffsetServer.PROP_SERVER_ENABLED.get());
+        this.offsetServerUrl.setText(OsmosnimkiOffsetServer.PROP_SERVER_URL.get());
+    }
+    
+    /**
+     * Saves the common settings.
+     * @return true when restart is required
+     */
+    public boolean saveSettings() {
+        OffsetServer.PROP_SERVER_ENABLED.put(useOffsetServer.isSelected());
+        OsmosnimkiOffsetServer.PROP_SERVER_URL.put(offsetServerUrl.getText());
+
+        ImageryLayer.PROP_FADE_AMOUNT.put(this.fadeAmount.getValue());
+        ImageryLayer.PROP_FADE_COLOR.put(this.btnFadeColor.getBackground());
+        ImageryLayer.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex());
+        return false;
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 5464)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 5465)
@@ -33,6 +33,4 @@
 import javax.swing.Box;
 import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JColorChooser;
 import javax.swing.JEditorPane;
 import javax.swing.JLabel;
@@ -41,14 +39,8 @@
 import javax.swing.JScrollPane;
 import javax.swing.JSeparator;
-import javax.swing.JSlider;
-import javax.swing.JSpinner;
 import javax.swing.JTabbedPane;
 import javax.swing.JTable;
-import javax.swing.JTextField;
 import javax.swing.JToolBar;
-import javax.swing.SpinnerNumberModel;
 import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -71,16 +63,8 @@
 import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.data.imagery.Shape;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
-import org.openstreetmap.josm.gui.layer.TMSLayer;
-import org.openstreetmap.josm.gui.layer.WMSLayer;
 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.JosmComboBox;
-import org.openstreetmap.josm.io.imagery.HTMLGrabber;
-import org.openstreetmap.josm.io.imagery.OffsetServer;
-import org.openstreetmap.josm.io.imagery.OsmosnimkiOffsetServer;
-import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -102,157 +86,12 @@
     private ImageryLayerInfo layerInfo;
 
-    // Common settings
-    private Color colFadeColor;
-    private JButton btnFadeColor;
-    private JSlider fadeAmount = new JSlider(0, 100);
-    private JosmComboBox sharpen;
-    private JCheckBox useOffsetServer;
-    private JTextField offsetServerUrl;
-
-    // WMS Settings
-    private JosmComboBox browser;
-    private JCheckBox overlapCheckBox;
-    private JSpinner spinEast;
-    private JSpinner spinNorth;
-    private JSpinner spinSimConn;
-
-    //TMS settings controls
-    private JCheckBox autozoomActive = new JCheckBox();
-    private JCheckBox autoloadTiles = new JCheckBox();
-    private JSpinner minZoomLvl;
-    private JSpinner maxZoomLvl;
-    private JCheckBox addToSlippyMapChosser = new JCheckBox();
-    private JTextField tilecacheDir = new JTextField();
-
-    private JPanel buildCommonSettingsPanel(final PreferenceTabbedPane gui) {
-        final JPanel p = new JPanel(new GridBagLayout());
-
-        this.colFadeColor = ImageryLayer.PROP_FADE_COLOR.get();
-        this.btnFadeColor = new JButton();
-
-        this.btnFadeColor.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                JColorChooser chooser = new JColorChooser(colFadeColor);
-                int answer = JOptionPane.showConfirmDialog(
-                        gui, chooser,
-                        tr("Choose a color for {0}", tr("imagery fade")),
-                        JOptionPane.OK_CANCEL_OPTION,
-                        JOptionPane.PLAIN_MESSAGE);
-                if (answer == JOptionPane.OK_OPTION) {
-                    colFadeColor = chooser.getColor();
-                    btnFadeColor.setBackground(colFadeColor);
-                    btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
-                }
-            }
-        });
-
-        p.add(new JLabel(tr("Fade Color: ")), GBC.std());
-        p.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
-        p.add(this.btnFadeColor, GBC.eol().fill(GBC.HORIZONTAL));
-
-        p.add(new JLabel(tr("Fade amount: ")), GBC.std());
-        p.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
-        p.add(this.fadeAmount, GBC.eol().fill(GBC.HORIZONTAL));
-
-        this.sharpen = new JosmComboBox(new String[] {
-                tr("None"),
-                tr("Soft"),
-                tr("Strong")});
-        p.add(new JLabel(tr("Sharpen (requires layer re-add): ")));
-        p.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
-        p.add(this.sharpen, GBC.eol().fill(GBC.HORIZONTAL));
-
-        this.useOffsetServer = new JCheckBox(tr("Use offset server: "));
-        this.offsetServerUrl = new JTextField();
-        this.useOffsetServer.addChangeListener(new ChangeListener() {
-            @Override
-            public void stateChanged(ChangeEvent e) {
-                offsetServerUrl.setEnabled(useOffsetServer.isSelected());
-            }
-        });
-        offsetServerUrl.setEnabled(useOffsetServer.isSelected());
-        p.add(this.useOffsetServer, GBC.eol().fill(GBC.HORIZONTAL));
-        p.add(this.offsetServerUrl, GBC.eol().fill(GBC.HORIZONTAL));
-        return p;
-    }
-
-    private JPanel buildWMSSettingsPanel() {
-        final JPanel p = new JPanel(new GridBagLayout());
-        browser = new JosmComboBox(new String[] {
-                "webkit-image {0}",
-                "gnome-web-photo --mode=photo --format=png {0} /dev/stdout",
-                "gnome-web-photo-fixed {0}",
-        "webkit-image-gtk {0}"});
-        browser.setEditable(true);
-        p.add(new JLabel(tr("Downloader:")), GBC.eol().fill(GBC.HORIZONTAL));
-        p.add(browser);
-
-        // Overlap
-        p.add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
-
-        overlapCheckBox = new JCheckBox(tr("Overlap tiles"));
-        JLabel labelEast = new JLabel(tr("% of east:"));
-        JLabel labelNorth = new JLabel(tr("% of north:"));
-        spinEast = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_EAST.get().intValue(), 1, 50, 1));
-        spinNorth = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_NORTH.get().intValue(), 1, 50, 1));
-
-        JPanel overlapPanel = new JPanel(new FlowLayout());
-        overlapPanel.add(overlapCheckBox);
-        overlapPanel.add(labelEast);
-        overlapPanel.add(spinEast);
-        overlapPanel.add(labelNorth);
-        overlapPanel.add(spinNorth);
-
-        p.add(overlapPanel);
-
-        // Simultaneous connections
-        p.add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
-        JLabel labelSimConn = new JLabel(tr("Simultaneous connections"));
-        spinSimConn = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get().intValue(), 1, 30, 1));
-        JPanel overlapPanelSimConn = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        overlapPanelSimConn.add(labelSimConn);
-        overlapPanelSimConn.add(spinSimConn);
-        p.add(overlapPanelSimConn, GBC.eol().fill(GBC.HORIZONTAL));
-
-        return p;
-    }
-
-    private JPanel buildTMSSettingsPanel() {
-        JPanel tmsTab = new JPanel(new GridBagLayout());
-
-        minZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MIN_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
-        maxZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MAX_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
-
-        tmsTab.add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
-        tmsTab.add(GBC.glue(5, 0), GBC.std());
-        tmsTab.add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
-
-        tmsTab.add(new JLabel(tr("Autoload tiles by default: ")), GBC.std());
-        tmsTab.add(GBC.glue(5, 0), GBC.std());
-        tmsTab.add(autoloadTiles, GBC.eol().fill(GBC.HORIZONTAL));
-
-        tmsTab.add(new JLabel(tr("Min. zoom level: ")), GBC.std());
-        tmsTab.add(GBC.glue(5, 0), GBC.std());
-        tmsTab.add(this.minZoomLvl, GBC.eol());
-
-        tmsTab.add(new JLabel(tr("Max. zoom level: ")), GBC.std());
-        tmsTab.add(GBC.glue(5, 0), GBC.std());
-        tmsTab.add(this.maxZoomLvl, GBC.eol());
-
-        tmsTab.add(new JLabel(tr("Add to slippymap chooser: ")), GBC.std());
-        tmsTab.add(GBC.glue(5, 0), GBC.std());
-        tmsTab.add(addToSlippyMapChosser, GBC.eol().fill(GBC.HORIZONTAL));
-
-        tmsTab.add(new JLabel(tr("Tile cache directory: ")), GBC.std());
-        tmsTab.add(GBC.glue(5, 0), GBC.std());
-        tmsTab.add(tilecacheDir, GBC.eol().fill(GBC.HORIZONTAL));
-
-        return tmsTab;
-    }
+    private CommonSettingsPanel commonSettings;
+    private WMSSettingsPanel wmsSettings;
+    private TMSSettingsPanel tmsSettings;
 
     private void addSettingsSection(final JPanel p, String name, JPanel section) {
         addSettingsSection(p, name, section, GBC.eol());
     }
+    
     private void addSettingsSection(final JPanel p, String name, JPanel section, GBC gbc) {
         final JLabel lbl = new JLabel(name);
@@ -267,7 +106,8 @@
         p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
 
-        addSettingsSection(p, tr("Common Settings"), buildCommonSettingsPanel(gui));
-        addSettingsSection(p, tr("WMS Settings"), buildWMSSettingsPanel());
-        addSettingsSection(p, tr("TMS Settings"), buildTMSSettingsPanel(),
+        addSettingsSection(p, tr("Common Settings"), commonSettings = new CommonSettingsPanel());
+        addSettingsSection(p, tr("WMS Settings"), wmsSettings = new WMSSettingsPanel(),
+                GBC.eol().fill(GBC.HORIZONTAL));
+        addSettingsSection(p, tr("TMS Settings"), tmsSettings = new TMSSettingsPanel(),
                 GBC.eol().fill(GBC.HORIZONTAL));
 
@@ -297,31 +137,11 @@
 
     private void loadSettings() {
-        // Common settings
-        this.btnFadeColor.setBackground(colFadeColor);
-        this.btnFadeColor.setText(ColorHelper.color2html(colFadeColor));
-        this.fadeAmount.setValue(ImageryLayer.PROP_FADE_AMOUNT.get());
-        this.sharpen.setSelectedIndex(Math.max(0, Math.min(2, ImageryLayer.PROP_SHARPEN_LEVEL.get())));
-        this.useOffsetServer.setSelected(OffsetServer.PROP_SERVER_ENABLED.get());
-        this.offsetServerUrl.setText(OsmosnimkiOffsetServer.PROP_SERVER_URL.get());
-
-        // WMS Settings
-        this.browser.setSelectedItem(HTMLGrabber.PROP_BROWSER.get());
-        this.overlapCheckBox.setSelected(WMSLayer.PROP_OVERLAP.get());
-        this.spinEast.setValue(WMSLayer.PROP_OVERLAP_EAST.get());
-        this.spinNorth.setValue(WMSLayer.PROP_OVERLAP_NORTH.get());
-        this.spinSimConn.setValue(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get());
-
-        // TMS Settings
-        this.autozoomActive.setSelected(TMSLayer.PROP_DEFAULT_AUTOZOOM.get());
-        this.autoloadTiles.setSelected(TMSLayer.PROP_DEFAULT_AUTOLOAD.get());
-        this.addToSlippyMapChosser.setSelected(TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get());
-        this.maxZoomLvl.setValue(TMSLayer.getMaxZoomLvl(null));
-        this.minZoomLvl.setValue(TMSLayer.getMinZoomLvl(null));
-        this.tilecacheDir.setText(TMSLayer.PROP_TILECACHE_DIR.get());
+        commonSettings.loadSettings();
+        wmsSettings.loadSettings();
+        tmsSettings.loadSettings();
     }
 
     @Override
     public boolean ok() {
-        boolean restartRequired = false;
         layerInfo.save();
         ImageryLayerInfo.instance.clear();
@@ -331,30 +151,10 @@
         OffsetBookmark.saveBookmarks();
 
-        WMSLayer.PROP_OVERLAP.put(overlapCheckBox.getModel().isSelected());
-        WMSLayer.PROP_OVERLAP_EAST.put((Integer) spinEast.getModel().getValue());
-        WMSLayer.PROP_OVERLAP_NORTH.put((Integer) spinNorth.getModel().getValue());
-        WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.put((Integer) spinSimConn.getModel().getValue());
-
-        HTMLGrabber.PROP_BROWSER.put(browser.getEditor().getItem().toString());
-        OffsetServer.PROP_SERVER_ENABLED.put(useOffsetServer.isSelected());
-        OsmosnimkiOffsetServer.PROP_SERVER_URL.put(offsetServerUrl.getText());
-
-        if (TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get() != this.addToSlippyMapChosser.isSelected()) {
-            restartRequired = true;
-        }
-        TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.put(this.addToSlippyMapChosser.isSelected());
-        TMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
-        TMSLayer.PROP_DEFAULT_AUTOLOAD.put(this.autoloadTiles.isSelected());
-        TMSLayer.setMaxZoomLvl((Integer)this.maxZoomLvl.getValue());
-        TMSLayer.setMinZoomLvl((Integer)this.minZoomLvl.getValue());
-        TMSLayer.PROP_TILECACHE_DIR.put(this.tilecacheDir.getText());
-
-        ImageryLayer.PROP_FADE_AMOUNT.put(this.fadeAmount.getValue());
-        ImageryLayer.PROP_FADE_COLOR.put(this.colFadeColor);
-        ImageryLayer.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex());
-
-        return restartRequired;
-    }
-
+        boolean commonRestartRequired = commonSettings.saveSettings();
+        boolean wmsRestartRequired = wmsSettings.saveSettings();
+        boolean tmsRestartRequired = tmsSettings.saveSettings();
+
+        return commonRestartRequired || wmsRestartRequired || tmsRestartRequired;
+    }
 
     /**
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java	(revision 5465)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/TMSSettingsPanel.java	(revision 5465)
@@ -0,0 +1,96 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.GridBagLayout;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.JTextField;
+import javax.swing.SpinnerNumberModel;
+
+import org.openstreetmap.josm.gui.layer.TMSLayer;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * {@code JPanel} giving access to TMS settings.
+ * @since 5465
+ */
+public class TMSSettingsPanel extends JPanel {
+
+    // TMS Settings
+    private final JCheckBox autozoomActive = new JCheckBox();
+    private final JCheckBox autoloadTiles = new JCheckBox();
+    private final JSpinner minZoomLvl;
+    private final JSpinner maxZoomLvl;
+    private final JCheckBox addToSlippyMapChosser = new JCheckBox();
+    private final JTextField tilecacheDir = new JTextField();
+
+    /**
+     * Constructs a new {@code TMSSettingsPanel}.
+     */
+    public TMSSettingsPanel() {
+        super(new GridBagLayout());
+        minZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MIN_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
+        maxZoomLvl = new JSpinner(new SpinnerNumberModel(TMSLayer.DEFAULT_MAX_ZOOM, TMSLayer.MIN_ZOOM, TMSLayer.MAX_ZOOM, 1));
+
+        add(new JLabel(tr("Auto zoom by default: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(autozoomActive, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Autoload tiles by default: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(autoloadTiles, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Min. zoom level: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(this.minZoomLvl, GBC.eol());
+
+        add(new JLabel(tr("Max. zoom level: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(this.maxZoomLvl, GBC.eol());
+
+        add(new JLabel(tr("Add to slippymap chooser: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(addToSlippyMapChosser, GBC.eol().fill(GBC.HORIZONTAL));
+
+        add(new JLabel(tr("Tile cache directory: ")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(tilecacheDir, GBC.eol().fill(GBC.HORIZONTAL));
+    }
+    
+    /**
+     * Loads the TMS settings.
+     */
+    public void loadSettings() {
+        this.autozoomActive.setSelected(TMSLayer.PROP_DEFAULT_AUTOZOOM.get());
+        this.autoloadTiles.setSelected(TMSLayer.PROP_DEFAULT_AUTOLOAD.get());
+        this.addToSlippyMapChosser.setSelected(TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get());
+        this.maxZoomLvl.setValue(TMSLayer.getMaxZoomLvl(null));
+        this.minZoomLvl.setValue(TMSLayer.getMinZoomLvl(null));
+        this.tilecacheDir.setText(TMSLayer.PROP_TILECACHE_DIR.get());
+    }
+    
+    /**
+     * Saves the TMS settings.
+     * @return true when restart is required
+     */
+    public boolean saveSettings() {
+        boolean restartRequired = false;
+        
+        if (TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get() != this.addToSlippyMapChosser.isSelected()) {
+            restartRequired = true;
+        }
+        TMSLayer.PROP_ADD_TO_SLIPPYMAP_CHOOSER.put(this.addToSlippyMapChosser.isSelected());
+        TMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
+        TMSLayer.PROP_DEFAULT_AUTOLOAD.put(this.autoloadTiles.isSelected());
+        TMSLayer.setMaxZoomLvl((Integer)this.maxZoomLvl.getValue());
+        TMSLayer.setMinZoomLvl((Integer)this.minZoomLvl.getValue());
+        TMSLayer.PROP_TILECACHE_DIR.put(this.tilecacheDir.getText());
+        
+        return restartRequired;
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java	(revision 5465)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java	(revision 5465)
@@ -0,0 +1,103 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.imagery;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.FlowLayout;
+import java.awt.GridBagLayout;
+
+import javax.swing.Box;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+
+import org.openstreetmap.josm.gui.layer.WMSLayer;
+import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.io.imagery.HTMLGrabber;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * {@code JPanel} giving access to WMS settings.
+ * @since 5465
+ */
+public class WMSSettingsPanel extends JPanel {
+
+    // WMS Settings
+    private final JosmComboBox browser;
+    private final JCheckBox overlapCheckBox;
+    private final JSpinner spinEast;
+    private final JSpinner spinNorth;
+    private final JSpinner spinSimConn;
+
+    /**
+     * Constructs a new {@code WMSSettingsPanel}.
+     */
+    public WMSSettingsPanel() {
+        super(new GridBagLayout());
+        
+        // Downloader
+        browser = new JosmComboBox(new String[] {
+                "webkit-image {0}",
+                "gnome-web-photo --mode=photo --format=png {0} /dev/stdout",
+                "gnome-web-photo-fixed {0}",
+        "webkit-image-gtk {0}"});
+        browser.setEditable(true);
+        add(new JLabel(tr("Downloader:")), GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(browser, GBC.eol().fill(GBC.HORIZONTAL));
+
+        // Simultaneous connections
+        add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
+        JLabel labelSimConn = new JLabel(tr("Simultaneous connections:"));
+        spinSimConn = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get().intValue(), 1, 30, 1));
+        add(labelSimConn, GBC.std());
+        add(GBC.glue(5, 0), GBC.std());
+        add(spinSimConn, GBC.eol());
+
+        // Overlap
+        add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
+
+        overlapCheckBox = new JCheckBox(tr("Overlap tiles"));
+        JLabel labelEast = new JLabel(tr("% of east:"));
+        JLabel labelNorth = new JLabel(tr("% of north:"));
+        spinEast = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_EAST.get().intValue(), 1, 50, 1));
+        spinNorth = new JSpinner(new SpinnerNumberModel(WMSLayer.PROP_OVERLAP_NORTH.get().intValue(), 1, 50, 1));
+
+        JPanel overlapPanel = new JPanel(new FlowLayout());
+        overlapPanel.add(overlapCheckBox);
+        overlapPanel.add(labelEast);
+        overlapPanel.add(spinEast);
+        overlapPanel.add(labelNorth);
+        overlapPanel.add(spinNorth);
+
+        add(overlapPanel, GBC.eop());
+    }
+    
+    /**
+     * Loads the WMS settings.
+     */
+    public void loadSettings() {
+        this.browser.setSelectedItem(HTMLGrabber.PROP_BROWSER.get());
+        this.overlapCheckBox.setSelected(WMSLayer.PROP_OVERLAP.get());
+        this.spinEast.setValue(WMSLayer.PROP_OVERLAP_EAST.get());
+        this.spinNorth.setValue(WMSLayer.PROP_OVERLAP_NORTH.get());
+        this.spinSimConn.setValue(WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.get());
+    }
+    
+    /**
+     * Saves the WMS settings.
+     * @return true when restart is required
+     */
+    public boolean saveSettings() {
+        WMSLayer.PROP_OVERLAP.put(overlapCheckBox.getModel().isSelected());
+        WMSLayer.PROP_OVERLAP_EAST.put((Integer) spinEast.getModel().getValue());
+        WMSLayer.PROP_OVERLAP_NORTH.put((Integer) spinNorth.getModel().getValue());
+        WMSLayer.PROP_SIMULTANEOUS_CONNECTIONS.put((Integer) spinSimConn.getModel().getValue());
+
+        HTMLGrabber.PROP_BROWSER.put(browser.getEditor().getItem().toString());
+        
+        return false;
+    }
+}
