Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java	(revision 26253)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java	(revision 26508)
@@ -15,4 +15,5 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
+import java.lang.Thread;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -20,4 +21,5 @@
 import java.nio.charset.Charset;
 import java.util.Map.Entry;
+import java.util.Random;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -132,6 +134,8 @@
             synchronized (cache) {
                 tile = cache.getTile(source, tilex, tiley, zoom);
-                if (tile == null || tile.isLoaded() || tile.loading)
+                if (tile == null || (tile.isLoaded() && !tile.hasError()) || tile.loading)
                     return;
+                tile.loaded = false;
+                tile.error = false;
                 tile.loading = true;
             }
@@ -156,5 +160,4 @@
 
         protected void loadOrUpdateTile() {
-
             try {
                 // log.finest("Loading tile from OSM: " + tile);
@@ -210,10 +213,17 @@
                     listener.tileLoadingFinished(tile, true);
                 } else {
-                    byte[] buffer = loadTileInBuffer(urlConn);
-                    if (buffer != null) {
-                        tile.loadImage(new ByteArrayInputStream(buffer));
-                        tile.setLoaded(true);
-                        listener.tileLoadingFinished(tile, true);
-                        saveTileToFile(buffer);
+                    for(int i = 0; i < 5; ++i) {
+                        if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 503) {
+                            Thread.sleep(5000+(new Random()).nextInt(5000));
+                            continue;
+                        }
+                        byte[] buffer = loadTileInBuffer(urlConn);
+                        if (buffer != null) {
+                            tile.loadImage(new ByteArrayInputStream(buffer));
+                            tile.setLoaded(true);
+                            listener.tileLoadingFinished(tile, true);
+                            saveTileToFile(buffer);
+                            break;
+                        }
                     }
                 }
@@ -252,5 +262,4 @@
                 fileAge = tileFile.lastModified();
                 boolean oldTile = System.currentTimeMillis() - fileAge > maxCacheFileAge;
-                // System.out.println("Loaded from file: " + tile);
                 if (!oldTile) {
                     tile.setLoaded(true);
Index: applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java
===================================================================
--- applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java	(revision 26253)
+++ applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java	(revision 26508)
@@ -44,6 +44,8 @@
                 synchronized (cache) {
                     tile = cache.getTile(source, tilex, tiley, zoom);
-                    if (tile == null || tile.isLoaded() || tile.loading)
+                    if (tile == null || (tile.isLoaded() && !tile.hasError()) || tile.loading)
                         return;
+                    tile.loaded = false;
+                    tile.error = false;
                     tile.loading = true;
                 }
