Index: contrib/arch/uspace/srv/devmap/device_mapper_client.bp
===================================================================
--- contrib/arch/uspace/srv/devmap/device_mapper_client.bp	(revision 07fdf2039be8c557cff859a000458feabc41d241)
+++ contrib/arch/uspace/srv/devmap/device_mapper_client.bp	(revision 07fdf2039be8c557cff859a000458feabc41d241)
@@ -0,0 +1,21 @@
+?ipc_m_connect_me_to ;
+
+!service.ipc_m_connect_me_to /* forward */
++
+(
+	(
+		?device_get_handle {
+			?ipc_m_data_write /* device name */
+		} +
+		
+		?device_get_name +
+		?device_null_create +
+		?device_null_destroy +
+		?device_get_count +
+		
+		?device_get_devices {
+			?ipc_m_data_read /* buffer */
+		}
+	)*
+) ;
+?ipc_m_phone_hungup
Index: contrib/arch/uspace/srv/devmap/device_mapper_driver.bp
===================================================================
--- contrib/arch/uspace/srv/devmap/device_mapper_driver.bp	(revision 07fdf2039be8c557cff859a000458feabc41d241)
+++ contrib/arch/uspace/srv/devmap/device_mapper_driver.bp	(revision 07fdf2039be8c557cff859a000458feabc41d241)
@@ -0,0 +1,22 @@
+?ipc_m_connect_me_to ;
+?driver_register {
+	tentative {
+		?ipc_m_data_write /* driver name */
+	}
+} ;
+(
+	?device_register {
+		tentative {
+			?ipc_m_data_write /* device name */
+		}
+	} +
+	
+	?device_get_handle {
+		?ipc_m_data_write /* device name */
+	} +
+	
+	?device_get_name +
+	?device_unregister +
+	?driver_unregister
+)* ;
+?ipc_m_phone_hungup
Index: contrib/arch/uspace/srv/devmap/devmap.adl
===================================================================
--- contrib/arch/uspace/srv/devmap/devmap.adl	(revision 07fdf2039be8c557cff859a000458feabc41d241)
+++ contrib/arch/uspace/srv/devmap/devmap.adl	(revision 07fdf2039be8c557cff859a000458feabc41d241)
@@ -0,0 +1,75 @@
+interface device_mapper_driver {
+		/* Establish connection (iface is DEVMAP_DRIVER) */
+		ipcarg_t ipc_m_connect_me_to(in ipcarg_t iface);
+		
+		/* Register as a new driver */
+		ipcarg_t driver_register(void);
+		
+		/* Unregister all devices and the driver itself */
+		ipcarg_t driver_unregister(void);
+		
+		/* Register new device and return handle */
+		ipcarg_t device_register(out ipcarg_t handle);
+		
+		/* Unregister device */
+		ipcarg_t device_unregister(in ipcarg_t handle);
+		
+		/* Resolve device name to handle */
+		ipcarg_t device_get_handle(in ipcarg_t flags);
+		
+		/* Get device name for a given handle */
+		ipcarg_t device_get_name(in ipcarg_t handle);
+		
+		/* Transfer driver or device name */
+		ipcarg_t ipc_m_data_write(in ipcarg_t src_addr, in ipcarg_t src_size, out ipcarg_t dst_addr, out ipcarg_t dst_size);
+		
+		/* Close connection */
+		ipcarg_t ipc_m_phone_hungup(void);
+	protocol:
+		[device_mapper_driver.bp]
+};
+
+interface device_mapper_client {
+		/* Establish connection (iface is DEVMAP_CLIENT) or forward to device (iface is DEVMAP_CONNECT_TO_DEVICE) */
+		ipcarg_t ipc_m_connect_me_to(in ipcarg_t iface, in ipcarg_t handle);
+		
+		/* Resolve device name to handle */
+		ipcarg_t device_get_handle(in ipcarg_t flags);
+		
+		/* Get device name for a given handle */
+		ipcarg_t device_get_name(in ipcarg_t handle);
+		
+		/* Clone NULL device */
+		ipcarg_t device_null_create(out ipcarg_t index);
+		
+		/* Destroy NULL device */
+		ipcarg_t device_null_destroy(in ipcarg_t index);
+		
+		/* Get number of devices */
+		ipcarg_t device_get_count(out ipcarg_t count);
+		
+		/* Get an array of (device_name, handle) pairs */
+		ipcarg_t device_get_devices(void)
+		
+		/* Transfer device name from client */
+		ipcarg_t ipc_m_data_write(in ipcarg_t src_addr, in ipcarg_t src_size, out ipcarg_t dst_addr, out ipcarg_t dst_size);
+		
+		/* Transfer (device_name, handle) pairs to client */
+		ipcarg_t ipc_m_data_read(in ipcarg_t src_addr, in ipcarg_t src_size, out ipcarg_t dst_addr, out ipcarg_t dst_size);
+		
+		/* Close connection */
+		ipcarg_t ipc_m_phone_hungup(void);
+	protocol:
+		[device_mapper_client.bp]
+	
+};
+
+frame devmap {
+	provides:
+		device_mapper_driver dm_driver;
+		device_mapper_client dm_client;
+	requires:
+		[/lib/libc/iface.requires]
+	protocol:
+		[devmap.bp]
+};
Index: contrib/arch/uspace/srv/devmap/devmap.bp
===================================================================
--- contrib/arch/uspace/srv/devmap/devmap.bp	(revision 07fdf2039be8c557cff859a000458feabc41d241)
+++ contrib/arch/uspace/srv/devmap/devmap.bp	(revision 07fdf2039be8c557cff859a000458feabc41d241)
@@ -0,0 +1,1 @@
+!ns.ipc_m_connect_to_me
