Index: code/menuui/readyroom.cpp
===================================================================
--- code/menuui/readyroom.cpp	(revision 11007)
+++ code/menuui/readyroom.cpp	(working copy)
@@ -1533,7 +1533,7 @@
 		strcat(filename, FS_CAMPAIGN_FILE_EXT);
 
 		mission_campaign_savefile_delete(filename);
-		mission_campaign_load(filename);
+		mission_campaign_load(filename, NULL, 1 , false); // retail doesn't reset stats when resetting the campaign
 		mission_campaign_next_mission();
 
 		vm_free(filename);
Index: code/mission/missioncampaign.cpp
===================================================================
--- code/mission/missioncampaign.cpp	(revision 11007)
+++ code/mission/missioncampaign.cpp	(working copy)
@@ -407,7 +407,7 @@
  * this file.  If you change the format of the campaign file, you should be sure these related
  * functions work properly and update them if it breaks them.
  */
-int mission_campaign_load( char *filename, player *pl, int load_savefile )
+int mission_campaign_load( char *filename, player *pl, int load_savefile, bool reset_stats )
 {
 	int len, rval, i;
 	char name[NAME_LENGTH], type[NAME_LENGTH], temp[NAME_LENGTH];
@@ -655,6 +655,10 @@
 			} else {
 				// make sure we initialize red alert data for the new CSG
 				red_alert_clear();
+				// and reset stats when requested
+				if (reset_stats) {
+					pl->stats.init();
+				}
 				Pilot.save_savefile();
 			}
 		}
Index: code/mission/missioncampaign.h
===================================================================
--- code/mission/missioncampaign.h	(revision 11007)
+++ code/mission/missioncampaign.h	(working copy)
@@ -181,7 +181,7 @@
 
 
 // load up and initialize a new campaign
-int mission_campaign_load( char *filename, player *pl = NULL, int load_savefile = 1 );
+int mission_campaign_load( char *filename, player *pl = NULL, int load_savefile = 1, bool reset_stats = true );
 
 // function to save the state of the campaign between missions or to load a campaign save file
 extern int mission_campaign_save( void );
