diff --git a/Make.rules.in b/Make.rules.in
index b488fcd0e272fbdf1734c7b731abddd8eb462a0f..1a9e54b5fde9a4af3da8b5e5fbc8aab9b03070bc 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -1,19 +1,23 @@
 # Global rules shared by all makefiles     -*-Makefile-*-
 #
-# Each individual makefile should define the following variables:
+# Each individual makefile must define the following variables:
 # TOPSRCDIR    : top-level source directory
 # TOPOBJDIR    : top-level object directory
 # SRCDIR       : source directory for this module
 # MODULE       : name of the module being built
-# C_SRCS       : C sources for the module (optional)
-# ASM_SRCS     : assembly sources (optional)
-# GEN_ASM_SRCS : generated assembly sources (optional)
-# RC_SRCS      : resource source files (optional)
-# SPEC_SRCS    : interface definition files (optional)
-# GLUE         : C sources for which glue code needs to be generated (optional)
-# EXTRA_SRCS   : extra source files for make depend (optional)
-# EXTRA_OBJS   : extra object files (optional)
-# WRCEXTRA     : extra wrc flags (e.g. '-p _SysRes') (optional)
+#
+# Each individual makefile may define the following additional variables:
+# C_SRCS       : C sources for the module
+# ASM_SRCS     : assembly sources
+# GEN_ASM_SRCS : generated assembly sources
+# RC_SRCS      : resource source files
+# SPEC_SRCS    : interface definition files
+# GLUE         : C sources for which glue code needs to be generated
+# EXTRA_SRCS   : extra source files for make depend
+# EXTRA_OBJS   : extra object files
+# WRCEXTRA     : extra wrc flags (e.g. '-p _SysRes')
+# SUBDIRS      : subdirectories that contain a Makefile
+# EXTRASUBDIRS : subdirectories that do not contain a Makefile
 
 # First some useful definitions
 
@@ -241,6 +245,25 @@ lint:: $(MODULE).ln
 winapi_check::
 	$(WINAPI_CHECK) $(WINAPI_CHECK_FLAGS) $(WINAPI_CHECK_EXTRA_FLAGS) .
 
+# Rules for dependencies
+
+$(SUBDIRS:%=%/__depend__): $(MAKEDEP) dummy
+	cd `dirname $@` && $(MAKE) depend
+
+depend: $(MAKEDEP) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS) $(SUBDIRS:%=%/__depend__)
+	$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS)
+
+# Rules for cleaning
+
+$(SUBDIRS:%=%/__clean__): dummy
+	cd `dirname $@` && $(MAKE) clean
+
+$(EXTRASUBDIRS:%=%/__clean__): dummy
+	-cd `dirname $@` && $(RM) $(CLEAN_FILES)
+
+clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__)
+	$(RM) $(CLEAN_FILES) $(GEN_ASM_SRCS) $(RC_SRCS:.rc=.s) $(RC_SRCS:.rc=.h) $(PROGRAMS)
+
 # Misc. rules
 
 $(SPEC_SRCS:.spec=.spec.c): $(BUILD) $(TOPSRCDIR)/include/builtin16.h $(TOPSRCDIR)/include/builtin32.h
@@ -249,11 +272,8 @@ $(GLUE:.c=.glue.c): $(BUILD) $(TOPSRCDIR)/include/builtin16.h $(TOPSRCDIR)/inclu
 
 $(RC_SRCS:.rc=.s): $(WRC)
 
-depend:: $(MAKEDEP) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS)
-	$(MAKEDEP) $(DIVINCL) -C$(SRCDIR) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS)
-
-clean::
-	$(RM) $(CLEAN_FILES) $(GEN_ASM_SRCS) $(RC_SRCS:.rc=.s) $(RC_SRCS:.rc=.h) $(PROGRAMS)
+$(SUBDIRS): dummy
+	@cd $@ && $(MAKE)
 
 dummy:
 
diff --git a/Makefile.in b/Makefile.in
index fd5a4a30322a05edfd074a3ea2d399b923d8b067..998bf5c7737b94189a873241ebc2ae6e5cfbf16b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -23,9 +23,7 @@ MODULE    = wine
 SOVERSION = 1.0
 SONAME    = libwine.so
 
-TOOLSUBDIRS = \
-	tools \
-	tools/wrc
+TOOLSUBDIRS = tools
 
 LIBSUBDIRS = \
 	controls \
@@ -74,16 +72,14 @@ PROGRAMS = \
 	windows/x11drv/wineclipsrv
 
 # Sub-directories to run make into
-BUILDSUBDIRS = \
+SUBDIRS = \
 	$(TOOLSUBDIRS) \
 	$(LIBSUBDIRS) \
 	$(DLLDIR) \
 	$(EMUSUBDIRS) \
 	$(PROGSUBDIRS) \
-	$(DOCSUBDIRS)
-
-# Sub-directories to run make depend into
-DEPENDSUBDIRS = $(LIBSUBDIRS) $(DLLDIR) $(EMUSUBDIRS) $(DOCSUBDIRS)
+	$(DOCSUBDIRS) \
+	include
 
 # Sub-directories to run make install into
 INSTALLSUBDIRS = $(DLLDIR) $(DOCSUBDIRS) $(INCSUBDIRS)
@@ -91,9 +87,6 @@ INSTALLSUBDIRS = $(DLLDIR) $(DOCSUBDIRS) $(INCSUBDIRS)
 # Sub-directories to run make lint into
 LINTSUBDIRS = $(LIBSUBDIRS) $(DLLDIR) $(EMUSUBDIRS) $(DOCSUBDIRS)
 
-# Extra sub-directories to clean
-CLEANSUBDIRS = dlls include include/bitmaps include/wine tools/cvdump
-
 LIBOBJS = \
 	controls/controls.o \
 	console/console.o \
@@ -201,9 +194,6 @@ checklink::
 $(EMUOBJS) $(LIBOBJS) $(DLLOBJS) $(PROGRAMS): $(TOOLSUBDIRS) dummy
 	@cd `dirname $@` && $(MAKE) `basename $@`
 
-$(BUILDSUBDIRS): dummy
-	@cd $@ && $(MAKE)
-
 $(LIBLINTS) $(EMULINTS): dummy
 	@cd `dirname $@` && $(MAKE) lint
 
@@ -220,9 +210,6 @@ install::
 uninstall::
 	for i in $(INSTALLSUBDIRS); do (cd $$i && $(MAKE) uninstall) || exit 1; done
 
-depend::
-	for i in $(DEPENDSUBDIRS); do (cd $$i && $(MAKE) depend) || exit 1; done
-
 checklink::
 	@cd dlls && $(MAKE) checklink
 
@@ -238,8 +225,6 @@ htmlpages:
 	for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) html); done
 
 clean::
-	for i in $(BUILDSUBDIRS); do (cd $$i && $(MAKE) clean) || exit 1; done
-	for i in $(CLEANSUBDIRS); do (cd $$i && $(RM) $(CLEAN_FILES)); done
 	$(RM) wine wine.sym libwine.so.1.0 TAGS
 
 distclean: clean
diff --git a/debugger/Makefile.in b/debugger/Makefile.in
index 54328b4cfd8951192574a73f59301f336e05af8a..df5677b9288f4f54951fde1c1e73e11f8a657e4d 100644
--- a/debugger/Makefile.in
+++ b/debugger/Makefile.in
@@ -29,7 +29,7 @@ EXTRA_OBJS = y.tab.o lex.yy.o
 
 all: $(MODULE).o
 
-depend:: y.tab.h
+depend: y.tab.h
 
 #
 # This is a special test program that helps debug the internal debugger.
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index f78abdc603b0913d36ded36a574970d0e6d113b1..e0f8703384ecb750fa3f094bb433623c3c0c2503 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -84,6 +84,52 @@ EXTRADLLNAMES = \
 	winaspi \
 	winsock
 
+SUBDIRS = \
+	avifil32 \
+	comctl32 \
+	commdlg \
+	dciman32 \
+	ddraw \
+	dinput \
+	dplayx \
+	dsound \
+	gdi \
+	icmp \
+	imagehlp \
+	imm32 \
+	lzexpand \
+	mpr \
+	msacm \
+	msacm32 \
+	msnet32 \
+	msvideo \
+	odbc32 \
+	ole32 \
+	oleaut32 \
+	olecli \
+	oledlg \
+	olepro32 \
+	olesvr \
+	psapi \
+	rasapi32 \
+	setupx \
+	shell32 \
+	sound \
+	stress \
+	tapi32 \
+	ttydrv \
+	user \
+	version \
+	win32s \
+	win87em \
+	winaspi \
+	windebug \
+	wing \
+	winmm \
+	winsock \
+	winspool \
+	x11drv
+
 @MAKE_RULES@
 
 all: $(DLLS:%=lib%.@LIBEXT@) $(EXTRADLLNAMES:%=lib%.@LIBEXT@)
@@ -252,9 +298,6 @@ libx11drv.@LIBEXT@: x11drv/libx11drv.@LIBEXT@
 $(DLLFILES): dummy
 	@cd `dirname $@` && $(MAKE)
 
-$(DLLFILES:%=%_depend_): dummy
-	@cd `dirname $@` && $(MAKE) depend
-
 $(DLLFILES:%=%_install_): dummy
 	@cd `dirname $@` && $(MAKE) install
 
@@ -264,15 +307,8 @@ $(DLLFILES:%=%_uninstall_): dummy
 $(DLLFILES:%=%_checklink_): dummy
 	@cd `dirname $@` && $(MAKE) checklink
 
-$(DLLFILES:%=%_clean_): dummy
-	@cd `dirname $@` && $(MAKE) clean
-
-depend:: $(DLLFILES:%=%_depend_)
-
 install:: $(DLLFILES:%=%_install_)
 
 uninstall:: $(DLLFILES:%=%_uninstall_)
 
 checklink:: $(DLLFILES:%=%_checklink_)
-
-clean:: $(DLLFILES:%=%_clean_)
diff --git a/dlls/ddraw/Makefile.in b/dlls/ddraw/Makefile.in
index 66e6922f30ec8c1f950cea887812b14a02352e9f..f8da63ae48d4deac130283ce83ea999a08ba5e18 100644
--- a/dlls/ddraw/Makefile.in
+++ b/dlls/ddraw/Makefile.in
@@ -46,7 +46,7 @@ C_SRCS = \
 	helper.c \
 	main.c
 
-SUBDIRS = \
+EXTRASUBDIRS = \
 	d3ddevice \
 	dclipper \
 	ddraw \
@@ -56,7 +56,4 @@ SUBDIRS = \
 
 @MAKE_DLL_RULES@
 
-clean::
-	for i in $(SUBDIRS); do (cd $$i && $(RM) $(CLEAN_FILES)); done
-
 ### Dependencies:
diff --git a/dlls/ttydrv/Makefile.in b/dlls/ttydrv/Makefile.in
index 809467e20404d53b0fb216503b7345b34509cb23..251ad9b3514dd38737e93f764638f0eab2ba66cf 100644
--- a/dlls/ttydrv/Makefile.in
+++ b/dlls/ttydrv/Makefile.in
@@ -23,11 +23,5 @@ SUBDIRS = \
 $(EXTRA_OBJS): $(TOOLSUBDIRS) dummy
 	@cd `dirname $@` && $(MAKE) `basename $@`
 
-depend::
-	for i in $(SUBDIRS); do (cd $$i && $(MAKE) depend) || exit 1; done
-
-clean::
-	for i in $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit 1; done
-
 ### Dependencies:
 
diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in
index 2429d9d64425809c31d4fdb95880547a54a27e7e..79fbdc1456e662915e51ec0b702d03066af4fe1a 100644
--- a/dlls/winmm/Makefile.in
+++ b/dlls/winmm/Makefile.in
@@ -41,7 +41,4 @@ SUBDIRS = \
 
 all: check_wrc
 
-$(SUBDIRS): dummy
-	@cd $@ && $(MAKE)
-
 ### Dependencies:
diff --git a/dlls/x11drv/Makefile.in b/dlls/x11drv/Makefile.in
index 6a07c31c3037ee2bc3d3ee0c2a8de1a5205c70c8..96d38bc0b2f02846722d37c74de9f89b485b0f97 100644
--- a/dlls/x11drv/Makefile.in
+++ b/dlls/x11drv/Makefile.in
@@ -25,11 +25,4 @@ SUBDIRS = \
 $(EXTRA_OBJS): $(TOOLSUBDIRS) dummy
 	@cd `dirname $@` && $(MAKE) `basename $@`
 
-depend::
-	for i in $(SUBDIRS); do (cd $$i && $(MAKE) depend) || exit 1; done
-
-clean::
-	for i in $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit 1; done
-
 ### Dependencies:
-
diff --git a/documentation/Makefile.in b/documentation/Makefile.in
index b8c0389d9c157649420600ed67e34a7131507816..bef83b3c60247d935ffc2ff371d4c3d8bee6f83a 100644
--- a/documentation/Makefile.in
+++ b/documentation/Makefile.in
@@ -24,6 +24,7 @@ HTMLFILES = \
 
 DVIFILES = wine.dvi
 
+EXTRASUBDIRS = samples status
 
 all: $(INFOFILES) $(DVIFILES) $(HTMLFILES)
 
diff --git a/include/Makefile.in b/include/Makefile.in
index 5fda48d341fd0161e1fb9fcb6ed3009bc122081a..f20a2cac7e0900f43facef3096c6d0e95d754c35 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -10,6 +10,8 @@ INSTALLED_INCLUDES = \
 	wingdi.h \
 	winuser.h
 
+EXTRASUBDIRS = bitmaps wine
+
 @MAKE_RULES@
 
 install::
diff --git a/ole/Makefile.in b/ole/Makefile.in
index 9b01d4f0ce7e3cb0416d714e979b1f1a3ac9b9b2..774603023a5a50846f30f20736a42c0bf2d3b944 100644
--- a/ole/Makefile.in
+++ b/ole/Makefile.in
@@ -9,6 +9,8 @@ C_SRCS = \
 	guid.c \
 	ole2nls.c 
 
+EXTRASUBDIRS = nls
+
 all: $(MODULE).o
 
 @MAKE_RULES@
diff --git a/programs/Makefile.in b/programs/Makefile.in
index f9dcd572bb8d2fc8adc4cb831f3c4067004b3f61..8b96580cf1bacd430a93e217d802d6e866328895 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -1,3 +1,9 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = none
+
 SUBDIRS = \
 	avitools \
 	clock \
@@ -16,19 +22,12 @@ SUBDIRS = \
 
 all: $(SUBDIRS)
 
-$(SUBDIRS): dummy
-	@cd $@; $(MAKE)
-
-depend:
-	for i in $(SUBDIRS); do (cd $$i; $(MAKE) depend) || exit 1; done
+@MAKE_RULES@
 
-install:
+install::
 	for i in $(SUBDIRS); do (cd $$i; $(MAKE) install) || exit 1; done
 
-uninstall:
+uninstall::
 	for i in $(SUBDIRS); do (cd $$i; $(MAKE) uninstall) || exit 1; done
 
-clean:
-	for i in $(SUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
-
-dummy:
+### Dependencies:
diff --git a/programs/winhelp/Makefile.in b/programs/winhelp/Makefile.in
index 17cce10019ea68d9487f1181d374046686a2c898..67a0f5b93c8731e0c8db3b75a553bfeaa1afffaf 100644
--- a/programs/winhelp/Makefile.in
+++ b/programs/winhelp/Makefile.in
@@ -23,7 +23,7 @@ RC_SRCS = rsrc.rc
 
 all: check_wrc check_winestub $(PROGRAMS)
 
-depend:: y.tab.h
+depend: y.tab.h
 
 @MAKE_RULES@
 
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 7745fb7ebf2bd329ac821ecc551718750fa39d8c..76affffadf54c00fce9f127cfc7e1ec316ca1ef4 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -9,6 +9,16 @@ MODULE   = none
 
 C_SRCS = build.c makedep.c fnt2bdf.c bin2res.c
 
+SUBDIRS = \
+	cvdump \
+	wrc
+
+EXTRASUBDIRS = \
+	winapi_check \
+	winapi_check/win16 \
+	winapi_check/win32 \
+	wineconf.libs
+
 all: $(PROGRAMS)
 
 @MAKE_RULES@
diff --git a/tools/wrc/Makefile.in b/tools/wrc/Makefile.in
index 85eae630f8608bbcd0f2e763bc54157699124cc6..5f544f2f043863214a1b07845bcec09f52241952 100644
--- a/tools/wrc/Makefile.in
+++ b/tools/wrc/Makefile.in
@@ -22,7 +22,7 @@ EXTRA_OBJS = y.tab.o lex.yy.o
 
 all: $(PROGRAMS)
 
-depend:: y.tab.h
+depend: y.tab.h
 
 @MAKE_RULES@