Index: applications/editors/josm/plugins/wmsplugin/src/wmsplugin/GeorefImage.java
===================================================================
--- applications/editors/josm/plugins/wmsplugin/src/wmsplugin/GeorefImage.java	(revision 22789)
+++ applications/editors/josm/plugins/wmsplugin/src/wmsplugin/GeorefImage.java	(revision 22794)
@@ -99,10 +99,5 @@
 
 	private BufferedImage createImage() {
-		int left = layer.getImageX(xIndex);
-		int bottom = layer.getImageY(yIndex);
-		int width = layer.getImageX(xIndex + 1) - left;
-		int height = layer.getImageY(yIndex + 1) - bottom;
-
-		return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+		return new BufferedImage(layer.getImageWidth(xIndex), layer.getImageHeight(yIndex), BufferedImage.TYPE_INT_RGB);
 	}
 
@@ -117,6 +112,6 @@
 		int left = layer.getImageX(xIndex);
 		int bottom = layer.getImageY(yIndex);
-		int width = layer.getImageX(xIndex + 1) - left;
-		int height = layer.getImageY(yIndex + 1) - bottom;
+		int width = layer.getImageWidth(xIndex);
+		int height = layer.getImageHeight(yIndex);
 
 		int x = left - leftEdge;
Index: applications/editors/josm/plugins/wmsplugin/src/wmsplugin/Grabber.java
===================================================================
--- applications/editors/josm/plugins/wmsplugin/src/wmsplugin/Grabber.java	(revision 22789)
+++ applications/editors/josm/plugins/wmsplugin/src/wmsplugin/Grabber.java	(revision 22794)
@@ -18,4 +18,5 @@
 	protected Projection proj;
 	protected double pixelPerDegree;
+	protected WMSRequest request;
 	protected volatile boolean canceled;
 
@@ -30,10 +31,10 @@
 				layer.getEastNorth(request.getXIndex(), request.getYIndex()),
 				layer.getEastNorth(request.getXIndex() + 1, request.getYIndex() + 1));
-		if (b.min != null && b.max != null && WMSPlugin.doOverlap) {
+		if (b.min != null && b.max != null && WMSPlugin.PROP_OVERLAP.get()) {
 			double eastSize =  b.max.east() - b.min.east();
 			double northSize =  b.max.north() - b.min.north();
 
-			double eastCoef = WMSPlugin.overlapEast / 100.0;
-			double northCoef = WMSPlugin.overlapNorth / 100.0;
+			double eastCoef = WMSPlugin.PROP_OVERLAP_EAST.get() / 100.0;
+			double northCoef = WMSPlugin.PROP_OVERLAP_NORTH.get() / 100.0;
 
 			this.b = new ProjectionBounds( new EastNorth(b.min.east(),
@@ -45,4 +46,5 @@
 		this.proj = Main.proj;
 		this.pixelPerDegree = request.getPixelPerDegree();
+		this.request = request;
 	}
 
@@ -50,8 +52,8 @@
 
 	int width(){
-		return (int) ((b.max.north() - b.min.north()) * pixelPerDegree);
+		return layer.getImageWidth(request.getXIndex());
 	}
 	int height(){
-		return (int) ((b.max.east() - b.min.east()) * pixelPerDegree);
+		return layer.getImageHeight(request.getYIndex());
 	}
 
Index: applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSLayer.java
===================================================================
--- applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSLayer.java	(revision 22789)
+++ applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSLayer.java	(revision 22794)
@@ -53,4 +53,5 @@
  */
 public class WMSLayer extends Layer implements PreferenceChangedListener {
+
 	protected static final Icon icon =
 		new ImageIcon(Toolkit.getDefaultToolkit().createImage(WMSPlugin.class.getResource("/images/wms_small.png")));
@@ -67,5 +68,4 @@
 	protected int minZoom = 3;
 
-	protected boolean deltaChanged;
 	protected double dx = 0.0;
 	protected double dy = 0.0;
@@ -77,4 +77,5 @@
 	protected final int serializeFormatVersion = 5;
 	protected boolean autoDownloadEnabled = true;
+	protected boolean settingsChanged;
 
 	// Image index boundary for current view
@@ -86,5 +87,5 @@
 	private volatile int bottomEdge;
 
-
+	// Request queue
 	private final List<WMSRequest> requestQueue = new ArrayList<WMSRequest>();
 	private final List<WMSRequest> finishedRequests = new ArrayList<WMSRequest>();
@@ -202,7 +203,8 @@
 
 	@Override public void paint(Graphics2D g, final MapView mv, Bounds b) {
-		deltaChanged = false;
 		if(baseURL == null) return;
 		if (usesInvalidUrl && !isInvalidUrlConfirmed) return;
+
+		settingsChanged = false;
 
 		ProjectionBounds bounds = mv.getProjectionBounds();
@@ -261,5 +263,5 @@
 
 	public void displace(double dx, double dy) {
-		deltaChanged = true;
+		settingsChanged = true;
 		this.dx += dx;
 		this.dy += dy;
@@ -280,4 +282,14 @@
 	public int getImageY(int imageIndex) {
 		return (int)(imageIndex * imageSize * (getPPD() / pixelPerDegree) + dy * getPPD());
+	}
+
+	public int getImageWidth(int xIndex) {
+		int overlap = (int)(WMSPlugin.PROP_OVERLAP.get()?WMSPlugin.PROP_OVERLAP_EAST.get() * imageSize * getPPD() / pixelPerDegree / 100:0);
+		return getImageX(xIndex + 1) - getImageX(xIndex) + overlap;
+	}
+
+	public int getImageHeight(int yIndex) {
+		int overlap = (int)(WMSPlugin.PROP_OVERLAP.get()?WMSPlugin.PROP_OVERLAP_NORTH.get() * imageSize * getPPD() / pixelPerDegree / 100:0);
+		return getImageY(yIndex + 1) - getImageY(yIndex) + overlap;
 	}
 
@@ -514,4 +526,5 @@
 			resolution = mv.getDist100PixelText();
 			pixelPerDegree = getPPD();
+			settingsChanged = true;
 			mv.repaint();
 		}
@@ -627,4 +640,5 @@
 				ois.close();
 				fis.close();
+				settingsChanged = true;
 				mv.repaint();
 			}
@@ -743,5 +757,5 @@
 		requestQueueLock.lock();
 		try {
-			return !finishedRequests.isEmpty() || deltaChanged;
+			return !finishedRequests.isEmpty() || settingsChanged;
 		} finally {
 			requestQueueLock.unlock();
@@ -753,5 +767,17 @@
 			cancelGrabberThreads(true);
 			startGrabberThreads();
-		}
-	}
+		} else if (
+				event.getKey().equals(WMSPlugin.PROP_OVERLAP.getKey())
+				|| event.getKey().equals(WMSPlugin.PROP_OVERLAP_EAST.getKey())
+				|| event.getKey().equals(WMSPlugin.PROP_OVERLAP_NORTH.getKey())) {
+			for (int i=0; i<images.length; i++) {
+				for (int k=0; k<images[i].length; k++) {
+					images[i][k] = new GeorefImage(this);
+				}
+			}
+
+			settingsChanged = true;
+		}
+	}
+
 }
Index: applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSPlugin.java
===================================================================
--- applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSPlugin.java	(revision 22789)
+++ applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSPlugin.java	(revision 22794)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.gui.IconToggleButton;
@@ -50,4 +51,7 @@
 
 	public static final IntegerProperty PROP_SIMULTANEOUS_CONNECTIONS = new IntegerProperty("wmsplugin.simultaneousConnections", 3);
+	public static final BooleanProperty PROP_OVERLAP = new BooleanProperty("wmsplugin.url.overlap", false);
+	public static final IntegerProperty PROP_OVERLAP_EAST = new IntegerProperty("wmsplugin.url.overlapEast", 14);
+	public static final IntegerProperty PROP_OVERLAP_NORTH = new IntegerProperty("wmsplugin.url.overlapNorth", 4);
 
 	WMSLayer wmsLayer;
@@ -57,7 +61,4 @@
 	static TreeMap<String,String> wmsListDefault = new TreeMap<String,String>();
 
-	static boolean doOverlap = false;
-	static int overlapEast = 14;
-	static int overlapNorth = 4;
 	// remember state of menu item to restore on changed preferences
 	static private boolean menuEnabled = false;
@@ -255,18 +256,4 @@
 		TreeSet<String> keys = new TreeSet<String>(prefs.keySet());
 
-		// Here we load the settings for "overlap" checkbox and spinboxes.
-
-		try {
-			doOverlap = Boolean.valueOf(prefs.get("wmsplugin.url.overlap"));
-		} catch (Exception e) {} // If sth fails, we drop to default settings.
-
-		try {
-			overlapEast = Integer.valueOf(prefs.get("wmsplugin.url.overlapEast"));
-		} catch (Exception e) {} // If sth fails, we drop to default settings.
-
-		try {
-			overlapNorth = Integer.valueOf(prefs.get("wmsplugin.url.overlapNorth"));
-		} catch (Exception e) {} // If sth fails, we drop to default settings.
-
 		// And then the names+urls of WMS servers
 		int prefid = 0;
Index: applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSPreferenceEditor.java
===================================================================
--- applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSPreferenceEditor.java	(revision 22789)
+++ applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSPreferenceEditor.java	(revision 22794)
@@ -169,9 +169,9 @@
 		p.add(Box.createHorizontalGlue(), GBC.eol().fill(GridBagConstraints.HORIZONTAL));
 
-		overlapCheckBox = new JCheckBox(tr("Overlap tiles"), WMSPlugin.doOverlap );
+		overlapCheckBox = new JCheckBox(tr("Overlap tiles"), WMSPlugin.PROP_OVERLAP.get() );
 		JLabel labelEast = new JLabel(tr("% of east:"));
 		JLabel labelNorth = new JLabel(tr("% of north:"));
-		spinEast = new JSpinner(new SpinnerNumberModel(WMSPlugin.overlapEast, 1, 50, 1));
-		spinNorth = new JSpinner(new SpinnerNumberModel(WMSPlugin.overlapNorth, 1, 50, 1));
+		spinEast = new JSpinner(new SpinnerNumberModel(WMSPlugin.PROP_OVERLAP_EAST.get(), 1, 50, 1));
+		spinNorth = new JSpinner(new SpinnerNumberModel(WMSPlugin.PROP_OVERLAP_NORTH.get(), 1, 50, 1));
 
 		JPanel overlapPanel = new JPanel(new FlowLayout());
@@ -240,13 +240,9 @@
 		if (change) WMSPlugin.refreshMenu();
 
-		WMSPlugin.doOverlap = overlapCheckBox.getModel().isSelected();
-		WMSPlugin.overlapEast = (Integer) spinEast.getModel().getValue();
-		WMSPlugin.overlapNorth = (Integer) spinNorth.getModel().getValue();
+		WMSPlugin.PROP_OVERLAP.put(overlapCheckBox.getModel().isSelected());
+		WMSPlugin.PROP_OVERLAP_EAST.put((Integer) spinEast.getModel().getValue());
+		WMSPlugin.PROP_OVERLAP_NORTH.put((Integer) spinNorth.getModel().getValue());
 		WMSPlugin.PROP_SIMULTANEOUS_CONNECTIONS.put((Integer) spinSimConn.getModel().getValue());
 		allowRemoteControl = remoteCheckBox.getModel().isSelected();
-
-		Main.pref.put("wmsplugin.url.overlap",    String.valueOf(WMSPlugin.doOverlap));
-		Main.pref.put("wmsplugin.url.overlapEast", String.valueOf(WMSPlugin.overlapEast));
-		Main.pref.put("wmsplugin.url.overlapNorth", String.valueOf(WMSPlugin.overlapNorth));
 
 		Main.pref.put("wmsplugin.browser", browser.getEditor().getItem().toString());
