Index: src/org/openstreetmap/josm/io/OsmApi.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmApi.java	(revision 1545)
+++ src/org/openstreetmap/josm/io/OsmApi.java	(working copy)
@@ -22,6 +22,8 @@
 import java.util.Properties;
 import java.util.HashMap;
 import java.util.StringTokenizer;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.xml.parsers.SAXParserFactory;
 
@@ -47,6 +49,9 @@
  * 
  */
 public class OsmApi extends OsmConnection {
+    
+    /** the logger */
+    static private final Logger logger = Logger.getLogger(OsmApi.class.getName());
 
     /**
      * Object describing current changeset
@@ -411,16 +416,8 @@
                         continue;
                     }
                 }
-
-                // populate return fields.
-                responseBody.setLength(0);
-                BufferedReader in = new BufferedReader(new InputStreamReader(activeConnection.getInputStream()));
-                String s;
-                while((s = in.readLine()) != null) {
-                    responseBody.append(s);
-                    responseBody.append("\n");
-                }
-
+                
+           
                 statusMessage.setLength(0);
                 statusMessage.append (activeConnection.getResponseMessage());
                 // Look for a detailed error message from the server
@@ -430,11 +427,25 @@
                     if (serverErrorTranslations.containsKey(er)) er = serverErrorTranslations.get(er);
                     statusMessage.append(er);
                 }
-                activeConnection.disconnect();
                 
-                if (retCode != 200) {
+                // abort by throwing an exception if the return code is not 200 OK 
+                if (retCode != HttpURLConnection.HTTP_OK) {                    
                     throw new OsmTransferException(statusMessage.toString());
                 }
+                
+
+                // read the response body 
+                //
+                responseBody.setLength(0);
+                BufferedReader in = new BufferedReader(new InputStreamReader(activeConnection.getInputStream()));
+                String s;
+                while((s = in.readLine()) != null) {
+                    responseBody.append(s);
+                    responseBody.append("\n");
+                }
+
+                activeConnection.disconnect();
+                
                 return responseBody.toString();
             } catch (UnknownHostException e) {
                 throw new OsmTransferException(tr("Unknown host")+": "+e.getMessage(), e);
@@ -449,7 +460,7 @@
             } catch (Exception e) {
                 if (e instanceof OsmTransferException) throw (OsmTransferException) e;
                 throw new OsmTransferException(e);
-            }
+            } 
         }
     }
 }
Index: src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 1545)
+++ src/org/openstreetmap/josm/io/OsmServerWriter.java	(working copy)
@@ -118,6 +118,7 @@
             }
             if (useChangesets) api.stopChangeset();
         } catch (OsmTransferException e) {
+            
             try {
                 if (useChangesets) api.stopChangeset();
             } catch (Exception ee) {
@@ -138,10 +139,32 @@
     }
 
     private void dealWithTransferException (OsmTransferException e) {
-        Main.pleaseWaitDlg.currentAction.setText(tr("Transfer aborted due to error (will wait for 5 seconds):") + e.getMessage());
-        try {
-            Thread.sleep(5000);
+        
+        // warn user if the API replies a 409 Conflict. The text line in
+        // Main.pleaseWaitDlg.currentAction is easily overread and
+        // data may be lost
+        //
+        if (e.getMessage().startsWith("Conflict")) {
+            JOptionPane.showMessageDialog(
+                    null,
+                      tr("The server reported one or more conflicts between the\n" 
+                       + "data you tried to upload and the data on the server.\n"
+                       + "Your data has NOT been saved on the server.\n"
+                       + "Please reload the data and resolve any conflicts using\n"
+                       + "the merge tool."),
+                      tr("Conflict in changeset"),
+                      JOptionPane.ERROR_MESSAGE
+             );
+        } else {
+            // any other error. display a text in please wait dialog
+            // FIXME: why Thread.sleep(50000)? JOSM wan't retry after 5s. Why not a 
+            // normal warning dialog the user has to close with a mouse click?
+            //
+            Main.pleaseWaitDlg.currentAction.setText(tr("Transfer aborted due to error (will wait for 5 seconds):") + e.getMessage());
+            try {
+                Thread.sleep(5000);
+            }
+            catch (InterruptedException ex) {}
         }
-        catch (InterruptedException ex) {}
     }
 }
