diff -r d77c57eb7264 src/g_shared/a_randomspawner.cpp
--- a/src/g_shared/a_randomspawner.cpp	Sun Feb 28 14:07:47 2016 +0100
+++ b/src/g_shared/a_randomspawner.cpp	Fri Mar 04 23:27:28 2016 +0000
@@ -168,6 +168,9 @@
 			newmobj->target = target;
 			newmobj->tracer = tracer;
 			newmobj->CopyFriendliness(this, false);
+			newmobj->pMonsterSpot = this->pMonsterSpot;	// For invasion.
+			newmobj->ulInvasionWave = this->ulInvasionWave;
+			newmobj->pPickupSpot = this->pPickupSpot;
 			// This handles things such as projectiles with the MF4_SPECTRAL flag that have
 			// a health set to -2 after spawning, for internal reasons.
 			if (health != SpawnHealth()) newmobj->health = health;
diff -r d77c57eb7264 src/invasion.cpp
--- a/src/invasion.cpp	Sun Feb 28 14:07:47 2016 +0100
+++ b/src/invasion.cpp	Fri Mar 04 23:27:28 2016 +0000
@@ -720,6 +720,12 @@
 			break;
 		}
 
+		// [CL] Check if the wave has finished, before/after all actors have had a chance to run.
+		if ( g_ulNumMonstersLeft == 0 )
+		{
+			INVASION_DoWaveComplete( );
+		}
+
 		// [BB] If everyone is dead, the mission has failed!
 		// [BB] Invasion with (sv_maxlives == 0) allows unlimited respawns.
 		if ( ( sv_maxlives > 0 ) && ( GAME_CountLivingAndRespawnablePlayers( ) == 0 ) )
@@ -1291,11 +1297,6 @@
 void INVASION_SetNumMonstersLeft( ULONG ulLeft )
 {
 	g_ulNumMonstersLeft = ulLeft;
-	if (( g_ulNumMonstersLeft == 0 ) &&
-		( NETWORK_InClientMode() == false ))
-	{
-		INVASION_DoWaveComplete( );
-	}
 }
 
 //*****************************************************************************
