diff --git a/src/pilot.c b/src/pilot.c
index e41f4df..5e07b0d 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -1057,6 +1057,15 @@ void pilots_clean(void) {
   pilots = 1;
 }
 
+void pilots_cleanAll(void) {
+  pilots_clean();
+  if(player != NULL) {
+    pilot_free(player);
+    player = NULL;
+  }
+  pilots = 0;
+}
+
 // Update all pilots.
 void pilots_update(double dt) {
   int i;
diff --git a/src/pilot.h b/src/pilot.h
index c5f2337..834470b 100644
--- a/src/pilot.h
+++ b/src/pilot.h
@@ -183,6 +183,7 @@ Pilot* pilot_copy(Pilot* src);
 void pilot_destroy(Pilot* p);
 void pilots_free(void);
 void pilots_clean(void);
+void pilots_cleanAll(void);
 void pilot_free(Pilot* p);
 int fleet_load(void); // TODO
 void fleet_free(void);
diff --git a/src/player.c b/src/player.c
index 006bc05..d16a955 100644
--- a/src/player.c
+++ b/src/player.c
@@ -377,10 +377,10 @@ void player_cleanup(void) {
 
   player_clear();
 
-  // Cleanup name.
+  // Clean up name.
   if(player_name != NULL) free(player_name);
 
-  // Cleanup messages.
+  // Clean up messages.
   for(i = 0; i < msg_max; i++)
     memset(msg_stack[i].str, '\0', MSG_SIZE_MAX);
 
@@ -397,12 +397,20 @@ void player_cleanup(void) {
     // Nothing left.
     player_nstack = 0;
   }
+  
+  // Clean up missions.
   if(missions_done != NULL) {
     free(missions_done);
     missions_done   = NULL;
     missions_ndone  = 0;
     missions_mdone  = 0;
   }
+
+  pilots_cleanAll();
+  if(player != NULL) {
+    pilot_free(player);
+    player = NULL;
+  }
 }
 
 // Initializes the player sound.