diff --git a/obj/uhr.c b/obj/uhr.c
new file mode 100644
index 0000000..194b6ea
--- /dev/null
+++ b/obj/uhr.c
@@ -0,0 +1,86 @@
+#pragma no_clone
+#pragma no_inherit
+#pragma no_shadow
+#pragma strong_types
+
+#include <properties.h>
+#include <events.h>
+#include <time.h>
+
+private string ulog = "";
+
+void WaitForQuarterHour() {
+  while(remove_call_out("QuarterReached")!=-1);
+  call_out("QuarterReached",900-(time() % 900));
+}
+
+void create() {
+  WaitForQuarterHour();
+}
+
+/* Ueberprueft die als Parameter "str" uebergebene Uhrmeldung.
+   Rueckgabewerte: 0 fuer fehlerhafte Parameter,
+                   1 fuer korrekten Aufbau. */
+int CheckClockMsg(string str)
+{
+  int i = strstr(str, "%", 0);
+  /* Mehr als 1x %d enthalten, mehr als 1x % enthalten, oder auf das einzige
+     enthaltene % folgt kein "d". */
+  if ( sizeof(explode(str,"%d")) > 2 ||
+       sizeof(explode(str,"%")) > 2 ||
+       (i>-1 && ( i==sizeof(str)-1 || str[i+1] != 'd')))
+    return 0;
+  else
+    return 1;
+}
+
+void QuarterReached() {
+  int std, minuten;
+  string str, format;
+  int off;
+
+  int *lt=localtime(time());
+  minuten=lt[TM_MIN];
+  std=lt[TM_HOUR];
+  mapping edata = mkmapping(
+        ({TM_SEC, TM_MIN, TM_HOUR, TM_MDAY, TM_MON, TM_YEAR, TM_WDAY, TM_YDAY,
+            TM_ISDST}),
+        lt);
+
+  // Clock-Event triggern
+  EVENTD->TriggerEvent(EVT_LIB_CLOCK, edata); 
+
+  // bei Datumswechsel DATECHANGE-Event ausloesen.
+  if (std==0 && minuten < 15) {      
+      EVENTD->TriggerEvent(EVT_LIB_DATECHANGE, edata);
+  }
+
+  if (minuten <= 2) {
+    foreach(object u : users()) {
+      if((off=to_int(u->QueryProp(P_TIMEZONE)))<0)off+=24;
+      off=(std+off)%24;
+      format=u->QueryProp(P_CLOCKMSG)||"Du hoerst die Uhr schlagen: "
+	                               "Es ist jetzt %d Uhr.\n";
+      if ( !CheckClockMsg(format) )
+      {
+	tell_object(u, break_string(
+	  "So kann ich nicht arbeiten! Deine Uhrmeldung funktioniert so "
+	  "nicht. Bitte korrigiere das.", 78, "Die Uhr teilt Dir mit: "));
+	continue;
+      }
+      if (strstr(format,"%d",0)==-1)
+        str=format;
+      else
+        str=sprintf(format,off);
+      if (str!="") tell_object(u,str);
+    }
+  }
+  str = "";
+  if (minuten < 10) {
+    log_file("USER_STATISTIK", ulog);
+    ulog = sprintf("\n%s%02d: ",(!std?("# "+lt[TM_WDAY]+":\n"):""),std);
+  }
+  ulog += sprintf("%4d",sizeof(users()));
+  WaitForQuarterHour();
+}
+
