Index: uspace/srv/hid/input/generic/input.c
===================================================================
--- uspace/srv/hid/input/generic/input.c	(revision 7c014d1fbbe9734e6ee3616fac584d8cc996df36)
+++ uspace/srv/hid/input/generic/input.c	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -47,7 +47,5 @@
 #include <stdio.h>
 #include <ns.h>
-#include <ns_obsolete.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <errno.h>
 #include <adt/fifo.h>
@@ -63,7 +61,4 @@
 #include <mouse.h>
 
-// FIXME: remove this header
-#include <abi/ipc/methods.h>
-
 #define NUM_LAYOUTS  3
 
@@ -77,5 +72,5 @@
 static void kbd_devs_reclaim(void);
 
-int client_phone = -1;
+async_sess_t *client_sess = NULL;
 
 /** List of keyboard devices */
@@ -86,5 +81,5 @@
 
 bool irc_service = false;
-int irc_phone = -1;
+async_sess_t *irc_sess = NULL;
 
 void kbd_push_data(kbd_dev_t *kdev, sysarg_t data)
@@ -170,6 +165,8 @@
 	
 	ev.c = layout_parse_ev(kdev->active_layout, &ev);
-	async_obsolete_msg_4(client_phone, INPUT_EVENT_KEY, ev.type, ev.key,
-	    ev.mods, ev.c);
+	
+	async_exch_t *exch = async_exchange_begin(client_sess);
+	async_msg_4(exch, INPUT_EVENT_KEY, ev.type, ev.key, ev.mods, ev.c);
+	async_exchange_end(exch);
 }
 
@@ -177,5 +174,7 @@
 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy)
 {
-	async_obsolete_msg_2(client_phone, INPUT_EVENT_MOVE, dx, dy);
+	async_exch_t *exch = async_exchange_begin(client_sess);
+	async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy);
+	async_exchange_end(exch);
 }
 
@@ -183,22 +182,21 @@
 void mouse_push_event_button(mouse_dev_t *mdev, int bnum, int press)
 {
-	async_obsolete_msg_2(client_phone, INPUT_EVENT_BUTTON, bnum, press);
+	async_exch_t *exch = async_exchange_begin(client_sess);
+	async_msg_2(exch, INPUT_EVENT_BUTTON, bnum, press);
+	async_exchange_end(exch);
 }
 
 static void client_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
-	ipc_callid_t callid;
-	ipc_call_t call;
-	int retval;
-	
 	async_answer_0(iid, EOK);
 	
 	while (true) {
-		callid = async_get_call(&call);
+		ipc_call_t call;
+		ipc_callid_t callid = async_get_call(&call);
 		
 		if (!IPC_GET_IMETHOD(call)) {
-			if (client_phone != -1) {
-				async_obsolete_hangup(client_phone);
-				client_phone = -1;
+			if (client_sess != NULL) {
+				async_hangup(client_sess);
+				client_sess = NULL;
 			}
 			
@@ -207,26 +205,26 @@
 		}
 		
-		switch (IPC_GET_IMETHOD(call)) {
-		case IPC_M_CONNECT_TO_ME:
-			if (client_phone != -1) {
-				retval = ELIMIT;
+		async_sess_t *sess =
+		    async_callback_receive_start(EXCHANGE_SERIALIZE, &call);
+		if (sess != NULL) {
+			if (client_sess == NULL) {
+				client_sess = sess;
+				async_answer_0(callid, EOK);
+			} else
+				async_answer_0(callid, ELIMIT);
+		} else {
+			switch (IPC_GET_IMETHOD(call)) {
+			case INPUT_YIELD:
+				kbd_devs_yield();
+				async_answer_0(callid, EOK);
 				break;
+			case INPUT_RECLAIM:
+				kbd_devs_reclaim();
+				async_answer_0(callid, EOK);
+				break;
+			default:
+				async_answer_0(callid, EINVAL);
 			}
-			client_phone = IPC_GET_ARG5(call);
-			retval = 0;
-			break;
-		case INPUT_YIELD:
-			kbd_devs_yield();
-			retval = 0;
-			break;
-		case INPUT_RECLAIM:
-			kbd_devs_reclaim();
-			retval = 0;
-			break;
-		default:
-			retval = EINVAL;
 		}
-		
-		async_answer_0(callid, retval);
 	}
 }
@@ -648,6 +646,7 @@
 	
 	if (irc_service) {
-		while (irc_phone < 0)
-			irc_phone = service_obsolete_connect_blocking(SERVICE_IRC, 0, 0);
+		while (irc_sess == NULL)
+			irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE,
+			    SERVICE_IRC, 0, 0);
 	}
 	
Index: uspace/srv/hid/input/include/input.h
===================================================================
--- uspace/srv/hid/input/include/input.h	(revision 7c014d1fbbe9734e6ee3616fac584d8cc996df36)
+++ uspace/srv/hid/input/include/input.h	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -40,4 +40,5 @@
 
 #include <bool.h>
+#include <async.h>
 
 #define NAME       "input"
@@ -45,5 +46,5 @@
 
 extern bool irc_service;
-extern int irc_phone;
+extern async_sess_t *irc_sess;
 
 #endif
Index: uspace/srv/hid/input/port/ns16550.c
===================================================================
--- uspace/srv/hid/input/port/ns16550.c	(revision 7c014d1fbbe9734e6ee3616fac584d8cc996df36)
+++ uspace/srv/hid/input/port/ns16550.c	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -38,5 +38,4 @@
 #include <ipc/irc.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <sysinfo.h>
 #include <input.h>
@@ -158,7 +157,9 @@
 	kbd_push_data(kbd_dev, IPC_GET_ARG2(*call));
 	
-	if (irc_service)
-		async_obsolete_msg_1(irc_phone, IRC_CLEAR_INTERRUPT,
-		    IPC_GET_IMETHOD(*call));
+	if (irc_service) {
+		async_exch_t *exch = async_exchange_begin(irc_sess);
+		async_msg_1(exch, IRC_CLEAR_INTERRUPT, IPC_GET_IMETHOD(*call));
+		async_exchange_end(exch);
+	}
 }
 
Index: uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
===================================================================
--- uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision 7c014d1fbbe9734e6ee3616fac584d8cc996df36)
+++ uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -44,5 +44,4 @@
 #include <ipc/mouseev.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -53,9 +52,6 @@
 #include "s3c24xx_ts.h"
 
-// FIXME: remove this header
-#include <abi/ipc/methods.h>
-
-#define NAME "s3c24ser"
-#define NAMESPACE "hid"
+#define NAME       "s3c24ser"
+#define NAMESPACE  "hid"
 
 static irq_cmd_t ts_irq_cmds[] = {
@@ -134,5 +130,5 @@
 
 	ts->io = vaddr;
-	ts->client_phone = -1;
+	ts->client_sess = NULL;
 	ts->state = ts_wait_pendown;
 	ts->last_x = 0;
@@ -284,5 +280,8 @@
 	button = 1;
 	press = 0;
-	async_obsolete_msg_2(ts->client_phone, MOUSEEV_BUTTON_EVENT, button, press);
+	
+	async_exch_t *exch = async_exchange_begin(ts->client_sess);
+	async_msg_2(exch, MOUSEEV_BUTTON_EVENT, button, press);
+	async_exchange_end(exch);
 
 	s3c24xx_ts_wait_for_int_mode(ts, updn_down);
@@ -325,6 +324,8 @@
 
 	/* Send notifications to client. */
-	async_obsolete_msg_2(ts->client_phone, MOUSEEV_MOVE_EVENT, dx, dy);
-	async_obsolete_msg_2(ts->client_phone, MOUSEEV_BUTTON_EVENT, button, press);
+	async_exch_t *exch = async_exchange_begin(ts->client_sess);
+	async_msg_2(exch, MOUSEEV_MOVE_EVENT, dx, dy);
+	async_msg_2(exch, MOUSEEV_BUTTON_EVENT, button, press);
+	async_exchange_end(exch);
 
 	ts->last_x = x_pos;
@@ -377,36 +378,30 @@
     void *arg)
 {
-	ipc_callid_t callid;
-	ipc_call_t call;
-	int retval;
-
 	async_answer_0(iid, EOK);
-
-	while (1) {
-		callid = async_get_call(&call);
+	
+	while (true) {
+		ipc_call_t call;
+		ipc_callid_t callid = async_get_call(&call);
 		
 		if (!IPC_GET_IMETHOD(call)) {
-			if (ts->client_phone != -1) {
-				async_obsolete_hangup(ts->client_phone);
-				ts->client_phone = -1;
+			if (ts->client_sess != NULL) {
+				async_hangup(ts->client_sess);
+				ts->client_sess = NULL;
 			}
-
+			
 			async_answer_0(callid, EOK);
 			return;
 		}
 		
-		switch (IPC_GET_IMETHOD(call)) {
-		case IPC_M_CONNECT_TO_ME:
-			if (ts->client_phone != -1) {
-				retval = ELIMIT;
-				break;
-			}
-			ts->client_phone = IPC_GET_ARG5(call);
-			retval = 0;
-			break;
-		default:
-			retval = EINVAL;
-		}
-		async_answer_0(callid, retval);
+		async_sess_t *sess =
+		    async_callback_receive_start(EXCHANGE_SERIALIZE, &call);
+		if (sess != NULL) {
+			if (ts->client_sess == NULL) {
+				ts->client_sess = sess;
+				async_answer_0(callid, EOK);
+			} else
+				async_answer_0(callid, ELIMIT);
+		} else
+			async_answer_0(callid, EINVAL);
 	}
 }
Index: uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.h
===================================================================
--- uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.h	(revision 7c014d1fbbe9734e6ee3616fac584d8cc996df36)
+++ uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.h	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -39,4 +39,5 @@
 
 #include <sys/types.h>
+#include <async.h>
 
 /** S3C24xx ADC and touch-screen I/O */
@@ -121,6 +122,6 @@
 	s3c24xx_adc_io_t *io;
 
-	/** Callback phone to the client */
-	int client_phone;
+	/** Callback session to the client */
+	async_sess_t *client_sess;
 
 	/** Service ID */
