Index: kernel/arch/amd64/src/amd64.c
===================================================================
--- kernel/arch/amd64/src/amd64.c	(revision 6bbe470e275a3b9a63f777eb4b7ae8586c4ec665)
+++ kernel/arch/amd64/src/amd64.c	(revision 21b63070cd32586bcf9185f46474b68aa88609f4)
@@ -222,6 +222,13 @@
 	 * Initialize the ns16550 controller.
 	 */
+#ifdef CONFIG_NS16550_OUT
+	outdev_t *ns16550_out;
+	outdev_t **ns16550_out_ptr = &ns16550_out;
+#else
+	outdev_t **ns16550_out_ptr = NULL;
+#endif
 	ns16550_instance_t *ns16550_instance
-	    = ns16550_init((ns16550_t *) NS16550_BASE, IRQ_NS16550, NULL, NULL);
+	    = ns16550_init((ns16550_t *) NS16550_BASE, IRQ_NS16550, NULL, NULL,
+	    ns16550_out_ptr);
 	if (ns16550_instance) {
 #ifdef CONFIG_NS16550
@@ -235,5 +242,4 @@
 #endif
 #ifdef CONFIG_NS16550_OUT
-		outdev_t *ns16550_out = ns16550_output(ns16550_instance);
 		if (ns16550_out) {
 			stdout_wire(ns16550_out);
Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision 6bbe470e275a3b9a63f777eb4b7ae8586c4ec665)
+++ kernel/arch/ia32/src/ia32.c	(revision 21b63070cd32586bcf9185f46474b68aa88609f4)
@@ -176,6 +176,13 @@
 	 * Initialize the ns16550 controller.
 	 */
+#ifdef CONFIG_NS16550_OUT
+	outdev_t *ns16550_out;
+	outdev_t **ns16550_out_ptr = &ns16550_out;
+#else
+	outdev_t **ns16550_out_ptr = NULL;
+#endif
 	ns16550_instance_t *ns16550_instance
-	    = ns16550_init((ns16550_t *) NS16550_BASE, IRQ_NS16550, NULL, NULL);
+	    = ns16550_init((ns16550_t *) NS16550_BASE, IRQ_NS16550, NULL, NULL,
+	    ns16550_out_ptr);
 	if (ns16550_instance) {
 #ifdef CONFIG_NS16550
@@ -189,5 +196,4 @@
 #endif
 #ifdef CONFIG_NS16550_OUT
-		outdev_t *ns16550_out = ns16550_output(ns16550_instance);
 		if (ns16550_out) {
 			stdout_wire(ns16550_out);
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 6bbe470e275a3b9a63f777eb4b7ae8586c4ec665)
+++ kernel/arch/ia64/src/ia64.c	(revision 21b63070cd32586bcf9185f46474b68aa88609f4)
@@ -173,5 +173,6 @@
 #ifdef CONFIG_NS16550
 	ns16550_instance_t *ns16550_instance
-	    = ns16550_init((ns16550_t *) NS16550_BASE, NS16550_IRQ, NULL, NULL);
+	    = ns16550_init((ns16550_t *) NS16550_BASE, NS16550_IRQ, NULL, NULL,
+	    NULL);
 	if (ns16550_instance) {
 		srln_instance_t *srln_instance = srln_init();
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision 6bbe470e275a3b9a63f777eb4b7ae8586c4ec665)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision 21b63070cd32586bcf9185f46474b68aa88609f4)
@@ -117,5 +117,6 @@
 	    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
 	
-	ns16550_instance_t *ns16550_instance = ns16550_init(ns16550, inr, cir, cir_arg);
+	ns16550_instance_t *ns16550_instance = ns16550_init(ns16550, inr, cir,
+	    cir_arg, NULL);
 	if (ns16550_instance) {
 		kbrd_instance_t *kbrd_instance = kbrd_init();
Index: kernel/genarch/include/drivers/ns16550/ns16550.h
===================================================================
--- kernel/genarch/include/drivers/ns16550/ns16550.h	(revision 6bbe470e275a3b9a63f777eb4b7ae8586c4ec665)
+++ kernel/genarch/include/drivers/ns16550/ns16550.h	(revision 21b63070cd32586bcf9185f46474b68aa88609f4)
@@ -74,7 +74,7 @@
 } ns16550_instance_t;
 
-extern ns16550_instance_t *ns16550_init(ns16550_t *, inr_t, cir_t, void *);
+extern ns16550_instance_t *ns16550_init(ns16550_t *, inr_t, cir_t, void *,
+    outdev_t **);
 extern void ns16550_wire(ns16550_instance_t *, indev_t *);
-extern outdev_t *ns16550_output(ns16550_instance_t *);
 
 #endif
Index: kernel/genarch/src/drivers/ns16550/ns16550.c
===================================================================
--- kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 6bbe470e275a3b9a63f777eb4b7ae8586c4ec665)
+++ kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 21b63070cd32586bcf9185f46474b68aa88609f4)
@@ -102,13 +102,16 @@
  *
  * @param dev      Addrress of the beginning of the device in I/O space.
- * @param devno    Device number.
  * @param inr      Interrupt number.
  * @param cir      Clear interrupt function.
  * @param cir_arg  First argument to cir.
+ * @param output   Where to store pointer to the output device
+ *                 or NULL if the caller is not interested in
+ *                 writing to the serial port.
  *
  * @return Keyboard instance or NULL on failure.
  *
  */
-ns16550_instance_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)
+ns16550_instance_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir,
+    void *cir_arg, outdev_t **output)
 {
 	ns16550_instance_t *instance
@@ -118,4 +121,18 @@
 		instance->input = NULL;
 		instance->output = NULL;
+		
+		if (output) {
+			instance->output = malloc(sizeof(outdev_t),
+			    FRAME_ATOMIC);
+			if (!instance->output) {
+				free(instance);
+				return NULL;
+			}
+			
+			outdev_initialize("ns16550", instance->output,
+			    &ns16550_ops);
+			instance->output->data = instance;
+			*output = instance->output;
+		}
 		
 		irq_initialize(&instance->irq);
@@ -153,21 +170,4 @@
 }
 
-outdev_t *ns16550_output(ns16550_instance_t *instance)
-{
-	ASSERT(instance);
-	
-	if (instance->output == NULL) {
-		instance->output = malloc(sizeof(outdev_t),
-		    FRAME_ATOMIC);
-		if (instance->output) {
-			outdev_initialize("ns16550", instance->output,
-			    &ns16550_ops);
-			instance->output->data = instance;
-		}
-	}
-	
-	return instance->output;
-}
-
 /** @}
  */
