diff --git a/obj/tools/questtool.c b/obj/tools/questtool.c
new file mode 100644
index 0000000..264fa7c
--- /dev/null
+++ b/obj/tools/questtool.c
@@ -0,0 +1,754 @@
+/*
+ *  The new ultimate quest administration tool
+ */
+
+/* AENDERUNGEN
+ * 2006-09-29 : Zook
+ *              Questtool an neue Felder "Attribute" und "Klasse"
+ *              angepasst.
+ * 2000-11-18 : Zook:
+ *		Questtool um neues Feld "Wartender Magier" des Questmaster
+ *		erweitert.
+ * 2000-11-18 : Zook:
+ *		Questtool um neues Feld "Gruppeneinordnung" des Questmaster
+ *		erweitert.
+ */
+
+inherit "std/thing";
+inherit "std/more";
+
+#include <defines.h>
+#include <properties.h>
+#include <language.h>
+#include <wizlevels.h>
+#include "/secure/questmaster.h"
+
+#define UA this_interactive()->_unparsed_args()
+
+#define QNAME	0
+#define QP	1
+#define XP	2
+#define ALLOW	3
+#define INFO	4
+#define LEVEL	5
+#define CLASS	6
+#define ATTR	7
+#define WIZ	8
+#define SCNDWIZ 9
+#define END    10
+
+#pragma strong_types
+
+private void Load_NumKey();
+int  Add_Quest	     ( string str );
+void ReadNewQuest    ( string str );
+int  Remove_Quest    ( string str );
+int  Change_Quest    ( string str );
+int  Restore_Quest   ( string str );
+int  Set_Quest	     ( string str );
+int  Remove_Quest    ( string str );
+int  Query_Quest     ( string str );
+int  Query_Keys      ( string str );
+int  Query_Quests    ( string str );
+int  ActivateQuest   ( string str );
+int  DeactivateQuest ( string str );
+int  GetReturn	     ( string str );
+
+string name;
+int    qp;
+int    xp;
+int    level;
+int    need;
+string *allowed;
+string info;
+string wizard;
+string scndwizard;
+int    group;
+mapping num_key;
+
+object owner;
+int    counter;
+mixed  *savequest;
+string savekey;
+int    do_change;
+string changekey;
+
+void create()
+{
+  string str;
+
+  if(IS_BLUE(ME)) return;
+  thing::create();
+  SetProp(P_GENDER,NEUTER);
+  owner = PL;
+  AddId("questtool");
+  AddId("qt");
+  SetProp(P_ARTICLE,0);
+  SetProp(P_GENDER, NEUTER);
+  str=capitalize(((str=owner->query_real_name())[<1]=='s'||str[<1]=='x'||str[<1]=='z')?str+="'":str+="s");
+  SetProp(P_NAME, str+" QuestTool");
+  SetProp(P_SHORT, str+" QuestTool");
+  SetProp(P_LONG,
+   "Das QuestTool dient der Administration von Quests. (by Kirk, 10.11.94)\n"
+  +"implementierte Kommandos:\n"
+  +"  AddQ			    : Neuen Questeintrag einfuegen\n"
+  +"  RemoveQ	  <quest>	    : Questeintrag loeschen\n"
+  +"  ChangeQ	  <quest>	    : Questeintrag aendern\n"
+  +"  ReStoreQ			    : Zuletzt geloeschten oder geaenderten\n"
+  +"				    : Questeintrag restaurieren\n"
+  +"  SetQ	  <spieler> <quest> : Quest als 'geloest' markieren\n"
+  +"  DelQ	  <spieler> <quest> : Quest als 'nicht geloest' markieren\n"
+  +"  QueryQ	  <quest>	    : Questeintrag anzeigen\n"
+  +"  QueryK			    : Alle Keys und Indices anzeigen\n"
+  +"  QueryAllQ 		    : Alle Eintraege vollstaendig anzeigen\n"
+  +"  ActiVateQ   <quest>	    : Quest im Questmaster aktivieren\n"
+  +"  DeactiVateQ <quest>	    : Quest im Questmaster deaktivieren\n\n"
+  +"  fuer <quest> kann der Index verwendet werden, den QueryK liefert!\n\n"
+  +"  (Alle Kommandos koennen abgekuerzt werden.)\n"
+	+"   -> Beispiel: DeactiVateQ == DVQ == dvq == deactivateq\n");
+
+  SetProp(P_NEVERDROP, 1);
+  SetProp(P_NODROP, 
+  "Mit Hilfe des QuestTools koennen Quests eingetragen, oder geloescht\n"+
+  "werden. Du brauchst es vielleicht noch, deshalb wirfst Du es nicht weg.\n");
+  SetProp(P_NOBUY, 1);
+  AddCmd(({ "AddQ", "addq", "AQ", "aq" }),		   "Add_Quest");
+  AddCmd(({ "RemoveQ", "removeq", "RQ", "rq" }),	   "Remove_Quest");
+  AddCmd(({ "ChangeQ", "changeq", "CQ", "cq" }),	   "Change_Quest");
+  AddCmd(({ "ReStoreQ", "restoreq", "RSQ", "rsq" }),	   "Restore_Quest");
+  AddCmd(({ "SetQ", "setq", "SQ", "sq" }),		   "Set_Quest");
+  AddCmd(({ "DelQ", "delq", "DQ", "dq" }),		   "Del_Quest");
+  AddCmd(({ "QueryQ", "queryq", "QQ", "qq" }),		   "Query_Quest");
+  AddCmd(({ "QueryK", "queryk", "QK", "qk" }),		   "Query_Keys");
+  AddCmd(({ "QueryAllQ", "queryallq", "QAQ", "qaq" }),	   "Query_Quests");
+  AddCmd(({ "ActiVateQ", "activateq", "AVQ", "avq" }),	   "ActivateQuest");
+  AddCmd(({ "DeactiVateQ", "deactivateq", "DVQ", "dvq" }), "DeactivateQuest");
+  counter = QNAME;
+  savekey = "";
+  do_change = 0;
+  num_key = ([]);
+}
+
+int _query_autoloadobj() { return 1; }
+
+void init()
+{
+  object tp;
+
+  if(!(tp = PL) || tp != environment())
+    return;
+
+  thing::init();
+
+  if ( !IS_WIZARD(tp) || tp != owner )
+    return call_out("do_remove",1);
+}
+
+static void do_remove()
+{
+  write ( ME->QueryProp(P_SHORT)+" zerfaellt zu Staub.\n");
+  say ( ME->QueryProp(P_SHORT)+" zerfaellt in "+PL->name(WESSEN)+
+       " unbefugten Haenden zu Staub.\n");
+  call_out("remove",1);
+}
+
+private void Load_NumKey()
+{
+  string *keys;
+  int i;
+
+  if ( !(keys = (string*) QM->QueryAllKeys()) ) return;
+  keys=sort_array(keys,#'>);//')
+  for ( i = 0, num_key = ([]); i < sizeof(keys); i++ )
+    num_key += ([(i+1)+"":keys[i]]);
+}
+
+int Add_Quest(string str)
+{
+  counter = QNAME;
+  write ( "Neue Quest: (Abbruch mit '.' oder '~q')\n" );
+  write ( "Key :\n" ); 
+  input_to ( "ReadNewQuest" );
+  return 1;
+}
+
+void ReadNewQuest (string str)
+{
+  mixed *oldquest;
+  int errstat;
+  int active;
+
+  if ( str == "~q" || str == "." )
+  {
+    counter = QNAME;
+    if(do_change)
+    {
+      do_change = 0;
+      changekey = "";
+      savekey = "";
+      savequest = ({});
+    }
+    return;
+  }
+
+  switch ( counter )
+  {
+    case QNAME:
+      if((!str||!sizeof(str)) && do_change)
+	name = savekey;
+      else
+	name = str;
+      counter++;
+      write ( sprintf("Punkte (>0) [%d]:\n",
+		      (do_change?(int)savequest[0]:10)) ); 
+      input_to ( "ReadNewQuest" );
+      break;
+    case QP:
+      if((!str||!sizeof(str)))
+	if(do_change)
+	  qp = (int) savequest[Q_QP];
+	else
+	  qp = 10;
+      else
+	sscanf ( str, "%d", qp );
+      counter++;
+      write ( sprintf("Erfahrung (>=0) [%d]:\n",
+		      (do_change?(int)savequest[1]:qp*1000)));
+      input_to ( "ReadNewQuest" );
+      break;
+    case XP: 
+      if((!str||!sizeof(str)))
+	if(do_change)
+	  xp = (int) savequest[Q_XP];
+	else
+	  xp = qp * 1000;
+      else
+	sscanf ( str, "%d", xp );
+      counter++;
+      write ( sprintf("Filenamen file1[,file2,...]) %s:\n",
+		      (do_change?"["+implode((string *)savequest[2],",")+"]":
+		       "")) );
+      input_to ( "ReadNewQuest" );
+      break;
+    case ALLOW:
+      if((!str||!sizeof(str)) && do_change)
+	allowed = (string *) savequest[Q_ALLOWED];
+      else
+	allowed = old_explode(implode(old_explode(str,".c"),""),",");
+      counter++;
+      write ( sprintf("Info %s:\n", (do_change?
+				     "["+break_string("\b\b\b\b\b\b"+(string)
+						      savequest[3]+"]",78,6)
+				     :"")) ); 
+      input_to ( "ReadNewQuest" );
+      break;
+    case INFO:
+      if((!str||!sizeof(str)) && do_change)
+	info = (string) savequest[Q_HINT];
+      else
+	info = str;
+      counter++;
+      write ( sprintf("Stufe (-1 <=lev<=10) (-1 ist eine Seherquest) [%d]:\n",
+		      (do_change?(int)savequest[4]:0)) );
+      input_to ( "ReadNewQuest" );
+      break;
+    case LEVEL:
+      if((!str||!sizeof(str)))
+	if(do_change)
+	  level = (int) savequest[Q_DIFF];
+	else
+	  level = 0;
+	sscanf ( str, "%d", level );
+      counter++;
+      write ( sprintf("Klasse ([012345]) [%d]:\n",
+		      (do_change?(int)savequest[5]:0)) ); 
+      input_to ( "ReadNewQuest" );
+      break;
+    case CLASS:
+      if((!str||!sizeof(str)))
+	if(do_change)
+	  need = (int) savequest[Q_CLASS];
+	else
+	  need = 0;
+      else
+	sscanf ( str, "%d", need );
+      counter++;
+      write ( sprintf("Attribut [01234]\n(1=fleissig,2=heroisch,3=episch,4=legendaer) %s:\n",
+		      (do_change?"["+(string)savequest[9]+"]":"")) );
+      input_to ( "ReadNewQuest" );
+      break;
+    case ATTR:
+      if ((!str||!sizeof(str)))
+	if (do_change)
+	  group = (int) savequest[Q_ATTR];
+	else
+	  group = 0;
+      else
+	sscanf (str, "%d", group);
+      counter++;
+      write ( sprintf("Magier %s:\n",
+		      (do_change?"["+(string)savequest[7]+"]":"")) );
+      input_to ( "ReadNewQuest" );
+    break;	
+    case WIZ:
+      if((!str||!sizeof(str)) && do_change)
+	wizard = (string) savequest[Q_WIZ];
+      else
+	wizard = str;
+      wizard = lower_case(wizard);
+      counter++;
+      write ( sprintf("Wartender Magier %s:\n",
+		      (do_change?"["+(string)savequest[8]+"]":"")) );
+      input_to ( "ReadNewQuest" );
+      break;
+    case SCNDWIZ:
+      if ((!str||!sizeof(str)) && do_change)
+	scndwizard = (string) savequest[Q_SCNDWIZ];
+      else
+	scndwizard = str;
+      scndwizard = lower_case(scndwizard);
+      counter++;
+      write ( "Eintragen (j/n)?\n" );
+      input_to ( "ReadNewQuest" );
+      break;
+    case END:
+      counter=QNAME;
+
+      if ( str != "j" && str != "ja" && str != "y" && str != "yes" )
+	return;
+
+      active = 0;
+      if ( do_change && changekey && sizeof(changekey) )
+      {
+	oldquest = (mixed *) QM->QueryQuest ( changekey );
+
+	if ( !pointerp ( oldquest ) || !sizeof ( oldquest ) )
+	{
+	  write ( "Alten Eintrag nicht gefunden.\n" );
+	  return;
+	}
+
+	errstat = (int) QM->RemoveQuest( changekey );
+
+	do_change = 0;
+	changekey = "";
+
+	switch ( errstat )
+	{
+	  case	0: write ( "Zugriff auf alten Eintrag verweigert.\n" ); return;
+	  case -1: write ( "Parameterfehler beim Loeschen.\n" ); return;
+	  case -2: write ( "Alten Eintrag nicht gefunden.\n" ); return;
+	  default: write ( "Alter Eintrag geloescht.\n" );
+	}
+	active = oldquest[6];
+	savequest = oldquest;
+	savekey   = changekey;
+      }
+
+      // add new Quest deactivated by default and keep old active flag
+      // if changing an existing entry
+      errstat= (int)QM->AddQuest(name,qp,xp,allowed,info,level,need,active,
+				 wizard, scndwizard, group);
+
+      switch ( errstat )
+      {
+	case  0: write ( "Zugriff verweigert.\n" ); break;
+	case -1: write ( "Key ungueltig oder sizeof(key) < 5.\n" ); break;
+	case -2: write ( "QP ungueltig oder < 1.\n" ); break;
+	case -3: write ( "XP ungueltig.\n" ); break;
+	case -4: write ( "Filename(n) ungueltig.\n" ); break;
+	case -5: write ( "Info ungueltig.\n" ); break;
+	case -6: write ( "Stufe ungueltig oder < 0 oder > 20.\n" ); break;
+	case -7: write ( "Aktiv-Flag < 0 oder > 1.\n" ); break;
+	case -8: write ( "Magiername ungueltig.\n" ); break;
+	case -9: write ( "Magiername des wartenden Magiers ungueltig.\n"); break;
+	case -10: write ("Falsche Gruppeneinordnung.\n"); break;
+	default: write ( "Eintrag eingefuegt.\n" );
+      }
+    default:
+      return;
+  }
+}
+
+int Remove_Quest ( string str )
+{
+  mixed *oldquest;
+  string newstr;
+  int errstat;
+
+  if ( !(str=UA) )
+  {
+    write ( "Syntax: RemoveQ <name>\n" );
+    return 1;
+  }
+
+  Load_NumKey();
+
+  if ( !(newstr = num_key[str+""]) )
+    newstr = str;
+
+  oldquest = (mixed *) QM->QueryQuest ( newstr );
+
+  if ( !pointerp ( oldquest ) || !sizeof ( oldquest ) )
+  {
+    write ( "Keine Quest dieses Namens gefunden.\n" );
+    return 1;
+  }
+
+  errstat = (int) QM->RemoveQuest( newstr );
+
+  switch ( errstat )
+  {
+    case  0: write ( "Zugriff verweigert.\n" ); break;
+    case -1: write ( "Parameterfehler.\n" ); break;
+    case -2: write ( "Quest nicht gefunden.\n" ); break;
+    default: write ( "Quest entfernt.\n" );
+  }
+
+  savequest = oldquest;
+  savekey   = newstr;
+
+  return 1;
+}
+
+int Change_Quest ( string str )
+{
+  mixed *oldquest;
+  string newstr;
+
+  if ( !(str=UA) )
+  {
+    write ( "Syntax: ChangeQ <quest>\n" );
+    return 1;
+  }
+
+  Load_NumKey();
+
+  if ( !(newstr = num_key[str+""]) )
+    newstr = str;
+
+  oldquest = (mixed *) QM->QueryQuest ( newstr );
+
+  if ( !pointerp( oldquest ) || !sizeof ( oldquest ) )
+  {
+    write ( "Keine Quest dieses Namens gefunden.\n" );
+    return 1;
+  }
+
+  do_change = 1;
+  changekey = newstr;
+  savekey = newstr;
+  savequest = oldquest;
+
+  write ( "Aktueller Eintrag:\n");
+  write ( "Key              : "+newstr+"\n" );
+  write ( "Punkte           : "+oldquest[Q_QP]+"\n" );
+  write ( "Erfahrung        : "+oldquest[Q_XP]+"\n" );
+  write ( "Filenamen        : "+implode(oldquest[Q_ALLOWED],",")+"\n" );
+  write ( "Info             : "+oldquest[Q_HINT]+"\n" );
+  write ( "Stufe            : "+oldquest[Q_DIFF]+"\n" );
+  write ( "Klasse           : "+QCLASS_STARS(oldquest[Q_CLASS])+"\n" );
+  write ( "Attribut         : "+QATTR_STRINGS[oldquest[Q_ATTR]]+"\n" );
+  write ( "Magier           : "+capitalize(oldquest[Q_WIZ])+"\n" );
+  write ( "Wartender Magier : "+capitalize(oldquest[Q_SCNDWIZ])+"\n" );
+
+
+  write ( "\nNeue Quest:     (mit '.' oder '~q' kann abgebrochen werden)\n" );
+  write ( sprintf("Key [%s]:\n", savekey) );
+  input_to ( "ReadNewQuest" );
+
+  return 1;
+}
+
+int Restore_Quest ( string str )
+{
+  int errstat;
+
+  if ( !savekey || !sizeof(savekey) )
+  {
+    write ( "\nTut mir leid!\n" );
+    write ( "Nichts zum Restaurieren gefunden ...\n" );
+    return 1;
+  }
+
+  errstat = 
+	(int)QM->AddQuest( savekey, (int) savequest[0], (int) savequest[1],
+			  (string *) savequest[2], (string) savequest[3],
+			  (int) savequest[4], (int) savequest[5],
+			  (string) savequest[6], (int) savequest[7],
+			  (string) savequest[8] );
+
+  switch ( errstat )
+  {
+    case  0: write ( "Zugriff verweigert.\n" ); break;
+    case -1: write ( "Key ungueltig oder sizeof(key) < 5.\n" ); break;
+    case -2: write ( "QP ungueltig oder < 1.\n" ); break;
+    case -3: write ( "XP ungueltig.\n" ); break;
+    case -4: write ( "Filename(n) ungueltig.\n" ); break;
+    case -5: write ( "Info ungueltig.\n" ); break;
+    case -6: write ( "Stufe ungueltig oder < 0 oder > 20.\n" ); break;
+    case -7: write ( "Aktiv-Flag < 0 oder > 1.\n" ); break;
+    case -8: write ( "Magiername ungueltig.\n" ); break;
+    case -9: write ( "Magiername ungueltig.\n"); break;
+    case -10: write ("Ungueltige Gruppennummer.\n"); break;
+    default: write ( "'"+savekey+"' restauriert.\n" );
+  }
+  savekey = "";
+  return 1;
+}
+
+int Set_Quest ( string str )
+{
+  string quest, player, newquest;
+  int created;
+  object ob;
+
+  if ( !(str=UA) || sscanf( str, "%s %s", player, quest ) != 2 )
+  {
+    write ( "Syntax: SetQ <player> <quest>\n" );
+    return 1;
+  }
+
+  created=0;
+  Load_NumKey();
+
+  if ( !(newquest = num_key[quest+""]) )
+    newquest = quest;
+
+  ob=find_player(player);
+  if(!ob)
+  {
+    ob=find_netdead(player);
+    if(!ob)
+    {
+      created=1;
+      ob=__create_player_dummy(player);
+    }
+  }
+  if(!ob)
+  {
+    write("Kein solcher Spieler gefunden.\n!");
+    return 1;
+  }
+  
+  write(ERRNO_2_STRING("GQ",(int)ob->GiveQuest(newquest,"__silent__"))+"\n");
+  if(created)
+  {
+    ob->save_me(0);
+    if(!(ob->remove()))
+    {
+    	destruct(ob);
+    }
+  }
+  return 1;
+}
+
+int Del_Quest ( string str )
+{
+  string quest, player, newquest;
+  int created;
+  object ob;
+
+  if ( !(str=UA) || sscanf( str, "%s %s", player, quest ) != 2 )
+  {
+    write ( "Syntax: DelQ <player> <quest>\n" );
+    return 1;
+  }
+
+  Load_NumKey();
+
+  if ( !(newquest = num_key[quest+""]) )
+    newquest = quest;
+
+  created=0;
+  ob=find_player(player);
+  if(!ob)
+  {
+    ob=find_netdead(player);
+    if(!ob)
+    {
+      created=1;
+      ob=__create_player_dummy(player);
+    }
+  }
+  if(!ob)
+  {
+    write("Kein solcher Spieler gefunden.\n!");
+    return 1;
+  }
+  
+  write(ERRNO_2_STRING("DQ",(int) ob->DeleteQuest ( newquest ))+"\n");
+  if(created)
+  {
+    ob->save_me(0);
+    if(!(ob->remove()))
+    {
+    	destruct(ob);
+    }
+  }
+  return 1;
+}
+
+int Query_Quest ( string str )
+{
+  mixed *quest;
+  string newstr;
+  int i;
+
+  if ( !(str=UA) )
+  {
+    write ( "Syntax: QueryQ <quest>\n" );
+    return 1;
+  }
+
+  Load_NumKey();
+
+  if ( !(newstr = num_key[str+""]) )
+	newstr = str;
+
+  quest = (mixed *) QM->QueryQuest( newstr );
+
+  if ( !pointerp( quest ) || !sizeof ( quest ) )
+  {
+    write ( "Keine Quest dieses Namens gefunden.\n" );
+    return 1;
+  }
+
+  write ( "Aktueller Eintrag:\n");
+  write ( "Key              : "+newstr );
+  if(quest[Q_ACTIVE])
+    write (" (aktiviert)\n");
+  else
+    write (" (deaktiviert)\n");
+  write ( "Punkte           : "+quest[Q_QP]+"\n" );
+  write ( "Erfahrung        : "+quest[Q_XP]+"\n" );
+  write ( break_string ( implode( quest[Q_ALLOWED], " " ), 65, "Filenamen	 : " ) );
+  write ( break_string ( quest[Q_HINT], 65, "Info             : " ) );
+  write ( "Stufe            : "+quest[Q_DIFF]+"\n" );
+  printf("Stufe (avg)      : %.2f (%d)\n", quest[Q_AVERAGE][0], 
+        quest[Q_AVERAGE][1]);
+  write ( "Klasse           : "+ QCLASS_STARS(quest[Q_CLASS])+"\n");
+  write ( "Attribute        : "+ QATTR_STRINGS[quest[Q_ATTR]]+"\n");
+  write ( "Magier           : "+capitalize(quest[Q_WIZ])+"\n" );
+  write ( "Wartender Magier : "+capitalize(quest[Q_SCNDWIZ])+"\n");
+  return 1;
+}
+
+int Query_Keys ( string str )
+{
+  string *keys, active;
+  mixed *quest;
+  int i;
+
+  if ( !(keys = (string *) QM->QueryAllKeys()) )
+    return 1;
+
+  write ( "\n" );
+  keys=sort_array(keys,#'>);//')
+  for ( i = 0; i < sizeof(keys); i++ )
+  {
+    quest = (mixed *) QM->QueryQuest(keys[i]);
+    if(quest[6])
+      active="*";
+    else
+      active=" ";
+    write(sprintf("%2d%s %-33s%s",i+1,quest[6]?"*":" ",keys[i],
+		      !(i%2)?" ":"\n"));
+  }
+  if(i%2)
+    write("\n");
+
+  return 1;
+}
+
+int Query_Quests ( string str )
+{
+  mixed *quest;
+  string *keys, rstr;
+  int i;
+
+  if ( !(keys = (mixed *) QM->QueryAllKeys()) )
+    return 1;
+
+  keys=sort_array(keys,#'>);//')
+  for ( i = 0, rstr = ""; i < sizeof(keys); i++ )
+  {
+    quest = (mixed *) QM->QueryQuest(keys[i]);
+      write ( "\nKey              : "+keys[i] );
+  if(quest[Q_ACTIVE])
+    write (" (aktiviert)\n");
+  else
+    write (" (deaktiviert)\n");
+  write ( "Punkte           : "+quest[Q_QP]+"\n" );
+  write ( "Erfahrung        : "+quest[Q_XP]+"\n" );
+  write ( break_string ( implode( quest[Q_ALLOWED], " " ), 78, "Filenamen	 : " ) );
+  write ( break_string ( quest[Q_HINT], 78, "Info		 : " ) );
+  write ( "Stufe            : "+quest[Q_DIFF]+"\n" );
+  write ( "Klasse           : "+ QCLASS_STARS(quest[Q_CLASS])+"\n");
+  write ( "Attribute        : "+ QATTR_STRINGS[quest[Q_ATTR]]+"\n");
+  write ( "Magier           : "+capitalize(quest[7])+"\n" );
+  write ( "Wartender Magier : "+capitalize(quest[8])+"\n");
+  }
+  More( rstr, 0 );
+  return 1;
+}
+
+int ActivateQuest( string str )
+{
+  mixed *quest;
+  string newstr;
+  int errstat;
+
+  if ( !(str=UA) )
+  {
+    write ( "Syntax: ActiVateQ <quest>\n" );
+    return 1;
+  }
+
+  Load_NumKey();
+
+  if ( !(newstr = num_key[str+""]) )
+	newstr = str;
+
+  switch( QM->SetActive( newstr, 1 ) )
+  {
+    case -3: write ( "Ungueltiger Flag.\n" ); break;
+    case -2: write ( "Quest war bereits aktiviert.\n" ); break;
+    case -1: write ( "Keine Quest dieses Namens gefunden.\n" ); break;
+    case  0: write ( "Zugriff verweigert\n" ); break;
+    case  1: write ( "Quest '"+newstr+"' aktiviert.\n" ); break;
+    default: write ( "unbekannter Fehlerstatus.\n" );
+  }
+  return 1;
+}
+
+int DeactivateQuest( string str )
+{
+  mixed *quest;
+  string newstr;
+  int errstat;
+
+  if ( !(str=UA) )
+  {
+    write ( "Syntax: DeactiVateQ <quest>\n" );
+    return 1;
+  }
+
+  Load_NumKey();
+
+  if ( !(newstr = num_key[str+""]) )
+	newstr = str;
+
+  switch( QM->SetActive( newstr, 0 ) )
+  {
+    case -3: write ( "Ungueltiger Flag.\n" ); break;
+    case -2: write ( "Quest war bereits deaktiviert.\n" ); break;
+    case -1: write ( "Keine Quest dieses Namens gefunden.\n" ); break;
+    case  0: write ( "Zugriff verweigert\n" ); break;
+    case  1: write ( "Quest '"+newstr+"' deaktiviert.\n" ); break;
+    default: write ( "unbekannter Fehlerstatus.\n" );
+  }
+  return 1;
+}
+
+
