Index: kernel/arch/ia64/src/drivers/ski.c
===================================================================
--- kernel/arch/ia64/src/drivers/ski.c	(revision f2d2c7ba676ff1a37b6198b134c840dd09e1d11b)
+++ kernel/arch/ia64/src/drivers/ski.c	(revision 253d3d0b04f3cdd9b3b0618555c429868401a3d7)
@@ -184,9 +184,10 @@
 	ski_init();
 	
-	ski_instance_t *instance
-	    = malloc(sizeof(ski_instance_t), FRAME_ATOMIC);
+	ski_instance_t *instance =
+	    malloc(sizeof(ski_instance_t), FRAME_ATOMIC);
 	
 	if (instance) {
-		instance->thread = thread_create(kskipoll, (void *) instance, TASK, 0, "kskipoll", true);
+		instance->thread = thread_create(kskipoll, instance, TASK, 0,
+		    "kskipoll", true);
 		
 		if (!instance->thread) {
Index: kernel/arch/sparc64/include/drivers/sgcn.h
===================================================================
--- kernel/arch/sparc64/include/drivers/sgcn.h	(revision f2d2c7ba676ff1a37b6198b134c840dd09e1d11b)
+++ kernel/arch/sparc64/include/drivers/sgcn.h	(revision 253d3d0b04f3cdd9b3b0618555c429868401a3d7)
@@ -38,4 +38,5 @@
 #include <arch/types.h>
 #include <console/chardev.h>
+#include <proc/thread.h>
 
 /* number of bytes in the TOC magic, including the NULL-terminator */
@@ -117,8 +118,14 @@
 } __attribute__ ((packed)) sgcn_buffer_header_t;
 
-void sgcn_grab(void);
-void sgcn_release(void);
-indev_t *sgcnin_init(void);
-void sgcnout_init(void);
+typedef struct {
+	thread_t *thread;
+	indev_t *srlnin;
+} sgcn_instance_t;
+
+extern void sgcn_grab(void);
+extern void sgcn_release(void);
+extern sgcn_instance_t *sgcnin_init(void);
+extern void sgcnin_wire(sgcn_instance_t *, indev_t *);
+extern void sgcnout_init(void);
 
 #endif
Index: kernel/arch/sparc64/src/console.c
===================================================================
--- kernel/arch/sparc64/src/console.c	(revision f2d2c7ba676ff1a37b6198b134c840dd09e1d11b)
+++ kernel/arch/sparc64/src/console.c	(revision 253d3d0b04f3cdd9b3b0618555c429868401a3d7)
@@ -93,8 +93,13 @@
 {
 #ifdef CONFIG_SGCN_KBD
-	indev_t *kbrdin;
-	kbrdin = sgcnin_init();
-	if (kbrdin)
-		srln_init(kbrdin);
+	sgcn_instance_t *sgcn_instance = sgcnin_init();
+	if (sgcn_instance) {
+		srln_instance_t *srln_instance = srln_init();
+		if (srln_instance) {
+			indev_t *sink = stdin_wire();
+			indev_t *srln = srln_wire(srln_instance, sink);
+			sgcnin_wire(sgcn_instance, srln);
+		}
+	}
 #endif
 #ifdef CONFIG_SGCN_PRN
Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision f2d2c7ba676ff1a37b6198b134c840dd09e1d11b)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision 253d3d0b04f3cdd9b3b0618555c429868401a3d7)
@@ -135,10 +135,4 @@
 };
 
-/** SGCN input device operations */
-static indev_operations_t sgcnin_ops = {
-	.poll = NULL
-};
-
-static indev_t sgcnin;		/**< SGCN input device. */
 static outdev_t sgcnout;	/**< SGCN output device. */
 
@@ -302,5 +296,5 @@
  * and sends them to the upper layers of HelenOS.
  */
-static void sgcn_poll()
+static void sgcn_poll(sgcn_instance_t *instance)
 {
 	uint32_t begin = SGCN_BUFFER_HEADER->in_begin;
@@ -320,5 +314,4 @@
 	
 	while (*in_rdptr_ptr != *in_wrptr_ptr) {
-		
 		buf_ptr = (volatile char *)
 		    SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
@@ -326,5 +319,5 @@
 		*in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin;
 			
-		indev_push_character(&sgcnin, c);	
+		indev_push_character(instance->srlnin, c);	
 	}	
 
@@ -335,9 +328,8 @@
  * Polling thread function.
  */
-static void kkbdpoll(void *arg) {
+static void ksgcnpoll(void *instance) {
 	while (1) {
-		if (!silent) {
-			sgcn_poll();
-		}
+		if (!silent) 
+			sgcn_poll(instance);
 		thread_usleep(POLL_INTERVAL);
 	}
@@ -347,18 +339,33 @@
  * A public function which initializes input from the Serengeti console.
  */
-indev_t *sgcnin_init(void)
+sgcn_instance_t *sgcnin_init(void)
 {
 	sgcn_buffer_begin_init();
 
+	sgcn_instance_t *instance =
+	    malloc(sizeof(sgcn_instance_t), FRAME_ATOMIC);
+	if (!instance)
+		return NULL;
+
+	instance->srlnin = NULL;
+	instance->thread = thread_create(ksgcnpoll, instance, TASK, 0,
+	    "ksgcnpoll", true);
+	if (!instance->thread) {
+		free(instance);
+		return NULL;
+	}
+	
+	return instance;
+}
+
+void sgcnin_wire(sgcn_instance_t *instance, indev_t *srlnin)
+{
+	ASSERT(instance);
+	ASSERT(srlnin);
+
+	instance->srlnin = srlnin;
+	thread_ready(instance->thread);
+
 	sysinfo_set_item_val("kbd", NULL, true);
-
-	thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true);
-	if (!t)
-		panic("Cannot create kkbdpoll.");
-	thread_ready(t);
-	
-	indev_initialize("sgcnin", &sgcnin, &sgcnin_ops);
-
-	return &sgcnin;
 }
 
