Index: kernel/genarch/Makefile.inc
===================================================================
--- kernel/genarch/Makefile.inc	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/genarch/Makefile.inc	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
@@ -80,2 +80,10 @@
 		genarch/src/kbd/scanc_sun.c
 endif
+
+## ns16550 controller
+ifeq ($(CONFIG_NS16550),y)
+	GENARCH_SOURCES += \
+		genarch/src/kbd/ns16550.c \
+		genarch/src/kbd/key.c \
+		genarch/src/kbd/scanc_sun.c
+endif
Index: kernel/genarch/include/kbd/ns16550.h
===================================================================
--- kernel/genarch/include/kbd/ns16550.h	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
+++ kernel/genarch/include/kbd/ns16550.h	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2001-2004 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - 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.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/** @addtogroup genarch	
+ * @{
+ */
+/**
+ * @file
+ * @brief	Headers for NS 16550 serial port / keyboard driver.
+ */
+
+#ifndef KERN_NS16550_H_
+#define KERN_NS16550_H_
+
+extern void ns16550_init(void);
+extern void ns16550_poll(void);
+extern void ns16550_grab(void);
+extern void ns16550_release(void);
+
+#endif
+
+/** @}
+ */
Index: kernel/genarch/src/kbd/key.c
===================================================================
--- kernel/genarch/src/kbd/key.c	(revision d46c6ecd4bb1934b64d8c11726ffed69e5897343)
+++ kernel/genarch/src/kbd/key.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
@@ -37,5 +37,10 @@
 #include <genarch/kbd/key.h>
 #include <genarch/kbd/scanc.h>
+#ifdef CONFIG_I8042
 #include <genarch/kbd/scanc_pc.h>
+#endif
+#if (defined(CONFIG_Z8530) || defined(CONFIG_NS16550))
+#include <genarch/kbd/scanc_sun.h>
+#endif
 #include <synch/spinlock.h>
 #include <console/chardev.h>
Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
+++ kernel/genarch/src/kbd/ns16550.c	(revision 8b4be29e60da1d7e6355cb2b0bf8ae7e3c561965)
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2001-2004 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - 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.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+ */
+
+/** @addtogroup genarch	
+ * @{
+ */
+/**
+ * @file
+ * @brief	NS 16550 serial port / keyboard driver.
+ */
+
+#include <genarch/kbd/ns16550.h>
+#include <genarch/kbd/key.h>
+#include <genarch/kbd/scanc.h>
+#include <genarch/kbd/scanc_sun.h>
+#include <arch/drivers/ns16550.h>
+#include <arch/interrupt.h>
+#include <cpu.h>
+#include <arch/asm.h>
+#include <arch.h>
+#include <typedefs.h>
+#include <console/chardev.h>
+#include <console/console.h>
+#include <interrupt.h>
+
+#define LSR_DATA_READY	0x01
+
+/*
+ * These codes read from ns16550 data register are silently ignored.
+ */
+#define IGNORE_CODE	0x7f		/* all keys up */
+
+static void ns16550_suspend(chardev_t *);
+static void ns16550_resume(chardev_t *);
+
+chardev_t kbrd;
+static chardev_operations_t ops = {
+	.suspend = ns16550_suspend,
+	.resume = ns16550_resume,
+	.read = key_read
+};
+
+void ns16550_interrupt(int n, istate_t *istate);
+void ns16550_wait(void);
+
+/** Initialize keyboard and service interrupts using kernel routine */
+void ns16550_grab(void)
+{
+	/* TODO */
+}
+
+/** Resume the former interrupt vector */
+void ns16550_release(void)
+{
+	/* TODO */
+}
+
+/** Initialize ns16550. */
+void ns16550_init(void)
+{
+	ns16550_grab();
+	chardev_initialize("ns16550_kbd", &kbrd, &ops);
+	stdin = &kbrd;
+}
+
+/** Process ns16550 interrupt.
+ *
+ * @param n Interrupt vector.
+ * @param istate Interrupted state.
+ */
+void ns16550_interrupt(int n, istate_t *istate)
+{
+	/* TODO */
+}
+
+/** Wait until the controller reads its data. */
+void ns16550_wait(void) {
+}
+
+/* Called from getc(). */
+void ns16550_resume(chardev_t *d)
+{
+}
+
+/* Called from getc(). */
+void ns16550_suspend(chardev_t *d)
+{
+}
+
+char key_read(chardev_t *d)
+{
+	char ch;	
+
+	while(!(ch = active_read_buff_read())) {
+		uint8_t x;
+		while (!(ns16550_lsr_read() & LSR_DATA_READY))
+			;
+		x = ns16550_rbr_read();
+		if (x != IGNORE_CODE) {
+			if (x & KEY_RELEASE)
+				key_released(x ^ KEY_RELEASE);
+			else
+				active_read_key_pressed(x);
+		}
+	}
+	return ch;
+}
+
+/** Poll for key press and release events.
+ *
+ * This function can be used to implement keyboard polling.
+ */
+void ns16550_poll(void)
+{
+	uint8_t x;
+
+	while (((x = ns16550_lsr_read() & LSR_DATA_READY))) {
+		x = ns16550_rbr_read();
+		if (x != IGNORE_CODE) {
+			if (x & KEY_RELEASE)
+				key_released(x ^ KEY_RELEASE);
+			else
+				key_pressed(x);
+		}
+	}
+}
+
+/** @}
+ */
