Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java	(revision 31052)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java	(revision 31053)
@@ -132,4 +132,5 @@
         File tileCacheDir;
         File tileFile = null;
+        File tagsFile = null;
         Long fileMtime = null;
         Long now = null; // current time in milliseconds (keep consistent value for the whole run)
@@ -155,8 +156,10 @@
             now = System.currentTimeMillis();
             tileCacheDir = getSourceCacheDir(tile.getSource());
+            tileFile = getTileFile();
+            tagsFile = getTagsFile();
 
             loadTagsFromFile();
 
-            if (isTileFileValid() && (isNoTileAtZoom() || loadTileFromFile())) {
+            if (isCacheValid() && (isNoTileAtZoom() || loadTileFromFile())) {
                 log.log(Level.FINE, "TMS - found in tile cache: {0}", tile);
                 tile.setLoaded(true);
@@ -287,5 +290,5 @@
         }
 
-        protected boolean isTileFileValid() {
+        protected boolean isCacheValid() {
             Long expires = null;
             try {
@@ -305,8 +308,12 @@
                     // so handle properly the case, when only tags file exists
                     fileMtime = tileFile.lastModified();
-                    if (now - fileMtime > DEFAULT_EXPIRES_TIME) {
-                        log.log(Level.FINE, "TMS - Tile has expired, maximum file age reached {0}", tile);
-                        return false;
-                    }
+                } else if (tagsFile.exists()) {
+                    fileMtime = tagsFile.lastModified();
+                } else
+                    return false;
+
+                if (now - fileMtime > DEFAULT_EXPIRES_TIME) {
+                    log.log(Level.FINE, "TMS - Tile has expired, maximum file age reached {0}", tile);
+                    return false;
                 }
             }
@@ -337,7 +344,7 @@
                 log.log(Level.WARNING, "TMS - Error while loading image from tile cache: {0}; {1}", new Object[]{e.getMessage(), tile});
                 tileFile.delete();
-                File tileMetaData = getTagsFile();
-                if (tileMetaData.exists())
-                    tileMetaData.delete();
+                if (tagsFile.exists()) {
+                    tagsFile.delete();
+                }
                 tileFile = null;
                 fileMtime = null;
@@ -454,5 +461,4 @@
 
         protected boolean loadTagsFromFile() {
-            tileFile = getTileFile();
             File tagsFile = getTagsFile();
             try (BufferedReader f = new BufferedReader(new InputStreamReader(new FileInputStream(tagsFile), TAGS_CHARSET))) {
