Index: uspace/app/mkminix/mkminix.c
===================================================================
--- uspace/app/mkminix/mkminix.c	(revision 59e670e8468803b4f3cc0aee63300ed07844912e)
+++ uspace/app/mkminix/mkminix.c	(revision 410a06581bf1b0dc1b83bb99d1d5e77fb16f7977)
@@ -72,4 +72,5 @@
 	unsigned long zbmap_blocks;
 	unsigned long first_data_zone;
+	unsigned long itable_size;
 	int log2_zone_size;
 	int ino_per_block;
@@ -87,4 +88,7 @@
 static void	write_superblock3(struct mfs_sb_info *sbi);
 static void	init_bitmaps(struct mfs_sb_info *sb);
+static void	init_inode_table(struct mfs_sb_info *sb);
+static void	make_root_ino(struct mfs_sb_info *sb);
+static void	make_root_ino3(struct mfs_sb_info *sb);
 static void	mark_bmap(uint32_t *bmap, int idx, int v);
 
@@ -225,5 +229,77 @@
 	init_bitmaps(&sb);
 
+	/*Init inode table*/
+	init_inode_table(&sb);
+
 	return 0;
+}
+
+static void init_inode_table(struct mfs_sb_info *sb)
+{
+	unsigned int i;
+	uint8_t *itable_buf;
+	long itable_pos = 2 + sb->zbmap_blocks + sb->ibmap_blocks;
+
+	itable_buf = malloc(sb->block_size);
+	memset(itable_buf, 0x00, sb->block_size);
+
+	const int chunks = sb->block_size / MFS_BLOCKSIZE;
+
+	for (i = 0; i < sb->itable_size; ++i, ++itable_pos)
+		block_write_direct(sb->handle, itable_pos, chunks, itable_buf);
+
+	free(itable_buf);
+
+	/*Make the root inode*/
+	if (sb->fs_version != 3)
+		make_root_ino(sb);		
+	else
+		make_root_ino3(sb);
+}
+
+static void make_root_ino(struct mfs_sb_info *sb)
+{
+	struct mfs_inode *ino_buf;
+	const size_t bufsize = MFS_BLOCKSIZE;
+	const long itable_pos = 2 + sb->zbmap_blocks + sb->ibmap_blocks;
+
+	ino_buf = (struct mfs_inode *) malloc(bufsize);
+	memset(ino_buf, 0x00, bufsize);
+
+	ino_buf[MFS_ROOT_INO].i_mode = S_IFDIR;
+	ino_buf[MFS_ROOT_INO].i_uid = 0;
+	ino_buf[MFS_ROOT_INO].i_gid = 0;
+	ino_buf[MFS_ROOT_INO].i_size = (sb->longnames ? MFSL_DIRSIZE : MFS_DIRSIZE) * 2;
+	ino_buf[MFS_ROOT_INO].i_mtime = 0;
+	ino_buf[MFS_ROOT_INO].i_nlinks = 2;
+	ino_buf[MFS_ROOT_INO].i_dzone[0] = sb->first_data_zone;
+
+	block_write_direct(sb->handle, itable_pos, 1, ino_buf);
+
+	free(ino_buf);
+}
+
+static void make_root_ino3(struct mfs_sb_info *sb)
+{
+	struct mfs2_inode *ino_buf;
+	const size_t bufsize = MFS_MIN_BLOCKSIZE;
+	const long itable_pos = 2 + sb->zbmap_blocks + sb->ibmap_blocks;
+
+	ino_buf = (struct mfs2_inode *) malloc(bufsize);
+	memset(ino_buf, 0x00, bufsize);
+
+	ino_buf[MFS_ROOT_INO].i_mode = S_IFDIR;
+	ino_buf[MFS_ROOT_INO].i_uid = 0;
+	ino_buf[MFS_ROOT_INO].i_gid = 0;
+	ino_buf[MFS_ROOT_INO].i_size = MFS3_DIRSIZE * 2;
+	ino_buf[MFS_ROOT_INO].i_mtime = 0;
+	ino_buf[MFS_ROOT_INO].i_atime = 0;
+	ino_buf[MFS_ROOT_INO].i_ctime = 0;
+	ino_buf[MFS_ROOT_INO].i_nlinks = 2;
+	ino_buf[MFS_ROOT_INO].i_dzone[0] = sb->first_data_zone;
+
+	block_write_direct(sb->handle, itable_pos * (sb->block_size / MFS_MIN_BLOCKSIZE), 1, ino_buf);
+
+	free(ino_buf);
 }
 
@@ -271,8 +347,8 @@
 
 	/*Compute inode table size*/
-	unsigned long ninodes_blocks = sb->n_inodes / sb->ino_per_block;
+	sb->itable_size = sb->n_inodes / sb->ino_per_block;
 
 	/*Compute first data zone position*/
-	sb->first_data_zone = 2 + ninodes_blocks + 
+	sb->first_data_zone = 2 + sb->itable_size + 
 				sb->zbmap_blocks + sb->ibmap_blocks;
 
@@ -283,5 +359,7 @@
 	printf(NAME ": %d inodes\n", (uint32_t) sb->n_inodes);
 	printf(NAME ": %d zones\n", (uint32_t) sb->n_zones);
-	printf(NAME ": inode table blocks = %ld\n", ninodes_blocks);
+	printf(NAME ": inode table blocks = %ld\n", sb->itable_size);
+	printf(NAME ": inode bitmap blocks = %ld\n", sb->ibmap_blocks);
+	printf(NAME ": zone bitmap blocks = %ld\n", sb->zbmap_blocks);
 	printf(NAME ": first data zone = %d\n", (uint32_t) sb->first_data_zone);
 	printf(NAME ": long fnames = %s\n", sb->longnames ? "Yes" : "No");
@@ -320,9 +398,6 @@
 {
 	struct mfs3_superblock *sb;
-	uint8_t *superblock_buf;
-
-	superblock_buf = malloc(1024);
-
-	sb = (struct mfs3_superblock *) superblock_buf;
+
+	sb = (struct mfs3_superblock *) malloc(MFS_SUPERBLOCK_SIZE);
 
 	sb->s_ninodes = (uint32_t) sbi->n_inodes;
@@ -338,5 +413,5 @@
 
 	block_write_direct(sbi->handle, MFS_SUPERBLOCK, 1, sb);
-	free(superblock_buf);
+	free(sb);
 }
 
Index: uspace/lib/minix/minix.h
===================================================================
--- uspace/lib/minix/minix.h	(revision 59e670e8468803b4f3cc0aee63300ed07844912e)
+++ uspace/lib/minix/minix.h	(revision 410a06581bf1b0dc1b83bb99d1d5e77fb16f7977)
@@ -37,4 +37,7 @@
 
 #define MFS_BLOCKSIZE		1024
+#define S_ISDIR(m)		(((m) & S_IFMT) == S_IFDIR)
+#define S_IFDIR			0040000
+#define S_IFMT			00170000
 
 /*The following block sizes are valid only on V3 filesystem*/
@@ -55,4 +58,8 @@
 #define V2_INODES_PER_BLOCK	(MFS_BLOCKSIZE / sizeof(struct mfs2_inode))
 #define V3_INODES_PER_BLOCK(bs)	((bs) / sizeof(struct mfs2_inode))
+
+#define MFS_DIRSIZE		16
+#define MFSL_DIRSIZE		32
+#define MFS3_DIRSIZE		64
 
 #define MFS_MAX_NAME_LEN	14
