Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 9411)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 9412)
@@ -17,9 +17,13 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
+import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.io.OfflineAccessException;
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.io.imagery.ImageryReader;
+import org.openstreetmap.josm.tools.Utils;
 import org.xml.sax.SAXException;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 /**
@@ -73,5 +77,5 @@
             Collections.sort(layers);
         }
-        loadDefaults(false);
+        loadDefaults(false, true);
     }
 
@@ -84,9 +88,48 @@
      *
      * @param clearCache if true, clear the cache and start a fresh download.
-     */
-    public void loadDefaults(boolean clearCache) {
-        defaultLayers.clear();
-        defaultLayerIds.clear();
-        for (String source : getImageryLayersSites()) {
+     * @param quiet whether not the loading should be performed using a {@link PleaseWaitRunnable} in the background
+     */
+    public void loadDefaults(boolean clearCache, boolean quiet) {
+        final DefaultEntryLoader loader = new DefaultEntryLoader(clearCache);
+        if (quiet) {
+            loader.realRun();
+            loader.finish();
+        } else {
+            Main.worker.execute(new DefaultEntryLoader(clearCache));
+        }
+    }
+
+    /**
+     * Loader/updater of the available imagery entries
+     */
+    class DefaultEntryLoader extends PleaseWaitRunnable {
+
+        private final boolean clearCache;
+        private final List<ImageryInfo> newLayers = new ArrayList<>();
+        private transient ImageryReader reader;
+        private transient boolean canceled;
+
+        DefaultEntryLoader(boolean clearCache) {
+            super(tr("Update default entries"));
+            this.clearCache = clearCache;
+        }
+
+        @Override
+        protected void cancel() {
+            canceled = true;
+            Utils.close(reader);
+        }
+
+        @Override
+        protected void realRun() {
+            for (String source : getImageryLayersSites()) {
+                if (canceled) {
+                    return;
+                }
+                loadSource(source);
+            }
+        }
+
+        protected void loadSource(String source) {
             boolean online = true;
             try {
@@ -100,7 +143,7 @@
             }
             try {
-                ImageryReader reader = new ImageryReader(source);
+                reader = new ImageryReader(source);
                 Collection<ImageryInfo> result = reader.parse();
-                defaultLayers.addAll(result);
+                newLayers.addAll(result);
             } catch (IOException ex) {
                 Main.error(ex, false);
@@ -109,11 +152,15 @@
             }
         }
-        while (defaultLayers.remove(null)) {
-            // Do nothing
-        }
-        Collections.sort(defaultLayers);
-        buildIdMap(defaultLayers, defaultLayerIds);
-        updateEntriesFromDefaults();
-        buildIdMap(layers, layerIds);
+
+        @Override
+        protected void finish() {
+            defaultLayers.clear();
+            defaultLayers.addAll(newLayers);
+            defaultLayerIds.clear();
+            Collections.sort(defaultLayers);
+            buildIdMap(defaultLayers, defaultLayerIds);
+            updateEntriesFromDefaults();
+            buildIdMap(layers, layerIds);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 9411)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 9412)
@@ -636,5 +636,5 @@
              */
             ReloadAction() {
-                putValue(SHORT_DESCRIPTION, tr("reload defaults"));
+                putValue(SHORT_DESCRIPTION, tr("Update default entries"));
                 putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
             }
@@ -642,5 +642,5 @@
             @Override
             public void actionPerformed(ActionEvent evt) {
-                layerInfo.loadDefaults(true);
+                layerInfo.loadDefaults(true, false);
                 defaultModel.fireTableDataChanged();
                 defaultTable.getSelectionModel().clearSelection();
Index: trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 9411)
+++ trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 9412)
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.io.imagery;
 
+import java.io.BufferedReader;
+import java.io.Closeable;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -28,7 +29,8 @@
 import org.xml.sax.helpers.DefaultHandler;
 
-public class ImageryReader {
+public class ImageryReader implements Closeable {
 
     private final String source;
+    private transient CachedFile cachedFile;
 
     private enum State {
@@ -53,9 +55,10 @@
         Parser parser = new Parser();
         try {
-            try (InputStream in = new CachedFile(source)
-                    .setMaxAge(1*CachedFile.DAYS)
+            cachedFile = new CachedFile(source);
+            try (BufferedReader in = cachedFile
+                    .setMaxAge(CachedFile.DAYS)
                     .setCachingStrategy(CachedFile.CachingStrategy.IfModifiedSince)
-                    .getInputStream()) {
-                InputSource is = new InputSource(UTFInputStreamReader.create(in));
+                    .getContentReader()) {
+                InputSource is = new InputSource(in);
                 Utils.parseSafeSAX(is, parser);
                 return parser.entries;
@@ -355,3 +358,8 @@
         }
     }
+
+    @Override
+    public void close() throws IOException {
+        Utils.close(cachedFile);
+    }
 }
