Index: trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 5583)
+++ trunk/src/org/openstreetmap/josm/gui/ExceptionDialogUtil.java	(revision 5584)
@@ -10,4 +10,6 @@
 import java.net.SocketException;
 import java.net.UnknownHostException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import javax.swing.JOptionPane;
@@ -242,4 +244,8 @@
     }
 
+    private static boolean isOAuth() {
+        return Main.pref.get("osm-server.auth-method", "basic").equals("oauth");
+    }
+    
     /**
      * Explains a {@link OsmApiException} which was thrown because the authentication at
@@ -249,7 +255,6 @@
      */
     public static void explainAuthenticationFailed(OsmApiException e) {
-        String authMethod = Main.pref.get("osm-server.auth-method", "basic");
         String msg;
-        if (authMethod.equals("oauth")) {
+        if (isOAuth()) {
             msg = ExceptionUtil.explainFailedOAuthAuthentication(e);
         } else {
@@ -268,16 +273,36 @@
     /**
      * Explains a {@link OsmApiException} which was thrown because accessing a protected
-     * resource was forbidden.
+     * resource was forbidden (HTTP 403).
      *
      * @param e the exception
      */
     public static void explainAuthorizationFailed(OsmApiException e) {
-        // Fixme: add special handling that calls ExceptionUtil.explainFailedOAuthAuthorisation(e)
-        HelpAwareOptionPane.showOptionDialog(
-                Main.parent,
-                ExceptionUtil.explainFailedAuthorisation(e),
+        
+        Matcher m;
+        String msg;
+        String url = e.getAccessedUrl();
+        Pattern p = Pattern.compile("http://.*/api/0.6/(node|way|relation)/(\\d+)/(\\d+)");
+        
+        // Special case for individual access to redacted versions
+        // See http://wiki.openstreetmap.org/wiki/Open_Database_License/Changes_in_the_API
+        if (url != null && (m = p.matcher(url)).matches()) {
+            String type = m.group(1);
+            String id = m.group(2);
+            String version = m.group(3);
+            // {1} is the translation of "node", "way" or "relation"
+            msg = tr("Access to redacted version ''{0}'' of {1} {2} is forbidden.",
+                    version, tr(type), id);
+        } else if (isOAuth()) {
+            msg = ExceptionUtil.explainFailedOAuthAuthorisation(e);
+        } else {
+            msg = ExceptionUtil.explainFailedAuthorisation(e);
+        }
+        
+        HelpAwareOptionPane.showOptionDialog(
+                Main.parent,
+                msg,
                 tr("Authorisation Failed"),
                 JOptionPane.ERROR_MESSAGE,
-                ht("/ErrorMessages#AuthenticationFailed")
+                ht("/ErrorMessages#AuthorizationFailed")
         );
     }
Index: trunk/src/org/openstreetmap/josm/io/OsmApiException.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmApiException.java	(revision 5583)
+++ trunk/src/org/openstreetmap/josm/io/OsmApiException.java	(revision 5584)
@@ -14,4 +14,19 @@
     private String accessedUrl;
 
+    /**
+     * Constructs an {@code OsmApiException} with the specified response code, error header and error body
+     * @param responseCode The HTTP response code replied by the OSM server. See {@link java.net.HttpURLConnection HttpURLConnection} for predefined HTTP response code values
+     * @param errorHeader The error header, as transmitted in the {@code Error} field of the HTTP response header
+     * @param errorBody The error body, as transmitted in the HTTP response body
+     * @param accessedUrl The complete URL accessed when this error occured
+     * @since 5584
+     */
+    public OsmApiException(int responseCode, String errorHeader, String errorBody, String accessedUrl) {
+        this.responseCode = responseCode;
+        this.errorHeader = errorHeader;
+        this.errorBody = errorBody;
+        this.accessedUrl = accessedUrl;
+    }
+    
     /**
      * Constructs an {@code OsmApiException} with the specified response code, error header and error body
Index: trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 5583)
+++ trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 5584)
@@ -122,5 +122,5 @@
                     }
 
-                    throw new OsmApiException(activeConnection.getResponseCode(), errorHeader, errorBody.toString());
+                    throw new OsmApiException(activeConnection.getResponseCode(), errorHeader, errorBody.toString(), url.toString());
                 }
 
@@ -131,5 +131,4 @@
                 else
                     throw new OsmTransferException(e);
-
             }
         } finally {
Index: trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 5583)
+++ trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 5584)
@@ -17,5 +17,4 @@
 import java.util.Date;
 import java.util.Locale;
-import java.util.Set;
 import java.util.TreeSet;
 import java.util.regex.Matcher;
@@ -270,11 +269,4 @@
         String header = e.getErrorHeader();
         String body = e.getErrorBody();
-        if (body.equals("Your access to the API is temporarily suspended. Please log-in to the web interface to view the Contributor Terms. You do not need to agree, but you must view them.")) {
-            return tr("<html>"
-                    +"Your access to the API is temporarily suspended.<br>"
-                    + "Please log-in to the web interface to view the Contributor Terms.<br>"
-                    + "You do not need to agree, but you must view them."
-                    + "</html>");
-        }
         String msg = null;
         if (header != null) {
@@ -288,11 +280,18 @@
         }
         
-        return tr("<html>"
-                + "Authorisation at the OSM server failed.<br>"
-                + "The server reported the following error:<br>"
-                + "''{0}''"
-                + "</html>",
-                msg
-        );
+        if (msg != null && !msg.isEmpty()) {
+            return tr("<html>"
+                    + "Authorisation at the OSM server failed.<br>"
+                    + "The server reported the following error:<br>"
+                    + "''{0}''"
+                    + "</html>",
+                    msg
+            );
+        } else {
+            return tr("<html>"
+                    + "Authorisation at the OSM server failed.<br>"
+                    + "</html>"
+            );
+        }
     }
 
