diff --git a/lib/modules/Tools.pmod/Hilfe.pmod b/lib/modules/Tools.pmod/Hilfe.pmod
index 207e35a88a50f77dcb10b4252c7fd1fc8d22c219..5e7267c859c614ad050f0e5e2e0de1b8392acfdd 100644
--- a/lib/modules/Tools.pmod/Hilfe.pmod
+++ b/lib/modules/Tools.pmod/Hilfe.pmod
@@ -2,7 +2,7 @@
 
 // Incremental Pike Evaluator
 //
-// $Id: Hilfe.pmod,v 1.60 2002/04/02 21:36:52 nilsson Exp $
+// $Id: Hilfe.pmod,v 1.61 2002/04/06 19:41:22 mikael%unix.pp.se Exp $
 
 constant hilfe_todo = #"List of known Hilfe bugs/room for improvements:
 
@@ -28,23 +28,24 @@ class Command {
 
   //! Returns a one line description of the command. This help should
   //! be shorter than 54 characters.
-  string help();
+  string help(string what);
 
   //! A more elaborate documentation of the command. This should be
   //! less than 68 characters per line.
-  string doc(string with) { return help(); }
+  string doc(string what, string with) { return help(what); }
 
   //! The actual command callback. Messages to the user should be
   //! written out by using the write method in the @[Evaluator] object.
   void exec(Evaluator e, string line, array(string) words, array(string) tokens);
+
 }
 
 //! Variable reset command. Put ___Hilfe->commands->reset = Tools.Hilfe.CommandReset();
 //! in your .hilferc to have this command defined when you open Hilfe.
 class CommandReset {
   inherit Command;
-  string help() { return "Undefines the given symbol."; }
-  string doc() {
+  string help(string what) { return "Undefines the given symbol."; }
+  string doc(string what, string with) {
     return "Undefines any variable, constant, function or program, specified by\n"
       "name. Example: \"reset tmp\"\n";
   }
@@ -85,8 +86,8 @@ string format_hr_time(int i) {
 private class CommandSet {
   inherit Command;
 
-  string help() { return "Change Hilfe settings."; }
-  string doc(string with) {
+  string help(string what) { return "Change Hilfe settings."; }
+  string doc(string what, string with) {
     if(with=="format")
       return documentation_set_format;
     return documentation_set;
@@ -224,8 +225,9 @@ private class CommandSet {
 
 private class CommandExit {
   inherit Command;
-  string help() { return "Exit Hilfe."; }
+  string help(string what) { return "Exit Hilfe."; }
 
+  string doc(string what, string with) { return "Exit Hilfe.\n"; }
   void exec(Evaluator e) {
     e->write("Exiting.\n");
     destruct(e);
@@ -235,7 +237,7 @@ private class CommandExit {
 
 private class CommandHelp {
   inherit Command;
-  string help() { return "Show help text."; }
+  string help(string what) { return "Show help text."; }
 
   void exec(Evaluator e, string line, array(string) words) {
     line = words[1..]*" ";
@@ -252,7 +254,7 @@ private class CommandHelp {
     }
 
     if(sizeof(words)>1 && e->commands[words[1]]) {
-      string ret = e->commands[words[1]]->doc(words[2..]*"");
+      string ret = e->commands[words[1]]->doc(words[1], words[2..]*"");
       if(ret) write(ret);
       return;
     }
@@ -269,7 +271,7 @@ commands:
     array err = ({});
     foreach(sort(indices(e->commands)), string cmd) {
       string ret;
-      err += ({ catch( ret = e->commands[cmd]->help() ) });
+      err += ({ catch( ret = e->commands[cmd]->help(cmd) ) });
       if(ret)
 	write(" %-10s - %s\n", cmd, ret);
     }
@@ -286,7 +288,7 @@ Enter \"help me more\" for further Hilfe help.
 
 private class CommandDot {
   inherit Command;
-  string help() { return 0; }
+  string help(string what ) { return 0; }
 
   private constant usr_vector_a = ({
     89, 111, 117, 32, 97, 114, 101, 32, 105, 110, 115, 105, 100, 101, 32, 97, 32,
@@ -338,8 +340,8 @@ class CommandDump {
 
   private function write;
 
-  string help() { return "Dump variables and other info."; }
-  string doc() { return documentation_dump; }
+  string help(string what) { return "Dump variables and other info."; }
+  string doc(string what, string with) { return documentation_dump; }
 
   private void wrapper(Evaluator e) {
     if(!e->last_compiled_expr) {
@@ -413,13 +415,13 @@ class CommandDump {
       return;
     }
     write("Unknown dump specifier.\n");
-    write(doc()+"\n");
+    write(doc(0,0)+"\n");
   }
 }
 
 private class CommandHej {
   inherit Command;
-  string help() { return 0; }
+  string help(string what) { return 0; }
   void exec(Evaluator e, string line) {
     if(line[0]=='.') e->write( (string)({ 84,106,97,98,97,33,10 }) );
   }
@@ -427,8 +429,8 @@ private class CommandHej {
 
 private class CommandNew {
   inherit Command;
-  string help() { return "Clears the Hilfe state."; }
-  string doc() { return documentation_new; }
+  string help(string what) { return "Clears the Hilfe state."; }
+  string doc(string what, string with) { return documentation_new; }
 
  void exec(Evaluator e, string line, array(string) words) {
 
@@ -465,6 +467,109 @@ private class CommandNew {
  }
 }
 
+//
+// Backend subsystem
+//
+private class SubSysBackend {
+  int(0..1) is_running;
+
+  void create(){
+    is_running=0;
+  }
+
+  void start(Evaluator e, array(string) words){
+    add_constant("backend_thread",thread_create(backend_loop));
+  }
+
+  void stop(Evaluator e, array(string) words){
+    call_out(throw,0,0);
+  }
+
+  int(0..1) runningp(){ return is_running; }
+
+  private void backend_loop(){
+    is_running=1;
+    catch{
+      while(1)
+	Pike.DefaultBackend(3600.0);
+    };
+    is_running=0;
+  }
+
+}
+
+
+// 
+// General subsystem handler object.
+//
+private class SubSystems {
+  mapping subsystems;
+
+  void create (){
+    // Register the subsystems here.
+    subsystems=([
+      "backend":SubSysBackend()
+    ]);
+  }
+
+
+
+  void start(Evaluator e, string what, array(string) words){
+    if(subsystems[what]){
+      if(!subsystems[what]->runningp()){
+	subsystems[what]->start(e,words);
+      }else{
+	e->write(sprintf("%s is already running.\n",what));
+      }
+    }else{
+      e->write("No such subsystem.\n");
+    }
+  }
+
+  void stop(Evaluator e, string what, array(string) words){
+    if(subsystems[what]){
+      if(subsystems[what]->runningp()){
+	subsystems[what]->stop(e,words);
+      }else{
+	e->write(sprintf("%s is not running.\n",what));
+      }
+    }else{
+      e->write("No such subsystem.\n");
+    }
+  }
+}
+
+private class CommandStartStop {
+  inherit Command;
+  SubSystems subsystems;
+
+  void create(){
+    subsystems=SubSystems();
+  }
+  
+  string help(string what) { 
+    switch(what){
+    case "start": return "Start a subsystem."; 
+    case "stop":  return "Stop a subsystem.";
+    }
+  }
+  
+  string doc(string what, string with) { 
+    switch(what){
+    case "start": return "start backend\n\tstart the backend thread.\n"; 
+    case "stop":  return "stop backend\n\tstop the backend thread.\n"; 
+    }
+  }
+      
+  void exec(Evaluator e, string line, array(string) words) {
+    if(sizeof(words)>=2){
+      switch(words[0]){
+      case "start": subsystems->start(e,words[1],words[1..]); break;
+      case "stop":  subsystems->stop(e,words[1],words[1..]); break;
+      }
+    }
+  }
+}
 
 //
 // Support stuff..
@@ -789,6 +894,8 @@ class Evaluator {
     commands->new = CommandNew();
     commands->hej = CommandHej();
     commands->look = CommandDot();
+    commands->start = CommandStartStop();
+    commands->stop = commands->start;
     reset_evaluator();
   }