diff --git a/package/busybox/Makefile b/package/busybox/Makefile
index 25828da972e62d8529385f1b87617420f5c62d4f..9abbe348a976f38180c37d97e1fa339573a55c56 100644
--- a/package/busybox/Makefile
+++ b/package/busybox/Makefile
@@ -1,4 +1,4 @@
-#
+# 
 # Copyright (C) 2006-2009 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
@@ -8,13 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=busybox
-PKG_VERSION:=1.12.4
+PKG_VERSION:=1.13.4
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://www.busybox.net/downloads \
 		http://distfiles.gentoo.org/distfiles/
-PKG_MD5SUM:=5b8c427bf596732d6b6156672e6e093f
+PKG_MD5SUM:=8a5eb7f15d4077d18fa97bda7a4e5412
 
 include $(INCLUDE_DIR)/package.mk
 
diff --git a/package/busybox/config/Config.in b/package/busybox/config/Config.in
index 73e879255091dd948819c1e998453110fbb185ad..e8c77bfa691785e033e1e22715e1d21737352682 100644
--- a/package/busybox/config/Config.in
+++ b/package/busybox/config/Config.in
@@ -154,15 +154,17 @@ config BUSYBOX_CONFIG_FEATURE_SUID
 	default y
 	help
 	  With this option you can install the busybox binary belonging
-	  to root with the suid bit set, and it'll and it'll automatically drop
+	  to root with the suid bit set, and it will automatically drop
 	  priviledges for applets that don't need root access.
 
-	  If you're really paranoid and don't want to do this, build two
+	  If you are really paranoid and don't want to do this, build two
 	  busybox binaries with different applets in them (and the appropriate
 	  symlinks pointing to each binary), and only set the suid bit on the
 	  one that needs it. The applets currently marked to need the suid bit
-	  are login, passwd, su, ping, traceroute, crontab, dnsd, ipcrm, ipcs,
-	  and vlock.
+	  are:
+
+	  crontab, dnsd, findfs, ipcrm, ipcs, login, passwd, ping, su,
+	  traceroute, vlock.
 
 config BUSYBOX_CONFIG_FEATURE_SUID_CONFIG
 	bool "Runtime SUID/SGID configuration via /etc/busybox.conf"
@@ -253,18 +255,18 @@ config BUSYBOX_CONFIG_BUSYBOX_EXEC_PATH
 # These are auto-selected by other options
 
 config BUSYBOX_CONFIG_FEATURE_SYSLOG
-	bool "Support for logging to syslog"
+	bool #No description makes it a hidden option
 	default y
-	help
-	  This option is auto-selected when you select any applet which may
-	  send its output to syslog. You do not need to select it manually.
+	#help
+	#  This option is auto-selected when you select any applet which may
+	#  send its output to syslog. You do not need to select it manually.
 
 config BUSYBOX_CONFIG_FEATURE_HAVE_RPC
-	bool "RPC support"
+	bool #No description makes it a hidden option
 	default y
-	help
-	  This is automatically selected if any of enabled applets need it.
-	  You do not need to select it manually.
+	#help
+	#  This is automatically selected if any of enabled applets need it.
+	#  You do not need to select it manually.
 
 endmenu
 
@@ -401,9 +403,12 @@ config BUSYBOX_CONFIG_CROSS_COMPILER_PREFIX
 	help
 	  If you want to build BusyBox with a cross compiler, then you
 	  will need to set this to the cross-compiler prefix, for example,
-	  "i386-uclibc-". Note that CROSS_COMPILE environment variable
-	  or "make CROSS_COMPILE=xxx ..." will override this selection.
-	  For native build leave it empty.
+	  "i386-uclibc-".
+
+	  Note that CROSS_COMPILE environment variable or
+	  "make CROSS_COMPILE=xxx ..." will override this selection.
+
+	  Native builds leave this empty.
 
 endmenu
 
@@ -490,8 +495,8 @@ config BUSYBOX_CONFIG_INCLUDE_SUSv2
 	  will be supported in head, tail, and fold. (Note: should
 	  affect renice too.)
 
-config BUSYBOX_CONFIG_PARSE
-	bool "Uniform config file parser debugging applet: parse"
+### config PARSE
+### 	bool "Uniform config file parser debugging applet: parse"
 
 endmenu
 
@@ -589,9 +594,10 @@ source package/busybox/config/modutils/Config.in
 source package/busybox/config/util-linux/Config.in
 source package/busybox/config/miscutils/Config.in
 source package/busybox/config/networking/Config.in
+source package/busybox/config/printutils/Config.in
+source package/busybox/config/mailutils/Config.in
 source package/busybox/config/procps/Config.in
-source package/busybox/config/shell/Config.in
-source package/busybox/config/sysklogd/Config.in
 source package/busybox/config/runit/Config.in
 source package/busybox/config/selinux/Config.in
-source package/busybox/config/printutils/Config.in
+source package/busybox/config/shell/Config.in
+source package/busybox/config/sysklogd/Config.in
diff --git a/package/busybox/config/archival/Config.in b/package/busybox/config/archival/Config.in
index 3fd0fb96b864d33789c7fc56a9c16ea00b0aa4f1..f1e4d77018dd4a879ff03da041c2060553060540 100644
--- a/package/busybox/config/archival/Config.in
+++ b/package/busybox/config/archival/Config.in
@@ -13,7 +13,7 @@ config BUSYBOX_CONFIG_FEATURE_SEAMLESS_LZMA
 
 config BUSYBOX_CONFIG_FEATURE_SEAMLESS_BZ2
 	bool "Make tar, rpm, modprobe etc understand .bz2 data"
-	default y
+	default n
 	help
 	  Make tar, rpm, modprobe etc understand .bz2 data.
 
@@ -77,7 +77,7 @@ config BUSYBOX_CONFIG_BUNZIP2
 
 config BUSYBOX_CONFIG_BZIP2
 	bool "bzip2"
-	default y
+	default n
 	help
 	  bzip2 is a compression utility using the Burrows-Wheeler block
 	  sorting text compression algorithm, and Huffman coding. Compression
@@ -113,6 +113,7 @@ config BUSYBOX_CONFIG_FEATURE_CPIO_O
 config BUSYBOX_CONFIG_DPKG
 	bool "dpkg"
 	default n
+	select BUSYBOX_CONFIG_FEATURE_SEAMLESS_GZ
 	help
 	  dpkg is a medium-level tool to install, build, remove and manage
 	  Debian packages.
@@ -123,9 +124,9 @@ config BUSYBOX_CONFIG_DPKG
 config BUSYBOX_CONFIG_DPKG_DEB
 	bool "dpkg_deb"
 	default n
+	select BUSYBOX_CONFIG_FEATURE_SEAMLESS_GZ
 	help
-	  dpkg-deb packs, unpacks and provides information about Debian
-	  archives.
+	  dpkg-deb unpacks and provides information about Debian archives.
 
 	  This implementation of dpkg-deb cannot pack archives.
 
@@ -177,7 +178,7 @@ config BUSYBOX_CONFIG_TAR
 	  create compressed archives. It's probably the most widely used
 	  UNIX archive program.
 
-if TAR
+if BUSYBOX_CONFIG_TAR
 
 config BUSYBOX_CONFIG_FEATURE_TAR_CREATE
 	bool "Enable archive creation"
diff --git a/package/busybox/config/console-tools/Config.in b/package/busybox/config/console-tools/Config.in
index 02fcef49fcae5e6c2f51dc333825282241789067..ffc96d1b6c1839bec82c26a9cce9e9b91b837a26 100644
--- a/package/busybox/config/console-tools/Config.in
+++ b/package/busybox/config/console-tools/Config.in
@@ -101,6 +101,21 @@ config BUSYBOX_CONFIG_SETFONT
 	help
 	  Allows to load console screen map. Useful for i18n.
 
+config BUSYBOX_CONFIG_FEATURE_SETFONT_TEXTUAL_MAP
+	bool "Support reading textual screen maps"
+	default n
+	depends on BUSYBOX_CONFIG_SETFONT
+	help
+	  Support reading textual screen maps.
+
+config BUSYBOX_CONFIG_DEFAULT_SETFONT_DIR
+	string "Default directory for console-tools files"
+	default n
+	depends on BUSYBOX_CONFIG_SETFONT
+	help
+	  Directory to use if setfont's params are simple filenames
+	  (not /path/to/file or ./file). Default is "" (no default directory).
+
 config BUSYBOX_CONFIG_SETKEYCODES
 	bool "setkeycodes"
 	default n
diff --git a/package/busybox/config/coreutils/Config.in b/package/busybox/config/coreutils/Config.in
index 93f10e38b1749ec969b433cc1737718a89ee9d2e..0775b4cbc78c187ef24dbc59eb7ac52d11f2ab3a 100644
--- a/package/busybox/config/coreutils/Config.in
+++ b/package/busybox/config/coreutils/Config.in
@@ -136,12 +136,12 @@ config BUSYBOX_CONFIG_DF
 	  df reports the amount of disk space used and available
 	  on filesystems.
 
-config BUSYBOX_CONFIG_FEATURE_DF_INODE
-	bool "Enable -i (inode information)"
+config BUSYBOX_CONFIG_FEATURE_DF_FANCY
+	bool "Enable -a, -i, -B"
 	default n
 	depends on BUSYBOX_CONFIG_DF
 	help
-	  This option enables support for df -i.
+	  This option enables -a, -i and -B.
 
 config BUSYBOX_CONFIG_DIRNAME
 	bool "dirname"
@@ -189,7 +189,7 @@ config BUSYBOX_CONFIG_ECHO
 config BUSYBOX_CONFIG_FEATURE_FANCY_ECHO
 	bool "Enable echo options (-n and -e)"
 	default y
-	depends on BUSYBOX_CONFIG_ECHO
+	depends on BUSYBOX_CONFIG_ECHO || BUSYBOX_CONFIG_ASH_BUILTIN_ECHO
 	help
 	  This adds options (-n and -e) to echo.
 
@@ -649,7 +649,7 @@ config BUSYBOX_CONFIG_TEST
 config BUSYBOX_CONFIG_FEATURE_TEST_64
 	bool "Extend test to 64 bit"
 	default n
-	depends on BUSYBOX_CONFIG_TEST
+	depends on BUSYBOX_CONFIG_TEST || BUSYBOX_CONFIG_ASH_BUILTIN_TEST
 	help
 	  Enable 64-bit support in test.
 
diff --git a/package/busybox/config/debianutils/Config.in b/package/busybox/config/debianutils/Config.in
index b2118c8630c78dca97d5366998efea611004363a..e5f0c26161a3f9884328125181883ff1074c0483 100644
--- a/package/busybox/config/debianutils/Config.in
+++ b/package/busybox/config/debianutils/Config.in
@@ -64,6 +64,7 @@ config BUSYBOX_CONFIG_FEATURE_START_STOP_DAEMON_FANCY
 	  Support additional arguments.
 	  -o|--oknodo ignored since we exit with 0 anyway
 	  -v|--verbose
+	  -N|--nicelevel N
 
 config BUSYBOX_CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS
 	bool "Enable long options"
diff --git a/package/busybox/config/editors/Config.in b/package/busybox/config/editors/Config.in
index fd1da4b37ee491df7aa7b14548d67bddea235727..9eb85bbb874aac27ac61da6cddb9d86a3e036db0 100644
--- a/package/busybox/config/editors/Config.in
+++ b/package/busybox/config/editors/Config.in
@@ -12,7 +12,7 @@ config BUSYBOX_CONFIG_AWK
 	  Awk is used as a pattern scanning and processing language. This is
 	  the BusyBox implementation of that programming language.
 
-config BUSYBOX_CONFIG_FEATURE_AWK_MATH
+config BUSYBOX_CONFIG_FEATURE_AWK_LIBM
 	bool "Enable math functions (requires libm)"
 	default y
 	depends on BUSYBOX_CONFIG_AWK
diff --git a/package/busybox/config/findutils/Config.in b/package/busybox/config/findutils/Config.in
index 54ef44e1786db6f87b2bf6c6c7b9ab7204921d65..991b97fac5ef11e9d7dafaf38f847183082597ca 100644
--- a/package/busybox/config/findutils/Config.in
+++ b/package/busybox/config/findutils/Config.in
@@ -146,7 +146,7 @@ config BUSYBOX_CONFIG_FEATURE_FIND_DELETE
 	default n
 	depends on BUSYBOX_CONFIG_FIND && BUSYBOX_CONFIG_FEATURE_FIND_DEPTH
 	help
-	  Support the 'find -delete' option for deleting files and direcotries.
+	  Support the 'find -delete' option for deleting files and directories.
 	  WARNING: This option can do much harm if used wrong. Busybox will not
 	  try to protect the user from doing stupid things. Use with care.
 
diff --git a/package/busybox/config/init/Config.in b/package/busybox/config/init/Config.in
index 07f6fae780686d246962ad31a868ba392d7a2d8d..a84169d46ede5e86fc82f9e71775aca39b85f23d 100644
--- a/package/busybox/config/init/Config.in
+++ b/package/busybox/config/init/Config.in
@@ -12,14 +12,6 @@ config BUSYBOX_CONFIG_INIT
 	help
 	  init is the first program run when the system boots.
 
-config BUSYBOX_CONFIG_DEBUG_INIT
-	bool "Debugging aid"
-	default n
-	depends on BUSYBOX_CONFIG_INIT
-	help
-	  Turn this on to disable all the dangerous
-	  rebooting stuff when debugging.
-
 config BUSYBOX_CONFIG_FEATURE_USE_INITTAB
 	bool "Support reading an inittab file"
 	default y
@@ -83,8 +75,6 @@ config BUSYBOX_CONFIG_FEATURE_INIT_COREDUMPS
 	  core file sizes. If this option is disabled, processes
 	  will not generate any core files.
 
-
-
 config BUSYBOX_CONFIG_FEATURE_INITRD
 	bool "Support running init from within an initrd (not initramfs)"
 	default n
diff --git a/package/busybox/config/ipsvd/Config.in b/package/busybox/config/ipsvd/Config.in
deleted file mode 100644
index d163ade4927de14e87f8f89b2a60eafdd0382f8c..0000000000000000000000000000000000000000
--- a/package/busybox/config/ipsvd/Config.in
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see scripts/kbuild/config-language.txt.
-#
-
-menu "ipsvd utilities"
-
-config BUSYBOX_CONFIG_TCPSVD
-	bool "tcpsvd"
-	default n
-	help
-	  tcpsvd listens on a tcp port and runs a program for each new connection
-
-config BUSYBOX_CONFIG_UDPSVD
-	bool "udpsvd"
-	default n
-	help
-	  udpsvd listens on a udp port and runs a program for each new connection
-
-endmenu
diff --git a/package/busybox/config/loginutils/Config.in b/package/busybox/config/loginutils/Config.in
index fa9f65e1cd40575a864ec5913a76622892bdfefd..d100b3bb2ec68ac1efcc16b3b30433b57dc5d53d 100644
--- a/package/busybox/config/loginutils/Config.in
+++ b/package/busybox/config/loginutils/Config.in
@@ -233,12 +233,12 @@ config BUSYBOX_CONFIG_CRYPTPW
 	  Applet for crypting a string.
 
 config BUSYBOX_CONFIG_CHPASSWD
-       bool "chpasswd"
-       default n
-       help
-         chpasswd  reads  a  file  of user name and password pairs from
-         standard input and uses this information to update a group of
-         existing users.
+	bool "chpasswd"
+	default n
+	help
+	  chpasswd reads a file of user name and password pairs from
+	  standard input and uses this information to update a group of
+	  existing users.
 
 config BUSYBOX_CONFIG_SU
 	bool "su"
diff --git a/package/busybox/config/mailutils/Config.in b/package/busybox/config/mailutils/Config.in
new file mode 100644
index 0000000000000000000000000000000000000000..9fb5a13ec7e5ce3584bcc57de59da2f9b4c17a0d
--- /dev/null
+++ b/package/busybox/config/mailutils/Config.in
@@ -0,0 +1,69 @@
+menu "Mail Utilities"
+
+config BUSYBOX_CONFIG_MAKEMIME
+	bool "makemime"
+	default n
+	help
+	  Create MIME-formatted messages.
+
+config BUSYBOX_CONFIG_FEATURE_MIME_CHARSET
+	string "Default charset"
+	default n
+	depends on BUSYBOX_CONFIG_MAKEMIME || BUSYBOX_CONFIG_REFORMIME || BUSYBOX_CONFIG_SENDMAIL
+	help
+	  Default charset of the message.
+
+config BUSYBOX_CONFIG_POPMAILDIR
+	bool "popmaildir"
+	default n
+	help
+	  Simple yet powerful POP3 mail popper. Delivers content
+	  of remote mailboxes to local Maildir.
+
+config BUSYBOX_CONFIG_FEATURE_POPMAILDIR_DELIVERY
+	bool "Allow message filters and custom delivery program"
+	default n
+	depends on BUSYBOX_CONFIG_POPMAILDIR
+	help
+	  Allow to use a custom program to filter the content
+	  of the message before actual delivery (-F "prog [args...]").
+	  Allow to use a custom program for message actual delivery
+	  (-M "prog [args...]").
+
+config BUSYBOX_CONFIG_REFORMIME
+	bool "reformime"
+	default n
+	help
+	  Parse MIME-formatted messages.
+
+config BUSYBOX_CONFIG_FEATURE_REFORMIME_COMPAT
+	bool "Accept and ignore options other than -x and -X"
+	default n
+	depends on BUSYBOX_CONFIG_REFORMIME
+	help
+	  Accept (for compatibility only) and ignore options
+	  other than -x and -X.
+
+config BUSYBOX_CONFIG_SENDMAIL
+	bool "sendmail"
+	default n
+	help
+	  Barebones sendmail.
+
+config BUSYBOX_CONFIG_FEATURE_SENDMAIL_MAILX
+	bool "Allow to specify subject, attachments, their charset etc"
+	default n
+	depends on BUSYBOX_CONFIG_SENDMAIL
+	help
+	  Allow to specify subject, attachments and their charset.
+	  Allow to use custom connection helper.
+
+config BUSYBOX_CONFIG_FEATURE_SENDMAIL_MAILXX
+	bool "Allow to specify Cc: addresses and some additional headers"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_SENDMAIL_MAILX
+	help
+	  Allow to specify Cc: addresses and some additional headers:
+	  Errors-To:
+
+endmenu
diff --git a/package/busybox/config/miscutils/Config.in b/package/busybox/config/miscutils/Config.in
index df5f28cfd466b042e5b2d306623b872d5915ed80..e1541c97da7e041f054811453ad3af719e699614 100644
--- a/package/busybox/config/miscutils/Config.in
+++ b/package/busybox/config/miscutils/Config.in
@@ -107,7 +107,7 @@ config BUSYBOX_CONFIG_CROND
 	      # Run daily cron jobs at 4:40 every day:
 	      40 4 * * * /etc/cron/daily > /dev/null 2>&1
 
-config BUSYBOX_CONFIG_DEBUG_CROND_OPTION
+config BUSYBOX_CONFIG_FEATURE_CROND_D
 	bool "Support option -d to redirect output to stderr"
 	depends on BUSYBOX_CONFIG_CROND
 	default n
@@ -138,6 +138,14 @@ config BUSYBOX_CONFIG_DC
 	  Dc is a reverse-polish desk calculator which supports unlimited
 	  precision arithmetic.
 
+config BUSYBOX_CONFIG_FEATURE_DC_LIBM
+	bool "Enable power and exp functions (requires libm)"
+	default n
+	depends on BUSYBOX_CONFIG_DC
+	help
+	  Enable power and exp functions.
+	  NOTE: This will require libm to be present for linking.
+
 config BUSYBOX_CONFIG_DEVFSD
 	bool "devfsd (obsolete)"
 	default n
@@ -188,6 +196,13 @@ config BUSYBOX_CONFIG_FEATURE_DEVFS
 	  /dev/loop0. If your /dev directory has normal names instead of
 	  devfs names, you don't want this.
 
+config BUSYBOX_CONFIG_DEVMEM
+	bool "devmem"
+	default n
+	help
+	  devmem is a small program that reads and writes from physical
+	  memory using /dev/mem.
+
 config BUSYBOX_CONFIG_EJECT
 	bool "eject"
 	default n
@@ -285,13 +300,13 @@ config BUSYBOX_CONFIG_FEATURE_LESS_FLAGS
 	  The -M flag enables a more sophisticated status line.
 	  The -m flag enables a simpler status line with a percentage.
 
-config BUSYBOX_CONFIG_FEATURE_LESS_FLAGCS
-	bool "Enable flag changes"
+config BUSYBOX_CONFIG_FEATURE_LESS_DASHCMD
+	bool "Enable flag changes ('-' command)"
 	default n
 	depends on BUSYBOX_CONFIG_LESS
 	help
 	  This enables the ability to change command-line flags within
-	  less itself.
+	  less itself ('-' keyboard command).
 
 config BUSYBOX_CONFIG_FEATURE_LESS_MARKS
 	bool "Enable marks"
@@ -307,6 +322,20 @@ config BUSYBOX_CONFIG_FEATURE_LESS_REGEXP
 	help
 	  Enable regular expressions, allowing complex file searches.
 
+config BUSYBOX_CONFIG_FEATURE_LESS_LINENUMS
+	bool "Enable dynamic switching of line numbers"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_LESS_DASHCMD
+	help
+	  Enable "-N" command.
+
+config BUSYBOX_CONFIG_FEATURE_LESS_WINCH
+	bool "Enable automatic resizing on window size changes"
+	default n
+	depends on BUSYBOX_CONFIG_LESS
+	help
+	  Makes less track window size changes.
+
 config BUSYBOX_CONFIG_HDPARM
 	bool "hdparm"
 	default n
diff --git a/package/busybox/config/modutils/Config.in b/package/busybox/config/modutils/Config.in
index be141d91c7d6672b28d297bffda931125bdee45d..f02f03178e06bf66b62455bca9d40ce8f0e5eb2c 100644
--- a/package/busybox/config/modutils/Config.in
+++ b/package/busybox/config/modutils/Config.in
@@ -5,6 +5,20 @@
 
 menu "Linux Module Utilities"
 
+config BUSYBOX_CONFIG_DEFAULT_MODULES_DIR
+	string "Default directory containing modules"
+	default "/lib/modules"
+	help
+	  Directory that contains kernel modules.
+	  Defaults to "/lib/modules"
+
+config BUSYBOX_CONFIG_DEFAULT_DEPMOD_FILE
+	string "Default name of modules.dep"
+	default "modules.dep"
+	help
+	  Filename that contains kernel modules dependencies.
+	  Defaults to "modules.dep"
+
 config BUSYBOX_CONFIG_MODPROBE_SMALL
 	bool "Simplified modutils"
 	default n
@@ -54,48 +68,83 @@ config BUSYBOX_CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED
 	  Check if the module is already loaded.
 	  N.B. It's racy.
 
-config BUSYBOX_CONFIG_DEPMOD
-	bool "depmod"
-	default n
+config BUSYBOX_CONFIG_INSMOD
+	bool "insmod"
+	default y
 	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
 	help
-	  depmod generates modules.dep (FIXME: elaborate)
+	  insmod is used to load specified modules in the running kernel.
 
-config BUSYBOX_CONFIG_FEATURE_DEPMOD_PRUNE_FANCY
-	bool "Fancy dependency pruning"
-	default n
-	depends on BUSYBOX_CONFIG_DEPMOD
+config BUSYBOX_CONFIG_RMMOD
+	bool "rmmod"
+	default y
+	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
 	help
-	  By default modules.dep contains all dependencies as listed by
-	  the modules.
-	  If you enable this option then we remove implied modules from
-	  the dependencies.
-	  This makes depmod somewhat bigger but generates a smaller
-	  modules.dep file.
+	  rmmod is used to unload specified modules from the kernel.
 
-	  If unsure, say N.
+config BUSYBOX_CONFIG_LSMOD
+	bool "lsmod"
+	default y
+	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
+	help
+	  lsmod is used to display a list of loaded modules.
+
+config BUSYBOX_CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT
+	bool "Pretty output"
+	default y
+	depends on BUSYBOX_CONFIG_LSMOD
+	help
+	  This option makes output format of lsmod adjusted to
+	  the format of module-init-tools for Linux kernel 2.6.
+	  Increases size somewhat.
 
-config BUSYBOX_CONFIG_FEATURE_DEPMOD_ALIAS
-	bool "Alias support"
+config BUSYBOX_CONFIG_MODPROBE
+	bool "modprobe"
 	default n
-	depends on BUSYBOX_CONFIG_DEPMOD
+	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
 	help
-	  By default modules.dep does not contain alias information.
-	  Enable this to emit aliases of the form:
+	  Handle the loading of modules, and their dependencies on a high
+	  level.
 
-	    alias pcmcia:m*c*f03fn*pfn*pa*pb*pc*pd* parport_cs
+	  Note that in the state, modprobe does not understand multiple
+	  module options from the configuration file. See option below.
 
-config BUSYBOX_CONFIG_INSMOD
-	bool "insmod"
-	default y
+config BUSYBOX_CONFIG_FEATURE_MODPROBE_BLACKLIST
+	bool
+	prompt "Blacklist support"
+	default n
+	depends on BUSYBOX_CONFIG_MODPROBE
+	help
+	  Say 'y' here to enable support for the 'blacklist' command in
+	  modprobe.conf. This prevents the alias resolver to resolve
+	  blacklisted modules. This is useful if you want to prevent your
+	  hardware autodetection scripts to load modules like evdev, frame
+	  buffer drivers etc.
+
+config BUSYBOX_CONFIG_DEPMOD
+	bool "depmod"
+	default n
 	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
 	help
-	  insmod is used to load specified modules in the running kernel.
+	  depmod generates modules.dep (and potentially modules.alias
+	  and modules.symbols) that contain dependency information
+	  for modprobe.
+
+comment "Options common to multiple modutils"
+
+config BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	bool "Support version 2.2/2.4 Linux kernels"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_RMMOD || BUSYBOX_CONFIG_LSMOD
+	help
+	  Support module loading for 2.2.x and 2.4.x Linux kernels.
+	  This increases size considerably. Say N unless you plan
+	  to run ancient kernels.
 
 config BUSYBOX_CONFIG_FEATURE_INSMOD_VERSION_CHECKING
-	bool "Module version checking"
+	bool "Enable module version checking"
 	default n
-	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && (BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_MODPROBE)
 	help
 	  Support checking of versions for modules. This is used to
 	  ensure that the kernel and module are made for each other.
@@ -103,7 +152,7 @@ config BUSYBOX_CONFIG_FEATURE_INSMOD_VERSION_CHECKING
 config BUSYBOX_CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
 	bool "Add module symbols to kernel symbol table"
 	default n
-	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && (BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_MODPROBE)
 	help
 	  By adding module symbols to the kernel symbol table, Oops messages
 	  occuring within kernel modules can be properly debugged. By enabling
@@ -114,7 +163,7 @@ config BUSYBOX_CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
 config BUSYBOX_CONFIG_FEATURE_INSMOD_LOADINKMEM
 	bool "In kernel memory optimization (uClinux only)"
 	default n
-	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && (BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_MODPROBE)
 	help
 	  This is a special uClinux only memory optimization that lets insmod
 	  load the specified kernel module directly into kernel space, reducing
@@ -122,9 +171,9 @@ config BUSYBOX_CONFIG_FEATURE_INSMOD_LOADINKMEM
 	  being loaded into memory.
 
 config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP
-	bool "Enable load map (-m) option"
+	bool "Enable insmod load map (-m) option"
 	default n
-	depends on BUSYBOX_CONFIG_INSMOD && ( BUSYBOX_CONFIG_FEATURE_2_4_MODULES || BUSYBOX_CONFIG_FEATURE_2_6_MODULES )
+	depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && BUSYBOX_CONFIG_INSMOD
 	help
 	  Enabling this, one would be able to get a load map
 	  output on stdout. This makes kernel module debugging
@@ -135,138 +184,47 @@ config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP
 config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL
 	bool "Symbols in load map"
 	default n
-	depends on BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP
+	depends on BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP && !BUSYBOX_CONFIG_MODPROBE_SMALL
 	help
 	  Without this option, -m will only output section
 	  load map. With this option, -m will also output
 	  symbols load map.
 
-config BUSYBOX_CONFIG_RMMOD
-	bool "rmmod"
-	default y
-	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
-	help
-	  rmmod is used to unload specified modules from the kernel.
-
-config BUSYBOX_CONFIG_LSMOD
-	bool "lsmod"
-	default y
-	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
-	help
-	  lsmod is used to display a list of loaded modules.
-
-config BUSYBOX_CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT
-	bool "Pretty output for 2.6.x Linux kernels"
-	default y
-	depends on BUSYBOX_CONFIG_LSMOD
-	help
-	  This option makes output format of lsmod adjusted to
-	  the format of module-init-tools for Linux kernel 2.6.
-
-config BUSYBOX_CONFIG_MODPROBE
-	bool "modprobe"
-	default n
-	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
-	help
-	  Handle the loading of modules, and their dependencies on a high
-	  level.
-
-	  Note that in the state, modprobe does not understand multiple
-	  module options from the configuration file. See option below.
-
-config BUSYBOX_CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS
-	bool
-	prompt "Multiple options parsing"
-	default n
-	depends on BUSYBOX_CONFIG_MODPROBE
-	help
-	  Allow modprobe to understand more than one option to pass to
-	  modules.
-
-	  This is a WIP, while waiting for a common argument parsing
-	  common amongst all BB applets (shell, modprobe, etc...) and
-	  adds around 600 bytes on x86, 700 bytes on ARM. The code is
-	  biggish and uggly, but just works.
-
-	  Saying Y here is not a bad idea if you're not that short
-	  on storage capacity.
-
-config BUSYBOX_CONFIG_FEATURE_MODPROBE_FANCY_ALIAS
-	bool
-	prompt "Fancy alias parsing"
-	default n
-	depends on BUSYBOX_CONFIG_MODPROBE && BUSYBOX_CONFIG_FEATURE_2_6_MODULES
-	help
-	  Say 'y' here to enable parsing of aliases with underscore/dash
-	  mismatch between module name and file name, along with bus-specific
-	  aliases (such as pci:... or usb:... aliases).
-
-config BUSYBOX_CONFIG_FEATURE_MODPROBE_BLACKLIST
-	bool
-	prompt "Blacklist support"
-	default n
-	depends on BUSYBOX_CONFIG_MODPROBE && BUSYBOX_CONFIG_FEATURE_2_6_MODULES
-	help
-	  Say 'y' here to enable support for the 'blacklist' command in
-	  modprobe.conf. This prevents the alias resolver to resolve
-	  blacklisted modules. This is useful if you want to prevent your
-	  hardware autodetection scripts to load modules like evdev, frame
-	  buffer drivers etc.
-
-comment "Options common to multiple modutils"
-	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_RMMOD || BUSYBOX_CONFIG_MODPROBE || BUSYBOX_CONFIG_LSMOD || BUSYBOX_CONFIG_DEPMOD
-
 config BUSYBOX_CONFIG_FEATURE_CHECK_TAINTED_MODULE
-	# Simulate indentation
 	bool "Support tainted module checking with new kernels"
 	default y
-	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_LSMOD
+	depends on !BUSYBOX_CONFIG_MODPROBE_SMALL
 	help
 	  Support checking for tainted modules. These are usually binary
 	  only modules that will make the linux-kernel list ignore your
 	  support request.
 	  This option is required to support GPLONLY modules.
 
-config BUSYBOX_CONFIG_FEATURE_2_4_MODULES
-	# Simulate indentation
-	bool "Support version 2.2.x to 2.4.x Linux kernels"
+config BUSYBOX_CONFIG_FEATURE_MODUTILS_ALIAS
+	bool "Support for module.aliases file"
 	default n
-	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_RMMOD || BUSYBOX_CONFIG_MODPROBE
+	depends on BUSYBOX_CONFIG_DEPMOD || BUSYBOX_CONFIG_MODPROBE
 	help
-	  Support module loading for 2.2.x and 2.4.x Linux kernels.
+	  Generate and parse modules.alias containing aliases for bus
+	  identifiers:
+	    alias pcmcia:m*c*f03fn*pfn*pa*pb*pc*pd* parport_cs
 
-	  Note:
-	  This is automatically enabled if 2.6 modules are not enabled.
+	  and aliases for logical modules names e.g.:
+	    alias padlock_aes aes
+	    alias aes_i586 aes
+	    alias aes_generic aes
 
-config BUSYBOX_CONFIG_FEATURE_2_6_MODULES
-	# Simulate indentation
-	bool "Support version 2.6.x Linux kernels"
-	default y
-	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_RMMOD || BUSYBOX_CONFIG_MODPROBE
-	help
-	  Support module loading for newer 2.6.x Linux kernels.
-
-config BUSYBOX_CONFIG_DEFAULT_MODULES_DIR
-	# Simulate indentation
-	string "Default directory containing modules"
-	default "/lib/modules"
-	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_RMMOD || BUSYBOX_CONFIG_MODPROBE || BUSYBOX_CONFIG_MODPROBE_SMALL || BUSYBOX_CONFIG_DEPMOD
-	help
-	  Directory that contains kernel modules.
-	  Defaults to "/lib/modules"
+	  Say Y if unsure.
 
-config BUSYBOX_CONFIG_DEFAULT_DEPMOD_FILE
-	# Simulate indentation
-	string "Default name of modules.dep"
-	default "modules.dep"
-	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_RMMOD || BUSYBOX_CONFIG_MODPROBE || BUSYBOX_CONFIG_MODPROBE_SMALL || BUSYBOX_CONFIG_DEPMOD
+config BUSYBOX_CONFIG_FEATURE_MODUTILS_SYMBOLS
+	bool "Support for module.symbols file"
+	default n
+	depends on BUSYBOX_CONFIG_DEPMOD || BUSYBOX_CONFIG_MODPROBE
 	help
-	  Filename that contains kernel modules dependencies.
-	  Defaults to "modules.dep"
+	  Generate and parse modules.symbols containing aliases for
+	  symbol_request() kernel calls, such as:
+	    alias symbol:usb_sg_init usbcore
 
-config BUSYBOX_CONFIG_FEATURE_QUERY_MODULE_INTERFACE
-	bool
-	default n
-	depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && !BUSYBOX_CONFIG_FEATURE_2_6_MODULES
+	  Say Y if unsure.
 
 endmenu
diff --git a/package/busybox/config/networking/Config.in b/package/busybox/config/networking/Config.in
index 76630852b722143ed7d7d4abd9856d7067ad7cf4..de7484aa99e316c677bc88794af602164c5b7250 100644
--- a/package/busybox/config/networking/Config.in
+++ b/package/busybox/config/networking/Config.in
@@ -641,7 +641,7 @@ config BUSYBOX_CONFIG_FEATURE_NETSTAT_WIDE
 
 config BUSYBOX_CONFIG_FEATURE_NETSTAT_PRG
 	bool "Enable PID/Program name output"
-	default n
+	default y
 	depends on BUSYBOX_CONFIG_NETSTAT
 	help
 	  Add support for -p flag to print out PID and program name.
@@ -687,18 +687,6 @@ config BUSYBOX_CONFIG_ROUTE
 	help
 	  Route displays or manipulates the kernel's IP routing tables.
 
-config BUSYBOX_CONFIG_SENDMAIL
-	bool "sendmail"
-	default n
-	help
-	  Barebones sendmail.
-
-config BUSYBOX_CONFIG_FETCHMAIL
-	bool "fetchmail"
-	default n
-	help
-	  Barebones fetchmail.
-
 config BUSYBOX_CONFIG_SLATTACH
 	bool "slattach"
 	default n
@@ -706,6 +694,16 @@ config BUSYBOX_CONFIG_SLATTACH
 	  slattach is a small utility to attach network interfaces to serial
 	  lines.
 
+#config TC
+#	bool "tc"
+#	default n
+#	help
+#	  show / manipulate traffic control settings
+#
+#config FEATURE_TC_INGRESS
+#	def_bool n
+#	depends on TC
+
 config BUSYBOX_CONFIG_TELNET
 	bool "telnet"
 	default y
@@ -826,7 +824,7 @@ config BUSYBOX_CONFIG_FEATURE_TFTP_BLOCKSIZE
 	  Allow tftp to specify block size, and tftpd to understand
 	  "blksize" option.
 
-config BUSYBOX_CONFIG_DEBUG_TFTP
+config BUSYBOX_CONFIG_TFTP_DEBUG
 	bool "Enable debug"
 	default n
 	depends on BUSYBOX_CONFIG_TFTP
diff --git a/package/busybox/config/networking/udhcp/Config.in b/package/busybox/config/networking/udhcp/Config.in
index 891dcf8d83787e740f11b03eae3b28da3f0b0e0e..10e06d5e36abcf9a4f4daf7d893f2b069391d5b6 100644
--- a/package/busybox/config/networking/udhcp/Config.in
+++ b/package/busybox/config/networking/udhcp/Config.in
@@ -74,14 +74,14 @@ config BUSYBOX_CONFIG_FEATURE_UDHCP_PORT
 	  At the cost of ~300 bytes, enables -P port option.
 	  This feature is typically not needed.
 
-config BUSYBOX_CONFIG_FEATURE_UDHCP_DEBUG
+config BUSYBOX_CONFIG_UDHCP_DEBUG
 	bool "Compile udhcp with noisy debugging messages"
 	default n
 	depends on BUSYBOX_CONFIG_APP_UDHCPD || BUSYBOX_CONFIG_APP_UDHCPC
 	help
 	  If selected, udhcpd will output extra debugging output.
 
-config BUSYBOX_CONFIG_FEATURE_RFC3397
+config BUSYBOX_CONFIG_FEATURE_UDHCP_RFC3397
 	bool "Support for RFC3397 domain search (experimental)"
 	default y
 	depends on BUSYBOX_CONFIG_APP_UDHCPD || BUSYBOX_CONFIG_APP_UDHCPC
@@ -89,7 +89,7 @@ config BUSYBOX_CONFIG_FEATURE_RFC3397
 	  If selected, both client and server will support passing of domain
 	  search lists via option 119, specified in RFC3397.
 
-config BUSYBOX_CONFIG_DHCPC_DEFAULT_SCRIPT
+config BUSYBOX_CONFIG_UDHCPC_DEFAULT_SCRIPT
 	string "Absolute path to config script"
 	default "/usr/share/udhcpc/default.script"
 	depends on BUSYBOX_CONFIG_APP_UDHCPC
diff --git a/package/busybox/config/printutils/Config.in b/package/busybox/config/printutils/Config.in
index 62fb448cffa8d19a8aa1dd66788ff59a8f3c4b63..8b84bdec264fc3bd4d799e08dc9597394f608519 100644
--- a/package/busybox/config/printutils/Config.in
+++ b/package/busybox/config/printutils/Config.in
@@ -1,3 +1,8 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
 menu "Print Utilities"
 
 config BUSYBOX_CONFIG_LPD
diff --git a/package/busybox/config/procps/Config.in b/package/busybox/config/procps/Config.in
index ac931639947243c22bebc803069f76dae7bea186..7343592607f80327937a726198093e084e640f94 100644
--- a/package/busybox/config/procps/Config.in
+++ b/package/busybox/config/procps/Config.in
@@ -135,32 +135,51 @@ config BUSYBOX_CONFIG_TOP
 	  system.
 
 config BUSYBOX_CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
-	bool "Show CPU per-process usage percentage (adds 2k bytes)"
+	bool "Show CPU per-process usage percentage"
 	default y
 	depends on BUSYBOX_CONFIG_TOP
 	help
 	  Make top display CPU usage for each process.
+	  This adds about 2k.
 
 config BUSYBOX_CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS
-	bool "Show CPU global usage percentage (adds 0.5k bytes)"
+	bool "Show CPU global usage percentage"
 	default y
 	depends on BUSYBOX_CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
 	help
 	  Makes top display "CPU: NN% usr NN% sys..." line.
+	  This adds about 0.5k.
+
+config BUSYBOX_CONFIG_FEATURE_TOP_SMP_CPU
+	bool "SMP CPU usage display ('c' key)"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS
+	help
+	  Allow 'c' key to switch between individual/cumulative CPU stats
+	  This adds about 0.5k.
 
 config BUSYBOX_CONFIG_FEATURE_TOP_DECIMALS
-	bool "Show 1/10th of a percent in CPU/mem statistics (adds 0.3k bytes)"
+	bool "Show 1/10th of a percent in CPU/mem statistics"
 	default n
 	depends on BUSYBOX_CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE
 	help
 	  Show 1/10th of a percent in CPU/mem statistics.
+	  This adds about 0.3k.
+
+config BUSYBOX_CONFIG_FEATURE_TOP_SMP_PROCESS
+	bool "Show CPU process runs on ('j' field)"
+	default n
+	depends on BUSYBOX_CONFIG_TOP
+	help
+	  Show CPU where process was last found running on.
+	  This is the 'j' field.
 
 config BUSYBOX_CONFIG_FEATURE_TOPMEM
-	bool "topmem"
+	bool "Topmem command ('s' key)"
 	default n
 	depends on BUSYBOX_CONFIG_TOP
 	help
-	  Enable 's' in top (gives lots of memory info)
+	  Enable 's' in top (gives lots of memory info).
 
 config BUSYBOX_CONFIG_UPTIME
 	bool "uptime"
@@ -173,11 +192,9 @@ config BUSYBOX_CONFIG_UPTIME
 config BUSYBOX_CONFIG_WATCH
 	bool "watch"
 	default n
-	#huh?? select DATE
 	help
 	  watch is used to execute a program periodically, showing
 	  output to the screen.
 
 
 endmenu
-
diff --git a/package/busybox/config/runit/Config.in b/package/busybox/config/runit/Config.in
index 3938f9cc2f0f30afb8c0751b7816e0401ad47786..624d4992e314b73ba0b6b02a863582ea89cb01f6 100644
--- a/package/busybox/config/runit/Config.in
+++ b/package/busybox/config/runit/Config.in
@@ -20,6 +20,15 @@ config BUSYBOX_CONFIG_RUNSVDIR
 	  a directory, in the services directory dir, up to a limit of 1000
 	  subdirectories, and restarts a runsv process if it terminates.
 
+config BUSYBOX_CONFIG_FEATURE_RUNSVDIR_LOG
+	bool "Enable scrolling argument log"
+	depends on BUSYBOX_CONFIG_RUNSVDIR
+	default n
+	help
+	  Enable feature where second parameter of runsvdir holds last error
+	  message (viewable via top/ps). Otherwise (feature is off
+	  or no parameter), error messages go to stderr only.
+
 config BUSYBOX_CONFIG_SV
 	bool "sv"
 	default n
@@ -27,6 +36,14 @@ config BUSYBOX_CONFIG_SV
 	  sv reports the current status and controls the state of services
 	  monitored by the runsv supervisor.
 
+config BUSYBOX_CONFIG_SV_DEFAULT_SERVICE_DIR
+	string "Default directory for services"
+	default "/var/service"
+	depends on BUSYBOX_CONFIG_SV
+	help
+	  Default directory for services.
+	  Defaults to "/var/service"
+
 config BUSYBOX_CONFIG_SVLOGD
 	bool "svlogd"
 	default n
diff --git a/package/busybox/config/selinux/Config.in b/package/busybox/config/selinux/Config.in
index cc8966c5a5cbe885bf8eba2d788b534f12eeef95..b5b2d663e6a541cd3a1e314e95065e0084b3fae2 100644
--- a/package/busybox/config/selinux/Config.in
+++ b/package/busybox/config/selinux/Config.in
@@ -3,7 +3,7 @@
 # see scripts/kbuild/config-language.txt.
 #
 
-menu "Selinux Utilities"
+menu "SELinux Utilities"
 	depends on BUSYBOX_CONFIG_SELINUX
 
 config BUSYBOX_CONFIG_CHCON
diff --git a/package/busybox/config/util-linux/Config.in b/package/busybox/config/util-linux/Config.in
index 6e3fc39b494ee453b428caeba899ff55982da2ab..6b8dcdf7f6438c310ff5c54bf00297bd60f84f8a 100644
--- a/package/busybox/config/util-linux/Config.in
+++ b/package/busybox/config/util-linux/Config.in
@@ -5,6 +5,15 @@
 
 menu "Linux System Utilities"
 
+config BUSYBOX_CONFIG_BLKID
+	bool "blkid"
+	default n
+	select BUSYBOX_CONFIG_VOLUMEID
+	help
+	  Lists labels and UUIDs of all filesystems.
+	  WARNING:
+	  With all submodules selected, it will add ~8k to busybox.
+
 config BUSYBOX_CONFIG_DMESG
 	bool "dmesg"
 	default y
@@ -156,9 +165,7 @@ config BUSYBOX_CONFIG_FINDFS
 	default n
 	select BUSYBOX_CONFIG_VOLUMEID
 	help
-	  This is similar to the findfs program that is part of the e2fsprogs
-	  package. However, the e2fsprogs version only support ext2/3. This
-	  version supports those in addition to FAT, swap, and ReiserFS.
+	  Prints the name of a filesystem with given label or UUID.
 	  WARNING:
 	  With all submodules selected, it will add ~8k to busybox.
 
@@ -396,10 +403,8 @@ config BUSYBOX_CONFIG_FEATURE_USE_TERMIOS
 	  unable to move the cursor.
 
 config BUSYBOX_CONFIG_VOLUMEID
-	bool "Routines for detecting label and uuid on common filesystems"
+	bool #No description makes it a hidden option
 	default n
-	help
-	  TODO
 
 config BUSYBOX_CONFIG_FEATURE_VOLUMEID_EXT
 	bool "Ext filesystem"
@@ -651,7 +656,7 @@ config BUSYBOX_CONFIG_FEATURE_MOUNT_LABEL
 	select BUSYBOX_CONFIG_VOLUMEID
 	help
 	  This allows for specifying a device by label or uuid, rather than by
-	  name. This feature utilizes the same functionality as findfs.
+	  name. This feature utilizes the same functionality as blkid/findfs.
 
 config BUSYBOX_CONFIG_FEATURE_MOUNT_NFS
 	bool "Support mounting NFS file systems"
diff --git a/package/busybox/patches/001-init_avoid_loop_opening_tty.patch b/package/busybox/patches/001-init_avoid_loop_opening_tty.patch
index 25f690ab581a3f1d1f1af76d29144db9842045e9..ed790d807b2e149dd953900f507a98224910c9c6 100644
--- a/package/busybox/patches/001-init_avoid_loop_opening_tty.patch
+++ b/package/busybox/patches/001-init_avoid_loop_opening_tty.patch
@@ -1,6 +1,6 @@
 --- a/init/init.c
 +++ b/init/init.c
-@@ -498,12 +498,11 @@ static void run_actions(int action_type)
+@@ -497,12 +497,11 @@ static void run_actions(int action_type)
  	for (a = init_action_list; a; a = tmp) {
  		tmp = a->next;
  		if (a->action_type & action_type) {
diff --git a/package/busybox/patches/002-darwin_compile_fix.patch b/package/busybox/patches/002-darwin_compile_fix.patch
deleted file mode 100644
index a5c5379f979b73fcf944681cce2192bfa876e803..0000000000000000000000000000000000000000
--- a/package/busybox/patches/002-darwin_compile_fix.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- a/include/libbb.h
-+++ b/include/libbb.h
-@@ -83,7 +83,10 @@
- extern char **environ;
- 
- /* Set the group set for the current user to GROUPS (N of them).  */
-+#if !defined(__APPLE__)
- int setgroups(size_t n, const gid_t *groups);
-+#endif
-+
- #if defined(__GLIBC__) && __GLIBC__ < 2
- int vdprintf(int d, const char *format, va_list ap);
- #endif
diff --git a/package/busybox/patches/110-wget_getopt_fix.patch b/package/busybox/patches/110-wget_getopt_fix.patch
index 88377693453370d4e583d78305a790529bdada2f..187603d059d472db39e2ddbb5f579e7a72c4c1b3 100644
--- a/package/busybox/patches/110-wget_getopt_fix.patch
+++ b/package/busybox/patches/110-wget_getopt_fix.patch
@@ -1,9 +1,9 @@
 --- a/networking/wget.c
 +++ b/networking/wget.c
-@@ -437,7 +437,7 @@ int wget_main(int argc UNUSED_PARAM, cha
- 		"directory-prefix\0" Required_argument "P"
- 		"proxy\0"            Required_argument "Y"
- 		"user-agent\0"       Required_argument "U"
+@@ -443,7 +443,7 @@ int wget_main(int argc UNUSED_PARAM, cha
+ 		// "tries\0"            Required_argument "t"
+ 		// "timeout\0"          Required_argument "T"
+ 		/* Ignored (we always use PASV): */
 -		"passive-ftp\0"      No_argument       "\xff"
 +		"passive-ftp\0"      No_argument       "\xfd"
  		"header\0"           Required_argument "\xfe"
diff --git a/package/busybox/patches/240-udhcpc_retries.patch b/package/busybox/patches/240-udhcpc_retries.patch
index f45fc6eebd70cdd469c6d38932fa65d04dc13f63..be452c076ab3ef71bb4c2576cd181a4eaaf0dacf 100644
--- a/package/busybox/patches/240-udhcpc_retries.patch
+++ b/package/busybox/patches/240-udhcpc_retries.patch
@@ -9,7 +9,7 @@
  					if (packet_num == 0)
  						xid = random_xid();
  
-@@ -383,7 +383,7 @@ int udhcpc_main(int argc UNUSED_PARAM, c
+@@ -384,7 +384,7 @@ int udhcpc_main(int argc UNUSED_PARAM, c
  				continue;
  			case RENEW_REQUESTED:
  			case REQUESTING:
diff --git a/package/busybox/patches/241-udhcpc-oversized_packets.patch b/package/busybox/patches/241-udhcpc-oversized_packets.patch
index 7eda8c1e3576b38f206fbf8a7441ab510e45f708..6019297b24ed0f06259b783a7b4e9ff653e6930c 100644
--- a/package/busybox/patches/241-udhcpc-oversized_packets.patch
+++ b/package/busybox/patches/241-udhcpc-oversized_packets.patch
@@ -1,6 +1,6 @@
 --- a/networking/udhcp/packet.c
 +++ b/networking/udhcp/packet.c
-@@ -114,6 +114,10 @@ uint16_t udhcp_checksum(void *addr, int 
+@@ -114,6 +114,10 @@ uint16_t FAST_FUNC udhcp_checksum(void *
  	return ~sum;
  }
  
@@ -10,8 +10,8 @@
 +}
  
  /* Construct a ip/udp header for a packet, send packet */
- int udhcp_send_raw_packet(struct dhcpMessage *payload,
-@@ -125,11 +129,7 @@ int udhcp_send_raw_packet(struct dhcpMes
+ int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload,
+@@ -126,11 +130,7 @@ int FAST_FUNC udhcp_send_raw_packet(stru
  	int fd;
  	int result = -1;
  	const char *msg;
@@ -24,7 +24,7 @@
  
  	fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
  	if (fd < 0) {
-@@ -139,7 +139,7 @@ int udhcp_send_raw_packet(struct dhcpMes
+@@ -140,7 +140,7 @@ int FAST_FUNC udhcp_send_raw_packet(stru
  
  	memset(&dest, 0, sizeof(dest));
  	memset(&packet, 0, sizeof(packet));
@@ -33,7 +33,7 @@
  
  	dest.sll_family = AF_PACKET;
  	dest.sll_protocol = htons(ETH_P_IP);
-@@ -156,23 +156,18 @@ int udhcp_send_raw_packet(struct dhcpMes
+@@ -157,23 +157,18 @@ int FAST_FUNC udhcp_send_raw_packet(stru
  	packet.ip.daddr = dest_ip;
  	packet.udp.source = htons(source_port);
  	packet.udp.dest = htons(dest_port);
@@ -63,7 +63,7 @@
  				(struct sockaddr *) &dest, sizeof(dest));
  	msg = "sendto";
   ret_close:
-@@ -224,8 +219,7 @@ int udhcp_send_kernel_packet(struct dhcp
+@@ -225,8 +220,7 @@ int FAST_FUNC udhcp_send_kernel_packet(s
  		goto ret_close;
  	}
  
diff --git a/package/busybox/patches/242-udhcpc_msgs.patch b/package/busybox/patches/242-udhcpc_msgs.patch
index db4fa314bb21eacf27599cf938b1cd657631754c..0140c7854fc30b5ded8b31ffe9ae503890aa0f9f 100644
--- a/package/busybox/patches/242-udhcpc_msgs.patch
+++ b/package/busybox/patches/242-udhcpc_msgs.patch
@@ -1,18 +1,18 @@
 --- a/networking/udhcp/clientpacket.c
 +++ b/networking/udhcp/clientpacket.c
-@@ -101,6 +101,7 @@ int send_decline(uint32_t xid, uint32_t 
- int send_discover(uint32_t xid, uint32_t requested)
+@@ -126,6 +126,7 @@ int FAST_FUNC send_decline(uint32_t xid,
+ int FAST_FUNC send_discover(uint32_t xid, uint32_t requested)
  {
  	struct dhcpMessage packet;
 +	static int msgs = 0;
  
  	init_packet(&packet, DHCPDISCOVER);
  	packet.xid = xid;
-@@ -113,6 +114,7 @@ int send_discover(uint32_t xid, uint32_t
+@@ -138,6 +139,7 @@ int FAST_FUNC send_discover(uint32_t xid
  
  	add_param_req_option(&packet);
  
 +	if (msgs++ < 3)
  	bb_info_msg("Sending discover...");
- 	return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST,
- 			SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex);
+ 	return raw_bcast_from_client_config_ifindex(&packet);
+ }
diff --git a/package/busybox/patches/243-udhcpc_changed_ifindex.patch b/package/busybox/patches/243-udhcpc_changed_ifindex.patch
index 96936e4e3d058b1c2116a6a9a41567923a6d502b..29727556d18c2a4368b2225d8e43264b6cfa4f12 100644
--- a/package/busybox/patches/243-udhcpc_changed_ifindex.patch
+++ b/package/busybox/patches/243-udhcpc_changed_ifindex.patch
@@ -8,8 +8,8 @@
 +		 * member interfaces were added/removed or if the status of the
 +		 * bridge changed).
 +		 * Workaround: refresh it here before processing the next packet */
-+		read_interface(client_config.interface, &client_config.ifindex, NULL, client_config.arp);
++		udhcp_read_interface(client_config.interface, &client_config.ifindex, NULL, client_config.arp);
 +
  		if (listen_mode != LISTEN_NONE && sockfd < 0) {
  			if (listen_mode == LISTEN_KERNEL)
- 				sockfd = listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
+ 				sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
diff --git a/package/busybox/patches/250-ash_export-n.patch b/package/busybox/patches/250-ash_export-n.patch
index 50eaa62d0b9312e4e9dae68e7afa4059cd16d84f..71697b116e8aef634816dd326d1ca672208d92bf 100644
--- a/package/busybox/patches/250-ash_export-n.patch
+++ b/package/busybox/patches/250-ash_export-n.patch
@@ -1,6 +1,6 @@
 --- a/shell/ash.c
 +++ b/shell/ash.c
-@@ -12018,8 +12018,17 @@ exportcmd(int argc UNUSED_PARAM, char **
+@@ -12159,8 +12159,17 @@ exportcmd(int argc UNUSED_PARAM, char **
  	const char *p;
  	char **aptr;
  	int flag = argv[0][0] == 'r' ? VREADONLY : VEXPORT;
@@ -19,7 +19,7 @@
  		aptr = argptr;
  		name = *aptr;
  		if (name) {
-@@ -12031,10 +12040,12 @@ exportcmd(int argc UNUSED_PARAM, char **
+@@ -12172,10 +12181,12 @@ exportcmd(int argc UNUSED_PARAM, char **
  					vp = *findvar(hashvar(name), name);
  					if (vp) {
  						vp->flags |= flag;
diff --git a/package/busybox/patches/300-netmsg.patch b/package/busybox/patches/300-netmsg.patch
index ae5be7eeadd3de1d485740e8ce0f5173685b89e0..575f5873c1805dd07b989a8e3aea6c57a3a70980 100644
--- a/package/busybox/patches/300-netmsg.patch
+++ b/package/busybox/patches/300-netmsg.patch
@@ -1,6 +1,6 @@
 --- a/include/applets.h
 +++ b/include/applets.h
-@@ -261,6 +261,7 @@ USE_MT(APPLET(mt, _BB_DIR_BIN, _BB_SUID_
+@@ -263,6 +263,7 @@ USE_MT(APPLET(mt, _BB_DIR_BIN, _BB_SUID_
  USE_MV(APPLET(mv, _BB_DIR_BIN, _BB_SUID_NEVER))
  USE_NAMEIF(APPLET(nameif, _BB_DIR_SBIN, _BB_SUID_NEVER))
  USE_NC(APPLET(nc, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
@@ -10,7 +10,7 @@
  USE_NMETER(APPLET(nmeter, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
 --- a/include/usage.h
 +++ b/include/usage.h
-@@ -2816,6 +2816,9 @@
+@@ -2849,6 +2849,9 @@
  
  #endif
  
@@ -37,7 +37,7 @@
  	default n
 --- a/networking/Kbuild
 +++ b/networking/Kbuild
-@@ -24,6 +24,7 @@ lib-$(CONFIG_IP)           += ip.o
+@@ -23,6 +23,7 @@ lib-$(CONFIG_IP)           += ip.o
  lib-$(CONFIG_IPCALC)       += ipcalc.o
  lib-$(CONFIG_NAMEIF)       += nameif.o
  lib-$(CONFIG_NC)           += nc.o
diff --git a/package/busybox/patches/310-passwd_access.patch b/package/busybox/patches/310-passwd_access.patch
index 1c246fcf239ff63da32a4e08914a9a5455837f25..f90c840bafbf5cdcb2a53603a195b0eac02b65ad 100644
--- a/package/busybox/patches/310-passwd_access.patch
+++ b/package/busybox/patches/310-passwd_access.patch
@@ -3,7 +3,7 @@
 
 --- a/networking/httpd.c
 +++ b/networking/httpd.c
-@@ -1705,21 +1705,32 @@ static int check_user_passwd(const char 
+@@ -1713,21 +1713,32 @@ static int check_user_passwd(const char 
  
  		if (ENABLE_FEATURE_HTTPD_AUTH_MD5) {
  			char *md5_passwd;
diff --git a/package/busybox/patches/340-lock_util.patch b/package/busybox/patches/340-lock_util.patch
index 6276de9298b5398c20cd1fa829e1ff92a96d3289..d5f8ac849bd0612af5ac00d68b92991282f3efa2 100644
--- a/package/busybox/patches/340-lock_util.patch
+++ b/package/busybox/patches/340-lock_util.patch
@@ -1,6 +1,6 @@
 --- a/include/applets.h
 +++ b/include/applets.h
-@@ -222,6 +222,7 @@ USE_LN(APPLET_NOEXEC(ln, ln, _BB_DIR_BIN
+@@ -223,6 +223,7 @@ USE_LN(APPLET_NOEXEC(ln, ln, _BB_DIR_BIN
  USE_LOAD_POLICY(APPLET(load_policy, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
  USE_LOADFONT(APPLET(loadfont, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
  USE_LOADKMAP(APPLET(loadkmap, _BB_DIR_SBIN, _BB_SUID_NEVER))
@@ -10,7 +10,7 @@
  USE_LOGNAME(APPLET_NOFORK(logname, logname, _BB_DIR_USR_BIN, _BB_SUID_NEVER, logname))
 --- a/include/usage.h
 +++ b/include/usage.h
-@@ -2132,6 +2132,9 @@
+@@ -2150,6 +2150,9 @@
  #define loadkmap_example_usage \
         "$ loadkmap < /etc/i18n/lang-keymap\n"
  
@@ -22,7 +22,7 @@
  #define logger_full_usage "\n\n" \
 --- a/miscutils/Config.in
 +++ b/miscutils/Config.in
-@@ -366,6 +366,12 @@ config FEATURE_HDPARM_HDIO_GETSET_DMA
+@@ -395,6 +395,12 @@ config FEATURE_HDPARM_HDIO_GETSET_DMA
  	  Enables the 'hdparm -d' option to get/set using_dma flag.
  	  This is dangerous stuff, so you should probably say N.
  
@@ -37,7 +37,7 @@
  	default n
 --- a/miscutils/Kbuild
 +++ b/miscutils/Kbuild
-@@ -20,6 +20,7 @@ lib-$(CONFIG_INOTIFYD)    += inotifyd.o
+@@ -21,6 +21,7 @@ lib-$(CONFIG_INOTIFYD)    += inotifyd.o
  lib-$(CONFIG_FEATURE_LAST_SMALL)+= last.o
  lib-$(CONFIG_FEATURE_LAST_FANCY)+= last_fancy.o
  lib-$(CONFIG_LESS)        += less.o
diff --git a/package/busybox/patches/350-httpd_redir.patch b/package/busybox/patches/350-httpd_redir.patch
index ab25cd203d6b617293cff72bf05085407cb32e88..da2fab695d83332adecd187d87286a70a43f1881 100644
--- a/package/busybox/patches/350-httpd_redir.patch
+++ b/package/busybox/patches/350-httpd_redir.patch
@@ -1,6 +1,6 @@
 --- a/include/usage.h
 +++ b/include/usage.h
-@@ -1552,7 +1552,8 @@
+@@ -1558,7 +1558,8 @@
  	USE_FEATURE_HTTPD_BASIC_AUTH(" [-r realm]") \
  	USE_FEATURE_HTTPD_AUTH_MD5(" [-m pass]") \
         " [-h home]" \
@@ -10,7 +10,7 @@
  #define httpd_full_usage "\n\n" \
         "Listen for incoming HTTP requests\n" \
       "\nOptions:" \
-@@ -1570,6 +1571,8 @@
+@@ -1576,6 +1577,8 @@
       "\n	-h HOME		Home directory (default .)" \
       "\n	-e STRING	HTML encode STRING" \
       "\n	-d STRING	URL decode STRING" \
@@ -18,7 +18,7 @@
 +     "\n	-H HOST 	Redirect target host" \
  
  #define hwclock_trivial_usage \
- 	USE_GETOPT_LONG( \
+ 	USE_FEATURE_HWCLOCK_LONG_OPTIONS( \
 --- a/networking/httpd.c
 +++ b/networking/httpd.c
 @@ -248,6 +248,8 @@ struct globals {
@@ -30,7 +30,7 @@
  	Htaccess_IP *ip_a_d;    /* config allow/deny lines */
  
  	USE_FEATURE_HTTPD_BASIC_AUTH(const char *g_realm;)
-@@ -293,6 +295,8 @@ struct globals {
+@@ -295,6 +297,8 @@ struct globals {
  #define index_page        (G.index_page       )
  #define found_mime_type   (G.found_mime_type  )
  #define found_moved_temporarily (G.found_moved_temporarily)
@@ -39,7 +39,7 @@
  #define last_mod          (G.last_mod         )
  #define ip_a_d            (G.ip_a_d           )
  #define g_realm           (G.g_realm          )
-@@ -999,8 +1003,11 @@ static void send_headers(int responseNum
+@@ -1003,8 +1007,11 @@ static void send_headers(int responseNum
  	}
  #endif
  	if (responseNum == HTTP_MOVED_TEMPORARILY) {
@@ -52,7 +52,7 @@
  				(g_query ? "?" : ""),
  				(g_query ? g_query : ""));
  	}
-@@ -1931,8 +1938,12 @@ static void handle_incoming_and_exit(con
+@@ -1939,8 +1946,12 @@ static void handle_incoming_and_exit(con
  	} while (*++tptr);
  	*++urlp = '\0';       /* terminate after last character */
  
@@ -66,7 +66,7 @@
  		if (is_directory(urlcopy + 1, 1, &sb)) {
  			found_moved_temporarily = urlcopy;
  		}
-@@ -2281,7 +2292,9 @@ static void sighup_handler(int sig)
+@@ -2293,7 +2304,9 @@ static void sighup_handler(int sig)
  #endif
  
  enum {
@@ -77,7 +77,7 @@
  	d_opt_decode_url,
  	h_opt_home_httpd,
  	USE_FEATURE_HTTPD_ENCODE_URL_STR(e_opt_encode_url,)
-@@ -2330,12 +2343,13 @@ int httpd_main(int argc UNUSED_PARAM, ch
+@@ -2342,12 +2355,13 @@ int httpd_main(int argc UNUSED_PARAM, ch
  	/* We do not "absolutize" path given by -h (home) opt.
  	 * If user gives relative path in -h,
  	 * $SCRIPT_FILENAME will not be set. */
diff --git a/package/busybox/patches/410-httpd_cgi_headers.patch b/package/busybox/patches/410-httpd_cgi_headers.patch
index b47751a809ed21f4172e412ea91b7ce059a937e6..4339462a80b6dfbef2172f7f34e40b544675a862 100644
--- a/package/busybox/patches/410-httpd_cgi_headers.patch
+++ b/package/busybox/patches/410-httpd_cgi_headers.patch
@@ -1,6 +1,6 @@
 --- a/networking/httpd.c
 +++ b/networking/httpd.c
-@@ -1255,10 +1255,10 @@ static NOINLINE void cgi_io_loop_and_exi
+@@ -1259,10 +1259,10 @@ static NOINLINE void cgi_io_loop_and_exi
  						if (full_write(STDOUT_FILENO, HTTP_200, sizeof(HTTP_200)-1) != sizeof(HTTP_200)-1)
  							break;
  					}
diff --git a/package/busybox/patches/440-httpd_chdir.patch b/package/busybox/patches/440-httpd_chdir.patch
index 744e962d9e7ad6825ca3d4c9c45b04eb608b8240..0d5769651b29304845aa9c3cbe9d1366e789ad38 100644
--- a/package/busybox/patches/440-httpd_chdir.patch
+++ b/package/busybox/patches/440-httpd_chdir.patch
@@ -1,6 +1,6 @@
 --- a/networking/httpd.c
 +++ b/networking/httpd.c
-@@ -1816,6 +1816,7 @@ static void handle_incoming_and_exit(con
+@@ -1824,6 +1824,7 @@ static void handle_incoming_and_exit(con
  	char *header_ptr = header_ptr;
  	Htaccess_Proxy *proxy_entry;
  #endif
diff --git a/package/busybox/patches/450-httpd_accept_header.patch b/package/busybox/patches/450-httpd_accept_header.patch
deleted file mode 100644
index 88dfcfbb06d4d6ce09ffdb9d713bfe5fce03ceda..0000000000000000000000000000000000000000
--- a/package/busybox/patches/450-httpd_accept_header.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- a/networking/httpd.c
-+++ b/networking/httpd.c
-@@ -256,6 +256,8 @@ struct globals {
- 	USE_FEATURE_HTTPD_BASIC_AUTH(char *remoteuser;)
- 	USE_FEATURE_HTTPD_CGI(char *referer;)
- 	USE_FEATURE_HTTPD_CGI(char *user_agent;)
-+	USE_FEATURE_HTTPD_CGI(char *http_accept;)
-+	USE_FEATURE_HTTPD_CGI(char *http_accept_language;)
- 
- 	off_t file_size;        /* -1 - unknown */
- #if ENABLE_FEATURE_HTTPD_RANGES
-@@ -303,6 +305,8 @@ struct globals {
- #define remoteuser        (G.remoteuser       )
- #define referer           (G.referer          )
- #define user_agent        (G.user_agent       )
-+#define http_accept       (G.http_accept      )
-+#define http_accept_language (G.http_accept_language)
- #define file_size         (G.file_size        )
- #if ENABLE_FEATURE_HTTPD_RANGES
- #define range_start       (G.range_start      )
-@@ -1391,6 +1395,10 @@ static void send_cgi_and_exit(
- 		}
- 	}
- 	setenv1("HTTP_USER_AGENT", user_agent);
-+	if (http_accept)
-+		setenv1("HTTP_ACCEPT", http_accept);
-+	if (http_accept_language)
-+		setenv1("HTTP_ACCEPT_LANGUAGE", http_accept_language);
- 	if (post_len)
- 		putenv(xasprintf("CONTENT_LENGTH=%d", post_len));
- 	if (cookie)
-@@ -2028,6 +2036,10 @@ static void handle_incoming_and_exit(con
- 				referer = xstrdup(skip_whitespace(iobuf + sizeof("Referer:")-1));
- 			} else if (STRNCASECMP(iobuf, "User-Agent:") == 0) {
- 				user_agent = xstrdup(skip_whitespace(iobuf + sizeof("User-Agent:")-1));
-+			} else if (STRNCASECMP(iobuf, "Accept:") == 0) {
-+				http_accept = xstrdup(skip_whitespace(iobuf + sizeof("Accept:")-1));
-+			} else if (STRNCASECMP(iobuf, "Accept-Language:") == 0) {
-+				http_accept_language = xstrdup(skip_whitespace(iobuf + sizeof("Accept-Language:")-1));
- 			}
- #endif
- #if ENABLE_FEATURE_HTTPD_BASIC_AUTH
diff --git a/package/busybox/patches/470-insmod_search.patch b/package/busybox/patches/470-insmod_search.patch
index 62619c2213b0499da444938242879c30ce32cd31..8d4b019c6b3af8b8e57d098d0f9b3383c879967d 100644
--- a/package/busybox/patches/470-insmod_search.patch
+++ b/package/busybox/patches/470-insmod_search.patch
@@ -1,35 +1,17 @@
 --- a/modutils/insmod.c
 +++ b/modutils/insmod.c
-@@ -61,21 +61,117 @@
+@@ -9,6 +9,99 @@
+ 
  #include "libbb.h"
- #include <libgen.h>
- #include <sys/utsname.h>
-+#if ENABLE_FEATURE_2_6_MODULES
+ #include "modutils.h"
++#ifndef CONFIG_FEATURE_2_4_MODULES
 +#include <sys/mman.h>
 +#include <asm/unistd.h>
 +#include <sys/syscall.h>
++#include <sys/utsname.h>
 +#endif
- 
- #if !ENABLE_FEATURE_2_4_MODULES && !ENABLE_FEATURE_2_6_MODULES
- #undef ENABLE_FEATURE_2_4_MODULES
- #define ENABLE_FEATURE_2_4_MODULES 1
- #endif
- 
--/*
-- * Big piece of 2.4-specific code
-- */
- #if ENABLE_FEATURE_2_4_MODULES
--
-+int insmod_main_24(int argc, char **argv);
-+#endif
- #if ENABLE_FEATURE_2_6_MODULES
--static int insmod_ng_main(int argc, char **argv);
-+int insmod_main_26(int argc, char **argv);
- #endif
-+int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 +
 +static char *g_filename = NULL;
-+#define _PATH_MODULES	"/lib/modules"
 +
 +static int FAST_FUNC check_module_name_match(const char *filename, struct stat *statbuf,
 +				   void *userdata, int depth)
@@ -92,7 +74,7 @@
 +	* follow symlinks, but we do want to follow the
 +	* /lib/modules/`uname -r` dir, So resolve it ourselves
 +	* if it is a link... */
-+	module_dir = concat_path_file(_PATH_MODULES, myuname.release);
++	module_dir = concat_path_file(CONFIG_DEFAULT_MODULES_DIR, myuname.release);
 +	if (realpath(module_dir, real_module_dir) != NULL) {
 +		free(module_dir);
 +		module_dir = real_module_dir;
@@ -112,623 +94,26 @@
 +
 +done:
 +	free(filename);
- 
-+	return ret;
-+}
-+
-+/*
-+ * Big piece of 2.4-specific code
-+ */
-+#if ENABLE_FEATURE_2_4_MODULES
- #if ENABLE_FEATURE_INSMOD_LOADINKMEM
- #define LOADBITS 0
- #else
-@@ -184,7 +280,6 @@ static int insmod_ng_main(int argc, char
- /* Microblaze */
- #if defined(__microblaze__)
- #define USE_SINGLE
--#include <linux/elf-em.h>
- #define MATCH_MACHINE(x) (x == EM_XILINX_MICROBLAZE)
- #define SHT_RELM	SHT_RELA
- #define Elf32_RelM	Elf32_Rela
-@@ -452,7 +547,7 @@ enum {
- /* The system calls unchanged between 2.0 and 2.1.  */
- 
- unsigned long create_module(const char *, size_t);
--int delete_module(const char *module, unsigned int flags);
-+int delete_module(const char *);
- 
- 
- #endif /* module.h */
-@@ -652,7 +747,7 @@ static struct obj_symbol *arch_new_symbo
- 
- static enum obj_reloc arch_apply_relocation(struct obj_file *f,
- 				      struct obj_section *targsec,
--				      /*struct obj_section *symsec,*/
-+				      struct obj_section *symsec,
- 				      struct obj_symbol *sym,
- 				      ElfW(RelM) *rel, ElfW(Addr) value);
- 
-@@ -673,6 +768,7 @@ static int obj_gpl_license(struct obj_fi
- #define SPFX	""
- #endif
- 
 +
- enum { STRVERSIONLEN = 64 };
- 
- /*======================================================================*/
-@@ -788,28 +884,6 @@ static char *m_filename;
- static char *m_fullName;
- 
- 
--/*======================================================================*/
--
--
--static int FAST_FUNC check_module_name_match(const char *filename,
--		struct stat *statbuf UNUSED_PARAM,
--		void *userdata, int depth UNUSED_PARAM)
--{
--	char *fullname = (char *) userdata;
--	char *tmp;
--
--	if (fullname[0] == '\0')
--		return FALSE;
--
--	tmp = bb_get_last_path_component_nostrip(filename);
--	if (strcmp(tmp, fullname) == 0) {
--		/* Stop searching if we find a match */
--		m_filename = xstrdup(filename);
--		return FALSE;
--	}
--	return TRUE;
--}
--
- 
- /*======================================================================*/
- 
-@@ -835,32 +909,20 @@ static struct obj_symbol *arch_new_symbo
- static enum obj_reloc
- arch_apply_relocation(struct obj_file *f,
- 				struct obj_section *targsec,
--				/*struct obj_section *symsec,*/
-+				struct obj_section *symsec,
- 				struct obj_symbol *sym,
- 				ElfW(RelM) *rel, ElfW(Addr) v)
- {
--#if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
-- || defined(__sh__) || defined(__s390__) || defined(__x86_64__) \
-- || defined(__powerpc__) || defined(__mips__)
- 	struct arch_file *ifile = (struct arch_file *) f;
--#endif
- 	enum obj_reloc ret = obj_reloc_ok;
- 	ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
--#if defined(__arm__) || defined(__H8300H__) || defined(__H8300S__) \
-- || defined(__i386__) || defined(__mc68000__) || defined(__microblaze__) \
-- || defined(__mips__) || defined(__nios2__) || defined(__powerpc__) \
-- || defined(__s390__) || defined(__sh__) || defined(__x86_64__)
- 	ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
--#endif
- #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
- 	struct arch_symbol *isym = (struct arch_symbol *) sym;
- #endif
--#if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
-- || defined(__sh__) || defined(__s390__)
- #if defined(USE_GOT_ENTRIES)
- 	ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
- #endif
--#endif
- #if defined(USE_PLT_ENTRIES)
- 	ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
- 	unsigned long *ip;
-@@ -954,7 +1016,6 @@ arch_apply_relocation(struct obj_file *f
- 
- 		case R_386_PLT32:
- 		case R_386_PC32:
--		case R_386_GOTOFF:
- 			*loc += v - dot;
- 			break;
- 
-@@ -973,6 +1034,9 @@ arch_apply_relocation(struct obj_file *f
- 
- 		case R_386_GOT32:
- 			goto bb_use_got;
-+
-+		case R_386_GOTOFF:
-+			*loc += v - got;
- 			break;
- 
- #elif defined(__microblaze__)
-@@ -1764,7 +1828,7 @@ static int arch_list_add(ElfW(RelM) *rel
- 
- #if defined(USE_SINGLE)
- 
--static int arch_single_init(/*ElfW(RelM) *rel,*/ struct arch_single_entry *single,
-+static int arch_single_init(ElfW(RelM) *rel, struct arch_single_entry *single,
- 			     int offset, int size)
- {
- 	if (single->allocated == 0) {
-@@ -1912,7 +1976,7 @@ static void arch_create_got(struct obj_f
- #if defined(USE_GOT_ENTRIES)
- 			if (got_allocate) {
- 				got_offset += arch_single_init(
--						/*rel,*/ &intsym->gotent,
-+						rel, &intsym->gotent,
- 						got_offset, GOT_ENTRY_SIZE);
- 
- 				got_needed = 1;
-@@ -1926,7 +1990,7 @@ static void arch_create_got(struct obj_f
- 						plt_offset, PLT_ENTRY_SIZE);
- #else
- 				plt_offset += arch_single_init(
--						/*rel,*/ &intsym->pltent,
-+						rel, &intsym->pltent,
- 						plt_offset, PLT_ENTRY_SIZE);
- #endif
- 				plt_needed = 1;
-@@ -1964,8 +2028,7 @@ static unsigned long obj_elf_hash_n(cons
- 	while (n > 0) {
- 		ch = *name++;
- 		h = (h << 4) + ch;
--		g = (h & 0xf0000000);
--		if (g != 0) {
-+		if ((g = (h & 0xf0000000)) != 0) {
- 			h ^= g >> 24;
- 			h &= ~g;
- 		}
-@@ -2044,7 +2107,7 @@ obj_add_symbol(struct obj_file *f, const
- 	int n_type = ELF_ST_TYPE(info);
- 	int n_binding = ELF_ST_BIND(info);
- 
--	for (sym = f->symtab[hash]; sym; sym = sym->next) {
-+	for (sym = f->symtab[hash]; sym; sym = sym->next)
- 		if (f->symbol_cmp(sym->name, name) == 0) {
- 			int o_secidx = sym->secidx;
- 			int o_info = sym->info;
-@@ -2103,14 +2166,14 @@ obj_add_symbol(struct obj_file *f, const
- 				return sym;
- 			}
- 		}
--	}
- 
- 	/* Completely new symbol.  */
- 	sym = arch_new_symbol();
- 	sym->next = f->symtab[hash];
- 	f->symtab[hash] = sym;
- 	sym->ksymidx = -1;
--	if (ELF_ST_BIND(info) == STB_LOCAL && symidx != (unsigned long)(-1)) {
-+
-+	if (ELF_ST_BIND(info) == STB_LOCAL && symidx != -1) {
- 		if (symidx >= f->local_symtab_size)
- 			bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
- 					name, (long) symidx, (long) f->local_symtab_size);
-@@ -3234,7 +3297,7 @@ static int obj_relocate(struct obj_file 
- 
- 			/* Do it! */
- 			switch (arch_apply_relocation
--					(f, targsec, /*symsec,*/ intsym, rel, value)
-+					(f, targsec, symsec, intsym, rel, value)
- 			) {
- 			case obj_reloc_ok:
- 				break;
-@@ -3313,11 +3376,11 @@ static int obj_create_image(struct obj_f
- 
- /*======================================================================*/
- 
--static struct obj_file *obj_load(FILE *fp, int loadprogbits UNUSED_PARAM)
-+static struct obj_file *obj_load(FILE *fp, int loadprogbits)
- {
- 	struct obj_file *f;
- 	ElfW(Shdr) * section_headers;
--	size_t shnum, i;
-+	int shnum, i;
- 	char *shstrtab;
- 
- 	/* Read the file header.  */
-@@ -3591,7 +3654,7 @@ static int obj_gpl_license(struct obj_fi
- 		while (ptr < endptr) {
- 			value = strchr(ptr, '=');
- 			if (value && strncmp(ptr, "license", value-ptr) == 0) {
--				unsigned i;
-+				int i;
- 				if (license)
- 					*license = value+1;
- 				for (i = 0; i < ARRAY_SIZE(gpl_licenses); ++i) {
-@@ -3695,9 +3758,6 @@ static void check_tainted_module(struct 
-  * start of some sections.  this info is used by ksymoops to do better
-  * debugging.
-  */
--#if !ENABLE_FEATURE_INSMOD_VERSION_CHECKING
--#define get_module_version(f, str) get_module_version(str)
--#endif
- static int
- get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
- {
-@@ -3730,8 +3790,7 @@ add_ksymoops_symbols(struct obj_file *f,
- 	struct obj_symbol *sym;
- 	char *name, *absolute_filename;
- 	char str[STRVERSIONLEN];
--	unsigned i;
--	int l, lm_name, lfilename, use_ksymtab, version;
-+	int i, l, lm_name, lfilename, use_ksymtab, version;
- 	struct stat statbuf;
- 
- 	/* WARNING: was using realpath, but replaced by readlink to stop using
-@@ -3922,145 +3981,57 @@ static void print_load_map(struct obj_fi
- void print_load_map(struct obj_file *f);
- #endif
- 
--int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
--int insmod_main(int argc, char **argv)
-+int insmod_main_24( int argc, char **argv)
- {
- 	char *opt_o, *arg1;
--	int len;
- 	int k_crcs;
--	char *tmp, *tmp1;
- 	unsigned long m_size;
- 	ElfW(Addr) m_addr;
- 	struct obj_file *f;
--	struct stat st;
--	char *m_name = NULL;
--	int exit_status = EXIT_FAILURE;
-+	char *tmp = NULL, *m_name = NULL;
-+	int ret = EINVAL;
- 	int m_has_modinfo;
- #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
- 	struct utsname uts_info;
- 	char m_strversion[STRVERSIONLEN];
- 	int m_version, m_crcs;
- #endif
--#if ENABLE_FEATURE_CLEAN_UP
- 	FILE *fp = NULL;
--#else
--	FILE *fp;
--#endif
--	int k_version = 0;
-+	int k_version;
- 	struct utsname myuname;
- 
-+	/* check the kernel version */
-+	if ((uname(&myuname) != 0) || (myuname.release[0] != '2'))
-+		return EINVAL;
-+
-+	k_version = myuname.release[2] - '0';
-+	if (k_version > 4)
-+		return ENOTSUP;
-+
- 	/* Parse any options */
- 	getopt32(argv, OPTION_STR, &opt_o);
- 	arg1 = argv[optind];
- 	if (option_mask32 & OPT_o) { // -o /* name the output module */
--		free(m_name);
- 		m_name = xstrdup(opt_o);
- 	}
- 
--	if (arg1 == NULL) {
-+	if (arg1 == NULL)
- 		bb_show_usage();
--	}
--
--	/* Grab the module name */
--	tmp1 = xstrdup(arg1);
--	tmp = basename(tmp1);
--	len = strlen(tmp);
--
--	if (uname(&myuname) == 0) {
--		if (myuname.release[0] == '2') {
--			k_version = myuname.release[2] - '0';
--		}
--	}
- 
--#if ENABLE_FEATURE_2_6_MODULES
--	if (k_version > 4 && len > 3 && tmp[len - 3] == '.'
--	 && tmp[len - 2] == 'k' && tmp[len - 1] == 'o'
--	) {
--		len -= 3;
--		tmp[len] = '\0';
--	} else
--#endif
--		if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
--			len -= 2;
--			tmp[len] = '\0';
--		}
--
--
--#if ENABLE_FEATURE_2_6_MODULES
--	if (k_version > 4)
--		m_fullName = xasprintf("%s.ko", tmp);
--	else
--#endif
--		m_fullName = xasprintf("%s.o", tmp);
-+	ret = find_module(arg1);
-+	if (ret)
-+		goto out;
- 
- 	if (!m_name) {
--		m_name = tmp;
--	} else {
--		free(tmp1);
--		tmp1 = NULL;       /* flag for free(m_name) before exit() */
--	}
--
--	/* Get a filedesc for the module.  Check that we have a complete path */
--	if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
--	 || (fp = fopen_for_read(arg1)) == NULL
--	) {
--		/* Hmm.  Could not open it.  First search under /lib/modules/`uname -r`,
--		 * but do not error out yet if we fail to find it... */
--		if (k_version) {	/* uname succeedd */
--			char *module_dir;
--			char *tmdn;
--
--			tmdn = concat_path_file(CONFIG_DEFAULT_MODULES_DIR, myuname.release);
--			/* Jump through hoops in case /lib/modules/`uname -r`
--			 * is a symlink.  We do not want recursive_action to
--			 * follow symlinks, but we do want to follow the
--			 * /lib/modules/`uname -r` dir, So resolve it ourselves
--			 * if it is a link... */
--			module_dir = xmalloc_readlink(tmdn);
--			if (!module_dir)
--				module_dir = xstrdup(tmdn);
--			recursive_action(module_dir, ACTION_RECURSE,
--					check_module_name_match, NULL, m_fullName, 0);
--			free(module_dir);
--			free(tmdn);
--		}
--
--		/* Check if we have found anything yet */
--		if (!m_filename || ((fp = fopen_for_read(m_filename)) == NULL)) {
--			int r;
--			char *module_dir;
--
--			free(m_filename);
--			m_filename = NULL;
--			module_dir = xmalloc_readlink(CONFIG_DEFAULT_MODULES_DIR);
--			if (!module_dir)
--				module_dir = xstrdup(CONFIG_DEFAULT_MODULES_DIR);
--			/* No module found under /lib/modules/`uname -r`, this
--			 * time cast the net a bit wider.  Search /lib/modules/ */
--			r = recursive_action(module_dir, ACTION_RECURSE,
--					check_module_name_match, NULL, m_fullName, 0);
--			if (r)
--				bb_error_msg_and_die("%s: module not found", m_fullName);
--			free(module_dir);
--			if (m_filename == NULL
--			 || ((fp = fopen_for_read(m_filename)) == NULL)
--			) {
--				bb_error_msg_and_die("%s: module not found", m_fullName);
--			}
-+		tmp = xstrdup(arg1);
-+		m_name = basename(tmp);
- 		}
--	} else
--		m_filename = xstrdup(arg1);
--
--	if (flag_verbose)
--		printf("Using %s\n", m_filename);
- 
--#if ENABLE_FEATURE_2_6_MODULES
--	if (k_version > 4) {
--		argv[optind] = m_filename;
--		optind--;
--		return insmod_ng_main(argc - optind, argv + optind);
-+	fp = fopen_for_read(g_filename);
-+	if (!fp) {
-+		ret = errno;
-+		goto out;
- 	}
--#endif
- 
- 	f = obj_load(fp, LOADBITS);
- 
-@@ -4087,7 +4058,7 @@ int insmod_main(int argc, char **argv)
- 				"\t%s was compiled for kernel version %s\n"
- 				"\twhile this kernel is version %s",
- 				flag_force_load ? "warning: " : "",
--				m_filename, m_strversion, uts_info.release);
-+				g_filename, m_strversion, uts_info.release);
- 			if (!flag_force_load)
- 				goto out;
- 		}
-@@ -4129,7 +4100,7 @@ int insmod_main(int argc, char **argv)
- 	hide_special_symbols(f);
- 
- #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
--	add_ksymoops_symbols(f, m_filename, m_name);
-+	add_ksymoops_symbols(f, g_filename, m_name);
- #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
- 
- 	new_create_module_ksymtab(f);
-@@ -4138,7 +4109,7 @@ int insmod_main(int argc, char **argv)
- 	m_size = obj_load_size(f);
- 
- 	m_addr = create_module(m_name, m_size);
--	if (m_addr == (ElfW(Addr))(-1)) switch (errno) {
-+	if (m_addr == -1) switch (errno) {
- 		case EEXIST:
- 			bb_error_msg_and_die("a module named %s already exists", m_name);
- 		case ENOMEM:
-@@ -4154,36 +4125,37 @@ int insmod_main(int argc, char **argv)
- 	 * now we can load them directly into the kernel memory
- 	 */
- 	if (!obj_load_progbits(fp, f, (char*)m_addr)) {
--		delete_module(m_name, 0);
-+		delete_module(m_name);
- 		goto out;
- 	}
- #endif
- 
- 	if (!obj_relocate(f, m_addr)) {
--		delete_module(m_name, 0);
-+		delete_module(m_name);
- 		goto out;
- 	}
- 
- 	if (!new_init_module(m_name, f, m_size)) {
--		delete_module(m_name, 0);
-+		delete_module(m_name);
- 		goto out;
- 	}
- 
- 	if (flag_print_load_map)
- 		print_load_map(f);
- 
--	exit_status = EXIT_SUCCESS;
-+	ret = EXIT_SUCCESS;
- 
-  out:
- #if ENABLE_FEATURE_CLEAN_UP
- 	if (fp)
- 		fclose(fp);
--	free(tmp1);
--	if (!tmp1)
-+	if (tmp)
-+		free(tmp);
-+	else if (m_name)
- 		free(m_name);
--	free(m_filename);
-+	free(g_filename);
- #endif
--	return exit_status;
 +	return ret;
- }
- 
- #endif /* ENABLE_FEATURE_2_4_MODULES */
-@@ -4195,15 +4167,8 @@ int insmod_main(int argc, char **argv)
- #if ENABLE_FEATURE_2_6_MODULES
- 
- #include <sys/mman.h>
--
--#if defined __UCLIBC__ && !ENABLE_FEATURE_2_4_MODULES
--/* big time suckage. The old prototype above renders our nice fwd-decl wrong */
--extern int init_module(void *module, unsigned long len, const char *options);
--#else
- #include <asm/unistd.h>
- #include <sys/syscall.h>
--#define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
--#endif
- 
- /* We use error numbers in a loose translation... */
- static const char *moderror(int err)
-@@ -4222,22 +4187,32 @@ static const char *moderror(int err)
- 	}
- }
- 
--#if !ENABLE_FEATURE_2_4_MODULES
--int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
--int insmod_main(int argc UNUSED_PARAM, char **argv)
--#else
--static int insmod_ng_main(int argc UNUSED_PARAM, char **argv)
--#endif
-+int insmod_main_26(int argc, char **argv)
- {
--	size_t len;
-+	char *filename, *options;
-+	struct utsname myuname;
-+	int k_version;
- 	int optlen;
-+	size_t len;
- 	void *map;
--	char *filename, *options;
-+	long ret = 0;
-+
-+	/* check the kernel version */
-+	if ((uname(&myuname) != 0) || (myuname.release[0] != '2'))
-+		return EINVAL;
-+
-+	k_version = myuname.release[2] - '0';
-+	if (k_version <= 4)
-+		return ENOTSUP;
++}
  
- 	filename = *++argv;
+ int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int insmod_main(int argc UNUSED_PARAM, char **argv)
+@@ -25,9 +118,14 @@ int insmod_main(int argc UNUSED_PARAM, c
  	if (!filename)
  		bb_show_usage();
  
-+	ret = find_module(filename);
-+	if (ret || (g_filename == NULL))
-+		goto done;
+-	rc = bb_init_module(filename, parse_cmdline_module_options(argv));
++	rc = find_module(filename);
++	if (rc || (g_filename == NULL))
++			goto done;
 +
- 	/* Rest is options */
- 	options = xzalloc(1);
- 	optlen = 0;
-@@ -4247,41 +4222,47 @@ static int insmod_ng_main(int argc UNUSE
- 		optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
- 	}
- 
--#if 0
--	/* Any special reason why mmap? It isn't performance critical. -vda */
--	/* Yes, xmalloc'ing can use *alot* of RAM. Don't forget that there are
--	 * modules out there that are half a megabyte! mmap()ing is way nicer
--	 * for small mem boxes, i guess. */
--	/* But after load, these modules will take up that 0.5mb in kernel
--	 * anyway. Using malloc here causes only a transient spike to 1mb,
--	 * after module is loaded, we go back to normal 0.5mb usage
--	 * (in kernel). Also, mmap isn't magic - when we touch mapped data,
--	 * we use memory. -vda */
--	int fd;
--	struct stat st;
--	unsigned long len;
--	fd = xopen(filename, O_RDONLY);
--	fstat(fd, &st);
--	len = st.st_size;
--	map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
--	if (map == MAP_FAILED) {
--		bb_perror_msg_and_die("cannot mmap '%s'", filename);
--	}
++	rc = bb_init_module(g_filename, parse_cmdline_module_options(argv));
+ 	if (rc)
+ 		bb_error_msg("cannot insert '%s': %s", filename, moderror(rc));
 -
--	/* map == NULL on Blackfin, probably on other MMU-less systems too. Workaround. */
--	if (map == NULL) {
--		map = xmalloc(len);
--		xread(fd, map, len);
--	}
--#else
- 	len = MAXINT(ssize_t);
--	map = xmalloc_xopen_read_close(filename, &len);
--#endif
-+	map = xmalloc_open_read_close(g_filename, &len);
-+	ret = syscall(__NR_init_module, map, len, options);
-+	if (ret != 0) {
-+		bb_perror_msg_and_die("cannot insert '%s': %s (%li)",
-+				g_filename, moderror(errno), ret);
-+	}
++	free (g_filename);
 +done:
-+	if (g_filename && (g_filename != filename))
-+		free(g_filename);
- 
--	if (init_module(map, len, options) != 0)
--		bb_error_msg_and_die("cannot insert '%s': %s",
--				filename, moderror(errno));
--	return 0;
-+	return ret;
+ 	return rc;
  }
- 
- #endif
-+
-+int insmod_main(int argc, char **argv)
-+{
-+	int ret;
-+
-+	g_filename = NULL;
-+#if ENABLE_FEATURE_2_6_MODULES
-+	ret = insmod_main_26(argc, argv);
-+	if (ret != ENOTSUP)
-+		goto done;
-+#endif
-+
-+#if ENABLE_FEATURE_2_4_MODULES
-+	ret = insmod_main_24(argc, argv);
-+	if (ret != ENOTSUP)
-+		goto done;
-+#endif
-+
-+	fprintf(stderr, "Error: Kernel version not supported\n");
-+	return 1;
-+
-+done:
-+	if (ret) {
-+		errno = ret;
-+		bb_perror_msg("Loading module failed");
-+		return ret;
-+	} else
-+		return 0;
-+}
diff --git a/package/busybox/patches/480-vi_search.patch b/package/busybox/patches/480-vi_search.patch
deleted file mode 100644
index 1281135d2b51ec44b513141de50f9b4e493d9a27..0000000000000000000000000000000000000000
--- a/package/busybox/patches/480-vi_search.patch
+++ /dev/null
@@ -1,22 +0,0 @@
---- a/editors/vi.c
-+++ b/editors/vi.c
-@@ -3317,7 +3317,7 @@ static void do_cmd(char c)
- 		buf[1] = '\0';
- 		q = get_input_line(buf);	// get input line- use "status line"
- 		if (q[0] && !q[1]) {
--			if (last_search_pattern[0])
-+			if (last_search_pattern)
- 				last_search_pattern[0] = c;
- 			goto dc3; // if no pat re-use old pat
- 		}
-@@ -3333,6 +3333,10 @@ static void do_cmd(char c)
- 		if (cmdcnt-- > 1) {
- 			do_cmd(c);
- 		}				// repeat cnt
-+		if (last_search_pattern == 0) {
-+			msg = "No previous regular expression";
-+			goto dc2;
-+		}
- 		dir = BACK;		// assume BACKWARD search
- 		p = dot - 1;
- 		if (last_search_pattern[0] == '?') {
diff --git a/package/busybox/patches/510-awk_include.patch b/package/busybox/patches/510-awk_include.patch
index b185408a9905b71fb3690daf518255e654b714c9..7284bbcac689084a558b57dd6be4c8b503896d96 100644
--- a/package/busybox/patches/510-awk_include.patch
+++ b/package/busybox/patches/510-awk_include.patch
@@ -15,7 +15,7 @@
  } func;
  
  /* I/O stream */
-@@ -1400,7 +1405,8 @@ static void parse_program(char *p)
+@@ -1423,7 +1428,8 @@ static void parse_program(char *p)
  			next_token(TC_FUNCTION);
  			g_pos++;
  			f = newfunc(t_string);
@@ -25,7 +25,7 @@
  			f->nargs = 0;
  			while (next_token(TC_VARIABLE | TC_SEQTERM) & TC_VARIABLE) {
  				v = findvar(ahash, t_string);
-@@ -1409,7 +1415,7 @@ static void parse_program(char *p)
+@@ -1432,7 +1438,7 @@ static void parse_program(char *p)
  				if (next_token(TC_COMMA | TC_SEQTERM) & TC_SEQTERM)
  					break;
  			}
@@ -34,7 +34,7 @@
  			chain_group();
  			clear_array(ahash);
  
-@@ -2374,7 +2380,8 @@ static var *evaluate(node *op, var *res)
+@@ -2397,7 +2403,8 @@ static var *evaluate(node *op, var *res)
  			break;
  
  		case XC( OC_FUNC ):
@@ -44,7 +44,7 @@
  				syntax_error(EMSG_UNDEF_FUNC);
  
  			X.v = R.v = nvalloc(op->r.f->nargs+1);
-@@ -2391,7 +2398,10 @@ static var *evaluate(node *op, var *res)
+@@ -2414,7 +2421,10 @@ static var *evaluate(node *op, var *res)
  			fnargs = X.v;
  
  			L.s = g_progname;
@@ -56,7 +56,7 @@
  			g_progname = L.s;
  
  			nvfree(fnargs);
-@@ -2754,6 +2764,143 @@ static rstream *next_input_file(void)
+@@ -2777,6 +2787,143 @@ static rstream *next_input_file(void)
  #undef files_happen
  }
  
@@ -200,7 +200,7 @@
  int awk_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  int awk_main(int argc, char **argv)
  {
-@@ -2819,6 +2966,9 @@ int awk_main(int argc, char **argv)
+@@ -2842,6 +2989,9 @@ int awk_main(int argc, char **argv)
  			*s1 = '=';
  		}
  	}
diff --git a/package/busybox/patches/530-unsigned_bitwise_ops.patch b/package/busybox/patches/530-unsigned_bitwise_ops.patch
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/package/busybox/patches/803-id_getgrouplist.patch b/package/busybox/patches/803-id_getgrouplist.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ddc89f269b8dd082b55cdaf5e8781be99f7482da
--- /dev/null
+++ b/package/busybox/patches/803-id_getgrouplist.patch
@@ -0,0 +1,49 @@
+This patch disable supplementary groups handling in id with uClibc versions 
+prior to v0.9.30, which are lacking the 'getgrouplist' function.
+
+Signed-off-by: Nicolas Thill <nico@openwrt.org>
+
+--- a/coreutils/id.c
++++ b/coreutils/id.c
+@@ -17,10 +17,12 @@
+ 
+ #include "libbb.h"
+ 
++#define HAVE_GETGROUPLIST 1
++
+ #if !ENABLE_USE_BB_PWD_GRP
+ #if defined(__UCLIBC_MAJOR__) && (__UCLIBC_MAJOR__ == 0)
+ #if (__UCLIBC_MINOR__ < 9) || (__UCLIBC_MINOR__ == 9 &&  __UCLIBC_SUBLEVEL__ < 30)
+-#error "Sorry, you need at least uClibc version 0.9.30 for id applet to build"
++#undef HAVE_GETGROUPLIST
+ #endif
+ #endif
+ #endif
+@@ -86,7 +88,11 @@ static int get_groups(const char *userna
+ 		/* If the user is a member of more than
+ 		 * *n groups, then -1 is returned. Otherwise >= 0.
+ 		 * (and no defined way of detecting errors?!) */
++#if HAVE_GETGROUPLIST
+ 		m = getgrouplist(username, rgid, groups, n);
++#else
++		*n = -1;
++#endif
+ 		/* I guess *n < 0 might indicate error. Anyway,
+ 		 * malloc'ing -1 bytes won't be good, so: */
+ 		//if (*n < 0)
+@@ -160,6 +166,7 @@ int id_main(int argc UNUSED_PARAM, char 
+ 			if (egid != rgid)
+ 				status |= print_group(egid, " ");
+ 		}
++#if HAVE_GETGROUPLIST
+ 		/* We are supplying largish buffer, trying
+ 		 * to not run get_groups() twice. That might be slow
+ 		 * ("user database in remote SQL server" case) */
+@@ -187,6 +194,7 @@ int id_main(int argc UNUSED_PARAM, char 
+ 		}
+ 		if (ENABLE_FEATURE_CLEAN_UP)
+ 			free(groups);
++#endif
+ #if ENABLE_SELINUX
+ 		if (is_selinux_enabled()) {
+ 			if (getcon(&scontext) == 0)
diff --git a/package/busybox/patches/810-lsmod-infinite-loop.patch b/package/busybox/patches/810-lsmod-infinite-loop.patch
deleted file mode 100644
index 8bc8cd0a7668d476ba03cdaef4a22be63ad6694e..0000000000000000000000000000000000000000
--- a/package/busybox/patches/810-lsmod-infinite-loop.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/modutils/lsmod.c
-+++ b/modutils/lsmod.c
-@@ -107,7 +107,7 @@
- 				continue;
- 			} else if (errno != ENOSPC)
- 				bb_perror_msg_and_die("module %s: QM_REFS", mn);
--			deps = xrealloc(deps, count);
-+			deps = xrealloc(deps, depsize = count);
- 		}
- 		printf("%-20s%8lu%4ld", mn, info.size, info.usecount);
- 		if (info.flags & NEW_MOD_DELETED)