diff --git a/std/player/travel.c b/std/player/travel.c
new file mode 100644
index 0000000..3e07c0a
--- /dev/null
+++ b/std/player/travel.c
@@ -0,0 +1,506 @@
+
+/* 'reise' handling
+ *
+ * Ueberarbeitete und 
+ * erweiterte Version: Tilly@MorgenGrauen, 10.01.02
+ * Basierend auf     : base.c@SilberLand,
+ *                     Revision 3.55, Woody@SilberLand, 11.05.99
+ */   
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define NEED_PROTOTYPES
+#include <player.h>
+#include <living/moving.h>
+#include <thing/properties.h>
+#undef NEED_PROTOTYPES
+
+#include <properties.h>
+#include <config.h>
+#include <wizlevels.h>
+#include <moving.h>
+#include <living.h>
+#include <attributes.h>
+#include <defines.h>
+#include <new_skills.h>
+#include <combat.h>
+#include <transport.h>
+
+void create(){}
+
+private string _traveller(string *s)
+{
+  switch (sizeof(s))
+  {
+    case 1 : return s[0];
+    case 2 : return s[0]+" oder "+s[1];
+  }
+  return efun::implode(s[0..<2],", ")+" oder "+s[<1];
+}
+
+static int reise(string str)
+{
+  mixed  t, ship, dstr;
+  string mit, nach, s1, s2;
+  int    i;
+
+  _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n\n"
+               "Weitere Syntaxen moeglich, bitte 'hilfe reise' lesen.\n");
+
+  t = QueryProp(P_TRAVEL_INFO);
+  
+  if (!pointerp(t) || (sizeof(t) < 4) || !objectp(t[0]) || !objectp(t[1]))
+  {
+    SetProp(P_TRAVEL_INFO, t = 0);
+  }
+/* * * * 
+ * REISE
+ * * * */
+  if (!str)
+  {
+    if (!t)
+    {
+      write("Du hast keine Reiseroute festgelegt.\n");
+    }
+    else if (t[0] == environment())
+    {
+      if (environment()->id("Transporter"))
+      {
+        write(sprintf("Du reist mit %s%s.\n",environment()->name(WEM,1), 
+                                             t[2]?" "+t[3]:""));
+      }
+      else
+      {
+        write(sprintf("Du wirst mit %s%s reisen.\n",t[1]->name(WEM,1), 
+                                                   t[2]?" "+t[3]:""));
+      }
+    }
+    else
+    {
+       write(sprintf("Deine letzte Route (mit %s%s) ist hier nicht wirksam.\n",
+                     t[1]->name(WEM,1),
+                     t[2]?" "+t[3]:""));
+    }
+    return 1;
+  }
+
+  str = lower_case( _unparsed_args() );
+/* * * * * * * 
+ * REISE ROUTE
+ * * * * * * */
+  if (str == "route")
+  {
+    string *harbours;
+    
+    if (environment()->id("Transporter"))
+    {
+      if (environment()->QueryProp(P_NO_TRAVELING))
+      {
+        write(break_string(
+         capitalize(environment()->name(WER,1))+" hat gar keine "
+         "Reiseroute. Wo Dich das wohl hinfuehrt?",78));
+        return 1;
+      }
+
+      harbours = environment()->QueryHarbours(1);
+      
+      if (!sizeof(harbours) || !stringp(harbours[0]))
+      {
+        write("Die Reiseroute "+environment()->name(WESSEN,1)+" ist "
+             +"leider nicht bekannt.\n");
+      }
+      else
+      {
+        write(break_string(capitalize(efun::implode(harbours," - "))+".",78,
+         "Reiseroute "+environment()->name(WESSEN,1)+": ",BS_INDENT_ONCE));
+      }
+      return 1;
+    }
+    if (environment()->QueryProp(P_NO_TRAVELING))
+    {
+      write(break_string("Hier kannst Du leider keine Reiseroute waehlen. "
+                         "Was nicht heisst, dass hier kein Transportmittel "
+                         "verkehrt.",78));
+      return 1;
+    }
+    if (!pointerp(ship = TRAVELD->HasTransporter(environment())))
+    {
+      _notify_fail("Hier verkehrt kein Transportmittel.\n");
+      return 0;
+    }
+
+    write("Hier verkehren folgende Transportmittel \n"
+          "--------------------------------------- \n");
+         
+    for (i = 0; i < sizeof(ship); i++)
+    {    
+      if (!ship[i]->Query(P_SHORT)) continue;
+      
+      harbours = ship[i]->QueryHarbours(1);
+
+      if (sizeof(harbours) && stringp(harbours[0]))
+      {
+        write(break_string(efun::implode(harbours," - ")+".",78,
+                           ship[i]->Query(P_SHORT)+": ",BS_INDENT_ONCE));
+      }
+      else
+      {
+        write(ship[i]->Query(P_SHORT)+": Route unbekannt.\n");
+      }
+    }
+    return 1;
+  }
+/* * * * * * * 
+ * REISE AUS
+ * REISE NICHT
+ * * * * * * */
+  if (member((["aus","nicht"]),str))
+  {
+    if (!t)
+    {
+      write("Du hattest keine Reiseroute eingestellt.\n");
+    }
+    else
+    {
+      write("Du loeschst Deine Reiseroute.\n");
+    }
+    SetProp(P_TRAVEL_INFO, 0);
+    return 1;
+  }
+
+  str = regreplace(str,"\\<(zu|zum|zur|ins|ans)\\>","nach",0);
+/* * * * * * * * *
+ * REISE MIT NACH
+ * REISE NACH MIT
+ * * * * * * * * */
+  if ((sscanf(str, "mit %s nach %s", mit, nach) == 2) ||
+      (sscanf(str, "nach %s mit %s", nach, mit) == 2))
+  {
+    _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");
+
+    if (environment()->QueryProp(P_NO_TRAVELING))
+    {
+      return 0;
+    }
+    if (!sizeof(nach))
+    {
+      _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n"
+                   "        reise nach <zielort> mit <transportmittel>\n");
+      return 0;
+    }
+    if (environment()->id("Transporter"))
+    {
+      if (environment()->id(mit))
+      {
+        command("reise nach "+nach);
+        return 1;
+      }
+      else
+      {
+        _notify_fail("Beende erstmal Deine aktuelle Reise mit "+
+                      environment()->name(WEM,1)+".\n");
+        return 0;
+      }
+    }
+    if (!pointerp(ship = TRAVELD->HasTransporter(environment(), mit)))
+    {
+      _notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
+      return 0;
+    }
+    for (i = sizeof(ship) -1 ; i >= 0; i--)
+      if (!ship[i]->HasRoute(nach))
+      {
+        ship[i] = 0;
+      }
+
+    ship -= ({0});
+
+    if (pointerp(t) && objectp(t[1]) && (member(ship,t[1]) != -1))
+    {
+      ship = ({ t[1] });
+    }
+    if (sizeof(ship) > 1)
+    {
+      if (object_name(environment()) == ship[0]->HasRoute(nach)[0])
+      {
+        _notify_fail("Aber da bist Du doch bereits.\n");
+        return 0;
+      }
+     write("Dorthin kannst Du mit "+CountUp(map_objects(ship,"name",WEM))
+           +"reisen.\n");
+ 
+
+      dstr = filter( filter_objects(ship,"short"), lambda( ({'x}),
+             ({ #'==, ({#'environment, 'x}), environment() }) ) );
+
+      if (sizeof(dstr))
+      {
+        ship = dstr[0];
+      }
+      else
+      {
+        ship = ship[0];
+      }
+
+      dstr = ship->HasRoute(nach);
+
+      write(sprintf("Du entscheidest Dich fuer %s und reist %s.\n",
+            ship->name(WEN,1),dstr[1]));
+    }
+    else if (sizeof(ship) < 1)
+    {
+      _notify_fail("Nach '"+capitalize(nach)+"' kann Dich das angegebene "
+                  +"Transportmittel leider nicht bringen.\n");
+      return 0;
+    }
+    else
+    {
+      ship = ship[0];
+      dstr = ship->HasRoute(nach);
+
+      if (object_name(environment()) == dstr[0])
+      {
+        _notify_fail("Aber da bist Du doch bereits.\n");
+        return 0;
+      }
+      if (t && stringp(t[2]))
+      {
+        if (t[2] == dstr[0])
+        {
+          _notify_fail("Aber das tust Du doch bereits.\n");
+          return 0;
+        }
+      }
+      write(sprintf("Ok, Du reist nun mit %s %s.\n",
+                     ship->name(WEM,1),dstr[1]));
+    }
+    if (environment(ship)==environment() && ship->short())
+    {
+      ship->Enter(this_object());
+    }
+    SetProp(P_TRAVEL_INFO, ({ environment(), ship, dstr[0], dstr[1] }) );
+    return 1;
+  }
+/* * * * * * *
+ * REISE NACH
+ * * * * * * */
+  if (sscanf(str,"nach %s",nach))
+  {
+    _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");
+
+    if (environment()->QueryProp(P_NO_TRAVELING))
+    {
+      return 0;
+    }
+    if (environment()->id("Transporter"))
+    {
+      if (!dstr = environment()->HasRoute(nach))
+      {
+        _notify_fail("Dorthin kann Dich "+environment()->name(WER,1)+
+                     " leider nicht bringen.\n");
+        return 0;
+      }
+      if (t && stringp(t[2]))
+      {
+        if (t[2] == dstr[0])
+        {
+          _notify_fail("Aber das tust Du doch bereits.\n");
+          return 0;
+        }
+      }
+      write(sprintf("Ok, Du reist jetzt mit %s %s.\n",
+                    environment()->name(WEM,1),dstr[1]));
+      
+      if (IS_WIZARD(this_object()))
+      {
+        write("Als Magier nimmst Du natuerlich die Abkuerzung.\n");
+        move(dstr[0],M_NOCHECK);
+        return 1;
+      }
+      SetProp(P_TRAVEL_INFO,({ environment(), 
+                               environment(), 
+                               dstr[0], 
+                               dstr[1] }) );
+
+      if (object_name(environment(ship = environment())) == dstr[0] && 
+          ship->short())
+      {
+        environment()->Leave(this_object());
+
+        if (environment() != ship)
+        {
+          SetProp(P_TRAVEL_INFO, 0);
+        }
+      }
+      return 1;
+    }
+    if (!pointerp(ship = TRAVELD->HasTransporter(environment())))
+    {
+      _notify_fail("Von hier aus kannst Du nicht reisen.\n");
+      return 0;
+    }
+    for (i = sizeof(ship) - 1; i >= 0; i--)
+      if (!ship[i]->HasRoute(nach))
+      {
+        ship[i] = 0;
+      }
+
+    ship -= ({ 0 });
+ 
+    if (pointerp(t) && objectp(t[1]) && (member(ship,t[1]) != -1))
+    {
+      ship = ({ t[1] });
+    }
+    if (sizeof(ship) > 1)
+    {
+      if (object_name(environment()) == ship[0]->HasRoute(nach)[0])
+      {
+        _notify_fail("Aber da bist Du doch bereits.\n");
+        return 0;
+      }
+
+      write(break_string("Dahin kannst Du mit "
+           +_traveller(map_objects(ship, "name", WEM))+" gelangen.",78));
+
+      dstr = filter(filter_objects(ship,"short"),lambda( ({'x}),
+            ({ #'==, ({#'environment, 'x}), environment() }) ) );
+
+      if (sizeof(dstr))
+      {
+        ship = dstr[0];
+      }
+      else
+      {
+        ship = ship[0];
+      }
+
+      dstr = ship->HasRoute(nach);
+
+      write(sprintf("Du waehlst %s und reist %s.\n",ship->name(WEN,1),
+                                                    dstr[1]));
+    }
+    else if (sizeof(ship) < 1)
+    {
+      _notify_fail("Nach '"+capitalize(nach)+"' kann Dich leider keines der "
+                  +"hier verkehrenden Transportmittel bringen.\n");
+      return 0;
+    }
+    else
+    {
+      ship = ship[0];
+      dstr = ship->HasRoute(nach);
+
+      if (object_name(environment()) == dstr[0])
+      {
+        _notify_fail("Aber da bist Du ja bereits.\n");
+        return 0;
+      }
+      else if (t && stringp(t[2]))
+      {
+        if (t[2] == dstr[0])
+        {
+          _notify_fail("Aber das tust Du doch bereits.\n");
+          return 0;
+        }
+      }
+      write(sprintf("Ok, Du reist nun mit %s %s.\n",ship->name(WEM),
+                                                    dstr[1]));
+    }
+    if (IS_WIZARD(this_object()))
+    {
+      write("Als Magier nimmst Du natuerlich die Abkuerzung.\n");
+      move(dstr[0],M_NOCHECK);
+      return 1;
+    }
+    if (environment(ship)==environment() && ship->short())
+    {
+      ship->Enter(this_object());
+    }
+    SetProp(P_TRAVEL_INFO, ({ environment(), ship, dstr[0], dstr[1] }) );
+    return 1;
+  }
+/* * * * * *
+ * REISE MIT
+ * * * * * */
+  if (sscanf(str, "mit %s", mit))
+  {
+    _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");
+
+    if (environment()->QueryProp(P_NO_TRAVELING))
+    {
+      return 0;
+    }
+    if (environment()->id("Transporter"))
+    {
+      if (environment()->id(mit))
+      {
+        _notify_fail("Aber das tust Du doch bereits.\n");
+        return 0;
+      }
+      else
+      {
+        _notify_fail("Beende erstmal Deine aktuelle Reise mit "+
+                      environment()->name(WEM,1)+".\n");
+        return 0;
+      }
+    }
+    if (t && objectp(t[1]) && t[1]->id(mit) && t[0] == environment())
+    {
+      _notify_fail("Aber das tust Du doch bereits.\n");
+      return 0;
+    }
+    if (!pointerp(ship = TRAVELD->HasTransporter(environment(),mit)))
+    {
+      _notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
+      return 0;
+    }
+    if (sizeof(ship) > 1)
+    {
+      write("'"+capitalize(mit)+"' koennte "
+               +_traveller(map_objects(ship,"name",WER))+" sein.\n");
+
+      dstr = filter(filter_objects(ship,"short"),lambda( ({'x}),
+            ({ #'==, ({#'environment, 'x}), environment() }) ) );
+
+      if (sizeof(dstr))
+      {
+        ship = dstr[0];
+      }
+      else
+      {
+        ship = ship[0];
+      }
+      write(sprintf("Du waehlst %s.\n", ship->name(WEN,1)));
+    }
+    else if (sizeof(ship) < 1)
+    {
+      notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
+      return 0;
+    }
+    else
+    {
+      ship = ship[0];
+      write(sprintf("Du reist nun mit %s.\n",ship->name(WEM,1)));
+    }
+    if (environment(ship)==environment() && ship->short())
+    {
+      ship->Enter(this_object());
+    }
+    if (pointerp(t) && stringp(t[2]) && stringp(t[3]) &&
+        member(ship->QueryHarbours(),t[2]) != -1)
+    {
+      write("Du behaeltst Dein bisheriges Reiseziel ("+t[3]+") bei.\n");
+      SetProp(P_TRAVEL_INFO, ({ environment(), ship, t[2], t[3] }) );
+    }
+    else
+    {
+      SetProp(P_TRAVEL_INFO, ({ environment(), ship, 0, 0 }) );
+    }
+    return 1;
+  }
+  return 0;
+}
+
