diff --git a/obj/tools/newstool.c b/obj/tools/newstool.c
new file mode 100644
index 0000000..0e67197
--- /dev/null
+++ b/obj/tools/newstool.c
@@ -0,0 +1,335 @@
+inherit "std/thing";
+
+#include <properties.h>
+#include <language.h>
+#include <config.h>
+#include <news.h>
+#include <defines.h>
+
+#define UA PL->_unparsed_args()
+
+void create()
+{
+  string str;
+  if (!clonep(this_object())) return;
+  ::create();
+  SetProp(P_LONG,"Ein News-Gruppen-Tool.\n\
+Befehle: addg      <grname> <ownername>   : Gruppe erzeugen\n\
+         removeg   <grname>               : Gruppe loeschen\n\
+         addw      <grname> <username>    : Schreibberechtigten eintragen\n\
+         removew   <grname> <username>    : Schreibberechtigten austragen\n\
+         addd      <grname> <username>    : Loeschberechtigten eintragen\n\
+         removed   <grname> <username>    : Loeschberechtigten austragen\n\
+         addr      <grname> <username>    : Leseberechtigten eintragen\n\
+         remover   <grname> <username>    : Leseberechtigten austragen\n\
+         ginfo     <grname>               : Info ueber Gruppe abfragen\n\
+         setexpire <grname> <tage>        : Expiretime setzen\n\
+         setmaxmsg <grname> <anz>         : Maxmsg setzen\n\
+         setg <grname> <loeschlev> <schreiblev> <leselev> <maxmsg> <expire>\n");
+  str=capitalize(((str=getuid(this_player()))[<1]=='s'||str[<1]=='x'||
+		  str[<1]=='z')?str+="'":str+="s");
+  SetProp(P_SHORT,str+" NewsTool");
+  SetProp(P_NAME,str+" NewsTool");
+  SetProp(P_GENDER,NEUTER);
+  SetProp(P_ARTICLE,0);
+  AddId("newstool");
+  AddId("newsgruppentool");
+  AddId("news-gruppen-tool");
+  SetProp(P_AUTOLOADOBJ,1);
+  SetProp(P_NODROP,1);
+}
+
+void init()
+{
+  add_action("addg","addg");
+  add_action("removeg","removeg");
+  add_action("addw","addw");
+  add_action("removew","removew");
+  add_action("addd","addd");
+  add_action("removed","removed");
+  add_action("addr","addr");
+  add_action("remover","remover");
+  add_action("setg","setg");
+  add_action("setexpire","setexpire");
+  add_action("expire","expire");
+  add_action("ginfo","ginfo");
+  add_action("setmaxmsg","setmaxmsg");
+}
+
+int addr(string str)
+{
+  mixed *arr;
+  string st1, st2;
+  
+  if ((str=UA)=="" || sscanf(str,"%s %s",st1,st2) !=2){
+    write("addr <groupname> <username>\nAnschliessend darf der User unabhaengig vom Wizlevel die Gruppe lesen.\n");
+    return 1;
+  }
+  
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->AddAllowed(st1,({}),({}),arr)){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int remover(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("remover <gruppenname> <username>\nDanach darf der User die Gruppe nur noch lesen, wenn sein Wizlevel dies erlaubt.\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->RemoveAllowed(st1,({}),({}),arr)){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int addd(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("addd <gruppe> <user>\nUser darf Artikel loeschen (unabh vom Wizlevel)\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  	switch ("/secure/news"->AddAllowed(st1,arr,({}),({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int removed(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("removed <gruppe> <user>\nUser darf nur noch Artikel loeschen, wenn sein Wizlevel das erlaubt.\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->RemoveAllowed(st1,arr,({}),({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int addw(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("addw <gruppe> <user>\nUser darf Artikel schreiben (unabh vom Wizlevel)\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->AddAllowed(st1,({}),arr,({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int removew(string str)
+{
+  mixed *arr;
+  string st1, st2;
+
+  if (!(str=UA) || sscanf(str,"%s %s",st1,st2) !=2){
+    write("removew <gruppe> <user>\nUser darf nur noch Artikel schreiben, wenn sein Wizlevel dies erlaubt.\n");
+    return 1;
+  }
+
+  arr=old_explode(st2," ")-({""});
+  switch ("/secure/news"->RemoveAllowed(st1,({}),arr,({}))){
+    case 0: write("Param err\n"); break;
+    case 1: write("Ok.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such board\n"); break;
+  }
+  return 1;
+}
+
+int setg(string str)
+{
+  string name;
+  int dlevel, wlevel, rlevel, maxmessages, expire;
+
+  if (!(str=UA) ||
+      sscanf(str,"%s %d %d %d %d %d",name,dlevel,wlevel,rlevel,maxmessages,expire) != 6) {
+    write("setg <gruppe> <loeschlevel> <schreiblevel> <leselevel> <maxmessages> <expire>\nGruppenparameter setzen, Bedeutung (Defaultwerte in Klammern):\n\
+    name              : Der Name der Newsgroup\n\
+    loeschlevel  (20) : Wizlevel, ab dem User Artikel loeschen koennen\n\
+    schreiblevel ( 0) : Wizlevel, ab dem User Artikel schreiben koennen\n\
+    leselevel    ( 0) : Wizlevel, ab dem User Artikel lesen koennen\n\
+    maxmessages  (40) : Maximale Anzahl Artikel in einer Newsgruppe\n\
+    expire       (-1) : Expiretime in Tagen, -1 = nie\n");
+    return 1;
+  }
+  expire=86400*expire;
+  switch("/secure/news"->SetGroup(name, dlevel, wlevel, rlevel, maxmessages,expire)){
+    case 1: write("Ok\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group\n"); break;
+  }
+  return 1;
+}
+
+int setexpire(string str)
+{
+  string name;
+  int expire;
+  mixed *gr;
+
+  if (!(str=UA)||sscanf(str,"%s %d",name,expire)!=2)
+  {
+    write("setexpire <gruppe> <tage>\n");
+    return 1;
+  }
+  expire=86400*expire;
+  if (!pointerp((gr="/secure/news"->GetGroup(name))))
+  {
+    write("Get group error\n");
+    return 1;
+  }
+  switch("/secure/news"->SetGroup(name, gr[G_DLEVEL], gr[G_WLEVEL], gr[G_RLEVEL], gr[G_MAX_MSG],expire)){
+    case 1: write("Ok\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group\n"); break;
+  }
+  return 1;
+}
+
+int setmaxmsg(string str)
+{
+  string name;
+  int maxmsg;
+  mixed *gr;
+  
+  if (!(str=UA)||sscanf(str,"%s %d",name,maxmsg)!=2)
+  {
+    write("setexpire <gruppe> <tage>\n");
+    return 1;
+  }
+  if (!pointerp((gr="/secure/news"->GetGroup(name))))
+  {
+    write("Get group error\n");
+    return 1;
+  }
+  switch("/secure/news"->SetGroup(name, gr[G_DLEVEL], gr[G_WLEVEL], gr[G_RLEVEL], maxmsg, gr[G_EXPIRE])){
+    case 1: write("Ok\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group\n"); break;
+  }
+  return 1;
+}
+
+int ginfo(string str)
+{
+  mixed *gr;
+  int i;
+  
+  if (!(str=UA))
+  {
+    write("Usage: ginfo <gname>\n");
+    return 1;
+  }
+  if (!pointerp((gr="/secure/news"->GetGroup(str))))
+  {
+    write("Get group error\n");
+    return 1;
+  }
+  if (gr[11]==-1)
+  {
+    write("Group \""+gr[0]+"\" does not exist.\n");
+    return 1;
+  }
+        //         1         2         3         4         5         6         7 
+        //123456789012345678901234567890123456789012345678901234567890123456789012345678
+  printf("------------------------------------------------------------------------------\n");
+  
+  printf("Rubrik  : %s (%s) Savefile: %s\n\n",gr[0],capitalize(gr[1]),gr[2]);
+  printf("Messages: %i/%i    Expire: %i Tage.\n\n",
+		  (pointerp(gr[11])?sizeof(gr[11]):0),gr[10],gr[3]/86400);  
+  
+  printf( break_string((sizeof(gr[6])?"("+(CountUp(map(gr[6],#'capitalize)))+")":" "), 78, "Readers : "+gr[9]+" ",16));
+  
+  printf( break_string((sizeof(gr[5])?"("+(CountUp(map(gr[5],#'capitalize)))+")":" "), 78, "Writers : "+gr[8]+" ",16));
+  
+  printf( break_string((sizeof(gr[4])?"("+(CountUp(map(gr[4],#'capitalize)))+")":" "), 78, "Deleters: "+gr[7]+" ",16));
+  
+  printf("------------------------------------------------------------------------------\n");
+  return 1;
+}
+    
+int removeg(string str)
+{
+  if (!(str=UA))
+  {
+    write("removeg <gruppenname>\nGruppe LOESCHEN.\n");
+    return 0;
+  }
+  switch("/secure/news"->RemoveGroup(str)){
+    case 1: write("Ok. Bitte nicht vergessen, das Savefile der Newsgroup von Hand zu entfernen !\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission\n"); break;
+    case -2: write("No such group"); break;
+  }
+  return 1;
+}
+
+int addg(string str)
+{
+  string name, owner;
+
+  if (!(str=UA) || sscanf(str,"%s %s",name,owner)!=2)
+  {
+    write("addg <gruppe> <user>\nGruppe anlegen, <user> wird Besitzer der Gruppe\n");
+    return 1;
+  }
+  switch ("secure/news"->AddGroup(name, owner)){
+    case 1: write("Ok.\n"); break;
+    case 0: write("Param error.\n"); break;
+    case -1: write("No permission.\n"); break;
+    case -2: write("Group already there\n"); break;
+    case -3: write("Owner not found.\n"); break;
+    case -4: write("Savefile already in use.\n"); break;
+  }
+  return 1;
+}
+  
+int expire()
+{
+  "/secure/news"->expire_all();
+  write("Expiring startet.\n");
+  return 1;
+}
