Index: uspace/lib/ext4/include/ext4/superblock.h
===================================================================
--- uspace/lib/ext4/include/ext4/superblock.h	(revision 4d7bf352f77a3da756d2e830599a9dab7108b870)
+++ uspace/lib/ext4/include/ext4/superblock.h	(revision e2f20b9eb3b7301e5374644aa5788a8c8e38a14b)
@@ -147,4 +147,5 @@
 extern void ext4_superblock_set_reserved_gdt_blocks(ext4_superblock_t *sb,
     uint32_t n);
+extern uint32_t ext4_superblock_get_flex_group_size(ext4_superblock_t *sb);
 
 /* More complex superblock functions */
Index: uspace/lib/ext4/src/balloc.c
===================================================================
--- uspace/lib/ext4/src/balloc.c	(revision 4d7bf352f77a3da756d2e830599a9dab7108b870)
+++ uspace/lib/ext4/src/balloc.c	(revision e2f20b9eb3b7301e5374644aa5788a8c8e38a14b)
@@ -261,32 +261,28 @@
 		 * is always after the inode table.
 		 */
+		return itable + itable_sz;
+	}
+
+	uint32_t flex_group_size = ext4_superblock_get_flex_group_size(sb);
+	if ((bg_ref->index % flex_group_size) == 0) {
+		/* This is the base group */
+		uint32_t i;
+
 		r = itable + itable_sz;
-		return ext4_filesystem_blockaddr2_index_in_group(sb, r);
-	}
-
-	uint64_t bbmap = ext4_block_group_get_block_bitmap(bg_ref->block_group,
-	    sb);
-	uint64_t ibmap = ext4_block_group_get_inode_bitmap(bg_ref->block_group,
-	    sb);
-
-	r = ext4_filesystem_index_in_group2blockaddr(sb, 0, bg_ref->index);
-	r += ext4_filesystem_bg_get_backup_blocks(bg_ref);
-
-	if (ext4_filesystem_blockaddr2group(sb, bbmap) != bg_ref->index)
-		bbmap = -1; /* Invalid */
-
-	if (ext4_filesystem_blockaddr2group(sb, ibmap) != bg_ref->index)
-		ibmap = -1;
-
-	while (true) {
-		if (r == bbmap || r == ibmap)
-			r++;
-		else if (r >= itable && r < (itable + itable_sz))
-			r = itable + itable_sz;
-		else
-			break;
-	}
-
-	return r;
+
+		uint32_t total_groups = ext4_superblock_get_block_group_count(sb);
+		for (i = bg_ref->index + 1;
+		    i < min(total_groups, bg_ref->index + flex_group_size); ++i) {
+			r += ext4_filesystem_bg_get_itable_size(sb, i);
+		}
+
+		return r;
+	}
+
+	uint64_t base_addr = ext4_filesystem_index_in_group2blockaddr(sb, 0,
+	    bg_ref->index);
+	uint32_t reserved = ext4_filesystem_bg_get_backup_blocks(bg_ref);
+
+	return base_addr + reserved;
 }
 
Index: uspace/lib/ext4/src/superblock.c
===================================================================
--- uspace/lib/ext4/src/superblock.c	(revision 4d7bf352f77a3da756d2e830599a9dab7108b870)
+++ uspace/lib/ext4/src/superblock.c	(revision e2f20b9eb3b7301e5374644aa5788a8c8e38a14b)
@@ -1394,4 +1394,15 @@
 {
 	sb->reserved_gdt_blocks = host2uint32_t_le(n);
+}
+
+/** Get the size of the flex groups
+ *
+ * @param sb	Pointer to the superblock
+ *
+ * @return	Size of the flex groups
+ */
+uint32_t ext4_superblock_get_flex_group_size(ext4_superblock_t *sb)
+{
+	return 2 << sb->log_groups_per_flex;
 }
 
