diff --git a/data/maps.xsd b/data/maps.xsd
index 2643b2d..308edd4 100644
--- a/data/maps.xsd
+++ b/data/maps.xsd
@@ -670,12 +670,15 @@
 									</xs:all>
 								</xs:complexType>
 							</xs:element>
+							<!-- list of HTTP headers, that indicate "no tile at this zoom level" situation -->
 							<xs:element name="no-tile-header" minOccurs="0" maxOccurs="unbounded">
 								<xs:complexType>
 									<xs:attribute name="name" type="xs:string" />
 									<xs:attribute name="value" type="xs:string" />
 								</xs:complexType>
 							</xs:element>
+							<!-- tile size provided by imagery source. Default - 256 -->
+							<xs:element name="tile-size" minOccurs="0" maxOccurs="1" type="xs:positiveInteger" />
 						</xs:choice>
 					</xs:sequence>
 					<xs:attribute name="last-check" type="xs:date" use="optional" />
diff --git a/src/org/openstreetmap/gui/jmapviewer/OsmMercator.java b/src/org/openstreetmap/gui/jmapviewer/OsmMercator.java
index 903ee25..ab08dd2 100644
--- a/src/org/openstreetmap/gui/jmapviewer/OsmMercator.java
+++ b/src/org/openstreetmap/gui/jmapviewer/OsmMercator.java
@@ -10,31 +10,55 @@ package org.openstreetmap.gui.jmapviewer;
  */
 public class OsmMercator {
 
-    public static int TILE_SIZE = 256;
+    /**
+     * default tile size
+     */
+    public static int DEFAUL_TILE_SIZE = 256;
     public static final double MAX_LAT = 85.05112877980659;
     public static final double MIN_LAT = -85.05112877980659;
     private static double EARTH_RADIUS = 6378137; // equatorial earth radius for EPSG:3857 (Mercator)
 
-    public static double radius(int aZoomlevel) {
-        return (TILE_SIZE * (1 << aZoomlevel)) / (2.0 * Math.PI);
+    /**
+     * instance with tile size of 256 for easy conversions
+     */
+    public static final OsmMercator MERCATOR_256 = new OsmMercator();
+
+    private int tileSize = DEFAUL_TILE_SIZE;
+
+    /**
+     * Creates instance with default tile size of 256
+     */
+    public OsmMercator() {
+    }
+
+    /**
+     * Creates instance with provided tile size.
+     * @param tileSize
+     */
+    public OsmMercator(int tileSize) {
+        this.tileSize = tileSize;
+    }
+
+    public double radius(int aZoomlevel) {
+        return (tileSize * (1 << aZoomlevel)) / (2.0 * Math.PI);
     }
 
     /**
      * Returns the absolut number of pixels in y or x, defined as: 2^Zoomlevel *
-     * TILE_WIDTH where TILE_WIDTH is the width of a tile in pixels
+     * tileSize where tileSize is the width of a tile in pixels
      *
      * @param aZoomlevel zoom level to request pixel data
      * @return number of pixels
      */
-    public static int getMaxPixels(int aZoomlevel) {
-        return TILE_SIZE * (1 << aZoomlevel);
+    public int getMaxPixels(int aZoomlevel) {
+        return tileSize * (1 << aZoomlevel);
     }
 
-    public static int falseEasting(int aZoomlevel) {
+    public int falseEasting(int aZoomlevel) {
         return getMaxPixels(aZoomlevel) / 2;
     }
 
-    public static int falseNorthing(int aZoomlevel) {
+    public int falseNorthing(int aZoomlevel) {
         return (-1 * getMaxPixels(aZoomlevel) / 2);
     }
 
@@ -50,7 +74,7 @@ public class OsmMercator {
      * @return the distance
      * @author Jason Huntley
      */
-    public static double getDistance(int x1, int y1, int x2, int y2, int zoomLevel) {
+    public double getDistance(int x1, int y1, int x2, int y2, int zoomLevel) {
         double la1 = YToLat(y1, zoomLevel);
         double lo1 = XToLon(x1, zoomLevel);
         double la2 = YToLat(y2, zoomLevel);
@@ -69,7 +93,7 @@ public class OsmMercator {
      * @return the distance
      * @author Jason Huntley
      */
-    public static double getDistance(double la1, double lo1, double la2, double lo2) {
+    public double getDistance(double la1, double lo1, double la2, double lo2) {
         double aStartLat = Math.toRadians(la1);
         double aStartLong = Math.toRadians(lo1);
         double aEndLat =Math.toRadians(la2);
@@ -100,7 +124,7 @@ public class OsmMercator {
      * @return [0..2^Zoomlevel*TILE_SIZE[
      * @author Jan Peter Stotz
      */
-    public static double LonToX(double aLongitude, int aZoomlevel) {
+    public double LonToX(double aLongitude, int aZoomlevel) {
         int mp = getMaxPixels(aZoomlevel);
         double x = (mp * (aLongitude + 180l)) / 360l;
         return Math.min(x, mp - 1);
@@ -124,7 +148,7 @@ public class OsmMercator {
      * @return [0..2^Zoomlevel*TILE_SIZE[
      * @author Jan Peter Stotz
      */
-    public static double LatToY(double aLat, int aZoomlevel) {
+    public double LatToY(double aLat, int aZoomlevel) {
         if (aLat < MIN_LAT)
             aLat = MIN_LAT;
         else if (aLat > MAX_LAT)
@@ -154,7 +178,7 @@ public class OsmMercator {
      * @return ]-180..180[
      * @author Jan Peter Stotz
      */
-    public static double XToLon(int aX, int aZoomlevel) {
+    public double XToLon(int aX, int aZoomlevel) {
         return ((360d * aX) / getMaxPixels(aZoomlevel)) - 180.0;
     }
 
@@ -165,7 +189,7 @@ public class OsmMercator {
      *            [0..2^Zoomlevel*TILE_WIDTH[
      * @return [MIN_LAT..MAX_LAT] is about [-85..85]
      */
-    public static double YToLat(int aY, int aZoomlevel) {
+    public double YToLat(int aY, int aZoomlevel) {
         aY += falseNorthing(aZoomlevel);
         double latitude = (Math.PI / 2) - (2 * Math.atan(Math.exp(-1.0 * aY / radius(aZoomlevel))));
         return -1 * Math.toDegrees(latitude);
diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java
index 9e44ea0..4842ae4 100644
--- a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java
+++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java
@@ -14,6 +14,8 @@ public abstract class AbstractTMSTileSource extends AbstractTileSource {
     protected String baseUrl;
     protected String id;
     private Map<String, String> noTileHeaders;
+    protected int tileSize;
+    protected OsmMercator osmMercator;
 
     public AbstractTMSTileSource(TileSourceInfo info) {
         this.name = info.getName();
@@ -23,6 +25,8 @@ public abstract class AbstractTMSTileSource extends AbstractTileSource {
         }
         this.id = info.getUrl();
         this.noTileHeaders = info.getNoTileHeaders();
+        this.tileSize = info.getTileSize();
+        osmMercator = new OsmMercator(this.tileSize);
     }
 
     @Override
@@ -80,52 +84,52 @@ public abstract class AbstractTMSTileSource extends AbstractTileSource {
      */
     @Override
     public int getTileSize() {
-        return OsmMercator.TILE_SIZE;
+        return tileSize;
     }
 
     @Override
     public double getDistance(double lat1, double lon1, double lat2, double lon2) {
-        return OsmMercator.getDistance(lat1, lon1, lat2, lon2);
+        return osmMercator.getDistance(lat1, lon1, lat2, lon2);
     }
 
     @Override
     public int LonToX(double lon, int zoom) {
-        return (int )OsmMercator.LonToX(lon, zoom);
+        return (int )osmMercator.LonToX(lon, zoom);
     }
 
     @Override
     public int LatToY(double lat, int zoom) {
-        return (int )OsmMercator.LatToY(lat, zoom);
+        return (int )osmMercator.LatToY(lat, zoom);
     }
 
     @Override
     public double XToLon(int x, int zoom) {
-        return OsmMercator.XToLon(x, zoom);
+        return osmMercator.XToLon(x, zoom);
     }
 
     @Override
     public double YToLat(int y, int zoom) {
-        return OsmMercator.YToLat(y, zoom);
+        return osmMercator.YToLat(y, zoom);
     }
 
     @Override
     public double latToTileY(double lat, int zoom) {
-        return OsmMercator.LatToY(lat, zoom) / OsmMercator.TILE_SIZE;
+        return osmMercator.LatToY(lat, zoom) / tileSize;
     }
 
     @Override
     public double lonToTileX(double lon, int zoom) {
-        return OsmMercator.LonToX(lon, zoom) / OsmMercator.TILE_SIZE;
+        return osmMercator.LonToX(lon, zoom) / tileSize;
     }
 
     @Override
     public double tileYToLat(int y, int zoom) {
-        return OsmMercator.YToLat(y * OsmMercator.TILE_SIZE, zoom);
+        return osmMercator.YToLat(y * tileSize, zoom);
     }
 
     @Override
     public double tileXToLon(int x, int zoom) {
-        return OsmMercator.XToLon(x * OsmMercator.TILE_SIZE, zoom);
+        return osmMercator.XToLon(x * tileSize, zoom);
     }
 
     @Override
diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java
index 6acd716..9f67568 100644
--- a/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java
+++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java
@@ -93,12 +93,12 @@ public class ScanexTileSource extends TMSTileSource {
 
     @Override
     public int LatToY(double lat, int zoom) {
-        return (int )(latToTileY(lat, zoom) * OsmMercator.TILE_SIZE);
+        return (int )(latToTileY(lat, zoom) * tileSize);
     }
 
     @Override
     public double YToLat(int y, int zoom) {
-        return tileYToLat((double )y / OsmMercator.TILE_SIZE, zoom);
+        return tileYToLat((double )y / tileSize, zoom);
     }
 
     @Override
diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java
index f5b342c..c45eb8b 100644
--- a/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java
+++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/TileSourceInfo.java
@@ -3,6 +3,8 @@ package org.openstreetmap.gui.jmapviewer.tilesources;
 
 import java.util.Map;
 
+import org.openstreetmap.gui.jmapviewer.OsmMercator;
+
 /**
  * Data class that keeps basic information about a tile source.
  */
@@ -27,6 +29,7 @@ public class TileSourceInfo {
     /** cookies that needs to be sent to tile source */
     protected String cookies;
 
+    private int tileSize = OsmMercator.DEFAUL_TILE_SIZE;
 
     /**
      * Create a TileSourceInfo class
@@ -104,4 +107,24 @@ public class TileSourceInfo {
         return cookies;
     }
 
+    /**
+     *
+     * @return tile size provided by this tile source
+     */
+    public int getTileSize() {
+        return tileSize;
+    }
+
+    /**
+     * sets the tile size provided by this tile source
+     * @param tileSize
+     */
+    public void setTileSize(int tileSize) {
+        if (tileSize <= 0) {
+            throw new AssertionError("Invalid tile size: " + tileSize);
+        }
+        this.tileSize = tileSize;
+    }
+
+
 }
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
index 608ebed..bc54b8b 100644
--- a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
+++ b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
@@ -18,6 +18,7 @@ import java.util.regex.Pattern;
 import javax.swing.ImageIcon;
 
 import org.openstreetmap.gui.jmapviewer.Coordinate;
+import org.openstreetmap.gui.jmapviewer.OsmMercator;
 import org.openstreetmap.gui.jmapviewer.interfaces.Attributed;
 import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTileSource;
 import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource.Mapnik;
@@ -224,6 +225,7 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
         @pref String icon;
         @pref String description;
         @pref Map<String, String> noTileHeaders;
+        @pref int tileSize = OsmMercator.DEFAUL_TILE_SIZE;
 
         /**
          * Constructs a new empty WMS {@code ImageryPreferenceEntry}.
@@ -280,6 +282,8 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
             if (i.noTileHeaders != null && !i.noTileHeaders.isEmpty()) {
                 noTileHeaders = i.noTileHeaders;
             }
+
+            tileSize = i.getTileSize();
         }
 
         @Override
@@ -401,6 +405,7 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
         if (e.noTileHeaders != null) {
             noTileHeaders = e.noTileHeaders;
         }
+        setTileSize(e.tileSize);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
index e6231a2..f835dfb 100644
--- a/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
+++ b/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
@@ -149,10 +149,15 @@ public class ImageryLayerInfo {
         Collection<String> newKnownDefaults = new TreeSet<>(knownDefaults);
         for (ImageryInfo def : defaultLayers) {
             // temporary migration code, so all user preferences will get updated with new settings from JOSM site (can be removed ~Dez. 2015)
-            if (def.getNoTileHeaders() != null) {
+            if (def.getNoTileHeaders() != null || def.getTileSize() > 0) {
                 for (ImageryInfo i: layers) {
                     if (isSimilar(def,  i)) {
-                        i.setNoTileHeaders(def.getNoTileHeaders());
+                        if (def.getNoTileHeaders() != null) {
+                            i.setNoTileHeaders(def.getNoTileHeaders());
+                        }
+                        if (def.getTileSize() > 0) {
+                            i.setTileSize(def.getTileSize());
+                        }
                         changed = true;
                     }
                 }
diff --git a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
index 7b41c59..c98d890 100644
--- a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
+++ b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
@@ -124,8 +124,8 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
     private transient Bounds bbox;
 
     // upper left and lower right corners of the selection rectangle (x/y on ZOOM_MAX)
-    private Point iSelectionRectStart;
-    private Point iSelectionRectEnd;
+    private Coordinate iSelectionRectStart;
+    private Coordinate iSelectionRectEnd;
 
     /**
      * Constructs a new {@code SlippyMapBBoxChooser}.
@@ -209,21 +209,14 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
 
             // draw selection rectangle
             if (iSelectionRectStart != null && iSelectionRectEnd != null) {
+                Rectangle box = new Rectangle(getMapPosition(iSelectionRectStart, false));
+                box.add(getMapPosition(iSelectionRectEnd, false));
 
-                int zoomDiff = MAX_ZOOM - zoom;
-                Point tlc = getTopLeftCoordinates();
-                int x_min = (iSelectionRectStart.x >> zoomDiff) - tlc.x;
-                int y_min = (iSelectionRectStart.y >> zoomDiff) - tlc.y;
-                int x_max = (iSelectionRectEnd.x >> zoomDiff) - tlc.x;
-                int y_max = (iSelectionRectEnd.y >> zoomDiff) - tlc.y;
-
-                int w = x_max - x_min;
-                int h = y_max - y_min;
                 g.setColor(new Color(0.9f, 0.7f, 0.7f, 0.6f));
-                g.fillRect(x_min, y_min, w, h);
+                g.fillRect(box.x, box.y, box.width, box.height);
 
                 g.setColor(Color.BLACK);
-                g.drawRect(x_min, y_min, w, h);
+                g.drawRect(box.x, box.y, box.width, box.height);
             }
         } catch (Exception e) {
             Main.error(e);
@@ -256,29 +249,17 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
         Point p_max = new Point(Math.max(aEnd.x, aStart.x), Math.max(aEnd.y, aStart.y));
         Point p_min = new Point(Math.min(aEnd.x, aStart.x), Math.min(aEnd.y, aStart.y));
 
-        Point tlc = getTopLeftCoordinates();
-        int zoomDiff = MAX_ZOOM - zoom;
-        Point pEnd = new Point(p_max.x + tlc.x, p_max.y + tlc.y);
-        Point pStart = new Point(p_min.x + tlc.x, p_min.y + tlc.y);
-
-        pEnd.x <<= zoomDiff;
-        pEnd.y <<= zoomDiff;
-        pStart.x <<= zoomDiff;
-        pStart.y <<= zoomDiff;
+        iSelectionRectStart = getPosition(p_min);
+        iSelectionRectEnd =   getPosition(p_max);
 
-        iSelectionRectStart = pStart;
-        iSelectionRectEnd = pEnd;
-
-        Coordinate l1 = getPosition(p_max); // lon may be outside [-180,180]
-        Coordinate l2 = getPosition(p_min); // lon may be outside [-180,180]
         Bounds b = new Bounds(
                 new LatLon(
-                        Math.min(l2.getLat(), l1.getLat()),
-                        LatLon.toIntervalLon(Math.min(l1.getLon(), l2.getLon()))
+                        Math.min(iSelectionRectStart.getLat(), iSelectionRectEnd.getLat()),
+                        LatLon.toIntervalLon(Math.min(iSelectionRectStart.getLon(), iSelectionRectEnd.getLon()))
                         ),
                         new LatLon(
-                                Math.max(l2.getLat(), l1.getLat()),
-                                LatLon.toIntervalLon(Math.max(l1.getLon(), l2.getLon())))
+                                Math.max(iSelectionRectStart.getLat(), iSelectionRectEnd.getLat()),
+                                LatLon.toIntervalLon(Math.max(iSelectionRectStart.getLon(), iSelectionRectEnd.getLon())))
                 );
         Bounds oldValue = this.bbox;
         this.bbox = b;
@@ -331,13 +312,8 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
             minLon -= 360.0;
         }
 
-        int y1 = tileSource.LatToY(bbox.getMinLat(), MAX_ZOOM);
-        int y2 = tileSource.LatToY(bbox.getMaxLat(), MAX_ZOOM);
-        int x1 = tileSource.LonToX(minLon, MAX_ZOOM);
-        int x2 = tileSource.LonToX(maxLon, MAX_ZOOM);
-
-        iSelectionRectStart = new Point(Math.min(x1, x2), Math.min(y1, y2));
-        iSelectionRectEnd = new Point(Math.max(x1, x2), Math.max(y1, y2));
+        iSelectionRectStart = new Coordinate(bbox.getMinLat(), bbox.getMinLon());
+        iSelectionRectEnd = new Coordinate(bbox.getMaxLat(), bbox.getMaxLon());
 
         // calc the screen coordinates for the new selection rectangle
         MapMarkerDot xmin_ymin = new MapMarkerDot(bbox.getMinLat(), bbox.getMinLon());
diff --git a/src/org/openstreetmap/josm/gui/layer/TMSLayer.java b/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
index f4a29dd..63b716e 100644
--- a/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
@@ -65,6 +65,7 @@ import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
@@ -422,12 +423,18 @@ public class TMSLayer extends ImageryLayer implements ImageObserver, TileLoaderL
     }
 
     private final int getBestZoom() {
-        double factor = getScaleFactor(1);
+        double factor = getScaleFactor(1); // check the ratio between area of tilesize at zoom 1 to current view
         double result = Math.log(factor)/Math.log(2)/2+1;
-        // In general, smaller zoom levels are more readable.  We prefer big,
-        // block, pixelated (but readable) map text to small, smeared,
-        // unreadable underzoomed text.  So, use .floor() instead of rounding
-        // to skew things a bit toward the lower zooms.
+        /*
+         * Math.log(factor)/Math.log(2) - gives log base 2 of factor
+         * We divide result by 2, as factor contains ratio between areas. We could do Math.sqrt before log, or just divide log by 2
+         * In general, smaller zoom levels are more readable.  We prefer big,
+         * block, pixelated (but readable) map text to small, smeared,
+         * unreadable underzoomed text.  So, use .floor() instead of rounding
+         * to skew things a bit toward the lower zooms.
+         * Remember, that result here, should correspond to TMSLayer.paint(...)
+         * getScaleFactor(...) is supposed to be between 0.75 and 3
+         */
         int intResult = (int)Math.floor(result);
         if (intResult > getMaxZoomLvl())
             return getMaxZoomLvl();
@@ -513,8 +520,19 @@ public class TMSLayer extends ImageryLayer implements ImageObserver, TileLoaderL
             @Override
             public void actionPerformed(ActionEvent ae) {
                 if (clickedTile != null) {
-                    showMetadataTile = clickedTile;
-                    redraw();
+                    ExtendedDialog ed = new ExtendedDialog(Main.parent, tr("Tile Info"), new String[]{tr("OK")});
+                    ed.setIcon(JOptionPane.INFORMATION_MESSAGE);
+                    StringBuilder content = new StringBuilder();
+                    content.append("Tile name: ").append(clickedTile.getKey()).append("\n");
+                    try {
+                        content.append("Tile url: ").append(clickedTile.getUrl()).append("\n");
+                    } catch (IOException e) {
+                    }
+                    content.append("Tile size: ").append(clickedTile.getTileSource().getTileSize()).append("x").append(clickedTile.getTileSource().getTileSize()).append("\n");
+                    Rectangle displaySize = tileToRect(clickedTile);
+                    content.append("Tile display size: ").append(displaySize.width).append("x").append(displaySize.height).append("\n");
+                    ed.setContent(content.toString());
+                    ed.showDialog();
                 }
             }
         }));
@@ -1383,7 +1401,7 @@ public class TMSLayer extends ImageryLayer implements ImageObserver, TileLoaderL
             myDrawString(g, tr("Current zoom: {0}", currentZoomLevel), 50, 140);
             myDrawString(g, tr("Display zoom: {0}", displayZoomLevel), 50, 155);
             myDrawString(g, tr("Pixel scale: {0}", getScaleFactor(currentZoomLevel)), 50, 170);
-            myDrawString(g, tr("Best zoom: {0}", Math.log(getScaleFactor(1))/Math.log(2)/2+1), 50, 185);
+            myDrawString(g, tr("Best zoom: {0}", getBestZoom()), 50, 185);
             if(tileLoader instanceof TMSCachedTileLoader) {
                 TMSCachedTileLoader cachedTileLoader = (TMSCachedTileLoader)tileLoader;
                 int offset = 185;
diff --git a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
index c50e66f..04dc890 100644
--- a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
+++ b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
@@ -137,6 +137,7 @@ public class ImageryReader {
                         "terms-of-use-url",
                         "country-code",
                         "icon",
+                        "tile-size",
                 }).contains(qName)) {
                     newState = State.ENTRY_ATTRIBUTE;
                     lang = atts.getValue("lang");
@@ -299,6 +300,19 @@ public class ImageryReader {
                 case "icon":
                     entry.setIcon(accumulator.toString());
                     break;
+                case "tile-size":
+                    Integer tileSize = null;
+                    try {
+                        tileSize  = Integer.parseInt(accumulator.toString());
+                    } catch(NumberFormatException e) {
+                        tileSize = null;
+                    }
+                    if (tileSize == null) {
+                        skipEntry = true;
+                    } else {
+                        entry.setTileSize(tileSize.intValue());
+                    }
+                    break;
                 }
                 break;
             case BOUNDS:
