Index: uspace/srv/hid/output/Makefile
===================================================================
--- uspace/srv/hid/output/Makefile	(revision 74017cef2e4edaf9405cf38ba4b0958f664e700c)
+++ uspace/srv/hid/output/Makefile	(revision 9940ce0abda70ea8d091bd0be88bbccc2059eceb)
@@ -37,5 +37,4 @@
 	port/kchar.c \
 	port/niagara.c \
-	port/ski.c \
 	port/chardev.c \
 	proto/vt100.c \
Index: uspace/srv/hid/output/output.c
===================================================================
--- uspace/srv/hid/output/output.c	(revision 74017cef2e4edaf9405cf38ba4b0958f664e700c)
+++ uspace/srv/hid/output/output.c	(revision 9940ce0abda70ea8d091bd0be88bbccc2059eceb)
@@ -38,5 +38,4 @@
 #include "port/kchar.h"
 #include "port/niagara.h"
-#include "port/ski.h"
 #include "port/chardev.h"
 #include "output.h"
@@ -481,8 +480,7 @@
 		kchar_init();
 		niagara_init();
-		ski_init();
-	} else {
-		chardev_init();
-	}
+	}
+	
+	chardev_init();
 	
 	printf("%s: Accepting connections\n", NAME);
Index: uspace/srv/hid/output/port/chardev.c
===================================================================
--- uspace/srv/hid/output/port/chardev.c	(revision 74017cef2e4edaf9405cf38ba4b0958f664e700c)
+++ uspace/srv/hid/output/port/chardev.c	(revision 9940ce0abda70ea8d091bd0be88bbccc2059eceb)
@@ -1,4 +1,5 @@
 /*
  * Copyright (c) 2016 Jakub Jermar
+ * Copyright (c) 2017 Jiri Svoboda
  * All rights reserved.
  *
@@ -50,4 +51,5 @@
 static chardev_t *chardev;
 static service_id_t serial_cat_id;
+static service_id_t console_cat_id;
 
 static FIBRIL_MUTEX_INITIALIZE(discovery_lock);
@@ -68,4 +70,58 @@
 	chardev_write(chardev, (void *) str, str_size(str), &nwr);
 	/* XXX Handle error */
+}
+
+static bool find_output_dev(service_id_t *svcid)
+{
+	service_id_t *svc;
+	size_t svcs;
+	int rc;
+
+	rc = loc_category_get_svcs(serial_cat_id, &svc, &svcs);
+	if (rc != EOK) {
+		fibril_mutex_unlock(&discovery_lock);
+		printf("%s: Failed to get services\n", NAME);
+		return false;
+	}
+
+	for (size_t i = 0; i < svcs; i++) {
+		char *name;
+
+		rc = loc_service_get_name(svc[i], &name);
+		if (rc != EOK)
+			continue;
+
+		if (!str_cmp(console, name)) {
+			/*
+			 * This is the serial console service that the user
+			 * wanted to use.
+			 */
+			*svcid = svc[i];
+			free(svc);
+			return true;
+		}
+
+		free(name);
+	}
+
+	free(svc);
+
+	/* Look for any service in the 'console' category */
+
+	rc = loc_category_get_svcs(console_cat_id, &svc, &svcs);
+	if (rc != EOK) {
+		fibril_mutex_unlock(&discovery_lock);
+		printf("%s: Failed to get services\n", NAME);
+		return false;
+	}
+
+	if (svcs > 0) {
+		*svcid = svc[0];
+		free(svc);
+		return true;
+	}
+
+	free(svc);
+	return false;
 }
 
@@ -79,4 +135,6 @@
 {
 	int rc;
+	bool found;
+	service_id_t sid;
 
 	fibril_mutex_lock(&discovery_lock);
@@ -87,37 +145,5 @@
 	}
 
-	service_id_t *svc;
-	size_t svcs;
-	rc = loc_category_get_svcs(serial_cat_id, &svc, &svcs);
-	if (rc != EOK) {
-		fibril_mutex_unlock(&discovery_lock);
-		printf("%s: Failed to get services\n", NAME);
-		return;
-	}
-
-	service_id_t sid;
-	bool found = false;
-
-	for (size_t i = 0; i < svcs && !found; i++) {
-		char *name;
-		
-		rc = loc_service_get_name(svc[i], &name);
-		if (rc != EOK)
-			continue;
-
-		if (!str_cmp(console, name)) {
-			/*
-			 * This is the serial console service that the user
-			 * wanted to use.
-			 */
-			found = true;
-			sid = svc[i];
-		}
-			
-		free(name);
-	}
-
-	free(svc);
-
+	found = find_output_dev(&sid);
 	if (!found) {
 		fibril_mutex_unlock(&discovery_lock);
@@ -148,10 +174,13 @@
 int chardev_init(void)
 {
-	console = config_get_value("console");
-	if (!console) {
-		/*
-		 * The system is not configured to use serial console.
-		 */
+	if (!config_key_exists("console")) {
+		console = NULL;
+#ifndef MACHINE_ski
 		return EOK;
+#endif
+	} else {
+		console = config_get_value("console");
+		if (!console)
+			return EOK;
 	}
 
@@ -162,4 +191,10 @@
 	} 
 
+	rc = loc_category_get_id("console", &console_cat_id, IPC_FLAG_BLOCKING);
+	if (rc != EOK) {
+		printf("%s: Failed to get \"console\" category ID.\n", NAME);
+		return rc;
+	} 
+
 	rc = loc_register_cat_change_cb(check_for_dev);
 	if (rc != EOK) {
@@ -168,4 +203,6 @@
 		return rc;
 	}
+
+	check_for_dev();
 
 	fibril_mutex_lock(&discovery_lock);
Index: uspace/srv/hid/output/port/ski.c
===================================================================
--- uspace/srv/hid/output/port/ski.c	(revision 74017cef2e4edaf9405cf38ba4b0958f664e700c)
+++ 	(revision )
@@ -1,110 +1,0 @@
-/*
- * Copyright (c) 2006 Ondrej Palkovsky
- * Copyright (c) 2008 Martin Decky
- * 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
- */
-
-#include <errno.h>
-#include <sysinfo.h>
-#include "../ctl/serial.h"
-#include "ski.h"
-
-#ifdef UARCH_ia64
-
-#define SKI_PUTCHAR  31
-
-/** Display character on ski debug console
- *
- * Use SSC (Simulator System Call) to
- * display character on debug console.
- *
- * @param c Character to be printed.
- *
- */
-static void ski_putc(const char c)
-{
-	asm volatile (
-		"mov r15 = %0\n"
-		"mov r32 = %1\n"   /* r32 is in0 */
-		"break 0x80000\n"  /* modifies r8 */
-		:
-		: "i" (SKI_PUTCHAR), "r" (c)
-		: "r15", "in0", "r8"
-	);
-	
-	if (c == '\n')
-		ski_putc('\r');
-}
-
-static void ski_putchar(wchar_t ch)
-{
-	if ((ch >= 0) && (ch < 128))
-		ski_putc(ch);
-	else
-		ski_putc('?');
-}
-
-static void ski_control_puts(const char *str)
-{
-	while (*str)
-		ski_putc(*(str++));
-}
-
-int ski_init(void)
-{
-	sysarg_t present;
-	int rc = sysinfo_get_value("fb", &present);
-	if (rc != EOK)
-		present = false;
-	
-	if (!present)
-		return ENOENT;
-	
-	sysarg_t kind;
-	rc = sysinfo_get_value("fb.kind", &kind);
-	if (rc != EOK)
-		kind = (sysarg_t) -1;
-	
-	if (kind != 6)
-		return EINVAL;
-	
-	return serial_init(ski_putchar, ski_control_puts);
-}
-
-#else /* UARCH_ia64 */
-
-int ski_init(void)
-{
-	return ENOENT;
-}
-
-#endif
-
-/** @}
- */
Index: uspace/srv/hid/output/port/ski.h
===================================================================
--- uspace/srv/hid/output/port/ski.h	(revision 74017cef2e4edaf9405cf38ba4b0958f664e700c)
+++ 	(revision )
@@ -1,44 +1,0 @@
-/*
- * Copyright (c) 2008 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 console
- * @{
- */
-/**
- * @file
- */
-
-#ifndef OUTPUT_PORT_SKI_H_
-#define OUTPUT_PORT_SKI_H_
-
-extern int ski_init(void);
-
-#endif
-
-/** @}
- */
