Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java	(revision 31465)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java	(revision 31472)
@@ -3,4 +3,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.ArrayList;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -36,4 +37,7 @@
   public static final int MANUAL = 2;
 
+  /** All the Threads that have been run. Used to interrupt them properly. */
+  private static ArrayList<Thread> threads = new ArrayList<>();
+
   /** Max area to be downloaded */
   public static final double MAX_AREA = Main.pref.getDouble(
@@ -45,5 +49,6 @@
   public final static String CLIENT_ID = "T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz";
   /** Executor that will run the petitions. */
-  private static ThreadPoolExecutor EXECUTOR;
+  private static ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(3, 5,
+      100, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50));
 
   /**
@@ -62,10 +67,9 @@
     queryStringParts.put("max_lat", maxLatLon.lat());
     queryStringParts.put("max_lon", maxLatLon.lon());
-    EXECUTOR = new ThreadPoolExecutor(3, 5, 100, TimeUnit.SECONDS,
-        new ArrayBlockingQueue<Runnable>(50));
     run(new MapillarySquareDownloadManagerThread(queryStringParts));
   }
 
   private static void run(Thread t) {
+    threads.add(t);
     EXECUTOR.execute(t);
   }
@@ -215,5 +219,17 @@
    */
   public static void stopAll() {
+    for (Thread t : threads) {
+      if (t.isAlive())
+        System.out.println(t);
+      t.interrupt();
+    }
+    threads.clear();
     EXECUTOR.shutdownNow();
+    try {
+      EXECUTOR.awaitTermination(30, TimeUnit.SECONDS);
+    } catch (InterruptedException e) {
+      // TODO Auto-generated catch block
+      e.printStackTrace();
+    }
     EXECUTOR = new ThreadPoolExecutor(3, 5, 100, TimeUnit.SECONDS,
         new ArrayBlockingQueue<Runnable>(50));
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31465)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31472)
@@ -30,4 +30,11 @@
   private final String sequenceQueryString;
   private final String signQueryString;
+
+  private ThreadPoolExecutor downloadExecutor = new ThreadPoolExecutor(3, 5,
+      25, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+  private ThreadPoolExecutor completeExecutor = new ThreadPoolExecutor(3, 5,
+      25, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+  private ThreadPoolExecutor signsExecutor = new ThreadPoolExecutor(3, 5, 25,
+      TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
 
   /**
@@ -78,5 +85,4 @@
     } finally {
       PluginState.finishDownload();
-      MapillaryUtils.updateHelpText();
     }
     MapillaryUtils.updateHelpText();
@@ -87,44 +93,56 @@
 
   private void downloadSequences() throws InterruptedException {
-    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS,
-        new ArrayBlockingQueue<Runnable>(5));
     int page = 0;
-    while (!ex.isShutdown()) {
-      ex.execute(new MapillarySequenceDownloadThread(ex,
-          this.sequenceQueryString + "&page=" + page + "&limit=10"));
-      while (ex.getQueue().remainingCapacity() == 0)
+    while (!this.downloadExecutor.isShutdown()) {
+      this.downloadExecutor.execute(new MapillarySequenceDownloadThread(
+          this.downloadExecutor, this.sequenceQueryString + "&page=" + page
+              + "&limit=10"));
+      while (this.downloadExecutor.getQueue().remainingCapacity() == 0)
         Thread.sleep(500);
       page++;
     }
-    ex.awaitTermination(15, TimeUnit.SECONDS);
+    this.downloadExecutor.awaitTermination(15, TimeUnit.SECONDS);
     MapillaryData.dataUpdated();
   }
 
   private void completeImages() throws InterruptedException {
-    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS,
-        new ArrayBlockingQueue<Runnable>(5));
     int page = 0;
-    while (!ex.isShutdown()) {
-      ex.execute(new MapillaryImageInfoDownloaderThread(ex,
-          this.imageQueryString + "&page=" + page + "&limit=20"));
-      while (ex.getQueue().remainingCapacity() == 0)
+    while (!this.completeExecutor.isShutdown()) {
+      this.completeExecutor.execute(new MapillaryImageInfoDownloaderThread(
+          this.completeExecutor, this.imageQueryString + "&page=" + page
+              + "&limit=20"));
+      while (this.completeExecutor.getQueue().remainingCapacity() == 0)
         Thread.sleep(100);
       page++;
     }
-    ex.awaitTermination(15, TimeUnit.SECONDS);
+    this.completeExecutor.awaitTermination(15, TimeUnit.SECONDS);
   }
 
   private void downloadSigns() throws InterruptedException {
-    ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25, TimeUnit.SECONDS,
-        new ArrayBlockingQueue<Runnable>(5));
     int page = 0;
-    while (!ex.isShutdown()) {
-      ex.execute(new MapillaryTrafficSignDownloaderThread(ex,
-          this.signQueryString + "&page=" + page + "&limit=20"));
-      while (ex.getQueue().remainingCapacity() == 0)
+    while (!this.signsExecutor.isShutdown()) {
+      this.signsExecutor.execute(new MapillaryTrafficSignDownloaderThread(
+          this.signsExecutor, this.signQueryString + "&page=" + page
+              + "&limit=20"));
+      while (this.signsExecutor.getQueue().remainingCapacity() == 0)
         Thread.sleep(100);
       page++;
     }
-    ex.awaitTermination(15, TimeUnit.SECONDS);
+    this.signsExecutor.awaitTermination(15, TimeUnit.SECONDS);
+  }
+
+  @Override
+  public void interrupt() {
+    super.interrupt();
+    this.downloadExecutor.shutdownNow();
+    this.completeExecutor.shutdownNow();
+    this.signsExecutor.shutdownNow();
+    try {
+      this.downloadExecutor.awaitTermination(15, TimeUnit.SECONDS);
+      this.completeExecutor.awaitTermination(15, TimeUnit.SECONDS);
+      this.signsExecutor.awaitTermination(15, TimeUnit.SECONDS);
+    } catch (InterruptedException e) {
+      Main.error(e);
+    }
   }
 }
