Index: /trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 2288)
+++ /trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 2289)
@@ -144,4 +144,14 @@
 
     /**
+     * Explains a {@see OsmApiException} which was thrown because of a conflict
+     * 
+     * @param e the exception
+     */
+    public static void explainConflict(OsmApiException e) {
+        JOptionPane.showMessageDialog(Main.parent, ExceptionUtil.explainConflict(e), tr("Conflict"),
+                JOptionPane.ERROR_MESSAGE);
+    }
+
+    /**
      * Explains a {@see UnknownHostException} which has caused an {@see OsmTransferException}.
      * This is most likely happening when there is an error in the API URL or when
@@ -231,4 +241,8 @@
                 return;
             }
+            if (oae.getResponseCode() == HttpURLConnection.HTTP_CONFLICT) {
+                explainConflict(oae);
+                return;
+            }
 
         }
Index: /trunk/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java	(revision 2289)
+++ /trunk/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java	(revision 2289)
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.help;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * This is the standard help action to be used with help buttons for
+ * context sensitive help
+ * 
+ */
+public class ContextSensitiveHelpAction extends AbstractAction {
+
+    /** the help topic */
+    private String helpTopic;
+
+    public ContextSensitiveHelpAction(String helpTopic) {
+        putValue(SHORT_DESCRIPTION, tr("Show help information"));
+        putValue(NAME, tr("Help"));
+        putValue(SMALL_ICON, ImageProvider.get("help"));
+        this.helpTopic = helpTopic;
+    }
+
+    public void actionPerformed(ActionEvent e) {
+        if (helpTopic != null) {
+            HelpBrowserProxy.getInstance().setUrlForHelpTopic(helpTopic);
+        }
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java	(revision 2288)
+++ /trunk/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java	(revision 2289)
@@ -70,5 +70,5 @@
                 new Runnable() {
                     public void run() {
-                        model.addOrUpdate(changesets);
+                        model.setChangesets(changesets);
                     }
                 }
Index: /trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 2288)
+++ /trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 2289)
@@ -52,4 +52,6 @@
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
+import org.openstreetmap.josm.gui.help.HelpBuilder;
 import org.openstreetmap.josm.gui.tagging.TagEditorModel;
 import org.openstreetmap.josm.gui.tagging.TagEditorPanel;
@@ -64,9 +66,7 @@
  * This is a dialog for entering upload options like the parameters for
  * the upload changeset and the strategy for opening/closing a changeset.
- * 
- * 
+ *
  */
 public class UploadDialog extends JDialog {
-
 
     public static final String HISTORY_KEY = "upload.comment.history";
@@ -109,5 +109,4 @@
 
     private ChangesetSelectionPanel pnlChangesetSelection;
-
     private boolean canceled = false;
 
@@ -152,5 +151,7 @@
         southTabbedPane.setComponentAt(0, pnlChangesetSelection = new ChangesetSelectionPanel());
         southTabbedPane.setTitleAt(0, tr("Settings"));
+        southTabbedPane.setToolTipTextAt(0, tr("Decide how to upload the data and which changeset to use"));
         southTabbedPane.setTitleAt(1, tr("Tags of new changeset"));
+        southTabbedPane.setToolTipTextAt(1, tr("Apply tags to the changeset data is uploaded to"));
         southTabbedPane.addChangeListener(new TabbedPaneChangeLister());
         JPanel pnl1 = new JPanel();
@@ -191,4 +192,7 @@
                 JComponent.WHEN_IN_FOCUSED_WINDOW
         );
+
+        pnl.add(new SideButton(new ContextSensitiveHelpAction("/Help/Dialogs/UploadDialog")));
+        HelpBuilder.setHelpContext(getRootPane(),"/Help/Dialogs/UploadDialog");
         return pnl;
     }
@@ -562,5 +566,6 @@
 
     /**
-     * Listens to window closing events and processes them as cancel events
+     * Listens to window closing events and processes them as cancel events.
+     * Listens to window open events and initializes user input
      *
      */
@@ -572,5 +577,5 @@
 
         @Override
-        public void windowActivated(WindowEvent e) {
+        public void windowOpened(WindowEvent e) {
             startUserInput();
         }
@@ -621,4 +626,5 @@
             pnl.add(new JLabel(tr("Provide a brief comment for the changes you are uploading:")), GBC.eol().insets(0, 5, 10, 3));
             cmt = new HistoryComboBox();
+            cmt.setToolTipText(tr("Enter an upload comment (min. 3 characters)"));
             List<String> cmtHistory = new LinkedList<String>(Main.pref.getCollection(HISTORY_KEY, new LinkedList<String>()));
             // we have to reverse the history, because ComboBoxHistory will reverse it again
@@ -994,4 +1000,8 @@
     }
 
+    /**
+     * A combobox model for the list of open changesets
+     *
+     */
     public class OpenChangesetModel extends DefaultComboBoxModel {
         private List<Changeset> changesets;
@@ -1034,18 +1044,10 @@
         }
 
-        /**
-         * Updates the current list of open changesets with the changesets
-         * in <code>changesets</code>
-         * 
-         * @param changesets the collection of changesets. If null, removes
-         * all changesets from the current list of changesets
-         */
-        public void addOrUpdate(Collection<Changeset> changesets) {
-            if (changesets == null){
-                this.changesets.clear();
-                setSelectedItem(null);
-            }
-            for (Changeset cs: changesets) {
-                internalAddOrUpdate(cs);
+        public void setChangesets(Collection<Changeset> changesets) {
+            this.changesets.clear();
+            if (changesets != null) {
+                for (Changeset cs: changesets) {
+                    internalAddOrUpdate(cs);
+                }
             }
             fireContentsChanged(this, 0, getSize());
@@ -1055,6 +1057,8 @@
                 if (changesets.contains(getSelectedItem())) {
                     setSelectedItem(getSelectedItem());
+                } else if (!this.changesets.isEmpty()){
+                    setSelectedItem(this.changesets.get(0));
                 } else {
-                    setSelectedItem(this.changesets.get(0));
+                    setSelectedItem(null);
                 }
             } else {
Index: /trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 2288)
+++ /trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 2289)
@@ -10,8 +10,13 @@
 import java.net.URL;
 import java.net.UnknownHostException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.io.OsmApi;
@@ -95,4 +100,56 @@
                 + "dataset violates a precondition.<br>" + "The error message is:<br>" + "{0}" + "</html>", e
                 .getMessage().replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;"));
+        return msg;
+    }
+
+    /**
+     * Explains an error due to a 409 conflict
+     *
+     * @param e the exception
+     */
+    public static String explainConflict(OsmApiException e) {
+        e.printStackTrace();
+        String msg = e.getErrorHeader();
+        if (msg != null) {
+            String pattern = "The changeset (\\d+) was closed at (.*)";
+            Pattern p = Pattern.compile(pattern);
+            Matcher m = p.matcher(msg);
+            if (m.matches()) {
+                long changesetId = Long.parseLong(m.group(1));
+                // Example: Tue Oct 15 10:00:00 UTC 2009
+                DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
+                Date closeDate = null;
+                try {
+                    closeDate = formatter.parse(m.group(2));
+                } catch(ParseException ex) {
+                    System.err.println(tr("Failed to parse date ''{0}'' replied by server.", m.group(2)));
+                    ex.printStackTrace();
+                }
+                if (closeDate == null) {
+                    msg = tr(
+                            "<html>Closing of changeset <strong>{0}</strong> failed <br>because it has already been closed.</html>",
+                            changesetId
+                    );
+                } else {
+                    SimpleDateFormat dateFormat = new SimpleDateFormat();
+                    msg = tr(
+                            "<html>Closing of changeset <strong>{0}</strong> failed<br>"
+                            +" because it has already been closed on {1}.</html>",
+                            changesetId,
+                            dateFormat.format(closeDate)
+                    );
+                }
+                return msg;
+            }
+            msg = tr(
+                    "<html>The server reported that it has detected a conflict.<br>" +
+                    "Error message (untranslated):<br>" +
+                    "{0}",
+                    msg
+            );
+        }
+        msg = tr(
+                "<html>The server reported that it has detected a conflict.</html>"
+        );
         return msg;
     }
