Index: trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 15083)
+++ trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 15084)
@@ -286,5 +286,5 @@
             msg = tr("Access to redacted version ''{0}'' of {1} {2} is forbidden.",
                     version, tr(type), id);
-        } else if (OsmApi.isUsingOAuth()) {
+        } else if (OsmApi.isUsingOAuth() && !ExceptionUtil.isUserBlocked(e)) {
             msg = ExceptionUtil.explainFailedOAuthAuthorisation(e);
         } else {
Index: trunk/src/org/openstreetmap/josm/io/MessageNotifier.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 15083)
+++ trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 15084)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.gui.ExceptionDialogUtil;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.auth.CredentialsAgentException;
@@ -89,5 +90,5 @@
                 }
             } catch (OsmTransferException e) {
-                Logging.warn(e);
+                ExceptionDialogUtil.explainOsmTransferException(e);
             }
         }
Index: trunk/src/org/openstreetmap/josm/io/OsmApiException.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmApiException.java	(revision 15083)
+++ trunk/src/org/openstreetmap/josm/io/OsmApiException.java	(revision 15084)
@@ -213,13 +213,19 @@
     public String getDisplayMessage() {
         StringBuilder sb = new StringBuilder();
-        if (errorHeader != null) {
-            sb.append(tr(errorHeader));
-            sb.append(tr("(Code={0})", responseCode));
-        } else if (errorBody != null && !errorBody.trim().isEmpty()) {
-            errorBody = errorBody.trim();
-            sb.append(tr(errorBody));
-            sb.append(tr("(Code={0})", responseCode));
+        String header = Utils.strip(errorHeader);
+        String body = Utils.strip(errorBody);
+        if ((header == null || header.isEmpty()) && (body == null || body.isEmpty())) {
+            sb.append(tr("The server replied an error with code {0}.", responseCode));
         } else {
-            sb.append(tr("The server replied an error with code {0}.", responseCode));
+            if (header != null && !header.isEmpty()) {
+                sb.append(tr(header));
+            }
+            if (body != null && !body.isEmpty()) {
+                if (sb.length() > 0) {
+                    sb.append(". ");
+                }
+                sb.append(tr(body));
+            }
+            sb.append(' ').append(tr("(Code={0})", responseCode));
         }
         return sb.toString();
Index: trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 15083)
+++ trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 15084)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.tools;
 
+import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
@@ -43,4 +44,10 @@
 public final class ExceptionUtil {
 
+    /**
+     * Error message sent by the OSM API when a user has been blocked.
+     */
+    private static final String OSM_API_BLOCKED =
+            marktr("Your access to the API has been blocked. Please log-in to the web interface to find out more.");
+
     private ExceptionUtil() {
         // Hide default constructor for utils classes
@@ -296,16 +303,5 @@
     public static String explainFailedAuthorisation(OsmApiException e) {
         Logging.error(e);
-        String header = e.getErrorHeader();
-        String body = e.getErrorBody();
-        String msg;
-        if (header != null) {
-            if (body != null && !header.equals(body)) {
-                msg = header + " (" + body + ')';
-            } else {
-                msg = header;
-            }
-        } else {
-            msg = body;
-        }
+        String msg = e.getDisplayMessage();
 
         if (msg != null && !msg.isEmpty()) {
@@ -726,4 +722,14 @@
     }
 
+    /**
+     * Determines if the OSM API exception has been thrown because user has been blocked.
+     * @param e OSM API exception
+     * @return {@code true} if the OSM API exception has been thrown because user has been blocked
+     * @since 15084
+     */
+    public static boolean isUserBlocked(OsmApiException e) {
+        return OSM_API_BLOCKED.equals(e.getErrorHeader());
+    }
+
     static String getUrlFromException(OsmApiException e) {
         if (e.getAccessedUrl() != null) {
