Index: src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(revision 15314)
+++ src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java	(working copy)
@@ -10,13 +10,14 @@
 import java.awt.event.ActionEvent;
 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;
 import javax.swing.JCheckBox;
@@ -280,29 +281,39 @@
     public static void addTags(final Map<String, String> args, final String sender, final Collection<? extends OsmPrimitive> primitives) {
         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 xxx
+     */
+    public static String[][] parseUrlTagsToKeyValues(String urlSection) {
+        Set<String> tagSet = Arrays.stream(urlSection.split("\\n"))
+                .map(String::trim)
+                .filter(tag -> !tag.isEmpty() && tag.contains("="))
+                .collect(Collectors.toSet());
+
+        String[][] keyValue = new String[][] {};
+        if (!tagSet.isEmpty()) {
+            keyValue = new String[tagSet.size()][2];
+            int i = 0;
+            for (String tag : tagSet) {
+                // support a  =   b===c as "a"="b===c"
+                String[] pair = tag.split("\\s*=\\s*", 2);
+                keyValue[i][0] = pair[0];
+                keyValue[i][1] = pair.length < 2 ? "" : pair[1];
+                i++;
+            }
+        }
+        return keyValue;
+    }
+
+    /**
      * Ask user and add the tags he confirm.
      * @param keyValue is a table or {{tag1,val1},{tag2,val2},...}
      * @param sender is a string for skipping confirmations. Use empty string for always confirmed adding.
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 15314)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(working copy)
@@ -224,6 +224,19 @@
             zoom(Collections.<OsmPrimitive>emptySet(), bbox);
         }
 
+        // 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) {
+                    String[][] newChangesetTags = AddTagsDialog.parseUrlTagsToKeyValues(args.get("changeset_tags"));
+                    for (String[] key : newChangesetTags) {
+                        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")) {
             MainApplication.worker.submit(() -> {
