diff --git a/src/dir_export.c b/src/dir_export.c
index c73919750bea77f2aeef14a9ceec2e9dbfbe821c..eadccf77903b09e8c3b549a10bbd3eeb62e02898 100644
--- a/src/dir_export.c
+++ b/src/dir_export.c
@@ -75,6 +75,9 @@ static void output_int(uint64_t n) {
 
 
 static void output_info(struct dir *d, const char *name, struct dir_ext *e) {
+  if(!extended_info || !(d->flags & FF_EXT))
+    e = NULL;
+
   fputs("{\"name\":\"", stream);
   output_string(name);
   fputc('"', stream);
@@ -96,6 +99,17 @@ static void output_info(struct dir *d, const char *name, struct dir_ext *e) {
   fputs(",\"ino\":", stream);
   output_int(d->ino);
 
+  if(e) {
+    fputs(",\"uid\":", stream);
+    output_int(e->uid);
+    fputs(",\"gid\":", stream);
+    output_int(e->gid);
+    fputs(",\"mode\":", stream);
+    output_int(e->mode);
+    fputs(",\"mtime\":", stream);
+    output_int(e->mtime);
+  }
+
   /* TODO: Including the actual number of links would be nicer. */
   if(d->flags & FF_HLNKC)
     fputs(",\"hlnkc\":true", stream);
@@ -109,8 +123,6 @@ static void output_info(struct dir *d, const char *name, struct dir_ext *e) {
   else if(d->flags & FF_OTHFS)
     fputs(",\"excluded\":\"othfs\"", stream);
 
-  /* TODO: Output extended info if -e is given */
-
   fputc('}', stream);
 }
 
@@ -136,7 +148,7 @@ static int item(struct dir *item, const char *name, struct dir_ext *ext) {
   /* File header.
    * TODO: Add scan options? */
   if(!stack.top) {
-    fputs("[1,0,{\"progname\":\""PACKAGE"\",\"progver\":\""PACKAGE_VERSION"\",\"timestamp\":", stream);
+    fputs("[1,1,{\"progname\":\""PACKAGE"\",\"progver\":\""PACKAGE_VERSION"\",\"timestamp\":", stream);
     output_int((uint64_t)time(NULL));
     fputc('}', stream);
   }
diff --git a/src/dir_import.c b/src/dir_import.c
index 53b31f67286d80ff3c3e1e3d689f9b82ccec7015..31e9613b7a75bd049459a8c116237da7714fb41e 100644
--- a/src/dir_import.c
+++ b/src/dir_import.c
@@ -448,6 +448,22 @@ static int iteminfo() {
     } else if(strcmp(ctx->val, "ino") == 0) {        /* ino */
       C(rint64(&iv, UINT64_MAX));
       ctx->buf_dir->ino = iv;
+    } else if(strcmp(ctx->val, "uid") == 0) {        /* uid */
+      C(rint64(&iv, INT32_MAX));
+      ctx->buf_dir->flags |= FF_EXT;
+      ctx->buf_ext->uid = iv;
+    } else if(strcmp(ctx->val, "gid") == 0) {        /* gid */
+      C(rint64(&iv, INT32_MAX));
+      ctx->buf_dir->flags |= FF_EXT;
+      ctx->buf_ext->gid = iv;
+    } else if(strcmp(ctx->val, "mode") == 0) {       /* mode */
+      C(rint64(&iv, UINT16_MAX));
+      ctx->buf_dir->flags |= FF_EXT;
+      ctx->buf_ext->mode = iv;
+    } else if(strcmp(ctx->val, "mtime") == 0) {      /* mtime */
+      C(rint64(&iv, UINT64_MAX));
+      ctx->buf_dir->flags |= FF_EXT;
+      ctx->buf_ext->mtime = iv;
     } else if(strcmp(ctx->val, "hlnkc") == 0) {      /* hlnkc */
       if(*ctx->buf == 't') {
         C(rlit("true", 4));
diff --git a/src/dir_scan.c b/src/dir_scan.c
index b0f0b1ddbeecfc6c852852147993f9c8a619052a..4b7b1743a38de07afbefb3a2f98f5c080f6be850 100644
--- a/src/dir_scan.c
+++ b/src/dir_scan.c
@@ -75,7 +75,7 @@ static void stat_to_dir(struct stat *fs) {
   }
 
   buf_ext->mode  = fs->st_mode;
-  buf_ext->mtime = fs->st_mtim;
+  buf_ext->mtime = fs->st_mtime;
   buf_ext->uid   = (int)fs->st_uid;
   buf_ext->gid   = (int)fs->st_gid;
 }
diff --git a/src/global.h b/src/global.h
index b998ef4d6592386fb8aa8fe821c14326f958bc4b..92b6eb71d70bf4be64fcfc999eb030b68312adf9 100644
--- a/src/global.h
+++ b/src/global.h
@@ -85,7 +85,7 @@ struct dir {
  * memory region as struct dir, placed after the name field. See util.h for
  * macros to help manage this. */
 struct dir_ext {
-  struct timespec mtime;
+  uint64_t mtime;
   int uid, gid;
   unsigned short mode;
 };