Index: uspace/srv/fs/fat/fat_fat.c
===================================================================
--- uspace/srv/fs/fat/fat_fat.c	(revision 88a27f104d147232adae7ffc1f735ff60014b3cf)
+++ uspace/srv/fs/fat/fat_fat.c	(revision a14671026246a332661f1f8282e22c21a8a15088)
@@ -299,13 +299,15 @@
 {
 	block_t *b, *b1;
+	uint16_t byte1, byte2;
 	aoff64_t offset;
 	int rc;
 
 	offset = (clst + clst/2);
-
 	rc = block_get(&b, devmap_handle, RSCNT(bs) + SF(bs) * fatno +
 	    offset / BPS(bs), BLOCK_FLAGS_NONE);
 	if (rc != EOK)
 		return rc;
+
+	byte1 = ((uint8_t*) b->data)[offset];
 
 	/* This cluster access spans a sector boundary. Check only for FAT12 */
@@ -324,6 +326,5 @@
 			* first byte of next sector
 			*/
-			*value  = *(uint8_t *)(b->data + BPS(bs) - 1);
-			*value |= *(uint8_t *)(b1->data) << 8;
+			byte2 = ((uint8_t*) b1->data)[0];
 
 			rc = block_put(b1);
@@ -340,12 +341,18 @@
 	}
 	else
-		*value = *(uint16_t *)(b->data + offset % BPS(bs));
-
+		byte2 = ((uint8_t*) b->data)[offset+1];
+
+#ifdef __BE__	
+	*value = byte2 | (byte1 << 8);
+#else
+	*value = byte1 | (byte2 << 8);
+#endif
+
+	*value = uint16_t_le2host(*value);
 	if (IS_ODD(clst))
-		*value = (*value) >> 4;
+		*value = *value >> 4;
 	else
-		*value = (*value) & FAT12_MASK;
-
-	*value = uint16_t_le2host(*value);
+		*value = *value & FAT12_MASK;
+
 	rc = block_put(b);
 
@@ -408,5 +415,5 @@
 		return rc;
 
-	*value = uint32_t_le2host(*(uint32_t *)(b->data + offset % BPS(bs)) & FAT32_MASK);
+	*value = uint32_t_le2host(*(uint32_t *)(b->data + offset % BPS(bs))) & FAT32_MASK;
 
 	rc = block_put(b);
@@ -433,10 +440,13 @@
 	assert(fatno < FATCNT(bs));
 
-	if (FAT_IS_FAT12(bs))
+	if (FAT_IS_FAT12(bs)) {
 		rc = fat_get_cluster_fat12(bs, devmap_handle, fatno, clst, value);
-	else if (FAT_IS_FAT32(bs))
-		rc = fat_get_cluster_fat32(bs, devmap_handle, fatno, clst, value);
-	else
-		rc = fat_get_cluster_fat16(bs, devmap_handle, fatno, clst, value);
+	}
+	else {
+		if (FAT_IS_FAT32(bs))
+			rc = fat_get_cluster_fat32(bs, devmap_handle, fatno, clst, value);
+		else
+			rc = fat_get_cluster_fat16(bs, devmap_handle, fatno, clst, value);
+	}
 
 	return rc;
@@ -459,8 +469,8 @@
 	block_t *b, *b1=NULL;
 	aoff64_t offset;
+	uint16_t byte1, byte2;
 	int rc;
 
 	offset = (clst + clst/2);
-
 	rc = block_get(&b, devmap_handle, RSCNT(bs) + SF(bs) * fatno +
 	    offset / BPS(bs), BLOCK_FLAGS_NONE);
@@ -468,7 +478,5 @@
 		return rc;
 
-	value = host2uint32_t_le(value);
-
-	uint16_t temp;
+	byte1 = ((uint8_t*) b->data)[offset];
 	bool border = false;
 	/* This cluster access spans a sector boundary. Check only for FAT12 */
@@ -487,6 +495,5 @@
 			* first byte of next sector
 			*/
-			temp  = *(uint8_t *)(b->data + BPS(bs) - 1);
-			temp |= *(uint8_t *)(b1->data) << 8;
+			byte2 = ((uint8_t*) b1->data)[0];
 			border = true;
 		}
@@ -498,23 +505,24 @@
 	}
 	else
-		temp = *(uint16_t *)(b->data + offset % BPS(bs));
+		byte2 = ((uint8_t*) b->data)[offset+1];
 
 	if (IS_ODD(clst)) {
-		temp &= 0x000f;
-		temp |= value << 4;
-	}
-	else {
-		temp &= 0xf000;
-		temp |= value & FAT12_MASK;
-	}
-
+		byte1 &= 0x0f;
+		byte2 = 0;
+		value = (value << 4);
+	} else {
+		byte1 = 0;
+		byte2 &= 0xf0;
+		value &= FAT12_MASK;
+	}
+
+	byte1 = byte1 | (value & 0xff);
+	byte2 = byte2 | (value >> 8);
+
+	((uint8_t*) b->data)[offset] = byte1;
 	if (border) {
-		*(uint8_t *)(b->data + BPS(bs) - 1) = temp & 0xff;
-		*(uint8_t *)(b1->data) = temp >> 8;
+		((uint8_t*) b1->data)[0] = byte2;
+
 		b1->dirty = true;
-	} else
-		*(uint16_t *)(b->data + offset % BPS(bs)) = temp;
-
-	if (b1 && b1->dirty) {
 		rc = block_put(b1);
 		if (rc != EOK) {
@@ -522,5 +530,6 @@
 			return rc;
 		}
-	}
+	} else 
+		((uint8_t*) b->data)[offset+1] = byte2;
 
 	b->dirty = true;	/* need to sync block */
@@ -554,5 +563,5 @@
 		return rc;
 
-	*(uint16_t *)(b->data + offset % BPS(bs)) = host2uint32_t_le(value);
+	*(uint16_t *)(b->data + offset % BPS(bs)) = host2uint16_t_le(value);
 
 	b->dirty = true;	/* need to sync block */
Index: uspace/srv/fs/fat/fat_fat.h
===================================================================
--- uspace/srv/fs/fat/fat_fat.h	(revision 88a27f104d147232adae7ffc1f735ff60014b3cf)
+++ uspace/srv/fs/fat/fat_fat.h	(revision a14671026246a332661f1f8282e22c21a8a15088)
@@ -40,7 +40,7 @@
 #define FAT1		0
 
-#define FAT_CLST_RES0	  0x0000
-#define FAT_CLST_RES1	  0x0001
-#define FAT_CLST_FIRST	  0x0002
+#define FAT_CLST_RES0	  0
+#define FAT_CLST_RES1	  1
+#define FAT_CLST_FIRST	  2
 
 #define FAT32_CLST_BAD    0x0ffffff7
Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision 88a27f104d147232adae7ffc1f735ff60014b3cf)
+++ uspace/srv/fs/fat/fat_ops.c	(revision a14671026246a332661f1f8282e22c21a8a15088)
@@ -310,4 +310,11 @@
 
 	d = ((fat_dentry_t *)b->data) + (idxp->pdi % DPS(bs));
+	if (FAT_IS_FAT32(bs)) {
+		nodep->firstc = uint16_t_le2host(d->firstc_lo) | 
+		    (uint16_t_le2host(d->firstc_hi) << 16);
+	} 
+	else
+		nodep->firstc = uint16_t_le2host(d->firstc);
+
 	if (d->attr & FAT_ATTR_SUBDIR) {
 		/*
@@ -318,12 +325,12 @@
 		nodep->type = FAT_DIRECTORY;
 
-                /*
+		/*
 		 * Unfortunately, the 'size' field of the FAT dentry is not
 		 * defined for the directory entry type. We must determine the
 		 * size of the directory by walking the FAT.
 		 */
+		/* TODO uint16_t clusters to uint32_t */
 		uint16_t clusters;
-		rc = fat_clusters_get(&clusters, bs, idxp->devmap_handle,
-		    uint16_t_le2host(d->firstc));
+		rc = fat_clusters_get(&clusters, bs, idxp->devmap_handle, nodep->firstc);
 		if (rc != EOK) {
 			(void) block_put(b);
@@ -337,5 +344,4 @@
 	}
 
-        nodep->firstc = uint16_t_le2host(d->firstc);
 	nodep->lnkcnt = 1;
 	nodep->refcnt = 1;
@@ -1029,4 +1035,5 @@
 		return;
 	}
+
 	fs_node_initialize(rfn);
 	fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));
