Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 8734)
@@ -168,5 +168,5 @@
      * and sequential.
      */
-    public static final ExecutorService worker = new ProgressMonitorExecutor();
+    public static final ExecutorService worker = new ProgressMonitorExecutor("main-worker-%d", Thread.NORM_PRIORITY);
 
     /**
@@ -625,6 +625,7 @@
 
         try {
-            for (Future<Void> i : Executors.newFixedThreadPool(
-                    Runtime.getRuntime().availableProcessors()).invokeAll(tasks)) {
+            final ExecutorService service = Executors.newFixedThreadPool(
+                    Runtime.getRuntime().availableProcessors(), Utils.newThreadFactory("main-init-%d", Thread.NORM_PRIORITY));
+            for (Future<Void> i : service.invokeAll(tasks)) {
                 i.get();
             }
Index: trunk/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java	(revision 8734)
@@ -77,5 +77,5 @@
             // make queue of LIFO type - so recently requested tiles will be loaded first (assuming that these are which user is waiting to see)
             new LinkedBlockingDeque<Runnable>(),
-            Utils.getNamedThreadFactory("JCS downloader")
+            Utils.newThreadFactory("JCS-downloader-%d", Thread.NORM_PRIORITY)
             );
 
Index: trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java	(revision 8734)
@@ -50,5 +50,5 @@
      * and for TMS imagery
      */
-    private static ThreadPoolExecutor DEFAULT_DOWNLOAD_JOB_DISPATCHER = getNewThreadPoolExecutor("TMS downloader");
+    private static ThreadPoolExecutor DEFAULT_DOWNLOAD_JOB_DISPATCHER = getNewThreadPoolExecutor("TMS-downloader-%d");
 
 
@@ -74,9 +74,9 @@
 
     /**
-     * @param name name of the threads
+     * @param nameFormat see {@link Utils#newThreadFactory(String, int)}
      * @param workers number of worker thread to keep
      * @return new ThreadPoolExecutor that will use a @see HostLimitQueue based queue
      */
-    public static ThreadPoolExecutor getNewThreadPoolExecutor(String name, int workers) {
+    public static ThreadPoolExecutor getNewThreadPoolExecutor(String nameFormat, int workers) {
         return new ThreadPoolExecutor(
                 workers, // keep the thread number constant
@@ -85,5 +85,5 @@
                 TimeUnit.SECONDS,
                 new HostLimitQueue(HOST_LIMIT.get().intValue()),
-                Utils.getNamedThreadFactory(name)
+                Utils.newThreadFactory(nameFormat, Thread.NORM_PRIORITY)
                 );
     }
Index: trunk/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java	(revision 8734)
@@ -34,5 +34,5 @@
 
         super(listener, cache, connectTimeout, readTimeout, headers);
-        setDownloadExecutor(TMSCachedTileLoader.getNewThreadPoolExecutor("WMS downloader", THREAD_LIMIT.get()));
+        setDownloadExecutor(TMSCachedTileLoader.getNewThreadPoolExecutor("WMS-downloader-%d", THREAD_LIMIT.get()));
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java	(revision 8734)
@@ -32,5 +32,5 @@
 
     private static final Pair<Integer, ExecutorService> THREAD_POOL =
-            Utils.newThreadPool("multipolygon_creation.numberOfThreads");
+            Utils.newThreadPool("multipolygon_creation.numberOfThreads", "multipolygon-builder-%d", Thread.NORM_PRIORITY);
 
     /**
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 8734)
@@ -87,5 +87,5 @@
 
     private static final Pair<Integer, ExecutorService> THREAD_POOL =
-            Utils.newThreadPool("mappaint.StyledMapRenderer.style_creation.numberOfThreads");
+            Utils.newThreadPool("mappaint.StyledMapRenderer.style_creation.numberOfThreads", "styled-map-renderer-%d", Thread.NORM_PRIORITY);
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java	(revision 8734)
@@ -17,10 +17,10 @@
  *     ExecutorService executorService = ...
  *     SaveLayerTask task = new SaveLayerTask(layer, monitor);
- *     Future&lt;?&gt; taskFuture = executorServce.submit(task)
+ *     Future&lt;?&gt; taskFuture = executorService.submit(task)
  *     try {
  *        // wait for the task to complete
  *        taskFuture.get();
  *     } catch (Exception e) {
- *        e.printStackTracek();
+ *        e.printStackTrace();
  *     }
  * </pre>
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 8734)
@@ -51,4 +51,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
 
@@ -445,5 +446,5 @@
             this.model = model;
             this.monitor = monitor;
-            this.worker = Executors.newSingleThreadExecutor();
+            this.worker = Executors.newSingleThreadExecutor(Utils.newThreadFactory(getClass() + "-%d", Thread.NORM_PRIORITY));
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java	(revision 8734)
@@ -31,10 +31,10 @@
  *     ExecutorService executorService = ...
  *     UploadLayerTask task = new UploadLayerTask(layer, monitor);
- *     Future&lt;?&gt; taskFuture = executorServce.submit(task)
+ *     Future&lt;?&gt; taskFuture = executorService.submit(task)
  *     try {
  *        // wait for the task to complete
  *        taskFuture.get();
  *     } catch (Exception e) {
- *        e.printStackTracek();
+ *        e.printStackTrace();
  *     }
  * </pre>
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 8734)
@@ -37,5 +37,4 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
 
 import javax.swing.Action;
@@ -95,12 +94,6 @@
 
     boolean useThumbs = false;
-    private ExecutorService thumbsLoaderExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
-        @Override
-        public Thread newThread(Runnable r) {
-            Thread t = new Thread(r);
-            t.setPriority(Thread.MIN_PRIORITY);
-            return t;
-        }
-    });
+    private ExecutorService thumbsLoaderExecutor =
+            Executors.newSingleThreadExecutor(Utils.newThreadFactory("thumbnail-loader-%d", Thread.MIN_PRIORITY));
     private ThumbsLoader thumbsloader;
     private boolean thumbsLoaderRunning = false;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java	(revision 8734)
@@ -48,4 +48,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Pair;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -133,5 +134,6 @@
     }
 
-    private final transient ExecutorService executor = Executors.newSingleThreadExecutor();
+    private final transient ExecutorService executor =
+            Executors.newSingleThreadExecutor(Utils.newThreadFactory(getClass() + "-%d", Thread.NORM_PRIORITY));
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/gui/progress/ProgressMonitorExecutor.java	(revision 8734)
@@ -7,4 +7,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -16,7 +17,13 @@
 public class ProgressMonitorExecutor extends ThreadPoolExecutor {
 
-    public ProgressMonitorExecutor() {
+    /**
+     * Creates a new {@code ProgressMonitorExecutor}
+     * @param nameFormat see {@link Utils#newThreadFactory(String, int)}
+     * @param threadPriority see {@link Utils#newThreadFactory(String, int)}
+     */
+    public ProgressMonitorExecutor(final String nameFormat, final int threadPriority) {
         super(1, 1, 0L, TimeUnit.MILLISECONDS,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                Utils.newThreadFactory(nameFormat, threadPriority));
     }
 
Index: trunk/src/org/openstreetmap/josm/io/MessageNotifier.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/io/MessageNotifier.java	(revision 8734)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.io.auth.JosmPreferencesCredentialAgent;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -46,5 +47,6 @@
     public static final IntegerProperty PROP_INTERVAL = new IntegerProperty("message.notifier.interval", 5);
 
-    private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor();
+    private static final ScheduledExecutorService EXECUTOR =
+            Executors.newSingleThreadScheduledExecutor(Utils.newThreadFactory("message-notifier-%d", Thread.NORM_PRIORITY));
 
     private static final Runnable WORKER = new Worker();
Index: trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java	(revision 8734)
@@ -38,4 +38,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -336,5 +337,5 @@
         progressMonitor.setTicksCount(ids.size());
         progressMonitor.setTicks(0);
-        // The complete set containg all primitives to fetch
+        // The complete set containing all primitives to fetch
         Set<Long> toFetch = new HashSet<>(ids);
         // Build a list of fetchers that will  download smaller sets containing only MAX_IDS_PER_REQUEST (200) primitives each.
@@ -342,5 +343,5 @@
         int threadsNumber = Main.pref.getInteger("osm.download.threads", OsmApi.MAX_DOWNLOAD_THREADS);
         threadsNumber = Math.min(Math.max(threadsNumber, 1), OsmApi.MAX_DOWNLOAD_THREADS);
-        Executor exec = Executors.newFixedThreadPool(threadsNumber);
+        Executor exec = Executors.newFixedThreadPool(threadsNumber, Utils.newThreadFactory(getClass() + "-%d", Thread.NORM_PRIORITY));
         CompletionService<FetchResult> ecs = new ExecutorCompletionService<>(exec);
         List<Future<FetchResult>> jobs = new ArrayList<>();
Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 8734)
@@ -813,5 +813,5 @@
         try {
             ReadLocalPluginInformationTask task = new ReadLocalPluginInformationTask(monitor);
-            ExecutorService service = Executors.newSingleThreadExecutor();
+            ExecutorService service = Executors.newSingleThreadExecutor(Utils.newThreadFactory("plugin-loader-%d", Thread.NORM_PRIORITY));
             Future<?> future = service.submit(task);
             try {
@@ -970,5 +970,5 @@
         try {
             monitor.beginTask("");
-            ExecutorService service = Executors.newSingleThreadExecutor();
+            ExecutorService service = Executors.newSingleThreadExecutor(Utils.newThreadFactory("plugin-updater-%d", Thread.NORM_PRIORITY));
 
             // try to download the plugin lists
Index: trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 8734)
@@ -198,5 +198,6 @@
     private static final Map<Image, Map<Long, ImageResource>> ROTATE_CACHE = new HashMap<>();
 
-    private static final ExecutorService IMAGE_FETCHER = Executors.newSingleThreadExecutor();
+    private static final ExecutorService IMAGE_FETCHER =
+            Executors.newSingleThreadExecutor(Utils.newThreadFactory("image-fetcher-%d", Thread.NORM_PRIORITY));
 
     /**
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 8733)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 8734)
@@ -47,4 +47,5 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -1268,13 +1269,34 @@
 
     /**
+     * Creates a new {@link ThreadFactory} which creates threads with names according to {@code nameFormat}.
+     * @param nameFormat a {@link String#format(String, Object...)} compatible name format; its first argument is a unique thread index
+     * @param threadPriority the priority of the created threads, see {@link Thread#setPriority(int)}
+     * @return a new {@link ThreadFactory}
+     */
+    public static ThreadFactory newThreadFactory(final String nameFormat, final int threadPriority) {
+        final String ignore = String.format(Locale.ENGLISH, nameFormat, 0);// fail fast
+        return new ThreadFactory() {
+            final AtomicLong count = new AtomicLong(0);
+            @Override
+            public Thread newThread(final Runnable runnable) {
+                final Thread thread = new Thread(runnable, String.format(Locale.ENGLISH, nameFormat, count.getAndIncrement()));
+                thread.setPriority(threadPriority);
+                return thread;
+            }
+        };
+    }
+
+    /**
      * Returns a pair containing the number of threads (n), and a thread pool (if n > 1) to perform
      * multi-thread computation in the context of the given preference key.
      * @param pref The preference key
+     * @param nameFormat see {@link #newThreadFactory(String, int)}
+     * @param threadPriority see {@link #newThreadFactory(String, int)}
      * @return a pair containing the number of threads (n), and a thread pool (if n > 1, null otherwise)
      * @since 7423
      */
-    public static Pair<Integer, ExecutorService> newThreadPool(String pref) {
+    public static Pair<Integer, ExecutorService> newThreadPool(String pref, String nameFormat, int threadPriority) {
         int noThreads = Main.pref.getInteger(pref, Runtime.getRuntime().availableProcessors());
-        ExecutorService pool = noThreads <= 1 ? null : Executors.newFixedThreadPool(noThreads);
+        ExecutorService pool = noThreads <= 1 ? null : Executors.newFixedThreadPool(noThreads, newThreadFactory(nameFormat, threadPriority));
         return new Pair<>(noThreads, pool);
     }
@@ -1427,18 +1449,3 @@
         return hashMapInitialCapacity(nEntries, 0.75f);
     }
-
-    /**
-     * @param name to be set for the threads
-     * @return Thread Factory returning named threads
-     */
-    public static ThreadFactory getNamedThreadFactory(final String name) {
-        return new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = Executors.defaultThreadFactory().newThread(r);
-                t.setName(name);
-                return t;
-            }
-        };
-    }
 }
