Index: uspace/drv/bus/usb/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision 5f6e25e31dad65ed596bf61da69a51ec21c54ec7)
+++ uspace/drv/bus/usb/usbhid/kbd/kbddev.c	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -43,5 +43,4 @@
 #include <ipc/kbdev.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <fibril.h>
 #include <fibril_synch.h>
@@ -70,7 +69,4 @@
 
 #include "../usbhid.h"
-
-// FIXME: remove this header
-#include <abi/ipc/methods.h>
 
 /*----------------------------------------------------------------------------*/
@@ -167,5 +163,5 @@
  *
  * Currently recognizes only one method (IPC_M_CONNECT_TO_ME), in which case it
- * assumes the caller is the console and thus it stores IPC phone to it for 
+ * assumes the caller is the console and thus it stores IPC session to it for
  * later use by the driver to notify about key events.
  *
@@ -178,7 +174,6 @@
 {
 	sysarg_t method = IPC_GET_IMETHOD(*icall);
-	int callback;
-	
-	usb_kbd_t *kbd_dev = (usb_kbd_t *)fun->driver_data;
+	
+	usb_kbd_t *kbd_dev = (usb_kbd_t *) fun->driver_data;
 	if (kbd_dev == NULL) {
 		usb_log_debug("default_connection_handler: "
@@ -187,30 +182,29 @@
 		return;
 	}
-
-	switch (method) {
-	case IPC_M_CONNECT_TO_ME:
-		callback = IPC_GET_ARG5(*icall);
-
-		if (kbd_dev->console_phone != -1) {
+	
+	async_sess_t *sess =
+	    async_callback_receive_start(EXCHANGE_SERIALIZE, icall);
+	if (sess != NULL) {
+		if (kbd_dev->console_sess == NULL) {
+			kbd_dev->console_sess = sess;
+			usb_log_debug("default_connection_handler: OK\n");
+			async_answer_0(icallid, EOK);
+		} else {
 			usb_log_debug("default_connection_handler: "
-			    "console phone already set\n");
+			    "console session already set\n");
 			async_answer_0(icallid, ELIMIT);
-			return;
-		}
-
-		kbd_dev->console_phone = callback;
-		
-		usb_log_debug("default_connection_handler: OK\n");
-		async_answer_0(icallid, EOK);
-		break;
-	case KBDEV_SET_IND:
-		kbd_dev->mods = IPC_GET_ARG1(*icall);
-		usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev);
-		async_answer_0(icallid, EOK);
-		break;
-	default:
-		usb_log_debug("default_connection_handler: Wrong function.\n");
-		async_answer_0(icallid, EINVAL);
-		break;
+		}
+	} else {
+		switch (method) {
+		case KBDEV_SET_IND:
+			kbd_dev->mods = IPC_GET_ARG1(*icall);
+			usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev);
+			async_answer_0(icallid, EOK);
+			break;
+		default:
+			usb_log_debug("default_connection_handler: Wrong function.\n");
+			async_answer_0(icallid, EINVAL);
+			break;
+		}
 	}
 }
@@ -301,5 +295,5 @@
 {
 	usb_log_debug2("Sending kbdev event %d/%d to the console\n", type, key);
-	if (kbd_dev->console_phone < 0) {
+	if (kbd_dev->console_sess == NULL) {
 		usb_log_warning(
 		    "Connection to console not ready, key discarded.\n");
@@ -307,5 +301,7 @@
 	}
 	
-	async_obsolete_msg_2(kbd_dev->console_phone, KBDEV_EVENT, type, key);
+	async_exch_t *exch = async_exchange_begin(kbd_dev->console_sess);
+	async_msg_2(exch, KBDEV_EVENT, type, key);
+	async_exchange_end(exch);
 }
 
@@ -510,5 +506,5 @@
 	}
 	
-	kbd_dev->console_phone = -1;
+	kbd_dev->console_sess = NULL;
 	kbd_dev->initialized = USB_KBD_STATUS_UNINITIALIZED;
 	
@@ -785,6 +781,6 @@
 	}
 	
-	// hangup phone to the console
-	async_obsolete_hangup(kbd_dev->console_phone);
+	// hangup session to the console
+	async_hangup(kbd_dev->console_sess);
 	
 	if (kbd_dev->repeat_mtx != NULL) {
Index: uspace/drv/bus/usb/usbhid/kbd/kbddev.h
===================================================================
--- uspace/drv/bus/usb/usbhid/kbd/kbddev.h	(revision 5f6e25e31dad65ed596bf61da69a51ec21c54ec7)
+++ uspace/drv/bus/usb/usbhid/kbd/kbddev.h	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -38,7 +38,6 @@
 
 #include <stdint.h>
-
+#include <async.h>
 #include <fibril_synch.h>
-
 #include <usb/hid/hid.h>
 #include <usb/hid/hidparser.h>
@@ -58,5 +57,5 @@
  * data, such as currently pressed keys, modifiers and lock keys.
  *
- * Also holds a IPC phone to the console (since there is now no other way to 
+ * Also holds a IPC session to the console (since there is now no other way to 
  * communicate with it).
  *
@@ -83,6 +82,6 @@
 	unsigned lock_keys;
 	
-	/** IPC phone to the console device (for sending key events). */
-	int console_phone;
+	/** IPC session to the console device (for sending key events). */
+	async_sess_t *console_sess;
 	
 	/** @todo What is this actually? */
Index: uspace/drv/bus/usb/usbhid/mouse/mousedev.c
===================================================================
--- uspace/drv/bus/usb/usbhid/mouse/mousedev.c	(revision 5f6e25e31dad65ed596bf61da69a51ec21c54ec7)
+++ uspace/drv/bus/usb/usbhid/mouse/mousedev.c	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -42,5 +42,4 @@
 #include <errno.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <str_error.h>
 #include <ipc/mouseev.h>
@@ -56,8 +55,5 @@
 #define ARROWS_PER_SINGLE_WHEEL 3
 
-// FIXME: remove this header
-#include <abi/ipc/methods.h>
-
-#define NAME "mouse"
+#define NAME  "mouse"
 
 /*----------------------------------------------------------------------------*/
@@ -128,7 +124,5 @@
     ipc_callid_t icallid, ipc_call_t *icall)
 {
-	sysarg_t method = IPC_GET_IMETHOD(*icall);
-	
-	usb_mouse_t *mouse_dev = (usb_mouse_t *)fun->driver_data;
+	usb_mouse_t *mouse_dev = (usb_mouse_t *) fun->driver_data;
 	
 	if (mouse_dev == NULL) {
@@ -141,28 +135,28 @@
 	usb_log_debug("default_connection_handler: fun->name: %s\n",
 	              fun->name);
-	usb_log_debug("default_connection_handler: mouse_phone: %d, wheel "
-	    "phone: %d\n", mouse_dev->mouse_phone, mouse_dev->wheel_phone);
-	
-	int *phone = (str_cmp(fun->name, HID_MOUSE_FUN_NAME) == 0) 
-		     ? &mouse_dev->mouse_phone : &mouse_dev->wheel_phone;
-	
-	if (method == IPC_M_CONNECT_TO_ME) {
-		int callback = IPC_GET_ARG5(*icall);
-
-		if (*phone != -1) {
+	usb_log_debug("default_connection_handler: mouse_sess: %p, "
+	    "wheel_sess: %p\n", mouse_dev->mouse_sess, mouse_dev->wheel_sess);
+	
+	async_sess_t **sess_ptr =
+	    (str_cmp(fun->name, HID_MOUSE_FUN_NAME) == 0) ?
+	    &mouse_dev->mouse_sess : &mouse_dev->wheel_sess;
+	
+	async_sess_t *sess =
+	    async_callback_receive_start(EXCHANGE_SERIALIZE, icall);
+	if (sess != NULL) {
+		if (*sess_ptr == NULL) {
+			*sess_ptr = sess;
+			usb_log_debug("Console session to mouse set ok (%p).\n",
+			    sess);
+			async_answer_0(icallid, EOK);
+		} else {
 			usb_log_debug("default_connection_handler: Console "
-			    "phone to mouse already set.\n");
+			    "session to mouse already set.\n");
 			async_answer_0(icallid, ELIMIT);
-			return;
 		}
-
-		*phone = callback;
-		usb_log_debug("Console phone to mouse set ok (%d).\n", *phone);
-		async_answer_0(icallid, EOK);
-		return;
-	}
-
-	usb_log_debug("default_connection_handler: Invalid function.\n");
-	async_answer_0(icallid, EINVAL);
+	} else {
+		usb_log_debug("default_connection_handler: Invalid function.\n");
+		async_answer_0(icallid, EINVAL);
+	}
 }
 
@@ -175,6 +169,6 @@
 		return NULL;
 	}
-	mouse->mouse_phone = -1;
-	mouse->wheel_phone = -1;
+	mouse->mouse_sess = NULL;
+	mouse->wheel_sess = NULL;
 	
 	return mouse;
@@ -187,12 +181,10 @@
 	assert(mouse_dev != NULL);
 	
-	// hangup phone to the console
-	if (mouse_dev->mouse_phone >= 0) {
-		async_obsolete_hangup(mouse_dev->mouse_phone);
-	}
-	
-	if (mouse_dev->wheel_phone >= 0) {
-		async_obsolete_hangup(mouse_dev->wheel_phone);
-	}
+	// hangup session to the console
+	if (mouse_dev->mouse_sess != NULL)
+		async_hangup(mouse_dev->mouse_sess);
+	
+	if (mouse_dev->wheel_sess != NULL)
+		async_hangup(mouse_dev->wheel_sess);
 }
 
@@ -203,5 +195,5 @@
 	unsigned int key = (wheel > 0) ? KC_UP : KC_DOWN;
 
-	if (mouse_dev->wheel_phone < 0) {
+	if (mouse_dev->wheel_sess == NULL) {
 		usb_log_warning(
 		    "Connection to console not ready, wheel roll discarded.\n");
@@ -215,8 +207,11 @@
 		/* Send arrow press and release. */
 		usb_log_debug2("Sending key %d to the console\n", key);
-		async_obsolete_msg_4(mouse_dev->wheel_phone, KBDEV_EVENT,
-		    KEY_PRESS, key, 0, 0);
-		async_obsolete_msg_4(mouse_dev->wheel_phone, KBDEV_EVENT,
-		    KEY_RELEASE, key, 0, 0);
+		
+		async_exch_t *exch = async_exchange_begin(mouse_dev->wheel_sess);
+		
+		async_msg_4(exch, KBDEV_EVENT, KEY_PRESS, key, 0, 0);
+		async_msg_4(exch, KBDEV_EVENT, KEY_RELEASE, key, 0, 0);
+		
+		async_exchange_end(exch);
 	}
 }
@@ -253,6 +248,6 @@
 	assert(mouse_dev != NULL);
 	
-	if (mouse_dev->mouse_phone < 0) {
-		usb_log_warning(NAME " No console phone.\n");
+	if (mouse_dev->mouse_sess == NULL) {
+		usb_log_warning(NAME " No console session.\n");
 		return true;
 	}
@@ -266,11 +261,11 @@
 
 	if ((shift_x != 0) || (shift_y != 0)) {
-		async_obsolete_req_2_0(mouse_dev->mouse_phone,
-		    MOUSEEV_MOVE_EVENT, shift_x, shift_y);
-	}
-
-	if (wheel != 0) {
+		async_exch_t *exch = async_exchange_begin(mouse_dev->mouse_sess);
+		async_req_2_0(exch, MOUSEEV_MOVE_EVENT, shift_x, shift_y);
+		async_exchange_end(exch);
+	}
+	
+	if (wheel != 0)
 		usb_mouse_send_wheel(mouse_dev, wheel);
-	}
 	
 	/*
@@ -292,12 +287,18 @@
 		if (mouse_dev->buttons[field->usage - field->usage_minimum] == 0
 		    && field->value != 0) {
-			async_obsolete_req_2_0(mouse_dev->mouse_phone,
-			    MOUSEEV_BUTTON_EVENT, field->usage, 1);
+			async_exch_t *exch =
+			    async_exchange_begin(mouse_dev->mouse_sess);
+			async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, field->usage, 1);
+			async_exchange_end(exch);
+			
 			mouse_dev->buttons[field->usage - field->usage_minimum]
 			    = field->value;
 		} else if (mouse_dev->buttons[field->usage - field->usage_minimum] != 0
 		    && field->value == 0) {
-			async_obsolete_req_2_0(mouse_dev->mouse_phone,
-			   MOUSEEV_BUTTON_EVENT, field->usage, 0);
+			async_exch_t *exch =
+			    async_exchange_begin(mouse_dev->mouse_sess);
+			async_req_2_0(exch, MOUSEEV_BUTTON_EVENT, field->usage, 0);
+			async_exchange_end(exch);
+			
 			mouse_dev->buttons[field->usage - field->usage_minimum] =
 			   field->value;
Index: uspace/drv/bus/usb/usbhid/mouse/mousedev.h
===================================================================
--- uspace/drv/bus/usb/usbhid/mouse/mousedev.h	(revision 5f6e25e31dad65ed596bf61da69a51ec21c54ec7)
+++ uspace/drv/bus/usb/usbhid/mouse/mousedev.h	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -38,4 +38,5 @@
 
 #include <usb/dev/driver.h>
+#include <async.h>
 
 struct usb_hid_dev;
@@ -45,7 +46,7 @@
 /** Container for USB mouse device. */
 typedef struct {
-	/** IPC phone to console (consumer). */
-	int mouse_phone;
-	int wheel_phone;
+	/** IPC session to console (consumer). */
+	async_sess_t *mouse_sess;
+	async_sess_t *wheel_sess;
 	
 	int32_t *buttons;
Index: uspace/drv/bus/usb/usbhid/multimedia/multimedia.c
===================================================================
--- uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision 5f6e25e31dad65ed596bf61da69a51ec21c54ec7)
+++ uspace/drv/bus/usb/usbhid/multimedia/multimedia.c	(revision 5da719915787705f661397f14e439ebeb2aaf2f1)
@@ -47,5 +47,4 @@
 #include <errno.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <str_error.h>
 
@@ -53,8 +52,5 @@
 #include <io/console.h>
 
-// FIXME: remove this header
-#include <abi/ipc/methods.h>
-
-#define NAME "multimedia-keys"
+#define NAME  "multimedia-keys"
 
 /*----------------------------------------------------------------------------*/
@@ -69,6 +65,6 @@
 	/** Count of stored keys (i.e. number of keys in the report). */
 	//size_t key_count;	
-	/** IPC phone to the console device (for sending key events). */
-	int console_phone;
+	/** IPC session to the console device (for sending key events). */
+	async_sess_t *console_sess;
 } usb_multimedia_t;
 
@@ -79,5 +75,5 @@
  *
  * Currently recognizes only one method (IPC_M_CONNECT_TO_ME), in which case it
- * assumes the caller is the console and thus it stores IPC phone to it for 
+ * assumes the caller is the console and thus it stores IPC session to it for
  * later use by the driver to notify about key events.
  *
@@ -91,6 +87,4 @@
 	usb_log_debug(NAME " default_connection_handler()\n");
 	
-	sysarg_t method = IPC_GET_IMETHOD(*icall);
-	
 	usb_multimedia_t *multim_dev = (usb_multimedia_t *)fun->driver_data;
 	
@@ -99,20 +93,17 @@
 		return;
 	}
-
-	if (method == IPC_M_CONNECT_TO_ME) {
-		int callback = IPC_GET_ARG5(*icall);
-
-		if (multim_dev->console_phone != -1) {
+	
+	async_sess_t *sess =
+	    async_callback_receive_start(EXCHANGE_SERIALIZE, icall);
+	if (sess != NULL) {
+		if (multim_dev->console_sess == NULL) {
+			multim_dev->console_sess = sess;
+			usb_log_debug(NAME " Saved session to console: %p\n",
+			    sess);
+			async_answer_0(icallid, EOK);
+		} else
 			async_answer_0(icallid, ELIMIT);
-			return;
-		}
-
-		multim_dev->console_phone = callback;
-		usb_log_debug(NAME " Saved phone to console: %d\n", callback);
-		async_answer_0(icallid, EOK);
-		return;
-	}
-	
-	async_answer_0(icallid, EINVAL);
+	} else
+		async_answer_0(icallid, EINVAL);
 }
 
@@ -155,5 +146,5 @@
 
 	usb_log_debug2(NAME " Sending key %d to the console\n", ev.key);
-	if (multim_dev->console_phone < 0) {
+	if (multim_dev->console_sess == NULL) {
 		usb_log_warning(
 		    "Connection to console not ready, key discarded.\n");
@@ -161,6 +152,7 @@
 	}
 	
-	async_obsolete_msg_4(multim_dev->console_phone, KBDEV_EVENT, ev.type, ev.key, 
-	    ev.mods, ev.c);
+	async_exch_t *exch = async_exchange_begin(multim_dev->console_sess);
+	async_msg_4(exch, KBDEV_EVENT, ev.type, ev.key, ev.mods, ev.c);
+	async_exchange_end(exch);
 }
 
@@ -222,5 +214,5 @@
 	}
 	
-	multim_dev->console_phone = -1;
+	multim_dev->console_sess = NULL;
 	
 	/*! @todo Autorepeat */
@@ -250,6 +242,6 @@
 	if (data != NULL) {
 		usb_multimedia_t *multim_dev = (usb_multimedia_t *)data;
-		// hangup phone to the console
-		async_obsolete_hangup(multim_dev->console_phone);
+		// hangup session to the console
+		async_hangup(multim_dev->console_sess);
 	}
 }
