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);
+        }
+
+    }
+
 }
