Index: /trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java	(revision 17974)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java	(revision 17975)
@@ -165,4 +165,5 @@
     public void shutdown() {
         if (!downloadExecutor.equals(DEFAULT_DOWNLOAD_JOB_DISPATCHER)) {
+            cancelOutstandingTasks();
             downloadExecutor.shutdown();
         }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 17974)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 17975)
@@ -1829,5 +1829,5 @@
     /**
      * Task responsible for precaching imagery along the gpx track
-     *
+     * @since 8526
      */
     public class PrecacheTask implements TileLoaderListener {
@@ -1850,5 +1850,5 @@
             if (this.tileLoader instanceof TMSCachedTileLoader) {
                 ((TMSCachedTileLoader) this.tileLoader).setDownloadExecutor(
-                        TMSCachedTileLoader.getNewThreadPoolExecutor("Precache downloader"));
+                        TMSCachedTileLoader.getNewThreadPoolExecutor("precache-downloader-%d"));
             }
             requestedTiles = new ConcurrentSkipListSet<>(
@@ -1874,5 +1874,4 @@
             this.totalCount = requestedTiles.size();
             this.progressMonitor.setTicksCount(requestedTiles.size());
-
         }
 
@@ -1897,9 +1896,5 @@
          */
         public void cancel() {
-            if (tileLoader instanceof TMSCachedTileLoader) {
-                TMSCachedTileLoader cachedTileLoader = (TMSCachedTileLoader) tileLoader;
-                cachedTileLoader.cancelOutstandingTasks();
-                cachedTileLoader.shutdown();
-            }
+            shutdownTmsTileLoader();
         }
 
@@ -1917,17 +1912,13 @@
                 Logging.warn("Tile loading failure: " + tile + " - " + tile.getErrorMessage());
             }
+            if (isFinished()) {
+                shutdownTmsTileLoader();
+            }
+        }
+
+        private void shutdownTmsTileLoader() {
             if (tileLoader instanceof TMSCachedTileLoader) {
-                TMSCachedTileLoader cachedTileLoader = (TMSCachedTileLoader) tileLoader;
-                cachedTileLoader.cancelOutstandingTasks();
-                cachedTileLoader.shutdown();
-            }
-        }
-
-        /**
-         * Returns tile loader that is used to load the tiles.
-         * @return tile loader that is used to load the tiles
-         */
-        public TileLoader getTileLoader() {
-            return tileLoader;
+                ((TMSCachedTileLoader) tileLoader).shutdown();
+            }
         }
 
@@ -1936,11 +1927,9 @@
          */
         public void run() {
-            TileLoader loader = getTileLoader();
             for (Tile t: requestedTiles) {
                 if (!progressMonitor.isCanceled()) {
-                    loader.createTileLoaderJob(t).submit();
-                }
-            }
-
+                    tileLoader.createTileLoaderJob(t).submit();
+                }
+            }
         }
     }
@@ -1993,6 +1982,5 @@
         adjustAction.destroy();
         if (tileLoader instanceof TMSCachedTileLoader) {
-            TMSCachedTileLoader cachedTileLoader = (TMSCachedTileLoader) tileLoader;
-            cachedTileLoader.shutdown();
+            ((TMSCachedTileLoader) tileLoader).shutdown();
         }
     }
