Index: uspace/srv/fs/fat/fat.c
===================================================================
--- uspace/srv/fs/fat/fat.c	(revision bcf23cf205b620d11eb8a20690ab257c14d92af0)
+++ uspace/srv/fs/fat/fat.c	(revision 37e7dc5443b33b573716c39d62ce98c332b85af0)
@@ -43,4 +43,5 @@
 #include <unistd.h>
 #include <stdio.h>
+#include <as.h>>
 #include "../../vfs/vfs.h"
 
@@ -62,4 +63,6 @@
 	}
 };
+
+uint8_t *plb_ro = NULL;
 
 /**
@@ -142,4 +145,23 @@
 
 	/*
+	 * Allocate piece of address space for PLB.
+	 */
+	plb_ro = as_get_mappable_page(PLB_SIZE);
+	if (!plb_ro) {
+		async_wait_for(req, NULL);
+		return ENOMEM;
+	}
+
+	/*
+	 * Request sharing the Path Lookup Buffer with VFS.
+	 */
+	rc = ipc_call_sync_3(vfs_phone, IPC_M_AS_AREA_RECV, plb_ro, PLB_SIZE, 0,
+	    NULL, NULL, NULL);
+	if (rc) {
+		async_wait_for(req, NULL);
+		return rc;
+	}
+	 
+	/*
 	 * Create a connection fibril to handle the callback connection.
 	 */
Index: uspace/srv/vfs/vfs.c
===================================================================
--- uspace/srv/vfs/vfs.c	(revision bcf23cf205b620d11eb8a20690ab257c14d92af0)
+++ uspace/srv/vfs/vfs.c	(revision 37e7dc5443b33b573716c39d62ce98c332b85af0)
@@ -121,5 +121,14 @@
 	list_initialize(&plb_head);
 	plb = as_get_mappable_page(PLB_SIZE);
-//	memset(plb, 0, PLB_SIZE);
+	if (!plb) {
+		printf("Cannot allocate a mappable piece of address space\n");
+		return ENOMEM;
+	}
+	if (as_area_create(plb, PLB_SIZE, AS_AREA_READ | AS_AREA_WRITE |
+	    AS_AREA_CACHEABLE) != plb) {
+		printf("Cannot create address space area.\n");
+		return ENOMEM;
+	}
+	memset(plb, 0, PLB_SIZE);
 	
 	/*
Index: uspace/srv/vfs/vfs_register.c
===================================================================
--- uspace/srv/vfs/vfs_register.c	(revision bcf23cf205b620d11eb8a20690ab257c14d92af0)
+++ uspace/srv/vfs/vfs_register.c	(revision 37e7dc5443b33b573716c39d62ce98c332b85af0)
@@ -46,4 +46,5 @@
 #include <bool.h>
 #include <futex.h>
+#include <as.h>
 #include <libadt/list.h>
 #include "vfs.h"
@@ -175,9 +176,9 @@
 		return;
 	}
+
+	/*
+	 * Allocate and initialize a buffer for the fs_info structure.
+	 */
 	fs_info_t *fs_info;
-
-	/*
-	 * Allocate and initialize a buffer for the fs_info structure.
-	 */
 	fs_info = (fs_info_t *) malloc(sizeof(fs_info_t));
 	if (!fs_info) {
@@ -262,4 +263,43 @@
 	dprintf("Callback connection to FS created.\n");
 
+	/*
+	 * The client will want us to send him the address space area with PLB.
+	 */
+	callid = async_get_call(&call);
+	if (IPC_GET_METHOD(call) != IPC_M_AS_AREA_RECV) {
+		dprintf("Unexpected call, method = %d\n", IPC_GET_METHOD(call));
+		list_remove(&fs_info->fs_link);
+		futex_up(&fs_head_futex);
+		ipc_hangup(fs_info->phone);
+		free(fs_info);
+		ipc_answer_fast(callid, EINVAL, 0, 0);
+		ipc_answer_fast(rid, EINVAL, 0, 0);
+		return;
+	}
+	
+	/*
+	 * We can only send the client address space area PLB_SIZE bytes long.
+	 */
+	size = IPC_GET_ARG2(call);
+	if (size != PLB_SIZE) {
+		dprintf("Client suggests wrong size of PFB, size = %d\n", size);
+		list_remove(&fs_info->fs_link);
+		futex_up(&fs_head_futex);
+		ipc_hangup(fs_info->phone);
+		free(fs_info);
+		ipc_answer_fast(callid, EINVAL, 0, 0);
+		ipc_answer_fast(rid, EINVAL, 0, 0);
+		return;
+		
+	}
+
+	/*
+	 * Commit to read-only sharing the PLB with the client.
+	 */
+	ipc_answer_fast(callid, EOK, (ipcarg_t) plb,
+	    (ipcarg_t) (AS_AREA_READ | AS_AREA_CACHEABLE));	
+
+	dprintf("Sharing PLB.\n");
+
 	futex_up(&fs_head_futex);
 
