diff --git a/src/org/openstreetmap/josm/actions/UploadAction.java b/src/org/openstreetmap/josm/actions/UploadAction.java
index 9d085ae856..4c80c15f92 100644
--- a/src/org/openstreetmap/josm/actions/UploadAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadAction.java
@@ -6,6 +6,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -242,6 +243,15 @@ public class UploadAction extends AbstractUploadAction {
         final UploadDialog dialog = UploadDialog.getUploadDialog();
         dialog.setUploadedPrimitives(apiData);
         dialog.initLifeCycle(layer.getDataSet());
+        Map<String, String> changesetTags = dialog.getChangeset().getKeys();
+        Map<String, String> originalChangesetTags = new HashMap<>(changesetTags);
+        for (UploadHook hook : UPLOAD_HOOKS) {
+            hook.modifyChangesetTags(changesetTags);
+        }
+        dialog.getModel().putAll(changesetTags);
+        if (!originalChangesetTags.equals(changesetTags)) {
+            dialog.setChangesetTagsModifiedProgramatically();
+        }
         dialog.setVisible(true);
         dialog.rememberUserInput();
         if (dialog.isCanceled()) {
@@ -258,10 +268,7 @@ public class UploadAction extends AbstractUploadAction {
 
         // Any hooks want to change the changeset tags?
         Changeset cs = dialog.getChangeset();
-        Map<String, String> changesetTags = cs.getKeys();
-        for (UploadHook hook : UPLOAD_HOOKS) {
-            hook.modifyChangesetTags(changesetTags);
-        }
+        changesetTags = cs.getKeys();
         for (UploadHook hook : LATE_UPLOAD_HOOKS) {
             hook.modifyChangesetTags(changesetTags);
         }
diff --git a/src/org/openstreetmap/josm/gui/io/UploadDialog.java b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
index 94b852d758..4e156de08c 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
@@ -2,10 +2,12 @@
 package org.openstreetmap.josm.gui.io;
 
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
@@ -33,11 +35,13 @@ import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JSplitPane;
 import javax.swing.JTabbedPane;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.data.APIDataSet;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.preferences.NamedColorProperty;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
@@ -64,6 +68,9 @@ import org.openstreetmap.josm.tools.Utils;
  * @since 2025
  */
 public class UploadDialog extends AbstractUploadDialog implements PreferenceChangedListener, PropertyChangeListener {
+    /** A warning color to indicate something is non-default in the changeset tags */
+    private static final Color WARNING_BACKGROUND = new NamedColorProperty(
+            marktr("Changesets: Non-default advanced settings"), new Color(0xF89042)).get();
     /** the unique instance of the upload dialog */
     private static UploadDialog uploadDialog;
 
@@ -89,6 +96,7 @@ public class UploadDialog extends AbstractUploadDialog implements PreferenceChan
     private final transient UploadDialogModel model = new UploadDialogModel();
 
     private transient DataSet dataSet;
+    private ChangeListener changesetTagListener;
 
     /**
      * Constructs a new {@code UploadDialog}.
@@ -147,6 +155,7 @@ public class UploadDialog extends AbstractUploadDialog implements PreferenceChan
         pnlSettings.add(pnlUploadStrategySelectionPanel, GBC.eop().fill(GridBagConstraints.HORIZONTAL));
         pnlSettings.add(pnlTagEditorBorder, GBC.eol().fill(GridBagConstraints.BOTH));
 
+        // if another tab is added, please don't forget to update setChangesetTagsModifiedProgramatically
         tpConfigPanels.add(pnlSettings);
         tpConfigPanels.setTitleAt(1, tr("Settings"));
         tpConfigPanels.setToolTipTextAt(1, tr("Decide how to upload the data and which changeset to use"));
@@ -354,6 +363,29 @@ public class UploadDialog extends AbstractUploadDialog implements PreferenceChan
         super.setVisible(visible);
     }
 
+    /**
+     * This is called by {@link UploadAction} if {@link org.openstreetmap.josm.actions.upload.UploadHook}s change
+     * the changeset tags.
+     */
+    public void setChangesetTagsModifiedProgramatically() {
+        final Color originalColor = this.tpConfigPanels.getBackgroundAt(1);
+        this.tpConfigPanels.setBackgroundAt(1, WARNING_BACKGROUND);
+        this.tpConfigPanels.setIconAt(1, ImageProvider.get("warning-small"));
+        if (this.changesetTagListener != null) {
+            this.tpConfigPanels.removeChangeListener(this.changesetTagListener);
+        }
+        this.changesetTagListener = event -> {
+            if (this.tpConfigPanels.getSelectedIndex() == 1) {
+                tpConfigPanels.setBackgroundAt(1, originalColor);
+                tpConfigPanels.setIconAt(1, ImageProvider.get("apply"));
+                this.tpConfigPanels.removeChangeListener(this.changesetTagListener);
+                changesetTagListener = null;
+            }
+        };
+
+        this.tpConfigPanels.addChangeListener(this.changesetTagListener);
+    }
+
     static final class CompactTabbedPane extends JTabbedPane {
         @Override
         public Dimension getPreferredSize() {
@@ -606,5 +638,10 @@ public class UploadDialog extends AbstractUploadDialog implements PreferenceChan
     public void clean() {
         setUploadedPrimitives(null);
         dataSet = null;
+        if (this.changesetTagListener != null) {
+            this.changesetTagListener.stateChanged(null);
+            this.tpConfigPanels.removeChangeListener(this.changesetTagListener);
+            this.changesetTagListener = null;
+        }
     }
 }
