Index: /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 8541)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 8542)
@@ -139,17 +139,6 @@
     public AbstractTileSourceLayer(ImageryInfo info) {
         super(info);
-
-        if (!isProjectionSupported(Main.getProjection())) {
-            JOptionPane.showMessageDialog(Main.parent,
-                    tr("This layer do not support the projection {0}.\n{1}\n"
-                            + "Change the projection or remove the layer.",
-                            Main.getProjection().toCode(), nameSupportedProjections()),
-                            tr("Warning"),
-                            JOptionPane.WARNING_MESSAGE);
-        }
         setBackgroundLayer(true);
         this.setVisible(true);
-
-        initTileSource(getTileSource(info));
         MapView.addZoomChangeListener(this);
     }
@@ -462,4 +451,7 @@
     @Override
     public void hookUpMapView() {
+        initTileSource(getTileSource(info));
+        projectionChanged(null, Main.getProjection()); // check if projection is supported
+
         // keep them final here, so we avoid namespace clutter in the class
         final JPopupMenu tileOptionMenu = new JPopupMenu();
Index: /trunk/src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 8541)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 8542)
@@ -447,5 +447,6 @@
         if (!isProjectionSupported(newValue)) {
             JOptionPane.showMessageDialog(Main.parent,
-                    tr("The layer {0} does not support the new projection {1}.\n{2}\n"
+                    tr("The layer {0} does not support the new projection {1}.\n"
+                            + "Supported projections are: {2}\n"
                             + "Change the projection again or remove the layer.",
                             getName(), newValue.toCode(), nameSupportedProjections()),
Index: /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 8541)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 8542)
@@ -17,5 +17,4 @@
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.CachedTileLoaderFactory;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
@@ -28,7 +27,4 @@
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 
 /**
@@ -42,4 +38,5 @@
     /** should WMS layer autozoom in default mode */
     public static final BooleanProperty PROP_DEFAULT_AUTOZOOM = new BooleanProperty("imagery.wms.default_autozoom", true);
+    private List<String> supportedProjections;
 
     /**
@@ -47,40 +44,9 @@
      * @param info ImageryInfo description of the layer
      */
+
+
     public WMSLayer(ImageryInfo info) {
         super(info);
-    }
-
-    @Override
-    public void hookUpMapView() {
-        super.hookUpMapView();
-        final ProjectionChangeListener listener = new ProjectionChangeListener() {
-            @Override
-            public void projectionChanged(Projection oldValue, Projection newValue) {
-                if (!oldValue.equals(newValue) && tileSource instanceof TemplatedWMSTileSource) {
-                    ((TemplatedWMSTileSource) tileSource).initProjection(newValue);
-                }
-
-            }
-        };
-        Main.addProjectionChangeListener(listener);
-
-        MapView.addLayerChangeListener(new LayerChangeListener() {
-            @Override
-            public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-                // empty
-            }
-
-            @Override
-            public void layerAdded(Layer newLayer) {
-                // empty
-            }
-
-            @Override
-            public void layerRemoved(Layer oldLayer) {
-                if (oldLayer == WMSLayer.this) {
-                    Main.removeProjectionChangeListener(listener);
-                }
-            }
-        });
+        this.supportedProjections = info.getServerProjections();
     }
 
@@ -155,3 +121,33 @@
         return null;
     }
+
+    @Override
+    public boolean isProjectionSupported(Projection proj) {
+        return supportedProjections == null || supportedProjections.isEmpty() || supportedProjections.contains(proj.toCode());
+    }
+
+    @Override
+    public String nameSupportedProjections() {
+        StringBuffer ret = new StringBuffer();
+        for (String e: supportedProjections) {
+            ret.append(e).append(", ");
+        }
+        String appendix = "";
+        if (supportedProjections.contains("EPSG:4326")) {
+            appendix = ". " + tr("JOSM will use EPSG:4326 to query the server, but results may vary "
+                    + "depending on the WMS server");
+        }
+        return ret.substring(0, ret.length()-2);
+    }
+
+    @Override
+    public void projectionChanged(Projection oldValue, Projection newValue) {
+        super.projectionChanged(oldValue, newValue);
+
+        if (!newValue.equals(oldValue) && tileSource instanceof TemplatedWMSTileSource) {
+            ((TemplatedWMSTileSource) tileSource).initProjection(newValue);
+        }
+
+    }
+
 }
Index: /trunk/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java	(revision 8541)
+++ /trunk/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java	(revision 8542)
@@ -48,4 +48,5 @@
             }
         }
+        verifyTileSquarness(source, 2270, 1323, 12);
         verifyLocation(source, new LatLon(53.5937132, 19.5652017));
         verifyLocation(source, new LatLon(53.501565692302854, 18.54455233898721));
@@ -62,4 +63,5 @@
         verifyTileSquarness(source, 2, 2, 2);
         verifyTileSquarness(source, 150, 20, 18);
+        verifyTileSquarness(source, 2270, 1323, 12);
     }
 
@@ -74,5 +76,5 @@
         verifyTileSquarness(source, 2, 2, 2);
         verifyTileSquarness(source, 150, 20, 18);
-
+        verifyTileSquarness(source, 2270, 1323, 12);
     }
 
@@ -112,9 +114,28 @@
     private void verifyTileSquarness(TemplatedWMSTileSource source, int x, int y, int z) {
         Projection proj = Main.getProjection();
-        EastNorth min = proj.latlon2eastNorth(getTileLatLon(source, x, y, z));
-        EastNorth max = proj.latlon2eastNorth(getTileLatLon(source, x + 1, y + 1, z));
-        double y_size = Math.abs(min.getY() - max.getY());
-        double x_size = Math.abs(min.getX() - max.getX());
+        /**
+         * t1 | t2
+         * -------
+         * t3 | t4
+         */
+        EastNorth t1 = proj.latlon2eastNorth(getTileLatLon(source, x, y, z));
+        EastNorth t2 = proj.latlon2eastNorth(getTileLatLon(source, x + 1, y, z));
+        EastNorth t3 = proj.latlon2eastNorth(getTileLatLon(source, x, y + 1, z));
+        EastNorth t4 = proj.latlon2eastNorth(getTileLatLon(source, x + 1, y + 1, z));
+        double y_size = Math.abs(t1.getY() - t4.getY());
+        double x_size = Math.abs(t1.getX() - t4.getX());
         assertEquals(x_size, y_size, 1e-05);
+        assertEquals(y_size, Math.abs(t1.getY() - t3.getY()), 1e-05);
+        assertEquals(x_size, Math.abs(t1.getX() - t2.getX()), 1e-05);
+
+        t1 = source.getTileEastNorth(x, y, z);
+        t2 = source.getTileEastNorth(x + 1, y, z);
+        t3 = source.getTileEastNorth(x, y + 1, z);
+        t4 = source.getTileEastNorth(x + 1, y + 1, z);
+        y_size = Math.abs(t1.getY() - t4.getY());
+        x_size = Math.abs(t1.getX() - t4.getX());
+        assertEquals(x_size, y_size, 1e-05);
+        assertEquals(y_size, Math.abs(t1.getY() - t3.getY()), 1e-05);
+        assertEquals(x_size, Math.abs(t1.getX() - t2.getX()), 1e-05);
     }
 
