Index: uspace/srv/fs/exfat/exfat.c
===================================================================
--- uspace/srv/fs/exfat/exfat.c	(revision efa8ed93920e4065d49fd3ee204246729808c9eb)
+++ uspace/srv/fs/exfat/exfat.c	(revision 6d57e1ce99f815acd35b9662c387f3f6b82e68e0)
@@ -98,18 +98,14 @@
 			return;
 		case VFS_OUT_MOUNTED:
-			/* exfat_mounted(callid, &call); */
-			async_answer_0(callid, ENOTSUP);
+			exfat_mounted(callid, &call);
 			break;
 		case VFS_OUT_MOUNT:
-			/* exfat_mount(callid, &call); */
-			async_answer_0(callid, ENOTSUP);
+			exfat_mount(callid, &call);
 			break;
 		case VFS_OUT_UNMOUNTED:
-			/* exfat_unmounted(callid, &call); */
-			async_answer_0(callid, ENOTSUP);
+			exfat_unmounted(callid, &call);
 			break;
 		case VFS_OUT_UNMOUNT:
-			/* exfat_unmount(callid, &call); */
-			async_answer_0(callid, ENOTSUP);
+			exfat_unmount(callid, &call);
 			break;
 		case VFS_OUT_LOOKUP:
Index: uspace/srv/fs/exfat/exfat.h
===================================================================
--- uspace/srv/fs/exfat/exfat.h	(revision efa8ed93920e4065d49fd3ee204246729808c9eb)
+++ uspace/srv/fs/exfat/exfat.h	(revision 6d57e1ce99f815acd35b9662c387f3f6b82e68e0)
@@ -49,6 +49,50 @@
 #define BS_SIZE			512
 
+#define BPS(bs)			(1 << (bs->bytes_per_sector))
+#define SPC(bs)			(1 << (bs->sec_per_cluster))
+#define VOL_ST(bs)		uint64_t_le2host(bs->volume_start)
+#define VOL_CNT(bs)		uint64_t_le2host(bs->volume_count)
+#define FAT_ST(bs)		uint32_t_le2host(bs->fat_sector_start)
+#define FAT_CNT(bs)		uint32_t_le2host(bs->fat_sector_count)
+#define DATA_ST(bs)		uint32_t_le2host(bs->data_start_sector)
+#define DATA_CNT(bs)	uint32_t_le2host(bs->data_clusters)
+#define ROOT_ST(bs)		uint32_t_le2host(bs->rootdir_cluster)
+#define VOL_FLAGS		uint16_t_le2host(bs->volume_flags)
 
 
+typedef struct exfat_bs {
+	uint8_t jump[3];				/* 0x00 jmp and nop instructions */
+	uint8_t oem_name[8];			/* 0x03 "EXFAT   " */
+	uint8_t	__reserved[53];			/* 0x0B always 0 */
+	uint64_t volume_start;			/* 0x40 partition first sector */
+	uint64_t volume_count;			/* 0x48 partition sectors count */
+	uint32_t fat_sector_start;		/* 0x50 FAT first sector */
+	uint32_t fat_sector_count;		/* 0x54 FAT sectors count */
+	uint32_t data_start_sector;		/* 0x58 Data region first cluster sector */
+	uint32_t data_clusters;			/* 0x5C total clusters count */
+	uint32_t rootdir_cluster;		/* 0x60 first cluster of the root dir */
+	uint32_t volume_serial;			/* 0x64 volume serial number */
+	struct {						/* 0x68 FS version */
+		uint8_t minor;
+		uint8_t major;
+	} __attribute__ ((packed)) version;
+	uint16_t volume_flags;			/* 0x6A volume state flags */
+	uint8_t bytes_per_sector;		/* 0x6C sector size as (1 << n) */
+	uint8_t sec_per_cluster;		/* 0x6D sectors per cluster as (1 << n) */
+	uint8_t fat_count;				/* 0x6E always 1 */
+	uint8_t drive_no;				/* 0x6F always 0x80 */
+	uint8_t allocated_percent;		/* 0x70 percentage of allocated space */
+	uint8_t _reserved2[7];			/* 0x71 reserved */
+	uint8_t bootcode[390];			/* Boot code */
+	uint16_t signature;				/* the value of 0xAA55 */
+} __attribute__((__packed__)) exfat_bs_t;
+
+
+extern fs_reg_t exfat_reg;
+
+extern void exfat_mounted(ipc_callid_t, ipc_call_t *);
+extern void exfat_mount(ipc_callid_t, ipc_call_t *);
+extern void exfat_unmounted(ipc_callid_t, ipc_call_t *);
+extern void exfat_unmount(ipc_callid_t, ipc_call_t *);
 
 #endif
Index: uspace/srv/fs/exfat/exfat_ops.c
===================================================================
--- uspace/srv/fs/exfat/exfat_ops.c	(revision efa8ed93920e4065d49fd3ee204246729808c9eb)
+++ uspace/srv/fs/exfat/exfat_ops.c	(revision 6d57e1ce99f815acd35b9662c387f3f6b82e68e0)
@@ -56,4 +56,112 @@
 #include <malloc.h>
 
+/** libfs operations */
+
+libfs_ops_t exfat_libfs_ops;
+/*
+libfs_ops_t exfat_libfs_ops = {
+	.root_get = exfat_root_get,
+	.match = exfat_match,
+	.node_get = exfat_node_get,
+	.node_open = exfat_node_open,
+	.node_put = exfat_node_put,
+	.create = exfat_create_node,
+	.destroy = exfat_destroy_node,
+	.link = exfat_link,
+	.unlink = exfat_unlink,
+	.has_children = exfat_has_children,
+	.index_get = exfat_index_get,
+	.size_get = exfat_size_get,
+	.lnkcnt_get = exfat_lnkcnt_get,
+	.plb_get_char = exfat_plb_get_char,
+	.is_directory = exfat_is_directory,
+	.is_file = exfat_is_file,
+	.device_get = exfat_device_get
+};
+*/
+
+/*
+ * VFS operations.
+ */
+
+void exfat_mounted(ipc_callid_t rid, ipc_call_t *request)
+{
+	devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);
+	enum cache_mode cmode;
+	exfat_bs_t *bs;
+
+	/* Accept the mount options */
+	char *opts;
+	int rc = async_data_write_accept((void **) &opts, true, 0, 0, 0, NULL);
+
+	if (rc != EOK) {
+		async_answer_0(rid, rc);
+		return;
+	}
+
+	/* Check for option enabling write through. */
+	if (str_cmp(opts, "wtcache") == 0)
+		cmode = CACHE_MODE_WT;
+	else
+		cmode = CACHE_MODE_WB;
+
+	free(opts);
+
+	/* initialize libblock */
+	rc = block_init(devmap_handle, BS_SIZE);
+	if (rc != EOK) {
+		async_answer_0(rid, rc);
+		return;
+	}
+
+	/* prepare the boot block */
+	rc = block_bb_read(devmap_handle, BS_BLOCK);
+	if (rc != EOK) {
+		block_fini(devmap_handle);
+		async_answer_0(rid, rc);
+		return;
+	}
+
+	/* get the buffer with the boot sector */
+	bs = block_bb_get(devmap_handle);
+	
+	(void) bs;
+
+	/* Initialize the block cache */
+	rc = block_cache_init(devmap_handle, BS_SIZE, 0 /* XXX */, cmode);
+	if (rc != EOK) {
+		block_fini(devmap_handle);
+		async_answer_0(rid, rc);
+		return;
+	}
+
+	async_answer_0(rid, EOK);
+/*	async_answer_3(rid, EOK, ridxp->index, rootp->size, rootp->lnkcnt); */
+}
+
+void exfat_mount(ipc_callid_t rid, ipc_call_t *request)
+{
+	libfs_mount(&exfat_libfs_ops, exfat_reg.fs_handle, rid, request);
+}
+
+void exfat_unmounted(ipc_callid_t rid, ipc_call_t *request)
+{
+	devmap_handle_t devmap_handle = (devmap_handle_t) IPC_GET_ARG1(*request);
+
+	/*
+	 * Perform cleanup of the node structures, index structures and
+	 * associated data. Write back this file system's dirty blocks and
+	 * stop using libblock for this instance.
+	 */
+	(void) block_cache_fini(devmap_handle);
+	block_fini(devmap_handle);
+
+	async_answer_0(rid, EOK);
+}
+
+void exfat_unmount(ipc_callid_t rid, ipc_call_t *request)
+{
+	libfs_unmount(&exfat_libfs_ops, rid, request);
+}
 
 
