diff -r 3601b7eff8bc src/p_map.cpp
--- a/src/p_map.cpp	Sun May 12 21:32:37 2013 +0200
+++ b/src/p_map.cpp	Sun May 26 16:37:07 2013 +0200
@@ -2226,16 +2226,15 @@
 		}
 	}
 
-	// [BB] Spectators don't trigger transitions.
-	if ( thing->player && thing->player->bSpectating )
-		return true;
-
 	// [RH] If changing sectors, trigger transitions
 	if (oldsec != newsec)
 	{
 		if (oldsec->SecActTarget)
 		{
-			oldsec->SecActTarget->TriggerAction (thing, SECSPAC_Exit);
+            // [EP] Allow spectators for teleport specials.
+			if ( ( thing->player == NULL ) || ( thing->player->bSpectating == false ) ||
+                GAMEMODE_IsSpectatorAllowedSpecial(oldsec->SecActTarget->special) == true)
+				oldsec->SecActTarget->TriggerAction (thing, SECSPAC_Exit);
 		}
 		if (newsec->SecActTarget)
 		{
@@ -2253,7 +2252,10 @@
 			{
 				act |= SECSPAC_HitFakeFloor;
 			}
-			newsec->SecActTarget->TriggerAction (thing, act);
+            // [EP] Allow spectators for teleport specials.
+			if ( ( thing->player == NULL ) || ( thing->player->bSpectating == false ) ||
+                GAMEMODE_IsSpectatorAllowedSpecial(newsec->SecActTarget->special) == true)
+			    newsec->SecActTarget->TriggerAction (thing, act);
 		}
 
 		// [BL] Trigger Domination check if player enters a new sector in Domination
@@ -2420,9 +2422,7 @@
 				if ( thing->player && thing->player->bSpectating )
 				{
 					// Although teleport specials are okay.
-					if (ld->special == Teleport ||
-				     ld->special == Teleport_NoFog ||
-					 ld->special == Teleport_Line)
+					if (GAMEMODE_IsSpectatorAllowedSpecial(ld->special) == true)
 					{ 
 						P_ActivateLine (ld, thing, oldside, SPAC_Cross); 
 					}
diff -r 3601b7eff8bc src/p_mobj.cpp
--- a/src/p_mobj.cpp	Sun May 12 21:32:37 2013 +0200
+++ b/src/p_mobj.cpp	Sun May 26 16:37:07 2013 +0200
@@ -2721,7 +2721,9 @@
 			mo->Sector->floorplane.ZatPoint (mo->x, mo->y) == mo->floorz)
 		{ // [RH] Let the sector do something to the actor
 			// [BB] Spectators shouldn't trigger such actions.
-			if ( ( mo->player == NULL ) || ( mo->player->bSpectating == false ) )
+			// [EP] Except for teleports.
+			if ( ( mo->player == NULL ) || ( mo->player->bSpectating == false ) || 
+                 ( GAMEMODE_IsSpectatorAllowedSpecial ( mo->Sector->SecActTarget->special ) == true ) )
 				mo->Sector->SecActTarget->TriggerAction (mo, SECSPAC_HitFloor);
 		}
 		P_CheckFor3DFloorHit(mo);
@@ -2860,7 +2862,9 @@
 			mo->Sector->ceilingplane.ZatPoint (mo->x, mo->y) == mo->ceilingz)
 		{ // [RH] Let the sector do something to the actor
 			// [BB] Spectators shouldn't trigger such actions.
-			if ( ( mo->player == NULL ) || ( mo->player->bSpectating == false ) )
+			// [EP] Except for teleports.
+			if ( ( mo->player == NULL ) || ( mo->player->bSpectating == false ) || 
+                 ( GAMEMODE_IsSpectatorAllowedSpecial ( mo->Sector->SecActTarget->special ) == true ) )
 				mo->Sector->SecActTarget->TriggerAction (mo, SECSPAC_HitCeiling);
 		}
 		P_CheckFor3DCeilingHit(mo);
@@ -6898,4 +6902,4 @@
 		}
 	}
 }
-#endif
\ No newline at end of file
+#endif
