Index: src/org/openstreetmap/gui/jmapviewer/JMapViewer.java
===================================================================
--- src/org/openstreetmap/gui/jmapviewer/JMapViewer.java	(revision 33312)
+++ src/org/openstreetmap/gui/jmapviewer/JMapViewer.java	(working copy)
@@ -44,6 +44,8 @@
  */
 public class JMapViewer extends JPanel implements TileLoaderListener {
 
+    private static final long serialVersionUID = 1L;
+
     /** whether debug mode is enabled or not */
     public static boolean debug;
 
@@ -502,7 +504,7 @@
             return (int) marker.getRadius();
         else if (p != null) {
             Integer radius = getLatOffset(marker.getLat(), marker.getLon(), marker.getRadius(), false);
-            radius = radius == null ? null : p.y - radius.intValue();
+            radius = radius == null ? null : p.y - radius;
             return radius;
         } else
             return null;
Index: src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java
===================================================================
--- src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java	(revision 33312)
+++ src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java	(working copy)
@@ -9,8 +9,9 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 import org.openstreetmap.gui.jmapviewer.interfaces.TileJob;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
@@ -22,7 +23,8 @@
  * @author Jan Peter Stotz
  */
 public class OsmTileLoader implements TileLoader {
-    private static final ThreadPoolExecutor jobDispatcher = (ThreadPoolExecutor) Executors.newFixedThreadPool(3);
+    
+    private static final ThreadPoolExecutor jobDispatcher = new ThreadPoolExecutor(8, 24, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2_000));
 
     private final class OsmTileJob implements TileJob {
         private final Tile tile;
@@ -178,7 +180,9 @@
 
     @Override
     public void cancelOutstandingTasks() {
-        jobDispatcher.getQueue().clear();
+        for (Runnable item : jobDispatcher.getQueue()) {
+            jobDispatcher.remove(item);
+        }
     }
 
     /**
Index: src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java
===================================================================
--- src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java	(revision 33312)
+++ src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java	(working copy)
@@ -263,7 +263,7 @@
             }
         }
         try {
-            return attributions.get(0, TimeUnit.MILLISECONDS);
+            return attributions.get(1500, TimeUnit.MILLISECONDS);
         } catch (TimeoutException ex) {
             System.err.println("Bing: attribution data is not yet loaded.");
         } catch (ExecutionException ex) {
Index: src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java
===================================================================
--- src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java	(revision 33312)
+++ src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java	(working copy)
@@ -1,6 +1,9 @@
 // License: GPL. For details, see Readme.txt file.
 package org.openstreetmap.gui.jmapviewer.tilesources;
 
+import java.io.IOException;
+import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
+
 /**
  * OSM Tile source.
  */
@@ -37,10 +40,12 @@
      */
     public static class CycleMap extends AbstractOsmTileSource {
 
-        private static final String PATTERN = "http://%s.tile.opencyclemap.org/cycle";
+        private static final String API_KEY = "API_KEY";
 
-        private static final String[] SERVER = {"a", "b", "c"};
+        private static final String PATTERN = "https://%s.tile.thunderforest.com/cycle";
 
+        private static final String[] SERVER = { "a", "b", "c" };
+
         private int serverNum;
 
         /**
@@ -47,7 +52,7 @@
          * Constructs a new {@code CycleMap} tile source.
          */
         public CycleMap() {
-            super("Cyclemap", PATTERN, "opencyclemap");
+            super("OSM Cycle Map", PATTERN, "opencyclemap");
         }
 
         @Override
@@ -61,5 +66,21 @@
         public int getMaxZoom() {
             return 18;
         }
+
+        @Override
+        public String getTileUrl(int zoom, int tilex, int tiley) throws IOException {
+            return this.getBaseUrl() + getTilePath(zoom, tilex, tiley); // + "?apikey=" + API_KEY;
+        }
+
+        @Override
+        public String getAttributionText(int zoom, ICoordinate topLeft, ICoordinate botRight) {
+            return "Maps © Thunderforest, Data © OpenStreetMap contributors";
+        }
+
+        @Override
+        public String getAttributionLinkURL() {
+            return "http://www.thunderforest.com/";
+        }
     }
+
 }
Index: src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java
===================================================================
--- src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java	(revision 33312)
+++ src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java	(working copy)
@@ -116,8 +116,8 @@
     @Override
     public Point latLonToXY(double lat, double lon, int zoom) {
         return new Point(
-                (int) osmMercator.lonToX(lon, zoom),
-                (int) latToTileY(lat, zoom)
+                (int) Math.round(osmMercator.lonToX(lon, zoom)),
+                (int) Math.round(latToTileY(lat, zoom))
                 );
     }
 
Index: src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java
===================================================================
--- src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java	(revision 33312)
+++ src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java	(working copy)
@@ -50,8 +50,8 @@
     @Override
     public Point latLonToXY(double lat, double lon, int zoom) {
         return new Point(
-                (int) osmMercator.lonToX(lon, zoom),
-                (int) osmMercator.latToY(lat, zoom)
+                (int) Math.round(osmMercator.lonToX(lon, zoom)),
+                (int) Math.round(osmMercator.latToY(lat, zoom))
                 );
     }
 
