Index: /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 9620)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 9621)
@@ -98,4 +98,5 @@
         Collection<PluginInformation> downloaded = task.getDownloadedPlugins();
         Collection<PluginInformation> failed = task.getFailedPlugins();
+        Exception exception = task.getLastException();
         StringBuilder sb = new StringBuilder();
         if (!downloaded.isEmpty()) {
@@ -124,4 +125,8 @@
             }
             sb.append("</ul>");
+        }
+        if (exception != null) {
+            // Same i18n string in ExceptionUtil.explainBadRequest()
+            sb.append(tr("<br>Error message(untranslated): {0}", exception.getMessage()));
         }
         return sb.toString();
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadException.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadException.java	(revision 9620)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadException.java	(revision 9621)
@@ -2,20 +2,35 @@
 package org.openstreetmap.josm.plugins;
 
+/**
+ * Exception thrown during plugin download.
+ * @since 2817
+ */
 public class PluginDownloadException extends Exception {
 
-    public PluginDownloadException() {
-        super();
+    /**
+     * Constructs a new {@code PluginDownloadException} with the specified detail message and cause.
+     * @param message message the detail message (which is saved for later retrieval by the {@link #getMessage()} method).
+     * @param cause cause the cause (which is saved for later retrieval by the {@link #getCause()} method).
+     */
+    public PluginDownloadException(String message, Throwable cause) {
+        super(message, cause);
     }
 
-    public PluginDownloadException(String arg0, Throwable arg1) {
-        super(arg0, arg1);
+    /**
+     * Constructs a new {@code PluginDownloadException} with the specified detail message.
+     * The cause is not initialized, and may subsequently be initialized by a call to {@link #initCause}.
+     * @param message message the detail message (which is saved for later retrieval by the {@link #getMessage()} method).
+     */
+    public PluginDownloadException(String message) {
+        super(message);
     }
 
-    public PluginDownloadException(String arg0) {
-        super(arg0);
-    }
-
-    public PluginDownloadException(Throwable arg0) {
-        super(arg0);
+    /**
+     * Constructs a new {@code PluginDownloadException} with the specified cause and a detail message of
+     * <tt>(cause==null ? null : cause.toString())</tt> (which typically contains the class and detail message of <tt>cause</tt>).
+     * @param cause cause the cause (which is saved for later retrieval by the {@link #getCause()} method).
+     */
+    public PluginDownloadException(Throwable cause) {
+        super(cause);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadTask.java	(revision 9620)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadTask.java	(revision 9621)
@@ -30,5 +30,5 @@
  * When the task is finished {@link #getDownloadedPlugins()} replies the list of downloaded plugins
  * and {@link #getFailedPlugins()} replies the list of failed plugins.
- *
+ * @since 2817
  */
 public class PluginDownloadTask extends PleaseWaitRunnable {
@@ -43,4 +43,5 @@
     private final Collection<PluginInformation> failed = new LinkedList<>();
     private final Collection<PluginInformation> downloaded = new LinkedList<>();
+    private Exception lastException;
     private boolean canceled;
     private HttpClient downloadConnection;
@@ -97,5 +98,7 @@
 
     @Override
-    protected void finish() {}
+    protected void finish() {
+        // Do nothing. Error/success feedback is managed in PluginPreference.notifyDownloadResults()
+    }
 
     protected void download(PluginInformation pi, File file) throws PluginDownloadException {
@@ -150,5 +153,7 @@
         File pluginDir = Main.pref.getPluginsDirectory();
         if (!pluginDir.exists() && !pluginDir.mkdirs()) {
-            /*lastException =*/ new PluginDownloadException(tr("Failed to create plugin directory ''{0}''", pluginDir.toString()));
+            String message = tr("Failed to create plugin directory ''{0}''", pluginDir.toString());
+            lastException = new PluginDownloadException(message);
+            Main.error(message);
             failed.addAll(toUpdate);
             return;
@@ -156,5 +161,6 @@
         getProgressMonitor().setTicksCount(toUpdate.size());
         for (PluginInformation d : toUpdate) {
-            if (canceled) return;
+            if (canceled)
+                return;
             String message = tr("Downloading Plugin {0}...", d.name);
             Main.info(message);
@@ -165,4 +171,5 @@
                 download(d, pluginFile);
             } catch (PluginDownloadException e) {
+                lastException = e;
                 Main.error(e);
                 failed.add(d);
@@ -200,3 +207,12 @@
         return downloaded;
     }
+
+    /**
+     * Replies the last exception that occured during download, or {@code null}.
+     * @return the last exception that occured during download, or {@code null}
+     * @since 9621
+     */
+    public Exception getLastException() {
+        return lastException;
+    }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java	(revision 9620)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java	(revision 9621)
@@ -53,5 +53,6 @@
                 new PluginDownloadTask(NullProgressMonitor.INSTANCE, Arrays.asList(dummy), "")));
         assertEquals("The following plugin has been downloaded <strong>successfully</strong>:<ul><li>dummy_plugin (31772)</li></ul>"+
-                     "Downloading the following plugin has <strong>failed</strong>:<ul><li>dummy_plugin</li></ul>",
+                     "Downloading the following plugin has <strong>failed</strong>:<ul><li>dummy_plugin</li></ul>"+
+                     "<br>Error message(untranslated): test",
                 PluginPreference.buildDownloadSummary(
                         new PluginDownloadTask(NullProgressMonitor.INSTANCE, Arrays.asList(dummy), "") {
@@ -64,4 +65,9 @@
                     public Collection<PluginInformation> getDownloadedPlugins() {
                         return Collections.singleton(dummy);
+                    }
+
+                    @Override
+                    public Exception getLastException() {
+                        return new Exception("test");
                     }
                 }));
