Index: binary-improvements/webserver/js/leaflet.layer.sdtdtiles.js
===================================================================
--- binary-improvements/webserver/js/leaflet.layer.sdtdtiles.js	(revision 306)
+++ binary-improvements/webserver/js/leaflet.layer.sdtdtiles.js	(revision 315)
@@ -4,17 +4,16 @@
 	var tileLayer = L.tileLayer('../map/{z}/{x}/{y}.png?t={time}', {
 		maxZoom: isMiniMap ? mapinfo.maxzoom : mapinfo.maxzoom + 1,
-		minZoom: isMiniMap ? 0 : Math.max(0, mapinfo.maxzoom - 5),
+		minZoom: isMiniMap ? -1 : Math.max(0, mapinfo.maxzoom - 5),
 		maxNativeZoom: mapinfo.maxzoom,
+		minNativeZoom: 0,
 		tileSize: mapinfo.tilesize,
-		continuousWorld: true,
-		tms: true,
-		unloadInvisibleTiles: false,
 		time: initTime
 	});
 	
-	// TileLayer w/ TMS=true fix for zoomlevel >= 8
-	tileLayer._getWrapTileNum = function () {
-		return L.point(0, 0);
+	tileLayer.getTileUrl = function (coords) {
+		coords.y = (-coords.y) - 1;
+		return L.TileLayer.prototype.getTileUrl.bind (tileLayer) (coords);
 	};
+
 	
 	return tileLayer;
Index: binary-improvements/webserver/js/leaflet.regionlayer.js
===================================================================
--- binary-improvements/webserver/js/leaflet.regionlayer.js	(revision 306)
+++ binary-improvements/webserver/js/leaflet.regionlayer.js	(revision 315)
@@ -4,18 +4,20 @@
 	}
 
-	var regionLayer = L.tileLayer.canvas({
+	var regionLayer = L.gridLayer({
 		maxZoom: mapinfo.maxzoom + 1,
 		minZoom: 0,
 		maxNativeZoom: mapinfo.maxzoom + 1,
 		tileSize: mapinfo.tilesize,
-		continuousWorld: true
 	});
 
-	regionLayer.drawTile = function(canvas, tilePoint, zoom) {
-		var blockWorldSize = mapinfo.tilesize * Math.pow(2, mapinfo.maxzoom - zoom);
+	regionLayer.createTile = function(tilePoint) {
+		var blockWorldSize = mapinfo.tilesize * Math.pow(2, mapinfo.maxzoom - tilePoint.z);
 		var tileLeft = tilePoint.x * blockWorldSize;
 		var tileBottom = (-1-tilePoint.y) * blockWorldSize;
 		var blockPos = L.latLng(tileLeft, tileBottom);
 
+		var canvas = L.DomUtil.create('canvas', 'leaflet-tile');
+		canvas.width = mapinfo.tilesize;
+		canvas.height = mapinfo.tilesize;
 		var ctx = canvas.getContext('2d');
 
@@ -63,5 +65,5 @@
 			}
 		}
-
+		return canvas;
 	}
 	
Index: binary-improvements/webserver/js/map.js
===================================================================
--- binary-improvements/webserver/js/map.js	(revision 306)
+++ binary-improvements/webserver/js/map.js	(revision 315)
@@ -155,5 +155,5 @@
 	//measure.addTo(map);
 
-	//new L.Control.GameTime({}).addTo(map);
+	new L.Control.GameTime({}).addTo(map);
 	
 	if (HasPermission ("webapi.getlandclaims")) {
@@ -198,22 +198,9 @@
 	});
 
-	var openedPopup = null;
 	var updatingMarkers = false;
 
-	map.on ("popupopen", function (event) {
-		console.log ("open");
-		console.log (event.popup._source);
-		openedPopup = event.popup._source;
-	});
-	map.on ("popupclose", function (event) {
-		if (!updatingMarkers) {
-			console.log ("close");
-			openedPopup = null;
-		}
-	});
 
 	var setPlayerMarkers = function(data) {
-		var online = 0;
-		var offline = 0;
+		var onlineIds = [];
 		updatingMarkers = true;
 		$.each( data, function( key, val ) {
@@ -228,21 +215,32 @@
 						: "")
 				);
+				marker.on("move", function ( e ) {
+					if ( this.isPopupOpen () ) {
+						map.flyTo (e.latlng, map.getZoom ());
+					}
+				});
 				playersMappingList[val.steamid] = { online: !val.online };
+			}
+			
+			if (val.online) {
+				onlineIds.push (val.steamid);
 			}
 			
 			oldpos = marker.getLatLng ();
-			if ( playersMappingList[val.steamid].online != val.online || oldpos.lat != val.position.x || oldpos.lng != val.position.z ) {
+			if ( playersMappingList[val.steamid].online != val.online ) {
 				if (playersMappingList[val.steamid].online) {
 					playersOnlineMarkerGroup.removeLayer(marker);
+					playersOfflineMarkerGroup.addLayer(marker);
 				} else {
 					playersOfflineMarkerGroup.removeLayer(marker);
-				}
+					playersOnlineMarkerGroup.addLayer(marker);
+				}
+			}
+			if ( oldpos.lat != val.position.x || oldpos.lng != val.position.z ) {
 				marker.setLatLng([val.position.x, val.position.z]);
 				if (val.online) {
 						marker.setOpacity(1.0);
-						playersOnlineMarkerGroup.addLayer(marker);
 				} else {
 						marker.setOpacity(0.5);
-						playersOfflineMarkerGroup.addLayer(marker);
 				}
 			}
@@ -250,14 +248,24 @@
 			val.currentPosMarker = marker;
 			playersMappingList[val.steamid] = val;
-		
-			if (val.online)
+		});
+		
+		var online = 0;
+		var offline = 0;
+		$.each ( playersMappingList, function ( key, val ) {
+			if ( val.online && onlineIds.indexOf (key) < 0 ) {
+				var marker = val.currentPosMarker;
+				playersOnlineMarkerGroup.removeLayer(marker);
+				playersOfflineMarkerGroup.addLayer(marker);
+				val.online = false;
+			}
+			if (val.online) {
 				online++;
-			else
+			} else {
 				offline++;
-		});
+			}
+		});
+		
 		updatingMarkers = false;
-		if (openedPopup != null) {
-			openedPopup.openPopup ();
-		}
+
 		$( "#mapControlOnlineCount" ).text( online );
 		$( "#mapControlOfflineCount" ).text( offline );
@@ -265,6 +273,9 @@
 
 	var updatePlayerTimeout;
+	var playerUpdateCount = -1;
 	var updatePlayerEvent = function() {
-		$.getJSON( "../api/getplayerslocation")
+		playerUpdateCount++;
+		
+		$.getJSON( "../api/getplayerslocation" + ((playerUpdateCount % 15) == 0 ? "?offline=true" : ""))
 		.done(setPlayerMarkers)
 		.fail(function(jqxhr, textStatus, error) {
