diff --git a/dat/mission.xml b/dat/mission.xml
index cc6e8e0..902dfa5 100644
--- a/dat/mission.xml
+++ b/dat/mission.xml
@@ -11,6 +11,7 @@
   <mission name="Cargo Freight">
     <lua>cargo</lua>
     <avail>
+      <chance>750</chance>
       <location>Computer</location>
       <alliance>Neutral</alliance>
       <alliance>Empire United</alliance>
diff --git a/src/land.c b/src/land.c
index 4af314c..919913f 100644
--- a/src/land.c
+++ b/src/land.c
@@ -840,21 +840,25 @@ static void misn_close(char* str) {
 }
 
 static void misn_accept(char* str) {
-  int i;
   char* misn_name;
+  Mission* misn;
+  int pos;
   (void)str;
 
   misn_name = toolkit_getList(secondary_wid, "lstMission");
 
   if(strcmp(misn_name, "No Missions")==0) return;
-
-  for(i = 0; i < mission_ncomputer; i++)
-    if(mission_computer[i].title &&
-        (strcmp(misn_name, mission_computer[i].title)==0)) {
-      mission_accept(&mission_computer[i]);
-      misn_genList(0);
-      return;
-    }
+  
+  if(dialogue_YesNo("Accept Mission",
+        "Are you sure you want to accept this mission?")) {
+    pos = toolkit_getListPos(secondary_wid, "lstMission");
+    misn = &mission_computer[pos];
+    mission_accept(misn);
+    memmove(misn, &mission_computer[pos+1],
+        sizeof(Mission) * (mission_ncomputer-pos-1));
+    mission_ncomputer--;
+    misn_genList(0);
+  }
 }
 
 static void misn_genList(int first) {
@@ -888,8 +892,8 @@ static void misn_genList(int first) {
 }
 
 static void misn_update(char* str) {
-  int i;
   char* active_misn;
+  Mission* misn;
 
   (void)str;
 
@@ -902,14 +906,10 @@ static void misn_update(char* str) {
     window_disableButton(secondary_wid, "btnAcceptMission");
     return;
   }
-  for(i = 0; i < mission_ncomputer; i++)
-    if(mission_computer[i].title &&
-          (strcmp(active_misn, mission_computer[i].title)==0)) {
-      window_modifyText(secondary_wid, "txtReward", mission_computer[i].reward);
-      window_modifyText(secondary_wid, "txtDesc", mission_computer[i].desc);
-      window_enableButton(secondary_wid, "btnAcceptMission");
-      return;
-    }
+  misn = &mission_computer[toolkit_getListPos(secondary_wid, "lstMission")];
+  window_modifyText(secondary_wid, "txtReward", misn->reward);
+  window_modifyText(secondary_wid, "txtDesc", misn->desc);
+  window_enableButton(secondary_wid, "btnAcceptMission");
 }
 
 // Land the player.
diff --git a/src/menu.c b/src/menu.c
index e58e3b7..9f10fa0 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -294,8 +294,8 @@ static void mission_menu_genList(int first) {
 }
 
 static void mission_menu_update(char* str) {
-  int i;
   char* active_misn;
+  Mission* misn;
   unsigned int wid;
 
   (void)str;
@@ -309,35 +309,32 @@ static void mission_menu_update(char* str) {
     window_disableButton(wid, "btnAbortMission");
     return;
   }
-  for(i = 0; i < MISSION_MAX; i++)
-    if(player_missions[i].title &&
-        (strcmp(active_misn, player_missions[i].title)==0)) {
-      window_modifyText(wid, "txtReward", player_missions[i].reward);
-      window_modifyText(wid, "txtDesc", player_missions[i].desc);
-      window_enableButton(wid, "btnAbortMission");
-      return;
-    }
+  misn = &player_missions[toolkit_getListPos(wid, "lstMission")];
+  window_modifyText(wid, "txtReward", misn->reward);
+  window_modifyText(wid, "txtDesc", misn->desc);
+  window_enableButton(wid, "btnAbortMission");
 }
 
 static void mission_menu_abort(char* str) {
   (void)str;
   char* selected_misn;
+  int pos;
   unsigned int wid;
-  int i;
+  Mission* misn;
 
   wid = window_get("Missions");
 
   selected_misn = toolkit_getList(wid, "lstMission");
 
-  if(dialogue_YesNo("Abort Mission", "Are you sure you want to abort this mission?"))
-    for(i = 0; i < MISSION_MAX; i++)
-      if(player_missions[i].title &&
-          (strcmp(selected_misn, player_missions[i].title)==0)) {
-        // TODO: handle lost cargo..
-        mission_cleanup(&player_missions[i]);
-        mission_menu_genList(0);
-        break;
-      }
+  if(dialogue_YesNo("Abort Mission",
+        "Are you sure you want to abort this mission?")) {
+    pos = toolkit_getListPos(wid, "lstMission");
+    misn = &player_missions[pos];
+    mission_cleanup(misn);
+    memmove(misn, &player_missions[pos+1],
+        sizeof(Mission) * (MISSION_MAX-pos-1));
+    mission_menu_genList(0);
+  }
 }
 
 // Pilot dead.
diff --git a/src/misn_lua.c b/src/misn_lua.c
index fb19ea0..e301060 100644
--- a/src/misn_lua.c
+++ b/src/misn_lua.c
@@ -98,7 +98,7 @@ int misn_loadLibs(lua_State* L) {
 
 // Run a mission function.
 int misn_run(Mission* misn, char* func) {
-  int ret;
+  int i, ret;
   char* err;
 
   cur_mission = misn;
@@ -114,7 +114,15 @@ int misn_run(Mission* misn, char* func) {
   }
 
   // Mission is finished.
-  if(misn_delete) mission_cleanup(cur_mission);
+  if(misn_delete) {
+    mission_cleanup(cur_mission);
+    for(i = 0; i < MISSION_MAX; i++)
+      if(cur_mission == &player_missions[i]) {
+        memmove(&player_missions[i], &player_missions[i+1],
+            sizeof(Mission) * (MISSION_MAX-i-1));
+        break;
+      }
+  }
   cur_mission = NULL;
 
   return ret;
diff --git a/src/mission.c b/src/mission.c
index cc04c18..2836560 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -6,6 +6,7 @@
 #include "lauxlib.h"
 #include "lualib.h"
 
+#include "rng.h"
 #include "lephisto.h"
 #include "log.h"
 #include "hook.h"
@@ -121,7 +122,9 @@ static int mission_matchFaction(MissionData* misn, int faction) {
 
 // Generate missions for the computer - special case.
 Mission* missions_computer(int* n, int faction, char* planet, char* system) {
-  int i, m;
+  int i, j, m;
+  double chance;
+  int rep;
   Mission* tmp;
   MissionData* misn;
 
@@ -133,8 +136,15 @@ Mission* missions_computer(int* n, int faction, char* planet, char* system) {
         (((misn->avail.planet && strcmp(misn->avail.planet, planet)==0)) ||
          (misn->avail.system && (strcmp(misn->avail.system, system)==0)) ||
          mission_matchFaction(misn, faction))) {
-      tmp = realloc(tmp, sizeof(Mission) * ++m);
-      mission_init(&tmp[m-1], misn);
+      chance = (double)(misn->avail.chance % 100)/100.;
+      rep = misn->avail.chance/100;
+
+      for(j = 0; j < rep; j++)
+        // Random chance of rep appearances.
+        if(RNGF() > chance) {
+          tmp = realloc(tmp, sizeof(Mission) * ++m);
+          mission_init(&tmp[m-1], misn);
+        }
     }
   }
   (*n) = m;
@@ -188,6 +198,8 @@ static MissionData* mission_parse(const xmlNodePtr parent) {
       do {
         if(xml_isNode(cur, "location"))
           tmp->avail.loc = mission_location(xml_get(cur));
+        else if(xml_isNode(cur, "chance"))
+          tmp->avail.chance = xml_getInt(cur);
         else if(xml_isNode(cur, "planet"))
           tmp->avail.planet = strdup(xml_get(cur));
         else if(xml_isNode(cur, "system"))
diff --git a/src/mission.h b/src/mission.h
index 5083a78..452ce97 100644
--- a/src/mission.h
+++ b/src/mission.h
@@ -22,8 +22,8 @@ typedef struct MissionData_ {
 
   // Availability.
   struct {
-    int loc; // Location.
-    double chance; // Chance of it appearing.
+    int loc;      // Location.
+    int chance;   // Chance of it appearing.
 
     // For specific cases.
     char* planet;
diff --git a/src/toolkit.c b/src/toolkit.c
index 8af4aa6..cc4ba97 100644
--- a/src/toolkit.c
+++ b/src/toolkit.c
@@ -1366,6 +1366,16 @@ char* toolkit_getList(const unsigned int wid, char* name) {
   return wgt->dat.lst.options[wgt->dat.lst.selected];
 }
 
+// Get the position of current item in the list.
+int toolkit_getListPos(const unsigned int wid, char* name) {
+  Widget* wgt = window_getwgt(wid, name);
+
+  if((wgt->type != WIDGET_LIST) || (wgt->dat.lst.selected == -1))
+    return -1;
+
+  return wgt->dat.lst.selected;
+}
+
 // Return the focused widget.
 static Widget* toolkit_getFocus(void) {
   Window* wdw;
diff --git a/src/toolkit.h b/src/toolkit.h
index af351e2..b072ba0 100644
--- a/src/toolkit.h
+++ b/src/toolkit.h
@@ -67,6 +67,7 @@ void window_imgColour(const unsigned int wid, char* name, glColour* colour);
 int window_exists(const char* wdwname);
 unsigned int window_get(const char* wdwname);
 char* toolkit_getList(const unsigned int wid, char* name);
+int toolkit_getListPos(const unsigned int wid, char* name);
 glTexture* window_getImage(const unsigned int wid, char* name);
 char* window_getInput(const unsigned int wid, char* name);