Index: uspace/lib/c/Makefile
===================================================================
--- uspace/lib/c/Makefile	(revision 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ uspace/lib/c/Makefile	(revision a40dea38c9d586aa4f82dcde5704326ff5abae9d)
@@ -68,5 +68,4 @@
 	generic/clipboard.c \
 	generic/devmap.c \
-	generic/devmap_obsolete.c \
 	generic/devman.c \
 	generic/devman_obsolete.c \
Index: pace/lib/c/generic/devmap_obsolete.c
===================================================================
--- uspace/lib/c/generic/devmap_obsolete.c	(revision 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ 	(revision )
@@ -1,114 +1,0 @@
-/*
- * Copyright (c) 2007 Josef Cejka
- * Copyright (c) 2009 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.
- */
-
-#include <str.h>
-#include <ipc/services.h>
-#include <ns.h>
-#include <ns_obsolete.h>
-#include <ipc/devmap.h>
-#include <devmap_obsolete.h>
-#include <async.h>
-#include <async_obsolete.h>
-#include <errno.h>
-#include <malloc.h>
-#include <bool.h>
-
-static int devmap_phone_driver = -1;
-static int devmap_phone_client = -1;
-
-/** Get phone to device mapper task. */
-int devmap_obsolete_get_phone(devmap_interface_t iface, unsigned int flags)
-{
-	switch (iface) {
-	case DEVMAP_DRIVER:
-		if (devmap_phone_driver >= 0)
-			return devmap_phone_driver;
-		
-		if (flags & IPC_FLAG_BLOCKING)
-			devmap_phone_driver = service_obsolete_connect_blocking(SERVICE_DEVMAP,
-			    DEVMAP_DRIVER, 0);
-		else
-			devmap_phone_driver = service_obsolete_connect(SERVICE_DEVMAP,
-			    DEVMAP_DRIVER, 0);
-		
-		return devmap_phone_driver;
-	case DEVMAP_CLIENT:
-		if (devmap_phone_client >= 0)
-			return devmap_phone_client;
-		
-		if (flags & IPC_FLAG_BLOCKING)
-			devmap_phone_client = service_obsolete_connect_blocking(SERVICE_DEVMAP,
-			    DEVMAP_CLIENT, 0);
-		else
-			devmap_phone_client = service_obsolete_connect(SERVICE_DEVMAP,
-			    DEVMAP_CLIENT, 0);
-		
-		return devmap_phone_client;
-	default:
-		return -1;
-	}
-}
-
-void devmap_obsolete_hangup_phone(devmap_interface_t iface)
-{
-	switch (iface) {
-	case DEVMAP_DRIVER:
-		if (devmap_phone_driver >= 0) {
-			async_obsolete_hangup(devmap_phone_driver);
-			devmap_phone_driver = -1;
-		}
-		break;
-	case DEVMAP_CLIENT:
-		if (devmap_phone_client >= 0) {
-			async_obsolete_hangup(devmap_phone_client);
-			devmap_phone_client = -1;
-		}
-		break;
-	default:
-		break;
-	}
-}
-
-int devmap_obsolete_device_connect(devmap_handle_t handle, unsigned int flags)
-{
-	int phone;
-	
-	if (flags & IPC_FLAG_BLOCKING) {
-		phone = service_obsolete_connect_blocking(SERVICE_DEVMAP,
-		    DEVMAP_CONNECT_TO_DEVICE, handle);
-	} else {
-		phone = service_obsolete_connect(SERVICE_DEVMAP,
-		    DEVMAP_CONNECT_TO_DEVICE, handle);
-	}
-	
-	return phone;
-}
-
-/** @}
- */
Index: pace/lib/c/include/devmap_obsolete.h
===================================================================
--- uspace/lib/c/include/devmap_obsolete.h	(revision 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ 	(revision )
@@ -1,50 +1,0 @@
-/*
- * Copyright (c) 2009 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 libc
- * @{
- */
-/** @file
- */
-
-#ifndef LIBC_DEVMAP_OBSOLETE_H_
-#define LIBC_DEVMAP_OBSOLETE_H_
-
-#include <ipc/devmap.h>
-#include <async.h>
-#include <bool.h>
-
-extern int devmap_obsolete_get_phone(devmap_interface_t, unsigned int);
-extern void devmap_obsolete_hangup_phone(devmap_interface_t iface);
-
-extern int devmap_obsolete_device_connect(devmap_handle_t, unsigned int);
-
-#endif
-
-/** @}
- */
Index: uspace/srv/hid/adb_mouse/adb_dev.c
===================================================================
--- uspace/srv/hid/adb_mouse/adb_dev.c	(revision 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ uspace/srv/hid/adb_mouse/adb_dev.c	(revision a40dea38c9d586aa4f82dcde5704326ff5abae9d)
@@ -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 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ uspace/srv/hid/char_mouse/chardev.c	(revision a40dea38c9d586aa4f82dcde5704326ff5abae9d)
@@ -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 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ uspace/srv/hid/console/console.c	(revision a40dea38c9d586aa4f82dcde5704326ff5abae9d)
@@ -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 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ uspace/srv/hid/input/port/adb.c	(revision a40dea38c9d586aa4f82dcde5704326ff5abae9d)
@@ -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 5203e2569a38ea677d1b3f202650bb36f9609583)
+++ uspace/srv/hid/input/port/chardev.c	(revision a40dea38c9d586aa4f82dcde5704326ff5abae9d)
@@ -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);
 }
 
