Index: trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 13050)
@@ -39,4 +39,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -263,9 +264,8 @@
             if (layer != null && semicolon >= 0 && semicolon + 1 < ostr.length()) {
                 try {
-                    // here we assume that Double.parseDouble() needs '.' as a decimal separator
-                    String easting = ostr.substring(0, semicolon).trim().replace(',', '.');
-                    String northing = ostr.substring(semicolon + 1).trim().replace(',', '.');
-                    double dx = Double.parseDouble(easting);
-                    double dy = Double.parseDouble(northing);
+                    String easting = ostr.substring(0, semicolon).trim();
+                    String northing = ostr.substring(semicolon + 1).trim();
+                    double dx = JosmDecimalFormatSymbolsProvider.parseDouble(easting);
+                    double dy = JosmDecimalFormatSymbolsProvider.parseDouble(northing);
                     tempOffset.setDisplacement(new EastNorth(dx, dy));
                     layer.getDisplaySettings().setOffsetBookmark(tempOffset);
Index: trunk/src/org/openstreetmap/josm/gui/DownloadParamType.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/DownloadParamType.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/DownloadParamType.java	(revision 13050)
@@ -78,5 +78,5 @@
          * Download area specified on the command line as bounds string.
          * @param rawGps Flag to download raw GPS tracks
-         * @param s The bounds parameter
+         * @param s The bounds parameter. Coordinates must use dot decimal separator as comma is used to delimit values
          * @return the complete download task (including post-download handler), or {@code null}
          */
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java	(revision 13050)
@@ -358,5 +358,5 @@
     /**
      * Parses a east/north coordinate string
-     * @param s The coordinates
+     * @param s The coordinates. Dot has to be used as decimal separator, as comma can be used to delimit values
      * @return The east/north coordinates or <code>null</code> on error.
      */
Index: trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 13050)
@@ -30,4 +30,6 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
 
@@ -140,5 +142,5 @@
         for (int i = 0; i < 4; i++) {
             try {
-                values[i] = Double.parseDouble(latlon[i].getText());
+                values[i] = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[i].getText());
             } catch (NumberFormatException ex) {
                 return null;
@@ -199,5 +201,5 @@
             double value = 0;
             try {
-                value = Double.parseDouble(tfLatValue.getText());
+                value = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatValue.getText());
             } catch (NumberFormatException ex) {
                 setErrorMessage(tfLatValue, tr("The string ''{0}'' is not a valid double value.", tfLatValue.getText()));
@@ -232,5 +234,5 @@
             double value = 0;
             try {
-                value = Double.parseDouble(tfLonValue.getText());
+                value = JosmDecimalFormatSymbolsProvider.parseDouble(tfLonValue.getText());
             } catch (NumberFormatException ex) {
                 setErrorMessage(tfLonValue, tr("The string ''{0}'' is not a valid double value.", tfLonValue.getText()));
@@ -289,9 +291,10 @@
             double minlon, minlat, maxlon, maxlat;
             try {
-                minlat = Double.parseDouble(latlon[0].getText().trim());
-                minlon = Double.parseDouble(latlon[1].getText().trim());
-                maxlat = Double.parseDouble(latlon[2].getText().trim());
-                maxlon = Double.parseDouble(latlon[3].getText().trim());
+                minlat = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[0].getText().trim());
+                minlon = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[1].getText().trim());
+                maxlat = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[2].getText().trim());
+                maxlon = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[3].getText().trim());
             } catch (NumberFormatException e) {
+                Logging.trace(e);
                 return null;
             }
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/Offset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/Offset.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/Offset.java	(revision 13050)
@@ -9,4 +9,5 @@
 import java.util.concurrent.TimeUnit;
 
+import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
 import org.openstreetmap.josm.tools.Pair;
 
@@ -58,5 +59,5 @@
                     offset = offset.substring(1);
                 }
-                return Offset.milliseconds(Math.round(Double.parseDouble(offset) * 1000));
+                return Offset.milliseconds(Math.round(JosmDecimalFormatSymbolsProvider.parseDouble(offset) * 1000));
             } catch (NumberFormatException nfe) {
                 throw (ParseException) new ParseException(error, 0).initCause(nfe);
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/RenderingCLI.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/RenderingCLI.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/RenderingCLI.java	(revision 13050)
@@ -21,5 +21,4 @@
 import org.openstreetmap.gui.jmapviewer.OsmMercator;
 import org.openstreetmap.josm.CLIModule;
-import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
@@ -37,4 +36,6 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.spi.preferences.MemoryPreferences;
+import org.openstreetmap.josm.tools.I18n;
+import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.RightAndLefthandTraffic;
@@ -263,5 +264,5 @@
                 case SCALE:
                     try {
-                        argScale = Double.parseDouble(getopt.getOptarg());
+                        argScale = JosmDecimalFormatSymbolsProvider.parseDouble(getopt.getOptarg());
                     } catch (NumberFormatException nfe) {
                         throw new IllegalArgumentException(
@@ -285,5 +286,5 @@
                 case WIDTH_M:
                     try {
-                        argWidthM = Double.parseDouble(getopt.getOptarg());
+                        argWidthM = JosmDecimalFormatSymbolsProvider.parseDouble(getopt.getOptarg());
                     } catch (NumberFormatException nfe) {
                         throw new IllegalArgumentException(
@@ -295,5 +296,5 @@
                 case HEIGHT_M:
                     try {
-                        argHeightM = Double.parseDouble(getopt.getOptarg());
+                        argHeightM = JosmDecimalFormatSymbolsProvider.parseDouble(getopt.getOptarg());
                     } catch (NumberFormatException nfe) {
                         throw new IllegalArgumentException(
Index: trunk/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java	(revision 13050)
@@ -1,10 +1,17 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.preferences;
+
+import javax.swing.JCheckBox;
+import javax.swing.JTextField;
+
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
+import org.openstreetmap.josm.tools.Logging;
 
 /**
  * Abstract base class for {@link PreferenceSetting} implementations.
  *
- * Handles the flag that indicates if a PreferenceSetting is and expert option
- * or not.
+ * Handles the flag that indicates if a PreferenceSetting is and expert option or not.
+ * @since 4968
  */
 public abstract class DefaultPreferenceSetting implements PreferenceSetting {
@@ -34,3 +41,45 @@
         return isExpert;
     }
+
+    /**
+     * Saves state from a {@link JCheckBox} to a boolean preference.
+     * @param prefName preference name
+     * @param cb check box
+     * @since 13050
+     */
+    protected static void saveBoolean(String prefName, JCheckBox cb) {
+        Config.getPref().putBoolean(prefName, cb.isSelected());
+    }
+
+    /**
+     * Saves text from a {@link JTextField} to a double preference.
+     * @param prefName preference name
+     * @param tf text field
+     * @since 13050
+     */
+    protected static void saveDouble(String prefName, JTextField tf) {
+        String text = tf.getText();
+        try {
+            Config.getPref().putDouble(prefName, JosmDecimalFormatSymbolsProvider.parseDouble(text));
+        } catch (NumberFormatException e) {
+            Logging.warn("Unable to save '" + text + "' as a double value for preference " + prefName);
+            Logging.trace(e);
+        }
+    }
+
+    /**
+     * Saves text from a {@link JTextField} to an integer preference.
+     * @param prefName preference name
+     * @param tf text field
+     * @since 13050
+     */
+    protected static void saveInt(String prefName, JTextField tf) {
+        String text = tf.getText();
+        try {
+            Config.getPref().putInt(prefName, Integer.parseInt(text));
+        } catch (NumberFormatException e) {
+            Logging.warn("Unable to save '" + text + "' as an integer value for preference " + prefName);
+            Logging.trace(e);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java	(revision 13050)
@@ -134,15 +134,15 @@
     public boolean ok() {
         Config.getPref().putBoolean("audio.menuinvisible", !audioMenuVisible.isSelected());
-        Config.getPref().putBoolean("marker.traceaudio", markerAudioTraceVisible.isSelected());
-        Config.getPref().putBoolean("marker.buttonlabels", markerButtonLabels.isSelected());
-        Config.getPref().putBoolean("marker.audiofromexplicitwaypoints", audioMarkersFromExplicitWaypoints.isSelected());
-        Config.getPref().putBoolean("marker.audiofromuntimedwaypoints", audioMarkersFromUntimedWaypoints.isSelected());
-        Config.getPref().putBoolean("marker.audiofromnamedtrackpoints", audioMarkersFromNamedTrackpoints.isSelected());
-        Config.getPref().putBoolean("marker.audiofromwavtimestamps", audioMarkersFromWavTimestamps.isSelected());
-        Config.getPref().putBoolean("marker.audiofromstart", audioMarkersFromStart.isSelected());
-        Config.getPref().put("audio.forwardbackamount", audioForwardBackAmount.getText());
-        Config.getPref().put("audio.fastfwdmultiplier", audioFastForwardMultiplier.getText());
-        Config.getPref().put("audio.leadin", audioLeadIn.getText());
-        Config.getPref().put("audio.calibration", audioCalibration.getText());
+        saveBoolean("marker.traceaudio", markerAudioTraceVisible);
+        saveBoolean("marker.buttonlabels", markerButtonLabels);
+        saveBoolean("marker.audiofromexplicitwaypoints", audioMarkersFromExplicitWaypoints);
+        saveBoolean("marker.audiofromuntimedwaypoints", audioMarkersFromUntimedWaypoints);
+        saveBoolean("marker.audiofromnamedtrackpoints", audioMarkersFromNamedTrackpoints);
+        saveBoolean("marker.audiofromwavtimestamps", audioMarkersFromWavTimestamps);
+        saveBoolean("marker.audiofromstart", audioMarkersFromStart);
+        saveDouble("audio.forwardbackamount", audioForwardBackAmount);
+        saveDouble("audio.fastfwdmultiplier", audioFastForwardMultiplier);
+        saveDouble("audio.leadin", audioLeadIn);
+        saveDouble("audio.calibration", audioCalibration);
         return false;
     }
Index: trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java	(revision 13050)
@@ -20,4 +20,6 @@
 import org.openstreetmap.josm.data.coor.conversion.DecimalDegreesCoordinateFormat;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
 
@@ -99,13 +101,14 @@
         double minlon, minlat, maxlon, maxlat;
         try {
-            minlat = Double.parseDouble(tfLatLon[0].getText().trim());
-            minlon = Double.parseDouble(tfLatLon[1].getText().trim());
-            maxlat = Double.parseDouble(tfLatLon[2].getText().trim());
-            maxlon = Double.parseDouble(tfLatLon[3].getText().trim());
+            minlat = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[0].getText().trim());
+            minlon = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[1].getText().trim());
+            maxlat = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[2].getText().trim());
+            maxlon = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[3].getText().trim());
         } catch (NumberFormatException e) {
+            Logging.trace(e);
             return null;
         }
         if (!LatLon.isValidLon(minlon) || !LatLon.isValidLon(maxlon)
-                || !LatLon.isValidLat(minlat) || !LatLon.isValidLat(maxlat))
+         || !LatLon.isValidLat(minlat) || !LatLon.isValidLat(maxlat))
             return null;
         if (minlon > maxlon)
@@ -145,7 +148,8 @@
             double value = 0;
             try {
-                value = Double.parseDouble(getComponent().getText());
+                value = JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText());
             } catch (NumberFormatException ex) {
                 feedbackInvalid(tr("The string ''{0}'' is not a valid double value.", getComponent().getText()));
+                Logging.trace(ex);
                 return;
             }
@@ -160,6 +164,7 @@
         public boolean isValid() {
             try {
-                return LatLon.isValidLat(Double.parseDouble(getComponent().getText()));
-            } catch (NumberFormatException ex) {
+                return LatLon.isValidLat(JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText()));
+            } catch (NumberFormatException ex) {
+                Logging.trace(ex);
                 return false;
             }
@@ -181,7 +186,8 @@
             double value = 0;
             try {
-                value = Double.parseDouble(getComponent().getText());
+                value = JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText());
             } catch (NumberFormatException ex) {
                 feedbackInvalid(tr("The string ''{0}'' is not a valid double value.", getComponent().getText()));
+                Logging.trace(ex);
                 return;
             }
@@ -196,6 +202,7 @@
         public boolean isValid() {
             try {
-                return LatLon.isValidLon(Double.parseDouble(getComponent().getText()));
-            } catch (NumberFormatException ex) {
+                return LatLon.isValidLon(JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText()));
+            } catch (NumberFormatException ex) {
+                Logging.trace(ex);
                 return false;
             }
Index: trunk/src/org/openstreetmap/josm/tools/JosmDecimalFormatSymbolsProvider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/JosmDecimalFormatSymbolsProvider.java	(revision 13048)
+++ trunk/src/org/openstreetmap/josm/tools/JosmDecimalFormatSymbolsProvider.java	(revision 13050)
@@ -2,5 +2,7 @@
 package org.openstreetmap.josm.tools;
 
+import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
 import java.text.spi.DecimalFormatSymbolsProvider;
 import java.util.Locale;
@@ -28,3 +30,24 @@
         return I18n.getAvailableTranslations();
     }
+
+    /**
+     * Returns a new {@code double} initialized to the value represented by the specified {@code String},
+     * allowing both dot and comma decimal separators.
+     *
+     * @param  s   the string to be parsed.
+     * @return the {@code double} value represented by the string argument.
+     * @throws NullPointerException  if the string is null
+     * @throws NumberFormatException if the string does not contain a parsable {@code double}.
+     * @see    Double#parseDouble(String)
+     * @since 13050
+     */
+    public static double parseDouble(String s) throws NumberFormatException {
+        String text = s;
+        NumberFormat format = DecimalFormat.getInstance();
+        if (format instanceof DecimalFormat) {
+            char decimalSeparator = ((DecimalFormat) format).getDecimalFormatSymbols().getDecimalSeparator();
+            text = text.replace('.', decimalSeparator).replace(',', decimalSeparator);
+        }
+        return Double.parseDouble(text);
+    }
 }
