diff --git a/obj/tools/btool.c b/obj/tools/btool.c
new file mode 100644
index 0000000..d063e88
--- /dev/null
+++ b/obj/tools/btool.c
@@ -0,0 +1,121 @@
+#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/thing";
+
+#include <properties.h>
+#include <defines.h>
+
+#define BARCHIV "/d/erzmagier/boing/balance/barchives"
+
+#define BS(x) break_string(x,78,0,BS_LEAVE_MY_LFS)
+
+private varargs void print_map(mapping tmp,int short);
+
+protected void create()
+{
+  ::create();
+  SetProp(P_NAME,"Balance-Tool");
+  AddId(({"btool","balancetool","balance-tool"}));
+  SetProp(P_SHORT,"Ein Balance-Tool light");
+  SetProp(P_LONG,
+    BS("Dies ist das Balance-Tool light. Es versteht folgende Befehle:\n"
+    "- btop <n>: Zeigt den letzten genehmigten Antrag zu Top n.\n"
+    "- bsuch [-s] <str>: Sucht case-sensitiv nach str, -s bricht jeden "
+    "Eintrag nach 78 Zeichen ab.\n"
+    "- binhalt [-s]: Zeigt den gesamten Inhalt des Balancearchives, -s "
+    "bricht jeden Eintrag nach 78 Zeichen ab.\n\n"
+    "Es kann vorkommen, dass Eintraege der falschen UID zugeordnet sind, "
+    "oder dass die Genehmigung nicht sehr aussagekraeftig ist, in diesem "
+    "Fall bitte eine Mail an das Balanceteam schreiben."));
+  AddCmd("btop",
+    function int(string str)
+    {
+      int n;
+      if(!str || sscanf(str,"%d",n)!=1)
+      {
+        notify_fail(
+          BS("Syntax: btop <n>"));
+        return 0;
+      }
+      this_interactive()->ReceiveMsg(
+        BARCHIV->GetLightAnnounce(n),
+        MT_NOTIFICATION|MSG_BS_LEAVE_LFS);
+      return 1;
+    });
+  AddCmd("bsuch",
+    function int()
+    {
+      string str=this_interactive()->_unparsed_args();
+      if(!str || !sizeof(str))
+      {
+        notify_fail(
+          BS("Syntax: bsuch <str>"));
+        return 0;
+      }
+      int short;
+      string* arr=old_explode(str," ");
+      
+      if(arr[0]=="-s")
+      {
+        short=1;
+        str=implode(arr[1..]," ");
+      }
+      mapping tmp=BARCHIV->SearchIndex(str);
+      if(!sizeof(tmp))
+      {
+        this_interactive()->ReceiveMsg(
+          "Keine Eintraege gefunden.",
+          MT_NOTIFICATION);
+      }
+      else
+      {
+        print_map(tmp,short);
+      }
+      return 1;
+    });
+  AddCmd("binhalt",
+    function int(string str)
+    {
+      int short;
+      if(sizeof(str))
+      {
+        string* arr=old_explode(str," ");
+      
+        if(arr[0]=="-s")
+        {
+          short=1;
+        }
+      }
+    
+      print_map(BARCHIV->GetIndexForWizards(),short);
+      return 1;
+    });
+}
+
+private varargs void print_map(mapping tmp,int short)
+{
+	if (!mappingp(tmp))
+	{
+		this_interactive()->ReceiveMsg("Keine Daten vorhanden.\n");
+		return;
+	}
+  int* sort=sort_array(m_indices(tmp),#'>);
+  string ret="";
+  foreach(int i : sort)
+  {
+    string str=sprintf(" %4d:  %s {%s} (%s)",i,tmp[i,0],tmp[i,2],
+      strftime("%d.%m.%y",tmp[i,1]));
+    if(short)
+    {
+      ret+=BS(str[0..77]);
+    }
+    else
+    {
+      ret+=BS(str);
+    }
+  }
+  this_interactive()->More(ret);
+}
