diff --git a/src/combined/kernel.c b/src/combined/kernel.c
index 71153cba5..4032132cf 100644
--- a/src/combined/kernel.c
+++ b/src/combined/kernel.c
@@ -6,7 +6,7 @@
 #include "common/kernel/alliance.c"
 #include "common/kernel/battle.c"
 #include "common/kernel/binarystore.c"
-#include "common/kernel/border.c"
+#include "common/kernel/connection.c"
 #include "common/kernel/build.c"
 #include "common/kernel/building.c"
 #include "common/kernel/calendar.c"
diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c
index 3e97085cf..1d8149564 100644
--- a/src/common/gamecode/creport.c
+++ b/src/common/gamecode/creport.c
@@ -33,7 +33,7 @@ without prior permission by the authors of Eressea.
 /* kernel includes */
 #include <kernel/alchemy.h>
 #include <kernel/alliance.h>
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/faction.h>
 #include <kernel/group.h>
@@ -1045,7 +1045,7 @@ cr_borders(seen_region ** seen, const region * r, const faction * f, int seemode
   for (d = 0; d != MAXDIRECTIONS; d++)
   { /* Nachbarregionen, die gesehen werden, ermitteln */
     const region * r2 = rconnect(r, d);
-    const border * b;
+    const connection * b;
     if (!r2) continue;
     if (seemode==see_neighbour) {
       seen_region * sr = find_seen(seen, r2);
@@ -1069,7 +1069,7 @@ cr_borders(seen_region ** seen, const region * r, const faction * f, int seemode
         }
       }
       if (cs) {
-        const char * bname = mkname("border", b->type->name(b, r, f, GF_PURE));
+        const char * bname = mkname("connection", b->type->name(b, r, f, GF_PURE));
         fprintf(F, "GRENZE %d\n", ++g);
         fprintf(F, "\"%s\";typ\n", LOC(default_locale, bname));
         fprintf(F, "%d;richtung\n", d);
diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c
index 63e8f065b..28d07db32 100644
--- a/src/common/gamecode/laws.c
+++ b/src/common/gamecode/laws.c
@@ -41,7 +41,7 @@
 #include <kernel/alchemy.h>
 #include <kernel/alliance.h>
 #include <kernel/battle.h>
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/calendar.h>
 #include <kernel/faction.h>
diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c
index 89f3d89eb..ca06aba83 100644
--- a/src/common/gamecode/report.c
+++ b/src/common/gamecode/report.c
@@ -38,7 +38,7 @@
 
 /* kernel includes */
 #include <kernel/alchemy.h>
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/build.h>
 #include <kernel/building.h>
 #include <kernel/calendar.h>
@@ -809,7 +809,7 @@ prices(FILE * F, const region * r, const faction * f)
 }
 
 boolean
-see_border(const border * b, const faction * f, const region * r)
+see_border(const connection * b, const faction * f, const region * r)
 {
   boolean cs = b->type->fvisible(b, f, r);
   if (!cs) {
@@ -856,7 +856,7 @@ describe(FILE * F, const seen_region * sr, faction * f)
   for (d = 0; d != MAXDIRECTIONS; d++) {
     /* Nachbarregionen, die gesehen werden, ermitteln */
     region *r2 = rconnect(r, d);
-    border *b;
+    connection *b;
     see[d] = true;
     if (!r2) continue;
     for (b=get_borders(r, r2);b;) {
diff --git a/src/common/gamecode/xmlreport.c b/src/common/gamecode/xmlreport.c
index 7105b2fc2..91356116e 100644
--- a/src/common/gamecode/xmlreport.c
+++ b/src/common/gamecode/xmlreport.c
@@ -31,7 +31,7 @@ without prior permission by the authors of Eressea.
 /* kernel includes */
 #include <kernel/alchemy.h>
 #include <kernel/alliance.h>
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/faction.h>
 #include <kernel/group.h>
diff --git a/src/common/kernel.vcproj b/src/common/kernel.vcproj
index a311252c6..f891d3082 100644
--- a/src/common/kernel.vcproj
+++ b/src/common/kernel.vcproj
@@ -256,14 +256,6 @@
 				RelativePath=".\kernel\binarystore.h"
 				>
 			</File>
-			<File
-				RelativePath=".\kernel\border.c"
-				>
-			</File>
-			<File
-				RelativePath=".\kernel\border.h"
-				>
-			</File>
 			<File
 				RelativePath=".\kernel\build.c"
 				>
@@ -296,6 +288,14 @@
 				RelativePath=".\kernel\command.h"
 				>
 			</File>
+			<File
+				RelativePath=".\kernel\connection.c"
+				>
+			</File>
+			<File
+				RelativePath=".\kernel\connection.h"
+				>
+			</File>
 			<File
 				RelativePath=".\kernel\curse.c"
 				>
diff --git a/src/common/kernel/build.c b/src/common/kernel/build.c
index 41969935b..6d296ab7e 100644
--- a/src/common/kernel/build.c
+++ b/src/common/kernel/build.c
@@ -25,7 +25,7 @@
 /* kernel includes */
 #include "alchemy.h"
 #include "alliance.h"
-#include "border.h"
+#include "connection.h"
 #include "building.h"
 #include "curse.h"
 #include "faction.h"
diff --git a/src/common/kernel/border.c b/src/common/kernel/connection.c
similarity index 73%
rename from src/common/kernel/border.c
rename to src/common/kernel/connection.c
index 487f3b4b9..249b914ab 100644
--- a/src/common/kernel/border.c
+++ b/src/common/kernel/connection.c
@@ -14,7 +14,7 @@
 
 #include <config.h>
 #include <kernel/eressea.h>
-#include "border.h"
+#include "connection.h"
 
 #include "region.h"
 #include "save.h"
@@ -38,7 +38,7 @@
 unsigned int nextborder = 0;
 
 #define BORDER_MAXHASH 8191
-border * borders[BORDER_MAXHASH];
+connection * borders[BORDER_MAXHASH];
 border_type * bordertypes;
 
 
@@ -48,10 +48,10 @@ free_borders(void)
   int i;
   for (i=0;i!=BORDER_MAXHASH;++i) {
     while (borders[i]) {
-      border * b = borders[i];
+      connection * b = borders[i];
       borders[i] = b->nexthash;
       while (b) {
-        border * bf = b;
+        connection * bf = b;
         b = b->next;
         assert(b==NULL || b->nexthash==NULL);
         if (bf->type->destroy) {
@@ -63,14 +63,14 @@ free_borders(void)
   }
 }
 
-border *
+connection *
 find_border(unsigned int id)
 {
   int key;
   for (key=0;key!=BORDER_MAXHASH;key++) {
-    border * bhash;
+    connection * bhash;
     for (bhash=borders[key];bhash!=NULL;bhash=bhash->nexthash) {
-      border * b;
+      connection * b;
       for (b=bhash;b;b=b->next) {
         if (b->id==id) return b;
       }
@@ -83,48 +83,48 @@ int
 resolve_borderid(variant id, void * addr)
 {
   int result = 0;
-  border * b = NULL;
+  connection * b = NULL;
   if (id.i!=0) {
     b = find_border(id.i);
     if (b==NULL) {
       result = -1;
     }
   }
-  *(border**)addr = b;
+  *(connection**)addr = b;
   return result;
 }
 
-static border **
+static connection **
 get_borders_i(const region * r1, const region * r2)
 {
-  border ** bp;
+  connection ** bp;
   int key = reg_hashkey(r1);
   int k2 = reg_hashkey(r2);
 
   key = MIN(k2, key) % BORDER_MAXHASH;
   bp = &borders[key];
   while (*bp) {
-    border * b = *bp;
+    connection * b = *bp;
     if ((b->from==r1 && b->to==r2) || (b->from==r2 && b->to==r1)) break;
     bp = &b->nexthash;
   }
   return bp;
 }
 
-border *
+connection *
 get_borders(const region * r1, const region * r2)
 {
-  border ** bp = get_borders_i(r1, r2);
+  connection ** bp = get_borders_i(r1, r2);
   return *bp;
 }
 
-border *
+connection *
 new_border(border_type * type, region * from, region * to)
 {
-  border * b = calloc(1, sizeof(struct border));
+  connection * b = calloc(1, sizeof(struct connection));
 
   if (from && to) {
-    border ** bp = get_borders_i(from, to);
+    connection ** bp = get_borders_i(from, to);
     while (*bp) bp = &(*bp)->next;
     *bp = b;
   }
@@ -138,11 +138,11 @@ new_border(border_type * type, region * from, region * to)
 }
 
 void
-erase_border(border * b)
+erase_border(connection * b)
 {
   if (b->from && b->to) {
-    border ** bp = get_borders_i(b->from, b->to);
-    assert(*bp!=NULL || !"error: border is not registered");
+    connection ** bp = get_borders_i(b->from, b->to);
+    assert(*bp!=NULL || !"error: connection is not registered");
     if (*bp==b) {
       /* it is the first in the list, so it is in the nexthash list */
       if (b->next) {
@@ -155,7 +155,7 @@ erase_border(border * b)
       while (*bp && *bp != b) {
         bp = &(*bp)->next;
       }
-      assert(*bp==b || !"error: border is not registered");
+      assert(*bp==b || !"error: connection is not registered");
       *bp = b->next;
     }
   }
@@ -186,7 +186,7 @@ find_bordertype(const char * name)
 }
 
 void
-b_read(border * b, storage * store)
+b_read(connection * b, storage * store)
 {
   int result = 0;
   switch (b->type->datatype) {
@@ -200,14 +200,14 @@ b_read(border * b, storage * store)
       break;
     case VAR_VOIDPTR:
     default:
-      assert(!"invalid variant type in border");
+      assert(!"invalid variant type in connection");
       result = 0;
   }
   assert(result>=0 || "EOF encountered?");
 }
 
 void
-b_write(const border * b, storage * store)
+b_write(const connection * b, storage * store)
 {
   switch (b->type->datatype) {
     case VAR_NONE:
@@ -220,20 +220,20 @@ b_write(const border * b, storage * store)
       break;
     case VAR_VOIDPTR:
     default:
-      assert(!"invalid variant type in border");
+      assert(!"invalid variant type in connection");
   }
 }
 
-boolean b_transparent(const border * b, const struct faction * f) { unused(b); unused(f); return true; }
-boolean b_opaque(const border * b, const struct faction * f) { unused(b); unused(f); return false; }
-boolean b_blockall(const border * b, const unit * u, const region * r) { unused(u); unused(r); unused(b); return true; }
-boolean b_blocknone(const border * b, const unit * u, const region * r) { unused(u); unused(r); unused(b); return false; }
-boolean b_rvisible(const border * b, const region * r) { return (boolean)(b->to==r || b->from==r); }
-boolean b_fvisible(const border * b, const struct faction * f, const region * r) { unused(r); unused(f); unused(b); return true; }
-boolean b_uvisible(const border * b, const unit * u)  { unused(u); unused(b); return true; }
-boolean b_rinvisible(const border * b, const region * r) { unused(r); unused(b); return false; }
-boolean b_finvisible(const border * b, const struct faction * f, const region * r) { unused(r); unused(f); unused(b); return false; }
-boolean b_uinvisible(const border * b, const unit * u) { unused(u); unused(b); return false; }
+boolean b_transparent(const connection * b, const struct faction * f) { unused(b); unused(f); return true; }
+boolean b_opaque(const connection * b, const struct faction * f) { unused(b); unused(f); return false; }
+boolean b_blockall(const connection * b, const unit * u, const region * r) { unused(u); unused(r); unused(b); return true; }
+boolean b_blocknone(const connection * b, const unit * u, const region * r) { unused(u); unused(r); unused(b); return false; }
+boolean b_rvisible(const connection * b, const region * r) { return (boolean)(b->to==r || b->from==r); }
+boolean b_fvisible(const connection * b, const struct faction * f, const region * r) { unused(r); unused(f); unused(b); return true; }
+boolean b_uvisible(const connection * b, const unit * u)  { unused(u); unused(b); return true; }
+boolean b_rinvisible(const connection * b, const region * r) { unused(r); unused(b); return false; }
+boolean b_finvisible(const connection * b, const struct faction * f, const region * r) { unused(r); unused(f); unused(b); return false; }
+boolean b_uinvisible(const connection * b, const unit * u) { unused(u); unused(b); return false; }
 
 /**************************************/
 /* at_countdown - legacy, do not use  */
@@ -255,9 +255,9 @@ age_borders(void)
   int i;
 
   for (i=0;i!=BORDER_MAXHASH;++i) {
-    border * bhash = borders[i];
+    connection * bhash = borders[i];
     for (;bhash;bhash=bhash->nexthash) {
-      border * b = bhash;
+      connection * b = bhash;
       for (;b;b=b->next) {
         if (b->type->age) {
           if (b->type->age(b)==AT_AGE_REMOVE) {
@@ -272,7 +272,7 @@ age_borders(void)
   }
   while (deleted) {
     border_list * blist = deleted->next;
-    border * b = deleted->data;
+    connection * b = deleted->data;
     erase_border(b);
     free(deleted);
     deleted = blist;
@@ -287,7 +287,7 @@ age_borders(void)
 #include "faction.h"
 
 static const char *
-b_namewall(const border * b, const region * r, const struct faction * f, int gflags)
+b_namewall(const connection * b, const region * r, const struct faction * f, int gflags)
 {
   const char * bname = "wall";
 
@@ -296,7 +296,7 @@ b_namewall(const border * b, const region * r, const struct faction * f, int gfl
   unused(b);
   if (gflags & GF_ARTICLE) bname = "a_wall";
   if (gflags & GF_PURE) return bname;
-  return LOC(f->locale, mkname("border", bname));
+  return LOC(f->locale, mkname("connection", bname));
 }
 
 border_type bt_wall = {
@@ -328,18 +328,18 @@ border_type bt_noway = {
 };
 
 static const char *
-b_namefogwall(const border * b, const region * r, const struct faction * f, int gflags)
+b_namefogwall(const connection * b, const region * r, const struct faction * f, int gflags)
 {
   unused(f);
   unused(b);
   unused(r);
   if (gflags & GF_PURE) return "fogwall";
-  if (gflags & GF_ARTICLE) return LOC(f->locale, mkname("border", "a_fogwall"));
-  return LOC(f->locale, mkname("border", "fogwall"));
+  if (gflags & GF_ARTICLE) return LOC(f->locale, mkname("connection", "a_fogwall"));
+  return LOC(f->locale, mkname("connection", "fogwall"));
 }
 
 static boolean
-b_blockfogwall(const border * b, const unit * u, const region * r)
+b_blockfogwall(const connection * b, const unit * u, const region * r)
 {
   unused(b);
   unused(r);
@@ -363,16 +363,16 @@ border_type bt_fogwall = {
 };
 
 static const char *
-b_nameillusionwall(const border * b, const region * r, const struct faction * f, int gflags)
+b_nameillusionwall(const connection * b, const region * r, const struct faction * f, int gflags)
 {
   int fno = b->data.i;
   unused(b);
   unused(r);
   if (gflags & GF_PURE) return (f && fno==f->no)?"illusionwall":"wall";
   if (gflags & GF_ARTICLE) {
-    return LOC(f->locale, mkname("border", (f && fno==f->subscription)?"an_illusionwall":"a_wall"));
+    return LOC(f->locale, mkname("connection", (f && fno==f->subscription)?"an_illusionwall":"a_wall"));
   }
-  return LOC(f->locale, mkname("border", (f && fno==f->no)?"illusionwall":"wall"));
+  return LOC(f->locale, mkname("connection", (f && fno==f->no)?"illusionwall":"wall"));
 }
 
 border_type bt_illusionwall = {
@@ -393,13 +393,13 @@ border_type bt_illusionwall = {
  * special quest door
  ***/
 
-boolean b_blockquestportal(const border * b, const unit * u, const region * r) {
+boolean b_blockquestportal(const connection * b, const unit * u, const region * r) {
   if(b->data.i > 0) return true;
   return false;
 }
 
 static const char *
-b_namequestportal(const border * b, const region * r, const struct faction * f, int gflags)
+b_namequestportal(const connection * b, const region * r, const struct faction * f, int gflags)
 {
   const char * bname;
   int lock = b->data.i;
@@ -420,7 +420,7 @@ b_namequestportal(const border * b, const region * r, const struct faction * f,
     }
   }
   if (gflags & GF_PURE) return bname;
-  return LOC(f->locale, mkname("border", bname));
+  return LOC(f->locale, mkname("connection", bname));
 }
 
 border_type bt_questportal = {
@@ -442,7 +442,7 @@ border_type bt_questportal = {
  ***/
 
 static const char *
-b_nameroad(const border * b, const region * r, const struct faction * f, int gflags)
+b_nameroad(const connection * b, const region * r, const struct faction * f, int gflags)
 {
   region * r2 = (r==b->to)?b->from:b->to;
   int local = (r==b->from)?b->data.sa[0]:b->data.sa[1];
@@ -451,51 +451,51 @@ b_nameroad(const border * b, const region * r, const struct faction * f, int gfl
   unused(f);
   if (gflags & GF_PURE) return "road";
   if (gflags & GF_ARTICLE) {
-    if (!(gflags & GF_DETAILED)) return LOC(f->locale, mkname("border", "a_road"));
+    if (!(gflags & GF_DETAILED)) return LOC(f->locale, mkname("connection", "a_road"));
     else if (r->terrain->max_road<=local) {
       int remote = (r2==b->from)?b->data.sa[0]:b->data.sa[1];
       if (r2->terrain->max_road<=remote) {
-        return LOC(f->locale, mkname("border", "a_road"));
+        return LOC(f->locale, mkname("connection", "a_road"));
       } else {
-        return LOC(f->locale, mkname("border", "an_incomplete_road"));
+        return LOC(f->locale, mkname("connection", "an_incomplete_road"));
       }
     } else {
       int percent = MAX(1, 100*local/r->terrain->max_road);
       if (local) {
-        snprintf(buffer, sizeof(buffer), LOC(f->locale, mkname("border", "a_road_percent")), percent);
+        snprintf(buffer, sizeof(buffer), LOC(f->locale, mkname("connection", "a_road_percent")), percent);
       } else {
-        return LOC(f->locale, mkname("border", "a_road_connection"));
+        return LOC(f->locale, mkname("connection", "a_road_connection"));
       }
     }
   }
-  else if (gflags & GF_PLURAL) return LOC(f->locale, mkname("border", "roads"));
-  else return LOC(f->locale, mkname("border", "road"));
+  else if (gflags & GF_PLURAL) return LOC(f->locale, mkname("connection", "roads"));
+  else return LOC(f->locale, mkname("connection", "road"));
   return buffer;
 }
 
 static void
-b_readroad(border * b, storage * store)
+b_readroad(connection * b, storage * store)
 {
   b->data.sa[0] = (short)store->r_int(store);
   b->data.sa[1] = (short)store->r_int(store);
 }
 
 static void
-b_writeroad(const border * b, storage * store)
+b_writeroad(const connection * b, storage * store)
 {
   store->w_int(store, b->data.sa[0]);
   store->w_int(store, b->data.sa[1]);
 }
 
 static boolean
-b_validroad(const border * b)
+b_validroad(const connection * b)
 {
   if (b->data.sa[0]==SHRT_MAX) return false;
   return true;
 }
 
 static boolean
-b_rvisibleroad(const border * b, const region * r)
+b_rvisibleroad(const connection * b, const region * r)
 {
   int x = b->data.i;
   x = (r==b->from)?b->data.sa[0]:b->data.sa[1];
@@ -528,9 +528,9 @@ write_borders(struct storage * store)
 {
   int i;
   for (i=0;i!=BORDER_MAXHASH;++i) {
-    border * bhash;
+    connection * bhash;
     for (bhash=borders[i];bhash;bhash=bhash->nexthash) {
-      border * b;
+      connection * b;
       for (b=bhash;b!=NULL;b=b->next) {
         if (b->type->valid && !b->type->valid(b)) continue;
         store->w_tok(store, b->type->__name);
@@ -552,7 +552,7 @@ read_borders(struct storage * store)
   for (;;) {
     unsigned int bid = 0;
     char zText[32];
-    border * b;
+    connection * b;
     region * from, * to;
     border_type * type;
 
@@ -576,9 +576,9 @@ read_borders(struct storage * store)
 
     type = find_bordertype(zText);
     if (type==NULL) {
-      log_error(("[read_borders] unknown border type %s in %s\n", zText, 
+      log_error(("[read_borders] unknown connection type %s in %s\n", zText, 
         regionname(from, NULL)));
-      assert(type || !"border type not registered");
+      assert(type || !"connection type not registered");
     }
 
     if (to==from && type && from) {
diff --git a/src/common/kernel/border.h b/src/common/kernel/connection.h
similarity index 50%
rename from src/common/kernel/border.h
rename to src/common/kernel/connection.h
index 16e4a6840..a3f1e7998 100644
--- a/src/common/kernel/border.h
+++ b/src/common/kernel/connection.h
@@ -23,46 +23,46 @@ extern "C" {
 
   extern unsigned int nextborder;
 
-  typedef struct border {
-    struct border_type * type; /* the type of this border */
-    struct border * next; /* next border between these regions */
-    struct border * nexthash; /* next border between these regions */
+  typedef struct connection {
+    struct border_type * type; /* the type of this connection */
+    struct connection * next; /* next connection between these regions */
+    struct connection * nexthash; /* next connection between these regions */
     struct region * from, * to; /* borders can be directed edges */
     variant data;
     unsigned int id; /* unique id */
-  } border;
+  } connection;
 
   typedef struct border_list {
     struct border_list * next;
-    struct border * data;
+    struct connection * data;
   } border_list;
 
   typedef struct border_type {
     const char* __name; /* internal use only */
     variant_type datatype;
-    boolean (*transparent)(const border *, const struct faction *);
+    boolean (*transparent)(const connection *, const struct faction *);
     /* is it possible to see through this? */
-    void (*init)(border *);
-    /* constructor: initialize the border. allocate extra memory if needed */
-    void (*destroy)(border *);
+    void (*init)(connection *);
+    /* constructor: initialize the connection. allocate extra memory if needed */
+    void (*destroy)(connection *);
     /* destructor: remove all extra memory for destruction */
-    void (*read)(border *, struct storage *);
-    void (*write)(const border *, struct storage *);
-    boolean (*block)(const border *, const struct unit *, const struct region * r);
+    void (*read)(connection *, struct storage *);
+    void (*write)(const connection *, struct storage *);
+    boolean (*block)(const connection *, const struct unit *, const struct region * r);
     /* return true if it blocks movement of u from
     * r to the opposite struct region.
     * warning: struct unit may be NULL.
     */
-    const char *(*name)(const border * b, const struct region * r, const struct faction * f, int gflags);
+    const char *(*name)(const connection * b, const struct region * r, const struct faction * f, int gflags);
     /* for example "a wall of fog" or "a doorway from r1 to r2"
     * may depend on the struct faction, for example "a wall" may
     * turn out to be "an illusionary wall"
     */
-    boolean (*rvisible)(const border *, const struct region *);
+    boolean (*rvisible)(const connection *, const struct region *);
     /* is it visible to everyone in r ?
     * if not, it may still be fvisible() for some f.
     */
-    boolean (*fvisible)(const border *, const struct faction *, const struct region *);
+    boolean (*fvisible)(const connection *, const struct faction *, const struct region *);
     /* is it visible to units of f in r?
     * the function shall not check for
     * existence of a struct unit in r. Example: a spell
@@ -71,32 +71,32 @@ extern "C" {
     * the reporting function will have to assure).
     * if not true, it may still be uvisible() for some u.
     */
-    boolean (*uvisible)(const border *, const struct unit *);
+    boolean (*uvisible)(const connection *, const struct unit *);
     /* is it visible to u ?
     * a doorway may only be visible to a struct unit with perception > 5
     */
-    boolean (*valid)(const border *);
-    /* is the border in a valid state,
+    boolean (*valid)(const connection *);
+    /* is the connection in a valid state,
     * or should it be erased at the end of this turn to save space?
     */
-    struct region * (*move)(const border *, struct unit * u, struct region * from, struct region * to, boolean routing);
-    /* executed when the units traverses this border */
-    int (*age)(struct border *);
-    /* return 0 if border needs to be removed. >0 if still aging, <0 if not aging */
+    struct region * (*move)(const connection *, struct unit * u, struct region * from, struct region * to, boolean routing);
+    /* executed when the units traverses this connection */
+    int (*age)(struct connection *);
+    /* return 0 if connection needs to be removed. >0 if still aging, <0 if not aging */
     struct border_type * next; /* for internal use only */
   } border_type;
 
 
-  extern border * find_border(unsigned int id);
+  extern connection * find_border(unsigned int id);
   int resolve_borderid(variant data, void * addr);
   extern void free_borders(void);
 
-  extern border * get_borders(const struct region * r1, const struct region * r2);
+  extern connection * get_borders(const struct region * r1, const struct region * r2);
   /* returns the list of borders between r1 and r2 or r2 and r1 */
-  extern border * new_border(border_type * type, struct region * from, struct region * to);
-  /* creates a border of the specified type */
-  extern void erase_border(border * b);
-  /* remove the border from memory */
+  extern connection * new_border(border_type * type, struct region * from, struct region * to);
+  /* creates a connection of the specified type */
+  extern void erase_border(connection * b);
+  /* remove the connection from memory */
   extern border_type * find_bordertype(const char * name);
   extern void register_bordertype(border_type * type);
   /* register a new bordertype */
@@ -106,18 +106,18 @@ extern "C" {
   extern void age_borders(void);
 
   /* provide default implementations for some member functions: */
-  extern void b_read(border * b, struct storage * store);
-  extern void b_write(const border * b, struct storage * store);
-  extern boolean b_blockall(const border *, const struct unit *, const struct region *);
-  extern boolean b_blocknone(const border *, const struct unit *, const struct region *);
-  extern boolean b_rvisible(const border *, const struct region * r);
-  extern boolean b_fvisible(const border *, const struct faction * f, const struct region *);
-  extern boolean b_uvisible(const border *, const struct unit * u);
-  extern boolean b_rinvisible(const border *, const struct region * r);
-  extern boolean b_finvisible(const border *, const struct faction * f, const struct region *);
-  extern boolean b_uinvisible(const border *, const struct unit * u);
-  extern boolean b_transparent(const border *, const struct faction *);
-  extern boolean b_opaque(const border *, const struct faction *); /* !transparent */
+  extern void b_read(connection * b, struct storage * store);
+  extern void b_write(const connection * b, struct storage * store);
+  extern boolean b_blockall(const connection *, const struct unit *, const struct region *);
+  extern boolean b_blocknone(const connection *, const struct unit *, const struct region *);
+  extern boolean b_rvisible(const connection *, const struct region * r);
+  extern boolean b_fvisible(const connection *, const struct faction * f, const struct region *);
+  extern boolean b_uvisible(const connection *, const struct unit * u);
+  extern boolean b_rinvisible(const connection *, const struct region * r);
+  extern boolean b_finvisible(const connection *, const struct faction * f, const struct region *);
+  extern boolean b_uinvisible(const connection *, const struct unit * u);
+  extern boolean b_transparent(const connection *, const struct faction *);
+  extern boolean b_opaque(const connection *, const struct faction *); /* !transparent */
 
   extern border_type bt_fogwall;
   extern border_type bt_noway;
diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c
index e81937be3..ee5102f4e 100644
--- a/src/common/kernel/eressea.c
+++ b/src/common/kernel/eressea.c
@@ -29,7 +29,7 @@
 #include "alliance.h"
 #include "alchemy.h"
 #include "battle.h"
-#include "border.h"
+#include "connection.h"
 #include "building.h"
 #include "calendar.h"
 #include "curse.h"
@@ -2793,7 +2793,7 @@ movewhere(const unit *u, const char * token, region * r, region** resultp)
 boolean
 move_blocked(const unit * u, const region *r, const region *r2)
 {
-  border * b;
+  connection * b;
   curse * c;
   static const curse_type * fogtrap_ct = NULL;
 
@@ -2994,7 +2994,7 @@ attrib_init(void)
   at_register(&at_maxmagicians);
   at_register(&at_npcfaction);
 
-  /* border-typen */
+  /* connection-typen */
   register_bordertype(&bt_noway);
   register_bordertype(&bt_fogwall);
   register_bordertype(&bt_wall);
diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h
index 2372926f9..bb58378b2 100644
--- a/src/common/kernel/eressea.h
+++ b/src/common/kernel/eressea.h
@@ -345,7 +345,7 @@ extern void add_income(struct unit * u, int type, int want, int qty);
 enum {
   E_MOVE_OK = 0,   /* possible to move */
   E_MOVE_NOREGION, /* no region exists in this direction */
-  E_MOVE_BLOCKED   /* cannot see this region, there is a blocking border. */
+  E_MOVE_BLOCKED   /* cannot see this region, there is a blocking connection. */
 };
 extern int movewhere(const struct unit *u, const char * token, struct region * r, struct region** resultp);
 
diff --git a/src/common/kernel/move.c b/src/common/kernel/move.c
index 407f4f2ea..f6b7a24df 100644
--- a/src/common/kernel/move.c
+++ b/src/common/kernel/move.c
@@ -23,7 +23,7 @@
 #include "move.h"
 
 #include "alchemy.h"
-#include "border.h"
+#include "connection.h"
 #include "build.h"
 #include "building.h"
 #include "calendar.h"
@@ -1199,7 +1199,7 @@ cap_route(region * r, const region_list * route, const region_list * route_end,
 static region *
 next_region(unit * u, region * current, region * next)
 {
-  border * b;
+  connection * b;
 
   b = get_borders(current, next);
   while (b!=NULL) {
@@ -1394,7 +1394,7 @@ travel_route(unit * u, const region_list * route_begin, const region_list * rout
   while (iroute && iroute!=route_end) {
     region * next = iroute->data;
     direction_t reldir = reldirection(current, next);
-    border * b = get_borders(current, next);
+    connection * b = get_borders(current, next);
 
     /* check if we are caught by guarding units */
     if (iroute!=route_begin && mode!=TRAVEL_RUNNING && mode!=TRAVEL_TRANSPORTED) {
diff --git a/src/common/kernel/region.c b/src/common/kernel/region.c
index 53f2c079e..9a6d3fde8 100644
--- a/src/common/kernel/region.c
+++ b/src/common/kernel/region.c
@@ -24,7 +24,7 @@
 #include "region.h"
 
 /* kernel includes */
-#include "border.h"
+#include "connection.h"
 #include "building.h"
 #include "curse.h"
 #include "equipment.h"
@@ -780,7 +780,7 @@ attrib_type at_travelunit = {
 void
 rsetroad(region * r, direction_t d, short val)
 {
-  border * b;
+  connection * b;
   region * r2 = rconnect(r, d);
 
   if (!r2) return;
@@ -795,7 +795,7 @@ short
 rroad(const region * r, direction_t d)
 {
   int rval;
-  border * b;
+  connection * b;
   region * r2 = rconnect(r, d);
 
   if (!r2) return 0;
diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c
index 0c78d9737..636e68389 100644
--- a/src/common/kernel/reports.c
+++ b/src/common/kernel/reports.c
@@ -23,7 +23,7 @@
 
 /* kernel includes */
 #include <kernel/alliance.h>
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/curse.h>
 #include <kernel/faction.h>
@@ -1183,7 +1183,7 @@ view_default(struct seen_region ** seen, region *r, faction *f)
   for (dir=0;dir!=MAXDIRECTIONS;++dir) {
     region * r2 = rconnect(r, dir);
     if (r2) {
-      border * b = get_borders(r, r2);
+      connection * b = get_borders(r, r2);
       while (b) {
         if (!b->type->transparent(b, f)) break;
         b = b->next;
@@ -1200,7 +1200,7 @@ view_neighbours(struct seen_region ** seen, region * r, faction * f)
   for (dir=0;dir!=MAXDIRECTIONS;++dir) {
     region * r2 = rconnect(r, dir);
     if (r2) {
-      border * b = get_borders(r, r2);
+      connection * b = get_borders(r, r2);
       while (b) {
         if (!b->type->transparent(b, f)) break;
         b = b->next;
@@ -1212,7 +1212,7 @@ view_neighbours(struct seen_region ** seen, region * r, faction * f)
             for (dir=0;dir!=MAXDIRECTIONS;++dir) {
               region * r3 = rconnect(r2, dir);
               if (r3) {
-                border * b = get_borders(r2, r3);
+                connection * b = get_borders(r2, r3);
                 while (b) {
                   if (!b->type->transparent(b, f)) break;
                   b = b->next;
@@ -1237,7 +1237,7 @@ recurse_regatta(struct seen_region ** seen, region *center, region *r, faction *
     if (r2) {
       int ndist = distance(center, r2);
       if (ndist>dist && fval(r2->terrain, SEA_REGION)) {
-        border * b = get_borders(r, r2);
+        connection * b = get_borders(r, r2);
         while (b) {
           if (!b->type->transparent(b, f)) break;
           b = b->next;
diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c
index cd50adb2c..c61c73c9a 100644
--- a/src/common/kernel/save.c
+++ b/src/common/kernel/save.c
@@ -24,7 +24,7 @@
 
 #include "alchemy.h"
 #include "alliance.h"
-#include "border.h"
+#include "connection.h"
 #include "building.h"
 #include "faction.h"
 #include "group.h"
diff --git a/src/common/kernel/unit.c b/src/common/kernel/unit.c
index 2b7db640a..ea11c441f 100644
--- a/src/common/kernel/unit.c
+++ b/src/common/kernel/unit.c
@@ -27,7 +27,7 @@
 #include "faction.h"
 #include "group.h"
 #include "karma.h"
-#include "border.h"
+#include "connection.h"
 #include "item.h"
 #include "move.h"
 #include "order.h"
diff --git a/src/common/kernel/version.h b/src/common/kernel/version.h
index 20bf05db7..6fe9e1522 100644
--- a/src/common/kernel/version.h
+++ b/src/common/kernel/version.h
@@ -58,7 +58,7 @@
 #define STORAGE_VERSION 328 /* with storage.h, some things are stored smarter (ids as base36, fractions as float) */
 #define INTPAK_VERSION 329 /* in binary, ints can get packed */
 #define NOZEROIDS_VERSION 330 /* zero is not a valid ID for anything (including factions) */
-#define NOBORDERATTRIBS_VERSION 331 /* border::attribs has been moved to userdata */
+#define NOBORDERATTRIBS_VERSION 331 /* connection::attribs has been moved to userdata */
 #define UIDHASH_VERSION 332 /* borders use the region.uid to store */
 #define REGIONOWNER_VERSION 333 /* regions have owners and morale */
 #define ALLIANCELEADER_VERSION 333 /* alliances have a leader */
diff --git a/src/common/spells/spells.c b/src/common/spells/spells.c
index 0016c3bcc..2efe7c213 100644
--- a/src/common/spells/spells.c
+++ b/src/common/spells/spells.c
@@ -26,7 +26,7 @@
 /* kernel includes */
 #include <kernel/curse.h>
 #include <kernel/battle.h> /* f�r lovar */
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/curse.h>
 #include <kernel/spellid.h>
@@ -2622,7 +2622,7 @@ sp_summondragon(castorder *co)
 
 typedef struct wallcurse {
   curse * buddy;
-  border * wall;
+  connection * wall;
 } wallcurse;
 
 void
@@ -2655,7 +2655,7 @@ cw_init(attrib * a) {
 
 void
 cw_write(const attrib * a, storage * store) {
-  border * b = ((wallcurse*)((curse*)a->data.v)->data.v)->wall;
+  connection * b = ((wallcurse*)((curse*)a->data.v)->data.v)->wall;
   curse_write(a, store);
   store->w_int(store, b->id);
 }
@@ -2705,7 +2705,7 @@ resolve_buddy(variant data, void * addr)
   bresolve * br = (bresolve*)data.v;
 
   if (br->id>=0) {
-    border * b = find_border(br->id);
+    connection * b = find_border(br->id);
 
     if (b && b->from && b->to) {
       attrib * a = a_find(b->from->attribs, &at_cursewall);
@@ -2741,7 +2741,7 @@ resolve_buddy(variant data, void * addr)
 }
 
 static const char *
-b_namefirewall(const border * b, const region * r, const faction * f, int gflags)
+b_namefirewall(const connection * b, const region * r, const faction * f, int gflags)
 {
   const char * bname;
   unused(f);
@@ -2751,11 +2751,11 @@ b_namefirewall(const border * b, const region * r, const faction * f, int gflags
   else bname = "firewall";
 
   if (gflags & GF_PURE) return bname;
-  return LOC(f->locale, mkname("border", bname));
+  return LOC(f->locale, mkname("connection", bname));
 }
 
 static void
-wall_init(border * b)
+wall_init(connection * b)
 {
   wall_data * fd = (wall_data*)calloc(sizeof(wall_data), 1);
   fd->countdown = -1; /* infinite */
@@ -2763,13 +2763,13 @@ wall_init(border * b)
 }
 
 static void
-wall_destroy(border * b)
+wall_destroy(connection * b)
 {
   free(b->data.v);
 }
 
 static void
-wall_read(border * b, storage * store)
+wall_read(connection * b, storage * store)
 {
   wall_data * fd = (wall_data*)b->data.v;
   variant mno;
@@ -2791,7 +2791,7 @@ wall_read(border * b, storage * store)
 }
 
 static void
-wall_write(const border * b, storage * store)
+wall_write(const connection * b, storage * store)
 {
   wall_data * fd = (wall_data*)b->data.v;
   write_unit_reference(fd->mage, store);
@@ -2800,7 +2800,7 @@ wall_write(const border * b, storage * store)
 }
 
 static int
-wall_age(border * b)
+wall_age(connection * b)
 {
   wall_data * fd = (wall_data*)b->data.v;
   --fd->countdown;
@@ -2808,7 +2808,7 @@ wall_age(border * b)
 }
 
 static region *
-wall_move(const border * b, struct unit * u, struct region * from, struct region * to, boolean routing)
+wall_move(const connection * b, struct unit * u, struct region * from, struct region * to, boolean routing)
 {
   wall_data * fd = (wall_data*)b->data.v;
   if (!routing && fd->active) {
@@ -2848,7 +2848,7 @@ border_type bt_firewall = {
 static int
 sp_firewall(castorder *co)
 {
-  border * b;
+  connection * b;
   wall_data * fd;
   region *r = co->rt;
   unit *mage = co->magician.u;
@@ -2904,7 +2904,7 @@ sp_firewall(castorder *co)
 /* ------------------------------------------------------------- */
 
 static const char *
-wisps_name(const border * b, const region * r, const faction * f, int gflags)
+wisps_name(const connection * b, const region * r, const faction * f, int gflags)
 {
   const char * bname;
   unused(f);
@@ -2916,7 +2916,7 @@ wisps_name(const border * b, const region * r, const faction * f, int gflags)
     bname = "wisps";
   }
   if (gflags & GF_PURE) return bname;
-  return LOC(f->locale, mkname("border", bname));
+  return LOC(f->locale, mkname("connection", bname));
 }
 
 typedef struct wisps_data {
@@ -2925,7 +2925,7 @@ typedef struct wisps_data {
 } wisps_data;
 
 static region *
-wisps_move(const border * b, struct unit * u, struct region * from, struct region * next, boolean routing)
+wisps_move(const connection * b, struct unit * u, struct region * from, struct region * next, boolean routing)
 {
   direction_t reldir = reldirection(from, next);
   wisps_data * wd = (wisps_data*)b->data.v;
@@ -2946,7 +2946,7 @@ wisps_move(const border * b, struct unit * u, struct region * from, struct regio
 }
 
 static void
-wisps_init(border * b)
+wisps_init(connection * b)
 {
   wisps_data * wd = (wisps_data*)calloc(sizeof(wisps_data), 1);
 
@@ -2973,7 +2973,7 @@ border_type bt_wisps = {
 static int
 sp_wisps(castorder *co)
 {
-  border * b;
+  connection * b;
   wall_data * fd;
   region * r2;
   direction_t dir;
@@ -8804,7 +8804,7 @@ static spelldata spelldaten[] =
 };
 
 static boolean
-chaosgate_valid(const border * b)
+chaosgate_valid(const connection * b)
 {
   const attrib * a = a_findc(b->from->attribs, &at_direction);
   if (!a) a = a_findc(b->to->attribs, &at_direction);
@@ -8813,7 +8813,7 @@ chaosgate_valid(const border * b)
 }
 
 struct region *
-chaosgate_move(const border * b, struct unit * u, struct region * from, struct region * to, boolean routing)
+chaosgate_move(const connection * b, struct unit * u, struct region * from, struct region * to, boolean routing)
 {
   if (!routing) {
     int maxhp = u->hp / 4;
diff --git a/src/eressea/gmtool.c b/src/eressea/gmtool.c
index 67eea5669..1e199f959 100644
--- a/src/eressea/gmtool.c
+++ b/src/eressea/gmtool.c
@@ -69,17 +69,6 @@
 #include <string.h>
 #include <locale.h>
 
-typedef struct window {
-  boolean (*handlekey)(struct window * win, struct state * st, int key);
-  void (*paint)(struct window * win, const struct state * st);
-
-  WINDOW * handle;
-  struct window * next;
-  struct window * prev;
-  boolean initialized;
-  int update;
-} window;
-
 extern const char * g_reportdir;
 extern const char * g_datadir;
 extern const char * g_basedir;
@@ -385,7 +374,7 @@ paint_info_region(window * wnd, const state * st)
 
   unused(st);
   werase(win);
-  wborder(win, 0, 0, 0, 0, 0, 0, 0, 0);
+  wxborder(win);
   if (mr && mr->r) {
     const region * r = mr->r;
     if (r->land) {
@@ -439,6 +428,20 @@ paint_info_region(window * wnd, const state * st)
   }
 }
 
+static void (*paint_info)(struct window * wnd, const struct state * st);
+
+static void
+paint_info_default(window * wnd, const state * st)
+{
+  if (paint_info) paint_info(wnd, st);
+  else paint_info_region(wnd, st);
+}
+
+void set_info_function(void (*callback)(struct window *, const struct state *))
+{
+  paint_info = callback;
+}
+
 static char *
 askstring(WINDOW * win, const char * q, char * buffer, size_t size)
 {
@@ -1177,7 +1180,7 @@ run_mapper(void)
   st->wnd_map->paint = &paint_map;
   st->wnd_map->update = 1;
   st->wnd_info = win_create(hwininfo);
-  st->wnd_info->paint = &paint_info_region;
+  st->wnd_info->paint = &paint_info_default;
   st->wnd_info->handlekey = &handle_info_region;
   st->wnd_info->update = 1;
   st->wnd_status = win_create(hwinstatus);
diff --git a/src/eressea/gmtool_structs.h b/src/eressea/gmtool_structs.h
index 7ba9d7e5c..84897a37f 100644
--- a/src/eressea/gmtool_structs.h
+++ b/src/eressea/gmtool_structs.h
@@ -69,13 +69,32 @@ typedef struct state {
   struct window * wnd_status;
 } state;
 
+typedef struct window {
+  boolean (*handlekey)(struct window * win, struct state * st, int key);
+  void (*paint)(struct window * win, const struct state * st);
+
+  WINDOW * handle;
+  struct window * next;
+  struct window * prev;
+  boolean initialized;
+  int update;
+} window;
+
 extern map_region * cursor_region(const view * v, const coordinate * c);
 extern void cnormalize(const coordinate * c, int * x, int * y);
 extern state * current_state;
 
+extern void set_info_function(void (*callback)(struct window *, const struct state *));
+
 #define TWIDTH  2 /* width of tile */
 #define THEIGHT 1 /* height of tile */
 
+#if WIN32
+#define wxborder(win) wborder(win, 0, 0, 0, 0, 0, 0, 0, 0)
+#else
+#define wxborder(win) wborder(win, '|', '|', '-', '-', '+', '+', '+', '+')
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c
index 15c7c2373..82265a20e 100644
--- a/src/eressea/korrektur.c
+++ b/src/eressea/korrektur.c
@@ -37,7 +37,7 @@
 /* kernel includes */
 #include <kernel/alchemy.h>
 #include <kernel/alliance.h>
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/calendar.h>
 #include <kernel/equipment.h>
@@ -553,21 +553,21 @@ fix_astralplane(void)
   return 0;
 }
 
-extern border *borders[];
+extern connection *borders[];
 
 #define BORDER_MAXHASH 8191
 static void
 fix_road_borders(void)
 {
 #define MAXDEL 10000
-  border *deleted[MAXDEL];
+  connection *deleted[MAXDEL];
   int hash;
   int fixes = 0;
 
   for (hash=0; hash<BORDER_MAXHASH && fixes!=MAXDEL; hash++) {
-    border * blist;
+    connection * blist;
     for (blist=borders[hash];blist && fixes!=MAXDEL;blist=blist->nexthash) {
-      border * b;
+      connection * b;
       for (b=blist;b && fixes!=MAXDEL;b=b->next) {
         if (b->type == &bt_road) {
           int x1, x2, y1, y2;
@@ -806,7 +806,7 @@ fix_chaosgates(void)
       spec_direction * sd = (spec_direction *)a->data.v;
       region * r2 = findregion(sd->x, sd->y);
       if (r2!=NULL) {
-        border * b = get_borders(r, r2);
+        connection * b = get_borders(r, r2);
         while (b) {
           if (b->type==&bt_chaosgate) break;
           b = b->next;
diff --git a/src/eressea/server.c b/src/eressea/server.c
index 11f9a13d6..816efd20c 100644
--- a/src/eressea/server.c
+++ b/src/eressea/server.c
@@ -59,7 +59,7 @@
 #include <gamecode/xmlreport.h>
 
 /* kernel includes */
-#include <kernel/border.h>
+#include <kernel/connection.h>
 #include <kernel/building.h>
 #include <kernel/calendar.h>
 #include <kernel/faction.h>
diff --git a/src/eressea/tolua/bind_gmtool.c b/src/eressea/tolua/bind_gmtool.c
index 2d167d91b..84d161d71 100644
--- a/src/eressea/tolua/bind_gmtool.c
+++ b/src/eressea/tolua/bind_gmtool.c
@@ -1,4 +1,5 @@
 #include <config.h>
+#include <curses.h>
 
 #include "bind_gmtool.h"
 #include "../gmtool.h"
@@ -8,6 +9,7 @@
 #include <kernel/region.h>
 #include <kernel/terrain.h>
 #include <modules/autoseed.h>
+#include <util/log.h>
 
 #include <lua.h>
 #include <tolua.h>
@@ -165,6 +167,59 @@ tolua_make_island(lua_State * L)
   return 1;
 }
 
+static int paint_handle;
+static struct lua_State * paint_state;
+
+static void
+lua_paint_info(struct window * wnd, const struct state * st)
+{
+  struct lua_State * L = paint_state;
+  lua_rawgeti(L, LUA_REGISTRYINDEX, paint_handle);
+  tolua_pushnumber(L, st->cursor.x);
+  tolua_pushnumber(L, st->cursor.y);
+  if (lua_pcall(L, 2, 1, 0)!=0) {
+    const char* error = lua_tostring(L, -1);
+    log_error(("paint function failed: %s\n", error));
+    lua_pop(L, 1);
+    tolua_error(L, TOLUA_CAST "event handler call failed", NULL);
+  } else {
+    const char* result = lua_tostring(L, -1);
+    WINDOW * win = wnd->handle;
+    int size = getmaxx(win)-2;
+    int line = 0, maxline = getmaxy(win)-2;
+    const char * str = result;
+    wxborder(win);
+
+    while (*str && line<maxline) {
+      const char * end = strchr(str, '\n');
+      if (!end) break;
+      else {
+        size_t len = end-str;
+        int bytes = MIN((int)len, size);
+        mvwaddnstr(win, line++, 1, str, bytes);
+        wclrtoeol(win);
+        str = end + 1;
+      }
+    }
+  }
+}
+
+static int
+tolua_set_display(lua_State * L)
+{
+  int type = lua_type(L, 1);
+  if (type==LUA_TFUNCTION) {
+    lua_pushvalue(L, 1);
+    paint_handle = luaL_ref(L, LUA_REGISTRYINDEX);
+    paint_state = L;
+
+    set_info_function(&lua_paint_info);
+  } else {
+    set_info_function(NULL);
+  }
+  return 0;
+}
+
 static int
 tolua_make_block(lua_State * L)
 {
@@ -190,15 +245,16 @@ tolua_gmtool_open(lua_State* L)
     tolua_module(L, TOLUA_CAST "gmtool", 0);
     tolua_beginmodule(L, TOLUA_CAST "gmtool");
     {
-      tolua_function(L, TOLUA_CAST "open", tolua_state_open);
-      tolua_function(L, TOLUA_CAST "close", tolua_state_close);
+      tolua_function(L, TOLUA_CAST "open", &tolua_state_open);
+      tolua_function(L, TOLUA_CAST "close", &tolua_state_close);
 
-      tolua_function(L, TOLUA_CAST "editor", tolua_run_mapper);
-      tolua_function(L, TOLUA_CAST "get_selection", tolua_selected_regions);
-      tolua_function(L, TOLUA_CAST "get_cursor", tolua_current_region);
-      tolua_function(L, TOLUA_CAST "highlight", tolua_highlight_region);
-      tolua_function(L, TOLUA_CAST "select", tolua_select_region);
-      tolua_function(L, TOLUA_CAST "select_at", tolua_select_coordinate);
+      tolua_function(L, TOLUA_CAST "editor", &tolua_run_mapper);
+      tolua_function(L, TOLUA_CAST "get_selection", &tolua_selected_regions);
+      tolua_function(L, TOLUA_CAST "get_cursor", &tolua_current_region);
+      tolua_function(L, TOLUA_CAST "highlight", &tolua_highlight_region);
+      tolua_function(L, TOLUA_CAST "select", &tolua_select_region);
+      tolua_function(L, TOLUA_CAST "select_at", &tolua_select_coordinate);
+      tolua_function(L, TOLUA_CAST "set_display", &tolua_set_display);
 
       tolua_function(L, TOLUA_CAST "make_block", &tolua_make_block);
       tolua_function(L, TOLUA_CAST "make_island", &tolua_make_island);