diff --git a/clibs b/clibs
index d86c85254..ed5c4fee3 160000
--- a/clibs
+++ b/clibs
@@ -1 +1 @@
-Subproject commit d86c8525489d7f11b7ba13e101bb59ecf160b871
+Subproject commit ed5c4fee3afbc3d8be79d64857f30702aed522f8
diff --git a/scripts/eressea/tunnels.lua b/scripts/eressea/tunnels.lua
index 007c52bc0..4a787a373 100644
--- a/scripts/eressea/tunnels.lua
+++ b/scripts/eressea/tunnels.lua
@@ -1,3 +1,4 @@
+-- Weltentor portal module
 local tunnels = {}
 
 local buildings = {}
@@ -24,25 +25,15 @@ local function get_target(param)
 end
 
 local function tunnel_action(b, param)
-  local r = nil
-  if tonumber(param)~=nil then
-    r = get_region_by_id(tonumber(param))
-  end
   local units = tunnel_travelers(b)
-  if units~=nil then
+  local rto = get_target(param)
+  if rto and units then
     eressea.log.debug("Tunnel from " .. tostring(b) .. " [" .. param .. "]")
     for key, u in pairs(units) do
-      local rto = r
-      if r==nil then
-        rto = get_target(param)
-      end
-      if rto~=nil then
         u.region = rto
         eressea.log.debug("teleported " .. tostring(u) .. " to " .. tostring(rto))
-      end
     end
   end
-  return 1 -- return 0 to destroy
 end
 
 function tunnels.init()
diff --git a/scripts/tests/e3/buildings.lua b/scripts/tests/e3/buildings.lua
index 9899d138e..d5ea4fa51 100644
--- a/scripts/tests/e3/buildings.lua
+++ b/scripts/tests/e3/buildings.lua
@@ -34,22 +34,18 @@ function test_build_watch()
     local u = unit.create(f, r, 1)
 
     u.number = 20
-    u:add_item("log", 20)
+    u:add_item("log", 30)
     u.id = 42
 
     u:set_skill("building", 1)
     u:add_order("MACHE Wache")
     process_orders()
     assert_not_nil(u.building)
-    if 5 ~= u.building.size then
-    -- debug logging to find intermittent errors
-        for k,v in ipairs(f.messages) do
-            print(v)
-        end
-    end
+    -- stage two needs skill 2, this unit can only build a first stage:
     assert_equal(5, u.building.size)
 
     u:set_skill("building", 2)
+    u:clear_orders()
     u:add_order("MACHE Wache " .. itoa36(u.building.id))
     process_orders()
     assert_not_nil(u.building)
diff --git a/scripts/tools/wormholes.lua b/scripts/tools/wormholes.lua
deleted file mode 100644
index 87be4be90..000000000
--- a/scripts/tools/wormholes.lua
+++ /dev/null
@@ -1,52 +0,0 @@
--- create a fixed path to a specific region
-local function create_path(from, to)
-  local param = tostring(to.uid)
-  local b = building.create(from, "portal")
-  b.name = "Weltentor"
-  b.size = 1
-  b:add_action("tunnel_action", param)
-end
-
--- create a wonky tunnel wth more than one exit
-local function create_tunnel(from, param)
-  local b = building.create(from, "portal")
-  b.name = "Weltentor"
-  b.size = 1
-  b:add_action("tunnel_action", param)
-end
-
--- make a tunnel from the cursor to the first selected region
-function mktunnel()
-  local from = gmtool.get_cursor()
-  local to = gmtool.get_selection()()
-  if to~=nil then
-    region.create(from.x, from.y, "glacier")
-    create_tunnel(from, to)
-    gmtool.select(to, 0)
-    gmtool.highlight(to, 1)
-  end
-end
-
--- turn all selected regions into targets for a wonky tunnel ("tnnL")
-function mkanchors()
-  for r in gmtool.get_selection() do
-    if not r:get_key("tnnL") then
-      r:set_key("tnnL", true)
-      if r:get_flag(0) then
-        -- RF_CHAOTIC gets removed
-        r:set_flag(0, false)
-      end
-      r:set_resource("peasant", r:get_resource("peasant") + 1)
-    end
-  end
-end
-
--- region.create and prepare all hell-regions to become wonky gates
-function mkgates()
-  for r in regions() do
-    if r.plane_id==0 and r.terrain=="hell" then
-      create_tunnel(r, "tnnL")
-      region.create(r.x, r.y, "glacier")
-    end
-  end
-end
diff --git a/src/alchemy.c b/src/alchemy.c
index d2dd64a04..c84374e28 100644
--- a/src/alchemy.c
+++ b/src/alchemy.c
@@ -66,7 +66,7 @@ void new_potiontype(item_type * itype, int level)
 {
     potion_type *ptype;
 
-    ptype = (potion_type *)calloc(sizeof(potion_type), 1);
+    ptype = (potion_type *)calloc(1, sizeof(potion_type));
     itype->flags |= ITF_POTION;
     ptype->itype = itype;
     ptype->level = level;
@@ -181,7 +181,7 @@ int use_potion(unit * u, const item_type * itype, int amount, struct order *ord)
 
 static void a_initeffect(variant *var)
 {
-    var->v = calloc(sizeof(effect_data), 1);
+    var->v = calloc(1, sizeof(effect_data));
 }
 
 static void
diff --git a/src/alchemy.test.c b/src/alchemy.test.c
index 7510933fe..32e0c84a5 100644
--- a/src/alchemy.test.c
+++ b/src/alchemy.test.c
@@ -45,16 +45,16 @@ static void test_herbsearch(CuTest * tc)
     CuAssertPtrEquals(tc, u2, is_guarded(r, u));
     herbsearch(u, INT_MAX);
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error70"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error59"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error59"));
     test_clear_messages(f);
 
     setguard(u2, false);
-    CuAssertPtrEquals(tc, 0, is_guarded(r, u));
-    CuAssertPtrEquals(tc, 0, (void *)rherbtype(r));
+    CuAssertPtrEquals(tc, NULL, is_guarded(r, u));
+    CuAssertPtrEquals(tc, NULL, (void *)rherbtype(r));
     herbsearch(u, INT_MAX);
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error108"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error70"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error59"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error70"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error59"));
     test_clear_messages(f);
 
     rsetherbtype(r, itype);
@@ -62,9 +62,9 @@ static void test_herbsearch(CuTest * tc)
     CuAssertIntEquals(tc, 0, rherbs(r));
     herbsearch(u, INT_MAX);
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "researchherb_none"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error108"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error70"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error59"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error108"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error70"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error59"));
     test_clear_messages(f);
 
     rsetherbs(r, 100);
@@ -73,10 +73,10 @@ static void test_herbsearch(CuTest * tc)
     CuAssertIntEquals(tc, 99, rherbs(r));
     CuAssertIntEquals(tc, 1, i_get(u->items, itype));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "herbfound"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "researchherb_none"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error108"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error70"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error59"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "researchherb_none"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error108"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error70"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error59"));
     test_clear_messages(f);
 
     test_teardown();
diff --git a/src/automate.c b/src/automate.c
index 24c34e903..c2b07fbd0 100644
--- a/src/automate.c
+++ b/src/automate.c
@@ -36,20 +36,22 @@ int autostudy_init(scholar scholars[], int max_scholars, region *r)
     for (u = r->units; u; u = u->next) {
         keyword_t kwd = getkeyword(u->thisorder);
         if (kwd == K_AUTOSTUDY) {
-            if (long_order_allowed(u) && unit_can_study(u)) {
-                scholar * st = scholars + nscholars;
-                init_order(u->thisorder, u->faction->locale);
-                st->sk = getskill(u->faction->locale);
-                st->level = effskill_study(u, st->sk);
-                st->learn = 0;
-                st->u = u;
-                if (++nscholars == max_scholars) {
-                    log_fatal("you must increase MAXSCHOLARS");
+            if (long_order_allowed(u)) {
+                if (unit_can_study(u)) {
+                    scholar * st = scholars + nscholars;
+                    init_order(u->thisorder, u->faction->locale);
+                    st->sk = getskill(u->faction->locale);
+                    st->level = effskill_study(u, st->sk);
+                    st->learn = 0;
+                    st->u = u;
+                    if (++nscholars == max_scholars) {
+                        log_fatal("you must increase MAXSCHOLARS");
+                    }
+                }
+                else {
+                    ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "error_race_nolearn", "race",
+                        u_race(u)));
                 }
-            }
-            else {
-                ADDMSG(&u->faction->msgs, msg_feedback(u, u->thisorder, "error_race_nolearn", "race",
-                    u_race(u)));
             }
         }
     }
diff --git a/src/battle.c b/src/battle.c
index b7e4b92a3..8b71f17e1 100644
--- a/src/battle.c
+++ b/src/battle.c
@@ -1138,7 +1138,7 @@ static void demon_dazzle(fighter *af, troop dt) {
     if (u_race(af->unit) == get_race(RC_DAEMON)) {
         if (!(df->person[dt.index].flags & (FL_COURAGE | FL_DAZZLED))) {
             df->person[dt.index].flags |= FL_DAZZLED;
-            df->person[dt.index].defence--;
+            df->person[dt.index].defense--;
         }
     }
 }
@@ -1191,7 +1191,7 @@ static void destroy_items(troop dt) {
 
 }
 
-static void calculate_defence_type(troop dt, troop at, int type, bool missile,
+static void calculate_defense_type(troop dt, troop at, int type, bool missile,
     const weapon_type **dwtype, int *defskill) {
   const weapon *weapon;
   weapon = select_weapon(dt, false, true);      /* missile=true to get the unmodified best weapon she has */
@@ -1320,7 +1320,7 @@ terminate(troop dt, troop at, int type, const char *damage_formula, bool missile
     ++at.fighter->hits;
 
     calculate_attack_type(at, dt, type, missile, &awtype, &attskill, &magic);
-    calculate_defence_type(at, dt, type, missile, &awtype, &attskill);
+    calculate_defense_type(at, dt, type, missile, &awtype, &attskill);
 
     if (is_riding(at) && (awtype == NULL || (fval(awtype, WTF_HORSEBONUS)
         && !fval(awtype, WTF_MISSILE)))) {
@@ -1946,7 +1946,7 @@ int skilldiff(troop at, troop dt, int dist)
         rc_goblin = get_race(RC_GOBLIN);
     }
     skdiff += af->person[at.index].attack;
-    skdiff -= df->person[dt.index].defence;
+    skdiff -= df->person[dt.index].defense;
 
     if (df->person[dt.index].flags & FL_SLEEPING)
         skdiff += 2;
@@ -2075,7 +2075,7 @@ void dazzle(battle * b, troop * td)
     }
 
     td->fighter->person[td->index].flags |= FL_DAZZLED;
-    td->fighter->person[td->index].defence--;
+    td->fighter->person[td->index].defense--;
 }
 
 void damage_building(battle * b, building * bldg, int damage_abs)
@@ -2241,7 +2241,7 @@ static void attack(battle * b, troop ta, const att * a, int numattack)
                     td.fighter->person[td.index].attack -= 1;
                 }
                 else {
-                    td.fighter->person[td.index].defence -= 1;
+                    td.fighter->person[td.index].defense -= 1;
                 }
                 c--;
             }
@@ -3184,7 +3184,7 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack)
     strongmen = trollbelts(u);
     if (strongmen > fig->unit->number) strongmen = fig->unit->number;
 
-    /* Hitpoints, Attack- und Defence-Boni f�r alle Personen */
+    /* Hitpoints, Attack- und Defense-Boni fuer alle Personen */
     for (i = 0; i < fig->alive; i++) {
         assert(i < fig->unit->number);
         fig->person[i].hp = h;
@@ -3226,7 +3226,7 @@ fighter *make_fighter(battle * b, unit * u, side * s1, bool attack)
             assert(w != WMAX);
         }
         assert(w >= 0);
-        fig->weapons = (weapon *)calloc(sizeof(weapon), (size_t)(w + 1));
+        fig->weapons = (weapon *)calloc((size_t)(w + 1), sizeof(weapon));
         memcpy(fig->weapons, weapons, (size_t)w * sizeof(weapon));
 
         for (i = 0; i != w; ++i) {
@@ -3452,7 +3452,7 @@ battle *make_battle(region * r)
                         break;
                 }
                 if (!bf) {
-                    bf = (bfaction *)calloc(sizeof(bfaction), 1);
+                    bf = (bfaction *)calloc(1, sizeof(bfaction));
                     ++b->nfactions;
                     bf->faction = u->faction;
                     bf->next = b->factions;
diff --git a/src/battle.h b/src/battle.h
index bad2dd508..eb6335bce 100644
--- a/src/battle.h
+++ b/src/battle.h
@@ -173,7 +173,7 @@ extern "C" {
         struct person {
             int hp;                   /* Trefferpunkte der Personen */
             int attack;
-            int defence;
+            int defense;
             int damage;
             int flags;
             int speed;
diff --git a/src/battle.test.c b/src/battle.test.c
index 20b167c1f..92a26e692 100644
--- a/src/battle.test.c
+++ b/src/battle.test.c
@@ -78,7 +78,7 @@ static void test_make_fighter(CuTest * tc)
     af = make_fighter(b, au, as, false);
 
     CuAssertIntEquals(tc, 1, b->nfighters);
-    CuAssertPtrEquals(tc, 0, af->building);
+    CuAssertPtrEquals(tc, NULL, af->building);
     CuAssertPtrEquals(tc, as, af->side);
     CuAssertIntEquals(tc, 0, af->run.hp);
     CuAssertIntEquals(tc, ST_BEHIND, af->status);
@@ -216,7 +216,7 @@ static void test_defenders_get_building_bonus(CuTest * tc)
     af = make_fighter(b, au, as, true);
 
     CuAssertPtrEquals(tc, bld, df->building);
-    CuAssertPtrEquals(tc, 0, af->building);
+    CuAssertPtrEquals(tc, NULL, af->building);
 
     dt.fighter = df;
     dt.index = 0;
@@ -261,7 +261,7 @@ static void test_attackers_get_no_building_bonus(CuTest * tc)
     as = make_side(b, au->faction, 0, 0, 0);
     af = make_fighter(b, au, as, true);
 
-    CuAssertPtrEquals(tc, 0, af->building);
+    CuAssertPtrEquals(tc, NULL, af->building);
     free_battle(b);
     test_teardown();
 }
@@ -298,12 +298,12 @@ static void test_building_bonus_respects_size(CuTest * tc)
     df = make_fighter(b, du, as, false);
 
     CuAssertPtrEquals(tc, bld, af->building);
-    CuAssertPtrEquals(tc, 0, df->building);
+    CuAssertPtrEquals(tc, NULL, df->building);
     free_battle(b);
     test_teardown();
 }
 
-static void test_building_defence_bonus(CuTest * tc)
+static void test_building_defense_bonus(CuTest * tc)
 {
     building_type * btype;
 
@@ -570,7 +570,7 @@ static void test_battle_skilldiff(CuTest *tc)
     CuAssertIntEquals(tc, 0, skilldiff(ta, td, 0));
 
     ta.fighter->person[0].attack = 2;
-    td.fighter->person[0].defence = 1;
+    td.fighter->person[0].defense = 1;
     CuAssertIntEquals(tc, 1, skilldiff(ta, td, 0));
 
     td.fighter->person[0].flags |= FL_SLEEPING;
@@ -888,7 +888,7 @@ CuSuite *get_battle_suite(void)
     SUITE_ADD_TEST(suite, test_defenders_get_building_bonus);
     SUITE_ADD_TEST(suite, test_attackers_get_no_building_bonus);
     SUITE_ADD_TEST(suite, test_building_bonus_respects_size);
-    SUITE_ADD_TEST(suite, test_building_defence_bonus);
+    SUITE_ADD_TEST(suite, test_building_defense_bonus);
     SUITE_ADD_TEST(suite, test_calculate_armor);
     SUITE_ADD_TEST(suite, test_natural_armor);
     SUITE_ADD_TEST(suite, test_magic_resistance);
diff --git a/src/bind_faction.c b/src/bind_faction.c
index 632fcec3d..bb0920395 100644
--- a/src/bind_faction.c
+++ b/src/bind_faction.c
@@ -382,20 +382,8 @@ static int tolua_faction_set_origin(lua_State * L)
 static int tolua_faction_get_origin(lua_State * L)
 {
     faction *self = (faction *)tolua_tousertype(L, 1, 0);
-
-    ursprung *origin = self->ursprung;
-    int x, y;
-    while (origin != NULL && origin->id != 0) {
-        origin = origin->next;
-    }
-    if (origin) {
-        x = origin->x;
-        y = origin->y;
-    }
-    else {
-        x = 0;
-        y = 0;
-    }
+    int x = 0, y = 0;
+    faction_getorigin(self, 0, &x, &y);
 
     lua_pushinteger(L, x);
     lua_pushinteger(L, y);
diff --git a/src/economy.test.c b/src/economy.test.c
index 0b213ba7e..5425ca56f 100644
--- a/src/economy.test.c
+++ b/src/economy.test.c
@@ -357,7 +357,7 @@ static void test_tax_cmd(CuTest *tc) {
 
     set_level(u, SK_TAXING, 1);
     tax_cmd(u, ord, &taxorders);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(u->faction->msgs, "error_no_tax_skill"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(u->faction->msgs, "error_no_tax_skill"));
     CuAssertPtrNotNull(tc, taxorders);
 
     rsetmoney(r, 11);
@@ -415,8 +415,8 @@ static void test_maintain_buildings(CuTest *tc) {
     b->flags = 0;
     maintain_buildings(r);
     CuAssertIntEquals(tc, BLD_MAINTAINED, fval(b, BLD_MAINTAINED));
-    CuAssertPtrEquals(tc, 0, f->msgs);
-    CuAssertPtrEquals(tc, 0, r->msgs);
+    CuAssertPtrEquals(tc, NULL, f->msgs);
+    CuAssertPtrEquals(tc, NULL, r->msgs);
 
     req = calloc(2, sizeof(maintenance));
     req[0].number = 100;
@@ -438,8 +438,8 @@ static void test_maintain_buildings(CuTest *tc) {
     maintain_buildings(r);
     CuAssertIntEquals(tc, BLD_MAINTAINED, fval(b, BLD_MAINTAINED));
     CuAssertIntEquals(tc, 0, i_get(u->items, itype));
-    CuAssertPtrEquals(tc, 0, r->msgs);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "maintenance_nowork"));
+    CuAssertPtrEquals(tc, NULL, r->msgs);
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "maintenance_nowork"));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "maintenance"));
     test_clear_messagelist(&f->msgs);
 
@@ -448,7 +448,7 @@ static void test_maintain_buildings(CuTest *tc) {
     b->flags = 0;
     maintain_buildings(r);
     CuAssertIntEquals(tc, 0, fval(b, BLD_MAINTAINED));
-    CuAssertPtrEquals(tc, 0, f->msgs);
+    CuAssertPtrEquals(tc, NULL, f->msgs);
     CuAssertPtrNotNull(tc, test_find_messagetype(r->msgs, "maintenance_noowner"));
     test_clear_messagelist(&r->msgs);
 
diff --git a/src/give.test.c b/src/give.test.c
index 06c0ecf96..806901c46 100644
--- a/src/give.test.c
+++ b/src/give.test.c
@@ -92,7 +92,7 @@ static void test_give_unit(CuTest * tc) {
     give_unit(env.src, env.dst, NULL);
     CuAssertPtrEquals(tc, env.f2, env.src->faction);
     CuAssertIntEquals(tc, 1, env.f2->newbies);
-    CuAssertPtrEquals(tc, 0, env.f1->units);
+    CuAssertPtrEquals(tc, NULL, env.f1->units);
     CuAssertPtrNotNull(tc, test_find_messagetype(env.f1->msgs, "give_person"));
     CuAssertPtrNotNull(tc, test_find_messagetype(env.f2->msgs, "receive_person"));
     test_teardown();
@@ -304,7 +304,7 @@ static void test_give_men_requires_contact(CuTest * tc) {
     ord = create_order(K_GIVE, env.f1->locale, "%s ALLES PERSONEN", itoa36(env.dst->no));
     test_clear_messages(env.f1);
     give_cmd(env.src, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(env.f1->msgs, "give_person"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(env.f1->msgs, "give_person"));
     CuAssertPtrNotNull(tc, test_find_messagetype(env.f1->msgs, "feedback_no_contact"));
 
     msg_release(msg);
@@ -408,7 +408,7 @@ static void test_give_okay(CuTest * tc) {
     setup_give(&env);
 
     config_set("rules.give.flags", "0");
-    CuAssertPtrEquals(tc, 0, check_give(env.src, env.dst, NULL));
+    CuAssertPtrEquals(tc, NULL, check_give(env.src, env.dst, NULL));
     test_teardown();
 }
 
@@ -451,7 +451,7 @@ static void test_give_new_unit(CuTest * tc) {
     setup_give(&env);
     env.dst->number = 0;
     fset(env.dst, UFL_ISNEW);
-    CuAssertPtrEquals(tc, 0, check_give(env.src, env.dst, NULL));
+    CuAssertPtrEquals(tc, NULL, check_give(env.src, env.dst, NULL));
     test_teardown();
 }
 
diff --git a/src/gmtool.c b/src/gmtool.c
index cd0580fcc..36c05a244 100644
--- a/src/gmtool.c
+++ b/src/gmtool.c
@@ -1361,7 +1361,7 @@ static void update_view(view * vi)
 
 state *state_open(void)
 {
-    state *st = calloc(sizeof(state), 1);
+    state *st = (state *)calloc(1, sizeof(state));
     st->display.pl = get_homeplane();
     st->cursor.pl = get_homeplane();
     st->cursor.x = 0;
diff --git a/src/guard.test.c b/src/guard.test.c
index 6264aad21..1c4da2d1f 100644
--- a/src/guard.test.c
+++ b/src/guard.test.c
@@ -29,7 +29,7 @@ static void test_is_guarded(CuTest *tc) {
     r = test_create_region(0, 0, NULL);
     u1 = test_create_unit(test_create_faction(NULL), r);
     u2 = test_create_unit(test_create_faction(rc), r);
-    CuAssertPtrEquals(tc, 0, is_guarded(r, u1));
+    CuAssertPtrEquals(tc, NULL, is_guarded(r, u1));
     setguard(u2, true);
     CuAssertPtrEquals(tc, u2, is_guarded(r, u1));
     test_teardown();
diff --git a/src/json.test.c b/src/json.test.c
index 48a5e4be6..30d4e072e 100644
--- a/src/json.test.c
+++ b/src/json.test.c
@@ -71,8 +71,8 @@ static cJSON *export_a_region(CuTest * tc, const struct terrain_type *terrain, r
     json = cJSON_Parse(buf);
     CuAssertPtrNotNull(tc, json);
     CuAssertIntEquals(tc, cJSON_Object, json->type);
-    CuAssertPtrEquals(tc, 0, cJSON_GetObjectItem(json, "factions"));
-    CuAssertPtrEquals(tc, 0, cJSON_GetObjectItem(json, "units"));
+    CuAssertPtrEquals(tc, NULL, cJSON_GetObjectItem(json, "factions"));
+    CuAssertPtrEquals(tc, NULL, cJSON_GetObjectItem(json, "units"));
     CuAssertPtrNotNull(tc, regs = cJSON_GetObjectItem(json, "regions"));
     CuAssertIntEquals(tc, cJSON_Object, regs->type);
     result = regs->child;
@@ -111,7 +111,7 @@ static void test_export_ocean_region(CuTest * tc) {
     test_setup();
     terrain = test_create_terrain("ocean", SEA_REGION);
     json = export_a_region(tc, terrain, 0);
-    CuAssertPtrEquals(tc, 0, cJSON_GetObjectItem(json, "name"));
+    CuAssertPtrEquals(tc, NULL, cJSON_GetObjectItem(json, "name"));
     cJSON_Delete(json);
     test_teardown();
 }
diff --git a/src/kernel/alliance.test.c b/src/kernel/alliance.test.c
index 00fe1f4d9..284d57d27 100644
--- a/src/kernel/alliance.test.c
+++ b/src/kernel/alliance.test.c
@@ -34,14 +34,14 @@ static void test_alliance_make(CuTest *tc) {
     CuAssertStrEquals(tc, "Hodor", al->name);
     CuAssertIntEquals(tc, 1, al->id);
     CuAssertIntEquals(tc, 0, al->flags);
-    CuAssertPtrEquals(tc, 0, al->members);
-    CuAssertPtrEquals(tc, 0, al->_leader);
-    CuAssertPtrEquals(tc, 0, al->allies);
+    CuAssertPtrEquals(tc, NULL, al->members);
+    CuAssertPtrEquals(tc, NULL, al->_leader);
+    CuAssertPtrEquals(tc, NULL, al->allies);
     CuAssertPtrEquals(tc, al, findalliance(1));
     CuAssertPtrEquals(tc, al, alliances);
     free_alliances();
-    CuAssertPtrEquals(tc, 0, findalliance(1));
-    CuAssertPtrEquals(tc, 0, alliances);
+    CuAssertPtrEquals(tc, NULL, findalliance(1));
+    CuAssertPtrEquals(tc, NULL, alliances);
     test_teardown();
 }
 
@@ -50,8 +50,8 @@ static void test_alliance_join(CuTest *tc) {
     alliance * al;
 
     setup_alliance(&fix);
-    CuAssertPtrEquals(tc, 0, fix.f1->alliance);
-    CuAssertPtrEquals(tc, 0, fix.f2->alliance);
+    CuAssertPtrEquals(tc, NULL, fix.f1->alliance);
+    CuAssertPtrEquals(tc, NULL, fix.f2->alliance);
     al = makealliance(1, "Hodor");
     setalliance(fix.f1, al);
     CuAssertPtrEquals(tc, fix.f1, alliance_get_leader(al));
@@ -99,7 +99,7 @@ static void test_alliance_cmd(CuTest *tc) {
     unit_addorder(u2, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_JOIN], itoa36(42)));
     CuAssertTrue(tc, is_allied(u1->faction, u1->faction));
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u1->faction));
     alliance_cmd();
     al = f_get_alliance(u1->faction);
     CuAssertPtrNotNull(tc, al);
@@ -126,10 +126,10 @@ static void test_alliance_limits(CuTest *tc) {
     unit_addorder(u1, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_INVITE], itoa36(u2->faction->no)));
     unit_addorder(u2, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_JOIN], itoa36(42)));
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u1->faction));
     alliance_cmd();
     CuAssertPtrNotNull(tc, f_get_alliance(u1->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u2->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u2->faction));
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
     CuAssertPtrNotNull(tc, test_find_messagetype(u2->faction->msgs, "too_many_units_in_alliance"));
     test_teardown();
@@ -152,7 +152,7 @@ static void test_alliance_cmd_kick(CuTest *tc) {
     CuAssertTrue(tc, is_allied(u1->faction, u2->faction));
     alliance_cmd();
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u2->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u2->faction));
     test_teardown();
 }
 
@@ -168,10 +168,10 @@ static void test_alliance_cmd_no_invite(CuTest *tc) {
     unit_addorder(u2, create_order(K_ALLIANCE, u1->faction->locale, "%s %s", alliance_kwd[ALLIANCE_JOIN], itoa36(42)));
     CuAssertTrue(tc, is_allied(u1->faction, u1->faction));
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u1->faction));
     alliance_cmd();
     CuAssertPtrNotNull(tc, f_get_alliance(u1->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u2->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u2->faction));
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
     test_teardown();
 }
@@ -193,7 +193,7 @@ static void test_alliance_cmd_leave(CuTest *tc) {
     CuAssertTrue(tc, is_allied(u1->faction, u2->faction));
     alliance_cmd();
     CuAssertTrue(tc, !is_allied(u1->faction, u2->faction));
-    CuAssertPtrEquals(tc, 0, f_get_alliance(u1->faction));
+    CuAssertPtrEquals(tc, NULL, f_get_alliance(u1->faction));
     test_teardown();
 }
 
diff --git a/src/kernel/ally.c b/src/kernel/ally.c
index 1fd7c0efd..0660f148a 100644
--- a/src/kernel/ally.c
+++ b/src/kernel/ally.c
@@ -56,10 +56,8 @@ ally * ally_add(ally **al_p, struct faction *f) {
         if (f && al->faction == f) return al;
         al_p = &al->next;
     }
-    al = (ally *)malloc(sizeof(ally));
+    al = (ally *)calloc(1, sizeof(ally));
     al->faction = f;
-    al->status = 0;
-    al->next = 0;
     *al_p = al;
     return al;
 }
diff --git a/src/kernel/ally.test.c b/src/kernel/ally.test.c
index 66542a298..99d220151 100644
--- a/src/kernel/ally.test.c
+++ b/src/kernel/ally.test.c
@@ -15,8 +15,8 @@ static void test_ally(CuTest * tc)
     CuAssertPtrEquals(tc, f1, ally_find(al, f1)->faction);
 
     ally_remove(&al, f1);
-    CuAssertPtrEquals(tc, 0, al);
-    CuAssertPtrEquals(tc, 0, ally_find(al, f1));
+    CuAssertPtrEquals(tc, NULL, al);
+    CuAssertPtrEquals(tc, NULL, ally_find(al, f1));
 }
 
 static void test_ally_null(CuTest * tc)
@@ -28,7 +28,7 @@ static void test_ally_null(CuTest * tc)
     CuAssertPtrNotNull(tc, a1);
     CuAssertPtrNotNull(tc, a2);
     CuAssertPtrEquals(tc, a2, a1->next);
-    CuAssertPtrEquals(tc, 0, a2->next);
+    CuAssertPtrEquals(tc, NULL, a2->next);
     free(a1);
     free(a2);
 }
diff --git a/src/kernel/attrib.test.c b/src/kernel/attrib.test.c
index 918b768fd..de024c46d 100644
--- a/src/kernel/attrib.test.c
+++ b/src/kernel/attrib.test.c
@@ -15,11 +15,11 @@ static void test_attrib_new(CuTest * tc)
     attrib_type at_test = { "test" };
     attrib * a;
     CuAssertPtrNotNull(tc, (a = a_new(&at_test)));
-    CuAssertPtrEquals(tc, 0, a->next);
-    CuAssertPtrEquals(tc, 0, a->nexttype);
+    CuAssertPtrEquals(tc, NULL, a->next);
+    CuAssertPtrEquals(tc, NULL, a->nexttype);
     CuAssertPtrEquals(tc, (void *)a->type, (void *)&at_test);
     a_remove(&a, a);
-    CuAssertPtrEquals(tc, 0, a);
+    CuAssertPtrEquals(tc, NULL, a);
 }
 
 static void test_attrib_add(CuTest * tc)
@@ -51,7 +51,7 @@ static void test_attrib_remove_self(CuTest * tc) {
     CuAssertPtrNotNull(tc, a_add(&alist, a_new(&at_foo)));
     CuAssertPtrNotNull(tc, a = a_add(&alist, a_new(&at_foo)));
     CuAssertPtrEquals(tc, a, alist->next);
-    CuAssertPtrEquals(tc, 0, alist->nexttype);
+    CuAssertPtrEquals(tc, NULL, alist->nexttype);
     CuAssertIntEquals(tc, 1, a_remove(&alist, alist));
     CuAssertPtrEquals(tc, a, alist);
     a_removeall(&alist, NULL);
@@ -66,11 +66,11 @@ static void test_attrib_removeall(CuTest * tc) {
     a_add(&alist, a_new(&at_foo));
     a_removeall(&alist, &at_foo);
     CuAssertPtrEquals(tc, a, alist);
-    CuAssertPtrEquals(tc, 0, alist->next);
+    CuAssertPtrEquals(tc, NULL, alist->next);
     a_add(&alist, a_new(&at_bar));
     a_add(&alist, a_new(&at_foo));
     a_removeall(&alist, NULL);
-    CuAssertPtrEquals(tc, 0, alist);
+    CuAssertPtrEquals(tc, NULL, alist);
 }
 
 static void test_attrib_remove(CuTest * tc)
@@ -83,7 +83,7 @@ static void test_attrib_remove(CuTest * tc)
     CuAssertIntEquals(tc, 1, a_remove(&alist, a));
     CuAssertPtrNotNull(tc, alist);
     CuAssertIntEquals(tc, 1, a_remove(&alist, alist));
-    CuAssertPtrEquals(tc, 0, alist);
+    CuAssertPtrEquals(tc, NULL, alist);
 }
 
 static void test_attrib_nexttype(CuTest * tc)
@@ -92,16 +92,16 @@ static void test_attrib_nexttype(CuTest * tc)
     attrib_type at_bar = { "bar" };
     attrib *a, *alist = 0;
     CuAssertPtrNotNull(tc, (a = a_new(&at_foo)));
-    CuAssertPtrEquals(tc, 0, a->nexttype);
+    CuAssertPtrEquals(tc, NULL, a->nexttype);
     CuAssertPtrEquals(tc, a, a_add(&alist, a));
-    CuAssertPtrEquals(tc, 0, alist->nexttype);
+    CuAssertPtrEquals(tc, NULL, alist->nexttype);
 
     CuAssertPtrNotNull(tc, a_add(&alist, a_new(&at_foo)));
-    CuAssertPtrEquals(tc, 0, alist->nexttype);
+    CuAssertPtrEquals(tc, NULL, alist->nexttype);
 
     CuAssertPtrNotNull(tc, (a = a_add(&alist, a_new(&at_bar))));
     CuAssertPtrEquals(tc, a, alist->nexttype);
-    CuAssertPtrEquals(tc, 0, a->nexttype);
+    CuAssertPtrEquals(tc, NULL, a->nexttype);
 
     a_remove(&alist, alist);
     CuAssertPtrEquals(tc, a, alist->nexttype);
diff --git a/src/kernel/build.c b/src/kernel/build.c
index a3b1c0e50..2b7251f1d 100644
--- a/src/kernel/build.c
+++ b/src/kernel/build.c
@@ -54,16 +54,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <kernel/unit.h>
 
 /* from libutil */
-#include <util/base36.h>
 #include <util/goodies.h>
 #include <util/language.h>
 #include <util/log.h>
 #include <util/param.h>
 #include <util/parser.h>
 #include <util/resolve.h>
+#include <util/strings.h>
 
 /* from libc */
 #include <assert.h>
+#include <errno.h>
 #include <limits.h>
 #include <math.h>
 #include <stdio.h>
@@ -180,7 +181,9 @@ int destroy_cmd(unit * u, struct order *ord)
     s = gettoken(token, sizeof(token));
 
     if (s && *s) {
-        n = atoi((const char *)s);
+        ERRNO_CHECK();
+        n = atoi(s);
+        errno = 0;
         if (n <= 0) {
             n = INT_MAX;
         }
diff --git a/src/kernel/build.test.c b/src/kernel/build.test.c
index 2607b2dfb..ae3e47d0d 100644
--- a/src/kernel/build.test.c
+++ b/src/kernel/build.test.c
@@ -202,8 +202,8 @@ static void test_build_building_no_materials(CuTest *tc) {
     set_level(u, SK_BUILDING, 1);
     u->orders = create_order(K_MAKE, u->faction->locale, 0);
     CuAssertIntEquals(tc, ENOMATERIALS, build_building(u, btype, 0, 4, u->orders));
-    CuAssertPtrEquals(tc, 0, u->region->buildings);
-    CuAssertPtrEquals(tc, 0, u->building);
+    CuAssertPtrEquals(tc, NULL, u->region->buildings);
+    CuAssertPtrEquals(tc, NULL, u->building);
     teardown_build(&bf);
 }
 
@@ -267,7 +267,7 @@ static void test_build_destroy_road(CuTest *tc)
 
     CuAssertIntEquals(tc, 0, destroy_cmd(u, ord));
     CuAssertIntEquals(tc, 100, rroad(r, D_EAST));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "destroy_road"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "destroy_road"));
 
     set_level(u, SK_ROAD_BUILDING, 1);
     CuAssertIntEquals(tc, 0, destroy_cmd(u, ord));
@@ -324,7 +324,7 @@ static void test_build_destroy_road_guard(CuTest *tc)
     CuAssertIntEquals(tc, 0, destroy_cmd(u, ord));
     CuAssertIntEquals(tc, 100, rroad(r, D_EAST));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error70"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "destroy_road"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "destroy_road"));
 
     test_clear_messages(f);
     setguard(ug, false);
diff --git a/src/kernel/building.c b/src/kernel/building.c
index f5698eaa9..3a3d7e4e5 100644
--- a/src/kernel/building.c
+++ b/src/kernel/building.c
@@ -135,7 +135,7 @@ building_type *bt_get_or_create(const char *name)
     if (name != NULL) {
         building_type *btype = bt_find_i(name);
         if (btype == NULL) {
-            btype = calloc(sizeof(building_type), 1);
+            btype = (building_type *)calloc(1, sizeof(building_type));
             btype->_name = str_strdup(name);
             btype->flags = BTF_DEFAULT;
             btype->auraregen = 1.0;
diff --git a/src/kernel/command.test.c b/src/kernel/command.test.c
index d173474f2..4c7bbb362 100644
--- a/src/kernel/command.test.c
+++ b/src/kernel/command.test.c
@@ -37,8 +37,8 @@ static void test_command(CuTest * tc) {
     st = stree_create();
     CuAssertPtrNotNull(tc, st);
     CuAssertPtrEquals(tc, loc, (struct locale *)st->lang);
-    CuAssertPtrEquals(tc, 0, st->root);
-    CuAssertPtrEquals(tc, 0, st->next);
+    CuAssertPtrEquals(tc, NULL, st->root);
+    CuAssertPtrEquals(tc, NULL, st->next);
     stree_add(st, "two", parser_two);
     stree_add(st, "six", parser_six);
     CuAssertPtrNotNull(tc, st->root);
diff --git a/src/kernel/db/sqlite.c b/src/kernel/db/sqlite.c
index ffdcc8e67..fd9d0bc67 100644
--- a/src/kernel/db/sqlite.c
+++ b/src/kernel/db/sqlite.c
@@ -11,6 +11,7 @@
 #include <assert.h>
 #include <limits.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <string.h>
 
 static sqlite3 *g_game_db;
@@ -179,11 +180,14 @@ static int db_open_swap(const char *dbname) {
     return 0;
 }
 
+static const char *g_swapname;
+
 int db_driver_open(database_t db, const char *dbname)
 {
     ERRNO_CHECK();
 
     if (db == DB_SWAP) {
+        g_swapname = dbname;
         return db_open_swap(dbname);
     }
     else if (db == DB_GAME) {
@@ -205,6 +209,13 @@ void db_driver_close(database_t db)
         assert(err == SQLITE_OK);
         err = sqlite3_close(g_temp_db);
         assert(err == SQLITE_OK);
+        if (g_swapname) {
+            FILE * F = fopen(g_swapname, "r");
+            if (F) {
+                fclose(F);
+                remove(g_swapname);
+            }
+        }
     }
     else if (db == DB_GAME) {
         assert(g_game_db);
diff --git a/src/kernel/faction.c b/src/kernel/faction.c
index a78cd943a..21ea35833 100755
--- a/src/kernel/faction.c
+++ b/src/kernel/faction.c
@@ -119,7 +119,7 @@ static void free_faction(faction * f)
 
     i_freeall(&f->items);
 
-    freelist(f->ursprung);
+    freelist(f->origin);
 }
 
 #define FMAXHASH 2039
@@ -727,10 +727,10 @@ bool faction_alive(const faction *f) {
 
 void faction_getorigin(const faction * f, int id, int *x, int *y)
 {
-    ursprung *ur;
+    origin *ur;
 
     assert(f && x && y);
-    for (ur = f->ursprung; ur; ur = ur->next) {
+    for (ur = f->origin; ur; ur = ur->next) {
         if (ur->id == id) {
             *x = ur->x;
             *y = ur->y;
@@ -739,24 +739,27 @@ void faction_getorigin(const faction * f, int id, int *x, int *y)
     }
 }
 
-void faction_setorigin(faction * f, int id, int x, int y)
-{
-    ursprung *ur;
-    assert(f != NULL);
-    for (ur = f->ursprung; ur; ur = ur->next) {
-        if (ur->id == id) {
-            ur->x = ur->x + x;
-            ur->y = ur->y + y;
-            return;
-        }
-    }
-
-    ur = calloc(1, sizeof(ursprung));
+static origin *new_origin(int id, int x, int y) {
+    origin *ur = (origin *)calloc(1, sizeof(origin));
     ur->id = id;
     ur->x = x;
     ur->y = y;
+    return ur;
+}
 
-    addlist(&f->ursprung, ur);
+void faction_setorigin(faction * f, int id, int x, int y)
+{
+    origin **urp;
+    assert(f != NULL);
+    for (urp = &f->origin; *urp; urp = &(*urp)->next) {
+        origin *ur = *urp;
+        if (ur->id == id) {
+            ur->x += x;
+            ur->y += y;
+            return;
+        }
+    }
+    *urp = new_origin(id, x, y);
 }
 
 
diff --git a/src/kernel/faction.h b/src/kernel/faction.h
index 63c5a9993..0fe38cb1d 100644
--- a/src/kernel/faction.h
+++ b/src/kernel/faction.h
@@ -37,7 +37,7 @@ extern "C" {
     struct attrib_type;
     struct gamedata;
     struct selist;
-    
+
     /* faction flags */
 #define FFL_NOAID         (1<<0)  /* Hilfsflag Kampf */
 #define FFL_ISNEW         (1<<1)
@@ -54,6 +54,12 @@ extern "C" {
 #define FFL_NPC           (1<<25) /* eine Partei mit Monstern */
 #define FFL_SAVEMASK (FFL_DEFENDER|FFL_NPC|FFL_NOIDLEOUT|FFL_CURSED)
 
+    typedef struct origin {
+        struct origin *next;
+        int id;
+        int x, y;
+    } origin;
+
     typedef struct faction {
         struct faction *next;
         struct faction *nexthash;
@@ -72,7 +78,7 @@ extern "C" {
         const struct locale *locale;
         int lastorders;
         int age;
-        struct ursprung *ursprung;
+        struct origin *origin;
         const struct race *race;
         magic_t magiegebiet;
         int newbies;
diff --git a/src/kernel/faction.test.c b/src/kernel/faction.test.c
index 9cd5d9de8..6c2ed3aa6 100644
--- a/src/kernel/faction.test.c
+++ b/src/kernel/faction.test.c
@@ -57,7 +57,7 @@ static void test_remove_empty_factions_alliance(CuTest *tc) {
     CuAssertPtrEquals(tc, f, alliance_get_leader(al));
     CuAssertIntEquals(tc, 1, selist_length(al->members));
     remove_empty_factions();
-    CuAssertPtrEquals(tc, 0, al->_leader);
+    CuAssertPtrEquals(tc, NULL, al->_leader);
     CuAssertIntEquals(tc, 0, selist_length(al->members));
     test_teardown();
 }
@@ -75,7 +75,7 @@ static void test_remove_empty_factions(CuTest *tc) {
     CuAssertIntEquals(tc, false, f->_alive);
     CuAssertPtrEquals(tc, fm, factions);
     CuAssertPtrEquals(tc, NULL, fm->next);
-    CuAssertPtrEquals(tc, 0, findfaction(fno));
+    CuAssertPtrEquals(tc, NULL, findfaction(fno));
     CuAssertPtrEquals(tc, fm, get_monsters());
     test_teardown();
 }
@@ -99,7 +99,7 @@ static void test_remove_dead_factions(CuTest *tc) {
     f->_alive = false;
     fno = f->no;
     remove_empty_factions();
-    CuAssertPtrEquals(tc, 0, findfaction(fno));
+    CuAssertPtrEquals(tc, NULL, findfaction(fno));
     CuAssertPtrEquals(tc, fm, get_monsters());
     test_teardown();
 }
@@ -119,7 +119,7 @@ static void test_addfaction(CuTest *tc) {
     CuAssertPtrEquals(tc, NULL, (void *)f->next);
     CuAssertPtrEquals(tc, NULL, (void *)f->banner);
     CuAssertPtrEquals(tc, NULL, (void *)f->spellbook);
-    CuAssertPtrEquals(tc, NULL, (void *)f->ursprung);
+    CuAssertPtrEquals(tc, NULL, (void *)f->origin);
     CuAssertPtrEquals(tc, (void *)factions, (void *)f);
     CuAssertStrEquals(tc, "test@eressea.de", f->email);
     CuAssertTrue(tc, checkpasswd(f, "hurrdurr"));
@@ -162,11 +162,11 @@ static void test_set_origin(CuTest *tc) {
     test_setup();
     pl = create_new_plane(0, "", 0, 19, 0, 19, 0);
     f = test_create_faction(NULL);
-    CuAssertPtrEquals(tc, 0, f->ursprung);
+    CuAssertPtrEquals(tc, NULL, f->origin);
     faction_setorigin(f, 0, 1, 1);
-    CuAssertIntEquals(tc, 0, f->ursprung->id);
-    CuAssertIntEquals(tc, 1, f->ursprung->x);
-    CuAssertIntEquals(tc, 1, f->ursprung->y);
+    CuAssertIntEquals(tc, 0, f->origin->id);
+    CuAssertIntEquals(tc, 1, f->origin->x);
+    CuAssertIntEquals(tc, 1, f->origin->y);
     faction_getorigin(f, 0, &x, &y);
     CuAssertIntEquals(tc, 1, x);
     CuAssertIntEquals(tc, 1, y);
@@ -190,7 +190,7 @@ static void test_set_origin_bug(CuTest *tc) {
     faction_setorigin(f, 0, -10, 3);
     faction_setorigin(f, 0, -13, -4);
     adjust_coordinates(f, &x, &y, pl);
-    CuAssertIntEquals(tc, 0, f->ursprung->id);
+    CuAssertIntEquals(tc, 0, f->origin->id);
     CuAssertIntEquals(tc, -9, x);
     CuAssertIntEquals(tc, 2, y);
     test_teardown();
@@ -250,7 +250,7 @@ static void test_set_email(CuTest *tc) {
     faction_setemail(f, "bugs@eressea.de");
     CuAssertStrEquals(tc, "bugs@eressea.de", f->email);
     faction_setemail(f, NULL);
-    CuAssertPtrEquals(tc, 0, f->email);
+    CuAssertPtrEquals(tc, NULL, f->email);
     CuAssertStrEquals(tc, "", faction_getemail(f));
     test_teardown();
 }
diff --git a/src/kernel/group.test.c b/src/kernel/group.test.c
index 1c6d6339e..877728780 100644
--- a/src/kernel/group.test.c
+++ b/src/kernel/group.test.c
@@ -35,7 +35,7 @@ static void test_group_readwrite_dead_faction(CuTest *tc) {
     f = test_create_faction(NULL);
     fno = f->no;
     CuAssertPtrEquals(tc, f, factions);
-    CuAssertPtrEquals(tc, 0, f->next);
+    CuAssertPtrEquals(tc, NULL, f->next);
     f2 = test_create_faction(NULL);
     CuAssertPtrEquals(tc, f2, factions->next);
     u = test_create_unit(f2, test_create_region(0, 0, NULL));
@@ -58,14 +58,14 @@ static void test_group_readwrite_dead_faction(CuTest *tc) {
     read_game(&data);
     mstream_done(&data.strm);
     gamedata_done(&data);
-    CuAssertPtrEquals(tc, 0, findfaction(fno));
+    CuAssertPtrEquals(tc, NULL, findfaction(fno));
     f2 = factions;
     CuAssertPtrNotNull(tc, f2);
     u = f2->units;
     CuAssertPtrNotNull(tc, u);
     g = get_group(u);
     CuAssertPtrNotNull(tc, g);
-    CuAssertPtrEquals(tc, 0, g->allies);
+    CuAssertPtrEquals(tc, NULL, g->allies);
     test_teardown();
 }
 
@@ -106,11 +106,11 @@ static void test_group_readwrite(CuTest * tc)
     CuAssertPtrNotNull(tc, f->groups->next);
     CuAssertIntEquals(tc, 43, f->groups->next->gid);
     CuAssertStrEquals(tc, "Egoisten", f->groups->next->name);
-    CuAssertPtrEquals(tc, 0, f->groups->allies);
+    CuAssertPtrEquals(tc, NULL, f->groups->allies);
     g = f->groups->next;
     CuAssertIntEquals(tc, 44, key_get(g->attribs, 44));
     CuAssertPtrNotNull(tc, g->allies);
-    CuAssertPtrEquals(tc, 0, g->allies->next);
+    CuAssertPtrEquals(tc, NULL, g->allies->next);
     CuAssertPtrEquals(tc, f, g->allies->faction);
     CuAssertIntEquals(tc, HELP_GIVE, g->allies->status);
     test_teardown();
@@ -135,7 +135,7 @@ static void test_group(CuTest * tc)
     CuAssertIntEquals(tc, 1, g->members);
     set_group(u, 0);
     CuAssertIntEquals(tc, 0, g->members);
-    CuAssertPtrEquals(tc, 0, get_group(u));
+    CuAssertPtrEquals(tc, NULL, get_group(u));
     set_group(u, g);
     CuAssertIntEquals(tc, 1, g->members);
     CuAssertPtrEquals(tc, g, get_group(u));
diff --git a/src/kernel/item.c b/src/kernel/item.c
index aab734759..58702be07 100644
--- a/src/kernel/item.c
+++ b/src/kernel/item.c
@@ -723,7 +723,7 @@ int change_money(unit * u, int v)
     return 0;
 }
 
-static int add_resourcename_cb(const void * match, const void * key,
+static int add_resourcename_cb(void * match, const void * key,
     size_t keylen, void *data)
 {
     struct locale * lang = (struct locale *)data;
@@ -773,7 +773,7 @@ attrib_type at_showitem = {
     "showitem"
 };
 
-static int add_itemname_cb(const void * match, const void * key,
+static int add_itemname_cb(void * match, const void * key,
     size_t keylen, void *data)
 {
     struct locale * lang = (struct locale *)data;
@@ -919,7 +919,7 @@ void free_rtype(resource_type *rtype) {
     free(rtype);
 }
 
-static int free_rtype_cb(const void * match, const void * key,
+static int free_rtype_cb(void * match, const void * key,
     size_t keylen, void *cbdata)
 {
     resource_type *rtype = ((rt_entry *)match)->value;;
diff --git a/src/kernel/item.test.c b/src/kernel/item.test.c
index f04a22572..f820f8592 100644
--- a/src/kernel/item.test.c
+++ b/src/kernel/item.test.c
@@ -61,7 +61,7 @@ static void test_uchange(CuTest * tc, unit * u, const resource_type * rtype) {
     CuAssertIntEquals(tc, 0, rtype->uchange(u, rtype, -n));
     CuAssertPtrNotNull(tc, sl);
     CuAssertStrEquals(tc, "serious accounting error. number of items is %d.", sl->s);
-    CuAssertPtrEquals(tc, 0, sl->next);
+    CuAssertPtrEquals(tc, NULL, sl->next);
     test_log_stop(log, sl);
 }
 
@@ -86,7 +86,7 @@ void test_resource_type(CuTest * tc)
 
     test_setup();
 
-    CuAssertPtrEquals(tc, 0, rt_find("herpderp"));
+    CuAssertPtrEquals(tc, NULL, rt_find("herpderp"));
 
     test_create_itemtype("herpderp");
     test_create_itemtype("herpes");
@@ -122,7 +122,7 @@ void test_findresourcetype(CuTest * tc)
     locale_setstring(lang, "peasant", "Bauer");
     init_resources();
     CuAssertPtrNotNull(tc, rt_find("peasant"));
-    CuAssertPtrEquals(tc, 0, rt_find("log"));
+    CuAssertPtrEquals(tc, NULL, rt_find("log"));
     itype = test_create_itemtype("log");
 
     CuAssertPtrEquals(tc, (void*)itype->rtype, (void*)findresourcetype("Holz", lang));
@@ -164,13 +164,13 @@ static void test_core_resources(CuTest *tc) {
     CuAssertPtrNotNull(tc, rtype->itype);
     CuAssertPtrNotNull(tc, rtype->uchange);
     CuAssertPtrNotNull(tc, rtype = rt_find("peasant"));
-    CuAssertPtrEquals(tc, 0, rtype->itype);
+    CuAssertPtrEquals(tc, NULL, rtype->itype);
     CuAssertPtrNotNull(tc, rtype = rt_find("permaura"));
-    CuAssertPtrEquals(tc, 0, rtype->itype);
+    CuAssertPtrEquals(tc, NULL, rtype->itype);
     CuAssertPtrNotNull(tc, rtype = rt_find("hp"));
-    CuAssertPtrEquals(tc, 0, rtype->itype);
+    CuAssertPtrEquals(tc, NULL, rtype->itype);
     CuAssertPtrNotNull(tc, rtype = rt_find("aura"));
-    CuAssertPtrEquals(tc, 0, rtype->itype);
+    CuAssertPtrEquals(tc, NULL, rtype->itype);
     test_teardown();
 }
 
diff --git a/src/kernel/messages.test.c b/src/kernel/messages.test.c
index 3c9c684c6..e852bbc61 100644
--- a/src/kernel/messages.test.c
+++ b/src/kernel/messages.test.c
@@ -59,7 +59,7 @@ static void test_merge_split(CuTest *tc) {
     add_message(&append, msg = msg_message(mtype->name, ""));
     msg_release(msg);
 
-    CuAssertPtrEquals(tc, 0, mlist->begin->next);
+    CuAssertPtrEquals(tc, NULL, mlist->begin->next);
     CuAssertPtrEquals(tc, &mlist->begin->next, mlist->end);
     split = merge_messages(mlist, append);
     CuAssertPtrNotNull(tc, split);
@@ -68,7 +68,7 @@ static void test_merge_split(CuTest *tc) {
     CuAssertPtrNotNull(tc, mlist->begin->next);
     CuAssertPtrEquals(tc, append->begin, mlist->begin->next);
     split_messages(mlist, split);
-    CuAssertPtrEquals(tc, 0, mlist->begin->next);
+    CuAssertPtrEquals(tc, NULL, mlist->begin->next);
     free_messagelist(*split);
     free_messagelist(mlist->begin);
     free(mlist);
diff --git a/src/kernel/order.test.c b/src/kernel/order.test.c
index d1dd6a371..14cdeb157 100644
--- a/src/kernel/order.test.c
+++ b/src/kernel/order.test.c
@@ -239,11 +239,11 @@ static void test_replace_order(CuTest *tc) {
     orig = create_order(K_MAKE, lang, NULL);
     repl = create_order(K_ALLY, lang, NULL);
     replace_order(&orders, orig, repl);
-    CuAssertPtrEquals(tc, 0, orders);
+    CuAssertPtrEquals(tc, NULL, orders);
     orders = orig;
     replace_order(&orders, orig, repl);
     CuAssertPtrNotNull(tc, orders);
-    CuAssertPtrEquals(tc, 0, orders->next);
+    CuAssertPtrEquals(tc, NULL, orders->next);
     CuAssertIntEquals(tc, getkeyword(repl), getkeyword(orders));
     free_order(orders);
     free_order(repl);
diff --git a/src/kernel/plane.c b/src/kernel/plane.c
index 71c0dbd86..89de42618 100644
--- a/src/kernel/plane.c
+++ b/src/kernel/plane.c
@@ -122,7 +122,7 @@ int getplaneid(const region * r)
 static int
 ursprung_x(const faction * f, const plane * pl, const region * rdefault)
 {
-    ursprung *ur;
+    origin *ur;
     int id = 0;
 
     if (!f)
@@ -131,7 +131,7 @@ ursprung_x(const faction * f, const plane * pl, const region * rdefault)
     if (pl)
         id = pl->id;
 
-    for (ur = f->ursprung; ur; ur = ur->next) {
+    for (ur = f->origin; ur; ur = ur->next) {
         if (ur->id == id)
             return ur->x;
     }
@@ -145,7 +145,7 @@ ursprung_x(const faction * f, const plane * pl, const region * rdefault)
 static int
 ursprung_y(const faction * f, const plane * pl, const region * rdefault)
 {
-    ursprung *ur;
+    origin *ur;
     int id = 0;
 
     if (!f)
@@ -154,7 +154,7 @@ ursprung_y(const faction * f, const plane * pl, const region * rdefault)
     if (pl)
         id = pl->id;
 
-    for (ur = f->ursprung; ur; ur = ur->next) {
+    for (ur = f->origin; ur; ur = ur->next) {
         if (ur->id == id)
             return ur->y;
     }
diff --git a/src/kernel/plane.test.c b/src/kernel/plane.test.c
index 8338cc31f..6eb2ff631 100644
--- a/src/kernel/plane.test.c
+++ b/src/kernel/plane.test.c
@@ -11,15 +11,15 @@ static void test_plane(CuTest *tc) {
 
     test_setup();
     r = test_create_region(0, 0, NULL);
-    CuAssertPtrEquals(tc, 0, findplane(0, 0));
-    CuAssertPtrEquals(tc, 0, getplane(r));
+    CuAssertPtrEquals(tc, NULL, findplane(0, 0));
+    CuAssertPtrEquals(tc, NULL, getplane(r));
     CuAssertIntEquals(tc, 0, getplaneid(r));
-    CuAssertPtrEquals(tc, 0, getplanebyid(0));
+    CuAssertPtrEquals(tc, NULL, getplanebyid(0));
     CuAssertIntEquals(tc, 0, plane_center_x(0));
     CuAssertIntEquals(tc, 0, plane_center_y(0));
     CuAssertIntEquals(tc, 0, plane_width(0));
     CuAssertIntEquals(tc, 0, plane_height(0));
-    CuAssertPtrEquals(tc, 0, get_homeplane());
+    CuAssertPtrEquals(tc, NULL, get_homeplane());
 
     pl = create_new_plane(1, "Hell", 4, 8, 40, 80, 15);
     r = test_create_region(4, 40, 0);
@@ -28,7 +28,7 @@ static void test_plane(CuTest *tc) {
     CuAssertIntEquals(tc, 8, pl->maxx);
     CuAssertIntEquals(tc, 40, pl->miny);
     CuAssertIntEquals(tc, 80, pl->maxy);
-    CuAssertPtrEquals(tc, 0, pl->attribs);
+    CuAssertPtrEquals(tc, NULL, pl->attribs);
     CuAssertStrEquals(tc, "Hell", pl->name);
     CuAssertPtrEquals(tc, pl, findplane(4, 40));
     CuAssertPtrEquals(tc, pl, getplane(r));
diff --git a/src/kernel/region.c b/src/kernel/region.c
index 377bf1e22..fee51d13c 100644
--- a/src/kernel/region.c
+++ b/src/kernel/region.c
@@ -774,7 +774,7 @@ region *new_region(int x, int y, struct plane *pl, int uid)
             log_error("duplicate region contains units\n");
         return r;
     }
-    r = calloc(1, sizeof(region));
+    r = (region *)calloc(sizeof(region), 1);
     assert_alloc(r);
     r->x = x;
     r->y = y;
diff --git a/src/kernel/region.test.c b/src/kernel/region.test.c
index d54049b8e..4078b7cbd 100644
--- a/src/kernel/region.test.c
+++ b/src/kernel/region.test.c
@@ -23,14 +23,14 @@ void test_terraform(CuTest *tc) {
     t_plain = test_create_terrain("plain", LAND_REGION);
     t_ocean = test_create_terrain("ocean", SEA_REGION);
     r = test_create_region(0, 0, t_ocean);
-    CuAssertPtrEquals(tc, 0, r->land);
+    CuAssertPtrEquals(tc, NULL, r->land);
     terraform_region(r, t_plain);
     CuAssertPtrNotNull(tc, r->land);
     CuAssertPtrNotNull(tc, r->land->demands);
     CuAssertPtrEquals(tc, itype, (void *)r->land->demands->type->itype);
     CuAssertIntEquals(tc, 0, r->land->demands->type->price);
     terraform_region(r, t_ocean);
-    CuAssertPtrEquals(tc, 0, r->land);
+    CuAssertPtrEquals(tc, NULL, r->land);
     test_teardown();
 }
 
diff --git a/src/kernel/save.c b/src/kernel/save.c
index cdc951fad..a61e4348f 100644
--- a/src/kernel/save.c
+++ b/src/kernel/save.c
@@ -357,14 +357,14 @@ static void read_skills(gamedata *data, unit *u)
             size_t sz = u->skill_size * sizeof(skill);
 
             qsort(skills, u->skill_size, sizeof(skill), skill_cmp);
-            u->skills = malloc(sz);
+            u->skills = (skill *)malloc(sz);
             memcpy(u->skills, skills, sz);
         }
     }
     else {
         int i;
         READ_INT(data->store, &u->skill_size);
-        u->skills = malloc(sizeof(skill)*u->skill_size);
+        u->skills = (skill *)malloc(sizeof(skill)*u->skill_size);
         for (i = 0; i != u->skill_size; ++i) {
             skill *sv = u->skills + i;
             read_skill(data, sv);
@@ -420,7 +420,7 @@ unit *read_unit(gamedata *data)
         u_setfaction(u, NULL);
     }
     else {
-        u = calloc(sizeof(unit), 1);
+        u = (unit *)calloc(1, sizeof(unit));
         assert_alloc(u);
         u->no = n;
         uhash(u);
@@ -1095,7 +1095,7 @@ faction *read_faction(gamedata * data)
 void write_faction(gamedata *data, const faction * f)
 {
     ally *sf;
-    ursprung *ur;
+    origin *ur;
 
     assert(f->_alive);
     assert(f->no > 0 && f->no <= MAX_UNIT_NR);
@@ -1134,8 +1134,8 @@ void write_faction(gamedata *data, const faction * f)
     WRITE_SECTION(data->store);
     WRITE_TOK(data->store, "end");
     WRITE_SECTION(data->store);
-    WRITE_INT(data->store, listlen(f->ursprung));
-    for (ur = f->ursprung; ur; ur = ur->next) {
+    WRITE_INT(data->store, listlen(f->origin));
+    for (ur = f->origin; ur; ur = ur->next) {
         WRITE_INT(data->store, ur->id);
         WRITE_INT(data->store, ur->x);
         WRITE_INT(data->store, ur->y);
diff --git a/src/kernel/save.test.c b/src/kernel/save.test.c
index 8e738863f..4844d1189 100644
--- a/src/kernel/save.test.c
+++ b/src/kernel/save.test.c
@@ -86,7 +86,7 @@ static void test_readwrite_unit(CuTest * tc)
     CuAssertPtrEquals(tc, f, u->faction);
     CuAssertStrEquals(tc, "Hodor", u->_name);
     CuAssertTrue(tc, irace == u_irace(u));
-    CuAssertPtrEquals(tc, 0, u->region);
+    CuAssertPtrEquals(tc, NULL, u->region);
 
     mstream_done(&data.strm);
     gamedata_done(&data);
@@ -115,7 +115,7 @@ static void test_readwrite_faction(CuTest * tc)
     f = read_faction(&data);
     CuAssertPtrNotNull(tc, f);
     CuAssertStrEquals(tc, "Hodor", f->name);
-    CuAssertPtrEquals(tc, 0, f->units);
+    CuAssertPtrEquals(tc, NULL, f->units);
     factions = f;
 
     mstream_done(&data.strm);
@@ -179,7 +179,7 @@ static void test_readwrite_building(CuTest * tc)
     b = read_building(&data);
     CuAssertPtrNotNull(tc, b);
     CuAssertStrEquals(tc, "Hodor", b->name);
-    CuAssertPtrEquals(tc, 0, b->region);
+    CuAssertPtrEquals(tc, NULL, b->region);
     b->region = r;
     r->buildings = b;
 
@@ -212,7 +212,7 @@ static void test_readwrite_ship(CuTest * tc)
     sh = read_ship(&data);
     CuAssertPtrNotNull(tc, sh);
     CuAssertStrEquals(tc, "Hodor", sh->name);
-    CuAssertPtrEquals(tc, 0, sh->region);
+    CuAssertPtrEquals(tc, NULL, sh->region);
     sh->region = r;
     r->ships = sh;
 
@@ -233,7 +233,7 @@ static void test_readwrite_attrib(CuTest *tc) {
     gamedata_init(&data, &store, RELEASE_VERSION);
     write_attribs(data.store, a, NULL);
     a_removeall(&a, NULL);
-    CuAssertPtrEquals(tc, 0, a);
+    CuAssertPtrEquals(tc, NULL, a);
 
     data.strm.api->rewind(data.strm.handle);
     read_attribs(&data, &a, NULL);
@@ -262,7 +262,7 @@ static void test_readwrite_dead_faction_group(CuTest *tc) {
     f = test_create_faction(NULL);
     fno = f->no;
     CuAssertPtrEquals(tc, f, factions);
-    CuAssertPtrEquals(tc, 0, f->next);
+    CuAssertPtrEquals(tc, NULL, f->next);
     f2 = test_create_faction(NULL);
     CuAssertPtrEquals(tc, f2, factions->next);
     u = test_create_unit(f2, test_create_region(0, 0, NULL));
@@ -281,14 +281,14 @@ static void test_readwrite_dead_faction_group(CuTest *tc) {
     f = f2 = NULL;
     data.strm.api->rewind(data.strm.handle);
     read_game(&data);
-    CuAssertPtrEquals(tc, 0, findfaction(fno));
+    CuAssertPtrEquals(tc, NULL, findfaction(fno));
     f2 = factions;
     CuAssertPtrNotNull(tc, f2);
     u = f2->units;
     CuAssertPtrNotNull(tc, u);
     g = get_group(u);
     CuAssertPtrNotNull(tc, g);
-    CuAssertPtrEquals(tc, 0, g->allies);
+    CuAssertPtrEquals(tc, NULL, g->allies);
     mstream_done(&data.strm);
     gamedata_done(&data);
     test_teardown();
@@ -319,10 +319,10 @@ static void test_readwrite_dead_faction_regionowner(CuTest *tc) {
     mstream_done(&data.strm);
     gamedata_done(&data);
     f = factions;
-    CuAssertPtrEquals(tc, 0, f);
+    CuAssertPtrEquals(tc, NULL, f);
     r = regions;
     CuAssertPtrNotNull(tc, r);
-    CuAssertPtrEquals(tc, 0, region_get_owner(r));
+    CuAssertPtrEquals(tc, NULL, region_get_owner(r));
     test_teardown();
 }
 
@@ -359,7 +359,7 @@ static void test_readwrite_dead_faction_changefaction(CuTest *tc) {
     CuAssertPtrNotNull(tc, r);
     u = r->units;
     CuAssertPtrNotNull(tc, u);
-    CuAssertPtrEquals(tc, 0, a_find(u->attribs, &at_eventhandler));
+    CuAssertPtrEquals(tc, NULL, a_find(u->attribs, &at_eventhandler));
     test_teardown();
 }
 
@@ -396,7 +396,7 @@ static void test_readwrite_dead_faction_createunit(CuTest *tc) {
     CuAssertPtrNotNull(tc, r);
     u = r->units;
     CuAssertPtrNotNull(tc, u);
-    CuAssertPtrEquals(tc, 0, a_find(u->attribs, &at_eventhandler));
+    CuAssertPtrEquals(tc, NULL, a_find(u->attribs, &at_eventhandler));
     test_teardown();
 }
 
diff --git a/src/kernel/ship.test.c b/src/kernel/ship.test.c
index c50fdfa8d..180b558a2 100644
--- a/src/kernel/ship.test.c
+++ b/src/kernel/ship.test.c
@@ -278,7 +278,7 @@ static void test_shipowner_goes_to_same_faction_after_leave(CuTest * tc)
     leave_ship(u3);
     CuAssertPtrEquals(tc, u2, ship_owner(sh));
     leave_ship(u2);
-    CuAssertPtrEquals(tc, 0, ship_owner(sh));
+    CuAssertPtrEquals(tc, NULL, ship_owner(sh));
     test_teardown();
 }
 
@@ -311,7 +311,7 @@ static void test_shipowner_resets_when_empty(CuTest * tc)
     u_set_ship(u, sh);
     CuAssertPtrEquals(tc, u, ship_owner(sh));
     u->number = 0;
-    CuAssertPtrEquals(tc, 0, ship_owner(sh));
+    CuAssertPtrEquals(tc, NULL, ship_owner(sh));
     u->number = 1;
     CuAssertPtrEquals(tc, u, ship_owner(sh));
     test_teardown();
@@ -353,7 +353,7 @@ void test_shipowner_goes_to_empty_unit_after_leave(CuTest * tc)
     leave_ship(u1);
     CuAssertPtrEquals(tc, u3, ship_owner(sh));
     leave_ship(u3);
-    CuAssertPtrEquals(tc, 0, ship_owner(sh));
+    CuAssertPtrEquals(tc, NULL, ship_owner(sh));
     u2->number = 1;
     CuAssertPtrEquals(tc, u2, ship_owner(sh));
     test_teardown();
@@ -365,8 +365,8 @@ static void test_stype_defaults(CuTest *tc) {
     stype = st_get_or_create("hodor");
     CuAssertPtrNotNull(tc, stype);
     CuAssertStrEquals(tc, "hodor", stype->_name);
-    CuAssertPtrEquals(tc, 0, stype->construction);
-    CuAssertPtrEquals(tc, 0, stype->coasts);
+    CuAssertPtrEquals(tc, NULL, stype->construction);
+    CuAssertPtrEquals(tc, NULL, stype->coasts);
     CuAssertDblEquals(tc, 0.0, stype->damage, 0.0);
     CuAssertDblEquals(tc, 1.0, stype->storm, 0.0);
     CuAssertDblEquals(tc, 1.0, stype->tac_bonus, 0.01);
diff --git a/src/kernel/spell.test.c b/src/kernel/spell.test.c
index 622780e20..d7dfbad7e 100644
--- a/src/kernel/spell.test.c
+++ b/src/kernel/spell.test.c
@@ -17,8 +17,8 @@ static void test_create_a_spell(CuTest * tc)
     spell * sp;
 
     test_setup();
-    CuAssertPtrEquals(tc, 0, spells);
-    CuAssertPtrEquals(tc, 0, find_spell("testspell"));
+    CuAssertPtrEquals(tc, NULL, spells);
+    CuAssertPtrEquals(tc, NULL, find_spell("testspell"));
 
     sp = create_spell("testspell");
     CuAssertPtrEquals(tc, sp, find_spell("testspell"));
@@ -37,13 +37,13 @@ static void test_create_duplicate_spell(CuTest * tc)
     test_log_stderr(0); /* suppress the "duplicate spell" error message */
     log = test_log_start(LOG_CPERROR, &sl);
 
-    CuAssertPtrEquals(tc, 0, find_spell("testspell"));
+    CuAssertPtrEquals(tc, NULL, find_spell("testspell"));
 
     sp = create_spell("testspell");
-    CuAssertPtrEquals(tc, 0, create_spell("testspell"));
+    CuAssertPtrEquals(tc, NULL, create_spell("testspell"));
     CuAssertPtrNotNull(tc, sl);
     CuAssertStrEquals(tc, "create_spell: duplicate name '%s'", sl->s);
-    CuAssertPtrEquals(tc, 0, sl->next);
+    CuAssertPtrEquals(tc, NULL, sl->next);
     CuAssertPtrEquals(tc, sp, find_spell("testspell"));
     test_log_stop(log, sl);
     test_log_stderr(1); /* or teardown complains that stderr logging is off */
diff --git a/src/kernel/spellbook.test.c b/src/kernel/spellbook.test.c
index 22ea7c491..d83409797 100644
--- a/src/kernel/spellbook.test.c
+++ b/src/kernel/spellbook.test.c
@@ -25,7 +25,7 @@ void test_named_spellbooks(CuTest * tc)
 
     sb = create_spellbook(0);
     CuAssertPtrNotNull(tc, sb);
-    CuAssertPtrEquals(tc, 0, sb->name);
+    CuAssertPtrEquals(tc, NULL, sb->name);
     spellbook_clear(sb);
     free(sb);
 
diff --git a/src/kernel/types.h b/src/kernel/types.h
index d4f46ae8d..34c50e0a1 100644
--- a/src/kernel/types.h
+++ b/src/kernel/types.h
@@ -55,12 +55,6 @@ struct terrain_type;
 struct unit;
 struct weapon_type;
 
-typedef struct ursprung {
-  struct ursprung *next;
-  int id;
-  int x, y;
-} ursprung;
-
 /* seen_mode: visibility in the report */
 typedef enum {
     seen_none,
diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c
index 29596f866..085e0177a 100644
--- a/src/kernel/unit.test.c
+++ b/src/kernel/unit.test.c
@@ -42,7 +42,7 @@ static void test_remove_empty_units(CuTest *tc) {
     CuAssertPtrNotNull(tc, findunit(uid));
     u->number = 0;
     remove_empty_units();
-    CuAssertPtrEquals(tc, 0, findunit(uid));
+    CuAssertPtrEquals(tc, NULL, findunit(uid));
     test_teardown();
 }
 
@@ -61,9 +61,9 @@ static void test_remove_empty_units_in_region(CuTest *tc) {
     CuAssertPtrNotNull(tc, findunit(uid));
     u->number = 0;
     remove_empty_units_in_region(u->region);
-    CuAssertPtrEquals(tc, 0, findunit(uid));
-    CuAssertPtrEquals(tc, 0, u->nextF);
-    CuAssertPtrEquals(tc, 0, u->region);
+    CuAssertPtrEquals(tc, NULL, findunit(uid));
+    CuAssertPtrEquals(tc, NULL, u->nextF);
+    CuAssertPtrEquals(tc, NULL, u->region);
     test_teardown();
 }
 
@@ -78,7 +78,7 @@ static void test_remove_units_without_faction(CuTest *tc) {
     uid = u->no;
     u_setfaction(u, 0);
     remove_empty_units_in_region(u->region);
-    CuAssertPtrEquals(tc, 0, findunit(uid));
+    CuAssertPtrEquals(tc, NULL, findunit(uid));
     CuAssertIntEquals(tc, 0, u->number);
     test_teardown();
 }
@@ -94,7 +94,7 @@ static void test_remove_units_with_dead_faction(CuTest *tc) {
     uid = u->no;
     u->faction->_alive = false;
     remove_empty_units_in_region(u->region);
-    CuAssertPtrEquals(tc, 0, findunit(uid));
+    CuAssertPtrEquals(tc, NULL, findunit(uid));
     CuAssertIntEquals(tc, 0, u->number);
     test_teardown();
 }
@@ -308,16 +308,16 @@ static void test_inside_building(CuTest *tc) {
 
     b->size = 1;
     scale_number(u, 1);
-    CuAssertPtrEquals(tc, 0, inside_building(u));
+    CuAssertPtrEquals(tc, NULL, inside_building(u));
     u->building = b;
     CuAssertPtrEquals(tc, b, inside_building(u));
     scale_number(u, 2);
-    CuAssertPtrEquals(tc, 0, inside_building(u));
+    CuAssertPtrEquals(tc, NULL, inside_building(u));
     b->size = 2;
     CuAssertPtrEquals(tc, b, inside_building(u));
     u = test_create_unit(u->faction, u->region);
     u->building = b;
-    CuAssertPtrEquals(tc, 0, inside_building(u));
+    CuAssertPtrEquals(tc, NULL, inside_building(u));
     b->size = 3;
     CuAssertPtrEquals(tc, b, inside_building(u));
     test_teardown();
@@ -397,7 +397,7 @@ static void test_unit_description(CuTest *tc) {
     rc = test_create_race("hodor");
     u = test_create_unit(test_create_faction(rc), test_create_region(0, 0, NULL));
 
-    CuAssertPtrEquals(tc, 0, u->display);
+    CuAssertPtrEquals(tc, NULL, u->display);
     CuAssertStrEquals(tc, 0, u_description(u, lang));
     u->display = str_strdup("Hodor");
     CuAssertStrEquals(tc, "Hodor", u_description(u, NULL));
@@ -428,37 +428,37 @@ static void test_remove_unit(CuTest *tc) {
     CuAssertPtrEquals(tc, u1, f->units);
     CuAssertPtrEquals(tc, u2, u1->nextF);
     CuAssertPtrEquals(tc, u1, u2->prevF);
-    CuAssertPtrEquals(tc, 0, u2->nextF);
+    CuAssertPtrEquals(tc, NULL, u2->nextF);
     uno = u1->no;
     region_setresource(r, rtype, 0);
     i_change(&u1->items, rtype->itype, 100);
     remove_unit(&r->units, u1);
     CuAssertIntEquals(tc, 0, u1->number);
-    CuAssertPtrEquals(tc, 0, u1->region);
+    CuAssertPtrEquals(tc, NULL, u1->region);
     /* money is given to a survivor: */
-    CuAssertPtrEquals(tc, 0, u1->items);
+    CuAssertPtrEquals(tc, NULL, u1->items);
     CuAssertIntEquals(tc, 0, region_getresource(r, rtype));
     CuAssertIntEquals(tc, 100, i_get(u2->items, rtype->itype));
 
     /* unit is removed from f->units: */
-    CuAssertPtrEquals(tc, 0, u1->nextF);
+    CuAssertPtrEquals(tc, NULL, u1->nextF);
     CuAssertPtrEquals(tc, u2, f->units);
-    CuAssertPtrEquals(tc, 0, u2->nextF);
-    CuAssertPtrEquals(tc, 0, u2->prevF);
+    CuAssertPtrEquals(tc, NULL, u2->nextF);
+    CuAssertPtrEquals(tc, NULL, u2->prevF);
     /* unit is no longer in r->units: */
     CuAssertPtrEquals(tc, u2, r->units);
-    CuAssertPtrEquals(tc, 0, u2->next);
+    CuAssertPtrEquals(tc, NULL, u2->next);
 
     /* unit is in deleted_units: */
-    CuAssertPtrEquals(tc, 0, findunit(uno));
+    CuAssertPtrEquals(tc, NULL, findunit(uno));
     CuAssertPtrEquals(tc, f, dfindhash(uno));
 
     remove_unit(&r->units, u2);
     /* no survivor, give money to peasants: */
     CuAssertIntEquals(tc, 100, region_getresource(r, rtype));
     /* there are now no more units: */
-    CuAssertPtrEquals(tc, 0, r->units);
-    CuAssertPtrEquals(tc, 0, f->units);
+    CuAssertPtrEquals(tc, NULL, r->units);
+    CuAssertPtrEquals(tc, NULL, f->units);
     test_teardown();
 }
 
diff --git a/src/laws.c b/src/laws.c
index 7e2250a59..4c2a29e4e 100644
--- a/src/laws.c
+++ b/src/laws.c
@@ -2911,7 +2911,7 @@ void maketemp_cmd(unit *u, order **olist)
             order *deford = default_order(u2->faction->locale);
             if (deford) {
                 set_order(&u2->thisorder, NULL);
-                addlist(&u2->orders, deford);
+                unit_addorder(u2, deford);
             }
         }
     }
diff --git a/src/laws.test.c b/src/laws.test.c
index e7951a7ce..fb8929996 100644
--- a/src/laws.test.c
+++ b/src/laws.test.c
@@ -123,8 +123,8 @@ static void test_enter_building(CuTest * tc)
     rc->flags = RCF_SWIM;
     u->building = 0;
     CuAssertIntEquals(tc, 0, enter_building(u, NULL, b->no, false));
-    CuAssertPtrEquals(tc, 0, u->building);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->building);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
 
     CuAssertIntEquals(tc, 0, enter_building(u, NULL, b->no, true));
     CuAssertPtrNotNull(tc, u->faction->msgs);
@@ -164,8 +164,8 @@ static void test_enter_ship(CuTest * tc)
     rc->flags = RCF_SWIM;
     u->ship = 0;
     CuAssertIntEquals(tc, 0, enter_ship(u, NULL, sh->no, false));
-    CuAssertPtrEquals(tc, 0, u->ship);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->ship);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
 
     CuAssertIntEquals(tc, 0, enter_ship(u, NULL, sh->no, true));
     CuAssertPtrNotNull(tc, u->faction->msgs);
@@ -1040,8 +1040,8 @@ static void test_long_order_normal(CuTest *tc) {
     CuAssertIntEquals(tc, 0, fval(u, UFL_MOVED));
     CuAssertIntEquals(tc, 0, fval(u, UFL_LONGACTION));
     CuAssertPtrNotNull(tc, u->orders);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
-    CuAssertPtrEquals(tc, 0, u->old_orders);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->old_orders);
     test_teardown();
 }
 
@@ -1051,9 +1051,9 @@ static void test_long_order_none(CuTest *tc) {
     test_setup();
     u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
     update_long_order(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
-    CuAssertPtrEquals(tc, 0, u->orders);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->orders);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     test_teardown();
 }
 
@@ -1065,9 +1065,9 @@ static void test_long_order_cast(CuTest *tc) {
     unit_addorder(u, create_order(K_CAST, u->faction->locale, NULL));
     unit_addorder(u, create_order(K_CAST, u->faction->locale, NULL));
     update_long_order(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertPtrNotNull(tc, u->orders);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     test_teardown();
 }
 
@@ -1080,9 +1080,9 @@ static void test_long_order_buy_sell(CuTest *tc) {
     unit_addorder(u, create_order(K_SELL, u->faction->locale, NULL));
     unit_addorder(u, create_order(K_SELL, u->faction->locale, NULL));
     update_long_order(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertPtrNotNull(tc, u->orders);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     test_teardown();
 }
 
@@ -1108,7 +1108,7 @@ static void test_long_order_multi_buy(CuTest *tc) {
     unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
     unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
     update_long_order(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertPtrNotNull(tc, u->orders);
     CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "error52"));
     test_teardown();
@@ -1123,9 +1123,9 @@ static void test_long_order_multi_sell(CuTest *tc) {
     unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
     unit_addorder(u, create_order(K_SELL, u->faction->locale, 0));
     update_long_order(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertPtrNotNull(tc, u->orders);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     test_teardown();
 }
 
@@ -1137,7 +1137,7 @@ static void test_long_order_buy_cast(CuTest *tc) {
     unit_addorder(u, create_order(K_BUY, u->faction->locale, 0));
     unit_addorder(u, create_order(K_CAST, u->faction->locale, 0));
     update_long_order(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertPtrNotNull(tc, u->orders);
     CuAssertPtrNotNull(tc, test_find_messagetype(u->faction->msgs, "error52"));
     test_teardown();
@@ -1155,7 +1155,7 @@ static void test_long_order_hungry(CuTest *tc) {
     update_long_order(u);
     CuAssertIntEquals(tc, K_WORK, getkeyword(u->thisorder));
     CuAssertPtrNotNull(tc, u->orders);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     test_teardown();
 }
 
@@ -1167,7 +1167,7 @@ static void test_ally_cmd_errors(CuTest *tc) {
     test_setup();
     u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
     fid = u->faction->no + 1;
-    CuAssertPtrEquals(tc, 0, findfaction(fid));
+    CuAssertPtrEquals(tc, NULL, findfaction(fid));
 
     ord = create_order(K_ALLY, u->faction->locale, itoa36(fid));
     ally_cmd(u, ord);
@@ -1264,25 +1264,25 @@ static void test_ally_cmd(CuTest *tc) {
 
     ord = create_order(K_ALLY, f->locale, "%s", itoa36(f->no));
     ally_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     CuAssertIntEquals(tc, HELP_ALL, alliedfaction(0, u->faction, f, HELP_ALL));
     free_order(ord);
 
     ord = create_order(K_ALLY, f->locale, "%s %s", itoa36(f->no), LOC(f->locale, parameters[P_NOT]));
     ally_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     CuAssertIntEquals(tc, 0, alliedfaction(0, u->faction, f, HELP_ALL));
     free_order(ord);
 
     ord = create_order(K_ALLY, f->locale, "%s %s", itoa36(f->no), LOC(f->locale, parameters[P_GUARD]));
     ally_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     CuAssertIntEquals(tc, HELP_GUARD, alliedfaction(0, u->faction, f, HELP_ALL));
     free_order(ord);
 
     ord = create_order(K_ALLY, f->locale, "%s %s %s", itoa36(f->no), LOC(f->locale, parameters[P_GUARD]), LOC(f->locale, parameters[P_NOT]));
     ally_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, u->faction->msgs);
+    CuAssertPtrEquals(tc, NULL, u->faction->msgs);
     CuAssertIntEquals(tc, 0, alliedfaction(0, u->faction, f, HELP_ALL));
     free_order(ord);
 
@@ -1374,7 +1374,7 @@ static void test_mail_unit_no_msg(CuTest *tc) {
     f = u->faction;
     ord = create_order(K_MAIL, f->locale, "%s %s", LOC(f->locale, parameters[P_UNIT]), itoa36(u->no));
     mail_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "unitmessage"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "unitmessage"));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error30"));
     free_order(ord);
     test_teardown();
@@ -1389,7 +1389,7 @@ static void test_mail_faction_no_msg(CuTest *tc) {
     f = u->faction;
     ord = create_order(K_MAIL, f->locale, "%s %s", LOC(f->locale, parameters[P_FACTION]), itoa36(f->no));
     mail_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "regionmessage"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "regionmessage"));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error30"));
     free_order(ord);
     test_teardown();
@@ -1404,7 +1404,7 @@ static void test_mail_faction_no_target(CuTest *tc) {
     f = u->faction;
     ord = create_order(K_MAIL, f->locale, "%s %s", LOC(f->locale, parameters[P_FACTION]), itoa36(f->no+1));
     mail_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "regionmessage"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "regionmessage"));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error66"));
     free_order(ord);
     test_teardown();
@@ -1419,7 +1419,7 @@ static void test_mail_region_no_msg(CuTest *tc) {
     f = u->faction;
     ord = create_order(K_MAIL, f->locale, LOC(f->locale, parameters[P_REGION]));
     mail_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(u->region->msgs, "mail_result"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(u->region->msgs, "mail_result"));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error30"));
     free_order(ord);
     test_teardown();
@@ -1457,14 +1457,14 @@ static void test_show_without_item(CuTest *tc)
     locale_setstring(loc, "iteminfo::testitem", "testdescription");
 
     reshow_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error21"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error21"));
     CuAssertPtrNotNull(tc, test_find_messagetype(f->msgs, "error36"));
     test_clear_messages(f);
 
     i_add(&(u->items), i_new(itype, 1));
     reshow_cmd(u, ord);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error21"));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "error36"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error21"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "error36"));
     test_clear_messages(f);
 
     free_order(ord);
@@ -1609,7 +1609,7 @@ static void test_demon_hunger(CuTest * tc)
     get_food(r);
 
     CuAssertIntEquals(tc, 20, i_get(u->items, rtype->itype));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "malnourish"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "malnourish"));
 
     config_set("hunger.demon.peasant_tolerance", "0");
 
diff --git a/src/listbox.c b/src/listbox.c
index 4aa00adaf..542ab13e8 100644
--- a/src/listbox.c
+++ b/src/listbox.c
@@ -28,7 +28,7 @@ void
 insert_selection(list_selection ** p_sel, list_selection * prev,
 const char *str, void *payload)
 {
-    list_selection *sel = calloc(sizeof(list_selection), 1);
+    list_selection *sel = (list_selection *)calloc(1, sizeof(list_selection));
     sel->str = str_strdup(str);
     sel->data = payload;
     if (*p_sel) {
@@ -56,7 +56,7 @@ const char *str, void *payload)
 list_selection **push_selection(list_selection ** p_sel, char *str,
     void *payload)
 {
-    list_selection *sel = calloc(sizeof(list_selection), 1);
+    list_selection *sel = (list_selection *)calloc(1, sizeof(list_selection));
     list_selection *prev = NULL;
     sel->str = str;
     sel->data = payload;
diff --git a/src/magic.c b/src/magic.c
index 99a9ecf86..342eb0831 100644
--- a/src/magic.c
+++ b/src/magic.c
@@ -2950,7 +2950,7 @@ void free_spellbook(spellbook *sb) {
     free(sb);
 }
 
-static int free_spellbook_cb(const void *match, const void *key, size_t keylen, void *data) {
+static int free_spellbook_cb(void *match, const void *key, size_t keylen, void *data) {
     const sb_entry *ent = (const sb_entry *)match;
     UNUSED_ARG(data);
     UNUSED_ARG(keylen);
diff --git a/src/magic.test.c b/src/magic.test.c
index 1b64cdf53..9ca9c013e 100644
--- a/src/magic.test.c
+++ b/src/magic.test.c
@@ -45,7 +45,7 @@ void test_updatespells(CuTest * tc)
     CuAssertPtrNotNull(tc, book);
     spellbook_add(book, sp, 1);
 
-    CuAssertPtrEquals(tc, 0, f->spellbook);
+    CuAssertPtrEquals(tc, NULL, f->spellbook);
     pick_random_spells(f, 1, book, 1);
     CuAssertPtrNotNull(tc, f->spellbook);
     CuAssertIntEquals(tc, 1, selist_length(f->spellbook->spells));
@@ -191,7 +191,7 @@ void test_getspell_unit(CuTest * tc)
     sp = create_spell("testspell");
     locale_setstring(lang, mkname("spell", sp->sname), "Herp-a-derp");
 
-    CuAssertPtrEquals(tc, 0, unit_getspell(u, "Herp-a-derp", lang));
+    CuAssertPtrEquals(tc, NULL, unit_getspell(u, "Herp-a-derp", lang));
 
     unit_add_spell(u, 0, sp, 1);
     CuAssertPtrNotNull(tc, unit_getspell(u, "Herp-a-derp", lang));
@@ -220,7 +220,7 @@ void test_getspell_faction(CuTest * tc)
     sp = create_spell("testspell");
     locale_setstring(lang, mkname("spell", sp->sname), "Herp-a-derp");
 
-    CuAssertPtrEquals(tc, 0, unit_getspell(u, "Herp-a-derp", lang));
+    CuAssertPtrEquals(tc, NULL, unit_getspell(u, "Herp-a-derp", lang));
 
     f->spellbook = create_spellbook(0);
     spellbook_add(f->spellbook, sp, 1);
@@ -250,7 +250,7 @@ void test_getspell_school(CuTest * tc)
     sp = create_spell("testspell");
     locale_setstring(lang, mkname("spell", sp->sname), "Herp-a-derp");
 
-    CuAssertPtrEquals(tc, 0, unit_getspell(u, "Herp-a-derp", lang));
+    CuAssertPtrEquals(tc, NULL, unit_getspell(u, "Herp-a-derp", lang));
 
     book = faction_get_spellbook(f);
     CuAssertPtrNotNull(tc, book);
@@ -287,7 +287,7 @@ void test_set_pre_combatspell(CuTest * tc)
     CuAssertIntEquals(tc, 1, get_combatspelllevel(u, index));
     unset_combatspell(u, sp);
     CuAssertIntEquals(tc, 0, get_combatspelllevel(u, index));
-    CuAssertPtrEquals(tc, 0, (spell *)get_combatspell(u, index));
+    CuAssertPtrEquals(tc, NULL, (spell *)get_combatspell(u, index));
     test_teardown();
 }
 
@@ -319,7 +319,7 @@ void test_set_main_combatspell(CuTest * tc)
     CuAssertIntEquals(tc, 1, get_combatspelllevel(u, index));
     unset_combatspell(u, sp);
     CuAssertIntEquals(tc, 0, get_combatspelllevel(u, index));
-    CuAssertPtrEquals(tc, 0, (spell *)get_combatspell(u, index));
+    CuAssertPtrEquals(tc, NULL, (spell *)get_combatspell(u, index));
     test_teardown();
 }
 
@@ -351,7 +351,7 @@ void test_set_post_combatspell(CuTest * tc)
     CuAssertIntEquals(tc, 1, get_combatspelllevel(u, index));
     unset_combatspell(u, sp);
     CuAssertIntEquals(tc, 0, get_combatspelllevel(u, index));
-    CuAssertPtrEquals(tc, 0, (spell *)get_combatspell(u, index));
+    CuAssertPtrEquals(tc, NULL, (spell *)get_combatspell(u, index));
     test_teardown();
 }
 
diff --git a/src/main.c b/src/main.c
index 5bb4ad4ee..118f30afd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -335,6 +335,8 @@ int main(int argc, char **argv)
     game_done();
     lua_done(L);
     log_close();
+    stats_write(stdout, "");
+    stats_close();
     if (d) {
         iniparser_freedict(d);
     }
diff --git a/src/modules/autoseed.c b/src/modules/autoseed.c
index 65585441c..bb31d3f4e 100644
--- a/src/modules/autoseed.c
+++ b/src/modules/autoseed.c
@@ -133,7 +133,7 @@ newfaction *read_newfactions(const char *filename)
         if (nf) {
             continue;
         }
-        nf = calloc(sizeof(newfaction), 1);
+        nf = (newfaction *)calloc(1, sizeof(newfaction));
         if (check_email(email) == 0) {
             nf->email = str_strdup(email);
         } else {
diff --git a/src/monsters.c b/src/monsters.c
index 867d601c6..9f17db54d 100644
--- a/src/monsters.c
+++ b/src/monsters.c
@@ -56,7 +56,6 @@
 #include <util/base36.h>
 #include "util/keyword.h"
 #include "util/language.h"
-#include <util/lists.h>
 #include <util/log.h>
 #include <util/rand.h>
 #include <util/rng.h>
@@ -203,6 +202,7 @@ void monsters_desert(struct faction *monsters)
 int monster_attacks(unit * monster, bool rich_only)
 {
     const race *rc_serpent = get_race(RC_SEASERPENT);
+    int result = -1;
     if (monster->status < ST_AVOID) {
         region *r = monster->region;
         unit *u2;
@@ -220,15 +220,16 @@ int monster_attacks(unit * monster, bool rich_only)
                 if (!rich_only || m > 0) {
                     order *ord = monster_attack(monster, u2);
                     if (ord) {
-                        addlist(&monster->orders, ord);
+                        result = 0;
+                        unit_addorder(monster, ord);
                         money += m;
                     }
                 }
             }
         }
-        return money;
+        return money > 0 ? money : result;
     }
-    return 0;
+    return result;
 }
 
 static order *get_money_for_dragon(region * r, unit * udragon, int wanted)
@@ -249,7 +250,8 @@ static order *get_money_for_dragon(region * r, unit * udragon, int wanted)
      * und holt sich Silber von Einheiten, vorausgesetzt er bewacht bereits */
     money = 0;
     if (attacks && is_guard(udragon)) {
-        money += monster_attacks(udragon, true);
+        int m = monster_attacks(udragon, true);
+        if (m > 0) money += m;
     }
 
     /* falls die einnahmen erreicht werden, bleibt das monster noch eine */
@@ -606,6 +608,7 @@ static void recruit_dracoids(unit * dragon, int size)
     region *r = dragon->region;
     const struct item *weapon = NULL;
     unit *un = create_unit(r, f, size, get_race(RC_DRACOID), 0, NULL, NULL);
+    stats_count("monsters.create.dracoid", 1);
 
     fset(un, UFL_ISNEW | UFL_MOVED);
 
@@ -737,19 +740,12 @@ void plan_monsters(faction * f)
 
     for (r = regions; r; r = r->next) {
         unit *u;
-        bool attacking = false;
-        /* Tiny optimization: Monsters on land only attack randomly when
-        * they are guarding. If nobody is guarding this region (RF_GUARDED),
-        * there can't be any random attacks.
-        */
-        if (!r->land || r->flags & RF_GUARDED) {
-            attacking = chance(attack_chance);
-        }
 
         for (u = r->units; u; u = u->next) {
             const race *rc = u_race(u);
             attrib *ta;
             order *long_order = NULL;
+            bool can_move = true;
 
             /* Ab hier nur noch Befehle f�r NPC-Einheiten. */
             if (u->faction!=f)
@@ -760,16 +756,19 @@ void plan_monsters(faction * f)
                 u->flags &= ~UFL_ANON_FACTION;
             }
 
-            /* Befehle m�ssen jede Runde neu gegeben werden: */
-            free_orders(&u->orders);
             if (skill_enabled(SK_PERCEPTION)) {
                 /* Monster bekommen jede Runde ein paar Tage Wahrnehmung dazu */
                 produceexp(u, SK_PERCEPTION, u->number);
             }
 
-            if (attacking && (!r->land || is_guard(u))) {
-                monster_attacks(u, false);
+            /* Befehle m�ssen jede Runde neu gegeben werden: */
+            free_orders(&u->orders);
+
+            /* All monsters guard the region: */
+            if (u->status < ST_FLEE && !monster_is_waiting(u) && r->land) {
+                unit_addorder(u, create_order(K_GUARD, u->faction->locale, NULL));
             }
+
             /* units with a plan to kill get ATTACK orders (even if they don't guard): */
             ta = a_find(u->attribs, &at_hate);
             if (ta && !monster_is_waiting(u)) {
@@ -777,7 +776,8 @@ void plan_monsters(faction * f)
                 if (tu && tu->region == r) {
                     order * ord = monster_attack(u, tu);
                     if (ord) {
-                        addlist(&u->orders, ord);
+                        unit_addorder(u, ord);
+                        can_move = false;
                     }
                 }
                 else if (tu) {
@@ -786,17 +786,22 @@ void plan_monsters(faction * f)
                         allowed = allowed_fly;
                     }
                     long_order = plan_move_to_target(u, tu->region, 2, allowed);
+                    can_move = false;
                 }
                 else
                     a_remove(&u->attribs, ta);
             }
-            /* All monsters guard the region: */
-            if (u->status < ST_FLEE && !monster_is_waiting(u) && r->land) {
-                addlist(&u->orders, create_order(K_GUARD, u->faction->locale, NULL));
+            else if (!r->land || is_guard(u)) {
+                if (chance(attack_chance)) {
+                    int m = monster_attacks(u, false);
+                    if (m >= 0) {
+                        can_move = false;
+                    }
+                }
             }
 
             /* Einheiten mit Bewegungsplan kriegen ein NACH: */
-            if (long_order == NULL) {
+            if (can_move && long_order == NULL) {
                 ta = a_find(u->attribs, &at_targetregion);
                 if (ta) {
                     if (u->region == (region *)ta->data.v) {
@@ -817,7 +822,7 @@ void plan_monsters(faction * f)
                     long_order = plan_dragon(u);
                 }
                 else {
-                    if (rc == get_race(RC_SEASERPENT)) {
+                    if (can_move && rc == get_race(RC_SEASERPENT)) {
                         long_order = create_order(K_PIRACY, f->locale, NULL);
                     }
                     else {
@@ -827,6 +832,7 @@ void plan_monsters(faction * f)
                     }
                 }
             }
+
             if (long_order == NULL && unit_can_study(u)) {
                 /* Einheiten, die Waffenlosen Kampf lernen k�nnten, lernen es um
                 * zu bewachen: */
@@ -840,7 +846,7 @@ void plan_monsters(faction * f)
             }
 
             if (long_order) {
-                addlist(&u->orders, long_order);
+                unit_addorder(u, long_order);
             }
         }
     }
@@ -863,6 +869,7 @@ static int nrand(int handle_start, int sub)
 
 unit *spawn_seaserpent(region *r, faction *f) {
     unit *u = create_unit(r, f, 1, get_race(RC_SEASERPENT), 0, NULL, NULL);
+    stats_count("monsters.create.seaserpent", 1);
     fset(u, UFL_ISNEW | UFL_MOVED);
     equip_unit(u, "seed_seaserpent");
     return u;
@@ -903,6 +910,7 @@ void spawn_dragons(void)
             else {
                 u = create_unit(r, monsters, nrand(30, 20) + 1, get_race(RC_DRAGON), 0, NULL, NULL);
             }
+            stats_count("monsters.create.dragon", 1);
             fset(u, UFL_ISNEW | UFL_MOVED);
             equip_unit(u, "seed_dragon");
 
@@ -935,7 +943,7 @@ void spawn_undead(void)
         }
 
         if (r->land && unburied > rpeasants(r) / 20
-            && rng_int() % 10000 < 200) {
+            && rng_int() % 10000 < 100) {
             message *msg;
             unit *u;
             /* es ist sinnfrei, wenn irgendwo im Wald 3er-Einheiten Untote entstehen.
@@ -963,6 +971,7 @@ void spawn_undead(void)
             }
 
             u = create_unit(r, monsters, undead, rc, 0, NULL, NULL);
+            stats_count("monsters.create.undead", 1);
             fset(u, UFL_ISNEW | UFL_MOVED);
             if ((rc == get_race(RC_SKELETON) || rc == get_race(RC_ZOMBIE))
                 && rng_int() % 10 < 4) {
diff --git a/src/monsters.test.c b/src/monsters.test.c
index 4ea3a32a3..75a2cbc97 100644
--- a/src/monsters.test.c
+++ b/src/monsters.test.c
@@ -123,7 +123,7 @@ static void test_monsters_waiting(CuTest * tc)
     setguard(m, true);
     fset(m, UFL_ISNEW);
     monster_attacks(m, false);
-    CuAssertPtrEquals(tc, 0, find_order("attack 1", m));
+    CuAssertPtrEquals(tc, NULL, find_order("attack 1", m));
     test_teardown();
 }
 
@@ -173,7 +173,7 @@ static void test_monsters_attack_not(CuTest * tc)
 
     plan_monsters(m->faction);
 
-    CuAssertPtrEquals(tc, 0, find_order("attack 1", m));
+    CuAssertPtrEquals(tc, NULL, find_order("attack 1", m));
     test_teardown();
 }
 
diff --git a/src/move.test.c b/src/move.test.c
index e782bb748..a4a65fead 100644
--- a/src/move.test.c
+++ b/src/move.test.c
@@ -225,16 +225,16 @@ static void test_ship_trails(CuTest *tc) {
     move_ship(sh, r1, r3, NULL);
     CuAssertPtrEquals(tc, r3, sh->region);
     CuAssertPtrEquals(tc, sh, r3->ships);
-    CuAssertPtrEquals(tc, 0, r1->ships);
-    CuAssertPtrEquals(tc, 0, a_find(r1->attribs, &at_shiptrail));
-    CuAssertPtrEquals(tc, 0, a_find(r3->attribs, &at_shiptrail));
+    CuAssertPtrEquals(tc, NULL, r1->ships);
+    CuAssertPtrEquals(tc, NULL, a_find(r1->attribs, &at_shiptrail));
+    CuAssertPtrEquals(tc, NULL, a_find(r3->attribs, &at_shiptrail));
     add_regionlist(&route, r3);
     add_regionlist(&route, r2);
     move_ship(sh, r3, r1, route);
     CuAssertPtrEquals(tc, r1, sh->region);
     CuAssertPtrEquals(tc, sh, r1->ships);
-    CuAssertPtrEquals(tc, 0, r3->ships);
-    CuAssertPtrEquals(tc, 0, a_find(r1->attribs, &at_shiptrail));
+    CuAssertPtrEquals(tc, NULL, r3->ships);
+    CuAssertPtrEquals(tc, NULL, a_find(r1->attribs, &at_shiptrail));
     CuAssertPtrNotNull(tc, a_find(r2->attribs, &at_shiptrail));
     CuAssertPtrNotNull(tc, a_find(r3->attribs, &at_shiptrail));
     free_regionlist(route);
@@ -258,7 +258,7 @@ static void test_age_trails(CuTest *tc) {
     a_age(&r1->attribs, r1);
     CuAssertPtrNotNull(tc, r1->attribs);
     a_age(&r1->attribs, r1);
-    CuAssertPtrEquals(tc, 0, r1->attribs);
+    CuAssertPtrEquals(tc, NULL, r1->attribs);
     free_regionlist(route);
     test_teardown();
 }
@@ -323,7 +323,7 @@ static void test_ship_empty(CuTest *tc) {
     movement();
     CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
     CuAssertIntEquals(tc, 2, ship_damage_percent(fix.sh));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(fix.f->msgs, "ship_drift"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
 
     test_teardown();
 }
@@ -340,7 +340,7 @@ static void test_no_drift_damage(CuTest *tc) {
     movement();
     CuAssertPtrEquals(tc, fix.sh->region, findregion(0, 0));
     CuAssertIntEquals(tc, 0, ship_damage_percent(fix.sh));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(fix.f->msgs, "ship_drift"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "ship_drift"));
 
     test_teardown();
 }
@@ -386,7 +386,7 @@ static void test_ship_no_real_overload(CuTest *tc) {
     movement();
     CuAssertPtrEquals(tc, fix.u->region, findregion(0, 0));
     CuAssertIntEquals(tc, 82, ship_damage_percent(fix.sh));
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(fix.f->msgs, "massive_overload"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(fix.f->msgs, "massive_overload"));
 
     test_teardown();
 }
@@ -431,7 +431,7 @@ static void test_ship_ridiculous_overload_bad(CuTest *tc) {
     movement();
     CuAssertTrue(tc, ship_damage_percent(fix.sh) > 99);
     CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "massive_overload"));
-    CuAssertPtrEquals(tc, 0, fix.sh->region);
+    CuAssertPtrEquals(tc, NULL, fix.sh->region);
     CuAssertPtrNotNull(tc, test_find_messagetype(fix.f->msgs, "shipsink"));
     test_teardown();
 }
diff --git a/src/orderdb.c b/src/orderdb.c
index 42248c0ef..5c224a79e 100644
--- a/src/orderdb.c
+++ b/src/orderdb.c
@@ -16,7 +16,6 @@
 void orderdb_open(void)
 {
     const char *dbname;
-
     dbname = config_get("game.dbswap");
     db_driver_open(DB_SWAP, dbname);
 }
diff --git a/src/piracy.test.c b/src/piracy.test.c
index 096e267b7..7aa57bc2d 100644
--- a/src/piracy.test.c
+++ b/src/piracy.test.c
@@ -106,7 +106,7 @@ static void test_piracy_cmd(CuTest * tc) {
     u->thisorder = create_order(K_PIRACY, f->locale, "%s", itoa36(u2->faction->no));
 
     piracy_cmd(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertTrue(tc, u->region != r);
     CuAssertPtrEquals(tc, u2->region, u->region);
     CuAssertPtrEquals(tc, u2->region, u->ship->region);
@@ -211,7 +211,7 @@ static void test_piracy_cmd_land_to_land(CuTest * tc) {
     u->thisorder = create_order(K_PIRACY, f->locale, "%s", itoa36(target));
 
     piracy_cmd(u);
-    CuAssertPtrEquals(tc, 0, u->thisorder);
+    CuAssertPtrEquals(tc, NULL, u->thisorder);
     CuAssertPtrEquals(tc, r, u->region);
 
     test_teardown();
@@ -226,7 +226,7 @@ static void test_piracy_cmd_swimmer(CuTest * tc) {
     r = pirate->region;
 
     piracy_cmd(pirate);
-    CuAssertPtrEquals(tc, 0, pirate->thisorder);
+    CuAssertPtrEquals(tc, NULL, pirate->thisorder);
     CuAssertTrue(tc, pirate->region != r);
     CuAssertPtrEquals(tc, victim->region, pirate->region);
     CuAssertPtrNotNullMsg(tc, "successful PIRACY message", test_find_messagetype(pirate->faction->msgs, "piratesawvictim"));
diff --git a/src/prefix.test.c b/src/prefix.test.c
index f131813d7..e95f0c281 100644
--- a/src/prefix.test.c
+++ b/src/prefix.test.c
@@ -11,17 +11,17 @@
 
 static void test_add_prefix(CuTest *tc) {
     test_setup();
-    CuAssertPtrEquals(tc, 0, race_prefixes);
+    CuAssertPtrEquals(tc, NULL, race_prefixes);
     CuAssertIntEquals(tc, 0, add_raceprefix("sea"));
     CuAssertPtrNotNull(tc, race_prefixes);
     CuAssertStrEquals(tc, "sea", race_prefixes[0]);
-    CuAssertPtrEquals(tc, 0, race_prefixes[1]);
+    CuAssertPtrEquals(tc, NULL, race_prefixes[1]);
     CuAssertIntEquals(tc, 0, add_raceprefix("moon"));
     CuAssertStrEquals(tc, "sea", race_prefixes[0]);
     CuAssertStrEquals(tc, "moon", race_prefixes[1]);
-    CuAssertPtrEquals(tc, 0, race_prefixes[2]);
+    CuAssertPtrEquals(tc, NULL, race_prefixes[2]);
     free_prefixes();
-    CuAssertPtrEquals(tc, 0, race_prefixes);
+    CuAssertPtrEquals(tc, NULL, race_prefixes);
     test_teardown();
 }
 
diff --git a/src/report.c b/src/report.c
index 1d40941c4..abad4c4fb 100644
--- a/src/report.c
+++ b/src/report.c
@@ -873,6 +873,8 @@ bool see_border(const connection * b, const faction * f, const region * r)
     return cs;
 }
 
+#define MAX_EDGES 16
+
 void report_region(struct stream *out, const region * r, faction * f)
 {
     int n;
@@ -883,13 +885,13 @@ void report_region(struct stream *out, const region * r, faction * f)
     attrib *a;
     const char *tname;
     struct edge {
-        struct edge *next;
         char *name;
         bool transparent;
         bool block;
         bool exist[MAXDIRECTIONS];
         direction_t lastd;
-    } *edges = NULL, *e;
+    } edges[MAX_EDGES];
+    int ne = 0;
     bool see[MAXDIRECTIONS];
     char buf[8192];
     char *bufp = buf;
@@ -908,7 +910,8 @@ void report_region(struct stream *out, const region * r, faction * f)
         if (!r2)
             continue;
         for (b = get_borders(r, r2); b;) {
-            struct edge *edg = edges;
+            int e;
+            struct edge *match = NULL;
             bool transparent = b->type->transparent(b, f);
             const char *name = border_name(b, r, f, GF_DETAILED | GF_ARTICLE);
 
@@ -919,18 +922,22 @@ void report_region(struct stream *out, const region * r, faction * f)
                 b = b->next;
                 continue;
             }
-            while (edg && (edg->transparent != transparent || strcmp(name, edg->name)!=0)) {
-                edg = edg->next;
+            for (e = 0; e!=ne; ++e) {
+                struct edge *edg = edges + e;
+                if (edg->transparent == transparent && 0 == strcmp(name, edg->name)) {
+                    match = edg;
+                    break;
+                }
             }
-            if (!edg) {
-                edg = calloc(sizeof(struct edge), 1);
-                edg->name = str_strdup(name);
-                edg->transparent = transparent;
-                edg->next = edges;
-                edges = edg;
+            if (match == NULL) {
+                match = edges + ne;
+                match->name = str_strdup(name);
+                match->transparent = transparent;
+                ++ne;
+                assert(ne < MAX_EDGES);
             }
-            edg->lastd = d;
-            edg->exist[d] = true;
+            match->lastd = d;
+            match->exist[d] = true;
             b = b->next;
         }
     }
@@ -1227,27 +1234,22 @@ void report_region(struct stream *out, const region * r, faction * f)
     nr_curses(out, 0, f, TYP_REGION, r);
     n = 0;
 
-    if (edges)
+    if (ne > 0) {
+        int e;
         newline(out);
-    for (e = edges; e; e = e->next) {
-        message *msg;
+        for (e = 0; e != ne; ++e) {
+            message *msg;
 
-        for (d = 0; d != MAXDIRECTIONS; ++d) {
-            if (e->exist[d]) {
-                msg = msg_message(e->transparent ? "nr_border_transparent" : "nr_border_opaque",
-                    "object dir", e->name, d);
-                nr_render(msg, f->locale, buf, sizeof(buf), f);
-                msg_release(msg);
-                paragraph(out, buf, 0, 0, 0);
+            for (d = 0; d != MAXDIRECTIONS; ++d) {
+                if (edges[e].exist[d]) {
+                    msg = msg_message(edges[e].transparent ? "nr_border_transparent" : "nr_border_opaque",
+                        "object dir", edges[e].name, d);
+                    nr_render(msg, f->locale, buf, sizeof(buf), f);
+                    msg_release(msg);
+                    paragraph(out, buf, 0, 0, 0);
+                }
             }
-        }
-    }
-    if (edges) {
-        while (edges) {
-            e = edges->next;
-            free(edges->name);
-            free(edges);
-            edges = e;
+            free(edges[e].name);
         }
     }
 }
@@ -1512,93 +1514,78 @@ static void
 show_allies(const faction * f, const ally * allies, char *buf, size_t size)
 {
     int allierte = 0;
-    int i = 0, h, hh = 0;
-    int bytes, dh = 0;
+    int i = 0, h, hh = 0, dh = 0;
     const ally *sf;
-    char *bufp = buf;             /* buf already contains data */
-
-    --size;                       /* leave room for a null-terminator */
-
+   
     for (sf = allies; sf; sf = sf->next) {
         int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
-        if (mode > 0)
+        if (mode > 0) {
             ++allierte;
+        }
     }
 
-    for (sf = allies; sf; sf = sf->next) {
-        int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
-        if (mode <= 0)
-            continue;
-        i++;
-        if (dh) {
-            if (i == allierte) {
-                bytes = (int)str_strlcpy(bufp, LOC(f->locale, "list_and"), size);
+    if (allierte > 0) {
+        sbstring sbs;
+        sbs_init(&sbs, buf, size);
+
+        for (sf = allies; sf; sf = sf->next) {
+            int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL);
+            if (mode <= 0)
+                continue;
+            i++;
+            if (dh) {
+                if (i == allierte) {
+                    sbs_strcat(&sbs, LOC(f->locale, "list_and"));
+                }
+                else {
+                    sbs_strcat(&sbs, ", ");
+                }
+            }
+            dh = 1;
+            hh = 0;
+            sbs_strcat(&sbs, factionname(sf->faction));
+            sbs_strcat(&sbs, " (");
+            if ((mode & HELP_ALL) == HELP_ALL) {
+                sbs_strcat(&sbs, LOC(f->locale, parameters[P_ANY]));
             }
             else {
-                bytes = (int)str_strlcpy(bufp, ", ", size);
-            }
-            if (wrptr(&bufp, &size, bytes) != 0)
-                WARN_STATIC_BUFFER();
-        }
-        dh = 1;
-        hh = 0;
-        bytes = (int)str_strlcpy(bufp, factionname(sf->faction), size);
-        if (wrptr(&bufp, &size, bytes) != 0)
-            WARN_STATIC_BUFFER();
-        bytes = (int)str_strlcpy(bufp, " (", size);
-        if (wrptr(&bufp, &size, bytes) != 0)
-            WARN_STATIC_BUFFER();
-        if ((mode & HELP_ALL) == HELP_ALL) {
-            bytes = (int)str_strlcpy(bufp, LOC(f->locale, parameters[P_ANY]), size);
-            if (wrptr(&bufp, &size, bytes) != 0)
-                WARN_STATIC_BUFFER();
-        }
-        else {
-            for (h = 1; h <= HELP_TRAVEL; h *= 2) {
-                int p = MAXPARAMS;
-                if ((mode & h) == h) {
-                    switch (h) {
-                    case HELP_TRAVEL:
-                        p = P_TRAVEL;
-                        break;
-                    case HELP_MONEY:
-                        p = P_MONEY;
-                        break;
-                    case HELP_FIGHT:
-                        p = P_FIGHT;
-                        break;
-                    case HELP_GIVE:
-                        p = P_GIVE;
-                        break;
-                    case HELP_GUARD:
-                        p = P_GUARD;
-                        break;
-                    case HELP_FSTEALTH:
-                        p = P_FACTIONSTEALTH;
-                        break;
+                for (h = 1; h <= HELP_TRAVEL; h *= 2) {
+                    int p = MAXPARAMS;
+                    if ((mode & h) == h) {
+                        switch (h) {
+                        case HELP_TRAVEL:
+                            p = P_TRAVEL;
+                            break;
+                        case HELP_MONEY:
+                            p = P_MONEY;
+                            break;
+                        case HELP_FIGHT:
+                            p = P_FIGHT;
+                            break;
+                        case HELP_GIVE:
+                            p = P_GIVE;
+                            break;
+                        case HELP_GUARD:
+                            p = P_GUARD;
+                            break;
+                        case HELP_FSTEALTH:
+                            p = P_FACTIONSTEALTH;
+                            break;
+                        }
+                    }
+                    if (p != MAXPARAMS) {
+                        if (hh) {
+                            sbs_strcat(&sbs, ", ");
+                        }
+                        sbs_strcat(&sbs, LOC(f->locale, parameters[p]));
+                        hh = 1;
                     }
                 }
-                if (p != MAXPARAMS) {
-                    if (hh) {
-                        bytes = (int)str_strlcpy(bufp, ", ", size);
-                        if (wrptr(&bufp, &size, bytes) != 0)
-                            WARN_STATIC_BUFFER();
-                    }
-                    bytes = (int)str_strlcpy(bufp, LOC(f->locale, parameters[p]), size);
-                    if (wrptr(&bufp, &size, bytes) != 0)
-                        WARN_STATIC_BUFFER();
-                    hh = 1;
-                }
             }
+            sbs_strcat(&sbs, ")");
         }
-        bytes = (int)str_strlcpy(bufp, ")", size);
-        if (wrptr(&bufp, &size, bytes) != 0)
-            WARN_STATIC_BUFFER();
+        sbs_strcat(&sbs, ".");
     }
-    bytes = (int)str_strlcpy(bufp, ".", size);
-    if (wrptr(&bufp, &size, bytes) != 0)
-        WARN_STATIC_BUFFER();
-    *bufp = 0;
 }
 
 static void allies(struct stream *out, const faction * f)
diff --git a/src/reports.test.c b/src/reports.test.c
index 0f5ca6b1f..d402b2b6a 100644
--- a/src/reports.test.c
+++ b/src/reports.test.c
@@ -76,7 +76,7 @@ static void test_reorder_units(CuTest * tc)
     CuAssertPtrEquals(tc, u2, u3->next);
     CuAssertPtrEquals(tc, u1, u2->next);
     CuAssertPtrEquals(tc, u0, u1->next);
-    CuAssertPtrEquals(tc, 0, u0->next);
+    CuAssertPtrEquals(tc, NULL, u0->next);
     test_teardown();
 }
 
@@ -130,19 +130,19 @@ static void test_sparagraph(CuTest *tc) {
     split_paragraph(&sp, "Hello World", 0, 16, 0);
     CuAssertPtrNotNull(tc, sp);
     CuAssertStrEquals(tc, "Hello World", sp->s);
-    CuAssertPtrEquals(tc, 0, sp->next);
+    CuAssertPtrEquals(tc, NULL, sp->next);
     freestrlist(sp);
 
     split_paragraph(&sp, "Hello World", 4, 16, 0);
     CuAssertPtrNotNull(tc, sp);
     CuAssertStrEquals(tc, "    Hello World", sp->s);
-    CuAssertPtrEquals(tc, 0, sp->next);
+    CuAssertPtrEquals(tc, NULL, sp->next);
     freestrlist(sp);
 
     split_paragraph(&sp, "Hello World", 4, 16, '*');
     CuAssertPtrNotNull(tc, sp);
     CuAssertStrEquals(tc, "  * Hello World", sp->s);
-    CuAssertPtrEquals(tc, 0, sp->next);
+    CuAssertPtrEquals(tc, NULL, sp->next);
     freestrlist(sp);
 
     split_paragraph(&sp, "12345678 90 12345678", 0, 8, '*');
@@ -152,7 +152,7 @@ static void test_sparagraph(CuTest *tc) {
     CuAssertStrEquals(tc, "90", sp->next->s);
     CuAssertPtrNotNull(tc, sp->next->next);
     CuAssertStrEquals(tc, "12345678", sp->next->next->s);
-    CuAssertPtrEquals(tc, 0, sp->next->next->next);
+    CuAssertPtrEquals(tc, NULL, sp->next->next->next);
     freestrlist(sp);
 }
 
@@ -326,7 +326,7 @@ static void test_arg_resources(CuTest *tc) {
     CuAssertPtrNotNull(tc, res = res->next);
     CuAssertPtrEquals(tc, itype->rtype, (void *)res->type);
     CuAssertIntEquals(tc, 5, res->number);
-    CuAssertPtrEquals(tc, 0, res->next);
+    CuAssertPtrEquals(tc, NULL, res->next);
     atype->release(v2);
     test_teardown();
 }
@@ -340,7 +340,7 @@ static void test_newbie_password_message(CuTest *tc) {
     f->flags = 0;
     prepare_report(&ctx, f);
     CuAssertIntEquals(tc, 0, f->flags&FFL_PWMSG);
-    CuAssertPtrEquals(tc, 0, test_find_messagetype(f->msgs, "changepasswd"));
+    CuAssertPtrEquals(tc, NULL, test_find_messagetype(f->msgs, "changepasswd"));
     f->age=2;
     prepare_report(&ctx, f);
     CuAssertIntEquals(tc, FFL_PWMSG, f->flags&FFL_PWMSG);
@@ -511,7 +511,7 @@ void test_prepare_lighthouse_capacity(CuTest *tc) {
 
     prepare_report(&ctx, u2->faction);
     CuAssertPtrEquals(tc, r1, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_unit, r1->seen.mode);
     CuAssertIntEquals(tc, seen_neighbour, r2->seen.mode);
     finish_reports(&ctx);
@@ -520,7 +520,7 @@ void test_prepare_lighthouse_capacity(CuTest *tc) {
     config_set_int("rules.lighthouse.unit_capacity", 1);
     prepare_report(&ctx, u2->faction);
     CuAssertPtrEquals(tc, r1, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_unit, r1->seen.mode);
     CuAssertIntEquals(tc, seen_lighthouse, r2->seen.mode);
     finish_reports(&ctx);
@@ -619,15 +619,15 @@ static void test_prepare_report(CuTest *tc) {
     r = test_create_region(0, 0, NULL);
 
     prepare_report(&ctx, f);
-    CuAssertPtrEquals(tc, 0, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.first);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_none, r->seen.mode);
     finish_reports(&ctx);
 
     test_create_unit(f, r);
     prepare_report(&ctx, f);
     CuAssertPtrEquals(tc, r, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_unit, r->seen.mode);
     finish_reports(&ctx);
     CuAssertIntEquals(tc, seen_none, r->seen.mode);
@@ -655,7 +655,7 @@ static void test_seen_neighbours(CuTest *tc) {
     test_create_unit(f, r1);
     prepare_report(&ctx, f);
     CuAssertPtrEquals(tc, r1, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_unit, r1->seen.mode);
     CuAssertIntEquals(tc, seen_neighbour, r2->seen.mode);
     finish_reports(&ctx);
@@ -682,7 +682,7 @@ static void test_seen_travelthru(CuTest *tc) {
     CuAssertPtrEquals(tc, r3, f->last);
     prepare_report(&ctx, f);
     CuAssertPtrEquals(tc, r1, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_unit, r1->seen.mode);
     CuAssertIntEquals(tc, seen_travel, r2->seen.mode);
     CuAssertIntEquals(tc, seen_neighbour, r3->seen.mode);
@@ -760,7 +760,7 @@ static void test_report_far_vision(CuTest *tc) {
     report_context ctx;
     prepare_report(&ctx, f);
     CuAssertPtrEquals(tc, r1, ctx.first);
-    CuAssertPtrEquals(tc, 0, ctx.last);
+    CuAssertPtrEquals(tc, NULL, ctx.last);
     CuAssertIntEquals(tc, seen_unit, r1->seen.mode);
     CuAssertIntEquals(tc, seen_spell, r2->seen.mode);
     finish_reports(&ctx);
diff --git a/src/spells.c b/src/spells.c
index 00f256f26..dadce89c6 100644
--- a/src/spells.c
+++ b/src/spells.c
@@ -2348,7 +2348,7 @@ void patzer_peasantmob(const castorder * co)
             create_unit(r, f, n, get_race(RC_PEASANT), 0, LOC(f->locale, "angry_mob"),
                 NULL);
         fset(u, UFL_ISNEW);
-        addlist(&u->orders, create_order(K_GUARD, lang, NULL));
+        unit_addorder(u, create_order(K_GUARD, lang, NULL));
         set_order(&u->thisorder, default_order(lang));
         a = a_new(&at_unitdissolve);
         a->data.ca[0] = 1;          /* An rpeasants(r). */
diff --git a/src/spells/borders.c b/src/spells/borders.c
index 5d99b1307..c0e51a9b1 100644
--- a/src/spells/borders.c
+++ b/src/spells/borders.c
@@ -79,7 +79,7 @@ const curse_type ct_firewall = {
 
 static void wall_init(connection * b)
 {
-    wall_data *fd = (wall_data *)calloc(sizeof(wall_data), 1);
+    wall_data *fd = (wall_data *)calloc(1, sizeof(wall_data));
     fd->countdown = -1;           /* infinite */
     b->data.v = fd;
 }
diff --git a/src/spells/combatspells.c b/src/spells/combatspells.c
index 6d6b846c3..c088dde07 100644
--- a/src/spells/combatspells.c
+++ b/src/spells/combatspells.c
@@ -956,7 +956,7 @@ int sp_hero(struct castorder * co)
 
         if (df) {
             if (!(df->person[dt.index].flags & FL_COURAGE)) {
-                df->person[dt.index].defence += df_bonus;
+                df->person[dt.index].defense += df_bonus;
                 df->person[dt.index].flags = df->person[dt.index].flags | FL_COURAGE;
                 targets++;
                 --force;
@@ -1005,7 +1005,7 @@ int sp_berserk(struct castorder * co)
         if (df) {
             if (!(df->person[dt.index].flags & FL_COURAGE)) {
                 df->person[dt.index].attack += at_bonus;
-                df->person[dt.index].defence -= df_malus;
+                df->person[dt.index].defense -= df_malus;
                 df->person[dt.index].flags = df->person[dt.index].flags | FL_COURAGE;
                 targets++;
                 --force;
@@ -1064,7 +1064,7 @@ int sp_frighten(struct castorder * co)
         }
         if (!is_magic_resistant(mage, df->unit, 0)) {
             df->person[dt.index].attack -= at_malus;
-            df->person[dt.index].defence -= df_malus;
+            df->person[dt.index].defense -= df_malus;
             targets++;
         }
         --force;
@@ -1109,7 +1109,7 @@ int sp_tiredsoldiers(struct castorder * co)
         if (!(df->person[t.index].flags & FL_TIRED)) {
             if (!is_magic_resistant(mage, df->unit, 0)) {
                 df->person[t.index].flags = df->person[t.index].flags | FL_TIRED;
-                df->person[t.index].defence -= 2;
+                df->person[t.index].defense -= 2;
                 ++n;
             }
         }
diff --git a/src/spy.test.c b/src/spy.test.c
index d1f616fab..e5a7ec628 100644
--- a/src/spy.test.c
+++ b/src/spy.test.c
@@ -272,7 +272,7 @@ static void test_sabotage_other_success(CuTest *tc) {
     assert(ord);
     set_level(u2, SK_SPY, 1);
     CuAssertIntEquals(tc, 0, sabotage_cmd(u2, ord));
-    CuAssertPtrEquals(tc, 0, r->ships);
+    CuAssertPtrEquals(tc, NULL, r->ships);
     free_order(ord);
     test_teardown();
 }
diff --git a/src/teleport.c b/src/teleport.c
index 36634c5cd..2d8fafe72 100644
--- a/src/teleport.c
+++ b/src/teleport.c
@@ -182,6 +182,7 @@ void spawn_braineaters(float chance)
             u = create_unit(r, f, 1 + rng_int() % 10 + rng_int() % 10,
                 rc_brain, 0, NULL, NULL);
             equip_unit(u, "seed_braineater");
+            stats_count("monsters.create.braineater", 1);
 
             next = rng_int() % (int)(chance * 100);
         }
diff --git a/src/test_eressea.c b/src/test_eressea.c
index 9897c4bf0..2b36d4e03 100644
--- a/src/test_eressea.c
+++ b/src/test_eressea.c
@@ -175,6 +175,8 @@ int RunAllTests(int argc, char *argv[])
         fail_count = summary->failCount;
         CuSuiteDelete(summary);
         game_done();
+        log_close();
+        stats_close();
         return fail_count;
     }
     return 0;
diff --git a/src/tests.c b/src/tests.c
index cad296e57..3a8c9e095 100644
--- a/src/tests.c
+++ b/src/tests.c
@@ -234,6 +234,8 @@ static void test_reset(void) {
     default_locale = 0;
     calendar_cleanup();
     close_orders();
+    log_close();
+    stats_close();
     free_special_directions();
     free_locales();
     free_spells();
diff --git a/src/tests.test.c b/src/tests.test.c
index 067772262..885d834e8 100644
--- a/src/tests.test.c
+++ b/src/tests.test.c
@@ -23,13 +23,13 @@ static void test_resources(CuTest *tc) {
     CuAssertPtrNotNull(tc, rt_find("permaura"));
     CuAssertPtrEquals(tc, rt_find("permaura"), (void *)get_resourcetype(R_PERMAURA));
 
-    CuAssertPtrEquals(tc, 0, rt_find("stone"));
+    CuAssertPtrEquals(tc, NULL, rt_find("stone"));
     rtype = rt_get_or_create("stone");
     CuAssertPtrEquals(tc, (void *)rtype, (void *)rt_find("stone"));
     CuAssertPtrEquals(tc, (void *)rtype, (void *)get_resourcetype(R_STONE));
     free_resources();
-    CuAssertPtrEquals(tc, 0, rt_find("stone"));
-    CuAssertPtrEquals(tc, 0, rt_find("peasant"));
+    CuAssertPtrEquals(tc, NULL, rt_find("stone"));
+    CuAssertPtrEquals(tc, NULL, rt_find("peasant"));
     rtype = rt_get_or_create("stone");
     CuAssertPtrEquals(tc, (void *)rtype, (void *)get_resourcetype(R_STONE));
     test_teardown();
diff --git a/src/util/base36.h b/src/util/base36.h
index 05c81d2c0..33f0d2f08 100644
--- a/src/util/base36.h
+++ b/src/util/base36.h
@@ -31,6 +31,7 @@ extern "C" {
     const char *itoa36(int i);
     const char *itoa10(int i);
     extern int atoi36(const char *s);
+    extern int atoi10(const char *s);
     int i10toi36(int i);
 
 #ifdef __cplusplus
diff --git a/src/util/crypto/crypt_blowfish/crypt_blowfish.c b/src/util/crypto/crypt_blowfish/crypt_blowfish.c
index b0b11d3ad..701ddddf0 100644
--- a/src/util/crypto/crypt_blowfish/crypt_blowfish.c
+++ b/src/util/crypto/crypt_blowfish/crypt_blowfish.c
@@ -53,10 +53,7 @@
 /* Just to make sure the prototypes match the actual definitions */
 #include "crypt_blowfish.h"
 
-#ifdef __i386__
-#define BF_ASM				1
-#define BF_SCALE			1
-#elif defined(__x86_64__) || defined(__alpha__) || defined(__hppa__)
+#if defined(__x86_64__) || defined(__alpha__) || defined(__hppa__)
 #define BF_ASM				0
 #define BF_SCALE			1
 #else
diff --git a/src/util/log.c b/src/util/log.c
index b8549d60e..fd50ec700 100644
--- a/src/util/log.c
+++ b/src/util/log.c
@@ -16,6 +16,8 @@ without prior permission by the authors of Eressea.
 #include "strings.h"
 #include "unicode.h"
 
+#include <critbit.h>
+
 #include <assert.h>
 #include <errno.h>
 #include <limits.h>
@@ -318,3 +320,77 @@ int log_level(log_t * log, int flags)
     log->flags = flags;
     return old;
 }
+
+static critbit_tree stats = CRITBIT_TREE();
+
+int stats_count(const char *stat, int delta) {
+    size_t len;
+    char data[128];
+    void * match;
+    if (cb_find_prefix_str(&stats, stat, &match, 1, 0) == 0) {
+        len = cb_new_kv(stat, strlen(stat), &delta, sizeof(delta), data);
+        cb_insert(&stats, data, len);
+        return delta;
+    }
+    else {
+        int *num;
+        cb_get_kv_ex(match, (void **)&num);
+        return *num += delta;
+    }
+}
+
+#if 0
+#define STATS_BATCH 8
+void stats_walk(const char *prefix, void(*callback)(const char *, int, void *), void *udata) {
+    void *match[STATS_BATCH];
+    int n, off = 0;
+    do {
+        int i;
+        n = cb_find_prefix_str(&stats, prefix, match, STATS_BATCH, off);
+        if (n == 0) {
+            break;
+        }
+        off += n;
+        for (i = 0; i != n; ++i) {
+            const void *kv = match[i];
+            int *num;
+            cb_get_kv_ex(kv, &(void *)num);
+            callback(kv, *num, udata);
+        }
+    } while (n == STATS_BATCH);
+}
+#else
+
+struct walk_data {
+    int (*callback)(const char *, int, void *);
+    void *udata;
+};
+
+static int walk_cb(void * match, const void * key, size_t keylen, void *udata) {
+    struct walk_data *data = (struct walk_data *)udata;
+    int *num;
+    cb_get_kv_ex(match, (void **)&num);
+    return data->callback((const char*)match, *num, data->udata);
+}
+
+int stats_walk(const char *prefix, int (*callback)(const char *, int, void *), void *udata) {
+    struct walk_data data;
+    data.callback = callback;
+    data.udata = udata;
+    return cb_foreach(&stats, prefix, strlen(prefix), walk_cb, &data);
+}
+#endif
+
+static int write_cb(const char *key, int val, void *udata) {
+    FILE * F = (FILE *)udata;
+    fprintf(F, "%s: %d\n", (const char *)key, val);
+    return 0;
+}
+
+void stats_write(FILE *F, const char *prefix) {
+    stats_walk(prefix, write_cb, F);
+}
+
+void stats_close(void) {
+    cb_clear(&stats);
+}
diff --git a/src/util/log.h b/src/util/log.h
index 15872d6dc..98a0d3af6 100644
--- a/src/util/log.h
+++ b/src/util/log.h
@@ -36,6 +36,12 @@ extern "C" {
     void log_printf(FILE * ios, const char *format, ...);
 
     void errno_check(const char *file, int line);
+
+    int stats_count(const char *stat, int delta);
+    void stats_write(FILE *F, const char *prefix);
+    int stats_walk(const char *prefix, int (*callback)(const char *key, int val, void * udata), void *udata);
+    void stats_close(void);
+
 #define ERRNO_CHECK() errno_check(__FILE__, __LINE__)
 
     
diff --git a/src/util/log.test.c b/src/util/log.test.c
index 86f13ea9c..928ba5660 100644
--- a/src/util/log.test.c
+++ b/src/util/log.test.c
@@ -1,11 +1,13 @@
 #ifdef _MSC_VER
 #include <platform.h>
 #endif
-#include <CuTest.h>
 
 #include "log.h"
 #include "macros.h"
 
+#include <CuTest.h>
+#include <tests.h>
+
 #include <stdarg.h>
 #include <string.h>
 
@@ -32,9 +34,47 @@ static void test_logging(CuTest * tc)
     CuAssertStrEquals(tc, "World", str2);
 }
 
+static int stats_cb(const char *stat, int num, void *udata) {
+    int *counter = (int *)udata;
+    if (counter) {
+        *counter += num;
+    }
+    return 0;
+}
+
+static void test_stats(CuTest * tc)
+{
+    int n = 0;
+    test_setup();
+    CuAssertIntEquals(tc, 1, stats_count("foobar", 1));
+    CuAssertIntEquals(tc, 2, stats_count("test.one", 2));
+    CuAssertIntEquals(tc, 1, stats_count("test.two", 1));
+    CuAssertIntEquals(tc, 4, stats_count("test.one", 2));
+    CuAssertIntEquals(tc, 1, stats_count("test.two", 0));
+
+    n = 0;
+    CuAssertIntEquals(tc, 0, stats_walk("", stats_cb, &n));
+    CuAssertIntEquals(tc, 6, n);
+
+    n = 0;
+    CuAssertIntEquals(tc, 0, stats_walk("test", stats_cb, &n));
+    CuAssertIntEquals(tc, 5, n);
+
+    n = 0;
+    CuAssertIntEquals(tc, 0, stats_walk("test.one", stats_cb, &n));
+    CuAssertIntEquals(tc, 4, n);
+
+    n = 0;
+    CuAssertIntEquals(tc, 0, stats_walk("foobar", stats_cb, &n));
+    CuAssertIntEquals(tc, 1, n);
+
+    test_teardown();
+}
+
 CuSuite *get_log_suite(void)
 {
     CuSuite *suite = CuSuiteNew();
     SUITE_ADD_TEST(suite, test_logging);
+    SUITE_ADD_TEST(suite, test_stats);
     return suite;
 }
diff --git a/src/util/pofile.c b/src/util/pofile.c
index 8de04364d..e1126ba0e 100644
--- a/src/util/pofile.c
+++ b/src/util/pofile.c
@@ -77,7 +77,7 @@ int pofile_read(const char *filename, int (*callback)(const char *msgid, const c
         int err = sscanf(line, "%8s", token);
         if (err == 1) {
             char *text = NULL;
-            size_t size, len = strlen(token);
+            size_t size = 0, len = strlen(token);
 
             line = line + len + 1;
             if (len == 7 && memcmp(token, "msgctxt", 7) == 0) {
@@ -99,7 +99,7 @@ int pofile_read(const char *filename, int (*callback)(const char *msgid, const c
                     msgid[0] = 0;
                 }
             }
-            if (text) {
+            if (size > 0) {
                 line = read_multiline(F, line, text, size);
             }
         }
diff --git a/src/util/strings.c b/src/util/strings.c
index ef351ab1f..e9434fb25 100644
--- a/src/util/strings.c
+++ b/src/util/strings.c
@@ -22,10 +22,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include "strings.h"
 
 /* libc includes */
+#include <assert.h>
 #include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
-#include <assert.h>
 #include <stdlib.h>
 
 #ifdef HAVE_LIBBSD
diff --git a/src/util/strings.h b/src/util/strings.h
index bd6f0de58..bd58c0eb2 100644
--- a/src/util/strings.h
+++ b/src/util/strings.h
@@ -20,6 +20,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #define STRINGS_H
 
 #include <stddef.h>
+#include <string.h>
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/util/umlaut.c b/src/util/umlaut.c
index 1f9e32b1f..00252fb02 100644
--- a/src/util/umlaut.c
+++ b/src/util/umlaut.c
@@ -117,7 +117,7 @@ char * transliterate(char * out, size_t size, const char * in)
 }
 
 tnode * mknode(void) {
-    tnode * node = calloc(1, sizeof(tnode));
+    tnode * node = (tnode *)calloc(1, sizeof(tnode));
     node->refcount = 1;
     return node;
 }
diff --git a/tests/runtests.bat b/tests/runtests.bat
index 95ac17be4..88afc8d31 100644
--- a/tests/runtests.bat
+++ b/tests/runtests.bat
@@ -3,7 +3,8 @@ IF EXIST ..\build-vs10 SET BUILD=..\build-vs10\eressea\Debug
 IF EXIST ..\build-vs11 SET BUILD=..\build-vs11\eressea\Debug
 IF EXIST ..\build-vs12 SET BUILD=..\build-vs12\eressea\Debug
 IF EXIST ..\build-vs14 SET BUILD=..\build-vs14\eressea\Debug
-REM IF EXIST ..\build-vs15 SET BUILD=..\build-vs15\eressea\Debug
+IF EXIST ..\build-vs15 SET BUILD=..\build-vs15\eressea\Debug
+
 SET SERVER=%BUILD%\eressea.exe
 %BUILD%\test_eressea.exe
 %SERVER% ..\scripts\run-tests.lua
diff --git a/vs2015-build.bat b/vs2015-build.bat
index 1ad2c8da2..8d5c276ed 100644
--- a/vs2015-build.bat
+++ b/vs2015-build.bat
@@ -1,5 +1,7 @@
 @ECHO OFF
-SET VSVERSION=14
+SET VSVERSION=15
+IF NOT "%1" == "" SET VSVERSION=%1%
+
 SET SRCDIR=%CD%
 CD ..
 SET ERESSEA=%CD%