Index: binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj
===================================================================
--- binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 196)
+++ binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 197)
@@ -124,4 +124,5 @@
     <Compile Include="src\JSON\MalformedJSONException.cs" />
     <Compile Include="src\CustomCommands\Unban.cs" />
+    <Compile Include="src\ItemList.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Index: binary-improvements/7dtd-server-fixes/src/CustomCommands/Give.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/CustomCommands/Give.cs	(revision 196)
+++ binary-improvements/7dtd-server-fixes/src/CustomCommands/Give.cs	(revision 197)
@@ -36,14 +36,6 @@
 				}
 
-				ItemBase item = null;
-
-				foreach (ItemBase ib in ItemBase.list) {
-					if (ib.name != null && ib.name.ToLower ().Equals (_params [1].ToLower ())) {
-						item = ib;
-						break;
-					}
-				}
-
-				if (item == null) {
+				Nullable<ItemValue> iv = ItemList.Instance.GetItemValue(_params[1]);
+				if (iv == null) {
 					m_Console.SendResult ("Item not found.");
 					return;
@@ -57,5 +49,5 @@
 
 				EntityPlayer p = CommonMappingFunctions.GetEntityPlayer (ci);
-				CommonMappingFunctions.GetGameManager ().DropEntityItemServer (item.itemID, n, p.GetPosition (), Vector3.zero, Vector3.zero, 50, CommonMappingFunctions.GetEntityID (ci));
+				CommonMappingFunctions.GetGameManager ().DropEntityItemServer ((int)iv.Value.rawData, n, p.GetPosition (), Vector3.zero, Vector3.zero, 50, CommonMappingFunctions.GetEntityID (ci));
 
 				m_Console.SendResult ("Dropped item");
Index: binary-improvements/7dtd-server-fixes/src/CustomCommands/ListItems.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/CustomCommands/ListItems.cs	(revision 196)
+++ binary-improvements/7dtd-server-fixes/src/CustomCommands/ListItems.cs	(revision 197)
@@ -29,7 +29,7 @@
 
 				int n = 0;
-				foreach (ItemBase ib in ItemBase.list) {
-					if (ib.name != null && ib.name.ToLower ().Contains (_params [0].ToLower ())) {
-						m_Console.SendResult ("    " + ib.name);
+				foreach (string s in ItemList.Instance.ItemNames) {
+					if (s.ToLower ().Contains (_params [0].ToLower ())) {
+						m_Console.SendResult ("    " + s);
 						n++;
 					}
Index: binary-improvements/7dtd-server-fixes/src/ItemList.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/ItemList.cs	(revision 197)
+++ binary-improvements/7dtd-server-fixes/src/ItemList.cs	(revision 197)
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+
+namespace AllocsFixes
+{
+	public class ItemList
+	{
+		private static ItemList instance;
+
+		public static ItemList Instance {
+			get {
+				if (instance == null) {
+					instance = new ItemList ();
+				}
+				return instance;
+			}
+		}
+
+		private ItemList ()
+		{
+		}
+
+		private SortedDictionary<string, ItemValue> items = new SortedDictionary<string, ItemValue> ();
+
+		public List<string> ItemNames {
+			get { return new List<string> (items.Keys); }
+		}
+
+		public Nullable<ItemValue> GetItemValue (string itemName)
+		{
+			if (items.ContainsKey (itemName)) {
+				return items [itemName];
+			} else {
+				itemName = itemName.ToLower ();
+				foreach (KeyValuePair<string, ItemValue> kvp in items) {
+					if (kvp.Key.ToLower ().Equals (itemName)) {
+						return kvp.Value;
+					}
+				}
+				return null;
+			}
+		}
+
+		public void Init ()
+		{
+			NGuiInvGridCreativeMenu cm = new NGuiInvGridCreativeMenu ();
+			foreach (InventoryField invF in cm.GetAllItems()) {
+				ItemBase ib = ItemBase.list [invF.itemValue.type];
+				string name = ib.GetItemName (invF.itemValue);
+				if (name != null && name.Length > 0) {
+					if (!items.ContainsKey (name))
+						items.Add (name, invF.itemValue);
+					else
+						Log.Out ("Item \"" + name + "\" already in list!");
+				}
+			}
+			foreach (InventoryField invF in cm.GetAllBlocks()) {
+				ItemBase ib = ItemBase.list [invF.itemValue.type];
+				string name = ib.GetItemName (invF.itemValue);
+				if (name != null && name.Length > 0) {
+					if (!items.ContainsKey (name))
+						items.Add (name, invF.itemValue);
+					else
+						Log.Out ("Item \"" + name + "\" already in list!");
+				}
+			}
+		}
+	}
+}
+
Index: binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs	(revision 196)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs	(revision 197)
@@ -21,9 +21,9 @@
 		{
 			//Log.Out ("Updating player inventory - player id: " + pdf.id);
-			ProcessInv (bag, pdf.bag);
-			ProcessInv (belt, pdf.inventory);
+			ProcessInv (bag, pdf.bag, pdf.id);
+			ProcessInv (belt, pdf.inventory, pdf.id);
 		}
 
-		private void ProcessInv (List<InvItem> target, InventoryField[] sourceFields)
+		private void ProcessInv (List<InvItem> target, InventoryField[] sourceFields, int id)
 		{
 			lock (target) {
@@ -32,6 +32,9 @@
 					if (sourceFields [i].count > 0) {
 						int count = sourceFields [i].count;
+						int maxAllowed = ItemBase.list [sourceFields [i].itemValue.type].StackNumber;
 						string name = getInvFieldName (sourceFields [i]);
 
+						if (count > maxAllowed)
+							Log.Out ("Player with ID " + id + " has stack for \"" + name + "\" greater than allowed (" + count + " > " + maxAllowed + ")");
 						target.Add (new InvItem (name, count));
 					} else {
@@ -45,5 +48,5 @@
 		{
 			ItemBase iBase = ItemBase.list [item.itemValue.type];
-			return iBase.GetItemName(item.itemValue);
+			return iBase.GetItemName (item.itemValue);
 		}
 
Index: binary-improvements/7dtd-server-fixes/src/StateManager.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/StateManager.cs	(revision 196)
+++ binary-improvements/7dtd-server-fixes/src/StateManager.cs	(revision 197)
@@ -12,7 +12,8 @@
 			try {
 				Log.Out ("[7dtd-server-fixes by Alloc] Version: " + Assembly.GetExecutingAssembly ().GetName ().Version);
-				new Web();
-				new Telnet();
+				new Web ();
+				new Telnet ();
 
+				ItemList.Instance.Init ();
 				CommandExtensions.InitCommandExtensions (manager);
 
Index: binary-improvements/bin/Release/7dtd-server-fixes_version.txt
===================================================================
--- binary-improvements/bin/Release/7dtd-server-fixes_version.txt	(revision 196)
+++ binary-improvements/bin/Release/7dtd-server-fixes_version.txt	(revision 197)
@@ -1,1 +1,1 @@
-Version:       0.93.5375.21616
+Version:       0.93.5377.34787
