Index: uspace/srv/kbd/Makefile
===================================================================
--- uspace/srv/kbd/Makefile	(revision f97e25fe18199ed9caabb3a536cf7db91835c374)
+++ uspace/srv/kbd/Makefile	(revision de88998df4f8ddec4b30482af3a93b8ebf8a6099)
@@ -117,7 +117,13 @@
 endif
 ifeq ($(UARCH), sparc64)
+    ifeq ($(MACHINE),serengeti)
+	GENARCH_SOURCES += \
+		port/sgcn.c \
+		ctl/stty.c
+    else
 	GENARCH_SOURCES += \
 		port/z8530.c \
 		ctl/sun.c
+    endif
 endif
 
Index: uspace/srv/kbd/port/sgcn.c
===================================================================
--- uspace/srv/kbd/port/sgcn.c	(revision f97e25fe18199ed9caabb3a536cf7db91835c374)
+++ uspace/srv/kbd/port/sgcn.c	(revision de88998df4f8ddec4b30482af3a93b8ebf8a6099)
@@ -37,5 +37,4 @@
 #include <as.h>
 #include <ddi.h>
-#include <ipc/ipc.h>
 #include <async.h>
 #include <kbd.h>
@@ -43,4 +42,7 @@
 #include <sysinfo.h>
 #include <stdio.h>
+#include <thread.h>
+
+#define POLL_INTERVAL		10000
 
 /**
@@ -88,14 +90,14 @@
 static uintptr_t sram_buffer_offset;
 
-static void sgcn_irq_handler(ipc_callid_t iid, ipc_call_t *call);
+/* polling thread */
+static void *sgcn_thread_impl(void *arg);
 
 
 /**
  * Initializes the SGCN driver.
- * Maps the physical memory (SRAM) and registers the interrupt. 
+ * Maps the physical memory (SRAM) and creates the polling thread. 
  */
 int kbd_port_init(void)
 {
-	async_set_interrupt_received(sgcn_irq_handler);
 	sram_virt_addr = (uintptr_t) as_get_mappable_page(sysinfo_value("sram.area.size"));
 	if (physmem_map((void *) sysinfo_value("sram.address.physical"),
@@ -107,6 +109,13 @@
 	
 	sram_buffer_offset = sysinfo_value("sram.buffer.offset");
-	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
-		0, (void *) 0);
+
+	thread_id_t tid;
+	int rc;
+
+	rc = thread_create(sgcn_thread_impl, NULL, "kbd_poll", &tid);
+	if (rc != 0) {
+		return rc;
+	}
+
 	return 0;
 }
@@ -116,5 +125,5 @@
  * the buffer. 
  */
-static void sgcn_irq_handler(ipc_callid_t iid, ipc_call_t *call)
+static void sgcn_key_pressed(void)
 {
 	char c;
@@ -138,4 +147,18 @@
 }
 
+/**
+ * Thread to poll SGCN for keypresses.
+ */
+static void *sgcn_thread_impl(void *arg)
+{
+	(void) arg;
+
+	while (1) {
+		sgcn_key_pressed();
+		usleep(POLL_INTERVAL);
+	}
+}
+
+
 /** @}
  */
