Index: code/pilotfile/csg.cpp
===================================================================
--- code/pilotfile/csg.cpp	(revision 9592)
+++ code/pilotfile/csg.cpp	(working copy)
@@ -11,6 +11,7 @@
 #include "missionui/missionscreencommon.h"
 #include "mission/missioncampaign.h"
 #include "missionui/missionshipchoice.h"
+#include "mission/missionload.h"
 #include "sound/audiostr.h"
 #include "io/joy.h"
 #include "io/mouse.h"
@@ -31,7 +32,8 @@
 //       that sort!
 //
 //   0 - initial version
-static const ubyte CSG_VERSION = 0;
+//   1 - re-add recent missions
+static const ubyte CSG_VERSION = 1;
 
 
 void pilotfile::csg_read_flags()
@@ -1173,6 +1175,46 @@
 	endSection();
 }
 
+/*
+ * Only used for quick start missions
+ */
+void pilotfile::csg_read_lastmissions()
+{
+	int i;
+
+	// restore list of most recently played missions
+	Num_recent_missions = cfread_int( cfp );
+	Assert(Num_recent_missions <= MAX_RECENT_MISSIONS);
+	for ( i = 0; i < Num_recent_missions; i++ ) {
+		char *cp;
+
+		cfread_string_len( Recent_missions[i], MAX_FILENAME_LEN, cfp);
+		// Remove the extension (safety check: shouldn't exist anyway)
+		cp = strchr(Recent_missions[i], '.');
+			if (cp)
+				*cp = 0;
+	}
+}
+
+/*
+ * Only used for quick start missions
+ */
+
+void pilotfile::csg_write_lastmissions()
+{
+	int i;
+
+	startSection(Section::LastMissions);
+
+	// store list of most recently played missions
+	cfwrite_int(Num_recent_missions, cfp);
+	for (i=0; i<Num_recent_missions; i++) {
+		cfwrite_string_len(Recent_missions[i], cfp);
+	}
+
+	endSection();
+}
+
 void pilotfile::csg_reset_data()
 {
 	int idx;
@@ -1376,6 +1418,11 @@
 					csg_read_cutscenes();
 					break;
 
+				case Section::LastMissions:
+					mprintf(("CSG => Parsing:  Last Missions...\n"));
+					csg_read_lastmissions();
+					break;
+
 				default:
 					mprintf(("CSG => Skipping unknown section 0x%04x!\n", section_id));
 					break;
@@ -1487,6 +1534,8 @@
 	csg_write_controls();
 	mprintf(("CSG => Saving:  Cutscenes...\n"));
 	csg_write_cutscenes();
+	mprintf(("CSG => Saving:  Last Missions...\n"));
+	csg_write_lastmissions();
 
 	// Done!
 	mprintf(("CSG => Saving complete!\n"));
Index: code/pilotfile/pilotfile.h
===================================================================
--- code/pilotfile/pilotfile.h	(revision 9592)
+++ code/pilotfile/pilotfile.h	(working copy)
@@ -120,7 +120,8 @@
 				RedAlert		= 0x0011,
 				Variables		= 0x0012,
 				Missions		= 0x0013,
-				Cutscenes		= 0x0014
+				Cutscenes		= 0x0014,
+				LastMissions	= 0x0015
 			};
 		};
 
@@ -175,6 +176,7 @@
 		void csg_read_settings();
 		void csg_read_controls();
 		void csg_read_cutscenes();
+		void csg_read_lastmissions();
 
 		void csg_write_flags();
 		void csg_write_info();
@@ -188,6 +190,7 @@
 		void csg_write_settings();
 		void csg_write_controls();
 		void csg_write_cutscenes();
+		void csg_write_lastmissions();
 };
 
 extern pilotfile Pilot;
Index: code/missionui/missionshipchoice.cpp
===================================================================
--- code/missionui/missionshipchoice.cpp	(revision 9592)
+++ code/missionui/missionshipchoice.cpp	(working copy)
@@ -23,6 +23,7 @@
 #include "globalincs/linklist.h"
 #include "io/mouse.h"
 #include "playerman/player.h"
+#include "pilotfile/pilotfile.h"
 #include "menuui/snazzyui.h"
 #include "anim/animplay.h"
 #include "anim/packunpack.h"
@@ -2492,17 +2493,18 @@
 		change_ship_type(Player_obj->instance, si_index);
 
 	Player->last_ship_flown_si_index = si_index;
+	Pilot.save_savefile();  // saves both Recent_mission & last_ship_flown_si_index (for quick-start-missions)
 }
 
-// ----------------------------------------------------------------------------
-// create a default player ship
-//
-//	parameters:		use_last_flown	=> select ship that was last flown on a mission
-//						(this is a default parameter which is set to 1)
-//
-// returns:			0 => success
-//               !0 => failure
-//
+/*
+ * create a default player ship
+ *
+ * @note: only used for quick start missions
+ *
+ * @param	use_last_flown	select ship that was last flown on a mission (default parameter set to 1)
+ *
+ * @return	0 => success, !0 => failure
+ */
 int create_default_player_ship(int use_last_flown)
 {
 	int	player_ship_class=-1, i;
@@ -2525,7 +2527,14 @@
 			return 1;
 	}
 
-	update_player_ship(player_ship_class);
+	// if we still haven't found the last flown ship, handle the error semi-gracefully
+	if (player_ship_class == -1) {
+		popup(PF_TITLE_BIG | PF_TITLE_RED | PF_USE_AFFIRMATIVE_ICON | PF_NO_NETWORKING, 1, POPUP_OK, XSTR("Error!\n\nCannot find "
+			"a valid last flown ship\n\nHave you played any missions since activating this mod/campaign?", -1));
+		return 1;
+	} else {
+		update_player_ship(player_ship_class);
+	}
 
 	// debug code to keep using descent style physics if the player starts a new game
 #ifndef NDEBUG
Index: code/mission/missionload.cpp
===================================================================
--- code/mission/missionload.cpp	(revision 9592)
+++ code/mission/missionload.cpp	(working copy)
@@ -113,6 +113,8 @@
 		Assert(!ret);
 	}
 
+	ml_update_recent_missions(filename_ext);  // update recently played missions list (save the csg later)
+
 	init_hud();
 	return 0;
 }
