Index: trunk/src/org/openstreetmap/josm/actions/CopyAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/actions/CopyAction.java	(revision 4380)
@@ -6,9 +6,4 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.ClipboardOwner;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -21,4 +16,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 public final class CopyAction extends JosmAction {
@@ -31,4 +27,5 @@
     }
 
+    @Override
     public void actionPerformed(ActionEvent e) {
         if(isEmptySelection()) return;
@@ -42,15 +39,8 @@
         StringBuilder idsBuilder = new StringBuilder();
         for (OsmPrimitive p : primitives) {
-            idsBuilder.append(p.getId()+",");
+            idsBuilder.append(p.getId()).append(",");
         }
         String ids = idsBuilder.substring(0, idsBuilder.length() - 1);
-        try {
-            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
-                    new StringSelection(ids.toString()), new ClipboardOwner() {
-                        public void lostOwnership(Clipboard clipboard, Transferable contents) {}
-                    }
-            );
-        }
-        catch (RuntimeException x) {}
+        Utils.copyToClipboard(ids);
 
         Main.pasteBuffer.makeCopy(primitives);
Index: trunk/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java	(revision 4380)
@@ -6,7 +6,4 @@
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Toolkit;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -29,4 +26,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.UrlLabel;
+import org.openstreetmap.josm.tools.Utils;
 
 public class Map_Rectifier_WMSmenuAction extends JosmAction {
@@ -118,5 +116,6 @@
         JTextField tfWmsUrl = new JTextField(30);
 
-        String clip = getClipboardContents();
+        String clip = Utils.getClipboardContent();
+        clip = clip == null ? "" : clip.trim();
         ButtonGroup group = new ButtonGroup();
 
@@ -224,24 +223,4 @@
     }
 
-    /**
-     * Helper function that extracts a String from the Clipboard if available.
-     * Returns an empty String otherwise
-     * @return String Clipboard contents if available
-     */
-    private String getClipboardContents() {
-        String result = "";
-        Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
-
-        if(contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor))
-            return "";
-
-        try {
-            result = (String)contents.getTransferData(DataFlavor.stringFlavor);
-        } catch(Exception ex) {
-            return "";
-        }
-        return result.trim();
-    }
-
     @Override
     protected void updateEnabledState() {
Index: trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 4380)
@@ -6,9 +6,4 @@
 
 import java.awt.Dimension;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.ClipboardOwner;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -27,4 +22,5 @@
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -127,12 +123,5 @@
 
         if(ed.getValue() != 1) return;
-        try {
-            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
-                    new StringSelection(text.toString()), new ClipboardOwner() {
-                        public void lostOwnership(Clipboard clipboard, Transferable contents) {}
-                    }
-            );
-        }
-        catch (RuntimeException x) {}
+        Utils.copyToClipboard(text.toString());
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 4380)
@@ -24,4 +24,5 @@
 import org.openstreetmap.josm.actions.CombineWayAction;
 import org.openstreetmap.josm.actions.CopyAction;
+import org.openstreetmap.josm.actions.CopyCoordinatesAction;
 import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.actions.CreateMultipolygonAction;
@@ -125,4 +126,5 @@
     public final RedoAction redo = new RedoAction();
     public final JosmAction copy = new CopyAction();
+    public final JosmAction copyCoordinates = new CopyCoordinatesAction();
     public final PasteAction paste = new PasteAction();
     public final JosmAction pasteTags = new PasteTagsAction();
@@ -257,4 +259,5 @@
         editMenu.addSeparator();
         add(editMenu, copy);
+        add(editMenu, copyCoordinates);
         add(editMenu, paste);
         add(editMenu, pasteTags);
Index: trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 4380)
@@ -8,9 +8,6 @@
 import java.awt.GridBagLayout;
 import java.awt.Toolkit;
-import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.FlavorEvent;
 import java.awt.datatransfer.FlavorListener;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -19,5 +16,4 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.io.IOException;
 
 import javax.swing.AbstractAction;
@@ -40,4 +36,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -306,23 +303,6 @@
         }
 
-        protected String getClipboardContent() {
-            Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
-            try {
-                if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
-                    String text = (String)t.getTransferData(DataFlavor.stringFlavor);
-                    return text;
-                }
-            } catch (UnsupportedFlavorException ex) {
-                ex.printStackTrace();
-                return null;
-            } catch (IOException ex) {
-                ex.printStackTrace();
-                return null;
-            }
-            return null;
-        }
-
         public void actionPerformed(ActionEvent e) {
-            String content = getClipboardContent();
+            String content = Utils.getClipboardContent();
             if (content != null) {
                 tfOsmUrl.setText(content);
@@ -331,5 +311,5 @@
 
         protected void updateEnabledState() {
-            setEnabled(getClipboardContent() != null);
+            setEnabled(Utils.getClipboardContent() != null);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 4380)
@@ -13,7 +13,4 @@
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Toolkit;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
 import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
@@ -44,4 +41,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
 
@@ -183,5 +181,12 @@
         getRootPane().getActionMap().put("checkClipboardContents", new AbstractAction() {
             public void actionPerformed(ActionEvent e) {
-                checkClipboardContents();
+                String clip = Utils.getClipboardContent();
+                if (clip == null) {
+                    return;
+                }
+                Bounds b = OsmUrlToBounds.parse(clip);
+                if (b != null) {
+                    boundingBoxChanged(new Bounds(b), null);
+                }
             }
         });
@@ -189,24 +194,4 @@
         addWindowListener(new WindowEventHandler());
         restoreSettings();
-    }
-
-    private void checkClipboardContents() {
-        String result = "";
-        Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
-
-        if(contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor))
-            return;
-
-        try {
-            result = (String)contents.getTransferData(DataFlavor.stringFlavor);
-        }
-        catch(Exception ex) {
-            return;
-        }
-
-        Bounds b = OsmUrlToBounds.parse(result);
-        if (b != null) {
-            boundingBoxChanged(new Bounds(b),null);
-        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java	(revision 4380)
@@ -9,12 +9,8 @@
 import java.awt.Insets;
 import java.awt.Toolkit;
-import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.FlavorEvent;
 import java.awt.datatransfer.FlavorListener;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
 import java.awt.event.ActionEvent;
 import java.awt.event.MouseEvent;
-import java.io.IOException;
 
 import javax.swing.AbstractAction;
@@ -35,4 +31,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -237,23 +234,6 @@
         }
 
-        protected String getClipboardContent() {
-            Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
-            try {
-                if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
-                    String text = (String)t.getTransferData(DataFlavor.stringFlavor);
-                    return text;
-                }
-            } catch (UnsupportedFlavorException ex) {
-                ex.printStackTrace();
-                return null;
-            } catch (IOException ex) {
-                ex.printStackTrace();
-                return null;
-            }
-            return null;
-        }
-
         public void actionPerformed(ActionEvent e) {
-            String content = getClipboardContent();
+            String content = Utils.getClipboardContent();
             if (content != null) {
                 tfOsmUrl.setText(content);
@@ -262,5 +242,5 @@
 
         protected void updateEnabledState() {
-            setEnabled(getClipboardContent() != null);
+            setEnabled(Utils.getClipboardContent() != null);
         }
 
Index: trunk/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java	(revision 4380)
@@ -6,9 +6,4 @@
 import java.awt.Component;
 import java.awt.GridBagLayout;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.ClipboardOwner;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -127,11 +122,7 @@
                             "below at this URL:")), GBC.eol());
                     p.add(new UrlLabel("http://josm.openstreetmap.de/newticket"), GBC.eop().insets(8,0,0,0));
-                    try {
-                        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), new ClipboardOwner(){
-                            public void lostOwnership(Clipboard clipboard, Transferable contents) {}
-                        });
+                    if (Utils.copyToClipboard(text)) {
                         p.add(new JLabel(tr("(The text has already been copied to your clipboard.)")), GBC.eop());
                     }
-                    catch (RuntimeException x) {}
 
                     JTextArea info = new JTextArea(text, 20, 60);
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 4379)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 4380)
@@ -3,4 +3,11 @@
 
 import java.awt.Color;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
 import java.io.File;
 import java.io.IOException;
@@ -264,3 +271,44 @@
         return Math.abs(a - b) <= EPSILION;
     }
+
+    /**
+     * Copies the string {@code s} to system clipboard.
+     * @param s string to be copied to clipboard.
+     * @return true if succeeded, false otherwise.
+     */
+    public static boolean copyToClipboard(String s) {
+        try {
+            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(s), new ClipboardOwner() {
+
+                @Override
+                public void lostOwnership(Clipboard clpbrd, Transferable t) {
+                }
+            });
+            return true;
+        } catch (IllegalStateException ex) {
+            ex.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * Extracts clipboard content as string.
+     * @return string clipboard contents if available, {@code null} otherwise.
+     */
+    public static String getClipboardContent() {
+        Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
+        try {
+            if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+                String text = (String) t.getTransferData(DataFlavor.stringFlavor);
+                return text;
+            }
+        } catch (UnsupportedFlavorException ex) {
+            ex.printStackTrace();
+            return null;
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            return null;
+        }
+        return null;
+    }
 }
