Index: contrib/bp/devfs.bp
===================================================================
--- contrib/bp/devfs.bp	(revision 861453435f02d9fbe42415aa850fd726fe185510)
+++ contrib/bp/devfs.bp	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -0,0 +1,66 @@
+[devmap_get_phone] ;
+!ns.IPC_M_CONNECT_ME_TO /* vfs */ ;
+[fs_register] ;
+(
+	?IPC_M_CONNECT_ME_TO ;
+	(
+		?VFS_OUT_MOUNTED {
+			?IPC_M_DATA_WRITE /* mount options */
+		} +
+		
+		?VFS_OUT_MOUNT +
+		
+		?VFS_OUT_LOOKUP {
+			(
+				[devmap_device_get_handle] ;
+				[devmap_device_connect]
+			) +
+			NULL
+		} +
+		
+		?VFS_OUT_READ {
+			?IPC_M_DATA_READ /* payload */ {
+				(
+					!dev.VFS_OUT_READ ;
+					!dev.IPC_M_DATA_READ /* forwarded */
+				) +
+				(
+					[devmap_device_get_count] ;
+					[devmap_device_get_devices]
+				)
+			}
+		} +
+		
+		?VFS_OUT_WRITE {
+			?IPC_M_DATA_WRITE /* payload */ {
+				(
+					!dev.VFS_OUT_WRITE ;
+					!dev.IPC_M_DATA_WRITE /* forwarded */
+				)
+			} +
+			NULL
+		} +
+		
+		?VFS_OUT_TRUNCATE +
+		
+		?VFS_OUT_CLOSE {
+			!dev.IPC_M_PHONE_HUNGUP
+		} +
+		
+		?VFS_OUT_DESTROY +
+		
+		?VFS_OUT_OPEN_NODE {
+			[devmap_device_connect] +
+			NULL
+		} +
+		
+		?VFS_OUT_STAT {
+			?IPC_M_DATA_READ /* struct stat */
+		} +
+		
+		?VFS_OUT_SYNC
+		
+	)* ;
+	?IPC_M_PHONE_HUNGUP
+)* ;
+!vfs.IPC_M_PHONE_HUNGUP
Index: contrib/bp/kbd.bp
===================================================================
--- contrib/bp/kbd.bp	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/kbd.bp	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -1,9 +1,9 @@
 (
-	!ns.IPC_M_CONNECT_ME_TO +
+	!ns.IPC_M_CONNECT_ME_TO /* cir */ +
 	NULL
 ) ;
 !ns.IPC_M_CONNECT_TO_ME ;
 (
-	IPC_M_CONNECT_ME_TO ;
+	?IPC_M_CONNECT_ME_TO ;
 	(
 		(
@@ -14,3 +14,7 @@
 	)* ;
 	?IPC_M_PHONE_HUNGUP
-)*
+)* ;
+(
+	!cir.IPC_M_PHONE_HUNGUP +
+	NULL
+)
Index: contrib/bp/lib/vfs_grab_phone
===================================================================
--- contrib/bp/lib/vfs_grab_phone	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/lib/vfs_grab_phone	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -1,1 +1,1 @@
-!IPC_M_CONNECT_ME_TO
+!fs.IPC_M_CONNECT_ME_TO
Index: contrib/bp/lib/vfs_lookup_internal
===================================================================
--- contrib/bp/lib/vfs_lookup_internal	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/lib/vfs_lookup_internal	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -1,3 +1,3 @@
 [vfs_grab_phone] ;
-!VFS_OUT_LOOKUP ;
+!fs.VFS_OUT_LOOKUP ;
 [vfs_release_phone]
Index: contrib/bp/lib/vfs_release_phone
===================================================================
--- contrib/bp/lib/vfs_release_phone	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/lib/vfs_release_phone	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -1,1 +1,1 @@
-!IPC_M_PHONE_HUNGUP
+!fs.IPC_M_PHONE_HUNGUP
Index: contrib/bp/ns.bp
===================================================================
--- contrib/bp/ns.bp	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/ns.bp	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -3,10 +3,10 @@
 		?IPC_M_SHARE_IN /* SERVICE_MEM_REALTIME || SERVICE_MEM_KLOG */ +
 		?IPC_M_CONNECT_TO_ME {
-			!IPC_M_FORWARD /* clonable service */ +
-			NULL           /* regular service */
+			!clonable.IPC_M_CONNECT_TO_ME /* forwarded */ +
+			NULL
 		} +
 		?IPC_M_CONNECT_ME_TO {
-			NULL           /* clonable service */ +
-			!IPC_M_FORWARD /* regular service */
+			!service.IPC_M_CONNECT_ME_TO /* forwarded */ +
+			NULL
 		} +
 		?NS_PING +
Index: contrib/bp/tmpfs.bp
===================================================================
--- contrib/bp/tmpfs.bp	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/tmpfs.bp	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -1,3 +1,3 @@
-!ns.IPC_M_CONNECT_ME_TO ;
+!ns.IPC_M_CONNECT_ME_TO /* vfs */ ;
 [fs_register] ;
 (
@@ -42,3 +42,4 @@
 	)* ;
 	?IPC_M_PHONE_HUNGUP
-)*
+)* ;
+!vfs.IPC_M_PHONE_HUNGUP
Index: contrib/bp/vfs.bp
===================================================================
--- contrib/bp/vfs.bp	(revision 471a32d6f70a03d7dc74577bc913792588771caa)
+++ contrib/bp/vfs.bp	(revision 861453435f02d9fbe42415aa850fd726fe185510)
@@ -16,11 +16,11 @@
 			(
 				
-				!VFS_OUT_MOUNTED ;
-				!IPC_M_DATA_WRITE /* mount options */
+				!fs.VFS_OUT_MOUNTED ;
+				!fs.IPC_M_DATA_WRITE /* mount options */
 			) /* root fs */ +
 			(
-				!VFS_OUT_MOUNT ;
-				!IPC_M_CONNECTION_CLONE ;
-				!VFS_M_DATA_WRITE /* mount options */
+				!fs.VFS_OUT_MOUNT ;
+				!fs.IPC_M_CONNECTION_CLONE ;
+				!fs.VFS_M_DATA_WRITE /* mount options */
 			) /* non-root fs */
 		} +
@@ -32,5 +32,5 @@
 				(
 					[vfs_grab_phone] ;
-					!VFS_OUT_TRUNCATE ;
+					!fs.VFS_OUT_TRUNCATE ;
 					[vfs_release_phone]
 				) +
@@ -41,10 +41,10 @@
 		?VFS_IN_OPEN_NODE {
 			[vfs_grab_phone] ;
-			!VFS_OUT_OPEN_NODE ;
+			!fs.VFS_OUT_OPEN_NODE ;
 			[vfs_release_phone] ;
 			(
 				(
 					[vfs_grab_phone] ;
-					!VFS_OUT_TRUNCATE ;
+					!fs.VFS_OUT_TRUNCATE ;
 					[vfs_release_phone]
 				) +
@@ -56,5 +56,5 @@
 		?VFS_IN_CLOSE {
 			[vfs_grab_phone] ;
-			!VFS_OUT_CLOSE ;
+			!fs.VFS_OUT_CLOSE ;
 			[vfs_release_phone]
 		} +
@@ -63,6 +63,6 @@
 			?IPC_M_DATA_READ {
 				[vfs_grab_phone] ;
-				!VFS_OUT_READ /* payload */ ;
-				!IPC_M_FORWARD ;
+				!fs.VFS_OUT_READ /* payload */ ;
+				!fs.IPC_M_DATA_READ /* forwarded */ ;
 				[vfs_release_phone]
 			}
@@ -72,6 +72,6 @@
 			?IPC_M_DATA_WRITE {
 				[vfs_grab_phone] ;
-				!VFS_OUT_WRITE /* payload */ ;
-				!IPC_M_FORWARD ;
+				!fs.VFS_OUT_WRITE /* payload */ ;
+				!fs.IPC_M_DATA_WRITE /* forwarded */ ;
 				[vfs_release_phone]
 			}
@@ -82,13 +82,13 @@
 		?VFS_IN_TRUNCATE {
 			[vfs_grab_phone] ;
-			!VFS_OUT_TRUNCATE ;
+			!fs.VFS_OUT_TRUNCATE ;
 			[vfs_release_phone]
 		} +
 		
 		?VFS_IN_FSTAT {
-			?IPC_M_DATA_READ {
+			?IPC_M_DATA_READ /* struct stat */ {
 				[vfs_grab_phone] ;
-				!VFS_OUT_STAT ;
-				!IPC_M_FORWARD ;
+				!fs.VFS_OUT_STAT ;
+				!fs.IPC_M_DATA_READ /* forwarded */ ;
 				[vfs_release_phone]
 			}
@@ -97,8 +97,8 @@
 		?VFS_IN_STAT {
 			?IPC_M_DATA_WRITE /* path */ ;
-			?IPC_M_DATA_READ {
+			?IPC_M_DATA_READ /* struct stat */ {
 				[vfs_lookup_internal] ;
-				!VFS_OUT_STAT ;
-				!IPC_M_FORWARD
+				!fs.VFS_OUT_STAT ;
+				!fs.IPC_M_DATA_READ /* forwarded */
 			}
 		} +
@@ -125,5 +125,5 @@
 		
 		?VFS_IN_SYNC {
-			!VFS_OUT_SYNC
+			!fs.VFS_OUT_SYNC
 		}
 		
