diff --git a/p/daemon/zentralbank.c b/p/daemon/zentralbank.c
new file mode 100644
index 0000000..53074d0
--- /dev/null
+++ b/p/daemon/zentralbank.c
@@ -0,0 +1,236 @@
+// MorgenGrauen MUDlib
+//
+// zentralbank.c -- Zentrale Geld-Verwaltung der Haendler im MG
+// $Id: zentralbank.c 9223 2015-05-27 21:46:58Z Zesstra $
+//
+/*
+ * $Log: zentralbank.c,v $
+ * Revision 1.5  2003/12/30 11:17:34  Vanion
+ * query_prevent_shadow fehlte. Danke fuer den Hinweis an Ogo.
+ *
+ * Revision 1.4  2003/12/30 11:12:02  Jof
+ * Ich hab Dir das File mal geklaut.
+ * Vanion
+ *
+ * Revision 1.3  1995/07/10  07:31:04  Jof
+ * typo fixed
+ *
+ * Revision 1.2  1995/07/10  07:27:59  Jof
+ * Use bank.h
+ * _query_current_money
+ *
+ * Revision 1.1  1995/07/05  16:29:26  Jof
+ * Initial revision
+ *
+ */
+#pragma no_shadow
+#pragma no_clone
+#pragma no_inherit
+#pragma strong_types,save_types
+
+#include <wizlevels.h>
+#include <properties.h>
+#include <money.h>
+
+#define NEED_PROTOTYPES
+#include <bank.h>
+
+#define TIME strftime("%H:%M",time())
+#define LS 1000000
+
+int allmoney,bank_default_percent,store_default_percent,shop_default_percent;
+int falling;
+// Geldmengen: in NPC, in Boersen, rumliegen, auf Seherkarten, Gesamtsumme,
+// Zeitpunkt der Berechnung.
+int *summen = ({0,0,0,0,0,0});
+
+nosave int last_save;
+nosave int counter;
+
+void save_me()
+{
+  save_object("/p/daemon/save/zentralbank");
+  last_save=time();
+}
+
+protected void create()
+{
+  seteuid(getuid());
+  allmoney=500000;
+  bank_default_percent=BANK_DEFAULT_PERCENT;
+  store_default_percent=STORE_PERCENT_LEFT;
+  shop_default_percent=SHOP_PERCENT_LEFT;
+  restore_object("/p/daemon/save/zentralbank");
+}
+
+private void adjust_percents()
+{
+  if (allmoney<50000   && falling>=0) falling=-1;
+  if (allmoney>1000000 && falling<=0) falling=1;
+  if (allmoney<200000 && falling>0 ) falling=0;
+  if (allmoney>80000  && falling<0 ) falling=0;
+  if (falling<0 && !((++counter)%5))
+  {
+    bank_default_percent=bank_default_percent+random(3)+1;
+    store_default_percent=store_default_percent+random(3)+1;
+    shop_default_percent=shop_default_percent+random(3)+1;
+    log_file("ZENTRALBANK",
+	sprintf("%s: PERCENTS SET TO BANK %d STORE %d SHOP %d\n",
+	  TIME,bank_default_percent,store_default_percent,
+	  shop_default_percent),LS);
+  }
+  if (falling>0)
+  {
+    bank_default_percent/=2;
+    store_default_percent/=2;
+    shop_default_percent/=2;
+    log_file("ZENTRALBANK",
+	sprintf("%s: PERCENTS SET TO BANK %d STORE %d SHOP %d\n",
+	  TIME,bank_default_percent,store_default_percent,
+	  shop_default_percent),LS);
+  }
+  if (bank_default_percent<1) bank_default_percent=1;
+  if (bank_default_percent>90) bank_default_percent=90;
+  if (store_default_percent<1) store_default_percent=1;
+  if (store_default_percent>90) store_default_percent=90;
+  if (shop_default_percent<1) shop_default_percent=1;
+  if (shop_default_percent>90) shop_default_percent=90;
+  save_me();
+}
+
+void reset()
+{
+  adjust_percents();
+}
+
+private void real_log()
+{
+  log_file("ZBANKSTATUS",sprintf("%s: %d\n",dtime(time()),allmoney),LS);
+}
+
+private void log_state()
+{
+  // nur alle 15min nen Status-Logeintrag. Reicht voellig.
+  if (find_call_out(#'real_log) == -1)
+    call_out(#'real_log,900);
+}
+
+public varargs void PayIn(int amount, int percent)
+{
+  if (amount<=0) return;
+  percent|=bank_default_percent;
+  allmoney+=amount*percent/100;
+  log_file("ZENTRALBANK",
+      sprintf("%s: Einzahlung: %d (%d brutto) von %O\n",
+	TIME,amount*percent/100,amount,previous_object()),LS);
+  log_state();
+}
+
+public int WithDraw(int amount)
+{
+  int got;
+
+  if (amount<=0) return 0;
+  if (allmoney<0) allmoney=0;
+  if (!allmoney)
+    got=0;
+  else
+  {
+    if (amount*3<allmoney)
+      got=amount;
+    else
+    {
+      got=allmoney/3;
+      if (!got) got=1;
+    }
+    allmoney-=got;
+  }
+  log_file("ZENTRALBANK",sprintf("%s: Abhebung: %6d/%6d von %O\n",
+	TIME,got, amount,previous_object()),LS);
+  log_state();
+  return got;
+}
+
+int _query_current_money()
+{
+  return allmoney;
+}
+
+int _query_bank_default_percent()
+{
+  return bank_default_percent;
+}
+
+int _query_shop_percent_left()
+{
+  return shop_default_percent;
+}
+
+int _query_store_percent_left()
+{
+  return store_default_percent;
+}
+
+// Geldmenge im Spiel
+public int *geldmenge() {
+  
+  if (summen[5] > time()-3600 || !IS_ELDER(this_player()))
+      return summen;
+
+  summen = allocate(6);
+  object *geld = clones(GELD,2);
+  foreach(object ob: geld) {
+    if (!environment(ob) || IS_LEARNER(environment(ob)))
+      continue;
+    if (environment(ob)->QueryProp(P_NPC))
+      // in NPC
+      summen[0]+=ob->QueryProp(P_AMOUNT);
+    else if (load_name(environment(ob)) == BOERSE)
+      // in boersen
+      summen[1]+=ob->QueryProp(P_AMOUNT);
+    else
+      // sonst rumliegend
+      summen[2]+=ob->QueryProp(P_AMOUNT);
+  }
+  // Seherkarten
+  geld = clones(SEHERKARTE,2);
+  mapping cards=m_allocate(sizeof(geld),1);
+  foreach(object ob: geld) {
+    cards[ob->query_owner()] = ob->QueryProp(P_AMOUNT);
+  }
+  foreach(string owner, int amount: cards)
+    summen[3]+=amount;
+  summen[4]=summen[0]+summen[1]+summen[2]+summen[3];
+  summen[5]=time();
+  return summen;
+}
+
+public void PrintGeldmenge() {
+  int *sum = geldmenge();
+  printf("NPC: %d\n"
+         "Boersen: %d\n"
+         "rumliegend: %d\n"
+         "Seherkarten: %d\n"
+         "Gesamt: %d\n"
+         "Zeit: %s\n",
+         sum[0],sum[1],sum[2],sum[3],sum[4],strftime(sum[5]));
+}
+
+void set_percents(int store,int shop,int bank)
+{
+  store_default_percent=store;
+  shop_default_percent=shop;
+  bank_default_percent=bank; 
+  log_file("ZENTRALBANK",
+      sprintf("%s: PERCENTS SET TO BANK %d STORE %d SHOP %d\n",
+	TIME,bank_default_percent,store_default_percent,
+	shop_default_percent),LS);
+}
+
+int remove()
+{
+  save_me();
+  destruct(this_object());
+  return 1;
+}
+   
