diff --git a/init/init.c b/init/init.c
index c32124d..0676bf7 100644
--- a/init/init.c
+++ b/init/init.c
@@ -41,144 +41,88 @@
 #include <sys/vt.h>            /* for vt_stat */
 #include <sys/ioctl.h>
 
-static const char  init_usage[] = "Used internally by the system.";
-static char        console[16] = "";
-static const char* default_console = "/dev/tty2";
-static char*       first_terminal = NULL;
-static const char* second_terminal = "/dev/tty2";
-static const char* log = "/dev/tty3";
-static char* term_ptr = NULL;
+#define DEBUG_INIT
 
-static void
-message(const char* terminal, const char * pattern, ...)
+#define CONSOLE         "/dev/console"          /* Logical system console */
+#define VT_PRIMARY      "/dev/tty0"             /* Virtual console master */
+#define VT_SECONDARY    "/dev/tty1"             /* Virtual console master */
+#define VT_LOG          "/dev/tty2"             /* Virtual console master */
+#define SHELL           "/bin/sh"               /* Default shell */
+#define INITSCRIPT      "/etc/init.d/rcS"       /* Initscript. */
+#define PATH_DEFAULT    "PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin"
+
+static int maxproclen=0;
+static char* argv0;
+
+static char* console = CONSOLE;
+static char* second_terminal = "/dev/tty2";
+static char* log = "/dev/tty3";
+
+
+
+/* try to open up the specified device */
+int device_open(char* device, int mode)
 {
-	int	fd;
-	FILE *	con = 0;
-	va_list	arguments;
+    int m, f, fd = -1;
+    
+    mode = m | O_NONBLOCK;
+    
+    /* Retry up to 5 times */
+    for(f = 0; f < 5; f++)
+	if ((fd = open(device, m)) >= 0) break;
+    if (fd < 0) return fd;
+    /* Set original flags. */
+    if (m != mode)
+	fcntl(fd, F_SETFL, mode);
+    return fd;
+}
 
-	/*
-	 * Open the console device each time a message is printed. If the user
-	 * has switched consoles, the open will get the new console. If we kept
-	 * the console open, we'd always print to the same one.
-	 */
-	if ( !terminal
-	 ||  ((fd = open(terminal, O_WRONLY|O_NOCTTY)) < 0)
-	 ||  ((con = fdopen(fd, "w")) == NULL) )
-		return;
-
-	va_start(arguments, pattern);
-	vfprintf(con, pattern, arguments);
+/* print a message to the specified device */
+void message(char* device, char *fmt, ...)
+{
+    int fd;
+    va_list arguments;
+    if ((fd = device_open(device, O_WRONLY|O_NOCTTY|O_NDELAY)) >= 0) {
+	va_start(arguments, fmt);
+	vdprintf(fd, fmt, arguments);
 	va_end(arguments);
-	fclose(con);
+    }
+    close( fd);
 }
 
-static int
-waitfor(int pid)
+/* Set terminal settings to reasonable defaults */
+void set_term()
 {
-	int	status;
-	int	wpid;
-	
-	message(log, "Waiting for process %d.\n", pid);
-	while ( (wpid = wait(&status)) != pid ) {
-		if ( wpid > 0 ) {
-			message(
-			 log
-			,"pid %d exited, status=%x.\n"
-			,wpid
-			,status);
-		}
-	}
-	return wpid;
-}
+    int fd;
+    struct termios tty;
 
-static int
-run(const char* program, const char* const* arguments, 
-	const char* terminal, int get_enter)
-{
-	static const char	control_characters[] = {
-		'\003',
-		'\034',
-		'\177',
-		'\025',
-		'\004',
-		'\0',
-		'\1',
-		'\0',
-		'\021',
-		'\023',
-		'\032',
-		'\0',
-		'\022',
-		'\017',
-		'\027',
-		'\026',
-		'\0'
-	};
+    if ((fd = device_open(console, O_RDWR|O_NOCTTY)) < 0) {
+	message(log, "can't open %s", console);
+	return;
+    }
+    ioctl(fd, TCGETS, &tty);
+    tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD;
+    tty.c_cflag |= HUPCL|CLOCAL;
 
-	static char * environment[] = {
-		"HOME=/",
-		"PATH=/bin:/sbin:/usr/bin:/usr/sbin",
-		"SHELL=/bin/sh",
-		0,
-		"USER=root",
-		0
-	};
+    tty.c_cc[VINTR]  = 3;
+    tty.c_cc[VQUIT]  = 28;
+    tty.c_cc[VERASE] = 127;
+    tty.c_cc[VKILL]  = 24;
+    tty.c_cc[VEOF]   = 4;
+    tty.c_cc[VTIME]  = 0;
+    tty.c_cc[VMIN]   = 1;
+    tty.c_cc[VSTART] = 17;
+    tty.c_cc[VSTOP]  = 19;
+    tty.c_cc[VSUSP]  = 26;
 
-	static const char	press_enter[] =
- "\nPlease press Enter to activate this console. ";
+    /* Set pre and post processing */
+    tty.c_iflag = IGNPAR|ICRNL|IXON|IXANY;
+    tty.c_oflag = OPOST|ONLCR;
+    tty.c_lflag = ISIG|ICANON|ECHO|ECHOCTL|ECHOPRT|ECHOKE;
 
-	int	pid;
-
-	environment[3]=term_ptr;
-
-	pid = fork();
-	if ( pid == 0 ) {
-		struct termios	t;
-		const char * const * arg;
-
-		close(0);
-		close(1);
-		close(2);
-		setsid();
-
-		open(terminal, O_RDWR);
-		dup(0);
-		dup(0);
-		tcsetpgrp(0, getpgrp());
-
-		tcgetattr(0, &t);
-		memcpy(t.c_cc, control_characters, sizeof(control_characters));
-		t.c_line = 0;
-		t.c_iflag = ICRNL|IXON|IXOFF;
-		t.c_oflag = OPOST|ONLCR;
-		t.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOKE|IEXTEN;
-		tcsetattr(0, TCSANOW, &t);
-
-		if ( get_enter ) {
-			/*
-			 * Save memory by not exec-ing anything large (like a shell)
-			 * before the user wants it. This is critical if swap is not
-			 * enabled and the system has low memory. Generally this will
-			 * be run on the second virtual console, and the first will
-			 * be allowed to start a shell or whatever an init script 
-			 * specifies.
-			 */
-			char	c;
-			write(1, press_enter, sizeof(press_enter) - 1);
-			read(0, &c, 1);
-		}
-		
-		message(log, "Executing ");
-		arg = arguments;
-		while ( *arg != 0 )
-			message(log, "%s ", *arg++);
-		message(log, "\n");
-
-		execve(program, (char * *)arguments, (char * *)environment);
-		message(log, "%s: could not execute: %s.\r\n", program, strerror(errno));
-		exit(-1);
-	}
-	return pid;
+    /* Now set the terminal line. */
+    ioctl(fd, TCSETS, &tty);
+    close( fd);
 }
 
 static int
@@ -217,33 +161,168 @@
     fclose(f);
 }
 
+
+static void
+console_init()
+{
+    int fd;
+    int tried_devcons = 0;
+    int tried_vtmaster = 0;
+    char *s;
+
+    if ((s = getenv("CONSOLE")) != NULL)
+	console = s;
+    else {
+	console = CONSOLE;
+	tried_devcons++;
+    }
+    while ((fd = open(console, O_RDONLY|O_NONBLOCK)) < 0) {
+	if (!tried_devcons) {
+	    tried_devcons++;
+	    console = CONSOLE;
+	    continue;
+	}
+	if (!tried_vtmaster) {
+	    tried_vtmaster++;
+	    console = VT_PRIMARY;
+	    continue;
+	}
+	break;
+    }
+    if (fd < 0)
+	console = "/dev/null";
+    else
+	close(fd);
+}
+
+static int
+waitfor(int pid)
+{
+    int status, wpid;
+
+    message(log, "Waiting for process %d.\n", pid);
+    while ( (wpid = wait(&status)) != pid ) {
+	if ( wpid > 0 )
+	    message(log,"pid %d exited, status=%x.\n", wpid, status);
+    }
+    return wpid;
+}
+
+static int
+run(const char* command, char* terminal, int get_enter)
+{
+    int	f, pid;
+    char *args[16];
+    char buf[256];
+    char* ptr;
+    static const char press_enter[] = 
+	"\nPlease press Enter to activate this console. ";
+
+	
+    /* Make a proper command from the command string */ 
+    strcpy(buf, command);
+    ptr = buf;
+    for(f = 1; f < 15; f++) {
+	/* Skip white space */
+	while(*ptr == ' ' || *ptr == '\t') ptr++;
+	args[f] = ptr;
+	/* May be trailing space.. */
+	if (*ptr == 0) break;
+	/* Skip this `word' */
+	while(*ptr && *ptr != ' ' && *ptr != '\t' && *ptr != '#')
+	    ptr++;
+	/* If end-of-line, break */
+	if (*ptr == '#' || *ptr == 0) {
+	    f++;
+	    *ptr = 0;
+	    break;
+	}
+	/* End word with \0 and continue */
+	args[f] = NULL;
+    }
+    args[0] = args[1];
+	
+
+    if ((pid = fork()) == 0) {
+	/* Clean up */
+	close(0);
+	close(1);
+	close(2);
+	setsid();
+
+	if ((f = device_open(terminal, O_RDWR|O_NOCTTY)) < 0) {
+	    message( log, "open(%s) failed: %s", terminal, strerror(errno));
+	    return -1;
+	}
+	dup(f);
+	dup(f);
+	tcsetpgrp(0, getpgrp());
+	set_term();
+
+	if ( get_enter ) {
+	    /*
+	     * Save memory by not exec-ing anything large (like a shell)
+	     * before the user wants it. This is critical if swap is not
+	     * enabled and the system has low memory. Generally this will
+	     * be run on the second virtual console, and the first will
+	     * be allowed to start a shell or whatever an init script 
+	     * specifies.
+	     */
+	    char	c;
+	    write(1, press_enter, sizeof(press_enter) - 1);
+	    read(0, &c, 1);
+	}
+
+	/* Log the process name and args */
+	message(log, "Executing '%s'\n", command);
+
+	/* Now run it.  This should take over the PID, so nothing 
+	 * further in init.c should be run by this PID. */
+	execvp(args[1], args + 1);
+
+	/* If shell scripts are not executed, force the issue */
+	if (errno == ENOEXEC) {
+	    char buf[256];
+	    args[1] = SHELL;
+	    args[2] = "-c";
+	    strcpy(buf, "exec ");
+	    strcat(buf, command);
+	    args[3] = buf;
+	    args[4] = NULL;
+	    execvp(args[1], args + 1);
+	}
+	message(log, "Could not execute '%s'\n", command, strerror(errno));
+	exit(-1);
+    }
+    return pid;
+}
+
+#ifndef DEBUG_INIT
 static void
 shutdown_system(void)
 {
-	static const char * const umount_args[] = {"/bin/umount", "-a", "-n", 0};
-	static const char * const swapoff_args[] = {"/bin/swapoff", "-a", 0};
 
-	message(console, "The system is going down NOW !!");
-	sync();
-	/* Allow Ctrl-Alt-Del to reboot system. */
-	reboot(RB_ENABLE_CAD);
+    message(console, "The system is going down NOW !!");
+    sync();
+    /* Allow Ctrl-Alt-Del to reboot system. */
+    reboot(RB_ENABLE_CAD);
 
-	/* Send signals to every process _except_ pid 1 */
-	message(console, "Sending SIGHUP to all processes.\r\n");
-	kill(-1, SIGHUP);
-	sleep(2);
+    /* Send signals to every process _except_ pid 1 */
+    message(console, "Sending SIGHUP to all processes.\r\n");
+    kill(-1, SIGHUP);
+    sleep(2);
+    sync();
+    message(console, "Sending SIGKILL to all processes.\r\n");
+    kill(-1, SIGKILL);
+    sleep(1);
+    waitfor(run("/bin/swapoff -a", console, 0));
+    waitfor(run("/bin/umount -a -n", console, 0));
+    sync();
+    if (get_kernel_revision() <= 2*65536+2*256+11) {
+	/* Removed  bdflush call, kupdate in kernels >2.2.11 */
+	bdflush(1, 0);
 	sync();
-	message(console, "Sending SIGKILL to all processes.\r\n");
-	kill(-1, SIGKILL);
-	sleep(1);
-	waitfor(run("/bin/swapoff", swapoff_args, console, 0));
-	waitfor(run("/bin/umount", umount_args, console, 0));
-	sync();
-	if (get_kernel_revision() <= 2*65536+2*256+11) {
-	    /* Removed  bdflush call, kupdate in kernels >2.2.11 */
-	    bdflush(1, 0);
-	    sync();
-	}
+    }
 }
 
 static void
@@ -251,7 +330,7 @@
 {
     shutdown_system();
     message(console, "The system is halted. Press CTRL-ALT-DEL or turn off power\r\n");
-    reboot( RB_HALT_SYSTEM);
+    reboot( RB_POWER_OFF);
     exit(0);
 }
 
@@ -263,202 +342,136 @@
     reboot( RB_AUTOBOOT);
     exit(0);
 }
-
-static void
-configure_terminals( int serial_cons, int single_user_mode )
-{
-	char *tty;
-	struct serial_struct sr;
-	struct vt_stat vt;
-
-
-	switch (serial_cons) {
-	case -1:
-	    /* 2.2 kernels:
-	    * identify the real console backend and try to make use of it */
-	    if (ioctl(0,TIOCGSERIAL,&sr) == 0) {
-		sprintf( console, "/dev/ttyS%d", sr.line );
-		serial_cons = sr.line+1;
-	    }
-	    else if (ioctl(0, VT_GETSTATE, &vt) == 0) {
-		sprintf( console, "/dev/tty%d", vt.v_active );
-		serial_cons = 0;
-	    }
-	    else {
-		/* unknown backend: fallback to /dev/console */
-		strcpy( console, "/dev/console" );
-		serial_cons = 0;
-	    }
-	    break;
-
-	case 1:
-		strcpy( console, "/dev/cua0" );
-		break;
-	case 2:
-		strcpy( console, "/dev/cua1" );
-		break;
-	default:
-		tty = ttyname(0);
-		if (tty) {
-			strcpy( console, tty );
-			if (!strncmp( tty, "/dev/cua", 8 ))
-				serial_cons=1;
-		}
-		else
-			/* falls back to /dev/tty1 if an error occurs */
-			strcpy( console, default_console );
-	}
-	if (!first_terminal)
-		first_terminal = console;
-#if defined (__sparc__)
-	if (serial_cons > 0 && !strncmp(term_ptr,"TERM=linux",10))
-	    term_ptr = "TERM=vt100";
 #endif
-	if (serial_cons) {
-	    /* disable other but the first terminal:
-	    * VT is not initialized anymore on 2.2 kernel when booting from
-	    * serial console, therefore modprobe is flooding the display with
-	    * "can't locate module char-major-4" messages. */
-	    log = 0;
-	    second_terminal = 0;
-	}
+
+int setproctitle(char *fmt, ...)
+{
+    va_list ap;
+    int len;
+    char buf[256];
+
+    buf[0] = 0;
+    va_start(ap, fmt);
+    len = vsprintf(buf, fmt, ap);
+    va_end(ap);
+    memset(argv0, 0, maxproclen + 1);
+    strncpy(argv0, buf, maxproclen);
+    return len;
 }
 
 extern int
 init_main(int argc, char * * argv)
 {
-	const char *		    rc_arguments[100];
-	const char *		    arguments[100];
-	int			    run_rc = TRUE;
-	int			    j;
-	int			    pid1 = 0;
-	int			    pid2 = 0;
-	struct stat		    statbuf;
-	const char *		    tty_commands[3] = { "etc/init.d/rcS", "bin/sh"};
-	int			    serial_console = 0;
-	int retval;
+	int run_rc = TRUE;
+	int pid1 = 0;
+	int pid2 = 0;
+	struct stat statbuf;
+	const char* init_commands = SHELL "-c exec " INITSCRIPT;
+	const char* shell_commands = SHELL;
+	const char* tty0_commands = init_commands;
+	const char* tty1_commands = shell_commands;
+	const char* no_memory = 
+	    "Sorry, your computer does not have enough memory.\n";
 
-	/*
-	 * If I am started as /linuxrc instead of /sbin/init, I don't have the
-	 * environment that init expects. I can't fix the signal behavior. Try
-	 * to divorce from the controlling terminal with setsid(). This won't work
-	 * if I am the process group leader.
-	 */
+	/* For later use */
+	argv0 = argv[0];
+	maxproclen = strlen(argv[0]);
+	setproctitle("init [boot]");
+
+
+#ifndef DEBUG_INIT
+	/* Set up sig handlers */
+	signal(SIGUSR1, halt_signal);
+	signal(SIGSEGV, halt_signal);
+	signal(SIGPWR,  halt_signal);
+	signal(SIGALRM, halt_signal);
+	signal(SIGHUP,  halt_signal);
+	signal(SIGUSR2, reboot_signal);
+	signal(SIGINT,  reboot_signal);
+	signal(SIGTERM, reboot_signal);
+#endif
+	/* Figure out where the default console should be */
+	console_init();
+
+	/* Turn off rebooting via CTL-ALT-DEL -- we get a 
+	 * SIGINT on CAD so we can shut things down gracefully... */
+#ifndef DEBUG_INIT
+	reboot(RB_DISABLE_CAD);
+#endif
+
+	/* Close whatever files are open, and reset the console. */
+	close(0);
+	close(1);
+	close(2);
+	set_term();
 	setsid();
 
-	signal(SIGUSR1, halt_signal);
-	signal(SIGUSR2, reboot_signal);
-	signal(SIGINT, reboot_signal);
-	signal(SIGTERM, reboot_signal);
+	/* Make sure PATH is set to something sane */
+	if (getenv("PATH") == NULL) 
+	    putenv(PATH_DEFAULT);
 
-	reboot(RB_DISABLE_CAD);
+	/* Hello world */
+	message(console, "%s started:  BusyBox v%s (%s) multi-call binary", 
+		argv[0], BB_VER, BB_BT);
+	message(log, "%s started:  BusyBox v%s (%s) multi-call binary", 
+		argv[0], BB_VER, BB_BT);
 
-	message(log, "%s: started. ", argv[0]);
 
-	for ( j = 1; j < argc; j++ ) {
-		if ( strcmp(argv[j], "single") == 0 ) {
-			run_rc = FALSE;
-			tty_commands[0] = "bin/sh";
-			tty_commands[1] = 0;
-		}
-	}
-	for ( j = 0; __environ[j] != 0; j++ ) {
-		if ( strncmp(__environ[j], "tty", 3) == 0
-		 && __environ[j][3] >= '1'
-		 && __environ[j][3] <= '2'
-		 && __environ[j][4] == '=' ) {
-			const char * s = &__environ[j][5];
-
-			if ( *s == 0 || strcmp(s, "off") == 0 )
-				s = 0;
-
-			tty_commands[__environ[j][3] - '1'] = s;
-		}
-		/* Should catch the syntax of Sparc kernel console setting.   */
-		/* The kernel does not recognize a serial console when getting*/
-		/* console=/dev/ttySX !! */
-		else if ( strcmp(__environ[j], "console=ttya") == 0 ) {
-			serial_console=1;
-		}
-		else if ( strcmp(__environ[j], "console=ttyb") == 0 ) {
-			serial_console=2;
-		}
-		/* standard console settings */
-		else if ( strncmp(__environ[j], "console=", 8) == 0 ) {
-			first_terminal=&(__environ[j][8]);
-		}
-		else if ( strncmp(__environ[j], "TERM=", 5) == 0) {
-			term_ptr=__environ[j];
-		}
-	}
-
-	printf("mounting /proc ...\n");
+	/* Mount /proc */
+	message(console, "Mounting /proc: \n");
 	if (mount("/proc","/proc","proc",0,0)) {
-	  perror("mounting /proc failed\n");
+	    message(log, "%s: could not mount /proc!\n", argv[0]);
+	    message(console, "failed!\n");
 	}
-	printf("\tdone.\n");
+	message(console, "done.\n");
 
-	if (get_kernel_revision() >= 2*65536+1*256+71) {
-	    /* if >= 2.1.71 kernel, /dev/console is not a symlink anymore:
-	    * use it as primary console */
-	    serial_console=-1;
-	}
 
-	/* Make sure /etc/init.d/rc exists */
-	retval= stat(tty_commands[0],&statbuf);
-	if (retval)
-	    run_rc = FALSE;
-
-	configure_terminals( serial_console,  run_rc);
-
+	/* Make sure there is enough memory to do something useful*/
 	set_free_pages();
-
-	/* not enough memory to do anything useful*/
 	if (mem_total() < 2000) { 
+	    int retval;
 	    retval= stat("/etc/fstab",&statbuf);
 	    if (retval) {
-		printf("You do not have enough RAM, sorry.\n");
+		message(console, "%s", no_memory);
 		while (1) { sleep(1);}
 	    } else { 
 	      /* Try to turn on swap */
-		static const char * const swapon_args[] = {"/bin/swapon", "-a", 0};
-		waitfor(run("/bin/swapon", swapon_args, console, 0));
+		waitfor(run("/bin/swapon -a", console, 0));
 		if (mem_total() < 2000) { 
-		    printf("You do not have enough RAM, sorry.\n");
+		    message(console, "%s", no_memory);
 		    while (1) { sleep(1);}
 		}
 	    }
 	}
 
-	/*
-	 * Don't modify **argv directly, it would show up in the "ps" display.
-	 * I don't want "init" to look like "rc".
-	 */
-	rc_arguments[0] = tty_commands[0];
-	for ( j = 1; j < argc; j++ ) {
-		rc_arguments[j] = argv[j];
+	/* Check if we are supposed to be in single user mode */
+	if (!strcmp(argv[1], "single") || !strcmp(argv[1], "-s") || !strcmp(argv[1], "1")) {
+		run_rc = FALSE;
+		tty0_commands = shell_commands;
+		tty1_commands = 0;
+		setproctitle("init [S]");
+	} else { 
+	    setproctitle("init [1]");
 	}
-	rc_arguments[j] = 0;
 
-	arguments[0] = "-sh";
-	arguments[1] = 0;
-	
-	/* Ok, now launch the rc script /etc/init.d/rcS and prepare to start up
-	 * some VTs on tty1 and tty2 if somebody hits enter 
+	/* Make sure an init script exists before trying to run it */
+	if ( run_rc == TRUE && stat( INITSCRIPT, &statbuf)) {
+	    tty0_commands = shell_commands;
+	    tty1_commands = shell_commands;
+	} 
+
+	/* Ok, now launch the rc script and/or prepare to 
+	 * start up some VTs if somebody hits enter... 
 	 */
 	for ( ; ; ) {
 		int	wpid;
 		int	status;
 
-		if ( pid1 == 0  && tty_commands[0] ) {
-		   if ( run_rc == TRUE ) {
-			pid1 = run(tty_commands[0], rc_arguments, first_terminal, 0);
-		   } else {
-			pid2 = run(tty_commands[1], arguments, first_terminal, 1);
-		   }
+		if ( pid1 == 0  && *tty0_commands ) {
+		    pid1 = run(tty0_commands, console, 1);
 		}
-		if ( pid2 == 0 && second_terminal && tty_commands[1] ) {
-			pid2 = run(tty_commands[1], arguments, second_terminal, 1);
+		if ( pid2 == 0 && *tty1_commands ) {
+		    pid2 = run(tty1_commands, second_terminal, 1);
 		}
 		wpid = wait(&status);
 		if ( wpid > 0  && wpid != pid1) {
@@ -467,6 +480,7 @@
 		if ( wpid == pid2 ) {
 			pid2 = 0;
 		}
+		sleep(1);
 	}
 }
 
