Index: kernel/arch/ia64/src/drivers/ski.c
===================================================================
--- kernel/arch/ia64/src/drivers/ski.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/arch/ia64/src/drivers/ski.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -129,5 +129,5 @@
 	
 	outdev_initialize("skiout", &skiout, &skiout_ops);
-	stdout = &skiout;
+	stdout_wire(&skiout);
 	
 	sysinfo_set_item_val("fb", NULL, false);
Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -380,6 +380,6 @@
 	sysinfo_set_item_val("fb.kind", NULL, 4);
 
-	outdev_initialize("sgcnout", &sgcnout, &sgcnout_ops);	
-	stdout = &sgcnout;
+	outdev_initialize("sgcnout", &sgcnout, &sgcnout_ops);
+	stdout_wire(&sgcnout);
 }
 
Index: kernel/genarch/src/drivers/dsrln/dsrlnout.c
===================================================================
--- kernel/genarch/src/drivers/dsrln/dsrlnout.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/genarch/src/drivers/dsrln/dsrlnout.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -66,5 +66,5 @@
 	
 	outdev_initialize("dsrlnout", &dsrlnout_console, &dsrlnout_ops);
-	stdout = &dsrlnout_console;
+	stdout_wire(&dsrlnout_console);
 	
 	sysinfo_set_item_val("fb", NULL, true);
Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -567,5 +567,5 @@
 	
 	outdev_initialize("ega", &ega_console, &ega_ops);
-	stdout = &ega_console;
+	stdout_wire(&ega_console);
 	
 	sysinfo_set_item_val("fb", NULL, true);
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/genarch/src/fb/fb.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -583,5 +583,5 @@
 	
 	outdev_initialize("fb", &fb_console, &fb_ops);
-	stdout = &fb_console;
+	stdout_wire(&fb_console);
 	
 	return true;
Index: kernel/generic/include/console/chardev.h
===================================================================
--- kernel/generic/include/console/chardev.h	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/generic/include/console/chardev.h	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -36,4 +36,5 @@
 #define KERN_CHARDEV_H_
 
+#include <adt/list.h>
 #include <arch/types.h>
 #include <synch/waitq.h>
@@ -75,5 +76,5 @@
 } outdev_operations_t;
 
-/** Character input device. */
+/** Character output device. */
 typedef struct outdev {
 	char *name;
@@ -81,4 +82,8 @@
 	/** Protects everything below. */
 	SPINLOCK_DECLARE(lock);
+	
+	/** Fields suitable for multiplexing. */
+	link_t link;
+	link_t list;
 	
 	/** Implementation of outdev operations. */
Index: kernel/generic/include/console/console.h
===================================================================
--- kernel/generic/include/console/console.h	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/generic/include/console/console.h	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -44,4 +44,5 @@
 
 extern indev_t *stdin_wire(void);
+extern void stdout_wire(outdev_t *outdev);
 extern void console_init(void);
 
Index: kernel/generic/src/console/chardev.c
===================================================================
--- kernel/generic/src/console/chardev.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/generic/src/console/chardev.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -33,4 +33,5 @@
  */
 
+#include <adt/list.h>
 #include <console/chardev.h>
 #include <synch/waitq.h>
@@ -134,4 +135,6 @@
 	outdev->name = name;
 	spinlock_initialize(&outdev->lock, "outdev");
+	link_initialize(&outdev->link);
+	list_initialize(&outdev->list);
 	outdev->op = op;
 }
Index: kernel/generic/src/console/console.c
===================================================================
--- kernel/generic/src/console/console.c	(revision e731b0db7a19a49197d3ed700a60c8131857f598)
+++ kernel/generic/src/console/console.c	(revision b9c742533861d30ff1a3f7a0986e6b524800644d)
@@ -76,8 +76,17 @@
 static parea_t klog_parea;
 
+static indev_t stdin_sink;
+static outdev_t stdout_source;
+
 static indev_operations_t stdin_ops = {
 	.poll = NULL
 };
 
+static void stdout_write(outdev_t *dev, wchar_t ch, bool silent);
+
+static outdev_operations_t stdout_ops = {
+	.write = stdout_write
+};
+
 /** Silence output */
 bool silent = false;
@@ -90,10 +99,29 @@
 {
 	if (stdin == NULL) {
-		stdin = malloc(sizeof(indev_t), FRAME_ATOMIC);
-		if (stdin != NULL)
-			indev_initialize("stdin", stdin, &stdin_ops);
+		indev_initialize("stdin", &stdin_sink, &stdin_ops);
+		stdin = &stdin_sink;
 	}
 	
 	return stdin;
+}
+
+void stdout_wire(outdev_t *outdev)
+{
+	if (stdout == NULL) {
+		outdev_initialize("stdout", &stdout_source, &stdout_ops);
+		stdout = &stdout_source;
+	}
+	
+	list_append(&outdev->link, &stdout->list);
+}
+
+static void stdout_write(outdev_t *dev, wchar_t ch, bool silent)
+{
+	link_t *cur;
+	
+	for (cur = dev->list.next; cur != &dev->list; cur = cur->next) {
+		outdev_t *sink = list_get_instance(cur, outdev_t, link);
+		sink->op->write(sink, ch, silent);
+	}
 }
 
