Index: trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 3132)
+++ trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 3133)
@@ -12,9 +12,9 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Observable;
+import java.util.Observer;
 
 import javax.swing.Action;
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -32,6 +33,5 @@
  *
  */
-public class BasicUploadSettingsPanel extends JPanel implements PropertyChangeListener{
-    static public final String UPLOAD_COMMENT_PROP = BasicUploadSettingsPanel.class.getName() + ".uploadComment";
+public class BasicUploadSettingsPanel extends JPanel {
     public static final String HISTORY_KEY = "upload.comment.history";
 
@@ -40,4 +40,6 @@
     /** the panel with a summary of the upload parameters */
     private UploadParameterSummaryPanel pnlUploadParameterSummary;
+    /** the changset comment model */
+    private ChangesetCommentModel changesetCommentModel;
 
     protected JPanel buildUploadCommentPanel() {
@@ -56,5 +58,5 @@
                 new ActionListener() {
                     public void actionPerformed(ActionEvent e) {
-                        firePropertyChange(UPLOAD_COMMENT_PROP, null, hcbUploadComment.getText());
+                        changesetCommentModel.setComment(hcbUploadComment.getText());
                     }
                 }
@@ -64,5 +66,5 @@
                     @Override
                     public void focusLost(FocusEvent e) {
-                        firePropertyChange(UPLOAD_COMMENT_PROP, null, hcbUploadComment.getText());
+                        changesetCommentModel.setComment(hcbUploadComment.getText());
                     }
                 }
@@ -79,5 +81,14 @@
     }
 
-    public BasicUploadSettingsPanel() {
+    /**
+     * Creates the panel
+     * 
+     * @param changesetCommentModel the model for the changeset comment. Must not be null
+     * @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
+     */
+    public BasicUploadSettingsPanel(ChangesetCommentModel changesetCommentModel) {
+        CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
+        this.changesetCommentModel = changesetCommentModel;
+        changesetCommentModel.addObserver(new ChangesetCommentObserver());
         build();
     }
@@ -120,29 +131,5 @@
     }
 
-    /**
-     * Replies the current upload comment
-     *
-     * @return
-     */
-    public String getUploadComment() {
-        return hcbUploadComment.getText();
-    }
-
-    /**
-     * Sets the current upload comment
-     *
-     * @return
-     */
-    public void setUploadComment(String uploadComment) {
-        if (uploadComment == null) {
-            uploadComment = "";
-        }
-        if (!uploadComment.equals(hcbUploadComment.getText())) {
-            hcbUploadComment.setText(uploadComment);
-        }
-    }
-
-    public void initEditingOfUploadComment(String comment) {
-        setUploadComment(comment);
+    public void initEditingOfUploadComment() {
         hcbUploadComment.getEditor().selectAll();
         hcbUploadComment.requestFocusInWindow();
@@ -153,17 +140,15 @@
     }
 
-    /* -------------------------------------------------------------------------- */
-    /* Interface PropertyChangeListener                                           */
-    /* -------------------------------------------------------------------------- */
-    public void propertyChange(PropertyChangeEvent evt) {
-        if (evt.getPropertyName().equals(TagSettingsPanel.UPLOAD_COMMENT_PROP)) {
-            String comment = (String)evt.getNewValue();
-            if (comment == null) {
-                comment = "";
+    /**
+     * Observes the changeset comment model and keeps the comment input field
+     * in sync with the current changeset comment
+     */
+    class ChangesetCommentObserver implements Observer {
+        public void update(Observable o, Object arg) {
+            if (!(o instanceof ChangesetCommentModel)) return;
+            String newComment = (String)arg;
+            if (!hcbUploadComment.getText().equals(newComment)) {
+                hcbUploadComment.setText(newComment);
             }
-            if (comment.equals(hcbUploadComment.getText()))
-                // nothing to change - return
-                return;
-            hcbUploadComment.setText(comment);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java	(revision 3133)
+++ trunk/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java	(revision 3133)
@@ -0,0 +1,37 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.io;
+
+import java.util.Observable;
+
+/**
+ * ChangesetCommentModel is an observable model for the changeset comment edited
+ * in the {@see UploadDialog}.
+ *
+ */
+public class ChangesetCommentModel extends Observable{
+    private String comment = "";
+
+    /**
+     * Sets the current changeset comment and notifies observers if the comment
+     * has changed.
+     * 
+     * @param comment the new upload comment. Empty string assumed if null.
+     */
+    public void setComment(String comment){
+        String oldValue = this.comment;
+        this.comment = comment == null ? "" : comment;
+        if (!oldValue.equals(this.comment)) {
+            setChanged();
+            notifyObservers(this.comment);
+        }
+    }
+
+    /**
+     * Replies the current changeset comment in this model.
+     * 
+     * @return the current changeset comment in this model.
+     */
+    public String getComment() {
+        return comment == null ? "": comment;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java	(revision 3132)
+++ trunk/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java	(revision 3133)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.gui.JMultilineLabel;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -46,5 +47,5 @@
  * </ul>
  */
-public class ChangesetManagementPanel extends JPanel implements ListDataListener {
+public class ChangesetManagementPanel extends JPanel implements ListDataListener{
     public final static String SELECTED_CHANGESET_PROP = ChangesetManagementPanel.class.getName() + ".selectedChangeset";
     public final static String CLOSE_CHANGESET_AFTER_UPLOAD = ChangesetManagementPanel.class.getName() + ".closeChangesetAfterUpload";
@@ -58,4 +59,5 @@
     private JCheckBox cbCloseAfterUpload;
     private OpenChangesetComboBoxModel model;
+    private ChangesetCommentModel changesetCommentModel;
 
     /**
@@ -159,5 +161,13 @@
     }
 
-    public ChangesetManagementPanel() {
+    /**
+     * Creates a new panel
+     * 
+     * @param changesetCommentModel the changeset comment model. Must not be null.
+     * @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
+     */
+    public ChangesetManagementPanel(ChangesetCommentModel changesetCommentModel) {
+        CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
+        this.changesetCommentModel = changesetCommentModel;
         build();
         refreshGUI();
@@ -174,4 +184,9 @@
     }
 
+    /**
+     * Sets the changeset to be used in the next upload
+     * 
+     * @param cs the changeset
+     */
     public void setSelectedChangesetForNextUpload(Changeset cs) {
         int idx  = model.getIndexOf(cs);
@@ -204,14 +219,4 @@
     }
 
-    /**
-     * Replies the default value for "created_by"
-     *
-     * @return the default value for "created_by"
-     */
-    protected String getDefaultCreatedBy() {
-        Object ua = System.getProperties().get("http.agent");
-        return(ua == null) ? "JOSM" : ua.toString();
-    }
-
     /* ---------------------------------------------------------------------------- */
     /* Interface ListDataListener                                                   */
@@ -230,5 +235,5 @@
 
     /**
-     * Listens to changes in the selected changeset and accordingly fires property
+     * Listens to changes in the selected changeset and fires property
      * change events.
      *
@@ -237,9 +242,11 @@
         public void itemStateChanged(ItemEvent e) {
             Changeset cs = (Changeset)cbOpenChangesets.getSelectedItem();
+            if (cs == null) return;
             if (rbExisting.isSelected()) {
+                // create a clone of the selected changeset and make sure
+                // we keep the current changeset comment (see #4371)
+                cs = new Changeset(cs);
+                cs.put("comment", changesetCommentModel.getComment());
                 firePropertyChange(SELECTED_CHANGESET_PROP, null, cs);
-                if (cs == null) {
-                    rbUseNew.setSelected(true);
-                }
             }
         }
@@ -283,4 +290,9 @@
                 }
                 Changeset cs = (Changeset)cbOpenChangesets.getSelectedItem();
+                if (cs == null) return;
+                // create a clone of the selected changeset and make sure
+                // we keep the current changeset comment (see #4371)
+                cs = new Changeset(cs);
+                cs.put("comment", changesetCommentModel.getComment());
                 firePropertyChange(SELECTED_CHANGESET_PROP, null, cs);
             }
Index: trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java	(revision 3132)
+++ trunk/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java	(revision 3133)
@@ -3,7 +3,7 @@
 
 import java.awt.BorderLayout;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
 import java.util.Map;
+import java.util.Observable;
+import java.util.Observer;
 
 import javax.swing.JPanel;
@@ -15,10 +15,13 @@
 import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
 import org.openstreetmap.josm.gui.tagging.TagModel;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class TagSettingsPanel extends JPanel implements PropertyChangeListener, TableModelListener {
-    static public final String UPLOAD_COMMENT_PROP = TagSettingsPanel.class.getName() + ".uploadComment";
+public class TagSettingsPanel extends JPanel implements TableModelListener {
 
     /** checkbox for selecting whether an atomic upload is to be used  */
     private TagEditorPanel pnlTagEditor;
+    /** the model for the changeset comment */
+    private ChangesetCommentModel changesetCommentModel;
+
 
     protected void build() {
@@ -27,5 +30,14 @@
     }
 
-    public TagSettingsPanel() {
+    /**
+     * Creates a new panel
+     * 
+     * @param changesetCommentModel the changeset comment model. Must not be null.
+     * @throws IllegalArgumentException thrown if {@code changesetCommentModel} is null
+     */
+    public TagSettingsPanel(ChangesetCommentModel changesetCommentModel) throws IllegalArgumentException{
+        CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
+        this.changesetCommentModel = changesetCommentModel;
+        this.changesetCommentModel.addObserver(new ChangesetCommentObserver());
         build();
         pnlTagEditor.getModel().addTableModelListener(this);
@@ -42,5 +54,5 @@
     }
 
-    public void setUploadComment(String comment) {
+    protected void setUploadComment(String comment) {
         if (comment == null) {
             comment = "";
@@ -111,22 +123,28 @@
 
     /* -------------------------------------------------------------------------- */
-    /* Interface PropertyChangeListener                                           */
-    /* -------------------------------------------------------------------------- */
-    public void propertyChange(PropertyChangeEvent evt) {
-        if (evt.getPropertyName().equals(ChangesetManagementPanel.SELECTED_CHANGESET_PROP)) {
-            Changeset cs = (Changeset)evt.getNewValue();
-            initFromChangeset(cs);
-        } else if (evt.getPropertyName().equals(BasicUploadSettingsPanel.UPLOAD_COMMENT_PROP)) {
-            String comment = (String)evt.getNewValue();
-            setUploadComment(comment);
-        }
-    }
-
-    /* -------------------------------------------------------------------------- */
     /* Interface TableChangeListener                                              */
     /* -------------------------------------------------------------------------- */
     public void tableChanged(TableModelEvent e) {
         String uploadComment = getUploadComment();
-        firePropertyChange(UPLOAD_COMMENT_PROP, null, uploadComment);
+        changesetCommentModel.setComment(uploadComment);
+    }
+
+    /**
+     * Observes the changeset comment model and keeps the tag editor in sync
+     * with the current changeset comment
+     *
+     */
+    class ChangesetCommentObserver implements Observer {
+        public void update(Observable o, Object arg) {
+            if (!(o instanceof ChangesetCommentModel)) return;
+            String newValue = (String)arg;
+            String oldValue = getUploadComment();
+            if (oldValue == null) {
+                oldValue = "";
+            }
+            if (!oldValue.equals(newValue)) {
+                setUploadComment((String)arg);
+            }
+        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 3132)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 3133)
@@ -80,6 +80,8 @@
     /** the upload button */
     private JButton btnUpload;
-
     private boolean canceled = false;
+
+    /** the changeset comment model keeping the state of the changeset comment */
+    private ChangesetCommentModel changesetCommentModel;
 
     /**
@@ -113,13 +115,15 @@
         tpConfigPanels.add(new JPanel());
 
-        tpConfigPanels.setComponentAt(0, pnlBasicUploadSettings = new BasicUploadSettingsPanel());
+        changesetCommentModel = new ChangesetCommentModel();
+
+        tpConfigPanels.setComponentAt(0, pnlBasicUploadSettings = new BasicUploadSettingsPanel(changesetCommentModel));
         tpConfigPanels.setTitleAt(0, tr("Settings"));
         tpConfigPanels.setToolTipTextAt(0, tr("Decide how to upload the data and which changeset to use"));
 
-        tpConfigPanels.setComponentAt(1,pnlTagSettings = new TagSettingsPanel());
+        tpConfigPanels.setComponentAt(1,pnlTagSettings = new TagSettingsPanel(changesetCommentModel));
         tpConfigPanels.setTitleAt(1, tr("Tags of new changeset"));
         tpConfigPanels.setToolTipTextAt(1, tr("Apply tags to the changeset data is uploaded to"));
 
-        tpConfigPanels.setComponentAt(2,pnlChangesetManagement = new ChangesetManagementPanel());
+        tpConfigPanels.setComponentAt(2,pnlChangesetManagement = new ChangesetManagementPanel(changesetCommentModel));
         tpConfigPanels.setTitleAt(2, tr("Changesets"));
         tpConfigPanels.setToolTipTextAt(2, tr("Manage open changesets and select a changeset to upload to"));
@@ -175,10 +179,4 @@
         addWindowListener(new WindowEventHandler());
 
-        // synchronized input of upload comments
-        //
-        //UploadCommentSynchronizer synchronizer = new UploadCommentSynchronizer();
-        //pnlTagSettings.getModeaddTableModelListener(synchronizer);
-        pnlTagSettings.addPropertyChangeListener(pnlBasicUploadSettings);
-        pnlBasicUploadSettings.addPropertyChangeListener(pnlTagSettings);
 
         // make sure the the configuration panels listen to each other
@@ -188,5 +186,4 @@
                 pnlBasicUploadSettings.getUploadParameterSummaryPanel()
         );
-        pnlChangesetManagement.addPropertyChangeListener(pnlTagSettings);
         pnlChangesetManagement.addPropertyChangeListener(this);
         pnlUploadedObjects.addPropertyChangeListener(
@@ -197,4 +194,5 @@
                 pnlBasicUploadSettings.getUploadParameterSummaryPanel()
         );
+
 
         // users can click on either of two links in the upload parameter
@@ -268,5 +266,4 @@
         pnlBasicUploadSettings.startUserInput();
         pnlTagSettings.startUserInput();
-        pnlTagSettings.setUploadComment(getUploadComment());
         pnlTagSettings.initFromChangeset(pnlChangesetManagement.getSelectedChangeset());
         pnlUploadStrategySelectionPanel.initFromPreferences();
@@ -312,5 +309,5 @@
      */
     protected String getUploadComment() {
-        return pnlBasicUploadSettings.getUploadComment();
+        return changesetCommentModel.getComment();
     }
 
@@ -385,5 +382,5 @@
                 warnIllegalUploadComment();
                 tpConfigPanels.setSelectedIndex(0);
-                pnlBasicUploadSettings.initEditingOfUploadComment(getUploadComment());
+                pnlBasicUploadSettings.initEditingOfUploadComment();
                 return;
             }
@@ -437,5 +434,5 @@
         public void windowActivated(WindowEvent arg0) {
             if (tpConfigPanels.getSelectedIndex() == 0) {
-                pnlBasicUploadSettings.initEditingOfUploadComment(getUploadComment());
+                pnlBasicUploadSettings.initEditingOfUploadComment();
             }
         }
