diff --git data/maps.xsd data/maps.xsd
index 43ca799..f420af8 100644
--- data/maps.xsd
+++ data/maps.xsd
@@ -688,6 +688,10 @@
 									<xs:attribute name="metadata-key" type="xs:string" />
 								</xs:complexType>
 							</xs:element>
+							<!--  is imagery properly georeferenced (i.e. no need to check offsets). Defaults to false. Affects showing warnings. -->
+							<xs:element name="valid-georeference" minOccurs="0" maxOccurs="1" type="xs:boolean" />
+							<!-- does imagery server supports JOSM 4326 to 3857 reprojection and non-square queries. Affects showing warnings. -->
+							<xs:element name="epsg4326to3857Supported" minOccurs="0" maxOccurs="1" type="xs:boolean" />
 						</xs:choice>
 					</xs:sequence>
 					<xs:attribute name="last-check" type="xs:date" use="optional" />
diff --git src/org/openstreetmap/josm/actions/AddImageryLayerAction.java src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
index 192d9f8..e6ed3b4 100644
--- src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
+++ src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
@@ -82,7 +82,7 @@ public class AddImageryLayerAction extends JosmAction implements AdaptableAction
                     ? getWMSLayerInfo() : info;
             if (infoToAdd != null) {
                 Main.main.addLayer(ImageryLayer.create(infoToAdd));
-                AlignImageryPanel.addNagPanelIfNeeded();
+                AlignImageryPanel.addNagPanelIfNeeded(infoToAdd);
             }
         } catch (IllegalArgumentException ex) {
             if (ex.getMessage() == null || ex.getMessage().isEmpty()) {
diff --git src/org/openstreetmap/josm/data/imagery/ImageryInfo.java src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
index ff0ed6b..e51325b 100644
--- src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
+++ src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
@@ -199,7 +199,9 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
     private String countryCode = "";
     /** icon used in menu */
     private String icon;
-    // when adding a field, also adapt the ImageryInfo(ImageryInfo) constructor, equals method, and ImageryPreferenceEntry
+    private boolean isGeoreferenceValid = false;
+    private boolean isEpsg4326To3857Supported = false;
+    // when adding a field, also adapt the ImageryInfo(ImageryInfo) and ImageryInfo(ImageryPreferenceEntry) constructor, equals method, and ImageryPreferenceEntry
 
     /**
      * Auxiliary class to save an {@link ImageryInfo} object in the preferences.
@@ -229,6 +231,8 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
         @pref Map<String, String> noTileHeaders;
         @pref int tileSize = OsmMercator.DEFAUL_TILE_SIZE;
         @pref Map<String, String> metadataHeaders;
+        @pref boolean valid_georeference;
+        @pref boolean supports_epsg_4326_to_3857_conversion;
 
         /**
          * Constructs a new empty WMS {@code ImageryPreferenceEntry}.
@@ -291,6 +295,10 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
             }
 
             tileSize = i.getTileSize();
+
+            valid_georeference = i.isGeoreferenceValid();
+            supports_epsg_4326_to_3857_conversion = i.isEpsg4326To3857Supported();
+
         }
 
         @Override
@@ -412,6 +420,8 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
         }
         setTileSize(e.tileSize);
         metadataHeaders = e.metadataHeaders;
+        isEpsg4326To3857Supported = e.supports_epsg_4326_to_3857_conversion;
+        isGeoreferenceValid = e.valid_georeference;
     }
 
     /**
@@ -440,6 +450,8 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
         this.description = i.description;
         this.noTileHeaders = i.noTileHeaders;
         this.metadataHeaders = i.metadataHeaders;
+        this.isEpsg4326To3857Supported = i.isEpsg4326To3857Supported;
+        this.isGeoreferenceValid = i.isGeoreferenceValid;
     }
 
     @Override
@@ -992,4 +1004,21 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
     public void setMetadataHeaders(Map<String, String> metadataHeaders) {
         this.metadataHeaders = metadataHeaders;
     }
+
+    public boolean isEpsg4326To3857Supported() {
+        return isEpsg4326To3857Supported;
+    }
+
+    public void setEpsg4326To3857Supported(boolean isEpsg4326To3857Supported) {
+        this.isEpsg4326To3857Supported = isEpsg4326To3857Supported;
+    }
+
+    public boolean isGeoreferenceValid() {
+        return isGeoreferenceValid;
+    }
+
+    public void setGeoreferenceValid(boolean isGeoreferenceValid) {
+        this.isGeoreferenceValid = isGeoreferenceValid;
+    }
+
 }
diff --git src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java
index 2fb1c44..5da7153 100644
--- src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java
+++ src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java
@@ -11,6 +11,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.border.CompoundBorder;
@@ -18,6 +19,8 @@ import javax.swing.border.EmptyBorder;
 import javax.swing.border.EtchedBorder;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.gui.widgets.UrlLabel;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -28,15 +31,21 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * @author zverik
  */
 public class AlignImageryPanel extends JPanel {
-    private static final String PREF = "imagery.offsetnagging";
 
-    public AlignImageryPanel(boolean oneLine) {
+    /**
+     * @param oneLine if true, show the nagging message in one line, otherwise - in two lines
+     * @param showAgain show again property
+     * @param infoToAdd imagery info for which the nagging message is shown
+     */
+    public AlignImageryPanel(boolean oneLine, final BooleanProperty showAgain, ImageryInfo infoToAdd) {
         Font font = getFont().deriveFont(Font.PLAIN, 14.0f);
-        JLabel nagLabel = new JLabel(tr("Aerial imagery might be misaligned. Please check its offset using GPS tracks!"));
+        JLabel nagLabel = new JLabel(tr("Aerial imagery \"{0}\" might be misaligned. Please check its offset using GPS tracks!", infoToAdd.getName()));
         UrlLabel detailsList = new UrlLabel(tr("http://wiki.openstreetmap.org/wiki/Using_Imagery"), tr("Details..."));
         nagLabel.setLabelFor(detailsList);
         nagLabel.setFont(font);
         detailsList.setFont(font);
+        final JCheckBox doNotShowAgain = new JCheckBox(tr("Do not show this message again"));
+        doNotShowAgain.setOpaque(false);
 
         JButton closeButton = new JButton(ImageProvider.get("misc", "black_x"));
         closeButton.setContentAreaFilled(false);
@@ -48,7 +57,9 @@ public class AlignImageryPanel extends JPanel {
             public void actionPerformed(ActionEvent e) {
                 if (Main.isDisplayingMapView()) {
                     Main.map.removeTopPanel(AlignImageryPanel.class);
-                    Main.pref.put(PREF, false);
+                    if (doNotShowAgain.isSelected()) {
+                        showAgain.put(false);
+                    }
                 }
             }
         });
@@ -57,21 +68,27 @@ public class AlignImageryPanel extends JPanel {
         if (!oneLine) { // tune for small screens
             add(nagLabel, GBC.std(1, 1).fill());
             add(detailsList, GBC.std(1, 2).fill());
+            add(doNotShowAgain, GBC.std(1, 3).fill());
             add(closeButton, GBC.std(2, 1).span(1, 2).anchor(GBC.EAST));
         } else {
             add(nagLabel, GBC.std(1, 1).fill());
             add(detailsList, GBC.std(2, 1).fill());
+            add(doNotShowAgain, GBC.std(1, 2).fill());
             add(closeButton, GBC.std(3, 1).anchor(GBC.EAST));
         }
         setBorder(new CompoundBorder(new EtchedBorder(EtchedBorder.LOWERED), new EmptyBorder(12, 12, 12, 12)));
         setBackground(new Color(224, 236, 249));
     }
 
-    public static void addNagPanelIfNeeded() {
-        if (Main.isDisplayingMapView() && !Main.pref.getBoolean("expert") && Main.pref.getBoolean(PREF, true)) {
+    /**
+     * @param infoToAdd ImageryInfo for which the nag panel should be created
+     */
+    public static void addNagPanelIfNeeded(ImageryInfo infoToAdd) {
+        BooleanProperty showAgain = new BooleanProperty("message.imagery.nagPanel." + infoToAdd.getUrl(), true);
+        if (Main.isDisplayingMapView() && showAgain.get() && !infoToAdd.isGeoreferenceValid() ) {
             if (Main.map.getTopPanel(AlignImageryPanel.class) == null) {
                 double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
-                AlignImageryPanel p = new AlignImageryPanel(w > 1300);
+                AlignImageryPanel p = new AlignImageryPanel(w > 1300, showAgain, infoToAdd);
                 Main.map.addTopPanel(p);
             }
         }
diff --git src/org/openstreetmap/josm/gui/layer/WMSLayer.java src/org/openstreetmap/josm/gui/layer/WMSLayer.java
index 96268ed..17d1e2d 100644
--- src/org/openstreetmap/josm/gui/layer/WMSLayer.java
+++ src/org/openstreetmap/josm/gui/layer/WMSLayer.java
@@ -28,6 +28,7 @@ import org.openstreetmap.josm.data.imagery.WMSCachedTileLoader;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 
 /**
  * This is a layer that grabs the current screen from an WMS server. The data
@@ -112,7 +113,8 @@ public class WMSLayer extends AbstractCachedTileSourceLayer {
 
     @Override
     public boolean isProjectionSupported(Projection proj) {
-        return supportedProjections == null || supportedProjections.isEmpty() || supportedProjections.contains(proj.toCode());
+        return supportedProjections == null || supportedProjections.isEmpty() || supportedProjections.contains(proj.toCode()) ||
+                (info.isEpsg4326To3857Supported() && supportedProjections.contains("EPSG:4326") &&  "EPSG:3857".equals(Main.getProjection().toCode()));
     }
 
     @Override
@@ -123,7 +125,7 @@ public class WMSLayer extends AbstractCachedTileSourceLayer {
         }
         String appendix = "";
 
-        if (supportedProjections.contains("EPSG:4326") &&  "EPSG:3857".equals(Main.getProjection().toCode())) {
+        if (isReprojectionPossible()) {
             appendix = ". " + tr("JOSM will use EPSG:4326 to query the server, but results may vary "
                     + "depending on the WMS server");
         }
@@ -132,7 +134,21 @@ public class WMSLayer extends AbstractCachedTileSourceLayer {
 
     @Override
     public void projectionChanged(Projection oldValue, Projection newValue) {
-        super.projectionChanged(oldValue, newValue);
+        // do not call super - we need custom warning dialog
+
+        if (!isProjectionSupported(newValue)) {
+            String message = 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());
+
+            ExtendedDialog warningDialog = new ExtendedDialog(Main.parent, tr("Warning"), new String[]{tr("OK")}).setContent(message);
+
+            if (isReprojectionPossible()) {
+                warningDialog.toggleEnable("imagery.wms.projectionSupportWarnings." + tileSource.getBaseUrl());
+            }
+            warningDialog.showDialog();
+        }
 
         if (!newValue.equals(oldValue) && tileSource instanceof TemplatedWMSTileSource) {
             ((TemplatedWMSTileSource) tileSource).initProjection(newValue);
@@ -155,4 +171,8 @@ public class WMSLayer extends AbstractCachedTileSourceLayer {
     public static CacheAccess<String, BufferedImageCacheEntry> getCache() {
         return AbstractCachedTileSourceLayer.getCache(CACHE_REGION_NAME);
     }
+
+    private boolean isReprojectionPossible() {
+        return supportedProjections.contains("EPSG:4326") &&  "EPSG:3857".equals(Main.getProjection().toCode());
+    }
 }
diff --git src/org/openstreetmap/josm/io/imagery/ImageryReader.java src/org/openstreetmap/josm/io/imagery/ImageryReader.java
index d88380e..5bee3ae 100644
--- src/org/openstreetmap/josm/io/imagery/ImageryReader.java
+++ src/org/openstreetmap/josm/io/imagery/ImageryReader.java
@@ -142,6 +142,8 @@ public class ImageryReader {
                         "country-code",
                         "icon",
                         "tile-size",
+                        "validGeoreference",
+                        "epsg4326to3857Supported",
                 }).contains(qName)) {
                     newState = State.ENTRY_ATTRIBUTE;
                     lang = atts.getValue("lang");
@@ -323,6 +325,12 @@ public class ImageryReader {
                         entry.setTileSize(tileSize.intValue());
                     }
                     break;
+                case "valid-georeference":
+                    entry.setGeoreferenceValid(new Boolean(accumulator.toString()));
+                    break;
+                case "epsg4326to3857Supported":
+                    entry.setEpsg4326To3857Supported(new Boolean(accumulator.toString()));
+                    break;
                 }
                 break;
             case BOUNDS:
