Lots of updates.  Finished implementing BB_FEATURE_TRIVIAL_HELP
which lets you compile out most of the "--help" output, saving
up to 17k.

Renamed mnc to nc.
 -Erik
diff --git a/Changelog b/Changelog
index 0cd58ef..54ec8d6 100644
--- a/Changelog
+++ b/Changelog
@@ -3,6 +3,8 @@
             updated docs/busybox.pod accordingly.  -beppu
 	* Added mktemp, contributed by Daniel Jacobowitz <dan@debian.org>
 	* Added setkeycodes, for those that have wierd keyboard buttons.
+	* Added cut and tr from minix, since due to the license change, 
+	    we can now use minix code.  Minix tr saves 4k. 
 	* Fix for ping warnings from Sascha Ziemann <szi@aibon.ping.de>
 	* Fixed update segfault
 	* Fixed mknod -- minor number was always 0
@@ -18,9 +20,6 @@
 	    * added a simple id implementation; doesn't support sup. groups yet
 	* logname used getlogin(3) which uses utmp.  Now it doesn't. 
 	* whoami used getpwuid(3) which uses libc NSS.  Now it behaves. 
-	* Due to the license change, I can now use minix code.  Minux tr 
-	    replaces the BSD derived tr, saving 4k and eliminating bsearch(3) 
-	    from the list of used Libc symbols.
 	* Add support for "noatime" and "nodiratime" mount flags to mount.
 	* Changed 'umount -f' to mean force, and actually use umount2.
 	* Changed 'umount -l' to mean "Do not free loop device".
@@ -29,6 +28,9 @@
 	* More doc updates
 	* cp -fa now works as expected for symlinks (it didn't before)
 	* zcat now works (wasn't working since option parsing was broken)
+	* Renamed "mnc" to the more correct "nc".
+	* Added BB_FEATURE_TRIVIAL_HELP which compiles out most all of the
+	    help messages (i.e --help).  Saves 17k over a full compile.
 
 
 	 -Erik
diff --git a/Makefile b/Makefile
index 1ea5368..6323bd3 100644
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@
 # Set the following to `true' to make a debuggable build.
 # Leave this set to `false' for production use.
 # eg: `make DODEBUG=true tests'
-DODEBUG = true
+DODEBUG = false
 
 # If you want a static binary, turn this on.
 DOSTATIC = false
diff --git a/applets/busybox.c b/applets/busybox.c
index d8a38ad..85b42df 100644
--- a/applets/busybox.c
+++ b/applets/busybox.c
@@ -65,6 +65,9 @@
 #ifdef BB_CP_MV
 	{"cp", cp_mv_main, _BB_DIR_BIN},
 #endif
+#ifdef BB_CUT
+	{"cut", cut_main, _BB_DIR_USR_BIN},
+#endif
 #ifdef BB_DATE
 	{"date", date_main, _BB_DIR_BIN},
 #endif
@@ -203,8 +206,8 @@
 #ifdef BB_MKTEMP
 	{"mktemp", mktemp_main, _BB_DIR_BIN},
 #endif
-#ifdef BB_MNC
-	{"mnc", mnc_main, _BB_DIR_USR_BIN},
+#ifdef BB_NC
+	{"nc", nc_main, _BB_DIR_USR_BIN},
 #endif
 #ifdef BB_MORE
 	{"more", more_main, _BB_DIR_BIN},
diff --git a/archival/gunzip.c b/archival/gunzip.c
index bdf8dc2..11fc3a8 100644
--- a/archival/gunzip.c
+++ b/archival/gunzip.c
@@ -28,13 +28,17 @@
  */
 
 #include "internal.h"
+
 static const char gunzip_usage[] =
-	"gunzip [OPTION]... FILE\n\n"
-	"Uncompress FILE (or standard input if FILE is '-').\n\n"
+	"gunzip [OPTION]... FILE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nUncompress FILE (or standard input if FILE is '-').\n\n"
 	"Options:\n"
 
 	"\t-c\tWrite output to standard output\n"
-	"\t-t\tTest compressed file integrity\n";
+	"\t-t\tTest compressed file integrity\n"
+#endif
+	;
 
 	
 	/* These defines are very important for BusyBox.  Without these,
@@ -43,8 +47,9 @@
 #define SMALL_MEM
 #define DYN_ALLOC
 
-#define bb_need_name_too_long
 #define BB_DECLARE_EXTERN
+#define bb_need_memory_exhausted
+#define bb_need_name_too_long
 #include "messages.c"
 
 
@@ -206,7 +211,7 @@
 #  define DECLARE(type, array, size)  type * array
 #  define ALLOC(type, array, size) { \
       array = (type*)calloc((size_t)(((size)+1L)/2), 2*sizeof(type)); \
-      if (array == NULL) errorMsg("insufficient memory"); \
+      if (array == NULL) errorMsg(memory_exhausted, "gunzip"); \
    }
 #  define FREE(array) {if (array != NULL) free(array), array=NULL;}
 #else
@@ -1053,7 +1058,7 @@
 		int res = inflate();
 
 		if (res == 3) {
-			errorMsg("out of memory");
+			errorMsg(memory_exhausted, "gunzip");
 		} else if (res != 0) {
 			errorMsg("invalid compressed data--format violated");
 		}
diff --git a/archival/gzip.c b/archival/gzip.c
index cc6868b..17ebf6c 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -30,6 +30,9 @@
  */
 
 #include "internal.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_memory_exhausted
+#include "messages.c"
 
 /* These defines are very important for BusyBox.  Without these,
  * huge chunks of ram are pre-allocated making the BusyBox bss 
@@ -39,12 +42,15 @@
 
 
 static const char gzip_usage[] =
-	"gzip [OPTION]... FILE\n\n"
-	"Compress FILE with maximum compression.\n"
+	"gzip [OPTION]... FILE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCompress FILE with maximum compression.\n"
 	"When FILE is '-', reads standard input.  Implies -c.\n\n"
 
 	"Options:\n"
-	"\t-c\tWrite output to standard output instead of FILE.gz\n";
+	"\t-c\tWrite output to standard output instead of FILE.gz\n"
+#endif
+	;
 
 
 /* I don't like nested includes, but the string and io functions are used
@@ -121,7 +127,7 @@
 #  define DECLARE(type, array, size)  type * array
 #  define ALLOC(type, array, size) { \
       array = (type*)calloc((size_t)(((size)+1L)/2), 2*sizeof(type)); \
-      if (array == NULL) errorMsg("insufficient memory"); \
+      if (array == NULL) errorMsg(memory_exhausted, "gzip"); \
    }
 #  define FREE(array) {if (array != NULL) free(array), array=NULL;}
 #else
@@ -1778,7 +1784,6 @@
 long time_stamp;				/* original time stamp (modification time) */
 long ifile_size;				/* input file size, -1 for devices (debug only) */
 char *env;						/* contents of GZIP env variable */
-char **args = NULL;				/* argv pointer if GZIP env variable defined */
 char z_suffix[MAX_SUFFIX + 1];	/* default suffix (can be set with --suffix) */
 int z_len;						/* strlen(z_suffix) */
 
@@ -3248,7 +3253,7 @@
 	nargv = (char **) calloc(*argcp + 1, sizeof(char *));
 
 	if (nargv == NULL)
-		errorMsg("out of memory");
+		errorMsg(memory_exhausted, "gzip");
 	oargv = *argvp;
 	*argvp = nargv;
 
diff --git a/archival/tar.c b/archival/tar.c
index c82e51f..6784d80 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -60,8 +60,9 @@
 #if defined BB_FEATURE_TAR_EXCLUDE
 	"[--exclude File] "
 #endif
-	"[-f tarFile] [FILE] ...\n\n"
-	"Create, extract, or list files from a tar file.  Note that\n"
+	"[-f tarFile] [FILE] ...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate, extract, or list files from a tar file.  Note that\n"
 	"this version of tar treats hard links as separate files.\n\n"
 	"Main operation mode:\n"
 #ifdef BB_FEATURE_TAR_CREATE
@@ -77,6 +78,7 @@
 #endif
 	"\nInformative output:\n"
 	"\tv\t\tverbosely list files processed\n"
+#endif
 	;
 
 /* Tar file constants  */
diff --git a/busybox.c b/busybox.c
index d8a38ad..85b42df 100644
--- a/busybox.c
+++ b/busybox.c
@@ -65,6 +65,9 @@
 #ifdef BB_CP_MV
 	{"cp", cp_mv_main, _BB_DIR_BIN},
 #endif
+#ifdef BB_CUT
+	{"cut", cut_main, _BB_DIR_USR_BIN},
+#endif
 #ifdef BB_DATE
 	{"date", date_main, _BB_DIR_BIN},
 #endif
@@ -203,8 +206,8 @@
 #ifdef BB_MKTEMP
 	{"mktemp", mktemp_main, _BB_DIR_BIN},
 #endif
-#ifdef BB_MNC
-	{"mnc", mnc_main, _BB_DIR_USR_BIN},
+#ifdef BB_NC
+	{"nc", nc_main, _BB_DIR_USR_BIN},
 #endif
 #ifdef BB_MORE
 	{"more", more_main, _BB_DIR_BIN},
diff --git a/busybox.def.h b/busybox.def.h
index a2d216f..744db85 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -14,6 +14,7 @@
 #define BB_CHVT
 #define BB_CLEAR
 #define BB_CP_MV
+#define BB_CUT
 #define BB_DATE
 #define BB_DD
 #define BB_DEALLOCVT
@@ -60,7 +61,7 @@
 #define BB_MKNOD
 #define BB_MKSWAP
 #define BB_MKTEMP
-#define BB_MNC
+#define BB_NC
 #define BB_MORE
 #define BB_MOUNT
 #define BB_MT
@@ -134,7 +135,7 @@
 //
 // This compiles out everything but the most 
 // trivial --help usage information (i.e. reduces binary size)
-//#define BB_FEATURE_TRIVIAL_HELP
+#define BB_FEATURE_TRIVIAL_HELP
 //
 // Use termios to manipulate the screen ('more' is prettier with this on)
 //#define BB_FEATURE_USE_TERMIOS
diff --git a/console-tools/loadacm.c b/console-tools/loadacm.c
index 8f69234..cca5406 100644
--- a/console-tools/loadacm.c
+++ b/console-tools/loadacm.c
@@ -22,8 +22,11 @@
 #include <sys/ioctl.h>
 #include <sys/kd.h>
 
-static const char loadacm_usage[] = "loadacm\n\n"
-	"Loads an acm from standard input.\n";
+static const char loadacm_usage[] = "loadacm\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nLoads an acm from standard input.\n"
+#endif
+	;
 
 typedef unsigned short unicode;
 
diff --git a/console-tools/loadfont.c b/console-tools/loadfont.c
index 5e1f04d..7eaf40e 100644
--- a/console-tools/loadfont.c
+++ b/console-tools/loadfont.c
@@ -30,8 +30,11 @@
 #define PSF_MAXMODE    0x03
 #define PSF_SEPARATOR  0xFFFF
 
-static const char loadfont_usage[] = "loadfont\n\n"
-	"Loads a console font from standard input.\n";
+static const char loadfont_usage[] = "loadfont\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"Loads a console font from standard input.\n"
+#endif
+	;
 
 struct psf_header {
 	unsigned char magic1, magic2;	/* Magic number */
diff --git a/console-tools/loadkmap.c b/console-tools/loadkmap.c
index 75e52e1..99efc51 100644
--- a/console-tools/loadkmap.c
+++ b/console-tools/loadkmap.c
@@ -29,8 +29,11 @@
 #include <sys/ioctl.h>
 
 
-static const char loadkmap_usage[] = "loadkmap\n\n"
-	"Loads a binary keyboard translation table from standard input.\n";
+static const char loadkmap_usage[] = "loadkmap\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"Loads a binary keyboard translation table from standard input.\n"
+#endif
+	;
 
 
 int loadkmap_main(int argc, char **argv)
diff --git a/coreutils/cut.c b/coreutils/cut.c
new file mode 100644
index 0000000..89a934e
--- /dev/null
+++ b/coreutils/cut.c
@@ -0,0 +1,372 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * cut implementation for busybox
+ *
+ * Copyright (c) Michael J. Holme
+ *
+ * This version of cut is adapted from Minix cut and was modified 
+ * by Erik Andersen <andersee@debian.org> to be used in busybox.
+ *
+ * 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
+ * 
+ * Original copyright notice is retained at the end of this file.
+ */
+
+#include "internal.h"
+#include <sys/types.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
+
+#define MAX_FIELD	80			/* Pointers to the beginning of each field
+								   * are stored in columns[], if a line holds
+								   * more than MAX_FIELD columns the array
+								   * boundary is exceed. But unlikely at 80 */
+
+#define MAX_ARGS	32			/* Maximum number of fields following -f or
+								   * -c switches                                                      */
+int args[MAX_ARGS * 2];
+int num_args;
+
+/* Lots of new defines, should easen maintainance...			*/
+#define DUMP_STDIN	0			/* define for mode: no options   */
+#define OPTIONF		1			/* define for mode: option -f    */
+#define OPTIONC		2			/* define for mode: option -c    */
+#define OPTIONB		3			/* define for mode: option -b    */
+#define NOTSET		0			/* option not selected       */
+#define SET		1				/* option selected       */
+
+/* Defines for the warnings						*/
+#define DELIMITER_NOT_APPLICABLE	0
+#define OVERRIDING_PREVIOUS_MODE	1
+#define OPTION_NOT_APPLICABLE		2
+#define UNKNOWN_OPTION			3
+#define FILE_NOT_READABLE		4
+
+/* Defines for the fatal errors						*/
+#define SYNTAX_ERROR				101
+#define POSITION_ERROR				102
+#define LINE_TO_LONG_ERROR			103
+#define RANGE_ERROR					104
+#define MAX_FIELDS_EXEEDED_ERROR	105
+#define MAX_ARGS_EXEEDED_ERROR		106
+
+
+int mode;						/* 0 = dump stdin to stdout, 1=-f, 2=-c   */
+char delim = '\t';				/* default delimiting character   */
+FILE *fd;
+char *name;
+char line[BUFSIZ];
+int exit_status;
+
+int cut_main(int argc, char **argv);
+void warn(int warn_number, char *option);
+void cuterror(int err);
+void get_args(void);
+void cut(void);
+
+void warn(int warn_number, char *option)
+{
+	static char *warn_msg[] = {
+		"%s: Option -d allowed only with -f\n",
+		"%s: -%s overrides earlier option\n",
+		"%s: -%s not allowed in current mode\n",
+		"%s: Cannot open %s\n"
+	};
+
+	fprintf(stderr, warn_msg[warn_number], name, option);
+	exit_status = warn_number + 1;
+
+}
+
+void cuterror(int err)
+{
+	static char *err_mes[] = {
+		"%s: syntax error\n",
+		"%s: position must be >0\n",
+		"%s: line longer than BUFSIZ\n",
+		"%s: range must not decrease from left to right\n",
+		"%s: MAX_FIELD exceeded\n",
+		"%s: MAX_ARGS exceeded\n"
+	};
+
+	fprintf(stderr, err_mes[err - 101], name);
+	exit(err);
+}
+
+
+void get_args()
+{
+	int i = 0;
+	int arg_ptr = 0;
+	int flag;
+
+	num_args = 0;
+	do {
+		if (num_args == MAX_ARGS)
+			cuterror(MAX_ARGS_EXEEDED_ERROR);
+		if (!isdigit(line[i]) && line[i] != '-')
+			cuterror(SYNTAX_ERROR);
+
+		args[arg_ptr] = 1;
+		args[arg_ptr + 1] = BUFSIZ;
+		flag = 1;
+
+		while (line[i] != ',' && line[i] != 0) {
+			if (isdigit(line[i])) {
+				args[arg_ptr] = 0;
+				while (isdigit(line[i]))
+					args[arg_ptr] = 10 * args[arg_ptr] + line[i++] - '0';
+				if (!args[arg_ptr])
+					cuterror(POSITION_ERROR);
+				arg_ptr++;
+			}
+			if (line[i] == '-') {
+				arg_ptr |= 1;
+				i++;
+				flag = 0;
+			}
+		}
+		if (flag && arg_ptr & 1)
+			args[arg_ptr] = args[arg_ptr - 1];
+		if (args[num_args * 2] > args[num_args * 2 + 1])
+			cuterror(RANGE_ERROR);
+		num_args++;
+		arg_ptr = num_args * 2;
+	}
+	while (line[i++]);
+}
+
+
+void cut()
+{
+	int i, j, length, maxcol=0;
+	char *columns[MAX_FIELD];
+
+	while (fgets(line, BUFSIZ, fd)) {
+		length = strlen(line) - 1;
+		*(line + length) = 0;
+		switch (mode) {
+		case DUMP_STDIN:
+			printf("%s", line);
+			break;
+		case OPTIONF:
+			columns[maxcol++] = line;
+			for (i = 0; i < length; i++) {
+				if (*(line + i) == delim) {
+					*(line + i) = 0;
+					if (maxcol == MAX_FIELD)
+						cuterror(MAX_FIELDS_EXEEDED_ERROR);
+					columns[maxcol] = line + i + 1;
+					maxcol++;
+				}
+			}
+			if (maxcol != 1) { 
+				for (i = 0; i < num_args; i++) {
+					for (j = args[i * 2]; j <= args[i * 2 + 1]; j++)
+						if (j <= maxcol) {
+							printf("%s", columns[j - 1]);
+							if (i != num_args - 1 || j != args[i * 2 + 1])
+								putchar(delim);
+						}
+				}
+			}
+			break;
+		case OPTIONC:
+			for (i = 0; i < num_args; i++) {
+				for (j = args[i * 2];
+					 j <= (args[i * 2 + 1] >
+						   length ? length : args[i * 2 + 1]); j++)
+					putchar(*(line + j - 1));
+			}
+		}
+		if (maxcol != 1)
+			putchar('\n');
+	}
+}
+
+
+int cut_main(int argc, char **argv)
+{
+	int i = 1;
+	int numberFilenames = 0;
+
+	name = argv[0];
+
+	if (argc == 1 || strcmp(argv[1], dash_dash_help)==0)
+		usage( "cut [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nPrints selected fields from each input FILE to standard output.\n\n"
+				"Options:\n"
+				"\t-b LIST\tOutput only bytes from LIST\n"
+				"\t-c LIST\tOutput only characters from LIST\n"
+				"\t-d DELIM\tUse DELIM instead of tab as the field delimiter\n"
+				"\t-f N\tPrint only these fields\n"
+				"\t-n\tIgnored\n"
+#endif
+				);
+
+	while (i < argc) {
+		if (argv[i][0] == '-') {
+			switch (argv[i++][1]) {
+			case 'd':
+				if (mode == OPTIONC || mode == OPTIONB)
+					warn(DELIMITER_NOT_APPLICABLE, "d");
+				delim = argv[i++][0];
+				break;
+			case 'f':
+				sprintf(line, "%s", argv[i++]);
+				if (mode == OPTIONC || mode == OPTIONB)
+					warn(OVERRIDING_PREVIOUS_MODE, "f");
+				mode = OPTIONF;
+				break;
+			case 'b':
+				sprintf(line, "%s", argv[i++]);
+				if (mode == OPTIONF || mode == OPTIONC)
+					warn(OVERRIDING_PREVIOUS_MODE, "b");
+				mode = OPTIONB;
+				break;
+			case 'c':
+				sprintf(line, "%s", argv[i++]);
+				if (mode == OPTIONF || mode == OPTIONB)
+					warn(OVERRIDING_PREVIOUS_MODE, "c");
+				mode = OPTIONC;
+				break;
+			case '\0':			/* - means: read from stdin      */
+				numberFilenames++;
+				break;
+			case 'n':			/* needed for Posix, but no effect here  */
+				if (mode != OPTIONB)
+					warn(OPTION_NOT_APPLICABLE, "n");
+				break;
+			default:
+				warn(UNKNOWN_OPTION, &(argv[i - 1][1]));
+			}
+		} else {
+			i++;
+			numberFilenames++;
+		}
+	}
+
+/* Here follow the checks, if the selected options are reasonable.	*/
+	if (mode == OPTIONB)		/* since in Minix char := byte       */
+		mode = OPTIONC;
+	get_args();
+	if (numberFilenames != 0) {
+		i = 1;
+		while (i < argc) {
+			if (argv[i][0] == '-') {
+				switch (argv[i][1]) {
+				case 'f':
+				case 'c':
+				case 'b':
+				case 'd':
+					i += 2;
+					break;
+				case 'n':
+				case 'i':
+				case 's':
+					i++;
+					break;
+				case '\0':
+					fd = stdin;
+					i++;
+					cut();
+					break;
+				default:
+					i++;
+				}
+			} else {
+				if ((fd = fopen(argv[i++], "r")) == NULL) {
+					warn(FILE_NOT_READABLE, argv[i - 1]);
+				} else {
+					cut();
+					fclose(fd);
+				}
+			}
+		}
+	} else {
+		fd = stdin;
+		cut();
+	}
+
+	exit(exit_status);
+}
+
+/* cut - extract columns from a file or stdin. 	Author: Michael J. Holme
+ *
+ *	Copyright 1989, Michael John Holme, All rights reserved.
+ *	This code may be freely distributed, provided that this notice
+ *	remains intact.
+ *
+ *	V1.1: 6th September 1989
+ *
+ *	Bugs, criticisms, etc,
+ *      c/o Mark Powell
+ *          JANET sq79@uk.ac.liv
+ *          ARPA  sq79%liv.ac.uk@nsfnet-relay.ac.uk
+ *          UUCP  ...!mcvax!ukc!liv.ac.uk!sq79
+ *-------------------------------------------------------------------------
+ *	Changed for POSIX1003.2/Draft10 conformance
+ *	Thomas Brupbacher (tobr@mw.lpc.ethz.ch), September 1990.
+ *	Changes:
+ *	    - separation of error messages ( stderr) and output (stdout).
+ *	    - support for -b and -n (no effect, -b acts as -c)
+ *	    - support for -s
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Copyright (c) 1987,1997, Prentice Hall
+ * All rights reserved.
+ * 
+ * Redistribution and use of the MINIX operating system in source and
+ * binary forms, with or without modification, are permitted provided
+ * that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * 
+ * Neither the name of Prentice Hall nor the names of the software
+ * authors or contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+
diff --git a/coreutils/head.c b/coreutils/head.c
index 3db64b3..f4ebe05 100644
--- a/coreutils/head.c
+++ b/coreutils/head.c
@@ -27,12 +27,15 @@
 #include <stdio.h>
 
 const char head_usage[] =
-	"head [OPTION] [FILE]...\n\n"
-	"Print first 10 lines of each FILE to standard output.\n"
+	"head [OPTION] [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint first 10 lines of each FILE to standard output.\n"
 	"With more than one FILE, precede each with a header giving the\n"
 	"file name. With no FILE, or when FILE is -, read standard input.\n\n"
 
-	"Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n";
+	"Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n"
+#endif
+	;
 
 int head(int len, FILE * src)
 {
@@ -109,4 +112,4 @@
 	exit(0);
 }
 
-/* $Id: head.c,v 1.9 2000/04/13 01:18:56 erik Exp $ */
+/* $Id: head.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */
diff --git a/coreutils/id.c b/coreutils/id.c
index 8ded0e5..542f865 100644
--- a/coreutils/id.c
+++ b/coreutils/id.c
@@ -29,11 +29,14 @@
 #include <sys/types.h>
 
 static const char id_usage[] =
-	"id [OPTIONS]... [USERNAME]\n\n"
-	"Print information for USERNAME or the current user\n\n"
+	"id [OPTIONS]... [USERNAME]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint information for USERNAME or the current user\n\n"
 	"\t-g\tprints only the group ID\n"
 	"\t-u\tprints only the user ID\n"
-	"\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n";
+	"\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n"
+#endif
+	;
 
 extern int id_main(int argc, char **argv)
 {
diff --git a/coreutils/length.c b/coreutils/length.c
index 4cbe7e1..c7df216 100644
--- a/coreutils/length.c
+++ b/coreutils/length.c
@@ -7,7 +7,11 @@
 extern int length_main(int argc, char **argv)
 {
 	if (argc != 2 || **(argv + 1) == '-') {
-		usage("length string\n");
+		usage("length STRING\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nPrints out the length of the specified STRING.\n"
+#endif
+				);
 	}
 	printf("%lu\n", (long)strlen(argv[1]));
 	return (TRUE);
diff --git a/coreutils/ln.c b/coreutils/ln.c
index eb7c996..29ff938 100644
--- a/coreutils/ln.c
+++ b/coreutils/ln.c
@@ -32,13 +32,16 @@
 #include <errno.h>
 
 static const char ln_usage[] =
-	"ln [OPTION] TARGET... LINK_NAME|DIRECTORY\n\n"
-	"Create a link named LINK_NAME or DIRECTORY to the specified TARGET\n\n"
+	"ln [OPTION] TARGET... LINK_NAME|DIRECTORY\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate a link named LINK_NAME or DIRECTORY to the specified TARGET\n\n"
 	"Options:\n"
 	"\t-s\tmake symbolic links instead of hard links\n"
 
 	"\t-f\tremove existing destination files\n"
-	"\t-n\tno dereference symlinks - treat like normal file\n";
+	"\t-n\tno dereference symlinks - treat like normal file\n"
+#endif
+	;
 
 static int symlinkFlag = FALSE;
 static int removeoldFlag = FALSE;
diff --git a/coreutils/logname.c b/coreutils/logname.c
index bde1752..7c6153f 100644
--- a/coreutils/logname.c
+++ b/coreutils/logname.c
@@ -23,9 +23,11 @@
 #include "internal.h"
 #include <stdio.h>
 
-static const char logname_usage[] = "logname\n\n"
-
-	"Print the name of the current user.\n";
+static const char logname_usage[] = "logname\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint the name of the current user.\n"
+#endif
+	;
 
 extern int logname_main(int argc, char **argv)
 {
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 3c518ab..6ab11c4 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -449,7 +449,9 @@
 #ifdef BB_FEATURE_LS_FILETYPES
 	"F"
 #endif
-	"] [filenames...]\n\n"
+	"] [filenames...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nList directory contents\n\n"
 	"Options:\n"
 	"\t-a\tdo not hide entries starting with .\n"
 #ifdef BB_FEATURE_LS_TIMESTAMPS
@@ -475,6 +477,7 @@
 #ifdef BB_FEATURE_LS_FILETYPES
 	"\t-F\tappend indicator (one of */=@|) to entries\n"
 #endif
+#endif
 	;
 
 extern int ls_main(int argc, char **argv)
diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c
index 54d9b72..9664986 100644
--- a/coreutils/mkdir.c
+++ b/coreutils/mkdir.c
@@ -30,12 +30,15 @@
 #include <errno.h>
 
 static const char mkdir_usage[] =
-	"mkdir [OPTION] DIRECTORY...\n\n"
-	"Create the DIRECTORY(ies), if they do not already exist\n\n"
+	"mkdir [OPTION] DIRECTORY...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate the DIRECTORY(ies), if they do not already exist\n\n"
 	"Options:\n"
 
 	"\t-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n"
-	"\t-p\tno error if existing, make parent directories as needed\n";
+	"\t-p\tno error if existing, make parent directories as needed\n"
+#endif
+	;
 
 
 static int parentFlag = FALSE;
diff --git a/coreutils/mkfifo.c b/coreutils/mkfifo.c
index b273df0..ef3d667 100644
--- a/coreutils/mkfifo.c
+++ b/coreutils/mkfifo.c
@@ -26,11 +26,13 @@
 #include <sys/stat.h>
 #include <errno.h>
 
-static const char mkfifo_usage[] = "mkfifo [OPTIONS] name\n\n"
-	"Creates a named pipe (identical to 'mknod name p')\n\n"
-
+static const char mkfifo_usage[] = "mkfifo [OPTIONS] name\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreates a named pipe (identical to 'mknod name p')\n\n"
 	"Options:\n"
-	"\t-m\tcreate the pipe using the specified mode (default a=rw)\n";
+	"\t-m\tcreate the pipe using the specified mode (default a=rw)\n"
+#endif
+	;
 
 extern int mkfifo_main(int argc, char **argv)
 {
diff --git a/coreutils/mknod.c b/coreutils/mknod.c
index caa234f..8f411a3 100644
--- a/coreutils/mknod.c
+++ b/coreutils/mknod.c
@@ -28,14 +28,17 @@
 #include <fcntl.h>
 #include <unistd.h>
 
-static const char mknod_usage[] = "mknod [OPTIONS] NAME TYPE MAJOR MINOR\n\n"
-	"Create a special file (block, character, or pipe).\n\n"
+static const char mknod_usage[] = "mknod [OPTIONS] NAME TYPE MAJOR MINOR\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate a special file (block, character, or pipe).\n\n"
 	"Options:\n"
 	"\t-m\tcreate the special file using the specified mode (default a=rw)\n\n"
 	"TYPEs include:\n"
 	"\tb:\tMake a block (buffered) device.\n"
 	"\tc or u:\tMake a character (un-buffered) device.\n"
-	"\tp:\tMake a named pipe. MAJOR and MINOR are ignored for named pipes.\n";
+	"\tp:\tMake a named pipe. MAJOR and MINOR are ignored for named pipes.\n"
+#endif
+	;
 
 int mknod_main(int argc, char **argv)
 {
diff --git a/coreutils/printf.c b/coreutils/printf.c
index bfe4081..28a011d 100644
--- a/coreutils/printf.c
+++ b/coreutils/printf.c
@@ -139,7 +139,12 @@
 /* The value to return to the calling program.  */
 static int exit_status;
 
-static const char printf_usage[] = "printf format [argument...]\n\nFormats and prints the given data.\n";
+static const char printf_usage[] = "printf FORMAT [ARGUMENT...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nFormats and prints ARGUMENT(s) according to FORMAT,\n"
+	"Where FORMAT controls the output exactly as in C printf.\n"
+#endif
+	;
 
 int printf_main(int argc, char **argv)
 {
diff --git a/coreutils/pwd.c b/coreutils/pwd.c
index e77a0ca..19494a9 100644
--- a/coreutils/pwd.c
+++ b/coreutils/pwd.c
@@ -24,15 +24,14 @@
 #include "internal.h"
 #include <stdio.h>
 #include <dirent.h>
+#include <errno.h>
 
 extern int pwd_main(int argc, char **argv)
 {
 	char buf[BUFSIZ + 1];
 
-	if (getcwd(buf, sizeof(buf)) == NULL) {
-		perror("get working directory");
-		exit(FALSE);
-	}
+	if (getcwd(buf, sizeof(buf)) == NULL)
+		fatalError("pwd: %s", strerror(errno));
 
 	printf("%s\n", buf);
 	exit(TRUE);
diff --git a/coreutils/rm.c b/coreutils/rm.c
index 0cd7956..c62d68a 100644
--- a/coreutils/rm.c
+++ b/coreutils/rm.c
@@ -29,12 +29,14 @@
 #include <dirent.h>
 #include <errno.h>
 
-static const char *rm_usage = "rm [OPTION]... FILE...\n\n"
-	"Remove (unlink) the FILE(s).\n\n"
+static const char *rm_usage = "rm [OPTION]... FILE...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nRemove (unlink) the FILE(s).\n\n"
 	"Options:\n"
-
 	"\t-f\t\tremove existing destinations, never prompt\n"
-	"\t-r or -R\tremove the contents of directories recursively\n";
+	"\t-r or -R\tremove the contents of directories recursively\n"
+#endif
+	;
 
 
 static int recursiveFlag = FALSE;
diff --git a/coreutils/rmdir.c b/coreutils/rmdir.c
index 1d88de3..61d7f2a 100644
--- a/coreutils/rmdir.c
+++ b/coreutils/rmdir.c
@@ -31,7 +31,11 @@
 {
 	if (argc == 1 || **(argv + 1) == '-') {
 		usage
-			("rmdir [OPTION]... DIRECTORY...\n\nRemove the DIRECTORY(ies), if they are empty.\n");
+			("rmdir [OPTION]... DIRECTORY...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+			 "\nRemove the DIRECTORY(ies), if they are empty.\n"
+#endif
+			 );
 	}
 
 	while (--argc > 0) {
diff --git a/coreutils/sleep.c b/coreutils/sleep.c
index 9687b84..13f07c0 100644
--- a/coreutils/sleep.c
+++ b/coreutils/sleep.c
@@ -24,7 +24,11 @@
 #include "internal.h"
 #include <stdio.h>
 
-const char sleep_usage[] = "sleep N\n\n" "Pause for N seconds.\n";
+const char sleep_usage[] = "sleep N\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPause for N seconds.\n"
+#endif
+	;
 
 extern int sleep_main(int argc, char **argv)
 {
diff --git a/coreutils/sort.c b/coreutils/sort.c
index 49eb4fd..1edc7d1 100644
--- a/coreutils/sort.c
+++ b/coreutils/sort.c
@@ -33,7 +33,11 @@
 #ifdef BB_FEATURE_SORT_REVERSE
 " [-r]"
 #endif
-" [FILE]...\n\nSorts lines of text in the specified files\n";
+" [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+"\nSorts lines of text in the specified files\n"
+#endif
+;
 
 #ifdef BB_FEATURE_SORT_REVERSE
 #define APPLY_REVERSE(x) (reverse ? -(x) : (x))
@@ -300,4 +304,4 @@
 	exit(0);
 }
 
-/* $Id: sort.c,v 1.15 2000/04/17 04:22:09 beppu Exp $ */
+/* $Id: sort.c,v 1.16 2000/05/12 19:41:47 erik Exp $ */
diff --git a/coreutils/sync.c b/coreutils/sync.c
index f8160c8..33c7922 100644
--- a/coreutils/sync.c
+++ b/coreutils/sync.c
@@ -27,7 +27,11 @@
 extern int sync_main(int argc, char **argv)
 {
 	if (argc > 1 && **(argv + 1) == '-') {
-		usage("sync\n\nWrite all buffered filesystem blocks to disk.\n");
+		usage("sync\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nWrite all buffered filesystem blocks to disk.\n"
+#endif
+				);
 	}
 	exit(sync());
 }
diff --git a/coreutils/tail.c b/coreutils/tail.c
index 321c5c4..3b3e2f5 100644
--- a/coreutils/tail.c
+++ b/coreutils/tail.c
@@ -47,6 +47,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <ctype.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
 
 #define XWRITE(fd, buffer, n_bytes)					\
@@ -70,15 +73,18 @@
 static int print_headers;
 
 const char tail_usage[] =
-	"tail [OPTION] [FILE]...\n\n"
-	"Print last 10 lines of each FILE to standard output.\n"
+	"tail [OPTION] [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint last 10 lines of each FILE to standard output.\n"
 	"With more than one FILE, precede each with a header giving the\n"
 	"file name. With no FILE, or when FILE is -, read standard input.\n\n"
 	"Options:\n"
 	"\t-n NUM\t\tPrint last NUM lines instead of first 10\n"
 
 	"\t-f\t\tOutput data as the file grows.  This version\n"
-	"\t\t\tof 'tail -f' supports only one file at a time.\n";
+	"\t\t\tof 'tail -f' supports only one file at a time.\n"
+#endif
+	;
 
 
 static void write_header(const char *filename)
@@ -512,9 +518,9 @@
 static int have_read_stdin;
 
 
-static const char tail_usage[] = "tail [OPTION]... [FILE]...\n\
-\n\
-Print last 10 lines of each FILE to standard output.\n\
+static const char tail_usage[] = "tail [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+"\nPrint last 10 lines of each FILE to standard output.\n\
 With more than one FILE, precede each with a header giving the file name.\n\
 With no FILE, or when FILE is -, read standard input.\n\
 \n\
@@ -523,11 +529,12 @@
   -n=N            output the last N lines, instead of last 10\n\
   -q              never output headers giving file names\n\
   -v              always output headers giving file names\n\
-  --help          display this help and exit\n\
 \n\
 If the first character of N (bytes or lines) is a `+', output begins with \n\
 the Nth item from the start of each file, otherwise, print the last N items\n\
-in the file.  N bytes may be suffixed by k (x1024), b (x512), or m (1024^2).\n\n";
+in the file.  N bytes may be suffixed by k (x1024), b (x512), or m (1024^2).\n"
+#endif
+;
 
 static void write_header(const char *filename, const char *comment)
 {
diff --git a/coreutils/tee.c b/coreutils/tee.c
index 95b75ed..a78edc0 100644
--- a/coreutils/tee.c
+++ b/coreutils/tee.c
@@ -27,12 +27,14 @@
 #include <stdio.h>
 
 static const char tee_usage[] =
-	"tee [OPTION]... [FILE]...\n\n"
-	"Copy standard input to each FILE, and also to standard output.\n\n"
+	"tee [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCopy standard input to each FILE, and also to standard output.\n\n"
 	"Options:\n" "\t-a\tappend to the given FILEs, do not overwrite\n"
 #if 0
 	"\t-i\tignore interrupt signals\n"
 #endif
+#endif
 ;
 
 
@@ -131,4 +133,4 @@
 	exit(0);
 }
 
-/* $Id: tee.c,v 1.9 2000/04/13 01:18:56 erik Exp $ */
+/* $Id: tee.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */
diff --git a/coreutils/test.c b/coreutils/test.c
index 0ed7771..9b541e3 100644
--- a/coreutils/test.c
+++ b/coreutils/test.c
@@ -39,6 +39,9 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
 /* test(1) accepts the following grammar:
 	oexpr	::= aexpr | aexpr "-o" oexpr ;
@@ -185,11 +188,14 @@
 			fatalError("missing ]");
 		argv[argc] = NULL;
 	}
-	if (strcmp(argv[1], "--help") == 0) {
+	if (strcmp(argv[1], dash_dash_help) == 0) {
 		usage("test EXPRESSION\n"
-			  "or   [ EXPRESSION ]\n\n"
-				"Checks file types and compares values returning an exit\n"
-				"code determined by the value of EXPRESSION.\n");
+			  "or   [ EXPRESSION ]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nChecks file types and compares values returning an exit\n"
+				"code determined by the value of EXPRESSION.\n"
+#endif
+				);
 	}
 
 	/* Implement special cases from POSIX.2, section 4.62.4 */
diff --git a/coreutils/touch.c b/coreutils/touch.c
index f8972dc..2076928 100644
--- a/coreutils/touch.c
+++ b/coreutils/touch.c
@@ -31,9 +31,11 @@
 #include <errno.h>
 
 
-static const char touch_usage[] = "touch [-c] file [file ...]\n\n"
-
-	"Update the last-modified date on the given file[s].\n";
+static const char touch_usage[] = "touch [-c] file [file ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nUpdate the last-modified date on the given file[s].\n"
+#endif
+	;
 
 
 
diff --git a/coreutils/tty.c b/coreutils/tty.c
index 6f98d1b..3a318eb 100644
--- a/coreutils/tty.c
+++ b/coreutils/tty.c
@@ -24,10 +24,13 @@
 #include <stdio.h>
 #include <sys/types.h>
 
-static const char tty_usage[] = "tty\n\n"
-	"Print the file name of the terminal connected to standard input.\n\n"
+static const char tty_usage[] = "tty\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint the file name of the terminal connected to standard input.\n\n"
 	"Options:\n"
-	"\t-s\tprint nothing, only return an exit status\n";
+	"\t-s\tprint nothing, only return an exit status\n"
+#endif
+	;
 
 extern int tty_main(int argc, char **argv)
 {
diff --git a/coreutils/uniq.c b/coreutils/uniq.c
index 0324856..0cccbd5 100644
--- a/coreutils/uniq.c
+++ b/coreutils/uniq.c
@@ -28,9 +28,12 @@
 #include <errno.h>
 
 static const char uniq_usage[] =
-	"uniq [OPTION]... [INPUT [OUTPUT]]\n\n"
-	"Discard all but one of successive identical lines from INPUT\n"
-	"(or standard input), writing to OUTPUT (or standard output).\n";
+	"uniq [OPTION]... [INPUT [OUTPUT]]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nDiscard all but one of successive identical lines from INPUT\n"
+	"(or standard input), writing to OUTPUT (or standard output).\n"
+#endif
+	;
 
 /* max chars in line */
 #define UNIQ_MAX 4096
@@ -184,4 +187,4 @@
 	exit(0);
 }
 
-/* $Id: uniq.c,v 1.9 2000/04/17 16:16:10 erik Exp $ */
+/* $Id: uniq.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */
diff --git a/coreutils/usleep.c b/coreutils/usleep.c
index dcb40d6..34008a6 100644
--- a/coreutils/usleep.c
+++ b/coreutils/usleep.c
@@ -25,7 +25,11 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-const char usleep_usage[] = "usleep N\n\n" "Pause for N microseconds.\n";
+const char usleep_usage[] = "usleep N\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPause for N microseconds.\n"
+#endif
+	;
 
 extern int usleep_main(int argc, char **argv)
 {
diff --git a/coreutils/wc.c b/coreutils/wc.c
index 030afa9..57bc713 100644
--- a/coreutils/wc.c
+++ b/coreutils/wc.c
@@ -23,15 +23,18 @@
 #include "internal.h"
 #include <stdio.h>
 
-static const char wc_usage[] = "wc [OPTION]... [FILE]...\n\n"
-	"Print line, word, and byte counts for each FILE, and a total line if\n"
+static const char wc_usage[] = "wc [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint line, word, and byte counts for each FILE, and a total line if\n"
 	"more than one FILE is specified.  With no FILE, read standard input.\n\n"
 	"Options:\n"
 	"\t-c\tprint the byte counts\n"
 	"\t-l\tprint the newline counts\n"
 
 	"\t-L\tprint the length of the longest line\n"
-	"\t-w\tprint the word counts\n";
+	"\t-w\tprint the word counts\n"
+#endif
+	;
 
 static int total_lines, total_words, total_chars, max_length;
 static int print_lines, print_words, print_chars, print_length;
diff --git a/coreutils/whoami.c b/coreutils/whoami.c
index f9d3f28..da58479 100644
--- a/coreutils/whoami.c
+++ b/coreutils/whoami.c
@@ -24,8 +24,11 @@
 #include <stdio.h>
 #include <pwd.h>
 
-static const char whoami_usage[] = "whoami\n\n"
-	"Prints the user name associated with the current effective user id.\n";
+static const char whoami_usage[] = "whoami\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrints the user name associated with the current effective user id.\n"
+#endif
+	;
 
 extern int whoami_main(int argc, char **argv)
 {
diff --git a/coreutils/yes.c b/coreutils/yes.c
index a822ebc..97b6f65 100644
--- a/coreutils/yes.c
+++ b/coreutils/yes.c
@@ -28,8 +28,11 @@
 	int i;
 
 	if (argc >=1 && *argv[1]=='-') {
-		usage("yes [OPTION]... [STRING]...\n\n"
-				"Repeatedly outputs a line with all specified STRING(s), or `y'.\n");
+		usage("yes [OPTION]... [STRING]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nRepeatedly outputs a line with all specified STRING(s), or `y'.\n"
+#endif
+				);
 	}
 
 	if (argc == 1) {
diff --git a/cut.c b/cut.c
new file mode 100644
index 0000000..89a934e
--- /dev/null
+++ b/cut.c
@@ -0,0 +1,372 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * cut implementation for busybox
+ *
+ * Copyright (c) Michael J. Holme
+ *
+ * This version of cut is adapted from Minix cut and was modified 
+ * by Erik Andersen <andersee@debian.org> to be used in busybox.
+ *
+ * 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
+ * 
+ * Original copyright notice is retained at the end of this file.
+ */
+
+#include "internal.h"
+#include <sys/types.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
+
+#define MAX_FIELD	80			/* Pointers to the beginning of each field
+								   * are stored in columns[], if a line holds
+								   * more than MAX_FIELD columns the array
+								   * boundary is exceed. But unlikely at 80 */
+
+#define MAX_ARGS	32			/* Maximum number of fields following -f or
+								   * -c switches                                                      */
+int args[MAX_ARGS * 2];
+int num_args;
+
+/* Lots of new defines, should easen maintainance...			*/
+#define DUMP_STDIN	0			/* define for mode: no options   */
+#define OPTIONF		1			/* define for mode: option -f    */
+#define OPTIONC		2			/* define for mode: option -c    */
+#define OPTIONB		3			/* define for mode: option -b    */
+#define NOTSET		0			/* option not selected       */
+#define SET		1				/* option selected       */
+
+/* Defines for the warnings						*/
+#define DELIMITER_NOT_APPLICABLE	0
+#define OVERRIDING_PREVIOUS_MODE	1
+#define OPTION_NOT_APPLICABLE		2
+#define UNKNOWN_OPTION			3
+#define FILE_NOT_READABLE		4
+
+/* Defines for the fatal errors						*/
+#define SYNTAX_ERROR				101
+#define POSITION_ERROR				102
+#define LINE_TO_LONG_ERROR			103
+#define RANGE_ERROR					104
+#define MAX_FIELDS_EXEEDED_ERROR	105
+#define MAX_ARGS_EXEEDED_ERROR		106
+
+
+int mode;						/* 0 = dump stdin to stdout, 1=-f, 2=-c   */
+char delim = '\t';				/* default delimiting character   */
+FILE *fd;
+char *name;
+char line[BUFSIZ];
+int exit_status;
+
+int cut_main(int argc, char **argv);
+void warn(int warn_number, char *option);
+void cuterror(int err);
+void get_args(void);
+void cut(void);
+
+void warn(int warn_number, char *option)
+{
+	static char *warn_msg[] = {
+		"%s: Option -d allowed only with -f\n",
+		"%s: -%s overrides earlier option\n",
+		"%s: -%s not allowed in current mode\n",
+		"%s: Cannot open %s\n"
+	};
+
+	fprintf(stderr, warn_msg[warn_number], name, option);
+	exit_status = warn_number + 1;
+
+}
+
+void cuterror(int err)
+{
+	static char *err_mes[] = {
+		"%s: syntax error\n",
+		"%s: position must be >0\n",
+		"%s: line longer than BUFSIZ\n",
+		"%s: range must not decrease from left to right\n",
+		"%s: MAX_FIELD exceeded\n",
+		"%s: MAX_ARGS exceeded\n"
+	};
+
+	fprintf(stderr, err_mes[err - 101], name);
+	exit(err);
+}
+
+
+void get_args()
+{
+	int i = 0;
+	int arg_ptr = 0;
+	int flag;
+
+	num_args = 0;
+	do {
+		if (num_args == MAX_ARGS)
+			cuterror(MAX_ARGS_EXEEDED_ERROR);
+		if (!isdigit(line[i]) && line[i] != '-')
+			cuterror(SYNTAX_ERROR);
+
+		args[arg_ptr] = 1;
+		args[arg_ptr + 1] = BUFSIZ;
+		flag = 1;
+
+		while (line[i] != ',' && line[i] != 0) {
+			if (isdigit(line[i])) {
+				args[arg_ptr] = 0;
+				while (isdigit(line[i]))
+					args[arg_ptr] = 10 * args[arg_ptr] + line[i++] - '0';
+				if (!args[arg_ptr])
+					cuterror(POSITION_ERROR);
+				arg_ptr++;
+			}
+			if (line[i] == '-') {
+				arg_ptr |= 1;
+				i++;
+				flag = 0;
+			}
+		}
+		if (flag && arg_ptr & 1)
+			args[arg_ptr] = args[arg_ptr - 1];
+		if (args[num_args * 2] > args[num_args * 2 + 1])
+			cuterror(RANGE_ERROR);
+		num_args++;
+		arg_ptr = num_args * 2;
+	}
+	while (line[i++]);
+}
+
+
+void cut()
+{
+	int i, j, length, maxcol=0;
+	char *columns[MAX_FIELD];
+
+	while (fgets(line, BUFSIZ, fd)) {
+		length = strlen(line) - 1;
+		*(line + length) = 0;
+		switch (mode) {
+		case DUMP_STDIN:
+			printf("%s", line);
+			break;
+		case OPTIONF:
+			columns[maxcol++] = line;
+			for (i = 0; i < length; i++) {
+				if (*(line + i) == delim) {
+					*(line + i) = 0;
+					if (maxcol == MAX_FIELD)
+						cuterror(MAX_FIELDS_EXEEDED_ERROR);
+					columns[maxcol] = line + i + 1;
+					maxcol++;
+				}
+			}
+			if (maxcol != 1) { 
+				for (i = 0; i < num_args; i++) {
+					for (j = args[i * 2]; j <= args[i * 2 + 1]; j++)
+						if (j <= maxcol) {
+							printf("%s", columns[j - 1]);
+							if (i != num_args - 1 || j != args[i * 2 + 1])
+								putchar(delim);
+						}
+				}
+			}
+			break;
+		case OPTIONC:
+			for (i = 0; i < num_args; i++) {
+				for (j = args[i * 2];
+					 j <= (args[i * 2 + 1] >
+						   length ? length : args[i * 2 + 1]); j++)
+					putchar(*(line + j - 1));
+			}
+		}
+		if (maxcol != 1)
+			putchar('\n');
+	}
+}
+
+
+int cut_main(int argc, char **argv)
+{
+	int i = 1;
+	int numberFilenames = 0;
+
+	name = argv[0];
+
+	if (argc == 1 || strcmp(argv[1], dash_dash_help)==0)
+		usage( "cut [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nPrints selected fields from each input FILE to standard output.\n\n"
+				"Options:\n"
+				"\t-b LIST\tOutput only bytes from LIST\n"
+				"\t-c LIST\tOutput only characters from LIST\n"
+				"\t-d DELIM\tUse DELIM instead of tab as the field delimiter\n"
+				"\t-f N\tPrint only these fields\n"
+				"\t-n\tIgnored\n"
+#endif
+				);
+
+	while (i < argc) {
+		if (argv[i][0] == '-') {
+			switch (argv[i++][1]) {
+			case 'd':
+				if (mode == OPTIONC || mode == OPTIONB)
+					warn(DELIMITER_NOT_APPLICABLE, "d");
+				delim = argv[i++][0];
+				break;
+			case 'f':
+				sprintf(line, "%s", argv[i++]);
+				if (mode == OPTIONC || mode == OPTIONB)
+					warn(OVERRIDING_PREVIOUS_MODE, "f");
+				mode = OPTIONF;
+				break;
+			case 'b':
+				sprintf(line, "%s", argv[i++]);
+				if (mode == OPTIONF || mode == OPTIONC)
+					warn(OVERRIDING_PREVIOUS_MODE, "b");
+				mode = OPTIONB;
+				break;
+			case 'c':
+				sprintf(line, "%s", argv[i++]);
+				if (mode == OPTIONF || mode == OPTIONB)
+					warn(OVERRIDING_PREVIOUS_MODE, "c");
+				mode = OPTIONC;
+				break;
+			case '\0':			/* - means: read from stdin      */
+				numberFilenames++;
+				break;
+			case 'n':			/* needed for Posix, but no effect here  */
+				if (mode != OPTIONB)
+					warn(OPTION_NOT_APPLICABLE, "n");
+				break;
+			default:
+				warn(UNKNOWN_OPTION, &(argv[i - 1][1]));
+			}
+		} else {
+			i++;
+			numberFilenames++;
+		}
+	}
+
+/* Here follow the checks, if the selected options are reasonable.	*/
+	if (mode == OPTIONB)		/* since in Minix char := byte       */
+		mode = OPTIONC;
+	get_args();
+	if (numberFilenames != 0) {
+		i = 1;
+		while (i < argc) {
+			if (argv[i][0] == '-') {
+				switch (argv[i][1]) {
+				case 'f':
+				case 'c':
+				case 'b':
+				case 'd':
+					i += 2;
+					break;
+				case 'n':
+				case 'i':
+				case 's':
+					i++;
+					break;
+				case '\0':
+					fd = stdin;
+					i++;
+					cut();
+					break;
+				default:
+					i++;
+				}
+			} else {
+				if ((fd = fopen(argv[i++], "r")) == NULL) {
+					warn(FILE_NOT_READABLE, argv[i - 1]);
+				} else {
+					cut();
+					fclose(fd);
+				}
+			}
+		}
+	} else {
+		fd = stdin;
+		cut();
+	}
+
+	exit(exit_status);
+}
+
+/* cut - extract columns from a file or stdin. 	Author: Michael J. Holme
+ *
+ *	Copyright 1989, Michael John Holme, All rights reserved.
+ *	This code may be freely distributed, provided that this notice
+ *	remains intact.
+ *
+ *	V1.1: 6th September 1989
+ *
+ *	Bugs, criticisms, etc,
+ *      c/o Mark Powell
+ *          JANET sq79@uk.ac.liv
+ *          ARPA  sq79%liv.ac.uk@nsfnet-relay.ac.uk
+ *          UUCP  ...!mcvax!ukc!liv.ac.uk!sq79
+ *-------------------------------------------------------------------------
+ *	Changed for POSIX1003.2/Draft10 conformance
+ *	Thomas Brupbacher (tobr@mw.lpc.ethz.ch), September 1990.
+ *	Changes:
+ *	    - separation of error messages ( stderr) and output (stdout).
+ *	    - support for -b and -n (no effect, -b acts as -c)
+ *	    - support for -s
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Copyright (c) 1987,1997, Prentice Hall
+ * All rights reserved.
+ * 
+ * Redistribution and use of the MINIX operating system in source and
+ * binary forms, with or without modification, are permitted provided
+ * that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * 
+ * Neither the name of Prentice Hall nor the names of the software
+ * authors or contributors may be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+
diff --git a/docs/busybox.pod b/docs/busybox.pod
index ea14459..408bbfa 100644
--- a/docs/busybox.pod
+++ b/docs/busybox.pod
@@ -488,7 +488,7 @@
 
 Usage: free
 
-Displays the amount of free and used memory in the system.
+Displays the amount of free and used system memory.
 
 Example:
 
@@ -504,7 +504,7 @@
 
 Usage: freeramdisk DEVICE
 
-Free all memory used by the specified ramdisk.
+Frees all memory used by the specified ramdisk.
 
 Example:
 
@@ -799,9 +799,9 @@
 
 =item length
 
-Usage: length string
+Usage: length STRING
 
-Prints out the length of the specified string.
+Prints out the length of the specified STRING.
 
 Example:
 
@@ -1120,7 +1120,7 @@
 	-t fs-type:     Specify the filesystem type.
 	-w:             Mount for reading and writing (default).
 
-Options for use with the "-o" flag:
+Options for use with the "B<-o>" flag:
 
 	async/sync:     Writes are asynchronous / synchronous.
 	atime/noatime:  Enable / disable updates to inode access times.
@@ -1881,4 +1881,4 @@
 
 =cut
 
-# $Id: busybox.pod,v 1.29 2000/05/10 05:00:31 erik Exp $
+# $Id: busybox.pod,v 1.30 2000/05/12 19:41:47 erik Exp $
diff --git a/editors/sed.c b/editors/sed.c
index 0d57a4a..9fed670 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -38,8 +38,9 @@
 #include <ctype.h>
 
 static const char sed_usage[] =
-	"sed [-n] -e script [file...]\n\n"
-	"Allowed sed scripts come in the following form:\n"
+	"sed [-n] -e script [file...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nAllowed sed scripts come in the following form:\n"
 	"\t'ADDR [!] COMMAND'\n\n"
 	"\twhere address ADDR can be:\n"
 	"\t  NUMBER    Match specified line number\n"
@@ -58,8 +59,10 @@
 #if defined BB_REGEXP
 	"This version of sed matches full regular expresions.\n";
 #else
-	"This version of sed matches strings (not full regular expresions).\n";
+	"This version of sed matches strings (not full regular expresions).\n"
 #endif
+#endif
+	;
 
 /* Flags & variables */
 
diff --git a/fbset.c b/fbset.c
index 4e5609e..de4c824 100644
--- a/fbset.c
+++ b/fbset.c
@@ -105,9 +105,9 @@
 	"-vsync", 1, CMD_VSYNC}, {
 	"-laced", 1, CMD_LACED}, {
 	"-double", 1, CMD_DOUBLE}, {
-	"--help", 0, CMD_HELP}, {
+	"-help", 0, CMD_HELP}, {
 #ifdef BB_FEATURE_FBSET_FANCY
-	"--help", 0, CMD_HELP}, {
+	"-help", 0, CMD_HELP}, {
 	"-all", 0, CMD_ALL}, {
 	"-xres", 1, CMD_XRES}, {
 	"-yres", 1, CMD_YRES}, {
@@ -115,7 +115,7 @@
 	"-vyres", 1, CMD_VYRES}, {
 	"-depth", 1, CMD_DEPTH}, {
 	"-match", 0, CMD_MATCH}, {
-	"--geometry", 5, CMD_GEOMETRY}, {
+	"-geometry", 5, CMD_GEOMETRY}, {
 	"-pixclock", 1, CMD_PIXCLOCK}, {
 	"-left", 1, CMD_LEFT}, {
 	"-right", 1, CMD_RIGHT}, {
@@ -123,7 +123,7 @@
 	"-lower", 1, CMD_LOWER}, {
 	"-hslen", 1, CMD_HSLEN}, {
 	"-vslen", 1, CMD_VSLEN}, {
-	"--timings", 7, CMD_TIMING}, {
+	"-timings", 7, CMD_TIMING}, {
 	"-csync", 1, CMD_CSYNC}, {
 	"-gsync", 1, CMD_GSYNC}, {
 	"-extsync", 1, CMD_EXTSYNC}, {
@@ -221,17 +221,21 @@
 
 static void fbset_usage(void)
 {
+#ifndef BB_FEATURE_TRIVIAL_HELP
 	int i;
+#endif
 
 #ifndef STANDALONE
 	fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
 			BB_VER, BB_BT);
 #endif
-	fprintf(stderr, "Usage: fbset [options] [mode]\n\n");
-	fprintf(stderr, "Show and modify frame buffer device settings\n\n");
+	fprintf(stderr, "Usage: fbset [options] [mode]\n");
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	fprintf(stderr, "\nShows and modifies frame buffer device settings\n\n");
 	fprintf(stderr, "The following options are recognized:\n");
 	for (i = 0; g_cmdoptions[i].name; i++)
 		fprintf(stderr, "\t%s\n", g_cmdoptions[i].name);
+#endif
 	exit(-1);
 }
 
diff --git a/fdflush.c b/fdflush.c
index 56ea224..4ec0a88 100644
--- a/fdflush.c
+++ b/fdflush.c
@@ -34,7 +34,11 @@
 	int fd;
 
 	if (argc <= 1 || **(++argv) == '-') {
-		usage("fdflush device\n\nForce floppy disk drive to detect disk change\n");
+		usage("fdflush DEVICE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nForces floppy disk drive to detect disk change\n"
+#endif
+				);
 	}
 
 	fd = open(*argv, 0);
diff --git a/find.c b/find.c
index f6e63af..53b85e6 100644
--- a/find.c
+++ b/find.c
@@ -33,13 +33,16 @@
 static char *directory = ".";
 static int dereferenceFlag = FALSE;
 
-static const char find_usage[] = "find [PATH...] [EXPRESSION]\n\n"
-	"Search for files in a directory hierarchy.  The default PATH is\n"
+static const char find_usage[] = "find [PATH...] [EXPRESSION]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSearch for files in a directory hierarchy.  The default PATH is\n"
 	"the current directory; default EXPRESSION is '-print'\n\n"
 	"\nEXPRESSION may consist of:\n"
 	"\t-follow\t\tDereference symbolic links.\n"
 	"\t-name PATTERN\tFile name (leading directories removed) matches PATTERN.\n"
-	"\t-print\t\tprint the full file name followed by a newline to stdout.\n";
+	"\t-print\t\tprint the full file name followed by a newline to stdout.\n"
+#endif
+	;
 
 
 static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
diff --git a/findutils/find.c b/findutils/find.c
index f6e63af..53b85e6 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -33,13 +33,16 @@
 static char *directory = ".";
 static int dereferenceFlag = FALSE;
 
-static const char find_usage[] = "find [PATH...] [EXPRESSION]\n\n"
-	"Search for files in a directory hierarchy.  The default PATH is\n"
+static const char find_usage[] = "find [PATH...] [EXPRESSION]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSearch for files in a directory hierarchy.  The default PATH is\n"
 	"the current directory; default EXPRESSION is '-print'\n\n"
 	"\nEXPRESSION may consist of:\n"
 	"\t-follow\t\tDereference symbolic links.\n"
 	"\t-name PATTERN\tFile name (leading directories removed) matches PATTERN.\n"
-	"\t-print\t\tprint the full file name followed by a newline to stdout.\n";
+	"\t-print\t\tprint the full file name followed by a newline to stdout.\n"
+#endif
+	;
 
 
 static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
diff --git a/findutils/grep.c b/findutils/grep.c
index 06b6980..6872ac2 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -41,8 +41,9 @@
 #include <ctype.h>
 
 static const char grep_usage[] =
-	"grep [OPTIONS]... PATTERN [FILE]...\n\n"
-	"Search for PATTERN in each FILE or standard input.\n\n"
+	"grep [OPTIONS]... PATTERN [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSearch for PATTERN in each FILE or standard input.\n\n"
 	"OPTIONS:\n"
 	"\t-h\tsuppress the prefixing filename on output\n"
 	"\t-i\tignore case distinctions\n"
@@ -52,8 +53,10 @@
 #if defined BB_REGEXP
 	"This version of grep matches full regular expresions.\n";
 #else
-	"This version of grep matches strings (not regular expresions).\n";
+	"This version of grep matches strings (not regular expresions).\n"
 #endif
+#endif
+	;
 
 static int match = FALSE, beQuiet = FALSE;
 
diff --git a/free.c b/free.c
index 39594db..e6f130e 100644
--- a/free.c
+++ b/free.c
@@ -37,6 +37,14 @@
 	info.sharedram/=DIVISOR;
 	info.bufferram/=DIVISOR;
 
+	if (argc > 1 && **(argv + 1) == '-') {
+		usage("free\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nDisplays the amount of free and used system memory\n"
+#endif
+				);
+	}
+
 
 	printf("%6s%13s%13s%13s%13s%13s\n", "", "total", "used", "free", 
 			"shared", "buffers");
diff --git a/freeramdisk.c b/freeramdisk.c
index d373bcb..4106cf1 100644
--- a/freeramdisk.c
+++ b/freeramdisk.c
@@ -34,8 +34,11 @@
 
 
 static const char freeramdisk_usage[] =
-	"freeramdisk DEVICE\n\n"
-	"Free all memory used by the specified ramdisk.\n";
+	"freeramdisk DEVICE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nFrees all memory used by the specified ramdisk.\n"
+#endif
+	;
 
 extern int
 freeramdisk_main(int argc, char **argv)
diff --git a/fsck_minix.c b/fsck_minix.c
index c890dff..7d27566 100644
--- a/fsck_minix.c
+++ b/fsck_minix.c
@@ -198,9 +198,10 @@
 {
 	fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
 			BB_VER, BB_BT);
-	fprintf(stderr, "Usage: %s [-larvsmf] /dev/name\n\n", program_name);
+	fprintf(stderr, "Usage: %s [-larvsmf] /dev/name\n", program_name);
+#ifndef BB_FEATURE_TRIVIAL_HELP
 	fprintf(stderr,
-			"Performs a consistency check for MINIX filesystems.\n\n");
+			"\nPerforms a consistency check for MINIX filesystems.\n\n");
 	fprintf(stderr, "OPTIONS:\n");
 	fprintf(stderr, "\t-l\tLists all filenames\n");
 	fprintf(stderr, "\t-r\tPerform interactive repairs\n");
@@ -210,6 +211,7 @@
 	fprintf(stderr,
 			"\t-m\tActivates MINIX-like \"mode not cleared\" warnings\n");
 	fprintf(stderr, "\t-f\tForce file system check.\n\n");
+#endif
 	leave(16);
 }
 
diff --git a/grep.c b/grep.c
index 06b6980..6872ac2 100644
--- a/grep.c
+++ b/grep.c
@@ -41,8 +41,9 @@
 #include <ctype.h>
 
 static const char grep_usage[] =
-	"grep [OPTIONS]... PATTERN [FILE]...\n\n"
-	"Search for PATTERN in each FILE or standard input.\n\n"
+	"grep [OPTIONS]... PATTERN [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSearch for PATTERN in each FILE or standard input.\n\n"
 	"OPTIONS:\n"
 	"\t-h\tsuppress the prefixing filename on output\n"
 	"\t-i\tignore case distinctions\n"
@@ -52,8 +53,10 @@
 #if defined BB_REGEXP
 	"This version of grep matches full regular expresions.\n";
 #else
-	"This version of grep matches strings (not regular expresions).\n";
+	"This version of grep matches strings (not regular expresions).\n"
 #endif
+#endif
+	;
 
 static int match = FALSE, beQuiet = FALSE;
 
diff --git a/gunzip.c b/gunzip.c
index bdf8dc2..11fc3a8 100644
--- a/gunzip.c
+++ b/gunzip.c
@@ -28,13 +28,17 @@
  */
 
 #include "internal.h"
+
 static const char gunzip_usage[] =
-	"gunzip [OPTION]... FILE\n\n"
-	"Uncompress FILE (or standard input if FILE is '-').\n\n"
+	"gunzip [OPTION]... FILE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nUncompress FILE (or standard input if FILE is '-').\n\n"
 	"Options:\n"
 
 	"\t-c\tWrite output to standard output\n"
-	"\t-t\tTest compressed file integrity\n";
+	"\t-t\tTest compressed file integrity\n"
+#endif
+	;
 
 	
 	/* These defines are very important for BusyBox.  Without these,
@@ -43,8 +47,9 @@
 #define SMALL_MEM
 #define DYN_ALLOC
 
-#define bb_need_name_too_long
 #define BB_DECLARE_EXTERN
+#define bb_need_memory_exhausted
+#define bb_need_name_too_long
 #include "messages.c"
 
 
@@ -206,7 +211,7 @@
 #  define DECLARE(type, array, size)  type * array
 #  define ALLOC(type, array, size) { \
       array = (type*)calloc((size_t)(((size)+1L)/2), 2*sizeof(type)); \
-      if (array == NULL) errorMsg("insufficient memory"); \
+      if (array == NULL) errorMsg(memory_exhausted, "gunzip"); \
    }
 #  define FREE(array) {if (array != NULL) free(array), array=NULL;}
 #else
@@ -1053,7 +1058,7 @@
 		int res = inflate();
 
 		if (res == 3) {
-			errorMsg("out of memory");
+			errorMsg(memory_exhausted, "gunzip");
 		} else if (res != 0) {
 			errorMsg("invalid compressed data--format violated");
 		}
diff --git a/gzip.c b/gzip.c
index cc6868b..17ebf6c 100644
--- a/gzip.c
+++ b/gzip.c
@@ -30,6 +30,9 @@
  */
 
 #include "internal.h"
+#define BB_DECLARE_EXTERN
+#define bb_need_memory_exhausted
+#include "messages.c"
 
 /* These defines are very important for BusyBox.  Without these,
  * huge chunks of ram are pre-allocated making the BusyBox bss 
@@ -39,12 +42,15 @@
 
 
 static const char gzip_usage[] =
-	"gzip [OPTION]... FILE\n\n"
-	"Compress FILE with maximum compression.\n"
+	"gzip [OPTION]... FILE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCompress FILE with maximum compression.\n"
 	"When FILE is '-', reads standard input.  Implies -c.\n\n"
 
 	"Options:\n"
-	"\t-c\tWrite output to standard output instead of FILE.gz\n";
+	"\t-c\tWrite output to standard output instead of FILE.gz\n"
+#endif
+	;
 
 
 /* I don't like nested includes, but the string and io functions are used
@@ -121,7 +127,7 @@
 #  define DECLARE(type, array, size)  type * array
 #  define ALLOC(type, array, size) { \
       array = (type*)calloc((size_t)(((size)+1L)/2), 2*sizeof(type)); \
-      if (array == NULL) errorMsg("insufficient memory"); \
+      if (array == NULL) errorMsg(memory_exhausted, "gzip"); \
    }
 #  define FREE(array) {if (array != NULL) free(array), array=NULL;}
 #else
@@ -1778,7 +1784,6 @@
 long time_stamp;				/* original time stamp (modification time) */
 long ifile_size;				/* input file size, -1 for devices (debug only) */
 char *env;						/* contents of GZIP env variable */
-char **args = NULL;				/* argv pointer if GZIP env variable defined */
 char z_suffix[MAX_SUFFIX + 1];	/* default suffix (can be set with --suffix) */
 int z_len;						/* strlen(z_suffix) */
 
@@ -3248,7 +3253,7 @@
 	nargv = (char **) calloc(*argcp + 1, sizeof(char *));
 
 	if (nargv == NULL)
-		errorMsg("out of memory");
+		errorMsg(memory_exhausted, "gzip");
 	oargv = *argvp;
 	*argvp = nargv;
 
diff --git a/head.c b/head.c
index 3db64b3..f4ebe05 100644
--- a/head.c
+++ b/head.c
@@ -27,12 +27,15 @@
 #include <stdio.h>
 
 const char head_usage[] =
-	"head [OPTION] [FILE]...\n\n"
-	"Print first 10 lines of each FILE to standard output.\n"
+	"head [OPTION] [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint first 10 lines of each FILE to standard output.\n"
 	"With more than one FILE, precede each with a header giving the\n"
 	"file name. With no FILE, or when FILE is -, read standard input.\n\n"
 
-	"Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n";
+	"Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n"
+#endif
+	;
 
 int head(int len, FILE * src)
 {
@@ -109,4 +112,4 @@
 	exit(0);
 }
 
-/* $Id: head.c,v 1.9 2000/04/13 01:18:56 erik Exp $ */
+/* $Id: head.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */
diff --git a/hostname.c b/hostname.c
index 8cc334d..ef92102 100644
--- a/hostname.c
+++ b/hostname.c
@@ -1,6 +1,6 @@
 /* vi: set sw=4 ts=4: */
 /*
- * $Id: hostname.c,v 1.7 2000/02/08 19:58:47 erik Exp $
+ * $Id: hostname.c,v 1.8 2000/05/12 19:41:47 erik Exp $
  * Mini hostname implementation for busybox
  *
  * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
@@ -31,15 +31,18 @@
 #include <stdio.h>
 
 static const char *hostname_usage =
-	"hostname [OPTION] {hostname | -F file}\n\n"
-	"Get or set the hostname or DNS domain name. If a hostname is given\n"
+	"hostname [OPTION] {hostname | -F file}\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nGet or set the hostname or DNS domain name. If a hostname is given\n"
 	"(or a file with the -F parameter), the host name will be set.\n\n"
 	"Options:\n"
 	"\t-s\t\tShort\n"
 
 	"\t-i\t\tAddresses for the hostname\n"
 	"\t-d\t\tDNS domain name\n"
-	"\t-F FILE\t\tUse the contents of FILE to specify the hostname\n";
+	"\t-F FILE\t\tUse the contents of FILE to specify the hostname\n"
+#endif
+	;
 
 
 void do_sethostname(char *s, int isfile)
diff --git a/id.c b/id.c
index 8ded0e5..542f865 100644
--- a/id.c
+++ b/id.c
@@ -29,11 +29,14 @@
 #include <sys/types.h>
 
 static const char id_usage[] =
-	"id [OPTIONS]... [USERNAME]\n\n"
-	"Print information for USERNAME or the current user\n\n"
+	"id [OPTIONS]... [USERNAME]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint information for USERNAME or the current user\n\n"
 	"\t-g\tprints only the group ID\n"
 	"\t-u\tprints only the user ID\n"
-	"\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n";
+	"\t-r\tprints the real user ID instead of the effective ID (with -ug)\n\n"
+#endif
+	;
 
 extern int id_main(int argc, char **argv)
 {
diff --git a/insmod.c b/insmod.c
index eafec7d..9d473ca 100644
--- a/insmod.c
+++ b/insmod.c
@@ -70,12 +70,15 @@
 static char m_filename[BUFSIZ + 1] = "\0";
 static char m_fullName[BUFSIZ + 1] = "\0";
 static const char insmod_usage[] =
-	"insmod [OPTION]... MODULE [symbol=value]...\n\n"
-	"Loads the specified kernel modules into the kernel.\n\n"
+	"insmod [OPTION]... MODULE [symbol=value]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nLoads the specified kernel modules into the kernel.\n\n"
 	"Options:\n"
 
 	"\t-f\tForce module to load into the wrong kernel version.\n"
-	"\t-k\tMake module autoclean-able.\n";
+	"\t-k\tMake module autoclean-able.\n"
+#endif
+	;
 
 
 static int findNamedModule(const char *fileName, struct stat *statbuf)
diff --git a/internal.h b/internal.h
index a401477..a953ce2 100644
--- a/internal.h
+++ b/internal.h
@@ -100,11 +100,12 @@
 extern int busybox_main(int argc, char** argv);
 extern int block_device_main(int argc, char** argv);
 extern int cat_main(int argc, char** argv);
-extern int cp_mv_main(int argc, char** argv);
 extern int chmod_chown_chgrp_main(int argc, char** argv);
 extern int chroot_main(int argc, char** argv);
 extern int chvt_main(int argc, char** argv);
 extern int clear_main(int argc, char** argv);
+extern int cp_mv_main(int argc, char** argv);
+extern int cut_main(int argc, char** argv);
 extern int date_main(int argc, char** argv);
 extern int dd_main(int argc, char** argv);
 extern int dirname_main(int argc, char** argv);
@@ -151,7 +152,7 @@
 extern int mknod_main(int argc, char** argv);
 extern int mkswap_main(int argc, char** argv);
 extern int mktemp_main(int argc, char **argv);
-extern int mnc_main(int argc, char** argv);
+extern int nc_main(int argc, char** argv);
 extern int more_main(int argc, char** argv);
 extern int mount_main(int argc, char** argv);
 extern int mt_main(int argc, char** argv);
diff --git a/kill.c b/kill.c
index 93f02ea..0487f6a 100644
--- a/kill.c
+++ b/kill.c
@@ -32,16 +32,22 @@
 #include <unistd.h>
 
 static const char *kill_usage =
-	"kill [-signal] process-id [process-id ...]\n\n"
-	"Send a signal (default is SIGTERM) to the specified process(es).\n\n"
-	"Options:\n" "\t-l\tList all signal names and numbers.\n\n";
+	"kill [-signal] process-id [process-id ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend a signal (default is SIGTERM) to the specified process(es).\n\n"
+	"Options:\n" "\t-l\tList all signal names and numbers.\n\n"
+#endif
+	;
 
 #ifdef BB_KILLALL
 static const char *killall_usage =
-	"killall [-signal] process-name [process-name ...]\n\n"
-	"Send a signal (default is SIGTERM) to the specified process(es).\n\n"
-	"Options:\n" "\t-l\tList all signal names and numbers.\n\n";
+	"killall [-signal] process-name [process-name ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend a signal (default is SIGTERM) to the specified process(es).\n\n"
+	"Options:\n" "\t-l\tList all signal names and numbers.\n\n"
 #endif
+#endif
+	;
 
 #define KILL	0
 #define KILLALL	1
diff --git a/lash.c b/lash.c
index b96b464..e446ad1 100644
--- a/lash.c
+++ b/lash.c
@@ -127,8 +127,11 @@
 
 static const char shell_usage[] =
 
-	"sh [FILE]...\n\n" "The BusyBox command interpreter (shell).\n\n";
-
+	"sh [FILE]...\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nlash: The BusyBox command interpreter (shell).\n\n"
+#endif
+	;
 
 static char cwd[1024];
 static char *prompt = "# ";
diff --git a/length.c b/length.c
index 4cbe7e1..c7df216 100644
--- a/length.c
+++ b/length.c
@@ -7,7 +7,11 @@
 extern int length_main(int argc, char **argv)
 {
 	if (argc != 2 || **(argv + 1) == '-') {
-		usage("length string\n");
+		usage("length STRING\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nPrints out the length of the specified STRING.\n"
+#endif
+				);
 	}
 	printf("%lu\n", (long)strlen(argv[1]));
 	return (TRUE);
diff --git a/ln.c b/ln.c
index eb7c996..29ff938 100644
--- a/ln.c
+++ b/ln.c
@@ -32,13 +32,16 @@
 #include <errno.h>
 
 static const char ln_usage[] =
-	"ln [OPTION] TARGET... LINK_NAME|DIRECTORY\n\n"
-	"Create a link named LINK_NAME or DIRECTORY to the specified TARGET\n\n"
+	"ln [OPTION] TARGET... LINK_NAME|DIRECTORY\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate a link named LINK_NAME or DIRECTORY to the specified TARGET\n\n"
 	"Options:\n"
 	"\t-s\tmake symbolic links instead of hard links\n"
 
 	"\t-f\tremove existing destination files\n"
-	"\t-n\tno dereference symlinks - treat like normal file\n";
+	"\t-n\tno dereference symlinks - treat like normal file\n"
+#endif
+	;
 
 static int symlinkFlag = FALSE;
 static int removeoldFlag = FALSE;
diff --git a/loadacm.c b/loadacm.c
index 8f69234..cca5406 100644
--- a/loadacm.c
+++ b/loadacm.c
@@ -22,8 +22,11 @@
 #include <sys/ioctl.h>
 #include <sys/kd.h>
 
-static const char loadacm_usage[] = "loadacm\n\n"
-	"Loads an acm from standard input.\n";
+static const char loadacm_usage[] = "loadacm\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nLoads an acm from standard input.\n"
+#endif
+	;
 
 typedef unsigned short unicode;
 
diff --git a/loadfont.c b/loadfont.c
index 5e1f04d..7eaf40e 100644
--- a/loadfont.c
+++ b/loadfont.c
@@ -30,8 +30,11 @@
 #define PSF_MAXMODE    0x03
 #define PSF_SEPARATOR  0xFFFF
 
-static const char loadfont_usage[] = "loadfont\n\n"
-	"Loads a console font from standard input.\n";
+static const char loadfont_usage[] = "loadfont\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"Loads a console font from standard input.\n"
+#endif
+	;
 
 struct psf_header {
 	unsigned char magic1, magic2;	/* Magic number */
diff --git a/loadkmap.c b/loadkmap.c
index 75e52e1..99efc51 100644
--- a/loadkmap.c
+++ b/loadkmap.c
@@ -29,8 +29,11 @@
 #include <sys/ioctl.h>
 
 
-static const char loadkmap_usage[] = "loadkmap\n\n"
-	"Loads a binary keyboard translation table from standard input.\n";
+static const char loadkmap_usage[] = "loadkmap\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"Loads a binary keyboard translation table from standard input.\n"
+#endif
+	;
 
 
 int loadkmap_main(int argc, char **argv)
diff --git a/logger.c b/logger.c
index db6d9bf..118a5de 100644
--- a/logger.c
+++ b/logger.c
@@ -48,14 +48,17 @@
 #endif
 
 static const char logger_usage[] =
-	"logger [OPTION]... [MESSAGE]\n\n"
-	"Write MESSAGE to the system log.  If MESSAGE is '-', log stdin.\n\n"
+	"logger [OPTION]... [MESSAGE]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nWrite MESSAGE to the system log.  If MESSAGE is '-', log stdin.\n\n"
 	"Options:\n"
 	"\t-s\tLog to stderr as well as the system log.\n"
 	"\t-t\tLog using the specified tag (defaults to user name).\n"
 
 	"\t-p\tEnter the message with the specified priority.\n"
-	"\t\tThis may be numerical or a ``facility.level'' pair.\n";
+	"\t\tThis may be numerical or a ``facility.level'' pair.\n"
+#endif
+	;
 
 
 /* Decode a symbolic name to a numeric value 
diff --git a/logname.c b/logname.c
index bde1752..7c6153f 100644
--- a/logname.c
+++ b/logname.c
@@ -23,9 +23,11 @@
 #include "internal.h"
 #include <stdio.h>
 
-static const char logname_usage[] = "logname\n\n"
-
-	"Print the name of the current user.\n";
+static const char logname_usage[] = "logname\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint the name of the current user.\n"
+#endif
+	;
 
 extern int logname_main(int argc, char **argv)
 {
diff --git a/ls.c b/ls.c
index 3c518ab..6ab11c4 100644
--- a/ls.c
+++ b/ls.c
@@ -449,7 +449,9 @@
 #ifdef BB_FEATURE_LS_FILETYPES
 	"F"
 #endif
-	"] [filenames...]\n\n"
+	"] [filenames...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nList directory contents\n\n"
 	"Options:\n"
 	"\t-a\tdo not hide entries starting with .\n"
 #ifdef BB_FEATURE_LS_TIMESTAMPS
@@ -475,6 +477,7 @@
 #ifdef BB_FEATURE_LS_FILETYPES
 	"\t-F\tappend indicator (one of */=@|) to entries\n"
 #endif
+#endif
 	;
 
 extern int ls_main(int argc, char **argv)
diff --git a/makedevs.c b/makedevs.c
index c8206e0..5072095 100644
--- a/makedevs.c
+++ b/makedevs.c
@@ -17,8 +17,9 @@
 #include <sys/stat.h>
 
 static const char makedevs_usage[] =
-	"makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]\n\n"
-	"Creates a range of block or character special files\n\n"
+	"makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreates a range of block or character special files\n\n"
 	"TYPEs include:\n"
 	"\tb:\tMake a block (buffered) device.\n"
 	"\tc or u:\tMake a character (un-buffered) device.\n"
@@ -28,7 +29,9 @@
 	"If 's' is the last argument, the base device is created as well.\n\n"
 	"For example:\n"
 	"\tmakedevs /dev/ttyS c 4 66 2 63   ->  ttyS2-ttyS63\n"
-	"\tmakedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8\n";
+	"\tmakedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8\n"
+#endif
+	;
 
 int makedevs_main(int argc, char **argv)
 {
diff --git a/math.c b/math.c
index 96afafd..18af353 100644
--- a/math.c
+++ b/math.c
@@ -7,10 +7,13 @@
 
 /* Tiny RPN calculator, because "expr" didn't give me bitwise operations. */
 
-static const char math_usage[] = "math expression ...\n\n"
-		"This is a Tiny RPN calculator that understands the\n"
+static const char math_usage[] = "math expression ...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+		"\nThis is a Tiny RPN calculator that understands the\n"
 		"following operations: +, -, /, *, and, or, not, eor.\n"
-		"i.e. 'math 2 2 add' -> 4, and 'math 8 8 \\* 2 2 + /' -> 16\n";
+		"i.e. 'math 2 2 add' -> 4, and 'math 8 8 \\* 2 2 + /' -> 16\n"
+#endif
+		;
 
 static double stack[100];
 static unsigned int pointer;
diff --git a/messages.c b/messages.c
index 305bcdb..73d6427 100644
--- a/messages.c
+++ b/messages.c
@@ -26,6 +26,13 @@
  *  Perhaps this will make it simpler to internationalize also, and
  *  may make the binary slightly smaller.
  */
+
+// TO use, do something like this
+//
+//#define BB_DECLARE_EXTERN
+//#define bb_need_memory_exhausted
+//#include "messages.c"
+//
 #ifndef _BB_MESSAGES_C
 #define _BB_MESSAGES_C
 
@@ -59,4 +66,9 @@
 #if defined bb_need_io_error || ! defined BB_DECLARE_EXTERN
 	BB_DEF_MESSAGE(io_error, "%s: input/output error -- %s\n")
 #endif
+#if defined bb_need_help || ! defined BB_DECLARE_EXTERN
+	BB_DEF_MESSAGE(dash_dash_help, "--help")
+#endif
+
 #endif							/* _BB_MESSAGES_C */
+
diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
index c8206e0..5072095 100644
--- a/miscutils/makedevs.c
+++ b/miscutils/makedevs.c
@@ -17,8 +17,9 @@
 #include <sys/stat.h>
 
 static const char makedevs_usage[] =
-	"makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]\n\n"
-	"Creates a range of block or character special files\n\n"
+	"makedevs NAME TYPE MAJOR MINOR FIRST LAST [s]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreates a range of block or character special files\n\n"
 	"TYPEs include:\n"
 	"\tb:\tMake a block (buffered) device.\n"
 	"\tc or u:\tMake a character (un-buffered) device.\n"
@@ -28,7 +29,9 @@
 	"If 's' is the last argument, the base device is created as well.\n\n"
 	"For example:\n"
 	"\tmakedevs /dev/ttyS c 4 66 2 63   ->  ttyS2-ttyS63\n"
-	"\tmakedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8\n";
+	"\tmakedevs /dev/hda b 3 0 0 8 s    ->  hda,hda1-hda8\n"
+#endif
+	;
 
 int makedevs_main(int argc, char **argv)
 {
diff --git a/miscutils/mt.c b/miscutils/mt.c
index cf20d17..28922f8 100644
--- a/miscutils/mt.c
+++ b/miscutils/mt.c
@@ -4,8 +4,11 @@
 #include <sys/mtio.h>
 #include <sys/fcntl.h>
 
-static const char mt_usage[] = "mt [-f device] opcode value\n\n"
-			"Control magnetic tape drive operation\n";
+static const char mt_usage[] = "mt [-f device] opcode value\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+			"\nControl magnetic tape drive operation\n"
+#endif
+			;
 
 struct mt_opcodes {
 	char *name;
diff --git a/miscutils/update.c b/miscutils/update.c
index 18b13e8..14f1d3c 100644
--- a/miscutils/update.c
+++ b/miscutils/update.c
@@ -35,12 +35,15 @@
 #endif							/* __GLIBC__ */
 
 static char update_usage[] =
-	"update [options]\n\n"
-	"Periodically flushes filesystem buffers.\n\n"
+	"update [options]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPeriodically flushes filesystem buffers.\n\n"
 	"Options:\n"
 	"\t-S\tforce use of sync(2) instead of flushing\n"
 	"\t-s SECS\tcall sync this often (default 30)\n"
-	"\t-f SECS\tflush some buffers this often (default 5)\n";
+	"\t-f SECS\tflush some buffers this often (default 5)\n"
+#endif
+	;
 
 static unsigned int sync_duration = 30;
 static unsigned int flush_duration = 5;
diff --git a/mkdir.c b/mkdir.c
index 54d9b72..9664986 100644
--- a/mkdir.c
+++ b/mkdir.c
@@ -30,12 +30,15 @@
 #include <errno.h>
 
 static const char mkdir_usage[] =
-	"mkdir [OPTION] DIRECTORY...\n\n"
-	"Create the DIRECTORY(ies), if they do not already exist\n\n"
+	"mkdir [OPTION] DIRECTORY...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate the DIRECTORY(ies), if they do not already exist\n\n"
 	"Options:\n"
 
 	"\t-m\tset permission mode (as in chmod), not rwxrwxrwx - umask\n"
-	"\t-p\tno error if existing, make parent directories as needed\n";
+	"\t-p\tno error if existing, make parent directories as needed\n"
+#endif
+	;
 
 
 static int parentFlag = FALSE;
diff --git a/mkfifo.c b/mkfifo.c
index b273df0..ef3d667 100644
--- a/mkfifo.c
+++ b/mkfifo.c
@@ -26,11 +26,13 @@
 #include <sys/stat.h>
 #include <errno.h>
 
-static const char mkfifo_usage[] = "mkfifo [OPTIONS] name\n\n"
-	"Creates a named pipe (identical to 'mknod name p')\n\n"
-
+static const char mkfifo_usage[] = "mkfifo [OPTIONS] name\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreates a named pipe (identical to 'mknod name p')\n\n"
 	"Options:\n"
-	"\t-m\tcreate the pipe using the specified mode (default a=rw)\n";
+	"\t-m\tcreate the pipe using the specified mode (default a=rw)\n"
+#endif
+	;
 
 extern int mkfifo_main(int argc, char **argv)
 {
diff --git a/mkfs_minix.c b/mkfs_minix.c
index be180a4..bf4bda9 100644
--- a/mkfs_minix.c
+++ b/mkfs_minix.c
@@ -179,9 +179,10 @@
 	fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
 			BB_VER, BB_BT);
 	fprintf(stderr,
-			"Usage: %s [-c | -l filename] [-nXX] [-iXX] /dev/name [blocks]\n\n",
+			"Usage: %s [-c | -l filename] [-nXX] [-iXX] /dev/name [blocks]\n",
 			program_name);
-	fprintf(stderr, "Make a MINIX filesystem.\n\n");
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	fprintf(stderr, "\nMake a MINIX filesystem.\n\n");
 	fprintf(stderr, "OPTIONS:\n");
 	fprintf(stderr, "\t-c\t\tCheck the device for bad blocks\n");
 	fprintf(stderr,
@@ -191,6 +192,7 @@
 	fprintf(stderr,
 			"\t-l FILENAME\tRead the bad blocks list from FILENAME\n");
 	fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n");
+#endif
 	exit(16);
 }
 
diff --git a/mknod.c b/mknod.c
index caa234f..8f411a3 100644
--- a/mknod.c
+++ b/mknod.c
@@ -28,14 +28,17 @@
 #include <fcntl.h>
 #include <unistd.h>
 
-static const char mknod_usage[] = "mknod [OPTIONS] NAME TYPE MAJOR MINOR\n\n"
-	"Create a special file (block, character, or pipe).\n\n"
+static const char mknod_usage[] = "mknod [OPTIONS] NAME TYPE MAJOR MINOR\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate a special file (block, character, or pipe).\n\n"
 	"Options:\n"
 	"\t-m\tcreate the special file using the specified mode (default a=rw)\n\n"
 	"TYPEs include:\n"
 	"\tb:\tMake a block (buffered) device.\n"
 	"\tc or u:\tMake a character (un-buffered) device.\n"
-	"\tp:\tMake a named pipe. MAJOR and MINOR are ignored for named pipes.\n";
+	"\tp:\tMake a named pipe. MAJOR and MINOR are ignored for named pipes.\n"
+#endif
+	;
 
 int mknod_main(int argc, char **argv)
 {
diff --git a/mkswap.c b/mkswap.c
index 17866a7..7d76916 100644
--- a/mkswap.c
+++ b/mkswap.c
@@ -49,13 +49,16 @@
 
 
 static const char mkswap_usage[] =
-	"mkswap [-c] [-v0|-v1] device [block-count]\n\n"
-	"Prepare a disk partition to be used as a swap partition.\n\n"
+	"mkswap [-c] [-v0|-v1] device [block-count]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrepare a disk partition to be used as a swap partition.\n\n"
 	"Options:\n" "\t-c\t\tCheck for read-ability.\n"
 	"\t-v0\t\tMake version 0 swap [max 128 Megs].\n"
 	"\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n"
 
-	"\tblock-count\tNumber of block to use (default is entire partition).\n";
+	"\tblock-count\tNumber of block to use (default is entire partition).\n"
+#endif
+	;
 
 
 #ifndef _IO
diff --git a/modutils/insmod.c b/modutils/insmod.c
index eafec7d..9d473ca 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -70,12 +70,15 @@
 static char m_filename[BUFSIZ + 1] = "\0";
 static char m_fullName[BUFSIZ + 1] = "\0";
 static const char insmod_usage[] =
-	"insmod [OPTION]... MODULE [symbol=value]...\n\n"
-	"Loads the specified kernel modules into the kernel.\n\n"
+	"insmod [OPTION]... MODULE [symbol=value]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nLoads the specified kernel modules into the kernel.\n\n"
 	"Options:\n"
 
 	"\t-f\tForce module to load into the wrong kernel version.\n"
-	"\t-k\tMake module autoclean-able.\n";
+	"\t-k\tMake module autoclean-able.\n"
+#endif
+	;
 
 
 static int findNamedModule(const char *fileName, struct stat *statbuf)
diff --git a/modutils/rmmod.c b/modutils/rmmod.c
index bc5c03e..5ef4a60 100644
--- a/modutils/rmmod.c
+++ b/modutils/rmmod.c
@@ -36,10 +36,13 @@
 
 
 static const char rmmod_usage[] =
-	"rmmod [OPTION]... [MODULE]...\n\n"
-	"Unloads the specified kernel modules from the kernel.\n\n"
-
-	"Options:\n" "\t-a\tTry to remove all unused kernel modules.\n";
+	"rmmod [OPTION]... [MODULE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nUnloads the specified kernel modules from the kernel.\n\n"
+	"Options:\n" 
+	"\t-a\tTry to remove all unused kernel modules.\n"
+#endif
+	;
 
 
 
diff --git a/more.c b/more.c
index 30d2757..5044686 100644
--- a/more.c
+++ b/more.c
@@ -30,8 +30,15 @@
 #include <fcntl.h>
 #include <signal.h>
 #include <sys/ioctl.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
-static const char more_usage[] = "more [file ...]\n";
+static const char more_usage[] = "more [FILE ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nMore is a filter for viewing FILE one screenful at a time.\n"
+#endif
+	;
 
 /* ED: sparc termios is broken: revert back to old termio handling. */
 #ifdef BB_FEATURE_USE_TERMIOS
@@ -92,7 +99,7 @@
 	argv++;
 
 	if (argc > 0
-		&& (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0)) {
+		&& (strcmp(*argv, dash_dash_help) == 0 || strcmp(*argv, "-h") == 0)) {
 		usage(more_usage);
 	}
 	do {
diff --git a/mount.c b/mount.c
index 00a774a..bde55d1 100644
--- a/mount.c
+++ b/mount.c
@@ -64,10 +64,12 @@
 
 extern const char mtab_file[];	/* Defined in utility.c */
 
-static const char mount_usage[] = "\tmount [flags]\n"
-	"\tmount [flags] device directory [-o options,more-options]\n"
-	"\n" "Flags:\n" 
-	"\t-a:\t\tMount all file systems in fstab.\n"
+static const char mount_usage[] = 
+	"mount [flags] device directory [-o options,more-options]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nMount a filesystem\n\n"
+	"Flags:\n" 
+	"\t-a:\t\tMount all filesystems in fstab.\n"
 #ifdef BB_MTAB
 	"\t-f:\t\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
 	"\t-n:\t\tDon't write a mount table entry.\n"
@@ -88,8 +90,10 @@
 	"\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n"
 	"\tremount:\tRe-mount a currently-mounted filesystem, changing its flags.\n"
 	"\tro/rw:\t\tMount for read-only / read-write.\n"
-	"There are EVEN MORE flags that are specific to each filesystem.\n"
-	"You'll have to see the written documentation for those.\n";
+	"\nThere are EVEN MORE flags that are specific to each filesystem.\n"
+	"You'll have to see the written documentation for those.\n"
+#endif
+	;
 
 
 struct mount_options {
@@ -451,7 +455,7 @@
 			fatalError( "\nCannot read /etc/fstab: %s\n", strerror (errno));
 
 		while ((m = getmntent(f)) != NULL) {
-			// If the file system isn't noauto, 
+			// If the filesystem isn't noauto, 
 			// and isn't swap or nfs, then mount it
 			if ((!strstr(m->mnt_opts, "noauto")) &&
 				(!strstr(m->mnt_type, "swap")) &&
diff --git a/mt.c b/mt.c
index cf20d17..28922f8 100644
--- a/mt.c
+++ b/mt.c
@@ -4,8 +4,11 @@
 #include <sys/mtio.h>
 #include <sys/fcntl.h>
 
-static const char mt_usage[] = "mt [-f device] opcode value\n\n"
-			"Control magnetic tape drive operation\n";
+static const char mt_usage[] = "mt [-f device] opcode value\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+			"\nControl magnetic tape drive operation\n"
+#endif
+			;
 
 struct mt_opcodes {
 	char *name;
diff --git a/mnc.c b/nc.c
similarity index 91%
rename from mnc.c
rename to nc.c
index 60c18a9..a588587 100644
--- a/mnc.c
+++ b/nc.c
@@ -1,5 +1,5 @@
 /* vi: set sw=4 ts=4: */
-/*  mnc: mini-netcat - built from the ground up for LRP
+/*  nc: mini-netcat - built from the ground up for LRP
     Copyright (C) 1998  Charles P. Wright
 
     0.0.1   6K      It works.
@@ -40,11 +40,13 @@
 
 #define BUFSIZE 100
 
-static const char mnc_usage[] =
+static const char nc_usage[] = "nc [IP] [port]\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nNetcat opens a pipe to IP:port\n"
+#endif
+	;
 
-	"mnc [IP] [port]\n\n" "mini-netcat opens a pipe to IP:port\n";
-
-int mnc_main(int argc, char **argv)
+int nc_main(int argc, char **argv)
 {
 	int sfd;
 	int result;
@@ -59,7 +61,7 @@
 	argc--;
 	argv++;
 	if (argc < 2 || **(argv + 1) == '-') {
-		usage(mnc_usage);
+		usage(nc_usage);
 	}
 
 	sfd = socket(AF_INET, SOCK_STREAM, 0);
diff --git a/networking/hostname.c b/networking/hostname.c
index 8cc334d..ef92102 100644
--- a/networking/hostname.c
+++ b/networking/hostname.c
@@ -1,6 +1,6 @@
 /* vi: set sw=4 ts=4: */
 /*
- * $Id: hostname.c,v 1.7 2000/02/08 19:58:47 erik Exp $
+ * $Id: hostname.c,v 1.8 2000/05/12 19:41:47 erik Exp $
  * Mini hostname implementation for busybox
  *
  * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
@@ -31,15 +31,18 @@
 #include <stdio.h>
 
 static const char *hostname_usage =
-	"hostname [OPTION] {hostname | -F file}\n\n"
-	"Get or set the hostname or DNS domain name. If a hostname is given\n"
+	"hostname [OPTION] {hostname | -F file}\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nGet or set the hostname or DNS domain name. If a hostname is given\n"
 	"(or a file with the -F parameter), the host name will be set.\n\n"
 	"Options:\n"
 	"\t-s\t\tShort\n"
 
 	"\t-i\t\tAddresses for the hostname\n"
 	"\t-d\t\tDNS domain name\n"
-	"\t-F FILE\t\tUse the contents of FILE to specify the hostname\n";
+	"\t-F FILE\t\tUse the contents of FILE to specify the hostname\n"
+#endif
+	;
 
 
 void do_sethostname(char *s, int isfile)
diff --git a/mnc.c b/networking/nc.c
similarity index 91%
copy from mnc.c
copy to networking/nc.c
index 60c18a9..a588587 100644
--- a/mnc.c
+++ b/networking/nc.c
@@ -1,5 +1,5 @@
 /* vi: set sw=4 ts=4: */
-/*  mnc: mini-netcat - built from the ground up for LRP
+/*  nc: mini-netcat - built from the ground up for LRP
     Copyright (C) 1998  Charles P. Wright
 
     0.0.1   6K      It works.
@@ -40,11 +40,13 @@
 
 #define BUFSIZE 100
 
-static const char mnc_usage[] =
+static const char nc_usage[] = "nc [IP] [port]\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nNetcat opens a pipe to IP:port\n"
+#endif
+	;
 
-	"mnc [IP] [port]\n\n" "mini-netcat opens a pipe to IP:port\n";
-
-int mnc_main(int argc, char **argv)
+int nc_main(int argc, char **argv)
 {
 	int sfd;
 	int result;
@@ -59,7 +61,7 @@
 	argc--;
 	argv++;
 	if (argc < 2 || **(argv + 1) == '-') {
-		usage(mnc_usage);
+		usage(nc_usage);
 	}
 
 	sfd = socket(AF_INET, SOCK_STREAM, 0);
diff --git a/networking/nslookup.c b/networking/nslookup.c
index e4bf52f..82bcf56 100644
--- a/networking/nslookup.c
+++ b/networking/nslookup.c
@@ -41,7 +41,11 @@
  |  + find out how the real nslookup gets the default name server
  */
 
-static const char nslookup_usage[] = "nslookup [HOST]\n\nQueries the nameserver for the IP address of the given HOST\n";
+static const char nslookup_usage[] = "nslookup [HOST]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nQueries the nameserver for the IP address of the given HOST\n"
+#endif
+;
 
 
 /* I have to see how the real nslookup does this.
@@ -173,4 +177,4 @@
 	exit( TRUE);
 }
 
-/* $Id: nslookup.c,v 1.8 2000/05/02 00:07:56 erik Exp $ */
+/* $Id: nslookup.c,v 1.9 2000/05/12 19:41:47 erik Exp $ */
diff --git a/networking/ping.c b/networking/ping.c
index 9f83002..14a56cd 100644
--- a/networking/ping.c
+++ b/networking/ping.c
@@ -1,6 +1,6 @@
 /* vi: set sw=4 ts=4: */
 /*
- * $Id: ping.c,v 1.14 2000/04/25 23:24:55 erik Exp $
+ * $Id: ping.c,v 1.15 2000/05/12 19:41:47 erik Exp $
  * Mini ping implementation for busybox
  *
  * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
@@ -90,7 +90,11 @@
 
 /* simple version */
 #ifdef BB_SIMPLE_PING
-static const char *ping_usage = "ping host\n\n";
+static const char *ping_usage = "ping host\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend ICMP ECHO_REQUEST packets to network hosts\n"
+#endif
+	;
 
 static char *hostname = NULL;
 
@@ -179,12 +183,15 @@
 
 #else
 /* full(er) version */
-static const char *ping_usage = "ping [OPTION]... host\n\n"
-	"Send ICMP ECHO_REQUEST packets to network hosts.\n\n"
+static const char *ping_usage = "ping [OPTION]... host\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend ICMP ECHO_REQUEST packets to network hosts.\n\n"
 	"Options:\n"
 	"\t-c COUNT\tSend only COUNT pings.\n"
 	"\t-q\t\tQuiet mode, only displays output at start\n"
-	"\t\t\tand when finished.\n"; 
+	"\t\t\tand when finished.\n"
+#endif
+	;
 
 static char *hostname = NULL;
 static struct sockaddr_in pingaddr;
diff --git a/networking/telnet.c b/networking/telnet.c
index 8c58521..8b6d5f5 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -1,5 +1,5 @@
 /*
- * $Id: telnet.c,v 1.2 2000/05/01 19:10:52 erik Exp $
+ * $Id: telnet.c,v 1.3 2000/05/12 19:41:47 erik Exp $
  * Mini telnet implementation for busybox
  *
  * Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
@@ -46,7 +46,12 @@
 
 static int STDIN = 0;
 static int STDOUT = 1;
-static const char *telnet_usage = "telnet host [port]\n\n";
+static const char *telnet_usage = "telnet host [port]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nProvides interactive communication with another\n"
+	"networked host using the TELNET protocol\n"
+#endif
+	;
 static struct termios saved_tc;
 static unsigned char options[NTELOPTS];
 static char tr_state = 0; /* telnet send and receive state */
diff --git a/nslookup.c b/nslookup.c
index e4bf52f..82bcf56 100644
--- a/nslookup.c
+++ b/nslookup.c
@@ -41,7 +41,11 @@
  |  + find out how the real nslookup gets the default name server
  */
 
-static const char nslookup_usage[] = "nslookup [HOST]\n\nQueries the nameserver for the IP address of the given HOST\n";
+static const char nslookup_usage[] = "nslookup [HOST]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nQueries the nameserver for the IP address of the given HOST\n"
+#endif
+;
 
 
 /* I have to see how the real nslookup does this.
@@ -173,4 +177,4 @@
 	exit( TRUE);
 }
 
-/* $Id: nslookup.c,v 1.8 2000/05/02 00:07:56 erik Exp $ */
+/* $Id: nslookup.c,v 1.9 2000/05/12 19:41:47 erik Exp $ */
diff --git a/ping.c b/ping.c
index 9f83002..14a56cd 100644
--- a/ping.c
+++ b/ping.c
@@ -1,6 +1,6 @@
 /* vi: set sw=4 ts=4: */
 /*
- * $Id: ping.c,v 1.14 2000/04/25 23:24:55 erik Exp $
+ * $Id: ping.c,v 1.15 2000/05/12 19:41:47 erik Exp $
  * Mini ping implementation for busybox
  *
  * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
@@ -90,7 +90,11 @@
 
 /* simple version */
 #ifdef BB_SIMPLE_PING
-static const char *ping_usage = "ping host\n\n";
+static const char *ping_usage = "ping host\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend ICMP ECHO_REQUEST packets to network hosts\n"
+#endif
+	;
 
 static char *hostname = NULL;
 
@@ -179,12 +183,15 @@
 
 #else
 /* full(er) version */
-static const char *ping_usage = "ping [OPTION]... host\n\n"
-	"Send ICMP ECHO_REQUEST packets to network hosts.\n\n"
+static const char *ping_usage = "ping [OPTION]... host\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend ICMP ECHO_REQUEST packets to network hosts.\n\n"
 	"Options:\n"
 	"\t-c COUNT\tSend only COUNT pings.\n"
 	"\t-q\t\tQuiet mode, only displays output at start\n"
-	"\t\t\tand when finished.\n"; 
+	"\t\t\tand when finished.\n"
+#endif
+	;
 
 static char *hostname = NULL;
 static struct sockaddr_in pingaddr;
diff --git a/printf.c b/printf.c
index bfe4081..28a011d 100644
--- a/printf.c
+++ b/printf.c
@@ -139,7 +139,12 @@
 /* The value to return to the calling program.  */
 static int exit_status;
 
-static const char printf_usage[] = "printf format [argument...]\n\nFormats and prints the given data.\n";
+static const char printf_usage[] = "printf FORMAT [ARGUMENT...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nFormats and prints ARGUMENT(s) according to FORMAT,\n"
+	"Where FORMAT controls the output exactly as in C printf.\n"
+#endif
+	;
 
 int printf_main(int argc, char **argv)
 {
diff --git a/procps/free.c b/procps/free.c
index 39594db..e6f130e 100644
--- a/procps/free.c
+++ b/procps/free.c
@@ -37,6 +37,14 @@
 	info.sharedram/=DIVISOR;
 	info.bufferram/=DIVISOR;
 
+	if (argc > 1 && **(argv + 1) == '-') {
+		usage("free\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nDisplays the amount of free and used system memory\n"
+#endif
+				);
+	}
+
 
 	printf("%6s%13s%13s%13s%13s%13s\n", "", "total", "used", "free", 
 			"shared", "buffers");
diff --git a/procps/kill.c b/procps/kill.c
index 93f02ea..0487f6a 100644
--- a/procps/kill.c
+++ b/procps/kill.c
@@ -32,16 +32,22 @@
 #include <unistd.h>
 
 static const char *kill_usage =
-	"kill [-signal] process-id [process-id ...]\n\n"
-	"Send a signal (default is SIGTERM) to the specified process(es).\n\n"
-	"Options:\n" "\t-l\tList all signal names and numbers.\n\n";
+	"kill [-signal] process-id [process-id ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend a signal (default is SIGTERM) to the specified process(es).\n\n"
+	"Options:\n" "\t-l\tList all signal names and numbers.\n\n"
+#endif
+	;
 
 #ifdef BB_KILLALL
 static const char *killall_usage =
-	"killall [-signal] process-name [process-name ...]\n\n"
-	"Send a signal (default is SIGTERM) to the specified process(es).\n\n"
-	"Options:\n" "\t-l\tList all signal names and numbers.\n\n";
+	"killall [-signal] process-name [process-name ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nSend a signal (default is SIGTERM) to the specified process(es).\n\n"
+	"Options:\n" "\t-l\tList all signal names and numbers.\n\n"
 #endif
+#endif
+	;
 
 #define KILL	0
 #define KILLALL	1
diff --git a/procps/ps.c b/procps/ps.c
index f8cf33b..0842a22 100644
--- a/procps/ps.c
+++ b/procps/ps.c
@@ -36,6 +36,9 @@
 #include <fcntl.h>
 #include <ctype.h>
 #include <sys/ioctl.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
 
 #if ! defined BB_FEATURE_USE_DEVPS_PATCH
@@ -128,8 +131,13 @@
 
 
 
-	if (argc > 1 && strcmp(argv[1], "--help") == 0) {
-		usage ("ps\n\nReport process status\n\nThis version of ps accepts no options.\n");
+	if (argc > 1 && strcmp(argv[1], dash_dash_help) == 0) {
+		usage ("ps\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nReport process status\n"
+				"\nThis version of ps accepts no options.\n"
+#endif
+				);
 	}
 
 	dir = opendir("/proc");
diff --git a/ps.c b/ps.c
index f8cf33b..0842a22 100644
--- a/ps.c
+++ b/ps.c
@@ -36,6 +36,9 @@
 #include <fcntl.h>
 #include <ctype.h>
 #include <sys/ioctl.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
 
 #if ! defined BB_FEATURE_USE_DEVPS_PATCH
@@ -128,8 +131,13 @@
 
 
 
-	if (argc > 1 && strcmp(argv[1], "--help") == 0) {
-		usage ("ps\n\nReport process status\n\nThis version of ps accepts no options.\n");
+	if (argc > 1 && strcmp(argv[1], dash_dash_help) == 0) {
+		usage ("ps\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nReport process status\n"
+				"\nThis version of ps accepts no options.\n"
+#endif
+				);
 	}
 
 	dir = opendir("/proc");
diff --git a/pwd.c b/pwd.c
index e77a0ca..19494a9 100644
--- a/pwd.c
+++ b/pwd.c
@@ -24,15 +24,14 @@
 #include "internal.h"
 #include <stdio.h>
 #include <dirent.h>
+#include <errno.h>
 
 extern int pwd_main(int argc, char **argv)
 {
 	char buf[BUFSIZ + 1];
 
-	if (getcwd(buf, sizeof(buf)) == NULL) {
-		perror("get working directory");
-		exit(FALSE);
-	}
+	if (getcwd(buf, sizeof(buf)) == NULL)
+		fatalError("pwd: %s", strerror(errno));
 
 	printf("%s\n", buf);
 	exit(TRUE);
diff --git a/rm.c b/rm.c
index 0cd7956..c62d68a 100644
--- a/rm.c
+++ b/rm.c
@@ -29,12 +29,14 @@
 #include <dirent.h>
 #include <errno.h>
 
-static const char *rm_usage = "rm [OPTION]... FILE...\n\n"
-	"Remove (unlink) the FILE(s).\n\n"
+static const char *rm_usage = "rm [OPTION]... FILE...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nRemove (unlink) the FILE(s).\n\n"
 	"Options:\n"
-
 	"\t-f\t\tremove existing destinations, never prompt\n"
-	"\t-r or -R\tremove the contents of directories recursively\n";
+	"\t-r or -R\tremove the contents of directories recursively\n"
+#endif
+	;
 
 
 static int recursiveFlag = FALSE;
diff --git a/rmdir.c b/rmdir.c
index 1d88de3..61d7f2a 100644
--- a/rmdir.c
+++ b/rmdir.c
@@ -31,7 +31,11 @@
 {
 	if (argc == 1 || **(argv + 1) == '-') {
 		usage
-			("rmdir [OPTION]... DIRECTORY...\n\nRemove the DIRECTORY(ies), if they are empty.\n");
+			("rmdir [OPTION]... DIRECTORY...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+			 "\nRemove the DIRECTORY(ies), if they are empty.\n"
+#endif
+			 );
 	}
 
 	while (--argc > 0) {
diff --git a/rmmod.c b/rmmod.c
index bc5c03e..5ef4a60 100644
--- a/rmmod.c
+++ b/rmmod.c
@@ -36,10 +36,13 @@
 
 
 static const char rmmod_usage[] =
-	"rmmod [OPTION]... [MODULE]...\n\n"
-	"Unloads the specified kernel modules from the kernel.\n\n"
-
-	"Options:\n" "\t-a\tTry to remove all unused kernel modules.\n";
+	"rmmod [OPTION]... [MODULE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nUnloads the specified kernel modules from the kernel.\n\n"
+	"Options:\n" 
+	"\t-a\tTry to remove all unused kernel modules.\n"
+#endif
+	;
 
 
 
diff --git a/sed.c b/sed.c
index 0d57a4a..9fed670 100644
--- a/sed.c
+++ b/sed.c
@@ -38,8 +38,9 @@
 #include <ctype.h>
 
 static const char sed_usage[] =
-	"sed [-n] -e script [file...]\n\n"
-	"Allowed sed scripts come in the following form:\n"
+	"sed [-n] -e script [file...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nAllowed sed scripts come in the following form:\n"
 	"\t'ADDR [!] COMMAND'\n\n"
 	"\twhere address ADDR can be:\n"
 	"\t  NUMBER    Match specified line number\n"
@@ -58,8 +59,10 @@
 #if defined BB_REGEXP
 	"This version of sed matches full regular expresions.\n";
 #else
-	"This version of sed matches strings (not full regular expresions).\n";
+	"This version of sed matches strings (not full regular expresions).\n"
 #endif
+#endif
+	;
 
 /* Flags & variables */
 
diff --git a/sfdisk.c b/sfdisk.c
index d6ba537..8d2142b 100644
--- a/sfdisk.c
+++ b/sfdisk.c
@@ -54,10 +54,14 @@
 #include <linux/hdreg.h>		/* HDIO_GETGEO */
 #include <linux/fs.h>			/* BLKGETSIZE */
 
+#define BB_DECLARE_EXTERN
+#define bb_need_memory_exhausted
+#include "messages.c"
 
 static const char sfdisk_usage[] =
 	"sfdisk [options] device ...\n"
-	"device: something like /dev/hda or /dev/sda\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\ndevice: something like /dev/hda or /dev/sda\n"
 	"useful options:\n"
 	"    -s [or --show-size]: list size of a partition\n"
 	"    -c [or --id]:        print or change partition Id\n"
@@ -86,7 +90,9 @@
 	"    -S# [or --sectors #]:  set the number of sectors to use\n"
 
 	"You can disable all consistency checking with:\n"
-	"    -f  [or --force]:      do what I say, even if it is stupid\n";
+	"    -f  [or --force]:      do what I say, even if it is stupid\n"
+#endif
+	;
 
 
 
@@ -421,7 +427,7 @@
 		return 0;
 	}
 	if (!(ss = (char *) malloc(statbuf.st_size))) {
-		errorMsg("out of memory?\n");
+		errorMsg(memory_exhausted, "sfdisk");
 		return 0;
 	}
 	fdin = open(restore_sector_file, O_RDONLY);
diff --git a/sh.c b/sh.c
index b96b464..e446ad1 100644
--- a/sh.c
+++ b/sh.c
@@ -127,8 +127,11 @@
 
 static const char shell_usage[] =
 
-	"sh [FILE]...\n\n" "The BusyBox command interpreter (shell).\n\n";
-
+	"sh [FILE]...\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nlash: The BusyBox command interpreter (shell).\n\n"
+#endif
+	;
 
 static char cwd[1024];
 static char *prompt = "# ";
diff --git a/shell/lash.c b/shell/lash.c
index b96b464..e446ad1 100644
--- a/shell/lash.c
+++ b/shell/lash.c
@@ -127,8 +127,11 @@
 
 static const char shell_usage[] =
 
-	"sh [FILE]...\n\n" "The BusyBox command interpreter (shell).\n\n";
-
+	"sh [FILE]...\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nlash: The BusyBox command interpreter (shell).\n\n"
+#endif
+	;
 
 static char cwd[1024];
 static char *prompt = "# ";
diff --git a/sleep.c b/sleep.c
index 9687b84..13f07c0 100644
--- a/sleep.c
+++ b/sleep.c
@@ -24,7 +24,11 @@
 #include "internal.h"
 #include <stdio.h>
 
-const char sleep_usage[] = "sleep N\n\n" "Pause for N seconds.\n";
+const char sleep_usage[] = "sleep N\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPause for N seconds.\n"
+#endif
+	;
 
 extern int sleep_main(int argc, char **argv)
 {
diff --git a/sort.c b/sort.c
index 49eb4fd..1edc7d1 100644
--- a/sort.c
+++ b/sort.c
@@ -33,7 +33,11 @@
 #ifdef BB_FEATURE_SORT_REVERSE
 " [-r]"
 #endif
-" [FILE]...\n\nSorts lines of text in the specified files\n";
+" [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+"\nSorts lines of text in the specified files\n"
+#endif
+;
 
 #ifdef BB_FEATURE_SORT_REVERSE
 #define APPLY_REVERSE(x) (reverse ? -(x) : (x))
@@ -300,4 +304,4 @@
 	exit(0);
 }
 
-/* $Id: sort.c,v 1.15 2000/04/17 04:22:09 beppu Exp $ */
+/* $Id: sort.c,v 1.16 2000/05/12 19:41:47 erik Exp $ */
diff --git a/swaponoff.c b/swaponoff.c
index aa961da..0f8c4f5 100644
--- a/swaponoff.c
+++ b/swaponoff.c
@@ -36,16 +36,22 @@
 static const char *appName;
 
 static const char swapoff_usage[] =
-	"swapoff [OPTION] [device]\n\n"
-	"Stop swapping virtual memory pages on the given device.\n\n"
+	"swapoff [OPTION] [device]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nStop swapping virtual memory pages on the given device.\n\n"
 	"Options:\n"
-	"\t-a\tStop swapping on all swap devices\n";
+	"\t-a\tStop swapping on all swap devices\n"
+#endif
+	;
 
 static const char swapon_usage[] =
-	"swapon [OPTION] [device]\n\n"
-	"Start swapping virtual memory pages on the given device.\n\n"
+	"swapon [OPTION] [device]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nStart swapping virtual memory pages on the given device.\n\n"
 	"Options:\n"
-	"\t-a\tStart swapping on all swap devices\n";
+	"\t-a\tStart swapping on all swap devices\n"
+#endif
+	;
 
 
 #define SWAPON_APP   1
diff --git a/sync.c b/sync.c
index f8160c8..33c7922 100644
--- a/sync.c
+++ b/sync.c
@@ -27,7 +27,11 @@
 extern int sync_main(int argc, char **argv)
 {
 	if (argc > 1 && **(argv + 1) == '-') {
-		usage("sync\n\nWrite all buffered filesystem blocks to disk.\n");
+		usage("sync\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nWrite all buffered filesystem blocks to disk.\n"
+#endif
+				);
 	}
 	exit(sync());
 }
diff --git a/sysklogd/logger.c b/sysklogd/logger.c
index db6d9bf..118a5de 100644
--- a/sysklogd/logger.c
+++ b/sysklogd/logger.c
@@ -48,14 +48,17 @@
 #endif
 
 static const char logger_usage[] =
-	"logger [OPTION]... [MESSAGE]\n\n"
-	"Write MESSAGE to the system log.  If MESSAGE is '-', log stdin.\n\n"
+	"logger [OPTION]... [MESSAGE]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nWrite MESSAGE to the system log.  If MESSAGE is '-', log stdin.\n\n"
 	"Options:\n"
 	"\t-s\tLog to stderr as well as the system log.\n"
 	"\t-t\tLog using the specified tag (defaults to user name).\n"
 
 	"\t-p\tEnter the message with the specified priority.\n"
-	"\t\tThis may be numerical or a ``facility.level'' pair.\n";
+	"\t\tThis may be numerical or a ``facility.level'' pair.\n"
+#endif
+	;
 
 
 /* Decode a symbolic name to a numeric value 
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index cacb629..faa6f15 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -64,8 +64,9 @@
 static char LocalHostName[32];
 
 static const char syslogd_usage[] =
-	"syslogd [OPTION]...\n\n"
-	"Linux system and kernel (provides klogd) logging utility.\n"
+	"syslogd [OPTION]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nLinux system and kernel (provides klogd) logging utility.\n"
 	"Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n"
 	"Options:\n"
 	"\t-m\tChange the mark timestamp interval. default=20min. 0=off\n"
@@ -73,7 +74,9 @@
 #ifdef BB_KLOGD
 	"\t-K\tDo not start up the klogd process (by default syslogd spawns klogd).\n"
 #endif
-	"\t-O\tSpecify an alternate log file.  default=/var/log/messages\n";
+	"\t-O\tSpecify an alternate log file.  default=/var/log/messages\n"
+#endif
+	;
 
 /* Note: There is also a function called "message()" in init.c */
 /* Print a message to the log file. */
diff --git a/syslogd.c b/syslogd.c
index cacb629..faa6f15 100644
--- a/syslogd.c
+++ b/syslogd.c
@@ -64,8 +64,9 @@
 static char LocalHostName[32];
 
 static const char syslogd_usage[] =
-	"syslogd [OPTION]...\n\n"
-	"Linux system and kernel (provides klogd) logging utility.\n"
+	"syslogd [OPTION]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nLinux system and kernel (provides klogd) logging utility.\n"
 	"Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n"
 	"Options:\n"
 	"\t-m\tChange the mark timestamp interval. default=20min. 0=off\n"
@@ -73,7 +74,9 @@
 #ifdef BB_KLOGD
 	"\t-K\tDo not start up the klogd process (by default syslogd spawns klogd).\n"
 #endif
-	"\t-O\tSpecify an alternate log file.  default=/var/log/messages\n";
+	"\t-O\tSpecify an alternate log file.  default=/var/log/messages\n"
+#endif
+	;
 
 /* Note: There is also a function called "message()" in init.c */
 /* Print a message to the log file. */
diff --git a/tail.c b/tail.c
index 321c5c4..3b3e2f5 100644
--- a/tail.c
+++ b/tail.c
@@ -47,6 +47,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <ctype.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
 
 #define XWRITE(fd, buffer, n_bytes)					\
@@ -70,15 +73,18 @@
 static int print_headers;
 
 const char tail_usage[] =
-	"tail [OPTION] [FILE]...\n\n"
-	"Print last 10 lines of each FILE to standard output.\n"
+	"tail [OPTION] [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint last 10 lines of each FILE to standard output.\n"
 	"With more than one FILE, precede each with a header giving the\n"
 	"file name. With no FILE, or when FILE is -, read standard input.\n\n"
 	"Options:\n"
 	"\t-n NUM\t\tPrint last NUM lines instead of first 10\n"
 
 	"\t-f\t\tOutput data as the file grows.  This version\n"
-	"\t\t\tof 'tail -f' supports only one file at a time.\n";
+	"\t\t\tof 'tail -f' supports only one file at a time.\n"
+#endif
+	;
 
 
 static void write_header(const char *filename)
@@ -512,9 +518,9 @@
 static int have_read_stdin;
 
 
-static const char tail_usage[] = "tail [OPTION]... [FILE]...\n\
-\n\
-Print last 10 lines of each FILE to standard output.\n\
+static const char tail_usage[] = "tail [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+"\nPrint last 10 lines of each FILE to standard output.\n\
 With more than one FILE, precede each with a header giving the file name.\n\
 With no FILE, or when FILE is -, read standard input.\n\
 \n\
@@ -523,11 +529,12 @@
   -n=N            output the last N lines, instead of last 10\n\
   -q              never output headers giving file names\n\
   -v              always output headers giving file names\n\
-  --help          display this help and exit\n\
 \n\
 If the first character of N (bytes or lines) is a `+', output begins with \n\
 the Nth item from the start of each file, otherwise, print the last N items\n\
-in the file.  N bytes may be suffixed by k (x1024), b (x512), or m (1024^2).\n\n";
+in the file.  N bytes may be suffixed by k (x1024), b (x512), or m (1024^2).\n"
+#endif
+;
 
 static void write_header(const char *filename, const char *comment)
 {
diff --git a/tar.c b/tar.c
index c82e51f..6784d80 100644
--- a/tar.c
+++ b/tar.c
@@ -60,8 +60,9 @@
 #if defined BB_FEATURE_TAR_EXCLUDE
 	"[--exclude File] "
 #endif
-	"[-f tarFile] [FILE] ...\n\n"
-	"Create, extract, or list files from a tar file.  Note that\n"
+	"[-f tarFile] [FILE] ...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCreate, extract, or list files from a tar file.  Note that\n"
 	"this version of tar treats hard links as separate files.\n\n"
 	"Main operation mode:\n"
 #ifdef BB_FEATURE_TAR_CREATE
@@ -77,6 +78,7 @@
 #endif
 	"\nInformative output:\n"
 	"\tv\t\tverbosely list files processed\n"
+#endif
 	;
 
 /* Tar file constants  */
diff --git a/tee.c b/tee.c
index 95b75ed..a78edc0 100644
--- a/tee.c
+++ b/tee.c
@@ -27,12 +27,14 @@
 #include <stdio.h>
 
 static const char tee_usage[] =
-	"tee [OPTION]... [FILE]...\n\n"
-	"Copy standard input to each FILE, and also to standard output.\n\n"
+	"tee [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nCopy standard input to each FILE, and also to standard output.\n\n"
 	"Options:\n" "\t-a\tappend to the given FILEs, do not overwrite\n"
 #if 0
 	"\t-i\tignore interrupt signals\n"
 #endif
+#endif
 ;
 
 
@@ -131,4 +133,4 @@
 	exit(0);
 }
 
-/* $Id: tee.c,v 1.9 2000/04/13 01:18:56 erik Exp $ */
+/* $Id: tee.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */
diff --git a/telnet.c b/telnet.c
index 8c58521..8b6d5f5 100644
--- a/telnet.c
+++ b/telnet.c
@@ -1,5 +1,5 @@
 /*
- * $Id: telnet.c,v 1.2 2000/05/01 19:10:52 erik Exp $
+ * $Id: telnet.c,v 1.3 2000/05/12 19:41:47 erik Exp $
  * Mini telnet implementation for busybox
  *
  * Copyright (C) 2000 by Randolph Chung <tausq@debian.org>
@@ -46,7 +46,12 @@
 
 static int STDIN = 0;
 static int STDOUT = 1;
-static const char *telnet_usage = "telnet host [port]\n\n";
+static const char *telnet_usage = "telnet host [port]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nProvides interactive communication with another\n"
+	"networked host using the TELNET protocol\n"
+#endif
+	;
 static struct termios saved_tc;
 static unsigned char options[NTELOPTS];
 static char tr_state = 0; /* telnet send and receive state */
diff --git a/test.c b/test.c
index 0ed7771..9b541e3 100644
--- a/test.c
+++ b/test.c
@@ -39,6 +39,9 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
 /* test(1) accepts the following grammar:
 	oexpr	::= aexpr | aexpr "-o" oexpr ;
@@ -185,11 +188,14 @@
 			fatalError("missing ]");
 		argv[argc] = NULL;
 	}
-	if (strcmp(argv[1], "--help") == 0) {
+	if (strcmp(argv[1], dash_dash_help) == 0) {
 		usage("test EXPRESSION\n"
-			  "or   [ EXPRESSION ]\n\n"
-				"Checks file types and compares values returning an exit\n"
-				"code determined by the value of EXPRESSION.\n");
+			  "or   [ EXPRESSION ]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nChecks file types and compares values returning an exit\n"
+				"code determined by the value of EXPRESSION.\n"
+#endif
+				);
 	}
 
 	/* Implement special cases from POSIX.2, section 4.62.4 */
diff --git a/touch.c b/touch.c
index f8972dc..2076928 100644
--- a/touch.c
+++ b/touch.c
@@ -31,9 +31,11 @@
 #include <errno.h>
 
 
-static const char touch_usage[] = "touch [-c] file [file ...]\n\n"
-
-	"Update the last-modified date on the given file[s].\n";
+static const char touch_usage[] = "touch [-c] file [file ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nUpdate the last-modified date on the given file[s].\n"
+#endif
+	;
 
 
 
diff --git a/tty.c b/tty.c
index 6f98d1b..3a318eb 100644
--- a/tty.c
+++ b/tty.c
@@ -24,10 +24,13 @@
 #include <stdio.h>
 #include <sys/types.h>
 
-static const char tty_usage[] = "tty\n\n"
-	"Print the file name of the terminal connected to standard input.\n\n"
+static const char tty_usage[] = "tty\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint the file name of the terminal connected to standard input.\n\n"
 	"Options:\n"
-	"\t-s\tprint nothing, only return an exit status\n";
+	"\t-s\tprint nothing, only return an exit status\n"
+#endif
+	;
 
 extern int tty_main(int argc, char **argv)
 {
diff --git a/umount.c b/umount.c
index 18a5afe..86833b7 100644
--- a/umount.c
+++ b/umount.c
@@ -30,8 +30,10 @@
 
 
 static const char umount_usage[] =
-	"umount [flags] filesystem|directory\n\n"
-	"Flags:\n" "\t-a:\tUnmount all file systems"
+	"umount [flags] filesystem|directory\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"Unmount file systems\n"
+	"\nFlags:\n" "\t-a:\tUnmount all file systems"
 #ifdef BB_MTAB
 	" in /etc/mtab\n\t-n:\tDon't erase /etc/mtab entries\n"
 #else
@@ -44,6 +46,7 @@
 #if defined BB_FEATURE_MOUNT_LOOP
 	"\t-l:\tDo not free loop device (if a loop device has been used)\n"
 #endif
+#endif
 ;
 
 struct _mtab_entry_t {
diff --git a/uniq.c b/uniq.c
index 0324856..0cccbd5 100644
--- a/uniq.c
+++ b/uniq.c
@@ -28,9 +28,12 @@
 #include <errno.h>
 
 static const char uniq_usage[] =
-	"uniq [OPTION]... [INPUT [OUTPUT]]\n\n"
-	"Discard all but one of successive identical lines from INPUT\n"
-	"(or standard input), writing to OUTPUT (or standard output).\n";
+	"uniq [OPTION]... [INPUT [OUTPUT]]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nDiscard all but one of successive identical lines from INPUT\n"
+	"(or standard input), writing to OUTPUT (or standard output).\n"
+#endif
+	;
 
 /* max chars in line */
 #define UNIQ_MAX 4096
@@ -184,4 +187,4 @@
 	exit(0);
 }
 
-/* $Id: uniq.c,v 1.9 2000/04/17 16:16:10 erik Exp $ */
+/* $Id: uniq.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */
diff --git a/update.c b/update.c
index 18b13e8..14f1d3c 100644
--- a/update.c
+++ b/update.c
@@ -35,12 +35,15 @@
 #endif							/* __GLIBC__ */
 
 static char update_usage[] =
-	"update [options]\n\n"
-	"Periodically flushes filesystem buffers.\n\n"
+	"update [options]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPeriodically flushes filesystem buffers.\n\n"
 	"Options:\n"
 	"\t-S\tforce use of sync(2) instead of flushing\n"
 	"\t-s SECS\tcall sync this often (default 30)\n"
-	"\t-f SECS\tflush some buffers this often (default 5)\n";
+	"\t-f SECS\tflush some buffers this often (default 5)\n"
+#endif
+	;
 
 static unsigned int sync_duration = 30;
 static unsigned int flush_duration = 5;
diff --git a/usleep.c b/usleep.c
index dcb40d6..34008a6 100644
--- a/usleep.c
+++ b/usleep.c
@@ -25,7 +25,11 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-const char usleep_usage[] = "usleep N\n\n" "Pause for N microseconds.\n";
+const char usleep_usage[] = "usleep N\n" 
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPause for N microseconds.\n"
+#endif
+	;
 
 extern int usleep_main(int argc, char **argv)
 {
diff --git a/util-linux/fbset.c b/util-linux/fbset.c
index 4e5609e..de4c824 100644
--- a/util-linux/fbset.c
+++ b/util-linux/fbset.c
@@ -105,9 +105,9 @@
 	"-vsync", 1, CMD_VSYNC}, {
 	"-laced", 1, CMD_LACED}, {
 	"-double", 1, CMD_DOUBLE}, {
-	"--help", 0, CMD_HELP}, {
+	"-help", 0, CMD_HELP}, {
 #ifdef BB_FEATURE_FBSET_FANCY
-	"--help", 0, CMD_HELP}, {
+	"-help", 0, CMD_HELP}, {
 	"-all", 0, CMD_ALL}, {
 	"-xres", 1, CMD_XRES}, {
 	"-yres", 1, CMD_YRES}, {
@@ -115,7 +115,7 @@
 	"-vyres", 1, CMD_VYRES}, {
 	"-depth", 1, CMD_DEPTH}, {
 	"-match", 0, CMD_MATCH}, {
-	"--geometry", 5, CMD_GEOMETRY}, {
+	"-geometry", 5, CMD_GEOMETRY}, {
 	"-pixclock", 1, CMD_PIXCLOCK}, {
 	"-left", 1, CMD_LEFT}, {
 	"-right", 1, CMD_RIGHT}, {
@@ -123,7 +123,7 @@
 	"-lower", 1, CMD_LOWER}, {
 	"-hslen", 1, CMD_HSLEN}, {
 	"-vslen", 1, CMD_VSLEN}, {
-	"--timings", 7, CMD_TIMING}, {
+	"-timings", 7, CMD_TIMING}, {
 	"-csync", 1, CMD_CSYNC}, {
 	"-gsync", 1, CMD_GSYNC}, {
 	"-extsync", 1, CMD_EXTSYNC}, {
@@ -221,17 +221,21 @@
 
 static void fbset_usage(void)
 {
+#ifndef BB_FEATURE_TRIVIAL_HELP
 	int i;
+#endif
 
 #ifndef STANDALONE
 	fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
 			BB_VER, BB_BT);
 #endif
-	fprintf(stderr, "Usage: fbset [options] [mode]\n\n");
-	fprintf(stderr, "Show and modify frame buffer device settings\n\n");
+	fprintf(stderr, "Usage: fbset [options] [mode]\n");
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	fprintf(stderr, "\nShows and modifies frame buffer device settings\n\n");
 	fprintf(stderr, "The following options are recognized:\n");
 	for (i = 0; g_cmdoptions[i].name; i++)
 		fprintf(stderr, "\t%s\n", g_cmdoptions[i].name);
+#endif
 	exit(-1);
 }
 
diff --git a/util-linux/fdflush.c b/util-linux/fdflush.c
index 56ea224..4ec0a88 100644
--- a/util-linux/fdflush.c
+++ b/util-linux/fdflush.c
@@ -34,7 +34,11 @@
 	int fd;
 
 	if (argc <= 1 || **(++argv) == '-') {
-		usage("fdflush device\n\nForce floppy disk drive to detect disk change\n");
+		usage("fdflush DEVICE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nForces floppy disk drive to detect disk change\n"
+#endif
+				);
 	}
 
 	fd = open(*argv, 0);
diff --git a/util-linux/freeramdisk.c b/util-linux/freeramdisk.c
index d373bcb..4106cf1 100644
--- a/util-linux/freeramdisk.c
+++ b/util-linux/freeramdisk.c
@@ -34,8 +34,11 @@
 
 
 static const char freeramdisk_usage[] =
-	"freeramdisk DEVICE\n\n"
-	"Free all memory used by the specified ramdisk.\n";
+	"freeramdisk DEVICE\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nFrees all memory used by the specified ramdisk.\n"
+#endif
+	;
 
 extern int
 freeramdisk_main(int argc, char **argv)
diff --git a/util-linux/fsck_minix.c b/util-linux/fsck_minix.c
index c890dff..7d27566 100644
--- a/util-linux/fsck_minix.c
+++ b/util-linux/fsck_minix.c
@@ -198,9 +198,10 @@
 {
 	fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
 			BB_VER, BB_BT);
-	fprintf(stderr, "Usage: %s [-larvsmf] /dev/name\n\n", program_name);
+	fprintf(stderr, "Usage: %s [-larvsmf] /dev/name\n", program_name);
+#ifndef BB_FEATURE_TRIVIAL_HELP
 	fprintf(stderr,
-			"Performs a consistency check for MINIX filesystems.\n\n");
+			"\nPerforms a consistency check for MINIX filesystems.\n\n");
 	fprintf(stderr, "OPTIONS:\n");
 	fprintf(stderr, "\t-l\tLists all filenames\n");
 	fprintf(stderr, "\t-r\tPerform interactive repairs\n");
@@ -210,6 +211,7 @@
 	fprintf(stderr,
 			"\t-m\tActivates MINIX-like \"mode not cleared\" warnings\n");
 	fprintf(stderr, "\t-f\tForce file system check.\n\n");
+#endif
 	leave(16);
 }
 
diff --git a/util-linux/mkfs_minix.c b/util-linux/mkfs_minix.c
index be180a4..bf4bda9 100644
--- a/util-linux/mkfs_minix.c
+++ b/util-linux/mkfs_minix.c
@@ -179,9 +179,10 @@
 	fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
 			BB_VER, BB_BT);
 	fprintf(stderr,
-			"Usage: %s [-c | -l filename] [-nXX] [-iXX] /dev/name [blocks]\n\n",
+			"Usage: %s [-c | -l filename] [-nXX] [-iXX] /dev/name [blocks]\n",
 			program_name);
-	fprintf(stderr, "Make a MINIX filesystem.\n\n");
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	fprintf(stderr, "\nMake a MINIX filesystem.\n\n");
 	fprintf(stderr, "OPTIONS:\n");
 	fprintf(stderr, "\t-c\t\tCheck the device for bad blocks\n");
 	fprintf(stderr,
@@ -191,6 +192,7 @@
 	fprintf(stderr,
 			"\t-l FILENAME\tRead the bad blocks list from FILENAME\n");
 	fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n");
+#endif
 	exit(16);
 }
 
diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c
index 17866a7..7d76916 100644
--- a/util-linux/mkswap.c
+++ b/util-linux/mkswap.c
@@ -49,13 +49,16 @@
 
 
 static const char mkswap_usage[] =
-	"mkswap [-c] [-v0|-v1] device [block-count]\n\n"
-	"Prepare a disk partition to be used as a swap partition.\n\n"
+	"mkswap [-c] [-v0|-v1] device [block-count]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrepare a disk partition to be used as a swap partition.\n\n"
 	"Options:\n" "\t-c\t\tCheck for read-ability.\n"
 	"\t-v0\t\tMake version 0 swap [max 128 Megs].\n"
 	"\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n"
 
-	"\tblock-count\tNumber of block to use (default is entire partition).\n";
+	"\tblock-count\tNumber of block to use (default is entire partition).\n"
+#endif
+	;
 
 
 #ifndef _IO
diff --git a/util-linux/more.c b/util-linux/more.c
index 30d2757..5044686 100644
--- a/util-linux/more.c
+++ b/util-linux/more.c
@@ -30,8 +30,15 @@
 #include <fcntl.h>
 #include <signal.h>
 #include <sys/ioctl.h>
+#define BB_DECLARE_EXTERN
+#define bb_need_help
+#include "messages.c"
 
-static const char more_usage[] = "more [file ...]\n";
+static const char more_usage[] = "more [FILE ...]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nMore is a filter for viewing FILE one screenful at a time.\n"
+#endif
+	;
 
 /* ED: sparc termios is broken: revert back to old termio handling. */
 #ifdef BB_FEATURE_USE_TERMIOS
@@ -92,7 +99,7 @@
 	argv++;
 
 	if (argc > 0
-		&& (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0)) {
+		&& (strcmp(*argv, dash_dash_help) == 0 || strcmp(*argv, "-h") == 0)) {
 		usage(more_usage);
 	}
 	do {
diff --git a/util-linux/mount.c b/util-linux/mount.c
index 00a774a..bde55d1 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -64,10 +64,12 @@
 
 extern const char mtab_file[];	/* Defined in utility.c */
 
-static const char mount_usage[] = "\tmount [flags]\n"
-	"\tmount [flags] device directory [-o options,more-options]\n"
-	"\n" "Flags:\n" 
-	"\t-a:\t\tMount all file systems in fstab.\n"
+static const char mount_usage[] = 
+	"mount [flags] device directory [-o options,more-options]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nMount a filesystem\n\n"
+	"Flags:\n" 
+	"\t-a:\t\tMount all filesystems in fstab.\n"
 #ifdef BB_MTAB
 	"\t-f:\t\t\"Fake\" mount. Add entry to mount table but don't mount it.\n"
 	"\t-n:\t\tDon't write a mount table entry.\n"
@@ -88,8 +90,10 @@
 	"\tsuid/nosuid:\tAllow set-user-id-root programs / disallow them.\n"
 	"\tremount:\tRe-mount a currently-mounted filesystem, changing its flags.\n"
 	"\tro/rw:\t\tMount for read-only / read-write.\n"
-	"There are EVEN MORE flags that are specific to each filesystem.\n"
-	"You'll have to see the written documentation for those.\n";
+	"\nThere are EVEN MORE flags that are specific to each filesystem.\n"
+	"You'll have to see the written documentation for those.\n"
+#endif
+	;
 
 
 struct mount_options {
@@ -451,7 +455,7 @@
 			fatalError( "\nCannot read /etc/fstab: %s\n", strerror (errno));
 
 		while ((m = getmntent(f)) != NULL) {
-			// If the file system isn't noauto, 
+			// If the filesystem isn't noauto, 
 			// and isn't swap or nfs, then mount it
 			if ((!strstr(m->mnt_opts, "noauto")) &&
 				(!strstr(m->mnt_type, "swap")) &&
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c
index aa961da..0f8c4f5 100644
--- a/util-linux/swaponoff.c
+++ b/util-linux/swaponoff.c
@@ -36,16 +36,22 @@
 static const char *appName;
 
 static const char swapoff_usage[] =
-	"swapoff [OPTION] [device]\n\n"
-	"Stop swapping virtual memory pages on the given device.\n\n"
+	"swapoff [OPTION] [device]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nStop swapping virtual memory pages on the given device.\n\n"
 	"Options:\n"
-	"\t-a\tStop swapping on all swap devices\n";
+	"\t-a\tStop swapping on all swap devices\n"
+#endif
+	;
 
 static const char swapon_usage[] =
-	"swapon [OPTION] [device]\n\n"
-	"Start swapping virtual memory pages on the given device.\n\n"
+	"swapon [OPTION] [device]\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nStart swapping virtual memory pages on the given device.\n\n"
 	"Options:\n"
-	"\t-a\tStart swapping on all swap devices\n";
+	"\t-a\tStart swapping on all swap devices\n"
+#endif
+	;
 
 
 #define SWAPON_APP   1
diff --git a/util-linux/umount.c b/util-linux/umount.c
index 18a5afe..86833b7 100644
--- a/util-linux/umount.c
+++ b/util-linux/umount.c
@@ -30,8 +30,10 @@
 
 
 static const char umount_usage[] =
-	"umount [flags] filesystem|directory\n\n"
-	"Flags:\n" "\t-a:\tUnmount all file systems"
+	"umount [flags] filesystem|directory\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"Unmount file systems\n"
+	"\nFlags:\n" "\t-a:\tUnmount all file systems"
 #ifdef BB_MTAB
 	" in /etc/mtab\n\t-n:\tDon't erase /etc/mtab entries\n"
 #else
@@ -44,6 +46,7 @@
 #if defined BB_FEATURE_MOUNT_LOOP
 	"\t-l:\tDo not free loop device (if a loop device has been used)\n"
 #endif
+#endif
 ;
 
 struct _mtab_entry_t {
diff --git a/utility.c b/utility.c
index 5899fe9..11ee7c6 100644
--- a/utility.c
+++ b/utility.c
@@ -33,6 +33,7 @@
  || defined (BB_INSMOD)
 /* same conditions as recursiveAction */
 #define bb_need_name_too_long
+#define bb_need_memory_exhausted
 #endif
 #define BB_DECLARE_EXTERN
 #include "messages.c"
@@ -111,7 +112,6 @@
 	exit( FALSE);
 }
 
-#if defined BB_INIT
 /* Returns kernel version encoded as major*65536 + minor*256 + patch,
  * so, for example,  to check if the kernel is greater than 2.2.11:
  *     if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> }
@@ -128,9 +128,7 @@
 	sscanf(name.version, "%d.%d.%d", &major, &minor, &patch);
 	return major * 65536 + minor * 256 + patch;
 }
-#endif                                                 /* BB_INIT */
 
-#if defined (BB_CP_MV) || defined (BB_DU)
 
 #define HASH_SIZE	311		/* Should be prime */
 #define hash_inode(i)	((i) % HASH_SIZE)
@@ -197,9 +195,7 @@
 	}
 }
 
-#endif /* BB_CP_MV || BB_DU */
 
-#if defined (BB_CP_MV) || defined (BB_DU) || defined (BB_LN)
 /*
  * Return TRUE if a fileName is a directory.
  * Nonexistant files return FALSE.
@@ -230,9 +226,7 @@
 	}
 	return status;
 }
-#endif
 
-#if defined (BB_CP_MV)
 /*
  * Copy one file to another, while possibly preserving its modes, times, and
  * modes.  Returns TRUE if successful, or FALSE on a failure with an error
@@ -382,12 +376,9 @@
 
 	return FALSE;
 }
-#endif							/* BB_CP_MV */
 
 
 
-#if defined BB_TAR || defined BB_LS
-
 #define TYPEINDEX(mode) (((mode) >> 12) & 0x0f)
 #define TYPECHAR(mode)  ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)])
 
@@ -429,10 +420,8 @@
 	}
 	return buf;
 }
-#endif							/* BB_TAR || BB_LS */
 
 
-#if defined BB_TAR
 /*
  * Return the standard ls-like time string from a time_t
  * This is static and so is overwritten on each call.
@@ -457,9 +446,7 @@
 
 	return buf;
 }
-#endif							/* BB_TAR */
 
-#if defined BB_TAR || defined BB_CP_MV
 /*
  * Write all of the supplied buffer out to a file.
  * This does multiple writes as necessary.
@@ -485,10 +472,8 @@
 
 	return total;
 }
-#endif							/* BB_TAR || BB_CP_MV */
 
 
-#if defined BB_TAR || defined BB_TAIL
 /*
  * Read all of the supplied buffer from a file.
  * This does multiple reads as necessary.
@@ -518,16 +503,8 @@
 
 	return total;
 }
-#endif							/* BB_TAR || BB_TAIL */
 
 
-#if defined (BB_CHMOD_CHOWN_CHGRP) \
- || defined (BB_CP_MV)			\
- || defined (BB_FIND)			\
- || defined (BB_INSMOD)			\
- || defined (BB_RM)				\
- || defined (BB_TAR)
-
 /*
  * Walk down all the directories under the specified 
  * location, and do something (something specified
@@ -640,11 +617,9 @@
 	return TRUE;
 }
 
-#endif							/* BB_CHMOD_CHOWN_CHGRP || BB_CP_MV || BB_FIND || BB_LS || BB_INSMOD */
 
 
 
-#if defined (BB_TAR) || defined (BB_MKDIR)
 /*
  * Attempt to create the directories along the specified path, except for
  * the final component.  The mode is given for the final directory only,
@@ -674,15 +649,10 @@
 	}
 	return TRUE;
 }
-#endif							/* BB_TAR || BB_MKDIR */
 
 
 
-#if defined (BB_CHMOD_CHOWN_CHGRP) || defined (BB_MKDIR)
 /* [ugoa]{+|-|=}[rwxst] */
-
-
-
 extern int parse_mode(const char *s, mode_t * theMode)
 {
 	mode_t andMode =
@@ -775,14 +745,9 @@
 }
 
 
-#endif							/* BB_CHMOD_CHOWN_CHGRP || BB_MKDIR */
 
 
 
-
-
-#if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS || defined BB_TAR || defined BB_ID 
-
 /* This parses entries in /etc/passwd and /etc/group.  This is desirable
  * for BusyBox, since we want to avoid using the glibc NSS stuff, which
  * increases target size and is often not needed or wanted for embedded
@@ -887,10 +852,6 @@
 	return gid;
 }
 
-#endif /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR || BB_ID */ 
-
-
-#if (defined BB_CHVT) || (defined BB_DEALLOCVT)
 
 
 #include <linux/kd.h>
@@ -975,11 +936,9 @@
 }
 
 
-#endif							/* BB_CHVT || BB_DEALLOCVT */
 
 
-#if !defined BB_REGEXP && (defined BB_GREP || defined BB_SED)
-
+#if !defined BB_REGEXP
 /* Do a case insensitive strstr() */
 char *stristr(char *haystack, const char *needle)
 {
@@ -1050,11 +1009,9 @@
 	else
 		return FALSE;
 }
-
-#endif							/* ! BB_REGEXP && (BB_GREP || BB_SED) */
+#endif							/* ! BB_REGEXP */
 
 
-#if defined BB_FIND
 /*
  * Routine to see if a text string is matched by a wildcard pattern.
  * Returns TRUE if the text is matched, or FALSE if it is not matched
@@ -1154,12 +1111,10 @@
 
 	return TRUE;
 }
-#endif							/* BB_FIND */
 
 
 
 
-#if defined BB_DF || defined BB_MTAB
 /*
  * Given a block device, find the mount table entry if that block device
  * is mounted.
@@ -1198,11 +1153,9 @@
 	endmntent(mountTable);
 	return mountEntry;
 }
-#endif							/* BB_DF || BB_MTAB */
 
 
 
-#if defined BB_DD || defined BB_TAIL
 /*
  * Read a number with a possible multiplier.
  * Returns -1 if the number format is illegal.
@@ -1249,10 +1202,8 @@
 
 	return value;
 }
-#endif							/* BB_DD || BB_TAIL */
 
 
-#if defined BB_INIT || defined BB_SYSLOGD
 /* try to open up the specified device */
 extern int device_open(char *device, int mode)
 {
@@ -1271,15 +1222,11 @@
 		fcntl(fd, F_SETFL, mode);
 	return fd;
 }
-#endif							/* BB_INIT BB_SYSLOGD */
 
 
-#if defined BB_KILLALL || ( defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF ))
 #ifdef BB_FEATURE_USE_DEVPS_PATCH
 #include <linux/devps.h>
-#endif
 
-#if defined BB_FEATURE_USE_DEVPS_PATCH
 /* findPidByName()
  *  
  *  This finds the pid of the specified process,
@@ -1336,7 +1283,7 @@
 				&& (strlen(pidName) == strlen(info.command_line))) {
 			pidList=realloc( pidList, sizeof(pid_t) * (j+2));
 			if (pidList==NULL)
-				fatalError("out of memory\n");
+				fatalError(memory_exhausted, "");
 			pidList[j++]=info.pid;
 		}
 	}
@@ -1409,7 +1356,7 @@
 				&& (strlen(pidName) == strlen(p))) {
 			pidList=realloc( pidList, sizeof(pid_t) * (i+2));
 			if (pidList==NULL)
-				fatalError("out of memory\n");
+				fatalError(memory_exhausted, "");
 			pidList[i++]=strtol(next->d_name, NULL, 0);
 		}
 	}
@@ -1418,7 +1365,6 @@
 	return pidList;
 }
 #endif							/* BB_FEATURE_USE_DEVPS_PATCH */
-#endif							/* BB_KILLALL || ( BB_FEATURE_LINUXRC && ( BB_HALT || BB_REBOOT || BB_POWEROFF )) */
 
 /* this should really be farmed out to libbusybox.a */
 extern void *xmalloc(size_t size)
@@ -1426,11 +1372,11 @@
 	void *cp = malloc(size);
 
 	if (cp == NULL)
-		fatalError("out of memory\n");
+		fatalError(memory_exhausted, "");
 	return cp;
 }
 
-#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT)
+#if (__GLIBC__ < 2)
 extern int vdprintf(int d, const char *format, va_list ap)
 {
 	char buf[BUF_SIZE];
@@ -1439,9 +1385,8 @@
 	len = vsprintf(buf, format, ap);
 	return write(d, buf, len);
 }
-#endif							/* BB_SYSLOGD */
+#endif
 
-#if defined BB_FEATURE_MOUNT_LOOP
 extern int del_loop(const char *device)
 {
 	int fd;
@@ -1525,9 +1470,7 @@
 	}
 	return NULL;
 }
-#endif							/* BB_FEATURE_MOUNT_LOOP */
 
-#if defined BB_MOUNT || defined BB_DF || ( defined BB_UMOUNT && ! defined BB_MTAB)
 extern int find_real_root_device_name(char* name)
 {
 	DIR *dir;
@@ -1569,7 +1512,6 @@
 
 	return( FALSE);
 }
-#endif
 
 const unsigned int CSTRING_BUFFER_LENGTH = 128;
 /* recursive parser that returns cstrings of arbitrary length
diff --git a/wc.c b/wc.c
index 030afa9..57bc713 100644
--- a/wc.c
+++ b/wc.c
@@ -23,15 +23,18 @@
 #include "internal.h"
 #include <stdio.h>
 
-static const char wc_usage[] = "wc [OPTION]... [FILE]...\n\n"
-	"Print line, word, and byte counts for each FILE, and a total line if\n"
+static const char wc_usage[] = "wc [OPTION]... [FILE]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrint line, word, and byte counts for each FILE, and a total line if\n"
 	"more than one FILE is specified.  With no FILE, read standard input.\n\n"
 	"Options:\n"
 	"\t-c\tprint the byte counts\n"
 	"\t-l\tprint the newline counts\n"
 
 	"\t-L\tprint the length of the longest line\n"
-	"\t-w\tprint the word counts\n";
+	"\t-w\tprint the word counts\n"
+#endif
+	;
 
 static int total_lines, total_words, total_chars, max_length;
 static int print_lines, print_words, print_chars, print_length;
diff --git a/whoami.c b/whoami.c
index f9d3f28..da58479 100644
--- a/whoami.c
+++ b/whoami.c
@@ -24,8 +24,11 @@
 #include <stdio.h>
 #include <pwd.h>
 
-static const char whoami_usage[] = "whoami\n\n"
-	"Prints the user name associated with the current effective user id.\n";
+static const char whoami_usage[] = "whoami\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+	"\nPrints the user name associated with the current effective user id.\n"
+#endif
+	;
 
 extern int whoami_main(int argc, char **argv)
 {
diff --git a/yes.c b/yes.c
index a822ebc..97b6f65 100644
--- a/yes.c
+++ b/yes.c
@@ -28,8 +28,11 @@
 	int i;
 
 	if (argc >=1 && *argv[1]=='-') {
-		usage("yes [OPTION]... [STRING]...\n\n"
-				"Repeatedly outputs a line with all specified STRING(s), or `y'.\n");
+		usage("yes [OPTION]... [STRING]...\n"
+#ifndef BB_FEATURE_TRIVIAL_HELP
+				"\nRepeatedly outputs a line with all specified STRING(s), or `y'.\n"
+#endif
+				);
 	}
 
 	if (argc == 1) {