Index: trunk/src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 13025)
+++ trunk/src/org/openstreetmap/josm/actions/UploadAction.java	(revision 13028)
@@ -9,4 +9,5 @@
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import javax.swing.JOptionPane;
@@ -21,4 +22,5 @@
 import org.openstreetmap.josm.data.APIDataSet;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
+import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -246,4 +248,14 @@
         }
 
+        // Any hooks want to change the changeset tags?
+        Changeset cs = UploadDialog.getUploadDialog().getChangeset();
+        Map<String, String> changesetTags = cs.getKeys();
+        for (UploadHook hook : UPLOAD_HOOKS) {
+            hook.modifyChangesetTags(changesetTags);
+        }
+        for (UploadHook hook : LATE_UPLOAD_HOOKS) {
+            hook.modifyChangesetTags(changesetTags);
+        }
+
         MainApplication.worker.execute(
                 new UploadPrimitivesTask(
@@ -251,5 +263,5 @@
                         layer,
                         apiData,
-                        UploadDialog.getUploadDialog().getChangeset()
+                        cs
                 )
         );
Index: trunk/src/org/openstreetmap/josm/actions/upload/UploadHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/upload/UploadHook.java	(revision 13025)
+++ trunk/src/org/openstreetmap/josm/actions/upload/UploadHook.java	(revision 13028)
@@ -1,20 +1,36 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.actions.upload;
+
+import java.util.Map;
 
 import org.openstreetmap.josm.data.APIDataSet;
 
 /**
- * A check right before the upload. The UploadHook may modify the uploaded data
- * silently, it may display a warning message to the user or prevent the upload
- * altogether.
+ * Change, or block, the upload.
+ *
+ * The UploadHook may modify the uploaded data silently, it may display a
+ * warning message to the user or prevent the upload altogether.
+ *
+ * The tags of the changeset can also be changed with modifyChangesetTags method.
  */
-@FunctionalInterface
 public interface UploadHook {
 
     /**
-     * Checks the upload.
-     * @param apiDataSet the data to upload
-     * @return {@code true} if upload is possible
+     * Check, and/or change, the data to be uploaded.
+     * Default implementation is to approve the upload.
+     * @param apiDataSet the data to upload, modify this to change the data.
+     * @return {@code true} if upload is possible, {@code false} to block the upload.
      */
-    boolean checkUpload(APIDataSet apiDataSet);
+    default boolean checkUpload(APIDataSet apiDataSet) {
+        return true;
+    }
+
+    /**
+     * Modify the changeset tags (in place) before upload.
+     * Default implementation is to do no changes.
+     * @param tags The current tags to change
+     * @since 13028
+     */
+    default void modifyChangesetTags(Map<String, String> tags) {
+    }
 }
