Index: uspace/srv/hid/adb_mouse/adb_dev.c
===================================================================
--- uspace/srv/hid/adb_mouse/adb_dev.c	(revision b72efe87f3e33beaa3b0d0cf7c8b598a58f6a6de)
+++ uspace/srv/hid/adb_mouse/adb_dev.c	(revision 6a0ff7f4cac21a5122279a5eab3cc09ad2902207)
@@ -40,7 +40,5 @@
 #include <errno.h>
 #include <devmap.h>
-#include <devmap_obsolete.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <kernel/ipc/ipc_methods.h>
 
@@ -53,7 +51,9 @@
 {
 	devmap_handle_t handle;
-	int rc = devmap_device_get_handle("adb/mouse", &handle,
+	async_exch_t *exch;
+	int rc;
+	
+	rc = devmap_device_get_handle("adb/mouse", &handle,
 	    IPC_FLAG_BLOCKING);
-	
 	if (rc != EOK) {
 		printf("%s: Failed resolving ADB\n", NAME);
@@ -61,15 +61,26 @@
 	}
 	
-	int dev_phone = devmap_obsolete_device_connect(handle, IPC_FLAG_BLOCKING);
-	if (dev_phone < 0) {
+	async_sess_t *dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle,
+	    IPC_FLAG_BLOCKING);
+	if (dev_sess == NULL) {
 		printf("%s: Failed connecting to ADB\n", NAME);
 		return ENOENT;
 	}
 	
+	exch = async_exchange_begin(dev_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with ADB\n", NAME);
+		async_hangup(dev_sess);
+		return ENOMEM;
+	}
+	
 	/* NB: The callback connection is slotted for removal */
-	if (async_obsolete_connect_to_me(dev_phone, 0, 0, 0, adb_dev_events,
-	    NULL) != 0) {
+	rc = async_connect_to_me(exch, 0, 0, 0, adb_dev_events, NULL);
+	async_exchange_end(exch);
+	
+	if (rc != 0) {
 		printf(NAME ": Failed to create callback from device\n");
-		return false;
+		async_hangup(dev_sess);
+		return ENOENT;
 	}
 	
Index: uspace/srv/hid/char_mouse/chardev.c
===================================================================
--- uspace/srv/hid/char_mouse/chardev.c	(revision b72efe87f3e33beaa3b0d0cf7c8b598a58f6a6de)
+++ uspace/srv/hid/char_mouse/chardev.c	(revision 6a0ff7f4cac21a5122279a5eab3cc09ad2902207)
@@ -36,10 +36,8 @@
 #include <ipc/char.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <vfs/vfs.h>
 #include <fcntl.h>
 #include <errno.h>
 #include <devmap.h>
-#include <devmap_obsolete.h>
 #include <char_mouse.h>
 #include <mouse_port.h>
@@ -47,5 +45,5 @@
 static void chardev_events(ipc_callid_t iid, ipc_call_t *icall, void *arg);
 
-static int dev_phone;
+static async_sess_t *dev_sess;
 
 #define NAME "char_mouse"
@@ -54,5 +52,8 @@
 {
 	devmap_handle_t handle;
-	int rc = devmap_device_get_handle("char/ps2b", &handle,
+	async_exch_t *exch;
+	int rc;
+	
+	rc = devmap_device_get_handle("char/ps2b", &handle,
 	    IPC_FLAG_BLOCKING);
 	
@@ -62,14 +63,25 @@
 	}
 	
-	dev_phone = devmap_obsolete_device_connect(handle, IPC_FLAG_BLOCKING);
-	if (dev_phone < 0) {
+	dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle,
+	    IPC_FLAG_BLOCKING);
+	if (dev_sess == NULL) {
 		printf("%s: Failed connecting to PS/2\n", NAME);
 		return ENOENT;
 	}
 	
+	exch = async_exchange_begin(dev_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with PS/2\n", NAME);
+		async_hangup(dev_sess);
+		return ENOMEM;
+	}
+	
 	/* NB: The callback connection is slotted for removal */
-	if (async_obsolete_connect_to_me(dev_phone, 0, 0, 0, chardev_events,
-	    NULL) != 0) {
+	rc = async_connect_to_me(exch, 0, 0, 0, chardev_events, NULL);
+	async_exchange_end(exch);
+	
+	if (rc != 0) {
 		printf(NAME ": Failed to create callback from device\n");
+		async_hangup(dev_sess);
 		return false;
 	}
@@ -88,5 +100,13 @@
 void mouse_port_write(uint8_t data)
 {
-	async_obsolete_msg_1(dev_phone, CHAR_WRITE_BYTE, data);
+	async_exch_t *exch = async_exchange_begin(dev_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with PS/2\n", NAME);
+		return;
+	}
+	
+	async_msg_1(exch, CHAR_WRITE_BYTE, data);
+	
+	async_exchange_end(exch);
 }
 
Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision b72efe87f3e33beaa3b0d0cf7c8b598a58f6a6de)
+++ uspace/srv/hid/console/console.c	(revision 6a0ff7f4cac21a5122279a5eab3cc09ad2902207)
@@ -54,5 +54,4 @@
 #include <event.h>
 #include <devmap.h>
-#include <devmap_obsolete.h>
 #include <fcntl.h>
 #include <vfs/vfs.h>
@@ -68,6 +67,6 @@
 #define NAMESPACE  "term"
 
-/** Phone to the input server. */
-static int input_phone;
+/** Session with the input server. */
+static async_sess_t *input_sess;
 
 /** Information about framebuffer */
@@ -109,4 +108,16 @@
 static FIBRIL_CONDVAR_INITIALIZE(input_cv);
 
+static FIBRIL_MUTEX_INITIALIZE(big_console_lock);
+
+static void console_serialize_start(void)
+{
+	fibril_mutex_lock(&big_console_lock);
+}
+
+static void console_serialize_end(void)
+{
+	fibril_mutex_unlock(&big_console_lock);
+}
+
 static void curs_visibility(bool visible)
 {
@@ -141,10 +152,26 @@
 static void input_yield(void)
 {
-	async_obsolete_req_0_0(input_phone, INPUT_YIELD);
+	async_exch_t *exch = async_exchange_begin(input_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with input device.\n",
+		    NAME);
+		return;
+	}
+	
+	async_req_0_0(exch, INPUT_YIELD);
+	async_exchange_end(exch);
 }
 
 static void input_reclaim(void)
 {
-	async_obsolete_req_0_0(input_phone, INPUT_RECLAIM);
+	async_exch_t *exch = async_exchange_begin(input_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with input device.\n",
+		    NAME);
+		return;
+	}
+	
+	async_req_0_0(exch, INPUT_RECLAIM);
+	async_exchange_end(exch);
 }
 
@@ -323,10 +350,10 @@
 	
 	if (cons == kernel_console) {
-		async_obsolete_serialize_start();
+		console_serialize_start();
 		curs_hide_sync();
 		gcons_in_kernel();
 		screen_yield();
 		input_yield();
-		async_obsolete_serialize_end();
+		console_serialize_end();
 		
 		if (__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE)) {
@@ -338,5 +365,5 @@
 	
 	if (cons != kernel_console) {
-		async_obsolete_serialize_start();
+		console_serialize_start();
 		
 		if (active_console == kernel_console) {
@@ -393,5 +420,5 @@
 		curs_visibility(cons->scr.is_cursor_visible);
 		
-		async_obsolete_serialize_end();
+		console_serialize_end();
 	}
 }
@@ -410,5 +437,5 @@
 		if (!IPC_GET_IMETHOD(call)) {
 			/* TODO: Handle hangup */
-			async_obsolete_hangup(input_phone);
+			async_hangup(input_sess);
 			return;
 		}
@@ -470,5 +497,5 @@
 	}
 	
-	async_obsolete_serialize_start();
+	console_serialize_start();
 	
 	size_t off = 0;
@@ -478,5 +505,5 @@
 	}
 	
-	async_obsolete_serialize_end();
+	console_serialize_end();
 	
 	gcons_notify_char(cons->index);
@@ -573,5 +600,5 @@
 	int rc;
 	
-	async_obsolete_serialize_start();
+	console_serialize_start();
 	if (cons->refcount == 0)
 		gcons_notify_connect(cons->index);
@@ -583,7 +610,7 @@
 	
 	while (true) {
-		async_obsolete_serialize_end();
+		console_serialize_end();
 		callid = async_get_call(&call);
-		async_obsolete_serialize_start();
+		console_serialize_start();
 		
 		arg1 = 0;
@@ -595,4 +622,5 @@
 			if (cons->refcount == 0)
 				gcons_notify_disconnect(cons->index);
+			console_serialize_end();
 			return;
 		}
@@ -600,12 +628,12 @@
 		switch (IPC_GET_IMETHOD(call)) {
 		case VFS_OUT_READ:
-			async_obsolete_serialize_end();
+			console_serialize_end();
 			cons_read(cons, callid, &call);
-			async_obsolete_serialize_start();
+			console_serialize_start();
 			continue;
 		case VFS_OUT_WRITE:
-			async_obsolete_serialize_end();
+			console_serialize_end();
 			cons_write(cons, callid, &call);
-			async_obsolete_serialize_start();
+			console_serialize_start();
 			continue;
 		case VFS_OUT_SYNC:
@@ -678,7 +706,7 @@
 			break;
 		case CONSOLE_GET_EVENT:
-			async_obsolete_serialize_end();
+			console_serialize_end();
 			cons_get_event(cons, callid, &call);
-			async_obsolete_serialize_start();
+			console_serialize_start();
 			continue;
 		case CONSOLE_KCON_ENABLE:
@@ -695,32 +723,41 @@
 }
 
-static int connect_input(const char *dev_path)
-{
-	int phone;
+static async_sess_t *connect_input(const char *dev_path)
+{
+	async_sess_t *sess;
+	async_exch_t *exch;
 	devmap_handle_t handle;
 	
 	int rc = devmap_device_get_handle(dev_path, &handle, 0);
 	if (rc == EOK) {
-		phone = devmap_obsolete_device_connect(handle, 0);
-		if (phone < 0) {
-			printf("%s: Failed to connect to input device\n", NAME);
-			return phone;
+		sess = devmap_device_connect(EXCHANGE_ATOMIC, handle, 0);
+		if (sess == NULL) {
+			printf("%s: Failed to connect to input server\n", NAME);
+			return NULL;
 		}
 	} else {
-		return rc;
+		return NULL;
+	}
+	
+	exch = async_exchange_begin(sess);
+	if (exch == NULL) {
+		printf("%s: Failed to create callback from input server.\n", NAME);
+		return NULL;
 	}
 	
 	/* NB: The callback connection is slotted for removal */
-	rc = async_obsolete_connect_to_me(phone, SERVICE_CONSOLE, 0, 0,
-	    input_events, NULL);
+	rc = async_connect_to_me(exch, SERVICE_CONSOLE, 0, 0, input_events,
+	    NULL);
+
+	async_exchange_end(exch);
 
 	if (rc != EOK) {
-		async_obsolete_hangup(phone);
-		printf("%s: Failed to create callback from input device (%s).\n",
+		async_hangup(sess);
+		printf("%s: Failed to create callback from input server (%s).\n",
 		    NAME, str_error(rc));
-		return rc;
-	}
-	
-	return phone;
+		return NULL;
+	}
+	
+	return sess;
 }
 
@@ -728,6 +765,6 @@
 {
 	/* Connect to input server */
-	input_phone = connect_input(input_dev);
-	if (input_phone < 0)
+	input_sess = connect_input(input_dev);
+	if (input_sess == NULL)
 		return false;
 	
@@ -800,5 +837,5 @@
 	
 	/* Initialize the screen */
-	async_obsolete_serialize_start();
+	console_serialize_start();
 	gcons_redraw_console();
 	set_style(STYLE_NORMAL);
@@ -806,5 +843,5 @@
 	curs_goto(0, 0);
 	curs_visibility(active_console->scr.is_cursor_visible);
-	async_obsolete_serialize_end();
+	console_serialize_end();
 	
 	/* Receive kernel notifications */
Index: uspace/srv/hid/input/port/adb.c
===================================================================
--- uspace/srv/hid/input/port/adb.c	(revision b72efe87f3e33beaa3b0d0cf7c8b598a58f6a6de)
+++ uspace/srv/hid/input/port/adb.c	(revision 6a0ff7f4cac21a5122279a5eab3cc09ad2902207)
@@ -37,5 +37,4 @@
 #include <ipc/adb.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <input.h>
 #include <kbd_port.h>
@@ -45,5 +44,4 @@
 #include <errno.h>
 #include <devmap.h>
-#include <devmap_obsolete.h>
 
 static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg);
@@ -63,5 +61,5 @@
 
 static kbd_dev_t *kbd_dev;
-static int dev_phone;
+static async_sess_t *dev_sess;
 
 static int adb_port_init(kbd_dev_t *kdev)
@@ -69,22 +67,32 @@
 	const char *dev = "adb/kbd";
 	devmap_handle_t handle;
-
+	async_exch_t *exch;
+	int rc;
+	
 	kbd_dev = kdev;
 	
-	int rc = devmap_device_get_handle(dev, &handle, 0);
-	if (rc == EOK) {
-		dev_phone = devmap_obsolete_device_connect(handle, 0);
-		if (dev_phone < 0) {
-			printf("%s: Failed to connect to device\n", NAME);
-			return dev_phone;
-		}
-	} else
+	rc = devmap_device_get_handle(dev, &handle, 0);
+	if (rc != EOK)
 		return rc;
 	
+	dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle, 0);
+	if (dev_sess == NULL) {
+		printf("%s: Failed to connect to device\n", NAME);
+		return ENOENT;
+	}
+	
+	exch = async_exchange_begin(dev_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with device\n", NAME);
+		async_hangup(dev_sess);
+		return ENOMEM;
+	}
+	
 	/* NB: The callback connection is slotted for removal */
-	rc = async_obsolete_connect_to_me(dev_phone, 0, 0, 0, kbd_port_events,
-	    NULL);
+	rc = async_connect_to_me(exch, 0, 0, 0, kbd_port_events, NULL);
+	async_exchange_end(exch);
 	if (rc != EOK) {
 		printf(NAME ": Failed to create callback from device\n");
+		async_hangup(dev_sess);
 		return rc;
 	}
Index: uspace/srv/hid/input/port/chardev.c
===================================================================
--- uspace/srv/hid/input/port/chardev.c	(revision b72efe87f3e33beaa3b0d0cf7c8b598a58f6a6de)
+++ uspace/srv/hid/input/port/chardev.c	(revision 6a0ff7f4cac21a5122279a5eab3cc09ad2902207)
@@ -37,10 +37,8 @@
 #include <ipc/char.h>
 #include <async.h>
-#include <async_obsolete.h>
 #include <input.h>
 #include <kbd_port.h>
 #include <kbd.h>
 #include <devmap.h>
-#include <devmap_obsolete.h>
 #include <errno.h>
 #include <stdio.h>
@@ -61,5 +59,5 @@
 
 static kbd_dev_t *kbd_dev;
-static int dev_phone;
+static async_sess_t *dev_sess;
 
 /** List of devices to try connecting to. */
@@ -74,4 +72,5 @@
 {
 	devmap_handle_t handle;
+	async_exch_t *exch;
 	unsigned int i;
 	int rc;
@@ -90,17 +89,28 @@
 	}
 	
-	dev_phone = devmap_obsolete_device_connect(handle, IPC_FLAG_BLOCKING);
-	if (dev_phone < 0) {
+	dev_sess = devmap_device_connect(EXCHANGE_ATOMIC, handle,
+	    IPC_FLAG_BLOCKING);
+	if (dev_sess == NULL) {
 		printf("%s: Failed connecting to device\n", NAME);
 		return ENOENT;
 	}
 	
+	exch = async_exchange_begin(dev_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with device\n", NAME);
+		async_hangup(dev_sess);
+		return ENOMEM;
+	}
+	
 	/* NB: The callback connection is slotted for removal */
-	if (async_obsolete_connect_to_me(dev_phone, 0, 0, 0, kbd_port_events,
-	    NULL) != 0) {
+	rc = async_connect_to_me(exch, 0, 0, 0, kbd_port_events, NULL);
+	async_exchange_end(exch);
+	
+	if (rc != 0) {
 		printf(NAME ": Failed to create callback from device\n");
+		async_hangup(dev_sess);
 		return -1;
 	}
-
+	
 	return 0;
 }
@@ -116,5 +126,12 @@
 static void chardev_port_write(uint8_t data)
 {
-	async_obsolete_msg_1(dev_phone, CHAR_WRITE_BYTE, data);
+	async_exch_t *exch = async_exchange_begin(dev_sess);
+	if (exch == NULL) {
+		printf("%s: Failed starting exchange with device\n", NAME);
+		return;
+	}
+
+	async_msg_1(exch, CHAR_WRITE_BYTE, data);
+	async_exchange_end(exch);
 }
 
