Index: uspace/srv/fs/fat/fat.h
===================================================================
--- uspace/srv/fs/fat/fat.h	(revision cb052b429564f6640c6f71d2f71d18c168401dbf)
+++ uspace/srv/fs/fat/fat.h	(revision 875edff6500ffa862694e100942c95c19441bb3f)
@@ -55,5 +55,7 @@
 #define RSCNT(bs)	uint16_t_le2host((bs)->rscnt)
 #define FATCNT(bs)	(bs)->fatcnt
-#define SF(bs)		uint16_t_le2host((bs)->sec_per_fat)
+#define SF(bs)		(uint16_t_le2host((bs)->sec_per_fat) !=0 ? \
+    uint16_t_le2host((bs)->sec_per_fat) : \
+    uint32_t_le2host(bs->fat32.sectors_per_fat))
 #define RDE(bs)		uint16_t_le2host((bs)->root_ent_max)
 #define TS(bs)		(uint16_t_le2host((bs)->totsec16) != 0 ? \
Index: uspace/srv/fs/fat/fat_fat.c
===================================================================
--- uspace/srv/fs/fat/fat_fat.c	(revision cb052b429564f6640c6f71d2f71d18c168401dbf)
+++ uspace/srv/fs/fat/fat_fat.c	(revision 875edff6500ffa862694e100942c95c19441bb3f)
@@ -301,9 +301,11 @@
 
 	assert(fatno < FATCNT(bs));
+	
+	*value = 0;
 
 	if (FAT_IS_FAT12(bs))
 		offset = (clst + clst/2);
 	else
-		offset = (clst * sizeof(fat_cluster_t));
+		offset = (clst * FAT_CLST_SIZE(bs));
 
 	rc = block_get(&b, devmap_handle, RSCNT(bs) + SF(bs) * fatno +
@@ -313,41 +315,45 @@
 
 	/* This cluster access spans a sector boundary. Check only for FAT12 */
-	if (FAT_IS_FAT12(bs) && (offset % BPS(bs)+1 == BPS(bs))) {
-		/* Is it last sector of FAT? */
-		if (offset / BPS(bs) < SF(bs)) {
-			/* No. Reading next sector */
-			rc = block_get(&b1, devmap_handle, 1 + RSCNT(bs) +
-			    SF(bs)*fatno + offset / BPS(bs), BLOCK_FLAGS_NONE);
-			if (rc != EOK) {
+	if (FAT_IS_FAT12(bs)) {
+		if ((offset % BPS(bs) + 1 == BPS(bs))) {
+			/* Is it last sector of FAT? */
+			if (offset / BPS(bs) < SF(bs)) {
+				/* No. Reading next sector */
+				rc = block_get(&b1, devmap_handle, 1 + RSCNT(bs) +
+					SF(bs)*fatno + offset / BPS(bs), BLOCK_FLAGS_NONE);
+				if (rc != EOK) {
+					block_put(b);
+					return rc;
+				}
+				/*
+				* Combining value with last byte of current sector and
+				* first byte of next sector
+				*/
+				*value  = *(uint8_t *)(b->data + BPS(bs) - 1);
+				*value |= *(uint8_t *)(b1->data);
+
+				rc = block_put(b1);
+				if (rc != EOK) {
+					block_put(b);
+					return rc;
+				}
+			}
+			else {
+				/* Yes. It is last sector of FAT */
 				block_put(b);
-				return rc;
+				return ERANGE;
 			}
-			/*
-			 * Combining value with last byte of current sector and
-			 * first byte of next sector
-			 */
-			*value  = *(uint8_t *)(b->data + BPS(bs) - 1);
-			*value |= *(uint8_t *)(b1->data);
-
-			rc = block_put(b1);
-			if (rc != EOK) {
-				block_put(b);
-				return rc;
-			}
-		}
-		else {
-			/* Yes. It is last sector of FAT */
-			block_put(b);
-			return ERANGE;
-		}
-	}
-	else
-		*value = *(fat_cluster_t *)(b->data + offset % BPS(bs));
-
-	if (FAT_IS_FAT12(bs)) {
+		}
+
 		if (clst & 0x0001)
-		*value = (*value) >> 4;
+			*value = (*value) >> 4;
 		else
-		*value = (*value) & 0x0fff;
+			*value = (*value) & FAT12_MASK;
+	}
+	else {
+		if (FAT_IS_FAT32(bs))
+			*value = *(uint32_t *)(b->data + offset % BPS(bs)) & FAT32_MASK;
+		else
+			*value = *(uint16_t *)(b->data + offset % BPS(bs));
 	}
 
@@ -383,5 +389,5 @@
 		offset = (clst + clst/2);
 	else
-		offset = (clst * sizeof(fat_cluster_t));
+		offset = (clst * FAT_CLST_SIZE(bs));
 
 	rc = block_get(&b, devmap_handle, RSCNT(bs) + SF(bs) * fatno +
@@ -734,9 +740,9 @@
 
 	/* Check number of FATs. */
-	if (bs->fatcnt == 0)
+	if (FATCNT(bs) == 0)
 		return ENOTSUP;
 
 	/* Check total number of sectors. */
-	if (bs->totsec16 == 0 && bs->totsec32 == 0)
+	if (TS(bs) == 0)
 		return ENOTSUP;
 
@@ -750,5 +756,5 @@
 
 	/* Check number of sectors per FAT. */
-	if (bs->sec_per_fat == 0)
+	if (SF(bs) == 0)
 		return ENOTSUP;
 
@@ -760,10 +766,9 @@
 	 * sanitized to support file systems with this property.
 	 */
-	if ((uint16_t_le2host(bs->root_ent_max) * sizeof(fat_dentry_t)) %
-	    uint16_t_le2host(bs->bps) != 0)
+	if (!FAT_IS_FAT32(bs) && (RDE(bs) * sizeof(fat_dentry_t)) % BPS(bs) != 0)
 		return ENOTSUP;
 
 	/* Check signature of each FAT. */
-	for (fat_no = 0; fat_no < bs->fatcnt; fat_no++) {
+	for (fat_no = 0; fat_no < FATCNT(bs); fat_no++) {
 		rc = fat_get_cluster(bs, devmap_handle, fat_no, 0, &e0);
 		if (rc != EOK)
@@ -782,5 +787,5 @@
 		 * set to one.
 		 */
-                if (!FAT_IS_FAT12(bs) && ((e0 >> 8) != 0xff || e1 != 0xffff))
+		if (!FAT_IS_FAT12(bs) && ((e0 >> 8) != (FAT_MASK(bs) >> 8) || e1 != FAT_MASK(bs)))
 			return ENOTSUP;
 	}
Index: uspace/srv/fs/fat/fat_fat.h
===================================================================
--- uspace/srv/fs/fat/fat_fat.h	(revision cb052b429564f6640c6f71d2f71d18c168401dbf)
+++ uspace/srv/fs/fat/fat_fat.h	(revision 875edff6500ffa862694e100942c95c19441bb3f)
@@ -54,6 +54,15 @@
 #define FAT32_CLST_LAST8  0x0fffffff
 
+#define FAT12_MASK		  0x0fff
+#define FAT16_MASK		  0xffff
+#define FAT32_MASK		  0x0fffffff
+
 #define FAT12_CLST_MAX    4085
 #define FAT16_CLST_MAX    65525
+
+/* Size in bytes for cluster value of FAT */
+#define FAT12_CLST_SIZE   2
+#define FAT16_CLST_SIZE   2
+#define FAT32_CLST_SIZE   4
 
 /* internally used to mark root directory's parent */
@@ -84,4 +93,9 @@
     (FAT_IS_FAT12(bs) ? FAT12_CLST_BAD : (FAT_IS_FAT32(bs) ? FAT32_CLST_BAD : FAT16_CLST_BAD))
 
+#define FAT_CLST_SIZE(bs)	(FAT_IS_FAT32(bs) ? FAT32_CLST_SIZE : FAT16_CLST_SIZE)
+
+#define FAT_MASK(bs) \
+    (FAT_IS_FAT12(bs) ? FAT12_MASK : (FAT_IS_FAT32(bs) ? FAT32_MASK : FAT16_MASK))
+
 /* forward declarations */
 struct block;
@@ -89,5 +103,5 @@
 struct fat_bs;
 
-typedef uint16_t fat_cluster_t;
+typedef uint32_t fat_cluster_t;
 
 #define fat_clusters_get(numc, bs, dh, fc) \
