Index: trunk/src/org/openstreetmap/josm/data/imagery/GeorefImage.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/GeorefImage.java	(revision 3807)
+++ trunk/src/org/openstreetmap/josm/data/imagery/GeorefImage.java	(revision 3808)
@@ -88,5 +88,6 @@
             g.setFont(tempFont);
             g.setColor(Color.BLACK);
-            g.drawString(tr("Not in cache"), 10, img.getHeight()/2);
+            String text = tr("Not in cache");
+            g.drawString(text, (img.getWidth() - g.getFontMetrics().stringWidth(text)) / 2, img.getHeight()/2);
             g.setFont(font);
             this.image = img;
@@ -100,5 +101,5 @@
 
     private BufferedImage createImage() {
-        return new BufferedImage(layer.getBaseImageWidth(), layer.getBaseImageHeight(), BufferedImage.TYPE_INT_RGB);
+        return new BufferedImage(layer.getImageSize(), layer.getImageSize(), BufferedImage.TYPE_INT_RGB);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3807)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3808)
@@ -201,5 +201,7 @@
         g.setFont(g.getFont().deriveFont(Font.PLAIN).deriveFont(36.0f));
         g.setColor(Color.BLACK);
-        g.drawString(tr("ERROR"), 30, img.getHeight()/2);
+
+        String text = tr("ERROR");
+        g.drawString(text, (img.getWidth() + g.getFontMetrics().stringWidth(text)) / 2, img.getHeight()/2);
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 3807)
+++ trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 3808)
@@ -8,4 +8,5 @@
 import java.awt.Graphics2D;
 import java.awt.event.ActionEvent;
+import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileInputStream;
@@ -275,11 +276,9 @@
 
     public int getImageWidth(int xIndex) {
-        int overlap = (int)(PROP_OVERLAP.get()?PROP_OVERLAP_EAST.get() * imageSize * getPPD() / info.getPixelPerDegree() / 100:0);
-        return getImageX(xIndex + 1) - getImageX(xIndex) + overlap;
+        return getImageX(xIndex + 1) - getImageX(xIndex);
     }
 
     public int getImageHeight(int yIndex) {
-        int overlap = (int)(PROP_OVERLAP.get()?PROP_OVERLAP_NORTH.get() * imageSize * getPPD() / info.getPixelPerDegree() / 100:0);
-        return getImageY(yIndex + 1) - getImageY(yIndex) + overlap;
+        return getImageY(yIndex + 1) - getImageY(yIndex);
     }
 
@@ -300,4 +299,22 @@
         int overlap = (PROP_OVERLAP.get()?PROP_OVERLAP_NORTH.get() * imageSize / 100:0);
         return imageSize + overlap;
+    }
+
+    public int getImageSize() {
+        return imageSize;
+    }
+
+    /**
+     * 
+     * @return When overlapping is enabled, return visible part of tile. Otherwise return original image
+     */
+    public BufferedImage normalizeImage(BufferedImage img) {
+        if (WMSLayer.PROP_OVERLAP.get() && (WMSLayer.PROP_OVERLAP_EAST.get() > 0 || WMSLayer.PROP_OVERLAP_NORTH.get() > 0)) {
+            BufferedImage copy = img;
+            img = new BufferedImage(imageSize, imageSize, copy.getType());
+            img.createGraphics().drawImage(copy, 0, 0, imageSize, imageSize,
+                    0, copy.getHeight() - imageSize, imageSize, copy.getHeight(), null);
+        }
+        return img;
     }
 
Index: trunk/src/org/openstreetmap/josm/io/imagery/HTMLGrabber.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/imagery/HTMLGrabber.java	(revision 3807)
+++ trunk/src/org/openstreetmap/josm/io/imagery/HTMLGrabber.java	(revision 3808)
@@ -43,5 +43,5 @@
         }
 
-        BufferedImage img = ImageIO.read(browser.getInputStream());
+        BufferedImage img = layer.normalizeImage(ImageIO.read(browser.getInputStream()));
         cache.saveImg(urlstring, img);
         return img;
Index: trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java	(revision 3807)
+++ trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java	(revision 3808)
@@ -181,5 +181,5 @@
 
         InputStream is = new ProgressInputStream(conn, null);
-        BufferedImage img = ImageIO.read(is);
+        BufferedImage img = layer.normalizeImage(ImageIO.read(is));
         is.close();
 
