Index: applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java
===================================================================
--- applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java	(revision 24529)
+++ applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java	(revision 24530)
@@ -14,4 +14,5 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.awt.font.TextAttribute;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.ImageObserver;
@@ -20,4 +21,5 @@
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -42,4 +44,5 @@
 import org.openstreetmap.josm.actions.RenameLayerAction;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
@@ -102,6 +105,6 @@
     public int currentZoomLevel;
 
-    LatLon lastTopLeft;
-    LatLon lastBotRight;
+    EastNorth lastTopLeft;
+    EastNorth lastBotRight;
     private Image bufferImage;
     private Tile clickedTile;
@@ -114,6 +117,11 @@
     private String attrTermsUrl;
     private Rectangle attrImageBounds, attrToUBounds;
-    private static Font ATTR_FONT = Font.decode("Arial 10");
-    private static Font ATTR_LINK_FONT = Font.decode("Arial Underline 10");
+    private static final Font ATTR_FONT = new Font("Arial", Font.PLAIN, 10);
+    private static final Font ATTR_LINK_FONT;
+    static {
+        HashMap<TextAttribute, Integer> aUnderline = new HashMap<TextAttribute, Integer>();
+        aUnderline.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
+        ATTR_LINK_FONT = ATTR_FONT.deriveFont(aUnderline);
+    }
 
     protected boolean autoZoom;
@@ -479,6 +487,6 @@
     void loadAllTiles(boolean force) {
         MapView mv = Main.map.mapView;
-        LatLon topLeft = mv.getLatLon(0, 0);
-        LatLon botRight = mv.getLatLon(mv.getWidth(), mv.getHeight());
+        EastNorth topLeft = mv.getEastNorth(0, 0);
+        EastNorth botRight = mv.getEastNorth(mv.getWidth(), mv.getHeight());
 
         TileSet ts = new TileSet(topLeft, botRight, currentZoomLevel);
@@ -788,6 +796,18 @@
         int tileMax = -1;
 
+        /**
+         * Create a TileSet by EastNorth bbox taking a layer shift in account
+         */
+        TileSet(EastNorth topLeft, EastNorth botRight, int zoom) {
+            this(Main.proj.eastNorth2latlon(topLeft.add(-getDx(), -getDy())),
+                 Main.proj.eastNorth2latlon(botRight.add(-getDx(), -getDy())),zoom);
+        }
+
+        /**
+         * Create a TileSet by known LatLon bbox without layer shift correction
+         */
         TileSet(LatLon topLeft, LatLon botRight, int zoom) {
             this.zoom = zoom;
+
             z12x0 = lonToTileX(topLeft.lon(),  zoom);
             z12y0 = latToTileY(topLeft.lat(),  zoom);
@@ -860,6 +880,5 @@
         {
             List<Tile> tiles = this.allTiles(true);
-            boolean autoload = TMSLayer.this.autoLoad;
-            if (!autoload && !force)
+            if (!autoLoad && !force)
                return;
             int nr_queued = 0;
@@ -886,9 +905,9 @@
     public void paint(Graphics2D g, MapView mv, Bounds bounds) {
         //long start = System.currentTimeMillis();
-        LatLon topLeft = mv.getLatLon(0, 0);
-        LatLon botRight = mv.getLatLon(mv.getWidth(), mv.getHeight());
+        EastNorth topLeft = mv.getEastNorth(0, 0);
+        EastNorth botRight = mv.getEastNorth(mv.getWidth(), mv.getHeight());
         Graphics2D oldg = g;
 
-        if (botRight.lon() == 0.0 || botRight.lat() == 0) {
+        if (botRight.east() == 0.0 || botRight.north() == 0) {
             Main.debug("still initializing??");
             // probably still initializing
@@ -896,6 +915,6 @@
         }
 
-        if (lastTopLeft != null && lastBotRight != null && topLeft.equalsEpsilon(lastTopLeft)
-                && botRight.equalsEpsilon(lastBotRight) && bufferImage != null
+        if (lastTopLeft != null && lastBotRight != null && topLeft.equals(lastTopLeft)
+                && botRight.equals(lastBotRight) && bufferImage != null
                 && mv.getWidth() == bufferImage.getWidth(null) && mv.getHeight() == bufferImage.getHeight(null)
                 && !needRedraw) {
@@ -990,5 +1009,5 @@
         if (tileSource.requiresAttribution()) {
             // Draw attribution
-            g.setColor(Color.white);
+            g.setColor(Color.black);
             Font font = g.getFont();
             g.setFont(ATTR_LINK_FONT);
@@ -1011,10 +1030,12 @@
                 int x = 2;
                 int height = attrImage.getHeight(this);
-                int y = termsTextY - height;
+                int y = termsTextY - height - textHeight - 5;
                 attrImageBounds = new Rectangle(x, y, imgWidth, height);
                 g.drawImage(attrImage, x, y, this);
             }
 
-            String attributionText = tileSource.getAttributionText(currentZoomLevel, topLeft, botRight);
+            g.setFont(ATTR_FONT);
+            String attributionText = tileSource.getAttributionText(currentZoomLevel,
+                    Main.proj.eastNorth2latlon(topLeft), Main.proj.eastNorth2latlon(botRight));
             Rectangle2D stringBounds = g.getFontMetrics().getStringBounds(attributionText, g);
             g.drawString(attributionText, mv.getWidth() - (int) stringBounds.getWidth(), mv.getHeight() - textHeight);
@@ -1062,6 +1083,6 @@
         MapView mv = Main.map.mapView;
         Point clicked = new Point(px, py);
-        LatLon topLeft = mv.getLatLon(0, 0);
-        LatLon botRight = mv.getLatLon(mv.getWidth(), mv.getHeight());
+        EastNorth topLeft = mv.getEastNorth(0, 0);
+        EastNorth botRight = mv.getEastNorth(mv.getWidth(), mv.getHeight());
         int z = currentZoomLevel;
         TileSet ts = new TileSet(topLeft, botRight, z);
Index: applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSPreferences.java
===================================================================
--- applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSPreferences.java	(revision 24529)
+++ applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSPreferences.java	(revision 24530)
@@ -59,6 +59,6 @@
             maxZoomLvl = PROP_MIN_ZOOM_LVL.get();
         }
-        if (ts != null && ts.getMaxZoom() < PROP_MIN_ZOOM_LVL.get()) {
-            System.err.println("decreasing maxZoomLvl to match new tile source");
+        if (ts != null && ts.getMaxZoom() < maxZoomLvl) {
+            System.err.println("decreasing maxZoomLvl to match tile source");
             maxZoomLvl = ts.getMaxZoom();
         }
@@ -86,6 +86,6 @@
             minZoomLvl = getMaxZoomLvl(ts);
         }
-        if (ts != null && ts.getMinZoom() > PROP_MIN_ZOOM_LVL.get()) {
-            System.err.println("increasomg minZoomLvl to match new tile source");
+        if (ts != null && ts.getMinZoom() > minZoomLvl) {
+            System.err.println("increasomg minZoomLvl to match tile source");
             minZoomLvl = ts.getMinZoom();
         }
Index: applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapLayer.java
===================================================================
--- applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapLayer.java	(revision 24529)
+++ applications/editors/josm/plugins/slippymap/src/org/openstreetmap/josm/plugins/slippymap/SlippyMapLayer.java	(revision 24530)
@@ -14,4 +14,5 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.awt.font.TextAttribute;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.ImageObserver;
@@ -20,4 +21,5 @@
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -112,6 +114,11 @@
     private String attrTermsUrl;
     private Rectangle attrImageBounds, attrToUBounds;
-    private static Font ATTR_FONT = Font.decode("Arial 10");
-    private static Font ATTR_LINK_FONT = Font.decode("Arial Underline 10");
+    private static final Font ATTR_FONT = new Font("Arial", Font.PLAIN, 10);
+    private static final Font ATTR_LINK_FONT;
+    static {
+        HashMap<TextAttribute, Integer> aUnderline = new HashMap<TextAttribute, Integer>();
+        aUnderline.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
+        ATTR_LINK_FONT = ATTR_FONT.deriveFont(aUnderline);
+    }
 
     void redraw()
@@ -979,9 +986,10 @@
                 int x = 2;
                 int height = attrImage.getHeight(this);
-                int y = termsTextY - height;
+                int y = termsTextY - height - textHeight - 5;
                 attrImageBounds = new Rectangle(x, y, imgWidth, height);
                 g.drawImage(attrImage, x, y, this);
             }
             
+            g.setFont(ATTR_FONT);
             String attributionText = tileSource.getAttributionText(currentZoomLevel, topLeft, botRight);
             Rectangle2D stringBounds = g.getFontMetrics().getStringBounds(attributionText, g);
