diff --git a/Makefile b/Makefile
index 7e43b443219fda97ed5f4363e04d680cea337599..7be906fa15abfcfc6233fead6dbf73d2a5b3e19d 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ ifneq ($(OPENWRT_BUILD),1)
   # but we can't include that file in this context
   empty:=
   space:= $(empty) $(empty)
-  _SINGLE=MAKEFLAGS=$(space)
+  _SINGLE=export MAKEFLAGS=$(space);
 
   override OPENWRT_BUILD=1
   export OPENWRT_BUILD
@@ -50,7 +50,7 @@ $(BUILD_DIR)/.prepared: Makefile
 
 clean: FORCE
 	rm -rf $(BUILD_DIR) $(BIN_DIR)
-	$(SUBMAKE) target/linux/clean
+	$(_SINGLE)$(SUBMAKE) target/linux/clean
 
 dirclean: clean
 	rm -rf $(STAGING_DIR) $(STAGING_DIR_HOST) $(STAGING_DIR_TOOLCHAIN) $(TOOLCHAIN_DIR) $(BUILD_DIR_HOST)
@@ -59,7 +59,7 @@ dirclean: clean
 tmp/.prereq_packages: .config
 	unset ERROR; \
 	for package in $(sort $(prereq-y) $(prereq-m)); do \
-		$(NO_TRACE_MAKE) -s -r -C package/$$package prereq || ERROR=1; \
+		$(_SINGLE)$(NO_TRACE_MAKE) -s -r -C package/$$package prereq || ERROR=1; \
 	done; \
 	if [ -n "$$ERROR" ]; then \
 		echo "Package prerequisite check failed."; \
@@ -72,7 +72,7 @@ prereq: $(target/stamp-prereq) tmp/.prereq_packages
 
 prepare: .config $(tools/stamp-install) $(toolchain/stamp-install)
 world: prepare $(target/stamp-compile) $(package/stamp-cleanup) $(package/stamp-compile) $(package/stamp-install) $(package/stamp-rootfs-prepare) $(target/stamp-install) FORCE
-	$(SUBMAKE) package/index
+	$(_SINGLE)$(SUBMAKE) package/index
 
 # update all feeds, re-create index files, install symlinks
 package/symlinks:
diff --git a/include/image.mk b/include/image.mk
index efbc76db36a25d6e098463fc397d64f3b11911b8..6eef6ba9cab373d784db4c0f52ccabe922e9d85a 100644
--- a/include/image.mk
+++ b/include/image.mk
@@ -10,6 +10,7 @@ include $(INCLUDE_DIR)/prereq.mk
 include $(INCLUDE_DIR)/kernel.mk
 include $(INCLUDE_DIR)/host.mk
 
+.NOTPARALLEL:
 override MAKEFLAGS=
 override MAKE:=$(SUBMAKE)
 KDIR=$(KERNEL_BUILD_DIR)
diff --git a/include/kernel-build.mk b/include/kernel-build.mk
index b6d2cf5efbb6ee27274d8cb42b15f8b75516a1e7..4c6a32a42930db1879c5a94c325aae739283ca5f 100644
--- a/include/kernel-build.mk
+++ b/include/kernel-build.mk
@@ -80,25 +80,18 @@ define BuildKernel
 	[ -e "$(LINUX_CONFIG)" ] || touch "$(LINUX_CONFIG)"
 	$(LINUX_CONFCMD) > $(LINUX_DIR)/.config
 	touch $(LINUX_CONFIG)
-	$(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKEOPTS) $$@
+	$(_SINGLE)$(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKEOPTS) $$@
 	$(SCRIPT_DIR)/kconfig.pl '>' $(GENERIC_LINUX_CONFIG) $(LINUX_DIR)/.config > $(LINUX_CONFIG)
 	$(Kernel/Configure)
 
   install: $(LINUX_DIR)/.image
-	TARGET_BUILD="" $(MAKE) -C image compile install
+	+$(MAKE) -C image compile install TARGET_BUILD=
 
   clean: FORCE
 	rm -rf $(KERNEL_BUILD_DIR)
 
-  rebuild: FORCE
-	@$(MAKE) mostlyclean
-	@if [ -f $(LINUX_KERNEL) ]; then \
-		$(MAKE) clean; \
-	fi
-	@$(MAKE) compile
-
   image-prereq:
-	@$(NO_TRACE_MAKE) -s -C image prereq TARGET_BUILD=
+	@+$(NO_TRACE_MAKE) -s -C image prereq TARGET_BUILD=
 
   prereq: image-prereq
 
diff --git a/include/kernel-defaults.mk b/include/kernel-defaults.mk
index 78695629174f402b90ae56eaf50a15c320ca11ae..d5cf1202b3382d3801459eb6e3a299dc3d71bb35 100644
--- a/include/kernel-defaults.mk
+++ b/include/kernel-defaults.mk
@@ -69,11 +69,11 @@ endif
 
 define Kernel/Configure/2.4
 	$(SED) "s,\-mcpu=,\-mtune=,g;" $(LINUX_DIR)/arch/mips/Makefile
-	$(MAKE) $(KERNEL_MAKEOPTS) oldconfig include/linux/compile.h include/linux/version.h
-	$(MAKE) $(KERNEL_MAKEOPTS) dep
+	$(_SINGLE)$(MAKE) $(KERNEL_MAKEOPTS) oldconfig include/linux/compile.h include/linux/version.h
+	$(_SINGLE)$(MAKE) $(KERNEL_MAKEOPTS) dep
 endef
 define Kernel/Configure/2.6
-	-$(MAKE) $(KERNEL_MAKEOPTS) oldconfig prepare scripts
+	-$(_SINGLE)$(MAKE) $(KERNEL_MAKEOPTS) oldconfig prepare scripts
 endef
 define Kernel/Configure/Default
 	$(LINUX_CONFCMD) > $(LINUX_DIR)/.config.target
@@ -86,12 +86,12 @@ endef
 
 define Kernel/CompileModules/Default
 	rm -f $(LINUX_DIR)/vmlinux $(LINUX_DIR)/System.map
-	$(MAKE) $(KERNEL_MAKEOPTS) modules
+	+$(MAKE) $(KERNEL_MAKEOPTS) modules
 endef
 
 define Kernel/CompileImage/Default
 	$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),,rm -f $(TARGET_DIR)/init)
-	$(MAKE) $(KERNEL_MAKEOPTS) $(KERNELNAME)
+	+$(MAKE) $(KERNEL_MAKEOPTS) $(KERNELNAME)
 	$(KERNEL_CROSS)objcopy -O binary -R .reginfo -R .note -R .comment -R .mdebug -S $(LINUX_DIR)/vmlinux $(LINUX_KERNEL)
 	$(KERNEL_CROSS)objcopy -R .reginfo -R .note -R .comment -R .mdebug -S $(LINUX_DIR)/vmlinux $(KERNEL_BUILD_DIR)/vmlinux.elf
 endef
@@ -99,7 +99,7 @@ endef
 define Kernel/Clean/Default
 	rm -f $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/.configured
 	rm -f $(LINUX_KERNEL)
-	$(MAKE) -C $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) clean
+	$(_SINGLE)$(MAKE) -C $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) clean
 endef
 
 
diff --git a/include/subdir.mk b/include/subdir.mk
index 31b867fb617d5e8bf73120b0c6289bb52161085e..4fa1bdfd524c32e3c1ad1f7e9835f59f8613e8b2 100644
--- a/include/subdir.mk
+++ b/include/subdir.mk
@@ -28,7 +28,7 @@ define subdir
     $(call warn,$(1),d,BD $(1)/$(bd))
     $(foreach target,$(SUBTARGETS),
       $(call warn_eval,$(1)/$(bd),t,T,$(1)/$(bd)/$(target): $(if $(QUILT),,$($(1)/$(bd)/$(target)) $(call $(1)//$(target),$(1)/$(bd))))
-		$(if $(findstring $(bd),$($(1)/builddirs-parallel)),$$(SUBMAKE),$$(SUBMAKE) -j1) \
+		+$(if $(findstring $(bd),$($(1)/builddirs-parallel)),$$(SUBMAKE),$(_SINGLE)$$(SUBMAKE) -j1) \
 			-C $(1)/$(bd) $(target) $(if $(findstring $(bd),$($(1)/builddirs-ignore-$(target))), || $(call MESSAGE,   ERROR: $(1)/$(bd) failed to build.))
         $$(if $(call debug,$(1)/$(bd),v),,.SILENT: $(1)/$(bd)/$(target))
 
diff --git a/include/toplevel.mk b/include/toplevel.mk
index 3d7593bf893ec16f067a86bff96761ee3561573f..06b005568ee7058204c5918abeff1243d6b3fe67 100644
--- a/include/toplevel.mk
+++ b/include/toplevel.mk
@@ -47,22 +47,22 @@ prepare-tmpinfo: FORCE
 .config: ./scripts/config/conf prepare-tmpinfo $(if $(CONFIG_HAVE_DOT_CONFIG),,FORCE)
 	@+if [ \! -f .config ] || ! grep CONFIG_HAVE_DOT_CONFIG .config >/dev/null; then \
 		[ -e $(HOME)/.openwrt/defconfig ] && cp $(HOME)/.openwrt/defconfig .config; \
-		$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \
+		$(_SINGLE)$(NO_TRACE_MAKE) menuconfig $(PREP_MK); \
 	fi
 
 scripts/config/mconf:
-	@$(SUBMAKE) -s -j1 -C scripts/config all
+	@$(_SINGLE)$(SUBMAKE) -s -C scripts/config all
 
 $(eval $(call rdep,scripts/config,scripts/config/mconf))
 
 scripts/config/conf:
-	@$(SUBMAKE) -s -j1 -C scripts/config conf
+	@$(_SINGLE)$(SUBMAKE) -s -C scripts/config conf
 
 config: scripts/config/conf prepare-tmpinfo FORCE
 	$< Config.in
 
 config-clean: FORCE
-	$(NO_TRACE_MAKE) -C scripts/config clean
+	$(_SINGLE)$(NO_TRACE_MAKE) -C scripts/config clean
 
 defconfig: scripts/config/conf prepare-tmpinfo FORCE
 	touch .config
@@ -78,10 +78,10 @@ menuconfig: scripts/config/mconf prepare-tmpinfo FORCE
 	$< Config.in
 
 kernel_oldconfig: .config FORCE
-	$(NO_TRACE_MAKE) -C target/linux oldconfig
+	$(_SINGLE)$(NO_TRACE_MAKE) -C target/linux oldconfig
 
 kernel_menuconfig: .config FORCE
-	$(NO_TRACE_MAKE) -C target/linux menuconfig
+	$(_SINGLE)$(NO_TRACE_MAKE) -C target/linux menuconfig
 
 tmp/.prereq-build: include/prereq-build.mk
 	mkdir -p tmp
@@ -103,7 +103,7 @@ clean dirclean: .config
 
 prereq:: .config
 	@+$(MAKE) -s tmp/.prereq-build $(PREP_MK)
-	@$(NO_TRACE_MAKE) -s $@
+	@+$(NO_TRACE_MAKE) -s $@
 
 %::
 	@+$(PREP_MK) $(NO_TRACE_MAKE) -s prereq
@@ -113,14 +113,14 @@ help:
 	cat README
 
 docs docs/compile: FORCE
-	@$(SUBMAKE) -j1 -C docs compile
+	@$(_SINGLE)$(SUBMAKE) -C docs compile
 
 docs/clean: FORCE
-	@$(SUBMAKE) -j1 -C docs clean
+	@$(_SINGLE)$(SUBMAKE) -C docs clean
 
 distclean:
 	rm -rf tmp build_dir staging_dir dl .config* feeds package/feeds package/openwrt-packages bin
-	@$(SUBMAKE) -j1 -C scripts/config clean
+	@$(_SINGLE)$(SUBMAKE) -C scripts/config clean
 
 ifeq ($(findstring v,$(DEBUG)),)
   .SILENT: symlinkclean clean dirclean distclean config-clean download help tmpinfo-clean .config scripts/config/mconf scripts/config/conf menuconfig tmp/.prereq-build tmp/.prereq-package prepare-tmpinfo
diff --git a/rules.mk b/rules.mk
index 6b081bba55dd29ca1618a217dee0efd29d99eeac..e7a26fccc50fab6df966d049da55db3a00289569 100644
--- a/rules.mk
+++ b/rules.mk
@@ -29,7 +29,7 @@ merge=$(subst $(space),,$(1))
 confvar=$(call merge,$(foreach v,$(1),$(if $($(v)),y,n)))
 strip_last=$(patsubst %.$(lastword $(subst .,$(space),$(1))),%,$(1))
 
-_SINGLE=MAKEFLAGS=$(space)
+_SINGLE=export MAKEFLAGS=$(space);
 ARCH:=$(call qstrip,$(shell echo $(CONFIG_ARCH) | sed -e 's/i[3-9]86/i386/'))
 BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD))
 TARGET_OPTIMIZATION:=$(call qstrip,$(CONFIG_TARGET_OPTIMIZATION))
diff --git a/target/linux/Makefile b/target/linux/Makefile
index 1bdd5ae1496ccaf5b5ee3d919dedaff3ad1a0000..769452274b9a7dc69e4ef1d9a80aac2dddd4bd0e 100644
--- a/target/linux/Makefile
+++ b/target/linux/Makefile
@@ -10,4 +10,4 @@ include $(INCLUDE_DIR)/target.mk
 export TARGET_BUILD=1
 
 prereq clean download prepare compile install menuconfig oldconfig update refresh: FORCE
-	@$(NO_TRACE_MAKE) -C $(BOARD) $@
+	@+$(NO_TRACE_MAKE) -C $(BOARD) $@