diff --git a/CMakeLists.txt b/CMakeLists.txt
index 00b4fdda..06c10670 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -284,14 +284,12 @@ target_link_libraries(omni PRIVATE dsound winmm Smacker::Smacker)
 
 add_library(lego1 SHARED
   LEGO1/define.cpp
-  LEGO1/lego/legoomni/src/act1/act1state.cpp
-  LEGO1/lego/legoomni/src/act2/legoact2state.cpp
-  LEGO1/lego/legoomni/src/act3/act3shark.cpp
-  LEGO1/lego/legoomni/src/act3/act3state.cpp
   LEGO1/lego/legoomni/src/actors/act2actor.cpp
   LEGO1/lego/legoomni/src/actors/act3actor.cpp
+  LEGO1/lego/legoomni/src/actors/act3shark.cpp
   LEGO1/lego/legoomni/src/actors/ambulance.cpp
   LEGO1/lego/legoomni/src/actors/bike.cpp
+  LEGO1/lego/legoomni/src/actors/buildings.cpp
   LEGO1/lego/legoomni/src/actors/bumpbouy.cpp
   LEGO1/lego/legoomni/src/actors/doors.cpp
   LEGO1/lego/legoomni/src/actors/dunebuggy.cpp
@@ -315,11 +313,9 @@ add_library(lego1 SHARED
   LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp
   LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp
   LEGO1/lego/legoomni/src/build/buildingentity.cpp
-  LEGO1/lego/legoomni/src/build/helicopterstate.cpp
   LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp
   LEGO1/lego/legoomni/src/build/legocarbuild.cpp
-  LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp
-  LEGO1/lego/legoomni/src/common/animstate.cpp
+  LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
   LEGO1/lego/legoomni/src/common/legoactioncontrolpresenter.cpp
   LEGO1/lego/legoomni/src/common/legoactors.cpp
   LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
@@ -356,18 +352,7 @@ add_library(lego1 SHARED
   LEGO1/lego/legoomni/src/entity/legopovcontroller.cpp
   LEGO1/lego/legoomni/src/entity/legoworld.cpp
   LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp
-  LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp
-  LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp
-  LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp
-  LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp
-  LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp
-  LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp
-  LEGO1/lego/legoomni/src/infocenter/infocenterstate.cpp
-  LEGO1/lego/legoomni/src/infocenter/scorestate.cpp
   LEGO1/lego/legoomni/src/input/legoinputmanager.cpp
-  LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp
-  LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp
-  LEGO1/lego/legoomni/src/isle/radiostate.cpp
   LEGO1/lego/legoomni/src/main/legomain.cpp
   LEGO1/lego/legoomni/src/main/scripts.cpp
   LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp
@@ -378,22 +363,14 @@ add_library(lego1 SHARED
   LEGO1/lego/legoomni/src/paths/legopathcontroller.cpp
   LEGO1/lego/legoomni/src/paths/legopathpresenter.cpp
   LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
-  LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp
-  LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp
-  LEGO1/lego/legoomni/src/police/policeentity.cpp
-  LEGO1/lego/legoomni/src/police/policestate.cpp
   LEGO1/lego/legoomni/src/race/carrace.cpp
   LEGO1/lego/legoomni/src/race/jetskirace.cpp
   LEGO1/lego/legoomni/src/race/legorace.cpp
   LEGO1/lego/legoomni/src/race/legoraceactor.cpp
   LEGO1/lego/legoomni/src/race/legoracecar.cpp
   LEGO1/lego/legoomni/src/race/legoracemap.cpp
-  LEGO1/lego/legoomni/src/race/racestandsentity.cpp
   LEGO1/lego/legoomni/src/race/raceskel.cpp
-  LEGO1/lego/legoomni/src/race/racestate.cpp
-  LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp
   LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp
-  LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp
   LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp
   LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp
   LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp
diff --git a/LEGO1/lego/legoomni/include/act1state.h b/LEGO1/lego/legoomni/include/act1state.h
deleted file mode 100644
index 2d428e69..00000000
--- a/LEGO1/lego/legoomni/include/act1state.h
+++ /dev/null
@@ -1,134 +0,0 @@
-#ifndef ACT1STATE_H
-#define ACT1STATE_H
-
-#include "legostate.h"
-
-class LegoNamedTexture;
-
-// VTABLE: LEGO1 0x100d7028
-// SIZE 0x26c
-class Act1State : public LegoState {
-public:
-	enum ElevatorFloor {
-		c_floor1 = 1,
-		c_floor2,
-		c_floor3
-	};
-
-	enum {
-		e_unk953 = 953,
-		e_unk954 = 954,
-		e_unk955 = 955,
-	};
-
-	// SIZE 0x4c
-	class NamedPlane {
-	public:
-		// FUNCTION: LEGO1 0x10033800
-		NamedPlane() {}
-
-		inline void SetName(const char* p_name) { m_name = p_name; }
-		inline const MxString* GetName() const { return &m_name; }
-
-		// FUNCTION: LEGO1 0x100344d0
-		MxResult Serialize(LegoFile* p_file)
-		{
-			if (p_file->IsWriteMode()) {
-				p_file->WriteString(m_name);
-				p_file->WriteVector3(m_point1);
-				p_file->WriteVector3(m_point2);
-				p_file->WriteVector3(m_point3);
-			}
-			else if (p_file->IsReadMode()) {
-				p_file->ReadString(m_name);
-				p_file->ReadVector3(m_point1);
-				p_file->ReadVector3(m_point2);
-				p_file->ReadVector3(m_point3);
-			}
-
-			return SUCCESS;
-		}
-
-	private:
-		MxString m_name;         // 0x00
-		Mx3DPointFloat m_point1; // 0x10
-		Mx3DPointFloat m_point2; // 0x24
-		Mx3DPointFloat m_point3; // 0x38
-	};
-
-	Act1State();
-
-	// FUNCTION: LEGO1 0x100338a0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0154
-		return "Act1State";
-	}
-
-	// FUNCTION: LEGO1 0x100338b0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, Act1State::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool SetFlag() override;                         // vtable+0x18
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	void FUN_10034660();
-	void FUN_100346a0();
-	void FUN_10034b60();
-	void FUN_10034d00();
-
-	// TODO: Most likely getters/setters are not used according to BETA.
-
-	inline MxU32 GetUnknown18() { return m_unk0x018; }
-	inline ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; }
-	inline MxU8 GetUnknown21() { return m_unk0x021; }
-
-	inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x018 = p_unk0x18; }
-	inline void SetElevatorFloor(ElevatorFloor p_elevFloor) { m_elevFloor = p_elevFloor; }
-	inline void SetUnknown21(MxU8 p_unk0x21) { m_unk0x021 = p_unk0x21; }
-
-	// SYNTHETIC: LEGO1 0x10033960
-	// Act1State::`scalar deleting destructor'
-
-	MxS32* m_unk0x008;            // 0x008 FIXME: count for m_unk0x008
-	MxS16 m_unk0x00c;             // 0x00c
-	undefined2 m_unk0x00e;        // 0x00e
-	undefined2 m_unk0x010;        // 0x010
-	undefined m_unk0x012;         // 0x012
-	MxS32 m_unk0x014;             // 0x014
-	MxU32 m_unk0x018;             // 0x018
-	MxS16 m_elevFloor;            // 0x01c
-	MxBool m_unk0x01e;            // 0x01e
-	MxBool m_unk0x01f;            // 0x01f
-	MxBool m_planeActive;         // 0x020
-	undefined m_unk0x021;         // 0x021
-	MxBool m_unk0x022;            // 0x022
-	undefined m_unk0x023;         // 0x023
-	NamedPlane m_unk0x024;        // 0x024
-	NamedPlane m_unk0x070;        // 0x070
-	NamedPlane m_unk0x0bc;        // 0x0bc
-	NamedPlane m_unk0x108;        // 0x108
-	LegoNamedTexture* m_unk0x154; // 0x154
-	LegoNamedTexture* m_unk0x158; // 0x158
-	LegoNamedTexture* m_unk0x15c; // 0x15c
-	MxCore* m_unk0x160;           // 0x160
-	NamedPlane m_unk0x164;        // 0x164
-	LegoNamedTexture* m_unk0x1b0; // 0x1b0
-	LegoNamedTexture* m_unk0x1b4; // 0x1b4
-	MxCore* m_unk0x1b8;           // 0x1b8
-	NamedPlane m_unk0x1bc;        // 0x1bc
-	LegoNamedTexture* m_unk0x208; // 0x208
-	MxCore* m_unk0x20c;           // 0x20c
-	NamedPlane m_unk0x210;        // 0x210
-	LegoNamedTexture* m_unk0x25c; // 0x25c
-	LegoNamedTexture* m_unk0x260; // 0x260
-	LegoNamedTexture* m_unk0x264; // 0x264
-	MxCore* m_unk0x268;           // 0x268
-};
-
-// FUNCTION: LEGO1 0x10033a70
-// Act1State::NamedPlane::~NamedPlane
-
-#endif // ACT1STATE_H
diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h
index b476dcc0..ddaccb13 100644
--- a/LEGO1/lego/legoomni/include/act3.h
+++ b/LEGO1/lego/legoomni/include/act3.h
@@ -1,8 +1,41 @@
 #ifndef ACT3_H
 #define ACT3_H
 
+#include "legostate.h"
 #include "legoworld.h"
 
+// VTABLE: LEGO1 0x100d4fc8
+// SIZE 0x0c
+class Act3State : public LegoState {
+public:
+	inline Act3State() { m_unk0x08 = 0; }
+
+	// FUNCTION: LEGO1 0x1000e300
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f03f0
+		return "Act3State";
+	}
+
+	// FUNCTION: LEGO1 0x1000e310
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		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'
+
+	inline undefined4 GetUnknown0x08() { return m_unk0x08; }
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	undefined4 m_unk0x08; // 0x08
+};
+
 // VTABLE: LEGO1 0x100d9628
 // SIZE 0x4274
 class Act3 : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/act3state.h b/LEGO1/lego/legoomni/include/act3state.h
deleted file mode 100644
index 3df4e4f3..00000000
--- a/LEGO1/lego/legoomni/include/act3state.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef ACT3STATE_H
-#define ACT3STATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d4fc8
-// SIZE 0x0c
-class Act3State : public LegoState {
-public:
-	inline Act3State() { m_unk0x08 = 0; }
-
-	// FUNCTION: LEGO1 0x1000e300
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f03f0
-		return "Act3State";
-	}
-
-	// FUNCTION: LEGO1 0x1000e310
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, Act3State::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool IsSerializable() override;
-
-	// SYNTHETIC: LEGO1 0x1000e3c0
-	// Act3State::`scalar deleting destructor'
-
-	inline undefined4 GetUnknown0x08() { return m_unk0x08; }
-
-private:
-	undefined4 m_unk0x08; // 0x08
-};
-
-#endif // ACT3STATE_H
diff --git a/LEGO1/lego/legoomni/include/ambulance.h b/LEGO1/lego/legoomni/include/ambulance.h
index 0edd9cae..1a92eb78 100644
--- a/LEGO1/lego/legoomni/include/ambulance.h
+++ b/LEGO1/lego/legoomni/include/ambulance.h
@@ -2,8 +2,63 @@
 #define AMBULANCE_H
 
 #include "islepathactor.h"
+#include "legostate.h"
 
-class AmbulanceMissionState;
+// VTABLE: LEGO1 0x100d72a0
+// SIZE 0x24
+class AmbulanceMissionState : public LegoState {
+public:
+	AmbulanceMissionState();
+
+	// FUNCTION: LEGO1 0x10037600
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f00e8
+		return "AmbulanceMissionState";
+	}
+
+	// FUNCTION: LEGO1 0x10037610
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, AmbulanceMissionState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	inline MxU16 GetScore(MxU8 p_id)
+	{
+		switch (p_id) {
+		case 1:
+			return m_score1;
+		case 2:
+			return m_score2;
+		case 3:
+			return m_score3;
+		case 4:
+			return m_score4;
+		case 5:
+			return m_score5;
+		default:
+			return 0;
+		}
+	}
+
+	// SYNTHETIC: LEGO1 0x100376c0
+	// AmbulanceMissionState::`scalar deleting destructor'
+
+	undefined4 m_unk0x08; // 0x08
+	undefined4 m_unk0x0c; // 0x0c
+	MxU16 m_unk0x10;      // 0x10
+	MxU16 m_unk0x12;      // 0x12
+	MxU16 m_unk0x14;      // 0x14
+	MxU16 m_unk0x16;      // 0x16
+	MxU16 m_unk0x18;      // 0x18
+	MxU16 m_score1;       // 0x1a
+	MxU16 m_score2;       // 0x1c
+	MxU16 m_score3;       // 0x1e
+	MxU16 m_score4;       // 0x20
+	MxU16 m_score5;       // 0x22
+};
 
 // VTABLE: LEGO1 0x100d71a8
 // SIZE 0x184
diff --git a/LEGO1/lego/legoomni/include/ambulancemissionstate.h b/LEGO1/lego/legoomni/include/ambulancemissionstate.h
deleted file mode 100644
index 002d2803..00000000
--- a/LEGO1/lego/legoomni/include/ambulancemissionstate.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef AMBULANCEMISSIONSTATE_H
-#define AMBULANCEMISSIONSTATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d72a0
-// SIZE 0x24
-class AmbulanceMissionState : public LegoState {
-public:
-	AmbulanceMissionState();
-
-	// FUNCTION: LEGO1 0x10037600
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f00e8
-		return "AmbulanceMissionState";
-	}
-
-	// FUNCTION: LEGO1 0x10037610
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, AmbulanceMissionState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	inline MxU16 GetScore(MxU8 p_id)
-	{
-		switch (p_id) {
-		case 1:
-			return m_score1;
-		case 2:
-			return m_score2;
-		case 3:
-			return m_score3;
-		case 4:
-			return m_score4;
-		case 5:
-			return m_score5;
-		default:
-			return 0;
-		}
-	}
-
-	// SYNTHETIC: LEGO1 0x100376c0
-	// AmbulanceMissionState::`scalar deleting destructor'
-
-	undefined4 m_unk0x08; // 0x08
-	undefined4 m_unk0x0c; // 0x0c
-	MxU16 m_unk0x10;      // 0x10
-	MxU16 m_unk0x12;      // 0x12
-	MxU16 m_unk0x14;      // 0x14
-	MxU16 m_unk0x16;      // 0x16
-	MxU16 m_unk0x18;      // 0x18
-	MxU16 m_score1;       // 0x1a
-	MxU16 m_score2;       // 0x1c
-	MxU16 m_score3;       // 0x1e
-	MxU16 m_score4;       // 0x20
-	MxU16 m_score5;       // 0x22
-};
-
-#endif // AMBULANCEMISSIONSTATE_H
diff --git a/LEGO1/lego/legoomni/include/animstate.h b/LEGO1/lego/legoomni/include/animstate.h
deleted file mode 100644
index 8f3eda25..00000000
--- a/LEGO1/lego/legoomni/include/animstate.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef ANIMSTATE_H
-#define ANIMSTATE_H
-
-#include "legostate.h"
-
-// SIZE 0x30
-struct ModelInfo {
-	char* m_name;         // 0x00
-	MxU8 m_unk0x04;       // 0x04
-	float m_location[3];  // 0x08
-	float m_direction[3]; // 0x14
-	float m_up[3];        // 0x20
-	MxU8 m_unk0x2c;       // 0x2c
-};
-
-// SIZE 0x30
-struct AnimInfo {
-	char* m_name;        // 0x00
-	MxU32 m_objectId;    // 0x04
-	MxS16 m_location;    // 0x08
-	MxBool m_unk0x0a;    // 0x0a
-	MxU8 m_unk0x0b;      // 0x0b
-	MxU8 m_unk0x0c;      // 0x0c
-	MxU8 m_unk0x0d;      // 0x0d
-	float m_unk0x10[4];  // 0x10
-	MxU8 m_modelCount;   // 0x20
-	MxU16 m_unk0x22;     // 0x22
-	ModelInfo* m_models; // 0x24
-	MxS8 m_unk0x28;      // 0x28
-	MxBool m_unk0x29;    // 0x29
-	MxS8 m_unk0x2a[3];   // 0x2a
-};
-
-// VTABLE: LEGO1 0x100d8d80
-// SIZE 0x1c
-class AnimState : public LegoState {
-public:
-	AnimState();
-	~AnimState() override; // vtable+0x00
-
-	// FUNCTION: LEGO1 0x10065070
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0460
-		return "AnimState";
-	}
-
-	// FUNCTION: LEGO1 0x10065080
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, AnimState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool SetFlag() override;                         // vtable+0x18
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	void FUN_100651d0(MxU32, AnimInfo*, MxU32&);
-	void FUN_10065240(MxU32, AnimInfo*, MxU32);
-
-	// SYNTHETIC: LEGO1 0x10065130
-	// AnimState::`scalar deleting destructor'
-
-private:
-	undefined4 m_unk0x08; // 0x08
-	undefined4 m_unk0x0c; // 0x0c
-	void* m_unk0x10;      // 0x10
-	undefined4 m_unk0x14; // 0x14
-	void* m_unk0x18;      // 0x18
-};
-
-#endif // ANIMSTATE_H
diff --git a/LEGO1/lego/legoomni/include/beachhouseentity.h b/LEGO1/lego/legoomni/include/beachhouseentity.h
deleted file mode 100644
index 34e9db47..00000000
--- a/LEGO1/lego/legoomni/include/beachhouseentity.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef BEACHHOUSEENTITY_H
-#define BEACHHOUSEENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d4a18
-// SIZE 0x68
-class BeachHouseEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ee80
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0314
-		return "BeachHouseEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ee90
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong VTable0x50(MxParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000f970
-	// BeachHouseEntity::`scalar deleting destructor'
-};
-
-#endif // BEACHHOUSEENTITY_H
diff --git a/LEGO1/lego/legoomni/include/buildings.h b/LEGO1/lego/legoomni/include/buildings.h
new file mode 100644
index 00000000..39394628
--- /dev/null
+++ b/LEGO1/lego/legoomni/include/buildings.h
@@ -0,0 +1,166 @@
+#ifndef BUILDINGS_H
+#define BUILDINGS_H
+
+#include "buildingentity.h"
+
+// VTABLE: LEGO1 0x100d48a8
+// SIZE 0x68
+class RaceStandsEntity : public BuildingEntity {
+	// FUNCTION: LEGO1 0x1000efa0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0300
+		return "RaceStandsEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000efb0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong VTable0x50(MxParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000f9e0
+	// RaceStandsEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d4a18
+// SIZE 0x68
+class BeachHouseEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ee80
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0314
+		return "BeachHouseEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ee90
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, BeachHouseEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong VTable0x50(MxParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000f970
+	// BeachHouseEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d4ab0
+// SIZE 0x68
+class PoliceEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ed60
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0328
+		return "PoliceEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ed70
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
+
+	// SYNTHETIC: LEGO1 0x1000f900
+	// PoliceEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d4b90
+// SIZE 0x68
+class InfoCenterEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ea00
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f035c
+		return "InfoCenterEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ea10
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, InfoCenterEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
+
+	// SYNTHETIC: LEGO1 0x1000f7b0
+	// InfoCenterEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d5068
+// SIZE 0x68
+class HospitalEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000ec40
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0338
+		return "HospitalEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000ec50
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
+
+	// SYNTHETIC: LEGO1 0x1000f820
+	// HospitalEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d5200
+// SIZE 0x68
+class JailEntity : public BuildingEntity {
+	// FUNCTION: LEGO1 0x1000f0c0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0300
+		return "RaceStandsEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000f0d0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	// STUB: LEGO1 0x100154f0
+	MxLong VTable0x50(MxParam& p_param) override { return 0; }
+
+	// SYNTHETIC: LEGO1 0x1000fac0
+	// JailEntity::`scalar deleting destructor'
+};
+
+// VTABLE: LEGO1 0x100d5258
+// SIZE 0x68
+class GasStationEntity : public BuildingEntity {
+public:
+	// FUNCTION: LEGO1 0x1000eb20
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0348
+		return "GasStationEntity";
+	}
+
+	// FUNCTION: LEGO1 0x1000eb30
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, GasStationEntity::ClassName()) || BuildingEntity::IsA(p_name);
+	}
+
+	MxLong VTable0x50(MxParam& p_param) override;
+
+	// SYNTHETIC: LEGO1 0x1000f890
+	// GasStationEntity::`scalar deleting destructor'
+};
+
+#endif // BUILDINGS_H
diff --git a/LEGO1/lego/legoomni/include/carrace.h b/LEGO1/lego/legoomni/include/carrace.h
index bb9d6324..67332197 100644
--- a/LEGO1/lego/legoomni/include/carrace.h
+++ b/LEGO1/lego/legoomni/include/carrace.h
@@ -4,6 +4,27 @@
 #include "decomp.h"
 #include "legorace.h"
 
+// VTABLE: LEGO1 0x100d4b70
+// SIZE 0x2c
+class CarRaceState : public RaceState {
+public:
+	// FUNCTION: LEGO1 0x1000dd30
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f009c
+		return "CarRaceState";
+	}
+
+	// FUNCTION: LEGO1 0x1000dd40
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, CarRaceState::ClassName()) || RaceState::IsA(p_name);
+	}
+
+	// SYNTHETIC: LEGO1 0x1000f740
+	// CarRaceState::`scalar deleting destructor'
+};
+
 // VTABLE: LEGO1 0x100d5e50
 // SIZE 0x154
 class CarRace : public LegoRace {
diff --git a/LEGO1/lego/legoomni/include/carracestate.h b/LEGO1/lego/legoomni/include/carracestate.h
deleted file mode 100644
index c7a1e376..00000000
--- a/LEGO1/lego/legoomni/include/carracestate.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef CARRACESTATE_H
-#define CARRACESTATE_H
-
-#include "racestate.h"
-
-// VTABLE: LEGO1 0x100d4b70
-// SIZE 0x2c
-class CarRaceState : public RaceState {
-public:
-	// FUNCTION: LEGO1 0x1000dd30
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f009c
-		return "CarRaceState";
-	}
-
-	// FUNCTION: LEGO1 0x1000dd40
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, CarRaceState::ClassName()) || RaceState::IsA(p_name);
-	}
-
-	// SYNTHETIC: LEGO1 0x1000f740
-	// CarRaceState::`scalar deleting destructor'
-};
-
-#endif // CARRACESTATE_H
diff --git a/LEGO1/lego/legoomni/include/caveentity.h b/LEGO1/lego/legoomni/include/caveentity.h
index 24b9759f..308f35bc 100644
--- a/LEGO1/lego/legoomni/include/caveentity.h
+++ b/LEGO1/lego/legoomni/include/caveentity.h
@@ -1,7 +1,7 @@
 #ifndef CAVEENTITY_H
 #define CAVEENTITY_H
 
-#include "racestandsentity.h"
+#include "buildings.h"
 
 // No overrides, uses vtable from RaceStandsEntity
 // SIZE 0x68
diff --git a/LEGO1/lego/legoomni/include/gasstation.h b/LEGO1/lego/legoomni/include/gasstation.h
index 0709f0ad..6a37db84 100644
--- a/LEGO1/lego/legoomni/include/gasstation.h
+++ b/LEGO1/lego/legoomni/include/gasstation.h
@@ -3,12 +3,55 @@
 
 #include "decomp.h"
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 #include "radio.h"
 
-class GasStationState;
 class MxStillPresenter;
 
+// VTABLE: LEGO1 0x100d46e0
+// SIZE 0x24
+class GasStationState : public LegoState {
+public:
+	// SIZE 0x04
+	struct Unknown0x14 {
+		undefined4 m_unk0x00; // 0x00
+	};
+
+	GasStationState();
+
+	// FUNCTION: LEGO1 0x100061d0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0174
+		return "GasStationState";
+	}
+
+	// FUNCTION: LEGO1 0x100061e0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	// SYNTHETIC: LEGO1 0x10006290
+	// GasStationState::`scalar deleting destructor'
+
+	void FUN_10006430(undefined4);
+	void FUN_10006490();
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	undefined4 m_unk0x08[3]; // 0x08
+	Unknown0x14 m_unk0x14;   // 0x14
+	MxS16 m_unk0x18;         // 0x18
+	MxS16 m_unk0x1a;         // 0x1a
+	MxS16 m_unk0x1c;         // 0x1c
+	MxS16 m_unk0x1e;         // 0x1e
+	MxS16 m_unk0x20;         // 0x20
+};
+
 // VTABLE: LEGO1 0x100d4650
 // SIZE 0x128
 class GasStation : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/gasstationentity.h b/LEGO1/lego/legoomni/include/gasstationentity.h
deleted file mode 100644
index 1b25cfd2..00000000
--- a/LEGO1/lego/legoomni/include/gasstationentity.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef GASSTATIONENTITY_H
-#define GASSTATIONENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d5258
-// SIZE 0x68
-class GasStationEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000eb20
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0348
-		return "GasStationEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000eb30
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, GasStationEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong VTable0x50(MxParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000f890
-	// GasStationEntity::`scalar deleting destructor'
-};
-
-#endif // GASSTATIONENTITY_H
diff --git a/LEGO1/lego/legoomni/include/gasstationstate.h b/LEGO1/lego/legoomni/include/gasstationstate.h
deleted file mode 100644
index bf0327da..00000000
--- a/LEGO1/lego/legoomni/include/gasstationstate.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef GASSTATIONSTATE_H
-#define GASSTATIONSTATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d46e0
-// SIZE 0x24
-class GasStationState : public LegoState {
-public:
-	// SIZE 0x04
-	struct Unknown0x14 {
-		undefined4 m_unk0x00; // 0x00
-	};
-
-	GasStationState();
-
-	// FUNCTION: LEGO1 0x100061d0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0174
-		return "GasStationState";
-	}
-
-	// FUNCTION: LEGO1 0x100061e0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	// SYNTHETIC: LEGO1 0x10006290
-	// GasStationState::`scalar deleting destructor'
-
-	void FUN_10006430(undefined4);
-	void FUN_10006490();
-
-	friend class GasStation;
-
-private:
-	undefined4 m_unk0x08[3]; // 0x08
-	Unknown0x14 m_unk0x14;   // 0x14
-	MxS16 m_unk0x18;         // 0x18
-	MxS16 m_unk0x1a;         // 0x1a
-	MxS16 m_unk0x1c;         // 0x1c
-	MxS16 m_unk0x1e;         // 0x1e
-	MxS16 m_unk0x20;         // 0x20
-};
-
-#endif // GASSTATIONSTATE_H
diff --git a/LEGO1/lego/legoomni/include/helicopter.h b/LEGO1/lego/legoomni/include/helicopter.h
index 638f9287..dd9451c0 100644
--- a/LEGO1/lego/legoomni/include/helicopter.h
+++ b/LEGO1/lego/legoomni/include/helicopter.h
@@ -2,9 +2,46 @@
 #define HELICOPTER_H
 
 #include "islepathactor.h"
+#include "legostate.h"
 #include "realtime/matrix.h"
 
-class HelicopterState;
+// VTABLE: LEGO1 0x100d5418
+// SIZE 0x0c
+class HelicopterState : public LegoState {
+public:
+	// FUNCTION: LEGO1 0x1000e0d0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0144
+		return "HelicopterState";
+	}
+
+	// FUNCTION: LEGO1 0x1000e0e0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	// FUNCTION: LEGO1 0x1000e0b0
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
+	// FUNCTION: LEGO1 0x1000e0c0
+	MxBool SetFlag() override
+	{
+		m_unk0x08 = 0;
+		return TRUE;
+	} // vtable+0x18
+
+	inline void SetUnknown8(MxU32 p_unk0x08) { m_unk0x08 = p_unk0x08; }
+	inline MxU32 GetUnkown8() { return m_unk0x08; }
+
+	// SYNTHETIC: LEGO1 0x1000e190
+	// HelicopterState::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	MxU32 m_unk0x08; // 0x08
+};
 
 // VTABLE: LEGO1 0x100d40f8
 // SIZE 0x230
diff --git a/LEGO1/lego/legoomni/include/helicopterstate.h b/LEGO1/lego/legoomni/include/helicopterstate.h
deleted file mode 100644
index 7bda248f..00000000
--- a/LEGO1/lego/legoomni/include/helicopterstate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef HELICOPTERSTATE_H
-#define HELICOPTERSTATE_H
-
-#include "decomp.h"
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d5418
-// SIZE 0x0c
-class HelicopterState : public LegoState {
-public:
-	// FUNCTION: LEGO1 0x1000e0d0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0144
-		return "HelicopterState";
-	}
-
-	// FUNCTION: LEGO1 0x1000e0e0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	// FUNCTION: LEGO1 0x1000e0b0
-	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
-
-	// FUNCTION: LEGO1 0x1000e0c0
-	MxBool SetFlag() override
-	{
-		m_unk0x08 = 0;
-		return TRUE;
-	} // vtable+0x18
-
-	inline void SetUnknown8(MxU32 p_unk0x08) { m_unk0x08 = p_unk0x08; }
-	inline MxU32 GetUnkown8() { return m_unk0x08; }
-
-	// SYNTHETIC: LEGO1 0x1000e190
-	// HelicopterState::`scalar deleting destructor'
-
-protected:
-	MxU32 m_unk0x08; // 0x08
-};
-
-#endif // HELICOPTERSTATE_H
diff --git a/LEGO1/lego/legoomni/include/hospital.h b/LEGO1/lego/legoomni/include/hospital.h
index 014e872d..32377fe3 100644
--- a/LEGO1/lego/legoomni/include/hospital.h
+++ b/LEGO1/lego/legoomni/include/hospital.h
@@ -4,13 +4,54 @@
 #include "actionsfwd.h"
 #include "decomp.h"
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 
-class HospitalState;
 class LegoControlManagerEvent;
 class MxEndActionNotificationParam;
 class MxStillPresenter;
 
+// VTABLE: LEGO1 0x100d97a0
+// SIZE 0x18
+class HospitalState : public LegoState {
+public:
+	// SIZE 0x04
+	struct Unknown0x08 {
+		undefined4 m_unk0x00; // 0x00
+	};
+
+	HospitalState();
+	~HospitalState() override {}
+
+	// FUNCTION: LEGO1 0x10076400
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0480
+		return "HospitalState";
+	}
+
+	// FUNCTION: LEGO1 0x10076410
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	// SYNTHETIC: LEGO1 0x100764c0
+	// HospitalState::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	Unknown0x08 m_unk0x08; // 0x08
+	MxS16 m_unk0x0c;       // 0x0c
+	MxS16 m_unk0x0e;       // 0x0e
+	MxS16 m_unk0x10;       // 0x10
+	MxS16 m_unk0x12;       // 0x12
+	MxS16 m_unk0x14;       // 0x14
+	MxS16 m_unk0x16;       // 0x16
+};
+
 // VTABLE: LEGO1 0x100d9730
 // SIZE 0x12c
 class Hospital : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/hospitalentity.h b/LEGO1/lego/legoomni/include/hospitalentity.h
deleted file mode 100644
index 3dbe7d54..00000000
--- a/LEGO1/lego/legoomni/include/hospitalentity.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef HOSPITALENTITY_H
-#define HOSPITALENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d5068
-// SIZE 0x68
-class HospitalEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ec40
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0338
-		return "HospitalEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ec50
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, HospitalEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
-
-	// SYNTHETIC: LEGO1 0x1000f820
-	// HospitalEntity::`scalar deleting destructor'
-};
-
-#endif // HOSPITALENTITY_H
diff --git a/LEGO1/lego/legoomni/include/hospitalstate.h b/LEGO1/lego/legoomni/include/hospitalstate.h
deleted file mode 100644
index 16d80cb6..00000000
--- a/LEGO1/lego/legoomni/include/hospitalstate.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef HOSPITALSTATE_H
-#define HOSPITALSTATE_H
-
-#include "decomp.h"
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d97a0
-// SIZE 0x18
-class HospitalState : public LegoState {
-public:
-	// SIZE 0x04
-	struct Unknown0x08 {
-		undefined4 m_unk0x00; // 0x00
-	};
-
-	HospitalState();
-	~HospitalState() override {}
-
-	// FUNCTION: LEGO1 0x10076400
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0480
-		return "HospitalState";
-	}
-
-	// FUNCTION: LEGO1 0x10076410
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	// SYNTHETIC: LEGO1 0x100764c0
-	// HospitalState::`scalar deleting destructor'
-
-	friend class Hospital;
-
-private:
-	Unknown0x08 m_unk0x08; // 0x08
-	MxS16 m_unk0x0c;       // 0x0c
-	MxS16 m_unk0x0e;       // 0x0e
-	MxS16 m_unk0x10;       // 0x10
-	MxS16 m_unk0x12;       // 0x12
-	MxS16 m_unk0x14;       // 0x14
-	MxS16 m_unk0x16;       // 0x16
-};
-
-#endif // HOSPITALSTATE_H
diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h
index 08bb9a2c..7d805246 100644
--- a/LEGO1/lego/legoomni/include/infocenter.h
+++ b/LEGO1/lego/legoomni/include/infocenter.h
@@ -3,15 +3,65 @@
 
 #include "actionsfwd.h"
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 #include "mxrect32.h"
 #include "radio.h"
 
-class InfocenterState;
 class MxNotificationParam;
 class MxStillPresenter;
 class LegoControlManagerEvent;
 
+// VTABLE: LEGO1 0x100d93a8
+// SIZE 0x94
+class InfocenterState : public LegoState {
+public:
+	InfocenterState();
+	~InfocenterState() override;
+
+	// FUNCTION: LEGO1 0x10071840
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f04dc
+		return "InfocenterState";
+	}
+
+	// FUNCTION: LEGO1 0x10071850
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, InfocenterState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	// FUNCTION: LEGO1 0x10071830
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
+	inline MxS16 GetMaxNameLength() { return sizeOfArray(m_letters); }
+	inline MxStillPresenter* GetNameLetter(MxS32 p_index) { return m_letters[p_index]; }
+	inline void SetNameLetter(MxS32 p_index, MxStillPresenter* p_letter) { m_letters[p_index] = p_letter; }
+	inline MxBool HasRegistered() { return m_letters[0] != NULL; }
+	inline Playlist& GetExitDialogueAct1() { return m_exitDialogueAct1; }
+	inline Playlist& GetExitDialogueAct23() { return m_exitDialogueAct23; }
+	inline Playlist& GetReturnDialogue(LegoGameState::Act p_act) { return m_returnDialogue[p_act]; }
+	inline Playlist& GetLeaveDialogue(LegoGameState::Act p_act) { return m_leaveDialogue[p_act]; }
+	inline Playlist& GetBricksterDialogue() { return m_bricksterDialogue; }
+	inline MxU32 GetUnknown0x74() { return m_unk0x74; }
+
+	inline void SetUnknown0x74(MxU32 p_unk0x74) { m_unk0x74 = p_unk0x74; }
+
+	// SYNTHETIC: LEGO1 0x10071900
+	// InfocenterState::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	Playlist m_exitDialogueAct1;    // 0x08
+	Playlist m_exitDialogueAct23;   // 0x14
+	Playlist m_returnDialogue[3];   // 0x20
+	Playlist m_leaveDialogue[3];    // 0x44
+	Playlist m_bricksterDialogue;   // 0x68
+	MxU32 m_unk0x74;                // 0x74
+	MxStillPresenter* m_letters[7]; // 0x78
+};
+
 // SIZE 0x18
 struct InfocenterMapEntry {
 	// FUNCTION: LEGO1 0x1006ec80
diff --git a/LEGO1/lego/legoomni/include/infocenterentity.h b/LEGO1/lego/legoomni/include/infocenterentity.h
deleted file mode 100644
index 82fa3d30..00000000
--- a/LEGO1/lego/legoomni/include/infocenterentity.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef INFOCENTERENTITY_H
-#define INFOCENTERENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d4b90
-// SIZE 0x68
-class InfoCenterEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ea00
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f035c
-		return "InfoCenterEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ea10
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, InfoCenterEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
-
-	// SYNTHETIC: LEGO1 0x1000f7b0
-	// InfoCenterEntity::`scalar deleting destructor'
-};
-
-#endif // INFOCENTERENTITY_H
diff --git a/LEGO1/lego/legoomni/include/infocenterstate.h b/LEGO1/lego/legoomni/include/infocenterstate.h
deleted file mode 100644
index b1c418f1..00000000
--- a/LEGO1/lego/legoomni/include/infocenterstate.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef INFOCENTERSTATE_H
-#define INFOCENTERSTATE_H
-
-#include "decomp.h"
-#include "legogamestate.h"
-#include "legostate.h"
-
-class MxStillPresenter;
-
-// VTABLE: LEGO1 0x100d93a8
-// SIZE 0x94
-class InfocenterState : public LegoState {
-public:
-	InfocenterState();
-	~InfocenterState() override;
-
-	// FUNCTION: LEGO1 0x10071840
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f04dc
-		return "InfocenterState";
-	}
-
-	// FUNCTION: LEGO1 0x10071850
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, InfocenterState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	// FUNCTION: LEGO1 0x10071830
-	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
-
-	inline MxS16 GetMaxNameLength() { return sizeOfArray(m_letters); }
-	inline MxStillPresenter* GetNameLetter(MxS32 p_index) { return m_letters[p_index]; }
-	inline void SetNameLetter(MxS32 p_index, MxStillPresenter* p_letter) { m_letters[p_index] = p_letter; }
-	inline MxBool HasRegistered() { return m_letters[0] != NULL; }
-	inline Playlist& GetExitDialogueAct1() { return m_exitDialogueAct1; }
-	inline Playlist& GetExitDialogueAct23() { return m_exitDialogueAct23; }
-	inline Playlist& GetReturnDialogue(LegoGameState::Act p_act) { return m_returnDialogue[p_act]; }
-	inline Playlist& GetLeaveDialogue(LegoGameState::Act p_act) { return m_leaveDialogue[p_act]; }
-	inline Playlist& GetBricksterDialogue() { return m_bricksterDialogue; }
-	inline MxU32 GetUnknown0x74() { return m_unk0x74; }
-
-	inline void SetUnknown0x74(MxU32 p_unk0x74) { m_unk0x74 = p_unk0x74; }
-
-	// SYNTHETIC: LEGO1 0x10071900
-	// InfocenterState::`scalar deleting destructor'
-
-private:
-	Playlist m_exitDialogueAct1;    // 0x08
-	Playlist m_exitDialogueAct23;   // 0x14
-	Playlist m_returnDialogue[3];   // 0x20
-	Playlist m_leaveDialogue[3];    // 0x44
-	Playlist m_bricksterDialogue;   // 0x68
-	MxU32 m_unk0x74;                // 0x74
-	MxStillPresenter* m_letters[7]; // 0x78
-};
-
-#endif // INFOCENTERSTATE_H
diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h
index e9d4da42..8af16007 100644
--- a/LEGO1/lego/legoomni/include/isle.h
+++ b/LEGO1/lego/legoomni/include/isle.h
@@ -3,16 +3,17 @@
 
 #include "actionsfwd.h"
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 #include "radio.h"
 
-class Act1State;
 class Ambulance;
 class Bike;
 class DuneBuggy;
 class Helicopter;
 class Jetski;
 class JukeBoxEntity;
+class LegoNamedTexture;
 class Motocycle;
 class MxType19NotificationParam;
 class Pizza;
@@ -21,6 +22,132 @@ class RaceCar;
 class SkateBoard;
 class TowTrack;
 
+// VTABLE: LEGO1 0x100d7028
+// SIZE 0x26c
+class Act1State : public LegoState {
+public:
+	enum ElevatorFloor {
+		c_floor1 = 1,
+		c_floor2,
+		c_floor3
+	};
+
+	enum {
+		e_unk953 = 953,
+		e_unk954 = 954,
+		e_unk955 = 955,
+	};
+
+	// SIZE 0x4c
+	class NamedPlane {
+	public:
+		// FUNCTION: LEGO1 0x10033800
+		NamedPlane() {}
+
+		inline void SetName(const char* p_name) { m_name = p_name; }
+		inline const MxString* GetName() const { return &m_name; }
+
+		// FUNCTION: LEGO1 0x100344d0
+		MxResult Serialize(LegoFile* p_file)
+		{
+			if (p_file->IsWriteMode()) {
+				p_file->WriteString(m_name);
+				p_file->WriteVector3(m_point1);
+				p_file->WriteVector3(m_point2);
+				p_file->WriteVector3(m_point3);
+			}
+			else if (p_file->IsReadMode()) {
+				p_file->ReadString(m_name);
+				p_file->ReadVector3(m_point1);
+				p_file->ReadVector3(m_point2);
+				p_file->ReadVector3(m_point3);
+			}
+
+			return SUCCESS;
+		}
+
+	private:
+		MxString m_name;         // 0x00
+		Mx3DPointFloat m_point1; // 0x10
+		Mx3DPointFloat m_point2; // 0x24
+		Mx3DPointFloat m_point3; // 0x38
+	};
+
+	Act1State();
+
+	// FUNCTION: LEGO1 0x100338a0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0154
+		return "Act1State";
+	}
+
+	// FUNCTION: LEGO1 0x100338b0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, Act1State::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxBool SetFlag() override;                         // vtable+0x18
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	void FUN_10034660();
+	void FUN_100346a0();
+	void FUN_10034b60();
+	void FUN_10034d00();
+
+	inline MxU32 GetUnknown18() { return m_unk0x018; }
+	inline ElevatorFloor GetElevatorFloor() { return (ElevatorFloor) m_elevFloor; }
+	inline MxU8 GetUnknown21() { return m_unk0x021; }
+
+	inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x018 = p_unk0x18; }
+	inline void SetElevatorFloor(ElevatorFloor p_elevFloor) { m_elevFloor = p_elevFloor; }
+	inline void SetUnknown21(MxU8 p_unk0x21) { m_unk0x021 = p_unk0x21; }
+
+	// SYNTHETIC: LEGO1 0x10033960
+	// Act1State::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	MxS32* m_unk0x008;            // 0x008 FIXME: count for m_unk0x008
+	MxS16 m_unk0x00c;             // 0x00c
+	undefined2 m_unk0x00e;        // 0x00e
+	undefined2 m_unk0x010;        // 0x010
+	undefined m_unk0x012;         // 0x012
+	MxS32 m_unk0x014;             // 0x014
+	MxU32 m_unk0x018;             // 0x018
+	MxS16 m_elevFloor;            // 0x01c
+	MxBool m_unk0x01e;            // 0x01e
+	MxBool m_unk0x01f;            // 0x01f
+	MxBool m_planeActive;         // 0x020
+	undefined m_unk0x021;         // 0x021
+	MxBool m_unk0x022;            // 0x022
+	undefined m_unk0x023;         // 0x023
+	NamedPlane m_unk0x024;        // 0x024
+	NamedPlane m_unk0x070;        // 0x070
+	NamedPlane m_unk0x0bc;        // 0x0bc
+	NamedPlane m_unk0x108;        // 0x108
+	LegoNamedTexture* m_unk0x154; // 0x154
+	LegoNamedTexture* m_unk0x158; // 0x158
+	LegoNamedTexture* m_unk0x15c; // 0x15c
+	MxCore* m_unk0x160;           // 0x160
+	NamedPlane m_unk0x164;        // 0x164
+	LegoNamedTexture* m_unk0x1b0; // 0x1b0
+	LegoNamedTexture* m_unk0x1b4; // 0x1b4
+	MxCore* m_unk0x1b8;           // 0x1b8
+	NamedPlane m_unk0x1bc;        // 0x1bc
+	LegoNamedTexture* m_unk0x208; // 0x208
+	MxCore* m_unk0x20c;           // 0x20c
+	NamedPlane m_unk0x210;        // 0x210
+	LegoNamedTexture* m_unk0x25c; // 0x25c
+	LegoNamedTexture* m_unk0x260; // 0x260
+	LegoNamedTexture* m_unk0x264; // 0x264
+	MxCore* m_unk0x268;           // 0x268
+};
+
+// FUNCTION: LEGO1 0x10033a70
+// Act1State::NamedPlane::~NamedPlane
+
 // VTABLE: LEGO1 0x100d6fb8
 // SIZE 0x140
 class Isle : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/jailentity.h b/LEGO1/lego/legoomni/include/jailentity.h
deleted file mode 100644
index adf7089a..00000000
--- a/LEGO1/lego/legoomni/include/jailentity.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef JAILENTITY_H
-#define JAILENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d5200
-// SIZE 0x68
-class JailEntity : public BuildingEntity {
-	// FUNCTION: LEGO1 0x1000f0c0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0300
-		return "RaceStandsEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000f0d0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, JailEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	// STUB: LEGO1 0x100154f0
-	MxLong VTable0x50(MxParam& p_param) override { return 0; }
-
-	// SYNTHETIC: LEGO1 0x1000fac0
-	// JailEntity::`scalar deleting destructor'
-};
-
-#endif // JAILENTITY_H
diff --git a/LEGO1/lego/legoomni/include/jetskirace.h b/LEGO1/lego/legoomni/include/jetskirace.h
index 7f17a1fc..b51496c4 100644
--- a/LEGO1/lego/legoomni/include/jetskirace.h
+++ b/LEGO1/lego/legoomni/include/jetskirace.h
@@ -3,6 +3,27 @@
 
 #include "legorace.h"
 
+// VTABLE: LEGO1 0x100d4fa8
+// SIZE 0x2c
+class JetskiRaceState : public RaceState {
+public:
+	// FUNCTION: LEGO1 0x1000dc40
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f00ac
+		return "JetskiRaceState";
+	}
+
+	// FUNCTION: LEGO1 0x1000dc50
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
+	}
+
+	// SYNTHETIC: LEGO1 0x1000f680
+	// JetskiRaceState::`scalar deleting destructor'
+};
+
 // VTABLE: LEGO1 0x100d4fe8
 // SIZE 0x144
 class JetskiRace : public LegoRace {
diff --git a/LEGO1/lego/legoomni/include/jetskiracestate.h b/LEGO1/lego/legoomni/include/jetskiracestate.h
deleted file mode 100644
index 812a0a0f..00000000
--- a/LEGO1/lego/legoomni/include/jetskiracestate.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef JETSKIRACESTATE_H
-#define JETSKIRACESTATE_H
-
-#include "racestate.h"
-
-// VTABLE: LEGO1 0x100d4fa8
-// SIZE 0x2c
-class JetskiRaceState : public RaceState {
-public:
-	// FUNCTION: LEGO1 0x1000dc40
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f00ac
-		return "JetskiRaceState";
-	}
-
-	// FUNCTION: LEGO1 0x1000dc50
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, JetskiRaceState::ClassName()) || RaceState::IsA(p_name);
-	}
-
-	// SYNTHETIC: LEGO1 0x1000f680
-	// JetskiRaceState::`scalar deleting destructor'
-};
-
-#endif // JETSKIRACESTATE_H
diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h
index 2ee17f37..8b624191 100644
--- a/LEGO1/lego/legoomni/include/jukebox.h
+++ b/LEGO1/lego/legoomni/include/jukebox.h
@@ -3,10 +3,46 @@
 
 #include "decomp.h"
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 
 class LegoControlManagerEvent;
-class JukeBoxState;
+
+// VTABLE: LEGO1 0x100d4a90
+// SIZE 0x10
+class JukeBoxState : public LegoState {
+public:
+	enum Music {
+		e_pasquell = 0,
+		e_right,
+		e_decal,
+		e_wallis,
+		e_nelson,
+		e_torpedos
+	};
+
+	// FUNCTION: LEGO1 0x1000f310
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f02bc
+		return "JukeBoxState";
+	}
+
+	// FUNCTION: LEGO1 0x1000f320
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		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'
+
+	Music m_music;  // 0x08
+	MxU32 m_active; // 0x0c
+};
 
 // VTABLE: LEGO1 0x100d8958
 // SIZE 0x104
diff --git a/LEGO1/lego/legoomni/include/jukeboxstate.h b/LEGO1/lego/legoomni/include/jukeboxstate.h
deleted file mode 100644
index d9da3b84..00000000
--- a/LEGO1/lego/legoomni/include/jukeboxstate.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef JUKEBOXSTATE_H
-#define JUKEBOXSTATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d4a90
-// SIZE 0x10
-class JukeBoxState : public LegoState {
-public:
-	enum Music {
-		e_pasquell = 0,
-		e_right,
-		e_decal,
-		e_wallis,
-		e_nelson,
-		e_torpedos
-	};
-
-	// FUNCTION: LEGO1 0x1000f310
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f02bc
-		return "JukeBoxState";
-	}
-
-	// FUNCTION: LEGO1 0x1000f320
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, JukeBoxState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool IsSerializable() override; // vtable+0x14
-
-	// SYNTHETIC: LEGO1 0x1000f3d0
-	// JukeBoxState::`scalar deleting destructor'
-
-	Music m_music;  // 0x08
-	MxU32 m_active; // 0x0c
-};
-
-#endif // JUKEBOXSTATE_H
diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h
index b84fada3..735e31c2 100644
--- a/LEGO1/lego/legoomni/include/legoact2.h
+++ b/LEGO1/lego/legoomni/include/legoact2.h
@@ -2,8 +2,43 @@
 #define LEGOACT2_H
 
 #include "act2brick.h"
+#include "legostate.h"
 #include "legoworld.h"
 
+// VTABLE: LEGO1 0x100d4a70
+// SIZE 0x10
+class LegoAct2State : public LegoState {
+public:
+	~LegoAct2State() override {}
+
+	// FUNCTION: LEGO1 0x1000df80
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0428
+		return "LegoAct2State";
+	}
+
+	// FUNCTION: LEGO1 0x1000df90
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		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'
+
+	inline undefined4 GetUnknown0x08() { return m_unk0x08; }
+	inline void SetUnknown0x0c(undefined p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	undefined4 m_unk0x08; // 0x08
+	undefined m_unk0x0c;  // 0x0c
+};
+
 // VTABLE: LEGO1 0x100d82e0
 // SIZE 0x1154
 class LegoAct2 : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/legoact2state.h b/LEGO1/lego/legoomni/include/legoact2state.h
deleted file mode 100644
index 5f046e74..00000000
--- a/LEGO1/lego/legoomni/include/legoact2state.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef LEGOACT2STATE_H
-#define LEGOACT2STATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d4a70
-// SIZE 0x10
-class LegoAct2State : public LegoState {
-public:
-	~LegoAct2State() override {}
-
-	// FUNCTION: LEGO1 0x1000df80
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0428
-		return "LegoAct2State";
-	}
-
-	// FUNCTION: LEGO1 0x1000df90
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool IsSerializable() override; // vtable+0x14
-
-	// SYNTHETIC: LEGO1 0x1000e040
-	// LegoAct2State::`scalar deleting destructor'
-
-	inline undefined4 GetUnknown0x08() { return m_unk0x08; }
-	inline void SetUnknown0x0c(undefined p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
-
-private:
-	undefined4 m_unk0x08; // 0x08
-	undefined m_unk0x0c;  // 0x0c
-};
-
-#endif // LEGOACT2STATE_H
diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h
index e118cbf5..8e473077 100644
--- a/LEGO1/lego/legoomni/include/legoanimationmanager.h
+++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h
@@ -4,11 +4,11 @@
 #include "actionsfwd.h"
 #include "decomp.h"
 #include "legolocations.h"
+#include "legostate.h"
 #include "legotraninfolist.h"
 #include "mxcore.h"
 #include "mxgeometry/mxgeometry3d.h"
 
-class AnimState;
 class LegoAnimPresenter;
 class LegoEntity;
 class LegoExtraActor;
@@ -18,9 +18,73 @@ class LegoPathBoundary;
 class LegoROIList;
 struct LegoUnknown100db7f4;
 class LegoWorld;
-struct ModelInfo;
 class MxDSAction;
 
+// SIZE 0x30
+struct ModelInfo {
+	char* m_name;         // 0x00
+	MxU8 m_unk0x04;       // 0x04
+	float m_location[3];  // 0x08
+	float m_direction[3]; // 0x14
+	float m_up[3];        // 0x20
+	MxU8 m_unk0x2c;       // 0x2c
+};
+
+// SIZE 0x30
+struct AnimInfo {
+	char* m_name;        // 0x00
+	MxU32 m_objectId;    // 0x04
+	MxS16 m_location;    // 0x08
+	MxBool m_unk0x0a;    // 0x0a
+	MxU8 m_unk0x0b;      // 0x0b
+	MxU8 m_unk0x0c;      // 0x0c
+	MxU8 m_unk0x0d;      // 0x0d
+	float m_unk0x10[4];  // 0x10
+	MxU8 m_modelCount;   // 0x20
+	MxU16 m_unk0x22;     // 0x22
+	ModelInfo* m_models; // 0x24
+	MxS8 m_unk0x28;      // 0x28
+	MxBool m_unk0x29;    // 0x29
+	MxS8 m_unk0x2a[3];   // 0x2a
+};
+
+// VTABLE: LEGO1 0x100d8d80
+// SIZE 0x1c
+class AnimState : public LegoState {
+public:
+	AnimState();
+	~AnimState() override; // vtable+0x00
+
+	// FUNCTION: LEGO1 0x10065070
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0460
+		return "AnimState";
+	}
+
+	// FUNCTION: LEGO1 0x10065080
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, AnimState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxBool SetFlag() override;                         // vtable+0x18
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	void FUN_100651d0(MxU32, AnimInfo*, MxU32&);
+	void FUN_10065240(MxU32, AnimInfo*, MxU32);
+
+	// SYNTHETIC: LEGO1 0x10065130
+	// AnimState::`scalar deleting destructor'
+
+private:
+	undefined4 m_unk0x08; // 0x08
+	undefined4 m_unk0x0c; // 0x0c
+	void* m_unk0x10;      // 0x10
+	undefined4 m_unk0x14; // 0x14
+	void* m_unk0x18;      // 0x18
+};
+
 // VTABLE: LEGO1 0x100d8c18
 // SIZE 0x500
 class LegoAnimationManager : public MxCore {
diff --git a/LEGO1/lego/legoomni/include/legocarbuild.h b/LEGO1/lego/legoomni/include/legocarbuild.h
index bd86964e..ed486c9f 100644
--- a/LEGO1/lego/legoomni/include/legocarbuild.h
+++ b/LEGO1/lego/legoomni/include/legocarbuild.h
@@ -1,8 +1,54 @@
 #ifndef LEGOCARBUILD_H
 #define LEGOCARBUILD_H
 
+#include "legostate.h"
 #include "legoworld.h"
 
+// VTABLE: LEGO1 0x100d66e0
+// SIZE 0x50
+class LegoVehicleBuildState : public LegoState {
+public:
+	LegoVehicleBuildState(char* p_classType);
+
+	// FUNCTION: LEGO1 0x10025ff0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		return this->m_className.GetData();
+	}
+
+	// FUNCTION: LEGO1 0x10026000
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	// SYNTHETIC: LEGO1 0x100260a0
+	// LegoVehicleBuildState::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	Playlist m_unk0x08[4]; // 0x08
+
+	// This can be one of the following:
+	// * LegoRaceCarBuildState
+	// * LegoCopterBuildState
+	// * LegoDuneCarBuildState
+	// * LegoJetskiBuildState
+	MxString m_className; // 0x38
+
+	// Known States:
+	// * 1 == enter(ing) build screen
+	// * 3 == cutscene/dialogue
+	// * 6 == exit(ing) build screen
+	MxU32 m_animationState; // 0x48
+	undefined m_unk0x4c;    // 0x4c
+	MxBool m_unk0x4d;       // 0x4d
+	MxBool m_unk0x4e;       // 0x4e
+	MxU8 m_placedPartCount; // 0x4f
+};
+
 // VTABLE: LEGO1 0x100d6658
 // SIZE 0x34c
 class LegoCarBuild : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h b/LEGO1/lego/legoomni/include/legocarbuildpresenter.h
similarity index 93%
rename from LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h
rename to LEGO1/lego/legoomni/include/legocarbuildpresenter.h
index d4c12d76..69afdebf 100644
--- a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h
+++ b/LEGO1/lego/legoomni/include/legocarbuildpresenter.h
@@ -1,5 +1,5 @@
-#ifndef LEGOCARBUILDANIMPRESENTER_H
-#define LEGOCARBUILDANIMPRESENTER_H
+#ifndef LEGOCARBUILDPRESENTER_H
+#define LEGOCARBUILDPRESENTER_H
 
 #include "anim/legoanim.h"
 #include "legoanimpresenter.h"
@@ -59,4 +59,4 @@ private:
 	undefined4 m_unk0x14c; // 0x14c
 };
 
-#endif // LEGOCARBUILDANIMPRESENTER_H
+#endif // LEGOCARBUILDPRESENTER_H
diff --git a/LEGO1/lego/legoomni/include/legorace.h b/LEGO1/lego/legoomni/include/legorace.h
index f99f7e28..76282d0b 100644
--- a/LEGO1/lego/legoomni/include/legorace.h
+++ b/LEGO1/lego/legoomni/include/legorace.h
@@ -2,10 +2,60 @@
 #define LEGORACE_H
 
 #include "decomp.h"
+#include "legostate.h"
 #include "legoworld.h"
 #include "mxrect32.h"
 #include "mxtypes.h"
 
+// VTABLE: LEGO1 0x100d5e30
+// SIZE 0x2c
+class RaceState : public LegoState {
+public:
+	// SIZE 0x06
+	struct Entry {
+	public:
+		inline MxS16 GetUnknown0x02() { return m_unk0x02; }
+		inline MxU16 GetScore() { return m_score; }
+
+		// TODO: Possibly private
+		MxU8 m_id;       // 0x00
+		MxS16 m_unk0x02; // 0x02
+		MxU16 m_score;   // 0x04
+	};
+
+	RaceState();
+
+	// FUNCTION: LEGO1 0x10016010
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f07d0
+		return "RaceState";
+	}
+
+	// FUNCTION: LEGO1 0x10016020
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	Entry* GetState(MxU8 p_id);
+
+	inline undefined4 GetUnknown0x28() { return m_unk0x28; }
+
+	// SYNTHETIC: LEGO1 0x1000f6f0
+	// RaceState::~RaceState
+
+	// SYNTHETIC: LEGO1 0x100160d0
+	// RaceState::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	Entry m_state[5];     // 0x08
+	undefined4 m_unk0x28; // 0x28
+};
+
 // VTABLE: LEGO1 0x100d5db0
 // SIZE 0x144
 class LegoRace : public LegoWorld {
diff --git a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h
deleted file mode 100644
index 7a70a873..00000000
--- a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef LEGOVEHICLEBUILDSTATE_H
-#define LEGOVEHICLEBUILDSTATE_H
-
-#include "decomp.h"
-#include "legostate.h"
-#include "mxstring.h"
-
-// VTABLE: LEGO1 0x100d66e0
-// SIZE 0x50
-class LegoVehicleBuildState : public LegoState {
-public:
-	LegoVehicleBuildState(char* p_classType);
-
-	// FUNCTION: LEGO1 0x10025ff0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		return this->m_className.GetData();
-	}
-
-	// FUNCTION: LEGO1 0x10026000
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	// SYNTHETIC: LEGO1 0x100260a0
-	// LegoVehicleBuildState::`scalar deleting destructor'
-
-	// private:
-	Playlist m_unk0x08[4]; // 0x08
-
-	// This can be one of the following:
-	// * LegoRaceCarBuildState
-	// * LegoCopterBuildState
-	// * LegoDuneCarBuildState
-	// * LegoJetskiBuildState
-	MxString m_className; // 0x38
-
-	// Known States:
-	// * 1 == enter(ing) build screen
-	// * 3 == cutscene/dialogue
-	// * 6 == exit(ing) build screen
-	MxU32 m_animationState; // 0x48
-	undefined m_unk0x4c;    // 0x4c
-	MxBool m_unk0x4d;       // 0x4d
-	MxBool m_unk0x4e;       // 0x4e
-	MxU8 m_placedPartCount; // 0x4f
-};
-
-#endif // LEGOVEHICLEBUILDSTATE_H
diff --git a/LEGO1/lego/legoomni/include/pizza.h b/LEGO1/lego/legoomni/include/pizza.h
index 01e99d7f..7f1356be 100644
--- a/LEGO1/lego/legoomni/include/pizza.h
+++ b/LEGO1/lego/legoomni/include/pizza.h
@@ -3,11 +3,52 @@
 
 #include "decomp.h"
 #include "isleactor.h"
+#include "legostate.h"
 
 class Act1State;
-class PizzaMissionState;
 class SkateBoard;
 
+// VTABLE: LEGO1 0x100d7408
+// SIZE 0xb0
+class PizzaMissionState : public LegoState {
+public:
+	// SIZE 0x20
+	struct Entry {
+	public:
+		undefined2 m_unk0x00;      // 0x00
+		MxU8 m_id;                 // 0x02
+		undefined m_unk0x03[0x15]; // 0x03
+		MxU16 m_score;             // 0x18
+		undefined m_unk0x18[6];    // 0x1a
+	};
+
+	// FUNCTION: LEGO1 0x10039290
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f00d4
+		return "PizzaMissionState";
+	}
+
+	// FUNCTION: LEGO1 0x100392a0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, PizzaMissionState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	inline MxU16 GetScore(MxU8 p_id) { return GetState(p_id)->m_score; }
+
+	// SYNTHETIC: LEGO1 0x10039350
+	// PizzaMissionState::`scalar deleting destructor'
+
+	Entry* GetState(MxU8 p_id);
+
+	undefined4 m_unk0x08; // 0x08
+	undefined4 m_unk0x0c; // 0x0c
+	Entry m_state[5];     // 0x10
+};
+
 // VTABLE: LEGO1 0x100d7380
 // SIZE 0x9c
 class Pizza : public IsleActor {
diff --git a/LEGO1/lego/legoomni/include/pizzamissionstate.h b/LEGO1/lego/legoomni/include/pizzamissionstate.h
deleted file mode 100644
index c74ea4b1..00000000
--- a/LEGO1/lego/legoomni/include/pizzamissionstate.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef PIZZAMISSIONSTATE_H
-#define PIZZAMISSIONSTATE_H
-
-#include "legostate.h"
-
-// SIZE 0x20
-struct PizzaMissionStateEntry {
-public:
-	undefined2 m_unk0x00;      // 0x00
-	MxU8 m_id;                 // 0x02
-	undefined m_unk0x03[0x15]; // 0x03
-	MxU16 m_score;             // 0x18
-	undefined m_unk0x18[6];    // 0x1a
-};
-
-// VTABLE: LEGO1 0x100d7408
-// SIZE 0xb0
-class PizzaMissionState : public LegoState {
-public:
-	// FUNCTION: LEGO1 0x10039290
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f00d4
-		return "PizzaMissionState";
-	}
-
-	// FUNCTION: LEGO1 0x100392a0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, PizzaMissionState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	inline MxU16 GetScore(MxU8 p_id) { return GetState(p_id)->m_score; }
-
-	// SYNTHETIC: LEGO1 0x10039350
-	// PizzaMissionState::`scalar deleting destructor'
-
-	PizzaMissionStateEntry* GetState(MxU8 p_id);
-
-	undefined4 m_unk0x08;              // 0x08
-	undefined4 m_unk0x0c;              // 0x0c
-	PizzaMissionStateEntry m_state[5]; // 0x10
-};
-
-#endif // PIZZAMISSIONSTATE_H
diff --git a/LEGO1/lego/legoomni/include/pizzeria.h b/LEGO1/lego/legoomni/include/pizzeria.h
index 91f76f46..46150249 100644
--- a/LEGO1/lego/legoomni/include/pizzeria.h
+++ b/LEGO1/lego/legoomni/include/pizzeria.h
@@ -3,10 +3,51 @@
 
 #include "decomp.h"
 #include "isleactor.h"
+#include "legostate.h"
 
-class PizzeriaState;
 class PizzaMissionState;
 
+// VTABLE: LEGO1 0x100d5ee8
+// SIZE 0x58
+class PizzeriaState : public LegoState {
+public:
+	// SIZE 0x14
+	struct StateStruct {
+		undefined4 m_unk0x00; // 0x00
+		undefined4 m_unk0x04; // 0x04
+		undefined4 m_unk0x08; // 0x08
+		undefined4 m_unk0x0c; // 0x0c
+		undefined4 m_unk0x10; // 0x10
+	};
+
+	PizzeriaState();
+
+	// FUNCTION: LEGO1 0x10017c20
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0370
+		return "PizzeriaState";
+	}
+
+	// FUNCTION: LEGO1 0x10017c30
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	// SYNTHETIC: LEGO1 0x10017ce0
+	// PizzeriaState::`scalar deleting destructor'
+
+	MxU32 FUN_10017d70();
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	Playlist m_unk0x08[5]; // 0x08
+	StateStruct m_unk0x44; // 0x44
+};
+
 // VTABLE: LEGO1 0x100d5520
 // SIZE 0x84
 class Pizzeria : public IsleActor {
diff --git a/LEGO1/lego/legoomni/include/pizzeriastate.h b/LEGO1/lego/legoomni/include/pizzeriastate.h
deleted file mode 100644
index 6bed2aad..00000000
--- a/LEGO1/lego/legoomni/include/pizzeriastate.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef PIZZERIASTATE_H
-#define PIZZERIASTATE_H
-
-#include "legostate.h"
-
-// SIZE 0x14
-struct PizzeriaStateStruct {
-	undefined4 m_unk0x00; // 0x00
-	undefined4 m_unk0x04; // 0x04
-	undefined4 m_unk0x08; // 0x08
-	undefined4 m_unk0x0c; // 0x0c
-	undefined4 m_unk0x10; // 0x10
-};
-
-// VTABLE: LEGO1 0x100d5ee8
-// SIZE 0x58
-class PizzeriaState : public LegoState {
-public:
-	PizzeriaState();
-
-	// FUNCTION: LEGO1 0x10017c20
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0370
-		return "PizzeriaState";
-	}
-
-	// FUNCTION: LEGO1 0x10017c30
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	// SYNTHETIC: LEGO1 0x10017ce0
-	// PizzeriaState::`scalar deleting destructor'
-
-	MxU32 FUN_10017d70();
-
-private:
-	Playlist m_unk0x08[5];         // 0x08
-	PizzeriaStateStruct m_unk0x44; // 0x44
-};
-
-#endif // PIZZERIASTATE_H
diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h
index 67c3586a..4c8c34eb 100644
--- a/LEGO1/lego/legoomni/include/police.h
+++ b/LEGO1/lego/legoomni/include/police.h
@@ -3,13 +3,49 @@
 
 #include "decomp.h"
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 #include "radio.h"
 
 class LegoControlManagerEvent;
 class LegoEventNotificationParam;
 class MxDSAction;
-class PoliceState;
+
+// VTABLE: LEGO1 0x100d8af0
+// SIZE 0x10
+class PoliceState : public LegoState {
+public:
+	PoliceState();
+	~PoliceState() override {}
+
+	// FUNCTION: LEGO1 0x1005e860
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0444
+		return "PoliceState";
+	}
+
+	// FUNCTION: LEGO1 0x1005e870
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	// SYNTHETIC: LEGO1 0x1005e920
+	// PoliceState::`scalar deleting destructor'
+
+	inline undefined4 GetUnknown0x0c() { return m_unk0x0c; }
+	inline void SetUnknown0x0c(undefined4 p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
+
+	void FUN_1005ea40();
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	PoliceScript::Script m_policeScript; // 0x08
+	undefined4 m_unk0x0c;                // 0x0c
+};
 
 // VTABLE: LEGO1 0x100d8a80
 // SIZE 0x110
diff --git a/LEGO1/lego/legoomni/include/policeentity.h b/LEGO1/lego/legoomni/include/policeentity.h
deleted file mode 100644
index 48156150..00000000
--- a/LEGO1/lego/legoomni/include/policeentity.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef POLICEENTITY_H
-#define POLICEENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d4ab0
-// SIZE 0x68
-class PoliceEntity : public BuildingEntity {
-public:
-	// FUNCTION: LEGO1 0x1000ed60
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0328
-		return "PoliceEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000ed70
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, PoliceEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong VTable0x50(MxParam& p_param) override; // vtable+0x50
-
-	// SYNTHETIC: LEGO1 0x1000f900
-	// PoliceEntity::`scalar deleting destructor'
-};
-
-#endif // POLICEENTITY_H
diff --git a/LEGO1/lego/legoomni/include/policestate.h b/LEGO1/lego/legoomni/include/policestate.h
deleted file mode 100644
index 75970729..00000000
--- a/LEGO1/lego/legoomni/include/policestate.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef POLICESTATE_H
-#define POLICESTATE_H
-
-#include "actionsfwd.h"
-#include "decomp.h"
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d8af0
-// SIZE 0x10
-class PoliceState : public LegoState {
-public:
-	PoliceState();
-	~PoliceState() override {}
-
-	// FUNCTION: LEGO1 0x1005e860
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0444
-		return "PoliceState";
-	}
-
-	// FUNCTION: LEGO1 0x1005e870
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	// SYNTHETIC: LEGO1 0x1005e920
-	// PoliceState::`scalar deleting destructor'
-
-	inline undefined4 GetUnknown0x0c() { return m_unk0x0c; }
-	inline void SetUnknown0x0c(undefined4 p_unk0x0c) { m_unk0x0c = p_unk0x0c; }
-
-	void FUN_1005ea40();
-
-private:
-	PoliceScript::Script m_policeScript; // 0x08
-	undefined4 m_unk0x0c;                // 0x0c
-};
-
-#endif // POLICESTATE_H
diff --git a/LEGO1/lego/legoomni/include/racestandsentity.h b/LEGO1/lego/legoomni/include/racestandsentity.h
deleted file mode 100644
index 22bc4dd2..00000000
--- a/LEGO1/lego/legoomni/include/racestandsentity.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef RACESTANDSENTITY_H
-#define RACESTANDSENTITY_H
-
-#include "buildingentity.h"
-
-// VTABLE: LEGO1 0x100d48a8
-// SIZE 0x68
-class RaceStandsEntity : public BuildingEntity {
-	// FUNCTION: LEGO1 0x1000efa0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0300
-		return "RaceStandsEntity";
-	}
-
-	// FUNCTION: LEGO1 0x1000efb0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name);
-	}
-
-	MxLong VTable0x50(MxParam& p_param) override;
-
-	// SYNTHETIC: LEGO1 0x1000f9e0
-	// RaceStandsEntity::`scalar deleting destructor'
-};
-
-#endif // RACESTANDSENTITY_H
diff --git a/LEGO1/lego/legoomni/include/racestate.h b/LEGO1/lego/legoomni/include/racestate.h
deleted file mode 100644
index e2321be1..00000000
--- a/LEGO1/lego/legoomni/include/racestate.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef RACESTATE_H
-#define RACESTATE_H
-
-#include "legostate.h"
-
-// SIZE 0x06
-struct RaceStateEntry {
-public:
-	inline MxS16 GetUnknown0x02() { return m_unk0x02; }
-	inline MxU16 GetScore() { return m_score; }
-
-	// TODO: Possibly private
-	MxU8 m_id;       // 0x00
-	MxS16 m_unk0x02; // 0x02
-	MxU16 m_score;   // 0x04
-};
-
-// VTABLE: LEGO1 0x100d5e30
-// SIZE 0x2c
-class RaceState : public LegoState {
-public:
-	RaceState();
-
-	// FUNCTION: LEGO1 0x10016010
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f07d0
-		return "RaceState";
-	}
-
-	// FUNCTION: LEGO1 0x10016020
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	RaceStateEntry* GetState(MxU8 p_id);
-
-	inline undefined4 GetUnknown0x28() { return m_unk0x28; }
-
-	// SYNTHETIC: LEGO1 0x1000f6f0
-	// RaceState::~RaceState
-
-	// SYNTHETIC: LEGO1 0x100160d0
-	// RaceState::`scalar deleting destructor'
-
-protected:
-	RaceStateEntry m_state[5]; // 0x08
-	undefined4 m_unk0x28;      // 0x28
-};
-
-#endif // RACESTATE_H
diff --git a/LEGO1/lego/legoomni/include/radio.h b/LEGO1/lego/legoomni/include/radio.h
index 997c6579..cd411036 100644
--- a/LEGO1/lego/legoomni/include/radio.h
+++ b/LEGO1/lego/legoomni/include/radio.h
@@ -1,11 +1,50 @@
 #ifndef RADIO_H
 #define RADIO_H
 
+#include "legostate.h"
 #include "mxcore.h"
 
 class LegoControlManagerEvent;
+class MxAtomId;
 class MxEndActionNotificationParam;
-class RadioState;
+
+// VTABLE: LEGO1 0x100d6d28
+// SIZE 0x30
+class RadioState : public LegoState {
+public:
+	RadioState();
+
+	// FUNCTION: LEGO1 0x1002cf60
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f04f8
+		return "RadioState";
+	}
+
+	// FUNCTION: LEGO1 0x1002cf70
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, RadioState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxBool IsSerializable() override; // vtable+0x14
+
+	// SYNTHETIC: LEGO1 0x1002d020
+	// RadioState::`scalar deleting destructor'
+
+	inline MxBool IsActive() { return m_active; }
+
+	inline void SetActive(MxBool p_active) { m_active = p_active; }
+
+	undefined4 FUN_1002d090();
+	MxBool FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId);
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	Playlist m_unk0x08[3]; // 0x08
+	MxS16 m_unk0x2c;       // 0x2c
+	MxBool m_active;       // 0x2e
+};
 
 // VTABLE: LEGO1 0x100d6d10
 // SIZE 0x10
diff --git a/LEGO1/lego/legoomni/include/radiostate.h b/LEGO1/lego/legoomni/include/radiostate.h
deleted file mode 100644
index e0c0066c..00000000
--- a/LEGO1/lego/legoomni/include/radiostate.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef RADIOSTATE_H
-#define RADIOSTATE_H
-
-#include "legostate.h"
-
-class MxAtomId;
-
-// VTABLE: LEGO1 0x100d6d28
-// SIZE 0x30
-class RadioState : public LegoState {
-public:
-	RadioState();
-
-	// FUNCTION: LEGO1 0x1002cf60
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f04f8
-		return "RadioState";
-	}
-
-	// FUNCTION: LEGO1 0x1002cf70
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, RadioState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool IsSerializable() override; // vtable+0x14
-
-	// SYNTHETIC: LEGO1 0x1002d020
-	// RadioState::`scalar deleting destructor'
-
-	inline MxBool IsActive() { return m_active; }
-
-	inline void SetActive(MxBool p_active) { m_active = p_active; }
-
-	undefined4 FUN_1002d090();
-	MxBool FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId);
-
-private:
-	Playlist m_unk0x08[3]; // 0x08
-	MxS16 m_unk0x2c;       // 0x2c
-	MxBool m_active;       // 0x2e
-};
-
-#endif // RADIOSTATE_H
diff --git a/LEGO1/lego/legoomni/include/score.h b/LEGO1/lego/legoomni/include/score.h
index 979fa33d..76a4ac8e 100644
--- a/LEGO1/lego/legoomni/include/score.h
+++ b/LEGO1/lego/legoomni/include/score.h
@@ -2,11 +2,49 @@
 #define SCORE_H
 
 #include "legogamestate.h"
+#include "legostate.h"
 #include "legoworld.h"
 
 class LegoControlManagerEvent;
 class MxEndActionNotificationParam;
-class ScoreState;
+
+// VTABLE: LEGO1 0x100d53f8
+// SIZE 0x0c
+class ScoreState : public LegoState {
+public:
+	// FUNCTION: LEGO1 0x1000de40
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f0084
+		return "ScoreState";
+	}
+
+	// FUNCTION: LEGO1 0x1000de50
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	// FUNCTION: LEGO1 0x1000de20
+	MxBool IsSerializable() override { return FALSE; } // vtable+0x14
+
+	// FUNCTION: LEGO1 0x1000de30
+	MxBool SetFlag() override
+	{
+		m_playCubeTutorial = TRUE;
+		return TRUE;
+	} // vtable+0x18
+
+	inline MxBool GetTutorialFlag() { return m_playCubeTutorial; }
+	inline void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
+
+	// SYNTHETIC: LEGO1 0x1000df00
+	// ScoreState::`scalar deleting destructor'
+
+	// TODO: Most likely getters/setters are not used according to BETA.
+
+	MxBool m_playCubeTutorial; // 0x08
+};
 
 // VTABLE: LEGO1 0x100d4018
 // SIZE 0x104
diff --git a/LEGO1/lego/legoomni/include/scorestate.h b/LEGO1/lego/legoomni/include/scorestate.h
deleted file mode 100644
index ac651a19..00000000
--- a/LEGO1/lego/legoomni/include/scorestate.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef SCORESTATE_H
-#define SCORESTATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d53f8
-// SIZE 0x0c
-class ScoreState : public LegoState {
-public:
-	// FUNCTION: LEGO1 0x1000de40
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f0084
-		return "ScoreState";
-	}
-
-	// FUNCTION: LEGO1 0x1000de50
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, ScoreState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxBool IsSerializable() override; // vtable+0x14
-	MxBool SetFlag() override;        // vtable+0x18
-
-	inline MxBool GetTutorialFlag() { return m_playCubeTutorial; }
-	inline void SetTutorialFlag(MxBool p_playCubeTutorial) { m_playCubeTutorial = p_playCubeTutorial; }
-
-	// SYNTHETIC: LEGO1 0x1000df00
-	// ScoreState::`scalar deleting destructor'
-
-private:
-	MxBool m_playCubeTutorial; // 0x08
-};
-
-#endif // SCORESTATE_H
diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h
index 4f4f1bb5..a8738cbf 100644
--- a/LEGO1/lego/legoomni/include/towtrack.h
+++ b/LEGO1/lego/legoomni/include/towtrack.h
@@ -3,8 +3,64 @@
 
 #include "decomp.h"
 #include "islepathactor.h"
+#include "legostate.h"
 
-class TowTrackMissionState;
+// VTABLE: LEGO1 0x100d7fd8
+// SIZE 0x28
+class TowTrackMissionState : public LegoState {
+public:
+	TowTrackMissionState();
+
+	// FUNCTION: LEGO1 0x1004dfa0
+	inline const char* ClassName() const override // vtable+0x0c
+	{
+		// STRING: LEGO1 0x100f00bc
+		return "TowTrackMissionState";
+	}
+
+	// FUNCTION: LEGO1 0x1004dfb0
+	inline MxBool IsA(const char* p_name) const override // vtable+0x10
+	{
+		return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name);
+	}
+
+	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
+
+	inline MxU16 GetScore(MxU8 p_id)
+	{
+		switch (p_id) {
+		case 1:
+			return m_score1;
+		case 2:
+			return m_score2;
+		case 3:
+			return m_score3;
+		case 4:
+			return m_score4;
+		case 5:
+			return m_score5;
+		default:
+			return 0;
+		}
+	}
+
+	// SYNTHETIC: LEGO1 0x1004e060
+	// TowTrackMissionState::`scalar deleting destructor'
+
+	undefined4 m_unk0x08; // 0x08
+	undefined4 m_unk0x0c; // 0x0c
+	MxU8 m_unk0x10;       // 0x10
+	MxU16 m_unk0x12;      // 0x12
+	MxU16 m_unk0x14;      // 0x14
+	MxU16 m_unk0x16;      // 0x16
+	MxU16 m_unk0x18;      // 0x18
+	MxU16 m_unk0x1a;      // 0x1a
+	MxU16 m_score1;       // 0x1c
+	MxU16 m_score2;       // 0x1e
+	MxU16 m_score3;       // 0x20
+	MxU16 m_score4;       // 0x22
+	MxU16 m_score5;       // 0x24
+};
 
 // VTABLE: LEGO1 0x100d7ee0
 // SIZE 0x180
diff --git a/LEGO1/lego/legoomni/include/towtrackmissionstate.h b/LEGO1/lego/legoomni/include/towtrackmissionstate.h
deleted file mode 100644
index 5a684011..00000000
--- a/LEGO1/lego/legoomni/include/towtrackmissionstate.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef TOWTRACKMISSIONSTATE_H
-#define TOWTRACKMISSIONSTATE_H
-
-#include "legostate.h"
-
-// VTABLE: LEGO1 0x100d7fd8
-// SIZE 0x28
-class TowTrackMissionState : public LegoState {
-public:
-	TowTrackMissionState();
-
-	// FUNCTION: LEGO1 0x1004dfa0
-	inline const char* ClassName() const override // vtable+0x0c
-	{
-		// STRING: LEGO1 0x100f00bc
-		return "TowTrackMissionState";
-	}
-
-	// FUNCTION: LEGO1 0x1004dfb0
-	inline MxBool IsA(const char* p_name) const override // vtable+0x10
-	{
-		return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name);
-	}
-
-	MxResult Serialize(LegoFile* p_legoFile) override; // vtable+0x1c
-
-	inline MxU16 GetScore(MxU8 p_id)
-	{
-		switch (p_id) {
-		case 1:
-			return m_score1;
-		case 2:
-			return m_score2;
-		case 3:
-			return m_score3;
-		case 4:
-			return m_score4;
-		case 5:
-			return m_score5;
-		default:
-			return 0;
-		}
-	}
-
-	// SYNTHETIC: LEGO1 0x1004e060
-	// TowTrackMissionState::`scalar deleting destructor'
-
-	undefined4 m_unk0x08; // 0x08
-	undefined4 m_unk0x0c; // 0x0c
-	MxU8 m_unk0x10;       // 0x10
-	MxU16 m_unk0x12;      // 0x12
-	MxU16 m_unk0x14;      // 0x14
-	MxU16 m_unk0x16;      // 0x16
-	MxU16 m_unk0x18;      // 0x18
-	MxU16 m_unk0x1a;      // 0x1a
-	MxU16 m_score1;       // 0x1c
-	MxU16 m_score2;       // 0x1e
-	MxU16 m_score3;       // 0x20
-	MxU16 m_score4;       // 0x22
-	MxU16 m_score5;       // 0x24
-};
-
-#endif // TOWTRACKMISSIONSTATE_H
diff --git a/LEGO1/lego/legoomni/src/act1/act1state.cpp b/LEGO1/lego/legoomni/src/act1/act1state.cpp
deleted file mode 100644
index 013347d3..00000000
--- a/LEGO1/lego/legoomni/src/act1/act1state.cpp
+++ /dev/null
@@ -1,296 +0,0 @@
-#include "act1state.h"
-
-#include "legonamedtexture.h"
-#include "legoutils.h"
-
-DECOMP_SIZE_ASSERT(Act1State, 0x26c)
-DECOMP_SIZE_ASSERT(Act1State::NamedPlane, 0x4c)
-
-// GLOBAL: ISLE 0x100f37f0
-MxS32 g_unk0x100f37f0[] = {
-	Act1State::e_unk953,
-	Act1State::e_unk954,
-	Act1State::e_unk955,
-};
-
-extern MxAtomId* g_isleScript;
-
-// STUB: LEGO1 0x100334b0
-Act1State::Act1State() : m_unk0x00c(0), m_unk0x00e(0), m_unk0x008(NULL), m_unk0x010(0)
-{
-	m_unk0x01e = FALSE;
-	m_unk0x018 = 1;
-	m_unk0x010 = 0;
-	m_planeActive = FALSE;
-	m_unk0x00e = 0;
-	m_unk0x01f = FALSE;
-	m_unk0x008 = g_unk0x100f37f0;
-	m_unk0x014 = -1;
-	m_unk0x022 = FALSE;
-	m_unk0x154 = NULL;
-	m_unk0x158 = NULL;
-	m_unk0x15c = NULL;
-	m_unk0x160 = NULL;
-	m_unk0x1b0 = NULL;
-	m_unk0x021 = 1;
-	m_elevFloor = Act1State::c_floor1;
-	m_unk0x00c = sizeOfArray(g_unk0x100f37f0);
-	m_unk0x1b4 = NULL;
-	m_unk0x1b8 = NULL;
-	m_unk0x208 = NULL;
-	m_unk0x20c = NULL;
-	m_unk0x25c = NULL;
-	m_unk0x260 = NULL;
-	m_unk0x264 = NULL;
-	m_unk0x268 = NULL;
-	SetFlag();
-}
-
-// FUNCTION: LEGO1 0x10033ac0
-MxResult Act1State::Serialize(LegoFile* p_legoFile)
-{
-	LegoState::Serialize(p_legoFile);
-
-	m_unk0x024.Serialize(p_legoFile);
-	m_unk0x070.Serialize(p_legoFile);
-	m_unk0x0bc.Serialize(p_legoFile);
-	m_unk0x108.Serialize(p_legoFile);
-	m_unk0x164.Serialize(p_legoFile);
-	m_unk0x1bc.Serialize(p_legoFile);
-	m_unk0x210.Serialize(p_legoFile);
-
-	if (p_legoFile->IsWriteMode()) {
-		if (m_unk0x108.GetName()->Compare("") != 0) {
-			if (m_unk0x154) {
-				WriteNamedTexture(p_legoFile, m_unk0x154);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "chwind.gif");
-			}
-			if (m_unk0x158) {
-				WriteNamedTexture(p_legoFile, m_unk0x158);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "chjetl.gif");
-			}
-			if (m_unk0x15c) {
-				WriteNamedTexture(p_legoFile, m_unk0x15c);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "chjetr.gif");
-			}
-		}
-		if (m_unk0x164.GetName()->Compare("") != 0) {
-			if (m_unk0x1b0) {
-				WriteNamedTexture(p_legoFile, m_unk0x1b0);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "jsfrnt.gif");
-			}
-			if (m_unk0x1b4) {
-				WriteNamedTexture(p_legoFile, m_unk0x1b4);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "jswnsh.gif");
-			}
-		}
-		if (m_unk0x1bc.GetName()->Compare("") != 0) {
-			if (m_unk0x208) {
-				WriteNamedTexture(p_legoFile, m_unk0x208);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "dbfrfn.gif");
-			}
-		}
-		if (m_unk0x210.GetName()->Compare("") != 0) {
-			if (m_unk0x25c) {
-				WriteNamedTexture(p_legoFile, m_unk0x25c);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "rcfrnt.gif");
-			}
-			if (m_unk0x260) {
-				WriteNamedTexture(p_legoFile, m_unk0x260);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "rcback.gif");
-			}
-			if (m_unk0x264) {
-				WriteNamedTexture(p_legoFile, m_unk0x264);
-			}
-			else {
-				FUN_1003f540(p_legoFile, "rctail.gif");
-			}
-		}
-
-		p_legoFile->Write(&m_unk0x010, sizeof(m_unk0x010));
-		p_legoFile->Write(&m_unk0x022, sizeof(m_unk0x022));
-	}
-	else if (p_legoFile->IsReadMode()) {
-		if (m_unk0x108.GetName()->Compare("") != 0) {
-			m_unk0x154 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x154 == NULL) {
-				return FAILURE;
-			}
-
-			m_unk0x158 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x158 == NULL) {
-				return FAILURE;
-			}
-
-			m_unk0x15c = ReadNamedTexture(p_legoFile);
-			if (m_unk0x15c == NULL) {
-				return FAILURE;
-			}
-		}
-		if (m_unk0x164.GetName()->Compare("") != 0) {
-			m_unk0x1b0 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x1b0 == NULL) {
-				return FAILURE;
-			}
-
-			m_unk0x1b4 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x1b4 == NULL) {
-				return FAILURE;
-			}
-		}
-		if (m_unk0x1bc.GetName()->Compare("") != 0) {
-			m_unk0x208 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x208 == NULL) {
-				return FAILURE;
-			}
-		}
-		if (m_unk0x210.GetName()->Compare("") != 0) {
-			m_unk0x25c = ReadNamedTexture(p_legoFile);
-			if (m_unk0x25c == NULL) {
-				return FAILURE;
-			}
-
-			m_unk0x260 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x260 == NULL) {
-				return FAILURE;
-			}
-
-			m_unk0x264 = ReadNamedTexture(p_legoFile);
-			if (m_unk0x264 == NULL) {
-				return FAILURE;
-			}
-		}
-
-		p_legoFile->Read(&m_unk0x010, sizeof(m_unk0x010));
-		p_legoFile->Read(&m_unk0x022, sizeof(m_unk0x022));
-	}
-
-	// TODO
-	return SUCCESS;
-}
-
-// STUB: LEGO1 0x10034660
-void Act1State::FUN_10034660()
-{
-	// TODO
-}
-
-// FUNCTION: LEGO1 0x100346a0
-void Act1State::FUN_100346a0()
-{
-	if (m_unk0x014 != -1) {
-		InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x014, NULL);
-		m_unk0x014 = -1;
-	}
-}
-
-// FUNCTION: LEGO1 0x100346d0
-MxBool Act1State::SetFlag()
-{
-	m_unk0x024.SetName("");
-	m_unk0x070.SetName("");
-	m_unk0x0bc.SetName("");
-	m_unk0x022 = FALSE;
-	m_unk0x108.SetName("");
-
-	if (m_unk0x154) {
-		delete m_unk0x154;
-		m_unk0x154 = NULL;
-	}
-
-	if (m_unk0x158) {
-		delete m_unk0x158;
-		m_unk0x158 = NULL;
-	}
-
-	if (m_unk0x15c) {
-		delete m_unk0x15c;
-		m_unk0x15c = NULL;
-	}
-
-	if (m_unk0x160) {
-		delete m_unk0x160;
-		m_unk0x160 = NULL;
-	}
-
-	m_unk0x164.SetName("");
-
-	if (m_unk0x1b0) {
-		delete m_unk0x1b0;
-		m_unk0x1b0 = NULL;
-	}
-
-	if (m_unk0x1b4) {
-		delete m_unk0x1b4;
-		m_unk0x1b4 = NULL;
-	}
-
-	if (m_unk0x1b8) {
-		delete m_unk0x1b8;
-		m_unk0x1b8 = NULL;
-	}
-
-	m_unk0x1bc.SetName("");
-
-	if (m_unk0x208) {
-		delete m_unk0x208;
-		m_unk0x208 = NULL;
-	}
-
-	if (m_unk0x20c) {
-		delete m_unk0x20c;
-		m_unk0x20c = NULL;
-	}
-
-	m_unk0x210.SetName("");
-
-	if (m_unk0x25c) {
-		delete m_unk0x25c;
-		m_unk0x25c = NULL;
-	}
-
-	if (m_unk0x260) {
-		delete m_unk0x260;
-		m_unk0x260 = NULL;
-	}
-
-	if (m_unk0x264) {
-		delete m_unk0x264;
-		m_unk0x264 = NULL;
-	}
-
-	if (m_unk0x268) {
-		delete m_unk0x268;
-		m_unk0x268 = NULL;
-	}
-
-	return TRUE;
-}
-
-// STUB: LEGO1 0x10034b60
-void Act1State::FUN_10034b60()
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x10034d00
-void Act1State::FUN_10034d00()
-{
-	// TODO
-}
diff --git a/LEGO1/lego/legoomni/src/act2/legoact2state.cpp b/LEGO1/lego/legoomni/src/act2/legoact2state.cpp
deleted file mode 100644
index 955de04e..00000000
--- a/LEGO1/lego/legoomni/src/act2/legoact2state.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "legoact2state.h"
-
-DECOMP_SIZE_ASSERT(LegoAct2State, 0x10)
-
-// FUNCTION: LEGO1 0x1000df70
-MxBool LegoAct2State::IsSerializable()
-{
-	return FALSE;
-}
diff --git a/LEGO1/lego/legoomni/src/act3/act3state.cpp b/LEGO1/lego/legoomni/src/act3/act3state.cpp
deleted file mode 100644
index de1bac5f..00000000
--- a/LEGO1/lego/legoomni/src/act3/act3state.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "act3state.h"
-
-DECOMP_SIZE_ASSERT(Act3State, 0x0c)
-
-// FUNCTION: LEGO1 0x1000e2f0
-MxBool Act3State::IsSerializable()
-{
-	return FALSE;
-}
diff --git a/LEGO1/lego/legoomni/src/act3/act3shark.cpp b/LEGO1/lego/legoomni/src/actors/act3shark.cpp
similarity index 100%
rename from LEGO1/lego/legoomni/src/act3/act3shark.cpp
rename to LEGO1/lego/legoomni/src/actors/act3shark.cpp
diff --git a/LEGO1/lego/legoomni/src/actors/ambulance.cpp b/LEGO1/lego/legoomni/src/actors/ambulance.cpp
index 2d293972..1a15d7c8 100644
--- a/LEGO1/lego/legoomni/src/actors/ambulance.cpp
+++ b/LEGO1/lego/legoomni/src/actors/ambulance.cpp
@@ -1,6 +1,5 @@
 #include "ambulance.h"
 
-#include "ambulancemissionstate.h"
 #include "decomp.h"
 #include "legocontrolmanager.h"
 #include "legogamestate.h"
@@ -14,6 +13,7 @@
 #include "scripts.h"
 
 DECOMP_SIZE_ASSERT(Ambulance, 0x184)
+DECOMP_SIZE_ASSERT(AmbulanceMissionState, 0x24)
 
 // FUNCTION: LEGO1 0x10035ee0
 Ambulance::Ambulance()
@@ -152,3 +152,27 @@ void Ambulance::FUN_10037250()
 {
 	// TODO
 }
+
+// FUNCTION: LEGO1 0x100373a0
+AmbulanceMissionState::AmbulanceMissionState()
+{
+	m_unk0x10 = 0;
+	m_unk0x12 = 0;
+	m_unk0x14 = 0;
+	m_unk0x08 = 0;
+	m_unk0x16 = 0;
+	m_unk0x0c = 0;
+	m_unk0x18 = 0;
+	m_score1 = 0;
+	m_score2 = 0;
+	m_score3 = 0;
+	m_score4 = 0;
+	m_score5 = 0;
+}
+
+// STUB: LEGO1 0x10037440
+MxResult AmbulanceMissionState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
diff --git a/LEGO1/lego/legoomni/src/actors/buildings.cpp b/LEGO1/lego/legoomni/src/actors/buildings.cpp
new file mode 100644
index 00000000..9c3c174b
--- /dev/null
+++ b/LEGO1/lego/legoomni/src/actors/buildings.cpp
@@ -0,0 +1,176 @@
+#include "buildings.h"
+
+#include "act2main_actions.h"
+#include "act3.h"
+#include "act3_actions.h"
+#include "isle.h"
+#include "isle_actions.h"
+#include "islepathactor.h"
+#include "legoact2.h"
+#include "legoanimationmanager.h"
+#include "legogamestate.h"
+#include "legoutils.h"
+#include "legoworld.h"
+#include "misc.h"
+#include "mxtransitionmanager.h"
+#include "scripts.h"
+
+DECOMP_SIZE_ASSERT(BeachHouseEntity, 0x68)
+DECOMP_SIZE_ASSERT(GasStationEntity, 0x68)
+DECOMP_SIZE_ASSERT(HospitalEntity, 0x68)
+DECOMP_SIZE_ASSERT(InfoCenterEntity, 0x68)
+DECOMP_SIZE_ASSERT(JailEntity, 0x68)
+DECOMP_SIZE_ASSERT(PoliceEntity, 0x68)
+DECOMP_SIZE_ASSERT(RaceStandsEntity, 0x68)
+
+// FUNCTION: LEGO1 0x100150c0
+MxLong InfoCenterEntity::VTable0x50(MxParam& p_param)
+{
+	switch (GameState()->GetCurrentAct()) {
+	case LegoGameState::Act::e_act1: {
+		if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
+			((IslePathActor*) CurrentActor())->VTable0xe4();
+		}
+
+		Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
+		isle->FUN_10033350();
+		isle->SetDestLocation(LegoGameState::Area::e_infomain);
+
+		Act1State* act1state = (Act1State*) GameState()->GetState("Act1State");
+		act1state->SetUnknown18(0);
+		break;
+	}
+	case LegoGameState::Act::e_act2: {
+		LegoAct2* act2 = (LegoAct2*) FindWorld(*g_act2mainScript, Act2mainScript::c__Act2Main);
+		act2->SetUnknown0x1150(2);
+
+		LegoAct2State* act2state = (LegoAct2State*) GameState()->GetState("LegoAct2State");
+		if (act2state) {
+			act2state->SetUnknown0x0c(0);
+		}
+		break;
+	}
+	case LegoGameState::Act::e_act3:
+		Act3* act3 = (Act3*) FindWorld(*g_act3Script, Act3Script::c__Act3);
+		act3->SetUnknown4270(2);
+		break;
+	}
+
+	AnimationManager()->FUN_10061010(FALSE);
+	TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
+	return 1;
+}
+
+// FUNCTION: LEGO1 0x100151d0
+MxLong GasStationEntity::VTable0x50(MxParam& p_param)
+{
+	if (FUN_1003ef60()) {
+		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
+
+		if (state->GetUnknown18() != 8) {
+			state->SetUnknown18(0);
+
+			if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
+				((IslePathActor*) CurrentActor())->VTable0xe4();
+			}
+
+			Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
+			isle->SetDestLocation(LegoGameState::Area::e_garage);
+
+			AnimationManager()->FUN_10061010(FALSE);
+			TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
+		}
+	}
+
+	return 1;
+}
+
+// FUNCTION: LEGO1 0x10015270
+MxLong HospitalEntity::VTable0x50(MxParam& p_param)
+{
+	if (FUN_1003ef60()) {
+		Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
+
+		if (act1State->GetUnknown18() != 10) {
+			act1State->SetUnknown18(0);
+
+			if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
+				((IslePathActor*) CurrentActor())->VTable0xe4();
+			}
+
+			Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
+			isle->SetDestLocation(LegoGameState::Area::e_hospital);
+
+			AnimationManager()->FUN_10061010(FALSE);
+			TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
+		}
+	}
+
+	return 1;
+}
+
+// FUNCTION: LEGO1 0x10015310
+MxLong PoliceEntity::VTable0x50(MxParam& p_param)
+{
+	if (FUN_1003ef60()) {
+		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
+
+		if (state->GetUnknown18() != 10) {
+			state->SetUnknown18(0);
+
+			if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
+				((IslePathActor*) CurrentActor())->VTable0xe4();
+			}
+
+			Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
+			isle->SetDestLocation(LegoGameState::Area::e_police);
+
+			AnimationManager()->FUN_10061010(FALSE);
+			TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
+		}
+	}
+
+	return 1;
+}
+
+// FUNCTION: LEGO1 0x100153b0
+MxLong BeachHouseEntity::VTable0x50(MxParam& p_param)
+{
+	if (FUN_1003ef60()) {
+		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
+		state->SetUnknown18(0);
+
+		if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
+			((IslePathActor*) CurrentActor())->VTable0xe4();
+		}
+
+		Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
+		isle->SetDestLocation(LegoGameState::Area::e_jetskibuild);
+
+		AnimationManager()->FUN_10061010(FALSE);
+		TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
+	}
+
+	return 1;
+}
+
+// FUNCTION: LEGO1 0x10015450
+MxLong RaceStandsEntity::VTable0x50(MxParam& p_param)
+{
+	if (FUN_1003ef60()) {
+		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
+		state->SetUnknown18(0);
+
+		if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
+			((IslePathActor*) CurrentActor())->VTable0xe4();
+		}
+
+		Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
+		isle->SetDestLocation(LegoGameState::Area::e_racecarbuild);
+
+		AnimationManager()->FUN_10061010(FALSE);
+		TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
+	}
+
+	return 1;
+}
diff --git a/LEGO1/lego/legoomni/src/actors/helicopter.cpp b/LEGO1/lego/legoomni/src/actors/helicopter.cpp
index dee0a47b..1b765b2b 100644
--- a/LEGO1/lego/legoomni/src/actors/helicopter.cpp
+++ b/LEGO1/lego/legoomni/src/actors/helicopter.cpp
@@ -1,9 +1,7 @@
 #include "helicopter.h"
 
-#include "act1state.h"
 #include "act3.h"
 #include "act3_actions.h"
-#include "helicopterstate.h"
 #include "isle.h"
 #include "isle_actions.h"
 #include "jukebox.h"
@@ -19,6 +17,7 @@
 #include "scripts.h"
 
 DECOMP_SIZE_ASSERT(Helicopter, 0x230)
+DECOMP_SIZE_ASSERT(HelicopterState, 0x0c)
 DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14)
 DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18)
 DECOMP_SIZE_ASSERT(MxMatrix, 0x48)
diff --git a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp
index e526384e..0f8da9e7 100644
--- a/LEGO1/lego/legoomni/src/actors/islepathactor.cpp
+++ b/LEGO1/lego/legoomni/src/actors/islepathactor.cpp
@@ -4,10 +4,10 @@
 #include "isle_actions.h"
 #include "jukebox_actions.h"
 #include "legoanimationmanager.h"
+#include "legocarbuild.h"
 #include "legonavcontroller.h"
 #include "legopathboundary.h"
 #include "legoutils.h"
-#include "legovehiclebuildstate.h"
 #include "legovideomanager.h"
 #include "legoworld.h"
 #include "misc.h"
diff --git a/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp b/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp
index f4e2af0a..340ea64d 100644
--- a/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp
+++ b/LEGO1/lego/legoomni/src/actors/jukeboxentity.cpp
@@ -3,8 +3,8 @@
 #include "isle.h"
 #include "isle_actions.h"
 #include "islepathactor.h"
+#include "jukebox.h"
 #include "jukebox_actions.h"
-#include "jukeboxstate.h"
 #include "legogamestate.h"
 #include "legoutils.h"
 #include "misc.h"
diff --git a/LEGO1/lego/legoomni/src/actors/pizza.cpp b/LEGO1/lego/legoomni/src/actors/pizza.cpp
index 9185de23..43ef2ddb 100644
--- a/LEGO1/lego/legoomni/src/actors/pizza.cpp
+++ b/LEGO1/lego/legoomni/src/actors/pizza.cpp
@@ -1,15 +1,15 @@
 #include "pizza.h"
 
-#include "act1state.h"
 #include "isle_actions.h"
 #include "legogamestate.h"
 #include "legoworld.h"
 #include "misc.h"
 #include "mxmisc.h"
 #include "mxticklemanager.h"
-#include "pizzamissionstate.h"
 
 DECOMP_SIZE_ASSERT(Pizza, 0x9c)
+DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb0)
+DECOMP_SIZE_ASSERT(PizzaMissionState::Entry, 0x20)
 
 // FUNCTION: LEGO1 0x10037ef0
 Pizza::Pizza()
@@ -98,3 +98,22 @@ undefined4 Pizza::HandleEndAction(MxEndActionNotificationParam&)
 	// TODO
 	return 0;
 }
+
+// STUB: LEGO1 0x100393c0
+MxResult PizzaMissionState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
+
+// FUNCTION: LEGO1 0x10039510
+PizzaMissionState::Entry* PizzaMissionState::GetState(MxU8 p_id)
+{
+	for (MxS16 i = 0; i < 5; i++) {
+		if (m_state[i].m_id == p_id) {
+			return m_state + i;
+		}
+	}
+
+	return NULL;
+}
diff --git a/LEGO1/lego/legoomni/src/actors/pizzeria.cpp b/LEGO1/lego/legoomni/src/actors/pizzeria.cpp
index 46139dd7..1ae45305 100644
--- a/LEGO1/lego/legoomni/src/actors/pizzeria.cpp
+++ b/LEGO1/lego/legoomni/src/actors/pizzeria.cpp
@@ -9,11 +9,11 @@
 #include "legoworld.h"
 #include "misc.h"
 #include "pizza.h"
-#include "pizzamissionstate.h"
-#include "pizzeriastate.h"
 #include "scripts.h"
 
 DECOMP_SIZE_ASSERT(Pizzeria, 0x84)
+DECOMP_SIZE_ASSERT(PizzeriaState, 0x58)
+DECOMP_SIZE_ASSERT(PizzeriaState::StateStruct, 0x14)
 
 // FUNCTION: LEGO1 0x100179c0
 MxResult Pizzeria::Create(MxDSAction& p_dsAction)
@@ -63,3 +63,22 @@ undefined4 Pizzeria::HandleClick()
 
 	return 1;
 }
+
+// STUB: LEGO1 0x10017af0
+PizzeriaState::PizzeriaState()
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x10017d70
+MxU32 PizzeriaState::FUN_10017d70()
+{
+	return 0;
+}
+
+// STUB: LEGO1 0x10017da0
+MxResult PizzeriaState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
diff --git a/LEGO1/lego/legoomni/src/actors/radio.cpp b/LEGO1/lego/legoomni/src/actors/radio.cpp
index e78e7ba8..89d39357 100644
--- a/LEGO1/lego/legoomni/src/actors/radio.cpp
+++ b/LEGO1/lego/legoomni/src/actors/radio.cpp
@@ -1,6 +1,7 @@
 #include "radio.h"
 
 #include "isle_actions.h"
+#include "jukebox_actions.h"
 #include "legocontrolmanager.h"
 #include "legogamestate.h"
 #include "legoworld.h"
@@ -10,10 +11,52 @@
 #include "mxcontrolpresenter.h"
 #include "mxmisc.h"
 #include "mxnotificationmanager.h"
-#include "radiostate.h"
+#include "mxtimer.h"
 #include "scripts.h"
 
 DECOMP_SIZE_ASSERT(Radio, 0x10)
+DECOMP_SIZE_ASSERT(RadioState, 0x30)
+
+// GLOBAL: LEGO1 0x100f3218
+JukeboxScript::Script g_unk0x100f3218[6] = {
+	JukeboxScript::c_sns002ra_Audio,
+	JukeboxScript::c_sns001ja_Audio,
+	JukeboxScript::c_snsc01js_Audio,
+	JukeboxScript::c_snsb01js_Audio,
+	JukeboxScript::c_snsa01js_Audio,
+	JukeboxScript::c_sns009ra_Audio
+};
+
+// GLOBAL: LEGO1 0x100f3230
+JukeboxScript::Script g_unk0x100f3230[14] = {
+	JukeboxScript::c_ham035ra_Audio,
+	JukeboxScript::c_ham039ra_Audio,
+	JukeboxScript::c_sns005ra_Audio,
+	JukeboxScript::c_sns078pa_Audio,
+	JukeboxScript::c_ham036ra_Audio,
+	JukeboxScript::c_sns006ra_Audio,
+	JukeboxScript::c_sns013ra_Audio,
+	JukeboxScript::c_sns004ra_Audio,
+	JukeboxScript::c_sns079pa_Audio,
+	JukeboxScript::c_sns007ra_Audio,
+	JukeboxScript::c_sns008ra_Audio,
+	JukeboxScript::c_hpz037ma_Audio,
+	JukeboxScript::c_sns003ra_Audio,
+	JukeboxScript::c_sns010ra_Audio,
+};
+
+// GLOBAL: LEGO1 0x100f3268
+JukeboxScript::Script g_unk0x100f3268[9] = {
+	JukeboxScript::c_CentralRoads_Music,
+	JukeboxScript::c_BeachBlvd_Music,
+	JukeboxScript::c_ResidentalArea_Music,
+	JukeboxScript::c_Radio1_Music,
+	JukeboxScript::c_Radio2_Music,
+	JukeboxScript::c_Radio3_Music,
+	JukeboxScript::c_Radio4_Music,
+	JukeboxScript::c_Radio5_Music,
+	JukeboxScript::c_Radio6_Music,
+};
 
 // FUNCTION: LEGO1 0x1002c850
 Radio::Radio()
@@ -162,3 +205,56 @@ void Radio::CreateState()
 
 	m_state = state;
 }
+
+// FUNCTION: LEGO1 0x1002ce10
+RadioState::RadioState()
+{
+	srand(Timer()->GetTime());
+
+	MxS32 random = rand();
+	m_unk0x2c = random % 3;
+
+	m_unk0x08[0] = LegoState::Playlist((MxU32*) g_unk0x100f3218, sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0]));
+	m_unk0x08[0].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0])));
+
+	m_unk0x08[1] = LegoState::Playlist((MxU32*) g_unk0x100f3230, sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0]));
+	m_unk0x08[1].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0])));
+
+	m_unk0x08[2] = LegoState::Playlist((MxU32*) g_unk0x100f3268, sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0]));
+	m_unk0x08[2].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0])));
+
+	m_active = FALSE;
+}
+
+// FUNCTION: LEGO1 0x1002cf50
+MxBool RadioState::IsSerializable()
+{
+	return FALSE;
+}
+
+// FUNCTION: LEGO1 0x1002d090
+MxU32 RadioState::FUN_1002d090()
+{
+	if (m_unk0x2c == 2) {
+		m_unk0x2c = 0;
+	}
+	else {
+		m_unk0x2c++;
+	}
+
+	return m_unk0x08[m_unk0x2c].Next();
+}
+
+// FUNCTION: LEGO1 0x1002d0c0
+MxBool RadioState::FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId)
+{
+	if (*g_jukeboxScript == p_atom) {
+		for (MxS16 i = 0; i < 3; i++) {
+			if (m_unk0x08[i].Contains(p_objectId)) {
+				return TRUE;
+			}
+		}
+	}
+
+	return FALSE;
+}
diff --git a/LEGO1/lego/legoomni/src/actors/skateboard.cpp b/LEGO1/lego/legoomni/src/actors/skateboard.cpp
index ab37d3f1..814e1332 100644
--- a/LEGO1/lego/legoomni/src/actors/skateboard.cpp
+++ b/LEGO1/lego/legoomni/src/actors/skateboard.cpp
@@ -1,6 +1,5 @@
 #include "skateboard.h"
 
-#include "act1state.h"
 #include "decomp.h"
 #include "isle.h"
 #include "isle_actions.h"
diff --git a/LEGO1/lego/legoomni/src/actors/towtrack.cpp b/LEGO1/lego/legoomni/src/actors/towtrack.cpp
index cf155775..4f259903 100644
--- a/LEGO1/lego/legoomni/src/actors/towtrack.cpp
+++ b/LEGO1/lego/legoomni/src/actors/towtrack.cpp
@@ -7,9 +7,9 @@
 #include "mxmisc.h"
 #include "mxtimer.h"
 #include "mxvariabletable.h"
-#include "towtrackmissionstate.h"
 
 DECOMP_SIZE_ASSERT(TowTrack, 0x180)
+DECOMP_SIZE_ASSERT(TowTrackMissionState, 0x28)
 
 // FUNCTION: LEGO1 0x1004c720
 TowTrack::TowTrack()
@@ -131,3 +131,73 @@ void TowTrack::FUN_1004dbe0()
 {
 	// TODO
 }
+
+// FUNCTION: LEGO1 0x1004dd30
+TowTrackMissionState::TowTrackMissionState()
+{
+	m_unk0x12 = 0;
+	m_unk0x14 = 0;
+	m_unk0x16 = 0;
+	m_unk0x08 = 0;
+	m_unk0x18 = 0;
+	m_unk0x0c = 0;
+	m_unk0x1a = 0;
+	m_unk0x10 = 0;
+	m_score1 = 0;
+	m_score2 = 0;
+	m_score3 = 0;
+	m_score4 = 0;
+	m_score5 = 0;
+}
+
+// FUNCTION: LEGO1 0x1004dde0
+MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile)
+{
+	LegoState::Serialize(p_legoFile);
+
+	if (p_legoFile->IsReadMode()) {
+		p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
+		p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
+		p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
+		p_legoFile->Read(&m_unk0x18, sizeof(m_unk0x18));
+		p_legoFile->Read(&m_unk0x1a, sizeof(m_unk0x1a));
+		p_legoFile->Read(&m_score1, sizeof(m_score1));
+		p_legoFile->Read(&m_score2, sizeof(m_score2));
+		p_legoFile->Read(&m_score3, sizeof(m_score3));
+		p_legoFile->Read(&m_score4, sizeof(m_score4));
+		p_legoFile->Read(&m_score5, sizeof(m_score5));
+	}
+	else if (p_legoFile->IsWriteMode()) {
+		MxU16 write = m_unk0x12;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_unk0x14;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_unk0x16;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_unk0x18;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_unk0x1a;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_score1;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_score2;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_score3;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_score4;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+
+		write = m_score5;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+	}
+
+	return SUCCESS;
+}
diff --git a/LEGO1/lego/legoomni/src/build/helicopterstate.cpp b/LEGO1/lego/legoomni/src/build/helicopterstate.cpp
deleted file mode 100644
index 1a9ca3fa..00000000
--- a/LEGO1/lego/legoomni/src/build/helicopterstate.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "helicopterstate.h"
-
-DECOMP_SIZE_ASSERT(HelicopterState, 0x0c)
diff --git a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp
index f844aa08..ed32a3f2 100644
--- a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp
+++ b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp
@@ -1,6 +1,7 @@
 #include "legocarbuild.h"
 
 DECOMP_SIZE_ASSERT(LegoCarBuild, 0x34c)
+DECOMP_SIZE_ASSERT(LegoVehicleBuildState, 0x50)
 
 // STUB: LEGO1 0x100226d0
 LegoCarBuild::LegoCarBuild()
@@ -61,3 +62,20 @@ MxBool LegoCarBuild::Escape()
 	// TODO
 	return FALSE;
 }
+
+// FUNCTION: LEGO1 0x10025f30
+LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType)
+{
+	m_className = p_classType;
+	m_unk0x4c = 0;
+	m_unk0x4d = FALSE;
+	m_unk0x4e = FALSE;
+	m_placedPartCount = 0;
+}
+
+// STUB: LEGO1 0x10026120
+MxResult LegoVehicleBuildState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
diff --git a/LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp b/LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
similarity index 94%
rename from LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp
rename to LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
index d759364b..fddac82e 100644
--- a/LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp
+++ b/LEGO1/lego/legoomni/src/build/legocarbuildpresenter.cpp
@@ -1,4 +1,4 @@
-#include "legocarbuildanimpresenter.h"
+#include "legocarbuildpresenter.h"
 
 DECOMP_SIZE_ASSERT(LegoCarBuildAnimPresenter, 0x150)
 
diff --git a/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp b/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp
deleted file mode 100644
index 2e5df9ef..00000000
--- a/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "legovehiclebuildstate.h"
-
-#include "decomp.h"
-
-DECOMP_SIZE_ASSERT(LegoVehicleBuildState, 0x50)
-
-// FUNCTION: LEGO1 0x10025f30
-LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType)
-{
-	this->m_className = p_classType;
-	this->m_unk0x4c = 0;
-	this->m_unk0x4d = FALSE;
-	this->m_unk0x4e = FALSE;
-	this->m_placedPartCount = 0;
-}
-
-// STUB: LEGO1 0x10026120
-MxResult LegoVehicleBuildState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
diff --git a/LEGO1/lego/legoomni/src/common/animstate.cpp b/LEGO1/lego/legoomni/src/common/animstate.cpp
deleted file mode 100644
index 24a0bf12..00000000
--- a/LEGO1/lego/legoomni/src/common/animstate.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#include "animstate.h"
-
-DECOMP_SIZE_ASSERT(AnimState, 0x1c)
-DECOMP_SIZE_ASSERT(ModelInfo, 0x30)
-DECOMP_SIZE_ASSERT(AnimInfo, 0x30)
-
-// FUNCTION: LEGO1 0x10064ff0
-AnimState::AnimState()
-{
-	m_unk0x0c = 0;
-	m_unk0x10 = NULL;
-	m_unk0x14 = 0;
-	m_unk0x18 = NULL;
-}
-
-// STUB: LEGO1 0x10065150
-AnimState::~AnimState()
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x100651d0
-void AnimState::FUN_100651d0(MxU32, AnimInfo*, MxU32&)
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x10065240
-void AnimState::FUN_10065240(MxU32, AnimInfo*, MxU32)
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x100652d0
-MxResult AnimState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
-
-// STUB: LEGO1 0x100654f0
-MxBool AnimState::SetFlag()
-{
-	// TODO
-	return FALSE;
-}
diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
index fde5a979..f1915ef9 100644
--- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
@@ -2,7 +2,6 @@
 
 #include "3dmanager/lego3dmanager.h"
 #include "anim/legoanim.h"
-#include "animstate.h"
 #include "define.h"
 #include "islepathactor.h"
 #include "legoanimmmpresenter.h"
@@ -37,6 +36,9 @@ DECOMP_SIZE_ASSERT(LegoAnimationManager::Character, 0x18)
 DECOMP_SIZE_ASSERT(LegoAnimationManager::Vehicle, 0x08)
 DECOMP_SIZE_ASSERT(LegoAnimationManager::Extra, 0x18)
 DECOMP_SIZE_ASSERT(LegoTranInfo, 0x78)
+DECOMP_SIZE_ASSERT(AnimState, 0x1c)
+DECOMP_SIZE_ASSERT(AnimInfo, 0x30)
+DECOMP_SIZE_ASSERT(ModelInfo, 0x30)
 
 // GLOBAL: LEGO1 0x100d8b28
 MxU8 g_unk0x100d8b28[] = {0, 1, 2, 4, 8, 16};
@@ -2820,3 +2822,44 @@ void LegoAnimationManager::FUN_10064b50(MxLong p_time)
 		);
 	}
 }
+
+// FUNCTION: LEGO1 0x10064ff0
+AnimState::AnimState()
+{
+	m_unk0x0c = 0;
+	m_unk0x10 = NULL;
+	m_unk0x14 = 0;
+	m_unk0x18 = NULL;
+}
+
+// STUB: LEGO1 0x10065150
+AnimState::~AnimState()
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x100651d0
+void AnimState::FUN_100651d0(MxU32, AnimInfo*, MxU32&)
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x10065240
+void AnimState::FUN_10065240(MxU32, AnimInfo*, MxU32)
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x100652d0
+MxResult AnimState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
+
+// STUB: LEGO1 0x100654f0
+MxBool AnimState::SetFlag()
+{
+	// TODO
+	return FALSE;
+}
diff --git a/LEGO1/lego/legoomni/src/common/legogamestate.cpp b/LEGO1/lego/legoomni/src/common/legogamestate.cpp
index 0f339590..b7882a3c 100644
--- a/LEGO1/lego/legoomni/src/common/legogamestate.cpp
+++ b/LEGO1/lego/legoomni/src/common/legogamestate.cpp
@@ -1,7 +1,6 @@
 #include "legogamestate.h"
 
 #include "3dmanager/lego3dmanager.h"
-#include "act1state.h"
 #include "act2main_actions.h"
 #include "act3_actions.h"
 #include "carrace_actions.h"
@@ -15,7 +14,7 @@
 #include "helicopter.h"
 #include "histbook_actions.h"
 #include "hospital_actions.h"
-#include "infocenterstate.h"
+#include "infocenter.h"
 #include "infodoor_actions.h"
 #include "infomain_actions.h"
 #include "infoscor_actions.h"
diff --git a/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp b/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
index 46926705..23b0227e 100644
--- a/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp
@@ -7,27 +7,22 @@
 #include "dunebuggy.h"
 #include "elevatorbottom.h"
 #include "gasstation.h"
-#include "gasstationstate.h"
 #include "helicopter.h"
-#include "helicopterstate.h"
 #include "historybook.h"
 #include "hospital.h"
-#include "hospitalstate.h"
 #include "infocenter.h"
 #include "infocenterdoor.h"
-#include "infocenterstate.h"
 #include "isle.h"
 #include "jetskirace.h"
 #include "lego3dwavepresenter.h"
 #include "legoact2.h"
-#include "legoact2state.h"
 #include "legoactioncontrolpresenter.h"
 #include "legoactor.h"
 #include "legoactorpresenter.h"
 #include "legoanimactor.h"
 #include "legoanimpresenter.h"
 #include "legocarbuild.h"
-#include "legocarbuildanimpresenter.h"
+#include "legocarbuildpresenter.h"
 #include "legocarraceactor.h"
 #include "legoentity.h"
 #include "legoentitypresenter.h"
@@ -51,52 +46,34 @@
 #include "mxcontrolpresenter.h"
 #include "mxvideopresenter.h"
 #include "pizza.h"
-#include "pizzamissionstate.h"
 #include "police.h"
-#include "policestate.h"
 #include "registrationbook.h"
 #include "score.h"
-#include "scorestate.h"
 #include "skateboard.h"
 // #include "act2genactor.h"
 #include "act2policestation.h"
 #include "act3.h"
-#include "act3state.h"
 #include "ambulance.h"
-#include "ambulancemissionstate.h"
 #include "bike.h"
 #include "doors.h"
 #include "jetski.h"
+#include "legoanimationmanager.h"
 #include "legoanimmmpresenter.h"
 #include "motocycle.h"
 #include "racecar.h"
 #include "towtrack.h"
-#include "towtrackmissionstate.h"
 // #include "act3cop.h"
 // #include "act3brickster.h"
-#include "act1state.h"
 #include "act3actor.h"
 #include "act3shark.h"
-#include "animstate.h"
-#include "beachhouseentity.h"
+#include "buildings.h"
 #include "bumpbouy.h"
-#include "carracestate.h"
 #include "caveentity.h"
-#include "gasstationentity.h"
-#include "hospitalentity.h"
-#include "infocenterentity.h"
-#include "jailentity.h"
-#include "jetskiracestate.h"
 #include "jukebox.h"
 #include "jukeboxentity.h"
-#include "jukeboxstate.h"
 #include "mxcompositemediapresenter.h"
 #include "pizzeria.h"
-#include "pizzeriastate.h"
-#include "policeentity.h"
 #include "raceskel.h"
-#include "racestandsentity.h"
-#include "radiostate.h"
 
 // TODO: Before HospitalState, add all of the different LegoVehicleBuildState's
 
diff --git a/LEGO1/lego/legoomni/src/common/legoutils.cpp b/LEGO1/lego/legoomni/src/common/legoutils.cpp
index d769404e..8f9d9b12 100644
--- a/LEGO1/lego/legoomni/src/common/legoutils.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoutils.cpp
@@ -1,8 +1,8 @@
 #include "legoutils.h"
 
 #include "3dmanager/lego3dmanager.h"
-#include "act1state.h"
 #include "anim/legoanim.h"
+#include "isle.h"
 #include "islepathactor.h"
 #include "legoanimationmanager.h"
 #include "legoanimpresenter.h"
diff --git a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp
index 87274d00..70c2bb88 100644
--- a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp
+++ b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp
@@ -1,7 +1,7 @@
 #include "legonavcontroller.h"
 
 #include "3dmanager/lego3dmanager.h"
-#include "infocenterstate.h"
+#include "infocenter.h"
 #include "legoanimationmanager.h"
 #include "legocameracontroller.h"
 #include "legogamestate.h"
diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp
deleted file mode 100644
index aa14a197..00000000
--- a/LEGO1/lego/legoomni/src/gasstation/gasstationentity.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "gasstationentity.h"
-
-#include "act1state.h"
-#include "isle.h"
-#include "isle_actions.h"
-#include "islepathactor.h"
-#include "legoanimationmanager.h"
-#include "legogamestate.h"
-#include "legoutils.h"
-#include "legoworld.h"
-#include "misc.h"
-#include "mxtransitionmanager.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(GasStationEntity, 0x68)
-
-// FUNCTION: LEGO1 0x100151d0
-MxLong GasStationEntity::VTable0x50(MxParam& p_param)
-{
-	if (FUN_1003ef60()) {
-		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
-
-		if (state->GetUnknown18() != 8) {
-			state->SetUnknown18(0);
-
-			if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
-				((IslePathActor*) CurrentActor())->VTable0xe4();
-			}
-
-			Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
-			isle->SetDestLocation(LegoGameState::Area::e_garage);
-
-			AnimationManager()->FUN_10061010(FALSE);
-			TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
-		}
-	}
-
-	return 1;
-}
diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp
deleted file mode 100644
index 613a74eb..00000000
--- a/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "gasstationstate.h"
-
-DECOMP_SIZE_ASSERT(GasStationState, 0x24)
-
-// FUNCTION: LEGO1 0x10005eb0
-GasStationState::GasStationState()
-{
-	m_unk0x18 = 0;
-	m_unk0x1a = 0;
-	m_unk0x1c = 0;
-	m_unk0x1e = 0;
-	m_unk0x20 = 0;
-
-	undefined4* unk0x08 = m_unk0x08;
-	unk0x08[0] = -1;
-	unk0x08[1] = -1;
-	unk0x08[2] = -1;
-}
-
-// STUB: LEGO1 0x10006300
-MxResult GasStationState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
-
-// STUB: LEGO1 0x10006430
-void GasStationState::FUN_10006430(undefined4)
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x10006490
-void GasStationState::FUN_10006490()
-{
-	// TODO
-}
diff --git a/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp b/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp
deleted file mode 100644
index 860bd0f0..00000000
--- a/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "ambulancemissionstate.h"
-
-DECOMP_SIZE_ASSERT(AmbulanceMissionState, 0x24)
-
-// FUNCTION: LEGO1 0x100373a0
-AmbulanceMissionState::AmbulanceMissionState()
-{
-	m_unk0x10 = 0;
-	m_unk0x12 = 0;
-	m_unk0x14 = 0;
-	m_unk0x08 = 0;
-	m_unk0x16 = 0;
-	m_unk0x0c = 0;
-	m_unk0x18 = 0;
-	m_score1 = 0;
-	m_score2 = 0;
-	m_score3 = 0;
-	m_score4 = 0;
-	m_score5 = 0;
-}
-
-// STUB: LEGO1 0x10037440
-MxResult AmbulanceMissionState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
diff --git a/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp b/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp
deleted file mode 100644
index b6c995d9..00000000
--- a/LEGO1/lego/legoomni/src/hospital/hospitalentity.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "hospitalentity.h"
-
-#include "act1state.h"
-#include "isle.h"
-#include "isle_actions.h"
-#include "islepathactor.h"
-#include "legoanimationmanager.h"
-#include "legogamestate.h"
-#include "legoutils.h"
-#include "legoworld.h"
-#include "misc.h"
-#include "mxtransitionmanager.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(HospitalEntity, 0x68)
-
-// FUNCTION: LEGO1 0x10015270
-MxLong HospitalEntity::VTable0x50(MxParam& p_param)
-{
-	if (FUN_1003ef60()) {
-		Act1State* act1State = (Act1State*) GameState()->GetState("Act1State");
-
-		if (act1State->GetUnknown18() != 10) {
-			act1State->SetUnknown18(0);
-
-			if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
-				((IslePathActor*) CurrentActor())->VTable0xe4();
-			}
-
-			Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
-			isle->SetDestLocation(LegoGameState::Area::e_hospital);
-
-			AnimationManager()->FUN_10061010(FALSE);
-			TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
-		}
-	}
-
-	return 1;
-}
diff --git a/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp b/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp
deleted file mode 100644
index da61f0fb..00000000
--- a/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "hospitalstate.h"
-
-DECOMP_SIZE_ASSERT(HospitalState, 0x18)
-
-// FUNCTION: LEGO1 0x10076370
-HospitalState::HospitalState()
-{
-	m_unk0x0c = 0;
-	m_unk0x0e = 0;
-	m_unk0x10 = 0;
-	m_unk0x12 = 0;
-	m_unk0x14 = 0;
-	m_unk0x16 = 0;
-}
-
-// FUNCTION: LEGO1 0x10076530
-MxResult HospitalState::Serialize(LegoFile* p_legoFile)
-{
-	LegoState::Serialize(p_legoFile);
-
-	if (p_legoFile->IsWriteMode()) {
-		// A write variable needs to be used here, otherwise
-		// the compiler aggresively optimizes the function
-		MxS16 write;
-
-		write = m_unk0x0c;
-		p_legoFile->Write(&write, sizeof(m_unk0x0c));
-		write = m_unk0x0e;
-		p_legoFile->Write(&write, sizeof(m_unk0x0e));
-		write = m_unk0x10;
-		p_legoFile->Write(&write, sizeof(m_unk0x10));
-		write = m_unk0x12;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-		write = m_unk0x14;
-		p_legoFile->Write(&write, sizeof(m_unk0x14));
-		write = m_unk0x16;
-		p_legoFile->Write(&write, sizeof(m_unk0x16));
-	}
-	else if (p_legoFile->IsReadMode()) {
-		p_legoFile->Read(&m_unk0x0c, sizeof(m_unk0x0c));
-		p_legoFile->Read(&m_unk0x0e, sizeof(m_unk0x0e));
-		p_legoFile->Read(&m_unk0x10, sizeof(m_unk0x10));
-		p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
-		p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
-		p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
-	}
-
-	return SUCCESS;
-}
diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp
deleted file mode 100644
index 1928f1c7..00000000
--- a/LEGO1/lego/legoomni/src/infocenter/infocenterentity.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include "infocenterentity.h"
-
-#include "act1state.h"
-#include "act2main_actions.h"
-#include "act3.h"
-#include "act3_actions.h"
-#include "act3state.h"
-#include "isle.h"
-#include "isle_actions.h"
-#include "islepathactor.h"
-#include "legoact2.h"
-#include "legoact2state.h"
-#include "legoanimationmanager.h"
-#include "legogamestate.h"
-#include "legoutils.h"
-#include "legoworld.h"
-#include "misc.h"
-#include "mxtransitionmanager.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(InfoCenterEntity, 0x68)
-
-// FUNCTION: LEGO1 0x100150c0
-MxLong InfoCenterEntity::VTable0x50(MxParam& p_param)
-{
-	switch (GameState()->GetCurrentAct()) {
-	case LegoGameState::Act::e_act1: {
-		if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
-			((IslePathActor*) CurrentActor())->VTable0xe4();
-		}
-
-		Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
-		isle->FUN_10033350();
-		isle->SetDestLocation(LegoGameState::Area::e_infomain);
-
-		Act1State* act1state = (Act1State*) GameState()->GetState("Act1State");
-		act1state->SetUnknown18(0);
-		break;
-	}
-	case LegoGameState::Act::e_act2: {
-		LegoAct2* act2 = (LegoAct2*) FindWorld(*g_act2mainScript, Act2mainScript::c__Act2Main);
-		act2->SetUnknown0x1150(2);
-
-		LegoAct2State* act2state = (LegoAct2State*) GameState()->GetState("LegoAct2State");
-		if (act2state) {
-			act2state->SetUnknown0x0c(0);
-		}
-		break;
-	}
-	case LegoGameState::Act::e_act3:
-		Act3* act3 = (Act3*) FindWorld(*g_act3Script, Act3Script::c__Act3);
-		act3->SetUnknown4270(2);
-		break;
-	}
-
-	AnimationManager()->FUN_10061010(FALSE);
-	TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
-
-	return 1;
-}
diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenterstate.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenterstate.cpp
deleted file mode 100644
index 0fd99839..00000000
--- a/LEGO1/lego/legoomni/src/infocenter/infocenterstate.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#include "infocenterstate.h"
-
-#include "infocenter.h"
-#include "infomain_actions.h"
-#include "mxstillpresenter.h"
-
-DECOMP_SIZE_ASSERT(InfocenterState, 0x94)
-
-// GLOBAL: LEGO1 0x100f76a8
-InfomainScript::Script g_exitDialogueAct1[14] = {
-	InfomainScript::c_iic019in_RunAnim,
-	InfomainScript::c_iic020in_RunAnim,
-	InfomainScript::c_iic021in_RunAnim,
-	InfomainScript::c_iic022in_RunAnim,
-	InfomainScript::c_iic023in_RunAnim,
-	InfomainScript::c_iic024in_RunAnim,
-	InfomainScript::c_iic025in_RunAnim,
-	InfomainScript::c_iic026in_RunAnim,
-	InfomainScript::c_iic027in_RunAnim,
-	InfomainScript::c_iica28in_RunAnim,
-	InfomainScript::c_iicb28in_RunAnim,
-	InfomainScript::c_iicc28in_RunAnim,
-	InfomainScript::c_iic029in_RunAnim,
-	InfomainScript::c_iic032in_RunAnim
-};
-
-// GLOBAL: LEGO1 0x100f76e0
-InfomainScript::Script g_exitDialogueAct23[6] = {
-	InfomainScript::c_iic027in_RunAnim,
-	InfomainScript::c_iic029in_RunAnim,
-	InfomainScript::c_iic048in_RunAnim,
-	InfomainScript::c_iic056in_RunAnim,
-	InfomainScript::c_iicx23in_RunAnim
-	// Zero-terminated
-};
-
-// GLOBAL: LEGO1 0x100f76f8
-InfomainScript::Script g_returnDialogueAct1[6] = {
-	InfomainScript::c_iicx26in_RunAnim,
-	InfomainScript::c_iic033in_RunAnim,
-	InfomainScript::c_iic034in_RunAnim,
-	InfomainScript::c_iic035in_RunAnim,
-	InfomainScript::c_iic036in_RunAnim
-	// Zero-terminated
-};
-
-// GLOBAL: LEGO1 0x100f7710
-InfomainScript::Script g_returnDialogueAct2[4] = {
-	InfomainScript::c_iic048in_RunAnim,
-	InfomainScript::c_iic049in_RunAnim,
-	InfomainScript::c_iic050in_RunAnim,
-	// Zero-terminated
-};
-
-// GLOBAL: LEGO1 0x100f7720
-InfomainScript::Script g_returnDialogueAct3[4] = {
-	InfomainScript::c_iic055in_RunAnim,
-	InfomainScript::c_iic056in_RunAnim,
-	InfomainScript::c_iic057in_RunAnim,
-	InfomainScript::c_iic058in_RunAnim
-};
-
-// GLOBAL: LEGO1 0x100f7730
-InfomainScript::Script g_leaveDialogueAct1[4] = {
-	InfomainScript::c_iic039in_PlayWav,
-	InfomainScript::c_iic040in_PlayWav,
-	InfomainScript::c_iic041in_PlayWav,
-	InfomainScript::c_iic042in_PlayWav
-};
-
-// GLOBAL: LEGO1 0x100f7740
-InfomainScript::Script g_leaveDialogueAct2[4] = {
-	InfomainScript::c_iic051in_PlayWav,
-	InfomainScript::c_iic052in_PlayWav,
-	InfomainScript::c_iic053in_PlayWav,
-	InfomainScript::c_iic054in_PlayWav
-};
-
-// GLOBAL: LEGO1 0x100f7750
-InfomainScript::Script g_leaveDialogueAct3[4] = {
-	InfomainScript::c_iic059in_PlayWav,
-	InfomainScript::c_iic060in_PlayWav,
-	InfomainScript::c_iic061in_PlayWav,
-	// Zero-terminated
-};
-
-// GLOBAL: LEGO1 0x100f7760
-InfomainScript::Script g_bricksterDialogue[2] = {
-	InfomainScript::c_sbleh2br_PlayWav,
-	InfomainScript::c_snshahbr_PlayWav
-};
-
-// FUNCTION: LEGO1 0x10071600
-InfocenterState::InfocenterState()
-{
-	m_exitDialogueAct1 = LegoState::Playlist((MxU32*) g_exitDialogueAct1, sizeOfArray(g_exitDialogueAct1));
-	m_exitDialogueAct23 = LegoState::Playlist((MxU32*) g_exitDialogueAct23, sizeOfArray(g_exitDialogueAct23) - 1);
-
-	m_returnDialogue[LegoGameState::e_act1] =
-		LegoState::Playlist((MxU32*) g_returnDialogueAct1, sizeOfArray(g_returnDialogueAct1) - 1);
-
-	m_returnDialogue[LegoGameState::e_act2] =
-		LegoState::Playlist((MxU32*) g_returnDialogueAct2, sizeOfArray(g_returnDialogueAct2) - 1);
-
-	m_returnDialogue[LegoGameState::e_act3] =
-		LegoState::Playlist((MxU32*) g_returnDialogueAct3, sizeOfArray(g_returnDialogueAct3));
-
-	m_leaveDialogue[LegoGameState::e_act1] =
-		LegoState::Playlist((MxU32*) g_leaveDialogueAct1, sizeOfArray(g_leaveDialogueAct1));
-
-	m_leaveDialogue[LegoGameState::e_act2] =
-		LegoState::Playlist((MxU32*) g_leaveDialogueAct2, sizeOfArray(g_leaveDialogueAct2));
-
-	m_leaveDialogue[LegoGameState::e_act3] =
-		LegoState::Playlist((MxU32*) g_leaveDialogueAct3, sizeOfArray(g_leaveDialogueAct3) - 1);
-
-	m_bricksterDialogue = LegoState::Playlist((MxU32*) g_bricksterDialogue, sizeOfArray(g_bricksterDialogue));
-
-	memset(m_letters, 0, sizeof(m_letters));
-}
-
-// FUNCTION: LEGO1 0x10071920
-InfocenterState::~InfocenterState()
-{
-	MxS16 i = 0;
-	do {
-		if (GetNameLetter(i) != NULL) {
-			delete GetNameLetter(i)->GetAction();
-			delete GetNameLetter(i);
-		}
-		i++;
-	} while (i < GetMaxNameLength());
-}
diff --git a/LEGO1/lego/legoomni/src/infocenter/scorestate.cpp b/LEGO1/lego/legoomni/src/infocenter/scorestate.cpp
deleted file mode 100644
index e1b3522c..00000000
--- a/LEGO1/lego/legoomni/src/infocenter/scorestate.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "scorestate.h"
-
-DECOMP_SIZE_ASSERT(ScoreState, 0x0c)
-
-// FUNCTION: LEGO1 0x1000de20
-MxBool ScoreState::IsSerializable()
-{
-	return FALSE;
-}
-
-// FUNCTION: LEGO1 0x1000de30
-MxBool ScoreState::SetFlag()
-{
-	m_playCubeTutorial = TRUE;
-	return TRUE;
-}
diff --git a/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp b/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp
deleted file mode 100644
index 1e7167dd..00000000
--- a/LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "beachhouseentity.h"
-
-#include "act1state.h"
-#include "isle.h"
-#include "isle_actions.h"
-#include "islepathactor.h"
-#include "legoanimationmanager.h"
-#include "legogamestate.h"
-#include "legoutils.h"
-#include "legoworld.h"
-#include "misc.h"
-#include "mxtransitionmanager.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(BeachHouseEntity, 0x68)
-
-// FUNCTION: LEGO1 0x100153b0
-MxLong BeachHouseEntity::VTable0x50(MxParam& p_param)
-{
-	if (FUN_1003ef60()) {
-		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
-		state->SetUnknown18(0);
-
-		if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
-			((IslePathActor*) CurrentActor())->VTable0xe4();
-		}
-
-		Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
-		isle->SetDestLocation(LegoGameState::Area::e_jetskibuild);
-
-		AnimationManager()->FUN_10061010(FALSE);
-		TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
-	}
-
-	return 1;
-}
diff --git a/LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp b/LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp
deleted file mode 100644
index 7efc9695..00000000
--- a/LEGO1/lego/legoomni/src/isle/jukeboxstate.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "jukeboxstate.h"
-
-DECOMP_SIZE_ASSERT(JukeBoxState, 0x10)
-
-// FUNCTION: LEGO1 0x1000f300
-MxBool JukeBoxState::IsSerializable()
-{
-	return FALSE;
-}
diff --git a/LEGO1/lego/legoomni/src/isle/radiostate.cpp b/LEGO1/lego/legoomni/src/isle/radiostate.cpp
deleted file mode 100644
index 5927a94b..00000000
--- a/LEGO1/lego/legoomni/src/isle/radiostate.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#include "radiostate.h"
-
-#include "jukebox.h"
-#include "jukebox_actions.h"
-#include "mxmisc.h"
-#include "mxtimer.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(RadioState, 0x30)
-
-// GLOBAL: LEGO1 0x100f3218
-JukeboxScript::Script g_unk0x100f3218[6] = {
-	JukeboxScript::c_sns002ra_Audio,
-	JukeboxScript::c_sns001ja_Audio,
-	JukeboxScript::c_snsc01js_Audio,
-	JukeboxScript::c_snsb01js_Audio,
-	JukeboxScript::c_snsa01js_Audio,
-	JukeboxScript::c_sns009ra_Audio
-};
-
-// GLOBAL: LEGO1 0x100f3230
-JukeboxScript::Script g_unk0x100f3230[14] = {
-	JukeboxScript::c_ham035ra_Audio,
-	JukeboxScript::c_ham039ra_Audio,
-	JukeboxScript::c_sns005ra_Audio,
-	JukeboxScript::c_sns078pa_Audio,
-	JukeboxScript::c_ham036ra_Audio,
-	JukeboxScript::c_sns006ra_Audio,
-	JukeboxScript::c_sns013ra_Audio,
-	JukeboxScript::c_sns004ra_Audio,
-	JukeboxScript::c_sns079pa_Audio,
-	JukeboxScript::c_sns007ra_Audio,
-	JukeboxScript::c_sns008ra_Audio,
-	JukeboxScript::c_hpz037ma_Audio,
-	JukeboxScript::c_sns003ra_Audio,
-	JukeboxScript::c_sns010ra_Audio,
-};
-
-// GLOBAL: LEGO1 0x100f3268
-JukeboxScript::Script g_unk0x100f3268[9] = {
-	JukeboxScript::c_CentralRoads_Music,
-	JukeboxScript::c_BeachBlvd_Music,
-	JukeboxScript::c_ResidentalArea_Music,
-	JukeboxScript::c_Radio1_Music,
-	JukeboxScript::c_Radio2_Music,
-	JukeboxScript::c_Radio3_Music,
-	JukeboxScript::c_Radio4_Music,
-	JukeboxScript::c_Radio5_Music,
-	JukeboxScript::c_Radio6_Music,
-};
-
-// FUNCTION: LEGO1 0x1002ce10
-RadioState::RadioState()
-{
-	srand(Timer()->GetTime());
-
-	MxS32 random = rand();
-	m_unk0x2c = random % 3;
-
-	m_unk0x08[0] = LegoState::Playlist((MxU32*) g_unk0x100f3218, sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0]));
-	m_unk0x08[0].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3218) / sizeof(g_unk0x100f3218[0])));
-
-	m_unk0x08[1] = LegoState::Playlist((MxU32*) g_unk0x100f3230, sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0]));
-	m_unk0x08[1].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3230) / sizeof(g_unk0x100f3230[0])));
-
-	m_unk0x08[2] = LegoState::Playlist((MxU32*) g_unk0x100f3268, sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0]));
-	m_unk0x08[2].SetUnknown0x08(rand() % (sizeof(g_unk0x100f3268) / sizeof(g_unk0x100f3268[0])));
-
-	m_active = FALSE;
-}
-
-// FUNCTION: LEGO1 0x1002cf50
-MxBool RadioState::IsSerializable()
-{
-	return FALSE;
-}
-
-// FUNCTION: LEGO1 0x1002d090
-MxU32 RadioState::FUN_1002d090()
-{
-	if (m_unk0x2c == 2) {
-		m_unk0x2c = 0;
-	}
-	else {
-		m_unk0x2c++;
-	}
-
-	return m_unk0x08[m_unk0x2c].Next();
-}
-
-// FUNCTION: LEGO1 0x1002d0c0
-MxBool RadioState::FUN_1002d0c0(const MxAtomId& p_atom, MxU32 p_objectId)
-{
-	if (*g_jukeboxScript == p_atom) {
-		for (MxS16 i = 0; i < 3; i++) {
-			if (m_unk0x08[i].Contains(p_objectId)) {
-				return TRUE;
-			}
-		}
-	}
-
-	return FALSE;
-}
diff --git a/LEGO1/lego/legoomni/src/paths/legopathstruct.cpp b/LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
index db2cc767..d15d083b 100644
--- a/LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
+++ b/LEGO1/lego/legoomni/src/paths/legopathstruct.cpp
@@ -1,8 +1,8 @@
 #include "legopathstruct.h"
 
 #include "isle.h"
+#include "jukebox.h"
 #include "jukebox_actions.h"
-#include "jukeboxstate.h"
 #include "legohideanimpresenter.h"
 #include "legopathactor.h"
 #include "legoutils.h"
diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp
deleted file mode 100644
index 543a5152..00000000
--- a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "pizzamissionstate.h"
-
-DECOMP_SIZE_ASSERT(PizzaMissionStateEntry, 0x20)
-DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb0)
-
-// STUB: LEGO1 0x100393c0
-MxResult PizzaMissionState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
-
-// FUNCTION: LEGO1 0x10039510
-PizzaMissionStateEntry* PizzaMissionState::GetState(MxU8 p_id)
-{
-	for (MxS16 i = 0; i < 5; i++) {
-		if (m_state[i].m_id == p_id) {
-			return m_state + i;
-		}
-	}
-
-	return NULL;
-}
diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp
deleted file mode 100644
index 3271c3d6..00000000
--- a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "pizzeriastate.h"
-
-DECOMP_SIZE_ASSERT(PizzeriaState, 0x58)
-
-// STUB: LEGO1 0x10017af0
-PizzeriaState::PizzeriaState()
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x10017d70
-MxU32 PizzeriaState::FUN_10017d70()
-{
-	return 0;
-}
-
-// STUB: LEGO1 0x10017da0
-MxResult PizzeriaState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
diff --git a/LEGO1/lego/legoomni/src/police/policeentity.cpp b/LEGO1/lego/legoomni/src/police/policeentity.cpp
deleted file mode 100644
index a9090b61..00000000
--- a/LEGO1/lego/legoomni/src/police/policeentity.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "policeentity.h"
-
-#include "act1state.h"
-#include "isle.h"
-#include "isle_actions.h"
-#include "islepathactor.h"
-#include "legoanimationmanager.h"
-#include "legogamestate.h"
-#include "legoutils.h"
-#include "legoworld.h"
-#include "misc.h"
-#include "mxtransitionmanager.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(PoliceEntity, 0x68)
-
-// FUNCTION: LEGO1 0x10015310
-MxLong PoliceEntity::VTable0x50(MxParam& p_param)
-{
-	if (FUN_1003ef60()) {
-		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
-
-		if (state->GetUnknown18() != 10) {
-			state->SetUnknown18(0);
-
-			if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
-				((IslePathActor*) CurrentActor())->VTable0xe4();
-			}
-
-			Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
-			isle->SetDestLocation(LegoGameState::Area::e_police);
-
-			AnimationManager()->FUN_10061010(FALSE);
-			TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
-		}
-	}
-
-	return 1;
-}
diff --git a/LEGO1/lego/legoomni/src/police/policestate.cpp b/LEGO1/lego/legoomni/src/police/policestate.cpp
deleted file mode 100644
index c0a6e716..00000000
--- a/LEGO1/lego/legoomni/src/police/policestate.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#include "policestate.h"
-
-#include "islepathactor.h"
-#include "misc.h"
-#include "mxdsaction.h"
-#include "mxmisc.h"
-#include "police.h"
-#include "police_actions.h"
-#include "scripts.h"
-
-#include <stdlib.h>
-
-DECOMP_SIZE_ASSERT(PoliceState, 0x10)
-
-// FUNCTION: LEGO1 0x1005e7c0
-PoliceState::PoliceState()
-{
-	m_unk0x0c = 0;
-	m_policeScript = (rand() % 2 == 0) ? PoliceScript::c_nps002la_RunAnim : PoliceScript::c_nps001ni_RunAnim;
-}
-
-// FUNCTION: LEGO1 0x1005e990
-MxResult PoliceState::Serialize(LegoFile* p_legoFile)
-{
-	LegoState::Serialize(p_legoFile);
-
-	if (p_legoFile->IsReadMode()) {
-		p_legoFile->Read(&m_policeScript, sizeof(m_policeScript));
-	}
-	else {
-		PoliceScript::Script policeScript = m_policeScript;
-		p_legoFile->Write(&policeScript, sizeof(m_policeScript));
-	}
-
-	return SUCCESS;
-}
-
-// FUNCTION: LEGO1 0x1005ea40
-void PoliceState::FUN_1005ea40()
-{
-	PoliceScript::Script policeScript;
-
-	if (m_unk0x0c == 1) {
-		return;
-	}
-
-	switch (CurrentActor()->GetActorId()) {
-	case 4:
-		policeScript = PoliceScript::c_nps002la_RunAnim;
-		m_policeScript = policeScript;
-		break;
-	case 5:
-		policeScript = PoliceScript::c_nps001ni_RunAnim;
-		m_policeScript = policeScript;
-		break;
-	default:
-		policeScript = m_policeScript;
-		m_policeScript = policeScript == PoliceScript::c_nps002la_RunAnim ? PoliceScript::c_nps001ni_RunAnim
-																		  : PoliceScript::c_nps002la_RunAnim;
-	}
-
-	{
-		MxDSAction action;
-		action.SetObjectId(policeScript);
-		action.SetAtomId(*g_policeScript);
-		Start(&action);
-	}
-
-	m_unk0x0c = 1;
-}
diff --git a/LEGO1/lego/legoomni/src/race/legorace.cpp b/LEGO1/lego/legoomni/src/race/legorace.cpp
index c7959fc7..a2204345 100644
--- a/LEGO1/lego/legoomni/src/race/legorace.cpp
+++ b/LEGO1/lego/legoomni/src/race/legorace.cpp
@@ -4,6 +4,9 @@
 #include "mxnotificationmanager.h"
 
 DECOMP_SIZE_ASSERT(LegoRace, 0x144)
+DECOMP_SIZE_ASSERT(RaceState::Entry, 0x06)
+// TODO: Must be 0x2c but current structure is incorrect
+// DECOMP_SIZE_ASSERT(RaceState, 0x2c)
 
 // FUNCTION: LEGO1 0x1000dab0
 undefined4 LegoRace::VTable0x78(undefined4)
@@ -87,3 +90,30 @@ void LegoRace::Enable(MxBool p_enable)
 {
 	// TODO
 }
+
+// STUB: LEGO1 0x10015f30
+RaceState::RaceState()
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x10016140
+MxResult RaceState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
+
+// FUNCTION: LEGO1 0x10016280
+RaceState::Entry* RaceState::GetState(MxU8 p_id)
+{
+	for (MxS16 i = 0;; i++) {
+		if (i >= 5) {
+			return NULL;
+		}
+
+		if (m_state[i].m_id == p_id) {
+			return m_state + i;
+		}
+	}
+}
diff --git a/LEGO1/lego/legoomni/src/race/racestandsentity.cpp b/LEGO1/lego/legoomni/src/race/racestandsentity.cpp
deleted file mode 100644
index 8cceb324..00000000
--- a/LEGO1/lego/legoomni/src/race/racestandsentity.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "racestandsentity.h"
-
-#include "act1state.h"
-#include "isle.h"
-#include "isle_actions.h"
-#include "islepathactor.h"
-#include "legoanimationmanager.h"
-#include "legogamestate.h"
-#include "legoutils.h"
-#include "legoworld.h"
-#include "misc.h"
-#include "mxtransitionmanager.h"
-#include "scripts.h"
-
-DECOMP_SIZE_ASSERT(RaceStandsEntity, 0x68)
-
-// FUNCTION: LEGO1 0x10015450
-MxLong RaceStandsEntity::VTable0x50(MxParam& p_param)
-{
-	if (FUN_1003ef60()) {
-		Act1State* state = (Act1State*) GameState()->GetState("Act1State");
-		state->SetUnknown18(0);
-
-		if (CurrentActor()->GetActorId() != GameState()->GetActorId()) {
-			((IslePathActor*) CurrentActor())->VTable0xe4();
-		}
-
-		Isle* isle = (Isle*) FindWorld(*g_isleScript, IsleScript::c__Isle);
-		isle->SetDestLocation(LegoGameState::Area::e_racecarbuild);
-
-		AnimationManager()->FUN_10061010(FALSE);
-		TransitionManager()->StartTransition(MxTransitionManager::e_mosaic, 50, FALSE, FALSE);
-	}
-
-	return 1;
-}
diff --git a/LEGO1/lego/legoomni/src/race/racestate.cpp b/LEGO1/lego/legoomni/src/race/racestate.cpp
deleted file mode 100644
index 897190f7..00000000
--- a/LEGO1/lego/legoomni/src/race/racestate.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#include "racestate.h"
-
-DECOMP_SIZE_ASSERT(RaceStateEntry, 0x06)
-
-// TODO: Must be 0x2c but current structure is incorrect
-// DECOMP_SIZE_ASSERT(RaceState, 0x2c)
-
-// STUB: LEGO1 0x10015f30
-RaceState::RaceState()
-{
-	// TODO
-}
-
-// STUB: LEGO1 0x10016140
-MxResult RaceState::Serialize(LegoFile* p_legoFile)
-{
-	// TODO
-	return LegoState::Serialize(p_legoFile);
-}
-
-// FUNCTION: LEGO1 0x10016280
-RaceStateEntry* RaceState::GetState(MxU8 p_id)
-{
-	for (MxS16 i = 0;; i++) {
-		if (i >= 5) {
-			return NULL;
-		}
-
-		if (m_state[i].m_id == p_id) {
-			return m_state + i;
-		}
-	}
-}
diff --git a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp
deleted file mode 100644
index bbf080ff..00000000
--- a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "towtrackmissionstate.h"
-
-DECOMP_SIZE_ASSERT(TowTrackMissionState, 0x28)
-
-// FUNCTION: LEGO1 0x1004dd30
-TowTrackMissionState::TowTrackMissionState()
-{
-	m_unk0x12 = 0;
-	m_unk0x14 = 0;
-	m_unk0x16 = 0;
-	m_unk0x08 = 0;
-	m_unk0x18 = 0;
-	m_unk0x0c = 0;
-	m_unk0x1a = 0;
-	m_unk0x10 = 0;
-	m_score1 = 0;
-	m_score2 = 0;
-	m_score3 = 0;
-	m_score4 = 0;
-	m_score5 = 0;
-}
-
-// FUNCTION: LEGO1 0x1004dde0
-MxResult TowTrackMissionState::Serialize(LegoFile* p_legoFile)
-{
-	LegoState::Serialize(p_legoFile);
-
-	if (p_legoFile->IsReadMode()) {
-		p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
-		p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
-		p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
-		p_legoFile->Read(&m_unk0x18, sizeof(m_unk0x18));
-		p_legoFile->Read(&m_unk0x1a, sizeof(m_unk0x1a));
-		p_legoFile->Read(&m_score1, sizeof(m_score1));
-		p_legoFile->Read(&m_score2, sizeof(m_score2));
-		p_legoFile->Read(&m_score3, sizeof(m_score3));
-		p_legoFile->Read(&m_score4, sizeof(m_score4));
-		p_legoFile->Read(&m_score5, sizeof(m_score5));
-	}
-	else if (p_legoFile->IsWriteMode()) {
-		MxU16 write = m_unk0x12;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_unk0x14;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_unk0x16;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_unk0x18;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_unk0x1a;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_score1;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_score2;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_score3;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_score4;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-
-		write = m_score5;
-		p_legoFile->Write(&write, sizeof(m_unk0x12));
-	}
-
-	return SUCCESS;
-}
diff --git a/LEGO1/lego/legoomni/src/worlds/act3.cpp b/LEGO1/lego/legoomni/src/worlds/act3.cpp
index 98f789da..c8ec77c3 100644
--- a/LEGO1/lego/legoomni/src/worlds/act3.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/act3.cpp
@@ -1,6 +1,7 @@
 #include "act3.h"
 
 DECOMP_SIZE_ASSERT(Act3, 0x4274)
+DECOMP_SIZE_ASSERT(Act3State, 0x0c)
 
 // STUB: LEGO1 0x10072270
 Act3::Act3()
diff --git a/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp b/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
index 219fcf79..3b8381da 100644
--- a/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/elevatorbottom.cpp
@@ -1,7 +1,7 @@
 #include "elevatorbottom.h"
 
-#include "act1state.h"
 #include "elevbott_actions.h"
+#include "isle.h"
 #include "jukebox.h"
 #include "jukebox_actions.h"
 #include "legocontrolmanager.h"
diff --git a/LEGO1/lego/legoomni/src/worlds/gasstation.cpp b/LEGO1/lego/legoomni/src/worlds/gasstation.cpp
index 5f48e5f0..82ef467b 100644
--- a/LEGO1/lego/legoomni/src/worlds/gasstation.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/gasstation.cpp
@@ -1,7 +1,6 @@
 #include "gasstation.h"
 
 #include "garage_actions.h"
-#include "gasstationstate.h"
 #include "islepathactor.h"
 #include "jukebox.h"
 #include "jukebox_actions.h"
@@ -21,6 +20,7 @@
 #include "scripts.h"
 
 DECOMP_SIZE_ASSERT(GasStation, 0x128)
+DECOMP_SIZE_ASSERT(GasStationState, 0x24)
 
 // GLOBAL: LEGO1 0x100f0160
 undefined4 g_unk0x100f0160 = 3;
@@ -419,3 +419,37 @@ MxBool GasStation::Escape()
 	m_destLocation = LegoGameState::Area::e_infomain;
 	return TRUE;
 }
+
+// FUNCTION: LEGO1 0x10005eb0
+GasStationState::GasStationState()
+{
+	m_unk0x18 = 0;
+	m_unk0x1a = 0;
+	m_unk0x1c = 0;
+	m_unk0x1e = 0;
+	m_unk0x20 = 0;
+
+	undefined4* unk0x08 = m_unk0x08;
+	unk0x08[0] = -1;
+	unk0x08[1] = -1;
+	unk0x08[2] = -1;
+}
+
+// STUB: LEGO1 0x10006300
+MxResult GasStationState::Serialize(LegoFile* p_legoFile)
+{
+	// TODO
+	return LegoState::Serialize(p_legoFile);
+}
+
+// STUB: LEGO1 0x10006430
+void GasStationState::FUN_10006430(undefined4)
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x10006490
+void GasStationState::FUN_10006490()
+{
+	// TODO
+}
diff --git a/LEGO1/lego/legoomni/src/worlds/hospital.cpp b/LEGO1/lego/legoomni/src/worlds/hospital.cpp
index d62baa21..c715bcf6 100644
--- a/LEGO1/lego/legoomni/src/worlds/hospital.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/hospital.cpp
@@ -1,8 +1,7 @@
 #include "hospital.h"
 
-#include "act1state.h"
 #include "hospital_actions.h"
-#include "hospitalstate.h"
+#include "isle.h"
 #include "islepathactor.h"
 #include "jukebox.h"
 #include "jukebox_actions.h"
@@ -22,6 +21,7 @@
 #include "scripts.h"
 
 DECOMP_SIZE_ASSERT(Hospital, 0x12c)
+DECOMP_SIZE_ASSERT(HospitalState, 0x18)
 
 // GLOBAL: LEGO1 0x100f7918
 undefined4 g_unk0x100f7918 = 3;
@@ -671,3 +671,49 @@ MxBool Hospital::Escape()
 
 	return TRUE;
 }
+
+// FUNCTION: LEGO1 0x10076370
+HospitalState::HospitalState()
+{
+	m_unk0x0c = 0;
+	m_unk0x0e = 0;
+	m_unk0x10 = 0;
+	m_unk0x12 = 0;
+	m_unk0x14 = 0;
+	m_unk0x16 = 0;
+}
+
+// FUNCTION: LEGO1 0x10076530
+MxResult HospitalState::Serialize(LegoFile* p_legoFile)
+{
+	LegoState::Serialize(p_legoFile);
+
+	if (p_legoFile->IsWriteMode()) {
+		// A write variable needs to be used here, otherwise
+		// the compiler aggresively optimizes the function
+		MxS16 write;
+
+		write = m_unk0x0c;
+		p_legoFile->Write(&write, sizeof(m_unk0x0c));
+		write = m_unk0x0e;
+		p_legoFile->Write(&write, sizeof(m_unk0x0e));
+		write = m_unk0x10;
+		p_legoFile->Write(&write, sizeof(m_unk0x10));
+		write = m_unk0x12;
+		p_legoFile->Write(&write, sizeof(m_unk0x12));
+		write = m_unk0x14;
+		p_legoFile->Write(&write, sizeof(m_unk0x14));
+		write = m_unk0x16;
+		p_legoFile->Write(&write, sizeof(m_unk0x16));
+	}
+	else if (p_legoFile->IsReadMode()) {
+		p_legoFile->Read(&m_unk0x0c, sizeof(m_unk0x0c));
+		p_legoFile->Read(&m_unk0x0e, sizeof(m_unk0x0e));
+		p_legoFile->Read(&m_unk0x10, sizeof(m_unk0x10));
+		p_legoFile->Read(&m_unk0x12, sizeof(m_unk0x12));
+		p_legoFile->Read(&m_unk0x14, sizeof(m_unk0x14));
+		p_legoFile->Read(&m_unk0x16, sizeof(m_unk0x16));
+	}
+
+	return SUCCESS;
+}
diff --git a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp
index af05132d..f8a1426d 100644
--- a/LEGO1/lego/legoomni/src/worlds/infocenter.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/infocenter.cpp
@@ -1,13 +1,12 @@
 #include "infocenter.h"
 
-#include "act3state.h"
+#include "act3.h"
 #include "credits_actions.h"
-#include "helicopterstate.h"
-#include "infocenterstate.h"
+#include "helicopter.h"
 #include "infomain_actions.h"
 #include "jukebox.h"
 #include "jukebox_actions.h"
-#include "legoact2state.h"
+#include "legoact2.h"
 #include "legoanimationmanager.h"
 #include "legobuildingmanager.h"
 #include "legocharactermanager.h"
@@ -29,13 +28,13 @@
 #include "mxticklemanager.h"
 #include "mxtransitionmanager.h"
 #include "mxutilities.h"
-#include "radiostate.h"
 #include "scripts.h"
 #include "sndanim_actions.h"
 #include "viewmanager/viewmanager.h"
 
 DECOMP_SIZE_ASSERT(Infocenter, 0x1d8)
 DECOMP_SIZE_ASSERT(InfocenterMapEntry, 0x18)
+DECOMP_SIZE_ASSERT(InfocenterState, 0x94)
 
 // GLOBAL: LEGO1 0x100f76a0
 const char* g_object2x4red = "2x4red";
@@ -43,6 +42,90 @@ const char* g_object2x4red = "2x4red";
 // GLOBAL: LEGO1 0x100f76a4
 const char* g_object2x4grn = "2x4grn";
 
+// GLOBAL: LEGO1 0x100f76a8
+InfomainScript::Script g_exitDialogueAct1[14] = {
+	InfomainScript::c_iic019in_RunAnim,
+	InfomainScript::c_iic020in_RunAnim,
+	InfomainScript::c_iic021in_RunAnim,
+	InfomainScript::c_iic022in_RunAnim,
+	InfomainScript::c_iic023in_RunAnim,
+	InfomainScript::c_iic024in_RunAnim,
+	InfomainScript::c_iic025in_RunAnim,
+	InfomainScript::c_iic026in_RunAnim,
+	InfomainScript::c_iic027in_RunAnim,
+	InfomainScript::c_iica28in_RunAnim,
+	InfomainScript::c_iicb28in_RunAnim,
+	InfomainScript::c_iicc28in_RunAnim,
+	InfomainScript::c_iic029in_RunAnim,
+	InfomainScript::c_iic032in_RunAnim
+};
+
+// GLOBAL: LEGO1 0x100f76e0
+InfomainScript::Script g_exitDialogueAct23[6] = {
+	InfomainScript::c_iic027in_RunAnim,
+	InfomainScript::c_iic029in_RunAnim,
+	InfomainScript::c_iic048in_RunAnim,
+	InfomainScript::c_iic056in_RunAnim,
+	InfomainScript::c_iicx23in_RunAnim
+	// Zero-terminated
+};
+
+// GLOBAL: LEGO1 0x100f76f8
+InfomainScript::Script g_returnDialogueAct1[6] = {
+	InfomainScript::c_iicx26in_RunAnim,
+	InfomainScript::c_iic033in_RunAnim,
+	InfomainScript::c_iic034in_RunAnim,
+	InfomainScript::c_iic035in_RunAnim,
+	InfomainScript::c_iic036in_RunAnim
+	// Zero-terminated
+};
+
+// GLOBAL: LEGO1 0x100f7710
+InfomainScript::Script g_returnDialogueAct2[4] = {
+	InfomainScript::c_iic048in_RunAnim,
+	InfomainScript::c_iic049in_RunAnim,
+	InfomainScript::c_iic050in_RunAnim,
+	// Zero-terminated
+};
+
+// GLOBAL: LEGO1 0x100f7720
+InfomainScript::Script g_returnDialogueAct3[4] = {
+	InfomainScript::c_iic055in_RunAnim,
+	InfomainScript::c_iic056in_RunAnim,
+	InfomainScript::c_iic057in_RunAnim,
+	InfomainScript::c_iic058in_RunAnim
+};
+
+// GLOBAL: LEGO1 0x100f7730
+InfomainScript::Script g_leaveDialogueAct1[4] = {
+	InfomainScript::c_iic039in_PlayWav,
+	InfomainScript::c_iic040in_PlayWav,
+	InfomainScript::c_iic041in_PlayWav,
+	InfomainScript::c_iic042in_PlayWav
+};
+
+// GLOBAL: LEGO1 0x100f7740
+InfomainScript::Script g_leaveDialogueAct2[4] = {
+	InfomainScript::c_iic051in_PlayWav,
+	InfomainScript::c_iic052in_PlayWav,
+	InfomainScript::c_iic053in_PlayWav,
+	InfomainScript::c_iic054in_PlayWav
+};
+
+// GLOBAL: LEGO1 0x100f7750
+InfomainScript::Script g_leaveDialogueAct3[4] = {
+	InfomainScript::c_iic059in_PlayWav,
+	InfomainScript::c_iic060in_PlayWav,
+	InfomainScript::c_iic061in_PlayWav,
+	// Zero-terminated
+};
+
+// GLOBAL: LEGO1 0x100f7760
+InfomainScript::Script g_bricksterDialogue[2] = {
+	InfomainScript::c_sbleh2br_PlayWav,
+	InfomainScript::c_snshahbr_PlayWav
+};
+
 // FUNCTION: LEGO1 0x1006ea20
 Infocenter::Infocenter()
 {
@@ -1462,3 +1545,45 @@ void Infocenter::StopBookAnimation()
 	action.SetUnknown24(-2);
 	DeleteObject(action);
 }
+
+// FUNCTION: LEGO1 0x10071600
+InfocenterState::InfocenterState()
+{
+	m_exitDialogueAct1 = LegoState::Playlist((MxU32*) g_exitDialogueAct1, sizeOfArray(g_exitDialogueAct1));
+	m_exitDialogueAct23 = LegoState::Playlist((MxU32*) g_exitDialogueAct23, sizeOfArray(g_exitDialogueAct23) - 1);
+
+	m_returnDialogue[LegoGameState::e_act1] =
+		LegoState::Playlist((MxU32*) g_returnDialogueAct1, sizeOfArray(g_returnDialogueAct1) - 1);
+
+	m_returnDialogue[LegoGameState::e_act2] =
+		LegoState::Playlist((MxU32*) g_returnDialogueAct2, sizeOfArray(g_returnDialogueAct2) - 1);
+
+	m_returnDialogue[LegoGameState::e_act3] =
+		LegoState::Playlist((MxU32*) g_returnDialogueAct3, sizeOfArray(g_returnDialogueAct3));
+
+	m_leaveDialogue[LegoGameState::e_act1] =
+		LegoState::Playlist((MxU32*) g_leaveDialogueAct1, sizeOfArray(g_leaveDialogueAct1));
+
+	m_leaveDialogue[LegoGameState::e_act2] =
+		LegoState::Playlist((MxU32*) g_leaveDialogueAct2, sizeOfArray(g_leaveDialogueAct2));
+
+	m_leaveDialogue[LegoGameState::e_act3] =
+		LegoState::Playlist((MxU32*) g_leaveDialogueAct3, sizeOfArray(g_leaveDialogueAct3) - 1);
+
+	m_bricksterDialogue = LegoState::Playlist((MxU32*) g_bricksterDialogue, sizeOfArray(g_bricksterDialogue));
+
+	memset(m_letters, 0, sizeof(m_letters));
+}
+
+// FUNCTION: LEGO1 0x10071920
+InfocenterState::~InfocenterState()
+{
+	MxS16 i = 0;
+	do {
+		if (GetNameLetter(i) != NULL) {
+			delete GetNameLetter(i)->GetAction();
+			delete GetNameLetter(i);
+		}
+		i++;
+	} while (i < GetMaxNameLength());
+}
diff --git a/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp b/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp
index d433c337..a4afe604 100644
--- a/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/infocenterdoor.cpp
@@ -1,6 +1,6 @@
 #include "infocenterdoor.h"
 
-#include "infocenterstate.h"
+#include "infocenter.h"
 #include "infodoor_actions.h"
 #include "jukebox.h"
 #include "jukebox_actions.h"
diff --git a/LEGO1/lego/legoomni/src/worlds/isle.cpp b/LEGO1/lego/legoomni/src/worlds/isle.cpp
index 2d5fee23..f643cc94 100644
--- a/LEGO1/lego/legoomni/src/worlds/isle.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/isle.cpp
@@ -1,16 +1,15 @@
 #include "isle.h"
 
 #include "3dmanager/lego3dmanager.h"
-#include "act1state.h"
 #include "ambulance.h"
 #include "bike.h"
-#include "carracestate.h"
+#include "carrace.h"
 #include "dunebuggy.h"
 #include "helicopter.h"
 #include "isle_actions.h"
 #include "islepathactor.h"
 #include "jetski.h"
-#include "jetskiracestate.h"
+#include "jetskirace.h"
 #include "jukebox_actions.h"
 #include "jukeboxentity.h"
 #include "legoanimationmanager.h"
@@ -18,6 +17,7 @@
 #include "legocontrolmanager.h"
 #include "legoinputmanager.h"
 #include "legomain.h"
+#include "legonamedtexture.h"
 #include "legoutils.h"
 #include "legovariables.h"
 #include "legovideomanager.h"
@@ -37,11 +37,20 @@
 #include "skateboard.h"
 #include "towtrack.h"
 
+DECOMP_SIZE_ASSERT(Act1State, 0x26c)
+DECOMP_SIZE_ASSERT(Act1State::NamedPlane, 0x4c)
 DECOMP_SIZE_ASSERT(Isle, 0x140)
 
 // GLOBAL: LEGO1 0x100f1198
 MxU32 g_isleFlags = 0x7f;
 
+// GLOBAL: ISLE 0x100f37f0
+MxS32 g_unk0x100f37f0[] = {
+	Act1State::e_unk953,
+	Act1State::e_unk954,
+	Act1State::e_unk955,
+};
+
 // FUNCTION: LEGO1 0x10030820
 Isle::Isle()
 {
@@ -1271,3 +1280,283 @@ void Isle::FUN_10033350()
 
 	m_destLocation = LegoGameState::e_infomain;
 }
+
+// STUB: LEGO1 0x100334b0
+Act1State::Act1State() : m_unk0x00c(0), m_unk0x00e(0), m_unk0x008(NULL), m_unk0x010(0)
+{
+	m_unk0x01e = FALSE;
+	m_unk0x018 = 1;
+	m_unk0x010 = 0;
+	m_planeActive = FALSE;
+	m_unk0x00e = 0;
+	m_unk0x01f = FALSE;
+	m_unk0x008 = g_unk0x100f37f0;
+	m_unk0x014 = -1;
+	m_unk0x022 = FALSE;
+	m_unk0x154 = NULL;
+	m_unk0x158 = NULL;
+	m_unk0x15c = NULL;
+	m_unk0x160 = NULL;
+	m_unk0x1b0 = NULL;
+	m_unk0x021 = 1;
+	m_elevFloor = Act1State::c_floor1;
+	m_unk0x00c = sizeOfArray(g_unk0x100f37f0);
+	m_unk0x1b4 = NULL;
+	m_unk0x1b8 = NULL;
+	m_unk0x208 = NULL;
+	m_unk0x20c = NULL;
+	m_unk0x25c = NULL;
+	m_unk0x260 = NULL;
+	m_unk0x264 = NULL;
+	m_unk0x268 = NULL;
+	SetFlag();
+}
+
+// FUNCTION: LEGO1 0x10033ac0
+MxResult Act1State::Serialize(LegoFile* p_legoFile)
+{
+	LegoState::Serialize(p_legoFile);
+
+	m_unk0x024.Serialize(p_legoFile);
+	m_unk0x070.Serialize(p_legoFile);
+	m_unk0x0bc.Serialize(p_legoFile);
+	m_unk0x108.Serialize(p_legoFile);
+	m_unk0x164.Serialize(p_legoFile);
+	m_unk0x1bc.Serialize(p_legoFile);
+	m_unk0x210.Serialize(p_legoFile);
+
+	if (p_legoFile->IsWriteMode()) {
+		if (m_unk0x108.GetName()->Compare("") != 0) {
+			if (m_unk0x154) {
+				WriteNamedTexture(p_legoFile, m_unk0x154);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "chwind.gif");
+			}
+			if (m_unk0x158) {
+				WriteNamedTexture(p_legoFile, m_unk0x158);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "chjetl.gif");
+			}
+			if (m_unk0x15c) {
+				WriteNamedTexture(p_legoFile, m_unk0x15c);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "chjetr.gif");
+			}
+		}
+		if (m_unk0x164.GetName()->Compare("") != 0) {
+			if (m_unk0x1b0) {
+				WriteNamedTexture(p_legoFile, m_unk0x1b0);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "jsfrnt.gif");
+			}
+			if (m_unk0x1b4) {
+				WriteNamedTexture(p_legoFile, m_unk0x1b4);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "jswnsh.gif");
+			}
+		}
+		if (m_unk0x1bc.GetName()->Compare("") != 0) {
+			if (m_unk0x208) {
+				WriteNamedTexture(p_legoFile, m_unk0x208);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "dbfrfn.gif");
+			}
+		}
+		if (m_unk0x210.GetName()->Compare("") != 0) {
+			if (m_unk0x25c) {
+				WriteNamedTexture(p_legoFile, m_unk0x25c);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "rcfrnt.gif");
+			}
+			if (m_unk0x260) {
+				WriteNamedTexture(p_legoFile, m_unk0x260);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "rcback.gif");
+			}
+			if (m_unk0x264) {
+				WriteNamedTexture(p_legoFile, m_unk0x264);
+			}
+			else {
+				FUN_1003f540(p_legoFile, "rctail.gif");
+			}
+		}
+
+		p_legoFile->Write(&m_unk0x010, sizeof(m_unk0x010));
+		p_legoFile->Write(&m_unk0x022, sizeof(m_unk0x022));
+	}
+	else if (p_legoFile->IsReadMode()) {
+		if (m_unk0x108.GetName()->Compare("") != 0) {
+			m_unk0x154 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x154 == NULL) {
+				return FAILURE;
+			}
+
+			m_unk0x158 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x158 == NULL) {
+				return FAILURE;
+			}
+
+			m_unk0x15c = ReadNamedTexture(p_legoFile);
+			if (m_unk0x15c == NULL) {
+				return FAILURE;
+			}
+		}
+		if (m_unk0x164.GetName()->Compare("") != 0) {
+			m_unk0x1b0 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x1b0 == NULL) {
+				return FAILURE;
+			}
+
+			m_unk0x1b4 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x1b4 == NULL) {
+				return FAILURE;
+			}
+		}
+		if (m_unk0x1bc.GetName()->Compare("") != 0) {
+			m_unk0x208 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x208 == NULL) {
+				return FAILURE;
+			}
+		}
+		if (m_unk0x210.GetName()->Compare("") != 0) {
+			m_unk0x25c = ReadNamedTexture(p_legoFile);
+			if (m_unk0x25c == NULL) {
+				return FAILURE;
+			}
+
+			m_unk0x260 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x260 == NULL) {
+				return FAILURE;
+			}
+
+			m_unk0x264 = ReadNamedTexture(p_legoFile);
+			if (m_unk0x264 == NULL) {
+				return FAILURE;
+			}
+		}
+
+		p_legoFile->Read(&m_unk0x010, sizeof(m_unk0x010));
+		p_legoFile->Read(&m_unk0x022, sizeof(m_unk0x022));
+	}
+
+	// TODO
+	return SUCCESS;
+}
+
+// STUB: LEGO1 0x10034660
+void Act1State::FUN_10034660()
+{
+	// TODO
+}
+
+// FUNCTION: LEGO1 0x100346a0
+void Act1State::FUN_100346a0()
+{
+	if (m_unk0x014 != -1) {
+		InvokeAction(Extra::e_stop, *g_isleScript, m_unk0x014, NULL);
+		m_unk0x014 = -1;
+	}
+}
+
+// FUNCTION: LEGO1 0x100346d0
+MxBool Act1State::SetFlag()
+{
+	m_unk0x024.SetName("");
+	m_unk0x070.SetName("");
+	m_unk0x0bc.SetName("");
+	m_unk0x022 = FALSE;
+	m_unk0x108.SetName("");
+
+	if (m_unk0x154) {
+		delete m_unk0x154;
+		m_unk0x154 = NULL;
+	}
+
+	if (m_unk0x158) {
+		delete m_unk0x158;
+		m_unk0x158 = NULL;
+	}
+
+	if (m_unk0x15c) {
+		delete m_unk0x15c;
+		m_unk0x15c = NULL;
+	}
+
+	if (m_unk0x160) {
+		delete m_unk0x160;
+		m_unk0x160 = NULL;
+	}
+
+	m_unk0x164.SetName("");
+
+	if (m_unk0x1b0) {
+		delete m_unk0x1b0;
+		m_unk0x1b0 = NULL;
+	}
+
+	if (m_unk0x1b4) {
+		delete m_unk0x1b4;
+		m_unk0x1b4 = NULL;
+	}
+
+	if (m_unk0x1b8) {
+		delete m_unk0x1b8;
+		m_unk0x1b8 = NULL;
+	}
+
+	m_unk0x1bc.SetName("");
+
+	if (m_unk0x208) {
+		delete m_unk0x208;
+		m_unk0x208 = NULL;
+	}
+
+	if (m_unk0x20c) {
+		delete m_unk0x20c;
+		m_unk0x20c = NULL;
+	}
+
+	m_unk0x210.SetName("");
+
+	if (m_unk0x25c) {
+		delete m_unk0x25c;
+		m_unk0x25c = NULL;
+	}
+
+	if (m_unk0x260) {
+		delete m_unk0x260;
+		m_unk0x260 = NULL;
+	}
+
+	if (m_unk0x264) {
+		delete m_unk0x264;
+		m_unk0x264 = NULL;
+	}
+
+	if (m_unk0x268) {
+		delete m_unk0x268;
+		m_unk0x268 = NULL;
+	}
+
+	return TRUE;
+}
+
+// STUB: LEGO1 0x10034b60
+void Act1State::FUN_10034b60()
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x10034d00
+void Act1State::FUN_10034d00()
+{
+	// TODO
+}
diff --git a/LEGO1/lego/legoomni/src/worlds/jukebox.cpp b/LEGO1/lego/legoomni/src/worlds/jukebox.cpp
index 5cb59794..57c30be3 100644
--- a/LEGO1/lego/legoomni/src/worlds/jukebox.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/jukebox.cpp
@@ -1,8 +1,7 @@
 #include "jukebox.h"
 
-#include "act1state.h"
+#include "isle.h"
 #include "jukebox_actions.h"
-#include "jukeboxstate.h"
 #include "jukeboxw_actions.h"
 #include "legocontrolmanager.h"
 #include "legogamestate.h"
@@ -17,6 +16,7 @@
 #include "mxvideopresenter.h"
 
 DECOMP_SIZE_ASSERT(JukeBox, 0x104)
+DECOMP_SIZE_ASSERT(JukeBoxState, 0x10)
 
 // FUNCTION: LEGO1 0x1005d660
 JukeBox::JukeBox()
diff --git a/LEGO1/lego/legoomni/src/worlds/legoact2.cpp b/LEGO1/lego/legoomni/src/worlds/legoact2.cpp
index cc108d10..eb44f2b0 100644
--- a/LEGO1/lego/legoomni/src/worlds/legoact2.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/legoact2.cpp
@@ -1,6 +1,7 @@
 #include "legoact2.h"
 
 DECOMP_SIZE_ASSERT(LegoAct2, 0x1154)
+DECOMP_SIZE_ASSERT(LegoAct2State, 0x10)
 
 // FUNCTION: LEGO1 0x1004fe10
 MxBool LegoAct2::VTable0x5c()
diff --git a/LEGO1/lego/legoomni/src/worlds/police.cpp b/LEGO1/lego/legoomni/src/worlds/police.cpp
index 897fa52c..a20f5163 100644
--- a/LEGO1/lego/legoomni/src/worlds/police.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/police.cpp
@@ -13,9 +13,10 @@
 #include "mxnotificationmanager.h"
 #include "mxtransitionmanager.h"
 #include "police_actions.h"
-#include "policestate.h"
+#include "scripts.h"
 
 DECOMP_SIZE_ASSERT(Police, 0x110)
+DECOMP_SIZE_ASSERT(PoliceState, 0x10)
 
 // FUNCTION: LEGO1 0x1005e130
 Police::Police()
@@ -196,3 +197,60 @@ MxBool Police::Escape()
 	m_destLocation = LegoGameState::e_infomain;
 	return TRUE;
 }
+
+// FUNCTION: LEGO1 0x1005e7c0
+PoliceState::PoliceState()
+{
+	m_unk0x0c = 0;
+	m_policeScript = (rand() % 2 == 0) ? PoliceScript::c_nps002la_RunAnim : PoliceScript::c_nps001ni_RunAnim;
+}
+
+// FUNCTION: LEGO1 0x1005e990
+MxResult PoliceState::Serialize(LegoFile* p_legoFile)
+{
+	LegoState::Serialize(p_legoFile);
+
+	if (p_legoFile->IsReadMode()) {
+		p_legoFile->Read(&m_policeScript, sizeof(m_policeScript));
+	}
+	else {
+		PoliceScript::Script policeScript = m_policeScript;
+		p_legoFile->Write(&policeScript, sizeof(m_policeScript));
+	}
+
+	return SUCCESS;
+}
+
+// FUNCTION: LEGO1 0x1005ea40
+void PoliceState::FUN_1005ea40()
+{
+	PoliceScript::Script policeScript;
+
+	if (m_unk0x0c == 1) {
+		return;
+	}
+
+	switch (CurrentActor()->GetActorId()) {
+	case 4:
+		policeScript = PoliceScript::c_nps002la_RunAnim;
+		m_policeScript = policeScript;
+		break;
+	case 5:
+		policeScript = PoliceScript::c_nps001ni_RunAnim;
+		m_policeScript = policeScript;
+		break;
+	default:
+		policeScript = m_policeScript;
+		m_policeScript = policeScript == PoliceScript::c_nps002la_RunAnim ? PoliceScript::c_nps001ni_RunAnim
+																		  : PoliceScript::c_nps002la_RunAnim;
+	}
+
+	{
+		MxDSAction action;
+		action.SetObjectId(policeScript);
+		action.SetAtomId(*g_policeScript);
+		Start(&action);
+	}
+
+	m_unk0x0c = 1;
+}
diff --git a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp
index 803074d8..414f4faa 100644
--- a/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/registrationbook.cpp
@@ -1,6 +1,6 @@
 #include "registrationbook.h"
 
-#include "infocenterstate.h"
+#include "infocenter.h"
 #include "jukebox_actions.h"
 #include "legocontrolmanager.h"
 #include "legogamestate.h"
diff --git a/LEGO1/lego/legoomni/src/worlds/score.cpp b/LEGO1/lego/legoomni/src/worlds/score.cpp
index a4ff3621..1482e253 100644
--- a/LEGO1/lego/legoomni/src/worlds/score.cpp
+++ b/LEGO1/lego/legoomni/src/worlds/score.cpp
@@ -1,9 +1,10 @@
 #include "score.h"
 
-#include "ambulancemissionstate.h"
-#include "carracestate.h"
+#include "ambulance.h"
+#include "carrace.h"
 #include "infoscor_actions.h"
-#include "jetskiracestate.h"
+#include "jetski.h"
+#include "jetskirace.h"
 #include "jukebox.h"
 #include "jukebox_actions.h"
 #include "legocontrolmanager.h"
@@ -17,13 +18,12 @@
 #include "mxnotificationmanager.h"
 #include "mxnotificationparam.h"
 #include "mxtransitionmanager.h"
-#include "pizzamissionstate.h"
-#include "racestate.h"
-#include "scorestate.h"
+#include "pizza.h"
 #include "scripts.h"
-#include "towtrackmissionstate.h"
+#include "towtrack.h"
 
 DECOMP_SIZE_ASSERT(Score, 0x104)
+DECOMP_SIZE_ASSERT(ScoreState, 0x0c)
 
 // FUNCTION: LEGO1 0x10001000
 Score::Score()