diff --git a/doc/master/master-3.2.1 b/doc/master/master-3.2.1
new file mode 100644
index 0000000..03e4339
--- /dev/null
+++ b/doc/master/master-3.2.1
@@ -0,0 +1,231 @@
+NAME
+	master for LPMud 3.2.1
+
+DESCRIPTION
+	This directory contains descriptions for the functions that
+	Amylaar's version of the LPC parser, 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 (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.
+
+	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 LPMud 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
+	  - 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
+	    preload, which preload() then does.
+	  - The interpreter sets up the IP communication and enters
+	    the backend loop.
+
+	If the master is reloaded during system operation, this
+	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 this 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 *define_include_dirs ()
+	  Define where the include files are searched.
+
+	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 an virtual object.
+
+	string get_wiz_name (string file)
+	  Return the author of a file.
+
+	string object_name (object obj)
+	  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_udp (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)
+	  Announce a compiler-time error.
+
+	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.
+
+	-----------------------------------------------------------------
+	    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 query_player_level (string what)
+	  Check if the user is of high enough level for several things.
+
+	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()  // euids
+	  Return the string to be used as root-uid.
+
+	int valid_seteuid (object obj, string neweuid)	// euids
+	  Validate the change of an objects euid by efun seteuid().
+
+	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_object_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)
