diff --git a/src/org/openstreetmap/josm/actions/CopyTagsAction.java b/src/org/openstreetmap/josm/actions/CopyTagsAction.java
new file mode 100644
index 0000000..ef7231d
--- /dev/null
+++ b/src/org/openstreetmap/josm/actions/CopyTagsAction.java
@@ -0,0 +1,91 @@
+// License: GPL. For details, see LICENSE file.
+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.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Collection;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * Copy OSM primitives to clipboard in order to paste them, or their tags, somewhere else.
+ * @since 404
+ */
+public final class CopyTagsAction extends JosmAction {
+
+    /**
+     * Constructs a new {@code CopyTagsAction}.
+     */
+    public CopyTagsAction() {
+        super(tr("Copy Tags"), "copy",
+                tr("Copy all tags of selected objects to paste buffer."),
+                createShortcut(), true);
+        putValue("help", ht("/Action/CopyTags"));
+    }
+
+    public static Shortcut createShortcut() {
+        return Shortcut.registerShortcut("system:copytags", tr("Edit: {0}", tr("Copy Tags")), KeyEvent.VK_T, Shortcut.CTRL_SHIFT);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        if (isEmptySelection()) return;
+        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        copy(getEditLayer(), selection);
+    }
+
+    /**
+     * Copies the tags of object to the clipboard. The output by this function
+     * looks similar to: key=value\nkey=value
+     * @param source The OSM data layer source
+     * @param primitives The OSM primitives to copy
+     */
+    public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
+        Set<String> values = new TreeSet<>();
+        for (OsmPrimitive p : primitives) {
+            Collection<String> s = p.getTagsAsString();
+            if (s != null) values.addAll(s);
+        }
+        if (!values.isEmpty()) Utils.copyToClipboard(Utils.join("\n", values));
+    }
+
+    @Override
+    protected void updateEnabledState() {
+        if (getCurrentDataSet() == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(getCurrentDataSet().getSelected());
+        }
+    }
+
+    @Override
+    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
+        setEnabled(selection != null && !selection.isEmpty());
+    }
+
+    private static boolean isEmptySelection() {
+        Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+        if (sel.isEmpty()) {
+            JOptionPane.showMessageDialog(
+                    Main.parent,
+                    tr("Please select something to copy."),
+                    tr("Information"),
+                    JOptionPane.INFORMATION_MESSAGE
+            );
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/HelpAction.java b/src/org/openstreetmap/josm/actions/HelpAction.java
index 7874504..f936f25 100644
--- a/src/org/openstreetmap/josm/actions/HelpAction.java
+++ b/src/org/openstreetmap/josm/actions/HelpAction.java
@@ -31,11 +31,15 @@ public class HelpAction extends JosmAction {
 
     private HelpAction(boolean shortcut) {
         super(tr("Help"), "help", null,
-                shortcut ? Shortcut.registerShortcut("system:help", tr("Help"), KeyEvent.VK_F1, Shortcut.DIRECT) : null,
+                shortcut ? createShortcut() : null,
                 true);
         setEnabled(!Main.isOffline(OnlineResource.JOSM_WEBSITE));
     }
 
+    public static Shortcut createShortcut() {
+        return Shortcut.registerShortcut("system:help", tr("Help"), KeyEvent.VK_F1, Shortcut.DIRECT);
+    }
+
     /**
      * Constructs a new {@code HelpAction} without assigning a shortcut.
      * @return a new {@code HelpAction}
diff --git a/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java b/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
index 090fbd6..d855daa 100644
--- a/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
@@ -10,6 +10,8 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
@@ -18,6 +20,7 @@ import java.util.concurrent.atomic.AtomicLong;
 
 import org.openstreetmap.josm.tools.LanguageInfo;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.data.osm.Tag;
 
 /**
 * Abstract class to represent common features of the datatypes primitives.
@@ -746,6 +749,22 @@ public abstract class AbstractPrimitive implements IPrimitive {
         return result;
     }
 
+    public Collection<Tag> getTags() {
+        List<Tag> tags = new LinkedList<>();
+        for (Entry<String, String> kv : getKeys().entrySet()) {
+            tags.add(new Tag(kv.getKey(), kv.getValue()));
+        }
+        return tags;
+    }
+
+    public Collection<String> getTagsAsString() {
+        List<String> tagStrings = new LinkedList<>();
+        for (Tag tag : getTags()) {
+            tagStrings.add(tag.toString());
+        }
+        return tagStrings;
+    }
+
     /**
      * Replies true, if the map of key/value pairs of this primitive is not empty.
      *
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index 40ec6d0..aa7eadd 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -34,6 +34,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.CopyTagsAction;
 import org.openstreetmap.josm.actions.CopyCoordinatesAction;
 import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.actions.CreateMultipolygonAction;
@@ -188,6 +189,8 @@ public class MainMenu extends JMenuBar {
     public final RedoAction redo = new RedoAction();
     /** Edit / Copy */
     public final CopyAction copy = new CopyAction();
+    /** Edit / Copy Tags */
+    public final JosmAction copyTags = new CopyTagsAction();
     /** Edit / Copy Coordinates */
     public final JosmAction copyCoordinates = new CopyCoordinatesAction();
     /** Edit / Paste */
@@ -669,6 +672,7 @@ public class MainMenu extends JMenuBar {
         Main.main.undoRedo.addCommandQueueListener(redo);
         editMenu.addSeparator();
         add(editMenu, copy);
+        add(editMenu, copyTags, true);
         add(editMenu, copyCoordinates, true);
         add(editMenu, paste);
         add(editMenu, pasteTags);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
index 0ea557b..212ba1d 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
@@ -285,7 +285,7 @@ public class LayerListDialog extends ToggleDialog {
             }
         });
 
-        // Show/Activate layer on Enter key press
+        // Show/Activate layer on Space key press
         InputMapUtils.addSpacebarAction(layerList, showHideLayerAction);
 
         createLayout(layerList, true, Arrays.asList(
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
index efcf1ec..2b334a1 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
@@ -52,6 +52,8 @@ import javax.swing.table.TableModel;
 import javax.swing.table.TableRowSorter;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.CopyTagsAction;
+import org.openstreetmap.josm.actions.HelpAction;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.relation.DownloadMembersAction;
 import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction;
@@ -1122,9 +1124,10 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
 
     class HelpAction extends AbstractAction {
         HelpAction() {
-            putValue(NAME, tr("Go to OSM wiki for tag help (F1)"));
+            putValue(NAME, tr("Go to OSM wiki for tag help"));
             putValue(SHORT_DESCRIPTION, tr("Launch browser with wiki help for selected object"));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
+            org.openstreetmap.josm.actions.HelpAction.createShortcut().setAccelerator(this);
         }
 
         @Override
@@ -1328,15 +1331,12 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
         CopyAllKeyValueAction() {
             putValue(NAME, tr("Copy all Keys/Values"));
             putValue(SHORT_DESCRIPTION, tr("Copy the key and value of all the tags to clipboard"));
+            CopyTagsAction.createShortcut().setAccelerator(this);
         }
 
         @Override
         protected Collection<String> getString(OsmPrimitive p, String key) {
-            List<String> r = new LinkedList<>();
-            for (Entry<String, String> kv : p.getKeys().entrySet()) {
-                r.add(new Tag(kv.getKey(), kv.getValue()).toString());
-            }
-            return r;
+            return p.getTagsAsString();
         }
     }
 
