Index: /binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj
===================================================================
--- /binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 353)
+++ /binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 354)
@@ -10,5 +10,5 @@
     <AssemblyName>7dtd-server-fixes</AssemblyName>
     <RootNamespace>AllocsFixes</RootNamespace>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -77,4 +77,5 @@
   <ItemGroup>
     <Compile Include="src\AssemblyInfo.cs" />
+    <Compile Include="src\JSON\JsonManualBuilder.cs" />
     <Compile Include="src\LiveData\Animals.cs" />
     <Compile Include="src\LiveData\Hostiles.cs" />
Index: /binary-improvements/7dtd-server-fixes/src/API.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/API.cs	(revision 353)
+++ /binary-improvements/7dtd-server-fixes/src/API.cs	(revision 354)
@@ -89,5 +89,5 @@
 			if (_cInfo != null) {
 				Log.Out ("Sent chat hook reply to {0}", _cInfo.playerId);
-				_cInfo.SendPackage (new NetPackageChat (EChatType.Whisper, -1, ANSWER, "", false, null));
+				_cInfo.SendPackage (NetPackageManager.GetPackage<NetPackageChat> ().Setup (EChatType.Whisper, -1, ANSWER, "", false, null));
 			} else {
 				Log.Error ("ChatHookExample: Argument _cInfo null on message: {0}", _msg);
Index: /binary-improvements/7dtd-server-fixes/src/JSON/JsonManualBuilder.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/JSON/JsonManualBuilder.cs	(revision 354)
+++ /binary-improvements/7dtd-server-fixes/src/JSON/JsonManualBuilder.cs	(revision 354)
@@ -0,0 +1,229 @@
+using System;
+using System.Text;
+
+namespace AllocsFixes.JSON {
+	public class JsonManualBuilder {
+		[Flags]
+		private enum ELevelInfo {
+			None = 0,
+			NonEmpty = 1,
+			Object = 2,
+			Array = 4,
+		}
+
+		private const int levelTypeBits = 3;
+		private const int levelBitsMask = (1 << levelTypeBits) - 1;
+
+		private readonly bool prettyPrint;
+		private readonly StringBuilder stringBuilder = new StringBuilder ();
+		private ulong currentLevelType = (long) ELevelInfo.None;
+		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; }
+		}
+		
+		public JsonManualBuilder (bool _prettyPrint) {
+			prettyPrint = _prettyPrint;
+		}
+
+		private void NextElement () {
+			if (CurrentLevelIsNonEmpty) {
+				stringBuilder.Append (',');
+				if (prettyPrint) {
+					stringBuilder.Append ('\n');
+				}
+			}
+			
+			if (prettyPrint) {
+				for (int i = 1; i < currentLevelNumber; i++) {
+					stringBuilder.Append ('\t');
+				}
+			}
+
+			currentLevelType = currentLevelType | (long) ELevelInfo.NonEmpty;
+		}
+
+		public JsonManualBuilder OpenArray () {
+			if (!CurrentLevelIsObject) {
+				// In JSON Objects we only create element separators / line breaks with NextKey
+				NextElement ();
+			}
+
+			stringBuilder.Append ('[');
+			openLevel (ELevelInfo.Array);
+
+			return this;
+		}
+
+		public JsonManualBuilder OpenObject () {
+			if (!CurrentLevelIsObject) {
+				// In JSON Objects we only create element separators / line breaks with NextKey
+				NextElement ();
+			}
+
+			stringBuilder.Append ('{');
+			openLevel (ELevelInfo.Object);
+
+			return this;
+		}
+
+		public JsonManualBuilder NextObjectKey (string _key) {
+			if (!CurrentLevelIsObject) {
+				throw new Exception("Can not start a JSON object key while not in a JSON object");
+			}
+			
+			NextElement ();
+			stringBuilder.Append ('"');
+			stringBuilder.Append (_key);
+			stringBuilder.Append ("\":\"");
+			if (prettyPrint) {
+				stringBuilder.Append (' ');
+			}
+
+			return this;
+		}
+
+		public JsonManualBuilder WriteBoolean (bool _value) {
+			if (!CurrentLevelIsObject) {
+				// In JSON Objects we only create element separators / line breaks with NextKey
+				NextElement ();
+			}
+			
+			stringBuilder.Append (_value ? "true" : "false");
+
+			return this;
+		}
+
+		public JsonManualBuilder WriteNull () {
+			if (!CurrentLevelIsObject) {
+				// In JSON Objects we only create element separators / line breaks with NextKey
+				NextElement ();
+			}
+			
+			stringBuilder.Append ("null");
+
+			return this;
+		}
+
+		public JsonManualBuilder WriteNumber (double _value) {
+			if (!CurrentLevelIsObject) {
+				// In JSON Objects we only create element separators / line breaks with NextKey
+				NextElement ();
+			}
+			
+			stringBuilder.Append (_value.ToCultureInvariantString ());
+
+			return this;
+		}
+
+		public JsonManualBuilder WriteString (string _value) {
+			if (!CurrentLevelIsObject) {
+				// In JSON Objects we only create element separators / line breaks with NextKey
+				NextElement ();
+			}
+			
+			if (string.IsNullOrEmpty (_value)) {
+				stringBuilder.Append ("\"\"");
+				return this;
+			}
+
+			stringBuilder.EnsureCapacity (stringBuilder.Length + 2 * _value.Length);
+
+			stringBuilder.Append ('"');
+
+			foreach (char c in _value) {
+				switch (c) {
+					case '\\':
+					case '"':
+//					case '/':
+						stringBuilder.Append ('\\');
+						stringBuilder.Append (c);
+						break;
+					case '\b':
+						stringBuilder.Append ("\\b");
+						break;
+					case '\t':
+						stringBuilder.Append ("\\t");
+						break;
+					case '\n':
+						stringBuilder.Append ("\\n");
+						break;
+					case '\f':
+						stringBuilder.Append ("\\f");
+						break;
+					case '\r':
+						stringBuilder.Append ("\\r");
+						break;
+					default:
+						if (c < ' ') {
+							stringBuilder.Append ("\\u");
+							stringBuilder.Append (((int) c).ToString ("X4"));
+						} else {
+							stringBuilder.Append (c);
+						}
+
+						break;
+				}
+			}
+
+			stringBuilder.Append ('"');
+			
+			return this;
+		}
+
+		private void openLevel (ELevelInfo _levelType) {
+			currentLevelType = currentLevelType << levelTypeBits | (uint) _levelType;
+			currentLevelNumber++;
+
+			if (prettyPrint) {
+				stringBuilder.Append ('\n');
+			}
+		}
+
+		public JsonManualBuilder CloseLevel () {
+			char closeChar;
+			if (CurrentLevelIsObject) {
+				closeChar = '}';
+			} else if (CurrentLevelIsArray) {
+				closeChar = ']';
+			} else {
+				throw new Exception (
+					"Can not CloseLevel as the current level is neither a JSON object nor a JSON array");
+			}
+
+			if (prettyPrint) {
+				stringBuilder.Append ('\n');
+			}
+
+			currentLevelNumber--;
+			currentLevelType = currentLevelType >> levelTypeBits;
+
+			if (prettyPrint) {
+				for (int i = 1; i < currentLevelNumber; i++) {
+					stringBuilder.Append ('\t');
+				}
+			}
+
+			stringBuilder.Append (closeChar);
+
+			return this;
+		}
+
+		public override string ToString () {
+			return stringBuilder.ToString ();
+		}
+	}
+}
Index: /binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs	(revision 353)
+++ /binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs	(revision 354)
@@ -14,7 +14,7 @@
 		public int maxUseTimes;
 		[OptionalField]
-		public int useTimes;
+		public float useTimes;
 
-		public InvItem (string _itemName, int _count, int _quality, int _maxUseTimes, int _maxUse) {
+		public InvItem (string _itemName, int _count, int _quality, int _maxUseTimes, float _maxUse) {
 			itemName = _itemName;
 			count = _count;
Index: /binary-improvements/AllocsCommands/AllocsCommands.csproj
===================================================================
--- /binary-improvements/AllocsCommands/AllocsCommands.csproj	(revision 353)
+++ /binary-improvements/AllocsCommands/AllocsCommands.csproj	(revision 354)
@@ -10,5 +10,5 @@
     <RootNamespace>AllocsCommands</RootNamespace>
     <AssemblyName>AllocsCommands</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
Index: /binary-improvements/AllocsCommands/Chat.cs
===================================================================
--- /binary-improvements/AllocsCommands/Chat.cs	(revision 353)
+++ /binary-improvements/AllocsCommands/Chat.cs	(revision 354)
@@ -10,5 +10,5 @@
 			}
 
-			_receiver.SendPackage (new NetPackageChat(EChatType.Whisper, -1, _message, senderName + " (PM)", false, null));
+			_receiver.SendPackage (NetPackageManager.GetPackage<NetPackageChat> ().Setup (EChatType.Whisper, -1, _message, senderName + " (PM)", false, null));
 			string receiverName = _receiver.playerName;
 			SdtdConsole.Instance.Output ("Message to player " +
Index: /binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs
===================================================================
--- /binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs	(revision 353)
+++ /binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs	(revision 354)
@@ -53,4 +53,5 @@
 
 		public bool LoadIcons () {
+			
 			lock (icons) {
 				if (loaded) {
@@ -59,34 +60,4 @@
 
 				MicroStopwatch microStopwatch = new MicroStopwatch ();
-
-				GameObject atlasObj = GameObject.Find ("/NGUI Root (2D)/ItemIconAtlas");
-				if (atlasObj == null) {
-					Log.Error ("Web:IconHandler: Atlas object not found");
-					loaded = true;
-					return false;
-				}
-
-				DynamicUIAtlas atlas = atlasObj.GetComponent<DynamicUIAtlas> ();
-				if (atlas == null) {
-					Log.Error ("Web:IconHandler: Atlas component not found");
-					loaded = true;
-					return false;
-				}
-
-				string textureResourceName = atlas.PrebakedAtlas;
-				List<UISpriteData> sprites;
-				int elementWidth, elementHeight;
-				Texture2D atlasTex;
-
-				if (!DynamicUIAtlasTools.ReadPrebakedAtlasDescriptor (textureResourceName, out sprites,
-					out elementWidth, out elementHeight)) {
-					SdtdConsole.Instance.Output ("Web:IconHandler: Could not read dynamic atlas descriptor");
-					return false;
-				}
-
-				if (!DynamicUIAtlasTools.ReadPrebakedAtlasTexture (textureResourceName, out atlasTex)) {
-					SdtdConsole.Instance.Output ("Web:IconHandler: Could not read dynamic atlas texture");
-					return false;
-				}
 
 				// Get list of used tints for all items
@@ -107,17 +78,10 @@
 				}
 
-				// Load icons from vanilla
-				foreach (UISpriteData data in sprites) {
-					string name = data.name;
-					Texture2D tex = new Texture2D (data.width, data.height, TextureFormat.ARGB32, false);
-					tex.SetPixels (atlasTex.GetPixels (data.x, atlasTex.height - data.height - data.y, data.width,
-						data.height));
-
-					AddIcon (name, tex, tintedIcons);
-
-					Object.Destroy (tex);
+				try {
+					loadIconsFromFolder (Utils.GetGameDir ("Data/ItemIcons"), tintedIcons);
+				} catch (Exception e) {
+					Log.Error ("Failed loading icons from base game");
+					Log.Exception (e);
 				}
-
-				Resources.UnloadAsset (atlasTex);
 
 				// Load icons from mods
@@ -125,24 +89,7 @@
 					try {
 						string modIconsPath = mod.Path + "/ItemIcons";
-						if (Directory.Exists (modIconsPath)) {
-							foreach (string file in Directory.GetFiles (modIconsPath)) {
-								try {
-									if (file.EndsWith (".png", StringComparison.OrdinalIgnoreCase)) {
-										string name = Path.GetFileNameWithoutExtension (file);
-										Texture2D tex = new Texture2D (1, 1, TextureFormat.ARGB32, false);
-										if (tex.LoadImage (File.ReadAllBytes (file))) {
-											if (tex.width == elementWidth && tex.height == elementHeight) {
-												AddIcon (name, tex, tintedIcons);
-											}
-
-											Object.Destroy (tex);
-										}
-									}
-								} catch (Exception e) {
-									Log.Exception (e);
-								}
-							}
-						}
+						loadIconsFromFolder (modIconsPath, tintedIcons);
 					} catch (Exception e) {
+						Log.Error ("Failed loading icons from mod " + mod.ModInfo.Name.Value);
 						Log.Exception (e);
 					}
@@ -153,4 +100,24 @@
 
 				return true;
+			}
+		}
+
+		private void loadIconsFromFolder (string _path, Dictionary<string, List<Color>> _tintedIcons) {
+			if (Directory.Exists (_path)) {
+				foreach (string file in Directory.GetFiles (_path)) {
+					try {
+						if (file.EndsWith (".png", StringComparison.OrdinalIgnoreCase)) {
+							string name = Path.GetFileNameWithoutExtension (file);
+							Texture2D tex = new Texture2D (1, 1, TextureFormat.ARGB32, false);
+							if (tex.LoadImage (File.ReadAllBytes (file))) {
+								AddIcon (name, tex, _tintedIcons);
+
+								Object.Destroy (tex);
+							}
+						}
+					} catch (Exception e) {
+						Log.Exception (e);
+					}
+				}
 			}
 		}
Index: /binary-improvements/MapRendering/WebAndMapRendering.csproj
===================================================================
--- /binary-improvements/MapRendering/WebAndMapRendering.csproj	(revision 353)
+++ /binary-improvements/MapRendering/WebAndMapRendering.csproj	(revision 354)
@@ -10,5 +10,5 @@
     <RootNamespace>MapRendering</RootNamespace>
     <AssemblyName>MapRendering</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
