Index: binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs	(revision 351)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs	(revision 369)
@@ -1,4 +1,3 @@
 using System;
-using System.Runtime.Serialization;
 using UnityEngine;
 
@@ -6,5 +5,5 @@
 	[Serializable]
 	public class Player {
-		private readonly string steamId;
+		private readonly PlatformUserIdentifierAbs platformId;
 		private int entityId;
 		private string name;
@@ -12,65 +11,34 @@
 		private long totalPlayTime;
 
-		[OptionalField] private DateTime lastOnline;
+		private DateTime lastOnline;
 
 		private Inventory inventory;
 
-		[OptionalField] private int lastPositionX, lastPositionY, lastPositionZ;
+		private int lastPositionX, lastPositionY, lastPositionZ;
 
-		[OptionalField] [Obsolete ("experience no longer available, use level and expToNextLevel instead")]
-		private uint experience;
-
-		[OptionalField] private bool chatMuted;
-		[OptionalField] private int maxChatLength;
-		[OptionalField] private string chatColor;
-		[OptionalField] private bool chatName;
-		[OptionalField] private uint expToNextLevel;
-		[OptionalField] private int level;
+		private bool chatMuted;
+		private int maxChatLength;
+		private string chatColor;
+		private bool chatName;
+		private uint expToNextLevel;
+		private int level;
 
 		[NonSerialized] private ClientInfo clientInfo;
 
-		public string SteamID {
-			get { return steamId; }
-		}
+		public PlatformUserIdentifierAbs PlatformId => platformId;
 
-        public int EntityID {
-            get { return entityId; }
-        }
+		public int EntityID => entityId;
 
-		public string Name {
-			get { return name == null ? string.Empty : name; }
-		}
+		public string Name => name ?? string.Empty;
 
-		public string IP {
-			get { return ip == null ? string.Empty : ip; }
-		}
+		public string IP => ip ?? string.Empty;
 
-		public Inventory Inventory {
-			get {
-				if (inventory == null) {
-					inventory = new Inventory ();
-				}
+		public Inventory Inventory => inventory ?? (inventory = new Inventory ());
 
-				return inventory;
-			}
-		}
+		public bool IsOnline => clientInfo != null;
 
-		public bool IsOnline {
-			get { return clientInfo != null; }
-		}
+		public ClientInfo ClientInfo => clientInfo;
 
-		public ClientInfo ClientInfo {
-			get { return clientInfo; }
-		}
-
-		public EntityPlayer Entity {
-			get {
-				if (IsOnline) {
-					return GameManager.Instance.World.Players.dict [clientInfo.entityId];
-				}
-
-				return null;
-			}
-		}
+		public EntityPlayer Entity => IsOnline ? GameManager.Instance.World.Players.dict [clientInfo.entityId] : null;
 
 		public long TotalPlayTime {
@@ -84,43 +52,15 @@
 		}
 
-		public DateTime LastOnline {
-			get {
-				if (IsOnline) {
-					return DateTime.Now;
-				}
+		public DateTime LastOnline => IsOnline ? DateTime.Now : lastOnline;
 
-				return lastOnline;
-			}
-		}
+		public Vector3i LastPosition => IsOnline ? new Vector3i (Entity.GetPosition ()) : new Vector3i (lastPositionX, lastPositionY, lastPositionZ);
 
-		public Vector3i LastPosition {
-			get {
-				if (IsOnline) {
-					return new Vector3i (Entity.GetPosition ());
-				}
+		public bool LandProtectionActive =>
+			GameManager.Instance.World.IsLandProtectionValidForPlayer (GameManager.Instance
+				.GetPersistentPlayerList ().GetPlayerData (PlatformId));
 
-				return new Vector3i (lastPositionX, lastPositionY, lastPositionZ);
-			}
-		}
-
-		public bool LandProtectionActive {
-			get {
-				return GameManager.Instance.World.IsLandProtectionValidForPlayer (GameManager.Instance
-					.GetPersistentPlayerList ().GetPlayerData (SteamID));
-			}
-		}
-
-		public float LandProtectionMultiplier {
-			get {
-				return GameManager.Instance.World.GetLandProtectionHardnessModifierForPlayer (GameManager.Instance
-					.GetPersistentPlayerList ().GetPlayerData (SteamID));
-			}
-		}
-
-
-		[Obsolete ("Experience no longer available, use Level instead")]
-		public uint Experience {
-			get { return 0; }
-		}
+		public float LandProtectionMultiplier =>
+			GameManager.Instance.World.GetLandProtectionHardnessModifierForPlayer (GameManager.Instance
+				.GetPersistentPlayerList ().GetPlayerData (PlatformId));
 
 		public float Level {
@@ -135,6 +75,6 @@
 
 		public bool IsChatMuted {
-			get { return chatMuted; }
-			set { chatMuted = value; }
+			get => chatMuted;
+			set => chatMuted = value;
 		}
 
@@ -147,10 +87,10 @@
 				return maxChatLength;
 			}
-			set { maxChatLength = value; }
+			set => maxChatLength = value;
 		}
 
 		public string ChatColor {
 			get {
-				if (chatColor == null || chatColor == "") {
+				if (string.IsNullOrEmpty (chatColor)) {
 					chatColor = "";
 				}
@@ -159,15 +99,14 @@
 			}
 
-			set { chatColor = value; }
+			set => chatColor = value;
 		}
 
 		public bool ChatName {
-			get { return chatName; }
-
-			set { chatName = value; }
+			get => chatName;
+			set => chatName = value;
 		}
 
-		public Player (string _steamId) {
-			steamId = _steamId;
+		public Player (PlatformUserIdentifierAbs _platformId) {
+			platformId = _platformId;
 			inventory = new Inventory ();
 		}
@@ -178,5 +117,5 @@
 			}
 
-			Log.Out ("Player set to offline: " + steamId);
+			Log.Out ("Player set to offline: " + platformId);
 			lastOnline = DateTime.Now;
 			try {
@@ -194,5 +133,5 @@
 
 		public void SetOnline (ClientInfo _ci) {
-			Log.Out ("Player set to online: " + steamId);
+			Log.Out ("Player set to online: " + platformId);
 			clientInfo = _ci;
             entityId = _ci.entityId;
@@ -222,4 +161,5 @@
 			}
 		}
+
 	}
 }
