Index: binary-improvements2/7dtd-server-fixes/7dtd-server-fixes.csproj
===================================================================
--- binary-improvements2/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 391)
@@ -91,13 +91,12 @@
     <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\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\JSON\Parser.cs" />
-    <Compile Include="src\JSON\JSONNull.cs" />
+    <Compile Include="src\JSON\JsonNull.cs" />
     <Compile Include="src\JSON\MalformedJSONException.cs" />
     <Compile Include="src\FileCache\AbstractCache.cs" />
@@ -105,9 +104,9 @@
     <Compile Include="src\FileCache\SimpleCache.cs" />
     <Compile Include="src\FileCache\MapTileCache.cs" />
-    <Compile Include="src\API.cs" />
+    <Compile Include="src\ModApi.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\JSON\JsonValue.cs" />
     <Compile Include="src\LiveData\EntityFilterList.cs" />
   </ItemGroup>
@@ -116,5 +115,4 @@
     <Folder Include="src\" />
     <Folder Include="src\PersistentData\" />
-    <Folder Include="src\JSON\Parser\" />
     <Folder Include="src\FileCache\" />
   </ItemGroup>
Index: binary-improvements2/7dtd-server-fixes/ModInfo.xml
===================================================================
--- binary-improvements2/7dtd-server-fixes/ModInfo.xml	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/ModInfo.xml	(revision 391)
@@ -2,9 +2,9 @@
 <xml>
 	<ModInfo>
-		<Name value="Allocs server fixes" />
+		<Name value="Server extensions" />
 		<Description value="Common functions" />
-		<Author value="Christian 'Alloc' Illy" />
-		<Version value="24" />
-		<Website value="http://7dtd.illy.bz" />
+		<Author value="The Fun Pimps LLC" />
+		<Version value="1" />
+		<Website value="" />
 	</ModInfo>
 </xml>
Index: binary-improvements2/7dtd-server-fixes/src/API.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/API.cs	(revision 389)
+++ 	(revision )
@@ -1,79 +1,0 @@
-using System.Collections.Generic;
-using AllocsFixes.PersistentData;
-using Platform.Steam;
-
-namespace AllocsFixes {
-	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);
-			ModEvents.PlayerDisconnected.RegisterHandler (PlayerDisconnected);
-			ModEvents.PlayerSpawnedInWorld.RegisterHandler (PlayerSpawned);
-			ModEvents.ChatMessage.RegisterHandler (ChatMessage);
-		}
-
-		public void GameAwake () {
-			PersistentContainer.Load ();
-		}
-
-		public void GameShutdown () {
-		}
-
-		public void SavePlayerData (ClientInfo _cInfo, PlayerDataFile _playerDataFile) {
-			PersistentContainer.Instance.Players [_cInfo.InternalId, true].Update (_playerDataFile);
-		}
-
-		public void PlayerSpawning (ClientInfo _cInfo, int _chunkViewDim, PlayerProfile _playerProfile) {
-			string owner = null;
-			if (_cInfo.PlatformId is UserIdentifierSteam identifierSteam) {
-				owner = identifierSteam.OwnerId.ToString ();
-			}
-
-			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) {
-			Player p = PersistentContainer.Instance.Players [_cInfo.InternalId, false];
-			if (p != null) {
-				p.SetOffline ();
-			} else {
-				Log.Out ("Disconnected player not found in client list...");
-			}
-
-			PersistentContainer.Instance.Save ();
-		}
-
-		public void PlayerSpawned (ClientInfo _cInfo, RespawnType _respawnReason, Vector3i _spawnPos) {
-			PersistentContainer.Instance.Players [_cInfo.InternalId, true].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[-]";
-
-		public bool ChatMessage (ClientInfo _cInfo, EChatType _type, int _senderId, string _msg, string _mainName,
-			bool _localizeMain, List<int> _recipientEntityIds) {
-			if (string.IsNullOrEmpty (_msg) || !_msg.EqualsCaseInsensitive ("/alloc")) {
-				return true;
-			}
-
-			if (_cInfo != null) {
-				Log.Out ("Sent chat hook reply to {0}", _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);
-			}
-
-			return false;
-		}
-	}
-}
Index: binary-improvements2/7dtd-server-fixes/src/AllocsUtils.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/AllocsUtils.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/AllocsUtils.cs	(revision 391)
@@ -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-improvements2/7dtd-server-fixes/src/AssemblyInfo.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/AssemblyInfo.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/AssemblyInfo.cs	(revision 391)
@@ -7,7 +7,7 @@
 [assembly: AssemblyDescription ("")]
 [assembly: AssemblyConfiguration ("")]
-[assembly: AssemblyCompany ("")]
+[assembly: AssemblyCompany ("The Fun Pimps LLC")]
 [assembly: AssemblyProduct ("")]
-[assembly: AssemblyCopyright ("Alloc")]
+[assembly: AssemblyCopyright ("The Fun Pimps LLC")]
 [assembly: AssemblyTrademark ("")]
 [assembly: AssemblyCulture ("")]
Index: binary-improvements2/7dtd-server-fixes/src/BlockingQueue.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/BlockingQueue.cs	(revision 389)
+++ 	(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-improvements2/7dtd-server-fixes/src/FileCache/DirectAccess.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/FileCache/DirectAccess.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/FileCache/DirectAccess.cs	(revision 391)
@@ -7,9 +7,5 @@
 		public override byte[] GetFileContent (string _filename) {
 			try {
-				if (!File.Exists (_filename)) {
-					return null;
-				}
-
-				return File.ReadAllBytes (_filename);
+				return File.Exists (_filename) ? File.ReadAllBytes (_filename) : null;
 			} catch (Exception e) {
 				Log.Out ("Error in DirectAccess.GetFileContent: " + e);
Index: binary-improvements2/7dtd-server-fixes/src/FileCache/MapTileCache.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/FileCache/MapTileCache.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/FileCache/MapTileCache.cs	(revision 391)
@@ -36,17 +36,19 @@
 				lock (cache) {
 					CurrentZoomFile cacheEntry = cache [_zoomlevel];
-					
-					if (cacheEntry.filename == null || !cacheEntry.filename.Equals (_filename)) {
-						cacheEntry.filename = _filename;
 
-						if (!File.Exists (_filename)) {
-							cacheEntry.pngData = null;
-							return null;
-						}
+					if (cacheEntry.filename != null && cacheEntry.filename.Equals (_filename)) {
+						return cacheEntry.pngData;
+					}
 
-						Profiler.BeginSample ("ReadPng");
-						cacheEntry.pngData = ReadAllBytes (_filename);
-						Profiler.EndSample ();
+					cacheEntry.filename = _filename;
+
+					if (!File.Exists (_filename)) {
+						cacheEntry.pngData = null;
+						return null;
 					}
+
+					Profiler.BeginSample ("ReadPng");
+					cacheEntry.pngData = ReadAllBytes (_filename);
+					Profiler.EndSample ();
 
 					return cacheEntry.pngData;
@@ -103,9 +105,5 @@
 					}
 
-					if (!File.Exists (_filename)) {
-						return transparentTile;
-					}
-
-					return ReadAllBytes (_filename);
+					return !File.Exists (_filename) ? transparentTile : ReadAllBytes (_filename);
 				}
 			} catch (Exception e) {
Index: binary-improvements2/7dtd-server-fixes/src/FileCache/SimpleCache.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/FileCache/SimpleCache.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/FileCache/SimpleCache.cs	(revision 391)
@@ -11,11 +11,13 @@
 			try {
 				lock (fileCache) {
-					if (!fileCache.ContainsKey (_filename)) {
-						if (!File.Exists (_filename)) {
-							return null;
-						}
+					if (fileCache.ContainsKey (_filename)) {
+						return fileCache [_filename];
+					}
 
-						fileCache.Add (_filename, File.ReadAllBytes (_filename));
+					if (!File.Exists (_filename)) {
+						return null;
 					}
+
+					fileCache.Add (_filename, File.ReadAllBytes (_filename));
 
 					return fileCache [_filename];
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONArray.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONArray.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONArray.cs	(revision 391)
@@ -3,17 +3,15 @@
 
 namespace AllocsFixes.JSON {
-	public class JSONArray : JSONNode {
-		private readonly List<JSONNode> nodes = new List<JSONNode> ();
+	public class JsonArray : JsonNode {
+		private readonly List<JsonNode> nodes = new List<JsonNode> ();
 
-		public JSONNode this [int _index] {
-			get { return nodes [_index]; }
-			set { nodes [_index] = value; }
+		public JsonNode this [int _index] {
+			get => nodes [_index];
+			set => nodes [_index] = value;
 		}
 
-		public int Count {
-			get { return nodes.Count; }
-		}
+		public int Count => nodes.Count;
 
-		public void Add (JSONNode _node) {
+		public void Add (JsonNode _node) {
 			nodes.Add (_node);
 		}
@@ -25,5 +23,5 @@
 			}
 
-			foreach (JSONNode n in nodes) {
+			foreach (JsonNode n in nodes) {
 				if (_prettyPrint) {
 					_stringBuilder.Append (new string ('\t', _currentLevel + 1));
@@ -48,7 +46,7 @@
 		}
 
-		public static JSONArray Parse (string _json, ref int _offset) {
+		public static JsonArray Parse (string _json, ref int _offset) {
 			//Log.Out ("ParseArray enter (" + offset + ")");
-			JSONArray arr = new JSONArray ();
+			JsonArray arr = new JsonArray ();
 
 			bool nextElemAllowed = true;
@@ -63,5 +61,5 @@
 							_offset++;
 						} else {
-							throw new MalformedJSONException (
+							throw new MalformedJsonException (
 								"Could not parse array, found a comma without a value first");
 						}
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONBoolean.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONBoolean.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONBoolean.cs	(revision 391)
@@ -2,8 +2,8 @@
 
 namespace AllocsFixes.JSON {
-	public class JSONBoolean : JSONValue {
+	public class JsonBoolean : JsonValue {
 		private readonly bool value;
 
-		public JSONBoolean (bool _value) {
+		public JsonBoolean (bool _value) {
 			value = _value;
 		}
@@ -17,5 +17,5 @@
 		}
 
-		public static JSONBoolean Parse (string _json, ref int _offset) {
+		public static JsonBoolean Parse (string _json, ref int _offset) {
 			//Log.Out ("ParseBool enter (" + offset + ")");
 
@@ -23,5 +23,5 @@
 				//Log.Out ("JSON:Parsed Bool: true");
 				_offset += 4;
-				return new JSONBoolean (true);
+				return new JsonBoolean (true);
 			}
 
@@ -29,8 +29,8 @@
 				//Log.Out ("JSON:Parsed Bool: false");
 				_offset += 5;
-				return new JSONBoolean (false);
+				return new JsonBoolean (false);
 			}
 
-			throw new MalformedJSONException ("No valid boolean found");
+			throw new MalformedJsonException ("No valid boolean found");
 		}
 
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONNode.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONNode.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONNode.cs	(revision 391)
@@ -2,5 +2,5 @@
 
 namespace AllocsFixes.JSON {
-	public abstract class JSONNode {
+	public abstract class JsonNode {
 		public abstract void ToString (StringBuilder _stringBuilder, bool _prettyPrint = false, int _currentLevel = 0);
 
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONNull.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONNull.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONNull.cs	(revision 391)
@@ -3,19 +3,19 @@
 
 namespace AllocsFixes.JSON {
-	public class JSONNull : JSONValue {
+	public class JsonNull : JsonValue {
 		public override void ToString (StringBuilder _stringBuilder, bool _prettyPrint = false, int _currentLevel = 0) {
 			_stringBuilder.Append ("null");
 		}
 
-		public static JSONNull Parse (string _json, ref int _offset) {
+		public static JsonNull Parse (string _json, ref int _offset) {
 			//Log.Out ("ParseNull enter (" + offset + ")");
 
 			if (!_json.Substring (_offset, 4).Equals ("null")) {
-				throw new MalformedJSONException ("No valid null value found");
+				throw new MalformedJsonException ("No valid null value found");
 			}
 
 			//Log.Out ("JSON:Parsed Null");
 			_offset += 4;
-			return new JSONNull ();
+			return new JsonNull ();
 		}
 
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONNumber.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONNumber.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONNumber.cs	(revision 391)
@@ -3,8 +3,8 @@
 
 namespace AllocsFixes.JSON {
-	public class JSONNumber : JSONValue {
+	public class JsonNumber : JsonValue {
 		private readonly double value;
 
-		public JSONNumber (double _value) {
+		public JsonNumber (double _value) {
 			value = _value;
 		}
@@ -22,5 +22,5 @@
 		}
 
-		public static JSONNumber Parse (string _json, ref int _offset) {
+		public static JsonNumber Parse (string _json, ref int _offset) {
 			//Log.Out ("ParseNumber enter (" + offset + ")");
 			StringBuilder sbNum = new StringBuilder ();
@@ -37,13 +37,13 @@
 				} else if (_json [_offset] == '.') {
 					if (hasExp) {
-						throw new MalformedJSONException ("Decimal separator in exponent");
+						throw new MalformedJsonException ("Decimal separator in exponent");
 					}
 
 					if (hasDec) {
-						throw new MalformedJSONException ("Multiple decimal separators in number found");
+						throw new MalformedJsonException ("Multiple decimal separators in number found");
 					}
 
 					if (sbNum.Length == 0) {
-						throw new MalformedJSONException ("No leading digits before decimal separator found");
+						throw new MalformedJsonException ("No leading digits before decimal separator found");
 					}
 
@@ -53,5 +53,5 @@
 					if (hasExp) {
 						if (sbExp.Length > 0) {
-							throw new MalformedJSONException ("Negative sign in exponent after digits");
+							throw new MalformedJsonException ("Negative sign in exponent after digits");
 						}
 
@@ -59,5 +59,5 @@
 					} else {
 						if (sbNum.Length > 0) {
-							throw new MalformedJSONException ("Negative sign in mantissa after digits");
+							throw new MalformedJsonException ("Negative sign in mantissa after digits");
 						}
 
@@ -66,9 +66,9 @@
 				} else if (_json [_offset] == 'e' || _json [_offset] == 'E') {
 					if (hasExp) {
-						throw new MalformedJSONException ("Multiple exponential markers in number found");
+						throw new MalformedJsonException ("Multiple exponential markers in number found");
 					}
 
 					if (sbNum.Length == 0) {
-						throw new MalformedJSONException ("No leading digits before exponential marker found");
+						throw new MalformedJsonException ("No leading digits before exponential marker found");
 					}
 
@@ -78,28 +78,26 @@
 					if (hasExp) {
 						if (sbExp.Length > 0) {
-							throw new MalformedJSONException ("Positive sign in exponent after digits");
+							throw new MalformedJsonException ("Positive sign in exponent after digits");
 						}
 
 						sbExp.Append (_json [_offset]);
 					} else {
-						throw new MalformedJSONException ("Positive sign in mantissa found");
+						throw new MalformedJsonException ("Positive sign in mantissa found");
 					}
 				} else {
-					double number;
-					if (!StringParsers.TryParseDouble (sbNum.ToString (), out number)) {
-						throw new MalformedJSONException ("Mantissa is not a valid decimal (\"" + sbNum + "\")");
+					if (!StringParsers.TryParseDouble (sbNum.ToString (), out double number)) {
+						throw new MalformedJsonException ("Mantissa is not a valid decimal (\"" + sbNum + "\")");
 					}
 
 					if (hasExp) {
-						int exp;
-						if (!int.TryParse (sbExp.ToString (), out exp)) {
-							throw new MalformedJSONException ("Exponent is not a valid integer (\"" + sbExp + "\")");
+						if (!int.TryParse (sbExp.ToString (), out int exp)) {
+							throw new MalformedJsonException ("Exponent is not a valid integer (\"" + sbExp + "\")");
 						}
 
-						number = number * Math.Pow (10, exp);
+						number *= Math.Pow (10, exp);
 					}
 
 					//Log.Out ("JSON:Parsed Number: " + number.ToString ());
-					return new JSONNumber (number);
+					return new JsonNumber (number);
 				}
 
@@ -107,5 +105,5 @@
 			}
 
-			throw new MalformedJSONException ("End of JSON reached before parsing number finished");
+			throw new MalformedJsonException ("End of JSON reached before parsing number finished");
 		}
 
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONObject.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONObject.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONObject.cs	(revision 391)
@@ -3,8 +3,8 @@
 
 namespace AllocsFixes.JSON {
-	public class JSONObject : JSONNode {
-		private readonly Dictionary<string, JSONNode> nodes = new Dictionary<string, JSONNode> ();
+	public class JsonObject : JsonNode {
+		private readonly Dictionary<string, JsonNode> nodes = new Dictionary<string, JsonNode> ();
 
-		public JSONNode this [string _name] {
+		public JsonNode this [string _name] {
 			get => nodes [_name];
 			set => nodes [_name] = value;
@@ -19,9 +19,9 @@
 		}
 
-		public bool TryGetValue (string _name, out JSONNode _node) {
+		public bool TryGetValue (string _name, out JsonNode _node) {
 			return nodes.TryGetValue (_name, out _node);
 		}
 
-		public void Add (string _name, JSONNode _node) {
+		public void Add (string _name, JsonNode _node) {
 			nodes.Add (_name, _node);
 		}
@@ -33,15 +33,15 @@
 			}
 
-			foreach (KeyValuePair<string, JSONNode> kvp in nodes) {
+			foreach ((string key, JsonNode value) in nodes) {
 				if (_prettyPrint) {
 					_stringBuilder.Append (new string ('\t', _currentLevel + 1));
 				}
 
-				_stringBuilder.Append (string.Format ("\"{0}\":", kvp.Key));
+				_stringBuilder.Append ($"\"{key}\":");
 				if (_prettyPrint) {
 					_stringBuilder.Append (" ");
 				}
 
-				kvp.Value.ToString (_stringBuilder, _prettyPrint, _currentLevel + 1);
+				value.ToString (_stringBuilder, _prettyPrint, _currentLevel + 1);
 				_stringBuilder.Append (",");
 				if (_prettyPrint) {
@@ -61,7 +61,7 @@
 		}
 
-		public static JSONObject Parse (string _json, ref int _offset) {
+		public static JsonObject Parse (string _json, ref int _offset) {
 			//Log.Out ("ParseObject enter (" + offset + ")");
-			JSONObject obj = new JSONObject ();
+			JsonObject obj = new JsonObject ();
 
 			bool nextElemAllowed = true;
@@ -72,17 +72,17 @@
 					case '"':
 						if (nextElemAllowed) {
-							JSONString key = JSONString.Parse (_json, ref _offset);
+							JsonString key = JsonString.Parse (_json, ref _offset);
 							Parser.SkipWhitespace (_json, ref _offset);
 							if (_json [_offset] != ':') {
-								throw new MalformedJSONException (
+								throw new MalformedJsonException (
 									"Could not parse object, missing colon (\":\") after key");
 							}
 
 							_offset++;
-							JSONNode val = Parser.ParseInternal (_json, ref _offset);
+							JsonNode val = Parser.ParseInternal (_json, ref _offset);
 							obj.Add (key.GetString (), val);
 							nextElemAllowed = false;
 						} else {
-							throw new MalformedJSONException (
+							throw new MalformedJsonException (
 								"Could not parse object, found new key without a separating comma");
 						}
@@ -94,5 +94,5 @@
 							_offset++;
 						} else {
-							throw new MalformedJSONException (
+							throw new MalformedJsonException (
 								"Could not parse object, found a comma without a key/value pair first");
 						}
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONString.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONString.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONString.cs	(revision 391)
@@ -2,8 +2,8 @@
 
 namespace AllocsFixes.JSON {
-	public class JSONString : JSONValue {
+	public class JsonString : JsonValue {
 		private readonly string value;
 
-		public JSONString (string _value) {
+		public JsonString (string _value) {
 			value = _value;
 		}
@@ -14,5 +14,5 @@
 
 		public override void ToString (StringBuilder _stringBuilder, bool _prettyPrint = false, int _currentLevel = 0) {
-			if (value == null || value.Length == 0) {
+			if (string.IsNullOrEmpty (value)) {
 				_stringBuilder.Append ("\"\"");
 				return;
@@ -64,5 +64,5 @@
 		}
 
-		public static JSONString Parse (string _json, ref int _offset) {
+		public static JsonString Parse (string _json, ref int _offset) {
 			//Log.Out ("ParseString enter (" + offset + ")");
 			StringBuilder sb = new StringBuilder ();
@@ -104,5 +104,5 @@
 
 						//Log.Out ("JSON:Parsed String: " + sb.ToString ());
-						return new JSONString (sb.ToString ());
+						return new JsonString (sb.ToString ());
 					default:
 						sb.Append (_json [_offset]);
@@ -112,5 +112,5 @@
 			}
 
-			throw new MalformedJSONException ("End of JSON reached before parsing string finished");
+			throw new MalformedJsonException ("End of JSON reached before parsing string finished");
 		}
 
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JSONValue.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JSONValue.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JSONValue.cs	(revision 391)
@@ -1,4 +1,4 @@
 ﻿namespace AllocsFixes.JSON {
-	public abstract class JSONValue : JSONNode {
+	public abstract class JsonValue : JsonNode {
 		public abstract string AsString { get; }
 		public abstract int AsInt { get; }
Index: binary-improvements2/7dtd-server-fixes/src/JSON/JsonManualBuilder.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/JsonManualBuilder.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/JsonManualBuilder.cs	(revision 391)
@@ -9,5 +9,5 @@
 			NonEmpty = 1,
 			Object = 2,
-			Array = 4,
+			Array = 4
 		}
 
@@ -20,20 +20,12 @@
 		private int currentLevelNumber;
 
-		private ELevelInfo CurrentLevelInfo {
-			get { return (ELevelInfo) (currentLevelType & levelBitsMask); }
-		}
-
-		private bool CurrentLevelIsNonEmpty {
-			get { return (CurrentLevelInfo & ELevelInfo.NonEmpty) == ELevelInfo.NonEmpty; }
-		}
-
-		private bool CurrentLevelIsArray {
-			get { return (CurrentLevelInfo & ELevelInfo.Array) != ELevelInfo.Array; }
-		}
-
-		private bool CurrentLevelIsObject {
-			get { return (CurrentLevelInfo & ELevelInfo.Object) != ELevelInfo.Object; }
-		}
-		
+		private ELevelInfo CurrentLevelInfo => (ELevelInfo) (currentLevelType & levelBitsMask);
+
+		private bool CurrentLevelIsNonEmpty => (CurrentLevelInfo & ELevelInfo.NonEmpty) == ELevelInfo.NonEmpty;
+
+		private bool CurrentLevelIsArray => (CurrentLevelInfo & ELevelInfo.Array) != ELevelInfo.Array;
+
+		private bool CurrentLevelIsObject => (CurrentLevelInfo & ELevelInfo.Object) != ELevelInfo.Object;
+
 		public JsonManualBuilder (bool _prettyPrint) {
 			prettyPrint = _prettyPrint;
@@ -54,5 +46,5 @@
 			}
 
-			currentLevelType = currentLevelType | (long) ELevelInfo.NonEmpty;
+			currentLevelType |= (long) ELevelInfo.NonEmpty;
 		}
 
@@ -210,5 +202,5 @@
 
 			currentLevelNumber--;
-			currentLevelType = currentLevelType >> levelTypeBits;
+			currentLevelType >>= levelTypeBits;
 
 			if (prettyPrint) {
Index: binary-improvements2/7dtd-server-fixes/src/JSON/MalformedJSONException.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/MalformedJSONException.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/MalformedJSONException.cs	(revision 391)
@@ -3,15 +3,15 @@
 
 namespace AllocsFixes.JSON {
-	public class MalformedJSONException : ApplicationException {
-		public MalformedJSONException () {
+	public class MalformedJsonException : ApplicationException {
+		public MalformedJsonException () {
 		}
 
-		public MalformedJSONException (string _message) : base (_message) {
+		public MalformedJsonException (string _message) : base (_message) {
 		}
 
-		public MalformedJSONException (string _message, Exception _inner) : base (_message, _inner) {
+		public MalformedJsonException (string _message, Exception _inner) : base (_message, _inner) {
 		}
 
-		protected MalformedJSONException (SerializationInfo _info, StreamingContext _context) : base (_info, _context) {
+		protected MalformedJsonException (SerializationInfo _info, StreamingContext _context) : base (_info, _context) {
 		}
 	}
Index: binary-improvements2/7dtd-server-fixes/src/JSON/Parser.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/JSON/Parser.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/JSON/Parser.cs	(revision 391)
@@ -1,10 +1,10 @@
 namespace AllocsFixes.JSON {
-	public class Parser {
-		public static JSONNode Parse (string _json) {
+	public static class Parser {
+		public static JsonNode Parse (string _json) {
 			int offset = 0;
 			return ParseInternal (_json, ref offset);
 		}
 
-		public static JSONNode ParseInternal (string _json, ref int _offset) {
+		public static JsonNode ParseInternal (string _json, ref int _offset) {
 			SkipWhitespace (_json, ref _offset);
 
@@ -12,16 +12,16 @@
 			switch (_json [_offset]) {
 				case '[':
-					return JSONArray.Parse (_json, ref _offset);
+					return JsonArray.Parse (_json, ref _offset);
 				case '{':
-					return JSONObject.Parse (_json, ref _offset);
+					return JsonObject.Parse (_json, ref _offset);
 				case '"':
-					return JSONString.Parse (_json, ref _offset);
+					return JsonString.Parse (_json, ref _offset);
 				case 't':
 				case 'f':
-					return JSONBoolean.Parse (_json, ref _offset);
+					return JsonBoolean.Parse (_json, ref _offset);
 				case 'n':
-					return JSONNull.Parse (_json, ref _offset);
+					return JsonNull.Parse (_json, ref _offset);
 				default:
-					return JSONNumber.Parse (_json, ref _offset);
+					return JsonNumber.Parse (_json, ref _offset);
 			}
 		}
@@ -42,5 +42,5 @@
 			}
 
-			throw new MalformedJSONException ("End of JSON reached before parsing finished");
+			throw new MalformedJsonException ("End of JSON reached before parsing finished");
 		}
 	}
Index: binary-improvements2/7dtd-server-fixes/src/LandClaimList.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/LandClaimList.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/LandClaimList.cs	(revision 391)
@@ -20,45 +20,50 @@
 			Dictionary<PersistentPlayerData, List<Vector3i>> owners =
 				new Dictionary<PersistentPlayerData, List<Vector3i>> ();
-			foreach (KeyValuePair<Vector3i, PersistentPlayerData> kvp in d) {
+			foreach ((Vector3i claimPos, PersistentPlayerData owner) in d) {
 				bool allowed = true;
 				if (_positionFilters != null) {
 					foreach (PositionFilter pf in _positionFilters) {
-						if (!pf (kvp.Key)) {
-							allowed = false;
-							break;
+						if (pf (claimPos)) {
+							continue;
 						}
+
+						allowed = false;
+						break;
 					}
 				}
 
-				if (allowed) {
-					if (!owners.ContainsKey (kvp.Value)) {
-						owners.Add (kvp.Value, new List<Vector3i> ());
-					}
+				if (!allowed) {
+					continue;
+				}
 
-					owners [kvp.Value].Add (kvp.Key);
+				if (!owners.ContainsKey (owner)) {
+					owners.Add (owner, new List<Vector3i> ());
 				}
+
+				owners [owner].Add (claimPos);
 			}
 
-			foreach (KeyValuePair<PersistentPlayerData, List<Vector3i>> kvp in owners) {
-				Player p = PersistentContainer.Instance.Players [kvp.Key.UserIdentifier, false];
-				if (p == null) {
-					p = new Player (kvp.Key.UserIdentifier);
-				}
+			foreach ((PersistentPlayerData owner, List<Vector3i> claimPositions) in owners) {
+				Player p = PersistentContainer.Instance.Players [owner.UserIdentifier, false] ?? new Player (owner.UserIdentifier);
 
 				bool allowed = true;
 				if (_ownerFilters != null) {
 					foreach (OwnerFilter of in _ownerFilters) {
-						if (!of (p)) {
-							allowed = false;
-							break;
+						if (of (p)) {
+							continue;
 						}
+
+						allowed = false;
+						break;
 					}
 				}
 
-				if (allowed) {
-					result.Add (p, new List<Vector3i> ());
-					foreach (Vector3i v in kvp.Value) {
-						result [p].Add (v);
-					}
+				if (!allowed) {
+					continue;
+				}
+
+				result.Add (p, new List<Vector3i> ());
+				foreach (Vector3i v in claimPositions) {
+					result [p].Add (v);
 				}
 			}
Index: binary-improvements2/7dtd-server-fixes/src/ModApi.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/ModApi.cs	(revision 391)
+++ binary-improvements2/7dtd-server-fixes/src/ModApi.cs	(revision 391)
@@ -0,0 +1,77 @@
+using System.Collections.Generic;
+using AllocsFixes.PersistentData;
+using JetBrains.Annotations;
+using Platform.Steam;
+
+namespace AllocsFixes {
+	[UsedImplicitly]
+	public class ModApi : IModApi {
+		public void InitMod (Mod _modInstance) {
+			ModEvents.GameStartDone.RegisterHandler (GameAwake);
+			ModEvents.SavePlayerData.RegisterHandler (SavePlayerData);
+			ModEvents.PlayerSpawning.RegisterHandler (PlayerSpawning);
+			ModEvents.PlayerDisconnected.RegisterHandler (PlayerDisconnected);
+			ModEvents.PlayerSpawnedInWorld.RegisterHandler (PlayerSpawned);
+			ModEvents.ChatMessage.RegisterHandler (ChatMessage);
+		}
+
+		private void GameAwake () {
+			PersistentContainer.Load ();
+		}
+
+		private void SavePlayerData (ClientInfo _cInfo, PlayerDataFile _playerDataFile) {
+			PersistentContainer.Instance.Players [_cInfo.InternalId, true].Update (_playerDataFile);
+		}
+
+		private void PlayerSpawning (ClientInfo _cInfo, int _chunkViewDim, PlayerProfile _playerProfile) {
+			string owner = null;
+			if (_cInfo.PlatformId is UserIdentifierSteam identifierSteam) {
+				owner = identifierSteam.OwnerId.ToString ();
+			}
+
+			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
+			);
+		}
+
+		private void PlayerDisconnected (ClientInfo _cInfo, bool _bShutdown) {
+			Player p = PersistentContainer.Instance.Players [_cInfo.InternalId, false];
+			if (p != null) {
+				p.SetOffline ();
+			} else {
+				Log.Out ("Disconnected player not found in client list...");
+			}
+
+			PersistentContainer.Instance.Save ();
+		}
+
+		private void PlayerSpawned (ClientInfo _cInfo, RespawnType _respawnReason, Vector3i _spawnPos) {
+			PersistentContainer.Instance.Players [_cInfo.InternalId, true].SetOnline (_cInfo);
+			PersistentContainer.Instance.Save ();
+		}
+
+		private const string testChatAnswer =
+			"     [ff0000]I[-] [ff7f00]W[-][ffff00]A[-][80ff00]S[-] [00ffff]H[-][0080ff]E[-][0000ff]R[-][8b00ff]E[-]";
+
+		private bool ChatMessage (ClientInfo _cInfo, EChatType _type, int _senderId, string _msg, string _mainName,
+			bool _localizeMain, List<int> _recipientEntityIds) {
+			if (string.IsNullOrEmpty (_msg) || !_msg.EqualsCaseInsensitive ("/alloc")) {
+				return true;
+			}
+
+			if (_cInfo != null) {
+				Log.Out ("Sent chat hook reply to {0}", _cInfo.InternalId);
+				_cInfo.SendPackage (NetPackageManager.GetPackage<NetPackageChat> ().Setup (EChatType.Whisper, -1, testChatAnswer, "", false, null));
+			} else {
+				Log.Error ("ChatHookExample: Argument _cInfo null on message: {0}", _msg);
+			}
+
+			return false;
+		}
+	}
+}
Index: binary-improvements2/7dtd-server-fixes/src/PersistentData/Attributes.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/PersistentData/Attributes.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/PersistentData/Attributes.cs	(revision 391)
@@ -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 ?? (hideChatCommandPrefix = "");
+			set => hideChatCommandPrefix = value;
 		}
 	}
Index: binary-improvements2/7dtd-server-fixes/src/PersistentData/PersistentContainer.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/PersistentData/PersistentContainer.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/PersistentData/PersistentContainer.cs	(revision 391)
@@ -10,35 +10,11 @@
 		[OptionalField] private Attributes attributes;
 
-		public Players Players {
-			get {
-				if (players == null) {
-					players = new Players ();
-				}
+		public Players Players => players ?? (players = new Players ());
 
-				return players;
-			}
-		}
-
-		public Attributes Attributes {
-			get {
-				if (attributes == null) {
-					attributes = new Attributes ();
-				}
-
-				return attributes;
-			}
-		}
+		public Attributes 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 ?? (instance = new PersistentContainer ());
 
 		private PersistentContainer () {
@@ -58,8 +34,7 @@
 
 			try {
-				PersistentContainer obj;
 				Stream stream = File.Open (GameIO.GetSaveGameDir () + "/AllocsPeristentData.bin", FileMode.Open);
 				BinaryFormatter bFormatter = new BinaryFormatter ();
-				obj = (PersistentContainer) bFormatter.Deserialize (stream);
+				PersistentContainer obj = (PersistentContainer) bFormatter.Deserialize (stream);
 				stream.Close ();
 				instance = obj;
Index: binary-improvements2/7dtd-server-fixes/src/PersistentData/Players.cs
===================================================================
--- binary-improvements2/7dtd-server-fixes/src/PersistentData/Players.cs	(revision 389)
+++ binary-improvements2/7dtd-server-fixes/src/PersistentData/Players.cs	(revision 391)
@@ -41,19 +41,19 @@
 
 			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 ((PlatformUserIdentifierAbs iUserId, Player player) in Dict) {
+					if (player.IsOnline && player.EntityID == entityId) {
+						return iUserId;
 					}
 				}
 			}
 
-			foreach (KeyValuePair<PlatformUserIdentifierAbs, Player> kvp in Dict) {
-				string name = kvp.Value.Name;
+			foreach ((PlatformUserIdentifierAbs iUserId, Player player) in Dict) {
+				string name = player.Name;
 				if (_ignoreColorCodes) {
 					name = Regex.Replace (name, "\\[[0-9a-fA-F]{6}\\]", "");
 				}
 
-				if (kvp.Value.IsOnline && name.EqualsCaseInsensitive (_nameOrId)) {
-					return kvp.Key;
+				if (player.IsOnline && name.EqualsCaseInsensitive (_nameOrId)) {
+					return iUserId;
 				}
 			}
