Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 10963)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 10964)
@@ -1547,4 +1547,5 @@
         public boolean hasOverzoomedTiles;
         public boolean hasLoadingTiles;
+        public boolean hasAllLoadedTiles;
     }
 
@@ -1557,4 +1558,5 @@
                 result.hasOverzoomedTiles = true;
             }
+            result.hasAllLoadedTiles &= t.isLoaded();
 
             if (t.isLoaded()) {
@@ -1670,5 +1672,6 @@
         // Too many tiles... refuse to download
         if (!ts.tooLarge()) {
-            //Main.debug("size: " + ts.size() + " spanned: " + ts.tilesSpanned());
+            // try to load tiles from desired zoom level, no matter what we will show (for example, tiles from previous zoom level
+            // on zoom in)
             ts.loadAllTiles(false);
         }
@@ -1676,4 +1679,13 @@
         if (displayZoomLevel != zoom) {
             ts = dts.getTileSet(displayZoomLevel);
+            if (!dts.getTileSetInfo(displayZoomLevel).hasAllLoadedTiles && displayZoomLevel < zoom) {
+                /*
+                 * if we are showing tiles from lower zoom level, ensure that all tiles are loaded
+                 * as they are few, and should not trash the tile cache
+                 * This is especially needed when dts.getTileSet(zoom).tooLarge() is true and we are
+                 * not loading tiles
+                 */
+                ts.loadAllTiles(false);
+            }
         }
 
