Index: binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj
===================================================================
--- binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 450)
+++ binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 455)
@@ -83,5 +83,4 @@
   <ItemGroup>
     <Compile Include="src\AssemblyInfo.cs" />
-    <Compile Include="src\JSON\JsonManualBuilder.cs" />
     <Compile Include="src\LiveData\Animals.cs" />
     <Compile Include="src\LiveData\Hostiles.cs" />
@@ -91,19 +90,8 @@
     <Compile Include="src\PersistentData\Players.cs" />
     <Compile Include="src\PersistentData\Player.cs" />
-    <Compile Include="src\JSON\JSONNode.cs" />
-    <Compile Include="src\JSON\JSONArray.cs" />
-    <Compile Include="src\JSON\JSONObject.cs" />
-    <Compile Include="src\JSON\JSONNumber.cs" />
-    <Compile Include="src\JSON\JSONString.cs" />
-    <Compile Include="src\JSON\JSONBoolean.cs" />
-    <Compile Include="src\BlockingQueue.cs" />
-    <Compile Include="src\JSON\Parser.cs" />
-    <Compile Include="src\JSON\JSONNull.cs" />
-    <Compile Include="src\JSON\MalformedJSONException.cs" />
     <Compile Include="src\API.cs" />
     <Compile Include="src\AllocsUtils.cs" />
     <Compile Include="src\LandClaimList.cs" />
     <Compile Include="src\PersistentData\Attributes.cs" />
-    <Compile Include="src\JSON\JSONValue.cs" />
     <Compile Include="src\LiveData\EntityFilterList.cs" />
   </ItemGroup>
@@ -112,5 +100,4 @@
     <Folder Include="src\" />
     <Folder Include="src\PersistentData\" />
-    <Folder Include="src\JSON\Parser\" />
   </ItemGroup>
   <ItemGroup>
Index: binary-improvements/7dtd-server-fixes/ModInfo.xml
===================================================================
--- binary-improvements/7dtd-server-fixes/ModInfo.xml	(revision 450)
+++ binary-improvements/7dtd-server-fixes/ModInfo.xml	(revision 455)
@@ -5,6 +5,6 @@
 		<Description value="Common functions" />
 		<Author value="Christian 'Alloc' Illy" />
-		<Version value="29" />
-		<Website value="http://7dtd.illy.bz" />
+		<Version value="30" />
+		<Website value="https://7dtd.illy.bz" />
 	</ModInfo>
 </xml>
Index: binary-improvements/7dtd-server-fixes/src/API.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/API.cs	(revision 450)
+++ binary-improvements/7dtd-server-fixes/src/API.cs	(revision 455)
@@ -1,11 +1,12 @@
 using System.Collections.Generic;
 using AllocsFixes.PersistentData;
+using JetBrains.Annotations;
 using Platform.Steam;
 
 namespace AllocsFixes {
+	[UsedImplicitly]
 	public class API : IModApi {
 		public void InitMod (Mod _modInstance) {
 			ModEvents.GameStartDone.RegisterHandler (GameAwake);
-			ModEvents.GameShutdown.RegisterHandler (GameShutdown);
 			ModEvents.SavePlayerData.RegisterHandler (SavePlayerData);
 			ModEvents.PlayerSpawning.RegisterHandler (PlayerSpawning);
@@ -15,16 +16,13 @@
 		}
 
-		public void GameAwake () {
+		private static void GameAwake () {
 			PersistentContainer.Load ();
 		}
 
-		public void GameShutdown () {
-		}
-
-		public void SavePlayerData (ClientInfo _cInfo, PlayerDataFile _playerDataFile) {
+		private static void SavePlayerData (ClientInfo _cInfo, PlayerDataFile _playerDataFile) {
 			PersistentContainer.Instance.Players.GetOrCreate (_cInfo.InternalId, _cInfo.PlatformId, _cInfo.CrossplatformId).Update (_cInfo, _playerDataFile);
 		}
 
-		public void PlayerSpawning (ClientInfo _cInfo, int _chunkViewDim, PlayerProfile _playerProfile) {
+		private static void PlayerSpawning (ClientInfo _cInfo, int _chunkViewDim, PlayerProfile _playerProfile) {
 			string owner = null;
 			if (_cInfo.PlatformId is UserIdentifierSteam identifierSteam) {
@@ -32,15 +30,10 @@
 			}
 
-			Log.Out ("Player connected" +
-			         ", entityid=" + _cInfo.entityId +
-			         ", name=" + _cInfo.playerName +
-			         ", pltfmid=" + (_cInfo.PlatformId?.CombinedString ?? "<unknown>") +
-			         ", crossid=" + (_cInfo.CrossplatformId?.CombinedString ?? "<unknown/none>") +
-			         ", steamOwner=" + (owner ?? "<unknown/none>") +
-			         ", ip=" + _cInfo.ip
+			Log.Out (
+				$"Player connected, entityid={_cInfo.entityId}, name={_cInfo.playerName}, pltfmid={_cInfo.PlatformId?.CombinedString ?? "<unknown>"}, crossid={_cInfo.CrossplatformId?.CombinedString ?? "<unknown/none>"}, steamOwner={owner ?? "<unknown/none>"}, ip={_cInfo.ip}"
 			);
 		}
 
-		public void PlayerDisconnected (ClientInfo _cInfo, bool _bShutdown) {
+		private static void PlayerDisconnected (ClientInfo _cInfo, bool _bShutdown) {
 			Player p = PersistentContainer.Instance.Players.GetByInternalId (_cInfo.InternalId);
 			if (p != null) {
@@ -53,13 +46,12 @@
 		}
 
-		public void PlayerSpawned (ClientInfo _cInfo, RespawnType _respawnReason, Vector3i _spawnPos) {
+		private static void PlayerSpawned (ClientInfo _cInfo, RespawnType _respawnReason, Vector3i _spawnPos) {
 			PersistentContainer.Instance.Players.GetOrCreate (_cInfo.InternalId, _cInfo.PlatformId, _cInfo.CrossplatformId).SetOnline (_cInfo);
 			PersistentContainer.Instance.Save ();
 		}
 
-		private const string ANSWER =
-			"     [ff0000]I[-] [ff7f00]W[-][ffff00]A[-][80ff00]S[-] [00ffff]H[-][0080ff]E[-][0000ff]R[-][8b00ff]E[-]";
+		private const string ANSWER = "     [ff0000]I[-] [ff7f00]W[-][ffff00]A[-][80ff00]S[-] [00ffff]H[-][0080ff]E[-][0000ff]R[-][8b00ff]E[-]";
 
-		public bool ChatMessage (ClientInfo _cInfo, EChatType _type, int _senderId, string _msg, string _mainName,
+		private static bool ChatMessage (ClientInfo _cInfo, EChatType _type, int _senderId, string _msg, string _mainName,
 			bool _localizeMain, List<int> _recipientEntityIds) {
 			if (string.IsNullOrEmpty (_msg) || !_msg.EqualsCaseInsensitive ("/alloc")) {
@@ -68,8 +60,8 @@
 
 			if (_cInfo != null) {
-				Log.Out ("Sent chat hook reply to {0}", _cInfo.InternalId);
+				Log.Out ($"Sent chat hook reply to {_cInfo.InternalId}");
 				_cInfo.SendPackage (NetPackageManager.GetPackage<NetPackageChat> ().Setup (EChatType.Whisper, -1, ANSWER, "", false, null));
 			} else {
-				Log.Error ("ChatHookExample: Argument _cInfo null on message: {0}", _msg);
+				Log.Error ($"ChatHookExample: Argument _cInfo null on message: {_msg}");
 			}
 
Index: binary-improvements/7dtd-server-fixes/src/AllocsUtils.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/AllocsUtils.cs	(revision 450)
+++ binary-improvements/7dtd-server-fixes/src/AllocsUtils.cs	(revision 455)
@@ -4,6 +4,5 @@
 	public static class AllocsUtils {
 		public static string ColorToHex (Color _color) {
-			return string.Format ("{0:X02}{1:X02}{2:X02}", (int) (_color.r * 255), (int) (_color.g * 255),
-				(int) (_color.b * 255));
+			return $"{(int)(_color.r * 255):X02}{(int)(_color.g * 255):X02}{(int)(_color.b * 255):X02}";
 		}
 	}
Index: binary-improvements/7dtd-server-fixes/src/BlockingQueue.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/BlockingQueue.cs	(revision 450)
+++ 	(revision )
@@ -1,37 +1,0 @@
-using System.Collections.Generic;
-using System.Threading;
-
-namespace AllocsFixes {
-	public class BlockingQueue<T> {
-		private readonly Queue<T> queue = new Queue<T> ();
-		private bool closing;
-
-		public void Enqueue (T _item) {
-			lock (queue) {
-				queue.Enqueue (_item);
-				Monitor.PulseAll (queue);
-			}
-		}
-
-		public T Dequeue () {
-			lock (queue) {
-				while (queue.Count == 0) {
-					if (closing) {
-						return default (T);
-					}
-
-					Monitor.Wait (queue);
-				}
-
-				return queue.Dequeue ();
-			}
-		}
-
-		public void Close () {
-			lock (queue) {
-				closing = true;
-				Monitor.PulseAll (queue);
-			}
-		}
-	}
-}
Index: binary-improvements/7dtd-server-fixes/src/PersistentData/Attributes.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/Attributes.cs	(revision 450)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Attributes.cs	(revision 455)
@@ -8,17 +8,11 @@
 
 		public bool HideChatCommands {
-			get { return hideChatCommands; }
-			set { hideChatCommands = value; }
+			get => hideChatCommands;
+			set => hideChatCommands = value;
 		}
 
 		public string HideChatCommandPrefix {
-			get {
-				if (hideChatCommandPrefix == null) {
-					hideChatCommandPrefix = "";
-				}
-
-				return hideChatCommandPrefix;
-			}
-			set { hideChatCommandPrefix = value; }
+			get => hideChatCommandPrefix ??= "";
+			set => hideChatCommandPrefix = value;
 		}
 	}
Index: binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs	(revision 450)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs	(revision 455)
@@ -24,7 +24,7 @@
 		}
 
-		private void ProcessInv (List<InvItem> _target, ItemStack[] _sourceFields, int _id) {
+		private void ProcessInv (ICollection<InvItem> _target, IReadOnlyList<ItemStack> _sourceFields, int _id) {
 			_target.Clear ();
-			for (int i = 0; i < _sourceFields.Length; i++) {
+			for (int i = 0; i < _sourceFields.Count; i++) {
 				InvItem item = CreateInvItem (_sourceFields [i].itemValue, _sourceFields [i].count, _id);
 				if (item != null && _sourceFields [i].itemValue.Modifications != null) {
@@ -43,7 +43,7 @@
 		}
 
-		private void ProcessParts (ItemValue[] _parts, InvItem _item, int _playerId) {
-			InvItem[] itemParts = new InvItem[_parts.Length];
-			for (int i = 0; i < _parts.Length; i++) {
+		private void ProcessParts (IReadOnlyList<ItemValue> _parts, InvItem _item, int _playerId) {
+			InvItem[] itemParts = new InvItem[_parts.Count];
+			for (int i = 0; i < _parts.Count; i++) {
 				InvItem partItem = CreateInvItem (_parts [i], 1, _playerId);
 				if (partItem != null && _parts [i].Modifications != null) {
@@ -67,6 +67,5 @@
 
 			if (_count > maxAllowed) {
-				Log.Out ("Player with ID " + _playerId + " has stack for \"" + name + "\" greater than allowed (" +
-				         _count + " > " + maxAllowed + ")");
+				Log.Out ($"Player with ID {_playerId} has stack for \"{name}\" greater than allowed ({_count} > {maxAllowed})");
 			}
 
Index: binary-improvements/7dtd-server-fixes/src/PersistentData/PersistentContainer.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/PersistentContainer.cs	(revision 450)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/PersistentContainer.cs	(revision 455)
@@ -12,35 +12,11 @@
 		[OptionalField] private Attributes attributes;
 
-		public Players Players {
-			get {
-				if (players == null) {
-					players = new Players ();
-				}
+		public Players Players => players ??= new Players ();
 
-				return players;
-			}
-		}
-
-		public Attributes Attributes {
-			get {
-				if (attributes == null) {
-					attributes = new Attributes ();
-				}
-
-				return attributes;
-			}
-		}
+		public Attributes Attributes => attributes ??= new Attributes ();
 
 		private static PersistentContainer instance;
 
-		public static PersistentContainer Instance {
-			get {
-				if (instance == null) {
-					instance = new PersistentContainer ();
-				}
-
-				return instance;
-			}
-		}
+		public static PersistentContainer Instance => instance ??= new PersistentContainer ();
 
 		private PersistentContainer () {
@@ -49,5 +25,5 @@
 		public void Save () {
 			lock (fileLockObject) {
-				using Stream stream = File.Open (GameIO.GetSaveGameDir () + persistentDataFileName, FileMode.Create);
+				using Stream stream = File.Open ($"{GameIO.GetSaveGameDir ()}{persistentDataFileName}", FileMode.Create);
 				BinaryFormatter bFormatter = new BinaryFormatter ();
 				bFormatter.Serialize (stream, this);
@@ -56,5 +32,7 @@
 
 		public static bool Load () {
-			if (!File.Exists (GameIO.GetSaveGameDir () + persistentDataFileName)) {
+			var filePath = $"{GameIO.GetSaveGameDir ()}{persistentDataFileName}";
+			
+			if (!File.Exists (filePath)) {
 				return false;
 			}
@@ -63,5 +41,5 @@
 				PersistentContainer obj;
 				lock (fileLockObject) {
-					using Stream stream = File.Open (GameIO.GetSaveGameDir () + persistentDataFileName, FileMode.Open);
+					using Stream stream = File.Open (filePath, FileMode.Open);
 					BinaryFormatter bFormatter = new BinaryFormatter ();
 					obj = (PersistentContainer)bFormatter.Deserialize (stream);
Index: binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs	(revision 450)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Player.cs	(revision 455)
@@ -124,5 +124,5 @@
 			}
 
-			Log.Out ("Player set to offline: " + InternalId);
+			Log.Out ($"Player set to offline: {InternalId}");
 			lastOnline = DateTime.Now;
 			try {
@@ -140,5 +140,5 @@
 
 		public void SetOnline (ClientInfo _ci) {
-			Log.Out ("Player set to online: " + InternalId);
+			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 450)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Players.cs	(revision 455)
@@ -19,5 +19,5 @@
 			}
 
-			Log.Out ("Created new player entry for ID: " + _internalId);
+			Log.Out ($"Created new player entry for ID: {_internalId}");
 			Player p = new Player (_internalId, _platformId, _crossPlatformId);
 			Dict.Add (_internalId, p);
