diff --git a/Config.in b/Config.in
index b5b65abd2d09ed6726aaaa8affce27ee1a5870f7..ae1ba9ffe727f7c19e6d27958a0f5283bf5e9d0c 100644
--- a/Config.in
+++ b/Config.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2007 OpenWrt.org
+# Copyright (C) 2006-2009 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -138,6 +138,7 @@ config SHADOW_PASSWORDS
 
 choice
 	prompt "Binary stripping method"
+	default USE_STRIP   if EXTERNAL_TOOLCHAIN
 	default USE_STRIP   if USE_GLIBC || USE_EGLIBC
 	default USE_SSTRIP
 	help
@@ -231,7 +232,6 @@ endmenu
 menuconfig DEVEL
 	bool "Advanced configuration options (for developers)"
 	default n
-	select TOOLCHAINOPTS if !NATIVE_TOOLCHAIN
 
 config BROKEN
 	bool
diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 15920d52b65d84f55efa6a6797b2d396d43dfed9..3e30b7073de43bb5096234ebe1ee0c727cd6013a 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -61,26 +61,69 @@ define Package/base-files/description
  This package contains a base filesystem and system scripts for OpenWrt.
 endef
 
+
 define Package/gcc/Default
   SECTION:=libs
   CATEGORY:=Base system
-  DEPENDS:=@!NATIVE_TOOLCHAIN
   URL:=http://gcc.gnu.org/
   VERSION:=$(LIBGCC_VERSION)-$(PKG_RELEASE)
 endef
 
+
 define Package/libgcc
 $(call Package/gcc/Default)
   TITLE:=GCC support library
   DEPENDS+=@!(TARGET_avr32||TARGET_coldfire)
 endef
 
+define Package/libgcc/config
+	menu "Configuration"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libgcc
+
+	config LIBGCC_ROOT_DIR
+		string
+		prompt "libgcc shared library base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libgcc
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LIBGCC_FILE_SPEC
+		string
+		prompt "libgcc shared library files (use wildcards)"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libgcc
+		default "./lib/libgcc_s.so.*"
+
+	endmenu
+endef
+
+
 define Package/libssp
 $(call Package/gcc/Default)
   DEPENDS+=@SSP_SUPPORT
   TITLE:=GCC support library
 endef
 
+define Package/libssp/config
+	menu "Configuration"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libssp
+
+	config LIBSPP_ROOT_DIR
+		string
+		prompt "libssp shared library base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libssp
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LIBSSP_FILE_SPEC
+		string
+		prompt "libssp shared library files (use wildcards)"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libssp
+		default "./lib/libssp.so.*"
+
+	endmenu
+endef
+
+
 define Package/libstdcpp
 $(call Package/gcc/Default)
   NAME:=libstdc++
@@ -88,30 +131,114 @@ $(call Package/gcc/Default)
   DEPENDS+=@INSTALL_LIBSTDCPP
 endef
 
+define Package/libstdcpp/config
+	menu "Configuration"
+	depends EXTERNAL_TOOLCHAIN && PACKAGE_libstdcpp
+
+	config LIBSTDCPP_ROOT_DIR
+		string
+		prompt "libstdcpp shared library base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libstdcpp
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LIBSTDCPP_FILE_SPEC
+		string
+		prompt "libstdc++ shared library files (use wildcards)"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libstdcpp
+		default "./lib/libstdc++.so.*"
+
+	endmenu
+endef
+
+
 define Package/libc/Default
   SECTION:=libs
   CATEGORY:=Base system
-  DEPENDS:=@!NATIVE_TOOLCHAIN
   VERSION:=$(LIBC_VERSION)-$(PKG_RELEASE)
   URL:=$(LIBC_URL)
 endef
 
+
 define Package/libc
 $(call Package/libc/Default)
   TITLE:=C library
 endef
 
+define Package/libc/config
+	menu "Configuration"
+	depends EXTERNAL_TOOLCHAIN && PACKAGE_libc
+
+	config LIBC_ROOT_DIR
+		string
+		prompt "libc shared library base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libc
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LIBC_FILE_SPEC
+		string
+		prompt "libc shared library files (use wildcards)"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libc
+		default "./lib/ld{-*.so,-linux*.so.*} ./lib/lib{anl,c,cidn,crypt,dl,m,nsl,nss_dns,nss_files,resolv,util}{-*.so,.so.*}"
+
+	endmenu
+endef
+
+
 define Package/libpthread
 $(call Package/libc/Default)
   TITLE:=POSIX thread library
   DEPENDS:= +librt
 endef
 
+define Package/libpthread/config
+	menu "Configuration"
+	depends EXTERNAL_TOOLCHAIN && PACKAGE_libpthread
+
+	config LIBPTHREAD_ROOT_DIR
+		string
+		prompt "libpthread shared library base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libpthread
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LIBPTHREAD_FILE_SPEC
+		string
+		prompt "libpthread shared library files (use wildcards)"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_libpthread
+		default "./lib/libpthread{-*.so,.so.*}"
+
+	endmenu
+endef
+
+
 define Package/librt
 $(call Package/libc/Default)
   TITLE:=POSIX.1b RealTime extension library
 endef
 
+define Package/librt/config
+	menu "Configuration"
+	depends EXTERNAL_TOOLCHAIN && PACKAGE_librt
+
+	config LIBRT_ROOT_DIR
+		string
+		prompt "librt shared library base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_librt
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LIBRT_FILE_SPEC
+		string
+		prompt "librt shared library files (use wildcards)"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_librt
+		default "./lib/librt{-*.so,.so.*}"
+
+	endmenu
+endef
+
+
 define Package/ldd
 $(call Package/libc/Default)
   SECTION:=utils
@@ -119,6 +246,27 @@ $(call Package/libc/Default)
   TITLE:=LDD trace utility
 endef
 
+define Package/ldd/config
+	menu "Configuration"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_ldd
+
+	config LDD_ROOT_DIR
+		string
+		prompt "ldd trace utility base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_ldd
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LDD_FILE_SPEC
+		string
+		prompt "ldd trace utility file"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_ldd
+		default "./usr/bin/ldd"
+
+	endmenu
+endef
+
+
 define Package/ldconfig
 $(call Package/libc/Default)
   SECTION:=utils
@@ -126,6 +274,26 @@ $(call Package/libc/Default)
   TITLE:=Shared library path configuration
 endef
 
+define Package/ldconfig/config
+	menu "Configuration"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_ldconfig
+
+	config LDCONFIG_ROOT_DIR
+		string
+		prompt "ldconfig base directory"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_ldconfig
+		default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
+		default "/"  if NATIVE_TOOLCHAIN
+
+	config LDCONFIG_FILE_SPEC
+		string
+		prompt "ldconfig file"
+		depends EXTERNAL_TOOLCHAIN && PACKAGE_ldconfig
+		default "./sbin/ldconfig"
+
+	endmenu
+endef
+
 
 define Build/Prepare
 	mkdir -p $(PKG_BUILD_DIR)
@@ -200,26 +368,28 @@ define Package/base-files/install
 	done
 endef
 
-define Package/libgcc/install
+ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
+
+  define Package/libgcc/install
 	$(INSTALL_DIR) $(1)/lib
 	$(CP) $(TOOLCHAIN_DIR)/lib$(LIB_SUFFIX)/libgcc_s.so.* $(1)/lib/
-endef
+  endef
 
-define Package/libssp/install
+  define Package/libssp/install
 	$(INSTALL_DIR) $(1)/lib
 	$(CP) $(TOOLCHAIN_DIR)/lib$(LIB_SUFFIX)/libssp.so.* $(1)/lib/
-endef
+  endef
 
-define Package/libstdcpp/install
+  define Package/libstdcpp/install
 	$(INSTALL_DIR) $(1)/usr/lib
 	$(CP) $(TOOLCHAIN_DIR)/usr/lib$(LIB_SUFFIX)/libstdc++.so.* $(1)/usr/lib/
-endef
+  endef
 
-use_libutil=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_UTMP),libutil)
-use_libnsl=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_NIS),libnsl)
-use_nsswitch=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_NSSWITCH),libnss_dns libnss_files)
+  use_libutil=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_UTMP),libutil)
+  use_libnsl=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_NIS),libnsl)
+  use_nsswitch=$(if $(CONFIG_USE_GLIBC)$(CONFIG_EGLIBC_OPTION_EGLIBC_NSSWITCH),libnss_dns libnss_files)
 
-define Package/glibc/install
+  define Package/glibc/install
 	$(INSTALL_DIR) $(1)/lib
 	$(CP) $(TOOLCHAIN_DIR)/lib/ld*.so.* $(1)/lib/
 	$(CP) $(TOOLCHAIN_DIR)/lib/ld-$(LIBC_SO_VERSION).so $(1)/lib/
@@ -227,51 +397,119 @@ define Package/glibc/install
 		$(CP) $(TOOLCHAIN_DIR)/lib/$$$$file.so.* $(1)/lib/; \
 		$(CP) $(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so $(1)/lib/; \
 	done
-endef
+  endef
 
-define Package/eglibc/install
-$(call Package/glibc/install,$1)
-endef
+  define Package/eglibc/install
+    $(call Package/glibc/install,$1)
+  endef
 
-define Package/uClibc/install
+  define Package/uClibc/install
 	$(INSTALL_DIR) $(1)/lib
 	for file in ld$(LIB_SUFFIX)-uClibc libc libcrypt libdl libm libnsl libresolv libuClibc libutil; do \
 		$(CP) $(TOOLCHAIN_DIR)/lib/$$$$file.so.* $(1)/lib/; \
 		$(CP) $(TOOLCHAIN_DIR)/lib/$$$$file-$(LIBC_SO_VERSION).so $(1)/lib/; \
 	done
-endef
+  endef
 
-define Package/libc/install
-$(call Package/$(LIBC)/install,$1)
-endef
+  define Package/libc/install
+    $(call Package/$(LIBC)/install,$1)
+  endef
 
-define Package/libc/install_lib
+  define Package/libc/install_lib
 	$(CP) $(filter-out %/libdl_pic.a,$(wildcard $(TOOLCHAIN_DIR)/usr/lib/lib*.a)) $(1)/lib/
 	$(if $(wildcard $(TOOLCHAIN_DIR)/usr/lib/libc_so.a),$(CP) $(TOOLCHAIN_DIR)/usr/lib/libc_so.a $(1)/lib/libc_pic.a)
 	$(CP) $(TOOLCHAIN_DIR)/usr/lib/gcc/*/*/libgcc.a $(1)/lib/libgcc_s_pic.a
-endef
+  endef
 
-define Package/libpthread/install
+  define Package/libpthread/install
 	$(INSTALL_DIR) $(1)/lib
 	$(CP) $(TOOLCHAIN_DIR)/lib/libpthread.so.* $(1)/lib/
 	$(CP) $(TOOLCHAIN_DIR)/lib/libpthread-$(LIBC_SO_VERSION).so $(1)/lib/
-endef
+  endef
 
-define Package/librt/install
+  define Package/librt/install
 	$(INSTALL_DIR) $(1)/lib
 	$(CP) $(TOOLCHAIN_DIR)/lib/librt.so.* $(1)/lib/
 	$(CP) $(TOOLCHAIN_DIR)/lib/librt-$(LIBC_SO_VERSION).so $(1)/lib/
-endef
+  endef
 
-define Package/ldd/install
+  define Package/ldd/install
 	$(INSTALL_DIR) $(1)/usr/bin/
 	$(CP) $(TOOLCHAIN_DIR)/usr/bin/ldd $(1)/usr/bin/
-endef
+  endef
 
-define Package/ldconfig/install
+  define Package/ldconfig/install
 	$(INSTALL_DIR) $(1)/sbin/
 	$(CP) $(TOOLCHAIN_DIR)/sbin/ldconfig $(1)/sbin/
-endef
+  endef
+
+else
+
+  define Package/libgcc/install
+	for file in $(call qstrip,$(CONFIG_LIBGCC_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LIBGCC_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/libssp/install
+	for file in $(call qstrip,$(CONFIG_LIBSSP_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LIBSSP_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/libstdcpp/install
+	for file in $(call qstrip,$(CONFIG_LIBSTDCPP_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LIBSTDCPP_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/libc/install
+	for file in $(call qstrip,$(CONFIG_LIBC_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LIBC_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/libpthread/install
+	for file in $(call qstrip,$(CONFIG_LIBPTHREAD_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LIBPTHREAD_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/librt/install
+	for file in $(call qstrip,$(CONFIG_LIBRT_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LIBRT_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/ldd/install
+	for file in $(call qstrip,$(CONFIG_LDD_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LDD_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+  define Package/ldconfig/install
+	for file in $(call qstrip,$(CONFIG_LDCONFIG_FILE_SPEC)); do \
+		dir=`dirname $$$$file` ; \
+		$(INSTALL_DIR) $(1)/$$$$dir ; \
+		$(CP) $(call qstrip,$(CONFIG_LDCONFIG_ROOT_DIR))/$$$$file $(1)/$$$$dir/ ; \
+	done
+  endef
+
+endif
 
 ifneq ($(DUMP),1)
   -include $(PLATFORM_DIR)/base-files.mk
diff --git a/rules.mk b/rules.mk
index f4b85f864d3abe34ca5bc7682d659e64135be342..20cb85e3047f269482cb7d6e07139666c5c7403a 100644
--- a/rules.mk
+++ b/rules.mk
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2008 OpenWrt.org
+# Copyright (C) 2006-2009 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -34,9 +34,6 @@ BOARD:=$(call qstrip,$(CONFIG_TARGET_BOARD))
 TARGET_OPTIMIZATION:=$(call qstrip,$(CONFIG_TARGET_OPTIMIZATION))
 TARGET_SUFFIX=$(call qstrip,$(CONFIG_TARGET_SUFFIX))
 BUILD_SUFFIX:=$(call qstrip,$(CONFIG_BUILD_SUFFIX))
-GCCV:=$(call qstrip,$(CONFIG_GCC_VERSION))
-LIBC:=$(call qstrip,$(CONFIG_LIBC))
-LIBCV:=$(call qstrip,$(CONFIG_LIBC_VERSION))
 SUBDIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR})
 
 OPTIMIZE_FOR_CPU=$(subst i386,i486,$(ARCH))
@@ -52,13 +49,32 @@ BIN_DIR:=$(TOPDIR)/bin
 INCLUDE_DIR:=$(TOPDIR)/include
 SCRIPT_DIR:=$(TOPDIR)/scripts
 BUILD_DIR_BASE:=$(TOPDIR)/build_dir
-BUILD_DIR:=$(BUILD_DIR_BASE)/target-$(ARCH)_$(LIBC)-$(LIBCV)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX))
 BUILD_DIR_HOST:=$(BUILD_DIR_BASE)/host
-BUILD_DIR_TOOLCHAIN:=$(BUILD_DIR_BASE)/toolchain-$(ARCH)_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
-STAGING_DIR:=$(TOPDIR)/staging_dir/target-$(ARCH)_$(LIBC)-$(LIBCV)
 STAGING_DIR_HOST:=$(TOPDIR)/staging_dir/host
-TOOLCHAIN_DIR:=$(TOPDIR)/staging_dir/toolchain-$(ARCH)_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
-PACKAGE_DIR:=$(BIN_DIR)/packages/$(BOARD)_$(LIBC)-$(LIBCV)
+ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
+  GCCV:=$(call qstrip,$(CONFIG_GCC_VERSION))
+  LIBC:=$(call qstrip,$(CONFIG_LIBC))
+  LIBCV:=$(call qstrip,$(CONFIG_LIBC_VERSION))
+  REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))
+  GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux
+  BUILD_DIR:=$(BUILD_DIR_BASE)/target-$(ARCH)_$(LIBC)-$(LIBCV)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX))
+  STAGING_DIR:=$(TOPDIR)/staging_dir/target-$(ARCH)_$(LIBC)-$(LIBCV)
+  BUILD_DIR_TOOLCHAIN:=$(BUILD_DIR_BASE)/toolchain-$(ARCH)_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
+  TOOLCHAIN_DIR:=$(TOPDIR)/staging_dir/toolchain-$(ARCH)_gcc-$(GCCV)_$(LIBC)-$(LIBCV)
+  PACKAGE_DIR:=$(BIN_DIR)/packages/$(BOARD)_$(LIBC)-$(LIBCV)
+else
+  ifeq ($(CONFIG_NATIVE_TOOLCHAIN),)
+    GNU_TARGET_NAME=$(call qstrip,$(CONFIG_TARGET_NAME))
+  else
+    GNU_TARGET_NAME=$(shell gcc -dumpmachine)
+  endif
+  REAL_GNU_TARGET_NAME=$(GNU_TARGET_NAME)
+  BUILD_DIR:=$(BUILD_DIR_BASE)/target-$(GNU_TARGET_NAME)$(if $(BUILD_SUFFIX),_$(BUILD_SUFFIX))
+  STAGING_DIR:=$(TOPDIR)/staging_dir/target-$(GNU_TARGET_NAME)
+  BUILD_DIR_TOOLCHAIN:=$(BUILD_DIR_BASE)/toolchain-$(GNU_TARGET_NAME)
+  TOOLCHAIN_DIR:=$(TOPDIR)/staging_dir/toolchain-$(GNU_TARGET_NAME)
+  PACKAGE_DIR:=$(BIN_DIR)/packages/$(BOARD)_$(GNU_TARGET_NAME)
+endif
 STAMP_DIR:=$(BUILD_DIR)/stamp
 STAMP_DIR_HOST=$(BUILD_DIR_HOST)/stamp
 TARGET_ROOTFS_DIR?=$(if $(call qstrip,$(CONFIG_TARGET_ROOTFS_DIR)),$(call qstrip,$(CONFIG_TARGET_ROOTFS_DIR)),$(BUILD_DIR))
@@ -67,22 +83,40 @@ STAGING_DIR_ROOT:=$(STAGING_DIR)/root-$(BOARD)
 DEBUG_DIR:=$(BUILD_DIR)/debug-$(BOARD)
 BUILD_LOG_DIR:=$(TOPDIR)/logs
 
-TARGET_PATH:=$(TOOLCHAIN_DIR)/usr/bin:$(STAGING_DIR_HOST)/bin:$(PATH)
-TARGET_PATH_PKG:=$(STAGING_DIR)/host/bin:$(TARGET_PATH)
+TARGET_PATH:=$(STAGING_DIR_HOST)/bin:$(PATH)
 TARGET_CFLAGS:=$(TARGET_OPTIMIZATION)$(if $(CONFIG_DEBUG), -g3)
 TARGET_CPPFLAGS:=-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include
-TARGET_LDFLAGS:=-L$(TOOLCHAIN_DIR)/usr/lib -L$(TOOLCHAIN_DIR)/lib -L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib
+TARGET_LDFLAGS:=-L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib
 LIBGCC_S=$(if $(wildcard $(TOOLCHAIN_DIR)/lib/libgcc_s.so),-L$(TOOLCHAIN_DIR)/lib -lgcc_s,$(wildcard $(TOOLCHAIN_DIR)/lib/gcc/*/*/libgcc.a))
 
 ifndef DUMP
-ifeq ($(CONFIG_NATIVE_TOOLCHAIN),)
-  -include $(TOOLCHAIN_DIR)/info.mk
-  REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))
-  GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-openwrt-linux
-  TARGET_CROSS:=$(if $(TARGET_CROSS),$(TARGET_CROSS),$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))-)
-  TARGET_CFLAGS+= -fhonour-copts
-endif
+  ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
+    -include $(TOOLCHAIN_DIR)/info.mk
+    TARGET_CROSS:=$(if $(TARGET_CROSS),$(TARGET_CROSS),$(OPTIMIZE_FOR_CPU)-openwrt-linux$(if $(TARGET_SUFFIX),-$(TARGET_SUFFIX))-)
+    TARGET_CFLAGS+= -fhonour-copts
+    TARGET_CPPFLAGS+= -I$(TOOLCHAIN_DIR)/usr/include -I$(TOOLCHAIN_DIR)/include
+    TARGET_LDFLAGS+= -L$(TOOLCHAIN_DIR)/usr/lib -L$(TOOLCHAIN_DIR)/lib
+    TARGET_PATH:=$(TOOLCHAIN_DIR)/usr/bin:$(TARGET_PATH)
+  else
+    ifeq ($(CONFIG_NATIVE_TOOLCHAIN),)
+      TARGET_CROSS:=$(call qstrip,$(CONFIG_TOOLCHAIN_PREFIX))
+      TOOLCHAIN_ROOT_DIR:=$(call qstrip,$(CONFIG_TOOLCHAIN_ROOT))
+      TOOLCHAIN_BIN_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_BIN_PATH)))
+      TOOLCHAIN_INC_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_INC_PATH)))
+      TOOLCHAIN_LIB_DIRS:=$(patsubst ./%,$(TOOLCHAIN_ROOT_DIR)/%,$(call qstrip,$(CONFIG_TOOLCHAIN_LIB_PATH)))
+      ifneq ($(TOOLCHAIN_BIN_DIRS),)
+        TARGET_PATH:=$(subst $(space),:,$(TOOLCHAIN_BIN_DIRS)):$(TARGET_PATH)
+      endif
+      ifneq ($(TOOLCHAIN_INC_DIRS),)
+        TARGET_CPPFLAGS+= $(patsubst %,-I%,$(TOOLCHAIN_INC_DIRS))
+      endif
+      ifneq ($(TOOLCHAIN_LIB_DIRS),)
+        TARGET_LDFLAGS+= $(patsubst %,-L%,$(TOOLCHAIN_LIB_DIRS))
+      endif
+    endif
+  endif
 endif
+TARGET_PATH_PKG:=$(STAGING_DIR)/host/bin:$(TARGET_PATH)
 
 ifeq ($(CONFIG_SOFT_FLOAT),y)
   SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft
diff --git a/toolchain/Config.in b/toolchain/Config.in
index cf08ae9caad33e6f76c5ff3d52feb180558204dd..84b50bbd0a4bb3d575baee0265ad666f0ac4341d 100644
--- a/toolchain/Config.in
+++ b/toolchain/Config.in
@@ -1,14 +1,90 @@
 #
-config NATIVE_TOOLCHAIN
+
+menuconfig EXTERNAL_TOOLCHAIN
 	bool
-	prompt "Use host's toolchain" if DEVEL && BROKEN
-	default n
+	prompt "Use external toolchain"  if DEVEL
 	help
-		If enabled, OpenWrt will compile using your existing toolchain instead of compiling one
+	  If enabled, OpenWrt will compile using an existing toolchain instead of compiling one
+
+	config NATIVE_TOOLCHAIN
+		bool
+		prompt "Use host's toolchain"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN
+		select NO_STRIP
+		help
+		  If enabled, OpenWrt will compile using the native toolchain for your host instead of compiling one
+
+	config TARGET_NAME
+		string
+		prompt "Target name"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN
+		default "arm-unknown-linux-gnu"      if arm
+		default "armeb-unknown-linux-gnu"    if armeb
+		default "i486-unknown-linux-gnu"     if i386
+		default "mips-unknown-linux-gnu"     if mips
+		default "mipsel-unknown-linux-gnu"   if mipsel
+		default "powerpc-unknown-linux-gnu"  if powerpc
+		default "x86_64-unknown-linux-gnu"   if x86_64
+
+	config TOOLCHAIN_PREFIX
+		string
+		prompt "Toolchain prefix"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN
+		default "arm-unknown-linux-gnu-"      if arm
+		default "armeb-unknown-linux-gnu-"    if armeb
+		default "i486-unknown-linux-gnu-"     if i386
+		default "mips-unknown-linux-gnu-"     if mips
+		default "mipsel-unknown-linux-gnu-"   if mipsel
+		default "powerpc-unknown-linux-gnu-"  if powerpc
+		default "x86_64-unknown-linux-gnu-"   if x86_64
+
+	config TOOLCHAIN_ROOT
+		string
+		prompt "Toolchain root"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN
+		default "/opt/cross/arm-unknown-linux-gnu"      if arm
+		default "/opt/cross/armeb-unknown-linux-gnu"    if armeb
+		default "/opt/cross/i486-unknown-linux-gnu"     if i386
+		default "/opt/cross/mips-unknown-linux-gnu"     if mips
+		default "/opt/cross/mipsel-unknown-linux-gnu"   if mipsel
+		default "/opt/cross/powerpc-unknown-linux-gnu"  if powerpc
+		default "/opt/cross/x86_64-unknown-linux-gnu"   if x86_64
+
+	config TOOLCHAIN_BIN_PATH
+		string
+		prompt "Toolchain program path"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN
+		default "./usr/bin ./bin"
+		help
+		  Specify additional directories searched for toolchain binaries (override PATH)
+		  Use ./DIR for directories relative to the root above
+
+	config TOOLCHAIN_INC_PATH
+		string
+		prompt "Toolchain include path"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN
+		default "./usr/include ./include"
+		help
+		  Specify additional directories searched for header files (override CPPFLAGS)
+		  Use ./DIR for directories relative to the root above
+
+	config TOOLCHAIN_LIB_PATH
+		string
+		prompt "Toolchain library path"  if DEVEL
+		depends EXTERNAL_TOOLCHAIN && !NATIVE_TOOLCHAIN
+		default "./usr/lib ./lib"
+		help
+		  Specify additional directories searched for libraries (override LDFLAGS)
+		  Use ./DIR for directories relative to the root above
+
+config NEED_TOOLCHAIN
+	bool
+	depends DEVEL
+	default y if !EXTERNAL_TOOLCHAIN
 
 menuconfig TOOLCHAINOPTS
-	bool "Toolchain Options" if DEVEL
-	depends !NATIVE_TOOLCHAIN
+	bool "Toolchain Options"  if DEVEL
+	depends NEED_TOOLCHAIN
 
 menuconfig EXTRA_TARGET_ARCH
 	bool
diff --git a/toolchain/Makefile b/toolchain/Makefile
index 456b731fb88d540d2ec57287b180394deb449f26..161b139d74a399dccee22db6ef85b18869742fe9 100644
--- a/toolchain/Makefile
+++ b/toolchain/Makefile
@@ -1,5 +1,5 @@
 # 
-# Copyright (C) 2007-2008 OpenWrt.org
+# Copyright (C) 2007-2009 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -28,13 +28,13 @@
 curdir:=toolchain
 
 # subdirectories to descend into
-$(curdir)/builddirs := kernel-headers $(if $(CONFIG_GDB),gdb) $(if $(CONFIG_INSIGHT),insight) $(if $(CONFIG_NATIVE_TOOLCHAIN),,binutils gcc $(LIBC) $(if $(CONFIG_GLIBC_PORTS),glibc-ports))
+$(curdir)/builddirs := $(if $(CONFIG_GDB),gdb) $(if $(CONFIG_INSIGHT),insight) $(if $(CONFIG_EXTERNAL_TOOLCHAIN),,kernel-headers binutils gcc $(LIBC) $(if $(CONFIG_GLIBC_PORTS),glibc-ports))
 $(curdir)/builddirs-compile:=$($(curdir)/builddirs-prepare)
 $(curdir)/builddirs-install:=$($(curdir)/builddirs-compile)
 
 # builddir dependencies
-$(curdir)/$(LIBC)/prepare:=$(curdir)/kernel-headers/install
-ifeq ($(CONFIG_NATIVE_TOOLCHAIN),)
+ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),)
+  $(curdir)/$(LIBC)/prepare:=$(curdir)/kernel-headers/install
   $(curdir)/gcc/prepare:=$(curdir)/binutils/install
   $(curdir)/kernel-headers/install:=$(curdir)/gcc/prepare
   $(curdir)/gcc/compile:=$(curdir)/$(LIBC)/prepare