diff --git a/include/depends.mk b/include/depends.mk
index 65e9b25d5e564499d4bf26d6ba871fbcffca39f5..828ceb8564e4c27458fc8eca78ccbc049b484617 100644
--- a/include/depends.mk
+++ b/include/depends.mk
@@ -13,7 +13,7 @@
 
 DEP_FINDPARAMS := -x "*/.svn*" -x ".*" -x "*:*" -x "*\!*" -x "* *" -x "*\\\#*" -x "*/.*_check"
 
-find_md5=find $(1) -type f $(patsubst -x,-and -not -path,$(DEP_FINDPARAMS) $(2)) | md5s
+find_md5=$(SH_FUNC) find $(1) -type f $(patsubst -x,-and -not -path,$(DEP_FINDPARAMS) $(2)) | md5s
 
 define rdep
   .PRECIOUS: $(2)
diff --git a/include/kernel.mk b/include/kernel.mk
index f283e0febcf41620db60bcaef6a6e90d3588c84c..6ef4fd942d795ec265eb2ad410e0d20cc4b57f70 100644
--- a/include/kernel.mk
+++ b/include/kernel.mk
@@ -64,6 +64,7 @@ define KernelPackage/Defaults
 endef
 
 define ModuleAutoLoad
+	$(SH_FUNC) \
 	export modules=; \
 	add_module() { \
 		mkdir -p $(2)/etc/modules.d; \
diff --git a/include/package-defaults.mk b/include/package-defaults.mk
index 117497d5ded5402dda69d490360bc66d0636d4c5..649f409f50d168d3bc1eae27a791073ff58f6301 100644
--- a/include/package-defaults.mk
+++ b/include/package-defaults.mk
@@ -43,7 +43,7 @@ endef
 Build/Patch:=$(Build/Patch/Default)
 ifneq ($(strip $(PKG_UNPACK)),)
   define Build/Prepare/Default
-  	$(PKG_UNPACK)
+	$(SH_FUNC) $(PKG_UNPACK)
 	$(Build/Patch)
   endef
 endif
diff --git a/include/package-ipkg.mk b/include/package-ipkg.mk
index 87b142aa594490661ee093cd4a83b07e3e7d3030..82fc209c5bfd10f90a71b412ef4ca6d47c9cca58 100644
--- a/include/package-ipkg.mk
+++ b/include/package-ipkg.mk
@@ -21,7 +21,7 @@ IPKG_STATE_DIR:=$(TARGET_DIR)/usr/lib/opkg
 
 define BuildIPKGVariable
   $(call shexport,Package/$(1)/$(2))
-  $(1)_COMMANDS += var2file "$(call shvar,Package/$(1)/$(2))" $(2);
+  $(1)_COMMANDS += $(SH_FUNC) var2file "$(call shvar,Package/$(1)/$(2))" $(2);
 endef
 
 PARENL :=(
@@ -95,7 +95,7 @@ ifeq ($(DUMP),)
 		echo "Maintainer: $(MAINTAINER)"; \
 		echo "Architecture: $(PKGARCH)"; \
 		echo "Installed-Size: 1"; \
-		echo -n "Description: "; getvar $(call shvar,Package/$(1)/description) | sed -e 's,^[[:space:]]*, ,g'; \
+		echo -n "Description: "; $(SH_FUNC) getvar $(call shvar,Package/$(1)/description) | sed -e 's,^[[:space:]]*, ,g'; \
  	) >> $$(IDIR_$(1))/CONTROL/control
 	chmod 644 $$(IDIR_$(1))/CONTROL/control
 	(cd $$(IDIR_$(1))/CONTROL; \
diff --git a/include/target.mk b/include/target.mk
index 2f45bd877cce35f04d5878effa7d2c2a19d09d6b..d49714c3533045409518034d87fc184f5f971255 100644
--- a/include/target.mk
+++ b/include/target.mk
@@ -67,10 +67,10 @@ define Profile
 		echo "Target-Profile-Kconfig: yes"; \
 	fi; \
 	echo "Target-Profile-Config: "; \
-	getvar "$(call shvar,Profile/$(1)/Config)"; \
+	$(SH_FUNC) getvar "$(call shvar,Profile/$(1)/Config)"; \
 	echo "@@"; \
 	echo "Target-Profile-Description:"; \
-	getvar "$(call shvar,Profile/$(1)/Description)"; \
+	$(SH_FUNC) getvar "$(call shvar,Profile/$(1)/Description)"; \
 	echo "@@"; \
 	echo;
   ifeq ($(CONFIG_TARGET_$(call target_conf,$(BOARD)_$(if $(SUBTARGET),$(SUBTARGET)_)$(1))),y)
@@ -185,7 +185,7 @@ define BuildTargets/DumpCurrent
 	 echo 'Linux-Release: $(LINUX_RELEASE)'; \
 	 echo 'Linux-Kernel-Arch: $(LINUX_KARCH)'; \
 	 echo 'Target-Description:'; \
-	 getvar $(call shvar,Target/Description); \
+	 $(SH_FUNC) getvar $(call shvar,Target/Description); \
 	 echo '@@'; \
 	 echo 'Default-Packages: $(DEFAULT_PACKAGES)'; \
 	 $(DUMPINFO)
diff --git a/include/toplevel.mk b/include/toplevel.mk
index 4510df28161bf969801cd75ceef971cc4d4bccc8..53c5f4772daf8cad8b396a0cdfc9f5ff689f0114 100644
--- a/include/toplevel.mk
+++ b/include/toplevel.mk
@@ -7,7 +7,7 @@
 #
 
 RELEASE:=Kamikaze
-SHELL:=/usr/bin/env bash
+export SHELL:=/usr/bin/env bash
 PREP_MK= OPENWRT_BUILD= QUIET=0
 
 include $(TOPDIR)/include/verbose.mk
diff --git a/include/unpack.mk b/include/unpack.mk
index 01516757771a17f40692e424b14f860781676406..2d3586309516ae83f28d1d3a78e8e25e773b5993 100644
--- a/include/unpack.mk
+++ b/include/unpack.mk
@@ -71,10 +71,10 @@ ifeq ($(strip $(UNPACK_CMD)),)
 endif
 
 ifdef PKG_BUILD_DIR
-  PKG_UNPACK ?= $(call UNPACK_CMD,$(PKG_BUILD_DIR)) $(call CRLF_CMD,$(PKG_BUILD_DIR))
+  PKG_UNPACK ?= $(SH_FUNC) $(call UNPACK_CMD,$(PKG_BUILD_DIR)) $(call CRLF_CMD,$(PKG_BUILD_DIR))
 endif
 ifdef HOST_BUILD_DIR
-  HOST_UNPACK ?= $(call UNPACK_CMD,$(HOST_BUILD_DIR)) $(call CRLF_CMD,$(HOST_BUILD_DIR))
+  HOST_UNPACK ?= $(SH_FUNC) $(call UNPACK_CMD,$(HOST_BUILD_DIR)) $(call CRLF_CMD,$(HOST_BUILD_DIR))
 endif
 
 endif # PKG_SOURCE
diff --git a/rules.mk b/rules.mk
index 2add087133eb0dfe982267ba707543674d39256d..3714fecf5e83848d49ca8562d5e1e9dae9c79616 100644
--- a/rules.mk
+++ b/rules.mk
@@ -16,8 +16,6 @@ include $(TOPDIR)/include/verbose.mk
 
 TMP_DIR:=$(TOPDIR)/tmp
 
-export SHELL=/usr/bin/env bash -c '. $(TOPDIR)/include/shell.sh; eval "$$2"' --
-
 GREP_OPTIONS=
 export GREP_OPTIONS
 
@@ -148,6 +146,7 @@ endif
 export PATH:=$(TARGET_PATH)
 export STAGING_DIR
 export GCC_HONOUR_COPTS:=0
+export SH_FUNC:=. $(INCLUDE_DIR)/shell.sh;
 
 PKG_CONFIG:=$(STAGING_DIR_HOST)/bin/pkg-config