diff --git a/std/living/helpers.c b/std/living/helpers.c
new file mode 100644
index 0000000..3d292c0
--- /dev/null
+++ b/std/living/helpers.c
@@ -0,0 +1,149 @@
+// MorgenGrauen MUDlib
+//
+// living/helpers.c -- (Query)Methoden fuer Hilfsobjekte, z.B. zum Tauchen
+//
+// $Id: moneyhandler.h,v 3.1 1997/02/12 13:29:09 Wargon Exp %
+
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <living/helpers.h>
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#undef NEED_PROTOTYPES
+
+public int RegisterHelperObject(object helper, int type, 
+                                string|closure callback) 
+{
+  // cb: closure auf die Callback-Funktion in previous_object()
+  closure cb;
+  // helpers: Mapping aller eingetragenen Helfer-Objekte
+  mapping helpers;
+
+  // Kein positiver Integerwert als Helfertyp uebergeben?
+  if ( !intp(type) || type < 1 )
+     raise_error(sprintf( "Wrong argument 1 to RegisterHelperObject(). "
+        "Expected positive <int>, got %O.\n", type));
+  // Kein Objekt vorhanden, an dem die Callback-Funktion gerufen werden soll?
+  if ( !objectp(helper) )
+    return HELPER_NO_CALLBACK_OBJECT;
+
+  // Funktionsname zum Zweck des Callbacks uebergeben?
+  if ( stringp(callback) ) {
+    // Dann Closure davon erstellen.
+    cb = symbol_function(callback, helper);
+    // Wenn das nicht klappt (zB weil die Funktion private ist), dann
+    // Fehler werfen und abbrechen.
+    if ( !closurep(cb) )
+      raise_error(sprintf("Error in RegisterHelperObject(): Unable to call "
+        "function %s in object %O.\n", callback, helper));
+  }
+  // Wenn schon eine Closure uebergeben wurde, dann diese direkt speichern.
+  else if ( closurep(callback) ) {
+    cb = callback;
+  }
+  // Weder Funktionsname, noch Closure, dann Fehler werfen und abbrechen.
+  else
+    raise_error(sprintf("Wrong argument 2 to RegisterHelperObject(). "
+      "Expected <string/closure>, got %O.\n",callback));
+
+  // Property auslesen und zwischenspeichern
+  helpers = QueryProp(P_HELPER_OBJECTS);
+  // Wenn die Prop leer ist, hier initialisieren
+  if ( !helpers ) {
+    helpers = ([type:({})]);
+  }
+  // Wenn der Typ noch nicht existiert, hier nachtragen.
+  else if ( !pointerp(helpers[type]) ) {
+    helpers[type] = ({});
+  }
+
+  // Closure eintragen, wenn noch nicht vorhanden
+  if ( member(helpers[type], cb)==-1 ) {
+    helpers[type] = helpers[type]+({cb});
+    SetProp(P_HELPER_OBJECTS, helpers);
+    return HELPER_SUCCESS;
+  }
+  else
+    return HELPER_ALREADY_LISTED;
+}
+
+public int UnregisterHelperObject(object helper, int type) {
+  if ( !intp(type) || type < 1 )
+     raise_error(sprintf( "Wrong argument 2 to UnregisterHelperObject(). "
+        "Expected positive <int>, got %O.\n", type));
+  if ( !objectp(helper) )
+    return HELPER_NO_CALLBACK_OBJECT;
+
+  mapping helpers = Query(P_HELPER_OBJECTS, F_VALUE);
+
+  if ( mappingp(helpers) ) {
+    foreach(closure cl: helpers[type]) {
+      if ( get_type_info(cl,2) == helper ) {
+        helpers[type] = helpers[type]-({cl});
+        return HELPER_SUCCESS;
+      }
+    }
+  }
+  return HELPER_NOTHING_TO_UNREGISTER;
+}
+
+// Querymethode fuer P_AQUATIC_HELPERS
+public mapping _query_lib_p_aquatic_helpers() {
+  mapping ret = ([]);
+  // eingetragene Callback-Closures auslesen
+  closure *helpers = 
+    ( Query(P_HELPER_OBJECTS, F_VALUE) || ([]) )[HELPER_TYPE_AQUATIC];
+  // Es sind gar keine Werte eingetragen? Dann gleich rausspringen.
+  if ( !pointerp(helpers) )
+    return ret;
+
+  // Nullelement substrahieren
+  helpers -= ({0});
+
+  if ( sizeof(helpers) ) {
+    // Mapping erstellen: Keys sind die Objekte, deren Closures eingetragen
+    // sind. Values sind die Rueckgabewerte der Closures,
+    // die dabei das Spielerobjekt und das abfragende Objekt uebergeben
+    // bekommen.
+    object *keys = map(helpers, #'get_type_info, 2);
+    int *vals = map(helpers, #'funcall, this_object(), previous_object(1));
+    ret = mkmapping(keys,vals);
+  }
+  return ret;
+}
+
+// Querymethode fuer P_AERIAL_HELPERS
+public mapping _query_lib_p_aerial_helpers() {
+  mapping ret = ([]);
+  // eingetragene Callback-Closures auslesen
+  closure *helpers = 
+    ( Query(P_HELPER_OBJECTS, F_VALUE) || ([]) )[HELPER_TYPE_AERIAL];
+
+  // Es sind gar keine Werte eingetragen? Dann gleich rausspringen.
+  if ( !pointerp(helpers) )
+    return ret;
+  
+  // Nullelement substrahieren
+  helpers -= ({0});
+
+  if ( sizeof(helpers) ) {
+    // Mapping erstellen: Keys sind die Objekte, deren Closures eingetragen
+    // sind. Values sind die Rueckgabewerte der Closures,
+    // die dabei das Spielerobjekt und das abfragende Objekt uebergeben
+    // bekommen.
+    object *keys = map(helpers,#'get_type_info, 2);
+    int *vals = map(helpers, #'funcall, this_object(), previous_object(1));
+    ret = mkmapping(keys,vals);
+  }
+  return ret;
+}
+
+// Querymethode fuer P_HELPER_OBJECTS
+public mapping _query_lib_p_helper_objects() {
+  return deep_copy(Query(P_HELPER_OBJECTS,F_VALUE));
+}
+
