Index: trunk/src/org/openstreetmap/josm/actions/RestorePropertyAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/RestorePropertyAction.java	(revision 16593)
+++ trunk/src/org/openstreetmap/josm/actions/RestorePropertyAction.java	(revision 16593)
@@ -0,0 +1,61 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.function.IntFunction;
+import java.util.function.Supplier;
+
+import javax.swing.AbstractAction;
+import javax.swing.ListSelectionModel;
+
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.data.UndoRedoHandler;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.util.TableHelper;
+
+/**
+ * Obtains the selected key and values from a table and restores those properties on the specified primitive.
+ *
+ * @since 16593
+ */
+public class RestorePropertyAction extends AbstractAction {
+
+    private final IntFunction<String> keyFn;
+    private final IntFunction<String> valueFn;
+    private final Supplier<OsmPrimitive> objectSp;
+    private final ListSelectionModel selectionModel;
+
+    /**
+     * Constructs a new {@code RestorePropertyAction}.
+     *
+     * @param keyFn          a function which returns the selected key for a given row index
+     * @param valueFn        a function which returns the selected value for a given row index
+     * @param objectSp       a supplier which returns the selected tagged object
+     * @param selectionModel selection model
+     */
+    public RestorePropertyAction(IntFunction<String> keyFn, IntFunction<String> valueFn,
+                                 Supplier<OsmPrimitive> objectSp, ListSelectionModel selectionModel) {
+        super(tr("Restore selected tags"));
+        this.keyFn = keyFn;
+        this.valueFn = valueFn;
+        this.objectSp = objectSp;
+        this.selectionModel = selectionModel;
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        OsmPrimitive primitive = objectSp.get();
+        if (primitive == null) return;
+
+        HashMap<String, String> changes = new HashMap<>();
+        for (int index : TableHelper.getSelectedIndices(selectionModel)) {
+            changes.put(keyFn.apply(index), valueFn.apply(index));
+        }
+        ChangePropertyCommand command = new ChangePropertyCommand(Collections.singleton(primitive), changes);
+        UndoRedoHandler.getInstance().add(command);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 16592)
+++ trunk/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java	(revision 16593)
@@ -16,5 +16,10 @@
 import javax.swing.ListSelectionModel;
 
+import org.openstreetmap.josm.actions.RestorePropertyAction;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.Tagged;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.properties.CopyAllKeyValueAction;
 import org.openstreetmap.josm.gui.dialogs.properties.CopyKeyValueAction;
@@ -72,12 +77,18 @@
 
         IntFunction<String> tagKeyFn = x -> (String) table.getValueAt(x, 0);
+        IntFunction<String> tagValueFn = x -> tagTableModel.getValue(tagKeyFn.apply(x));
         IntFunction<Map<String, Integer>> tagValuesFn = x -> {
-            String key = tagTableModel.getValue((String) table.getValueAt(x, 0));
-            if (key != null) {
-                return Collections.singletonMap(key, 1);
-            }
-            return Collections.emptyMap();
+            String value = tagValueFn.apply(x);
+            return value != null ? Collections.singletonMap(value, 1) : Collections.emptyMap();
         };
         Supplier<Collection<? extends Tagged>> objectSp = () -> Collections.singletonList(model.getPointInTime(pointInTime));
+        Supplier<OsmPrimitive> primitiveSupplier = () -> {
+            DataSet dataSet = MainApplication.getLayerManager().getEditDataSet();
+            PrimitiveId primitiveId = model.getPointInTime(pointInTime);
+            if (dataSet == null || primitiveId == null) {
+                return null;
+            }
+            return dataSet.getPrimitiveById(primitiveId.getUniqueId(), primitiveId.getType());
+        };
 
         tagMenu.add(trackJosmAction(new CopyValueAction(table, tagKeyFn, objectSp)));
@@ -86,4 +97,5 @@
         tagMenu.addPopupMenuListener(copyKeyValueAction);
         tagMenu.add(trackJosmAction(new CopyAllKeyValueAction(table, tagKeyFn, objectSp)));
+        tagMenu.add(new RestorePropertyAction(tagKeyFn, tagValueFn, primitiveSupplier, table.getSelectionModel()));
         tagMenu.addSeparator();
         tagMenu.add(trackJosmAction(new HelpTagAction(table, tagKeyFn, tagValuesFn)));
