diff -Naur busybox.orig/include/applets.h busybox/include/applets.h
--- busybox.orig/include/applets.h	2008-06-02 19:30:56 +0000
+++ busybox/include/applets.h	2008-06-23 20:56:49 +0000
@@ -116,6 +116,7 @@
 USE_DELGROUP(APPLET_ODDNAME(delgroup, deluser, _BB_DIR_BIN, _BB_SUID_NEVER, delgroup))
 USE_DELUSER(APPLET(deluser, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_DEPMOD(APPLET(depmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
+USE_MODPROBE_NG(APPLET_ODDNAME(depmod, modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER, modprobe))
 USE_DEVFSD(APPLET(devfsd, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_DF(APPLET(df, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_APP_DHCPRELAY(APPLET(dhcprelay, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
@@ -188,6 +189,7 @@
 USE_INIT(APPLET(init, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_INOTIFYD(APPLET(inotifyd, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_INSMOD(APPLET(insmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
+USE_MODPROBE_NG(APPLET_ODDNAME(insmod, modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER, modprobe))
 USE_INSTALL(APPLET(install, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
 #if ENABLE_FEATURE_IP_ADDRESS \
  || ENABLE_FEATURE_IP_ROUTE \
@@ -231,6 +233,7 @@
 USE_LS(APPLET_NOEXEC(ls, ls, _BB_DIR_BIN, _BB_SUID_NEVER, ls))
 USE_LSATTR(APPLET(lsattr, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_LSMOD(APPLET(lsmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
+USE_MODPROBE_NG(APPLET_ODDNAME(lsmod, modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER, modprobe))
 USE_UNLZMA(APPLET_ODDNAME(lzmacat, unlzma, _BB_DIR_USR_BIN, _BB_SUID_NEVER, lzmacat))
 USE_MAKEDEVS(APPLET(makedevs, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_MAN(APPLET(man, _BB_DIR_SBIN, _BB_SUID_NEVER))
@@ -249,6 +252,7 @@
 USE_MKSWAP(APPLET(mkswap, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_MKTEMP(APPLET(mktemp, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_MODPROBE(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER))
+USE_MODPROBE_NG(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_MORE(APPLET(more, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_MOUNT(APPLET(mount, _BB_DIR_BIN, USE_DESKTOP(_BB_SUID_MAYBE) SKIP_DESKTOP(_BB_SUID_NEVER)))
 USE_MOUNTPOINT(APPLET(mountpoint, _BB_DIR_BIN, _BB_SUID_NEVER))
@@ -293,6 +297,7 @@
 USE_RM(APPLET_NOFORK(rm, rm, _BB_DIR_BIN, _BB_SUID_NEVER, rm))
 USE_RMDIR(APPLET_NOFORK(rmdir, rmdir, _BB_DIR_BIN, _BB_SUID_NEVER, rmdir))
 USE_RMMOD(APPLET(rmmod, _BB_DIR_SBIN, _BB_SUID_NEVER))
+USE_MODPROBE_NG(APPLET_ODDNAME(rmmod, modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER, modprobe))
 USE_ROUTE(APPLET(route, _BB_DIR_SBIN, _BB_SUID_NEVER))
 USE_RPM(APPLET(rpm, _BB_DIR_BIN, _BB_SUID_NEVER))
 USE_RPM2CPIO(APPLET(rpm2cpio, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
diff -Naur busybox.orig/modutils/Config.in busybox/modutils/Config.in
--- busybox.orig/modutils/Config.in	2008-06-16 21:39:23 +0000
+++ busybox/modutils/Config.in	2008-06-23 20:27:36 +0000
@@ -5,9 +5,16 @@
 
 menu "Linux Module Utilities"
 
+config MODPROBE_NG
+	bool "Simplified modutils"
+	default n
+	help
+	  New format modutils. Compatible.
+
 config DEPMOD
 	bool "depmod"
 	default n
+	depends on !MODPROBE_NG
 	help
 	  depmod generates modules.dep (FIXME: elaborate)
 
@@ -38,6 +45,7 @@
 config INSMOD
 	bool "insmod"
 	default n
+	depends on !MODPROBE_NG
 	help
 	  insmod is used to load specified modules in the running kernel.
 
@@ -93,12 +101,14 @@
 config RMMOD
 	bool "rmmod"
 	default n
+	depends on !MODPROBE_NG
 	help
 	  rmmod is used to unload specified modules from the kernel.
 
 config LSMOD
 	bool "lsmod"
 	default n
+	depends on !MODPROBE_NG
 	help
 	  lsmod is used to display a list of loaded modules.
 
@@ -113,6 +123,7 @@
 config MODPROBE
 	bool "modprobe"
 	default n
+	depends on !MODPROBE_NG
 	help
 	  Handle the loading of modules, and their dependencies on a high
 	  level.
@@ -196,7 +207,7 @@
 	# Simulate indentation
 	string "Default directory containing modules"
 	default "/lib/modules"
-	depends on INSMOD || RMMOD || MODPROBE || DEPMOD
+	depends on INSMOD || RMMOD || MODPROBE || MODPROBE_NG || DEPMOD
 	help
 	  Directory that contains kernel modules.
 	  Defaults to "/lib/modules"
diff -Naur busybox.orig/modutils/Kbuild busybox/modutils/Kbuild
--- busybox.orig/modutils/Kbuild	2008-05-26 21:53:59 +0000
+++ busybox/modutils/Kbuild	2008-06-23 19:29:25 +0000
@@ -9,4 +9,5 @@
 lib-$(CONFIG_INSMOD)		+= insmod.o
 lib-$(CONFIG_LSMOD)		+= lsmod.o
 lib-$(CONFIG_MODPROBE)		+= modprobe.o
+lib-$(CONFIG_MODPROBE_NG)	+= modprobe-ng.o
 lib-$(CONFIG_RMMOD)		+= rmmod.o
diff -Naur busybox.orig/modutils/modprobe-ng.c busybox/modutils/modprobe-ng.c
--- busybox.orig/modutils/modprobe-ng.c	1970-01-01 00:00:00 +0000
+++ busybox/modutils/modprobe-ng.c	2008-06-23 20:57:56 +0000
@@ -0,0 +1,359 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * simplified depmod & modprobe
+ * Copyright (c) 2008 Vladimir Dronnikov
+ * Copyright (c) 2008 Bernhard Fischer (initial depmod code)
+ *
+ * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ */
+
+#undef _GNU_SOURCE
+#define _GNU_SOURCE
+#include <libbb.h>
+#include <sys/utsname.h> /* uname() */
+#include <fnmatch.h>
+
+#undef  CONFIG_DEFAULT_DEPMOD_FILE
+#define CONFIG_DEFAULT_DEPMOD_FILE "/tmp/modules.dep.bb"
+
+enum {
+	OPT_q = (1<<0), /* be quiet */
+	OPT_r = (1<<1), /* set removal instead of loading */
+	OPT_b = (1<<2), /* set base directory */
+};
+
+/*
+ * Theory of operation:
+ * - iterate over all modules and record their full path
+ * - iterate over all modules looking for "depends=" entries
+ *   for each depends, look through our list of full paths and emit if found
+ */
+
+static char* find_keyword(void *the_module, size_t len, const char * const word)
+{
+	char *ptr = the_module;
+	do {
+		/* search for the first char in word */
+		ptr = memchr(ptr, *word, len - (ptr - (char*)the_module));
+		if (ptr == NULL) /* no occurance left, done */
+			return NULL;
+		if (!strncmp(ptr, word, strlen(word))) {
+			ptr += strlen(word);
+			break;
+		}
+		++ptr;
+	} while (1);
+	return ptr;
+}
+
+static void replace(char *s, char what, char with)
+{
+	while (*s) {
+		if (what == *s)
+			*s = with;
+		++s;
+	}
+}
+
+static int fileAction(const char *fname, struct stat *sb,
+					void *data, int ATTRIBUTE_UNUSED depth)
+{
+	size_t len = sb->st_size;
+	void *module_image;
+	char *ptr;
+	int fd;
+	size_t pos;
+
+	char *name;
+
+	if (strrstr(fname, ".ko") == NULL) /* not a module */
+		goto skip;
+
+/*XXX: FIXME: does not handle compressed modules!
+ * There should be a function that looks at the extension and sets up
+ * open_transformer for us.
+ */
+	fd = xopen(fname, O_RDONLY);
+	module_image = mmap(NULL, len, PROT_READ, MAP_SHARED
+#if defined MAP_POPULATE
+						|MAP_POPULATE
+#endif
+						, fd, 0);
+	close(fd);
+	if (module_image == MAP_FAILED)
+		bb_perror_msg_and_die("mmap");
+
+	fd = (int)data;
+
+	name = xstrdup(bb_get_last_path_component_nostrip(fname));
+	ptr = strrstr(name, ".ko");
+	*ptr = '\0';
+	replace(name, '-', '_');
+
+	// module name ...
+	fdprintf(fd, "%s ", name);
+
+	// ... and aliases
+	pos = 0;
+	do {
+		ptr = find_keyword(module_image + pos, len - pos, "alias=");
+		if (!ptr)
+			ptr = find_keyword(module_image + pos, len - pos, "__ksymtab_");
+		if (ptr) {
+			// FIXME: __ksymtab_gpl and __ksymtab_strings occur in many modules.
+			// What do they mean?!
+			fdprintf(fd, "%s%s ", (('_' == ptr[-1]) ? "symbol:" : ""), ptr);
+		} else
+			break;
+		pos = (ptr - (char*)module_image);
+	} while (1);
+	fdprintf(fd, "\n");
+
+	// dependencies
+	ptr = find_keyword(module_image, len, "depends=");
+	if (*ptr) {
+		char *depends = xstrdup(ptr);
+		replace(depends, ',', ' ');
+		replace(depends, '-', '_');
+		fdprintf(fd, "%s", depends);
+		free(depends);
+	}
+	// filename and options
+	fdprintf(fd, " \n%s %s\n", fname+2, ""); // +2 to skip "./"
+
+	free(name);
+
+	munmap(module_image, sb->st_size);
+ skip:
+	return TRUE;
+}
+
+static int inline already_loaded(const char ATTRIBUTE_UNUSED *name)
+{
+	return 0;
+}
+
+static int inline already_loaded_issue(const char *name)
+{
+
+// FIXME: overflow?
+#define modules bb_common_bufsiz1
+
+	int ret = 0;
+	// N.B. can't use mmap or xmalloc_open_read_close()! They report wrong file length on mem-backed /proc/modules!!!
+	if (open_read_close("/proc/modules", modules, sizeof(modules)) >= 0) {
+		for (char *s = modules; (s = strstr(s, name)); s += strlen(name)) {
+			if (' ' == s[strlen(name)] && (s == s || '\n' == s[-1])) {
+				++ret;
+				break;
+			}
+		}
+	}
+
+#undef modules
+
+	return ret;
+}
+
+static int inline already_loaded_ugly(const char *name)
+{
+	int ret = 0;
+
+	int fd = open("/proc/modules", O_RDONLY);
+	if (fd >= 0) {
+#define modules bb_common_bufsiz1
+//		char *s;
+		while (reads(fd, modules, sizeof(modules))) {
+			if (' ' == modules[strlen(name)] && 0 == strncmp(modules, name, strlen(name))) {
+				++ret;
+				break;
+			}
+		}
+#undef modules
+	}
+
+	return ret;
+}
+
+/* We use error numbers in a loose translation... */
+static inline const char *moderror(int err)
+{
+	switch (err) {
+	case ENOEXEC:
+		return "invalid module format";
+	case ENOENT:
+		return "unknown symbol in module";
+	case ESRCH:
+		return "module has wrong symbol version";
+	case EINVAL:
+		return "invalid parameters";
+	default:
+		return strerror(err);
+	}
+}
+
+/*
+ Given modules definition and module name (or alias, or symbol)
+ load/remove the module respecting dependencies
+*/
+static void process_module(char *modules_dep, char *name)
+{
+	// read definitions
+	char *ptr = modules_dep;
+	char *s, *deps;
+
+	replace(name, '-', '_');
+
+	// iterate thru definitions
+	while (*ptr) {
+		// matching substring exists?
+		deps = xstrdup(ptr);
+		replace(deps, ' ', '\0');
+		for (s = deps; *s; s += strlen(s)+1) {
+			if (!fnmatch(s, name, 0)) {
+				free(deps);
+				goto found;
+			}
+		}
+		free(deps);
+		// ... skip to next module definition
+		for (int i = 3; --i >= 0; )
+			ptr += strlen(ptr)+1;
+	}
+	if (*ptr) {
+ found:
+		// yes -> found module definition! replace possible aliased name with module general name
+		name = xstrdup(ptr);
+		*strchrnul(name, ' ') = '\0';
+
+		// on rmmod unload it by name
+		if (option_mask32 & OPT_r) {
+			extern int delete_module(const char *module, unsigned int flags);
+			if (delete_module(name, O_NONBLOCK|O_EXCL) && !(option_mask32 & OPT_q))
+				bb_perror_msg("remove '%s'", name);
+		}
+
+		// next line contains dependencies
+		ptr += strlen(ptr)+1;
+		// copy dependencies string
+		deps = xstrdup(ptr);
+		// transform it to string list
+		replace(deps, ' ', '\0');
+		// iterate thru dependencies, trying to load them
+		for (s = deps; *s; s += strlen(s)+1) {
+			//if (strcmp(name, s)) // N.B. Do loops ever exist?!
+				process_module(modules_dep, s);
+		}
+		free(deps);
+
+		// next line contains full path and optionally :) options
+		ptr += strlen(ptr)+1;
+
+		// on insmod if module is not loaded -> load it by filename
+		if (!(option_mask32 & OPT_r) && !already_loaded(name)) {
+			// load it
+			extern int init_module(void *module, unsigned long len, const char *options);
+			size_t len = MAXINT(ssize_t);
+			char *options = strchrnul(ptr, ' '), *module_image;
+			*options = '\0';
+			module_image = xmalloc_open_read_close(ptr, &len);
+			if ((!module_image || init_module(module_image, len, options+1) != 0) && EEXIST != errno)
+				bb_error_msg("insert '%s' [%s]: %s", ptr, options+1, moderror(errno));
+			if (module_image)
+				free(module_image);
+			*options = ' ';
+		}
+
+		// cleanup
+		free(name);
+	}
+}
+
+int modprobe_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int modprobe_main(int ATTRIBUTE_UNUSED argc, char **argv)
+{
+	int ret = EXIT_FAILURE;
+	struct utsname uts;
+	char *modules_dep;
+#define base_dir modules_dep
+
+	// lsmod called? ->
+	if ('l' == argv[0][0]) {
+		// just dump /proc/modules
+		bb_copyfd_eof(xopen("/proc/modules", O_RDONLY), STDOUT_FILENO);
+		goto done;
+	}
+
+	// only -q (quiet) and -r (rmmod) and -b (base dir) do matter
+	getopt32(argv, "qrb:knsvaeF:", &base_dir, NULL);
+
+	// insmod called? ->
+	// N.B. Why on Earth insmod should be published to user?!
+//	if ('i' == argv[0][0]) {
+		// simulate call to modprobe $@
+//	}
+
+	// rmmod called? ->
+	if ('r' == argv[0][0]) {
+		// simulate call to modprobe -r $@
+		option_mask32 |= OPT_r;
+	}
+
+	// goto modules directory
+	if (option_mask32 & OPT_b)
+		xchdir(base_dir);
+	xchdir(CONFIG_DEFAULT_MODULES_DIR);
+	// we should (Arghhh!) dive into `uname -r` subdirectory
+	base_dir = (uname(&uts) >= 0) ? uts.release : NULL;
+
+	// if depmod called? ->
+	if ('d' == argv[0][0]) {
+		// force recreating modules.dep.bb
+		// N.B. to cope well-known "sendmail bug" we should ensure
+		// we are not writing to a symlink (to, e.g., /etc/passwd)
+		// placed by a malicious user in world-writable /tmp directory
+		unlink(CONFIG_DEFAULT_DEPMOD_FILE);
+		// depmod takes optional argument of specific kernel version
+		base_dir = argv[optind];
+	}
+	// goto kernel specific subdirectory
+	if (base_dir)
+		xchdir(base_dir);
+
+	argv += optind;
+
+	// fetch definitions
+	modules_dep = xmalloc_open_read_close(CONFIG_DEFAULT_DEPMOD_FILE, NULL);
+	// no modules.dep.bb (or renewal forced)? -> create it
+	if (!modules_dep) {
+		// depmod: dump modules definitions
+		int fd = open3_or_warn(CONFIG_DEFAULT_DEPMOD_FILE, O_CREAT | O_TRUNC | O_WRONLY, 0644);
+		if (recursive_action(".", 
+			ACTION_RECURSE, /* flags */
+			fileAction, /* file action */
+			NULL, /* dir action */
+			(void *)fd, /* user data */
+			0)) /* depth */
+		{
+			fdprintf(fd, "\n"); // finalize definitions
+			close(fd);
+			// read definitions
+			modules_dep = xmalloc_open_read_close(CONFIG_DEFAULT_DEPMOD_FILE, NULL);
+		}
+	}
+	if (modules_dep) {
+		// convert to string list
+		replace(modules_dep, '\n', '\0');
+		// do load modules
+		while (*argv) {
+			process_module(modules_dep, *argv++);
+		}
+ done:
+		if (ENABLE_FEATURE_CLEAN_UP)
+			free(modules_dep);
+		ret = EXIT_SUCCESS;
+	}
+
+	// TODO: more elaborate exitcode!
+	return ret;
+}
