diff --git a/src/gs-entbase/server/basemonster.cpp b/src/gs-entbase/server/basemonster.cpp
index e8672d4f..7bf7c71e 100644
--- a/src/gs-entbase/server/basemonster.cpp
+++ b/src/gs-entbase/server/basemonster.cpp
@@ -65,14 +65,17 @@ class CBaseMonster:CBaseEntity
 	vector base_maxs;
 	int base_health;
 
+	int m_iSequenceRemove;
 	int m_iSequenceState;
 	float m_flSequenceEnd;
 	float m_flSequenceSpeed;
+	vector m_vecSequenceAngle;
 
 	/* pathfinding */
 	int m_iNodes;
 	int m_iCurNode;
 	nodeslist_t *m_pRoute;
+	vector m_vecLastNode;
 
 	/* sequences */
 	string m_strRouteEnded;
@@ -177,26 +180,42 @@ void CBaseMonster::FreeState(void)
 			}
 		}
 	}
+
+	if (m_iSequenceRemove) {
+		Hide();
+	}
 }
 
 void CBaseMonster::CheckRoute(void)
 {
 	float flDist;
+	vector evenpos;
 
 	if (!m_iNodes) {
 		return;
 	}
 
-	flDist = floor( vlen( m_pRoute[m_iCurNode].dest - origin ) );
+	/* level out position/node stuff */
+	if (m_iCurNode < 0) {
+		evenpos = m_vecLastNode;
+		evenpos[2] = origin[2];
+	} else {
+		evenpos = m_pRoute[m_iCurNode].dest;
+		evenpos[2] = origin[2];
+	}
 
-	if ( flDist < 64 ) {
+	flDist = floor( vlen( evenpos - origin ) );
+
+	if ( flDist < 8 ) {
 		print(sprintf("^2CBaseMonster::CheckRoute^7: %s reached node\n", this.netname));
 		m_iCurNode--;
 		velocity = [0,0,0]; /* clamp friction */
 	}
 	
-	if (m_iCurNode < 0) {
+	if (m_iCurNode < -1) {
+		ClearRoute();
 		print(sprintf("^2CBaseMonster::CheckRoute^7: %s reached end\n", this.netname));
+
 		/* mark that we've ended a sequence, if we're in one and que anim */
 		if (m_iSequenceState == SEQUENCESTATE_ACTIVE) {
 			if (m_flSequenceEnd) {
@@ -205,9 +224,12 @@ void CBaseMonster::CheckRoute(void)
 				think = FreeState;
 				nextthink = time + duration;
 				print(sprintf("^2CBaseMonster::CheckRoute^7: %s overriding anim for %f seconds (modelindex %d, frame %d)\n", this.netname, duration, modelindex, m_flSequenceEnd));
+			} else {
+				/* we still need to trigger targets */
+				think = FreeState;
+				nextthink = time;
 			}
 		}
-		ClearRoute();
 	}
 
 	/*if ( flDist == m_flLastDist ) {
@@ -229,7 +251,12 @@ void CBaseMonster::WalkRoute(void)
 {
 	if (m_iNodes) {
 		vector endangles;
-		endangles = vectoangles(m_pRoute[m_iCurNode].dest - origin);
+		/* we're on our last node */
+		if (m_iCurNode < 0) {
+			endangles = vectoangles(m_vecLastNode - origin);
+		} else {
+			endangles = vectoangles(m_pRoute[m_iCurNode].dest - origin);
+		}
 		input_angles[1] = endangles[1];
 		input_movevalues = [m_flSequenceSpeed, 0, 0];
 	}
@@ -250,6 +277,7 @@ void CBaseMonster::NewRoute(vector destination)
 
 	if (!m_iNodes) {
 		route_calculate(this, destination, 0, NewRoute_RouteCB);
+		m_vecLastNode = destination;
 	}
 }
 
@@ -262,7 +290,8 @@ void CBaseMonster::Physics(void)
 	input_timelength = frametime;
 
 	/* override whatever we did above with this */
-	if (m_iSequenceState == SEQUENCESTATE_ACTIVE) {
+	if (m_iSequenceState == SEQUENCESTATE_ENDING) {
+		input_angles = angles = v_angle = m_vecSequenceAngle;
 		frame = m_flSequenceEnd;
 	} else {
 		movetype = MOVETYPE_WALK;
diff --git a/src/gs-entbase/server/basenpc.cpp b/src/gs-entbase/server/basenpc.cpp
index 25bb7c58..2d5533e7 100644
--- a/src/gs-entbase/server/basenpc.cpp
+++ b/src/gs-entbase/server/basenpc.cpp
@@ -385,7 +385,7 @@ CBaseNPC::FollowPlayer(void)
 			v_angle = vectoangles(m_vecLastUserPos - origin);
 			v_angle[0] = 0;
 			v_angle[1] = Math_FixDelta(v_angle[1]);
-				v_angle[2] = 0;
+			v_angle[2] = 0;
 		} else {
 			m_vecLastUserPos = m_eFollowingChain.origin;
 		}
@@ -471,6 +471,7 @@ CBaseNPC::Physics(void)
 
 	/* override whatever we did above with this */
 	if (m_iSequenceState == SEQUENCESTATE_ENDING) {
+		input_angles = angles = v_angle = m_vecSequenceAngle;
 		frame = m_flSequenceEnd;
 	} else {
 		if (style != MONSTER_DEAD) {
diff --git a/src/gs-entbase/server/scripted_sequence.cpp b/src/gs-entbase/server/scripted_sequence.cpp
index 20b75cf5..90593c32 100644
--- a/src/gs-entbase/server/scripted_sequence.cpp
+++ b/src/gs-entbase/server/scripted_sequence.cpp
@@ -77,6 +77,8 @@ enum {
 
 class scripted_sequence:CBaseTrigger
 {
+	int m_iEnabled;
+
 	/* Target name OR classname description */
 	string m_strMonster;
 	/* After the monster has moved to the action point, play this animation */
@@ -97,13 +99,28 @@ void scripted_sequence::Trigger(void)
 {
 	CBaseMonster f;
 
+	if (!m_iEnabled) {
+		return;
+	}
+
 	print(sprintf("^2scripted_sequence::Trigger^7: with spawnflags %d\n", spawnflags));
 	f = (CBaseMonster)find(world, CBaseEntity::m_strTargetName, m_strMonster);
 
 	/* target doesn't exist/hasn't spawned */
 	if (!f) {
-		print(sprintf("^1scripted_sequence::Trigger^7: Unknown target %s\n", m_strMonster));
-		return;
+		/* time to look for a classname instead */
+		for (entity c = world; (c = find(c, ::classname, m_strMonster));) {
+			/* within radius */
+			if (vlen(origin - c.origin) < m_flSearchRadius) {
+				f = c;
+				break;
+			}
+		}
+
+		if (!f) {
+			print(sprintf("^1scripted_sequence::Trigger^7: Unknown target %s\n", m_strMonster));
+			return;
+		}
 	}
 
 	/* if we're told an anim, we better have it... or else. */
@@ -121,6 +138,9 @@ void scripted_sequence::Trigger(void)
 	/* mark the state */
 	f.m_iSequenceState = SEQUENCESTATE_ACTIVE;
 
+	/* seems to be active at all times? contrary to SS_TURNTOFACE existing? */
+	f.m_vecSequenceAngle = angles;
+
 	if (m_iMove == SS_WALK) {
 		f.NewRoute(origin);
 		f.m_flSequenceSpeed = 64;
@@ -137,18 +157,19 @@ void scripted_sequence::Trigger(void)
 		f.think = CBaseMonster::FreeState;
 		f.nextthink = time + frameduration(f.modelindex, f.m_flSequenceEnd);
 	} else if (m_iMove == SS_TURNTOFACE) {
-		/* turn instantly, only affect YAW. */
-		vector newangle = vectoangles(origin - f.origin);
-		f.angles[1] = newangle[1];
 		f.m_iSequenceState = SEQUENCESTATE_ENDING;
 		f.think = CBaseMonster::FreeState;
 		f.nextthink = time + frameduration(f.modelindex, f.m_flSequenceEnd);
-	} 
+	}
+
+	if (!(spawnflags & SSFL_REPEATABLE)) {
+		m_iEnabled = FALSE;
+	}
 }
 
 void scripted_sequence::Respawn(void)
 {
-	
+	m_iEnabled = TRUE;
 }
 
 void scripted_sequence::scripted_sequence(void)