diff --git a/doc/master/master-all b/doc/master/master-all
new file mode 100644
index 0000000..0a325bc
--- /dev/null
+++ b/doc/master/master-all
@@ -0,0 +1,234 @@
+NAME
+        master for LDMud 3.3
+
+DESCRIPTION
+        This directory contains descriptions for the functions that
+        LDMud expects to find in the master object (similar to lfuns,
+        but for the master object only). The name of the master object
+        is hardcoded in the parser, but can also be specified on
+        the commandline (usually to "secure/master").
+
+        The master is the gateway between the interpreter and the
+        mudlib to perform actions with mudlib specific effects. Calls
+        to the master by the interpreter have an automatic catch() in
+        effect. Functions to be called by the driver can be public
+        or static, but not private.
+
+        Note that the master is loaded first of all objects. Thus you
+        shouldn't inherit an other object, nor is the compiler able to
+        search include files (read: they must be specified with full
+        path).
+
+        Amylaar says: actually, you can inherit, but the file will be
+        loaded then before the master, which isn't good for most
+        files.
+
+        A short survey of the things that happen at system startup
+        time:
+
+        The Initialisation functions are called after (re)loading the
+        master to establish the most basic operation parameters.
+
+        The initialisation of the mud on startup follows this schedule:
+          - The interpreter evaluates the commandline options and
+            initializes itself.
+          - The master is loaded, but since the driverhooks are not set yet,
+            no standard initialisation lfun is called.
+          - get_master_uid() is called. If the result is valid, it becomes the
+            masters uid.
+          - inaugurate_master() is called.
+          - flag() is called for each given '-f' commandline option.
+          - get_simul_efun() is called.
+          - the WIZLIST is read in.
+          - epilog() is called. If it returns an array of strings,
+            they are given one at a time as argument to preload().
+            Traditionally, these strings are the filenames of the objects to
+            pre-load, which preload() then does.
+          - The interpreter sets up the IP communication and enters
+            the backend loop.
+
+        If the master is reloaded during system operation, these
+        actions are taken:
+          - The master is loaded, and its initialisation lfun is
+            called according to the settings of the driverhooks (if set).
+          - Any auto-include string and all driverhooks are cleared.
+          - get_master_uid() is called. If the result is valid, it becomes the
+            masters uid and euid.
+          - inaugurate_master() is called.
+
+        If the master was destructed, but couldn't be reloaded, the old
+        master object could be reactivated. In that case:
+          - reactivate_destructed_master() is called.
+          - inaugurate_master() is called.
+
+
+        Security hint: most of these functions are not useful to be
+        called directly from other objects and can be made private or
+        static. Unlike create(), these functions that are applied to
+        the master object are found by the interpreter even if not
+        publicly accessible.
+
+
+
+        A short reference to all expected master functions...
+        ----------------------------------------------------------------
+            Initialisation
+
+        void inaugurate_master ()
+          Perform mudlib specific setup of the master.
+
+        string get_master_uid ()
+          Return the string to be used as uid (and -euid) of a
+          (re)loaded master.
+
+        void flag (string arg)
+          Evaluate an argument given as option '-f' to the driver.
+
+        string *epilog (int eflag)
+          Perform final actions before opening the system to users.
+
+        void preload (string file)
+          Preload a given object.
+
+        void external_master_reload ()
+          Called after a reload of the master on external request.
+
+        void reactivate_destructed_master (int removed)
+          Reactivate a formerly destructed master.
+
+        string|string * get_simul_efun ()
+          Load the simul_efun object and return one or more paths of it.
+
+        ----------------------------------------------------------------
+            Handling of user connections
+
+        object connect ()
+          Handle the request for a new connection.
+
+        void disconnect (object obj)
+          Handle the loss of an IP connection.
+
+        void remove_player (object user)
+          Remove a user object from the system.
+
+        void stale_erq (closure callback)
+          Notify the loss of the erq demon.
+
+        -----------------------------------------------------------------
+            Runtime Support
+
+        object compile_object (string filename)
+          Compile a virtual object.
+
+        mixed include_file (string file, string compiled_file, int sys_include)
+          Return the full pathname for an included file. // 3.2.8 and later
+
+        mixed inherit_file (string file, string compiled_file)
+          Return the full pathname for an inherited object. // 3.2.8 and later
+
+        string get_wiz_name (string file)
+          Return the author of a file.
+
+        string printf_obj_name (object obj)  // 3.2.6 and later
+        string object_name (object obj)      // 3.2.1 .. 3.2.5
+          Return a printable name for an object.
+
+        mixed prepare_destruct (object obj)
+          Prepare the destruction of the given object.
+
+        void quota_demon (void)
+          Handle quotas in times of memory shortage.
+
+        void receive_imp (string host, string msg, int port)
+          Handle a received IMP message.
+
+        void slow_shut_down (int minutes)
+          Schedule a shutdown for the near future.
+
+        void notify_shutdown ()
+          Notify the master about an immediate shutdown.
+
+        -----------------------------------------------------------------
+            Error Handling
+
+        void dangling_lfun_closure ()
+          Handle a dangling lfun-closure.
+
+        void log_error (string file, string err, int warn)
+          Announce a compiler-time error or warning.
+
+        mixed heart_beat_error (object culprit, string err,
+                                string prg, string curobj, int line)
+          Announce an error in the heart_beat() function.
+
+        void runtime_error (string err, string prg, string curobj, int line)
+          Announce a runtime error.
+
+        void runtime_warning (string msg, string curobj, string prg, int line)
+          Announce a runtime warning.
+
+        -----------------------------------------------------------------
+            Security and Permissions
+
+        int privilege_violation (string op, mixed who, mixed arg3, mixed arg4)
+          Validate the execution of a privileged operation.
+
+        int query_allow_shadow (object victim)
+          Validate a shadowing.
+
+        int valid_exec (string name)
+          Validate the rebinding of an IP connection by usage of efun
+          exec().
+
+        int valid_query_snoop (object obj)
+          Validate if the snoopers of an object may be revealed by
+          usage of the efun query_snoop().
+
+        int valid_snoop (object snoopee, object snooper)
+          Validate the start/stop of a snoop.
+
+        ------------------------------------------------------------------
+            Userids and depending Security
+
+        string get_bb_uid()
+          Return the string to be used as root-uid.
+
+        int|string valid_read (string path, string euid, string fun, object caller)
+        int|string valid_write (string path, string euid, string fun, object caller)
+          Validate a reading/writing file operation.
+
+        -----------------------------------------------------------------
+            ed() Support
+
+        string make_path_absolute (string str)
+          Absolutize a relative filename given to the editor.
+
+        int save_ed_setup (object who, int code)
+          Save individual settings of ed for a wizard.
+
+        int retrieve_ed_setup (object who)
+          Retrieve individual settings of ed for a wizard.
+
+        string get_ed_buffer_save_file_name (string file)
+          Return a filename for the ed buffer to be saved into.
+
+        ----------------------------------------------------------------
+            parse_command() Support  (!compat, SUPPLY_PARSE_COMMAND defined)
+
+        string *parse_command_id_list ()
+          Return generic singular ids.
+
+        string *parse_command_plural_id_list ()
+          Return generic plural ids.
+
+        string *parse_command_adjectiv_id_list ()
+          Return generic adjective ids.
+
+        string *parse_command_prepos_list ()
+          Return common prepositions.
+
+        string parse_command_all_word()
+          Return the one(!) 'all' word.
+
+SEE ALSO
+        master(M), efun(E), applied(A), concepts(C), driver(D), lpc(LPC)
