Index: src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UploadAction.java	(revision 5494)
+++ src/org/openstreetmap/josm/actions/UploadAction.java	(working copy)
@@ -13,6 +13,7 @@
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.upload.ApiPreconditionCheckerHook;
+import org.openstreetmap.josm.actions.upload.DiscardTagsHook;
 import org.openstreetmap.josm.actions.upload.RelationUploadOrderHook;
 import org.openstreetmap.josm.actions.upload.UploadHook;
 import org.openstreetmap.josm.actions.upload.ValidateUploadHook;
@@ -60,6 +61,11 @@
          * Adjusts the upload order of new relations
          */
         uploadHooks.add(new RelationUploadOrderHook());
+
+        /**
+         * Removes discardable tags like created_by on modified objects
+         */
+        uploadHooks.add(new DiscardTagsHook());
     }
 
     /**
Index: src/org/openstreetmap/josm/actions/upload/DiscardTagsHook.java
===================================================================
--- src/org/openstreetmap/josm/actions/upload/DiscardTagsHook.java	(revision 0)
+++ src/org/openstreetmap/josm/actions/upload/DiscardTagsHook.java	(revision 0)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.upload;
+
+import java.util.AbstractMap;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.ChangePropertyCommand;
+import org.openstreetmap.josm.data.APIDataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Removes discardable tags such as created_by from all modified objects before upload
+ */
+public class DiscardTagsHook implements UploadHook {
+
+    public boolean checkUpload(APIDataSet apiDataSet) {
+        List<OsmPrimitive> objectsToUpload = apiDataSet.getPrimitives();
+
+        Collection<String> discardableKeys = OsmPrimitive.getDiscardableKeys();
+        AbstractMap<String, String> foo = new HashMap<String, String>();
+        for (String string : discardableKeys) {
+            foo.put(string, null);
+        }
+
+        ChangePropertyCommand removeKeys = new ChangePropertyCommand(objectsToUpload, foo);
+        Main.main.undoRedo.add(removeKeys);
+
+        return true;
+    }
+
+}
Index: src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 5494)
+++ src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(working copy)
@@ -610,6 +610,7 @@
 
 
     private static volatile Collection<String> uninteresting = null;
+    private static volatile Collection<String> discardable = null;
     /**
      * Contains a list of "uninteresting" keys that do not make an object
      * "tagged".  Entries that end with ':' are causing a whole namespace to be considered
@@ -627,6 +628,21 @@
     }
 
     /**
+     * Returns a list of keys which have been deemed uninteresting to the point
+     * that they can be silently removed from data which is being edited.
+     * The first example of this is the "created_by" tag on map objects.
+     */
+    public static Collection<String> getDiscardableKeys() {
+        if(discardable == null) {
+            discardable = Main.pref.getCollection("tags.discardable",
+                    Arrays.asList(new String[]{"created_by",
+                            "tiger:upload_uuid", "tiger:tlid", "tiger:source", "tiger:separated",
+                            "geobase:datasetName", "geobase:uuid", "geobase:datasetName", "sub_sea:type"}));
+        }
+        return discardable;
+    }
+
+    /**
      * Returns true if key is considered "uninteresting".
      */
     public static boolean isUninterestingKey(String key) {
Index: src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmWriter.java	(revision 5494)
+++ src/org/openstreetmap/josm/io/OsmWriter.java	(working copy)
@@ -218,10 +218,8 @@
             List<Entry<String, String>> entries = new ArrayList<Entry<String,String>>(osm.getKeys().entrySet());
             Collections.sort(entries, byKeyComparator);
             for (Entry<String, String> e : entries) {
-                if ((osm instanceof Changeset) || !("created_by".equals(e.getKey()))) {
-                    out.println("    <tag k='"+ XmlWriter.encode(e.getKey()) +
-                            "' v='"+XmlWriter.encode(e.getValue())+ "' />");
-                }
+                out.println("    <tag k='"+ XmlWriter.encode(e.getKey()) +
+                        "' v='"+XmlWriter.encode(e.getValue())+ "' />");
             }
             out.println("  </" + tagname + ">");
         } else if (tagOpen) {
