Index: trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 4984)
+++ trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 4985)
@@ -20,6 +20,12 @@
 import java.io.StringReader;
 import java.net.URL;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Scanner;
 import java.util.concurrent.Callable;
 import java.util.regex.Matcher;
@@ -39,4 +45,5 @@
 import org.openstreetmap.gui.jmapviewer.MemoryTileCache;
 import org.openstreetmap.gui.jmapviewer.OsmFileCacheTileLoader;
+import org.openstreetmap.gui.jmapviewer.OsmFileCacheTileLoader.TileClearController;
 import org.openstreetmap.gui.jmapviewer.OsmTileLoader;
 import org.openstreetmap.gui.jmapviewer.Tile;
@@ -64,9 +71,14 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
 import org.openstreetmap.josm.io.CacheCustomContent;
+import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.io.UTFInputStreamReader;
 import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 /**
@@ -137,10 +149,51 @@
         return tileCache;
     }
-
-    void clearTileCache()
+    
+    private class TmsTileClearController implements TileClearController, CancelListener {
+
+        private final ProgressMonitor monitor;
+        private boolean cancel = false;
+        
+        public TmsTileClearController(ProgressMonitor monitor) {
+            this.monitor = monitor;
+            this.monitor.addCancelListener(this);
+        }
+
+        @Override
+        public void initClearDir(File dir) {
+        }
+
+        @Override
+        public void initClearFiles(File[] files) {
+            monitor.setTicksCount(files.length);
+            monitor.setTicks(0);
+        }
+
+        @Override
+        public boolean cancel() {
+            return cancel;
+        }
+
+        @Override
+        public void fileDeleted(File file) {
+            monitor.setTicks(monitor.getTicks()+1);
+        }
+
+        @Override
+        public void clearFinished() {
+            monitor.finishTask();
+        }
+
+        @Override
+        public void operationCanceled() {
+            cancel = true;
+        }
+    }
+
+    void clearTileCache(ProgressMonitor monitor)
     {
         tileCache.clear();
         if (tileLoader instanceof OsmFileCacheTileLoader) {
-            ((OsmFileCacheTileLoader)tileLoader).clearCache(tileSource);
+            ((OsmFileCacheTileLoader)tileLoader).clearCache(tileSource, new TmsTileClearController(monitor));
         }
     }
@@ -512,5 +565,21 @@
                     @Override
                     public void actionPerformed(ActionEvent ae) {
-                        clearTileCache();
+                        new PleaseWaitRunnable(tr("Flush Tile Cache")) {
+                            
+                            @Override
+                            protected void realRun() throws SAXException, IOException,
+                                    OsmTransferException {
+                                clearTileCache(getProgressMonitor());
+                            }
+                            
+                            @Override
+                            protected void finish() {
+                            }
+                            
+                            @Override
+                            protected void cancel() {
+                            }
+                        }.run();
+                        
                     }
                 }));
