diff --git a/items/money.c b/items/money.c
new file mode 100644
index 0000000..4a9a5f4
--- /dev/null
+++ b/items/money.c
@@ -0,0 +1,340 @@
+// MorgenGrauen MUDlib
+//
+// money.c -- Unser Geld
+//
+// $Id: money.c 8893 2014-08-04 19:48:56Z Zesstra $
+
+inherit "/std/unit";
+
+#pragma strong_types,rtt_checks
+
+#include <properties.h>
+#include <language.h>
+#include <defines.h>
+#include <unit.h>
+#include <money.h>
+
+// zum debuggen (debugmode kommt aus /std/unit.c
+#include <living/comm.h>
+#define ZDEBUG(x) if (stringp(debugmode) && find_player(debugmode)) \
+  find_player(debugmode)->ReceiveMsg(x,MT_DEBUG,0,object_name()+": ",ME)
+//#define ZDEBUG(x)
+
+protected void NotifyMove(object dest, object oldenv, int method)
+{
+  // Logg-Funktion, um Nicht-Standard-Geldbugs zu finden.
+  // Eingebaut 27.03.2000 - Tiamak
+  // Vor vereinigen mit anderen Geldobjekten in NotifyMove().
+  object moneylog = find_object("/p/daemon/moneylog");
+  if ( (!environment() && previous_object() &&
+        !query_once_interactive(previous_object()) &&
+        load_name(previous_object()) != GELD) &&
+        moneylog)
+      moneylog->AddMoney( previous_object(), Query(U_REQ) );
+
+  // Hier passiert Vereinigung mit anderen Geldobjekten... Etc.
+  ::NotifyMove(dest, oldenv, method);
+
+  // Zu diesem Zeitpunkt sind Vereinigungen mit anderen Geldobjekten in dest
+  // schon gelaufen, hier muessen jetzt noch Geldboersen und Seherkarten
+  // beruecksichtigt werden.
+  // Sollverhalten ist:
+  // Vereinigung mit Boersen+geldkarten nur in Lebewesen.
+  // Ausserdem soll nicht vereinigt werden, wenn man muenzen aus einer Boerse
+  // nimmt. 
+  // A) Betrag ist positiv:
+  // A1) mit der ersten geld-enhaltenen Geldboerse im Inventar vereinigen.
+  //     Gibt es keine geld-gefuellte, wird die erste leere genommen.
+  // B) Betrag ist negativ:
+  //    Es wird versucht, mit geldgefuellten Boersen und aktiven Seherkarten
+  //    (d.h. Karten, diesem Environment gehoeren) zu vereinigen.
+  //    Es wird erst einer Boersen "abgebucht" (falls vorhanden) und dann
+  //    (falls noch noetig) von einer Geldkarte. Ist der Betrag am Ende
+  //    negativ, wird ein Fehler ausgeloest.
+  if (!living(dest))
+    return;
+  // wenn wir aus einer Boerse in diesem Environment kommen, vereinigen wir
+  // uns nicht wieder erneut.
+  if (load_name(oldenv) == BOERSE
+      && environment(oldenv) == environment())
+    return;
+
+  int amount = QueryProp(P_AMOUNT);
+  ZDEBUG(sprintf("NotifyMove 1: amount: %d\n",
+         amount));
+  if (amount > 0)
+  {
+    object boerse = present(GELDBOERSE_MIT_GELD, environment())
+                    || present(BOERSEID, environment());
+    if (boerse)
+    {
+      boerse->MergeMoney(this_object());
+      // Sollten wir jetzt P_AMOUNT == 0 haben, zerstoert uns der Code aus
+      // unit.c spaeter.
+      ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 1: amount: %d\n",
+             QueryProp(P_AMOUNT)));
+    }
+  }
+  else if (amount < 0)
+  {
+    object boerse = present(GELDBOERSE_MIT_GELD, environment());
+    if (boerse)
+    {
+      boerse->MergeMoney(this_object());
+      ZDEBUG(sprintf("NotifyMove nach Boersenvereinigung 2: amount: %d\n",
+             QueryProp(P_AMOUNT)));
+    }
+    // wenn immer noch was auszugleichen ist, Geldkarte versuchen.
+    if (QueryProp(P_AMOUNT) < 0)
+    {
+      object geldkarte = present(SEHERKARTEID_AKTIV, environment());
+      if (geldkarte)
+      {
+        geldkarte->MergeMoney(this_object());
+        ZDEBUG(sprintf("NotifyMove nach Kartenvereinigung: amount: %d\n",
+               QueryProp(P_AMOUNT)));
+      }
+    }
+    if (QueryProp(P_AMOUNT) < 0)
+      catch(raise_error(sprintf(
+            "Geld mit negativem Betrag immer noch negativ nach "
+            "Vereinigung mit allen Geldquellen im Inventar: %O. Rest: %d\n",
+            environment(), QueryProp(P_AMOUNT))); publish);
+  }
+}
+
+int _set_autoloadobj( mixed args )
+{
+  if (pointerp(args))
+    args=args[0];
+  if (stringp(args))
+    sscanf(args,"%d",args);
+  if (!intp(args))
+    args=0;
+  return SetProp(P_AMOUNT,args);
+}
+
+int _query_autoloadobj()
+{
+  return (int)Query(P_AMOUNT, F_VALUE);
+}
+
+string current_long() {
+ int r;
+ r=Query(U_REQ);
+ return(break_string(
+  ((r==1)?"":"Du betrachtest eine der Muenzen genauer:\n")+
+  "Die Oberflaeche der Goldmuenze ist vom taeglichen Gebrauch ziemlich "
+  "mitgenommen. Kratzer und sogar Bissspuren zieren die Praegemuenze "
+  "zusaetzlich zum Konterfei "+
+  ({"des Jof","der Rumata","des Zook"})[(Query(P_AMOUNT)+r)%3]+
+  ". Der Rand "+
+  ((!(r%2))?"scheint etwas beschaedigt zu sein.":
+            "ist wenigstens unbeschaedigt."),
+  78,0,BS_LEAVE_MY_LFS));
+}
+
+static int action_schnipps(string str) {
+ if(!id(str)) return 0;
+ write(break_string(
+  ((Query(U_REQ)==1)?"Du nimmst die Muenze":
+                     "Du nimmst eine der Muenzen")+
+  " und schnippst sie in die Luft. Sie klingt hell auf. "+
+  ((this_player() && this_player()->QueryAttribute(A_DEX)>10)?
+   "Geschickt faengst Du sie wieder auf.":
+   "Sie plumpst Dir wieder in die Hand und beinahe laesst Du "
+   "sie fallen."),78));
+ if(this_player() && environment(this_player()))
+  tell_room(environment(this_player()),
+            break_string(this_player()->Name()+" schnippt mit hellem "
+                         "Klingen ein Muenze in die Luft und faengt sie "
+                         "wieder.",78),
+            ({this_player()}));
+ return 1;
+}
+
+static int action_pruefe(string str) {
+ if(!id(str)) return 0;
+ write(break_string(
+  ((Query(U_REQ)==1)?"Du nimmst die Muenze":
+                     "Du nimmst eine der Muenzen")+
+  " und beisst vorsichtig hinein. Dein Zahn versinkt tief im reinen Gold, "
+  "und Du bist Dir nun sicher, dass diese Muenze auch wirklich echt ist.",
+  78));
+ if(this_player() && environment(this_player()))
+  tell_room(environment(this_player()),
+            break_string(this_player()->Name()+" beisst in eine Muenze "
+                         "und schaut irgendwie befriedigt drein.",78),
+            ({this_player()}));
+ return 1;
+}
+
+
+static string DetKonterfei() {
+ string m;
+ switch((Query(P_AMOUNT)+Query(U_REQ))%3) {
+  default:
+  case 0:
+        m="Jofs rundes Gesicht grinst Dich vertrauenserweckend und "
+          "freundlich an.";break;
+  case 1:
+        m="Rumata scheint Dir zuzublinzeln.";break;
+  case 2:
+        m="Zooks Gesicht schaut ziemlich frisch gepraegt drein. Wenn "
+          "eine der Muenzen beim Schnippen klingt, dann bestimmt die.";break;
+ }
+ return(break_string(m,78));
+}
+
+
+static string DetRand() {
+ return(break_string(
+  ((!(Query(U_REQ)%2))?
+            "Der Rand der Muenze ist zerklueftet und abgeschabt. Ob "
+            "da jemand versucht hat, das Gold der Muenze abzuschaben, "
+            "um sich etwas nebenher zu verdienen?":
+            "Der Rand ist vollkommen in Ordnung, ein wirklich frische "
+            "Praegung."),78));
+}
+
+
+static int action_wurf(string str)
+{
+  int num, part;
+
+  if (!id(str))
+    return 0;
+
+  num = Query(U_REQ);
+  write (break_string(
+	 ((num==1)?"Du nimmst die Muenze":
+	  sprintf("Du nimmst %d Muenzen", num))+
+	   ", wirfst sie hoch, laesst sie zu Boden prasseln und "
+	   "betrachtest das Ergebnis:", 78));
+  if (this_player() && environment(this_player()))
+    tell_room(environment(this_player()),
+	      break_string(this_player()->Name()+" wirft "+
+         	   ((num==1)?"eine Muenze":
+			   sprintf("%d Muenzen", num))+
+		   " hoch, laesst sie zu Boden prasseln und betrachtet "
+		   +"das Ergebnis:", 78), ({this_player()}));
+
+  if (num == 1) {
+    if (random(1000000) == 123456) {
+      write("   Die Muenze bleibt auf dem Rand stehen.\n");
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  "   Die Muenze bleibt auf dem Rand stehen.\n",
+		  ({this_player()}));
+    }
+    else if (random(100) < 50) {
+      write("   Kopf.\n");
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  "   Kopf.\n",
+		  ({this_player()}));
+    }
+    else {
+      write("   Zahl.\n");
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  "   Zahl.\n",
+		  ({this_player()}));
+    }
+  }
+  else {
+    part = 5*num + random(num+1) - random(num+1) // etwas Gauss-verteilen
+		 + random(num+1) - random(num+1)
+		 + random(num+1) - random(num+1)
+		 + random(num+1) - random(num+1)
+		 + random(num+1) - random(num+1);
+    part = (part+5)/10;
+
+    if (part) {
+      printf("   %dx Kopf", part);
+      if (part != num)
+	printf(" und %dx Zahl", num-part);
+      if(this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  sprintf("   %dx Kopf", part)+
+		  ((part!=num)?sprintf(" und %dx Zahl", num-part):"")+
+		  ".\n",
+		  ({this_player()}));
+    }
+    else {
+      printf("   %dx Zahl", num);
+      if (this_player() && environment(this_player()))
+	tell_room(environment(this_player()),
+		  sprintf("   %dx Zahl.\n", num),
+		  ({this_player()}));
+    }
+    write (".\n");
+  }
+
+  write(break_string(
+	"Schnell sammelst Du "+
+	((num==1)?"Deine Muenze":"Deine Muenzen")+" wieder ein.", 78));
+  if (this_player() && environment(this_player()))
+    tell_room(environment(this_player()),
+	      break_string(this_player()->Name()+ " sammelt schnell "+
+	      ((num==1)?(this_player()->QueryPossPronoun(FEMALE,WEN, SINGULAR)
+			 +" Muenze wieder ein."):
+	       (this_player()->QueryPossPronoun(FEMALE,WEN, PLURAL)+
+		" Muenzen wieder ein."))), ({this_player()}));
+  return 1;
+}
+
+protected void create()
+{
+  mixed plist, i;
+
+  ::create();
+  SetProp(P_NAME,({"Muenze","Muenzen"}));
+  Set(P_LONG,#'current_long);
+  SetProp(P_SHORT,"Geld");
+  SetProp(P_INFO,"Du hast bei diesem Geld ein sicheres Gefuehl.\n");
+  SetProp(P_MATERIAL,([MAT_GOLD:100]));
+  AddSingularId("muenze");
+  AddPluralId("muenzen");
+  AddSingularId("goldstueck");
+  AddPluralId("goldstuecke");
+  AddId(({"geld", GELDID}));
+  SetProp(P_GENDER,FEMALE);
+  SetCoinsPerUnits(1,1);
+  SetGramsPerUnits(1,4);
+
+  if (!clonep(this_object())) {
+    set_next_reset(-1);
+    return;
+  }
+  AddDetail(({"rand","muenzrand"}),#'DetRand);
+  AddDetail(({"oberflaeche","flaeche"}),break_string(
+   "Diese Muenze ist schon durch viele Haende gegangen. Die Kratzer "
+   "zeugen davon, dass sie nicht selten allein getragen wurde und die "
+   "Bissspuren von mangelndem Vertrauen.",78));
+  AddDetail("kratzer",break_string(
+   "Das Konterfei ist schon ganz schoen zerkratzt.",78));
+  AddDetail(({"bissspur","bissspuren"}),break_string(
+   "Da hat doch tatsaechlich jemand so wenig Vertrauen in das Gold "
+   "gezeigt, dass er hineingebissen hat, um es zu pruefen.",78));
+  AddDetail(({"bild","konterfei","praegung"}),#'DetKonterfei);
+  AddDetail("gold","Es glaenzt Dich verheissungsvoll an.\n");
+
+  AddCmd(({"pruef","pruefe","beiss","beisse","test","teste"}),
+         #'action_pruefe);
+  AddCmd(({"schnipp","schnippe","schnipps","schnippse"}),
+         #'action_schnipps);
+
+  AddCmd( ({ "wirf", "werf", "werfe" }), #'action_wurf);
+}
+
+varargs string GetDetail(mixed key,mixed race,int sense) {
+ string m;
+ if(stringp(m=::GetDetail(&key,&race,&sense)) && sizeof(m)) {
+  int r;
+  r=Query(U_REQ);
+  if(r!=1) m=sprintf("Du betrachtest eine der %d Muenzen genauer:\n",r)+m;
+ }
+ return m;
+}
+
