Index: uspace/srv/fs/cdfs/cdfs_ops.c
===================================================================
--- uspace/srv/fs/cdfs/cdfs_ops.c	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/fs/cdfs/cdfs_ops.c	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -906,10 +906,11 @@
 }
 
-static bool iso_readfs(cdfs_t *fs, fs_node_t *rfn,
-    cdfs_lba_t altroot)
+/** Read the volume descriptors. */
+static bool iso_read_vol_desc(service_id_t sid, cdfs_lba_t altroot,
+    uint32_t *rlba, uint32_t *rsize, cdfs_enc_t *enc)
 {
 	/* First 16 blocks of isofs are empty */
 	block_t *block;
-	int rc = block_get(&block, fs->service_id, altroot + 16, BLOCK_FLAGS_NONE);
+	int rc = block_get(&block, sid, altroot + 16, BLOCK_FLAGS_NONE);
 	if (rc != EOK)
 		return false;
@@ -956,6 +957,4 @@
 	// TODO: implement path table support
 	
-	cdfs_node_t *node = CDFS_NODE(rfn);
-	
 	/* Search for Joliet SVD */
 	
@@ -963,23 +962,33 @@
 	uint32_t jrsize;
 	
-	rc = cdfs_find_joliet_svd(fs->service_id, altroot, &jrlba, &jrsize);
+	rc = cdfs_find_joliet_svd(sid, altroot, &jrlba, &jrsize);
 	if (rc == EOK) {
 		/* Found */
-		node->lba = jrlba;
-		node->size = jrsize;
-		fs->enc = enc_ucs2;
+		*rlba = jrlba;
+		*rsize = jrsize;
+		*enc = enc_ucs2;
 	} else {
-		node->lba = uint32_lb(vol_desc->data.prisec.root_dir.lba);
-		node->size = uint32_lb(vol_desc->data.prisec.root_dir.size);
-		fs->enc = enc_ascii;
-	}
-	
-	if (!cdfs_readdir(fs, rfn)) {
-		block_put(block);
-		return false;
+		*rlba = uint32_lb(vol_desc->data.prisec.root_dir.lba);
+		*rsize = uint32_lb(vol_desc->data.prisec.root_dir.size);
+		*enc = enc_ascii;
 	}
 	
 	block_put(block);
 	return true;
+}
+
+static bool iso_readfs(cdfs_t *fs, fs_node_t *rfn,
+    cdfs_lba_t altroot)
+{
+	int rc;
+	
+	cdfs_node_t *node = CDFS_NODE(rfn);
+	
+	rc = iso_read_vol_desc(fs->service_id, altroot, &node->lba,
+	    &node->size, &fs->enc);
+	if (rc != EOK)
+		return false;
+	
+	return cdfs_readdir(fs, rfn);
 }
 
@@ -1023,5 +1032,49 @@
 static int cdfs_fsprobe(service_id_t service_id, vfs_fs_probe_info_t *info)
 {
-	return ENOTSUP;
+	/* Initialize the block layer */
+	int rc = block_init(service_id, BLOCK_SIZE);
+	if (rc != EOK)
+		return rc;
+	
+	cdfs_lba_t altroot = 0;
+	
+	/*
+	 * Read TOC multisession information and get the start address
+	 * of the first track in the last session
+	 */
+	scsi_toc_multisess_data_t toc;
+
+	rc = block_read_toc(service_id, 1, &toc, sizeof(toc));
+	if (rc == EOK && (uint16_t_be2host(toc.toc_len) == 10))
+		altroot = uint32_t_be2host(toc.ftrack_lsess.start_addr);
+	
+	/* Initialize the block cache */
+	rc = block_cache_init(service_id, BLOCK_SIZE, 0, CACHE_MODE_WT);
+	if (rc != EOK) {
+		block_fini(service_id);
+		return rc;
+	}
+	
+	/* Check if this device is not already mounted */
+	fs_node_t *rootfn;
+	rc = cdfs_root_get(&rootfn, service_id);
+	if ((rc == EOK) && (rootfn)) {
+		cdfs_node_put(rootfn);
+		block_cache_fini(service_id);
+		block_fini(service_id);
+		return EOK;
+	}
+	
+	/* Read volume descriptors */
+	uint32_t rlba;
+	uint32_t rsize;
+	cdfs_enc_t enc;
+	if (!iso_read_vol_desc(service_id, altroot, &rlba, &rsize, &enc)) {
+		block_cache_fini(service_id);
+		block_fini(service_id);
+		return EIO;
+	}
+	
+	return EOK;
 }
 
Index: uspace/srv/fs/exfat/exfat_fat.c
===================================================================
--- uspace/srv/fs/exfat/exfat_fat.c	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/fs/exfat/exfat_fat.c	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -540,5 +540,5 @@
  * does not contain a exfat file system.
  */
-int exfat_sanity_check(exfat_bs_t *bs, service_id_t service_id)
+int exfat_sanity_check(exfat_bs_t *bs)
 {
 	if (str_cmp((char const *)bs->oem_name, "EXFAT   "))
Index: uspace/srv/fs/exfat/exfat_fat.h
===================================================================
--- uspace/srv/fs/exfat/exfat_fat.h	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/fs/exfat/exfat_fat.h	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -72,5 +72,5 @@
 extern int exfat_set_cluster(struct exfat_bs *, service_id_t, exfat_cluster_t,
     exfat_cluster_t);
-extern int exfat_sanity_check(struct exfat_bs *, service_id_t);
+extern int exfat_sanity_check(struct exfat_bs *);
 
 extern int exfat_append_clusters(struct exfat_bs *, struct exfat_node *,
Index: uspace/srv/fs/exfat/exfat_ops.c
===================================================================
--- uspace/srv/fs/exfat/exfat_ops.c	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/fs/exfat/exfat_ops.c	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -1053,5 +1053,28 @@
 static int exfat_fsprobe(service_id_t service_id, vfs_fs_probe_info_t *info)
 {
-	return ENOTSUP;
+	int rc;
+	exfat_bs_t *bs;
+
+	/* initialize libblock */
+	rc = block_init(service_id, BS_SIZE);
+	if (rc != EOK)
+		return rc;
+
+	/* prepare the boot block */
+	rc = block_bb_read(service_id, BS_BLOCK);
+	if (rc != EOK) {
+		block_fini(service_id);
+		return rc;
+	}
+
+	/* get the buffer with the boot sector */
+	bs = block_bb_get(service_id);
+
+	/* Do some simple sanity checks on the file system. */
+	rc = exfat_sanity_check(bs);
+
+	(void) block_cache_fini(service_id);
+	block_fini(service_id);
+	return rc;
 }
 
@@ -1086,15 +1109,15 @@
 	bs = block_bb_get(service_id);
 
+	/* Do some simple sanity checks on the file system. */
+	rc = exfat_sanity_check(bs);
+	if (rc != EOK) {
+		(void) block_cache_fini(service_id);
+		block_fini(service_id);
+		return rc;
+	}
+
 	/* Initialize the block cache */
 	rc = block_cache_init(service_id, BPS(bs), 0 /* XXX */, cmode);
 	if (rc != EOK) {
-		block_fini(service_id);
-		return rc;
-	}
-
-	/* Do some simple sanity checks on the file system. */
-	rc = exfat_sanity_check(bs, service_id);
-	if (rc != EOK) {
-		(void) block_cache_fini(service_id);
 		block_fini(service_id);
 		return rc;
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/fs/fat/fat_ops.c	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -915,5 +915,41 @@
 static int fat_fsprobe(service_id_t service_id, vfs_fs_probe_info_t *info)
 {
-	return ENOTSUP;
+	fat_bs_t *bs;
+	int rc;
+
+	/* initialize libblock */
+	rc = block_init(service_id, BS_SIZE);
+	if (rc != EOK)
+		return rc;
+
+	/* prepare the boot block */
+	rc = block_bb_read(service_id, BS_BLOCK);
+	if (rc != EOK) {
+		block_fini(service_id);
+		return rc;
+	}
+
+	/* get the buffer with the boot sector */
+	bs = block_bb_get(service_id);
+
+	if (BPS(bs) != BS_SIZE) {
+		block_fini(service_id);
+		return ENOTSUP;
+	}
+
+	/* Initialize the block cache */
+	rc = block_cache_init(service_id, BPS(bs), 0 /* XXX */, CACHE_MODE_WB);
+	if (rc != EOK) {
+		block_fini(service_id);
+		return rc;
+	}
+
+	/* Do some simple sanity checks on the file system. */
+	rc = fat_sanity_check(bs, service_id);
+
+	(void) block_cache_fini(service_id);
+	block_fini(service_id);
+
+	return rc;
 }
 
Index: uspace/srv/volsrv/mkfs.c
===================================================================
--- uspace/srv/volsrv/mkfs.c	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/volsrv/mkfs.c	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -119,4 +119,5 @@
 		break;
 	case fs_ext4:
+	case fs_cdfs:
 		cmd = NULL;
 		break;
Index: uspace/srv/volsrv/part.c
===================================================================
--- uspace/srv/volsrv/part.c	(revision be39fc6933dcee0f4da8cad1a1eb341979fbb8ce)
+++ uspace/srv/volsrv/part.c	(revision e48947e50a7052fa90231d75f84e7481c8c7d201)
@@ -53,4 +53,18 @@
 static FIBRIL_MUTEX_INITIALIZE(vol_parts_lock);
 
+struct fsname_type {
+	const char *name;
+	vol_fstype_t fstype;
+};
+
+static struct fsname_type fstab[] = {
+	{ "ext4fs", fs_ext4 },
+	{ "cdfs", fs_cdfs },
+	{ "exfat", fs_exfat },
+	{ "fat", fs_fat },
+	{ "mfs", fs_minix },
+	{ NULL, 0 }
+};
+
 /** Check for new partitions */
 static int vol_part_check_new(void)
@@ -134,4 +148,5 @@
 	bool empty;
 	vfs_fs_probe_info_t info;
+	struct fsname_type *fst;
 	int rc;
 
@@ -157,8 +172,17 @@
 
 	log_msg(LOG_DEFAULT, LVL_NOTE, "Probe partition %s", part->svc_name);
-	rc = vfs_fsprobe("mfs", sid, &info);
-	if (rc == EOK) {
+
+	fst = &fstab[0];
+	while (fst->name != NULL) {
+		rc = vfs_fsprobe(fst->name, sid, &info);
+		if (rc == EOK)
+			break;
+		++fst;
+	}
+
+	if (fst->name != NULL) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "Found %s", fst->name);
 		part->pcnt = vpc_fs;
-		part->fstype = fs_minix;
+		part->fstype = fst->fstype;
 	} else {
 		log_msg(LOG_DEFAULT, LVL_NOTE, "Partition does not contain "
