Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp	(revision 8528)
+++ code/freespace2/freespace.cpp	(working copy)
@@ -7347,7 +7347,7 @@
 	ship_close();					// free any memory that was allocated for the ships
 	hud_free_scrollback_list();// free space allocated to store hud messages in hud scrollback
 	unload_animating_pointer();// frees the frames used for the animating mouse pointer
-	mission_campaign_close();	// close out the campaign stuff
+	mission_campaign_clear();	// clear out the campaign stuff
 	message_mission_close();	// clear loaded table data from message.tbl
 	mission_parse_close();		// clear out any extra memory that may be in use by mission parsing
 	multi_voice_close();			// close down multiplayer voice (including freeing buffers, etc)
Index: code/mission/missioncampaign.cpp
===================================================================
--- code/mission/missioncampaign.cpp	(revision 8528)
+++ code/mission/missioncampaign.cpp	(working copy)
@@ -444,7 +444,7 @@
 		// we must also free any goal stuff that was from a previous campaign
 		// this also frees sexpressions so the next call to init_sexp will be able to reclaim
 		// nodes previously used by another campaign.
-		mission_campaign_close();
+		mission_campaign_clear();
 
 		strcpy_s( Campaign.filename, filename );
 
@@ -456,7 +456,6 @@
 
 		read_file_text( filename );
 		reset_parse();
-		memset( &Campaign, 0, sizeof(Campaign) );
 
 		// copy filename to campaign structure minus the extension
 		len = strlen(filename) - 4;
@@ -715,7 +714,7 @@
  */
 void mission_campaign_init()
 {
-	memset(&Campaign, 0, sizeof(Campaign) );
+	mission_campaign_clear();
 
 	Campaign_file_missing = 0;
 }
@@ -1206,7 +1205,7 @@
 /**
  * Called when the game closes -- to get rid of memory errors for Bounds checker
  */
-void mission_campaign_close()
+void mission_campaign_clear()
 {
 	int i;
 
@@ -1267,6 +1266,7 @@
 		Campaign.missions[i].num_goals = 0;
 		Campaign.missions[i].num_events = 0;
 		Campaign.missions[i].num_variables = 0;	// Goober5000
+		Campaign.missions[i].main_hall.clear();
 	}
 
 	Campaign.num_missions = 0;
Index: code/mission/missioncampaign.h
===================================================================
--- code/mission/missioncampaign.h	(revision 8528)
+++ code/mission/missioncampaign.h	(working copy)
@@ -180,7 +180,7 @@
 extern void mission_campaign_mission_over( bool do_next_mission = true );
 
 // frees all memory at game close time
-extern void mission_campaign_close( void );
+extern void mission_campaign_clear( void );
 
 // read in a campaign file.  Used by Fred.
 int mission_campaign_load_fred(char *filename, char *name_verify = NULL);
Index: code/network/multi_campaign.cpp
===================================================================
--- code/network/multi_campaign.cpp	(revision 8528)
+++ code/network/multi_campaign.cpp	(working copy)
@@ -713,7 +713,7 @@
 	case MC_JIP_INITIAL_PACKET:
 
 		// clear out the names of the missions
-		mission_campaign_close();						// should free all data structures which need to be freed
+		mission_campaign_clear();						// should free all data structures which need to be freed
 
 		// get the number of campaigns and their names.
 		GET_INT(Campaign.num_missions);
