Index: /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 5778)
+++ /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 5779)
@@ -32,4 +32,5 @@
 import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
+import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
 import org.openstreetmap.gui.jmapviewer.tilesources.MapQuestOpenAerialTileSource;
@@ -185,12 +186,5 @@
         super();
         TMSLayer.setMaxWorkers();
-        cachedLoader = null;
-        String cachePath = TMSLayer.PROP_TILECACHE_DIR.get();
-        if (cachePath != null && !cachePath.isEmpty()) {
-            try {
-                cachedLoader = new OsmFileCacheTileLoader(this, new File(cachePath));
-            } catch (IOException e) {
-            }
-        }
+        cachedLoader = TMSLayer.loaderFactory.makeTileLoader(this);
 
         uncachedLoader = new OsmTileLoader(this);
Index: /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 5778)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 5779)
@@ -118,8 +118,33 @@
     /*boolean debug = true;*/
 
+    public interface TileLoaderFactory {
+        OsmTileLoader makeTileLoader(TileLoaderListener listener);
+    }
+
     protected MemoryTileCache tileCache;
     protected TileSource tileSource;
     protected OsmTileLoader tileLoader;
-
+    
+    public static TileLoaderFactory loaderFactory = new TileLoaderFactory() {
+        @Override
+        public OsmTileLoader makeTileLoader(TileLoaderListener listener) {
+            String cachePath = TMSLayer.PROP_TILECACHE_DIR.get();
+            if (cachePath != null && !cachePath.isEmpty()) {
+                try {
+                    return new OsmFileCacheTileLoader(listener, new File(cachePath));
+                } catch (IOException e) {
+                }
+            }
+            return null;
+        }
+    };
+    
+    /**
+    * Plugins that wish to set custom tile loader should call this method
+    */
+    public static void setCustomTileLoaderFactory(TileLoaderFactory loaderFactory) {
+        TMSLayer.loaderFactory = loaderFactory;
+    }
+    
     HashSet<Tile> tileRequestsOutstanding = new HashSet<Tile>();
     @Override
@@ -380,12 +405,5 @@
         tileCache = new MemoryTileCache();
 
-        String cachePath = TMSLayer.PROP_TILECACHE_DIR.get();
-        tileLoader = null;
-        if (cachePath != null && !cachePath.isEmpty()) {
-            try {
-                tileLoader = new OsmFileCacheTileLoader(this, new File(cachePath));
-            } catch (IOException e) {
-            }
-        }
+        tileLoader = loaderFactory.makeTileLoader(this);
         if (tileLoader == null) {
             tileLoader = new OsmTileLoader(this);
