Index: uspace/Makefile
===================================================================
--- uspace/Makefile	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/Makefile	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -155,9 +155,10 @@
 	drv/bus/usb/usbmid \
 	drv/bus/usb/vhc \
+	drv/char/atkbd \
 	drv/char/i8042 \
 	drv/char/ns8250 \
 	drv/char/pl050 \
 	drv/char/ps2mouse \
-	drv/char/atkbd \
+	drv/char/ski-con \
 	drv/char/xtkbd \
 	drv/test/test1 \
@@ -181,4 +182,5 @@
 	drv/platform/msim \
 	drv/platform/pc \
+	drv/platform/ski \
 	drv/time/cmos-rtc
 
Index: uspace/drv/char/ski-con/Makefile
===================================================================
--- uspace/drv/char/ski-con/Makefile	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/char/ski-con/Makefile	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2017 Jiri Svoboda
+# 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.
+#
+
+USPACE_PREFIX = ../../..
+LIBS = $(LIBDRV_PREFIX)/libdrv.a
+EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include
+BINARY = ski-con
+
+SOURCES = \
+	main.c \
+	ski-con.c
+
+include $(USPACE_PREFIX)/Makefile.common
Index: uspace/drv/char/ski-con/main.c
===================================================================
--- uspace/drv/char/ski-con/main.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/char/ski-con/main.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2017 Jiri Svoboda
+ * 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 Ski console driver
+ */
+
+#include <ddf/driver.h>
+#include <ddf/log.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include "ski-con.h"
+
+#define NAME  "ski-con"
+
+static int ski_con_dev_add(ddf_dev_t *dev);
+static int ski_con_dev_remove(ddf_dev_t *dev);
+static int ski_con_dev_gone(ddf_dev_t *dev);
+static int ski_con_fun_online(ddf_fun_t *fun);
+static int ski_con_fun_offline(ddf_fun_t *fun);
+
+static driver_ops_t driver_ops = {
+	.dev_add = ski_con_dev_add,
+	.dev_remove = ski_con_dev_remove,
+	.dev_gone = ski_con_dev_gone,
+	.fun_online = ski_con_fun_online,
+	.fun_offline = ski_con_fun_offline
+};
+
+static driver_t ski_con_driver = {
+	.name = NAME,
+	.driver_ops = &driver_ops
+};
+
+static int ski_con_dev_add(ddf_dev_t *dev)
+{
+	ski_con_t *ski_con;
+
+        ddf_msg(LVL_DEBUG, "ski_con_dev_add(%p)", dev);
+	ski_con = ddf_dev_data_alloc(dev, sizeof(ski_con_t));
+	if (ski_con == NULL) {
+		ddf_msg(LVL_ERROR, "Failed allocating soft state.");
+		return ENOMEM;
+	}
+
+	ski_con->dev = dev;
+
+	return ski_con_add(ski_con);
+}
+
+static int ski_con_dev_remove(ddf_dev_t *dev)
+{
+        ski_con_t *ski_con = (ski_con_t *)ddf_dev_data_get(dev);
+
+        ddf_msg(LVL_DEBUG, "ski_con_dev_remove(%p)", dev);
+
+        return ski_con_remove(ski_con);
+}
+
+static int ski_con_dev_gone(ddf_dev_t *dev)
+{
+        ski_con_t *ski_con = (ski_con_t *)ddf_dev_data_get(dev);
+
+        ddf_msg(LVL_DEBUG, "ski_con_dev_gone(%p)", dev);
+
+        return ski_con_gone(ski_con);
+}
+
+static int ski_con_fun_online(ddf_fun_t *fun)
+{
+        ddf_msg(LVL_DEBUG, "ski_con_fun_online()");
+        return ddf_fun_online(fun);
+}
+
+static int ski_con_fun_offline(ddf_fun_t *fun)
+{
+        ddf_msg(LVL_DEBUG, "ski_con_fun_offline()");
+        return ddf_fun_offline(fun);
+}
+
+int main(int argc, char *argv[])
+{
+	printf(NAME ": Ski console driver\n");
+	ddf_log_init(NAME);
+	return ddf_driver_main(&ski_con_driver);
+}
+
+/** @}
+ */
Index: uspace/drv/char/ski-con/ski-con.c
===================================================================
--- uspace/drv/char/ski-con/ski-con.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/char/ski-con/ski-con.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2005 Jakub Jermar
+ * Copyright (c) 2011 Jiri Svoboda
+ * 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.
+ */
+
+/** @file Ski console driver.
+ */
+
+#include <ddf/driver.h>
+#include <ddf/log.h>
+#include <errno.h>
+#include <ipc/char.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <thread.h>
+#include <stdbool.h>
+
+#include "ski-con.h"
+
+#define SKI_GETCHAR		21
+
+#define POLL_INTERVAL		10000
+
+static void ski_con_thread_impl(void *arg);
+static int32_t ski_con_getchar(void);
+static void ski_con_connection(ipc_callid_t, ipc_call_t *, void *);
+
+#include <stdio.h>
+/** Initialize Ski port driver. */
+int ski_con_add(ski_con_t *con)
+{
+	thread_id_t tid;
+	ddf_fun_t *fun = NULL;
+	bool bound = false;
+	int rc;
+
+	fun = ddf_fun_create(con->dev, fun_exposed, "a");
+	if (fun == NULL) {
+		ddf_msg(LVL_ERROR, "Error creating function 'a'.");
+		rc = ENOMEM;
+		goto error;
+	}
+
+	ddf_fun_set_conn_handler(fun, ski_con_connection);
+
+	rc = ddf_fun_bind(fun);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Error binding function 'a'.");
+		goto error;
+	}
+
+	bound = true;
+
+	rc = thread_create(ski_con_thread_impl, con, "kbd_poll", &tid);
+	if (rc != 0) {
+		return rc;
+	}
+
+	return EOK;
+error:
+	if (bound)
+		ddf_fun_unbind(fun);
+	if (fun != NULL)
+		ddf_fun_destroy(fun);
+
+	return rc;
+}
+
+/** Remove ski console device */
+int ski_con_remove(ski_con_t *con)
+{
+	return ENOTSUP;
+}
+
+/** Ski console device gone */
+int ski_con_gone(ski_con_t *con)
+{
+	return ENOTSUP;
+}
+
+/** Thread to poll Ski for keypresses. */
+static void ski_con_thread_impl(void *arg)
+{
+	int32_t c;
+	ski_con_t *con = (ski_con_t *) arg;
+
+	while (1) {
+		while (1) {
+			c = ski_con_getchar();
+			if (c == 0)
+				break;
+
+			if (con->client_sess != NULL) {
+				async_exch_t *exch = async_exchange_begin(con->client_sess);
+				async_msg_1(exch, CHAR_NOTIF_BYTE, c);
+				async_exchange_end(exch);
+			}
+		}
+
+		thread_usleep(POLL_INTERVAL);
+	}
+}
+
+/** Ask Ski if a key was pressed.
+ *
+ * Use SSC (Simulator System Call) to get character from the debug console.
+ * This call is non-blocking.
+ *
+ * @return ASCII code of pressed key or 0 if no key pressed.
+ */
+static int32_t ski_con_getchar(void)
+{
+	uint64_t ch;
+
+#ifdef UARCH_ia64
+	asm volatile (
+		"mov r15 = %1\n"
+		"break 0x80000;;\n"	/* modifies r8 */
+		"mov %0 = r8;;\n"
+
+		: "=r" (ch)
+		: "i" (SKI_GETCHAR)
+		: "r15", "r8"
+	);
+#else
+	ch = 0;
+#endif
+	return (int32_t) ch;
+}
+
+static void ski_con_putchar(ski_con_t *con, char ch)
+{
+	
+}
+
+/** Character device connection handler. */
+static void ski_con_connection(ipc_callid_t iid, ipc_call_t *icall,
+    void *arg)
+{
+	ski_con_t *con;
+
+	/* Answer the IPC_M_CONNECT_ME_TO call. */
+	async_answer_0(iid, EOK);
+
+	con = (ski_con_t *)ddf_dev_data_get(ddf_fun_get_dev((ddf_fun_t *)arg));
+
+	while (true) {
+		ipc_call_t call;
+		ipc_callid_t callid = async_get_call(&call);
+		sysarg_t method = IPC_GET_IMETHOD(call);
+
+		if (!method) {
+			/* The other side has hung up. */
+			async_answer_0(callid, EOK);
+			return;
+		}
+
+		async_sess_t *sess =
+		    async_callback_receive_start(EXCHANGE_SERIALIZE, &call);
+		if (sess != NULL) {
+			if (con->client_sess == NULL) {
+				con->client_sess = sess;
+				async_answer_0(callid, EOK);
+			} else
+				async_answer_0(callid, ELIMIT);
+		} else {
+			switch (method) {
+			case CHAR_WRITE_BYTE:
+				ddf_msg(LVL_DEBUG, "Write %" PRIun " to device\n",
+				    IPC_GET_ARG1(call));
+				ski_con_putchar(con, (uint8_t) IPC_GET_ARG1(call));
+				async_answer_0(callid, EOK);
+				break;
+			default:
+				async_answer_0(callid, EINVAL);
+			}
+		}
+	}
+}
+
+/** @}
+ */
Index: uspace/drv/char/ski-con/ski-con.h
===================================================================
--- uspace/drv/char/ski-con/ski-con.h	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/char/ski-con/ski-con.h	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2017 Jiri Svoboda
+ * 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
+ */
+
+#ifndef SKI_CON_H
+#define SKI_CON_H
+
+#include <async.h>
+#include <ddf/driver.h>
+#include <loc.h>
+#include <stdint.h>
+
+/** IntegratorCP Interrupt Controller */
+typedef struct {
+	async_sess_t *client_sess;
+	ddf_dev_t *dev;
+} ski_con_t;
+
+extern int ski_con_add(ski_con_t *);
+extern int ski_con_remove(ski_con_t *);
+extern int ski_con_gone(ski_con_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/drv/char/ski-con/ski-con.ma
===================================================================
--- uspace/drv/char/ski-con/ski-con.ma	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/char/ski-con/ski-con.ma	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,1 @@
+10 ski/console
Index: uspace/drv/platform/ski/Makefile
===================================================================
--- uspace/drv/platform/ski/Makefile	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/platform/ski/Makefile	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2017 Jiri Svoboda
+# 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.
+#
+
+USPACE_PREFIX = ../../..
+LIBS = $(LIBDRV_PREFIX)/libdrv.a
+EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include
+BINARY = ski
+
+SOURCES = \
+	ski.c
+
+include $(USPACE_PREFIX)/Makefile.common
Index: uspace/drv/platform/ski/ski.c
===================================================================
--- uspace/drv/platform/ski/ski.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/platform/ski/ski.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2017 Jiri Svoboda
+ * 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.
+ */
+
+/**
+ * @defgroup ski platform driver.
+ * @brief Ski platform driver.
+ * @{
+ */
+
+/** @file
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <ddf/driver.h>
+#include <ddf/log.h>
+
+#define NAME "ski"
+
+static int ski_dev_add(ddf_dev_t *dev);
+
+static driver_ops_t ski_ops = {
+	.dev_add = &ski_dev_add
+};
+
+static driver_t ski_driver = {
+	.name = NAME,
+	.driver_ops = &ski_ops
+};
+
+static int ski_add_fun(ddf_dev_t *dev, const char *name, const char *str_match_id)
+{
+	ddf_msg(LVL_NOTE, "Adding function '%s'.", name);
+
+	ddf_fun_t *fnode = NULL;
+	int rc;
+
+	/* Create new device. */
+	fnode = ddf_fun_create(dev, fun_inner, name);
+	if (fnode == NULL) {
+		ddf_msg(LVL_ERROR, "Error creating function '%s'", name);
+		rc = ENOMEM;
+		goto error;
+	}
+
+	/* Add match ID */
+	rc = ddf_fun_add_match_id(fnode, str_match_id, 100);
+	if (rc != EOK) {
+		ddf_msg(LVL_ERROR, "Error adding match ID");
+		goto error;
+	}
+
+	/* Register function. */
+	if (ddf_fun_bind(fnode) != EOK) {
+		ddf_msg(LVL_ERROR, "Failed binding function %s.", name);
+		goto error;
+	}
+
+	return EOK;
+
+error:
+	if (fnode != NULL)
+		ddf_fun_destroy(fnode);
+
+	return rc;
+}
+
+static int ski_add_functions(ddf_dev_t *dev)
+{
+	int rc;
+
+	rc = ski_add_fun(dev, "console", "ski/console");
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
+/** Add device. */
+static int ski_dev_add(ddf_dev_t *dev)
+{
+	ddf_msg(LVL_NOTE, "ski_dev_add, device handle = %d",
+	    (int)ddf_dev_get_handle(dev));
+
+	/* Register functions. */
+	if (ski_add_functions(dev)) {
+		ddf_msg(LVL_ERROR, "Failed to add functions for ski platform.");
+	}
+
+	return EOK;
+}
+
+int main(int argc, char *argv[])
+{
+	int rc;
+
+	printf(NAME ": Ski platform driver\n");
+
+	rc = ddf_log_init(NAME);
+	if (rc != EOK) {
+		printf(NAME ": Failed initializing logging service");
+		return 1;
+	}
+
+	return ddf_driver_main(&ski_driver);
+}
+
+/**
+ * @}
+ */
Index: uspace/drv/platform/ski/ski.ma
===================================================================
--- uspace/drv/platform/ski/ski.ma	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
+++ uspace/drv/platform/ski/ski.ma	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -0,0 +1,1 @@
+10 platform/ski
Index: uspace/srv/hid/input/Makefile
===================================================================
--- uspace/srv/hid/input/Makefile	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/srv/hid/input/Makefile	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -42,5 +42,4 @@
 	port/msim.c \
 	port/niagara.c \
-	port/ski.c \
 	proto/adb.c \
 	proto/mousedev.c \
Index: uspace/srv/hid/input/input.c
===================================================================
--- uspace/srv/hid/input/input.c	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/srv/hid/input/input.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -637,6 +637,6 @@
 	kbd_add_dev(&chardev_port, &stty_ctl);
 #endif
-#if defined(MACHINE_ski)
-	kbd_add_dev(&ski_port, &stty_ctl);
+#if defined(UARCH_ia64) && defined(MACHINE_ski)
+	kbd_add_dev(&chardev_port, &stty_ctl);
 #endif
 #if defined(MACHINE_msim)
Index: uspace/srv/hid/input/kbd_port.h
===================================================================
--- uspace/srv/hid/input/kbd_port.h	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/srv/hid/input/kbd_port.h	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -52,5 +52,4 @@
 extern kbd_port_ops_t niagara_port;
 extern kbd_port_ops_t ns16550_port;
-extern kbd_port_ops_t ski_port;
 
 #endif
Index: uspace/srv/hid/input/port/chardev.c
===================================================================
--- uspace/srv/hid/input/port/chardev.c	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ uspace/srv/hid/input/port/chardev.c	(revision 6d15572dfd149e15e038621d23fb73f4628be9de)
@@ -59,5 +59,8 @@
 /** List of devices to try connecting to. */
 static const char *in_devs[] = {
-	"char/s3c24xx_uart"
+	/** S3C24xx UART - Openmoko debug console */
+	"char/s3c24xx_uart",
+	/** Ski console */
+	"devices/\\hw\\console\\a"
 };
 
@@ -74,7 +77,10 @@
 	
 	for (i = 0; i < num_devs; i++) {
+		printf("%s: Probe service '%s'\n", NAME, in_devs[i]);
 		rc = loc_service_get_id(in_devs[i], &service_id, 0);
-		if (rc == EOK)
+		if (rc == EOK) {
+			printf("%s: success \n", NAME);
 			break;
+		}
 	}
 	
@@ -109,4 +115,5 @@
 		return -1;
 	}
+	printf("%s: Connected input device\n", NAME);
 	
 	return 0;
Index: uspace/srv/hid/input/port/ski.c
===================================================================
--- uspace/srv/hid/input/port/ski.c	(revision cecba66ea48d60cfa59865e98aeda663808e42c7)
+++ 	(revision )
@@ -1,130 +1,0 @@
-/*
- * Copyright (c) 2005 Jakub Jermar
- * Copyright (c) 2011 Jiri Svoboda
- * 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 kbd_port
- * @ingroup  kbd
- * @{
- */
-/** @file
- * @brief Ski console keyboard port driver.
- */
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <thread.h>
-#include <stdbool.h>
-#include "../kbd_port.h"
-#include "../kbd.h"
-
-static int ski_port_init(kbd_dev_t *);
-static void ski_port_write(uint8_t data);
-
-kbd_port_ops_t ski_port = {
-	.init = ski_port_init,
-	.write = ski_port_write
-};
-
-static kbd_dev_t *kbd_dev;
-
-#define SKI_GETCHAR		21
-
-#define POLL_INTERVAL		10000
-
-static void ski_thread_impl(void *arg);
-static int32_t ski_getchar(void);
-
-/** Initialize Ski port driver. */
-static int ski_port_init(kbd_dev_t *kdev)
-{
-	thread_id_t tid;
-	int rc;
-
-	kbd_dev = kdev;
-
-	rc = thread_create(ski_thread_impl, NULL, "kbd_poll", &tid);
-	if (rc != 0) {
-		return rc;
-	}
-
-	return 0;
-}
-
-static void ski_port_write(uint8_t data)
-{
-	(void) data;
-}
-
-/** Thread to poll Ski for keypresses. */
-static void ski_thread_impl(void *arg)
-{
-	int32_t c;
-	(void) arg;
-
-	while (1) {
-		while (1) {
-			c = ski_getchar();
-			if (c == 0)
-				break;
-			
-			kbd_push_data(kbd_dev, c);
-		}
-
-		thread_usleep(POLL_INTERVAL);
-	}
-}
-
-/** Ask Ski if a key was pressed.
- *
- * Use SSC (Simulator System Call) to get character from the debug console.
- * This call is non-blocking.
- *
- * @return ASCII code of pressed key or 0 if no key pressed.
- */
-static int32_t ski_getchar(void)
-{
-	uint64_t ch;
-	
-#ifdef UARCH_ia64
-	asm volatile (
-		"mov r15 = %1\n"
-		"break 0x80000;;\n"	/* modifies r8 */
-		"mov %0 = r8;;\n"		
-
-		: "=r" (ch)
-		: "i" (SKI_GETCHAR)
-		: "r15", "r8"
-	);
-#else
-	ch = 0;
-#endif
-	return (int32_t) ch;
-}
-
-/** @}
- */
