Index: uspace/app/blkdump/Makefile
===================================================================
--- uspace/app/blkdump/Makefile	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/app/blkdump/Makefile	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -30,5 +30,5 @@
 USPACE_PREFIX = ../..
 LIBS = $(LIBBLOCK_PREFIX)/libblock.a
-EXTRA_CFLAGS = -I$(LIBBLOCK_PREFIX)
+EXTRA_CFLAGS = -I$(LIBBLOCK_PREFIX) -I$(LIBSCSI_PREFIX)/include
 BINARY = blkdump
 
Index: uspace/app/blkdump/blkdump.c
===================================================================
--- uspace/app/blkdump/blkdump.c	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/app/blkdump/blkdump.c	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -44,4 +44,5 @@
 #include <loc.h>
 #include <byteorder.h>
+#include <scsi/mmc.h>
 #include <sys/types.h>
 #include <sys/typefmt.h>
@@ -214,13 +215,14 @@
 static int print_toc(void)
 {
-	toc_block_t *toc;
-
-	toc = block_get_toc(service_id, 0);
-	if (toc == NULL)
+	scsi_toc_multisess_data_t toc;
+	int rc;
+
+	rc = block_read_toc(service_id, 0, &toc, sizeof(toc));
+	if (rc != EOK)
 		return 1;
 
-	printf("TOC size: %" PRIu16 " bytes\n", toc->size);
-	printf("First session: %" PRIu8 "\n", toc->first_session);
-	printf("Last_session: %" PRIu8 "\n", toc->last_session);
+	printf("TOC size: %" PRIu16 " bytes\n", toc.toc_len);
+	printf("First session: %" PRIu8 "\n", toc.first_sess);
+	printf("Last_session: %" PRIu8 "\n", toc.last_sess);
 
 	return 0;
Index: uspace/lib/block/block.c
===================================================================
--- uspace/lib/block/block.c	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/lib/block/block.c	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -877,26 +877,14 @@
  *
  * @return Allocated TOC structure.
- * @return NULL on failure.
- *
- */
-toc_block_t *block_get_toc(service_id_t service_id, uint8_t session)
+ * @return EOK on success or negative error code.
+ *
+ */
+int block_read_toc(service_id_t service_id, uint8_t session, void *buf,
+    size_t bufsize)
 {
 	devcon_t *devcon = devcon_search(service_id);
-	toc_block_t *toc = NULL;
-	int rc;
-	
-	assert(devcon);
-	
-	toc = (toc_block_t *) malloc(sizeof(toc_block_t));
-	if (toc == NULL)
-		return NULL;
-	
-	rc = bd_read_toc(devcon->bd, session, toc, sizeof(toc_block_t));
-	if (rc != EOK) {
-		free(toc);
-		return NULL;
-	}
-	
-	return toc;
+	
+	assert(devcon);
+	return bd_read_toc(devcon->bd, session, buf, bufsize);
 }
 
Index: uspace/lib/block/block.h
===================================================================
--- uspace/lib/block/block.h	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/lib/block/block.h	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -99,17 +99,4 @@
 };
 
-typedef struct {
-	uint16_t size;
-	uint8_t first_session;
-	uint8_t last_session;
-	
-	uint8_t res0;
-	uint8_t adr_ctrl;
-	uint8_t first_track;
-	uint8_t res1;
-	
-	uint32_t first_lba;
-} __attribute__((packed)) toc_block_t;
-
 extern int block_init(exch_mgmt_t, service_id_t, size_t);
 extern void block_fini(service_id_t);
@@ -129,5 +116,5 @@
 extern int block_get_bsize(service_id_t, size_t *);
 extern int block_get_nblocks(service_id_t, aoff64_t *);
-extern toc_block_t *block_get_toc(service_id_t, uint8_t);
+extern int block_read_toc(service_id_t, uint8_t, void *, size_t);
 extern int block_read_direct(service_id_t, aoff64_t, size_t, void *);
 extern int block_read_bytes_direct(service_id_t, aoff64_t, size_t, void *);
Index: uspace/lib/scsi/include/scsi/mmc.h
===================================================================
--- uspace/lib/scsi/include/scsi/mmc.h	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/lib/scsi/include/scsi/mmc.h	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -69,4 +69,33 @@
 } __attribute__((packed)) scsi_cdb_read_toc_t;
 
+/** TOC Track Descriptor */
+typedef struct {
+	/** Reserved */
+	uint8_t reserved0;
+	/** ADR, Control */
+	uint8_t adr_control;
+	/** Track Number */
+	uint8_t track_no;
+	/** Reserved */
+	uint8_t reserved3;
+	/** Track Start Address */
+	uint32_t start_addr;
+} __attribute__((packed)) scsi_toc_track_desc_t;
+
+/** Read TOC response format 00001b: Multi-session Information
+ *
+ * Returned for Read TOC command with Format 0001b
+ */
+typedef struct {
+	/** TOC Data Length */
+	uint16_t toc_len;
+	/** First Complete Session Number */
+	uint8_t first_sess;
+	/** Last Complete Session Number */
+	uint8_t last_sess;
+	/** TOC Track Descriptor for first track in last complete session */
+	scsi_toc_track_desc_t ftrack_lsess;
+} __attribute__((packed)) scsi_toc_multisess_data_t;
+
 #endif
 
Index: uspace/srv/fs/cdfs/Makefile
===================================================================
--- uspace/srv/fs/cdfs/Makefile	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/srv/fs/cdfs/Makefile	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -29,5 +29,6 @@
 USPACE_PREFIX = ../../..
 LIBS = $(LIBBLOCK_PREFIX)/libblock.a $(LIBFS_PREFIX)/libfs.a
-EXTRA_CFLAGS += -I$(LIBBLOCK_PREFIX) -I$(LIBFS_PREFIX)
+EXTRA_CFLAGS += -I$(LIBBLOCK_PREFIX) -I$(LIBFS_PREFIX) \
+    -I$(LIBSCSI_PREFIX)/include
 BINARY = cdfs
 
Index: uspace/srv/fs/cdfs/cdfs_ops.c
===================================================================
--- uspace/srv/fs/cdfs/cdfs_ops.c	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/srv/fs/cdfs/cdfs_ops.c	(revision 3abf70c73779dc7dc5529512275597a1d116e82d)
@@ -48,4 +48,5 @@
 #include <errno.h>
 #include <block.h>
+#include <scsi/mmc.h>
 #include <str.h>
 #include <byteorder.h>
@@ -1035,10 +1036,13 @@
 			altroot = 0;
 	} else {
-		/* Read TOC and find the last session */
-		toc_block_t *toc = block_get_toc(service_id, 1);
-		if ((toc != NULL) && (uint16_t_be2host(toc->size) == 10)) {
-			altroot = uint32_t_be2host(toc->first_lba);
-			free(toc);
-		}
+		/*
+		 * 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);
 	}
 	
