Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 6838)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 6839)
@@ -380,5 +380,5 @@
         if (!pluginsToLoad.isEmpty() && PluginHandler.checkAndConfirmPluginUpdate(splash)) {
             monitor.subTask(tr("Updating plugins"));
-            pluginsToLoad = PluginHandler.updatePlugins(splash, null, monitor.createSubTaskMonitor(1, false));
+            pluginsToLoad = PluginHandler.updatePlugins(splash, null, monitor.createSubTaskMonitor(1, false), false);
         }
 
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 6838)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 6839)
@@ -122,5 +122,5 @@
         });
     }
-    
+
     private PluginHandler() {
         // Hide default constructor for utils classes
@@ -210,5 +210,5 @@
         }
     }
-    
+
     private static PluginDownloadTask pluginDownloadTask = null;
 
@@ -825,8 +825,9 @@
      * @param pluginsWanted the collection of plugins to update. Updates all plugins if {@code null}
      * @param monitor the progress monitor. Defaults to {@link NullProgressMonitor#INSTANCE} if null.
+     * @param displayErrMsg if {@code true}, a blocking error message is displayed in case of I/O exception.
      * @throws IllegalArgumentException thrown if plugins is null
      */
     public static Collection<PluginInformation> updatePlugins(Component parent,
-            Collection<PluginInformation> pluginsWanted, ProgressMonitor monitor)
+            Collection<PluginInformation> pluginsWanted, ProgressMonitor monitor, boolean displayErrMsg)
             throws IllegalArgumentException {
         Collection<PluginInformation> plugins = null;
@@ -843,5 +844,5 @@
             ReadRemotePluginInformationTask task1 = new ReadRemotePluginInformationTask(
                     monitor.createSubTaskMonitor(1,false),
-                    Main.pref.getPluginSites()
+                    Main.pref.getPluginSites(), displayErrMsg
             );
             Future<?> future = service.submit(task1);
@@ -852,5 +853,5 @@
                 allPlugins = task1.getAvailablePlugins();
                 plugins = buildListOfPluginsToLoad(parent,monitor.createSubTaskMonitor(1, false));
-                // If only some plugins have to be updated, filter the list 
+                // If only some plugins have to be updated, filter the list
                 if (pluginsWanted != null && !pluginsWanted.isEmpty()) {
                     for (Iterator<PluginInformation> it = plugins.iterator(); it.hasNext();) {
@@ -951,5 +952,5 @@
     /**
      * Ask the user for confirmation that a plugin shall be disabled.
-     * 
+     *
      * @param parent The parent component to be used for the displayed dialog
      * @param reason the reason for disabling the plugin
@@ -1233,5 +1234,5 @@
         case 0:
             // update the plugin
-            updatePlugins(Main.parent, Collections.singleton(pluginInfo), null);
+            updatePlugins(Main.parent, Collections.singleton(pluginInfo), null, true);
             return pluginDownloadTask;
         case 1:
Index: /trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 6838)
+++ /trunk/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java	(revision 6839)
@@ -55,14 +55,15 @@
     private HttpURLConnection connection;
     private List<PluginInformation> availablePlugins;
+    private boolean displayErrMsg;
 
     protected enum CacheType {PLUGIN_LIST, ICON_LIST}
 
-    protected void init(Collection<String> sites){
+    protected void init(Collection<String> sites, boolean displayErrMsg){
         this.sites = sites;
         if (sites == null) {
             this.sites = Collections.emptySet();
         }
-        availablePlugins = new LinkedList<PluginInformation>();
-
+        this.availablePlugins = new LinkedList<PluginInformation>();
+        this.displayErrMsg = displayErrMsg;
     }
     /**
@@ -73,5 +74,5 @@
     public ReadRemotePluginInformationTask(Collection<String> sites) {
         super(tr("Download plugin list..."), false /* don't ignore exceptions */);
-        init(sites);
+        init(sites, true);
     }
 
@@ -81,8 +82,9 @@
      * @param monitor the progress monitor. Defaults to {@link NullProgressMonitor#INSTANCE} if null
      * @param sites the collection of download sites. Defaults to the empty collection if null.
-     */
-    public ReadRemotePluginInformationTask(ProgressMonitor monitor, Collection<String> sites) {
+     * @param displayErrMsg if {@code true}, a blocking error message is displayed in case of I/O exception.
+     */
+    public ReadRemotePluginInformationTask(ProgressMonitor monitor, Collection<String> sites, boolean displayErrMsg) {
         super(tr("Download plugin list..."), monitor == null ? NullProgressMonitor.INSTANCE: monitor, false /* don't ignore exceptions */);
-        init(sites);
+        init(sites, displayErrMsg);
     }
 
@@ -153,15 +155,15 @@
     protected String downloadPluginList(String site, final ProgressMonitor monitor) {
         BufferedReader in = null;
-        String line;
+
+        /* replace %<x> with empty string or x=plugins (separated with comma) */
+        String pl = Utils.join(",", Main.pref.getCollection("plugins"));
+        String printsite = site.replaceAll("%<(.*)>", "");
+        if (pl != null && pl.length() != 0) {
+            site = site.replaceAll("%<(.*)>", "$1"+pl);
+        } else {
+            site = printsite;
+        }
+
         try {
-            /* replace %<x> with empty string or x=plugins (separated with comma) */
-            String pl = Utils.join(",", Main.pref.getCollection("plugins"));
-            String printsite = site.replaceAll("%<(.*)>", "");
-            if(pl != null && pl.length() != 0) {
-                site = site.replaceAll("%<(.*)>", "$1"+pl);
-            } else {
-                site = printsite;
-            }
-
             monitor.beginTask("");
             monitor.indeterminateSubTask(tr("Downloading plugin list from ''{0}''", printsite));
@@ -175,4 +177,5 @@
             in = new BufferedReader(new InputStreamReader(connection.getInputStream(), Utils.UTF_8));
             StringBuilder sb = new StringBuilder();
+            String line;
             while ((line = in.readLine()) != null) {
                 sb.append(line).append("\n");
@@ -185,5 +188,6 @@
         } catch (IOException e) {
             if (canceled) return null;
-            handleIOException(monitor, e, tr("Plugin list download error"), tr("JOSM failed to download plugin list:"));
+            Main.addNetworkError(site, e);
+            handleIOException(monitor, e, tr("Plugin list download error"), tr("JOSM failed to download plugin list:"), displayErrMsg);
             return null;
         } finally {
@@ -198,6 +202,6 @@
         }
     }
-    
-    private void handleIOException(final ProgressMonitor monitor, IOException e, final String title, String firstMessage) {
+
+    private void handleIOException(final ProgressMonitor monitor, IOException e, final String title, final String firstMessage, boolean displayMsg) {
         InputStream errStream = connection.getErrorStream();
         StringBuilder sb = new StringBuilder();
@@ -219,10 +223,20 @@
         final String msg = e.getMessage();
         final String details = sb.toString();
-        Main.error(details.isEmpty() ? msg : msg + " - Details:\n" + details);
-        
+        if (details.isEmpty()) {
+            Main.error(e.getClass().getSimpleName()+": " + msg);
+        } else {
+            Main.error(msg + " - Details:\n" + details);
+        }
+
+        if (displayMsg) {
+            displayErrorMessage(monitor, msg, details, title, firstMessage);
+        }
+    }
+
+    private void displayErrorMessage(final ProgressMonitor monitor, final String msg, final String details, final String title, final String firstMessage) {
         GuiHelper.runInEDTAndWait(new Runnable() {
             @Override public void run() {
                 JPanel panel = new JPanel(new GridBagLayout());
-                panel.add(new JLabel(tr("JOSM failed to download plugin list:")), GBC.eol().insets(0, 0, 0, 10));
+                panel.add(new JLabel(firstMessage), GBC.eol().insets(0, 0, 0, 10));
                 StringBuilder b = new StringBuilder();
                 for (String part : msg.split("(?<=\\G.{200})")) {
@@ -277,5 +291,5 @@
         } catch (IOException e) {
             if (canceled) return;
-            handleIOException(monitor, e, tr("Plugin icons download error"), tr("JOSM failed to download plugin icons:"));
+            handleIOException(monitor, e, tr("Plugin icons download error"), tr("JOSM failed to download plugin icons:"), displayErrMsg);
             return;
         } finally {
