diff --git a/dat/missions/cargo.lua b/dat/missions/cargo.lua
index 06b125d..9e0b944 100644
--- a/dat/missions/cargo.lua
+++ b/dat/missions/cargo.lua
@@ -160,8 +160,8 @@ function land()
       tk.msg(msg_title[2], string.format(msg_msg[2], carg_type))
 
       -- Modify the faction standing.
-      if player.getFaction("Merchant") < 70 then
-        player.modFactionRaw("Merchant", misn_faction)
+      if player.getFaction("Trader") < 70 then
+        player.modFactionRaw("Trader", misn_faction)
       end
       if player.getFaction("Independent") < 30 then
         player.modFactionRaw("Independent", misn_faction/2)
diff --git a/scripts/ai/empire.lua b/scripts/ai/empire.lua
index 805eba3..8cd115a 100644
--- a/scripts/ai/empire.lua
+++ b/scripts/ai/empire.lua
@@ -7,10 +7,10 @@ aggressive    = true
 
 function create()
   ai.setcredits(rnd.int(1000, ai.shipprice()/70))
- if rnd.int(0,2)==0 then
-  ai.broadcast("The Empire is watching")
- end
- attack_choose()
+  if rnd.int(0,2)==0 then
+    ai.broadcast("The Empire is watching")
+  end
+  attack_choose()
 end
 
 function taunt(target, offence)
diff --git a/scripts/ai/include/attack.lua b/scripts/ai/include/attack.lua
index 6eeed27..a8b9b1f 100644
--- a/scripts/ai/include/attack.lua
+++ b/scripts/ai/include/attack.lua
@@ -13,6 +13,7 @@ function attack_think()
     mem.atk_think()
   else
     atk_g_think()
+  end
 end
 
 --[[
diff --git a/scripts/ai/include/attack_generic.lua b/scripts/ai/include/attack_generic.lua
index fad34db..ce5d3b7 100644
--- a/scripts/ai/include/attack_generic.lua
+++ b/scripts/ai/include/attack_generic.lua
@@ -6,31 +6,78 @@
 --  Mainly manages targetting nearest enemy.
 --]]
 function atk_g_think()
-  if mem.atk_think ~= nil then
-    mem.atk_think()
-  else
-    atk_g_think()
+  enemy = ai.getenemy()
+  target = ai.targetid()
+
+  -- Get new target if it's closer.
+  if enemy ~= target then
+    dist = ai.dist(ai.pos(target))
+    range = ai.getweaprange()
+
+    -- Shouldn't switch targets if close.
+    if dist > range * 1.3 then
+      ai.poptask()
+      ai.pushtask(0, "attack", enemy)
+    end
+  end
 end
 
 --[[
 --  Generic "brute force" attack. Doesn't really do anything interesting.
 --]]
 function atk_g()
-  if mem.atk ~= nil then
-    mem.atk()
+  target = ai.targetid()
+  ai.hostile(target) -- Mark as hostile.
+
+  -- Make sure pilot exists.
+  if not ai.exists(target) then
+    ai.poptask()
+    return
+  end
+  ai.settarget(target)
+
+  -- Get stats about enemy.
+  dist = ai.dist(ai.pos(target)) -- Get distance.
+  range = ai.getweaprange()
+
+  -- We first bias towards range.
+  if dist > range then
+    dir = ai.face(target) -- Normal face the target.
+
+    secondary, special, ammo = ai.secondary("Launcher")
+
+    -- Shoot missiles if in range.
+    if secondary == "Launcher" and
+        dist < ai.getweaprange(1) then
+      -- More lenient with aiming.
+      if special == "Smart" and dir < 30 then
+        ai.shoot(2)
+      -- Non-smart miss more.
+      elseif dir < 10 then
+        ai.shoot(2)
+      end
+    end
+
+    -- Approach for melee.
+    if dir < 10 then
+      ai.accel()
+    end
+    -- Close enough to melee.
   else
-    atk_g()
+    secondary, special = ai.secondary("Beam Weapon")
+    dir = ai.aim(target) -- We aim instead of face.
+
+    -- Fire non-smart secondary weapons.
+    if(secondary == "Launcher" and special ~= "Smart") or
+        secondary == "Beam Weapon" then
+      if dir < 10 or special == "Turret" then -- Need good accuracy.
+        ai.shoot(2)
+      end
+    end
+
+    if dir < 10 or ai.hasturrets() then
+      ai.shoot()
+    end
   end
 end
 
---[[
---  Generic function to choose what attack functions match the ship best.
---]]
-function attack_choose()
-  class = ai.shipclass()
-
-  if class == "Bomber" then
-    mem.atk_think = atk_b_think
-    mem.atk = atk_b
-end
-
diff --git a/scripts/ai/include/basic.lua b/scripts/ai/include/basic.lua
index a80be04..344b082 100644
--- a/scripts/ai/include/basic.lua
+++ b/scripts/ai/include/basic.lua
@@ -60,7 +60,7 @@ function runaway()
     return
   end
 
-  dir = ai.face(target, 1)
+  dir = ai.face(target, true)
   ai.accel()
 
   --[[
diff --git a/scripts/ai/merchant.lua b/scripts/ai/merchant.lua
deleted file mode 100644
index b848c54..0000000
--- a/scripts/ai/merchant.lua
+++ /dev/null
@@ -1,111 +0,0 @@
-include("../scripts/ai/include/basic.lua")
-
--- Required control rate.
-control_rate = 2
-
--- Required "control" function.
-function control()
- task = ai.taskname()
- enemy = ai.getenemy()
-
- -- Runaway if enemy is near.
- if task ~= "runaway" and enemy ~= nil and ai.dist(enemy) < 500 then
-   if task ~= "none" then
-     ai.poptask()
-   end
-   ai.pushtask(0, "runaway", enemy)
-
- -- Enter hyperspace if possible.
- elseif task == "hyperspace" then
-  ai.hyperspace() -- Try to go to hyperspace.
-
- -- Try to jump when far enough away.
- elseif task == "runaway" then
-  if ai.dist(ai.pos(ai.targetid())) > 400 then
-   ai.hyperspace()
-  end
-
- -- Find something to do.
- elseif task == "none" then
-    planet = ai.landplanet()
-  -- Planet must exist.
-  if planet == nil then
-   ai.pushtask(0, "hyperspace")
-  else
-    ai.pushtask(0, "hyperspace")
-    ai.pushtask(0, "land", planet)
-  end
-  end
-end
-
--- Required "attacked" function.
-function attacked(attacker)
-  if ai.taskname() ~= "runaway" then
-    sos = {
-      "Mayday! We are under attack!",
-      "Requesting assistance. We are under attack!",
-      "Merchant vessle here under attack! HALP!"
-    }
-    ai.broadcast(sos[rnd.int(1, #sos)])
-
-    -- So bravely run away!
-    ai.pushtask(0, "runaway", attacker)
- else -- Runaway from the new bad guys.
-  ai.poptask()
-  ai.pushtask(0, "runaway", attacker)
-  end
-end
-
-function create()
-  ai.setcredits(rnd.int(100, ai.shipprice()/50))
-
-  -- Some stuff has more chance than other.
-  num = rnd.int(12)
-  if num < 5 then
-    cargo = "Food"
-  elseif num < 8 then
-    cargo = "Ore"
-  elseif num < 10 then
-    cargo = "Industrial Goods"
-  elseif num < 12 then
-    cargo = "Luxury Goods"
-  else
-    cargo = "Medicine"
-  end
-  ai.setcargo(cargo, rnd.int(0, ai.cargofree()))
-end
-
--- Fly to the target.
-function go()
-  target = ai.target()
-  dir = ai.face(target)
-  dist = ai.dist(target)
-  bdist = ai.minbrakedist()
-  if dir < 10 and dist > bdist then
-    ai.accel()
-  elseif dir < 10 and dist < bdist then
-    ai.poptask()
-    ai.pushtask(0, "stop")
-  end
-end
-
--- Backthrust.
-function stop()
-  ai.brake()
-  if ai.isstopped() then
-  ai.stop()
-    ai.poptask()
-    ai.settimer(0, rnd.int(8000, 15000)) -- We wait during a while.
-    ai.pushtask(0, "land")
- else
-  ai.brake()
-  end
-end
-
---Waits.
-function land()
-  if ai.timeup(0) then
-    ai.pushtask(0, "hyperspace")
-  end
-end
-
diff --git a/scripts/ai/trader.lua b/scripts/ai/trader.lua
index db7f7a1..f2b82cd 100644
--- a/scripts/ai/trader.lua
+++ b/scripts/ai/trader.lua
@@ -1,4 +1,4 @@
-include("../scripts/ai/merchant.lua")
+include("../scripts/ai/tpl/merchant.lua")
 
 function sos()
   msg = {
diff --git a/src/ai.c b/src/ai.c
index a814e66..ce746d3 100644
--- a/src/ai.c
+++ b/src/ai.c
@@ -502,7 +502,7 @@ void ai_think(Pilot* pilot) {
   L = cur_pilot->ai->L; /* Set the AI profile to the current pilot's. */
 
   /* Clean up some variables. */
-  pilot_acc     = 0.;
+  pilot_acc     = 0;
   pilot_turn    = 0.;
   pilot_flags   = 0;
   cur_pilot->target = cur_pilot->id;
diff --git a/src/input.c b/src/input.c
index e8fa178..ee2b837 100644
--- a/src/input.c
+++ b/src/input.c
@@ -80,7 +80,7 @@ void input_setDefault(void) {
   input_setKeybind("e_attack",        KEYBIND_KEYBOARD, SDLK_f,           KMOD_NONE,  0);
   input_setKeybind("e_hold",          KEYBIND_KEYBOARD, SDLK_g,           KMOD_NONE,  0);
   input_setKeybind("e_return",        KEYBIND_KEYBOARD, SDLK_r,           KMOD_NONE,  0);
-  input_setKeybind("e_cleark",        KEYBIND_KEYBOARD, SDLK_c,           KMOD_NONE,  0);
+  input_setKeybind("e_clear",         KEYBIND_KEYBOARD, SDLK_c,           KMOD_NONE,  0);
 
 
   /* Secondary weapon. */