diff --git a/src/mission.c b/src/mission.c
index e88a6f7..9692ba1 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -387,7 +387,8 @@ void mission_cleanup(Mission* misn) {
   }
   if(misn->cargo != NULL) {
     for(i = 0; i < misn->ncargo; i++) { /* Must unlink all the cargo. */
-      pilot_rmMissionCargo(player, misn->cargo[i]);
+      if(player != NULL) /* Only remove if player exists. */
+        pilot_rmMissionCargo(player, misn->cargo[i]);
       mission_unlinkCargo(misn, misn->cargo[i]);
     }
     free(misn->cargo);
diff --git a/src/player.c b/src/player.c
index b417b37..45728e3 100644
--- a/src/player.c
+++ b/src/player.c
@@ -2227,7 +2227,8 @@ int player_save(xmlTextWriterPtr writer) {
 }
 
 static int player_saveShip(xmlTextWriterPtr writer, Pilot* ship, char* loc) {
-  int i;
+  int i, j, k;
+  int found;
 
   xmlw_startElem(writer, "ship");
   xmlw_attr(writer, "name", ship->name);
@@ -2253,6 +2254,30 @@ static int player_saveShip(xmlTextWriterPtr writer, Pilot* ship, char* loc) {
   /* Save the commodities. */
   xmlw_startElem(writer, "commodities");
   for(i = 0; i < ship->ncommodities; i++) {
+    /* Remove cargo with id and no mission. */
+    if(ship->commodities[i].id > 0) {
+      found = 0;
+      for(j = 0; j < MISSION_MAX; j++) {
+        /* Only check active missions. */
+        if(player_missions[j].id > 0) {
+          /* Now check if it's in the cargo list. */
+          for(k = 0; player_missions[j].ncargo; k++) {
+            /* See if it matches a cargo. */
+            if(player_missions[j].cargo[k] == ship->commodities[i].id) {
+              found = 1;
+              break;
+            }
+          }
+        }
+        if(found)
+          break;
+      }
+      if(!found) {
+        WARN("Found mission cargo without assosciated mission.");
+        WARN("Please save game to remove the dead cargo.");
+        continue;
+      }
+    }
 
     xmlw_startElem(writer, "commodity");