Index: /binary-improvements/7dtd-server-fixes/ModInfo.xml
===================================================================
--- /binary-improvements/7dtd-server-fixes/ModInfo.xml	(revision 445)
+++ /binary-improvements/7dtd-server-fixes/ModInfo.xml	(revision 446)
@@ -5,5 +5,5 @@
 		<Description value="Common functions" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="26" />
+		<Version value="27" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
Index: /binary-improvements/7dtd-server-fixes/src/API.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/API.cs	(revision 445)
+++ /binary-improvements/7dtd-server-fixes/src/API.cs	(revision 446)
@@ -23,5 +23,5 @@
 
 		public void SavePlayerData (ClientInfo _cInfo, PlayerDataFile _playerDataFile) {
-			PersistentContainer.Instance.Players [_cInfo.InternalId, true].Update (_cInfo, _playerDataFile);
+			PersistentContainer.Instance.Players.GetOrCreate (_cInfo.InternalId, _cInfo.PlatformId, _cInfo.CrossplatformId).Update (_cInfo, _playerDataFile);
 		}
 
@@ -43,5 +43,5 @@
 
 		public void PlayerDisconnected (ClientInfo _cInfo, bool _bShutdown) {
-			Player p = PersistentContainer.Instance.Players [_cInfo.InternalId, false];
+			Player p = PersistentContainer.Instance.Players.GetByInternalId (_cInfo.InternalId);
 			if (p != null) {
 				p.SetOffline ();
@@ -54,5 +54,5 @@
 
 		public void PlayerSpawned (ClientInfo _cInfo, RespawnType _respawnReason, Vector3i _spawnPos) {
-			PersistentContainer.Instance.Players [_cInfo.InternalId, true].SetOnline (_cInfo);
+			PersistentContainer.Instance.Players.GetOrCreate (_cInfo.InternalId, _cInfo.PlatformId, _cInfo.CrossplatformId).SetOnline (_cInfo);
 			PersistentContainer.Instance.Save ();
 		}
Index: /binary-improvements/7dtd-server-fixes/src/LandClaimList.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/LandClaimList.cs	(revision 445)
+++ /binary-improvements/7dtd-server-fixes/src/LandClaimList.cs	(revision 446)
@@ -41,7 +41,10 @@
 
 			foreach (KeyValuePair<PersistentPlayerData, List<Vector3i>> kvp in owners) {
-				Player p = PersistentContainer.Instance.Players [kvp.Key.UserIdentifier, false];
+				Player p = PersistentContainer.Instance.Players.GetByInternalId (kvp.Key.UserIdentifier);
 				if (p == null) {
-					p = new Player (kvp.Key.UserIdentifier);
+					PlatformUserIdentifierAbs platformId = kvp.Key.PlatformUserIdentifier;
+					PlatformUserIdentifierAbs internalId = kvp.Key.UserIdentifier;
+					PlatformUserIdentifierAbs crossPlatformId = platformId.Equals (internalId) ? null : internalId;
+					p = new Player (internalId, platformId, crossPlatformId);
 				}
 
@@ -68,5 +71,5 @@
 
 		public static OwnerFilter UserIdFilter (PlatformUserIdentifierAbs _userId) {
-			return _p => _p.PlatformId.Equals (_userId);
+			return _p => _p.InternalId.Equals (_userId);
 		}
 
Index: /binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs	(revision 445)
+++ /binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs	(revision 446)
@@ -5,5 +5,4 @@
 	[Serializable]
 	public class Player {
-		private readonly PlatformUserIdentifierAbs platformId;
 		private int entityId;
 		private string name;
@@ -26,5 +25,7 @@
 		[NonSerialized] private ClientInfo clientInfo;
 
-		public PlatformUserIdentifierAbs PlatformId => platformId;
+		public PlatformUserIdentifierAbs InternalId { get; }
+		public PlatformUserIdentifierAbs PlatformId { get; }
+		public PlatformUserIdentifierAbs CrossPlatformId { get; }
 
 		public int EntityID => entityId;
@@ -34,5 +35,5 @@
 		public string IP => ip ?? string.Empty;
 
-		public Inventory Inventory => inventory ?? (inventory = new Inventory ());
+		public Inventory Inventory => inventory ??= new Inventory ();
 
 		public bool IsOnline => clientInfo != null;
@@ -58,9 +59,9 @@
 		public bool LandProtectionActive =>
 			GameManager.Instance.World.IsLandProtectionValidForPlayer (GameManager.Instance
-				.GetPersistentPlayerList ().GetPlayerData (PlatformId));
+				.GetPersistentPlayerList ().GetPlayerData (InternalId));
 
 		public float LandProtectionMultiplier =>
 			GameManager.Instance.World.GetLandProtectionHardnessModifierForPlayer (GameManager.Instance
-				.GetPersistentPlayerList ().GetPlayerData (PlatformId));
+				.GetPersistentPlayerList ().GetPlayerData (InternalId));
 
 		public float Level {
@@ -107,6 +108,8 @@
 		}
 
-		public Player (PlatformUserIdentifierAbs _platformId) {
-			platformId = _platformId;
+		public Player (PlatformUserIdentifierAbs _internalId, PlatformUserIdentifierAbs _platformId, PlatformUserIdentifierAbs _crossPlatformId) {
+			InternalId = _internalId;
+			PlatformId = _platformId;
+			CrossPlatformId = _crossPlatformId;
 			inventory = new Inventory ();
 		}
@@ -117,5 +120,5 @@
 			}
 
-			Log.Out ("Player set to offline: " + platformId);
+			Log.Out ("Player set to offline: " + InternalId);
 			lastOnline = DateTime.Now;
 			try {
@@ -133,5 +136,5 @@
 
 		public void SetOnline (ClientInfo _ci) {
-			Log.Out ("Player set to online: " + platformId);
+			Log.Out ("Player set to online: " + InternalId);
 			clientInfo = _ci;
             entityId = _ci.entityId;
Index: /binary-improvements/7dtd-server-fixes/src/PersistentData/Players.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/PersistentData/Players.cs	(revision 445)
+++ /binary-improvements/7dtd-server-fixes/src/PersistentData/Players.cs	(revision 446)
@@ -2,5 +2,4 @@
 using System.Collections.Generic;
 using System.Text.RegularExpressions;
-using Platform.Steam;
 
 namespace AllocsFixes.PersistentData {
@@ -9,28 +8,40 @@
 		public readonly Dictionary<PlatformUserIdentifierAbs, Player> Dict = new Dictionary<PlatformUserIdentifierAbs, Player> ();
 
-		public Player this [PlatformUserIdentifierAbs _platformId, bool _create] {
-			get {
-				if (_platformId == null) {
-					return null;
-				}
+		public int Count => Dict.Count;
 
-				if (Dict.TryGetValue (_platformId, out Player pOld)) {
-					return pOld;
-				}
+		public Player GetOrCreate (PlatformUserIdentifierAbs _internalId, PlatformUserIdentifierAbs _platformId, PlatformUserIdentifierAbs _crossPlatformId) {
+			if (_internalId == null) {
+				return null;
+			}
 
-				if (!_create) {
-					return null;
-				}
+			if (Dict.TryGetValue (_internalId, out Player pOld)) {
+				return pOld;
+			}
 
-				Log.Out ("Created new player entry for ID: " + _platformId);
-				Player p = new Player (_platformId);
-				Dict.Add (_platformId, p);
-				return p;
-			}
+			Log.Out ("Created new player entry for ID: " + _internalId);
+			Player p = new Player (_internalId, _platformId, _crossPlatformId);
+			Dict.Add (_internalId, p);
+			return p;
 		}
 
-		public int Count => Dict.Count;
+		public Player GetByInternalId (PlatformUserIdentifierAbs _internalId) {
+			if (_internalId == null) {
+				return null;
+			}
 
-		public PlatformUserIdentifierAbs GetSteamID (string _nameOrId, bool _ignoreColorCodes) {
+			return Dict.TryGetValue (_internalId, out Player pOld) ? pOld : null;
+		}
+
+		public Player GetByUserId (PlatformUserIdentifierAbs _userId) {
+			foreach ((_, Player p) in Dict) {
+				if (p.PlatformId.Equals (_userId) || p.CrossPlatformId.Equals (_userId)) {
+					return p;
+				}
+			}
+
+			return null;
+		}
+
+		public Player GetByString (string _nameOrId, bool _ignoreColorCodes) {
 			if (string.IsNullOrEmpty (_nameOrId)) {
 				return null;
@@ -38,23 +49,23 @@
 
 			if (PlatformUserIdentifierAbs.TryFromCombinedString (_nameOrId, out PlatformUserIdentifierAbs userId)) {
-				return userId;
+				return GetByUserId (userId);
 			}
 
 			if (int.TryParse (_nameOrId, out int entityId)) {
-				foreach (KeyValuePair<PlatformUserIdentifierAbs, Player> kvp in Dict) {
-					if (kvp.Value.IsOnline && kvp.Value.EntityID == entityId) {
-						return kvp.Key;
+				foreach ((_, Player p) in Dict) {
+					if (p.IsOnline && p.EntityID == entityId) {
+						return p;
 					}
 				}
 			}
 
-			foreach (KeyValuePair<PlatformUserIdentifierAbs, Player> kvp in Dict) {
-				string name = kvp.Value.Name;
+			foreach ((_, Player p) in Dict) {
+				string name = p.Name;
 				if (_ignoreColorCodes) {
 					name = Regex.Replace (name, "\\[[0-9a-fA-F]{6}\\]", "");
 				}
 
-				if (kvp.Value.IsOnline && name.EqualsCaseInsensitive (_nameOrId)) {
-					return kvp.Key;
+				if (p.IsOnline && name.EqualsCaseInsensitive (_nameOrId)) {
+					return p;
 				}
 			}
Index: /binary-improvements/AllocsCommands/Commands/ListKnownPlayers.cs
===================================================================
--- /binary-improvements/AllocsCommands/Commands/ListKnownPlayers.cs	(revision 445)
+++ /binary-improvements/AllocsCommands/Commands/ListKnownPlayers.cs	(revision 446)
@@ -45,5 +45,5 @@
 
 			if (userIdFilter != null) {
-				Player p = PersistentContainer.Instance.Players [userIdFilter, false];
+				Player p = PersistentContainer.Instance.Players.GetByInternalId (userIdFilter);
 
 				if (p != null) {
Index: /binary-improvements/AllocsCommands/Commands/ListLandProtection.cs
===================================================================
--- /binary-improvements/AllocsCommands/Commands/ListLandProtection.cs	(revision 445)
+++ /binary-improvements/AllocsCommands/Commands/ListLandProtection.cs	(revision 446)
@@ -105,5 +105,5 @@
 					"Player \"{0} ({1})\" owns {4} keystones (protected: {2}, current hardness multiplier: {3})",
 					kvp.Key.Name,
-					kvp.Key.PlatformId,
+					kvp.Key.InternalId,
 					kvp.Key.LandProtectionActive,
 					kvp.Key.LandProtectionMultiplier,
@@ -112,5 +112,5 @@
 					foreach (Vector3i v in kvp.Value) {
 						if (parseableOutput) {
-							SdtdConsole.Instance.Output ("LandProtectionOf: id=" + kvp.Key.PlatformId +
+							SdtdConsole.Instance.Output ("LandProtectionOf: id=" + kvp.Key.InternalId +
 							                             ", playerName=" + kvp.Key.Name + ", location=" + v);
 						} else {
Index: /binary-improvements/AllocsCommands/Commands/ShowInventory.cs
===================================================================
--- /binary-improvements/AllocsCommands/Commands/ShowInventory.cs	(revision 445)
+++ /binary-improvements/AllocsCommands/Commands/ShowInventory.cs	(revision 446)
@@ -1,3 +1,2 @@
-using System;
 using System.Collections.Generic;
 using AllocsFixes.PersistentData;
@@ -30,6 +29,6 @@
 			}
 
-			PlatformUserIdentifierAbs steamid = PersistentContainer.Instance.Players.GetSteamID (_params [0], true);
-			if (steamid == null) {
+			Player p = PersistentContainer.Instance.Players.GetByString (_params [0], true);
+			if (p == null) {
 				SdtdConsole.Instance.Output (
 					"Playername or entity/steamid id not found or no inventory saved (first saved after a player has been online for 30s).");
@@ -42,5 +41,4 @@
 			}
 
-			Player p = PersistentContainer.Instance.Players [steamid, false];
 			PersistentData.Inventory inv = p.Inventory;
 
@@ -164,5 +162,5 @@
 							}
 
-							DoParts (_parts [i].parts, _indent + 1, _currentMessage);
+							DoParts (_parts [i].parts, _indent + 1, null);
 						} else {
 							// currentMessage given -> parseable output
Index: /binary-improvements/AllocsCommands/ModInfo.xml
===================================================================
--- /binary-improvements/AllocsCommands/ModInfo.xml	(revision 445)
+++ /binary-improvements/AllocsCommands/ModInfo.xml	(revision 446)
@@ -5,5 +5,5 @@
 		<Description value="Additional commands for server operation" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="23" />
+		<Version value="24" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
Index: /binary-improvements/MapRendering/ModInfo.xml
===================================================================
--- /binary-improvements/MapRendering/ModInfo.xml	(revision 445)
+++ /binary-improvements/MapRendering/ModInfo.xml	(revision 446)
@@ -5,5 +5,5 @@
 		<Description value="Render the game map to image map tiles as it is uncovered" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="40" />
+		<Version value="41" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
Index: /binary-improvements/MapRendering/Web/API/GetLandClaims.cs
===================================================================
--- /binary-improvements/MapRendering/Web/API/GetLandClaims.cs	(revision 445)
+++ /binary-improvements/MapRendering/Web/API/GetLandClaims.cs	(revision 446)
@@ -51,4 +51,5 @@
 
 				owner.Add ("steamid", new JSONString (kvp.Key.PlatformId.CombinedString));
+				owner.Add ("crossplatformid", new JSONString (kvp.Key.CrossPlatformId?.CombinedString ?? ""));
 				owner.Add ("claimactive", new JSONBoolean (kvp.Key.LandProtectionActive));
 
Index: /binary-improvements/MapRendering/Web/API/GetPlayerInventories.cs
===================================================================
--- /binary-improvements/MapRendering/Web/API/GetPlayerInventories.cs	(revision 445)
+++ /binary-improvements/MapRendering/Web/API/GetPlayerInventories.cs	(revision 446)
@@ -20,5 +20,5 @@
 
 				if (p.IsOnline) {
-					AllInventoriesResult.Add (GetPlayerInventory.DoPlayer (kvp.Key.CombinedString, p, showIconColor, showIconName));
+					AllInventoriesResult.Add (GetPlayerInventory.DoPlayer (p, showIconColor, showIconName));
 				}
 			}
Index: /binary-improvements/MapRendering/Web/API/GetPlayerInventory.cs
===================================================================
--- /binary-improvements/MapRendering/Web/API/GetPlayerInventory.cs	(revision 445)
+++ /binary-improvements/MapRendering/Web/API/GetPlayerInventory.cs	(revision 446)
@@ -21,5 +21,5 @@
 			}
 
-			Player p = PersistentContainer.Instance.Players [userId, false];
+			Player p = PersistentContainer.Instance.Players.GetByUserId (userId);
 			if (p == null) {
 				_resp.StatusCode = (int) HttpStatusCode.NotFound;
@@ -30,5 +30,5 @@
 			GetInventoryArguments (_req, out bool showIconColor, out bool showIconName);
 
-			JSONObject result = DoPlayer (userIdString, p, showIconColor, showIconName);
+			JSONObject result = DoPlayer (p, showIconColor, showIconName);
 
 			WriteJSON (_resp, result);
@@ -45,5 +45,5 @@
 		}
 
-		internal static JSONObject DoPlayer (string _steamId, Player _player, bool _showIconColor, bool _showIconName) {
+		internal static JSONObject DoPlayer (Player _player, bool _showIconColor, bool _showIconName) {
 			PersistentData.Inventory inv = _player.Inventory;
 
@@ -53,5 +53,6 @@
 			JSONArray belt = new JSONArray ();
 			JSONObject equipment = new JSONObject ();
-			result.Add ("userid", new JSONString (_steamId));
+			result.Add ("userid", new JSONString (_player.PlatformId.CombinedString));
+			result.Add ("crossplatformid", new JSONString (_player.CrossPlatformId?.CombinedString ?? ""));
 			result.Add ("entityid", new JSONNumber (_player.EntityID));
 			result.Add ("playername", new JSONString (_player.Name));
Index: /binary-improvements/MapRendering/Web/API/GetPlayerList.cs
===================================================================
--- /binary-improvements/MapRendering/Web/API/GetPlayerList.cs	(revision 445)
+++ /binary-improvements/MapRendering/Web/API/GetPlayerList.cs	(revision 446)
@@ -49,5 +49,5 @@
 				Player p = kvp.Value;
 
-				if (bViewAll || p.PlatformId.Equals (userId)) {
+				if (bViewAll || p.InternalId.Equals (userId)) {
 					JSONObject pos = new JSONObject ();
 					pos.Add ("x", new JSONNumber (p.LastPosition.x));
@@ -56,5 +56,6 @@
 
 					JSONObject pJson = new JSONObject ();
-					pJson.Add ("steamid", new JSONString (kvp.Key.CombinedString));
+					pJson.Add ("steamid", new JSONString (kvp.Value.PlatformId.CombinedString));
+					pJson.Add ("crossplatformid", new JSONString (kvp.Value.CrossPlatformId?.CombinedString ?? ""));
 					pJson.Add ("entityid", new JSONNumber (p.EntityID));
 					pJson.Add ("ip", new JSONString (p.IP));
Index: /binary-improvements/MapRendering/Web/API/GetPlayersLocation.cs
===================================================================
--- /binary-improvements/MapRendering/Web/API/GetPlayersLocation.cs	(revision 445)
+++ /binary-improvements/MapRendering/Web/API/GetPlayersLocation.cs	(revision 446)
@@ -32,5 +32,5 @@
 
 				if (listOffline || p.IsOnline) {
-					if (bViewAll || p.PlatformId.Equals (userId)) {
+					if (bViewAll || p.InternalId.Equals (userId)) {
 						JSONObject pos = new JSONObject ();
 						pos.Add ("x", new JSONNumber (p.LastPosition.x));
@@ -39,5 +39,6 @@
 
 						JSONObject pJson = new JSONObject ();
-						pJson.Add ("steamid", new JSONString (kvp.Key.CombinedString));
+						pJson.Add ("steamid", new JSONString (kvp.Value.PlatformId.CombinedString));
+						pJson.Add ("crossplatformid", new JSONString (kvp.Value.CrossPlatformId?.CombinedString ?? ""));
 
 						//					pJson.Add("entityid", new JSONNumber (p.EntityID));
Index: /binary-improvements/MapRendering/Web/API/GetPlayersOnline.cs
===================================================================
--- /binary-improvements/MapRendering/Web/API/GetPlayersOnline.cs	(revision 445)
+++ /binary-improvements/MapRendering/Web/API/GetPlayersOnline.cs	(revision 446)
@@ -13,5 +13,5 @@
 			foreach (KeyValuePair<int, EntityPlayer> current in w.Players.dict) {
 				ClientInfo ci = ConnectionManager.Instance.Clients.ForEntityId (current.Key);
-				Player player = PersistentContainer.Instance.Players [ci.InternalId, false];
+				Player player = PersistentContainer.Instance.Players.GetByInternalId (ci.InternalId);
 
 				JSONObject pos = new JSONObject ();
@@ -22,4 +22,5 @@
 				JSONObject p = new JSONObject ();
 				p.Add ("steamid", new JSONString (ci.PlatformId.CombinedString));
+				p.Add ("crossplatformid", new JSONString (ci.CrossplatformId?.CombinedString ?? ""));
 				p.Add ("entityid", new JSONNumber (ci.entityId));
 				p.Add ("ip", new JSONString (ci.ip));
Index: /binary-improvements/bin/Mods/Allocs_CommandExtensions/ModInfo.xml
===================================================================
--- /binary-improvements/bin/Mods/Allocs_CommandExtensions/ModInfo.xml	(revision 445)
+++ /binary-improvements/bin/Mods/Allocs_CommandExtensions/ModInfo.xml	(revision 446)
@@ -5,5 +5,5 @@
 		<Description value="Additional commands for server operation" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="23" />
+		<Version value="24" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
Index: /binary-improvements/bin/Mods/Allocs_CommonFunc/ModInfo.xml
===================================================================
--- /binary-improvements/bin/Mods/Allocs_CommonFunc/ModInfo.xml	(revision 445)
+++ /binary-improvements/bin/Mods/Allocs_CommonFunc/ModInfo.xml	(revision 446)
@@ -5,5 +5,5 @@
 		<Description value="Common functions" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="26" />
+		<Version value="27" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
Index: /binary-improvements/bin/Mods/Allocs_WebAndMapRendering/ModInfo.xml
===================================================================
--- /binary-improvements/bin/Mods/Allocs_WebAndMapRendering/ModInfo.xml	(revision 445)
+++ /binary-improvements/bin/Mods/Allocs_WebAndMapRendering/ModInfo.xml	(revision 446)
@@ -5,5 +5,5 @@
 		<Description value="Render the game map to image map tiles as it is uncovered" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="40" />
+		<Version value="41" />
 		<Website value="http://7dtd.illy.bz" />
 	</ModInfo>
