diff --git a/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java b/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java
index 76d198c8..85276cc3 100644
--- a/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java
+++ b/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java
@@ -26,6 +26,7 @@ import org.oscim.backend.canvas.Color;
 import org.oscim.backend.canvas.Paint;
 import org.oscim.core.GeoPoint;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
@@ -66,7 +67,7 @@ public class AtlasMultiTextureActivity extends MarkerOverlayActivity {
         paint.setTextSize(12 * CanvasAdapter.getScale());
         paint.setStrokeWidth(2 * CanvasAdapter.getScale());
         paint.setColor(Color.BLACK);
-        List<MarkerItem> pts = new ArrayList<>();
+        List<MarkerInterface> pts = new ArrayList<>();
         for (double lat = -90; lat <= 90; lat += 10) {
             for (double lon = -180; lon <= 180; lon += 10) {
                 String title = lat + "/" + lon;
@@ -86,29 +87,32 @@ public class AtlasMultiTextureActivity extends MarkerOverlayActivity {
         // With iOS we must flip the Y-Axis
         TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false);
 
-        mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), (MarkerSymbol) null, this);
+        mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), (MarkerSymbol) null, this);
         mMap.layers().add(mMarkerLayer);
 
         mMarkerLayer.addItems(pts);
 
         // set all markers
-        for (MarkerItem item : pts) {
-            MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER);
-            item.setMarker(markerSymbol);
+        for (MarkerInterface item : pts) {
+            MarkerItem markerItem = (MarkerItem) item;
+            MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(markerItem.getTitle()), HotspotPlace.BOTTOM_CENTER);
+            markerItem.setMarker(markerSymbol);
         }
 
         Toast.makeText(this, "Atlas count: " + atlasList.size(), Toast.LENGTH_SHORT).show();
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
-        Toast.makeText(this, "Marker tap\n" + item.getTitle(), Toast.LENGTH_SHORT).show();
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        Toast.makeText(this, "Marker tap\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
         return true;
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
-        Toast.makeText(this, "Marker long press\n" + item.getTitle(), Toast.LENGTH_SHORT).show();
+    public boolean onItemLongPress(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        Toast.makeText(this, "Marker long press\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
         return true;
     }
 }
diff --git a/vtm-android-example/src/org/oscim/android/test/ClusterMarkerOverlayActivity.java b/vtm-android-example/src/org/oscim/android/test/ClusterMarkerOverlayActivity.java
index ae64622a..9f89ebda 100644
--- a/vtm-android-example/src/org/oscim/android/test/ClusterMarkerOverlayActivity.java
+++ b/vtm-android-example/src/org/oscim/android/test/ClusterMarkerOverlayActivity.java
@@ -65,15 +65,15 @@ public class ClusterMarkerOverlayActivity extends MarkerOverlayActivity {
                 };
             }
         };
-        mMarkerLayer = new ItemizedLayer<>(
+        mMarkerLayer = new ItemizedLayer(
                 mMap,
-                new ArrayList<MarkerItem>(),
+                new ArrayList<MarkerInterface>(),
                 markerRendererFactory,
                 this);
         mMap.layers().add(mMarkerLayer);
 
         // Create some markers spaced STEP degrees
-        List<MarkerItem> pts = new ArrayList<>();
+        List<MarkerInterface> pts = new ArrayList<>();
         mMap.setMapPosition(53.08, 8.83, 1 << 15);
         GeoPoint center = mMap.getMapPosition().getGeoPoint();
         for (int x = -COUNT; x < COUNT; x++) {
diff --git a/vtm-android-example/src/org/oscim/android/test/MarkerOverlayActivity.java b/vtm-android-example/src/org/oscim/android/test/MarkerOverlayActivity.java
index 0fac44cd..abaaab74 100644
--- a/vtm-android-example/src/org/oscim/android/test/MarkerOverlayActivity.java
+++ b/vtm-android-example/src/org/oscim/android/test/MarkerOverlayActivity.java
@@ -28,6 +28,7 @@ import org.oscim.event.GestureListener;
 import org.oscim.event.MotionEvent;
 import org.oscim.layers.Layer;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
@@ -41,12 +42,11 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class MarkerOverlayActivity extends MapActivity
-        implements ItemizedLayer.OnItemGestureListener<MarkerItem> {
+public class MarkerOverlayActivity extends MapActivity implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
 
     static final boolean BILLBOARDS = true;
     MarkerSymbol mFocusMarker;
-    ItemizedLayer<MarkerItem> mMarkerLayer;
+    ItemizedLayer mMarkerLayer;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -78,10 +78,10 @@ public class MarkerOverlayActivity extends MapActivity
         else
             mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.CENTER, false);
 
-        mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
+        mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
         mMap.layers().add(mMarkerLayer);
 
-        List<MarkerItem> pts = new ArrayList<>();
+        List<MarkerInterface> pts = new ArrayList<>();
 
         for (double lat = -90; lat <= 90; lat += 5) {
             for (double lon = -180; lon <= 180; lon += 5)
@@ -100,24 +100,26 @@ public class MarkerOverlayActivity extends MapActivity
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
-        if (item.getMarker() == null)
-            item.setMarker(mFocusMarker);
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        if (markerItem.getMarker() == null)
+            markerItem.setMarker(mFocusMarker);
         else
-            item.setMarker(null);
+            markerItem.setMarker(null);
 
-        Toast.makeText(this, "Marker tap\n" + item.getTitle(), Toast.LENGTH_SHORT).show();
+        Toast.makeText(this, "Marker tap\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
         return true;
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
-        if (item.getMarker() == null)
-            item.setMarker(mFocusMarker);
+    public boolean onItemLongPress(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        if (markerItem.getMarker() == null)
+            markerItem.setMarker(mFocusMarker);
         else
-            item.setMarker(null);
+            markerItem.setMarker(null);
 
-        Toast.makeText(this, "Marker long press\n" + item.getTitle(), Toast.LENGTH_SHORT).show();
+        Toast.makeText(this, "Marker long press\n" + markerItem.getTitle(), Toast.LENGTH_SHORT).show();
         return true;
     }
 
diff --git a/vtm-android-example/src/org/oscim/android/test/PoiSearchActivity.java b/vtm-android-example/src/org/oscim/android/test/PoiSearchActivity.java
index d0b553b3..0b31d3c2 100644
--- a/vtm-android-example/src/org/oscim/android/test/PoiSearchActivity.java
+++ b/vtm-android-example/src/org/oscim/android/test/PoiSearchActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017-2019 devemux86
+ * Copyright 2017-2020 devemux86
  * Copyright 2018 Gustl22
  *
  * This program is free software: you can redistribute it and/or modify it under the
@@ -41,6 +41,7 @@ import org.oscim.event.GestureListener;
 import org.oscim.event.MotionEvent;
 import org.oscim.layers.Layer;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.map.Map;
@@ -57,14 +58,14 @@ import java.util.List;
  * Long press on map to search inside visible bounding box.<br/>
  * Tap on POIs to show their name (in default locale).
  */
-public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLayer.OnItemGestureListener<MarkerItem> {
+public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
 
     private static final Logger log = LoggerFactory.getLogger(PoiSearchActivity.class);
 
     private static final String POI_CATEGORY = "Restaurants";
     private static final int SELECT_POI_FILE = MapsforgeActivity.SELECT_THEME_FILE + 1;
 
-    private ItemizedLayer<MarkerItem> mMarkerLayer;
+    private ItemizedLayer mMarkerLayer;
     private PoiPersistenceManager mPersistenceManager;
 
     public static class PoiFilePicker extends FilePicker {
@@ -154,19 +155,20 @@ public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLaye
 
             Bitmap bitmap = new AndroidBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.marker_green));
             MarkerSymbol symbol = new MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.BOTTOM_CENTER);
-            mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
+            mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
             mMap.layers().add(mMarkerLayer);
         }
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
-        Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        Toast.makeText(this, markerItem.getTitle(), Toast.LENGTH_SHORT).show();
         return true;
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
+    public boolean onItemLongPress(int index, MarkerInterface item) {
         return false;
     }
 
@@ -315,7 +317,7 @@ public class PoiSearchActivity extends MapsforgeActivity implements ItemizedLaye
             }
 
             // Overlay POI
-            List<MarkerItem> pts = new ArrayList<>();
+            List<MarkerInterface> pts = new ArrayList<>();
             for (PointOfInterest pointOfInterest : pointOfInterests)
                 pts.add(new MarkerItem(pointOfInterest.getName(), "", new GeoPoint(pointOfInterest.getLatitude(), pointOfInterest.getLongitude())));
             mMarkerLayer.addItems(pts);
diff --git a/vtm-app/src/org/oscim/app/POISearch.java b/vtm-app/src/org/oscim/app/POISearch.java
index a779218e..2924a3d0 100644
--- a/vtm-app/src/org/oscim/app/POISearch.java
+++ b/vtm-app/src/org/oscim/app/POISearch.java
@@ -23,19 +23,14 @@ import android.view.View;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.Toast;
-
 import org.oscim.android.canvas.AndroidGraphics;
 import org.oscim.core.BoundingBox;
 import org.oscim.core.GeoPoint;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
 import org.oscim.map.Map;
-import org.osmdroid.location.FlickrPOIProvider;
-import org.osmdroid.location.FourSquareProvider;
-import org.osmdroid.location.GeoNamesPOIProvider;
-import org.osmdroid.location.NominatimPOIProvider;
-import org.osmdroid.location.POI;
-import org.osmdroid.location.PicasaPOIProvider;
+import org.osmdroid.location.*;
 import org.osmdroid.overlays.DefaultInfoWindow;
 import org.osmdroid.overlays.ExtendedMarkerItem;
 import org.osmdroid.overlays.ItemizedOverlayWithBubble;
@@ -45,7 +40,7 @@ import java.util.List;
 
 public class POISearch {
     private final ArrayList<POI> mPOIs;
-    ItemizedOverlayWithBubble<ExtendedMarkerItem> poiMarkers;
+    ItemizedOverlayWithBubble poiMarkers;
     MarkerSymbol[] mMarkers;
 
     private static final int MDEFAULT = 0;
@@ -57,9 +52,9 @@ public class POISearch {
     POISearch() {
         mPOIs = new ArrayList<POI>();
         //POI markers:
-        final ArrayList<ExtendedMarkerItem> poiItems = new ArrayList<ExtendedMarkerItem>();
+        final ArrayList<MarkerInterface> poiItems = new ArrayList<>();
 
-        poiMarkers = new ItemizedOverlayWithBubble<ExtendedMarkerItem>(App.map,
+        poiMarkers = new ItemizedOverlayWithBubble(App.map,
                 App.activity,
                 null,
                 poiItems,
diff --git a/vtm-app/src/org/oscim/app/RouteSearch.java b/vtm-app/src/org/oscim/app/RouteSearch.java
index 92ef14e1..cb2e47a5 100644
--- a/vtm-app/src/org/oscim/app/RouteSearch.java
+++ b/vtm-app/src/org/oscim/app/RouteSearch.java
@@ -24,10 +24,10 @@ import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
-
 import org.oscim.android.canvas.AndroidGraphics;
 import org.oscim.core.GeoPoint;
 import org.oscim.layers.PathLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
 import org.osmdroid.location.GeocoderNominatim;
@@ -48,7 +48,7 @@ public class RouteSearch {
 
     private final PathLayer mRouteOverlay;
     //private final ItemizedOverlayWithBubble<ExtendedOverlayItem> mRouteMarkers;
-    private final ItemizedOverlayWithBubble<ExtendedMarkerItem> mItineraryMarkers;
+    private final ItemizedOverlayWithBubble mItineraryMarkers;
 
     private final RouteBar mRouteBar;
 
@@ -63,9 +63,9 @@ public class RouteSearch {
         mViaPoints = new ArrayList<GeoPoint>();
 
         // Itinerary markers:
-        ArrayList<ExtendedMarkerItem> waypointsItems = new ArrayList<ExtendedMarkerItem>();
+        ArrayList<MarkerInterface> waypointsItems = new ArrayList<>();
 
-        mItineraryMarkers = new ItemizedOverlayWithBubble<ExtendedMarkerItem>(App.map,
+        mItineraryMarkers = new ItemizedOverlayWithBubble(App.map,
                 App.activity,
                 null,
                 waypointsItems,
diff --git a/vtm-app/src/org/osmdroid/overlays/ItemizedOverlayWithBubble.java b/vtm-app/src/org/osmdroid/overlays/ItemizedOverlayWithBubble.java
index 15925709..4b064e25 100644
--- a/vtm-app/src/org/osmdroid/overlays/ItemizedOverlayWithBubble.java
+++ b/vtm-app/src/org/osmdroid/overlays/ItemizedOverlayWithBubble.java
@@ -2,7 +2,6 @@ package org.osmdroid.overlays;
 
 import android.content.Context;
 import android.util.Log;
-
 import org.oscim.app.App;
 import org.oscim.core.GeoPoint;
 import org.oscim.core.MapPosition;
@@ -10,6 +9,7 @@ import org.oscim.core.Point;
 import org.oscim.event.Event;
 import org.oscim.event.MotionEvent;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.map.Map;
@@ -22,14 +22,12 @@ import java.util.List;
  * taps on an overlay item, and displays item attributes. <br>
  * Items must be ExtendedMarkerItem. <br>
  *
- * @param <Item> ...
  * @author M.Kergall
  * @see ExtendedMarkerItem
  * @see InfoWindow
  */
-public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
-        ItemizedLayer<Item> implements
-        ItemizedLayer.OnItemGestureListener<Item>, Map.UpdateListener {
+public class ItemizedOverlayWithBubble extends ItemizedLayer
+        implements ItemizedLayer.OnItemGestureListener<MarkerInterface>, Map.UpdateListener {
 
     /* only one for all items of this overlay => one at a time */
     protected InfoWindow mBubble;
@@ -40,7 +38,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
     static int layoutResId = 0;
 
     public ItemizedOverlayWithBubble(Map map, Context context,
-                                     MarkerSymbol marker, List<Item> list, InfoWindow bubble) {
+                                     MarkerSymbol marker, List<MarkerInterface> list, InfoWindow bubble) {
         super(map, list, marker, null);
 
         if (bubble != null) {
@@ -66,12 +64,12 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
     }
 
     public ItemizedOverlayWithBubble(Map map, Context context,
-                                     MarkerSymbol marker, List<Item> aList) {
+                                     MarkerSymbol marker, List<MarkerInterface> aList) {
         this(map, context, marker, aList, null);
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
+    public boolean onItemLongPress(int index, MarkerInterface item) {
         if (mBubble.isOpen())
             hideBubble();
         else
@@ -80,7 +78,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
         showBubble(index);
 
         return true;
@@ -121,7 +119,6 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
      *
      * @param index of the overlay item to show
      */
-    @SuppressWarnings("unchecked")
     public void showBubbleOnItem(int index) {
         ExtendedMarkerItem item = (ExtendedMarkerItem) (mItemList.get(index));
         mItemWithBubble = item;
@@ -131,7 +128,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
             mMap.animator().animateTo(item.geoPoint);
 
             mMap.updateMap(true);
-            setFocus((Item) item);
+            setFocus(item);
         }
     }
 
@@ -179,7 +176,7 @@ public class ItemizedOverlayWithBubble<Item extends MarkerItem> extends
     }
 
     @Override
-    public synchronized boolean removeItem(final Item item) {
+    public synchronized boolean removeItem(final MarkerInterface item) {
         boolean result = super.removeItem(item);
         if (mItemWithBubble == item) {
             hideBubble();
diff --git a/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java b/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java
index 98e755b0..bc7b255e 100644
--- a/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java
+++ b/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java
@@ -23,6 +23,7 @@ import org.oscim.backend.canvas.Paint;
 import org.oscim.core.GeoPoint;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.tile.bitmap.BitmapTileLayer;
@@ -66,7 +67,7 @@ public class AtlasMultiTextureTest extends MarkerLayerTest {
         paint.setTextSize(12);
         paint.setStrokeWidth(2);
         paint.setColor(Color.BLACK);
-        List<MarkerItem> pts = new ArrayList<>();
+        List<MarkerInterface> pts = new ArrayList<>();
         for (double lat = -90; lat <= 90; lat += 5) {
             for (double lon = -180; lon <= 180; lon += 5) {
                 String title = lat + "/" + lon;
@@ -86,29 +87,32 @@ public class AtlasMultiTextureTest extends MarkerLayerTest {
         // With iOS we must flip the Y-Axis
         TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false);
 
-        mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), (MarkerSymbol) null, this);
+        mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), (MarkerSymbol) null, this);
         mMap.layers().add(mMarkerLayer);
 
         mMarkerLayer.addItems(pts);
 
         // set all markers
-        for (MarkerItem item : pts) {
-            MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER);
-            item.setMarker(markerSymbol);
+        for (MarkerInterface item : pts) {
+            MarkerItem markerItem = (MarkerItem) item;
+            MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(markerItem.getTitle()), HotspotPlace.BOTTOM_CENTER);
+            markerItem.setMarker(markerSymbol);
         }
 
         System.out.println("Atlas count: " + atlasList.size());
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
-        System.out.println("Marker tap " + item.getTitle());
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        System.out.println("Marker tap " + markerItem.getTitle());
         return true;
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
-        System.out.println("Marker long press " + item.getTitle());
+    public boolean onItemLongPress(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        System.out.println("Marker long press " + markerItem.getTitle());
         return true;
     }
 
diff --git a/vtm-playground/src/org/oscim/test/ClusterMarkerLayerTest.java b/vtm-playground/src/org/oscim/test/ClusterMarkerLayerTest.java
index 3bfed4c4..07988e20 100644
--- a/vtm-playground/src/org/oscim/test/ClusterMarkerLayerTest.java
+++ b/vtm-playground/src/org/oscim/test/ClusterMarkerLayerTest.java
@@ -69,15 +69,15 @@ public class ClusterMarkerLayerTest extends MarkerLayerTest {
                     };
                 }
             };
-            mMarkerLayer = new ItemizedLayer<>(
+            mMarkerLayer = new ItemizedLayer(
                     mMap,
-                    new ArrayList<MarkerItem>(),
+                    new ArrayList<MarkerInterface>(),
                     markerRendererFactory,
                     this);
             mMap.layers().add(mMarkerLayer);
 
             // Create some markers spaced STEP degrees
-            List<MarkerItem> pts = new ArrayList<>();
+            List<MarkerInterface> pts = new ArrayList<>();
             GeoPoint center = mMap.getMapPosition().getGeoPoint();
             for (int x = -COUNT; x < COUNT; x++) {
                 for (int y = -COUNT; y < COUNT; y++) {
diff --git a/vtm-playground/src/org/oscim/test/MarkerLayerLabelsTest.java b/vtm-playground/src/org/oscim/test/MarkerLayerLabelsTest.java
index c1534746..1a6ed3a9 100644
--- a/vtm-playground/src/org/oscim/test/MarkerLayerLabelsTest.java
+++ b/vtm-playground/src/org/oscim/test/MarkerLayerLabelsTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-2018 devemux86
+ * Copyright 2016-2020 devemux86
  * Copyright 2019 telemaxx
  *
  * This program is free software: you can redistribute it and/or modify it under the
@@ -25,6 +25,7 @@ import org.oscim.event.MotionEvent;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.Layer;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.tile.vector.VectorTileLayer;
@@ -41,7 +42,7 @@ import java.util.List;
 
 import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
 
-public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerItem> {
+public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
 
     private static final int FG_COLOR = 0xFF000000; // 100 percent black. AARRGGBB
     private static final int BG_COLOR = 0x80FF69B4; // 50 percent pink. AARRGGBB
@@ -87,11 +88,11 @@ public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.On
             //Bitmap bitmapPoi = CanvasAdapter.decodeBitmap(getClass().getResourceAsStream("/res/marker_poi2.png"));
             MarkerSymbol symbol = new MarkerSymbol(bitmapPoi, HotspotPlace.CENTER, false);
 
-            ItemizedLayer<MarkerItem> markerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
+            ItemizedLayer markerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
             mMap.layers().add(markerLayer);
 
             // creating some poi's
-            List<MarkerItem> pts = new ArrayList<>();
+            List<MarkerInterface> pts = new ArrayList<>();
             pts.add(new MarkerItem("Brandenburger Tor", "#1789-1793", new GeoPoint(52.516275, 13.377704)));
             pts.add(new MarkerItem("Siegessaeule, hidden description", "this is a hidden Description without a #", new GeoPoint(52.514543, 13.350119)));
             pts.add(new MarkerItem("Gleisdreieck, without description", "", new GeoPoint(52.499562, 13.374063)));
@@ -101,9 +102,10 @@ public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.On
                     + "is drawn on the map\n"
                     + "the rest is surpressed", new GeoPoint(52.509352, 13.375739)));
 
-            for (MarkerItem mi : pts) {
-                System.out.println("title: " + mi.title);
-                mi.setMarker(createAdvancedSymbol(mi, bitmapPoi));
+            for (MarkerInterface mi : pts) {
+                MarkerItem markerItem = (MarkerItem) mi;
+                System.out.println("title: " + markerItem.title);
+                markerItem.setMarker(createAdvancedSymbol(markerItem, bitmapPoi));
             }
 
             markerLayer.addItems(pts);
@@ -198,14 +200,16 @@ public class MarkerLayerLabelsTest extends GdxMapApp implements ItemizedLayer.On
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
-        System.out.println("Marker tap " + item.getTitle());
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        System.out.println("Marker tap " + markerItem.getTitle());
         return true;
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
-        System.out.println("Marker long press " + item.getTitle());
+    public boolean onItemLongPress(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        System.out.println("Marker long press " + markerItem.getTitle());
         return true;
     }
 
diff --git a/vtm-playground/src/org/oscim/test/MarkerLayerTest.java b/vtm-playground/src/org/oscim/test/MarkerLayerTest.java
index 167d79c2..c2fc3ef3 100644
--- a/vtm-playground/src/org/oscim/test/MarkerLayerTest.java
+++ b/vtm-playground/src/org/oscim/test/MarkerLayerTest.java
@@ -23,6 +23,7 @@ import org.oscim.event.MotionEvent;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.Layer;
 import org.oscim.layers.marker.ItemizedLayer;
+import org.oscim.layers.marker.MarkerInterface;
 import org.oscim.layers.marker.MarkerItem;
 import org.oscim.layers.marker.MarkerSymbol;
 import org.oscim.layers.tile.bitmap.BitmapTileLayer;
@@ -38,11 +39,11 @@ import java.util.List;
 
 import static org.oscim.layers.marker.MarkerSymbol.HotspotPlace;
 
-public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerItem> {
+public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGestureListener<MarkerInterface> {
 
     static final boolean BILLBOARDS = true;
     MarkerSymbol mFocusMarker;
-    ItemizedLayer<MarkerItem> mMarkerLayer;
+    ItemizedLayer mMarkerLayer;
 
     @Override
     public void createLayers() {
@@ -71,10 +72,10 @@ public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGe
             else
                 mFocusMarker = new MarkerSymbol(bitmapFocus, HotspotPlace.CENTER, false);
 
-            mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList<MarkerItem>(), symbol, this);
+            mMarkerLayer = new ItemizedLayer(mMap, new ArrayList<MarkerInterface>(), symbol, this);
             mMap.layers().add(mMarkerLayer);
 
-            List<MarkerItem> pts = new ArrayList<>();
+            List<MarkerInterface> pts = new ArrayList<>();
             for (double lat = -90; lat <= 90; lat += 5) {
                 for (double lon = -180; lon <= 180; lon += 5)
                     pts.add(new MarkerItem(lat + "/" + lon, "", new GeoPoint(lat, lon)));
@@ -86,24 +87,26 @@ public class MarkerLayerTest extends GdxMapApp implements ItemizedLayer.OnItemGe
     }
 
     @Override
-    public boolean onItemSingleTapUp(int index, MarkerItem item) {
-        if (item.getMarker() == null)
-            item.setMarker(mFocusMarker);
+    public boolean onItemSingleTapUp(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        if (markerItem.getMarker() == null)
+            markerItem.setMarker(mFocusMarker);
         else
-            item.setMarker(null);
+            markerItem.setMarker(null);
 
-        System.out.println("Marker tap " + item.getTitle());
+        System.out.println("Marker tap " + markerItem.getTitle());
         return true;
     }
 
     @Override
-    public boolean onItemLongPress(int index, MarkerItem item) {
-        if (item.getMarker() == null)
-            item.setMarker(mFocusMarker);
+    public boolean onItemLongPress(int index, MarkerInterface item) {
+        MarkerItem markerItem = (MarkerItem) item;
+        if (markerItem.getMarker() == null)
+            markerItem.setMarker(mFocusMarker);
         else
-            item.setMarker(null);
+            markerItem.setMarker(null);
 
-        System.out.println("Marker long press " + item.getTitle());
+        System.out.println("Marker long press " + markerItem.getTitle());
         return true;
     }
 
diff --git a/vtm/src/org/oscim/layers/marker/ClusterMarkerRenderer.java b/vtm/src/org/oscim/layers/marker/ClusterMarkerRenderer.java
index f91b9bac..c81a6abd 100644
--- a/vtm/src/org/oscim/layers/marker/ClusterMarkerRenderer.java
+++ b/vtm/src/org/oscim/layers/marker/ClusterMarkerRenderer.java
@@ -98,7 +98,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
      * @param defaultSymbol The default symbol
      * @param style         The desired style, or NULL to disable clustering
      */
-    public ClusterMarkerRenderer(MarkerLayer<MarkerInterface> markerLayer, MarkerSymbol defaultSymbol, ClusterMarkerRenderer.ClusterStyle style) {
+    public ClusterMarkerRenderer(MarkerLayer markerLayer, MarkerSymbol defaultSymbol, ClusterMarkerRenderer.ClusterStyle style) {
         super(markerLayer, defaultSymbol);
 
         mClusteringEnabled = style != null;
@@ -141,7 +141,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
         /* the grid slot size in px. increase to group more aggressively. currently set to marker size */
         final int GRIDSIZE = ScreenUtils.getPixels(MAP_GRID_SIZE_DP);
 
-		/* the factor to map into Grid Coordinates (discrete squares of GRIDSIZE x GRIDSIZE) */
+        /* the factor to map into Grid Coordinates (discrete squares of GRIDSIZE x GRIDSIZE) */
         final double factor = (scale / GRIDSIZE);
 
         InternalItem.Clustered[] tmp = new InternalItem.Clustered[size];
@@ -154,7 +154,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
 
             it.item = mMarkerLayer.createItem(i);
 
-			/* pre-project points */
+            /* pre-project points */
             MercatorProjection.project(it.item.getPoint(), mMapPoint);
             it.px = mMapPoint.x;
             it.py = mMapPoint.y;
@@ -260,7 +260,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
         float cos = (float) Math.cos(angle);
         float sin = (float) Math.sin(angle);
 
-		/* check visibility */
+        /* check visibility */
         for (InternalItem itm : mItems) {
             InternalItem.Clustered it = (InternalItem.Clustered) itm;
 
@@ -299,7 +299,7 @@ public class ClusterMarkerRenderer extends MarkerRenderer {
 
         //log.debug(numVisible + " " + changedVisible + " " + changesInvisible);
 
-		/* only update when zoomlevel changed, new items are visible
+        /* only update when zoomlevel changed, new items are visible
          * or more than 10 of the current items became invisible */
         //if ((numVisible == 0) && (changedVisible == 0 && changesInvisible < 10))
         //	return;
diff --git a/vtm/src/org/oscim/layers/marker/ItemizedLayer.java b/vtm/src/org/oscim/layers/marker/ItemizedLayer.java
index faf54d81..0e65a1f0 100644
--- a/vtm/src/org/oscim/layers/marker/ItemizedLayer.java
+++ b/vtm/src/org/oscim/layers/marker/ItemizedLayer.java
@@ -31,30 +31,25 @@ import org.oscim.event.GestureListener;
 import org.oscim.event.MotionEvent;
 import org.oscim.map.Map;
 import org.oscim.map.Viewport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Item>
-        implements GestureListener {
+public class ItemizedLayer extends MarkerLayer implements GestureListener {
 
-    static final Logger log = LoggerFactory.getLogger(ItemizedLayer.class);
-
-    protected final List<Item> mItemList;
+    protected final List<MarkerInterface> mItemList;
     protected final Point mTmpPoint = new Point();
-    protected OnItemGestureListener<Item> mOnItemGestureListener;
+    protected OnItemGestureListener<MarkerInterface> mOnItemGestureListener;
     protected int mDrawnItemsLimit = Integer.MAX_VALUE;
 
     public ItemizedLayer(Map map, MarkerSymbol defaultMarker) {
-        this(map, new ArrayList<Item>(), defaultMarker, null);
+        this(map, new ArrayList<MarkerInterface>(), defaultMarker, null);
     }
 
-    public ItemizedLayer(Map map, List<Item> list,
+    public ItemizedLayer(Map map, List<MarkerInterface> list,
                          MarkerSymbol defaultMarker,
-                         OnItemGestureListener<Item> listener) {
+                         OnItemGestureListener<MarkerInterface> listener) {
 
         super(map, defaultMarker);
 
@@ -64,12 +59,12 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
     }
 
     public ItemizedLayer(Map map, MarkerRendererFactory markerRendererFactory) {
-        this(map, new ArrayList<Item>(), markerRendererFactory, null);
+        this(map, new ArrayList<MarkerInterface>(), markerRendererFactory, null);
     }
 
-    public ItemizedLayer(Map map, List<Item> list,
+    public ItemizedLayer(Map map, List<MarkerInterface> list,
                          MarkerRendererFactory markerRendererFactory,
-                         OnItemGestureListener<Item> listener) {
+                         OnItemGestureListener<MarkerInterface> listener) {
 
         super(map, markerRendererFactory);
 
@@ -78,12 +73,12 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
         populate();
     }
 
-    public void setOnItemGestureListener(OnItemGestureListener<Item> listener) {
+    public void setOnItemGestureListener(OnItemGestureListener<MarkerInterface> listener) {
         mOnItemGestureListener = listener;
     }
 
     @Override
-    protected synchronized Item createItem(int index) {
+    protected synchronized MarkerInterface createItem(int index) {
         return mItemList.get(index);
     }
 
@@ -92,24 +87,24 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
         return Math.min(mItemList.size(), mDrawnItemsLimit);
     }
 
-    public synchronized boolean addItem(Item item) {
+    public synchronized boolean addItem(MarkerInterface item) {
         final boolean result = mItemList.add(item);
         populate();
         return result;
     }
 
-    public synchronized void addItem(int location, Item item) {
+    public synchronized void addItem(int location, MarkerInterface item) {
         mItemList.add(location, item);
         populate();
     }
 
-    public synchronized boolean addItems(Collection<Item> items) {
+    public synchronized boolean addItems(Collection<MarkerInterface> items) {
         final boolean result = mItemList.addAll(items);
         populate();
         return result;
     }
 
-    public synchronized List<Item> getItemList() {
+    public synchronized List<MarkerInterface> getItemList() {
         return mItemList;
     }
 
@@ -124,14 +119,14 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
         }
     }
 
-    public synchronized boolean removeItem(Item item) {
+    public synchronized boolean removeItem(MarkerInterface item) {
         final boolean result = mItemList.remove(item);
         populate();
         return result;
     }
 
-    public synchronized Item removeItem(int position) {
-        final Item result = mItemList.remove(position);
+    public synchronized MarkerInterface removeItem(int position) {
+        final MarkerInterface result = mItemList.remove(position);
         populate();
         return result;
     }
@@ -147,33 +142,31 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
     //    public boolean onTap(MotionEvent event, MapPosition pos) {
     //        return activateSelectedItems(event, mActiveItemSingleTap);
     //    }
-    protected boolean onSingleTapUpHelper(int index, Item item) {
+    protected boolean onSingleTapUpHelper(int index, MarkerInterface item) {
         return mOnItemGestureListener.onItemSingleTapUp(index, item);
     }
 
     private final ActiveItem mActiveItemSingleTap = new ActiveItem() {
         @Override
         public boolean run(int index) {
-            final ItemizedLayer<Item> that = ItemizedLayer.this;
             if (mOnItemGestureListener == null) {
                 return false;
             }
-            return onSingleTapUpHelper(index, that.mItemList.get(index));
+            return onSingleTapUpHelper(index, mItemList.get(index));
         }
     };
 
-    protected boolean onLongPressHelper(int index, Item item) {
+    protected boolean onLongPressHelper(int index, MarkerInterface item) {
         return this.mOnItemGestureListener.onItemLongPress(index, item);
     }
 
     private final ActiveItem mActiveItemLongPress = new ActiveItem() {
         @Override
         public boolean run(final int index) {
-            final ItemizedLayer<Item> that = ItemizedLayer.this;
-            if (that.mOnItemGestureListener == null) {
+            if (mOnItemGestureListener == null) {
                 return false;
             }
-            return onLongPressHelper(index, that.mItemList.get(index));
+            return onLongPressHelper(index, mItemList.get(index));
         }
     };
 
@@ -206,7 +199,7 @@ public class ItemizedLayer<Item extends MarkerInterface> extends MarkerLayer<Ite
         double dist = (20 * CanvasAdapter.getScale()) * (20 * CanvasAdapter.getScale());
 
         for (int i = 0; i < size; i++) {
-            Item item = mItemList.get(i);
+            MarkerInterface item = mItemList.get(i);
 
             if (!box.contains(item.getPoint().longitudeE6,
                     item.getPoint().latitudeE6))
diff --git a/vtm/src/org/oscim/layers/marker/MarkerLayer.java b/vtm/src/org/oscim/layers/marker/MarkerLayer.java
index b0f32d54..abc5acc6 100644
--- a/vtm/src/org/oscim/layers/marker/MarkerLayer.java
+++ b/vtm/src/org/oscim/layers/marker/MarkerLayer.java
@@ -6,7 +6,7 @@
  *
  * Copyright 2013 Hannes Janetzek
  * Copyright 2016 Stephan Leuschner
- * Copyright 2016-2018 devemux86
+ * Copyright 2016-2020 devemux86
  * Copyright 2017 Longri
  *
  * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
@@ -34,27 +34,26 @@ import org.oscim.map.Map;
  * gets checked for onTap first. This class is generic, because you then you get
  * your custom item-class passed back in onTap(). << TODO
  */
-public abstract class MarkerLayer<Item extends MarkerInterface> extends Layer {
+public abstract class MarkerLayer extends Layer {
 
     protected final MarkerRenderer mMarkerRenderer;
-    protected Item mFocusedItem;
+    protected MarkerInterface mFocusedItem;
 
     /**
      * Method by which subclasses create the actual Items. This will only be
      * called from populate() we'll cache them for later use.
      */
-    protected abstract Item createItem(int i);
+    protected abstract MarkerInterface createItem(int i);
 
     /**
      * The number of items in this overlay.
      */
     public abstract int size();
 
-    @SuppressWarnings("unchecked")
     public MarkerLayer(Map map, MarkerSymbol defaultSymbol) {
         super(map);
 
-        mMarkerRenderer = new MarkerRenderer((MarkerLayer<MarkerInterface>) this, defaultSymbol);
+        mMarkerRenderer = new MarkerRenderer(this, defaultSymbol);
         mRenderer = mMarkerRenderer;
     }
 
@@ -85,7 +84,7 @@ public abstract class MarkerLayer<Item extends MarkerInterface> extends Layer {
      *
      * @param item
      */
-    public synchronized void setFocus(Item item) {
+    public synchronized void setFocus(MarkerInterface item) {
         mFocusedItem = item;
     }
 
@@ -93,7 +92,7 @@ public abstract class MarkerLayer<Item extends MarkerInterface> extends Layer {
      * @return the currently-focused item, or null if no item is currently
      * focused.
      */
-    public synchronized Item getFocus() {
+    public synchronized MarkerInterface getFocus() {
         return mFocusedItem;
     }
 
diff --git a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
index f75b9cfb..996439c6 100644
--- a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
+++ b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
@@ -39,7 +39,7 @@ public class MarkerRenderer extends BucketRenderer {
 
     protected final SymbolBucket mSymbolLayer;
     protected final float[] mBox = new float[8];
-    protected final MarkerLayer<MarkerInterface> mMarkerLayer;
+    protected final MarkerLayer mMarkerLayer;
     protected final Point mMapPoint = new Point();
 
     /**
@@ -49,7 +49,7 @@ public class MarkerRenderer extends BucketRenderer {
 
     protected InternalItem[] mItems;
 
-    public MarkerRenderer(MarkerLayer<MarkerInterface> markerLayer, MarkerSymbol defaultSymbol) {
+    public MarkerRenderer(MarkerLayer markerLayer, MarkerSymbol defaultSymbol) {
         mSymbolLayer = new SymbolBucket();
         mMarkerLayer = markerLayer;
         mDefaultMarker = defaultSymbol;