diff --git a/secure/gildenmaster.c b/secure/gildenmaster.c
new file mode 100644
index 0000000..56c5e3d
--- /dev/null
+++ b/secure/gildenmaster.c
@@ -0,0 +1,165 @@
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+//#pragma pedantic
+//#pragma range_check
+#pragma warn_deprecated
+
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#include <properties.h>
+#include <wizlevels.h>
+#include <new_skills.h>
+#include <events.h>
+
+string *valid_guilds = ({});
+
+void create() {
+  seteuid(getuid(this_object()));
+  restore_object(GUILD_SAVEFILE);
+  if (!pointerp(valid_guilds)) 
+    valid_guilds=({});
+}
+
+//noetig, da nun valid_guilds eine Variable ist
+public mixed QueryProp( string name )
+{
+  if (name==P_VALID_GUILDS) 
+      return copy(valid_guilds);
+  return 0;
+}
+
+nomask int beitreten() {
+  object pl,gilde;
+  string gname,ogname;
+
+  if (!(pl=this_player()) || !(gilde=previous_object()))
+      return 0;
+  // Gilden sind Blueprints.
+  gname=object_name(gilde);
+
+  if ((GUILD_DIR+ogname)==gname) {
+    write("Du bist schon in dieser Gilde.\n");
+    return -4;
+  }
+
+  if ((ogname=(string)pl->QueryProp(P_GUILD)) && 
+      (ogname!=(((string)pl->QueryProp(P_DEFAULT_GUILD)) || DEFAULT_GUILD))) {
+    write("Du bist noch in einer anderen Gilde.\n");
+    return -1;
+  }
+  if (gname[0..7]!=GUILD_DIR ||
+        member(valid_guilds,(gname=gname[8..]))<0) {
+      write("Diese Gilde ist leider nicht zugelassen.\n"+
+              "Bitte verstaendige einen Erzmagier.\n");
+      return -2;
+  }
+  pl->SetProp(P_GUILD,gname);
+  // Event Gildenwechsel triggern
+  EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
+      E_OBJECT: pl, E_PLNAME: getuid(pl),
+      E_ENVIRONMENT: environment(pl),
+      E_GUILDNAME: gname,
+      E_LAST_GUILDNAME: ogname ]) );
+
+  return 1;
+}
+
+static nomask void loose_ability(mixed key, mixed dat, int loss) {
+  mixed val;
+
+  val=mappingp(dat)?dat[SI_SKILLABILITY]:dat;
+  if (!intp(val) || val<=0) return;
+  val-=(val*loss)/100;if (val<=0) val=1;
+  if (mappingp(dat))
+      dat[SI_SKILLABILITY]=val;
+  else
+      dat=val;
+}
+
+varargs nomask int austreten(int loss) {
+  object pl,gilde;
+  string gname;
+  mapping skills;
+
+  if (!(pl=this_player()) || !(gilde=previous_object()))
+      return 0;
+  // Gilden muessen Blueprints sein, so. ;-)
+  gname=object_name(gilde);
+  if (gname[0..7]!=GUILD_DIR ||
+      ((string)pl->QueryProp(P_GUILD))!=gname[8..]) {
+      write("Du kannst hier nicht aus einer anderen Gilde austreten.\n");
+      return -1;
+  }
+  if (gname[8..]==(pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
+  {
+        write("Aus dieser Gilde kannst Du nicht austreten.\n");
+        return -1;
+  }
+  if (loss<=0) loss=20;
+  skills=(mapping)pl->QueryProp(P_NEWSKILLS);
+  walk_mapping(skills,"loose_ability",this_object(),loss);
+  pl->SetProp(P_NEWSKILLS,skills);
+  pl->SetProp(P_GUILD,0);
+  // Event Gildenwechsel triggern
+  EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
+      E_OBJECT: pl, E_PLNAME: getuid(pl),
+      E_ENVIRONMENT: environment(pl),
+      E_GUILDNAME: pl->QueryProp(P_GUILD),
+      E_LAST_GUILDNAME: gname ]) );
+
+  // Defaultgilde ggf. neuen Titel setzen lassen.
+  gname = (string)pl->QueryProp(P_GUILD);
+  (GUILD_DIR+"/"+gname)->adjust_title(pl);
+
+  return 1;
+}
+
+nomask static int security_check()
+{
+  if (previous_object() && geteuid(previous_object())==ROOTID)
+    return 1;
+  if (!process_call() && previous_object() && ARCH_SECURITY)
+    return 1;
+  return 0;
+}
+
+nomask int AddGuild(string gildob) {
+  object tp;
+
+  if (!stringp(gildob) || !sizeof(gildob) || !security_check() 
+      || file_size(GUILD_DIR+gildob+".c")<0)
+      return 0;
+  if (member(valid_guilds, gildob) != -1)
+      return 0;
+  valid_guilds+=({gildob});
+  save_object(GUILD_SAVEFILE);
+  return 1;
+}
+
+nomask int RemoveGuild(string gildob) {
+  object tp;
+
+  if (!stringp(gildob) || !sizeof(gildob) 
+      || !security_check())
+      return 0;
+  if (member(valid_guilds, gildob) == -1)
+      return 0;
+  valid_guilds-=({gildob});
+  
+  save_object(GUILD_SAVEFILE);
+  return 1;
+}
+
+nomask int ValidGuild(string gildenob) {
+  if (!stringp(gildenob)) 
+      return 0;
+
+  return (member(valid_guilds,gildenob)>=0);
+}
+
+nomask string *_query_valid_guilds() {return copy(valid_guilds); }
+
