about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-12-15 21:29:55 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-12-15 21:29:55 +0000
commit03e230cc54103d18e9c8a18208c7d27805400a71 (patch)
treeefb79fe4d798134599ec6c90cd9912e59ccca69d
parentb9c19b15a6f01279ddcf32ca6fa51894a64a6c16 (diff)
downloadzsh-03e230cc54103d18e9c8a18208c7d27805400a71.tar.gz
zsh-03e230cc54103d18e9c8a18208c7d27805400a71.tar.xz
zsh-03e230cc54103d18e9c8a18208c7d27805400a71.zip
manual:9047
-rw-r--r--Completion/User/_cvs2
-rw-r--r--Doc/Makefile.in8
-rw-r--r--Doc/Zsh/builtins.yo11
-rw-r--r--Doc/Zsh/mod_cap.yo2
-rw-r--r--Doc/Zsh/mod_clone.yo2
-rw-r--r--Doc/Zsh/mod_compctl.yo2
-rw-r--r--Doc/Zsh/mod_complete.yo2
-rw-r--r--Doc/Zsh/mod_complist.yo10
-rw-r--r--Doc/Zsh/mod_computil.yo2
-rw-r--r--Doc/Zsh/mod_deltochar.yo2
-rw-r--r--Doc/Zsh/mod_example.yo2
-rw-r--r--Doc/Zsh/mod_files.yo2
-rw-r--r--Doc/Zsh/mod_mapfile.yo2
-rw-r--r--Doc/Zsh/mod_mathfunc.yo3
-rw-r--r--Doc/Zsh/mod_parameter.yo2
-rw-r--r--Doc/Zsh/mod_sched.yo2
-rw-r--r--Doc/Zsh/mod_stat.yo2
-rw-r--r--Doc/Zsh/mod_zftp.yo6
-rw-r--r--Doc/Zsh/mod_zle.yo2
-rw-r--r--Doc/Zsh/mod_zleparameter.yo2
-rw-r--r--Doc/Zsh/mod_zutil.yo2
-rw-r--r--Doc/Zsh/modules.yo3
-rw-r--r--Doc/Zsh/options.yo3
-rw-r--r--Doc/Zsh/restricted.yo2
-rw-r--r--Doc/Zsh/zftpsys.yo2
-rw-r--r--Etc/zsh-development-guide69
-rw-r--r--Functions/Misc/zls2
-rw-r--r--Functions/Zftp/zfinit2
-rw-r--r--Src/Builtins/rlimits.c8
-rw-r--r--Src/Builtins/rlimits.mdd2
-rw-r--r--Src/Builtins/sched.c8
-rw-r--r--Src/Builtins/sched.mdd2
-rw-r--r--Src/Makemod.in.in15
-rw-r--r--Src/Modules/cap.c8
-rw-r--r--Src/Modules/cap.mdd2
-rw-r--r--Src/Modules/clone.c8
-rw-r--r--Src/Modules/clone.mdd2
-rw-r--r--Src/Modules/example.c10
-rw-r--r--Src/Modules/example.mdd2
-rw-r--r--Src/Modules/files.c8
-rw-r--r--Src/Modules/files.mdd2
-rw-r--r--Src/Modules/mapfile.c8
-rw-r--r--Src/Modules/mapfile.mdd2
-rw-r--r--Src/Modules/mathfunc.c8
-rw-r--r--Src/Modules/mathfunc.mdd2
-rw-r--r--Src/Modules/parameter.c8
-rw-r--r--Src/Modules/parameter.mdd2
-rw-r--r--Src/Modules/stat.c8
-rw-r--r--Src/Modules/stat.mdd2
-rw-r--r--Src/Modules/zftp.c8
-rw-r--r--Src/Modules/zftp.mdd2
-rw-r--r--Src/Modules/zprof.c8
-rw-r--r--Src/Modules/zprof.mdd2
-rw-r--r--Src/Modules/zutil.c8
-rw-r--r--Src/Modules/zutil.mdd2
-rw-r--r--Src/Zle/compcore.c2
-rw-r--r--Src/Zle/compctl.c8
-rw-r--r--Src/Zle/compctl.mdd4
-rw-r--r--Src/Zle/complete.c8
-rw-r--r--Src/Zle/complete.mdd6
-rw-r--r--Src/Zle/complist.c8
-rw-r--r--Src/Zle/complist.mdd4
-rw-r--r--Src/Zle/compresult.c2
-rw-r--r--Src/Zle/computil.c8
-rw-r--r--Src/Zle/computil.mdd4
-rw-r--r--Src/Zle/deltochar.c8
-rw-r--r--Src/Zle/deltochar.mdd4
-rw-r--r--Src/Zle/zle.mdd2
-rw-r--r--Src/Zle/zle_main.c8
-rw-r--r--Src/Zle/zle_thingy.c4
-rw-r--r--Src/Zle/zle_tricky.c2
-rw-r--r--Src/Zle/zleparameter.c8
-rw-r--r--Src/Zle/zleparameter.mdd4
-rw-r--r--Src/init.c16
-rw-r--r--Src/makepro.awk9
-rw-r--r--Src/mkbltnmlst.sh24
-rw-r--r--Src/mkmakemod.sh177
-rw-r--r--Src/mkmodindex.sh39
-rw-r--r--Src/module.c144
-rw-r--r--Src/xmods.conf20
-rw-r--r--Src/zsh.mdd13
-rwxr-xr-xTest/ztst.zsh2
-rw-r--r--configure.in7
83 files changed, 396 insertions, 449 deletions
diff --git a/Completion/User/_cvs b/Completion/User/_cvs
index 8cb20b7c3..4ebbd4222 100644
--- a/Completion/User/_cvs
+++ b/Completion/User/_cvs
@@ -489,7 +489,7 @@ _cvs_extract_file_entries () {
 (( $+functions[_cvs_extract_modifiedfile_entries] )) ||
 _cvs_extract_modifiedfile_entries () {
   if zstyle -t ":completion${curcontext}:cvs" disable-stat ||
-     ! { zmodload -e zsh/stat || zmodload zsh/stat }; then
+     ! { zmodload -e stat || zmodload stat }; then
     _cvs_extract_file_entries
     return
   fi
diff --git a/Doc/Makefile.in b/Doc/Makefile.in
index 6d7e76fce..41675a330 100644
--- a/Doc/Makefile.in
+++ b/Doc/Makefile.in
@@ -172,7 +172,7 @@ Zsh/modlist.yo: $(MODDOCSRC)
 	    modules=`echo '' $(MODDOCSRC) '' | sed 's| Zsh/mod_| |g;s|\.yo | |g'`; \
 	    echo "startitem()"; \
 	    for mod in $$modules; do \
-		echo "item(tt(zsh/$$mod))("; \
+		echo "item(tt($$mod))("; \
 		sed -n '1d;/^!MOD!)$$/q;p' < $(sdir)/Zsh/mod_$${mod}.yo; \
 		echo ")"; \
 	    done; \
@@ -182,8 +182,8 @@ Zsh/modlist.yo: $(MODDOCSRC)
 	    echo "endmenu()"; \
 	    set '' $$modules; \
 	    while test ".$$2" != .; do \
-		echo "texinode(The zsh/$$2 Module)($${3+The $$3 Module})($${1:+The $$1 Module})(Zsh Modules)"; \
-		echo "sect(The zsh/$$2 Module)"; \
+		echo "texinode(The $$2 Module)($${3+The $$3 Module})($${1:+The $$1 Module})(Zsh Modules)"; \
+		echo "sect(The $$2 Module)"; \
 		echo "includefile(Zsh/mod_$${2}.yo)"; \
 		shift; \
 	    done \
@@ -193,7 +193,7 @@ Zsh/modmenu.yo: $(MODDOCSRC)
 	( \
 	    modules=`echo '' $(MODDOCSRC) '' | sed 's| Zsh/mod_| |g;s|\.yo | |g'`; \
 	    for mod in $$modules; do \
-		echo "menu(The zsh/$$mod Module)"; \
+		echo "menu(The $$mod Module)"; \
 	    done \
 	) > $(sdir)/Zsh/modmenu.yo
 
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 9513eb22c..072316256 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -1303,15 +1303,16 @@ xitem(tt(zmodload) [ tt(-i) ] var(name) ... )
 item(tt(zmodload) tt(-u) [ tt(-i) ] var(name) ...)(
 In the simplest case, tt(zmodload) loads a binary module.  The module must
 be in a file with a name consisting of the specified var(name) followed by
-a standard suffix, usually `tt(.so)'.
-If the module to be loaded is
+a standard suffix, usually `tt(.so)'.  If this can't be found, the
+var(name) is tried without the suffix.  If the module to be loaded is
 already loaded and the tt(-i) option is given, the duplicate module is
 ignored.  Otherwise tt(zmodload) prints an error message.
 
 The var(name)d module is searched for in the same way a command is, using
-tt($module_path) instead of tt($path).  However, the path search is
-performed even when the module name contains a `tt(/)', which it usually does.
-There is no way to prevent the path search.
+tt($module_path) instead of tt($path).  If var(name) contains a `tt(/)',
+it will be used as-is, and a path search will be performed otherwise.
+This behaviour can be modified by the tt(PATH_DIRS) option.
+cindex(PATH_DIRS, use of)
 
 With tt(-u), tt(zmodload) unloads modules.  The same var(name)
 must be given that was given when the module was loaded, but it is not
diff --git a/Doc/Zsh/mod_cap.yo b/Doc/Zsh/mod_cap.yo
index 3dec78b00..0bb2b813a 100644
--- a/Doc/Zsh/mod_cap.yo
+++ b/Doc/Zsh/mod_cap.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 Builtins for manipulating POSIX.1e (POSIX.6) capability (privilege) sets.
 !MOD!)
-The tt(zsh/cap) module is used for manipulating POSIX.1e (POSIX.6) capability
+The tt(cap) module is used for manipulating POSIX.1e (POSIX.6) capability
 sets.  If the operating system does not support this interface, the
 builtins defined by this module will do nothing.
 The builtins in this module are:
diff --git a/Doc/Zsh/mod_clone.yo b/Doc/Zsh/mod_clone.yo
index 9dd710cca..5bc8068dc 100644
--- a/Doc/Zsh/mod_clone.yo
+++ b/Doc/Zsh/mod_clone.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 A builtin that can clone a running shell onto another terminal.
 !MOD!)
-The tt(zsh/clone) module makes available one builtin command:
+The tt(clone) module makes available one builtin command:
 
 startitem()
 findex(clone)
diff --git a/Doc/Zsh/mod_compctl.yo b/Doc/Zsh/mod_compctl.yo
index 5dfa880a4..4379f4fa9 100644
--- a/Doc/Zsh/mod_compctl.yo
+++ b/Doc/Zsh/mod_compctl.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 The tt(compctl) builtin for controlling completion.
 !MOD!)
-The tt(zsh/compctl) module makes available two builtin commands. tt(compctl),
+The tt(compctl) module makes available two builtin commands. tt(compctl),
 is the old, deprecated way to control completions for ZLE.  See
 ifzman(zmanref(zshcompctl))\
 ifnzman(noderef(Programmable Completion Using compctl))\
diff --git a/Doc/Zsh/mod_complete.yo b/Doc/Zsh/mod_complete.yo
index 18f4f8ebc..2c421eb8b 100644
--- a/Doc/Zsh/mod_complete.yo
+++ b/Doc/Zsh/mod_complete.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 The basic completion code.
 !MOD!)
-The tt(zsh/complete) module makes available several builtin commands which
+The tt(complete) module makes available several builtin commands which
 can be used in user-defined completion widgets, see
 ifzman(zmanref(zshcompwid))\
 ifnzman(noderef(Completion Widgets))\
diff --git a/Doc/Zsh/mod_complist.yo b/Doc/Zsh/mod_complist.yo
index c5fa9fac1..d9e29e752 100644
--- a/Doc/Zsh/mod_complist.yo
+++ b/Doc/Zsh/mod_complist.yo
@@ -3,15 +3,15 @@ Completion listing extensions.
 !MOD!)
 cindex(completion, listing)
 cindex(completion, coloured listings)
-The tt(zsh/complist) module offers two extensions to completion listings:
+The tt(complist) module offers two extensions to completion listings:
 the ability to highlight matches in such a list and a different
 style of menu-completion.
 
 Whenever one of the parameters tt(ZLS_COLORS) or tt(ZLS_COLOURS) is set 
-and the tt(zsh/complist) module is loaded or linked into the shell,
+and the tt(complist) module is loaded or linked into the shell,
 completion lists will be colored.  Note, however, that tt(complist) will
 not automatically be loaded if it is not linked in:  on systems with
-dynamic loading, `tt(zmodload zsh/complist)' is required.
+dynamic loading, `tt(zmodload complist)' is required.
 
 subsect(Parameters)
 vindex(ZLS_COLORS)
@@ -130,7 +130,7 @@ subsect(Menu selection)
 cindex(completion, selecting by cursor)
 vindex(SELECTMIN)
 tindex(menu-select)
-The tt(zsh/complist) module also offers an alternative style of selecting
+The tt(complist) module also offers an alternative style of selecting
 matches from a list, called menu-selection, which can be used if the
 shell is set up to return to the last prompt after showing a
 completion list (see the tt(ALWAYS_LAST_PROMPT) option in
@@ -211,4 +211,4 @@ continue with normal menu-completion one can call
 
 indent(tt(bindkey -M menuselect '^M' send-break))
 
-after loading the tt(zsh/complist) module.
+after loading the tt(complist) module.
diff --git a/Doc/Zsh/mod_computil.yo b/Doc/Zsh/mod_computil.yo
index 26a8d25eb..c7397c646 100644
--- a/Doc/Zsh/mod_computil.yo
+++ b/Doc/Zsh/mod_computil.yo
@@ -3,7 +3,7 @@ A module with utility builtins needed for the shell function based
 completion system.
 !MOD!)
 cindex(completion, utility)
-The tt(zsh/computil) module adds several builtin commands that are used by
+The tt(computil) module adds several builtin commands that are used by
 some of the completion functions in the shell function based
 completions system (see
 ifzman(zmanref(zshcompsys))\
diff --git a/Doc/Zsh/mod_deltochar.yo b/Doc/Zsh/mod_deltochar.yo
index 334babbde..d8f847f1b 100644
--- a/Doc/Zsh/mod_deltochar.yo
+++ b/Doc/Zsh/mod_deltochar.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 A ZLE function duplicating EMACS' tt(zap-to-char).
 !MOD!)
-The tt(zsh/deltochar) module makes available two ZLE functions:
+The tt(deltochar) module makes available two ZLE functions:
 
 startitem()
 tindex(delete-to-char)
diff --git a/Doc/Zsh/mod_example.yo b/Doc/Zsh/mod_example.yo
index 03b795bc0..852f60189 100644
--- a/Doc/Zsh/mod_example.yo
+++ b/Doc/Zsh/mod_example.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 An example of how to write a module.
 !MOD!)
-The tt(zsh/example) module makes available one builtin command:
+The tt(example) module makes available one builtin command:
 
 startitem()
 findex(example)
diff --git a/Doc/Zsh/mod_files.yo b/Doc/Zsh/mod_files.yo
index 10e9123ff..be0ad9f09 100644
--- a/Doc/Zsh/mod_files.yo
+++ b/Doc/Zsh/mod_files.yo
@@ -2,7 +2,7 @@ COMMENT(!MOD!
 Some basic file manipulation commands as builtins.
 !MOD!)
 cindex(files, manipulating)
-The tt(zsh/files) module makes some standard commands available as builtins:
+The tt(files) module makes some standard commands available as builtins:
 
 startitem()
 findex(chgrp)
diff --git a/Doc/Zsh/mod_mapfile.yo b/Doc/Zsh/mod_mapfile.yo
index d3dd2a041..ea360de82 100644
--- a/Doc/Zsh/mod_mapfile.yo
+++ b/Doc/Zsh/mod_mapfile.yo
@@ -2,7 +2,7 @@ COMMENT(!MOD!
 Access to external files via a special associative array.
 !MOD!)
 cindex(parameter, file access via)
-The tt(zsh/mapfile) module provides one special associative array parameter of
+The tt(mapfile) module provides one special associative array parameter of
 the same name.
 
 startitem()
diff --git a/Doc/Zsh/mod_mathfunc.yo b/Doc/Zsh/mod_mathfunc.yo
index 2c87e873f..d22394eb7 100644
--- a/Doc/Zsh/mod_mathfunc.yo
+++ b/Doc/Zsh/mod_mathfunc.yo
@@ -3,8 +3,7 @@ Standard scientific functions for use in mathematical evaluations.
 !MOD!)
 cindex(functions, mathematical)
 cindex(mathematical functions)
-The tt(zsh/mathfunc) module provides standard
-mathematical functions for use when
+The tt(mathfunc) module provides standard mathematical functions for use when
 evaluating mathematical formulae.  The syntax agrees with normal C and
 FORTRAN conventions, for example,
 
diff --git a/Doc/Zsh/mod_parameter.yo b/Doc/Zsh/mod_parameter.yo
index 5a1969571..43ee7394f 100644
--- a/Doc/Zsh/mod_parameter.yo
+++ b/Doc/Zsh/mod_parameter.yo
@@ -2,7 +2,7 @@ COMMENT(!MOD!
 Access to internal hash tables via special associative arrays.
 !MOD!)
 cindex(parameters, special)
-The tt(zsh/parameter) module gives access to some of the internal hash
+The tt(parameter) module gives access to some of the internal hash
 tables used by the shell by defining some special parameters.
 
 startitem()
diff --git a/Doc/Zsh/mod_sched.yo b/Doc/Zsh/mod_sched.yo
index faf94cbcc..18c91c2a1 100644
--- a/Doc/Zsh/mod_sched.yo
+++ b/Doc/Zsh/mod_sched.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 A builtin that provides a timed execution facility within the shell.
 !MOD!)
-The tt(zsh/sched) module makes available one builtin command:
+The tt(sched) module makes available one builtin command:
 
 startitem()
 findex(sched)
diff --git a/Doc/Zsh/mod_stat.yo b/Doc/Zsh/mod_stat.yo
index 0d2f709db..a5455a19d 100644
--- a/Doc/Zsh/mod_stat.yo
+++ b/Doc/Zsh/mod_stat.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 A builtin command interface to the tt(stat) system call.
 !MOD!)
-The tt(zsh/stat) module makes available one builtin command:
+The tt(stat) module makes available one builtin command:
 
 startitem()
 findex(stat)
diff --git a/Doc/Zsh/mod_zftp.yo b/Doc/Zsh/mod_zftp.yo
index 708122bd8..adbf331e4 100644
--- a/Doc/Zsh/mod_zftp.yo
+++ b/Doc/Zsh/mod_zftp.yo
@@ -1,14 +1,14 @@
 COMMENT(!MOD!
 A builtin FTP client.
 !MOD!)
-The tt(zsh/zftp) module makes available one builtin command:
+The tt(zftp) module makes available one builtin command:
 
 startitem()
 findex(zftp)
 cindex(FTP)
 cindex(files, transferring)
 item(tt(zftp) var(subcommand) [ var(args) ])(
-The tt(zsh/zftp) module is a client for FTP (file transfer protocol).  It
+The tt(zftp) module is a client for FTP (file transfer protocol).  It
 is implemented as a builtin to allow full use of shell command line
 editing, file I/O, and job control mechanisms.  Often, users will
 access it via shell functions providing a more powerful interface; a set is
@@ -84,7 +84,7 @@ are deleted.  In that case, calling tt(open) with no arguments will
 cause an error.
 
 The list of parameters is not deleted after a tt(close), however it
-will be deleted if the tt(zsh/zftp) module is unloaded.
+will be deleted if the tt(zftp) module is unloaded.
 
 For example,
 
diff --git a/Doc/Zsh/mod_zle.yo b/Doc/Zsh/mod_zle.yo
index 0230dcaad..d25c5ba1d 100644
--- a/Doc/Zsh/mod_zle.yo
+++ b/Doc/Zsh/mod_zle.yo
@@ -1,7 +1,7 @@
 COMMENT(!MOD!
 The Zsh Line Editor, including the tt(bindkey) and tt(vared) builtins.
 !MOD!)
-The tt(zsh/zle) module contains the Zsh Line Editor.  See
+The tt(zle) module contains the Zsh Line Editor.  See
 ifzman(zmanref(zshzle))\
 ifnzman(noderef(Zsh Line Editor))\
 .  It also contains three related builtin commands:
diff --git a/Doc/Zsh/mod_zleparameter.yo b/Doc/Zsh/mod_zleparameter.yo
index 287e3bdb3..e3d4924c7 100644
--- a/Doc/Zsh/mod_zleparameter.yo
+++ b/Doc/Zsh/mod_zleparameter.yo
@@ -2,7 +2,7 @@ COMMENT(!MOD!
 Access to internals of the Zsh Line Editor via parameters.
 !MOD!)
 cindex(parameters, special)
-The tt(zsh/zleparameter) module defines two special parameters that can be 
+The tt(zleparameter) module defines two special parameters that can be 
 used to access internal information of the Zsh Line Editor (see
 ifzman(zmanref(zshzle))\
 ifnzman(noderef(Zsh Line Editor))\
diff --git a/Doc/Zsh/mod_zutil.yo b/Doc/Zsh/mod_zutil.yo
index 2232551fe..405b88e1e 100644
--- a/Doc/Zsh/mod_zutil.yo
+++ b/Doc/Zsh/mod_zutil.yo
@@ -3,7 +3,7 @@ Some utility builtins, e.g. the one for supporting configuration via
 styles.
 !MOD!)
 cindex(builtins, utility)
-The tt(zsh/zutil) module only adds some builtins:
+The tt(zutil) module only adds some builtins:
 
 startitem()
 xitem(tt(zstyle) [ tt(-L) ])
diff --git a/Doc/Zsh/modules.yo b/Doc/Zsh/modules.yo
index afd2b5c1c..7a404fd79 100644
--- a/Doc/Zsh/modules.yo
+++ b/Doc/Zsh/modules.yo
@@ -6,7 +6,6 @@ Some optional parts of zsh are in modules, separate from the core
 of the shell.  Each of these modules may be linked in to the
 shell at build time,
 or can be dynamically linked while the shell is running
-if the installation supports this feature.  The modules that
-are bundled with the zsh distribution are:
+if the installation supports this feature.  The modules available are:
 
 includefile(Zsh/modlist.yo)
diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo
index f16d36cd3..795d37a22 100644
--- a/Doc/Zsh/options.yo
+++ b/Doc/Zsh/options.yo
@@ -758,7 +758,8 @@ Thus if `tt(/usr/local/bin)' is in the user's path, and he types
 (assuming it exists).
 Commands explicitly beginning with `tt(/)', `tt(./)' or `tt(../)'
 are not subject to the path search.
-This also applies to the tt(.) builtin.
+This also applies to the tt(.) builtin,
+and to searches for modules performed by the tt(zmodload) builtin.
 )
 pindex(POSIX_BUILTINS)
 item(tt(POSIX_BUILTINS) <K> <S>)(
diff --git a/Doc/Zsh/restricted.yo b/Doc/Zsh/restricted.yo
index 45c664eec..a61fd4955 100644
--- a/Doc/Zsh/restricted.yo
+++ b/Doc/Zsh/restricted.yo
@@ -29,6 +29,8 @@ itemiz(using the tt(ARGV0) parameter to override tt(argv[0]) for external
 commands)
 itemiz(turning off restricted mode with tt(set +r) or tt(unsetopt
 RESTRICTED))
+itemiz(specifying modules to be loaded with an explicitly given
+pathname containing slashes)
 enditemize()
 
 These restrictions are enforced after processing the startup files.  The
diff --git a/Doc/Zsh/zftpsys.yo b/Doc/Zsh/zftpsys.yo
index 8ddbdb231..ed39554ef 100644
--- a/Doc/Zsh/zftpsys.yo
+++ b/Doc/Zsh/zftpsys.yo
@@ -21,7 +21,7 @@ ifnzman(\
 noderef(The zftp Module)
 ), must be available in the
 version of tt(zsh) installed at your site.  If the shell is configured to
-load new commands at run time, it probably is: typing `tt(zmodload zsh/zftp)'
+load new commands at run time, it probably is: typing `tt(zmodload zftp)'
 will make sure (if that runs silently, it has worked).  If this is not the
 case, it is possible tt(zftp) was linked into the shell anyway: to test
 this, type `tt(which zftp)' and if tt(zftp) is available you will get the
diff --git a/Etc/zsh-development-guide b/Etc/zsh-development-guide
index e1be18646..75a82bd35 100644
--- a/Etc/zsh-development-guide
+++ b/Etc/zsh-development-guide
@@ -147,26 +147,16 @@ C coding style
   groups of statements in the interests of clarity.  There should never
   be two consecutive blank lines.
 
-* Each .c file *must* #include the .mdh header for the module it is a
-  part of and then its own .pro file (for local prototypes).  It may
-  also #include other system headers.  It *must not* #include any other
-  module's headers or any other .pro files.
-
 Modules
 -------
 
-Modules have hierarchical names.  Name segments are separated by `/', and
-each segment consists of alphanumerics plus `_'.  Relative names are never
-used; the naming hierarchy is strictly for organisational convenience.
-
-Each module is described by a file with a name ending in `.mdd' somewhere
-under the Src directory.  This file is actually a shell script that will
-sourced when zsh is build. To describe the module it can/should set the
-following shell variables:
+Modules are described by a file named `foo.mdd' for a module
+`foo'. This file is actually a shell script that will sourced when zsh 
+is build. To describe the module it can/should set the following shell 
+variables:
 
-  - name            name of the module
   - moddeps         modules on which this module depends (default none)
-  - nozshdep        non-empty indicates no dependence on the `zsh/main' pseudo-module
+  - nozshdep        non-empty indicates no dependence on the `zsh' pseudo-module
   - alwayslink      if non-empty, always link the module into the executable
   - autobins        builtins defined by the module, for autoloading
   - autoinfixconds  infix condition codes defined by the module, for
@@ -180,25 +170,25 @@ following shell variables:
   - hdrdeps         extra headers on which the .mdh depends (default none)
   - otherincs       extra headers that are included indirectly (default none)
 
-Be sure to put the values in quotes. For further enlightenment have a look
-at the `mkmakemod.sh' script in the Src directory of the distribution.
+Be sure to put the values in quotes. For further enlightenment have a
+look at the `mkmakemod.sh' script in the Src directory of the
+distribution.
 
 Modules have to define four functions which will be called automatically
-by the zsh core. The first one, named `setup_', should set up any data
-needed in the module, at least any data other modules may be interested
-in. The second one, named `boot_', should register all builtins,
-conditional codes, and function wrappers (i.e. anything that will be
-visible to the user) and will be called after the `setup_'-function.
-
-The third one, named `cleanup_', is called when the user tries to unload
-a module and should de-register the builtins etc. The last function,
-`finish_' is called when the module is actually unloaded and should
-finalize all the data initialized in the `setup_'-function.
-
-In short, the `cleanup_'-function should undo what the `boot_'-function
-did, and the `finish_'-function should undo what the `setup_'-function
+by the zsh core. The first one, named `setup_foo' for a module named
+`foo', should set up any data needed in the module, at least any data
+other modules may be interested in. The second one, named `boot_foo',
+should register all builtins, conditional codes, and function wrappers
+(i.e. anything that will be visible to the user) and will be called
+after the `setup'-function. 
+The third one, named `cleanup_foo' for module `foo' is called when the
+user tries to unload a module and should de-register the builtins
+etc. The last function, `finish_foo' is called when the module is
+actually unloaded and should finalize all the data initialized in the 
+`setup'-function.
+In short, the `cleanup'-function should undo what the `boot'-function
+did, and the `finish'-function should undo what the `setup'-function
 did.
-
 All of these functions should return zero if they succeeded and
 non-zero otherwise.
 
@@ -798,20 +788,3 @@ Documentation
   All the above should appear on their own, separated by newlines from the
   surrounding text.  No extra newlines after the opening or before the
   closing parenthesis are required.
-
-Module names
-------------
-
-Modules have hierarchical names.  Name segments are separated by `/', and
-each segment consists of alphanumerics plus `_'.  Relative names are never
-used; the naming hierarchy is strictly for organisational convenience.
-
-Top-level name segments should be organisational identifiers, assigned
-by the Zsh Development Group and recorded here:
-
-top-level identifier  organisation
---------------------  ------------
-x_*                   reserved for private experimental use
-zsh                   The Zsh Development Group (contact: <coordinator@zsh.org>)
-
-Below the top level, naming authority is delegated.
diff --git a/Functions/Misc/zls b/Functions/Misc/zls
index 30a8fb9ed..22138cd6c 100644
--- a/Functions/Misc/zls
+++ b/Functions/Misc/zls
@@ -1,7 +1,7 @@
 # zls () {
 # simple internal ls using the stat module
 
-zmodload -i zsh/stat || return 1
+zmodload -i stat || return 1
 
 emulate -R zsh
 setopt localoptions
diff --git a/Functions/Zftp/zfinit b/Functions/Zftp/zfinit
index b646bd7c8..256ef1d2f 100644
--- a/Functions/Zftp/zfinit
+++ b/Functions/Zftp/zfinit
@@ -1,6 +1,6 @@
 emulate -L zsh
 
-[[ $1 = -n ]] || zmodload -e zsh/zftp || zmodload -ia zsh/zftp
+[[ $1 = -n ]] || zmodload -e zftp || zmodload -ia zftp
 
 if [[ ${+zfconfig} = 0 ]]; then
   typeset -gA zfconfig
diff --git a/Src/Builtins/rlimits.c b/Src/Builtins/rlimits.c
index f81ce2412..8a13fefdf 100644
--- a/Src/Builtins/rlimits.c
+++ b/Src/Builtins/rlimits.c
@@ -625,21 +625,21 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_rlimits(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_rlimits(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_rlimits(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -647,7 +647,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_rlimits(Module m)
 {
     return 0;
 }
diff --git a/Src/Builtins/rlimits.mdd b/Src/Builtins/rlimits.mdd
index 44a92906c..129adf901 100644
--- a/Src/Builtins/rlimits.mdd
+++ b/Src/Builtins/rlimits.mdd
@@ -1,5 +1,3 @@
-name=zsh/rlimits
-
 autobins="limit ulimit unlimit"
 
 objects="rlimits.o"
diff --git a/Src/Builtins/sched.c b/Src/Builtins/sched.c
index 9dcdd9ece..77cc27261 100644
--- a/Src/Builtins/sched.c
+++ b/Src/Builtins/sched.c
@@ -185,14 +185,14 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_sched(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_sched(Module m)
 {
     if(!addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)))
 	return 1;
@@ -202,7 +202,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_sched(Module m)
 {
     struct schedcmd *sch, *schn;
 
@@ -218,7 +218,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_sched(Module m)
 {
     return 0;
 }
diff --git a/Src/Builtins/sched.mdd b/Src/Builtins/sched.mdd
index 7f150f4a7..6ed749f32 100644
--- a/Src/Builtins/sched.mdd
+++ b/Src/Builtins/sched.mdd
@@ -1,5 +1,3 @@
-name=zsh/sched
-
 autobins="sched"
 
 objects="sched.o"
diff --git a/Src/Makemod.in.in b/Src/Makemod.in.in
index 6d6e6af05..050a0682e 100644
--- a/Src/Makemod.in.in
+++ b/Src/Makemod.in.in
@@ -128,7 +128,20 @@ install.modules: install.modules-here
 uninstall.modules: uninstall.modules-here
 
 install.bin-here uninstall.bin-here:
-install.modules-here uninstall.modules-here:
+
+install.modules-here:
+	modules='$(MODULES)'; \
+	if test -n "$$modules"; then $(sdir_top)/mkinstalldirs $(DESTDIR)$(MODDIR); fi; \
+	for mod in $$modules; do \
+	    $(INSTALL_PROGRAM) $$mod $(DESTDIR)$(MODDIR)/$$mod; \
+	done
+
+uninstall.modules-here:
+	modules='$(MODULES)'; for mod in $$modules; do \
+	    if test -f $(DESTDIR)$(MODDIR)/$$mod; then \
+		rm -f $(DESTDIR)$(MODDIR)/$$mod; \
+	    else :; fi; \
+	done
 
 # ========== DEPENDENCIES FOR CLEANUP ==========
 
diff --git a/Src/Modules/cap.c b/Src/Modules/cap.c
index bc8fb5b8c..e2f01ddee 100644
--- a/Src/Modules/cap.c
+++ b/Src/Modules/cap.c
@@ -124,21 +124,21 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_cap(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_cap(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_cap(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -146,7 +146,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_cap(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/cap.mdd b/Src/Modules/cap.mdd
index 07d46f252..97f377e9d 100644
--- a/Src/Modules/cap.mdd
+++ b/Src/Modules/cap.mdd
@@ -1,5 +1,3 @@
-name=zsh/cap
-
 autobins="cap getcap setcap"
 
 objects="cap.o"
diff --git a/Src/Modules/clone.c b/Src/Modules/clone.c
index 112c5a51a..59f66e1b5 100644
--- a/Src/Modules/clone.c
+++ b/Src/Modules/clone.c
@@ -98,21 +98,21 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_clone(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_clone(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_clone(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -120,7 +120,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_clone(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/clone.mdd b/Src/Modules/clone.mdd
index f5c673977..5277d3151 100644
--- a/Src/Modules/clone.mdd
+++ b/Src/Modules/clone.mdd
@@ -1,5 +1,3 @@
-name=zsh/clone
-
 autobins="clone"
 
 objects="clone.o"
diff --git a/Src/Modules/example.c b/Src/Modules/example.c
index bf4ad60fb..43199e350 100644
--- a/Src/Modules/example.c
+++ b/Src/Modules/example.c
@@ -159,7 +159,7 @@ ex_wrapper(List list, FuncWrap w, char *name)
 }
 
 /*
- * boot_ is executed when the module is loaded.
+ * boot_example is executed when the module is loaded.
  */
 
 static struct builtin bintab[] = {
@@ -188,7 +188,7 @@ static struct funcwrap wrapper[] = {
 
 /**/
 int
-setup_(Module m)
+setup_example(Module m)
 {
     printf("The example module has now been set up.\n");
     fflush(stdout);
@@ -197,7 +197,7 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_example(Module m)
 {
     intparam = 42;
     strparam = ztrdup("example");
@@ -214,7 +214,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_example(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     deleteconddefs(m->nam, cotab, sizeof(cotab)/sizeof(*cotab));
@@ -226,7 +226,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_example(Module m)
 {
     printf("Thank you for using the example module.  Have a nice day.\n");
     fflush(stdout);
diff --git a/Src/Modules/example.mdd b/Src/Modules/example.mdd
index fdaf01888..e32e8182e 100644
--- a/Src/Modules/example.mdd
+++ b/Src/Modules/example.mdd
@@ -1,5 +1,3 @@
-name=zsh/example
-
 autobins="example"
 
 autoinfixconds="ex"
diff --git a/Src/Modules/files.c b/Src/Modules/files.c
index 24cc66a2b..ac3bedd04 100644
--- a/Src/Modules/files.c
+++ b/Src/Modules/files.c
@@ -714,21 +714,21 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_files(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_files(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_files(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -736,7 +736,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_files(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/files.mdd b/Src/Modules/files.mdd
index 508f6b9b5..171790b43 100644
--- a/Src/Modules/files.mdd
+++ b/Src/Modules/files.mdd
@@ -1,5 +1,3 @@
-name=zsh/files
-
 autobins="chgrp chown ln mkdir mv rm rmdir sync"
 
 objects="files.o"
diff --git a/Src/Modules/mapfile.c b/Src/Modules/mapfile.c
index 5bbc17eca..11553609c 100644
--- a/Src/Modules/mapfile.c
+++ b/Src/Modules/mapfile.c
@@ -329,14 +329,14 @@ scanpmmapfile(HashTable ht, ScanFunc func, int flags)
 
 /**/
 int
-setup_(Module m)
+setup_mapfile(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_mapfile(Module m)
 {
     /* Create the special associative array. */
 
@@ -348,7 +348,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_mapfile(Module m)
 {
     Param pm;
 
@@ -364,7 +364,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_mapfile(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/mapfile.mdd b/Src/Modules/mapfile.mdd
index 6bdd26afc..9adb36162 100644
--- a/Src/Modules/mapfile.mdd
+++ b/Src/Modules/mapfile.mdd
@@ -1,5 +1,3 @@
-name=zsh/mapfile
-
 autoparams="mapfile"
 
 objects="mapfile.o"
diff --git a/Src/Modules/mathfunc.c b/Src/Modules/mathfunc.c
index 392424a48..06184fd96 100644
--- a/Src/Modules/mathfunc.c
+++ b/Src/Modules/mathfunc.c
@@ -450,21 +450,21 @@ math_func(char *name, int argc, mnumber *argv, int id)
 
 /**/
 int
-setup_(Module m)
+setup_mathfunc(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_mathfunc(Module m)
 {
     return !addmathfuncs(m->nam, mftab, sizeof(mftab)/sizeof(*mftab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_mathfunc(Module m)
 {
     deletemathfuncs(m->nam, mftab, sizeof(mftab)/sizeof(*mftab));
     return 0;
@@ -472,7 +472,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_mathfunc(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/mathfunc.mdd b/Src/Modules/mathfunc.mdd
index a06d20c6d..33a861f77 100644
--- a/Src/Modules/mathfunc.mdd
+++ b/Src/Modules/mathfunc.mdd
@@ -1,5 +1,3 @@
-name=zsh/mathfunc
-
 autobins="mathfunc"
 
 objects="mathfunc.o"
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index cd5b580ce..0169b4654 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -1940,7 +1940,7 @@ static struct funcwrap wrapper[] = {
 
 /**/
 int
-setup_(Module m)
+setup_parameter(Module m)
 {
     incleanup = 0;
 
@@ -1949,7 +1949,7 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_parameter(Module m)
 {
     /* Create the special associative arrays.
      * As an example for autoloaded parameters, this is probably a bad
@@ -1987,7 +1987,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_parameter(Module m)
 {
     Param pm;
     struct pardef *def;
@@ -2009,7 +2009,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_parameter(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/parameter.mdd b/Src/Modules/parameter.mdd
index 122f72bd2..1ee48f859 100644
--- a/Src/Modules/parameter.mdd
+++ b/Src/Modules/parameter.mdd
@@ -1,5 +1,3 @@
-name=zsh/parameter
-
 autoparams="parameters commands functions dis_functions funcstack builtins dis_builtins reswords dis_reswords options modules dirstack history historywords jobtexts jobdirs jobstates nameddirs userdirs aliases dis_aliases galiases dis_galiases"
 
 objects="parameter.o"
diff --git a/Src/Modules/stat.c b/Src/Modules/stat.c
index 7e7463bb7..3a98db0e3 100644
--- a/Src/Modules/stat.c
+++ b/Src/Modules/stat.c
@@ -590,21 +590,21 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_stat(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_stat(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_stat(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -612,7 +612,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_stat(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/stat.mdd b/Src/Modules/stat.mdd
index 81f73f482..b775fda09 100644
--- a/Src/Modules/stat.mdd
+++ b/Src/Modules/stat.mdd
@@ -1,5 +1,3 @@
-name=zsh/stat
-
 autobins="stat"
 
 objects="stat.o"
diff --git a/Src/Modules/zftp.c b/Src/Modules/zftp.c
index debb1a6bb..cf024643d 100644
--- a/Src/Modules/zftp.c
+++ b/Src/Modules/zftp.c
@@ -3201,14 +3201,14 @@ bin_zftp(char *name, char **args, char *ops, int func)
 
 /**/
 int
-setup_(Module m)
+setup_zftp(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_zftp(Module m)
 {
     int ret;
     if ((ret = addbuiltins(m->nam, bintab,
@@ -3232,7 +3232,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_zftp(Module m)
 {
     /*
      * There are various parameters hanging around, but they're
@@ -3260,7 +3260,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_zftp(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/zftp.mdd b/Src/Modules/zftp.mdd
index 98f29b13f..83051ae54 100644
--- a/Src/Modules/zftp.mdd
+++ b/Src/Modules/zftp.mdd
@@ -1,5 +1,3 @@
-name=zsh/zftp
-
 autobins="zftp"
 
 objects="zftp.o"
diff --git a/Src/Modules/zprof.c b/Src/Modules/zprof.c
index 276ada4d6..2dacd45a2 100644
--- a/Src/Modules/zprof.c
+++ b/Src/Modules/zprof.c
@@ -291,14 +291,14 @@ static struct funcwrap wrapper[] = {
 
 /**/
 int
-setup_(Module m)
+setup_zprof(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_zprof(Module m)
 {
     calls = NULL;
     ncalls = 0;
@@ -311,7 +311,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_zprof(Module m)
 {
     freepfuncs(calls);
     freeparcs(arcs);
@@ -322,7 +322,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_zprof(Module m)
 {
     return 0;
 }
diff --git a/Src/Modules/zprof.mdd b/Src/Modules/zprof.mdd
index fad9a1dbf..de473cbba 100644
--- a/Src/Modules/zprof.mdd
+++ b/Src/Modules/zprof.mdd
@@ -1,5 +1,3 @@
-name=zsh/zprof
-
 autobins="zprof"
 
 objects="zprof.o"
diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c
index 065b027ce..590678f98 100644
--- a/Src/Modules/zutil.c
+++ b/Src/Modules/zutil.c
@@ -729,7 +729,7 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_zutil(Module m)
 {
     zstyles = NULL;
 
@@ -738,14 +738,14 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_zutil(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_zutil(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -753,7 +753,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_zutil(Module m)
 {
     freestypat(zstyles);
 
diff --git a/Src/Modules/zutil.mdd b/Src/Modules/zutil.mdd
index 30cd1576a..edc1f0d32 100644
--- a/Src/Modules/zutil.mdd
+++ b/Src/Modules/zutil.mdd
@@ -1,5 +1,3 @@
-name=zsh/zutil
-
 objects="zutil.o"
 
 autobins="zformat zstyle"
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index acf1799f6..8356ad5a5 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -145,7 +145,7 @@ int permmnum, permgnum, lastpermmnum, lastpermgnum;
 /**/
 mod_export int nmatches;
 /**/
-int smatches;
+mod_export int smatches;
 
 /* != 0 if only explanation strings should be printed */
 
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index 69db9e04a..d13bc2252 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -3732,7 +3732,7 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_compctl(Module m)
 {
     compctlreadptr = compctlread;
     createcompctltable();
@@ -3752,7 +3752,7 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_compctl(Module m)
 {
     addhookfunc("compctl_make", (Hookfn) ccmakehookfn);
     addhookfunc("compctl_before", (Hookfn) ccbeforehookfn);
@@ -3762,7 +3762,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_compctl(Module m)
 {
     deletehookfunc("compctl_make", (Hookfn) ccmakehookfn);
     deletehookfunc("compctl_before", (Hookfn) ccbeforehookfn);
@@ -3773,7 +3773,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_compctl(Module m)
 {
     deletehashtable(compctltab);
 
diff --git a/Src/Zle/compctl.mdd b/Src/Zle/compctl.mdd
index 6da7e002b..a76fef3a0 100644
--- a/Src/Zle/compctl.mdd
+++ b/Src/Zle/compctl.mdd
@@ -1,6 +1,4 @@
-name=zsh/compctl
-
-moddeps="zsh/complete zsh/zle"
+moddeps="complete zle"
 
 autobins="compctl"
 
diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c
index bf3102972..a78a12058 100644
--- a/Src/Zle/complete.c
+++ b/Src/Zle/complete.c
@@ -1350,7 +1350,7 @@ struct hookdef comphooks[] = {
 
 /**/
 int
-setup_(Module m)
+setup_complete(Module m)
 {
     hasperm = 0;
 
@@ -1371,7 +1371,7 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_complete(Module m)
 {
     addhookfunc("complete", (Hookfn) do_completion);
     addhookfunc("before_complete", (Hookfn) before_complete);
@@ -1391,7 +1391,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_complete(Module m)
 {
     deletehookfunc("complete", (Hookfn) do_completion);
     deletehookfunc("before_complete", (Hookfn) before_complete);
@@ -1410,7 +1410,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_complete(Module m)
 {
     if (compwords)
 	freearray(compwords);
diff --git a/Src/Zle/complete.mdd b/Src/Zle/complete.mdd
index 8e9796d86..70e275b4e 100644
--- a/Src/Zle/complete.mdd
+++ b/Src/Zle/complete.mdd
@@ -1,8 +1,6 @@
-name=zsh/complete
+moddeps="zle"
 
-moddeps="zsh/zle"
-
-autobins="compadd compset"
+autobins="compgen compadd compset"
 
 autoprefixconds="prefix suffix between after"
 
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index ce00ed240..32a2d99f3 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -1196,14 +1196,14 @@ menuselect(char **args)
 
 /**/
 int
-setup_(Module m)
+setup_complist(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_complist(Module m)
 {
     mtab = NULL;
     mgtab = NULL;
@@ -1237,7 +1237,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_complist(Module m)
 {
     free(mtab);
     free(mgtab);
@@ -1251,7 +1251,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_complist(Module m)
 {
     return 0;
 }
diff --git a/Src/Zle/complist.mdd b/Src/Zle/complist.mdd
index a7d85fad7..4b6a5afe8 100644
--- a/Src/Zle/complist.mdd
+++ b/Src/Zle/complist.mdd
@@ -1,5 +1,3 @@
-name=zsh/complist
-
-moddeps="zsh/complete zsh/zle"
+moddeps="complete zle"
 
 objects="complist.o"
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index 3bb7c60ce..9e66bab15 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1491,7 +1491,7 @@ calclist(int showall)
 }
 
 /**/
-int asklist(void)
+mod_export int asklist(void)
 {
     /* Set the cursor below the prompt. */
     trashzle();
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 6b946de93..bb69e5bf8 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -2444,7 +2444,7 @@ static struct builtin bintab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_computil(Module m)
 {
     memset(cadef_cache, 0, sizeof(cadef_cache));
     memset(cvdef_cache, 0, sizeof(cvdef_cache));
@@ -2458,14 +2458,14 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_computil(Module m)
 {
     return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_computil(Module m)
 {
     deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     return 0;
@@ -2473,7 +2473,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_computil(Module m)
 {
     int i;
 
diff --git a/Src/Zle/computil.mdd b/Src/Zle/computil.mdd
index d8190580b..cf2a13b60 100644
--- a/Src/Zle/computil.mdd
+++ b/Src/Zle/computil.mdd
@@ -1,6 +1,4 @@
-name=zsh/computil
-
-moddeps="zsh/complete zsh/zle"
+moddeps="complete zle"
 
 objects="computil.o"
 
diff --git a/Src/Zle/deltochar.c b/Src/Zle/deltochar.c
index 5badca411..e3f9def0c 100644
--- a/Src/Zle/deltochar.c
+++ b/Src/Zle/deltochar.c
@@ -75,14 +75,14 @@ deltochar(char **args)
 
 /**/
 int
-setup_(Module m)
+setup_deltochar(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_deltochar(Module m)
 {
     w_deletetochar = addzlefunction("delete-to-char", deltochar,
                                     ZLE_KILL | ZLE_KEEPSUFFIX);
@@ -100,7 +100,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_deltochar(Module m)
 {
     deletezlefunction(w_deletetochar);
     deletezlefunction(w_zaptochar);
@@ -109,7 +109,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_deltochar(Module m)
 {
     return 0;
 }
diff --git a/Src/Zle/deltochar.mdd b/Src/Zle/deltochar.mdd
index 38cedb2a7..4d1f89d1c 100644
--- a/Src/Zle/deltochar.mdd
+++ b/Src/Zle/deltochar.mdd
@@ -1,5 +1,3 @@
-name=zsh/deltochar
-
-moddeps="zsh/zle"
+moddeps="zle"
 
 objects="deltochar.o"
diff --git a/Src/Zle/zle.mdd b/Src/Zle/zle.mdd
index 23292dfb3..a5307084a 100644
--- a/Src/Zle/zle.mdd
+++ b/Src/Zle/zle.mdd
@@ -1,5 +1,3 @@
-name=zsh/zle
-
 autobins="bindkey vared zle"
 
 objects="zle_bindings.o zle_hist.o zle_keymap.o zle_main.o \
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 4b572be25..420494a52 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -1003,7 +1003,7 @@ mod_export struct hookdef zlehooks[] = {
 
 /**/
 int
-setup_(Module m)
+setup_zle(Module m)
 {
     /* Set up editor entry points */
     trashzleptr = trashzle;
@@ -1036,7 +1036,7 @@ setup_(Module m)
 
 /**/
 int
-boot_(Module m)
+boot_zle(Module m)
 {
     addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
     addhookdefs(m->nam, zlehooks, sizeof(zlehooks)/sizeof(*zlehooks));
@@ -1045,7 +1045,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_zle(Module m)
 {
     if(zleactive) {
 	zerrnam(m->nam, "can't unload the zle module while zle is active",
@@ -1059,7 +1059,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_zle(Module m)
 {
     int i;
 
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index 2066fe2ed..84555d20b 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -49,7 +49,7 @@
 /* Hashtable of thingies.  Enabled nodes are those that refer to widgets. */
 
 /**/
-HashTable thingytab;
+mod_export HashTable thingytab;
 
 /**********************************/
 /* hashtable management functions */
@@ -546,7 +546,7 @@ bin_zle_complete(char *name, char **args, char *ops, char func)
     Thingy t;
     Widget w, cw;
 
-    if (!require_module(name, "zsh/complete", 0, 0)) {
+    if (!require_module(name, "complete", 0, 0)) {
 	zerrnam(name, "can't load complete module", NULL, 0);
 	return 1;
     }
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 264b2f06d..9d6c925b8 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -334,7 +334,7 @@ mod_export int insubscr;
 /* Parameter pointer for completing keys of an assoc array. */
 
 /**/
-Param keypm;
+mod_export Param keypm;
 
 /* 1 if we are completing in a quoted string (or inside `...`) */
 
diff --git a/Src/Zle/zleparameter.c b/Src/Zle/zleparameter.c
index d10fe99b1..c4347de6b 100644
--- a/Src/Zle/zleparameter.c
+++ b/Src/Zle/zleparameter.c
@@ -198,14 +198,14 @@ static struct pardef partab[] = {
 
 /**/
 int
-setup_(Module m)
+setup_zleparameter(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_zleparameter(Module m)
 {
     struct pardef *def;
 
@@ -232,7 +232,7 @@ boot_(Module m)
 
 /**/
 int
-cleanup_(Module m)
+cleanup_zleparameter(Module m)
 {
     Param pm;
     struct pardef *def;
@@ -249,7 +249,7 @@ cleanup_(Module m)
 
 /**/
 int
-finish_(Module m)
+finish_zleparameter(Module m)
 {
     return 0;
 }
diff --git a/Src/Zle/zleparameter.mdd b/Src/Zle/zleparameter.mdd
index 6c88db966..d18b89662 100644
--- a/Src/Zle/zleparameter.mdd
+++ b/Src/Zle/zleparameter.mdd
@@ -1,6 +1,4 @@
-name=zsh/zleparameter
-
-moddeps="zsh/zle"
+moddeps="zle"
 
 autoparams="widgets keymaps"
 
diff --git a/Src/init.c b/Src/init.c
index 5c2a68728..c53c81622 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -943,7 +943,7 @@ init_bltinmods(void)
 
 #include "bltinmods.list"
 
-    load_module("zsh/main");
+    load_module("zsh");
 }
 
 /**/
@@ -965,7 +965,7 @@ noop_function_int(int nothing)
  * avoid wasting space with the fallback functions.  No other source    *
  * file needs to know which modules are linked in.                      */
 
-#ifdef LINKED_XMOD_zshQszle
+#ifdef LINKED_XMOD_zle
 
 /**/
 mod_export ZleVoidFn trashzleptr = noop_function;
@@ -978,26 +978,26 @@ mod_export ZleVoidIntFn spaceinlineptr = noop_function_int;
 /**/
 mod_export ZleReadFn zlereadptr = autoload_zleread;
 
-#else /* !LINKED_XMOD_zshQszle */
+#else /* !LINKED_XMOD_zle */
 
 mod_export ZleVoidFn trashzleptr = noop_function;
 mod_export ZleVoidFn gotwordptr = noop_function;
 mod_export ZleVoidFn refreshptr = noop_function;
 mod_export ZleVoidIntFn spaceinlineptr = noop_function_int;
-# ifdef UNLINKED_XMOD_zshQszle
+# ifdef UNLINKED_XMOD_zle
 mod_export ZleReadFn zlereadptr = autoload_zleread;
-# else /* !UNLINKED_XMOD_zshQszle */
+# else /* !UNLINKED_XMOD_zle */
 mod_export ZleReadFn zlereadptr = fallback_zleread;
-# endif /* !UNLINKED_XMOD_zshQszle */
+# endif /* !UNLINKED_XMOD_zle */
 
-#endif /* !LINKED_XMOD_zshQszle */
+#endif /* !LINKED_XMOD_zle */
 
 /**/
 unsigned char *
 autoload_zleread(char *lp, char *rp, int ha)
 {
     zlereadptr = fallback_zleread;
-    load_module("zsh/zle");
+    load_module("zle");
     return zleread(lp, rp, ha);
 }
 
diff --git a/Src/makepro.awk b/Src/makepro.awk
index eb063f092..350b2f9c8 100644
--- a/Src/makepro.awk
+++ b/Src/makepro.awk
@@ -109,6 +109,15 @@ BEGIN {
 	gsub(/@>/, ")", dcltor)
 	gsub(/@!/, ",", dcltor)
 
+	# If this is a module boot/cleanup function, conditionally rename it.
+	if(" " dtype " " ~ / int / && dcltor ~ / *@\+(boot|cleanup|setup|finish)_[_0-9A-Za-z]+@- *_\(\( *Module +[_0-9A-Za-z]+ *\)\) */) {
+	    modtype = dnam
+	    sub(/_.*$/, "", modtype)
+	    printf "%s# if defined(DYNAMIC_NAME_CLASH_OK) && defined(MODULE)\n", locality
+	    printf "%s#  define " dnam " " modtype "_\n", locality
+	    printf "%s# endif\n", locality
+	}
+
 	# If this is exported, add it to the exported symbol list.
 	if(exported)
 	    printf "X%s\n", dnam
diff --git a/Src/mkbltnmlst.sh b/Src/mkbltnmlst.sh
index 94043cb9c..8e970d45e 100644
--- a/Src/mkbltnmlst.sh
+++ b/Src/mkbltnmlst.sh
@@ -11,7 +11,7 @@ test "x$srcdir" = "x"   && srcdir=.
 MODBINS=${MODBINS-modules-bltin}
 XMODCF=${XMODCF-$srcdir/xmods.conf}
 
-bin_mods=" zsh/main "`sed 's/^/ /;s/$/ /' $MODBINS`
+bin_mods=" zsh "`sed 's/^/ /;s/$/ /' $MODBINS`
 x_mods=`cat $XMODCF`
 . ./modules.index
 
@@ -20,7 +20,6 @@ trap "rm -f $1; exit 1" 1 2 15
 exec > $1
 
 for x_mod in $x_mods; do
-    q_x_mod=`echo $x_mod | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
     case "$bin_mods" in
     *" $x_mod "*)
         echo "/* linked-in known module \`$x_mod' */"
@@ -31,10 +30,10 @@ for x_mod in $x_mods; do
         echo "/* non-linked-in known module \`$x_mod' */"
 	linked=no
     esac
-    eval "modfile=\$modfile_$q_x_mod"
+    eval "loc=\$loc_$x_mod"
     unset moddeps autobins autoinfixconds autoprefixconds autoparams
     unset automathfuncs
-    . $srcdir/../$modfile
+    . $srcdir/../$loc/${x_mod}.mdd
     for bin in $autobins; do
 	echo "    add_autobin(\"$bin\", \"$x_mod\");"
     done
@@ -59,11 +58,10 @@ done
 echo
 done_mods=" "
 for bin_mod in $bin_mods; do
-    q_bin_mod=`echo $bin_mod | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
     echo "/* linked-in module \`$bin_mod' */"
-    eval "modfile=\$modfile_$q_bin_mod"
+    eval "loc=\$loc_$bin_mod"
     unset moddeps
-    . $srcdir/../$modfile
+    . $srcdir/../$loc/${bin_mod}.mdd
     for dep in $moddeps; do
 	case $done_mods in
 	    *" $dep "*)
@@ -74,14 +72,14 @@ for bin_mod in $bin_mods; do
 	esac
     done
     echo "    {"
-    echo "        extern int setup_${q_bin_mod} _((Module));"
-    echo "        extern int boot_${q_bin_mod} _((Module));"
-    echo "        extern int cleanup_${q_bin_mod} _((Module));"
-    echo "        extern int finish_${q_bin_mod} _((Module));"
+    echo "        extern int setup_${bin_mod} _((Module));"
+    echo "        extern int boot_${bin_mod} _((Module));"
+    echo "        extern int cleanup_${bin_mod} _((Module));"
+    echo "        extern int finish_${bin_mod} _((Module));"
     echo
     echo "        register_module(\"$bin_mod\","
-    echo "                        setup_${q_bin_mod}, boot_${q_bin_mod},"
-    echo "                        cleanup_${q_bin_mod}, finish_${q_bin_mod});"
+    echo "                        setup_${bin_mod}, boot_${bin_mod},"
+    echo "                        cleanup_${bin_mod}, finish_${bin_mod});"
     echo "    }"
     done_mods="$done_mods$bin_mod "
 done
diff --git a/Src/mkmakemod.sh b/Src/mkmakemod.sh
index e8005dea7..6807649fc 100644
--- a/Src/mkmakemod.sh
+++ b/Src/mkmakemod.sh
@@ -17,9 +17,8 @@
 # defines one module.  The .mdd file is actually a shell script, which will
 # be sourced.  It may define the following shell variables:
 #
-#   name            name of this module
 #   moddeps         modules on which this module depends (default none)
-#   nozshdep        non-empty indicates no dependence on the `zsh/main' pseudo-module
+#   nozshdep        non-empty indicates no dependence on the `zsh' pseudo-module
 #   alwayslink      if non-empty, always link the module into the executable
 #   autobins        builtins defined by the module, for autoloading
 #   autoinfixconds  infix condition codes defined by the module, for
@@ -104,14 +103,14 @@ if $first_stage; then
     echo
 
     . Src/modules.index
-    bin_mods=" zsh/main "`sed 's/^/ /;s/$/ /' Src/modules-bltin`
+    bin_mods=" zsh "`sed 's/^/ /;s/$/ /' Src/modules-bltin`
     if grep '%@D@%D%' config.status >/dev/null; then
 	is_dynamic=true
     else
 	is_dynamic=false
     fi
 
-    here_mddnames=
+    here_modules=
     all_subdirs=
     all_modobjs=
     all_modules=
@@ -120,31 +119,30 @@ if $first_stage; then
     all_proto=
     lastsub=//
     for module in $module_list; do
-	q_module=`echo $module | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
-	eval "modfile=\$modfile_$q_module"
-	case $modfile in
-	    $the_subdir/$lastsub/*) ;;
-	    $the_subdir/*/*)
-		lastsub=`echo $modfile | sed 's,^'$the_subdir'/,,;s,/[^/]*$,,'`
-		all_subdirs="$all_subdirs $lastsub"
-		;;
-	    $the_subdir/*)
-		mddname=`echo $modfile | sed 's,^.*/,,;s,\.mdd$,,'`
-		here_mddnames="$here_mddnames $mddname"
+	eval "loc=\$loc_$module"
+	case $loc in
+	    $the_subdir)
+		here_modules="$here_modules $module"
 		build=$is_dynamic
 		case $is_dynamic@$bin_mods in
 		    *" $module "*)
 			build=true
-			all_modobjs="$all_modobjs modobjs.${mddname}" ;;
+			all_modobjs="$all_modobjs modobjs.${module}" ;;
 		    true@*)
-			all_modules="$all_modules ${mddname}.\$(DL_EXT)" ;;
+			all_modules="$all_modules ${module}.\$(DL_EXT)" ;;
 		esac
-		all_mdds="$all_mdds ${mddname}.mdd"
-		$build && all_mdhs="$all_mdhs ${mddname}.mdh"
-		$build && all_proto="$all_proto proto.${mddname}"
+		all_mdds="$all_mdds ${module}.mdd"
+		$build && all_mdhs="$all_mdhs ${module}.mdh"
+		$build && all_proto="$all_proto proto.${module}"
+		;;
+	    $lastsub | $lastsub/*) ;;
+	    $the_subdir/*)
+		all_subdirs="$all_subdirs $loc"
+		lastsub=$loc
 		;;
 	esac
     done
+    all_subdirs=`echo "$all_subdirs" | sed "s' $the_subdir/' 'g"`
     echo "MODOBJS =$all_modobjs"
     echo "MODULES =$all_modules"
     echo "MDDS    =$all_mdds"
@@ -171,41 +169,39 @@ if $first_stage; then
 
     other_mdhs=
     remote_mdhs=
-    for mddname in $here_mddnames; do
+    for module in $here_modules; do
 
-	unset name moddeps nozshdep alwayslink hasexport
+	unset moddeps nozshdep alwayslink hasexport
 	unset autobins autoinfixconds autoprefixconds autoparams automathfuncs
 	unset objects proto headers hdrdeps otherincs
-	. $top_srcdir/$the_subdir/${mddname}.mdd
-	q_name=`echo $name | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
+	. $top_srcdir/$the_subdir/${module}.mdd
 	test -n "${moddeps+set}" || moddeps=
-	test -n "$nozshdep" || moddeps="$moddeps zsh/main"
+	test -n "$nozshdep" || moddeps="$moddeps zsh"
 	test -n "${proto+set}" ||
 	    proto=`echo $objects '' | sed 's,\.o ,.syms ,g'`
 
 	dobjects=`echo $objects '' | sed 's,\.o ,..o ,g'`
 	modhdeps=
 	imports=
-	q_moddeps=
+	depimports=
 	for dep in $moddeps; do
-	    q_dep=`echo $dep | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
-	    q_moddeps="$q_moddeps $q_dep"
-	    eval "depfile=\$modfile_$q_dep"
-	    eval `echo $depfile | sed 's,/\([^/]*\)\.mdd$,;depbase=\1,;s,^,loc=,'`
-	    imports="$imports \$(IMPOPT)\$(dir_top)/$loc/${depbase}.export"
+	    eval "loc=\$loc_$dep"
+	    imports="$imports \$(IMPOPT)\$(dir_top)/$loc/$dep.export"
+	    test "$loc" = "$the_subdir" &&
+	        depimports="$depimports $dep.export"
 	    case $the_subdir in
 		$loc)
-		    mdh="${depbase}.mdh"
+		    mdh="${dep}.mdh"
 		    ;;
 		$loc/*)
-		    mdh="\$(dir_top)/$loc/${depbase}.mdh"
+		    mdh="\$(dir_top)/$loc/${dep}.mdh"
 		    case "$other_mdhs " in
 			*" $mdh "*) ;;
 			*) other_mdhs="$other_mdhs $mdh" ;;
 		    esac
 		    ;;
 		*)
-		    mdh="\$(dir_top)/$loc/${depbase}.mdh"
+		    mdh="\$(dir_top)/$loc/${dep}.mdh"
 		    case "$remote_mdhs " in
 			*" $mdh "*) ;;
 			*) remote_mdhs="$remote_mdhs $mdh" ;;
@@ -215,91 +211,64 @@ if $first_stage; then
 	    modhdeps="$modhdeps $mdh"
 	done
 
-	echo "##### ===== DEPENDENCIES GENERATED FROM ${mddname}.mdd ===== #####"
+	echo "##### ===== DEPENDENCIES GENERATED FROM ${module}.mdd ===== #####"
 	echo
-	echo "MODOBJS_${mddname} = $objects"
-	echo "MODDOBJS_${mddname} = $dobjects \$(@E@NTRYOBJ)"
-	echo "SYMS_${mddname} = $proto"
-	echo "EPRO_${mddname} = "`echo $proto '' | sed 's,\.syms ,.epro ,g'`
-	echo "INCS_${mddname} = \$(EPRO_${mddname}) $otherincs"
-	echo "EXPIMP_${mddname} = $imports \$(EXPOPT)$mddname.export"
-	echo "NXPIMP_${mddname} ="
+	echo "MODOBJS_${module} = $objects"
+	echo "MODDOBJS_${module} = $dobjects \$(@E@NTRYOBJ)"
+	echo "SYMS_${module} = $proto"
+	echo "EPRO_${module} = "`echo $proto '' | sed 's,\.syms ,.epro ,g'`
+	echo "INCS_${module} = \$(EPRO_${module}) $otherincs"
+	echo "EXPIMP_${module} = $imports \$(EXPOPT)$module.export"
+	echo "NXPIMP_${module} ="
 	echo
-	echo "proto.${mddname}: \$(EPRO_${mddname})"
-	echo "\$(SYMS_${mddname}): \$(PROTODEPS)"
+	echo "proto.${module}: \$(EPRO_${module})"
+	echo "\$(SYMS_${module}): \$(PROTODEPS)"
 	echo
-	echo "${mddname}.export: \$(SYMS_${mddname})"
-	echo "	( echo '#!'; cat \$(SYMS_${mddname}) | sed -n '/^X/{s/^X//;p;}' | sort -u ) > \$@"
+	echo "${module}.export: \$(SYMS_${module})"
+	echo "	( echo '#!'; cat \$(SYMS_${module}) | sed -n '/^X/{s/^X//;p;}' | sort -u ) > \$@"
 	echo
-	echo "modobjs.${mddname}: \$(MODOBJS_${mddname})"
-	echo "	echo '' \$(MODOBJS_${mddname}) $modobjs_sed>> \$(dir_src)/stamp-modobjs.tmp"
+	echo "modobjs.${module}: \$(MODOBJS_${module})"
+	echo "	echo '' \$(MODOBJS_${module}) $modobjs_sed>> \$(dir_src)/stamp-modobjs.tmp"
 	echo
 	if test -z "$alwayslink"; then
-	    case " $all_modules" in *" ${mddname}."*)
-		echo "install.modules-here: install.modules.${mddname}"
-		echo "uninstall.modules-here: uninstall.modules.${mddname}"
-		echo
-	    ;; esac
-	    instsubdir=`echo $name | sed 's,^,/,;s,/[^/]*$,,'`
-	    echo "install.modules.${mddname}: ${mddname}.\$(DL_EXT)"
-	    echo "	\$(sdir_top)/mkinstalldirs \$(DESTDIR)\$(MODDIR)${instsubdir}"
-	    echo "	\$(INSTALL_PROGRAM) ${mddname}.\$(DL_EXT) \$(DESTDIR)\$(MODDIR)/${name}.\$(DL_EXT)"
-	    echo
-	    echo "uninstall.modules.${mddname}:"
-	    echo "	rm -f \$(DESTDIR)\$(MODDIR)/${name}.\$(DL_EXT)"
-	    echo
-	    echo "${mddname}.\$(DL_EXT): \$(MODDOBJS_${mddname}) ${mddname}.export"
+	    echo "${module}.\$(DL_EXT): \$(MODDOBJS_${module}) ${module}.export $depimports"
 	    echo '	rm -f $@'
-	    echo "	\$(DLLINK) \$(@E@XPIMP_$mddname) \$(@E@NTRYOPT) \$(MODDOBJS_${mddname}) \$(LIBS)"
+	    echo "	\$(DLLINK) \$(@E@XPIMP_$module) \$(@E@NTRYOPT) \$(MODDOBJS_${module}) \$(LIBS)"
 	    echo
 	fi
-	echo "${mddname}.mdhi: ${mddname}.mdhs \$(INCS_${mddname})"
+	echo "${module}.mdhi: ${module}.mdhs \$(INCS_${module})"
 	echo "	@test -f \$@ || echo 'do not delete this file' > \$@"
 	echo
-	echo "${mddname}.mdhs: ${mddname}.mdd"
-	echo "	@\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${mddname}.mdh.tmp"
-	echo "	@if cmp -s ${mddname}.mdh ${mddname}.mdh.tmp; then \\"
-	echo "	    rm -f ${mddname}.mdh.tmp; \\"
-	echo "	    echo \"\\\`${mddname}.mdh' is up to date.\"; \\"
+	echo "${module}.mdhs: ${module}.mdd"
+	echo "	@\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${module}.mdh.tmp"
+	echo "	@if cmp -s ${module}.mdh ${module}.mdh.tmp; then \\"
+	echo "	    rm -f ${module}.mdh.tmp; \\"
+	echo "	    echo \"\\\`${module}.mdh' is up to date.\"; \\"
 	echo "	else \\"
-	echo "	    mv -f ${mddname}.mdh.tmp ${mddname}.mdh; \\"
-	echo "	    echo \"Updated \\\`${mddname}.mdh'.\"; \\"
+	echo "	    mv -f ${module}.mdh.tmp ${module}.mdh; \\"
+	echo "	    echo \"Updated \\\`${module}.mdh'.\"; \\"
 	echo "	fi"
-	echo "	echo 'timestamp for ${mddname}.mdh against ${mddname}.mdd' > \$@"
+	echo "	echo 'timestamp for ${module}.mdh against ${module}.mdd' > \$@"
 	echo
-	echo "${mddname}.mdh: ${modhdeps} ${headers} ${hdrdeps} ${mddname}.mdhi"
-	echo "	@\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${mddname}.mdh.tmp"
-	echo "	@mv -f ${mddname}.mdh.tmp ${mddname}.mdh"
-	echo "	@echo \"Updated \\\`${mddname}.mdh'.\""
+	echo "${module}.mdh: ${modhdeps} ${headers} ${hdrdeps} ${module}.mdhi"
+	echo "	@\$(MAKE) -f \$(makefile) \$(MAKEDEFS) ${module}.mdh.tmp"
+	echo "	@mv -f ${module}.mdh.tmp ${module}.mdh"
+	echo "	@echo \"Updated \\\`${module}.mdh'.\""
 	echo
-	echo "${mddname}.mdh.tmp:"
+	echo "${module}.mdh.tmp:"
 	echo "	@( \\"
-	echo "	    echo '#ifndef have_${q_name}_module'; \\"
-	echo "	    echo '#define have_${q_name}_module'; \\"
-	echo "	    echo; \\"
-	echo "	    echo '# ifndef IMPORTING_MODULE_${q_name}'; \\"
-	echo "	    if test @SHORTBOOTNAMES@ = yes; then \\"
-	echo "		echo '#  ifndef MODULE'; \\"
-	echo "	    fi; \\"
-	echo "	    echo '#   define boot_ boot_${q_name}'; \\"
-	echo "	    echo '#   define cleanup_ cleanup_${q_name}'; \\"
-	echo "	    echo '#   define setup_ setup_${q_name}'; \\"
-	echo "	    echo '#   define finish_ finish_${q_name}'; \\"
-	echo "	    if test @SHORTBOOTNAMES@ = yes; then \\"
-	echo "		echo '#  endif /* !MODULE */'; \\"
-	echo "	    fi; \\"
-	echo "	    echo '# endif /* !IMPORTING_MODULE_${q_name} */'; \\"
+	echo "	    echo '#ifndef have_${module}_module'; \\"
+	echo "	    echo '#define have_${module}_module'; \\"
 	echo "	    echo; \\"
-	if test -n "$moddeps"; then (
-	    set x $q_moddeps
+	if test -n "$moddeps"; then
 	    echo "	    echo '/* Module dependencies */'; \\"
-	    for hdep in $modhdeps; do
-		shift
-		echo "	    echo '# define IMPORTING_MODULE_${1} 1'; \\"
-		echo "	    echo '# include \"${hdep}\"'; \\"
-	    done
+	    echo "	    for mod in $modhdeps; do \\"
+	    echo "		echo '# define USING_MODULE'; \\"
+	    echo "		echo '# include \"'\$\$mod'\"'; \\"
+	    echo "	    done; \\"
+	    echo "	    echo '# undef USING_MODULE'; \\"
 	    echo "	    echo; \\"
-	) fi
+	fi
 	if test -n "$headers"; then
 	    echo "	    echo '/* Extra headers for this module */'; \\"
 	    echo "	    for hdr in $headers; do \\"
@@ -312,18 +281,18 @@ if $first_stage; then
 	    echo "	    echo; \\"
 	fi
 	if test -n "$proto"; then
-	    echo "	    for epro in \$(EPRO_${mddname}); do \\"
+	    echo "	    for epro in \$(EPRO_${module}); do \\"
 	    echo "		echo '# include \"'\$\$epro'\"'; \\"
 	    echo "	    done; \\"
 	    echo "	    echo; \\"
 	fi
-	echo "	    echo '#endif /* !have_${q_name}_module */'; \\"
+	echo "	    echo '#endif /* !have_${module}_module */'; \\"
 	echo "	) > \$@"
 	echo
-	echo "\$(MODOBJS_${mddname}) \$(MODDOBJS_${mddname}): ${mddname}.mdh"
+	echo "\$(MODOBJS_${module}) \$(MODDOBJS_${module}): ${module}.mdh"
 	sed -e '/^ *: *<< *\\Make *$/,/^Make$/!d' \
 	    -e 's/^ *: *<< *\\Make *$//; /^Make$/d' \
-	    < $top_srcdir/$the_subdir/${mddname}.mdd
+	    < $top_srcdir/$the_subdir/${module}.mdd
 	echo
 
     done
diff --git a/Src/mkmodindex.sh b/Src/mkmodindex.sh
index 75a7e43bc..b4616f638 100644
--- a/Src/mkmodindex.sh
+++ b/Src/mkmodindex.sh
@@ -13,25 +13,28 @@ while test $# -ne 0; do
     dir=$1
     shift
     ( set $dir/*.mdd; test -f $1 ) || continue
-    for modfile in $dir/*.mdd; do
-	name=`( . $modfile; echo $name )`
-	case "$name" in *[!/_0-9A-Za-z]* | /* | */ | *//*)
-	    echo >&2 "WARNING: illegally named module \`$name' in $modfile"
-	    echo >&2 "         (ignoring it)"
-	    continue
-	;; esac
-	q_name=`echo $name | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`
-	case " $module_list " in *" $name "*)
-	    eval "omodfile=\$modfile_$q_name"
-	    echo >&2 "WARNING: module \`$name' (in $omodfile) duplicated in $modfile"
-	    echo >&2 "         (ignoring duplicate)"
-	    continue
-	;; esac
-	module_list="$module_list$name "
-	echo "modfile_$q_name=$modfile"
-	eval "modfile_$q_name=\$modfile"
+    dosubs=false
+    for mod in `echo '' $dir/*.mdd '' | sed 's, [^ ]*/, ,g;s,\.mdd , ,g'`; do
+	case `echo "$mod@ $module_list " | sed 's,^.*[^_0-9A-Za-z].*@,@@,'` in
+	    @@*)
+		echo >&2 "WARNING: illegally named module \`$mod' in $dir"
+		echo >&2 "         (ignoring it)"
+		;;
+	    *@*" $mod "*)
+		eval "loc=\$loc_$mod"
+		echo >&2 "WARNING: module \`$mod' (in $loc) duplicated in $dir"
+		echo >&2 "         (ignoring duplicate)"
+		dosubs=true
+		;;
+	    *)
+		module_list="$module_list$mod "
+		echo "loc_$mod=$dir"
+		eval "loc_$mod=\$dir"
+		dosubs=true
+		;;
+	esac
     done
-    set `echo $dir/*/. '' | sed 's,/\. , ,g'` "$@"
+    $dosubs && set `echo $dir/*/. '' | sed 's,/\. , ,g'` "$@"
 done
 
 echo
diff --git a/Src/module.c b/Src/module.c
index fc7f7a722..09507d73f 100644
--- a/Src/module.c
+++ b/Src/module.c
@@ -36,34 +36,34 @@
 LinkList linkedmodules;
 
 
-/* The `zsh/main' module contains all the base code that can't actually be *
- * built as a separate module.  It is initialised by main(), so there's    *
- * nothing for the boot function to do.                                    */
+/* The `zsh' module contains all the base code that can't actually be built *
+ * as a separate module.  It is initialised by main(), so there's nothing   *
+ * for the boot function to do.                                             */
 
 /**/
 int
-setup_(Module m)
+setup_zsh(Module m)
 {
     return 0;
 }
 
 /**/
 int
-boot_(Module m)
+boot_zsh(Module m)
 {
     return 0;
 }
 
 /**/
 int
-cleanup_(Module m)
+cleanup_zsh(Module m)
 {
     return 0;
 }
 
 /**/
 int
-finish_(Module m)
+finish_zsh(Module m)
 {
     return 0;
 }
@@ -358,14 +358,22 @@ hpux_dlsym(void *handle, char *name)
 
 #ifdef DLSYM_NEEDS_UNDERSCORE
 # define STR_SETUP     "_setup_"
+# define STR_SETUP_S   "_setup_%s"
 # define STR_BOOT      "_boot_"
+# define STR_BOOT_S    "_boot_%s"
 # define STR_CLEANUP   "_cleanup_"
+# define STR_CLEANUP_S "_cleanup_%s"
 # define STR_FINISH    "_finish_"
+# define STR_FINISH_S  "_finish_%s"
 #else /* !DLSYM_NEEDS_UNDERSCORE */
 # define STR_SETUP     "setup_"
+# define STR_SETUP_S   "setup_%s"
 # define STR_BOOT      "boot_"
+# define STR_BOOT_S    "boot_%s"
 # define STR_CLEANUP   "cleanup_"
+# define STR_CLEANUP_S "cleanup_%s"
 # define STR_FINISH    "finish_"
+# define STR_FINISH_S  "finish_%s"
 #endif /* !DLSYM_NEEDS_UNDERSCORE */
 
 /**/
@@ -387,11 +395,21 @@ try_load_module(char const *name)
     void *ret = NULL;
     int l;
 
-    l = 1 + strlen(name) + 1 + strlen(DL_EXT);
+    if (strchr(name, '/')) {
+	ret = dlopen(unmeta(name), RTLD_LAZY | RTLD_GLOBAL);
+	if (ret || 
+	    unset(PATHDIRS) ||
+	    (*name == '/') ||
+	    (*name == '.' && name[1] == '/') ||
+	    (*name == '.' && name[1] == '.' && name[2] == '/'))
+	    return ret;
+    }
+
+    l = strlen(name) + 1;
     for (pp = module_path; !ret && *pp; pp++) {
 	if (l + (**pp ? strlen(*pp) : 1) > PATH_MAX)
 	    continue;
-	sprintf(buf, "%s/%s.%s", **pp ? *pp : ".", name, DL_EXT);
+	sprintf(buf, "%s/%s", **pp ? *pp : ".", name);
 	ret = dlopen(unmeta(buf), RTLD_LAZY | RTLD_GLOBAL);
     }
 
@@ -402,9 +420,15 @@ try_load_module(char const *name)
 static void *
 do_load_module(char const *name)
 {
-    void *ret;
+    void *ret = NULL;
+    char buf[PATH_MAX + 1];
 
-    ret = try_load_module(name);
+    if (strlen(name) + strlen(DL_EXT) < PATH_MAX) {
+	sprintf(buf, "%s.%s", name, DL_EXT);
+	ret = try_load_module(buf);
+    }
+    if (!ret)
+	ret = try_load_module(name);
     if (!ret) {
 	int waserr = errflag;
 	zerr("failed to load module: %s", name, 0);
@@ -481,39 +505,37 @@ dyn_finish_module(Module m)
 #else
 
 static Module_func
-module_func(Module m, char *name)
+module_func(Module m, char *name, char *name_s)
 {
+    char *s, *t;
+#ifndef DYNAMIC_NAME_CLASH_OK
+    char buf[PATH_MAX + 1];
+#endif
+    Module_func fn;
+
+    s = strrchr(m->nam, '/');
+    if (s)
+	s = dupstring(++s);
+    else
+	s = m->nam;
+    if ((t = strrchr(s, '.')))
+	*t = '\0';
 #ifdef DYNAMIC_NAME_CLASH_OK
-    return (Module_func) dlsym(m->u.handle, name);
+    fn = (Module_func) dlsym(m->u.handle, name);
 #else /* !DYNAMIC_NAME_CLASH_OK */
-    VARARR(char, buf, strlen(name) + strlen(m->nam)*2 + 1);
-    char const *p;
-    char *q;
-    strcpy(buf, name);
-    q = strchr(buf, 0);
-    for(p = m->nam; *p; p++) {
-	if(*p == '/') {
-	    *q++ = 'Q';
-	    *q++ = 's';
-	} else if(*p == '_') {
-	    *q++ = 'Q';
-	    *q++ = 'u';
-	} else if(*p == 'Q') {
-	    *q++ = 'Q';
-	    *q++ = 'q';
-	} else
-	    *q++ = *p;
-    }
-    *q = 0;
-    return (Module_func) dlsym(m->u.handle, buf);
+    if (strlen(s) + 6 > PATH_MAX)
+	return NULL;
+    sprintf(buf, name_s, s);
+    fn = (Module_func) dlsym(m->u.handle, buf);
 #endif /* !DYNAMIC_NAME_CLASH_OK */
+    return fn;
 }
 
 /**/
 static int
 dyn_setup_module(Module m)
 {
-    Module_func fn = module_func(m, STR_SETUP);
+    Module_func fn = module_func(m, STR_SETUP, STR_SETUP_S);
 
     if (fn)
 	return fn(m);
@@ -525,7 +547,7 @@ dyn_setup_module(Module m)
 static int
 dyn_boot_module(Module m)
 {
-    Module_func fn = module_func(m, STR_BOOT);
+    Module_func fn = module_func(m, STR_BOOT, STR_BOOT_S);
 
     if(fn)
 	return fn(m);
@@ -537,7 +559,7 @@ dyn_boot_module(Module m)
 static int
 dyn_cleanup_module(Module m)
 {
-    Module_func fn = module_func(m, STR_CLEANUP);
+    Module_func fn = module_func(m, STR_CLEANUP, STR_CLEANUP_S);
 
     if(fn)
 	return fn(m);
@@ -552,7 +574,7 @@ dyn_cleanup_module(Module m)
 static int
 dyn_finish_module(Module m)
 {
-    Module_func fn = module_func(m, STR_FINISH);
+    Module_func fn = module_func(m, STR_FINISH, STR_FINISH_S);
     int r;
 
     if (fn)
@@ -635,22 +657,6 @@ finish_module(Module m)
 #endif /* !DYNAMIC */
 
 /**/
-static int
-modname_ok(char const *p)
-{
-    do {
-	if(*p != '_' && !ialnum(*p))
-	    return 0;
-	do {
-	    p++;
-	} while(*p == '_' || ialnum(*p));
-	if(!*p)
-	    return 1;
-    } while(*p++ == '/');
-    return 0;
-}
-
-/**/
 int
 load_module(char const *name)
 {
@@ -660,10 +666,6 @@ load_module(char const *name)
     LinkNode node, n;
     int set;
 
-    if (!modname_ok(name)) {
-	zerr("invalid module name `%s'", name, 0);
-	return 0;
-    }
     if (!(node = find_module(name))) {
 	if (!(linked = module_linked(name)) &&
 	    !(handle = do_load_module(name)))
@@ -776,6 +778,9 @@ require_module(char *nam, char *module, int res, int test)
 	    zwarnnam(nam, "module %s already loaded.", module, 0);
 	    return 0;
 	}
+    } else if (res && isset(RESTRICTED) && strchr(module, '/')) {
+	zwarnnam(nam, "%s: restricted", module, 0);
+	return 0;
     } else
 	return load_module(module);
 
@@ -979,8 +984,13 @@ bin_zmodload_dep(char *nam, char **args, char *ops)
 	int ret = 0;
 	char *tnam = *args++;
 
-	for(; *args; args++)
-	    add_dep(tnam, *args);
+	for(; *args; args++) {
+	    if(isset(RESTRICTED) && strchr(*args, '/')) {
+		zwarnnam(nam, "%s: restricted", *args, 0);
+		ret = 1;
+	    } else
+		add_dep(tnam, *args);
+	}
 	return ret;
     }
 }
@@ -1015,6 +1025,10 @@ bin_zmodload_auto(char *nam, char **args, char *ops)
 	/* add autoloaded builtins */
 	char *modnam;
 	modnam = *args++;
+	if(isset(RESTRICTED) && strchr(modnam, '/')) {
+	    zwarnnam(nam, "%s: restricted", modnam, 0);
+	    return 1;
+	}
 	do {
 	    char *bnam = *args ? *args++ : modnam;
 	    if (strchr(bnam, '/')) {
@@ -1078,6 +1092,10 @@ bin_zmodload_cond(char *nam, char **args, char *ops)
 	char *modnam;
 
 	modnam = *args++;
+	if(isset(RESTRICTED) && strchr(modnam, '/')) {
+	    zwarnnam(nam, "%s: restricted", modnam, 0);
+	    return 1;
+	}
 	do {
 	    char *cnam = *args ? *args++ : modnam;
 	    if (strchr(cnam, '/')) {
@@ -1134,6 +1152,10 @@ bin_zmodload_math(char *nam, char **args, char *ops)
 	char *modnam;
 
 	modnam = *args++;
+	if(isset(RESTRICTED) && strchr(modnam, '/')) {
+	    zwarnnam(nam, "%s: restricted", modnam, 0);
+	    return 1;
+	}
 	do {
 	    char *fnam = *args ? *args++ : modnam;
 	    if (strchr(fnam, '/')) {
@@ -1193,6 +1215,10 @@ bin_zmodload_param(char *nam, char **args, char *ops)
 	char *modnam;
 
 	modnam = *args++;
+	if(isset(RESTRICTED) && strchr(modnam, '/')) {
+	    zwarnnam(nam, "%s: restricted", modnam, 0);
+	    return 1;
+	}
 	do {
 	    char *pnam = *args ? *args++ : modnam;
 	    if (strchr(pnam, '/')) {
diff --git a/Src/xmods.conf b/Src/xmods.conf
index a26e22d6b..ed7769dbc 100644
--- a/Src/xmods.conf
+++ b/Src/xmods.conf
@@ -1,10 +1,10 @@
-zsh/rlimits
-zsh/zle
-zsh/complete
-zsh/compctl
-zsh/sched
-zsh/complist
-zsh/zutil
-zsh/computil
-zsh/parameter
-zsh/zleparameter
+rlimits
+zle
+complete
+compctl
+sched
+complist
+zutil
+computil
+parameter
+zleparameter
diff --git a/Src/zsh.mdd b/Src/zsh.mdd
index e93b6d00f..61672611b 100644
--- a/Src/zsh.mdd
+++ b/Src/zsh.mdd
@@ -1,5 +1,3 @@
-name=zsh/main
-
 nozshdep=1
 alwayslink=1
 
@@ -63,15 +61,18 @@ zshxmods.h: modules-bltin xmods.conf
 	@( \
 	    binmods=`sed 's/^/ /;s/$$/ /' modules-bltin`; \
 	    for mod in `cat $(sdir_src)/xmods.conf`; do \
-		q_mod=`echo $$mod | sed 's,Q,Qq,g;s,_,Qu,g;s,/,Qs,g'`; \
 		case $$binmods in \
 		    *" $$mod "*) \
-			echo "#define    LINKED_XMOD_$$q_mod 1" ;; \
+			echo "#define    LINKED_XMOD_$$mod 1" ;; \
 		    *)  echo "#ifdef DYNAMIC"; \
-			echo "# define UNLINKED_XMOD_$$q_mod 1"; \
+			echo "# define UNLINKED_XMOD_$$mod 1"; \
 			echo "#endif" ;; \
 		esac; \
-	    done \
+	    done; \
+	    echo; \
+	    for mod in $$binmods; do \
+		echo "int boot_$$mod _((Module));"; \
+	    done; \
 	) > $@
 
 clean-here: clean.zsh
diff --git a/Test/ztst.zsh b/Test/ztst.zsh
index a9bf16746..ef9560593 100755
--- a/Test/ztst.zsh
+++ b/Test/ztst.zsh
@@ -24,7 +24,7 @@ emulate -R zsh
 
 # We need to be able to save and restore the options used in the test.
 # We use the $options variable of the parameter module for this.
-zmodload -i zsh/parameter
+zmodload -i parameter
 
 # Note that both the following are regular arrays, since we only use them
 # in whole array assignments to/from $options.
diff --git a/configure.in b/configure.in
index 1b9293440..88af50bd8 100644
--- a/configure.in
+++ b/configure.in
@@ -1525,13 +1525,6 @@ else
   E=N
 fi
 
-if test "x$zsh_cv_sys_dynamic_clash_ok" = xyes; then
-  SHORTBOOTNAMES=yes
-else
-  SHORTBOOTNAMES=no
-fi
-AC_SUBST(SHORTBOOTNAMES)
-
 AC_DEFINE_UNQUOTED(DL_EXT, "$DL_EXT")dnl
 AC_SUBST(D)dnl
 AC_SUBST(DL_EXT)dnl