Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java	(revision 31141)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/Tile.java	(revision 31142)
@@ -336,4 +336,7 @@
 
     public Map<String,String> getMetadata() {
+        if (metadata == null) {
+            metadata = new HashMap<>();
+        }
         return metadata;
     }
Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java	(revision 31141)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java	(revision 31142)
@@ -73,8 +73,8 @@
     /**
      * A unique id for this tile source.
-     * 
+     *
      * Unlike the name it has to be unique and has to consist only of characters
      * valid for filenames.
-     * 
+     *
      * @return the id
      */
@@ -169,3 +169,11 @@
      */
     public boolean isNoTileAtZoom(Map<String, List<String>> headers, int statusCode, byte[] content);
+
+    /**
+     * Extracts metadata about the tile based on HTTP headers
+     *
+     * @param headers HTTP headers from Tile Source server
+     * @return tile metadata
+     */
+    public Map<String, String> getMetadata(Map<String, List<String>> headers);
 }
Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java	(revision 31141)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java	(revision 31142)
@@ -3,4 +3,5 @@
 
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -15,4 +16,5 @@
     protected String id;
     private Map<String, String> noTileHeaders;
+    private Map<String, String> metadataHeaders;
     protected int tileSize;
     protected OsmMercator osmMercator;
@@ -26,4 +28,5 @@
         this.id = info.getUrl();
         this.noTileHeaders = info.getNoTileHeaders();
+        this.metadataHeaders = info.getMetadataHeaders();
         this.tileSize = info.getTileSize();
         osmMercator = new OsmMercator(this.tileSize);
@@ -149,3 +152,19 @@
         return super.isNoTileAtZoom(headers, statusCode, content);
     }
+
+    @Override
+    public Map<String, String> getMetadata(Map<String, List<String>> headers) {
+        Map<String, String> ret = new HashMap<>();
+        if (metadataHeaders != null && headers != null) {
+            for (Entry<String, String> searchEntry: metadataHeaders.entrySet()) {
+                List<String> headerVals = headers.get(searchEntry.getKey());
+                if (headerVals != null) {
+                    for (String headerValue: headerVals) {
+                        ret.put(searchEntry.getValue(), headerValue);
+                    }
+                }
+            }
+        }
+        return ret;
+    }
 }
Index: /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java
===================================================================
--- /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java	(revision 31141)
+++ /applications/viewer/jmapviewer/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java	(revision 31142)
@@ -19,5 +19,5 @@
 
     /** headers meaning, that there is no tile at this zoom level */
-    protected Map<String, String> notileHeaders;
+    protected Map<String, String> noTileHeaders;
 
     /** minimum zoom level supported by the tile source */
@@ -32,4 +32,7 @@
     /** tile size of the displayed tiles */
     private int tileSize = OsmMercator.DEFAUL_TILE_SIZE;
+
+    /** mapping <header key, metadata key> */
+    protected Map<String, String> metadataHeaders;
 
     /**
@@ -82,5 +85,5 @@
      */
     public Map<String, String> getNoTileHeaders() {
-        return notileHeaders;
+        return noTileHeaders;
     }
 
@@ -127,3 +130,7 @@
         this.tileSize = tileSize;
     }
+
+    public Map<String, String> getMetadataHeaders() {
+        return metadataHeaders;
+    }
 }
