diff --git a/p/daemon/classdb.c b/p/daemon/classdb.c
new file mode 100644
index 0000000..2db40ae
--- /dev/null
+++ b/p/daemon/classdb.c
@@ -0,0 +1,91 @@
+// MorgenGrauen MUDlib
+//
+// /obj/classd.c -- master object for classes.
+//
+// Soll irgendwann mal Klassen aehnlich der Material-DB verwalten, momentan
+// machts es erstmal einfach eine Ersetzung von Aliasen und ein Hinzufuegen
+// von impliziten Klassen.
+//
+// $Id$
+#pragma strict_types,save_types
+#pragma no_clone, no_shadow, no_inherit
+#pragma verbose_errors,combine_strings
+#pragma pedantic, range_check, warn_deprecated
+
+#include <class.h>
+
+// Mapping von Aliasen fuer Klassen. Aliase duerfen nicht rekursiv sein.
+private nosave mapping classaliases =
+  ([
+   ]);
+// Mapping von impliziten Klassen fuer eine gegebene Klasse. Implizite Klassen
+// sind als Array von Klassennamen gegeben. Implizite Klassen duerfen zur Zeit
+// nicht rekursiv sein und keine Aliase enthalten.
+private nosave mapping implicitclasses =
+  ([
+     CL_ZOMBIE:       ({CL_UNDEAD}),
+     CL_SKELETON:     ({CL_UNDEAD}),
+     CL_GHOUL:        ({CL_UNDEAD}),
+     CL_VAMPIRE:      ({CL_UNDEAD}),
+     CL_HOBGOBLIN:    ({CL_GOBLIN}),
+     CL_MAMMAL_LAND:  ({CL_MAMMAL, CL_ANIMAL}),
+     CL_MAMMAL_WATER: ({CL_MAMMAL, CL_ANIMAL}),
+     CL_SNAKE:        ({CL_REPTILE}),
+     CL_ARACHNID:     ({CL_ANIMAL}),
+     CL_BIRD:         ({CL_ANIMAL}),
+     CL_FISH:         ({CL_ANIMAL}),
+     CL_FROG:         ({CL_ANIMAL}),
+     CL_INSECT:       ({CL_ANIMAL}),
+     CL_MAMMAL:       ({CL_ANIMAL}),
+     CL_REPTILE:      ({CL_ANIMAL}),
+     CL_SNAKE:        ({CL_ANIMAL}),
+     CL_GOLEM:        ({CL_CONSTRUCT}),
+   ]);
+
+protected void create() {
+}
+
+/** Gibt den Alias der Klasse <cls> zurueck.
+ * @param[in] cls string - Klassenname
+ * @return string* - Alias von Klasse <cls>
+ */
+public string * QueryClassAlias(string cls) {
+  if (!stringp(cls))
+      raise_error(sprintf(
+            "Got wrong argument, expected string, got %.50O\n",cls));
+  return copy(classaliases[cls]) || cls;
+}
+
+/** Gibt die impliziten Klassen der Klasse <cls> zurueck.
+ * @param[in] cls string - Klassenname
+ * @return string* - Liste von impliziten Klassen von <cls>
+ */
+public string * QueryImplicitClasses(string cls) {
+  if (!stringp(cls))
+      raise_error(sprintf(
+            "Got wrong argument, expected string, got %.50O\n", cls));
+  return copy(implicitclasses[cls]) || ({});
+}
+
+/** Adds implicit classes to the classes given in <classes>.
+ * Ausserdem werden Klassenaliase aufgeloest.
+ * @param[in] classes string* - Klassenliste.
+ * @return string* - neue Klassenliste
+ * @attention Kann das uebergebene Array aendern. Das Ergebnisarray muss nicht
+ * unique sein, sondern kann Dubletten enthalten.
+ */
+public string * AddImplicitClasses(string *classes) {
+  if (!pointerp(classes))
+      raise_error(sprintf(
+          "Got wrong argument, expected array, got %.50O\n",classes));
+  foreach(string cls : &classes) {
+      // zuerst Aliase ersetzen
+      if (member(classaliases, cls))
+          cls = classaliases[cls];
+      // dann implizite Klassen addieren.
+      if (member(implicitclasses, cls))
+          classes += implicitclasses[cls];
+  }
+  return classes;
+}
+
