Index: trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 9778)
@@ -176,7 +176,5 @@
 
         JScrollPane sp = new JScrollPane(p);
-        // putting JTable directly in a JScrollPane works nicely, but with
-        // JPanel wrapper, the default scroll increment is too small
-        sp.getVerticalScrollBar().setUnitIncrement(16);
+        GuiHelper.setDefaultIncrement(sp);
         createLayout(sp, false, Arrays.asList(
                 new SideButton(onoffAction, false),
Index: trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java	(revision 9778)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -56,5 +57,5 @@
     @Override
     public void addGui(PreferenceTabbedPane gui) {
-        JPanel audio = new JPanel(new GridBagLayout());
+        JPanel audio = new VerticallyScrollablePanel(new GridBagLayout());
 
         // audioMenuVisible
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/DrawingPreference.java	(revision 9778)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -64,4 +65,5 @@
         JScrollPane scrollpane = new JScrollPane(panel);
         scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+        GuiHelper.setDefaultIncrement(scrollpane);
         gui.getDisplayPreference().addSubTab(this, tr("GPS Points"), scrollpane);
         panel = new JPanel(new GridBagLayout());
@@ -167,4 +169,5 @@
         scrollpane = new JScrollPane(panel);
         scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
+        GuiHelper.setDefaultIncrement(scrollpane);
         gui.getDisplayPreference().addSubTab(this, tr("OSM Data"), scrollpane);
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 9778)
@@ -32,4 +32,5 @@
 import org.openstreetmap.josm.gui.widgets.FileChooserManager;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.date.DateUtils;
@@ -54,5 +55,5 @@
      */
     private JosmComboBox<LookAndFeelInfo> lafCombo;
-    JPanel panel;
+    VerticallyScrollablePanel panel;
     private final JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
     private final JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists"));
@@ -99,5 +100,5 @@
         });
 
-        panel = new JPanel(new GridBagLayout());
+        panel = new VerticallyScrollablePanel(new GridBagLayout());
         panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
 
@@ -147,5 +148,5 @@
         panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
 
-        JScrollPane scrollpane = new JScrollPane(panel);
+        JScrollPane scrollpane = panel.getVerticalScrollPane();
         scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
         gui.getDisplayPreference().addSubTab(this, tr("Look and Feel"), scrollpane);
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java	(revision 9778)
@@ -61,5 +61,5 @@
 
         showBounds.setEnabled(false);
-        add(new JScrollPane(showBounds), GBC.eop().fill());
+        add(showBounds, GBC.eop().fill());
 
         add(new JLabel(tr("3. Select image format")), GBC.eol());
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 9778)
@@ -121,5 +121,5 @@
 
         p.add(new JPanel(), GBC.eol().fill(GBC.BOTH));
-        return new JScrollPane(p);
+        return GuiHelper.setDefaultIncrement(new JScrollPane(p));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 9778)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -292,5 +293,5 @@
      * This is the panel holding all projection preferences
      */
-    private final JPanel projPanel = new JPanel(new GridBagLayout());
+    private final VerticallyScrollablePanel projPanel = new VerticallyScrollablePanel(new GridBagLayout());
 
     /**
@@ -346,6 +347,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);
+        gui.getMapPreference().addSubTab(this, tr("Map Projection"), projPanel.getVerticalScrollPane());
 
         selectedProjectionChanged(pc);
Index: trunk/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreference.java	(revision 9778)
@@ -34,4 +34,5 @@
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 import org.openstreetmap.josm.io.remotecontrol.RemoteControl;
@@ -81,5 +82,5 @@
     public void addGui(final PreferenceTabbedPane gui) {
 
-        JPanel remote = new JPanel(new GridBagLayout());
+        JPanel remote = new VerticallyScrollablePanel(new GridBagLayout());
 
         final JLabel descLabel = new JLabel("<html>"
Index: trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreference.java	(revision 9778)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -55,5 +56,5 @@
     @Override
     public void addGui(PreferenceTabbedPane gui) {
-        JPanel testPanel = new JPanel(new GridBagLayout());
+        JPanel testPanel = new VerticallyScrollablePanel(new GridBagLayout());
         testPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
 
Index: trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 9777)
+++ trunk/src/org/openstreetmap/josm/gui/util/GuiHelper.java	(revision 9778)
@@ -37,4 +37,5 @@
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.Scrollable;
 import javax.swing.SwingUtilities;
 import javax.swing.Timer;
@@ -341,4 +342,29 @@
 
     /**
+     * Set the default unit increment for a {@code JScrollPane}.
+     *
+     * This fixes slow mouse wheel scrolling when the content of the {@code JScrollPane}
+     * is a {@code JPanel} or other component that does not implement the {@link Scrollable}
+     * interface.
+     * The default unit increment is 1 pixel. Multiplied by the number of unit increments
+     * per mouse wheel "click" (platform dependent, usually 3), this makes a very
+     * sluggish mouse wheel experience.
+     * This methods sets the unit increment to a larger, more reasonable value.
+     * @param sp the scroll pane
+     * @return the scroll pane (same object) with fixed unit increment
+     * @throws IllegalArgumentException if the component inside of the scroll pane
+     * implements the {@code Scrollable} interface ({@code JTree}, {@code JLayer},
+     * {@code JList}, {@code JTextComponent} and {@code JTable})
+     */
+    public static JScrollPane setDefaultIncrement(JScrollPane sp) {
+        if (sp.getViewport().getView() instanceof Scrollable) {
+            throw new IllegalArgumentException();
+        }
+        sp.getVerticalScrollBar().setUnitIncrement(10);
+        sp.getHorizontalScrollBar().setUnitIncrement(10);
+        return sp;
+    }
+
+    /**
      * Returns extended modifier key used as the appropriate accelerator key for menu shortcuts.
      * It is advised everywhere to use {@link Toolkit#getMenuShortcutKeyMask()} to get the cross-platform modifier, but:
