diff --git a/ChangeLog b/ChangeLog
index ad99a0baa124d5c93f5f5b23e369590ab1a366a8..c812bf773869760df2a1685204386de449bfff48 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -306,3 +306,4 @@
 	* Add support for Windows native toolchains that cannot follow Cygwin soft links
 	* Modified serial driver interface to handle hardware with non-16550A-like
 	  interrupt architecture (like the Z16F)
+	* Added a "dumb" serial console driver to simply OS bringup
diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html
index 38bea91aa08925098793aa6fa72f65d81b527177..2c7d6531a9f11f0f3275a1de93ab23fee3fdfd22 100644
--- a/Documentation/NuttX.html
+++ b/Documentation/NuttX.html
@@ -984,6 +984,7 @@ Other memory:
 	* Add support for Windows native toolchains that cannot follow Cygwin soft links
 	* Modified serial driver interface to handle hardware with non-16550A-like
 	  interrupt architecture (like the Z16F)
+	* Added a "dumb" serial console driver to simply OS bringup
 </pre></ul>
 
 <table width ="100%">
diff --git a/TODO b/TODO
index e5a4b51d1a3ab5331df5054f6a08d94e40e95b08..8029936d152c8d15b1b340223d0900d5f620c9c7 100644
--- a/TODO
+++ b/TODO
@@ -21,7 +21,7 @@ NuttX TODO List (Last updated January 6, 2008)
   (2)  ARM/LPC214x (arch/arm/src/lpc214x/)
   (4)  pjrc-8052 / MCS51 (arch/pjrc-8051/)
   (2)  z80 (arch/z80/)
-  (2)  z16 (arch/z16/)
+  (3)  z16 (arch/z16/)
 
 o Task/Scheduler (sched/)
   ^^^^^^^^^^^^^^^^^^^^^^^
@@ -382,3 +382,7 @@ o z16 (arch/z16)
   Status:      Open
   Priority:    Medium. A polled, write-only serial driver is used in the
                interim for system testing.
+
+  Description: Signals are not functional
+  Status:      Open
+  Priority:    Medium
diff --git a/arch/z16/src/common/up_initialize.c b/arch/z16/src/common/up_initialize.c
index 8a30d33ad1c3599b8b795d9c1340c2c0487dc46f..b7fc643d23d044c5059b205a53cb5f65627f22d6 100644
--- a/arch/z16/src/common/up_initialize.c
+++ b/arch/z16/src/common/up_initialize.c
@@ -160,7 +160,13 @@ void up_initialize(void)
 
   /* Initialize the serial device driver */
 
+#ifdef CONFIG_USE_SERIALDRIVER
   up_serialinit();
+#endif
+
+#ifdef CONFIG_USE_LOWCONSOLE
+  lowconsole_init();
+#endif
 
   /* Initialize the netwok */
 
diff --git a/arch/z16/src/common/up_internal.h b/arch/z16/src/common/up_internal.h
index f6acb97a683c9c1f456648626b9564ebea94096c..144fee754208d81d7f7301a3d99006f18d709621 100644
--- a/arch/z16/src/common/up_internal.h
+++ b/arch/z16/src/common/up_internal.h
@@ -58,6 +58,17 @@
 #undef  CONFIG_SUPPRESS_UART_CONFIG   /* Do not reconfig UART */
 #undef  CONFIG_DUMP_ON_EXIT           /* Dump task state on exit */
 
+/* Determine which (if any) console driver to use */
+
+#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || \
+    CONFIG_NFILE_DESCRIPTORS == 0 || defined(CONFIG_DEV_LOWCONSOLE)
+# define CONFIG_USE_LOWCONSOLE 1
+# define CONFIG_USE_LOWUARTINIT 1
+#elif defined(CONFIG_DEV_CONSOLE) && CONFIG_NFILE_DESCRIPTORS > 0
+# define CONFIG_USE_SERIALDRIVER 1
+# define CONFIG_USE_EARLYSERIALINIT 1
+#endif
+ 
 /* Macros for portability */
 
 #define IN_INTERRUPT             (current_regs != NULL)
@@ -118,12 +129,13 @@ void up_addregion(void);
 
 /* Defined in up_serial.c */
 
-#if CONFIG_NFILE_DESCRIPTORS > 0
+#ifdef CONFIG_USE_SERIALDRIVER
 extern void up_earlyserialinit(void);
 extern void up_serialinit(void);
-#else
-# define up_earlyserialinit()
-# define up_serialinit()
+#endif
+
+#ifdef CONFIG_USE_LOWCONSOLE
+extern void lowconsole_init(void);
 #endif
 
 /* Defined in up_timerisr.c */
diff --git a/arch/z16/src/z16f/z16f_head.S b/arch/z16/src/z16f/z16f_head.S
index f6108c250a422884fef21fa2b03b1b880a3620e8..88b9ca5bb27ec5e15e73f389a15a7b803dde3748 100755
--- a/arch/z16/src/z16f/z16f_head.S
+++ b/arch/z16/src/z16f/z16f_head.S
@@ -40,6 +40,11 @@
 
 #include <nuttx/config.h>
 #include <arch/irq.h>
+#include "common/up_internal.h"
+
+/**************************************************************************
+ * Definitions
+ **************************************************************************/
 
 /**************************************************************************
  * External References / External Definitions
@@ -50,10 +55,9 @@
 #ifdef CONFIG_ARCH_LEDS
 	xref	_up_ledinit:EROM
 #endif
-#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0
+#if defined(CONFIG_USE_LOWUARTINIT)
 	xref	_z16f_lowuartinit:EROM
-#endif
-#if defined(CONFIG_DEV_CONSOLE) && CONFIG_NFILE_DESCRIPTORS > 0
+#elif defined(CONFIG_USE_EARLYSERIALINIT)
 	xref	_up_earlyserialinit:EROM
 #endif
 	xref	_os_start:EROM
@@ -157,7 +161,7 @@ _z16f_reset:
 #endif
 	/* Perform VERY early UART initialization so that we can use it here */
 
-#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0
+#ifdef CONFIG_USE_LOWUARTINIT
 	call	_z16f_lowuartinit	/* Initialize the UART for debugging */
 #endif
 	/* Initialize the hardware stack overflow register */
@@ -210,7 +214,7 @@ _z16f_reset8:
 
 	call	_z16f_lowinit		/* Perform low-level hardware initialization */
 
-#if defined(CONFIG_DEV_CONSOLE) && CONFIG_NFILE_DESCRIPTORS > 0
+#ifdef CONFIG_USE_EARLYSERIALINIT
 	/* Perform early serial initialization */
 
 	call	_up_earlyserialinit
diff --git a/arch/z16/src/z16f/z16f_lowuart.S b/arch/z16/src/z16f/z16f_lowuart.S
index bea5f25fc5f6e309fd0363ff4aa4e4ac9c3ea1ec..1dedf16b3ce193b12fe1cef910b31ba2ae4406a6 100755
--- a/arch/z16/src/z16f/z16f_lowuart.S
+++ b/arch/z16/src/z16f/z16f_lowuart.S
@@ -40,8 +40,9 @@
 
 #include <nuttx/config.h>
 #include "chip/chip.h"
+#include "common/up_internal.h"
 
-#if defined(CONFIG_ARCH_LOWPUTC) || defined(CONFIG_ARCH_LOWGETC) || CONFIG_NFILE_DESCRIPTORS == 0
+#ifdef CONFIG_USE_LOWUARTINIT
 
 /*************************************************************************
  * External References / External Definitions
@@ -120,6 +121,7 @@ _z16f_lowuartinit:
 	ld.b	Z16F_UART0_CTL0, r0	/* Z16F_UART0_CTL0 = %c0 */
 #endif
 	ret				/* Return */
+#endif /* CONFIG_USE_LOWUARTINIT */
 
 /*************************************************************************
  * Name: _up_lowputc
@@ -222,7 +224,5 @@ _up_lowgetc3:					/* Return value in r0 */
 	ret					/* Return */
 #endif
 
-#endif /* CONFIG_ARCH_LOWPUTC || CONFIG_ARCH_LOWGETC */
-
 	end
 
diff --git a/arch/z16/src/z16f/z16f_serial.c b/arch/z16/src/z16f/z16f_serial.c
index ce40a497f5daaeec50f748fb7633f3efedab7d25..1446c5c578324f3882c4468dc4683cd2c56e602c 100644
--- a/arch/z16/src/z16f/z16f_serial.c
+++ b/arch/z16/src/z16f/z16f_serial.c
@@ -55,14 +55,12 @@
 #include "os_internal.h"
 #include "up_internal.h"
 
-#if CONFIG_NFILE_DESCRIPTORS > 0
+#ifdef CONFIG_USE_SERIALDRIVER
 
 /****************************************************************************
  * Definitions
  ****************************************************************************/
 
-#define BASE_BAUD 115200
-
 /* System clock frequency value from ZDS target settings */
 
 extern _Erom unsigned long SYS_CLK_FREQ;
@@ -737,7 +735,7 @@ int up_putc(int ch)
   return ch;
 }
 
-#else /* CONFIG_NFILE_DESCRIPTORS > 0 */
+#else /* CONFIG_USE_SERIALDRIVER */
 
 /****************************************************************************
  * Definitions
@@ -755,11 +753,23 @@ int up_putc(int ch)
   putreg8((ubyte)(ch), Z16F_UART0_TXD)
 #endif
 
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Variables
+ ****************************************************************************/
+
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
 
-static void _up_putc(int ch)
+/****************************************************************************
+ * Name: z16f_putc
+ ****************************************************************************/
+
+static void z16f_putc(int ch)
 {
   int tmp;
   for (tmp = 1000 ; tmp > 0 && !z16f_contrde(); tmp--);
@@ -770,6 +780,10 @@ static void _up_putc(int ch)
  * Public Functions
  ****************************************************************************/
 
+/****************************************************************************
+ * Name: up_putc
+ ****************************************************************************/
+
 int up_putc(int ch)
 {
   /* Check for LF */
@@ -778,13 +792,13 @@ int up_putc(int ch)
     {
       /* Output CR before LF */
 
-      _up_putc('\r');
+      z16f_putc('\r');
     }
 
   /* Output character */
 
-  _up_putc(ch);
+  z16f_putc(ch);
   return ch;
 }
 
-#endif /* CONFIG_NFILE_DESCRIPTORS > 0 */
+#endif /* CONFIG_USE_SERIALDRIVER */
diff --git a/configs/z16f2800100zcog/ostest/defconfig b/configs/z16f2800100zcog/ostest/defconfig
index eb24435af29cb52404917faad957a4e5864f93aa..4e95b886add8d0695f66def4373a29a13e8e2542 100644
--- a/configs/z16f2800100zcog/ostest/defconfig
+++ b/configs/z16f2800100zcog/ostest/defconfig
@@ -152,6 +152,7 @@ CONFIG_START_MONTH=1
 CONFIG_START_DAY=28
 CONFIG_JULIAN_TIME=n
 CONFIG_DEV_CONSOLE=y
+CONFIG_DEV_LOWCONSOLE=y
 
 #
 # The following can be used to disable categories of
diff --git a/drivers/Makefile b/drivers/Makefile
index 1655629d730eddc465fcc255698a29885e56fb37..d105e75ea29636c20e569e7eca40a4d567e39830 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -44,7 +44,7 @@ AOBJS		= $(ASRCS:.S=$(OBJEXT))
 
 CSRCS		=
 ifneq ($(CONFIG_NFILE_DESCRIPTORS),0)
-CSRCS		+= dev_null.c serial.c
+CSRCS		+= dev_null.c serial.c lowconsole.c
 endif
 CSRCS		+= $(NET_CSRCS)
 COBJS		= $(CSRCS:.c=$(OBJEXT))
diff --git a/drivers/lowconsole.c b/drivers/lowconsole.c
new file mode 100755
index 0000000000000000000000000000000000000000..743f09a0a515f886c4fba1d73b7dfc9541bd917f
--- /dev/null
+++ b/drivers/lowconsole.c
@@ -0,0 +1,124 @@
+/****************************************************************************
+ * drivers/lowconsole.c
+ *
+ *   Copyright (C) 2008 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ * 3. Neither the name NuttX nor the names of its 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 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 THE
+ * COPYRIGHT OWNER 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <sys/types.h>
+#include <errno.h>
+#include <debug.h>
+
+#include <nuttx/arch.h>
+#include <nuttx/fs.h>
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static ssize_t lowconsole_read(struct file *filep, char *buffer, size_t buflen);
+static ssize_t lowconsole_write(struct file *filep, const char *buffer, size_t buflen);
+static int     lowconsole_ioctl(struct file *filep, int cmd, unsigned long arg);
+
+/****************************************************************************
+ * Private Variables
+ ****************************************************************************/
+
+struct file_operations g_serialops =
+{
+  0,                /* open */
+  0,                /* close */
+  lowconsole_read,  /* read */
+  lowconsole_write, /* write */
+  0,                /* seek */
+  lowconsole_ioctl  /* ioctl */
+};
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lowconsole_ioctl
+ ****************************************************************************/
+
+static int lowconsole_ioctl(struct file *filep, int cmd, unsigned long arg)
+{
+  *get_errno_ptr() = ENOTTY;
+  return ERROR;
+}
+
+/****************************************************************************
+ * Name: lowconsole_read
+ ****************************************************************************/
+
+static ssize_t lowconsole_read(struct file *filep, char *buffer, size_t buflen)
+{
+  return 0;
+}
+
+/****************************************************************************
+ * Name: lowconsole_write
+ ****************************************************************************/
+
+static ssize_t lowconsole_write(struct file *filep, const char *buffer, size_t buflen)
+{
+  ssize_t ret = buflen;
+ 
+  for (; buflen; buflen--)
+    {
+      up_putc(*buffer++);
+    }
+  return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: lowconsole_init
+****************************************************************************/
+
+void lowconsole_init(void)
+{
+  (void)register_driver("/dev/console", &g_serialops, 0666, NULL);
+}
diff --git a/drivers/serial.c b/drivers/serial.c
index 153ee431dd3a44396b3d79922c18b922bacf04f8..2f0f5703fdf44fee74072408a537312162fc9bd7 100644
--- a/drivers/serial.c
+++ b/drivers/serial.c
@@ -344,14 +344,22 @@ static int uart_close(struct file *filep)
 
   while (dev->xmit.head != dev->xmit.tail)
     {
+#ifndef CONFIG_DISABLE_SIGNALS
       usleep(500*1000);
+#else
+      up_udelay(500*1000);
+#endif
     }
 
   /* And wait for the TX fifo to drain */
 
   while (!uart_txempty(dev))
     {
+#ifndef CONFIG_DISABLE_SIGNALS
       usleep(500*1000);
+#else
+      up_udelay(500*1000);
+#endif
     }
 
   /* Free the IRQ and disable the UART */