diff --git a/dat/ship.xml b/dat/ship.xml
index fa0b177..751be6b 100644
--- a/dat/ship.xml
+++ b/dat/ship.xml
@@ -920,5 +920,52 @@
    <outfit quantity="2">Seeker Launcher</outfit>
    <outfit quantity="20">Seeker Missile</outfit>
   </outfits>
+  <mounts>
+   <mount x="30"  y="0"  h="3">0</mount>
+   <mount x="-18" y="-5" h="10">1</mount>
+   <mount x="-18" y="5"  h="10">2</mount>
+   <mount x="30"  y="0"  h="3">3</mount>
+  </mounts>
+</ship>
+ <ship name="Pirate Kestrel">
+  <GFX target="kestrel">kestrel_pirate</GFX>
+  <GUI>minimal</GUI>
+  <sound>engine</sound>
+  <class>Cruiser</class>
+  <price>5700000</price>
+  <fabricator>Skull and Bones</fabricator>
+  <tech>9009</tech>
+  <description>The Kestrel is the best ship made the the Skull and Bones.  It is extremely agile for a cruiser yet doesn't even lack the firepower necessary to question the authority of the Empire.  A very strong ship for those pirates who can afford it.</description>
+  <movement>
+   <thrust>130</thrust>
+   <turn>110</turn>
+   <speed>150</speed>
+  </movement>
+  <health>
+   <shield>600</shield>
+   <armour>280</armour>
+   <energy>830</energy>
+   <shield_regen>380</shield_regen>
+   <armour_regen>90</armour_regen>
+   <energy_regen>1300</energy_regen>
+  </health>
+  <characteristics>
+   <crew>28</crew>
+   <mass>2725</mass>
+   <fuel>300</fuel>
+   <cap_weapon>160</cap_weapon>
+   <cap_cargo>55</cap_cargo>
+  </characteristics>
+  <outfits>
+   <outfit quantity="2">Heavy Ion Turret</outfit>
+   <outfit quantity="2">Seeker Launcher</outfit>
+   <outfit quantity="20">Seeker Missile</outfit>
+  </outfits>
+  <mounts>
+   <mount x="30"  y="0"  h="3">0</mount>
+   <mount x="-18" y="-5" h="10">1</mount>
+   <mount x="-18" y="5"  h="10">2</mount>
+   <mount x="30"  y="0"  h="3">3</mount>
+  </mounts>
  </ship>
 </Ships>
diff --git a/src/pilot.c b/src/pilot.c
index 8bc3d05..7e24460 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -7,6 +7,7 @@
 #include <string.h>
 #include <math.h>
 #include <stdlib.h>
+#include <limits.h>
 
 #include "lephisto.h"
 #include "log.h"
@@ -69,9 +70,10 @@ static void pilot_update(Pilot* pilot, const double dt);
 static void pilot_hyperspace(Pilot* pilot);
 void pilot_render(Pilot* pilot);
 static void pilot_calcCargo(Pilot* pilot);
-void pilot_free(Pilot* p);
+void pilot_free(Pilot* p); /* Externed in player.c */
 static int fleet_parse(Fleet* tmp, const xmlNodePtr parent);
 static void pilot_dead(Pilot* p);
+static int pilot_setOutfitMounts(Pilot* p, PilotOutfit* po, int o, int q);
 
 /**
  * @brief Get the pilots position in the stack.
@@ -292,6 +294,27 @@ void pilot_shootStop(Pilot* p, const int secondary) {
   }
 }
 
+/**
+ * @brief Get the mount position of a pilot.
+ *    @param p Pilot to get mount position of.
+ *    @param id ID of the mount.
+ *    @param[out] v Position of the mount.
+ *    @return 0 on success.
+ */
+int pilot_getMount(Pilot* p, int id, Vec2* v) {
+  double a;
+
+  /* Calculate the sprite angle. */
+  a  = (double)(p->tsy * p->ship->gfx_space->sx + p->tsx);
+  a *= p->ship->mangle;
+
+  /* Get the mount and add the player offset. */
+  ship_getMount(p->ship, a, id, v);
+  vect_cadd(v, p->solid->pos.x, p->solid->pos.y);
+
+  return 0;
+}
+
 /**
  * @brief Actually handles the shooting, how often the player can shoot and such.
  *    @param p Pilot that is shooting.
@@ -299,9 +322,20 @@ void pilot_shootStop(Pilot* p, const int secondary) {
  *    @param t Pilot's target.
  */
 static void pilot_shootWeapon(Pilot* p, PilotOutfit* w) {
+  int id;
+  Vec2 v;
+
   /* Check to see if weapon is ready. */
   if(w->timer > 0.)
     return;
+
+  /* Get weapon to see if weapon is ready. */
+  if(w->mounts == NULL)
+    id = 0;
+  else if(outfit_isTurret(w->outfit))
+    id = w->mounts[w->lastshot];
+  pilot_getMount(p, id, &v);
+
   /* Regular bolt weapons. */
   if(outfit_isBolt(w->outfit)) {
     /* Enough energy? */
@@ -309,7 +343,7 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w) {
 
     p->energy -= outfit_energy(w->outfit);
     weapon_add(w->outfit, p->solid->dir,
-        &p->solid->pos, &p->solid->vel, p->id, p->target);
+        &v, &p->solid->vel, p->id, p->target);
   }
 
   /* Beam Weapons. */
@@ -319,7 +353,7 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w) {
     /** @todo Handle warmup stage. */
     w->state = PILOT_OUTFIT_ON;
     w->beamid = beam_start(w->outfit, p->solid->dir,    
-      &p->solid->pos, &p->solid->vel, p->id, p->target);
+        &v, &p->solid->vel, p->id, p->target, id);
   }
 
   /*
@@ -341,8 +375,8 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w) {
       return;
 
     p->energy -= outfit_energy(w->outfit);
-    weapon_add(p->ammo->outfit, p->solid->dir, &p->solid->pos,
-               &p->solid->vel, p->id, p->target);
+    weapon_add(p->ammo->outfit, p->solid->dir,
+        &v, &p->solid->vel, p->id, p->target);
 
     p->ammo->quantity -= 1; /* There's no getting this one back. */
     if(p->ammo->quantity <= 0) /* Out of ammo. */
@@ -360,7 +394,7 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w) {
 
     /* Create escort. */
     escort_create(p->id, p->ammo->outfit->u.fig.ship,
-        &p->solid->pos, &p->solid->vel, 1);
+        &v, &p->solid->vel, 1);
 
     p->ammo->quantity -= 1; /* We just shot it. */
     if(p->ammo->quantity <= 0) /* Out of ammo. */
@@ -368,8 +402,14 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w) {
   } else {
     WARN("Shooting unknown weapon type: %s", w->outfit->name);
   }
-
+  
+  /* Reset timer. */
   w->timer += ((double)outfit_delay(w->outfit) / (double)w->quantity)/1000.;
+
+  /* Mark last updated. */
+  w->lastshot++;
+  if(w->lastshot >= w->quantity)
+    w->lastshot = 0;
 }
 
 /**
@@ -902,6 +942,45 @@ void pilot_hyperspaceAbort(Pilot* p) {
   }
 }
 
+/**
+ * @brief Set the mount points for an outfit.
+ *    @param po Outfit to set mount points for.
+ *    @param o Original number of outfits.
+ *    @param q outfits added.
+ *    @retrurn 0 on success.
+ */
+static int pilot_setOutfitMounts(Pilot* p, PilotOutfit* po, int o, int q) {
+  int i, n, k, min;
+
+  /* Grow the memory. */
+  po->mounts = realloc(po->mounts, o+q * sizeof(int));
+
+  /* Has to be done for each outfit added. */
+  for(n = o; n < o+q; n++) {
+    /* Special case no ship mounts. */
+    if(p->mounted == NULL) {
+      po->mounts[n] = 0;
+      continue;
+    }
+
+    /* Default to 0. */
+    k = 0;
+    min = INT_MAX;
+    /* Find mount with fewest spots. */
+    for(i = 1; i < p->ship->nmounts; i++) {
+      if(p->mounted[i] < min) {
+        k = i;
+        min = p->mounted[i];
+      }
+    }
+    /* Add the mount point. */
+    po->mounts[n] = k;
+    p->mounted[k]++;
+  }
+
+  return 0;
+}
+
 /**
  * @brief Add an outfit to the pilot.
  *    @param pilot Pilot to add the outfit to.
@@ -910,8 +989,10 @@ void pilot_hyperspaceAbort(Pilot* p) {
  *    @return Amount of the outfit added.
  */
 int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
-  int i, q, free_space;
+  int i;
+  int o, q, free_space;
   char* osec;
+  PilotOutfit* po;
 
   free_space = pilot_freeSpace(pilot);
   q = quantity;
@@ -940,12 +1021,19 @@ int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
   /* Does outfit already exist? */
   for(i = 0; i < pilot->noutfits; i++)
     if(strcmp(outfit->name, pilot->outfits[i].outfit->name)==0) {
-      pilot->outfits[i].quantity += q;
+      po = &pilot->outfits[i];
+      o = po->quantity;
+      po->quantity += q;
       /* Can't be over max. */
-      if(pilot->outfits[i].quantity > outfit->max) {
-        q -= pilot->outfits[i].quantity - outfit->max;
-        pilot->outfits[i].quantity = outfit->max;
+      if(po->quantity > outfit->max) {
+        q -= po->quantity - outfit->max;
+        po->quantity = outfit->max;
       }
+
+      /* If it's a turret we need to find a mount spot for it. */
+      if(outfit_isTurret(outfit))
+        pilot_setOutfitMounts(pilot, po, o, q);
+
       /* Recalculate the stats. */
       pilot_calcStats(pilot);
       return q;
@@ -957,23 +1045,24 @@ int pilot_addOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
   /* since pilot has only one afterburner it's handled at the end. */
 
   /* Grow the outfits. */
-  pilot->outfits = realloc(pilot->outfits,  (pilot->noutfits+1)*sizeof(PilotOutfit));
-  pilot->outfits[pilot->noutfits].outfit    = outfit;
-  pilot->outfits[pilot->noutfits].quantity  = q;
-  pilot->outfits[pilot->noutfits].timer     = 0;
-  pilot->outfits[pilot->noutfits].beamid    = 0;
+  pilot->noutfits++;
+  pilot->outfits = realloc(pilot->outfits, pilot->noutfits*sizeof(PilotOutfit));
+  po = &pilot->outfits[pilot->noutfits-1];
+  memset(po, 0, sizeof(PilotOutfit));
+  po->outfit    = outfit;
+  po->quantity  = q;
 
   /* Can't be over max. */
-  if(pilot->outfits[pilot->noutfits].quantity > outfit->max) {
-    q -= pilot->outfits[pilot->noutfits].quantity - outfit->max;
-    pilot->outfits[i].quantity = outfit->max;
+  if(po->quantity > outfit->max) {
+    q -= po->quantity - outfit->max;
+    po->quantity = outfit->max;
   }
-  pilot->outfits[pilot->noutfits].timer = 0; /* Reset time. */
-  (pilot->noutfits)++;
 
-  if(outfit_isTurret(outfit))
-    /* Used to speed up AI. */
+  if(outfit_isTurret(outfit)) { /* Used to speed up AI. */
+    /* If it's a turret we need to find a mount sport for it. */
+    pilot_setOutfitMounts(pilot, po, 0, q);
     pilot_setFlag(pilot, PILOT_HASTURRET);
+  }
 
   if(outfit_isBeam(outfit))
     /* Used to speed up some calculation. */
@@ -1011,6 +1100,10 @@ int pilot_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
         /* Hack in case it reallocs - Can happen even when shrinking. */
         osec = (pilot->secondary) ? pilot->secondary->outfit->name : NULL;
 
+        /* Free some memory if needed. */
+        if(pilot->outfits[i].mounts != NULL)
+          free(pilot->outfits[i].mounts);
+
         /* Remove the outfit. */
         memmove(&pilot->outfits[i], &pilot->outfits[i+1],
                 sizeof(PilotOutfit)*(pilot->noutfits-i-1));
@@ -1419,18 +1512,16 @@ void pilot_init(Pilot* pilot, Ship* ship, char* name, int faction,
   /* Solid. */
   pilot->solid = solid_create(ship->mass, dir, pos, vel);
 
+  /* Mounts. */
+  if(ship->nmounts > 0)
+    pilot->mounted = calloc(ship->nmounts, sizeof(int));
+
   /* Outfits. */
   if(!(flags & PILOT_NO_OUTFITS)) {
     if(ship->outfit) {
       pilot->noutfits = 0;
       for(so = ship->outfit; so; so = so->next) {
-        pilot->outfits = realloc(pilot->outfits, (pilot->noutfits+1)*sizeof(PilotOutfit));
-        pilot->outfits[pilot->noutfits].outfit = so->data;
-        pilot->outfits[pilot->noutfits].quantity = so->quantity;
-        pilot->outfits[pilot->noutfits].timer = 0;
-        (pilot->noutfits)++;
-        if(outfit_isTurret(so->data)) /* Used to speed up AI a bit. */
-          pilot_setFlag(pilot, PILOT_HASTURRET);
+        pilot_addOutfit(pilot, so->data, so->quantity);
       }
     }
   }
@@ -1580,15 +1671,18 @@ void pilot_free(Pilot* p) {
     if(p->hook_type[i] != PILOT_HOOK_NONE)
       hook_rm(p->hook[i]);
 
+  free(p->name);
+
   /* Clean up data. */
   if(p->ai != NULL)
     ai_destroy(p); /* Must be destroyed first if applicable. */
+  /* Case for if pilot is the player. */
   if(player == p) player = NULL;
   solid_free(p->solid);
-  if(p->outfits) free(p->outfits);
-  free(p->name);
-  if(p->commodities) free(p->commodities);
-  if(p->escorts)     free(p->escorts);
+  if(p->mounted != NULL)  free(p->mounted);
+  if(p->outfits)          free(p->outfits);
+  if(p->commodities)      free(p->commodities);
+  if(p->escorts)          free(p->escorts);
   free(p);
 }
 
diff --git a/src/pilot.h b/src/pilot.h
index f5c6ba9..3613950 100644
--- a/src/pilot.h
+++ b/src/pilot.h
@@ -89,6 +89,8 @@ typedef struct PilotOutfit_ {
   int quantity;           /**< Number of outfits of this type that the pilot has. */
   PilotOutfitState state; /**< State of the outfit. */
   int beamid;             /**< ID of the beam used in this outfit, only for beams. */
+  int* mounts;            /**< ID of each outfit mount. */
+  int lastshot;           /**< ID of the outfit that last shot. */
   double timer;           /**< Used to store last used weapon time. */
 } PilotOutfit;
 
@@ -167,6 +169,7 @@ typedef struct Pilot_ {
   uint32_t flags;       /**< Used for AI etc. */
   double ptimer;        /**< Generic timer for internal pilot use. */
   int lockons;          /**< Stores how many seeking weapons are targetting pilot. */
+  int* mounted;         /**< Number of mounted outfits on the mount. */
 
   /* Hook attached to the pilot. */
   int hook_type[PILOT_HOOKS];  /**< Type of the hook atached to the pilot. */
@@ -239,6 +242,7 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter,
 double pilot_face(Pilot* p, const double dir);
 void pilot_hyperspaceAbort(Pilot* p);
 /* Special outfit stuff. */
+int pilot_getMount(Pilot* p, int id, Vec2* v);
 void pilot_switchSecondary(Pilot* p, int i);
 void pilot_setSecondary(Pilot* p, const char* secondary);
 void pilot_setAmmo(Pilot* p);
diff --git a/src/ship.c b/src/ship.c
index 0b898ab..1b6effd 100644
--- a/src/ship.c
+++ b/src/ship.c
@@ -44,6 +44,52 @@ Ship* ship_get(const char* name) {
   return tmp+i;
 }
 
+/**
+ * @brief Get the position of a ship mount point.
+ *    @param s Ship to get the mount point o.
+ *    @param dir Direction ship is facing.
+ *    @param id ID of the mount point to get.
+ *    @param[out] The position of the mount point.
+ *    @return 0 on success.
+ */
+int ship_getMount(Ship* s, double dir, const int id, Vec2* p) {
+  ShipMount* m;
+  double cm, sm;
+
+  /* Special case no mounts. */
+  if((id == 0) && (s->nmounts == 0)) {
+    p->x = 0.;
+    p->y = 0.;
+    return 0;
+  }
+
+  /* Check to see if mount is valid. */
+  if((id >= s->nmounts) || (id < 0)) {
+    WARN("Invalid mount point id '%d' on ship class '%s'.", id, s->name);
+    p->x = 0.;
+    p->y = 0.;
+    return 1;
+  }
+
+   m = &s->mounts[id];
+   /*
+    * 2D rotation matrix.
+    * [ x' ]     [ cos  sin ]   [ x ]
+    * [ y' ]  =  [-sin  cos ] * [ y ]
+    *
+    * dir is inverted s that rotation is counter-clockwise.
+    */
+   cm = cos(-dir);
+   sm = sin(-dir);
+   p->x = m->x *  cm + m->y * sm;
+   p->y = m->x * -sm + m->y * cm;
+
+   /* Don't forget to add height. */
+   p->y += m->h;
+
+   return 0;
+}
+
 /* Return all the ships in text form. */
 Ship** ship_getTech(int* n, const int* tech, const int techmax) {
   int i, j, k, num, price;
@@ -226,9 +272,9 @@ int ship_basePrice(Ship* s) {
 static int ship_parse(Ship* tmp, xmlNodePtr parent) {
   xmlNodePtr cur, node;
   ShipOutfit* otmp, *ocur;
-
   char str[PATH_MAX];
   char* stmp;
+  int id;
 
   /* Clear memory. */
   memset(tmp, 0, sizeof(Ship));
@@ -253,6 +299,10 @@ static int ship_parse(Ship* tmp, xmlNodePtr parent) {
           SHIP_GFX"%s"SHIP_EXT, 6, 6,
           OPENGL_TEX_MAPTRANS);
 
+      /* Calculate mount angle. */
+      tmp->mangle  = 2.*M_PI;
+      tmp->mangle /= tmp->gfx_space->sx * tmp->gfx_space->sy;
+
       /* Load the comm graphic. */
       tmp->gfx_comm = xml_parseTexture(node,
           SHIP_GFX"%s"SHIP_COMM SHIP_EXT, 1, 1, 0);
@@ -341,8 +391,33 @@ static int ship_parse(Ship* tmp, xmlNodePtr parent) {
       } while(xml_nextNode(cur));
       continue;
     }
+    if(xml_isNode(node, "mounts")) {
+      /* First pass, get number of mounts. */
+      cur = node->children;
+      do {
+        if(xml_isNode(cur, "mount"))
+          tmp->nmounts++;
+      } while(xml_nextNode(cur));
+      /* Allocate the space. */
+      tmp->mounts = calloc(tmp->nmounts, sizeof(ShipMount));
+      /* Second pass, initialize the mounts. */
+      cur = node->children;
+      do {
+        if(xml_isNode(cur, "mount")) {
+          id = xml_getInt(cur);
+          xmlr_attr(cur, "x", stmp);
+          tmp->mounts[id].x = atof(stmp);
+          free(stmp);
+          xmlr_attr(cur, "y", stmp);
+          tmp->mounts[id].y = atof(stmp);
+          free(stmp);
+          xmlr_attr(cur, "h", stmp);
+          tmp->mounts[id].h = atof(stmp);
+          free(stmp);
+        }
+      } while(xml_nextNode(cur));
+    }
   } while(xml_nextNode(node));
-
   tmp->thrust *= tmp->mass; /* Helps keep number sane. */
 
 #define MELEMENT(o,s) if(o) WARN("Ship '%s' missing '"s"' element", tmp->name)
@@ -421,24 +496,34 @@ int ships_load(void) {
 }
 
 void ships_free(void) {
+  Ship* s;
   ShipOutfit* so, *sot;
   int i;
   for(i = 0; i < ship_nstack; i++) {
-    /* Free stored strings. */
-    if(ship_stack[i].name)              free(ship_stack[i].name);
-    if(ship_stack[i].description)       free(ship_stack[i].description);
-    if(ship_stack[i].gui)               free(ship_stack[i].gui);
-    if(ship_stack[i].fabricator)        free(ship_stack[i].fabricator);
-    if(ship_stack[i].license != NULL)   free(ship_stack[i].license);
+    s = &ship_stack[i];
 
-    so = ship_stack[i].outfit;
-    while(so) { /* free the ship outfit. */
+    /* Free stored strings. */
+    if(s->name != NULL)           free(s->name);
+    if(s->description != NULL)    free(s->description);
+    if(s->gui != NULL)            free(s->gui);;
+    if(s->fabricator != NULL)     free(s->fabricator);
+    if(s->license != NULL)        free(s->license);
+
+    /* Free outfits. */
+    so = s->outfit;
+    while(so) {
       sot = so;
       so = so->next;
       free(sot);
     }
-    gl_freeTexture(ship_stack[i].gfx_space);
-    gl_freeTexture(ship_stack[i].gfx_comm);
+
+    /* Free mounts. */
+    if(s->nmounts > 0)
+      free(s->mounts);
+
+    /* Free graphics. */
+    gl_freeTexture(s->gfx_space);
+    gl_freeTexture(s->gfx_comm);
     gl_freeTexture(ship_stack[i].gfx_target);
   }
   free(ship_stack);
diff --git a/src/ship.h b/src/ship.h
index f42dc9e..3f14480 100644
--- a/src/ship.h
+++ b/src/ship.h
@@ -8,9 +8,7 @@
 #define SHIP_TARGET_H 96  /**< Ship target graphic height. */
 
 /**
- * @typedef ShipClass
- *
- * @breif Contains the different types of ships.
+ * @brief Contains the different types of ships.
  */
 typedef enum ShipClass_ {
   SHIP_CLASS_NULL,           /**< Invalid ship. */
@@ -38,7 +36,18 @@ typedef enum ShipClass_ {
   /** @todo hybrid ship classification. */
 } ShipClass;
 
-/* Small wrapper for the outfits. */
+/**
+ * @brief Represents a ship weapon mount point.
+ */
+typedef struct ShipMount_ {
+  double x;   /**< X position of the mount point. */
+  double y;   /**< Y position of the mount point. */
+  double h;   /**< Mount point height (displacement). */
+} ShipMount;
+
+/**
+ * @brief Small wrapper for the outfits.
+ */
 typedef struct ShipOutfit_ {
   struct ShipOutfit_* next; /* Linked list. */
   Outfit* data; /* Data itself. */
@@ -87,19 +96,25 @@ typedef struct Ship_ {
 
   /* Outfits */
   ShipOutfit* outfit;
+
+  /* Mounts. */
+  ShipMount* mounts;  /**< Ship weapon mount points. First is primary weapon. */
+  int nmounts;        /**< Number of mount points ship has. */
+  double mangle;      /**< Mount angle to simplify mount calculations. */
 } Ship;
 
+/* Load/quit. */
+int ships_load(void);
+void ships_free(void);
+
 /* Get. */
+int ship_getMount(Ship* s, double dir, const int id, Vec2* p);
 Ship* ship_get(const char* name);
 Ship** ship_getTech(int* n, const int* tech, const int techmax);
 char* ship_class(Ship* p);
 ShipClass ship_classFromString(char* str);
 int ship_basePrice(Ship* s);
 
-/* Load/quit. */
-int ships_load(void);
-void ships_free(void);
-
 /* Toolkit. */
 void ship_view(unsigned int unused, char* shipname);
 
diff --git a/src/weapon.c b/src/weapon.c
index b607068..3e0a80d 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -63,7 +63,8 @@ typedef struct Weapon_ {
   double lockon;        /**< Some weapons have a lockon delay. */
   double timer;         /**< Mainly used to see when the weapon was fired. */
   double anim;          /**< Used for beam weapon graphics and others. */
-  int sprite;           /**< USed for spinning outfits. */
+  int sprite;           /**< Used for spinning outfits. */
+  int mount;            /**< Used for beam weapons. */
 
   /* Update position and render. */
   void(*update)(struct Weapon_*, const double, WeaponLayer); /**< Update the weapon. */
@@ -244,6 +245,7 @@ static void think_beam(Weapon* w, const double dt) {
   (void) dt;
   Pilot* p, *t;
   double diff;
+  Vec2 v;
 
   /* Get pilot, if pilot is dead beam is destroyed too. */
   p = pilot_get(w->parent);
@@ -260,9 +262,10 @@ static void think_beam(Weapon* w, const double dt) {
     return;
   }
 
-  /* Update beam position to match pilot. */
-  w->solid->pos.x = p->solid->pos.x;
-  w->solid->pos.y = p->solid->pos.y;
+  /* Use mount position. */
+  pilot_getMount(p, w->mount, &v);
+  w->solid->pos.x = v.x;
+  w->solid->pos.y = v.y;
 
   /* Handle aiming. */
   switch(w->outfit->type) {
@@ -544,8 +547,6 @@ static void weapon_render(Weapon* w, const double dt) {
 }
 
 /**
- * @fn static void weapon_update(Weapon* w, const double dt, WeaponLayer layer)
- *
  * @brief Updates an individual weapon.
  *    @param w Weapon to update.
  *    @param dt Current delta tick.
@@ -570,6 +571,7 @@ static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) {
 
     /* Beam weapons have special collisions. */
     if(outfit_isBeam(w->outfit)) {
+      /* Check for collision. */
       if(!areAllies(w->faction, pilot_stack[i]->faction) &&
           CollideLineSprite(&w->solid->pos, w->solid->dir,
             w->outfit->u.bem.range,
@@ -692,7 +694,7 @@ static void weapon_hitBeam(Weapon* w, Pilot* p, WeaponLayer layer,
           ((player->target == p->id) || (RNGF() < 0.30*dt))) { /* 30% chance per second. */
       parent = pilot_get(w->parent);
       if((parent != NULL) && (parent->faction == FACTION_PLAYER) &&
-          (!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF() < 0.5))) { /* 50% chance. */
+          (!pilot_isFlag(p, PILOT_HOSTILE) || (RNGF()*dt < 0.5))) { /* 50% chance. */
         faction_modPlayer(p->faction, -1.); /* Slowly lower faction. */
       }
       pilot_rmFlag(p, PILOT_BRIBED);
@@ -1004,21 +1006,19 @@ void weapon_add(const Outfit* outfit, const double dir, const Vec2* pos,
 }
 
 /**
- * @fn int beam_start(const Outfit* outfit,
- *           const double dir, const Vec2* pos, const Vec2* vel,
- *           const unsigned int parent, const unsigned int target)
- * 
  * @brief Start the beam weapon.
  *    @param outfit Outfit which spawns the weapon.
  *    @param dir Direction of the shooter.
  *    @param vel Velocity of the shooter.
  *    @param parent Pilot ID of the shooter.
  *    @param target Target ID that is getting shot.
+ *    @param mount Mount on the ship.
  *    @return The identifier of the beam weapon.
  */
 int beam_start(const Outfit* outfit,
     const double dir, const Vec2* pos, const Vec2* vel,
-    const unsigned int parent, const unsigned int target) {
+    const unsigned int parent, const unsigned int target,
+    const int mount) {
   
   WeaponLayer layer;
   Weapon* w;
@@ -1033,6 +1033,7 @@ int beam_start(const Outfit* outfit,
   layer = (parent == PLAYER_ID) ? WEAPON_LAYER_FG : WEAPON_LAYER_BG;
   w = weapon_create(outfit, dir, pos, vel, parent, target);
   w->ID = ++beam_idgen;
+  w->mount = mount;
 
   switch(layer) {
     case WEAPON_LAYER_BG:
@@ -1070,8 +1071,6 @@ int beam_start(const Outfit* outfit,
 }
 
 /**
- * @fn void beam_end(const unsigned int parent, int beam)
- *
  * @brief End a beam weapon.
  *    @param parent
  *    @param beam
diff --git a/src/weapon.h b/src/weapon.h
index f9dcaec..4ffc4ca 100644
--- a/src/weapon.h
+++ b/src/weapon.h
@@ -18,7 +18,8 @@ void weapon_add(const Outfit* outfit, const double dir, const Vec2* pos,
 
 int beam_start(const Outfit* outfit,
     const double dir, const Vec2* pos, const Vec2* vel,
-    const unsigned int parent, const unsigned int beam);
+    const unsigned int parent, const unsigned int target,
+    const int mount);
 
 void beam_end(const unsigned int parent, int beam);