Index: uspace/lib/c/generic/irc.c
===================================================================
--- uspace/lib/c/generic/irc.c	(revision 75911d24ed425e4debd70944a83099e435d7d641)
+++ uspace/lib/c/generic/irc.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -35,8 +35,10 @@
 #include <assert.h>
 #include <errno.h>
+#include <fibril_synch.h>
 #include <ipc/irc.h>
 #include <ipc/services.h>
 #include <irc.h>
-#include <ns.h>
+#include <loc.h>
+#include <stdlib.h>
 #include <sysinfo.h>
 
@@ -49,7 +51,31 @@
 static int irc_init(void)
 {
+	category_id_t irc_cat;
+	service_id_t *svcs;
+	size_t count;
+	int rc;
+
 	assert(irc_sess == NULL);
+	rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING);
+	if (rc != EOK)
+		return EIO;
 
-	irc_sess = service_connect_blocking(SERVICE_IRC, INTERFACE_IRC, 0);
+	while (true) {
+		rc = loc_category_get_svcs(irc_cat, &svcs, &count);
+		if (rc != EOK)
+			return EIO;
+
+		if (count > 0)
+			break;
+
+		free(svcs);
+
+		// XXX This is just a temporary hack
+		fibril_usleep(500 * 1000);
+	}
+
+	irc_sess = loc_service_connect(svcs[0], INTERFACE_IRC,
+	    IPC_FLAG_BLOCKING);
+	free(svcs);
 
 	if (irc_sess == NULL)
Index: uspace/srv/hw/irc/apic/apic.c
===================================================================
--- uspace/srv/hw/irc/apic/apic.c	(revision 75911d24ed425e4debd70944a83099e435d7d641)
+++ uspace/srv/hw/irc/apic/apic.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -36,7 +36,6 @@
  */
 
-#include <ipc/services.h>
 #include <ipc/irc.h>
-#include <ns.h>
+#include <loc.h>
 #include <sysinfo.h>
 #include <as.h>
@@ -206,4 +205,6 @@
 {
 	sysarg_t apic;
+	category_id_t irc_cat;
+	service_id_t svc_id;
 	
 	if ((sysinfo_get_value("apic", &apic) != EOK) || (!apic)) {
@@ -220,5 +221,30 @@
 	
 	async_set_fallback_port_handler(apic_connection, NULL);
-	service_register(SERVICE_IRC);
+	
+	rc = loc_server_register(NAME);
+	if (rc != EOK) {
+		printf("%s: Failed registering server. (%d)\n", NAME, rc);
+		return false;
+	}
+	
+	rc = loc_service_register("irc/" NAME, &svc_id);
+	if (rc != EOK) {
+		printf("%s: Failed registering service. (%d)\n", NAME, rc);
+		return false;
+	}
+	
+	rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING);
+	if (rc != EOK) {
+		printf("%s: Failed resolving category 'iplink' (%d).\n", NAME,
+		    rc);
+		return false;
+	}
+	
+	rc = loc_service_add_to_cat(svc_id, irc_cat);
+	if (rc != EOK) {
+		printf("%s: Failed adding service to category (%d).\n", NAME,
+		    rc);
+		return false;
+	}
 	
 	return true;
Index: uspace/srv/hw/irc/i8259/i8259.c
===================================================================
--- uspace/srv/hw/irc/i8259/i8259.c	(revision 75911d24ed425e4debd70944a83099e435d7d641)
+++ uspace/srv/hw/irc/i8259/i8259.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -36,7 +36,6 @@
  */
 
-#include <ipc/services.h>
 #include <ipc/irc.h>
-#include <ns.h>
+#include <loc.h>
 #include <sysinfo.h>
 #include <as.h>
@@ -47,5 +46,4 @@
 #include <async.h>
 #include <stdio.h>
-#include <ipc/loc.h>
 
 #define NAME  "i8259"
@@ -141,4 +139,7 @@
 {
 	sysarg_t i8259;
+	category_id_t irc_cat;
+	service_id_t svc_id;
+	int rc;
 	
 	if ((sysinfo_get_value("i8259", &i8259) != EOK) || (!i8259)) {
@@ -156,5 +157,30 @@
 	
 	async_set_fallback_port_handler(i8259_connection, NULL);
-	service_register(SERVICE_IRC);
+
+	rc = loc_server_register(NAME);
+	if (rc != EOK) {
+		printf("%s: Failed registering server. (%d)\n", NAME, rc);
+		return false;
+	}
+
+	rc = loc_service_register("irc/" NAME, &svc_id);
+	if (rc != EOK) {
+		printf("%s: Failed registering service. (%d)\n", NAME, rc);
+		return false;
+	}
+
+	rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING);
+	if (rc != EOK) {
+		printf("%s: Failed resolving category 'iplink' (%d).\n", NAME,
+		    rc);
+		return false;
+	}
+
+	rc = loc_service_add_to_cat(svc_id, irc_cat);
+	if (rc != EOK) {
+		printf("%s: Failed adding service to category (%d).\n", NAME,
+		    rc);
+		return false;
+	}
 	
 	return true;
Index: uspace/srv/hw/irc/icp-ic/icp-ic.c
===================================================================
--- uspace/srv/hw/irc/icp-ic/icp-ic.c	(revision 75911d24ed425e4debd70944a83099e435d7d641)
+++ uspace/srv/hw/irc/icp-ic/icp-ic.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -41,7 +41,6 @@
 #include <errno.h>
 #include <io/log.h>
-#include <ipc/services.h>
 #include <ipc/irc.h>
-#include <ns.h>
+#include <loc.h>
 #include <sysinfo.h>
 #include <stdio.h>
@@ -121,4 +120,6 @@
 	char *pstr = NULL;
 	size_t platform_size;
+	category_id_t irc_cat;
+	service_id_t svc_id;
 	void *regs;
 	int rc;
@@ -155,5 +156,30 @@
 
 	async_set_fallback_port_handler(icpic_connection, NULL);
-	service_register(SERVICE_IRC);
+
+	rc = loc_server_register(NAME);
+	if (rc != EOK) {
+		printf("%s: Failed registering server. (%d)\n", NAME, rc);
+		return rc;
+	}
+
+	rc = loc_service_register("irc/" NAME, &svc_id);
+	if (rc != EOK) {
+		printf("%s: Failed registering service. (%d)\n", NAME, rc);
+		return rc;
+	}
+
+	rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING);
+	if (rc != EOK) {
+		printf("%s: Failed resolving category 'iplink' (%d).\n", NAME,
+		    rc);
+		goto error;
+	}
+
+	rc = loc_service_add_to_cat(svc_id, irc_cat);
+	if (rc != EOK) {
+		printf("%s: Failed adding service to category (%d).\n", NAME,
+		    rc);
+		goto error;
+	}
 
 	free(platform);
Index: uspace/srv/hw/irc/obio/obio.c
===================================================================
--- uspace/srv/hw/irc/obio/obio.c	(revision 75911d24ed425e4debd70944a83099e435d7d641)
+++ uspace/srv/hw/irc/obio/obio.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -42,7 +42,6 @@
  */
 
-#include <ipc/services.h>
 #include <ipc/irc.h>
-#include <ns.h>
+#include <loc.h>
 #include <as.h>
 #include <ddi.h>
@@ -55,9 +54,8 @@
 #include <async.h>
 #include <stdio.h>
-#include <ipc/loc.h>
 
 #define NAME "obio"
 
-#define OBIO_SIZE	0x1898	
+#define OBIO_SIZE	0x1898
 
 #define OBIO_IMR_BASE	0x200
@@ -120,4 +118,8 @@
 static bool obio_init(void)
 {
+	category_id_t irc_cat;
+	service_id_t svc_id;
+	int rc;
+	
 	base_phys = (uintptr_t) 0x1fe00000000ULL;
 	
@@ -135,5 +137,30 @@
 	
 	async_set_fallback_port_handler(obio_connection, NULL);
-	service_register(SERVICE_IRC);
+	
+	rc = loc_server_register(NAME);
+	if (rc != EOK) {
+		printf("%s: Failed registering server. (%d)\n", NAME, rc);
+		return false;
+	}
+	
+	rc = loc_service_register("irc/" NAME, &svc_id);
+	if (rc != EOK) {
+		printf("%s: Failed registering service. (%d)\n", NAME, rc);
+		return false;
+	}
+	
+	rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING);
+	if (rc != EOK) {
+		printf("%s: Failed resolving category 'iplink' (%d).\n", NAME,
+		    rc);
+		return false;
+	}
+	
+	rc = loc_service_add_to_cat(svc_id, irc_cat);
+	if (rc != EOK) {
+		printf("%s: Failed adding service to category (%d).\n", NAME,
+		    rc);
+		return false;
+	}
 	
 	return true;
Index: uspace/srv/locsrv/locsrv.c
===================================================================
--- uspace/srv/locsrv/locsrv.c	(revision 75911d24ed425e4debd70944a83099e435d7d641)
+++ uspace/srv/locsrv/locsrv.c	(revision 9a2eb148bd4e4d86f0fc35bd918214f79b734096)
@@ -1359,4 +1359,7 @@
 	categ_dir_add_cat(&cdir, cat);
 
+	cat = category_new("irc");
+	categ_dir_add_cat(&cdir, cat);
+
 	cat = category_new("visualizer");
 	categ_dir_add_cat(&cdir, cat);
