Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 15315)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 15316)
@@ -11,11 +11,12 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import javax.swing.AbstractAction;
@@ -281,24 +282,22 @@
         if (args.containsKey("addtags")) {
             GuiHelper.executeByMainWorkerInEDT(() -> {
-                Set<String> tagSet = new LinkedHashSet<>(); // preserve order, see #15704
-                for (String tag1 : args.get("addtags").split("\\|")) {
-                    if (!tag1.trim().isEmpty() && tag1.contains("=")) {
-                        tagSet.add(tag1.trim());
-                    }
-                }
-                if (!tagSet.isEmpty()) {
-                    String[][] keyValue = new String[tagSet.size()][2];
-                    int i = 0;
-                    for (String tag2 : tagSet) {
-                        // support a  =   b===c as "a"="b===c"
-                        String[] pair = tag2.split("\\s*=\\s*", 2);
-                        keyValue[i][0] = pair[0];
-                        keyValue[i][1] = pair.length < 2 ? "" : pair[1];
-                        i++;
-                    }
-                    addTags(keyValue, sender, primitives);
-                }
+                addTags(parseUrlTagsToKeyValues(args.get("addtags")), sender, primitives);
             });
         }
+    }
+
+    /**
+     * Convert a argument from a url to a series of tags
+     * @param urlSection A url section that looks like {@code tag1=value1|tag2=value2}
+     * @return An 2d array in the format of {@code [key][value]}
+     * @since 15316
+     */
+    public static String[][] parseUrlTagsToKeyValues(String urlSection) {
+        return Arrays.stream(urlSection.split("\\|"))
+                .map(String::trim)
+                .filter(tag -> !tag.isEmpty() && tag.contains("="))
+                .map(tag -> tag.split("\\s*=\\s*", 2))
+                .map(pair -> {pair[1] = pair.length < 2 ? "" : pair[1]; return pair;})
+                .collect(Collectors.toList()).toArray(new String[][] {});
     }
 
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 15315)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 15316)
@@ -225,4 +225,16 @@
         }
 
+        // This comes before the other changeset tags, so that they can be overridden
+        if (args.containsKey("changeset_tags")) {
+            MainApplication.worker.submit(() -> {
+                DataSet ds = MainApplication.getLayerManager().getEditDataSet();
+                if (ds != null) {
+                    for (String[] key : AddTagsDialog.parseUrlTagsToKeyValues(args.get("changeset_tags"))) {
+                        ds.addChangeSetTag(key[0], key[1]);
+                    }
+                }
+            });
+        }
+
         // add changeset tags after download if necessary
         if (args.containsKey("changeset_comment") || args.containsKey("changeset_source") || args.containsKey("changeset_hashtags")) {
