Index: uspace/srv/fs/fat/fat_ops.c
===================================================================
--- uspace/srv/fs/fat/fat_ops.c	(revision b7b675307e0a41ee1e8b50270215df7dabd37b8a)
+++ uspace/srv/fs/fat/fat_ops.c	(revision 8605b2460db563ede1a7f79ca788696aba77bbf3)
@@ -113,9 +113,14 @@
 
 #define FAT_CLST_RES0	0x0000
-#define FAT_CLST_RES1	0x0001	/* internally used to mark root directory */
+#define FAT_CLST_RES1	0x0001
 #define FAT_CLST_FIRST	0x0002
 #define FAT_CLST_BAD	0xfff7
 #define FAT_CLST_LAST1	0xfff8
 #define FAT_CLST_LAST8  0xffff
+
+/* internally used to mark root directory's parent */
+#define FAT_CLST_ROOTPAR	FAT_CLST_RES0
+/* internally used to mark root directory */
+#define FAT_CLST_ROOT		FAT_CLST_RES1
 
 #define fat_block_get(np, off) \
@@ -152,5 +157,5 @@
 	ssa = rscnt + fatcnt * sf + rds;
 
-	if (firstc == FAT_CLST_RES1) {
+	if (firstc == FAT_CLST_ROOT) {
 		/* root directory special case */
 		assert(offset < rds);
@@ -522,5 +527,5 @@
 static void *fat_root_get(dev_handle_t dev_handle)
 {
-	return NULL;	/* TODO */
+	return fat_node_get(dev_handle, 0);
 }
 
@@ -562,5 +567,12 @@
 {
 	dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
+	block_t *bb;
+	uint16_t rde;
 	int rc;
+
+	/* Read the number of root directory entries. */
+	bb = block_get(dev_handle, BS_BLOCK);
+	rde = uint16_t_le2host(FAT_BS(bb)->root_ent_max);
+	block_put(bb);
 
 	rc = fat_idx_init_by_dev_handle(dev_handle);
@@ -570,4 +582,32 @@
 	}
 
+	/* Initialize the root node. */
+	fat_node_t *rootp = (fat_node_t *)malloc(sizeof(fat_node_t));
+	if (!rootp) {
+		fat_idx_fini_by_dev_handle(dev_handle);
+		ipc_answer_0(rid, ENOMEM);
+		return;
+	}
+	fat_node_initialize(rootp);
+
+	fat_idx_t *ridxp = fat_idx_get_by_pos(dev_handle, FAT_CLST_ROOTPAR, 0);
+	if (!ridxp) {
+		free(rootp);
+		fat_idx_fini_by_dev_handle(dev_handle);
+		ipc_answer_0(rid, ENOMEM);
+		return;
+	}
+	assert(ridxp->index == 0);
+	/* ridxp->lock held */
+
+	rootp->type = FAT_DIRECTORY;
+	rootp->firstc = FAT_CLST_ROOT;
+	rootp->refcnt = 1;
+	rootp->size = rde * sizeof(fat_dentry_t);
+	rootp->idx = ridxp;
+	ridxp->nodep = rootp;
+	
+	futex_up(&ridxp->lock);
+
 	ipc_answer_0(rid, EOK);
 }
