Index: trunk/presets/presets.xml
===================================================================
--- trunk/presets/presets.xml	(revision 1244)
+++ trunk/presets/presets.xml	(revision 1245)
@@ -135,4 +135,5 @@
         </item>
         <item name="Secondary" icon="presets/way_secondary.png">
+            <link href="http://wiki.openstreetmap.org/wiki/Tag:highway=secondary"/>
             <label text="Edit a Secondary Road" />
             <space />
Index: trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/actions/CreateCircleAction.java	(revision 1245)
@@ -70,5 +70,5 @@
 
     public void actionPerformed(ActionEvent e) {
-        int numberOfNodesInCircle = Integer.parseInt(Main.pref.get("createcircle.nodecount", "8"));
+        int numberOfNodesInCircle = Main.pref.getInteger("createcircle.nodecount", 8);
         if (numberOfNodesInCircle < 1) {
             numberOfNodesInCircle = 1;
Index: trunk/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/actions/audio/AudioBackAction.java	(revision 1245)
@@ -15,10 +15,7 @@
 public class AudioBackAction extends JosmAction {
 
-    private double amount; // note, normally negative, i.e. jump backwards in time
-
     public AudioBackAction() {
         super(tr("Back"), "audio-back", tr("Jump back."),
         Shortcut.registerShortcut("audio:back", tr("Audio: {0}", tr("Back")), KeyEvent.VK_F6, Shortcut.GROUP_DIRECT), true);
-        amount = -Main.pref.getDouble("audio.forwardbackamount","10.0");
         this.putValue("help", "Action/Back");
     }
@@ -27,5 +24,6 @@
         try {
             if (AudioPlayer.playing() || AudioPlayer.paused())
-                AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position() + amount);
+                AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position()
+                - Main.pref.getDouble("audio.forwardbackamount","10.0"));
             else
                 MarkerLayer.playAudio();
Index: trunk/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/actions/audio/AudioFastSlowAction.java	(revision 1245)
@@ -15,9 +15,5 @@
     public AudioFastSlowAction(String name, String iconName, String tooltip, Shortcut shortcut, boolean fast) {
         super(name, iconName, tooltip, shortcut, true);
-        try {
-            multiplier = Double.parseDouble(Main.pref.get("audio.fastfwdmultiplier","1.3"));
-        } catch (NumberFormatException e) {
-            multiplier = 1.3;
-        }
+        multiplier = Main.pref.getDouble("audio.fastfwdmultiplier","1.3");
         if (! fast)
             multiplier = 1.0 / multiplier;
Index: trunk/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/actions/audio/AudioFwdAction.java	(revision 1245)
@@ -14,11 +14,7 @@
 
 public class AudioFwdAction extends JosmAction {
-
-    private double amount;
-
     public AudioFwdAction() {
         super(tr("Forward"), "audio-fwd", tr("Jump forward"),
         Shortcut.registerShortcut("audio:forward", tr("Audio: {0}", tr("Forward")), KeyEvent.VK_F7, Shortcut.GROUP_DIRECT), true);
-        amount = Main.pref.getDouble("audio.forwardbackamount","10.0");
     }
 
@@ -26,5 +22,6 @@
         try {
             if (AudioPlayer.playing() || AudioPlayer.paused())
-                AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position() + amount);
+                AudioPlayer.play(AudioPlayer.url(), AudioPlayer.position()
+                + Main.pref.getDouble("audio.forwardbackamount","10.0"));
             else
                 MarkerLayer.playAudio();
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 1245)
@@ -536,6 +536,6 @@
                     B.north() + q * (A.north() - B.north()));
 
-            int snapToIntersectionThreshold=0;
-            try { snapToIntersectionThreshold = Integer.parseInt(Main.pref.get("edit.snap-intersection-threshold","10")); } catch (NumberFormatException x) {}
+            int snapToIntersectionThreshold
+            = Main.pref.getInteger("edit.snap-intersection-threshold",10);
 
             // only adjust to intersection if within snapToIntersectionThreshold pixel of mouse click; otherwise
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 1245)
@@ -73,5 +73,5 @@
      * counts as a move, in milliseconds
      */
-    private int initialMoveDelay = 200;
+    private int initialMoveDelay;
 
     /**
@@ -79,5 +79,5 @@
      * counts as a move, in pixels
      */
-    private int initialMoveThreshold = 15;
+    private int initialMoveThreshold;
     private boolean initialMoveThresholdExceeded = false;
     /**
@@ -92,7 +92,6 @@
         putValue("help", "Action/Move/Move");
         selectionManager = new SelectionManager(this, false, mapFrame.mapView);
-        try { initialMoveDelay = Integer.parseInt(Main.pref.get("edit.initial-move-delay","200")); } catch (NumberFormatException x) {}
-        try { initialMoveThreshold = Integer.parseInt(Main.pref.get("edit.initial-move-threshold","5")); } catch (NumberFormatException x) {}
-
+        initialMoveDelay = Main.pref.getInteger("edit.initial-move-delay",200);
+        initialMoveThreshold = Main.pref.getInteger("edit.initial-move-threshold",5);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 1245)
@@ -433,9 +433,7 @@
         putDefault(key, def);
         String v = get(key);
-        try {
-            return Double.parseDouble(v == null ? def : v);
-        } catch(NumberFormatException e) {
-            // fall out
-        }
+        if(v != null && v.length() != 0)
+            try { return Double.parseDouble(v); } catch(NumberFormatException e) {}
+        try { return Double.parseDouble(def); } catch(NumberFormatException e) {}
         return 0.0;
     }
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 1245)
@@ -138,7 +138,7 @@
 
         try {
-            tabpane.setSelectedIndex(Integer.parseInt(Main.pref.get("download.tab", "0")));
+            tabpane.setSelectedIndex(Main.pref.getInteger("download.tab", 0));
         } catch (Exception ex) {
-            Main.pref.put("download.tab", "0");
+            Main.pref.putInteger("download.tab", 0);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 1245)
@@ -378,10 +378,6 @@
         boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force");                     // also draw lines between points belonging to different segments
         boolean direction = Main.pref.getBoolean("draw.rawgps.direction");                        // draw direction arrows on the lines
-        int maxLineLength = -1;
-        try {
-            maxLineLength = Integer.parseInt(Main.pref.get("draw.rawgps.max-line-length", "-1"));   // don't draw lines if longer than x meters
-        } catch (java.lang.NumberFormatException e) {
-            Main.pref.put("draw.rawgps.max-line-length", "-1");
-        }
+        int maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", -1);
+        // don't draw lines if longer than x meters
         boolean lines = Main.pref.getBoolean("draw.rawgps.lines");                                // draw line between points, global setting
         String linesKey = "draw.rawgps.lines.layer "+name;
@@ -391,10 +387,6 @@
         boolean colored = Main.pref.getBoolean("draw.rawgps.colors");                             // color the lines
         boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection");      // paint direction arrow with alternate math. may be faster
-        int delta = 0;
-        try {
-            delta = Integer.parseInt(Main.pref.get("draw.rawgps.min-arrow-distance", "0"));         // don't draw arrows nearer to each other than this
-        } catch (java.lang.NumberFormatException e) {
-            Main.pref.put("draw.rawgps.min-arrow-distance", "0");
-        }
+        int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", 0);
+        // don't draw arrows nearer to each other than this
 
         /****************************************************************
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java	(revision 1245)
@@ -46,5 +46,5 @@
     private boolean enabled;
     private boolean wasPlaying = false;
-    private int dropTolerance = 50; /* pixels */
+    private int dropTolerance; /* pixels */
 
     public static PlayHeadMarker create() {
@@ -65,6 +65,5 @@
         enabled = Main.pref.getBoolean("marker.traceaudio", true);
         if (! enabled) return;
-        try { dropTolerance = Integer.parseInt(Main.pref.get("marker.playHeadDropTolerance", "50")); }
-        catch(NumberFormatException x) { dropTolerance = 50; }
+        dropTolerance = Main.pref.getInteger("marker.playHeadDropTolerance", 50);
         Main.map.mapView.addMouseListener(new MouseAdapter() {
             @Override public void mousePressed(MouseEvent ev) {
@@ -87,5 +86,6 @@
     @Override public boolean containsPoint(Point p) {
         Point screen = Main.map.mapView.getPoint(eastNorth);
-        Rectangle r = new Rectangle(screen.x, screen.y, symbol.getIconWidth(), symbol.getIconHeight());
+        Rectangle r = new Rectangle(screen.x, screen.y, symbol.getIconWidth(),
+        symbol.getIconHeight());
         return r.contains(p);
     }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java	(revision 1245)
@@ -145,5 +145,5 @@
         gui.audio.add(audioFastForwardMultiplier, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
 
-        audioLeadIn.setText(Main.pref.get("audio.leadin", "1"));
+        audioLeadIn.setText(Main.pref.get("audio.leadin", "1.0"));
         audioLeadIn.setToolTipText(tr("Playback starts this number of seconds before (or after, if negative) the audio track position requested"));
         gui.audio.add(new JLabel(tr("Lead-in time (seconds)")), GBC.std());
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 1245)
@@ -8,4 +8,5 @@
 import java.awt.Image;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
@@ -24,4 +25,5 @@
 import javax.swing.Action;
 import javax.swing.ImageIcon;
+import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
@@ -43,4 +45,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.OpenBrowser;
 import org.openstreetmap.josm.tools.XmlObjectParser;
 import org.xml.sax.SAXException;
@@ -179,5 +182,5 @@
         public String text;
         public String locale_text;
-        public boolean default_ = false; // not used!
+        public boolean default_ = false; // only used for tagless objects
         public boolean use_last_as_default = false;
 
@@ -196,4 +199,10 @@
             for (String s : usage.values) oneValue = s;
             if (usage.values.size() < 2 && (oneValue == null || OsmUtils.trueval.equals(oneValue) || OsmUtils.falseval.equals(oneValue))) {
+                if(default_)
+                {
+                    for (OsmPrimitive s : sel)
+                        if(s.keys != null && s.keys.size() > 0) default_ = false;
+                }
+
                 // all selected objects share the same value which is either true or false or unset,
                 // we can display a standard check box.
@@ -202,5 +211,6 @@
                             OsmUtils.falseval.equals(oneValue) ?
                             QuadStateCheckBox.State.NOT_SELECTED :
-                            QuadStateCheckBox.State.UNSET;
+                            default_ ? QuadStateCheckBox.State.SELECTED
+                            : QuadStateCheckBox.State.UNSET;
                 check = new QuadStateCheckBox(locale_text, initialState,
                         new QuadStateCheckBox.State[] {
@@ -357,4 +367,23 @@
     }
 
+    public static class Link extends Item {
+        public String href;
+        public String text;
+        public String locale_text;
+
+        @Override public void addToPanel(JPanel p, Collection<OsmPrimitive> sel) {
+            if(locale_text == null)
+                locale_text = text == null ? tr("Open map features in browser") : tr(text);
+            JButton b = new JButton(locale_text);
+            b.addActionListener(new ActionListener(){
+                public void actionPerformed(ActionEvent e) {
+                    OpenBrowser.displayUrl(href);
+                }
+            });
+            p.add(b, GBC.eol().anchor(GBC.EAST));
+        }
+        @Override public void addCommands(Collection<OsmPrimitive> sel, List<Command> cmds) {}
+    }
+
     public static class Optional extends Item {
         // TODO: Draw a box around optional stuff
@@ -458,4 +487,5 @@
         parser.mapBoth("group", TaggingPresetMenu.class);
         parser.map("text", Text.class);
+        parser.map("link", Link.class);
         parser.mapOnStart("optional", Optional.class);
         parser.map("check", Check.class);
Index: trunk/src/org/openstreetmap/josm/tools/AudioPlayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/AudioPlayer.java	(revision 1244)
+++ trunk/src/org/openstreetmap/josm/tools/AudioPlayer.java	(revision 1245)
@@ -197,14 +197,6 @@
         command = new Execute();
         playingUrl = null;
-        try {
-            leadIn = Double.parseDouble(Main.pref.get("audio.leadin", "1.0" /* default, seconds */));
-        } catch (NumberFormatException e) {
-            leadIn = 1.0; // failed to parse
-        }
-        try {
-            calibration = Double.parseDouble(Main.pref.get("audio.calibration", "1.0" /* default, ratio */));
-        } catch (NumberFormatException e) {
-            calibration = 1.0; // failed to parse
-        }
+        leadIn = Main.pref.getDouble("audio.leadin", "1.0" /* default, seconds */);
+        calibration = Main.pref.getDouble("audio.calibration", "1.0" /* default, ratio */);
         start();
         while (state == State.INITIALIZING) { yield(); }
