diff --git a/docs/rh-log.txt b/docs/rh-log.txt
index 9386f8c2a8..40cc9680bc 100644
--- a/docs/rh-log.txt
+++ b/docs/rh-log.txt
@@ -1,3 +1,7 @@
+August 5, 2008 (Changes by Graf Zahl)
+- Converted the ScriptedMarines to DECORATE.
+- Fixed: DLightTransfer and DWallLightTransfer were declared as actors.
+
 August 3, 2008 (Changes by Graf Zahl)
 - Converted the PhoenixRod and associated classes to DECORATE to make
   the Heretic conversion complete.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 90e4ad8793..9f8322a4a2 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -512,14 +512,12 @@ add_executable( zdoom WIN32
 	g_hexen/a_blastradius.cpp
 	g_hexen/a_boostarmor.cpp
 	g_hexen/a_centaur.cpp
-	g_hexen/a_clericboss.cpp
 	g_hexen/a_clericflame.cpp
 	g_hexen/a_clericholy.cpp
 	g_hexen/a_clericmace.cpp
 	g_hexen/a_clericstaff.cpp
 	g_hexen/a_dragon.cpp
 	g_hexen/a_fighteraxe.cpp
-	g_hexen/a_fighterboss.cpp
 	g_hexen/a_fighterhammer.cpp
 	g_hexen/a_fighterplayer.cpp
 	g_hexen/a_fighterquietus.cpp
@@ -531,7 +529,6 @@ add_executable( zdoom WIN32
 	g_hexen/a_hexenspecialdecs.cpp
 	g_hexen/a_iceguy.cpp
 	g_hexen/a_korax.cpp
-	g_hexen/a_mageboss.cpp
 	g_hexen/a_magecone.cpp
 	g_hexen/a_magelightning.cpp
 	g_hexen/a_magestaff.cpp
diff --git a/src/codepointers.h b/src/codepointers.h
index 5ee793f8f2..1d21a9dee9 100644
--- a/src/codepointers.h
+++ b/src/codepointers.h
@@ -109,6 +109,23 @@ ACTOR(ResetReloadCounter)
 ACTOR(ClearReFire)
 ACTOR(SpawnSingleItem)
 
+ACTOR(M_Refire)
+ACTOR(M_CheckAttack)
+ACTOR(MarineChase)
+ACTOR(MarineLook)
+ACTOR(MarineNoise)
+ACTOR(M_Punch)
+ACTOR(M_SawRefire)
+ACTOR(M_FirePistol)
+ACTOR(M_FireShotgun)
+ACTOR(M_FireShotgun2)
+ACTOR(M_FireCGun)
+ACTOR(M_FireMissile)
+ACTOR(M_FirePlasma)
+ACTOR(M_FireRailgun)
+ACTOR(M_BFGsound)
+ACTOR(M_FireBFG)
+
 // Heretic stuff
 ACTOR(Feathers)
 ACTOR(BeakRaise)
diff --git a/src/g_doom/a_doomglobal.h b/src/g_doom/a_doomglobal.h
index cdd6839b69..1a50dfeae4 100644
--- a/src/g_doom/a_doomglobal.h
+++ b/src/g_doom/a_doomglobal.h
@@ -7,7 +7,7 @@
 
 class AScriptedMarine : public AActor
 {
-	DECLARE_ACTOR (AScriptedMarine, AActor)
+	DECLARE_CLASS (AScriptedMarine, AActor)
 public:
 	enum EMarineWeapon
 	{
@@ -33,7 +33,11 @@ public:
 	void SetSprite (const PClass *source);
 	void Serialize (FArchive &arc);
 
+	int CurrentWeapon;
+
 protected:
+	bool GetWeaponStates(int weap, FState *&melee, FState *&missile);
+
 	int SpriteOverride;
 };
 
diff --git a/src/g_doom/a_scriptedmarine.cpp b/src/g_doom/a_scriptedmarine.cpp
index c8c281e244..180a8b55b3 100644
--- a/src/g_doom/a_scriptedmarine.cpp
+++ b/src/g_doom/a_scriptedmarine.cpp
@@ -7,6 +7,7 @@
 #include "a_doomglobal.h"
 #include "s_sound.h"
 #include "r_translate.h"
+#include "thingdef/thingdef.h"
 
 #define MARINE_PAIN_CHANCE 160
 
@@ -16,188 +17,7 @@ static FRandom pr_m_gunshot ("SMarineGunshot");
 static FRandom pr_m_saw ("SMarineSaw");
 static FRandom pr_m_fireshotgun2 ("SMarineFireSSG");
 
-void A_MarineLook (AActor *);
-void A_MarineNoise (AActor *);
-void A_MarineChase (AActor *);
-void A_M_Refire (AActor *);
-void A_M_SawRefire (AActor *);
-void A_M_Saw (AActor *);
-void A_M_Punch (AActor *);
-void A_M_BerserkPunch (AActor *);
-void A_M_FirePistol (AActor *);
-void A_M_FirePistolInaccurate (AActor *);
-void A_M_FireShotgun (AActor *);
-void A_M_CheckAttack (AActor *);
-void A_M_FireShotgun2 (AActor *);
-void A_M_FireCGunAccurate (AActor *);
-void A_M_FireCGun (AActor *);
-void A_M_FireMissile (AActor *);
-void A_M_FireRailgun (AActor *);
-void A_M_FirePlasma (AActor *);
-void A_M_BFGsound (AActor *);
-void A_M_FireBFG (AActor *);
-
-// Scriptable marine -------------------------------------------------------
-
-FState AScriptedMarine::States[] =
-{
-#define S_MPLAYSTILL 0
-	S_NORMAL (PLAY, 'A',	4, A_MarineLook 				, &States[S_MPLAYSTILL+1]),
-	S_NORMAL (PLAY, 'A',	4, A_MarineNoise 				, &States[S_MPLAYSTILL]),
-
-#define S_MPLAY (S_MPLAYSTILL+2)
-	S_NORMAL (PLAY, 'A',	4, A_MarineLook 				, &States[S_MPLAY+1]),
-	S_NORMAL (PLAY, 'A',	4, A_MarineNoise 				, &States[S_MPLAY+2]),
-	S_NORMAL (PLAY, 'A',	4, A_MarineLook 				, &States[S_MPLAY+3]),
-	S_NORMAL (PLAY, 'B',	4, A_MarineNoise				, &States[S_MPLAY+4]),
-	S_NORMAL (PLAY, 'B',	4, A_MarineLook					, &States[S_MPLAY+5]),
-	S_NORMAL (PLAY, 'B',	4, A_MarineNoise 				, &States[S_MPLAY]),
-
-#define S_MPLAY_RUN (S_MPLAY+6)
-	S_NORMAL (PLAY, 'A',	4, A_MarineChase 				, &States[S_MPLAY_RUN+1]),
-	S_NORMAL (PLAY, 'B',	4, A_MarineChase 				, &States[S_MPLAY_RUN+2]),
-	S_NORMAL (PLAY, 'C',	4, A_MarineChase 				, &States[S_MPLAY_RUN+3]),
-	S_NORMAL (PLAY, 'D',	4, A_MarineChase 				, &States[S_MPLAY_RUN+0]),
-
-#define S_MPLAY_ATK (S_MPLAY_RUN+4)
-	S_NORMAL (PLAY, 'E',   12, A_FaceTarget					, &States[S_MPLAY]),
-	S_BRIGHT (PLAY, 'F',	6, NULL 						, &States[S_MPLAY_ATK+0]),
-
-#define S_MPLAY_PAIN (S_MPLAY_ATK+2)
-	S_NORMAL (PLAY, 'G',	4, NULL							, &States[S_MPLAY_PAIN+1]),
-	S_NORMAL (PLAY, 'G',	4, A_Pain						, &States[S_MPLAY]),
-
-#define S_MPLAY_DIE (S_MPLAY_PAIN+2)
-	S_NORMAL (PLAY, 'H',   10, NULL 						, &States[S_MPLAY_DIE+1]),
-	S_NORMAL (PLAY, 'I',   10, A_Scream						, &States[S_MPLAY_DIE+2]),
-	S_NORMAL (PLAY, 'J',   10, A_NoBlocking					, &States[S_MPLAY_DIE+3]),
-	S_NORMAL (PLAY, 'K',   10, NULL 						, &States[S_MPLAY_DIE+4]),
-	S_NORMAL (PLAY, 'L',   10, NULL 						, &States[S_MPLAY_DIE+5]),
-	S_NORMAL (PLAY, 'M',   10, NULL 						, &States[S_MPLAY_DIE+6]),
-	S_NORMAL (PLAY, 'N',   -1, NULL							, NULL),
-
-#define S_MPLAY_XDIE (S_MPLAY_DIE+7)
-	S_NORMAL (PLAY, 'O',	5, NULL 						, &States[S_MPLAY_XDIE+1]),
-	S_NORMAL (PLAY, 'P',	5, A_XScream					, &States[S_MPLAY_XDIE+2]),
-	S_NORMAL (PLAY, 'Q',	5, A_NoBlocking					, &States[S_MPLAY_XDIE+3]),
-	S_NORMAL (PLAY, 'R',	5, NULL 						, &States[S_MPLAY_XDIE+4]),
-	S_NORMAL (PLAY, 'S',	5, NULL 						, &States[S_MPLAY_XDIE+5]),
-	S_NORMAL (PLAY, 'T',	5, NULL 						, &States[S_MPLAY_XDIE+6]),
-	S_NORMAL (PLAY, 'U',	5, NULL 						, &States[S_MPLAY_XDIE+7]),
-	S_NORMAL (PLAY, 'V',	5, NULL 						, &States[S_MPLAY_XDIE+8]),
-	S_NORMAL (PLAY, 'W',   -1, NULL							, NULL),
-
-#define S_MPLAY_RAISE (S_MPLAY_XDIE+9)
-	S_NORMAL (PLAY, 'M',	5, NULL							, &States[S_MPLAY_RAISE+1]),
-	S_NORMAL (PLAY, 'L',	5, NULL							, &States[S_MPLAY_RAISE+2]),
-	S_NORMAL (PLAY, 'K',	5, NULL							, &States[S_MPLAY_RAISE+3]),
-	S_NORMAL (PLAY, 'J',	5, NULL							, &States[S_MPLAY_RAISE+4]),
-	S_NORMAL (PLAY, 'I',	5, NULL							, &States[S_MPLAY_RAISE+5]),
-	S_NORMAL (PLAY, 'H',	5, NULL							, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_CHAINSAW (S_MPLAY_RAISE+6)
-	S_NORMAL (PLAY, 'E',	4, A_MarineNoise				, &States[S_MPLAY_ATK_CHAINSAW+1]),
-	S_BRIGHT (PLAY, 'F',	4, A_M_Saw						, &States[S_MPLAY_ATK_CHAINSAW+2]),
-	S_BRIGHT (PLAY, 'F',	0, A_M_SawRefire				, &States[S_MPLAY_ATK_CHAINSAW+1]),
-	S_NORMAL (PLAY, 'A',	0, NULL							, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_FIST (S_MPLAY_ATK_CHAINSAW+4)
-	S_NORMAL (PLAY, 'E',	4, A_FaceTarget					, &States[S_MPLAY_ATK_FIST+1]),
-	S_NORMAL (PLAY, 'F',	4, A_M_Punch					, &States[S_MPLAY_ATK_FIST+2]),	// Purposefully not BRIGHT
-	S_NORMAL (PLAY, 'A',	9, NULL							, &States[S_MPLAY_ATK_FIST+3]),
-	S_NORMAL (PLAY, 'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_FIST]),
-	S_NORMAL (PLAY, 'A',	5, A_FaceTarget					, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_BERSERK (S_MPLAY_ATK_FIST+5)
-	S_NORMAL (PLAY, 'E',	4, A_FaceTarget					, &States[S_MPLAY_ATK_BERSERK+1]),
-	S_NORMAL (PLAY, 'F',	4, A_M_BerserkPunch				, &States[S_MPLAY_ATK_BERSERK+2]),	// Purposefully not BRIGHT
-	S_NORMAL (PLAY, 'A',	9, NULL							, &States[S_MPLAY_ATK_BERSERK+3]),
-	S_NORMAL (PLAY, 'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_BERSERK]),
-	S_NORMAL (PLAY, 'A',	5, A_FaceTarget					, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_PISTOL (S_MPLAY_ATK_BERSERK+5)
-	S_NORMAL (PLAY, 'E',	4, A_FaceTarget					, &States[S_MPLAY_ATK_PISTOL+1]),
-	S_BRIGHT (PLAY, 'F',	6, A_M_FirePistol				, &States[S_MPLAY_ATK_PISTOL+2]),
-	S_NORMAL (PLAY, 'A',	4, A_FaceTarget					, &States[S_MPLAY_ATK_PISTOL+3]),
-	S_NORMAL (PLAY, 'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_PISTOL+5]),
-	S_NORMAL (PLAY, 'A',	5, NULL							, &States[S_MPLAY_RUN]),
-	S_BRIGHT (PLAY, 'F',	6, A_M_FirePistolInaccurate		, &States[S_MPLAY_ATK_PISTOL+6]),
-	S_NORMAL (PLAY, 'A',	4, A_FaceTarget					, &States[S_MPLAY_ATK_PISTOL+7]),
-	S_NORMAL (PLAY, 'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_PISTOL+5]),
-	S_NORMAL (PLAY, 'A',	5, A_FaceTarget					, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_SHOTGUN (S_MPLAY_ATK_PISTOL+9)
-	S_NORMAL (PLAY, 'E',	3, A_M_CheckAttack				, &States[S_MPLAY_ATK_SHOTGUN+1]),
-	S_BRIGHT (PLAY, 'F',	7, A_M_FireShotgun				, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_DSHOTGUN (S_MPLAY_ATK_SHOTGUN+2)
-	S_NORMAL (PLAY, 'E',	3, A_M_CheckAttack				, &States[S_MPLAY_ATK_DSHOTGUN+1]),
-	S_BRIGHT (PLAY, 'F',	7, A_M_FireShotgun2				, &States[S_MPLAY_RUN]),
-#define S_MPLAY_SKIP_ATTACK (S_MPLAY_ATK_DSHOTGUN+2)
-	S_NORMAL (PLAY, 'A',	1, NULL							, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_CHAINGUN (S_MPLAY_SKIP_ATTACK+1)
-	S_NORMAL (PLAY, 'E',	4, A_FaceTarget					, &States[S_MPLAY_ATK_CHAINGUN+1]),
-	S_BRIGHT (PLAY, 'F',	4, A_M_FireCGunAccurate			, &States[S_MPLAY_ATK_CHAINGUN+2]),
-	S_BRIGHT (PLAY, 'F',	4, A_M_FireCGunAccurate			, &States[S_MPLAY_ATK_CHAINGUN+3]),
-	S_BRIGHT (PLAY, 'F',	4, A_M_FireCGun					, &States[S_MPLAY_ATK_CHAINGUN+4]),
-	S_BRIGHT (PLAY, 'F',	4, A_M_FireCGun					, &States[S_MPLAY_ATK_CHAINGUN+5]),
-	S_NORMAL (PLAY,	'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_CHAINGUN+3]),
-	S_NORMAL (PLAY, 'A',	0, NULL							, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_ROCKET (S_MPLAY_ATK_CHAINGUN+7)
-	S_NORMAL (PLAY, 'E',	8, A_FaceTarget					, &States[S_MPLAY_ATK_ROCKET+1]),
-	S_BRIGHT (PLAY, 'F',	6, A_M_FireMissile				, &States[S_MPLAY_ATK_ROCKET+2]),
-	S_NORMAL (PLAY,	'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_ROCKET]),
-	S_NORMAL (PLAY, 'A',	0, NULL							, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_RAILGUN (S_MPLAY_ATK_ROCKET+4)
-	S_NORMAL (PLAY, 'E',	4, A_M_CheckAttack				, &States[S_MPLAY_ATK_RAILGUN+1]),
-	S_BRIGHT (PLAY, 'F',	6, A_M_FireRailgun				, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_PLASMA (S_MPLAY_ATK_RAILGUN+2)
-	S_NORMAL (PLAY, 'E',	2, A_FaceTarget					, &States[S_MPLAY_ATK_PLASMA+1]),
-	S_BRIGHT (PLAY, 'F',	3, A_M_FirePlasma				, &States[S_MPLAY_ATK_PLASMA+2]),
-	S_NORMAL (PLAY, 'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_PLASMA+1]),
-	S_NORMAL (PLAY, 'A',    0, NULL							, &States[S_MPLAY_RUN]),
-
-#define S_MPLAY_ATK_BFG (S_MPLAY_ATK_PLASMA+4)
-	S_NORMAL (PLAY, 'E',	5, A_M_BFGsound					, &States[S_MPLAY_ATK_BFG+1]),
-	S_NORMAL (PLAY, 'E',	5, A_FaceTarget					, &States[S_MPLAY_ATK_BFG+2]),
-	S_NORMAL (PLAY, 'E',	5, A_FaceTarget					, &States[S_MPLAY_ATK_BFG+3]),
-	S_NORMAL (PLAY, 'E',	5, A_FaceTarget					, &States[S_MPLAY_ATK_BFG+4]),
-	S_NORMAL (PLAY, 'E',	5, A_FaceTarget					, &States[S_MPLAY_ATK_BFG+5]),
-	S_NORMAL (PLAY, 'E',	5, A_FaceTarget					, &States[S_MPLAY_ATK_BFG+6]),
-	S_BRIGHT (PLAY, 'F',	6, A_M_FireBFG					, &States[S_MPLAY_ATK_BFG+7]),
-	S_NORMAL (PLAY, 'A',	4, A_FaceTarget					, &States[S_MPLAY_ATK_BFG+8]),
-	S_NORMAL (PLAY, 'A',	0, A_M_Refire					, &States[S_MPLAY_ATK_BFG]),
-	S_NORMAL (PLAY, 'A',	0, NULL							, &States[S_MPLAY_RUN]),
-};
-
-IMPLEMENT_ACTOR (AScriptedMarine, Doom, 9100, 151)
-	PROP_SpawnHealth (100)
-	PROP_RadiusFixed (16)
-	PROP_HeightFixed (56)
-	PROP_Mass (100)
-	PROP_SpeedFixed (8)
-	PROP_PainChance (MARINE_PAIN_CHANCE)
-	PROP_Flags (MF_SOLID|MF_SHOOTABLE)
-	PROP_Flags2 (MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_FLOORCLIP)
-	PROP_Flags3 (MF3_ISMONSTER)
-	PROP_Translation (TRANSLATION_Standard,0)	// Scripted marines wear black
-	PROP_Damage (100)
-
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_SeeState (S_MPLAY_RUN)
-	PROP_PainState (S_MPLAY_PAIN)
-	PROP_MissileState (S_MPLAY_ATK)
-	PROP_DeathState (S_MPLAY_DIE)
-	PROP_XDeathState (S_MPLAY_XDIE)
-	PROP_RaiseState (S_MPLAY_RAISE)
-
-	PROP_DeathSound ("*death")
-	PROP_PainSound ("*pain50")
-END_DEFAULTS
+IMPLEMENT_CLASS (AScriptedMarine)
 
 void AScriptedMarine::Serialize (FArchive &arc)
 {
@@ -211,6 +31,7 @@ void AScriptedMarine::Serialize (FArchive &arc)
 	{
 		SpriteOverride = arc.ReadSprite ();
 	}
+	arc << CurrentWeapon;
 }
 
 void AScriptedMarine::Activate (AActor *activator)
@@ -231,10 +52,49 @@ void AScriptedMarine::Deactivate (AActor *activator)
 	}
 }
 
+bool AScriptedMarine::GetWeaponStates(int weap, FState *&melee, FState *&missile)
+{
+	static ENamedName WeaponNames[] = 
+	{
+		NAME_None,
+		NAME_Fist,
+		NAME_Berserk,
+		NAME_Chainsaw,
+		NAME_Pistol,
+		NAME_Shotgun,
+		NAME_SSG,
+		NAME_Chaingun,
+		NAME_Rocket,
+		NAME_Plasma,
+		NAME_Railgun,
+		NAME_BFG
+	};
+
+	if (weap < WEAPON_Dummy || weap > WEAPON_BFG) weap = WEAPON_Dummy;
+
+	melee = FindState(NAME_Melee, WeaponNames[weap], true);
+	missile = FindState(NAME_Missile, WeaponNames[weap], true);
+
+	return melee != NULL || missile != NULL;
+}
+
 void AScriptedMarine::BeginPlay ()
 {
 	Super::BeginPlay ();
 
+	// Set the current weapon
+	for(int i=WEAPON_Dummy; i<=WEAPON_BFG; i++)
+	{
+		FState *melee, *missile;
+		if (GetWeaponStates(i, melee, missile))
+		{
+			if (melee == MeleeState && missile == MissileState)
+			{
+				CurrentWeapon = i;
+			}
+		}
+	}
+
 	// Copy the standard player's scaling
 	AActor * playerdef = GetDefaultByName("DoomPlayer");
 	if (playerdef != NULL)
@@ -256,7 +116,7 @@ void AScriptedMarine::Tick ()
 
 	if (special1 != 0)
 	{
-		if (MissileState == &States[S_MPLAY_ATK_DSHOTGUN])
+		if (CurrentWeapon == WEAPON_SuperShotgun)
 		{ // Play SSG reload sounds
 			int ticks = level.maptime - special1;
 			if (ticks < 47)
@@ -340,6 +200,20 @@ void A_M_SawRefire (AActor *self)
 	}
 }
 
+//============================================================================
+//
+// A_MarineNoise
+//
+//============================================================================
+
+void A_MarineNoise (AActor *self)
+{
+	if (static_cast<AScriptedMarine *>(self)->CurrentWeapon == AScriptedMarine::WEAPON_Chainsaw)
+	{
+		S_Sound (self, CHAN_WEAPON, "weapons/sawidle", 1, ATTN_NORM);
+	}
+}
+
 //============================================================================
 //
 // A_MarineChase
@@ -348,10 +222,7 @@ void A_M_SawRefire (AActor *self)
 
 void A_MarineChase (AActor *self)
 {
-	if (self->MeleeState == &AScriptedMarine::States[S_MPLAY_ATK_CHAINSAW])
-	{
-		S_Sound (self, CHAN_WEAPON, "weapons/sawidle", 1, ATTN_NORM);
-	}
+	A_MarineNoise (self);
 	A_Chase (self);
 }
 
@@ -367,20 +238,6 @@ void A_MarineLook (AActor *self)
 	A_Look (self);
 }
 
-//============================================================================
-//
-// A_MarineNoise
-//
-//============================================================================
-
-void A_MarineNoise (AActor *self)
-{
-	if (self->MeleeState == &AScriptedMarine::States[S_MPLAY_ATK_CHAINSAW])
-	{
-		S_Sound (self, CHAN_WEAPON, "weapons/sawidle", 1, ATTN_NORM);
-	}
-}
-
 //============================================================================
 //
 // A_M_Saw
@@ -453,38 +310,11 @@ void A_M_Punch (AActor *self)
 	if (self->target == NULL)
 		return;
 
+	int index=CheckIndex(1);
+	if (index<0) return;
+
 	damage = (pr_m_punch()%10+1) << 1;
-
-	A_FaceTarget (self);
-	angle = self->angle + (pr_m_punch.Random2() << 18);
-	pitch = P_AimLineAttack (self, angle, MELEERANGE, &linetarget);
-	P_LineAttack (self, angle, MELEERANGE, pitch, damage, NAME_Melee, NAME_BulletPuff, true);
-
-	// turn to face target
-	if (linetarget)
-	{
-		S_Sound (self, CHAN_WEAPON, "*fist", 1, ATTN_NORM);
-		self->angle = R_PointToAngle2 (self->x, self->y, linetarget->x, linetarget->y);
-	}
-}
-
-//============================================================================
-//
-// A_M_BerserkPunch
-//
-//============================================================================
-
-void A_M_BerserkPunch (AActor *self)
-{
-	angle_t 	angle;
-	int 		damage;
-	int 		pitch;
-	AActor		*linetarget;
-
-	if (self->target == NULL)
-		return;
-
-	damage = ((pr_m_punch()%10+1) << 1) * 10;
+	damage *= EvalExpressionI (StateParameters[index], self);
 
 	A_FaceTarget (self);
 	angle = self->angle + (pr_m_punch.Random2() << 18);
@@ -532,26 +362,13 @@ void A_M_FirePistol (AActor *self)
 	if (self->target == NULL)
 		return;
 
-	S_Sound (self, CHAN_WEAPON, "weapons/pistol", 1, ATTN_NORM);
-	A_FaceTarget (self);
-	P_GunShot2 (self, true, P_AimLineAttack (self, self->angle, MISSILERANGE),
-		PClass::FindClass(NAME_BulletPuff));
-}
-
-//============================================================================
-//
-// A_M_FirePistolInaccurate
-//
-//============================================================================
-
-void A_M_FirePistolInaccurate (AActor *self)
-{
-	if (self->target == NULL)
-		return;
+	int index=CheckIndex(1);
+	if (index<0) return;
+	bool accurate =  !!EvalExpressionI (StateParameters[index], self);
 
 	S_Sound (self, CHAN_WEAPON, "weapons/pistol", 1, ATTN_NORM);
 	A_FaceTarget (self);
-	P_GunShot2 (self, false, P_AimLineAttack (self, self->angle, MISSILERANGE),
+	P_GunShot2 (self, accurate, P_AimLineAttack (self, self->angle, MISSILERANGE),
 		PClass::FindClass(NAME_BulletPuff));
 }
 
@@ -588,7 +405,7 @@ void A_M_CheckAttack (AActor *self)
 {
 	if (self->special1 != 0 || self->target == NULL)
 	{
-		self->SetState (&AScriptedMarine::States[S_MPLAY_SKIP_ATTACK]);
+		self->SetState (self->FindState("SkipAttack"));
 	}
 	else
 	{
@@ -624,23 +441,6 @@ void A_M_FireShotgun2 (AActor *self)
 	self->special1 = level.maptime;
 }
 
-//============================================================================
-//
-// A_M_FireCGunAccurate
-//
-//============================================================================
-
-void A_M_FireCGunAccurate (AActor *self)
-{
-	if (self->target == NULL)
-		return;
-
-	S_Sound (self, CHAN_WEAPON, "weapons/chngun", 1, ATTN_NORM);
-	A_FaceTarget (self);
-	P_GunShot2 (self, true, P_AimLineAttack (self, self->angle, MISSILERANGE),
-		PClass::FindClass(NAME_BulletPuff));
-}
-
 //============================================================================
 //
 // A_M_FireCGun
@@ -652,9 +452,13 @@ void A_M_FireCGun (AActor *self)
 	if (self->target == NULL)
 		return;
 
+	int index=CheckIndex(1);
+	if (index<0) return;
+	bool accurate =  !!EvalExpressionI (StateParameters[index], self);
+
 	S_Sound (self, CHAN_WEAPON, "weapons/chngun", 1, ATTN_NORM);
 	A_FaceTarget (self);
-	P_GunShot2 (self, false, P_AimLineAttack (self, self->angle, MISSILERANGE),
+	P_GunShot2 (self, accurate, P_AimLineAttack (self, self->angle, MISSILERANGE),
 		PClass::FindClass(NAME_BulletPuff));
 }
 
@@ -758,217 +562,30 @@ void A_M_FireBFG (AActor *self)
 
 //---------------------------------------------------------------------------
 
-class AMarineFist : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineFist, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineFist, Doom, 9101, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (S_MPLAY_ATK_FIST)
-	PROP_MissileState (255)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineBerserk : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineBerserk, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineBerserk, Doom, 9102, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (S_MPLAY_ATK_BERSERK)
-	PROP_MissileState (255)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineChainsaw : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineChainsaw, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineChainsaw, Doom, 9103, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (S_MPLAY_ATK_CHAINSAW)
-	PROP_MissileState (255)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarinePistol : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarinePistol, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarinePistol, Doom, 9104, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_PISTOL)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineShotgun : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineShotgun, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineShotgun, Doom, 9105, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_SHOTGUN)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineSSG : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineSSG, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineSSG, Doom, 9106, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_DSHOTGUN)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineChaingun : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineChaingun, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineChaingun, Doom, 9107, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_CHAINGUN)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineRocket : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineRocket, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineRocket, Doom, 9108, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_ROCKET)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarinePlasma : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarinePlasma, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarinePlasma, Doom, 9109, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_PLASMA)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineRailgun : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineRailgun, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineRailgun, Doom, 9110, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_RAILGUN)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
-class AMarineBFG : public AScriptedMarine
-{
-	DECLARE_STATELESS_ACTOR (AMarineBFG, AScriptedMarine)
-};
-
-IMPLEMENT_STATELESS_ACTOR (AMarineBFG, Doom, 9111, 0)
-	PROP_SpawnState (S_MPLAYSTILL)
-	PROP_MeleeState (255)
-	PROP_MissileState (S_MPLAY_ATK_BFG)
-END_DEFAULTS
-
-//---------------------------------------------------------------------------
-
 void AScriptedMarine::SetWeapon (EMarineWeapon type)
 {
-	MissileState = NULL;
-	MeleeState = NULL;
-	DecalGenerator = NULL;
-
-	switch (type)
+	if (GetWeaponStates(type, MeleeState, MissileState))
 	{
-	default:
-	case WEAPON_Dummy:
-		MissileState = &States[S_MPLAY_ATK];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AScriptedMarine))->DecalGenerator;
-		break;
+		static const char *classes[] = {
+			"ScriptedMarine",
+			"MarineFist",
+			"MarineBerserk",
+			"MarineChainsaw",
+			"MarinePistol",
+			"MarineShotgun",
+			"MarineSSG",
+			"MarineChaingun",
+			"MarineRocket",
+			"MarinePlasma",
+			"MarineRailgun",
+			"MarineBFG"
+		};
 
-	case WEAPON_Fist:
-		MeleeState = &States[S_MPLAY_ATK_FIST];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineFist))->DecalGenerator;
-		break;
-
-	case WEAPON_BerserkFist:
-		MeleeState = &States[S_MPLAY_ATK_BERSERK];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineBerserk))->DecalGenerator;
-		break;
-
-	case WEAPON_Chainsaw:
-		MeleeState = &States[S_MPLAY_ATK_CHAINSAW];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineChainsaw))->DecalGenerator;
-		break;
-
-	case WEAPON_Pistol:
-		MissileState = &States[S_MPLAY_ATK_PISTOL];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarinePistol))->DecalGenerator;
-		break;
-
-	case WEAPON_Shotgun:
-		MissileState = &States[S_MPLAY_ATK_SHOTGUN];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineShotgun))->DecalGenerator;
-		break;
-
-	case WEAPON_SuperShotgun:
-		MissileState = &States[S_MPLAY_ATK_DSHOTGUN];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineSSG))->DecalGenerator;
-		break;
-
-	case WEAPON_Chaingun:
-		MissileState = &States[S_MPLAY_ATK_CHAINGUN];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineChaingun))->DecalGenerator;
-		break;
-
-	case WEAPON_RocketLauncher:
-		MissileState = &States[S_MPLAY_ATK_ROCKET];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineRocket))->DecalGenerator;
-		break;
-
-	case WEAPON_PlasmaRifle:
-		MissileState = &States[S_MPLAY_ATK_PLASMA];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarinePlasma))->DecalGenerator;
-		break;
-
-	case WEAPON_Railgun:
-		MissileState = &States[S_MPLAY_ATK_RAILGUN];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineRailgun))->DecalGenerator;
-		break;
-
-	case WEAPON_BFG:
-		MissileState = &States[S_MPLAY_ATK_BFG];
-		DecalGenerator = GetDefaultByType (RUNTIME_CLASS(AMarineBFG))->DecalGenerator;
-		break;
+		const PClass *cls = PClass::FindClass(classes[type]);
+		if (cls != NULL)
+			DecalGenerator = GetDefaultByType(cls)->DecalGenerator;
+		else 
+			DecalGenerator = NULL;
 	}
 }
 
diff --git a/src/namedef.h b/src/namedef.h
index 98a24ca2da..dcd15bfdab 100644
--- a/src/namedef.h
+++ b/src/namedef.h
@@ -169,6 +169,18 @@ xx(Pickup)
 xx(Use)
 xx(Drop)
 
+xx(Fist)
+//xx(Berserk)
+xx(Chainsaw)
+xx(Pistol)
+xx(Shotgun)
+xx(SSG)
+xx(Chaingun)
+xx(Rocket)
+xx(Plasma)
+xx(BFG)
+//xx(Railgun)
+
 // Damage types
 //xx(Fire)		already defined above
 //xx(Ice)
diff --git a/src/p_spec.cpp b/src/p_spec.cpp
index 1896c5f4dd..480e826b00 100644
--- a/src/p_spec.cpp
+++ b/src/p_spec.cpp
@@ -647,7 +647,9 @@ CUSTOM_CVAR (Bool, forcewater, false, CVAR_ARCHIVE|CVAR_SERVERINFO)
 
 class DLightTransfer : public DThinker
 {
-	DECLARE_ACTOR (DLightTransfer, DThinker)
+	DECLARE_CLASS (DLightTransfer, DThinker)
+
+	DLightTransfer() {}
 public:
 	DLightTransfer (sector_t *srcSec, int target, bool copyFloor);
 	void Serialize (FArchive &arc);
@@ -729,7 +731,8 @@ class DWallLightTransfer : public DThinker
 		WLF_NOFAKECONTRAST=4
 	};
 
-	DECLARE_ACTOR (DWallLightTransfer, DThinker)
+	DECLARE_CLASS (DWallLightTransfer, DThinker)
+	DWallLightTransfer() {}
 public:
 	DWallLightTransfer (sector_t *srcSec, int target, BYTE flags);
 	void Serialize (FArchive &arc);
diff --git a/wadsrc/static/actors/doom/scriptedmarine.txt b/wadsrc/static/actors/doom/scriptedmarine.txt
new file mode 100644
index 0000000000..dc7db0498d
--- /dev/null
+++ b/wadsrc/static/actors/doom/scriptedmarine.txt
@@ -0,0 +1,313 @@
+
+// Scriptable marine -------------------------------------------------------
+
+ACTOR ScriptedMarine 9100 native
+{
+	Game Doom
+	SpawnID 151
+	Health 100
+	Radius 16
+	Height 56
+	Mass 100
+	Speed 8
+	Painchance 160
+	MONSTER
+	-COUNTKILL
+	Translation 0
+	Damage 100
+	DeathSound "*death"
+	PainSound "*pain50"
+	
+	action native A_M_Refire ();
+	action native A_M_CheckAttack ();
+	action native A_MarineChase ();
+	action native A_MarineLook ();
+	action native A_MarineNoise ();
+	action native A_M_Punch (int force);
+	action native A_M_SawRefire ();
+	action native A_M_FirePistol (bool accurate);
+	action native A_M_FireShotgun ();
+	action native A_M_FireShotgun2 ();
+	action native A_M_FireCGun(bool accurate);
+	action native A_M_FireMissile ();
+	action native A_M_FirePlasma ();
+	action native A_M_FireRailgun ();
+	action native A_M_BFGsound ();
+	action native A_M_FireBFG ();
+	
+	States
+	{
+	Spawn:
+		PLAY A 4 A_MarineLook
+		PLAY A 4 A_MarineNoise
+	Idle:
+		PLAY A 4 A_MarineLook
+		PLAY A 4 A_MarineNoise
+		PLAY A 4 A_MarineLook
+		PLAY B 4 A_MarineNoise
+		PLAY B 4 A_MarineLook
+		PLAY B 4 A_MarineNoise
+		Loop
+	See:
+		PLAY ABCD 4 A_MarineChase
+		Loop
+
+	Melee.Fist:		
+		PLAY E 4 A_FaceTarget
+		PLAY F 4 A_M_Punch(1)
+		PLAY A 9
+		PLAY A 0 A_M_Refire
+		Loop
+		PLAY A 5 A_FaceTarget
+		Goto See
+	Melee.Berserk:
+		PLAY E 4 A_FaceTarget
+		PLAY F 4 A_M_Punch(10)
+		PLAY A 9
+		PLAY A 0 A_M_Refire
+		Loop
+		PLAY A 5 A_FaceTarget
+		Goto See
+	Melee.Chainsaw:
+		PLAY E 4 A_MarineNoise
+		PLAY F 4 BRIGHT A_M_Saw
+		PLAY F 0 A_M_SawRefire
+		goto Melee.Chainsaw+1
+		PLAY A 0
+		Goto See
+
+	Missile:
+	Missile.None:
+		PLAY E 12 A_FaceTarget
+		Goto Idle
+		PLAY F 6 BRIGHT
+		Loop
+	Missile.Pistol:
+		PLAY E 4 A_FaceTarget
+		PLAY F 6 BRIGHT A_M_FirePistol(1)
+		PLAY A 4 A_FaceTarget
+		PLAY A 0 A_M_Refire
+		PLAY A 5
+		Goto See
+	Fireloop.Pistol:
+		PLAY F 6 BRIGHT A_M_FirePistol(0)
+		PLAY A 4 A_FaceTarget
+		PLAY A 0 A_M_Refire
+		Goto Fireloop.Pistol
+		PLAY A 5
+		Goto See
+	Missile.Shotgun:
+		PLAY E 3 A_M_CheckAttack
+		PLAY F 7 BRIGHT A_M_FireShotgun
+		Goto See
+	Missile.SSG:
+		PLAY E 3 A_M_CheckAttack
+		PLAY F 7 BRIGHT A_M_FireShotgun2
+		Goto See
+	Missile.Chaingun:
+		PLAY E 4 A_FaceTarget
+		PLAY FF 4 BRIGHT A_M_FireCGun(1)
+		PLAY FF 4 BRIGHT A_M_FireCGun(0)
+		PLAY A 0 A_M_Refire
+		Goto Missile.Chaingun+3
+		PLAY A 0
+		Goto See
+	Missile.Rocket:
+		PLAY E 8
+		PLAY F 6 BRIGHT A_M_FireMissile
+		PLAY A 0 A_M_Refire
+		Loop
+		PLAY A 0
+		Goto See
+	Missile.Plasma:
+		PLAY E 2 A_FaceTarget
+		PLAY F 3 BRIGHT A_M_FirePlasma
+		PLAY A 0 A_M_Refire
+		Loop
+		PLAY A 0
+		Goto See
+	Missile.Railgun:
+		PLAY E 4 A_M_CheckAttack
+		PLAY F 6 A_M_FireRailgun
+		Goto See
+	Missile.BFG:
+		PLAY E 5 A_M_BFGSound
+		PLAY EEEEE 5 A_FaceTarget
+		PLAY F 6 A_M_FireBFG
+		PLAY A 4 A_FaceTarget
+		PLAY A 0 A_M_Refire
+		Loop
+		PLAY A 0
+		Goto See
+
+	SkipAttack:
+		PLAY A 1
+		Goto See
+	Pain:
+		PLAY G 4
+		PLAY G 4 A_Pain
+		Goto Idle
+	Death:
+		PLAY H 10
+		PLAY I 10 A_Scream
+		PLAY J 10 A_NoBlocking
+		PLAY KLM 10
+		PLAY N -1
+		Stop
+	XDeath:
+		PLAY O 5
+		PLAY P 5 A_XScream
+		PLAY Q 5 A_NoBlocking
+		PLAY RSTUV 5
+		PLAY W -1
+		Stop
+	}
+}
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineFist : ScriptedMarine 9101
+{
+	Game Doom
+	States
+	{
+	Melee:		
+		Goto Super::Melee.Fist
+	Missile:
+		Stop
+	}
+}
+
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineBerserk : MarineFist 9102
+{
+	Game Doom
+	States
+	{
+	Melee:		
+		Goto Super::Melee.Berserk
+	Missile:
+		Stop
+	}
+}
+//---------------------------------------------------------------------------
+
+ACTOR MarineChainsaw : ScriptedMarine 9103
+{
+	Game Doom
+	States
+	{
+	Melee:
+		Goto Super::Melee.Chainsaw
+	Missile:
+		Stop
+	}
+}
+
+
+
+//---------------------------------------------------------------------------
+
+ACTOR MarinePistol : ScriptedMarine 9104
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.Pistol
+	}
+
+}
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineShotgun : ScriptedMarine 9105
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.Shotgun
+	}
+
+}
+
+
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineSSG : ScriptedMarine 9106
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.SSG
+	}
+}
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineChaingun : ScriptedMarine 9107
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.Chaingun
+	}
+}
+
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineRocket : MarineFist 9108
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.Rocket
+	}
+
+}
+
+//---------------------------------------------------------------------------
+
+ACTOR MarinePlasma : ScriptedMarine 9109
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.Plasma
+	}
+
+}
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineRailgun : ScriptedMarine 9110
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.Railgun
+	}
+
+}
+
+//---------------------------------------------------------------------------
+
+ACTOR MarineBFG : ScriptedMarine 9111
+{
+	Game Doom
+	States
+	{
+	Missile:
+		Goto Super::Missile.BFG
+	}
+}
diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt
index 0ecfa4257d..b32a3b2383 100644
--- a/wadsrc/static/decorate.txt
+++ b/wadsrc/static/decorate.txt
@@ -39,6 +39,7 @@
 #include "actors/doom/doomdecorations.txt"
 #include "actors/doom/doomweapons.txt"
 #include "actors/doom/stealthmonsters.txt"
+#include "actors/doom/scriptedmarine.txt"
 
 #include "actors/raven/artiegg.txt"
 #include "actors/raven/ravenartifacts.txt"