Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 11830)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 11831)
@@ -1161,8 +1161,13 @@
 
             Rectangle2D sourceRect = coordinateConverter.getRectangleForTile(tile);
-            if (!sourceRect.intersects(borderRect)) {
+            Rectangle2D clipRect;
+            if (tileSource.isInside(tile, border)) {
+                clipRect = null;
+            } else if (tileSource.isInside(border, tile)) {
+                clipRect = borderRect;
+            } else {
                 continue;
             }
-            drawImageInside(g, img, sourceRect, borderRect);
+            drawImageInside(g, img, sourceRect, clipRect);
         }
         return missedTiles;
@@ -1271,4 +1276,9 @@
         }
 
+        protected TileSet(TileRange range) {
+            super(range);
+            sanitize();
+        }
+
         /**
          * null tile set
@@ -1590,7 +1600,5 @@
                     continue;
                 }
-                Tile t2 = tempCornerTile(missed);
-                TileSet ts2 = getTileSet(getShiftedLatLon(tileSource.tileXYToLatLon(missed)),
-                                         getShiftedLatLon(tileSource.tileXYToLatLon(t2)), newzoom);
+                TileSet ts2 = new TileSet(tileSource.getCoveringTileRange(missed, newzoom));
                 // Instantiating large TileSets is expensive. If there are no loaded tiles, don't bother even trying.
                 if (ts2.allLoadedTiles().isEmpty()) {
