Index: .bzrignore
===================================================================
--- .bzrignore	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ .bzrignore	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -5,8 +5,8 @@
 *.prev
 *.so.*
+*.d
 Makefile.ag.depend
 Makefile.common
 Makefile.config
-Makefile.depend
 autotool/
 boot/distroot/
Index: Makefile
===================================================================
--- Makefile	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ Makefile	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -41,16 +41,20 @@
 COMMON_MAKEFILE = Makefile.common
 COMMON_HEADER = common.h
-COMMON_HEADER_PREV = $(COMMON_HEADER).prev
 
 CONFIG_MAKEFILE = Makefile.config
 CONFIG_HEADER = config.h
 
-.PHONY: all precheck cscope cscope_parts autotool config_auto config_default config distclean clean check releasefile release
+.PHONY: all precheck cscope cscope_parts autotool config_auto config_default config distclean clean check releasefile release common boot kernel uspace
 
-all: $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER)
-	cp -a $(COMMON_HEADER) $(COMMON_HEADER_PREV)
+all: kernel uspace
+	$(MAKE) -r -C boot PRECHECK=$(PRECHECK)
+
+common: $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER)
+
+kernel: common
 	$(MAKE) -r -C kernel PRECHECK=$(PRECHECK)
+
+uspace: common
 	$(MAKE) -r -C uspace PRECHECK=$(PRECHECK)
-	$(MAKE) -r -C boot PRECHECK=$(PRECHECK)
 
 precheck: clean
@@ -79,7 +83,7 @@
 # Autotool (detects compiler features)
 
-autotool $(COMMON_MAKEFILE) $(COMMON_HEADER): $(CONFIG_MAKEFILE)
+autotool $(COMMON_MAKEFILE) $(COMMON_HEADER): $(CONFIG_MAKEFILE) $(AUTOTOOL)
 	$(AUTOTOOL)
-	-[ -f $(COMMON_HEADER_PREV) ] && diff -q $(COMMON_HEADER_PREV) $(COMMON_HEADER) && mv -f $(COMMON_HEADER_PREV) $(COMMON_HEADER)
+	diff -q $(COMMON_HEADER).new $(COMMON_HEADER) 2> /dev/null; if [ $$? -ne 0 ]; then mv -f $(COMMON_HEADER).new $(COMMON_HEADER); fi
 
 # Build-time configuration
@@ -109,5 +113,5 @@
 
 distclean: clean
-	rm -f $(CSCOPE).out $(COMMON_MAKEFILE) $(COMMON_HEADER) $(COMMON_HEADER_PREV) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) tools/*.pyc tools/checkers/*.pyc release/HelenOS-*
+	rm -f $(CSCOPE).out $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) tools/*.pyc tools/checkers/*.pyc release/HelenOS-*
 
 clean:
Index: boot/Makefile
===================================================================
--- boot/Makefile	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ boot/Makefile	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -117,5 +117,5 @@
 		cp "$(USPACE_PATH)/$(DRVS_PATH)/$$file_dir/$$file_name/$$file_name.fw" "$(DIST_PATH)/$(DRVS_PATH)/$$file_name/" ; \
 	done
-	if ls $(DIST_OVERLAY_PATH)/* >/dev/null; then \
+	if ls $(DIST_OVERLAY_PATH)/* >/dev/null 2>/dev/null; then \
 		cp -r -L $(DIST_OVERLAY_PATH)/* "$(DIST_PATH)"; \
 	fi
@@ -126,6 +126,7 @@
 	$(MAKE) -r -f $(POSTBUILD) clean PRECHECK=$(PRECHECK)
 endif
-	rm -f $(POST_OUTPUT) $(BOOT_OUTPUT) $(DEPEND) $(DEPEND_PREV) arch/*/include/common.h
+	rm -f $(POST_OUTPUT) $(BOOT_OUTPUT) arch/*/include/common.h
 	find generic/src/ arch/*/src/ genarch/src/ -name '*.o' -follow -exec rm \{\} \;
+	find generic/src/ arch/*/src/ genarch/src/ -name '*.d' -follow -exec rm \{\} \;
 
 clean_dist:
Index: boot/Makefile.build
===================================================================
--- boot/Makefile.build	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ boot/Makefile.build	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -27,5 +27,5 @@
 #
 
-.PHONY: all clean
+.PHONY: all clean depend
 
 include Makefile.common
@@ -64,35 +64,19 @@
 endif
 
-ifeq ($(COMPILER),gcc_native)
-	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS) $(EXTRA_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-endif
-
-ifeq ($(COMPILER),gcc_cross)
-	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS) $(EXTRA_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-endif
-
-ifeq ($(COMPILER),gcc_helenos)
-	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS) $(EXTRA_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-endif
-
 ifeq ($(COMPILER),clang)
 	CFLAGS = $(COMMON_CFLAGS) $(CLANG_CFLAGS) $(EXTRA_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
+else
+	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS) $(EXTRA_CFLAGS)
 endif
 
 OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
+DEPENDS := $(addsuffix .d,$(basename $(SOURCES)))
 
 all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(BOOT_OUTPUT)
-	-[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
 
 clean:
 	rm -f $(RAW) $(MAP) $(ARCH_INCLUDE) $(GENARCH_INCLUDE)
 
-ifneq ($(MAKECMDGOALS),clean)
--include $(DEPEND)
-endif
+-include $(DEPENDS)
 
 AS_CFLAGS := $(addprefix -Xassembler ,$(AFLAGS))
@@ -104,28 +88,26 @@
 	$(LD) -n $(LFLAGS) -T $(LINK) -M -Map $(MAP) -o $@ $(OBJECTS)
 
-$(LINK): $(DEPEND)
+$(LINK): | depend
 	$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -D__LINKER__ -E -x c $(LINK).in | grep -v "^\#" > $(LINK)
 
-%.o: %.S $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
+%.o: %.S | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) -D__ASM__
 endif
 
-%.o: %.c $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) -c $< -o $@
+%.o: %.c | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS)
 endif
 
-%.o: %.s $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
+%.o: %.s | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm
 endif
 
-$(DEPEND): $(ARCH_INCLUDE) $(GENARCH_INCLUDE) $(COMMON_HEADER_ARCH) $(PRE_DEPEND)
-	makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) -- $(SOURCES) > $@ 2> /dev/null
-	-[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
+depend: $(ARCH_INCLUDE) $(GENARCH_INCLUDE) $(COMMON_HEADER_ARCH) $(PRE_DEPEND)
 
 $(COMPS).s: $(COMPS).zip
Index: boot/Makefile.common
===================================================================
--- boot/Makefile.common	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ boot/Makefile.common	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -63,6 +63,4 @@
 GENARCH_INCLUDE = generic/include/genarch
 
-DEPEND = Makefile.depend
-DEPEND_PREV = $(DEPEND).prev
 DISTROOT = distroot
 INITRD = initrd
Index: kernel/Makefile
===================================================================
--- kernel/Makefile	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ kernel/Makefile	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -49,6 +49,4 @@
 
 AGDEPEND = Makefile.ag.depend
-DEPEND = Makefile.depend
-DEPEND_PREV = $(DEPEND).prev
 RAW = kernel.raw
 BIN = kernel.bin
@@ -67,12 +65,12 @@
 SIZEOK_MAP = generic/src/debug/sizeok_map.o
 
-.PHONY: all clean autogen_clean
+.PHONY: all clean autogen_clean depend
 
 all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(COMMON_HEADER) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(BIN) $(DISASM)
-	-[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
 
 clean: autogen_clean
-	rm -f $(DEPEND) $(DEPEND_PREV) $(RAW) $(BIN) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* arch/*/_link.ld arch/*/include/arch/common.h
+	rm -f $(RAW) $(BIN) $(MAP) $(JOB) $(MAP_PREV) $(DISASM) $(DUMP) $(REAL_MAP).* arch/*/_link.ld arch/*/include/arch/common.h
 	find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm '{}' \;
+	find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.d' -follow -exec rm '{}' \;
 
 ## Common compiler flags
@@ -129,5 +127,4 @@
 -include arch/$(KARCH)/Makefile.inc
 -include genarch/Makefile.inc
--include $(DEPEND)
 -include $(AGDEPEND)
 
@@ -152,28 +149,11 @@
 #
 
-ifeq ($(COMPILER),gcc_native)
-	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-	INSTRUMENTATION = -finstrument-functions
-endif
-
-ifeq ($(COMPILER),gcc_cross)
-	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-	INSTRUMENTATION = -finstrument-functions
-endif
-
-ifeq ($(COMPILER),gcc_helenos)
-	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-	INSTRUMENTATION = -finstrument-functions
-endif
-
 ifeq ($(COMPILER),clang)
 	CFLAGS = $(COMMON_CFLAGS) $(CLANG_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-	INSTRUMENTATION = -finstrument-functions
-endif
-
+else
+	CFLAGS = $(COMMON_CFLAGS) $(GCC_CFLAGS)
+endif
+
+INSTRUMENTATION = -finstrument-functions
 
 ## Generic kernel sources
@@ -364,4 +344,8 @@
 GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES)))
 
+GENERIC_DEPENDS := $(addsuffix .d,$(basename $(GENERIC_SOURCES)))
+ARCH_DEPENDS := $(addsuffix .d,$(basename $(ARCH_SOURCES)))
+GENARCH_DEPENDS := $(addsuffix .d,$(basename $(GENARCH_SOURCES)))
+
 GENARCH_AUTOGENS_H := $(addsuffix .h,$(basename $(GENARCH_AUTOGENS_AG)))
 GENARCH_AUTOGENS_PROBE_C := $(addsuffix .ag.probe.c,$(basename $(GENARCH_AUTOGENS_AG)))
@@ -378,4 +362,8 @@
 LD_CFLAGS := $(addprefix -Xlinker ,$(LFLAGS))
 
+-include $(GENERIC_DEPENDS)
+-include $(ARCH_DEPENDS)
+-include $(GENARCH_DEPENDS)
+
 ifeq ($(COMPILER),clang)
 	AS_CFLAGS += -mllvm -asm-macro-max-nesting-depth=1000
@@ -408,5 +396,5 @@
 endif
 
-$(LINK): $(LINK).in $(DEPEND)
+$(LINK): $(LINK).in | depend
 	$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@
 
@@ -416,18 +404,18 @@
 	$(AUTOGEN) generate $< <$<.probe.s >$@   
 
-%.o: %.S $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c -o $@ $<
+%.o: %.S | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c -o $@ $<
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) -D__ASM__
 endif
 
-%.o: %.s $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c -o $@ $<
+%.o: %.s | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(AS_CFLAGS) -D__ASM__ -c -o $@ $<
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm $(DEFS) $(CFLAGS) $(EXTRA_FLAGS)
 endif
 
-%.o: %.c $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION)) -c -o $@ $<
+%.o: %.c | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS) $(if $(findstring $<,$(INSTRUMENTED_SOURCES)),$(INSTRUMENTATION)) -c -o $@ $<
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) $(FPU_NO_CFLAGS)
@@ -470,7 +458,5 @@
 	done
 
-$(DEPEND): $(COMMON_HEADER_ARCH) $(AUTOGENS_H)
-	makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) -- $(ARCH_SOURCES) $(GENARCH_SOURCES) $(GENERIC_SOURCES) > $@ 2> /dev/null
-	-[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
+depend: $(COMMON_HEADER_ARCH) $(AUTOGENS_H)
 
 $(COMMON_HEADER_ARCH): $(COMMON_HEADER)
Index: tools/autotool.py
===================================================================
--- tools/autotool.py	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ tools/autotool.py	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -42,5 +42,5 @@
 CONFIG = 'Makefile.config'
 MAKEFILE = 'Makefile.common'
-HEADER = 'common.h'
+HEADER = 'common.h.new'
 GUARD = 'AUTOTOOL_COMMON_H_'
 
@@ -850,5 +850,4 @@
 		check_app(["diff", "--version"], "Diff utility", "usually part of diffutils")
 		check_app(["make", "--version"], "Make utility", "preferably GNU Make")
-		check_app(["makedepend", "-f", "-"], "Makedepend utility", "usually part of imake or xutils")
 		check_app(["unzip"], "unzip utility", "usually part of zip/unzip utilities")
 		
Index: tools/toolchain.sh
===================================================================
--- tools/toolchain.sh	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ tools/toolchain.sh	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -64,4 +64,5 @@
 GDB_VERSION="7.12.1"
 ## GDB_PATCHES="toolchain-gdb-7.6.1.patch"
+ISL_VERSION="0.18"
 
 BASEDIR="`pwd`"
@@ -70,7 +71,9 @@
 GCC="gcc-${GCC_VERSION}.tar.bz2"
 GDB="gdb-${GDB_VERSION}.tar.gz"
+ISL="isl-${ISL_VERSION}.tar.bz2"
 
 REAL_INSTALL=true
 USE_HELENOS_TARGET=false
+BUILD_ISL=false
 
 #
@@ -97,13 +100,19 @@
 	
 	if [ "$RC" -ne "0" ] ; then
-		echo " ${DEPENDENCY} not found, too old or compiler error."
-		echo " Please recheck manually the source file \"${FNAME}.c\"."
-		echo " The compilation of the toolchain is probably going to fail,"
-		echo " you have been warned."
-		echo
-		echo " ===== Compiler output ====="
-		cat "${FNAME}.log"
-		echo " ==========================="
-		echo
+		if [ "${DEPENDENCY}" == "isl" ]; then
+			BUILD_ISL=true
+			
+			echo " isl not found. Will be downloaded and built with GCC."
+		else
+			echo " ${DEPENDENCY} not found, too old or compiler error."
+			echo " Please recheck manually the source file \"${FNAME}.c\"."
+			echo " The compilation of the toolchain is probably going to fail,"
+			echo " you have been warned."
+			echo
+			echo " ===== Compiler output ====="
+			cat "${FNAME}.log"
+			echo " ==========================="
+			echo
+		fi
 	else
 		echo " ${DEPENDENCY} found"
@@ -237,6 +246,8 @@
 	if [ ! -f "${FILE}" ] ; then
 		change_title "Downloading ${FILE}"
-		wget -c "${SOURCE}${FILE}"
+		wget -c "${SOURCE}${FILE}" -O "${FILE}".part
 		check_error $? "Error downloading ${FILE}."
+		
+		mv "${FILE}".part "${FILE}"
 	fi
 	
@@ -350,8 +361,13 @@
 	GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/"
 	GDB_SOURCE="ftp://ftp.gnu.org/gnu/gdb/"
+	ISL_SOURCE="http://isl.gforge.inria.fr/"
 	
 	download_fetch "${BINUTILS_SOURCE}" "${BINUTILS}" "9e8340c96626b469a603c15c9d843727"
 	download_fetch "${GCC_SOURCE}" "${GCC}" "6bf56a2bca9dac9dbbf8e8d1036964a8"
 	download_fetch "${GDB_SOURCE}" "${GDB}" "06c8f40521ed65fe36ebc2be29b56942"
+	
+	if $BUILD_ISL ; then
+		download_fetch "${ISL_SOURCE}" "${ISL}" "11436d6b205e516635b666090b94ab32"
+	fi
 }
 
@@ -423,4 +439,5 @@
 	BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}"
 	GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}"
+	ISLDIR="${WORKDIR}/isl-${ISL_VERSION}"
 	OBJDIR="${WORKDIR}/gcc-obj"
 	GDBDIR="${WORKDIR}/gdb-${GDB_VERSION}"
@@ -436,4 +453,7 @@
 	source_check "${BASEDIR}/${GCC}"
 	source_check "${BASEDIR}/${GDB}"
+	if $BUILD_ISL ; then
+		source_check "${BASEDIR}/${ISL}"
+	fi
 	
 	echo ">>> Removing previous content"
@@ -451,4 +471,8 @@
 	unpack_tarball "${BASEDIR}/${GCC}" "GCC"
 	unpack_tarball "${BASEDIR}/${GDB}" "GDB"
+	if $BUILD_ISL ; then
+		unpack_tarball "${BASEDIR}/${ISL}" "isl"
+		mv "${ISLDIR}" "${GCCDIR}"/isl
+	fi
 	
 	echo ">>> Applying patches"
@@ -471,5 +495,6 @@
 		"--target=${TARGET}" \
 		"--prefix=${PREFIX}" "--program-prefix=${TARGET}-" \
-		--disable-nls --disable-werror --enable-gold
+		--disable-nls --disable-werror --enable-gold \
+		--enable-deterministic-archives
 	check_error $? "Error configuring binutils."
 	
Index: uspace/Makefile.common
===================================================================
--- uspace/Makefile.common	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/Makefile.common	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -100,7 +100,4 @@
 endif
 
-DEPEND = Makefile.depend
-DEPEND_PREV = $(DEPEND).prev
-
 LIB_PREFIX = $(USPACE_PREFIX)/lib
 
@@ -223,15 +220,15 @@
 endif
 
-.PHONY: all clean
+.PHONY: all clean depend
 
 all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(LIBS) $(OUTPUT) $(LOUTPUT) $(EXTRA_OUTPUT)
-	-[ -f $(DEPEND) ] && cp -a $(DEPEND) $(DEPEND_PREV)
 
 all-test: $(TEST_OUTPUT) $(TEST_DISASM)
 
 clean:
-	rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(OUTPUT) $(LARCHIVE) $(LOUTPUT) $(EXTRA_OUTPUT) $(EXTRA_CLEAN)
+	rm -f $(JOB) $(OUTPUT) $(LARCHIVE) $(LOUTPUT) $(EXTRA_OUTPUT) $(EXTRA_CLEAN)
 	find . -name '*.o' -follow -exec rm \{\} \;
 	find . -name '*.lo' -follow -exec rm \{\} \;
+	find . -name '*.d' -follow -exec rm \{\} \;
 
 COMMON_CFLAGS = $(INCLUDES_FLAGS) -O$(OPTIMIZATION) -imacros $(CONFIG_HEADER) \
@@ -276,30 +273,12 @@
 JOBFILE = $(LIBC_PREFIX)/../../../tools/jobfile.py
 
-ifeq ($(COMPILER),gcc_cross)
-	CFLAGS += $(COMMON_CFLAGS) $(GCC_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-endif
-
-ifeq ($(COMPILER),gcc_helenos)
-	CFLAGS += $(COMMON_CFLAGS) $(GCC_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-endif
-
-ifeq ($(COMPILER),gcc_native)
-	CFLAGS += $(COMMON_CFLAGS) $(GCC_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
-endif
-
 ifeq ($(COMPILER),clang)
 	CFLAGS += $(COMMON_CFLAGS) $(CLANG_CFLAGS)
-	DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS)
+else
+	CFLAGS += $(COMMON_CFLAGS) $(GCC_CFLAGS)
 endif
 
 LIB_CFLAGS = $(CFLAGS) -fPIC
 LIB_LFLAGS = $(LFLAGS) -shared -soname $(LSONAME) --whole-archive
-
-ifneq ($(MAKECMDGOALS),clean)
--include $(DEPEND)
-endif
 
 AS_CFLAGS := $(addprefix -Xassembler ,$(AFLAGS))
@@ -309,4 +288,7 @@
 LOBJECTS := $(addsuffix .lo,$(basename $(SOURCES)))
 TEST_OBJECTS := $(addsuffix .test.o,$(basename $(TEST_SOURCES)))
+DEPENDS := $(addsuffix .d,$(basename $(SOURCES))) $(addsuffix .test.d,$(basename $(TEST_SOURCES)))
+
+-include $(DEPENDS)
 
 ifneq ($(BINARY),)
@@ -367,50 +349,47 @@
 endif
 
-%.o: %.S $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
+%.o: %.S | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -D__ASM__
 endif
 
-%.o: %.s $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
+%.o: %.s | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm
 endif
 
-%.o: %.c $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
+%.o: %.c | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS)
 endif
 
-%.test.o: %.c $(DEPEND)
-	$(CC) $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS) -c $< -o $@
+%.test.o: %.c | depend
+	$(CC) -MD $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS) -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS)
 endif
 
-%.lo: %.S $(DEPEND)
-	$(CC) $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
+%.lo: %.S | depend
+	$(CC) -MD $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm/preproc $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -D__ASM__
 endif
 
-%.lo: %.s $(DEPEND)
-	$(CC) $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
+%.lo: %.s | depend
+	$(CC) -MD $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) $(AS_CFLAGS) -D__ASM__ -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ as asm
 endif
 
-%.lo: %.c $(DEPEND)
-	$(CC) $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
+%.lo: %.c | depend
+	$(CC) -MD $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
 ifeq ($(PRECHECK),y)
 	$(JOBFILE) $(JOB) $< $@ cc core $(DEFS) $(LIB_CFLAGS) $(EXTRA_CFLAGS)
 endif
 
-$(DEPEND): $(PRE_DEPEND)
-	makedepend -f - -- $(DEPEND_DEFS) $(CFLAGS) $(EXTRA_CFLAGS) -- $(SOURCES) > $@ 2> /dev/null
-	makedepend -f - -o.test.o -- $(DEPEND_DEFS) $(CFLAGS) $(EXTRA_CFLAGS) $(TEST_CFLAGS) -- $(TEST_SOURCES) >> $@ 2> /dev/null
-	-[ -f $(DEPEND_PREV) ] && diff -q $(DEPEND_PREV) $@ && mv -f $(DEPEND_PREV) $@
+depend: $(PRE_DEPEND)
 
 ##
Index: uspace/app/devctl/devctl.c
===================================================================
--- uspace/app/devctl/devctl.c	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/app/devctl/devctl.c	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -337,4 +337,24 @@
 }
 
+static int drv_unload(const char *drvname)
+{
+	int rc;
+	devman_handle_t drvh;
+
+	rc = devman_driver_get_handle(drvname, &drvh);
+	if (rc != EOK) {
+		printf("Failed resolving driver '%s' (%d).\n", drvname, rc);
+		return rc;
+	}
+
+	rc = devman_driver_unload(drvh);
+	if (rc != EOK) {
+		printf("Failed unloading driver '%s' (%d).\n", drvname, rc);
+		return rc;
+	}
+
+	return EOK;
+}
+
 static void print_syntax(void)
 {
@@ -346,4 +366,5 @@
 	printf("\tdevctl show-drv <driver-name>\n");
 	printf("\tdevctl load-drv <driver-name>\n");
+	printf("\tdevctl unload-drv <driver-name>\n");
 }
 
@@ -412,4 +433,14 @@
 		if (rc != EOK)
 			return 2;
+	} else if (str_cmp(argv[1], "unload-drv") == 0) {
+		if (argc < 3) {
+			printf(NAME ": Argument missing.\n");
+			print_syntax();
+			return 1;
+		}
+
+		rc = drv_unload(argv[2]);
+		if (rc != EOK)
+			return 2;
 	} else {
 		printf(NAME ": Invalid argument '%s'.\n", argv[1]);
Index: uspace/lib/c/generic/devman.c
===================================================================
--- uspace/lib/c/generic/devman.c	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/lib/c/generic/devman.c	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -719,4 +719,16 @@
 }
 
+int devman_driver_unload(devman_handle_t drvh)
+{
+	async_exch_t *exch = devman_exchange_begin(INTERFACE_DDF_CLIENT);
+	if (exch == NULL)
+		return ENOMEM;
+	
+	int rc = async_req_1_0(exch, DEVMAN_DRIVER_UNLOAD, drvh);
+	
+	devman_exchange_end(exch);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/c/include/devman.h
===================================================================
--- uspace/lib/c/include/devman.h	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/lib/c/include/devman.h	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -82,4 +82,5 @@
 extern int devman_driver_get_state(devman_handle_t, driver_state_t *);
 extern int devman_driver_load(devman_handle_t);
+extern int devman_driver_unload(devman_handle_t);
 
 #endif
Index: uspace/lib/c/include/ipc/devman.h
===================================================================
--- uspace/lib/c/include/ipc/devman.h	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/lib/c/include/ipc/devman.h	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -156,4 +156,5 @@
 	DRIVER_FUN_ONLINE,
 	DRIVER_FUN_OFFLINE,
+	DRIVER_STOP
 } devman_to_driver_t;
 
@@ -176,5 +177,6 @@
 	DEVMAN_DRIVER_GET_NAME,
 	DEVMAN_DRIVER_GET_STATE,
-	DEVMAN_DRIVER_LOAD
+	DEVMAN_DRIVER_LOAD,
+	DEVMAN_DRIVER_UNLOAD
 } client_to_devman_t;
 
Index: uspace/lib/drv/generic/driver.c
===================================================================
--- uspace/lib/drv/generic/driver.c	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/lib/drv/generic/driver.c	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -68,4 +68,7 @@
 FIBRIL_MUTEX_INITIALIZE(functions_mutex);
 
+FIBRIL_RWLOCK_INITIALIZE(stopping_lock);
+static bool stopping = false;
+
 static ddf_dev_t *create_device(void);
 static void delete_device(ddf_dev_t *);
@@ -127,6 +130,15 @@
 	}
 	
+	fibril_rwlock_read_lock(&stopping_lock);
+
+	if (stopping) {
+		fibril_rwlock_read_unlock(&stopping_lock);
+		async_answer_0(iid, EIO);
+		return;
+	}
+	
 	ddf_dev_t *dev = create_device();
 	if (!dev) {
+		fibril_rwlock_read_unlock(&stopping_lock);
 		free(dev_name);
 		async_answer_0(iid, ENOMEM);
@@ -148,4 +160,5 @@
 	
 	if (res != EOK) {
+		fibril_rwlock_read_unlock(&stopping_lock);
 		dev_del_ref(dev);
 		async_answer_0(iid, res);
@@ -156,4 +169,5 @@
 	list_append(&dev->link, &devices);
 	fibril_mutex_unlock(&devices_mutex);
+	fibril_rwlock_read_unlock(&stopping_lock);
 	
 	async_answer_0(iid, res);
@@ -282,4 +296,33 @@
 	
 	async_answer_0(iid, (sysarg_t) rc);
+}
+
+static void driver_stop(ipc_callid_t iid, ipc_call_t *icall)
+{
+	/* Prevent new devices from being added */
+	fibril_rwlock_write_lock(&stopping_lock);
+	stopping = true;
+
+	/* Check if there are any devices */
+	fibril_mutex_lock(&devices_mutex);
+	if (list_first(&devices) != NULL) {
+		/* Devices exist, roll back */
+		fibril_mutex_unlock(&devices_mutex);
+		stopping = false;
+		fibril_rwlock_write_unlock(&stopping_lock);
+		async_answer_0(iid, EBUSY);
+		return;
+	}
+
+	fibril_rwlock_write_unlock(&stopping_lock);
+
+	/* There should be no functions at this point */
+	fibril_mutex_lock(&functions_mutex);
+	assert(list_first(&functions) == NULL);
+	fibril_mutex_unlock(&functions_mutex);
+
+	/* Reply with success and terminate */
+	async_answer_0(iid, EOK);
+	exit(0);
 }
 
@@ -312,4 +355,7 @@
 		case DRIVER_FUN_OFFLINE:
 			driver_fun_offline(callid, &call);
+			break;
+		case DRIVER_STOP:
+			driver_stop(callid, &call);
 			break;
 		default:
Index: uspace/srv/devman/client_conn.c
===================================================================
--- uspace/srv/devman/client_conn.c	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/srv/devman/client_conn.c	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -726,4 +726,23 @@
 }
 
+/** Unload a driver by user request. */
+static void devman_driver_unload(ipc_callid_t iid, ipc_call_t *icall)
+{
+	driver_t *drv;
+	int rc;
+	
+	drv = driver_find(&drivers_list, IPC_GET_ARG1(*icall));
+	if (drv == NULL) {
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+	
+	fibril_mutex_lock(&drv->driver_mutex);
+	rc = stop_driver(drv);
+	fibril_mutex_unlock(&drv->driver_mutex);
+
+	async_answer_0(iid, rc);
+}
+
 /** Function for handling connections from a client to the device manager. */
 void devman_connection_client(ipc_callid_t iid, ipc_call_t *icall, void *arg)
@@ -794,4 +813,7 @@
 			devman_driver_load(callid, &call);
 			break;
+		case DEVMAN_DRIVER_UNLOAD:
+			devman_driver_unload(callid, &call);
+			break;
 		default:
 			async_answer_0(callid, ENOENT);
Index: uspace/srv/devman/driver.c
===================================================================
--- uspace/srv/devman/driver.c	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/srv/devman/driver.c	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -298,4 +298,30 @@
 	drv->state = DRIVER_STARTING;
 	return true;
+}
+
+/** Stop a driver
+ *
+ * @param drv		The driver's structure.
+ * @return		True if the driver's task is successfully spawned, false
+ *			otherwise.
+ */
+int stop_driver(driver_t *drv)
+{
+	async_exch_t *exch;
+	sysarg_t retval;
+	
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "stop_driver(drv=\"%s\")", drv->name);
+
+	exch = async_exchange_begin(drv->sess);
+	retval = async_req_0_0(exch, DRIVER_STOP);
+	loc_exchange_end(exch);
+	
+	if (retval != EOK)
+		return retval;
+	
+	drv->state = DRIVER_NOT_STARTED;
+	async_hangup(drv->sess);
+	drv->sess = NULL;
+	return EOK;
 }
 
Index: uspace/srv/devman/driver.h
===================================================================
--- uspace/srv/devman/driver.h	(revision 31cca4f32e9a51af49d12c4a23a2adfb951e750c)
+++ uspace/srv/devman/driver.h	(revision e160bfe8a5d875ff061225e5b3e77814211c6bff)
@@ -50,4 +50,5 @@
 extern void detach_driver(dev_tree_t *, dev_node_t *);
 extern bool start_driver(driver_t *);
+extern int stop_driver(driver_t *);
 extern void add_device(driver_t *, dev_node_t *, dev_tree_t *);
 extern int driver_dev_remove(dev_tree_t *, dev_node_t *);
