diff --git a/src/actor.h b/src/actor.h
index 50cd2704c..b46917a4a 100644
--- a/src/actor.h
+++ b/src/actor.h
@@ -583,7 +583,7 @@ public:
 	void Destroy ();
 	~AActor ();
 
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
 	void Serialize(FSerializer &arc);
 	void PostSerialize();
 
@@ -990,7 +990,7 @@ public:
 	double			Speed;
 	double			FloatSpeed;
 
-	WORD			sprite;				// used to find patch_t and flip value
+	int				sprite;				// used to find patch_t and flip value
 	BYTE			frame;				// sprite frame to draw
 	DVector2		Scale;				// Scaling values; 1 is normal size
 	FRenderStyle	RenderStyle;		// Style to draw this actor with
diff --git a/src/dobject.h b/src/dobject.h
index d42228172..7e0c49db6 100644
--- a/src/dobject.h
+++ b/src/dobject.h
@@ -438,6 +438,8 @@ template<class T> inline void GC::Mark(TObjPtr<T> &obj)
 	GC::Mark(&obj.o);
 }
 
+#define DECLARE_OLD_SERIAL virtual void Serialize(FArchive &arc);
+
 class DObject
 {
 public:
@@ -467,7 +469,7 @@ public:
 	inline bool IsA (const PClass *type) const;
 
 	void SerializeUserVars(FArchive &arc);
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
 
 	void SerializeUserVars(FSerializer &arc);
 	virtual void Serialize(FSerializer &arc);
diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp
index 8e2c31f2d..7e4b933f1 100644
--- a/src/fragglescript/t_func.cpp
+++ b/src/fragglescript/t_func.cpp
@@ -1781,7 +1781,7 @@ public:
 
 	DLightLevel(sector_t * s,int destlevel,int speed);
 	void	Serialize(FArchive &arc);
-	void	Serialize(FArchive &arc);
+	//void	Serialize(FArchive &arc);
 	void		Tick ();
 	void		Destroy() { Super::Destroy(); m_Sector->lightingdata=NULL; }
 };
diff --git a/src/g_doom/a_doomglobal.h b/src/g_doom/a_doomglobal.h
index bcaaff887..e18917f01 100644
--- a/src/g_doom/a_doomglobal.h
+++ b/src/g_doom/a_doomglobal.h
@@ -29,7 +29,8 @@ public:
 	void Tick ();
 	void SetWeapon (EMarineWeapon);
 	void SetSprite (PClassActor *source);
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 
 	int CurrentWeapon;
 
diff --git a/src/g_doom/a_doommisc.cpp b/src/g_doom/a_doommisc.cpp
index 93e7abdaa..c281173af 100644
--- a/src/g_doom/a_doommisc.cpp
+++ b/src/g_doom/a_doommisc.cpp
@@ -18,6 +18,7 @@
 #include "portal.h"
 #include "d_player.h"
 #include "p_maputl.h"
+#include "serializer.h"
 #include "g_shared/a_pickups.h"
 
 // Include all the other Doom stuff here to reduce compile time
diff --git a/src/g_doom/a_scriptedmarine.cpp b/src/g_doom/a_scriptedmarine.cpp
index a014891ea..2c293a2de 100644
--- a/src/g_doom/a_scriptedmarine.cpp
+++ b/src/g_doom/a_scriptedmarine.cpp
@@ -21,19 +21,14 @@ static FRandom pr_m_fireshotgun2 ("SMarineFireSSG");
 
 IMPLEMENT_CLASS (AScriptedMarine)
 
-void AScriptedMarine::Serialize(FArchive &arc)
+void AScriptedMarine::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
 
-	if (arc.IsStoring ())
-	{
-		arc.WriteSprite (SpriteOverride);
-	}
-	else
-	{
-		SpriteOverride = arc.ReadSprite ();
-	}
-	arc << CurrentWeapon;
+	auto def = (AScriptedMarine*)GetDefault();
+
+	arc.Sprite("spriteoverride", SpriteOverride, &def->SpriteOverride)
+		("currentweapon", CurrentWeapon, def->CurrentWeapon);
 }
 
 void AScriptedMarine::Activate (AActor *activator)
diff --git a/src/g_heretic/a_hereticmisc.cpp b/src/g_heretic/a_hereticmisc.cpp
index 95c2ae6d0..199b3f1c4 100644
--- a/src/g_heretic/a_hereticmisc.cpp
+++ b/src/g_heretic/a_hereticmisc.cpp
@@ -18,6 +18,7 @@
 #include "d_player.h"
 #include "a_morph.h"
 #include "p_spec.h"
+#include "serializer.h"
 
 // Include all the other Heretic stuff here to reduce compile time
 #include "a_chicken.cpp"
diff --git a/src/g_heretic/a_hereticweaps.cpp b/src/g_heretic/a_hereticweaps.cpp
index fa35bf1f9..dd6231288 100644
--- a/src/g_heretic/a_hereticweaps.cpp
+++ b/src/g_heretic/a_hereticweaps.cpp
@@ -866,16 +866,18 @@ class ARainTracker : public AInventory
 {
 	DECLARE_CLASS (ARainTracker, AInventory)
 public:
-	void Serialize(FArchive &arc);
-	AActor *Rain1, *Rain2;
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
+	TObjPtr<AActor> Rain1, Rain2;
 };
 
 IMPLEMENT_CLASS (ARainTracker)
 	
-void ARainTracker::Serialize(FArchive &arc)
+void ARainTracker::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << Rain1 << Rain2;
+	arc("rain1", Rain1)
+		("rain2", Rain2);
 }
 
 //----------------------------------------------------------------------------
diff --git a/src/g_hexen/a_heresiarch.cpp b/src/g_hexen/a_heresiarch.cpp
index acddc588b..10f6168a9 100644
--- a/src/g_hexen/a_heresiarch.cpp
+++ b/src/g_hexen/a_heresiarch.cpp
@@ -64,19 +64,21 @@ class AHeresiarch : public AActor
 {
 	DECLARE_CLASS (AHeresiarch, AActor)
 public:
-	const PClass *StopBall;
+	PClassActor *StopBall;
 	DAngle BallAngle;
 
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 	void Die (AActor *source, AActor *inflictor, int dmgflags);
 };
 
 IMPLEMENT_CLASS (AHeresiarch)
 
-void AHeresiarch::Serialize(FArchive &arc)
+void AHeresiarch::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << StopBall << BallAngle;
+	arc("stopball", StopBall)
+		("ballangle", BallAngle);
 }
 
 void AHeresiarch::Die (AActor *source, AActor *inflictor, int dmgflags)
@@ -105,10 +107,13 @@ public:
 	DAngle AngleOffset;
 	DAngle OldAngle;
 
-	void Serialize(FArchive &arc)
+	DECLARE_OLD_SERIAL
+
+	void Serialize(FSerializer &arc)
 	{
 		Super::Serialize (arc);
-		arc << AngleOffset << OldAngle;
+		arc("angleoffset", AngleOffset)
+			("oldangle", OldAngle);
 	}
 
 	bool SpecialBlastHandling (AActor *source, double strength)
diff --git a/src/g_hexen/a_hexenmisc.cpp b/src/g_hexen/a_hexenmisc.cpp
index c1d41e762..122129ede 100644
--- a/src/g_hexen/a_hexenmisc.cpp
+++ b/src/g_hexen/a_hexenmisc.cpp
@@ -24,6 +24,7 @@
 #include "r_utility.h"
 #include "p_maputl.h"
 #include "p_spec.h"
+#include "serializer.h"
 
 // Include all the Hexen stuff here to reduce compile time
 #include "a_bats.cpp"
diff --git a/src/g_hexen/a_spike.cpp b/src/g_hexen/a_spike.cpp
index ced6c43a6..3be6a3101 100644
--- a/src/g_hexen/a_spike.cpp
+++ b/src/g_hexen/a_spike.cpp
@@ -22,7 +22,8 @@ class AThrustFloor : public AActor
 	DECLARE_CLASS (AThrustFloor, AActor)
 	HAS_OBJECT_POINTERS
 public:
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 
 	void Activate (AActor *activator);
 	void Deactivate (AActor *activator);
@@ -34,10 +35,10 @@ IMPLEMENT_POINTY_CLASS (AThrustFloor)
  DECLARE_POINTER (DirtClump)
 END_POINTERS
 
-void AThrustFloor::Serialize(FArchive &arc)
+void AThrustFloor::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << DirtClump;
+	arc("dirtclump", DirtClump);
 }
 
 void AThrustFloor::Activate (AActor *activator)
diff --git a/src/g_raven/a_minotaur.cpp b/src/g_raven/a_minotaur.cpp
index 281e1db49..909b317e7 100644
--- a/src/g_raven/a_minotaur.cpp
+++ b/src/g_raven/a_minotaur.cpp
@@ -14,6 +14,7 @@
 #include "farchive.h"
 #include "a_pickups.h"
 #include "d_player.h"
+#include "serializer.h"
 
 #define MAULATORTICS (25*35)
 
@@ -79,10 +80,10 @@ void AMinotaurFriend::BeginPlay ()
 	StartTime = -1;
 }
 
-void AMinotaurFriend::Serialize(FArchive &arc)
+void AMinotaurFriend::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << StartTime;
+	arc("starttime", StartTime);
 }
 
 void AMinotaurFriend::Die (AActor *source, AActor *inflictor, int dmgflags)
diff --git a/src/g_raven/ravenshared.h b/src/g_raven/ravenshared.h
index 824bc7c86..dd5b74781 100644
--- a/src/g_raven/ravenshared.h
+++ b/src/g_raven/ravenshared.h
@@ -23,7 +23,8 @@ public:
 	void Die (AActor *source, AActor *inflictor, int dmgflags);
 	bool OkayToSwitchTarget (AActor *other);
 	void BeginPlay ();
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 };
 
 #endif //__RAVENSHARED_H__
diff --git a/src/g_shared/a_armor.cpp b/src/g_shared/a_armor.cpp
index b221c07b9..e05b564f3 100644
--- a/src/g_shared/a_armor.cpp
+++ b/src/g_shared/a_armor.cpp
@@ -7,6 +7,7 @@
 #include "g_level.h"
 #include "d_player.h"
 #include "farchive.h"
+#include "serializer.h"
 
 
 IMPLEMENT_CLASS (AArmor)
@@ -21,10 +22,17 @@ IMPLEMENT_CLASS (AHexenArmor)
 //
 //===========================================================================
 
-void ABasicArmor::Serialize(FArchive &arc)
+void ABasicArmor::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << SavePercent << BonusCount << MaxAbsorb << MaxFullAbsorb << AbsorbCount << ArmorType << ActualSaveAmount;
+	auto def = (ABasicArmor *)GetDefault();
+	arc("savepercent", SavePercent, def->SavePercent)
+		("bonuscount", BonusCount, def->BonusCount)
+		("maxabsorb", MaxAbsorb, def->MaxAbsorb)
+		("maxfullabsorb", MaxFullAbsorb, def->MaxFullAbsorb)
+		("absorbcount", AbsorbCount, def->AbsorbCount)
+		("armortype", ArmorType, def->ArmorType)
+		("actualsaveamount", ActualSaveAmount, def->ActualSaveAmount);
 }
 
 //===========================================================================
@@ -192,11 +200,15 @@ void ABasicArmor::AbsorbDamage (int damage, FName damageType, int &newdamage)
 //
 //===========================================================================
 
-void ABasicArmorPickup::Serialize(FArchive &arc)
+void ABasicArmorPickup::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << SavePercent << SaveAmount << MaxAbsorb << MaxFullAbsorb;
-	arc << DropTime;
+
+	auto def = (ABasicArmorPickup *)GetDefault();
+	arc("savepercent", SavePercent, def->SavePercent)
+		("saveamount", SaveAmount, def->SaveAmount)
+		("maxabsorb", MaxAbsorb, def->MaxAbsorb)
+		("maxfullabsorb", MaxFullAbsorb, def->MaxFullAbsorb);
 }
 
 //===========================================================================
@@ -274,11 +286,17 @@ bool ABasicArmorPickup::Use (bool pickup)
 //
 //===========================================================================
 
-void ABasicArmorBonus::Serialize(FArchive &arc)
+void ABasicArmorBonus::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << SavePercent << SaveAmount << MaxSaveAmount << BonusCount << BonusMax
-		 << MaxAbsorb << MaxFullAbsorb;
+	auto def = (ABasicArmorBonus *)GetDefault();
+	arc("savepercent", SavePercent, def->SavePercent)
+		("saveamount", SaveAmount, def->SaveAmount)
+		("maxsaveamount", MaxSaveAmount, def->MaxSaveAmount)
+		("bonuscount", BonusCount, def->BonusCount)
+		("bonusmax", BonusMax, def->BonusMax)
+		("maxabsorb", MaxAbsorb, def->MaxAbsorb)
+		("maxfullabsorb", MaxFullAbsorb, def->MaxFullAbsorb);
 }
 
 //===========================================================================
@@ -371,13 +389,12 @@ bool ABasicArmorBonus::Use (bool pickup)
 //
 //===========================================================================
 
-void AHexenArmor::Serialize(FArchive &arc)
+void AHexenArmor::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << Slots[0] << Slots[1] << Slots[2] << Slots[3]
-		<< Slots[4]
-		<< SlotsIncrement[0] << SlotsIncrement[1] << SlotsIncrement[2]
-		<< SlotsIncrement[3];
+	auto def = (AHexenArmor *)GetDefault();
+	arc.Array("slots", Slots, def->Slots, 5, true)
+		.Array("slotsincrement", SlotsIncrement, def->SlotsIncrement, 4);
 }
 
 //===========================================================================
diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp
index 1a8202916..1ce531eea 100644
--- a/src/g_shared/a_pickups.cpp
+++ b/src/g_shared/a_pickups.cpp
@@ -21,6 +21,7 @@
 #include "farchive.h"
 #include "d_player.h"
 #include "p_spec.h"
+#include "serializer.h"
 
 static FRandom pr_restore ("RestorePos");
 
@@ -89,10 +90,12 @@ IMPLEMENT_CLASS (AAmmo)
 //
 //===========================================================================
 
-void AAmmo::Serialize(FArchive &arc)
+void AAmmo::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << BackpackAmount << BackpackMaxAmount;
+	auto def = (AAmmo*)GetDefault();
+	arc("backpackamount", BackpackAmount, def->BackpackAmount)
+		("backpackmaxamount", BackpackMaxAmount, def->BackpackMaxAmount);
 }
 
 //===========================================================================
@@ -514,10 +517,21 @@ void AInventory::Tick ()
 //
 //===========================================================================
 
-void AInventory::Serialize(FArchive &arc)
+void AInventory::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound << SpawnPointClass;
+
+	auto def = (AInventory*)GetDefault();
+	arc("owner", Owner)
+		("amount", Amount, def->Amount)
+		("maxamount", MaxAmount, def->MaxAmount)
+		("interhubamount", InterHubAmount, def->InterHubAmount)
+		("respawntics", RespawnTics, def->RespawnTics)
+		("itemflags", ItemFlags, def->ItemFlags)
+		("icon", Icon, def->Icon)
+		("pickupsound", PickupSound, def->PickupSound)
+		("spawnpointclass", SpawnPointClass, def->SpawnPointClass)
+		("droptime", DropTime, def->DropTime);
 }
 
 //===========================================================================
@@ -1809,10 +1823,11 @@ bool AHealthPickup::Use (bool pickup)
 //
 //===========================================================================
 
-void AHealthPickup::Serialize(FArchive &arc)
+void AHealthPickup::Serialize(FSerializer &arc)
 {
 	Super::Serialize(arc);
-	arc << autousemode;
+	auto def = (AHealthPickup*)GetDefault();
+	arc("autousemode", autousemode, def->autousemode);
 }
 
 // Backpack -----------------------------------------------------------------
@@ -1823,10 +1838,11 @@ void AHealthPickup::Serialize(FArchive &arc)
 //
 //===========================================================================
 
-void ABackpackItem::Serialize(FArchive &arc)
+void ABackpackItem::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << bDepleted;
+	auto def = (ABackpackItem*)GetDefault();
+	arc("bdepleted", bDepleted, def->bDepleted);
 }
 
 //===========================================================================
diff --git a/src/g_shared/a_pickups.h b/src/g_shared/a_pickups.h
index 9122ffd12..303cd3431 100644
--- a/src/g_shared/a_pickups.h
+++ b/src/g_shared/a_pickups.h
@@ -153,7 +153,8 @@ class AInventory : public AActor
 	HAS_OBJECT_POINTERS
 public:
 	virtual void Touch (AActor *toucher);
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 
 	virtual void MarkPrecacheSounds() const;
 	virtual void BeginPlay ();
@@ -185,7 +186,7 @@ public:
 	int RespawnTics;			// Tics from pickup time to respawn time
 	FTextureID Icon;			// Icon to show on status bar or HUD
 	int DropTime;				// Countdown after dropping
-	const PClass *SpawnPointClass;	// For respawning like Heretic's mace
+	PClassActor *SpawnPointClass;	// For respawning like Heretic's mace
 
 	DWORD ItemFlags;
 	PClassActor *PickupFlash;	// actor to spawn as pickup flash
@@ -254,7 +255,8 @@ class AAmmo : public AInventory
 {
 	DECLARE_CLASS_WITH_META(AAmmo, AInventory, PClassAmmo)
 public:
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 	AInventory *CreateCopy (AActor *other);
 	bool HandlePickup (AInventory *item);
 	PClassActor *GetParentAmmo () const;
@@ -311,7 +313,8 @@ public:
 	bool bAltFire;	// Set when this weapon's alternate fire is used.
 
 	virtual void MarkPrecacheSounds() const;
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 	virtual bool ShouldStay ();
 	virtual void AttachToOwner (AActor *other);
 	virtual bool HandlePickup (AInventory *item);
@@ -395,7 +398,8 @@ class AWeaponGiver : public AWeapon
 
 public:
 	bool TryPickup(AActor *&toucher);
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 
 	double DropAmmoFactor;
 };
@@ -431,7 +435,8 @@ class AHealthPickup : public AInventory
 public:
 	int autousemode;
 
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 	virtual AInventory *CreateCopy (AActor *other);
 	virtual AInventory *CreateTossable ();
 	virtual bool HandlePickup (AInventory *item);
@@ -451,7 +456,8 @@ class ABasicArmor : public AArmor
 {
 	DECLARE_CLASS (ABasicArmor, AArmor)
 public:
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 	virtual void Tick ();
 	virtual AInventory *CreateCopy (AActor *other);
 	virtual bool HandlePickup (AInventory *item);
@@ -471,7 +477,8 @@ class ABasicArmorPickup : public AArmor
 {
 	DECLARE_CLASS (ABasicArmorPickup, AArmor)
 public:
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 	virtual AInventory *CreateCopy (AActor *other);
 	virtual bool Use (bool pickup);
 
@@ -486,7 +493,8 @@ class ABasicArmorBonus : public AArmor
 {
 	DECLARE_CLASS (ABasicArmorBonus, AArmor)
 public:
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 	virtual AInventory *CreateCopy (AActor *other);
 	virtual bool Use (bool pickup);
 
@@ -505,7 +513,8 @@ class AHexenArmor : public AArmor
 {
 	DECLARE_CLASS (AHexenArmor, AArmor)
 public:
-	virtual void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	virtual void Serialize(FSerializer &arc);
 	virtual AInventory *CreateCopy (AActor *other);
 	virtual AInventory *CreateTossable ();
 	virtual bool HandlePickup (AInventory *item);
@@ -533,7 +542,7 @@ class APuzzleItem : public AInventory
 {
 	DECLARE_CLASS_WITH_META(APuzzleItem, AInventory, PClassPuzzleItem)
 public:
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
 	bool ShouldStay ();
 	bool Use (bool pickup);
 	bool HandlePickup (AInventory *item);
@@ -555,7 +564,8 @@ class ABackpackItem : public AInventory
 {
 	DECLARE_CLASS (ABackpackItem, AInventory)
 public:
-	void Serialize(FArchive &arc);
+	DECLARE_OLD_SERIAL
+	void Serialize(FSerializer &arc);
 	bool HandlePickup (AInventory *item);
 	AInventory *CreateCopy (AActor *other);
 	AInventory *CreateTossable ();
diff --git a/src/g_shared/a_puzzleitems.cpp b/src/g_shared/a_puzzleitems.cpp
index 774585ae9..512d83b49 100644
--- a/src/g_shared/a_puzzleitems.cpp
+++ b/src/g_shared/a_puzzleitems.cpp
@@ -20,12 +20,6 @@ void PClassPuzzleItem::DeriveData(PClass *newclass)
 
 IMPLEMENT_CLASS(APuzzleItem)
 
-void APuzzleItem::Serialize(FArchive &arc)
-{
-	Super::Serialize (arc);
-	arc << PuzzleItemNumber;
-}
-
 bool APuzzleItem::HandlePickup (AInventory *item)
 {
 	// Can't carry more than 1 of each puzzle item in coop netplay
diff --git a/src/g_shared/a_weapons.cpp b/src/g_shared/a_weapons.cpp
index ed7c02531..eb73b22f2 100644
--- a/src/g_shared/a_weapons.cpp
+++ b/src/g_shared/a_weapons.cpp
@@ -18,6 +18,7 @@
 #include "g_level.h"
 #include "d_net.h"
 #include "farchive.h"
+#include "serializer.h"
 
 #define BONUSADD 6
 
@@ -73,28 +74,45 @@ void PClassWeapon::ReplaceClassRef(PClass *oldclass, PClass *newclass)
 //
 //===========================================================================
 
-void AWeapon::Serialize(FArchive &arc)
+void AWeapon::Serialize(FSerializer &arc)
 {
 	Super::Serialize (arc);
-	arc << WeaponFlags
-		<< AmmoType1 << AmmoType2
-		<< AmmoGive1 << AmmoGive2
-		<< MinAmmo1 << MinAmmo2
-		<< AmmoUse1 << AmmoUse2
-		<< Kickback
-		<< YAdjust
-		<< UpSound << ReadySound
-		<< SisterWeaponType
-		<< ProjectileType << AltProjectileType
-		<< SelectionOrder
-		<< MoveCombatDist
-		<< Ammo1 << Ammo2 << SisterWeapon << GivenAsMorphWeapon
-		<< bAltFire
-		<< ReloadCounter
-		<< BobStyle << BobSpeed << BobRangeX << BobRangeY
-		<< FOVScale
-		<< Crosshair
-		<< MinSelAmmo1 << MinSelAmmo2;
+	auto def = (AWeapon*)GetDefault();
+	arc("weaponflags", WeaponFlags, def->WeaponFlags)
+		("ammogive1", AmmoGive1, def->AmmoGive1)
+		("ammogive2", AmmoGive2, def->AmmoGive2)
+		("minammo1", MinAmmo1, def->MinAmmo1)
+		("minammo2", MinAmmo2, def->MinAmmo2)
+		("ammouse1", AmmoUse1, def->AmmoUse1)
+		("ammouse2", AmmoUse2, def->AmmoUse2)
+		("kickback", Kickback, Kickback)
+		("yadjust", YAdjust, def->YAdjust)
+		("upsound", UpSound, def->UpSound)
+		("readysound", ReadySound, def->ReadySound)
+		("selectionorder", SelectionOrder, def->SelectionOrder)
+		("ammo1", Ammo1)
+		("ammo2", Ammo2)
+		("sisterweapon", SisterWeapon)
+		("givenasmorphweapon", GivenAsMorphWeapon, def->GivenAsMorphWeapon)
+		("altfire", bAltFire, def->bAltFire)
+		("reloadcounter", ReloadCounter, def->ReloadCounter)
+		("bobstyle", BobStyle, def->BobStyle)
+		("bobspeed", BobSpeed, def->BobSpeed)
+		("bobrangex", BobRangeX, def->BobRangeX)
+		("bobrangey", BobRangeY, def->BobRangeY)
+		("fovscale", FOVScale, def->FOVScale)
+		("crosshair", Crosshair, def->Crosshair)
+		("minselammo1", MinSelAmmo1, def->MinSelAmmo1)
+		("minselammo2", MinSelAmmo2, def->MinSelAmmo2);
+		/* these can never change
+		("ammotype1", AmmoType1, def->AmmoType1)
+		("ammotype2", AmmoType2, def->AmmoType2)
+		("sisterweapontype", SisterWeaponType, def->SisterWeaponType)
+		("projectiletype", ProjectileType, def->ProjectileType)
+		("altprojectiletype", AltProjectileType, def->AltProjectileType)
+		("movecombatdist", MoveCombatDist, def->MoveCombatDist)
+		*/
+
 }
 
 //===========================================================================
@@ -737,10 +755,11 @@ FState *AWeapon::GetStateForButtonName (FName button)
 
 IMPLEMENT_CLASS(AWeaponGiver)
 
-void AWeaponGiver::Serialize(FArchive &arc)
+void AWeaponGiver::Serialize(FSerializer &arc)
 {
 	Super::Serialize(arc);
-	arc << DropAmmoFactor;
+	auto def = (AWeaponGiver *)GetDefault();
+	arc("dropammofactor", DropAmmoFactor, def->DropAmmoFactor);
 }
 
 bool AWeaponGiver::TryPickup(AActor *&toucher)
diff --git a/src/serializer.cpp b/src/serializer.cpp
index 06625b054..fe4a76ba5 100644
--- a/src/serializer.cpp
+++ b/src/serializer.cpp
@@ -431,7 +431,7 @@ FSerializer &FSerializer::Terrain(const char *key, int &terrain, int *def)
 //
 //==========================================================================
 
-FSerializer &FSerializer::Sprite(const char *key, uint16_t &spritenum, uint16_t *def)
+FSerializer &FSerializer::Sprite(const char *key, int32_t &spritenum, int32_t *def)
 {
 	if (isWriting())
 	{
diff --git a/src/serializer.h b/src/serializer.h
index f56f9c87a..b85405a1f 100644
--- a/src/serializer.h
+++ b/src/serializer.h
@@ -38,7 +38,7 @@ public:
 	const char *GetOutput(unsigned *len = nullptr);
 	FSerializer &Args(const char *key, int *args, int *defargs, int special);
 	FSerializer &Terrain(const char *key, int &terrain, int *def = nullptr);
-	FSerializer &Sprite(const char *key, uint16_t &spritenum, uint16_t *def);
+	FSerializer &Sprite(const char *key, int32_t &spritenum, int32_t *def);
 	FSerializer &StringPtr(const char *key, const char *&charptr);	// This only retrieves the address but creates no permanent copy of the string.
 	bool isReading() const
 	{
diff --git a/src/zzz_old.cpp b/src/zzz_old.cpp
index 1a6064856..952afcdb8 100644
--- a/src/zzz_old.cpp
+++ b/src/zzz_old.cpp
@@ -1,5 +1,8 @@
 #ifdef COMMON_STUFF
 
+#include "a_doomglobal.h"
+#include "ravenshared.h"
+
 // For NULL states, which aren't owned by any actor, the owner
 // is recorded as AActor with the following state. AActor should
 // never actually have this many states of its own, so this
@@ -699,29 +702,178 @@ void DObject::Serialize(FArchive &arc)
 }
 
 
-class DLightLevel : public DLighting
-{
-	DECLARE_CLASS(DLightLevel, DLighting)
-
-	unsigned char destlevel;
-	unsigned char speed;
-
-	DLightLevel() {}
-
-public:
-
-	DLightLevel(sector_t * s, int destlevel, int speed);
-	void	Serialize(FArchive &arc);
-	void	Serialize(FSerializer &arc);
-	void		Tick();
-	void		Destroy() { Super::Destroy(); m_Sector->lightingdata = NULL; }
-};
-
-void DLightLevel::Serialize(FArchive &arc)
+void AScriptedMarine::Serialize(FArchive &arc)
 {
 	Super::Serialize(arc);
-	arc << destlevel << speed;
-	if (arc.IsLoading()) m_Sector->lightingdata = this;
+
+	if (arc.IsStoring())
+	{
+		arc.WriteSprite(SpriteOverride);
+	}
+	else
+	{
+		SpriteOverride = arc.ReadSprite();
+	}
+	arc << CurrentWeapon;
 }
 
+
+class AHeresiarch : public AActor
+{
+	DECLARE_CLASS(AHeresiarch, AActor)
+public:
+	PClassActor *StopBall;
+	DAngle BallAngle;
+
+	DECLARE_OLD_SERIAL
+};
+
+void AHeresiarch::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << StopBall << BallAngle;
+}
+
+class ASorcBall : public AActor
+{
+	DECLARE_CLASS(ASorcBall, AActor)
+public:
+	DAngle AngleOffset;
+	DAngle OldAngle;
+
+	DECLARE_OLD_SERIAL
+};
+
+void ASorcBall::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << AngleOffset << OldAngle;
+}
+
+class AThrustFloor : public AActor
+{
+	DECLARE_CLASS(AThrustFloor, AActor)
+public:
+	DECLARE_OLD_SERIAL
+
+	TObjPtr<AActor> DirtClump;
+};
+
+void AThrustFloor::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << DirtClump;
+}
+
+void AMinotaurFriend::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << StartTime;
+}
+
+class ARainTracker : public AInventory
+{
+	DECLARE_CLASS(ARainTracker, AInventory)
+public:
+	DECLARE_OLD_SERIAL
+	TObjPtr<AActor> Rain1, Rain2;
+};
+
+void ARainTracker::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << Rain1 << Rain2;
+}
+
+void AInventory::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << Owner << Amount << MaxAmount << RespawnTics << ItemFlags << Icon << PickupSound << SpawnPointClass;
+}
+
+void AHealthPickup::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << autousemode;
+}
+
+void AAmmo::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << BackpackAmount << BackpackMaxAmount;
+}
+
+void AWeapon::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << WeaponFlags
+		<< AmmoType1 << AmmoType2
+		<< AmmoGive1 << AmmoGive2
+		<< MinAmmo1 << MinAmmo2
+		<< AmmoUse1 << AmmoUse2
+		<< Kickback
+		<< YAdjust
+		<< UpSound << ReadySound
+		<< SisterWeaponType
+		<< ProjectileType << AltProjectileType
+		<< SelectionOrder
+		<< MoveCombatDist
+		<< Ammo1 << Ammo2 << SisterWeapon << GivenAsMorphWeapon
+		<< bAltFire
+		<< ReloadCounter
+		<< BobStyle << BobSpeed << BobRangeX << BobRangeY
+		<< FOVScale
+		<< Crosshair
+		<< MinSelAmmo1 << MinSelAmmo2;
+}
+
+void ABackpackItem::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << bDepleted;
+}
+
+void AWeaponGiver::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << DropAmmoFactor;
+}
+
+void ABasicArmor::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << SavePercent << BonusCount << MaxAbsorb << MaxFullAbsorb << AbsorbCount << ArmorType << ActualSaveAmount;
+}
+
+void ABasicArmorPickup::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << SavePercent << SaveAmount << MaxAbsorb << MaxFullAbsorb;
+	arc << DropTime;// in inventory!
+}
+
+void ABasicArmorBonus::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << SavePercent << SaveAmount << MaxSaveAmount << BonusCount << BonusMax
+		<< MaxAbsorb << MaxFullAbsorb;
+}
+
+void AHexenArmor::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << Slots[0] << Slots[1] << Slots[2] << Slots[3]
+		<< Slots[4]
+		<< SlotsIncrement[0] << SlotsIncrement[1] << SlotsIncrement[2]
+		<< SlotsIncrement[3];
+}
+
+void APuzzleItem::Serialize(FArchive &arc)
+{
+	Super::Serialize(arc);
+	arc << PuzzleItemNumber;
+}
+
+
+
 #endif
\ No newline at end of file