Index: binary-improvements/7dtd-server-fixes/src/API.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/API.cs	(revision 443)
+++ 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 443)
+++ 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 443)
+++ 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 443)
+++ 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;
 				}
 			}
