diff --git a/secure/misc/twitter.c b/secure/misc/twitter.c
deleted file mode 100644
index af1145c..0000000
--- a/secure/misc/twitter.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/* rumatas twitter client, sendet text
- * an einen twitterproxyprozess, der sie dann an twitter
- * weiterschickt.
- *
- * version 2
- * mit persistenter verbindung zum proxy und input-channel
- *
- * 25.5.2016 rumata@mg.mud.de
- */
-#pragma no_clone
-
-#include <wizlevels.h>
-#include <daemon/channel.h>
-
-#define HOST "127.0.0.1"
-#define PORT 4911
-
-#define DEBUG(x) tell_object(find_player("rumata"),x+"\n")
-
-nosave variables inherit "/std/channel_supervisor";
-
-protected void create() {
-  ::create();
-	ch_read_init_file();
-  seteuid(getuid());
-  CHMASTER->join("twitter",this_object());
-}
-
-object caller;
-string msgbuf;
-
-// Explizit erlaubte Personen/UIDs mit ihren Kuerzeln
-mapping registered = ([
-	"rumata": "ru",
-	"arathorn": "ara",
-	"ark": "ark",
-	"zesstra": "ze",
-	"zook": "zo",
-	"humni": "hu",
-	"miril": "mi",
-	"gloinson": "gl",
-  "amaryllis": "ama",
-  "zaphob": "zap",
-]);
-
-// Erlaubt sind EM+ und ausgewaehlte weitere Personen
-// geprueft wird anhand der UID des Interactives und weiterhin, dass alle
-// Objekte in der Aufrufkette mindestens ein gleich grosses Level haben wie
-// der Interactive.
-int allowed() {
-	return ARCH_SECURITY
-         || ( this_interactive()
-              && member(registered, getuid(this_interactive()))
-              && secure_level() >= (query_wiz_level(geteuid(this_interactive())))
-             ) ;
-}
-// Wer darf das Tool bekommen/nutzen?
-// Alle oben eingetragenen UIDs.
-public int tool_allowed(object pl)
-{
-  return IS_ARCH(pl) || member(registered, getuid(pl));
-}
-
-string sig( object pl ) {
-	string uid = getuid(pl);
-	if( !uid ) return "??";
-	string abbr = registered[uid];
-	if( !abbr ) return uid;
-	return abbr;
-}
-
-void emit( string msg ) {
-	CHMASTER->send("twitter",this_object(),msg,MSG_SAY);
-	/*
-	foreach( string uid: m_indices(registered) ) {
-		object pl = find_player(uid);
-		if( pl ) tell_object(pl,msg);
-	}*/
-}
-
-/* Offizielle API funktion
- * xeval "/secure/misc/twitter"->twitter("@_zesstra_ welcome back")
- */
-int twitter(string msg) {
-	int err = 0;
-	if( !allowed() ) {
-		write( "Twitter ist ARCH+Berechtigte only.\n" );
-		return 0;
-	}
-	msg = msg + "^" + sig(this_interactive()) + "\n";
-	if (sizeof(msg) > 279) {
-    write("Tweet ist zu lang.\n");
-    return 0;
-  }
-
-  if(interactive(this_object())) {
-		tell_object(this_object(),msg);
-	} else {
-		msgbuf = msg;
-		caller = this_interactive();
-		if( (err=net_connect(HOST,PORT))!=0 ) {
-			write( "Konnte Tweet nicht senden. err="+err+"\n" );
-      return 0;
-		}
-	}
-  return 1;
-}
-
-// sonderfunktion fuer den fall, dass man die verbindung
-// aufbauen will, ohne dass etwas auf twitter erscheint
-void connect() {
-	int err = 0;
-	if( interactive(this_object()) ) return;
-	msgbuf = "";
-	caller = this_interactive();
-	if( (err=net_connect(HOST,PORT))!=0 ) {
-		write( "Konnte Tweet nicht connected. err="+err+"\n" );
-	}
-}
-
-varargs void logon(int flag) {
-	if( flag<0 ) {
-		tell_object(caller,"Twitterproxy antwortet nicht?\n");
-  } else {
-		enable_commands();
-		add_action("input","",1);
-		write(msgbuf);
-		if( msgbuf!="" ) emit( msgbuf );
-		//"/secure/master"->disconnect(this_object());
-	}
-}
-
-void NetDead() {
-	disable_commands();
-}
-
-string query_real_name() {
-	return "(Twitter)";
-}
-
-varargs string name( int casus, int demon ) {
-	return "twitter";
-}
-
-varargs string Name( int casus, int demon ) {
-	return "Twitter";
-}
-
-// daten werden via tell_object an dieses objekt gesendet
-// und dann nach aussen weitergeben
-void catch_tell( string msg ) {
-	if( allowed() && interactive(this_object()) ) {
-		write( msg );
-	}
-}
-
-// hier landen daten von aussen
-int input( string s ) {
-	string msg = query_verb();
-	if( s ) msg = msg + " " + s;
-	emit( msg ); //"Twitter teilt dir mit: "+msg+"\n" );
-	return 1;
-}
-
diff --git a/secure/misc/twitter_tool.c b/secure/misc/twitter_tool.c
deleted file mode 100644
index 22b0b36..0000000
--- a/secure/misc/twitter_tool.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#pragma no_shadow, no_inherit
-#pragma strong_types,save_types,rtt_checks
-#pragma pedantic,range_check,warn_deprecated
-#pragma warn_empty_casts,warn_missing_return,warn_function_inconsistent
-
-inherit "/std/secure_thing";
-
-#include <properties.h>
-#include <defines.h>
-
-#define BS(x) break_string(x,78,0,BS_LEAVE_MY_LFS)
-#define BSI(x, y) break_string(x, 78, y, BS_LEAVE_MY_LFS|BS_INDENT_ONCE)
-
-protected void create()
-{
-  ::create();
-  SetProp(P_NAME,"Twitter-Tool");
-  SetProp(P_AUTOLOADOBJ,1);
-  SetProp(P_NODROP,1);
-  SetProp(P_NEVERDROP,1);
-  SetProp(P_WEIGHT, 0);
-  AddId(({"ttool","twittertool","twitter-tool"}));
-  SetProp(P_SHORT,"Ein Twitter-Tool");
-  SetProp(P_LONG,
-    BS("Dies ist das Twitter-Tool zum Senden von Tweets aus dem MG.")+
-    BS("\nEs versteht folgende Befehle:")+
-    BSI("tweet <msg>:\nSendet den Text <msg> als Tweet des MG auf Twitter.","- ")+
-    BS("Das Senden erfolgt asynchron, kann also einige Sekunden dauern und "
-       "leider kann das Tool keinen Erfolg oder Misserfolg melden."));
-  AddCmd("tweet",
-    function int(string str)
-    {
-      notify_fail("Du solltest zumindest ein paar Buchstaben senden...\n");
-      str = PL->_unparsed_args(0);
-      if(!sizeof(str))
-        return 0;
-
-      // Der Twitter-Relay gibt Fehlermeldungen selbst aus, d.h. nur bei
-      // Erfolg muessen wir selber etwas ausgeben.
-      if ("/secure/misc/twitter"->twitter(str))
-        this_interactive()->ReceiveMsg(
-          BS(sprintf("Tweet \'%s\' wird gesendet.",str)),
-          MT_NOTIFICATION|MSG_BS_LEAVE_LFS);
-      return 1;
-    });
-}
-
-protected void NotifyMove(object dest, object oldenv, int method)
-{
-  ::NotifyMove(dest, oldenv, method);
-  // Nur die Personen erlauben, die auch im Twitter-Daemon erlaubt sind.
-  if ("/secure/misc/twitter"->tool_allowed(dest) != 1)
-  {
-    remove(1);
-  }
-}
-
-protected int PreventMove(object dest, object oldenv, int method)
-{
-  // Nur die Personen erlauben, die auch im Twitter-Daemon erlaubt sind.
-  if ("/secure/misc/twitter"->tool_allowed(dest) != 1)
-    return ME_NOT_ALLOWED;
-
-  return ::PreventMove(dest, oldenv, method);
-}
-
