Index: trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java	(revision 3745)
+++ trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java	(revision 3746)
@@ -3,4 +3,5 @@
 
 import java.awt.BorderLayout;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Observable;
@@ -23,5 +24,6 @@
     /** the model for the changeset comment */
     private ChangesetCommentModel changesetCommentModel;
-
+    /** tags that applied to uploaded changesets by default*/
+    private Map<String, String> defaultTags = new HashMap<String, String>();
 
     protected void build() {
@@ -49,5 +51,5 @@
      * @return the default value for "created_by"
      */
-    protected String getDefaultCreatedBy() {
+    public static String getDefaultCreatedBy() {
         Object ua = System.getProperties().get("http.agent");
         return(ua == null) ? "JOSM" : ua.toString();
@@ -82,29 +84,20 @@
     }
 
-    protected void initNewChangeset() {
+    public void initFromChangeset(Changeset cs) {
         String currentComment = getUploadComment();
-        pnlTagEditor.getModel().clear();
-        if (currentComment != null) {
-            pnlTagEditor.getModel().add("comment", currentComment);
+        Map<String,String> tags = getDefaultTags();
+        if (cs != null) {
+            tags.putAll(cs.getKeys());
         }
-        pnlTagEditor.getModel().add("created_by", getDefaultCreatedBy());
-    }
-
-    protected void initFromExistingChangeset(Changeset cs) {
-        String currentComment = getUploadComment();
-        Map<String,String> tags = cs.getKeys();
         if (tags.get("comment") == null) {
             tags.put("comment", currentComment);
         }
-        tags.put("created_by", getDefaultCreatedBy());
+        String created_by = tags.get("created_by");
+        if (created_by == null || "".equals(created_by)) {
+            tags.put("created_by", getDefaultCreatedBy());
+        } else if (!created_by.contains(getDefaultCreatedBy())) {
+            tags.put("created_by", created_by + ";" + getDefaultCreatedBy());
+        }
         pnlTagEditor.getModel().initFromTags(tags);
-    }
-
-    public void initFromChangeset(Changeset cs) {
-        if (cs == null) {
-            initNewChangeset();
-        } else {
-            initFromExistingChangeset(cs);
-        }
     }
 
@@ -116,4 +109,15 @@
     public Map<String,String> getTags() {
         return pnlTagEditor.getModel().getTags();
+    }
+
+    public Map<String,String> getDefaultTags() {
+        Map<String,String> tags = new HashMap<String, String>();
+        tags.putAll(defaultTags);
+        return tags;
+    }
+
+    public void setDefaultTags(Map<String, String> tags) {
+        defaultTags.clear();
+        defaultTags.putAll(tags);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 3745)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 3746)
@@ -17,4 +17,5 @@
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Logger;
 
@@ -297,4 +298,12 @@
     }
 
+    public Map<String, String> getDefaultChangesetTags() {
+        return pnlTagSettings.getDefaultTags();
+    }
+
+    public void setDefaultChangesetTags(Map<String, String> tags) {
+        pnlTagSettings.setDefaultTags(tags);
+    }
+
     /**
      * Replies the {@see UploadStrategySpecification} the user entered in the dialog.
@@ -369,25 +378,25 @@
         protected boolean warnUploadComment() {
             ExtendedDialog dlg = new ExtendedDialog(UploadDialog.this,
-                tr("Please revise upload comment"),
-                new String[] {tr("Revise"), tr("Cancel"), tr("Continue as is")});
+                    tr("Please revise upload comment"),
+                    new String[] {tr("Revise"), tr("Cancel"), tr("Continue as is")});
             dlg.setContent("<html>" +
                     tr("Your upload comment is <i>empty</i>, or <i>very short</i>.<br /><br />" +
-                       "This is technically allowed, but please consider that many users who are<br />" +
-                       "watching changes in their area depend on meaningful changeset comments<br />" +
-                       "to understand what is going on!<br /><br />" +
-                       "If you spend a minute now to explain your change, you will make life<br />" +
-                       "easier for many other mappers.") +
-                    "</html>");
+                            "This is technically allowed, but please consider that many users who are<br />" +
+                            "watching changes in their area depend on meaningful changeset comments<br />" +
+                            "to understand what is going on!<br /><br />" +
+                            "If you spend a minute now to explain your change, you will make life<br />" +
+                    "easier for many other mappers.") +
+            "</html>");
             dlg.setButtonIcons(new Icon[] {
-                ImageProvider.get("ok"),
-                ImageProvider.get("cancel"),
-                ImageProvider.overlay(
-                    ImageProvider.get("upload"),
-                    new ImageIcon(ImageProvider.get("warning-small").getImage().getScaledInstance(10 , 10, Image.SCALE_SMOOTH)),
-                    ImageProvider.OverlayPosition.SOUTHEAST)});
+                    ImageProvider.get("ok"),
+                    ImageProvider.get("cancel"),
+                    ImageProvider.overlay(
+                            ImageProvider.get("upload"),
+                            new ImageIcon(ImageProvider.get("warning-small").getImage().getScaledInstance(10 , 10, Image.SCALE_SMOOTH)),
+                            ImageProvider.OverlayPosition.SOUTHEAST)});
             dlg.setToolTipTexts(new String[] {
-                tr("Return to the previous dialog to enter a more descriptive comment"),
-                tr("Cancel and return to the previous dialog"),
-                tr("Ignore this hint and upload anyway")});
+                    tr("Return to the previous dialog to enter a more descriptive comment"),
+                    tr("Cancel and return to the previous dialog"),
+                    tr("Ignore this hint and upload anyway")});
             dlg.setIcon(JOptionPane.WARNING_MESSAGE);
             dlg.toggleEnable("upload_comment_is_empty_or_very_short");
