diff --git a/Config.in b/Config.in
index 416ffaa..a7c3149 100644
--- a/Config.in
+++ b/Config.in
@@ -298,7 +298,7 @@
 config BUILD_LIBBUSYBOX
 	bool "Build shared libbusybox"
 	default n
-	depends on !FEATURE_PREFER_APPLETS && !PIE
+	depends on !FEATURE_PREFER_APPLETS && !PIE && !STATIC
 	help
 	  Build a shared library libbusybox.so.N.N.N which contains all
 	  busybox code.
diff --git a/Makefile b/Makefile
index 3a9630a..6d0cc38 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 11
-SUBLEVEL = 0
+SUBLEVEL = 1
 EXTRAVERSION =
 NAME = Unnamed
 
diff --git a/applets/individual.c b/applets/individual.c
index 414a11b..341f4d1 100644
--- a/applets/individual.c
+++ b/applets/individual.c
@@ -14,13 +14,11 @@
 int main(int argc, char **argv)
 {
 	applet_name = argv[0];
-
 	return APPLET_main(argc,argv);
 }
 
 void bb_show_usage(void)
 {
-	printf(APPLET_full_usage "\n");
-
+	fputs(APPLET_full_usage "\n", stdout);
 	exit(EXIT_FAILURE);
 }
diff --git a/archival/libunarchive/decompress_bunzip2.c b/archival/libunarchive/decompress_bunzip2.c
index 8f35bc5..e034814 100644
--- a/archival/libunarchive/decompress_bunzip2.c
+++ b/archival/libunarchive/decompress_bunzip2.c
@@ -66,7 +66,6 @@
  *  | grep 'bd->' | sed 's/^.*bd->/bd->/' | sort | $PAGER
  * and moved it (inbufBitCount) to offset 0.
  */
-
 struct bunzip_data {
 	/* I/O tracking data (file handles, buffers, positions, etc.) */
 	unsigned inbufBitCount, inbufBits;
@@ -102,11 +101,9 @@
 
 	/* If we need to get more data from the byte buffer, do so.  (Loop getting
 	   one byte at a time to enforce endianness and avoid unaligned access.) */
-
 	while ((int)(bd->inbufBitCount) < bits_wanted) {
 
 		/* If we need to read more data from file into byte buffer, do so */
-
 		if (bd->inbufPos == bd->inbufCount) {
 			/* if "no input fd" case: in_fd == -1, read fails, we jump */
 			bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE);
@@ -116,7 +113,6 @@
 		}
 
 		/* Avoid 32-bit overflow (dump bit buffer to top of output) */
-
 		if (bd->inbufBitCount >= 24) {
 			bits = bd->inbufBits & ((1 << bd->inbufBitCount) - 1);
 			bits_wanted -= bd->inbufBitCount;
@@ -125,13 +121,11 @@
 		}
 
 		/* Grab next 8 bits of input from buffer. */
-
 		bd->inbufBits = (bd->inbufBits << 8) | bd->inbuf[bd->inbufPos++];
 		bd->inbufBitCount += 8;
 	}
 
 	/* Calculate result */
-
 	bd->inbufBitCount -= bits_wanted;
 	bits |= (bd->inbufBits >> bd->inbufBitCount) & ((1 << bits_wanted) - 1);
 
@@ -139,7 +133,6 @@
 }
 
 /* Unpacks the next block and sets up for the inverse burrows-wheeler step. */
-
 static int get_next_block(bunzip_data *bd)
 {
 	struct group_data *hufGroup;
@@ -153,13 +146,11 @@
 	selectors = bd->selectors;
 
 	/* Reset longjmp I/O error handling */
-
 	i = setjmp(bd->jmpbuf);
 	if (i) return i;
 
 	/* Read in header signature and CRC, then validate signature.
 	   (last block signature means CRC is for whole file, return now) */
-
 	i = get_bits(bd, 24);
 	j = get_bits(bd, 24);
 	bd->headerCRC = get_bits(bd, 32);
@@ -169,7 +160,6 @@
 	/* We can add support for blockRandomised if anybody complains.  There was
 	   some code for this in busybox 1.0.0-pre3, but nobody ever noticed that
 	   it didn't actually work. */
-
 	if (get_bits(bd, 1)) return RETVAL_OBSOLETE_INPUT;
 	origPtr = get_bits(bd, 24);
 	if ((int)origPtr > dbufSize) return RETVAL_DATA_ERROR;
@@ -179,7 +169,6 @@
 	   symbols to deal with, and writes a sparse bitfield indicating which
 	   values were present.  We make a translation table to convert the symbols
 	   back to the corresponding bytes. */
-
 	t = get_bits(bd, 16);
 	symTotal = 0;
 	for (i = 0; i < 16; i++) {
@@ -192,7 +181,6 @@
 	}
 
 	/* How many different Huffman coding groups does this block use? */
-
 	groupCount = get_bits(bd, 3);
 	if (groupCount < 2 || groupCount > MAX_GROUPS)
 		return RETVAL_DATA_ERROR;
@@ -201,19 +189,16 @@
 	   group.  Read in the group selector list, which is stored as MTF encoded
 	   bit runs.  (MTF=Move To Front, as each value is used it's moved to the
 	   start of the list.) */
-
 	nSelectors = get_bits(bd, 15);
 	if (!nSelectors) return RETVAL_DATA_ERROR;
 	for (i = 0; i < groupCount; i++) mtfSymbol[i] = i;
 	for (i = 0; i < nSelectors; i++) {
 
 		/* Get next value */
-
 		for (j = 0; get_bits(bd, 1); j++)
 			if (j >= groupCount) return RETVAL_DATA_ERROR;
 
 		/* Decode MTF to get the next selector */
-
 		uc = mtfSymbol[j];
 		for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1];
 		mtfSymbol[0] = selectors[i] = uc;
@@ -221,10 +206,11 @@
 
 	/* Read the Huffman coding tables for each group, which code for symTotal
 	   literal symbols, plus two run symbols (RUNA, RUNB) */
-
 	symCount = symTotal + 2;
 	for (j = 0; j < groupCount; j++) {
-		unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1];
+		unsigned char length[MAX_SYMBOLS];
+		/* 8 bits is ALMOST enough for temp[], see below */
+		unsigned temp[MAX_HUFCODE_BITS+1];
 		int minLen, maxLen, pp;
 
 		/* Read Huffman code lengths for each symbol.  They're stored in
@@ -233,7 +219,6 @@
 		   (Subtracting 1 before the loop and then adding it back at the end is
 		   an optimization that makes the test inside the loop simpler: symbol
 		   length 0 becomes negative, so an unsigned inequality catches it.) */
-
 		t = get_bits(bd, 5) - 1;
 		for (i = 0; i < symCount; i++) {
 			for (;;) {
@@ -243,7 +228,6 @@
 				/* If first bit is 0, stop.  Else second bit indicates whether
 				   to increment or decrement the value.  Optimization: grab 2
 				   bits and unget the second if the first was 0. */
-
 				k = get_bits(bd, 2);
 				if (k < 2) {
 					bd->inbufBitCount++;
@@ -251,17 +235,14 @@
 				}
 
 				/* Add one if second bit 1, else subtract 1.  Avoids if/else */
-
 				t += (((k+1) & 2) - 1);
 			}
 
 			/* Correct for the initial -1, to get the final symbol length */
-
 			length[i] = t + 1;
 		}
 
 		/* Find largest and smallest lengths in this group */
-
 		minLen = maxLen = length[0];
 		for (i = 1; i < symCount; i++) {
 			if (length[i] > maxLen) maxLen = length[i];
@@ -278,7 +259,6 @@
 		 * number of bits can have.  This is how the Huffman codes can vary in
 		 * length: each code with a value>limit[length] needs another bit.
 		 */
-
 		hufGroup = bd->groups + j;
 		hufGroup->minLen = minLen;
 		hufGroup->maxLen = maxLen;
@@ -286,12 +266,10 @@
 		/* Note that minLen can't be smaller than 1, so we adjust the base
 		   and limit array pointers so we're not always wasting the first
 		   entry.  We do this again when using them (during symbol decoding).*/
-
 		base = hufGroup->base - 1;
 		limit = hufGroup->limit - 1;
 
 		/* Calculate permute[].  Concurently, initialize temp[] and limit[]. */
-
 		pp = 0;
 		for (i = minLen; i <= maxLen; i++) {
 			temp[i] = limit[i] = 0;
@@ -301,14 +279,14 @@
 		}
 
 		/* Count symbols coded for at each bit length */
-
+		/* NB: in pathological cases, temp[8] can end ip being 256.
+		 * That's why uint8_t is too small for temp[]. */
 		for (i = 0; i < symCount; i++) temp[length[i]]++;
 
 		/* Calculate limit[] (the largest symbol-coding value at each bit
 		 * length, which is (previous limit<<1)+symbols at this level), and
 		 * base[] (number of symbols to ignore at each bit length, which is
 		 * limit minus the cumulative count of symbols coded for already). */
-
 		pp = t = 0;
 		for (i = minLen; i < maxLen; i++) {
 			pp += temp[i];
@@ -319,7 +297,6 @@
 			   each level we're really only interested in the first few bits,
 			   so here we set all the trailing to-be-ignored bits to 1 so they
 			   don't affect the value>limit[length] comparison. */
-
 			limit[i] = (pp << (maxLen - i)) - 1;
 			pp <<= 1;
 			t += temp[i];
@@ -335,7 +312,6 @@
 	   and run length encoding, saving the result into dbuf[dbufCount++] = uc */
 
 	/* Initialize symbol occurrence counters and symbol Move To Front table */
-
 	memset(byteCount, 0, sizeof(byteCount)); /* smaller, maybe slower? */
 	for (i = 0; i < 256; i++) {
 		//byteCount[i] = 0;
@@ -347,8 +323,7 @@
 	runPos = dbufCount = selector = 0;
 	for (;;) {
 
-		/* fetch next Huffman coding group from list. */
-
+		/* Fetch next Huffman coding group from list. */
 		symCount = GROUP_SIZE - 1;
 		if (selector >= nSelectors) return RETVAL_DATA_ERROR;
 		hufGroup = bd->groups + selectors[selector++];
@@ -367,7 +342,6 @@
 		   dry).  The following (up to got_huff_bits:) is equivalent to
 		   j = get_bits(bd, hufGroup->maxLen);
 		 */
-
 		while ((int)(bd->inbufBitCount) < hufGroup->maxLen) {
 			if (bd->inbufPos == bd->inbufCount) {
 				j = get_bits(bd, hufGroup->maxLen);
@@ -382,13 +356,11 @@
  got_huff_bits:
 
 		/* Figure how how many bits are in next symbol and unget extras */
-
 		i = hufGroup->minLen;
 		while (j > limit[i]) ++i;
 		bd->inbufBitCount += (hufGroup->maxLen - i);
 
 		/* Huffman decode value to get nextSym (with bounds checking) */
-
 		if (i > hufGroup->maxLen)
 			return RETVAL_DATA_ERROR;
 		j = (j >> (hufGroup->maxLen - i)) - base[i];
@@ -400,11 +372,9 @@
 		   byte, or a repeated run of the most recent literal byte.  First,
 		   check if nextSym indicates a repeated run, and if so loop collecting
 		   how many times to repeat the last literal. */
-
 		if ((unsigned)nextSym <= SYMBOL_RUNB) { /* RUNA or RUNB */
 
 			/* If this is the start of a new run, zero out counter */
-
 			if (!runPos) {
 				runPos = 1;
 				t = 0;
@@ -417,7 +387,6 @@
 			   the basic or 0/1 method (except all bits 0, which would use no
 			   symbols, but a run of length 0 doesn't mean anything in this
 			   context).  Thus space is saved. */
-
 			t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */
 			if (runPos < dbufSize) runPos <<= 1;
 			goto end_of_huffman_loop;
@@ -427,7 +396,6 @@
 		   how many times to repeat the last literal, so append that many
 		   copies to our buffer of decoded symbols (dbuf) now.  (The last
 		   literal used is the one at the head of the mtfSymbol array.) */
-
 		if (runPos) {
 			runPos = 0;
 			if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR;
@@ -438,7 +406,6 @@
 		}
 
 		/* Is this the terminating symbol? */
-
 		if (nextSym > symTotal) break;
 
 		/* At this point, nextSym indicates a new literal character.  Subtract
@@ -448,7 +415,6 @@
 		   first symbol in the mtf array, position 0, would have been handled
 		   as part of a run above.  Therefore 1 unused mtf position minus
 		   2 non-literal nextSym values equals -1.) */
-
 		if (dbufCount >= dbufSize) return RETVAL_DATA_ERROR;
 		i = nextSym - 1;
 		uc = mtfSymbol[i];
@@ -457,7 +423,6 @@
 		 * small number of symbols, and are bound by 256 in any case, using
 		 * memmove here would typically be bigger and slower due to function
 		 * call overhead and other assorted setup costs. */
-
 		do {
 			mtfSymbol[i] = mtfSymbol[i-1];
 		} while (--i);
@@ -465,13 +430,11 @@
 		uc = symToByte[uc];
 
 		/* We have our literal byte.  Save it into dbuf. */
-
 		byteCount[uc]++;
 		dbuf[dbufCount++] = (unsigned)uc;
 
 		/* Skip group initialization if we're not done with this group.  Done
 		 * this way to avoid compiler warning. */
-
  end_of_huffman_loop:
 		if (symCount--) goto continue_this_group;
 	}
@@ -484,7 +447,6 @@
 	 */
 
 	/* Turn byteCount into cumulative occurrence counts of 0 to n-1. */
-
 	j = 0;
 	for (i = 0; i < 256; i++) {
 		k = j + byteCount[i];
@@ -493,7 +455,6 @@
 	}
 
 	/* Figure out what order dbuf would be in if we sorted it. */
-
 	for (i = 0; i < dbufCount; i++) {
 		uc = (unsigned char)(dbuf[i] & 0xff);
 		dbuf[byteCount[uc]] |= (i << 8);
@@ -503,11 +464,10 @@
 	/* Decode first byte by hand to initialize "previous" byte.  Note that it
 	   doesn't get output, and if the first three characters are identical
 	   it doesn't qualify as a run (hence writeRunCountdown=5). */
-
 	if (dbufCount) {
 		if ((int)origPtr >= dbufCount) return RETVAL_DATA_ERROR;
 		bd->writePos = dbuf[origPtr];
-	    bd->writeCurrent = (unsigned char)(bd->writePos & 0xff);
+		bd->writeCurrent = (unsigned char)(bd->writePos & 0xff);
 		bd->writePos >>= 8;
 		bd->writeRunCountdown = 5;
 	}
@@ -522,7 +482,6 @@
    error (all errors are negative numbers).  If out_fd!=-1, outbuf and len
    are ignored, data is written to out_fd and return is RETVAL_OK or error.
 */
-
 int read_bunzip(bunzip_data *bd, char *outbuf, int len)
 {
 	const unsigned *dbuf;
@@ -539,19 +498,15 @@
 	/* We will always have pending decoded data to write into the output
 	   buffer unless this is the very first call (in which case we haven't
 	   Huffman-decoded a block into the intermediate buffer yet). */
-
 	if (bd->writeCopies) {
 
 		/* Inside the loop, writeCopies means extra copies (beyond 1) */
-
 		--bd->writeCopies;
 
 		/* Loop outputting bytes */
-
 		for (;;) {
 
 			/* If the output buffer is full, snapshot state and return */
-
 			if (gotcount >= len) {
 				bd->writePos = pos;
 				bd->writeCurrent = current;
@@ -560,13 +515,11 @@
 			}
 
 			/* Write next byte into output buffer, updating CRC */
-
 			outbuf[gotcount++] = current;
 			bd->writeCRC = (bd->writeCRC << 8)
-						  ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current];
+				^ bd->crc32Table[(bd->writeCRC >> 24) ^ current];
 
 			/* Loop now if we're outputting multiple copies of this byte */
-
 			if (bd->writeCopies) {
 				--bd->writeCopies;
 				continue;
@@ -582,35 +535,29 @@
 			/* After 3 consecutive copies of the same byte, the 4th
 			 * is a repeat count.  We count down from 4 instead
 			 * of counting up because testing for non-zero is faster */
-
 			if (--bd->writeRunCountdown) {
 				if (current != previous)
 					bd->writeRunCountdown = 4;
 			} else {
 
 				/* We have a repeated run, this byte indicates the count */
-
 				bd->writeCopies = current;
 				current = previous;
 				bd->writeRunCountdown = 5;
 
 				/* Sometimes there are just 3 bytes (run length 0) */
-
 				if (!bd->writeCopies) goto decode_next_byte;
 
 				/* Subtract the 1 copy we'd output anyway to get extras */
-
 				--bd->writeCopies;
 			}
 		}
 
 		/* Decompression of this block completed successfully */
-
 		bd->writeCRC = ~bd->writeCRC;
 		bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bd->writeCRC;
 
 		/* If this block had a CRC error, force file level CRC error. */
-
 		if (bd->writeCRC != bd->headerCRC) {
 			bd->totalCRC = bd->headerCRC + 1;
 			return RETVAL_LAST_BLOCK;
@@ -619,7 +566,6 @@
 
 	/* Refill the intermediate buffer by Huffman-decoding next block of input */
 	/* (previous is just a convenient unused temp variable here) */
-
 	previous = get_next_block(bd);
 	if (previous) {
 		bd->writeCount = previous;
@@ -631,7 +577,6 @@
 	goto decode_next_byte;
 }
 
-
 /* Allocate the structure, read file header.  If in_fd==-1, inbuf must contain
    a complete bunzip file (len bytes long).  If in_fd!=-1, inbuf and len are
    ignored, and data is read from file handle into temporary buffer. */
@@ -639,7 +584,6 @@
 /* Because bunzip2 is used for help text unpacking, and because bb_show_usage()
    should work for NOFORK applets too, we must be extremely careful to not leak
    any allocations! */
-
 int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
 						int len)
 {
@@ -650,16 +594,13 @@
 	};
 
 	/* Figure out how much data to allocate */
-
 	i = sizeof(bunzip_data);
 	if (in_fd != -1) i += IOBUF_SIZE;
 
 	/* Allocate bunzip_data.  Most fields initialize to zero. */
-
 	bd = *bdp = xzalloc(i);
 
 	/* Setup input buffer */
-
 	bd->in_fd = in_fd;
 	if (-1 == in_fd) {
 		/* in this case, bd->inbuf is read-only */
@@ -669,22 +610,18 @@
 		bd->inbuf = (unsigned char *)(bd + 1);
 
 	/* Init the CRC32 table (big endian) */
-
 	crc32_filltable(bd->crc32Table, 1);
 
 	/* Setup for I/O error handling via longjmp */
-
 	i = setjmp(bd->jmpbuf);
 	if (i) return i;
 
 	/* Ensure that file starts with "BZh['1'-'9']." */
-
 	i = get_bits(bd, 32);
 	if ((unsigned)(i - BZh0 - 1) >= 9) return RETVAL_NOT_BZIP_DATA;
 
-	/* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of
+	/* Fourth byte (ascii '1'-'9') indicates block size in units of 100k of
 	   uncompressed data.  Allocate intermediate buffer for block. */
-
 	bd->dbufSize = 100000 * (i - BZh0);
 
 	/* Cannot use xmalloc - may leak bd in NOFORK case! */
@@ -704,7 +641,6 @@
 
 
 /* Decompress src_fd to dst_fd.  Stops at end of bzip data, not end of file. */
-
 USE_DESKTOP(long long) int
 unpack_bz2_stream(int src_fd, int dst_fd)
 {
@@ -761,9 +697,9 @@
 	char c;
 
 	if (i < 0)
-		fprintf(stderr,"%s\n", bunzip_errors[-i]);
+		fprintf(stderr, "%s\n", bunzip_errors[-i]);
 	else if (read(STDIN_FILENO, &c, 1))
-		fprintf(stderr,"Trailing garbage ignored\n");
+		fprintf(stderr, "Trailing garbage ignored\n");
 	return -i;
 }
 #endif
diff --git a/coreutils/uname.c b/coreutils/uname.c
index 2eecb5d..76fd3ca 100644
--- a/coreutils/uname.c
+++ b/coreutils/uname.c
@@ -17,7 +17,7 @@
    -m, --machine	sun
    -a, --all		SunOS rocky8 4.0  sun
 
-   The default behavior is equivalent to `-s'.
+   The default behavior is equivalent to '-s'.
 
    David MacKenzie <djm@gnu.ai.mit.edu> */
 
@@ -39,47 +39,43 @@
 } uname_info_t;
 
 static const char options[] ALIGN1 = "snrvmpa";
-static const unsigned short utsname_offset[] ALIGN2 = {
-	offsetof(uname_info_t,name.sysname),
-	offsetof(uname_info_t,name.nodename),
-	offsetof(uname_info_t,name.release),
-	offsetof(uname_info_t,name.version),
-	offsetof(uname_info_t,name.machine),
-	offsetof(uname_info_t,processor)
+static const unsigned short utsname_offset[] = {
+	offsetof(uname_info_t, name.sysname),
+	offsetof(uname_info_t, name.nodename),
+	offsetof(uname_info_t, name.release),
+	offsetof(uname_info_t, name.version),
+	offsetof(uname_info_t, name.machine),
+	offsetof(uname_info_t, processor)
 };
 
 int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int uname_main(int argc, char **argv)
+int uname_main(int argc ATTRIBUTE_UNUSED, char **argv)
 {
 	uname_info_t uname_info;
 #if defined(__sparc__) && defined(__linux__)
 	char *fake_sparc = getenv("FAKE_SPARC");
 #endif
-	const unsigned short int *delta;
+	const unsigned short *delta;
 	char toprint;
 
 	toprint = getopt32(argv, options);
 
-	if (argc != optind) {
+	if (argv[optind]) { /* coreutils-6.9 compat */
 		bb_show_usage();
 	}
 
-	if (toprint & (1 << 6)) {
+	if (toprint & (1 << 6)) { /* -a => all opts on */
 		toprint = 0x3f;
 	}
 
-	if (toprint == 0) {
-		toprint = 1;			/* sysname */
+	if (toprint == 0) { /* no opts => -s (sysname) */
+		toprint = 1;
 	}
 
-	if (uname(&uname_info.name) == -1) {
-		bb_error_msg_and_die("cannot get system name");
-	}
+	uname(&uname_info.name); /* never fails */
 
 #if defined(__sparc__) && defined(__linux__)
-	if ((fake_sparc != NULL)
-		&& ((fake_sparc[0] == 'y')
-			|| (fake_sparc[0] == 'Y'))) {
+	if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') {
 		strcpy(uname_info.name.machine, "sparc");
 	}
 #endif
@@ -89,7 +85,8 @@
 	delta = utsname_offset;
 	do {
 		if (toprint & 1) {
-			printf(((char *)(&uname_info)) + *delta);
+			/* printf would not be safe here */
+			fputs((char *)(&uname_info) + *delta, stdout);
 			if (toprint > 1) {
 				bb_putchar(' ');
 			}
@@ -98,5 +95,5 @@
 	} while (toprint >>= 1);
 	bb_putchar('\n');
 
-	fflush_stdout_and_exit(EXIT_SUCCESS);
+	fflush_stdout_and_exit(EXIT_SUCCESS); /* coreutils-6.9 compat */
 }
diff --git a/coreutils/who.c b/coreutils/who.c
index a206ec5..72fc404 100644
--- a/coreutils/who.c
+++ b/coreutils/who.c
@@ -56,16 +56,20 @@
 	printf("USER       TTY      IDLE      TIME            HOST\n");
 	while ((ut = getutent()) != NULL) {
 		if (ut->ut_user[0] && (opt || ut->ut_type == USER_PROCESS)) {
+			time_t tmp;
 			/* ut->ut_line is device name of tty - "/dev/" */
 			name = concat_path_file("/dev", ut->ut_line);
 			str6[0] = '?';
 			str6[1] = '\0';
 			if (stat(name, &st) == 0)
 				idle_string(str6, st.st_atime);
+			/* manpages say ut_tv.tv_sec *is* time_t,
+			 * but some systems have it wrong */
+			tmp = ut->ut_tv.tv_sec;
 			/* 15 chars for time:   Nov 10 19:33:20 */
 			printf("%-10s %-8s %-9s %-15.15s %s\n",
 					ut->ut_user, ut->ut_line, str6,
-					ctime(&(ut->ut_tv.tv_sec)) + 4, ut->ut_host);
+					ctime(&tmp) + 4, ut->ut_host);
 			if (ENABLE_FEATURE_CLEAN_UP)
 				free(name);
 		}
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index 86ec710..459fb77 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -326,7 +326,9 @@
 	char *signame;
 	char *startas;
 	char *chuid;
+#ifdef OLDER_VERSION_OF_X
 	struct stat execstat;
+#endif
 #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
 //	char *retry_arg = NULL;
 //	int retries = -1;
@@ -361,6 +363,8 @@
 
 	if (!(opt & OPT_a))
 		startas = execname;
+	if (!execname) /* in case -a is given and -x is not */
+		execname = startas;
 
 //	USE_FEATURE_START_STOP_DAEMON_FANCY(
 //		if (retry_arg)
@@ -374,7 +378,8 @@
 		if (errno)
 			user_id = xuname2uid(userspec);
 	}
-	do_procinit(); /* Both start and stop needs to know current processes */
+	/* Both start and stop need to know current processes */
+	do_procinit();
 
 	if (opt & CTX_STOP) {
 		int i = do_stop();
@@ -383,17 +388,21 @@
 
 	if (found) {
 		if (!QUIET)
-			printf("%s already running\n%d\n", execname, found->pid);
+			printf("%s is already running\n%u\n", execname, (unsigned)found->pid);
 		return !(opt & OPT_OKNODO);
 	}
 
+#ifdef OLDER_VERSION_OF_X
 	if (execname)
 		xstat(execname, &execstat);
+#endif
 
 	*--argv = startas;
 	if (opt & OPT_BACKGROUND) {
 #if BB_MMU
-		bb_daemonize(0);
+		bb_daemonize(DAEMON_DEVNULL_STDIO + DAEMON_CLOSE_EXTRA_FDS);
+		/* DAEMON_DEVNULL_STDIO is superfluous -
+		 * it's always done by bb_daemonize() */
 #else
 		pid_t pid = vfork();
 		if (pid < 0) /* error */
@@ -404,19 +413,18 @@
 			 * so "return 0" may do bad things */
 			_exit(EXIT_SUCCESS);
 		}
-		/* child */
+		/* Child */
 		setsid(); /* detach from controlling tty */
 		/* Redirect stdio to /dev/null, close extra FDs.
 		 * We do not actually daemonize because of DAEMON_ONLY_SANITIZE */
-		bb_daemonize_or_rexec(
-			DAEMON_DEVNULL_STDIO
+		bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO
 			+ DAEMON_CLOSE_EXTRA_FDS
 			+ DAEMON_ONLY_SANITIZE,
 			NULL /* argv, unused */ );
 #endif
 	}
 	if (opt & OPT_MAKEPID) {
-		/* user wants _us_ to make the pidfile */
+		/* User wants _us_ to make the pidfile */
 		write_pidfile(pidfile);
 	}
 	if (opt & OPT_c) {
@@ -434,6 +442,6 @@
 		}
 	}
 #endif
-	execv(startas, argv);
+	execvp(startas, argv);
 	bb_perror_msg_and_die("cannot start %s", startas);
 }
diff --git a/editors/awk.c b/editors/awk.c
index fef3246..cc5dc84 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -681,11 +681,6 @@
 	return (isalnum(c) || c == '_');
 }
 
-static FILE *afopen(const char *path, const char *mode)
-{
-	return (*path == '-' && *(path+1) == '\0') ? stdin : xfopen(path, mode);
-}
-
 /* -------- working with variables (set/get/copy/etc) -------- */
 
 static xhash *iamarray(var *v)
@@ -2740,7 +2735,7 @@
 			ind = getvar_s(incvar(intvar[ARGIND]));
 			fname = getvar_s(findvar(iamarray(intvar[ARGV]), ind));
 			if (fname && *fname && !is_assignment(fname))
-				F = afopen(fname, "r");
+				F = xfopen_stdin(fname);
 		}
 	} while (!F);
 
@@ -2757,8 +2752,9 @@
 {
 	unsigned opt;
 	char *opt_F, *opt_W;
-	llist_t *opt_v = NULL;
-	int i, j, flen;
+	llist_t *list_v = NULL;
+	llist_t *list_f = NULL;
+	int i, j;
 	var *v;
 	var tv;
 	char **envp;
@@ -2816,35 +2812,33 @@
 			*s1 = '=';
 		}
 	}
-	opt_complementary = "v::";
-	opt = getopt32(argv, "F:v:f:W:", &opt_F, &opt_v, &g_progname, &opt_W);
+	opt_complementary = "v::f::"; /* -v and -f can occur multiple times */
+	opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, &opt_W);
 	argv += optind;
 	argc -= optind;
 	if (opt & 0x1)
 		setvar_s(intvar[FS], opt_F); // -F
-	while (opt_v) { /* -v */
-		if (!is_assignment(llist_pop(&opt_v)))
+	while (list_v) { /* -v */
+		if (!is_assignment(llist_pop(&list_v)))
 			bb_show_usage();
 	}
-	if (opt & 0x4) { // -f
-		char *s = s; /* die, gcc, die */
-		FILE *from_file = afopen(g_progname, "r");
-		/* one byte is reserved for some trick in next_token */
-		if (fseek(from_file, 0, SEEK_END) == 0) {
-			flen = ftell(from_file);
-			s = xmalloc(flen + 4);
-			fseek(from_file, 0, SEEK_SET);
-			i = 1 + fread(s + 1, 1, flen, from_file);
-		} else {
+	if (list_f) { /* -f */
+		do {
+			char *s = NULL;
+			FILE *from_file;
+
+			g_progname = llist_pop(&list_f);
+			from_file = xfopen_stdin(g_progname);
+			/* one byte is reserved for some trick in next_token */
 			for (i = j = 1; j > 0; i += j) {
 				s = xrealloc(s, i + 4096);
 				j = fread(s + i, 1, 4094, from_file);
 			}
-		}
-		s[i] = '\0';
-		fclose(from_file);
-		parse_program(s + 1);
-		free(s);
+			s[i] = '\0';
+			fclose(from_file);
+			parse_program(s + 1);
+			free(s);
+		} while (list_f);
 	} else { // no -f: take program from 1st parameter
 		if (!argc)
 			bb_show_usage();
diff --git a/editors/vi.c b/editors/vi.c
index 1b335d9..81baa89 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -1894,7 +1894,7 @@
 		p           = new_text + (p           - text);
 		text = new_text;
 	}
-	memmove(p + size, p, end - p);
+	memmove(p + size, p, end - size - p);
 	memset(p, ' ', size);	// clear new hole
 	file_modified++;
 	return p;
diff --git a/include/usage.h b/include/usage.h
index df89580..ceac6d0 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -3637,9 +3637,7 @@
        "$ cat TODO | split -a 2 -l 2 TODO_\n"
 
 #define start_stop_daemon_trivial_usage \
-       "[OPTIONS] [" \
-	USE_GETOPT_LONG("--start|--stop") SKIP_GETOPT_LONG("-S|-K") \
-       "] ... [-- arguments...]"
+       "[OPTIONS] [-S|-K] ... [-- arguments...]"
 #define start_stop_daemon_full_usage "\n\n" \
        "Search for matching processes, and then\n" \
        "-S: stop all matching processes.\n" \
diff --git a/libbb/print_flags.c b/libbb/print_flags.c
index 413f516..a1dcc01 100644
--- a/libbb/print_flags.c
+++ b/libbb/print_flags.c
@@ -19,8 +19,8 @@
 				labels);
 			need_separator = separator;
 			flags &= ~ *masks;
-			masks++;
 		}
+		masks++;
 		labels += strlen(labels) + 1;
 	}
 	return flags;
diff --git a/miscutils/last.c b/miscutils/last.c
index 612f504..da353fb 100644
--- a/miscutils/last.c
+++ b/miscutils/last.c
@@ -117,6 +117,8 @@
 					strcpy(ut.ut_line, "system boot");
 			}
 		}
+		/* manpages say ut_tv.tv_sec *is* time_t,
+		 * but some systems have it wrong */
 		t_tmp = (time_t)ut.ut_tv.tv_sec;
 		printf("%-10s %-14s %-18s %-12.12s\n",
 		       ut.ut_user, ut.ut_line, ut.ut_host, ctime(&t_tmp) + 4);
diff --git a/miscutils/last_fancy.c b/miscutils/last_fancy.c
index 2b7fee6..d4d35b1 100644
--- a/miscutils/last_fancy.c
+++ b/miscutils/last_fancy.c
@@ -48,8 +48,12 @@
 	char logout_time[8];
 	const char *logout_str;
 	const char *duration_str;
+	time_t tmp;
 
-	safe_strncpy(login_time, ctime(&(ut->ut_tv.tv_sec)), 17);
+	/* manpages say ut_tv.tv_sec *is* time_t,
+	 * but some systems have it wrong */
+	tmp = ut->ut_tv.tv_sec;
+	safe_strncpy(login_time, ctime(&tmp), 17);
 	snprintf(logout_time, 8, "- %s", ctime(&dur_secs) + 11);
 
 	dur_secs = MAX(dur_secs - (time_t)ut->ut_tv.tv_sec, (time_t)0);
diff --git a/miscutils/man.c b/miscutils/man.c
index 278e5a3..dc8fa44 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -73,7 +73,7 @@
 	char *sec_list;
 	char *cur_path, *cur_sect;
 	char *line, *value;
-	int count_mp, alloc_mp, cur_mp;
+	int count_mp, cur_mp;
 	int opt;
 
 	opt_complementary = "-1"; /* at least one argument */
@@ -81,8 +81,8 @@
 	argv += optind;
 
 	sec_list = xstrdup("1:2:3:4:5:6:7:8:9");
-	alloc_mp = 10;
-	man_path_list = xmalloc(10 * sizeof(man_path_list[0]));
+	/* Last valid man_path_list[] is [0x10] */
+	man_path_list = xzalloc(0x11 * sizeof(man_path_list[0]));
 	count_mp = 0;
 	man_path_list[0] = xstrdup(getenv("MANPATH"));
 	if (man_path_list[0])
@@ -107,11 +107,13 @@
 				if (strcmp("MANPATH", line) == 0) {
 					man_path_list[count_mp] = xstrdup(value);
 					count_mp++;
-					if (alloc_mp == count_mp) {
-						alloc_mp += 10;
-						man_path_list = xrealloc(man_path_list, alloc_mp * sizeof(man_path_list[0]));
+					/* man_path_list is NULL terminated */
+					man_path_list[count_mp] = NULL;
+					if (!(count_mp & 0xf)) { /* 0x10, 0x20 etc */
+						/* so that last valid man_path_list[] is [count_mp + 0x10] */
+						man_path_list = xrealloc(man_path_list,
+							(count_mp + 0x11) * sizeof(man_path_list[0]));
 					}
-					/* thus man_path_list is always NULL terminated */
 				}
 				if (strcmp("MANSECT", line) == 0) {
 					free(sec_list);
diff --git a/scripts/mkmakefile b/scripts/mkmakefile
new file mode 100755
index 0000000..7f9d544
--- /dev/null
+++ b/scripts/mkmakefile
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Generates a small Makefile used in the root of the output
+# directory, to allow make to be started from there.
+# The Makefile also allow for more convinient build of external modules
+
+# Usage
+# $1 - Kernel src directory
+# $2 - Output directory
+# $3 - version
+# $4 - patchlevel
+
+
+test ! -r $2/Makefile -o -O $2/Makefile || exit 0
+echo "  GEN     $2/Makefile"
+
+cat << EOF > $2/Makefile
+# Automatically generated by $0: don't edit
+
+VERSION = $3
+PATCHLEVEL = $4
+
+KERNELSRC    := $1
+KERNELOUTPUT := $2
+
+MAKEFLAGS += --no-print-directory
+
+.PHONY: all \$(MAKECMDGOALS)
+
+all:
+	\$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT)
+
+Makefile:;
+
+\$(filter-out all Makefile,\$(MAKECMDGOALS)) %/:
+	\$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@
+EOF
