Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractCachedTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractCachedTileSourceLayer.java	(revision 9859)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractCachedTileSourceLayer.java	(revision 9860)
@@ -9,4 +9,5 @@
 import org.apache.commons.jcs.access.behavior.ICacheAccess;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
+import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
@@ -22,7 +23,8 @@
  *
  * @author Wiktor Niesiobędzki
+ * @param <T> Tile Source class used by this Imagery Layer
  *
  */
-public abstract class AbstractCachedTileSourceLayer extends AbstractTileSourceLayer {
+public abstract class AbstractCachedTileSourceLayer<T extends AbstractTMSTileSource> extends AbstractTileSourceLayer<T> {
     /** loader factory responsible for loading tiles for all layers */
     private static Map<String, TileLoaderFactory> loaderFactories = new ConcurrentHashMap<>();
Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 9859)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java	(revision 9860)
@@ -95,8 +95,9 @@
  * @author Upliner
  * @author Wiktor Niesiobędzki
+ * @param <T> Tile Source class used for this layer
  * @since 3715
  * @since 8526 (copied from TMSLayer)
  */
-public abstract class AbstractTileSourceLayer extends ImageryLayer implements ImageObserver, TileLoaderListener, ZoomChangeListener {
+public abstract class AbstractTileSourceLayer<T extends AbstractTMSTileSource> extends ImageryLayer implements ImageObserver, TileLoaderListener, ZoomChangeListener {
     private static final String PREFERENCE_PREFIX = "imagery.generic";
 
@@ -151,5 +152,5 @@
      */
     protected TileCache tileCache; // initialized together with tileSource
-    protected AbstractTMSTileSource tileSource;
+    protected T tileSource;
     protected TileLoader tileLoader;
 
@@ -173,7 +174,7 @@
      * @throws IllegalArgumentException when Imagery is not supported by layer
      */
-    protected abstract AbstractTMSTileSource getTileSource(ImageryInfo info);
-
-    protected Map<String, String> getHeaders(TileSource tileSource) {
+    protected abstract T getTileSource(ImageryInfo info);
+
+    protected Map<String, String> getHeaders(T tileSource) {
         if (tileSource instanceof TemplatedTileSource) {
             return ((TemplatedTileSource) tileSource).getHeaders();
@@ -182,5 +183,5 @@
     }
 
-    protected void initTileSource(AbstractTMSTileSource tileSource) {
+    protected void initTileSource(T tileSource) {
         attribution.initialize(tileSource);
 
@@ -1180,4 +1181,5 @@
 
     private final TileSet nullTileSet = new TileSet((LatLon) null, (LatLon) null, 0);
+
     private final class TileSet {
         int x0, x1, y0, y1;
@@ -1349,5 +1351,5 @@
     }
 
-    private static TileSetInfo getTileSetInfo(TileSet ts) {
+    private static <S extends AbstractTMSTileSource> TileSetInfo getTileSetInfo(AbstractTileSourceLayer<S>.TileSet ts) {
         List<Tile> allTiles = ts.allExistingTiles();
         TileSetInfo result = new TileSetInfo();
@@ -1374,4 +1376,6 @@
         private final TileSet[] tileSets;
         private final TileSetInfo[] tileSetInfos;
+
+        @SuppressWarnings("unchecked")
         DeepTileSet(EastNorth topLeft, EastNorth botRight, int minZoom, int maxZoom) {
             this.topLeft = topLeft;
@@ -1379,5 +1383,5 @@
             this.minZoom = minZoom;
             this.maxZoom = maxZoom;
-            this.tileSets = new TileSet[maxZoom - minZoom + 1];
+            this.tileSets = new AbstractTileSourceLayer.TileSet[maxZoom - minZoom + 1];
             this.tileSetInfos = new TileSetInfo[maxZoom - minZoom + 1];
         }
@@ -1742,10 +1746,12 @@
      * To prevent accidental clear of the queue, new download executor is created with separate queue
      *
-     * @param precacheTask Task responsible for precaching imagery
+     * @param progressMonitor Task responsible for precaching imagery
      * @param points lat/lon coordinates to download
      * @param bufferX how many units in current Coordinate Reference System to cover in X axis in both sides
      * @param bufferY how many units in current Coordinate Reference System to cover in Y axis in both sides
-     */
-    public void downloadAreaToCache(final PrecacheTask precacheTask, List<LatLon> points, double bufferX, double bufferY) {
+     * @return
+     */
+    public AbstractTileSourceLayer<T>.PrecacheTask downloadAreaToCache(final ProgressMonitor progressMonitor, List<LatLon> points, double bufferX, double bufferY) {
+        PrecacheTask precacheTask = new PrecacheTask(progressMonitor);
         final Set<Tile> requestedTiles = new ConcurrentSkipListSet<>(new Comparator<Tile>() {
             @Override
@@ -1780,4 +1786,5 @@
             loader.createTileLoaderJob(t).submit();
         }
+        return precacheTask;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 9859)
+++ trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 9860)
@@ -33,5 +33,5 @@
  *
  */
-public class TMSLayer extends AbstractCachedTileSourceLayer implements NativeScaleLayer {
+public class TMSLayer extends AbstractCachedTileSourceLayer<TMSTileSource> implements NativeScaleLayer {
     private static final String CACHE_REGION_NAME = "TMS";
 
@@ -78,5 +78,5 @@
      */
     @Override
-    protected AbstractTMSTileSource getTileSource(ImageryInfo info) throws IllegalArgumentException {
+    protected TMSTileSource getTileSource(ImageryInfo info) throws IllegalArgumentException {
         return getTileSourceStatic(info, new Runnable() {
             @Override
@@ -127,5 +127,5 @@
      * @throws IllegalArgumentException if url from imagery info is null or invalid
      */
-    public static AbstractTMSTileSource getTileSourceStatic(ImageryInfo info, Runnable attributionLoadedTask) throws IllegalArgumentException {
+    public static TMSTileSource getTileSourceStatic(ImageryInfo info, Runnable attributionLoadedTask) throws IllegalArgumentException {
         if (info.getImageryType() == ImageryType.TMS) {
             TemplatedTMSTileSource.checkUrl(info.getUrl());
Index: trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 9859)
+++ trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 9860)
@@ -18,6 +18,4 @@
 import org.apache.commons.jcs.access.CacheAccess;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
-import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
-import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
@@ -37,5 +35,5 @@
  *
  */
-public class WMSLayer extends AbstractCachedTileSourceLayer {
+public class WMSLayer extends AbstractCachedTileSourceLayer<TemplatedWMSTileSource> {
     private static final String PREFERENCE_PREFIX   = "imagery.wms.";
 
@@ -75,5 +73,5 @@
 
     @Override
-    protected AbstractTMSTileSource getTileSource(ImageryInfo info) {
+    protected TemplatedWMSTileSource getTileSource(ImageryInfo info) {
         if (info.getImageryType() == ImageryType.WMS && info.getUrl() != null) {
             TemplatedWMSTileSource.checkUrl(info.getUrl());
@@ -105,9 +103,6 @@
 
     @Override
-    protected Map<String, String> getHeaders(TileSource tileSource) {
-        if (tileSource instanceof TemplatedWMSTileSource) {
-            return ((TemplatedWMSTileSource) tileSource).getHeaders();
-        }
-        return null;
+    protected Map<String, String> getHeaders(TemplatedWMSTileSource tileSource) {
+        return tileSource.getHeaders();
     }
 
@@ -155,6 +150,6 @@
         }
 
-        if (!newValue.equals(oldValue) && tileSource instanceof TemplatedWMSTileSource) {
-            ((TemplatedWMSTileSource) tileSource).initProjection(newValue);
+        if (!newValue.equals(oldValue)) {
+            tileSource.initProjection(newValue);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java	(revision 9859)
+++ trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java	(revision 9860)
@@ -7,5 +7,4 @@
 import org.apache.commons.jcs.access.CacheAccess;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
-import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
@@ -27,5 +26,5 @@
  *
  */
-public class WMTSLayer extends AbstractCachedTileSourceLayer implements NativeScaleLayer {
+public class WMTSLayer extends AbstractCachedTileSourceLayer<WMTSTileSource> implements NativeScaleLayer {
     /**
      * default setting of autozoom per layer
@@ -44,5 +43,5 @@
 
     @Override
-    protected AbstractTMSTileSource getTileSource(ImageryInfo info) {
+    protected WMTSTileSource getTileSource(ImageryInfo info) {
         try {
             if (info.getImageryType() == ImageryType.WMTS && info.getUrl() != null) {
@@ -78,5 +77,5 @@
     @Override
     public boolean isProjectionSupported(Projection proj) {
-        Set<String> supportedProjections = ((WMTSTileSource) tileSource).getSupportedProjections();
+        Set<String> supportedProjections = tileSource.getSupportedProjections();
         return supportedProjections.contains(proj.toCode());
     }
@@ -85,5 +84,5 @@
     public String nameSupportedProjections() {
         StringBuilder ret = new StringBuilder();
-        for (String e: ((WMTSTileSource) tileSource).getSupportedProjections()) {
+        for (String e: tileSource.getSupportedProjections()) {
             ret.append(e).append(", ");
         }
@@ -94,5 +93,5 @@
     public void projectionChanged(Projection oldValue, Projection newValue) {
         super.projectionChanged(oldValue, newValue);
-        ((WMTSTileSource) tileSource).initProjection(newValue);
+        tileSource.initProjection(newValue);
     }
 
@@ -116,5 +115,5 @@
     @Override
     public ScaleList getNativeScales() {
-        return ((WMTSTileSource) tileSource).getNativeScales();
+        return tileSource.getNativeScales();
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java	(revision 9859)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java	(revision 9860)
@@ -16,4 +16,5 @@
 import javax.swing.JPanel;
 
+import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AbstractMergeAction.LayerListCellRenderer;
@@ -26,5 +27,4 @@
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
-import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer.PrecacheTask;
 import org.openstreetmap.josm.gui.progress.ProgressTaskId;
 import org.openstreetmap.josm.gui.progress.ProgressTaskIds;
@@ -53,9 +53,9 @@
     static class PrecacheWmsTask extends PleaseWaitRunnable {
 
-        private final AbstractTileSourceLayer layer;
+        private final AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer;
         private final List<LatLon> points;
-        private PrecacheTask precacheTask;
+        private AbstractTileSourceLayer<? extends AbstractTMSTileSource>.PrecacheTask precacheTask;
 
-        protected PrecacheWmsTask(AbstractTileSourceLayer layer, List<LatLon> points) {
+        protected PrecacheWmsTask(AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer, List<LatLon> points) {
             super(tr("Precaching WMS"));
             this.layer = layer;
@@ -65,6 +65,5 @@
         @Override
         protected void realRun() throws SAXException, IOException, OsmTransferException {
-            precacheTask = layer.new PrecacheTask(progressMonitor);
-            layer.downloadAreaToCache(precacheTask, points, 0, 0);
+            precacheTask = layer.downloadAreaToCache(progressMonitor, points, 0, 0);
             while (!precacheTask.isFinished() && !progressMonitor.isCanceled()) {
                 synchronized (this) {
@@ -106,5 +105,5 @@
             points.add(p.getCoor());
         }
-        AbstractTileSourceLayer layer = askedLayer();
+        AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer = askedLayer();
         return layer != null ? new PrecacheWmsTask(layer, points) : null;
     }
@@ -118,5 +117,6 @@
     }
 
-    protected AbstractTileSourceLayer askedLayer() {
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    protected AbstractTileSourceLayer<? extends AbstractTMSTileSource> askedLayer() {
         if (!Main.isDisplayingMapView()) {
             return null;
