Index: binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs	(revision 245)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/InvItem.cs	(revision 250)
@@ -9,9 +9,12 @@
 		public string itemName;
 		public int count;
+		public int quality;
+		public InvItem[] parts;
 
-		public InvItem (string itemName, int count)
+		public InvItem (string itemName, int count, int quality = -1)
 		{
 			this.itemName = itemName;
 			this.count = count;
+			this.quality = quality;
 		}
 	}
Index: binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs	(revision 245)
+++ binary-improvements/7dtd-server-fixes/src/PersistentData/Inventory.cs	(revision 250)
@@ -23,5 +23,5 @@
 				ProcessInv (bag, pdf.bag, pdf.id);
 				ProcessInv (belt, pdf.inventory, pdf.id);
-				ProcessEqu (pdf.equipment);
+				ProcessEqu (pdf.equipment, pdf.id);
 			}
 		}
@@ -30,30 +30,49 @@
 			target.Clear ();
 			for (int i = 0; i < sourceFields.Length; i++) {
-				if (sourceFields [i].count > 0) {
-					int count = sourceFields [i].count;
-					int maxAllowed = ItemClass.list [sourceFields [i].itemValue.type].Stacknumber.Value;
-					string name = ItemClass.list [sourceFields [i].itemValue.type].GetItemName ();
-
-					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 {
-					target.Add (null);
+				InvItem item = CreateInvItem (sourceFields [i].itemValue, sourceFields [i].count, id);
+				if (item != null && sourceFields [i].itemValue.Parts != null) {
+					ProcessParts (sourceFields [i].itemValue.Parts, item, id);
 				}
+				target.Add (item);
 			}
 		}
 
-		private void ProcessEqu (Equipment sourceEquipment) {
+		private void ProcessEqu (Equipment sourceEquipment, int _playerId) {
 			equipment = new InvItem[sourceEquipment.GetSlotCount ()];
 			for (int i = 0; i < sourceEquipment.GetSlotCount (); i++) {
-				if (sourceEquipment.GetSlotItem (i) != null && !sourceEquipment.GetSlotItem (i).Equals (ItemValue.None)) {
-					int count = 1;
-					string name = ItemClass.list [sourceEquipment.GetSlotItem (i).type].GetItemName ();
+				equipment [i] = CreateInvItem (sourceEquipment.GetSlotItem (i), 1, _playerId);
+			}
+		}
 
-					equipment [i] = new InvItem (name, count);
+		private void ProcessParts (ItemValue[] _parts, InvItem _item, int _playerId) {
+			InvItem[] itemParts = new InvItem[_parts.Length];
+			for (int i = 0; i < _parts.Length; i++) {
+				InvItem partItem = CreateInvItem (_parts [i], 1, _playerId);
+				if (partItem != null && _parts [i].Parts != null) {
+					ProcessParts (_parts [i].Parts, partItem, _playerId);
+				}
+				itemParts [i] = partItem;
+			}
+			_item.parts = itemParts;
+		}
+
+		private InvItem CreateInvItem (ItemValue _itemValue, int _count, int _playerId) {
+			if (_count > 0 && _itemValue != null && !_itemValue.Equals (ItemValue.None)) {
+				int maxAllowed = ItemClass.list [_itemValue.type].Stacknumber.Value;
+				string name = ItemClass.list [_itemValue.type].GetItemName ();
+
+				if (_count > maxAllowed) {
+					Log.Out ("Player with ID " + _playerId + " has stack for \"" + name + "\" greater than allowed (" + _count + " > " + maxAllowed + ")");
+				}
+
+				InvItem item = null;
+				if (_itemValue.HasQuality) {
+					item = new InvItem (name, _count, _itemValue.Quality);
 				} else {
-					equipment [i] = null;
+					item = new InvItem (name, _count);
 				}
+				return item;
+			} else {
+				return null;
 			}
 		}
