Index: /trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 3877)
+++ /trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 3878)
@@ -33,5 +33,5 @@
         if (info.isBlacklisted()) {
             setEnabled(false);
-        } else if (info.getImageryType() == ImageryType.TMS || info.getImageryType() == ImageryType.BING) {
+        } else if (info.getImageryType() == ImageryType.TMS || info.getImageryType() == ImageryType.BING || info.getImageryType() == ImageryType.SCANEX) {
             setEnabled(true);
         } else if (Main.map != null && Main.map.mapView != null && !Main.map.mapView.getAllLayers().isEmpty()) {
Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 3877)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 3878)
@@ -16,5 +16,6 @@
         TMS("tms"),
         HTML("html"),
-        BING("bing");
+        BING("bing"),
+        SCANEX("scanex");
 
         private String urlString;
Index: /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 3877)
+++ /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 3878)
@@ -80,4 +80,12 @@
 
         @Override public String getTermsOfUseURL() { return source.getTermsOfUseURL(); }
+
+        @Override public double latToTileY(double lat, int zoom) { return source.latToTileY(lat,zoom); }
+
+        @Override public double lonToTileX(double lon, int zoom) { return source.lonToTileX(lon,zoom); }
+
+        @Override public double tileYToLat(int y, int zoom) { return tileYToLat(y, zoom); }
+
+        @Override public double tileXToLon(int x, int zoom) { return tileXToLon(x, zoom); }
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3877)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3878)
@@ -131,5 +131,5 @@
         if (info.getImageryType() == ImageryType.WMS || info.getImageryType() == ImageryType.HTML)
             return new WMSLayer(info);
-        else if (info.getImageryType() == ImageryType.TMS || info.getImageryType() == ImageryType.BING)
+        else if (info.getImageryType() == ImageryType.TMS || info.getImageryType() == ImageryType.BING || info.getImageryType() == ImageryType.SCANEX)
             return new TMSLayer(info);
         else throw new AssertionError();
Index: /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 3877)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 3878)
@@ -43,4 +43,5 @@
 import org.openstreetmap.gui.jmapviewer.OsmFileCacheTileLoader;
 import org.openstreetmap.gui.jmapviewer.OsmTileLoader;
+import org.openstreetmap.gui.jmapviewer.ScanexIRSTileSource;
 import org.openstreetmap.gui.jmapviewer.TMSTileSource;
 import org.openstreetmap.gui.jmapviewer.TemplatedTMSTileSource;
@@ -238,4 +239,6 @@
         } else if (info.getImageryType() == ImageryType.BING)
             return new BingAerialTileSource();
+        else if (info.getImageryType() == ImageryType.SCANEX)
+            return new ScanexIRSTileSource();
         return null;
     }
@@ -286,8 +289,8 @@
         LatLon topLeft = mv.getLatLon(0, 0);
         LatLon botRight = mv.getLatLon(mv.getWidth(), mv.getHeight());
-        double x1 = lonToTileX(topLeft.lon(), zoom);
-        double y1 = latToTileY(topLeft.lat(), zoom);
-        double x2 = lonToTileX(botRight.lon(), zoom);
-        double y2 = latToTileY(botRight.lat(), zoom);
+        double x1 = tileSource.lonToTileX(topLeft.lon(), zoom);
+        double y1 = tileSource.latToTileY(topLeft.lat(), zoom);
+        double x2 = tileSource.lonToTileX(botRight.lon(), zoom);
+        double y2 = tileSource.latToTileY(botRight.lat(), zoom);
 
         int screenPixels = mv.getWidth()*mv.getHeight();
@@ -677,6 +680,6 @@
     {
         int zoom = t.getZoom();
-        return new LatLon(tileYToLat(t.getYtile(), zoom),
-                tileXToLon(t.getXtile(), zoom));
+        return new LatLon(tileSource.tileYToLat(t.getYtile(), zoom),
+                tileSource.tileXToLon(t.getXtile(), zoom));
     }
 
@@ -866,6 +869,6 @@
     }
     private Point pixelPos(Tile t) {
-        double lon = tileXToLon(t.getXtile(), t.getZoom());
-        LatLon tmpLL = new LatLon(tileYToLat(t.getYtile(), t.getZoom()), lon);
+        double lon = tileSource.tileXToLon(t.getXtile(), t.getZoom());
+        LatLon tmpLL = new LatLon(tileSource.tileYToLat(t.getYtile(), t.getZoom()), lon);
         return pixelPos(tmpLL);
     }
@@ -898,8 +901,8 @@
                 return;
 
-            x0 = (int)lonToTileX(topLeft.lon(),  zoom);
-            y0 = (int)latToTileY(topLeft.lat(),  zoom);
-            x1 = (int)lonToTileX(botRight.lon(), zoom);
-            y1 = (int)latToTileY(botRight.lat(), zoom);
+            x0 = (int)tileSource.lonToTileX(topLeft.lon(),  zoom);
+            y0 = (int)tileSource.latToTileY(topLeft.lat(),  zoom);
+            x1 = (int)tileSource.lonToTileX(botRight.lon(), zoom);
+            y1 = (int)tileSource.latToTileY(botRight.lat(), zoom);
             if (x0 > x1) {
                 int tmp = x0;
@@ -1303,23 +1306,3 @@
         return needRedraw;
     }
-
-    private static double latToTileY(double lat, int zoom) {
-        double l = lat / 180 * Math.PI;
-        double pf = Math.log(Math.tan(l) + (1 / Math.cos(l)));
-        return Math.pow(2.0, zoom - 1) * (Math.PI - pf) / Math.PI;
-    }
-
-    private static double lonToTileX(double lon, int zoom) {
-        return Math.pow(2.0, zoom - 3) * (lon + 180.0) / 45.0;
-    }
-
-    private static double tileYToLat(int y, int zoom) {
-        return Math.atan(Math.sinh(Math.PI
-                - (Math.PI * y / Math.pow(2.0, zoom - 1))))
-                * 180 / Math.PI;
-    }
-
-    private static double tileXToLon(int x, int zoom) {
-        return x * 45.0 / Math.pow(2.0, zoom - 3) - 180.0;
-    }
 }
