diff --git a/CMakeLists.txt b/CMakeLists.txt
index e2fc1192..4f995f33 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -292,10 +292,7 @@ function(add_lego_libraries NAME)
     LEGO1/lego/legoomni/src/actors/helicopter.cpp
     LEGO1/lego/legoomni/src/worlds/gasstation.cpp
     LEGO1/lego/legoomni/src/audio/legocachsound.cpp
-    LEGO1/lego/legoomni/src/actors/act2actor.cpp
     LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
-    LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp
-    LEGO1/lego/legoomni/src/actors/buildingentity.cpp
     LEGO1/lego/legoomni/src/actors/skateboard.cpp
     LEGO1/lego/legoomni/src/entity/legoentity.cpp
     LEGO1/lego/legoomni/src/audio/lego3dsound.cpp
@@ -303,6 +300,7 @@ function(add_lego_libraries NAME)
     LEGO1/lego/legoomni/src/race/legoracers.cpp
     LEGO1/lego/legoomni/src/race/legoraceactor.cpp
     LEGO1/lego/legoomni/src/common/legostate.cpp
+    LEGO1/lego/legoomni/src/actors/buildingentity.cpp
     LEGO1/lego/legoomni/src/actors/buildings.cpp
     LEGO1/lego/legoomni/src/common/misc.cpp
     LEGO1/lego/legoomni/src/race/legorace.cpp
@@ -310,7 +308,9 @@ function(add_lego_libraries NAME)
     LEGO1/lego/legoomni/src/race/carrace.cpp
     LEGO1/lego/legoomni/src/actors/pizzeria.cpp
     LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
+    LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp
     LEGO1/lego/legoomni/src/actors/act2genactor.cpp
+    LEGO1/lego/legoomni/src/actors/act2actor.cpp
     LEGO1/lego/legoomni/src/actors/islepathactor.cpp
     LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
     LEGO1/lego/legoomni/src/paths/legoanimactor.cpp
diff --git a/LEGO1/lego/legoomni/include/act2actor.h b/LEGO1/lego/legoomni/include/act2actor.h
index 68b8f59d..324cf4b3 100644
--- a/LEGO1/lego/legoomni/include/act2actor.h
+++ b/LEGO1/lego/legoomni/include/act2actor.h
@@ -19,13 +19,23 @@ public:
 
 	Act2Actor();
 
-	void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override;   // vtable+0x24
-	void SetWorldSpeed(MxFloat p_worldSpeed) override;                      // vtable+0x30
-	MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) override; // vtable+0x68
-	void Animate(float p_time) override;                                    // vtable+0x70
-	MxResult HitActor(LegoPathActor*, MxBool) override;                     // vtable+0x94
-	MxResult VTable0x9c() override;                                         // vtable+0x9c
-	MxS32 VTable0xa0() override;                                            // vtable+0xa0
+	void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24
+	void SetWorldSpeed(MxFloat p_worldSpeed) override;                    // vtable+0x30
+
+	// FUNCTION: LEGO1 0x1001a180
+	MxS32 VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3) override
+	{
+		if (m_unk0x1f) {
+			return 0;
+		}
+
+		return LegoAnimActor::VTable0x68(p_v1, p_v2, p_v3);
+	} // vtable+0x68
+
+	void Animate(float p_time) override;                // vtable+0x70
+	MxResult HitActor(LegoPathActor*, MxBool) override; // vtable+0x94
+	MxResult VTable0x9c() override;                     // vtable+0x9c
+	MxS32 VTable0xa0() override;                        // vtable+0xa0
 
 	void FUN_10018980();
 	void FUN_10019250(MxFloat p_speed, MxFloat p_param2);
diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h
index f5170277..174d74a7 100644
--- a/LEGO1/lego/legoomni/include/act3.h
+++ b/LEGO1/lego/legoomni/include/act3.h
@@ -54,6 +54,9 @@ class Act3State : public LegoState {
 public:
 	Act3State() { m_unk0x08 = 0; }
 
+	// FUNCTION: LEGO1 0x1000e2f0
+	MxBool IsSerializable() override { return FALSE; }
+
 	// FUNCTION: LEGO1 0x1000e300
 	// FUNCTION: BETA10 0x10017e10
 	const char* ClassName() const override // vtable+0x0c
@@ -68,9 +71,6 @@ public:
 		return !strcmp(p_name, Act3State::ClassName()) || LegoState::IsA(p_name);
 	}
 
-	// FUNCTION: LEGO1 0x1000e2f0
-	MxBool IsSerializable() override { return FALSE; }
-
 	// SYNTHETIC: LEGO1 0x1000e3c0
 	// Act3State::`scalar deleting destructor'
 
diff --git a/LEGO1/lego/legoomni/include/buildings.h b/LEGO1/lego/legoomni/include/buildings.h
index 71201a48..165bc87e 100644
--- a/LEGO1/lego/legoomni/include/buildings.h
+++ b/LEGO1/lego/legoomni/include/buildings.h
@@ -5,80 +5,6 @@
 
 class LegoEventNotificationParam;
 
-// VTABLE: LEGO1 0x100d48a8
-// VTABLE: BETA10 0x101bd818
-// SIZE 0x68
-class RaceStandsEntity : public BuildingEntity {
-	// FUNCTION: LEGO1 0x1000efa0
-	// FUNCTION: BETA10 0x100a9820
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// at LEGO1 0x100f0300, needs no annotation
-		return "RaceStandsEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000efb0
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000f9e0
-	// RaceStandsEntity::`scalar deleting destructor'
-};
-
-// VTABLE: LEGO1 0x100d4a18
-// VTABLE: BETA10 0x101bd7b0
-// SIZE 0x68
-class BeachHouseEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ee80
-	// FUNCTION: BETA10 0x100a96f0
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0314
-		return "BeachHouseEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ee90
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000f970
-	// BeachHouseEntity::`scalar deleting destructor'
-};
-
-// VTABLE: LEGO1 0x100d4ab0
-// VTABLE: BETA10 0x101bd748
-// SIZE 0x68
-class PoliceEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ed60
-	// FUNCTION: BETA10 0x100a95c0
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0328
-		return "PoliceEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ed70
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
-
-	// SYNTHETIC: LEGO1 0x1000f900
-	// PoliceEntity::`scalar deleting destructor'
-};
-
 // VTABLE: LEGO1 0x100d4b90
 // VTABLE: BETA10 0x101bd610
 // SIZE 0x68
@@ -104,79 +30,6 @@ public:
 	// InfoCenterEntity::`scalar deleting destructor'
 };
 
-// VTABLE: LEGO1 0x100d5068
-// VTABLE: BETA10 0x101bd678
-// SIZE 0x68
-class HospitalEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ec40
-	// FUNCTION: BETA10 0x100a9360
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0338
-		return "HospitalEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ec50
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
-
-	// SYNTHETIC: LEGO1 0x1000f820
-	// HospitalEntity::`scalar deleting destructor'
-};
-
-// VTABLE: LEGO1 0x100d50c0
-// VTABLE: BETA10 0x101bd880
-// SIZE 0x68
-class CaveEntity : public BuildingEntity {
-	// FUNCTION: LEGO1 0x1000f1e0
-	// FUNCTION: BETA10 0x100a9950
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// at LEGO1 0x100f0300, needs no annotation
-		return "RaceStandsEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000f1f0
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, CaveEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000fa50
-	// CaveEntity::`scalar deleting destructor'
-};
-
-// VTABLE: LEGO1 0x100d5200
-// VTABLE: BETA10 0x101bd8e8
-// SIZE 0x68
-class JailEntity : public BuildingEntity {
-	// FUNCTION: LEGO1 0x1000f0c0
-	// FUNCTION: BETA10 0x100a9a80
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// at LEGO1 0x100f0300, needs no annotation
-		return "RaceStandsEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000f0d0
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000fac0
-	// JailEntity::`scalar deleting destructor'
-};
-
 // VTABLE: LEGO1 0x100d5258
 // VTABLE: BETA10 0x101bd6e0
 // SIZE 0x68
@@ -202,4 +55,151 @@ public:
 	// GasStationEntity::`scalar deleting destructor'
 };
 
+// VTABLE: LEGO1 0x100d5068
+// VTABLE: BETA10 0x101bd678
+// SIZE 0x68
+class HospitalEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ec40
+	// FUNCTION: BETA10 0x100a9360
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0338
+		return "HospitalEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ec50
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
+
+	// SYNTHETIC: LEGO1 0x1000f820
+	// HospitalEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d4ab0
+// VTABLE: BETA10 0x101bd748
+// SIZE 0x68
+class PoliceEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ed60
+	// FUNCTION: BETA10 0x100a95c0
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0328
+		return "PoliceEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ed70
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong HandleClick(LegoEventNotificationParam& p_param) override; // vtable+0x50
+
+	// SYNTHETIC: LEGO1 0x1000f900
+	// PoliceEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d4a18
+// VTABLE: BETA10 0x101bd7b0
+// SIZE 0x68
+class BeachHouseEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ee80
+	// FUNCTION: BETA10 0x100a96f0
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0314
+		return "BeachHouseEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ee90
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000f970
+	// BeachHouseEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d48a8
+// VTABLE: BETA10 0x101bd818
+// SIZE 0x68
+class RaceStandsEntity : public BuildingEntity {
+	// FUNCTION: LEGO1 0x1000efa0
+	// FUNCTION: BETA10 0x100a9820
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// at LEGO1 0x100f0300, needs no annotation
+		return "RaceStandsEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000efb0
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000f9e0
+	// RaceStandsEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d5200
+// VTABLE: BETA10 0x101bd8e8
+// SIZE 0x68
+class JailEntity : public BuildingEntity {
+	// FUNCTION: LEGO1 0x1000f0c0
+	// FUNCTION: BETA10 0x100a9a80
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// at LEGO1 0x100f0300, needs no annotation
+		return "RaceStandsEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000f0d0
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000fac0
+	// JailEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d50c0
+// VTABLE: BETA10 0x101bd880
+// SIZE 0x68
+class CaveEntity : public BuildingEntity {
+	// FUNCTION: LEGO1 0x1000f1e0
+	// FUNCTION: BETA10 0x100a9950
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// at LEGO1 0x100f0300, needs no annotation
+		return "RaceStandsEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000f1f0
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, CaveEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong HandleClick(LegoEventNotificationParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000fa50
+	// CaveEntity::`scalar deleting destructor'
+};
+
 #endif // BUILDINGS_H
diff --git a/LEGO1/lego/legoomni/include/elevatorbottom.h b/LEGO1/lego/legoomni/include/elevatorbottom.h
index 899a830a..ad1fe29f 100644
--- a/LEGO1/lego/legoomni/include/elevatorbottom.h
+++ b/LEGO1/lego/legoomni/include/elevatorbottom.h
@@ -17,6 +17,9 @@ public:
 
 	MxLong Notify(MxParam& p_param) override; // vtable+0x04
 
+	// FUNCTION: LEGO1 0x10017f10
+	MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
+
 	// FUNCTION: LEGO1 0x10017f20
 	// FUNCTION: BETA10 0x10028130
 	const char* ClassName() const override // vtable+0x0c
@@ -33,12 +36,8 @@ public:
 
 	MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
 	void ReadyWorld() override;                       // vtable+0x50
-
-	// FUNCTION: LEGO1 0x10017f10
-	MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
-
-	MxBool Escape() override;              // vtable+0x64
-	void Enable(MxBool p_enable) override; // vtable+0x68
+	MxBool Escape() override;                         // vtable+0x64
+	void Enable(MxBool p_enable) override;            // vtable+0x68
 
 	// SYNTHETIC: LEGO1 0x10018040
 	// ElevatorBottom::`scalar deleting destructor'
diff --git a/LEGO1/lego/legoomni/include/helicopter.h b/LEGO1/lego/legoomni/include/helicopter.h
index 6f8193b0..8496faf9 100644
--- a/LEGO1/lego/legoomni/include/helicopter.h
+++ b/LEGO1/lego/legoomni/include/helicopter.h
@@ -14,6 +14,16 @@ class HelicopterState : public LegoState {
 public:
 	HelicopterState() : m_unk0x08(0) {}
 
+	// FUNCTION: LEGO1 0x1000e0b0
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
+	// FUNCTION: LEGO1 0x1000e0c0
+	MxBool Reset() override
+	{
+		m_unk0x08 = 0;
+		return TRUE;
+	} // vtable+0x18
+
 	// FUNCTION: LEGO1 0x1000e0d0
 	// FUNCTION: BETA10 0x100a7cc0
 	const char* ClassName() const override // vtable+0x0c
@@ -28,16 +38,6 @@ public:
 		return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name);
 	}
 
-	// FUNCTION: LEGO1 0x1000e0b0
-	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
-
-	// FUNCTION: LEGO1 0x1000e0c0
-	MxBool Reset() override
-	{
-		m_unk0x08 = 0;
-		return TRUE;
-	} // vtable+0x18
-
 	// SYNTHETIC: LEGO1 0x1000e190
 	// HelicopterState::`scalar deleting destructor'
 
diff --git a/LEGO1/lego/legoomni/include/isleactor.h b/LEGO1/lego/legoomni/include/isleactor.h
index 56df85f4..15896e79 100644
--- a/LEGO1/lego/legoomni/include/isleactor.h
+++ b/LEGO1/lego/legoomni/include/isleactor.h
@@ -14,22 +14,7 @@ class MxNotificationParam;
 // SIZE 0x7c
 class IsleActor : public LegoActor {
 public:
-	MxLong Notify(MxParam& p_param) override; // vtable+0x04
-
-	// FUNCTION: LEGO1 0x1000e660
-	// FUNCTION: BETA10 0x100a8300
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f07dc
-		return "IsleActor";
-	}
-
-	// FUNCTION: LEGO1 0x1000e670
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, IsleActor::ClassName()) || LegoActor::IsA(p_name);
-	}
-
+	MxLong Notify(MxParam& p_param) override;         // vtable+0x04
 	MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
 
 	// FUNCTION: LEGO1 0x1000e5f0
@@ -53,6 +38,20 @@ public:
 	// FUNCTION: LEGO1 0x1000e650
 	virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x80
 
+	// FUNCTION: LEGO1 0x1000e660
+	// FUNCTION: BETA10 0x100a8300
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f07dc
+		return "IsleActor";
+	}
+
+	// FUNCTION: LEGO1 0x1000e670
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, IsleActor::ClassName()) || LegoActor::IsA(p_name);
+	}
+
 protected:
 	LegoWorld* m_world; // 0x78
 };
diff --git a/LEGO1/lego/legoomni/include/jetskirace.h b/LEGO1/lego/legoomni/include/jetskirace.h
index e880086f..7542d851 100644
--- a/LEGO1/lego/legoomni/include/jetskirace.h
+++ b/LEGO1/lego/legoomni/include/jetskirace.h
@@ -3,32 +3,6 @@
 
 #include "legorace.h"
 
-// VTABLE: LEGO1 0x100d4fa8
-// VTABLE: BETA10 0x101bd5d0
-// SIZE 0x2c
-class JetskiRaceState : public RaceState {
-public:
-	// FUNCTION: LEGO1 0x1000dc40
-	// FUNCTION: BETA10 0x100a8f30
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f00ac
-		// STRING: BETA10 0x101f1d0c
-		return "JetskiRaceState";
-	}
-
-	// FUNCTION: LEGO1 0x1000dc50
-	// FUNCTION: BETA10 0x100a8f60
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
-	}
-
-	// SYNTHETIC: LEGO1 0x1000f680
-	// SYNTHETIC: BETA10 0x100a9d10
-	// JetskiRaceState::`scalar deleting destructor'
-};
-
 // VTABLE: LEGO1 0x100d4fe8
 // VTABLE: BETA10 0x101bd268
 // SIZE 0x144
@@ -68,6 +42,32 @@ private:
 	static MxS32 g_unk0x100f0c78;
 };
 
+// VTABLE: LEGO1 0x100d4fa8
+// VTABLE: BETA10 0x101bd5d0
+// SIZE 0x2c
+class JetskiRaceState : public RaceState {
+public:
+	// FUNCTION: LEGO1 0x1000dc40
+	// FUNCTION: BETA10 0x100a8f30
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f00ac
+		// STRING: BETA10 0x101f1d0c
+		return "JetskiRaceState";
+	}
+
+	// FUNCTION: LEGO1 0x1000dc50
+	// FUNCTION: BETA10 0x100a8f60
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
+	}
+
+	// SYNTHETIC: LEGO1 0x1000f680
+	// SYNTHETIC: BETA10 0x100a9d10
+	// JetskiRaceState::`scalar deleting destructor'
+};
+
 // SYNTHETIC: LEGO1 0x1000f530
 // SYNTHETIC: BETA10 0x100a9b70
 // JetskiRace::`scalar deleting destructor'
diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h
index b3512503..8196f454 100644
--- a/LEGO1/lego/legoomni/include/jukebox.h
+++ b/LEGO1/lego/legoomni/include/jukebox.h
@@ -24,6 +24,9 @@ public:
 
 	JukeBoxState() : m_music(e_pasquell), m_active(FALSE) {}
 
+	// FUNCTION: LEGO1 0x1000f300
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
 	// FUNCTION: LEGO1 0x1000f310
 	// FUNCTION: BETA10 0x100389c0
 	const char* ClassName() const override // vtable+0x0c
@@ -38,9 +41,6 @@ public:
 		return !strcmp(p_name, JukeBoxState::ClassName()) || LegoState::IsA(p_name);
 	}
 
-	// FUNCTION: LEGO1 0x1000f300
-	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
-
 	// SYNTHETIC: LEGO1 0x1000f3d0
 	// JukeBoxState::`scalar deleting destructor'
 
diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h
index 89da6c41..62c5f04e 100644
--- a/LEGO1/lego/legoomni/include/legoact2.h
+++ b/LEGO1/lego/legoomni/include/legoact2.h
@@ -22,6 +22,9 @@ public:
 	}
 	~LegoAct2State() override {}
 
+	// FUNCTION: LEGO1 0x1000df70
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
 	// FUNCTION: LEGO1 0x1000df80
 	// FUNCTION: BETA10 0x1003c7e0
 	const char* ClassName() const override // vtable+0x0c
@@ -36,9 +39,6 @@ public:
 		return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name);
 	}
 
-	// FUNCTION: LEGO1 0x1000df70
-	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
-
 	// SYNTHETIC: LEGO1 0x1000e040
 	// LegoAct2State::`scalar deleting destructor'
 
diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h
index 30da04ff..f31423c5 100644
--- a/LEGO1/lego/legoomni/include/legoanimpresenter.h
+++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h
@@ -7,7 +7,6 @@
 
 class LegoAnim;
 class LegoWorld;
-class LegoAnimActor;
 class LegoPathBoundary;
 class MxMatrix;
 class Vector3;
diff --git a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h
index 6f0e283a..df2f872e 100644
--- a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h
+++ b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h
@@ -4,6 +4,8 @@
 #include "legoloopinganimpresenter.h"
 #include "legoroimaplist.h"
 
+class LegoAnimActor;
+
 // VTABLE: LEGO1 0x100d9170
 // SIZE 0xd8
 class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter {
diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h
index 7f9886a9..21e47afd 100644
--- a/LEGO1/lego/legoomni/include/legomodelpresenter.h
+++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h
@@ -18,6 +18,9 @@ public:
 	// FUNCTION: LEGO1 0x10067a10
 	~LegoModelPresenter() override { Destroy(TRUE); }
 
+	// FUNCTION: LEGO1 0x1000cca0
+	void Destroy() override { Destroy(FALSE); } // vtable+0x38
+
 	static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig);
 
 	// FUNCTION: BETA10 0x100a7180
@@ -42,7 +45,6 @@ public:
 
 	void ReadyTickle() override; // vtable+0x18
 	void ParseExtra() override;  // vtable+0x30
-	void Destroy() override;     // vtable+0x38
 
 	MxResult FUN_1007ff70(MxDSChunk& p_chunk, LegoEntity* p_entity, MxBool p_roiVisible, LegoWorld* p_world);
 
diff --git a/LEGO1/lego/legoomni/include/legopartpresenter.h b/LEGO1/lego/legoomni/include/legopartpresenter.h
index 76285f49..c8874c0c 100644
--- a/LEGO1/lego/legoomni/include/legopartpresenter.h
+++ b/LEGO1/lego/legoomni/include/legopartpresenter.h
@@ -13,6 +13,9 @@ public:
 	// FUNCTION: LEGO1 0x10067300
 	~LegoPartPresenter() override { Destroy(TRUE); }
 
+	// FUNCTION: LEGO1 0x1000cf60
+	void Destroy() override { Destroy(FALSE); } // vtable+0x38
+
 	// FUNCTION: BETA10 0x100a75d0
 	static const char* HandlerClassName()
 	{
@@ -35,7 +38,6 @@ public:
 
 	void ReadyTickle() override;      // vtable+0x18
 	MxResult AddToManager() override; // vtable+0x34
-	void Destroy() override;          // vtable+0x38
 
 	static void configureLegoPartPresenter(MxS32, MxS32);
 
diff --git a/LEGO1/lego/legoomni/include/legorace.h b/LEGO1/lego/legoomni/include/legorace.h
index 43368f99..c508f3ed 100644
--- a/LEGO1/lego/legoomni/include/legorace.h
+++ b/LEGO1/lego/legoomni/include/legorace.h
@@ -112,6 +112,19 @@ public:
 		return "LegoRace";
 	}
 
+	MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
+
+	virtual MxLong HandleClick(LegoEventNotificationParam&) = 0; // vtable+0x6c
+
+	// FUNCTION: LEGO1 0x10015b70
+	virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&) { return 0; } // vtable+0x70
+
+	// FUNCTION: LEGO1 0x10015b80
+	virtual MxLong HandleEndAction(MxEndActionNotificationParam&) { return 0; } // vtable+0x74
+
+	// FUNCTION: LEGO1 0x10015b90
+	MxBool Escape() override { return FALSE; } // vtable+0x64
+
 	// FUNCTION: LEGO1 0x10015ba0
 	// FUNCTION: BETA10 0x100a8940
 	const char* ClassName() const override // vtable+0x0c
@@ -126,17 +139,6 @@ public:
 		return !strcmp(p_name, LegoRace::ClassName()) || LegoWorld::IsA(p_name);
 	}
 
-	MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18
-
-	// FUNCTION: LEGO1 0x1000dae0
-	MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
-
-	MxBool Escape() override;                                          // vtable+0x64
-	void Enable(MxBool p_enable) override;                             // vtable+0x68
-	virtual MxLong HandleClick(LegoEventNotificationParam&) = 0;       // vtable+0x6c
-	virtual MxLong HandlePathStruct(LegoPathStructNotificationParam&); // vtable+0x70
-	virtual MxLong HandleEndAction(MxEndActionNotificationParam&);     // vtable+0x74
-
 	// FUNCTION: LEGO1 0x1000dab0
 	virtual MxLong HandleType0Notification(MxNotificationParam&) { return 0; } // vtable+0x78
 
@@ -147,6 +149,11 @@ public:
 		m_maps[p_index] = p_map;
 	}
 
+	// FUNCTION: LEGO1 0x1000dae0
+	MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c
+
+	void Enable(MxBool p_enable) override; // vtable+0x68
+
 	// SYNTHETIC: LEGO1 0x10015cc0
 	// LegoRace::`scalar deleting destructor'
 
diff --git a/LEGO1/lego/legoomni/include/legoraceactor.h b/LEGO1/lego/legoomni/include/legoraceactor.h
index 9262f258..bc3d54dc 100644
--- a/LEGO1/lego/legoomni/include/legoraceactor.h
+++ b/LEGO1/lego/legoomni/include/legoraceactor.h
@@ -34,9 +34,7 @@ public:
 	MxU32 VTable0x90(float p_time, Matrix4& p_matrix) override;             // vtable+0x90
 	MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override;      // vtable+0x94
 
-	// FUNCTION: LEGO1 0x10014aa0
-	// FUNCTION: BETA10 0x100ca038
-	virtual MxResult FUN_10014aa0() { return SUCCESS; }
+	virtual MxResult FUN_10014aa0();
 
 	// SYNTHETIC: LEGO1 0x10012c10
 	// LegoRaceActor::`vbase destructor'
diff --git a/LEGO1/lego/legoomni/include/legoracers.h b/LEGO1/lego/legoomni/include/legoracers.h
index 3cc4df2e..461b3a52 100644
--- a/LEGO1/lego/legoomni/include/legoracers.h
+++ b/LEGO1/lego/legoomni/include/legoracers.h
@@ -25,81 +25,6 @@ struct SkeletonKickPhase {
 	MxU8 m_userState;         // 0x0c
 };
 
-// VTABLE: LEGO1 0x100d58a0 LegoRaceActor
-// VTABLE: LEGO1 0x100d58a8 LegoAnimActor
-// VTABLE: LEGO1 0x100d58b8 LegoPathActor
-// VTABLE: LEGO1 0x100d5984 LegoRaceMap
-// VTABLE: LEGO1 0x100d5988 LegoCarRaceActor
-// VTABLE: BETA10 0x101be6ec LegoRaceActor
-// VTABLE: BETA10 0x101be6f0 LegoAnimActor
-// VTABLE: BETA10 0x101be708 LegoPathActor
-// VTABLE: BETA10 0x101be7f8 LegoRaceMap
-// VTABLE: BETA10 0x101be800 LegoCarRaceActor
-// SIZE 0x200
-class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
-public:
-	LegoRaceCar();
-	~LegoRaceCar() override;
-
-	MxLong Notify(MxParam& p_param) override; // vtable+0x04
-
-	// FUNCTION: LEGO1 0x100142a0
-	// FUNCTION: BETA10 0x100cd500
-	const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0548
-		return "LegoRaceCar";
-	}
-
-	// FUNCTION: LEGO1 0x100142c0
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, LegoRaceCar::ClassName()) || LegoCarRaceActor::IsA(p_name);
-	}
-
-	void ParseAction(char* p_extra) override;          // vtable+0x20
-	void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
-	MxU32 VTable0x6c(
-		LegoPathBoundary* p_boundary,
-		Vector3& p_v1,
-		Vector3& p_v2,
-		float p_f1,
-		float p_f2,
-		Vector3& p_v3
-	) override;                                                        // vtable+0x6c
-	void Animate(float p_time) override;                               // vtable+0x70
-	MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
-	void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
-		override;                   // vtable+0x98
-	MxResult VTable0x9c() override; // vtable+0x9c
-
-	virtual void SetMaxLinearVelocity(float p_maxLinearVelocity);
-	virtual void FUN_10012ff0(float p_param);
-	virtual MxU32 HandleSkeletonKicks(float p_param1);
-
-	static void FUN_10012de0();
-	static void FUN_10012e00();
-	static void FUN_10013670();
-
-	// SYNTHETIC: LEGO1 0x10014240
-	// LegoRaceCar::`scalar deleting destructor'
-
-private:
-	undefined m_userState;    // 0x54
-	float m_unk0x58;          // 0x58
-	Mx3DPointFloat m_unk0x5c; // 0x5c
-
-	// Names verified by BETA10 0x100cb4a9
-	LegoAnimActorStruct* m_skelKick1Anim; // 0x70
-	LegoAnimActorStruct* m_skelKick2Anim; // 0x74
-
-	// Name verified by BETA10 0x100cb4f0
-	LegoPathBoundary* m_kick1B; // 0x78
-
-	// Name verified by BETA10 0x100cb537
-	LegoPathBoundary* m_kick2B; // 0x7c
-};
-
 // VTABLE: LEGO1 0x100d5a08 LegoCarRaceActor
 // VTABLE: LEGO1 0x100d5a28 LegoRaceActor
 // VTABLE: LEGO1 0x100d5a30 LegoAnimActor
@@ -134,19 +59,25 @@ public:
 
 	void ParseAction(char* p_extra) override;          // vtable+0x20
 	void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
-	MxU32 VTable0x6c(
-		LegoPathBoundary* p_boundary,
-		Vector3& p_v1,
-		Vector3& p_v2,
-		float p_f1,
-		float p_f2,
-		Vector3& p_v3
-	) override;                                                        // vtable+0x6c
+
+	// FUNCTION: LEGO1 0x10014150
+	MxU32 VTable0x6c(LegoPathBoundary* p_boundary, Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3)
+		override
+	{
+		return LegoJetskiRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
+	} // vtable+0x6c
+
 	void Animate(float p_time) override;                               // vtable+0x70
 	MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
-	void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
-		override;                   // vtable+0x98
-	MxResult VTable0x9c() override; // vtable+0x9c
+
+	// FUNCTION: LEGO1 0x100141d0
+	void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override
+	{
+		LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
+	} // vtable+0x98
+
+	// FUNCTION: LEGO1 0x10014210
+	MxResult VTable0x9c() override { return LegoJetskiRaceActor::VTable0x9c(); } // vtable+0x9c
 
 	virtual void FUN_100136f0(float p_worldSpeed);
 
@@ -154,6 +85,88 @@ public:
 	// LegoJetski::`scalar deleting destructor'
 };
 
+// VTABLE: LEGO1 0x100d58a0 LegoRaceActor
+// VTABLE: LEGO1 0x100d58a8 LegoAnimActor
+// VTABLE: LEGO1 0x100d58b8 LegoPathActor
+// VTABLE: LEGO1 0x100d5984 LegoRaceMap
+// VTABLE: LEGO1 0x100d5988 LegoCarRaceActor
+// VTABLE: BETA10 0x101be6ec LegoRaceActor
+// VTABLE: BETA10 0x101be6f0 LegoAnimActor
+// VTABLE: BETA10 0x101be708 LegoPathActor
+// VTABLE: BETA10 0x101be7f8 LegoRaceMap
+// VTABLE: BETA10 0x101be800 LegoCarRaceActor
+// SIZE 0x200
+class LegoRaceCar : public LegoCarRaceActor, public LegoRaceMap {
+public:
+	LegoRaceCar();
+	~LegoRaceCar() override;
+
+	MxLong Notify(MxParam& p_param) override; // vtable+0x04
+
+	// FUNCTION: LEGO1 0x100142a0
+	// FUNCTION: BETA10 0x100cd500
+	const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0548
+		return "LegoRaceCar";
+	}
+
+	// FUNCTION: LEGO1 0x100142c0
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, LegoRaceCar::ClassName()) || LegoCarRaceActor::IsA(p_name);
+	}
+
+	void ParseAction(char* p_extra) override;          // vtable+0x20
+	void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30
+
+	// FUNCTION: LEGO1 0x10014500
+	// FUNCTION: BETA10 0x100cd5e0
+	MxU32 VTable0x6c(LegoPathBoundary* p_boundary, Vector3& p_v1, Vector3& p_v2, float p_f1, float p_f2, Vector3& p_v3)
+		override
+	{
+		return LegoCarRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
+	} // vtable+0x6c
+
+	void Animate(float p_time) override;                               // vtable+0x70
+	MxResult HitActor(LegoPathActor* p_actor, MxBool p_bool) override; // vtable+0x94
+
+	// FUNCTION: LEGO1 0x10014560
+	// FUNCTION: BETA10 0x100cd660
+	void SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4) override
+	{
+		LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
+	} // vtable+0x98
+
+	MxResult VTable0x9c() override; // vtable+0x9c
+
+	virtual void SetMaxLinearVelocity(float p_maxLinearVelocity);
+	virtual void FUN_10012ff0(float p_param);
+	virtual MxU32 HandleSkeletonKicks(float p_param1);
+
+	static void FUN_10012de0();
+	static void FUN_10012e00();
+	static void FUN_10013670();
+
+	// SYNTHETIC: LEGO1 0x10014240
+	// LegoRaceCar::`scalar deleting destructor'
+
+private:
+	undefined m_userState;    // 0x54
+	float m_unk0x58;          // 0x58
+	Mx3DPointFloat m_unk0x5c; // 0x5c
+
+	// Names verified by BETA10 0x100cb4a9
+	LegoAnimActorStruct* m_skelKick1Anim; // 0x70
+	LegoAnimActorStruct* m_skelKick2Anim; // 0x74
+
+	// Name verified by BETA10 0x100cb4f0
+	LegoPathBoundary* m_kick1B; // 0x78
+
+	// Name verified by BETA10 0x100cb537
+	LegoPathBoundary* m_kick2B; // 0x7c
+};
+
 // GLOBAL: LEGO1 0x100d5890
 // LegoRaceCar::`vbtable'{for `LegoCarRaceActor'}
 
diff --git a/LEGO1/lego/legoomni/include/score.h b/LEGO1/lego/legoomni/include/score.h
index 28a67434..36252f6f 100644
--- a/LEGO1/lego/legoomni/include/score.h
+++ b/LEGO1/lego/legoomni/include/score.h
@@ -15,6 +15,16 @@ class ScoreState : public LegoState {
 public:
 	ScoreState() : m_playCubeTutorial(TRUE) {}
 
+	// FUNCTION: LEGO1 0x1000de20
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
+	// FUNCTION: LEGO1 0x1000de30
+	MxBool Reset() override
+	{
+		m_playCubeTutorial = TRUE;
+		return TRUE;
+	} // vtable+0x18
+
 	// FUNCTION: LEGO1 0x1000de40
 	// FUNCTION: BETA10 0x100a7a70
 	const char* ClassName() const override // vtable+0x0c
@@ -29,16 +39,6 @@ public:
 		return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name);
 	}
 
-	// FUNCTION: LEGO1 0x1000de20
-	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
-
-	// FUNCTION: LEGO1 0x1000de30
-	MxBool Reset() override
-	{
-		m_playCubeTutorial = TRUE;
-		return TRUE;
-	} // vtable+0x18
-
 	MxBool GetTutorialFlag() { return m_playCubeTutorial; }
 	void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
 
diff --git a/LEGO1/lego/legoomni/src/actors/act2actor.cpp b/LEGO1/lego/legoomni/src/actors/act2actor.cpp
index 52506121..a13abf1c 100644
--- a/LEGO1/lego/legoomni/src/actors/act2actor.cpp
+++ b/LEGO1/lego/legoomni/src/actors/act2actor.cpp
@@ -869,13 +869,3 @@ LegoEntity* Act2Actor::FUN_10019b90(MxBool* p_param)
 
 	return result;
 }
-
-// FUNCTION: LEGO1 0x1001a180
-MxS32 Act2Actor::VTable0x68(Vector3& p_v1, Vector3& p_v2, Vector3& p_v3)
-{
-	if (m_unk0x1f) {
-		return 0;
-	}
-
-	return LegoAnimActor::VTable0x68(p_v1, p_v2, p_v3);
-}
diff --git a/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp b/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
index b5c4f521..06bf7746 100644
--- a/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
@@ -1,5 +1,36 @@
 #include "legoobjectfactory.h"
 
+// Headers need to be included in a certain order to match the original binary.
+// Some of the following headers were probably not directly included,
+// but were included from one of the higher level classes. We should attempt
+// to reverse engineer the inclusion "graph" at some point. Until then, to maintain
+// correct order in the binary, we include them in the order we want here.
+// clang-format off
+#include "mxpresenter.h"
+#include "legoentity.h"
+#include "legopathactor.h"
+// The below header inclusions should be sound.
+#include "legoloopinganimpresenter.h"
+#include "mxcompositemediapresenter.h"
+#include "legoactorpresenter.h"
+#include "legomodelpresenter.h"
+#include "legotexturepresenter.h"
+#include "legopartpresenter.h"
+#include "legoactioncontrolpresenter.h"
+#include "lego3dwavepresenter.h"
+#include "jetskirace.h"
+#include "carrace.h"
+#include "score.h"
+#include "legoact2.h"
+#include "helicopter.h"
+#include "act2policestation.h"
+#include "act3.h"
+#include "doors.h"
+#include "pizzeria.h"
+#include "buildings.h"
+#include "jukebox.h"
+// clang-format on
+
 #include "act2actor.h"
 #include "act2brick.h"
 #include "act2genactor.h"
diff --git a/LEGO1/lego/legoomni/src/race/legorace.cpp b/LEGO1/lego/legoomni/src/race/legorace.cpp
index 355e2914..de895ad5 100644
--- a/LEGO1/lego/legoomni/src/race/legorace.cpp
+++ b/LEGO1/lego/legoomni/src/race/legorace.cpp
@@ -35,24 +35,6 @@ LegoRace::LegoRace()
 	NotificationManager()->Register(this);
 }
 
-// FUNCTION: LEGO1 0x10015b70
-MxLong LegoRace::HandlePathStruct(LegoPathStructNotificationParam&)
-{
-	return 0;
-}
-
-// FUNCTION: LEGO1 0x10015b80
-MxLong LegoRace::HandleEndAction(MxEndActionNotificationParam&)
-{
-	return 0;
-}
-
-// FUNCTION: LEGO1 0x10015b90
-MxBool LegoRace::Escape()
-{
-	return FALSE;
-}
-
 // FUNCTION: LEGO1 0x10015ce0
 // FUNCTION: BETA10 0x100c7a71
 MxResult LegoRace::Create(MxDSAction& p_dsAction)
diff --git a/LEGO1/lego/legoomni/src/race/legoraceactor.cpp b/LEGO1/lego/legoomni/src/race/legoraceactor.cpp
index a8a7fccd..92c99d4f 100644
--- a/LEGO1/lego/legoomni/src/race/legoraceactor.cpp
+++ b/LEGO1/lego/legoomni/src/race/legoraceactor.cpp
@@ -116,3 +116,10 @@ MxResult LegoRaceActor::HitActor(LegoPathActor* p_actor, MxBool p_bool)
 
 	return SUCCESS;
 }
+
+// FUNCTION: LEGO1 0x10014aa0
+// FUNCTION: BETA10 0x100ca038
+MxResult LegoRaceActor::FUN_10014aa0()
+{
+	return SUCCESS;
+}
diff --git a/LEGO1/lego/legoomni/src/race/legoracers.cpp b/LEGO1/lego/legoomni/src/race/legoracers.cpp
index 7e8795cd..f16a488c 100644
--- a/LEGO1/lego/legoomni/src/race/legoracers.cpp
+++ b/LEGO1/lego/legoomni/src/race/legoracers.cpp
@@ -167,11 +167,6 @@ undefined4 g_hitValerieSoundsIndex = 0;
 // GLOBAL: LEGO1 0x100f0bb4
 MxLong g_unk0x100f0bb4 = 0;
 
-// Initialized at LEGO1 0x10012db0
-// GLOBAL: LEGO1 0x10102af0
-// GLOBAL: BETA10 0x102114c0
-Mx3DPointFloat g_unk0x10102af0 = Mx3DPointFloat(0.0f, 2.0f, 0.0f);
-
 // FUNCTION: LEGO1 0x10012950
 LegoRaceCar::LegoRaceCar()
 {
@@ -197,6 +192,11 @@ MxLong LegoRaceCar::Notify(MxParam& p_param)
 	return LegoRaceMap::Notify(p_param);
 }
 
+// Initialized at LEGO1 0x10012db0
+// GLOBAL: LEGO1 0x10102af0
+// GLOBAL: BETA10 0x102114c0
+Mx3DPointFloat g_unk0x10102af0 = Mx3DPointFloat(0.0f, 2.0f, 0.0f);
+
 // FUNCTION: LEGO1 0x10012de0
 void LegoRaceCar::FUN_10012de0()
 {
@@ -727,49 +727,3 @@ MxResult LegoJetski::HitActor(LegoPathActor* p_actor, MxBool p_bool)
 
 	return SUCCESS;
 }
-
-// FUNCTION: LEGO1 0x10014150
-MxU32 LegoJetski::VTable0x6c(
-	LegoPathBoundary* p_boundary,
-	Vector3& p_v1,
-	Vector3& p_v2,
-	float p_f1,
-	float p_f2,
-	Vector3& p_v3
-)
-{
-	return LegoJetskiRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
-}
-
-// FUNCTION: LEGO1 0x100141d0
-void LegoJetski::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
-{
-	LegoJetskiRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
-}
-
-// FUNCTION: LEGO1 0x10014210
-MxResult LegoJetski::VTable0x9c()
-{
-	return LegoJetskiRaceActor::VTable0x9c();
-}
-
-// FUNCTION: LEGO1 0x10014500
-// FUNCTION: BETA10 0x100cd5e0
-MxU32 LegoRaceCar::VTable0x6c(
-	LegoPathBoundary* p_boundary,
-	Vector3& p_v1,
-	Vector3& p_v2,
-	float p_f1,
-	float p_f2,
-	Vector3& p_v3
-)
-{
-	return LegoCarRaceActor::VTable0x6c(p_boundary, p_v1, p_v2, p_f1, p_f2, p_v3);
-}
-
-// FUNCTION: LEGO1 0x10014560
-// FUNCTION: BETA10 0x100cd660
-void LegoRaceCar::SwitchBoundary(LegoPathBoundary*& p_boundary, LegoUnknown100db7f4*& p_edge, float& p_unk0xe4)
-{
-	LegoCarRaceActor::SwitchBoundary(p_boundary, p_edge, p_unk0xe4);
-}
diff --git a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp
index f1525a63..a3040d37 100644
--- a/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp
+++ b/LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp
@@ -24,12 +24,6 @@ DECOMP_SIZE_ASSERT(LegoModelPresenter, 0x6c)
 // GLOBAL: LEGO1 0x100f7ae0
 MxS32 g_modelPresenterConfig = 1;
 
-// FUNCTION: LEGO1 0x1000cca0
-void LegoModelPresenter::Destroy()
-{
-	Destroy(FALSE);
-}
-
 // FUNCTION: LEGO1 0x1007f660
 void LegoModelPresenter::configureLegoModelPresenter(MxS32 p_modelPresenterConfig)
 {
diff --git a/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp b/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp
index 87e15745..60f33d89 100644
--- a/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp
+++ b/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp
@@ -20,12 +20,6 @@ MxS32 g_partPresenterConfig1 = 1;
 // GLOBAL: LEGO1 0x100f7aa4
 MxS32 g_partPresenterConfig2 = 100;
 
-// FUNCTION: LEGO1 0x1000cf60
-void LegoPartPresenter::Destroy()
-{
-	Destroy(FALSE);
-}
-
 // FUNCTION: LEGO1 0x1007c990
 void LegoPartPresenter::configureLegoPartPresenter(MxS32 p_partPresenterConfig1, MxS32 p_partPresenterConfig2)
 {
diff --git a/LEGO1/omni/include/mxaudiopresenter.h b/LEGO1/omni/include/mxaudiopresenter.h
index ec73e336..67c8cf94 100644
--- a/LEGO1/omni/include/mxaudiopresenter.h
+++ b/LEGO1/omni/include/mxaudiopresenter.h
@@ -10,6 +10,12 @@ class MxAudioPresenter : public MxMediaPresenter {
 public:
 	MxAudioPresenter() { m_volume = 100; }
 
+	// FUNCTION: LEGO1 0x1000d260
+	virtual MxS32 GetVolume() { return m_volume; } // vtable+0x5c
+
+	// FUNCTION: LEGO1 0x1000d270
+	virtual void SetVolume(MxS32 p_volume) { m_volume = p_volume; } // vtable+0x60
+
 	// FUNCTION: BETA10 0x1008cba0
 	static const char* HandlerClassName()
 	{
@@ -30,12 +36,6 @@ public:
 		return !strcmp(p_name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(p_name);
 	}
 
-	// FUNCTION: LEGO1 0x1000d260
-	virtual MxS32 GetVolume() { return m_volume; } // vtable+0x5c
-
-	// FUNCTION: LEGO1 0x1000d270
-	virtual void SetVolume(MxS32 p_volume) { m_volume = p_volume; } // vtable+0x60
-
 protected:
 	MxS32 m_volume; // 0x50
 };
diff --git a/LEGO1/omni/include/mxmediapresenter.h b/LEGO1/omni/include/mxmediapresenter.h
index 40bb0961..3cfee4bd 100644
--- a/LEGO1/omni/include/mxmediapresenter.h
+++ b/LEGO1/omni/include/mxmediapresenter.h
@@ -16,6 +16,9 @@ public:
 	// FUNCTION: LEGO1 0x1000c550
 	~MxMediaPresenter() override { Destroy(TRUE); }
 
+	// FUNCTION: LEGO1 0x1000c5b0
+	void Destroy() override { Destroy(FALSE); } // vtable+0x38
+
 	MxResult Tickle() override; // vtable+0x08
 
 	// FUNCTION: BETA10 0x10054f50
@@ -42,9 +45,6 @@ public:
 	void RepeatingTickle() override; // vtable+0x24
 	void DoneTickle() override;      // vtable+0x2c
 
-	// FUNCTION: LEGO1 0x1000c5b0
-	void Destroy() override { Destroy(FALSE); } // vtable+0x38
-
 	MxResult StartAction(MxStreamController*, MxDSAction*) override; // vtable+0x3c
 	void EndAction() override;                                       // vtable+0x40
 	void Enable(MxBool p_enable) override;                           // vtable+0x54
diff --git a/LEGO1/omni/include/mxpresenter.h b/LEGO1/omni/include/mxpresenter.h
index 3358c832..3af93fd0 100644
--- a/LEGO1/omni/include/mxpresenter.h
+++ b/LEGO1/omni/include/mxpresenter.h
@@ -28,31 +28,8 @@ public:
 
 	MxPresenter() { Init(); }
 
-	// FUNCTION: LEGO1 0x1000bf00
-	~MxPresenter() override {} // vtable+0x00
-
 	MxResult Tickle() override; // vtable+0x08
 
-	// FUNCTION: BETA10 0x1004d9e0
-	static const char* HandlerClassName()
-	{
-		// STRING: LEGO1 0x100f0740
-		return "MxPresenter";
-	}
-
-	// FUNCTION: LEGO1 0x1000bfe0
-	// FUNCTION: BETA10 0x1004d9b0
-	const char* ClassName() const override // vtable+0x0c
-	{
-		return HandlerClassName();
-	}
-
-	// FUNCTION: LEGO1 0x1000bff0
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, MxPresenter::ClassName()) || MxCore::IsA(p_name);
-	}
-
 	// FUNCTION: LEGO1 0x1000be30
 	virtual void VTable0x14() {} // vtable+0x14
 
@@ -88,6 +65,9 @@ protected:
 	}
 
 public:
+	// FUNCTION: LEGO1 0x1000bf00
+	~MxPresenter() override {} // vtable+0x00
+
 	// FUNCTION: LEGO1 0x1000bf70
 	virtual MxResult AddToManager() { return SUCCESS; } // vtable+0x34
 
@@ -115,6 +95,26 @@ public:
 
 	virtual void Enable(MxBool p_enable); // vtable+0x54
 
+	// FUNCTION: BETA10 0x1004d9e0
+	static const char* HandlerClassName()
+	{
+		// STRING: LEGO1 0x100f0740
+		return "MxPresenter";
+	}
+
+	// FUNCTION: LEGO1 0x1000bfe0
+	// FUNCTION: BETA10 0x1004d9b0
+	const char* ClassName() const override // vtable+0x0c
+	{
+		return HandlerClassName();
+	}
+
+	// FUNCTION: LEGO1 0x1000bff0
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, MxPresenter::ClassName()) || MxCore::IsA(p_name);
+	}
+
 	MxEntity* CreateEntity(const char* p_defaultName);
 	void SendToCompositePresenter(MxOmni* p_omni);
 	MxBool IsEnabled();
diff --git a/LEGO1/omni/include/mxsoundpresenter.h b/LEGO1/omni/include/mxsoundpresenter.h
index e2d80e3d..041b8a17 100644
--- a/LEGO1/omni/include/mxsoundpresenter.h
+++ b/LEGO1/omni/include/mxsoundpresenter.h
@@ -10,6 +10,9 @@ public:
 	// FUNCTION: LEGO1 0x1000d430
 	~MxSoundPresenter() override { Destroy(TRUE); }
 
+	// FUNCTION: LEGO1 0x1000d490
+	void Destroy() override { Destroy(FALSE); } // vtable+0x38
+
 	// FUNCTION: BETA10 0x1008ca70
 	static const char* HandlerClassName()
 	{
@@ -32,9 +35,6 @@ public:
 
 	MxResult AddToManager() override; // vtable+0x34
 
-	// FUNCTION: LEGO1 0x1000d490
-	void Destroy() override { Destroy(FALSE); } // vtable+0x38
-
 	// SYNTHETIC: LEGO1 0x1000d5c0
 	// MxSoundPresenter::`scalar deleting destructor'
 
diff --git a/LEGO1/omni/include/mxvideopresenter.h b/LEGO1/omni/include/mxvideopresenter.h
index 30d65354..907ddc0e 100644
--- a/LEGO1/omni/include/mxvideopresenter.h
+++ b/LEGO1/omni/include/mxvideopresenter.h
@@ -14,43 +14,6 @@ class MxVideoPresenter : public MxMediaPresenter {
 public:
 	MxVideoPresenter() { Init(); }
 
-	// FUNCTION: LEGO1 0x1000c740
-	~MxVideoPresenter() override { Destroy(TRUE); } // vtable+0x00
-
-	// FUNCTION: BETA10 0x100551b0
-	static const char* HandlerClassName()
-	{
-		// STRING: LEGO1 0x100f0760
-		return "MxVideoPresenter";
-	}
-
-	// FUNCTION: LEGO1 0x1000c820
-	// FUNCTION: BETA10 0x10055180
-	const char* ClassName() const override // vtable+0x0c
-	{
-		return HandlerClassName();
-	}
-
-	// FUNCTION: LEGO1 0x1000c830
-	MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, MxVideoPresenter::ClassName()) || MxMediaPresenter::IsA(p_name);
-	}
-
-	void ReadyTickle() override;      // vtable+0x18
-	void StartingTickle() override;   // vtable+0x1c
-	void StreamingTickle() override;  // vtable+0x20
-	void RepeatingTickle() override;  // vtable+0x24
-	void FreezingTickle() override;   // vtable+0x28
-	MxResult AddToManager() override; // vtable+0x34
-
-	// FUNCTION: LEGO1 0x1000c7a0
-	void Destroy() override { Destroy(FALSE); } // vtable+0x38
-
-	void EndAction() override;                   // vtable+0x40
-	MxResult PutData() override;                 // vtable+0x4c
-	MxBool IsHit(MxS32 p_x, MxS32 p_y) override; // vtable+0x50
-
 	// FUNCTION: LEGO1 0x1000c700
 	// FUNCTION: BETA10 0x10054a80
 	virtual void LoadHeader(MxStreamChunk* p_chunk) {} // vtable+0x5c
@@ -72,6 +35,12 @@ public:
 
 	virtual undefined VTable0x74(); // vtable+0x74
 
+	// FUNCTION: LEGO1 0x1000c740
+	~MxVideoPresenter() override { Destroy(TRUE); } // vtable+0x00
+
+	// FUNCTION: LEGO1 0x1000c7a0
+	void Destroy() override { Destroy(FALSE); } // vtable+0x38
+
 	// FUNCTION: LEGO1 0x1000c7b0
 	virtual LPDIRECTDRAWSURFACE VTable0x78() { return m_unk0x58; } // vtable+0x78
 
@@ -84,6 +53,36 @@ public:
 	// FUNCTION: LEGO1 0x1000c800
 	virtual MxS32 GetHeight() { return m_alpha ? m_alpha->m_height : m_frameBitmap->GetBmiHeightAbs(); } // vtable+0x84
 
+	// FUNCTION: BETA10 0x100551b0
+	static const char* HandlerClassName()
+	{
+		// STRING: LEGO1 0x100f0760
+		return "MxVideoPresenter";
+	}
+
+	// FUNCTION: LEGO1 0x1000c820
+	// FUNCTION: BETA10 0x10055180
+	const char* ClassName() const override // vtable+0x0c
+	{
+		return HandlerClassName();
+	}
+
+	// FUNCTION: LEGO1 0x1000c830
+	MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, MxVideoPresenter::ClassName()) || MxMediaPresenter::IsA(p_name);
+	}
+
+	void ReadyTickle() override;                 // vtable+0x18
+	void StartingTickle() override;              // vtable+0x1c
+	void StreamingTickle() override;             // vtable+0x20
+	void RepeatingTickle() override;             // vtable+0x24
+	void FreezingTickle() override;              // vtable+0x28
+	MxResult AddToManager() override;            // vtable+0x34
+	void EndAction() override;                   // vtable+0x40
+	MxResult PutData() override;                 // vtable+0x4c
+	MxBool IsHit(MxS32 p_x, MxS32 p_y) override; // vtable+0x50
+
 	// VTABLE: LEGO1 0x100dc2bc
 	// SIZE 0x0c
 	struct AlphaMask {
diff --git a/LEGO1/omni/include/mxwavepresenter.h b/LEGO1/omni/include/mxwavepresenter.h
index d0fedb05..cf64b90f 100644
--- a/LEGO1/omni/include/mxwavepresenter.h
+++ b/LEGO1/omni/include/mxwavepresenter.h
@@ -15,6 +15,15 @@ public:
 	// FUNCTION: LEGO1 0x1000d640
 	~MxWavePresenter() override { Destroy(TRUE); } // vtable+0x00
 
+	// FUNCTION: LEGO1 0x1000d6a0
+	void Destroy() override { Destroy(FALSE); } // vtable+0x38
+
+	virtual void Pause();  // vtable+0x64
+	virtual void Resume(); // vtable+0x68
+
+	// FUNCTION: LEGO1 0x1000d6b0
+	virtual MxBool IsPaused() { return m_paused; } // vtable+0x6c
+
 	// FUNCTION: BETA10 0x1008cd00
 	static const char* HandlerClassName()
 	{
@@ -35,26 +44,17 @@ public:
 		return !strcmp(p_name, MxWavePresenter::ClassName()) || MxSoundPresenter::IsA(p_name);
 	}
 
-	void ReadyTickle() override;      // vtable+0x18
-	void StartingTickle() override;   // vtable+0x1c
-	void StreamingTickle() override;  // vtable+0x20
-	void DoneTickle() override;       // vtable+0x2c
-	void ParseExtra() override;       // vtable+0x30
-	MxResult AddToManager() override; // vtable+0x34
-
-	// FUNCTION: LEGO1 0x1000d6a0
-	void Destroy() override { Destroy(FALSE); } // vtable+0x38
-
+	void ReadyTickle() override;                     // vtable+0x18
+	void StartingTickle() override;                  // vtable+0x1c
+	void StreamingTickle() override;                 // vtable+0x20
+	void DoneTickle() override;                      // vtable+0x2c
+	void ParseExtra() override;                      // vtable+0x30
+	MxResult AddToManager() override;                // vtable+0x34
 	void EndAction() override;                       // vtable+0x40
 	MxResult PutData() override;                     // vtable+0x4c
 	void Enable(MxBool p_enable) override;           // vtable+0x54
 	void LoopChunk(MxStreamChunk* p_chunk) override; // vtable+0x58
 	void SetVolume(MxS32 p_volume) override;         // vtable+0x60
-	virtual void Pause();                            // vtable+0x64
-	virtual void Resume();                           // vtable+0x68
-
-	// FUNCTION: LEGO1 0x1000d6b0
-	virtual MxBool IsPaused() { return m_paused; } // vtable+0x6c
 
 	// SIZE 0x18
 	struct WaveFormat {