Index: code/mission/missioncampaign.cpp
===================================================================
--- code/mission/missioncampaign.cpp	(revision 10753)
+++ code/mission/missioncampaign.cpp	(working copy)
@@ -983,7 +983,7 @@
 /**
  * Store mission's goals and events in Campaign struct
  */
-void mission_campaign_store_goals_and_events_and_variables()
+void mission_campaign_store_goals_and_events()
 {
 	char *name;
 	int cur, i, j;
@@ -1058,7 +1058,16 @@
 		} else
 			Int3();
 	}
+}
 
+void mission_campaign_store_variables()
+{
+	int cur, i, j;
+	cmission *mission;
+
+	cur = Campaign.current_mission;
+	mission = &Campaign.missions[cur];
+
 	// Goober5000 - handle campaign-persistent variables -------------------------------------
 	if (mission->variables != NULL) {
 		vm_free( mission->variables );
@@ -1161,6 +1170,12 @@
 	// --------------------------------------------------------------------------
 }
 
+void mission_campaign_store_goals_and_events_and_variables()
+{
+	mission_campaign_store_goals_and_events();
+	mission_campaign_store_variables();
+}
+
 /**
  * Called when the player's mission is over.  It updates the internal store of goals
  * and their status then saves the state of the campaign in the campaign file.  
Index: code/mission/missioncampaign.h
===================================================================
--- code/mission/missioncampaign.h	(revision 10753)
+++ code/mission/missioncampaign.h	(working copy)
@@ -242,6 +242,12 @@
 int mission_load_up_campaign( player *p = NULL );
 
 // stores mission goals and events in Campaign struct
+void mission_campaign_store_goals_and_events();
+
+// stores campaign-persistent variables
+void mission_campaign_store_variables();
+
+// does both of the above
 void mission_campaign_store_goals_and_events_and_variables();
 
 // evaluates next mission and possible loop mission
Index: code/missionui/missiondebrief.cpp
===================================================================
--- code/missionui/missiondebrief.cpp	(revision 10753)
+++ code/missionui/missiondebrief.cpp	(working copy)
@@ -1352,6 +1352,8 @@
 		// mission that isn't in a campaign.
 		if ( Game_mode & GM_CAMPAIGN_MODE ) {
 
+			mission_campaign_store_variables();
+
 			// check for possible mission loop
 			// check for (1) mission loop available, (2) don't have to repeat last mission
 			if(!(Game_mode & GM_MULTIPLAYER)){
@@ -2032,7 +2034,7 @@
 	if ( (Game_mode & GM_CAMPAIGN_MODE) && ( !MULTIPLAYER_CLIENT )	) {
 		// MUST store goals and events first - may be used to evaluate next mission
 		// store goals and events
-		mission_campaign_store_goals_and_events_and_variables();
+		mission_campaign_store_goals_and_events();
 
 		// evaluate next mission
 		mission_campaign_eval_next_mission();
