Index: uspace/lib/ext4/libext4_balloc.c
===================================================================
--- uspace/lib/ext4/libext4_balloc.c	(revision 528e5b3e3c84e8c6ddb12307c426448d71d79329)
+++ uspace/lib/ext4/libext4_balloc.c	(revision ae3d4f846c765359d44016e122488a53c412adc4)
@@ -117,4 +117,10 @@
 	uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
 
+	// Update superblock free blocks count
+	uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(fs->superblock);
+	sb_free_blocks--;
+	ext4_superblock_set_free_blocks_count(fs->superblock, sb_free_blocks);
+
+	// Update inode blocks count
 	uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
 	ino_blocks -= block_size / EXT4_INODE_BLOCK_SIZE;
@@ -122,10 +128,9 @@
 	inode_ref->dirty = true;
 
+	// Update block group free blocks count
 	uint32_t free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
 	free_blocks++;
 	ext4_block_group_set_free_blocks_count(bg_ref->block_group, free_blocks);
 	bg_ref->dirty = true;
-
-	// TODO change free blocks count in superblock
 
 	rc = ext4_filesystem_put_block_group_ref(bg_ref);
@@ -444,9 +449,10 @@
 	uint32_t block_size = ext4_superblock_get_block_size(fs->superblock);
 
-	// TODO decrement superblock free blocks count
-	//uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(sb);
-	//sb_free_blocks--;
-	//ext4_superblock_set_free_blocks_count(sb, sb_free_blocks);
-
+	// Update superblock free blocks count
+	uint32_t sb_free_blocks = ext4_superblock_get_free_blocks_count(fs->superblock);
+	sb_free_blocks--;
+	ext4_superblock_set_free_blocks_count(fs->superblock, sb_free_blocks);
+
+	// Update inode blocks (different block size!) count
 	uint64_t ino_blocks = ext4_inode_get_blocks_count(fs->superblock, inode_ref->inode);
 	ino_blocks += block_size / EXT4_INODE_BLOCK_SIZE;
@@ -454,4 +460,5 @@
 	inode_ref->dirty = true;
 
+	// Update block group free blocks count
 	uint32_t bg_free_blocks = ext4_block_group_get_free_blocks_count(bg_ref->block_group);
 	bg_free_blocks--;
Index: uspace/lib/ext4/libext4_filesystem.c
===================================================================
--- uspace/lib/ext4/libext4_filesystem.c	(revision 528e5b3e3c84e8c6ddb12307c426448d71d79329)
+++ uspace/lib/ext4/libext4_filesystem.c	(revision ae3d4f846c765359d44016e122488a53c412adc4)
@@ -94,8 +94,15 @@
 }
 
-void ext4_filesystem_fini(ext4_filesystem_t *fs)
-{
+int ext4_filesystem_fini(ext4_filesystem_t *fs, bool write_sb)
+{
+	int rc = EOK;
+	if (write_sb) {
+		rc = ext4_superblock_write_direct(fs->device, fs->superblock);
+	}
+
 	free(fs->superblock);
 	block_fini(fs->device);
+
+	return rc;
 }
 
@@ -464,5 +471,5 @@
 				EXT4FS_DBG("allocation error");
 			}
-			EXT4FS_DBG("BBB: new addr \%u, offset = \%u, level = \%u", new_block_addr, offset_in_block, level);
+//			EXT4FS_DBG("BBB: new addr \%u, offset = \%u, level = \%u", new_block_addr, offset_in_block, level);
 
 			rc = block_get(&new_block, fs->device, new_block_addr, BLOCK_FLAGS_NOREAD);
Index: uspace/lib/ext4/libext4_filesystem.h
===================================================================
--- uspace/lib/ext4/libext4_filesystem.h	(revision 528e5b3e3c84e8c6ddb12307c426448d71d79329)
+++ uspace/lib/ext4/libext4_filesystem.h	(revision ae3d4f846c765359d44016e122488a53c412adc4)
@@ -51,5 +51,5 @@
 
 extern int ext4_filesystem_init(ext4_filesystem_t *, service_id_t);
-extern void ext4_filesystem_fini(ext4_filesystem_t *fs);
+extern int ext4_filesystem_fini(ext4_filesystem_t *fs, bool);
 extern int ext4_filesystem_check_sanity(ext4_filesystem_t *fs);
 extern int ext4_filesystem_check_features(ext4_filesystem_t *, bool *);
Index: uspace/lib/ext4/libext4_superblock.c
===================================================================
--- uspace/lib/ext4/libext4_superblock.c	(revision 528e5b3e3c84e8c6ddb12307c426448d71d79329)
+++ uspace/lib/ext4/libext4_superblock.c	(revision ae3d4f846c765359d44016e122488a53c412adc4)
@@ -65,4 +65,10 @@
 }
 
+void ext4_superblock_set_free_blocks_count(ext4_superblock_t *sb, uint64_t count)
+{
+	sb->free_blocks_count_lo = host2uint32_t_le((count << 32) >> 32);
+	sb->free_blocks_count_hi = host2uint32_t_le(count >> 32);
+}
+
 uint32_t ext4_superblock_get_free_inodes_count(ext4_superblock_t *sb)
 {
@@ -268,4 +274,30 @@
 	return EOK;
 }
+
+int ext4_superblock_write_direct(service_id_t service_id,
+		ext4_superblock_t *sb)
+{
+	int rc;
+	uint32_t phys_block_size;
+	uint64_t first_block;
+	uint32_t block_count;
+
+	rc = block_get_bsize(service_id, &phys_block_size);
+	if (rc != EOK) {
+		// TODO error
+		return rc;
+	}
+
+	first_block = EXT4_SUPERBLOCK_OFFSET / phys_block_size;
+	block_count = EXT4_SUPERBLOCK_SIZE / phys_block_size;
+
+	if (EXT4_SUPERBLOCK_SIZE % phys_block_size) {
+		block_count++;
+	}
+
+	return block_write_direct(service_id, first_block, block_count, sb);
+
+}
+
 
 int ext4_superblock_check_sanity(ext4_superblock_t *sb)
Index: uspace/lib/ext4/libext4_superblock.h
===================================================================
--- uspace/lib/ext4/libext4_superblock.h	(revision 528e5b3e3c84e8c6ddb12307c426448d71d79329)
+++ uspace/lib/ext4/libext4_superblock.h	(revision ae3d4f846c765359d44016e122488a53c412adc4)
@@ -205,4 +205,5 @@
 extern uint64_t ext4_superblock_get_reserved_blocks_count(ext4_superblock_t *);
 extern uint64_t ext4_superblock_get_free_blocks_count(ext4_superblock_t *);
+extern void ext4_superblock_set_free_blocks_count(ext4_superblock_t *, uint64_t);
 extern uint32_t ext4_superblock_get_free_inodes_count(ext4_superblock_t *);
 extern uint32_t ext4_superblock_get_first_data_block(ext4_superblock_t *);
@@ -300,4 +301,5 @@
 extern bool ext4_superblock_has_feature_read_only(ext4_superblock_t *, uint32_t);
 extern int ext4_superblock_read_direct(service_id_t, ext4_superblock_t **);
+extern int ext4_superblock_write_direct(service_id_t, ext4_superblock_t *);
 extern int ext4_superblock_check_sanity(ext4_superblock_t *);
 
Index: uspace/srv/fs/ext4fs/ext4fs_ops.c
===================================================================
--- uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision 528e5b3e3c84e8c6ddb12307c426448d71d79329)
+++ uspace/srv/fs/ext4fs/ext4fs_ops.c	(revision ae3d4f846c765359d44016e122488a53c412adc4)
@@ -611,5 +611,5 @@
 	rc = ext4_filesystem_check_sanity(fs);
 	if (rc != EOK) {
-		ext4_filesystem_fini(fs);
+		ext4_filesystem_fini(fs, false);
 		free(fs);
 		free(inst);
@@ -620,5 +620,5 @@
 	rc = ext4_filesystem_check_features(fs, &read_only);
 	if (rc != EOK) {
-		ext4_filesystem_fini(fs);
+		ext4_filesystem_fini(fs, false);
 		free(fs);
 		free(inst);
@@ -636,5 +636,5 @@
 	rc = ext4fs_node_get_core(&root_node, inst, EXT4_INODE_ROOT_INDEX);
 	if (rc != EOK) {
-		ext4_filesystem_fini(fs);
+		ext4_filesystem_fini(fs, false);
 		free(fs);
 		free(inst);
@@ -683,7 +683,5 @@
 	fibril_mutex_unlock(&open_nodes_lock);
 
-	ext4_filesystem_fini(inst->filesystem);
-
-	return EOK;
+	return ext4_filesystem_fini(inst->filesystem, true);
 }
 
