Index: /trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 12891)
@@ -32,4 +32,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -336,5 +337,5 @@
                 fileHistory.removeAll(failedAll);
                 int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
-                Main.pref.putCollectionBounded("file-open.history", maxsize, fileHistory);
+                PreferencesUtils.putCollectionBounded(Config.getPref(), "file-open.history", maxsize, fileHistory);
             }
         }
Index: /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java	(revision 12891)
@@ -16,4 +16,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.io.importexport.FileExporter;
@@ -235,5 +236,5 @@
         history.remove(filepath);
         history.add(0, filepath);
-        Main.pref.putCollectionBounded("file-open.history", maxsize, history);
+        PreferencesUtils.putCollectionBounded(Config.getPref(), "file-open.history", maxsize, history);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 12891)
@@ -660,5 +660,7 @@
      * @param def The default value
      * @return The boolean value or the default value if it could not be parsed
-     */
+     * @deprecated use {@link PreferencesUtils#getBoolean(IPreferences, String, String, boolean)}
+     */
+    @Deprecated
     public synchronized boolean getBoolean(final String key, final String specName, final boolean def) {
         boolean generic = getBoolean(key, def);
@@ -1076,5 +1078,7 @@
      * @param def The default value
      * @return The integer value or the default value if it could not be parsed
-     */
+     * @deprecated use {@link PreferencesUtils#getInteger(IPreferences, String, String, int)
+     */
+    @Deprecated
     public synchronized int getInteger(String key, String specName, int def) {
         String v = get(key+'.'+specName);
@@ -1122,5 +1126,7 @@
      * @param value The value that should be removed in the collection
      * @see #getList(String)
-     */
+     * @deprecated use {@link PreferencesUtils#removeFromCollection(IPreferences, String, String)}
+     */
+    @Deprecated
     public synchronized void removeFromCollection(String key, String value) {
         List<String> a = new ArrayList<>(getList(key, Collections.<String>emptyList()));
@@ -1230,5 +1236,7 @@
      * @param val value
      * @return {@code true}, if something has changed (i.e. value is different than before)
-     */
+     * @deprecated use {@link PreferencesUtils#putCollectionBounded(IPreferences, String, int, Collection)}
+     */
+    @Deprecated
     public boolean putCollectionBounded(String key, int maxsize, Collection<String> val) {
         List<String> newCollection = new ArrayList<>(Math.min(maxsize, val.size()));
@@ -1248,5 +1256,7 @@
      * @param def default array value
      * @return array value
-     */
+     * @deprecated use {@link #getListOfLists(java.lang.String, java.util.List)}
+     */
+    @Deprecated
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public synchronized Collection<Collection<String>> getArray(String key, Collection<Collection<String>> def) {
Index: /trunk/src/org/openstreetmap/josm/data/PreferencesUtils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/PreferencesUtils.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/data/PreferencesUtils.java	(revision 12891)
@@ -6,4 +6,5 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -18,4 +19,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.spi.preferences.IPreferences;
 import org.openstreetmap.josm.spi.preferences.ListListSetting;
 import org.openstreetmap.josm.spi.preferences.ListSetting;
@@ -476,3 +478,88 @@
         engine.eval(init);
     }
+
+    /**
+     * Gets an boolean that may be specialized
+     * @param prefs the preferences
+     * @param key The basic key
+     * @param specName The sub-key to append to the key
+     * @param def The default value
+     * @return The boolean value or the default value if it could not be parsed
+     * @since 12891
+     */
+    public static boolean getBoolean(IPreferences prefs, final String key, final String specName, final boolean def) {
+        synchronized (prefs) {
+            boolean generic = prefs.getBoolean(key, def);
+            String skey = key+'.'+specName;
+            String svalue = prefs.get(skey, null);
+            if (svalue != null)
+                return Boolean.parseBoolean(svalue);
+            else
+                return generic;
+        }
+    }
+
+    /**
+     * Gets an integer that may be specialized
+     * @param prefs the preferences
+     * @param key The basic key
+     * @param specName The sub-key to append to the key
+     * @param def The default value
+     * @return The integer value or the default value if it could not be parsed
+     * @since 12891
+     */
+    public static int getInteger(IPreferences prefs, String key, String specName, int def) {
+        synchronized (prefs) {
+            String v = prefs.get(key+'.'+specName);
+            if (v.isEmpty())
+                v = prefs.get(key, Integer.toString(def));
+            if (v.isEmpty())
+                return def;
+
+            try {
+                return Integer.parseInt(v);
+            } catch (NumberFormatException e) {
+                // fall out
+                Logging.trace(e);
+            }
+            return def;
+        }
+    }
+
+    /**
+     * Removes a value from a given String collection
+     * @param prefs the preferences
+     * @param key The preference key the collection is stored with
+     * @param value The value that should be removed in the collection
+     * @see #getList(String)
+     * @since 12891
+     */
+    public static void removeFromCollection(IPreferences prefs, String key, String value) {
+        synchronized (prefs) {
+            List<String> a = new ArrayList<>(prefs.getList(key, Collections.<String>emptyList()));
+            a.remove(value);
+            prefs.putList(key, a);
+        }
+    }
+
+    /**
+     * Saves at most {@code maxsize} items of collection {@code val}.
+     * @param prefs the preferences
+     * @param key key
+     * @param maxsize max number of items to save
+     * @param val value
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     * @since 12891
+     */
+    public static boolean putCollectionBounded(IPreferences prefs, String key, int maxsize, Collection<String> val) {
+        List<String> newCollection = new ArrayList<>(Math.min(maxsize, val.size()));
+        for (String i : val) {
+            if (newCollection.size() >= maxsize) {
+                break;
+            }
+            newCollection.add(i);
+        }
+        return prefs.putList(key, newCollection);
+    }
+
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 12891)
@@ -33,6 +33,6 @@
 import javax.swing.ImageIcon;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.SystemOfMeasurement.SoMChangeListener;
@@ -279,5 +279,5 @@
     public ColorMode getColorMode(String layerName) {
         try {
-            int i = Main.pref.getInteger("draw.rawgps.colors", specName(layerName), 0);
+            int i = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.colors", specName(layerName), 0);
             return ColorMode.fromIndex(i);
         } catch (IndexOutOfBoundsException e) {
@@ -300,24 +300,24 @@
     public void readPreferences(String layerName) {
         String spec = specName(layerName);
-        forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", spec, false);
-        direction = Main.pref.getBoolean("draw.rawgps.direction", spec, false);
-        lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", spec, 0);
-        alphaLines = Main.pref.getBoolean("draw.rawgps.lines.alpha-blend", spec, false);
+        forceLines = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.lines.force", spec, false);
+        direction = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.direction", spec, false);
+        lineWidth = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.linewidth", spec, 0);
+        alphaLines = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.lines.alpha-blend", spec, false);
 
         if (!data.fromServer) {
-            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", spec, -1);
-            lines = Main.pref.getBoolean("draw.rawgps.lines.local", spec, true);
+            maxLineLength = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.max-line-length.local", spec, -1);
+            lines = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.lines.local", spec, true);
         } else {
-            maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", spec, 200);
-            lines = Main.pref.getBoolean("draw.rawgps.lines", spec, true);
-        }
-        large = Main.pref.getBoolean("draw.rawgps.large", spec, false);
-        largesize = Main.pref.getInteger("draw.rawgps.large.size", spec, 3);
-        hdopCircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", spec, false);
+            maxLineLength = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.max-line-length", spec, 200);
+            lines = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.lines", spec, true);
+        }
+        large = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.large", spec, false);
+        largesize = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.large.size", spec, 3);
+        hdopCircle = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.hdopcircle", spec, false);
         colored = getColorMode(layerName);
-        alternateDirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", spec, false);
-        delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", spec, 40);
-        colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", spec, 45);
-        colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", spec, false);
+        alternateDirection = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.alternatedirection", spec, false);
+        delta = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.min-arrow-distance", spec, 40);
+        colorTracksTune = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.colorTracksTune", spec, 45);
+        colorModeDynamic = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.colors.dynamic", spec, false);
         /* good HDOP's are between 1 and 3, very bad HDOP's go into 3 digit values */
         hdoprange = Config.getPref().getInt("hdop.range", 7);
@@ -326,10 +326,10 @@
 
         // get heatmap parameters
-        heatMapEnabled = Main.pref.getBoolean("draw.rawgps.heatmap.enabled", spec, false);
-        heatMapDrawExtraLine = Main.pref.getBoolean("draw.rawgps.heatmap.line-extra", spec, false);
-        heatMapDrawColorTableIdx = Main.pref.getInteger("draw.rawgps.heatmap.colormap", spec, 0);
-        heatMapDrawPointMode = Main.pref.getBoolean("draw.rawgps.heatmap.use-points", spec, false);
-        heatMapDrawGain = Main.pref.getInteger("draw.rawgps.heatmap.gain", spec, 0);
-        heatMapDrawLowerLimit = Main.pref.getInteger("draw.rawgps.heatmap.lower-limit", spec, 0);
+        heatMapEnabled = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.heatmap.enabled", spec, false);
+        heatMapDrawExtraLine = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.heatmap.line-extra", spec, false);
+        heatMapDrawColorTableIdx = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.heatmap.colormap", spec, 0);
+        heatMapDrawPointMode = PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.heatmap.use-points", spec, false);
+        heatMapDrawGain = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.heatmap.gain", spec, 0);
+        heatMapDrawLowerLimit = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.heatmap.lower-limit", spec, 0);
 
         // shrink to range
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java	(revision 12891)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.gui.layer.gpx.GpxDrawHelper;
 import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
@@ -392,6 +393,6 @@
             drawRawGpsLinesGlobal.setSelected(true);
         } else {
-            Boolean lf = Main.pref.getBoolean("draw.rawgps.lines.local", layerName, true);
-            if (Main.pref.getBoolean("draw.rawgps.lines", layerName, true)) {
+            Boolean lf =  PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.lines.local", layerName, true);
+            if (PreferencesUtils.getBoolean(Config.getPref(), "draw.rawgps.lines", layerName, true)) {
                 drawRawGpsLinesAll.setSelected(true);
             } else if (lf) {
@@ -402,14 +403,24 @@
         }
 
-        drawRawGpsMaxLineLengthLocal.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length.local", layerName, -1)));
-        drawRawGpsMaxLineLength.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length", layerName, 200)));
-        drawLineWidth.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.linewidth", layerName, 0)));
-        drawLineWithAlpha.setSelected(Main.pref.getBoolean("draw.rawgps.lines.alpha-blend", layerName, false));
-        forceRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines.force", layerName, false));
-        drawGpsArrows.setSelected(Main.pref.getBoolean("draw.rawgps.direction", layerName, false));
-        drawGpsArrowsFast.setSelected(Main.pref.getBoolean("draw.rawgps.alternatedirection", layerName, false));
-        drawGpsArrowsMinDist.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.min-arrow-distance", layerName, 40)));
-        hdopCircleGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.hdopcircle", layerName, false));
-        largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large", layerName, false));
+        drawRawGpsMaxLineLengthLocal.setText(Integer.toString(PreferencesUtils.getInteger(Config.getPref(),
+                "draw.rawgps.max-line-length.local", layerName, -1)));
+        drawRawGpsMaxLineLength.setText(Integer.toString(PreferencesUtils.getInteger(Config.getPref(),
+                "draw.rawgps.max-line-length", layerName, 200)));
+        drawLineWidth.setText(Integer.toString(PreferencesUtils.getInteger(Config.getPref(),
+                "draw.rawgps.linewidth", layerName, 0)));
+        drawLineWithAlpha.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                "draw.rawgps.lines.alpha-blend", layerName, false));
+        forceRawGpsLines.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                "draw.rawgps.lines.force", layerName, false));
+        drawGpsArrows.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                "draw.rawgps.direction", layerName, false));
+        drawGpsArrowsFast.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                "draw.rawgps.alternatedirection", layerName, false));
+        drawGpsArrowsMinDist.setText(Integer.toString(PreferencesUtils.getInteger(Config.getPref(),
+                "draw.rawgps.min-arrow-distance", layerName, 40)));
+        hdopCircleGpsPoints.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                "draw.rawgps.hdopcircle", layerName, false));
+        largeGpsPoints.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                "draw.rawgps.large", layerName, false));
         useGpsAntialiasing.setSelected(Config.getPref().getBoolean("mappaint.gpx.use-antialiasing", false));
 
@@ -424,5 +435,5 @@
             colorTypeHeatMapLowerLimit.setValue(0);
         } else {
-            int colorType = Main.pref.getInteger("draw.rawgps.colors", layerName, 0);
+            int colorType = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.colors", layerName, 0);
             switch (colorType) {
             case 0: colorTypeNone.setSelected(true); break;
@@ -434,11 +445,16 @@
             default: Logging.warn("Unknown color type: " + colorType);
             }
-            int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", layerName, 45);
+            int ccts = PreferencesUtils.getInteger(Config.getPref(), "draw.rawgps.colorTracksTune", layerName, 45);
             colorTypeVelocityTune.setSelectedIndex(ccts == 10 ? 2 : (ccts == 20 ? 1 : 0));
-            colorTypeHeatMapTune.setSelectedIndex(Main.pref.getInteger("draw.rawgps.heatmap.colormap", layerName, 0));
-            colorDynamic.setSelected(Main.pref.getBoolean("draw.rawgps.colors.dynamic", layerName, false));
-            colorTypeHeatMapPoints.setSelected(Main.pref.getBoolean("draw.rawgps.heatmap.use-points", layerName, false));
-            colorTypeHeatMapGain.setValue(Main.pref.getInteger("draw.rawgps.heatmap.gain", layerName, 0));
-            colorTypeHeatMapLowerLimit.setValue(Main.pref.getInteger("draw.rawgps.heatmap.lower-limit", layerName, 0));
+            colorTypeHeatMapTune.setSelectedIndex(PreferencesUtils.getInteger(Config.getPref(),
+                    "draw.rawgps.heatmap.colormap", layerName, 0));
+            colorDynamic.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                    "draw.rawgps.colors.dynamic", layerName, false));
+            colorTypeHeatMapPoints.setSelected(PreferencesUtils.getBoolean(Config.getPref(),
+                    "draw.rawgps.heatmap.use-points", layerName, false));
+            colorTypeHeatMapGain.setValue(PreferencesUtils.getInteger(Config.getPref(),
+                    "draw.rawgps.heatmap.gain", layerName, 0));
+            colorTypeHeatMapLowerLimit.setValue(PreferencesUtils.getInteger(Config.getPref(),
+                    "draw.rawgps.heatmap.lower-limit", layerName, 0));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/io/UploadStrategy.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/UploadStrategy.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/io/UploadStrategy.java	(revision 12891)
@@ -6,5 +6,5 @@
 import java.util.Locale;
 
-import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Logging;
@@ -85,5 +85,5 @@
             v = Config.getPref().get("osm-server.atomic-upload", null);
             if (v != null) {
-                Main.pref.removeFromCollection("osm-server.atomic-upload", v);
+                PreferencesUtils.removeFromCollection(Config.getPref(), "osm-server.atomic-upload", v);
             } else {
                 v = "";
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12890)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12891)
@@ -54,4 +54,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.RestartAction;
+import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
@@ -348,5 +349,5 @@
             if (plugins.contains(depr.name)) {
                 plugins.remove(depr.name);
-                Main.pref.removeFromCollection("plugins", depr.name);
+                PreferencesUtils.removeFromCollection(Config.getPref(), "plugins", depr.name);
                 removedPlugins.add(depr);
             }
@@ -402,5 +403,5 @@
                     Utils.escapeReservedCharactersHTML(unmaintained));
             if (confirmDisablePlugin(parent, msg, unmaintained)) {
-                Main.pref.removeFromCollection("plugins", unmaintained);
+                PreferencesUtils.removeFromCollection(Config.getPref(), "plugins", unmaintained);
                 plugins.remove(unmaintained);
             }
@@ -800,5 +801,5 @@
         }
         if (msg != null && confirmDisablePlugin(parent, msg, plugin.name)) {
-            Main.pref.removeFromCollection("plugins", plugin.name);
+            PreferencesUtils.removeFromCollection(Config.getPref(), "plugins", plugin.name);
         }
     }
