diff --git a/src/weapon.c b/src/weapon.c
index 9c612eb..598bd33 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -321,7 +321,8 @@ static void weapons_updateLayer(const double dt, const WeaponLayer layer) {
     break;
   }
 
-  for(i = 0; i < (*nlayer); i++) {
+  i = 0;
+  while(i < *nlayer) {
     w = wlayer[i];
     switch(wlayer[i]->outfit->type) {
     /* Most missiles behave the same. */
@@ -365,8 +366,10 @@ static void weapons_updateLayer(const double dt, const WeaponLayer layer) {
       break;
     }
     weapon_update(wlayer[i], dt, layer);
-    /* If the weapon has been deleted we are going to have to hold back one. */
-    if(w != wlayer[i]) i--;
+
+    /* Only increment if weapon wasn't deleted. */
+    if(w == wlayer[i])
+      i++;
   }
 }
 
@@ -987,7 +990,13 @@ static void weapon_destroy(Weapon* w, WeaponLayer layer) {
     nlayer = &nwfrontLayer;
     break;
   }
-  for(i = 0; wlayer[i] != w; i++); /* Get us to the current posision. */
+
+  for(i = 0; (wlayer[i] != w) && (i < *nlayer); i++); /* Get to the current position. */
+  if(i >= *nlayer) {
+    WARN("Trying to destroy weapon not found in stack!");
+    return;
+  }
+
   weapon_free(wlayer[i]);
   wlayer[i] = NULL;
   (*nlayer)--;