diff --git a/src/org/openstreetmap/josm/actions/CopyAction.java b/src/org/openstreetmap/josm/actions/CopyAction.java
index 9cb0960..90190f5 100644
--- a/src/org/openstreetmap/josm/actions/CopyAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyAction.java
@@ -5,11 +5,6 @@ package org.openstreetmap.josm.actions;
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 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;
 import java.util.Collection;
@@ -20,6 +15,7 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 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 {
 
@@ -30,6 +26,7 @@ public final class CopyAction extends JosmAction {
         putValue("help", ht("/Action/Copy"));
     }
 
+    @Override
     public void actionPerformed(ActionEvent e) {
         if(isEmptySelection()) return;
         Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
@@ -41,17 +38,10 @@ public final class CopyAction extends JosmAction {
         /* copy ids to the clipboard */
         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);
         Main.pasteSource = source;
diff --git a/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java b/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java
index d4a308b..c964d2d 100644
--- a/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java
+++ b/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java
@@ -5,9 +5,6 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 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;
 import java.util.ArrayList;
@@ -28,6 +25,7 @@ import org.openstreetmap.josm.gui.layer.WMSLayer;
 import org.openstreetmap.josm.tools.GBC;
 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 {
     /**
@@ -117,7 +115,8 @@ public class Map_Rectifier_WMSmenuAction extends JosmAction {
 
         JTextField tfWmsUrl = new JTextField(30);
 
-        String clip = getClipboardContents();
+        String clip = Utils.getClipboardContent();
+        clip = clip == null ? "" : clip.trim();
         ButtonGroup group = new ButtonGroup();
 
         JRadioButton firstBtn = null;
@@ -223,26 +222,6 @@ public class Map_Rectifier_WMSmenuAction extends JosmAction {
         Main.main.addLayer(new WMSLayer(new ImageryInfo(title, url)));
     }
 
-    /**
-     * 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() {
         setEnabled(Main.map != null && Main.map.mapView != null && !Main.map.mapView.getAllLayers().isEmpty());
diff --git a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
index cf80ac6..50b3b60 100644
--- a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
+++ b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
@@ -5,11 +5,6 @@ import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 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;
 import java.io.BufferedReader;
@@ -26,6 +21,7 @@ import org.openstreetmap.josm.data.osm.DatasetConsistencyTest;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * @author xeen
@@ -126,13 +122,6 @@ public final class ShowStatusReportAction extends JosmAction {
         ed.showDialog();
 
         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());
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index b8b5cf5..311f8d3 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -23,6 +23,7 @@ import org.openstreetmap.josm.actions.ChangesetManagerToggleAction;
 import org.openstreetmap.josm.actions.CloseChangesetAction;
 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;
 import org.openstreetmap.josm.actions.DeleteAction;
@@ -124,6 +125,7 @@ public class MainMenu extends JMenuBar {
     public final UndoAction undo = new UndoAction();
     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();
     public final JosmAction duplicate = new DuplicateAction();
@@ -256,6 +258,7 @@ public class MainMenu extends JMenuBar {
         add(editMenu, redo);
         editMenu.addSeparator();
         add(editMenu, copy);
+        add(editMenu, copyCoordinates);
         add(editMenu, paste);
         add(editMenu, pasteTags);
         add(editMenu, duplicate);
diff --git a/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java b/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
index bc3d7a0..e3c14be 100644
--- a/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
+++ b/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
@@ -7,18 +7,14 @@ import java.awt.Color;
 import java.awt.Dimension;
 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;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.io.IOException;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
@@ -39,6 +35,7 @@ import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Bounding box selector.
@@ -305,32 +302,15 @@ public class BoundingBoxSelection implements DownloadSelection {
             Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(this);
         }
 
-        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);
             }
         }
 
         protected void updateEnabledState() {
-            setEnabled(getClipboardContent() != null);
+            setEnabled(Utils.getClipboardContent() != null);
         }
 
         public void flavorsChanged(FlavorEvent e) {
diff --git a/src/org/openstreetmap/josm/gui/download/DownloadDialog.java b/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
index a7b4264..3b29fbb 100644
--- a/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
+++ b/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
@@ -12,9 +12,6 @@ import java.awt.FlowLayout;
 import java.awt.Font;
 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;
 import java.awt.event.KeyEvent;
@@ -43,6 +40,7 @@ import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
 
 /**
@@ -182,7 +180,14 @@ public class DownloadDialog extends JDialog  {
 
         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);
+                }
             }
         });
         HelpUtil.setHelpContext(getRootPane(), ht("/Dialog/Download"));
@@ -190,26 +195,6 @@ public class DownloadDialog extends JDialog  {
         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);
-        }
-    }
-
     private void updateSizeCheck() {
         if (currentBounds == null) {
             sizeCheck.setText(tr("No area selected yet"));
diff --git a/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java b/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java
index 375b8e0..7ff4706 100644
--- a/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java
@@ -8,14 +8,10 @@ import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 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;
 import javax.swing.BorderFactory;
@@ -34,6 +30,7 @@ import org.openstreetmap.josm.gui.JMultilineLabel;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  *
@@ -236,32 +233,15 @@ public class BoundingBoxSelectionPanel extends JPanel {
             Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(this);
         }
 
-        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);
             }
         }
 
         protected void updateEnabledState() {
-            setEnabled(getClipboardContent() != null);
+            setEnabled(Utils.getClipboardContent() != null);
         }
 
         public void flavorsChanged(FlavorEvent e) {
diff --git a/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java b/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java
index a088e96..d6b3338 100644
--- a/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java
+++ b/src/org/openstreetmap/josm/tools/BugReportExceptionHandler.java
@@ -5,11 +5,6 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 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;
 import java.net.URL;
@@ -126,13 +121,9 @@ public final class BugReportExceptionHandler implements Thread.UncaughtException
                             tr("Alternatively, if that does not work you can manually fill in the information " +
                             "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);
                     info.setCaretPosition(0);
diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
index ffabb45..20f07ce 100644
--- a/src/org/openstreetmap/josm/tools/Utils.java
+++ b/src/org/openstreetmap/josm/tools/Utils.java
@@ -2,6 +2,13 @@
 package org.openstreetmap.josm.tools;
 
 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;
 import java.io.InputStream;
@@ -263,4 +270,45 @@ public class Utils {
     public static boolean equalsEpsilon(double a, double b) {
         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;
+    }
 }
