diff --git a/Config.h b/Config.h
index cbcf58d..f785947 100644
--- a/Config.h
+++ b/Config.h
@@ -11,7 +11,9 @@
 //#define BB_AR
 #define BB_BASENAME
 #define BB_CAT
-#define BB_CHMOD_CHOWN_CHGRP
+#define BB_CHGRP
+#define BB_CHMOD
+#define BB_CHOWN
 #define BB_CHROOT
 #define BB_CHVT
 #define BB_CLEAR
diff --git a/Config.h.Hurd b/Config.h.Hurd
index 3736b57..f94e4a9 100644
--- a/Config.h.Hurd
+++ b/Config.h.Hurd
@@ -14,7 +14,9 @@
 #define BB_AR
 #define BB_BASENAME
 #define BB_CAT
-#define BB_CHMOD_CHOWN_CHGRP
+#define BB_CHGRP
+#define BB_CHMOD
+#define BB_CHOWN
 #define BB_CHROOT
 //#define BB_CHVT	/* not needed */
 #define BB_CLEAR
diff --git a/applets.h b/applets.h
index d3399b9..0fd89c7 100644
--- a/applets.h
+++ b/applets.h
@@ -59,14 +59,14 @@
 #ifdef BB_CAT
 	APPLET(cat, cat_main, _BB_DIR_BIN)
 #endif
-#ifdef BB_CHMOD_CHOWN_CHGRP
-	APPLET(chgrp, chmod_chown_chgrp_main, _BB_DIR_BIN)
+#ifdef BB_CHGRP
+	APPLET(chgrp, chgrp_main, _BB_DIR_BIN)
 #endif
-#ifdef BB_CHMOD_CHOWN_CHGRP
-	APPLET(chmod, chmod_chown_chgrp_main, _BB_DIR_BIN)
+#ifdef BB_CHMOD
+	APPLET(chmod, chmod_main, _BB_DIR_BIN)
 #endif
-#ifdef BB_CHMOD_CHOWN_CHGRP
-	APPLET(chown, chmod_chown_chgrp_main, _BB_DIR_BIN)
+#ifdef BB_CHOWN
+	APPLET(chown, chown_main, _BB_DIR_BIN)
 #endif
 #ifdef BB_CHROOT
 	APPLET(chroot, chroot_main, _BB_DIR_USR_SBIN)
diff --git a/chgrp.c b/chgrp.c
new file mode 100644
index 0000000..739d09f
--- /dev/null
+++ b/chgrp.c
@@ -0,0 +1,94 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Mini chown/chmod/chgrp implementation for busybox
+ *
+ *
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "busybox.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_invalid_option
+#define bb_need_too_few_args
+#include "messages.c"
+
+/* Don't use lchown for libc5 or glibc older then 2.1.x */
+#if (__GLIBC__ < 2) && (__GLIBC_MINOR__ < 1)
+#define lchown	chown
+#endif
+
+
+static long gid = -1;
+
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+	if (lchown(fileName, statbuf->st_uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+		return (TRUE);
+	}
+	perror(fileName);
+	return (FALSE);
+}
+
+int chgrp_main(int argc, char **argv)
+{
+	int opt;
+	int recursiveFlag = FALSE;
+	char *p=NULL;
+
+	/* do normal option parsing */
+	while ((opt = getopt(argc, argv, "R")) > 0) {
+		switch (opt) {
+			case 'R':
+				recursiveFlag = TRUE;
+			default:
+				show_usage();
+		}
+	}
+
+	if (argc > optind && argc > 2 && argv[optind]) {
+		/* Find the selected group */
+		gid = strtoul(argv[optind], &p, 10);	/* maybe it's already numeric */
+		if (argv[optind] == p)
+			gid = my_getgrnam(argv[optind]);
+	} else {
+		error_msg_and_die(too_few_args);
+	}
+
+	/* Ok, ready to do the deed now */
+	while (optind++ < argc) {
+		if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, 
+					fileAction, fileAction, NULL) == FALSE) {
+			return EXIT_FAILURE;
+		}
+	}
+	return EXIT_SUCCESS;
+
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/chmod.c b/chmod.c
new file mode 100644
index 0000000..c3bef4e
--- /dev/null
+++ b/chmod.c
@@ -0,0 +1,87 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Mini chown/chmod/chgrp implementation for busybox
+ *
+ *
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+#include "busybox.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_too_few_args
+#include "messages.c"
+
+
+struct stat *theMode;
+
+
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+	if (chmod(fileName, theMode->st_mode) == 0)
+		return (TRUE);
+	perror(fileName);
+	return (FALSE);
+}
+
+int chmod_main(int argc, char **argv)
+{
+	int opt;
+	int recursiveFlag = FALSE;
+
+	/* do normal option parsing */
+	while ((opt = getopt(argc, argv, "R")) > 0) {
+		switch (opt) {
+			case 'R':
+				recursiveFlag = TRUE;
+			default:
+				show_usage();
+		}
+	}
+
+	if (argc > optind && argc > 2 && argv[optind]) {
+		/* Parse the specified mode */
+		if (parse_mode(argv[optind], &(theMode->st_mode)) == FALSE) {
+			error_msg_and_die( "unknown mode: %s", argv[optind]);
+		}
+	} else {
+		error_msg_and_die(too_few_args);
+	}
+
+	/* Ok, ready to do the deed now */
+	while (optind++ < argc) {
+		if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, 
+					fileAction, fileAction, NULL) == FALSE) {
+			return EXIT_FAILURE;
+		}
+	}
+	return EXIT_SUCCESS;
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/chmod_chown_chgrp.c b/chmod_chown_chgrp.c
deleted file mode 100644
index 9714e1c..0000000
--- a/chmod_chown_chgrp.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Mini chown/chmod/chgrp implementation for busybox
- *
- *
- * Copyright (C) 1999,2000,2001 by Lineo, inc.
- * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "busybox.h"
-#define BB_DECLARE_EXTERN
-#define bb_need_invalid_option
-#define bb_need_too_few_args
-#include "messages.c"
-
-
-
-static long uid = -1;
-static long gid = -1;
-static int whichApp;
-static char *theMode = NULL;
-
-
-#define CHGRP_APP   1
-#define CHOWN_APP   2
-#define CHMOD_APP   3
-
-static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
-{
-	switch (whichApp) {
-	case CHGRP_APP:
-	case CHOWN_APP:
-	/* Don't use lchown for libc5 or glibc older then 2.1.x */
-#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
-		if (lchown
-			(fileName, (whichApp == CHOWN_APP) ? uid : statbuf->st_uid,
-			 (gid == -1) ? statbuf->st_gid : gid) == 0)
-#else
-		if (chown
-			(fileName, (whichApp == CHOWN_APP) ? uid : statbuf->st_uid,
-			 (gid == -1) ? statbuf->st_gid : gid) == 0)
-#endif
-		{
-			return (TRUE);
-		}
-		break;
-	case CHMOD_APP:
-		/* Parse the specified modes */
-		if (parse_mode(theMode, &(statbuf->st_mode)) == FALSE) {
-			error_msg_and_die( "unknown mode: %s", theMode);
-		}
-		if (chmod(fileName, statbuf->st_mode) == 0)
-			return (TRUE);
-		break;
-	}
-	perror(fileName);
-	return (FALSE);
-}
-
-int chmod_chown_chgrp_main(int argc, char **argv)
-{
-	int stopIt = FALSE;
-	int recursiveFlag = FALSE;
-	char *groupName=NULL;
-	char *p=NULL;
-
-	whichApp = (applet_name[2]=='o')?           /* chown */
-		CHOWN_APP : (applet_name[2]=='m')?      /* chmod */
-		CHMOD_APP : CHGRP_APP;
-
-	if (argc < 2)
-		show_usage();
-	argv++;
-
-	/* Parse options */
-	while (--argc >= 0 && *argv && (**argv == '-')) {
-		while (stopIt==FALSE && *++(*argv)) {
-			switch (**argv) {
-				case 'R':
-					recursiveFlag = TRUE;
-					break;
-				default:
-					theMode=*argv-1;
-					stopIt = TRUE;
-			}
-		}
-		if (stopIt==TRUE)
-			break;
-		argv++;
-	}
-
-	if (argc == 0 || *argv == NULL) {
-		error_msg(too_few_args);
-	}
-
-	if (whichApp == CHMOD_APP) {
-		if (theMode==NULL)
-			theMode = *argv;
-	} else {
-
-		/* Find the selected group */
-		if (whichApp == CHGRP_APP) {
-			groupName = *argv;
-			gid = strtoul(groupName, &p, 10);	/* maybe it's already numeric */
-			if (groupName == p)
-				gid = my_getgrnam(groupName);
-		} else {
-			groupName = strchr(*argv, '.');
-			if (groupName == NULL)
-				groupName = strchr(*argv, ':');
-			if (groupName) {
-				*groupName++ = '\0';
-				gid = strtoul(groupName, &p, 10);
-				if (groupName == p)
-					gid = my_getgrnam(groupName);
-			} else
-				gid = -1;
-		}
-
-
-		/* Find the selected user (if appropriate)  */
-		if (whichApp == CHOWN_APP) {
-			uid = strtoul(*argv, &p, 10);	/* if numeric ... */
-			if (*argv == p)
-				uid = my_getpwnam(*argv);
-		}
-	}
-
-	/* Ok, ready to do the deed now */
-	if (argc < 1) {
-		error_msg_and_die(too_few_args);
-	}
-	while (argc-- > 1) {
-		if (recursive_action (*(++argv), recursiveFlag, FALSE, FALSE, 
-					fileAction, fileAction, NULL) == FALSE)
-			return EXIT_FAILURE;
-	}
-	return EXIT_SUCCESS;
-
-}
-
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/
diff --git a/chown.c b/chown.c
new file mode 100644
index 0000000..f044a75
--- /dev/null
+++ b/chown.c
@@ -0,0 +1,108 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Mini chown/chmod/chgrp implementation for busybox
+ *
+ *
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "busybox.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_too_few_args
+#include "messages.c"
+
+
+/* Don't use lchown for libc5 or glibc older then 2.1.x */
+#if (__GLIBC__ < 2) && (__GLIBC_MINOR__ < 1)
+#define lchown	chown
+#endif
+
+static long uid = -1;
+static long gid = -1;
+
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+	if (lchown(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+		return (TRUE);
+	}
+	perror(fileName);
+	return (FALSE);
+}
+
+int chown_main(int argc, char **argv)
+{
+	int opt;
+	int recursiveFlag = FALSE;
+	char *groupName=NULL;
+	char *p=NULL;
+
+	/* do normal option parsing */
+	while ((opt = getopt(argc, argv, "R")) > 0) {
+		switch (opt) {
+			case 'R':
+				recursiveFlag = TRUE;
+			default:
+				show_usage();
+		}
+	}
+
+	if (argc > optind && argc > 2 && argv[optind]) {
+		/* First, check if there is a group name here */
+		groupName = strchr(argv[optind], '.');
+		if (groupName == NULL)
+			groupName = strchr(argv[optind], ':');
+		if (groupName) {
+			*groupName++ = '\0';
+			gid = strtoul(groupName, &p, 10);
+			if (groupName == p)
+				gid = my_getgrnam(groupName);
+		} else {
+			gid = -1;
+		}
+		/* Now check for the username */
+		uid = strtoul(argv[optind], &p, 10);	/* Is is numeric? */
+		if (argv[optind] == p) {
+			uid = my_getpwnam(argv[optind]);
+		}
+	} else {
+		error_msg_and_die(too_few_args);
+	}
+
+	/* Ok, ready to do the deed now */
+	while (optind++ < argc) {
+		if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, 
+					fileAction, fileAction, NULL) == FALSE) {
+			return EXIT_FAILURE;
+		}
+	}
+	return EXIT_SUCCESS;
+
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/coreutils/chgrp.c b/coreutils/chgrp.c
new file mode 100644
index 0000000..739d09f
--- /dev/null
+++ b/coreutils/chgrp.c
@@ -0,0 +1,94 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Mini chown/chmod/chgrp implementation for busybox
+ *
+ *
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "busybox.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_invalid_option
+#define bb_need_too_few_args
+#include "messages.c"
+
+/* Don't use lchown for libc5 or glibc older then 2.1.x */
+#if (__GLIBC__ < 2) && (__GLIBC_MINOR__ < 1)
+#define lchown	chown
+#endif
+
+
+static long gid = -1;
+
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+	if (lchown(fileName, statbuf->st_uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+		return (TRUE);
+	}
+	perror(fileName);
+	return (FALSE);
+}
+
+int chgrp_main(int argc, char **argv)
+{
+	int opt;
+	int recursiveFlag = FALSE;
+	char *p=NULL;
+
+	/* do normal option parsing */
+	while ((opt = getopt(argc, argv, "R")) > 0) {
+		switch (opt) {
+			case 'R':
+				recursiveFlag = TRUE;
+			default:
+				show_usage();
+		}
+	}
+
+	if (argc > optind && argc > 2 && argv[optind]) {
+		/* Find the selected group */
+		gid = strtoul(argv[optind], &p, 10);	/* maybe it's already numeric */
+		if (argv[optind] == p)
+			gid = my_getgrnam(argv[optind]);
+	} else {
+		error_msg_and_die(too_few_args);
+	}
+
+	/* Ok, ready to do the deed now */
+	while (optind++ < argc) {
+		if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, 
+					fileAction, fileAction, NULL) == FALSE) {
+			return EXIT_FAILURE;
+		}
+	}
+	return EXIT_SUCCESS;
+
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/coreutils/chmod.c b/coreutils/chmod.c
new file mode 100644
index 0000000..c3bef4e
--- /dev/null
+++ b/coreutils/chmod.c
@@ -0,0 +1,87 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Mini chown/chmod/chgrp implementation for busybox
+ *
+ *
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+#include "busybox.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_too_few_args
+#include "messages.c"
+
+
+struct stat *theMode;
+
+
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+	if (chmod(fileName, theMode->st_mode) == 0)
+		return (TRUE);
+	perror(fileName);
+	return (FALSE);
+}
+
+int chmod_main(int argc, char **argv)
+{
+	int opt;
+	int recursiveFlag = FALSE;
+
+	/* do normal option parsing */
+	while ((opt = getopt(argc, argv, "R")) > 0) {
+		switch (opt) {
+			case 'R':
+				recursiveFlag = TRUE;
+			default:
+				show_usage();
+		}
+	}
+
+	if (argc > optind && argc > 2 && argv[optind]) {
+		/* Parse the specified mode */
+		if (parse_mode(argv[optind], &(theMode->st_mode)) == FALSE) {
+			error_msg_and_die( "unknown mode: %s", argv[optind]);
+		}
+	} else {
+		error_msg_and_die(too_few_args);
+	}
+
+	/* Ok, ready to do the deed now */
+	while (optind++ < argc) {
+		if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, 
+					fileAction, fileAction, NULL) == FALSE) {
+			return EXIT_FAILURE;
+		}
+	}
+	return EXIT_SUCCESS;
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/coreutils/chown.c b/coreutils/chown.c
new file mode 100644
index 0000000..f044a75
--- /dev/null
+++ b/coreutils/chown.c
@@ -0,0 +1,108 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Mini chown/chmod/chgrp implementation for busybox
+ *
+ *
+ * Copyright (C) 1999,2000,2001 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "busybox.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_too_few_args
+#include "messages.c"
+
+
+/* Don't use lchown for libc5 or glibc older then 2.1.x */
+#if (__GLIBC__ < 2) && (__GLIBC_MINOR__ < 1)
+#define lchown	chown
+#endif
+
+static long uid = -1;
+static long gid = -1;
+
+static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
+{
+	if (lchown(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+		return (TRUE);
+	}
+	perror(fileName);
+	return (FALSE);
+}
+
+int chown_main(int argc, char **argv)
+{
+	int opt;
+	int recursiveFlag = FALSE;
+	char *groupName=NULL;
+	char *p=NULL;
+
+	/* do normal option parsing */
+	while ((opt = getopt(argc, argv, "R")) > 0) {
+		switch (opt) {
+			case 'R':
+				recursiveFlag = TRUE;
+			default:
+				show_usage();
+		}
+	}
+
+	if (argc > optind && argc > 2 && argv[optind]) {
+		/* First, check if there is a group name here */
+		groupName = strchr(argv[optind], '.');
+		if (groupName == NULL)
+			groupName = strchr(argv[optind], ':');
+		if (groupName) {
+			*groupName++ = '\0';
+			gid = strtoul(groupName, &p, 10);
+			if (groupName == p)
+				gid = my_getgrnam(groupName);
+		} else {
+			gid = -1;
+		}
+		/* Now check for the username */
+		uid = strtoul(argv[optind], &p, 10);	/* Is is numeric? */
+		if (argv[optind] == p) {
+			uid = my_getpwnam(argv[optind]);
+		}
+	} else {
+		error_msg_and_die(too_few_args);
+	}
+
+	/* Ok, ready to do the deed now */
+	while (optind++ < argc) {
+		if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, 
+					fileAction, fileAction, NULL) == FALSE) {
+			return EXIT_FAILURE;
+		}
+	}
+	return EXIT_SUCCESS;
+
+}
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/debian/Config.h-deb b/debian/Config.h-deb
index 038fd7c..ff912ef 100644
--- a/debian/Config.h-deb
+++ b/debian/Config.h-deb
@@ -10,7 +10,9 @@
 #define BB_AR
 #define BB_BASENAME
 #define BB_CAT
-#define BB_CHMOD_CHOWN_CHGRP
+#define BB_CHGRP
+#define BB_CHMOD
+#define BB_CHOWN
 #define BB_CHROOT
 #define BB_CHVT
 #define BB_CLEAR
diff --git a/debian/Config.h-static b/debian/Config.h-static
index ad26f8b..4068290 100644
--- a/debian/Config.h-static
+++ b/debian/Config.h-static
@@ -10,7 +10,9 @@
 #define BB_AR
 #define BB_BASENAME
 #define BB_CAT
-#define BB_CHMOD_CHOWN_CHGRP
+#define BB_CHGRP
+#define BB_CHMOD
+#define BB_CHOWN
 #define BB_CHROOT
 #define BB_CHVT
 #define BB_CLEAR
diff --git a/debian/Config.h-udeb b/debian/Config.h-udeb
index b669bb1..dee98f2 100644
--- a/debian/Config.h-udeb
+++ b/debian/Config.h-udeb
@@ -10,7 +10,9 @@
 //#define BB_AR
 #define BB_BASENAME
 #define BB_CAT
-#define BB_CHMOD_CHOWN_CHGRP
+#define BB_CHGRP
+#define BB_CHMOD
+#define BB_CHOWN
 #define BB_CHROOT
 #define BB_CHVT
 #define BB_CLEAR
diff --git a/include/applets.h b/include/applets.h
index d3399b9..0fd89c7 100644
--- a/include/applets.h
+++ b/include/applets.h
@@ -59,14 +59,14 @@
 #ifdef BB_CAT
 	APPLET(cat, cat_main, _BB_DIR_BIN)
 #endif
-#ifdef BB_CHMOD_CHOWN_CHGRP
-	APPLET(chgrp, chmod_chown_chgrp_main, _BB_DIR_BIN)
+#ifdef BB_CHGRP
+	APPLET(chgrp, chgrp_main, _BB_DIR_BIN)
 #endif
-#ifdef BB_CHMOD_CHOWN_CHGRP
-	APPLET(chmod, chmod_chown_chgrp_main, _BB_DIR_BIN)
+#ifdef BB_CHMOD
+	APPLET(chmod, chmod_main, _BB_DIR_BIN)
 #endif
-#ifdef BB_CHMOD_CHOWN_CHGRP
-	APPLET(chown, chmod_chown_chgrp_main, _BB_DIR_BIN)
+#ifdef BB_CHOWN
+	APPLET(chown, chown_main, _BB_DIR_BIN)
 #endif
 #ifdef BB_CHROOT
 	APPLET(chroot, chroot_main, _BB_DIR_USR_SBIN)
