Index: trunk/src/org/openstreetmap/josm/gui/bugreport/BugReportDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/bugreport/BugReportDialog.java	(revision 17391)
+++ trunk/src/org/openstreetmap/josm/gui/bugreport/BugReportDialog.java	(revision 17392)
@@ -230,6 +230,6 @@
             return SuppressionMode.NONE;
         } else {
+            PluginDownloadTask downloadTask = PluginHandler.updateOrdisablePluginAfterException(e);
             return GuiHelper.runInEDTAndWaitAndReturn(() -> {
-                PluginDownloadTask downloadTask = PluginHandler.updateOrdisablePluginAfterException(e);
                 if (downloadTask != null) {
                     // Ask for restart to install new plugin
Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 17391)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 17392)
@@ -38,4 +38,5 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.TimeUnit;
@@ -954,12 +955,17 @@
         }
         try {
+            Map<String, PluginInformation> ret = new HashMap<>();
             ReadLocalPluginInformationTask task = new ReadLocalPluginInformationTask(monitor);
+            Future<?> future = MainApplication.worker.submit(task);
             try {
-                task.run();
-            } catch (RuntimeException e) { // NOPMD
+                future.get();
+            } catch (ExecutionException e) {
                 Logging.error(e);
-                return null;
-            }
-            Map<String, PluginInformation> ret = new HashMap<>();
+                return ret;
+            } catch (InterruptedException e) {
+                Logging.warn("InterruptedException in " + PluginHandler.class.getSimpleName()
+                        + " while loading locally available plugin information");
+                return ret;
+            }
             for (PluginInformation pi: task.getAvailablePlugins()) {
                 ret.put(pi.name, pi);
@@ -1118,9 +1124,11 @@
                     monitor.createSubTaskMonitor(1, false),
                     Preferences.main().getOnlinePluginSites(), displayErrMsg
-            );
-            task1.run();
-            List<PluginInformation> allPlugins = task1.getAvailablePlugins();
+                    );
+            List<PluginInformation> allPlugins = null;
+            Future<?> future = MainApplication.worker.submit(task1);
 
             try {
+                future.get();
+                allPlugins = task1.getAvailablePlugins();
                 plugins = buildListOfPluginsToLoad(parent, monitor.createSubTaskMonitor(1, false));
                 // If only some plugins have to be updated, filter the list
@@ -1129,7 +1137,10 @@
                     plugins = SubclassFilteredCollection.filter(plugins, pi -> pluginsWantedName.contains(pi.name));
                 }
-            } catch (RuntimeException e) { // NOPMD
-                Logging.warn(tr("Failed to download plugin information list"));
+            } catch (ExecutionException e) {
+                Logging.warn(tr("Failed to download plugin information list") + ": ExecutionException");
                 Logging.error(e);
+                // don't abort in case of error, continue with downloading plugins below
+            } catch (InterruptedException e) {
+                Logging.warn(tr("Failed to download plugin information list") + ": InterruptedException");
                 // don't abort in case of error, continue with downloading plugins below
             }
@@ -1170,9 +1181,16 @@
                         pluginsToDownload,
                         tr("Update plugins")
-                );
+                        );
+                future = MainApplication.worker.submit(pluginDownloadTask);
+
                 try {
-                    pluginDownloadTask.run();
-                } catch (RuntimeException e) { // NOPMD
+                    future.get();
+                } catch (ExecutionException e) {
                     Logging.error(e);
+                    alertFailedPluginUpdate(parent, pluginsToUpdate);
+                    return plugins;
+                } catch (InterruptedException e) {
+                    Logging.warn("InterruptedException in " + PluginHandler.class.getSimpleName()
+                            + " while updating plugins");
                     alertFailedPluginUpdate(parent, pluginsToUpdate);
                     return plugins;
