wip
diff --git a/src/library_workerfs.js b/src/library_workerfs.js
index 9a30a14..e912769 100644
--- a/src/library_workerfs.js
+++ b/src/library_workerfs.js
@@ -8,12 +8,30 @@
       assert(ENVIRONMENT_IS_WORKER);
       if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync();
       var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0);
+      var createdParents = {};
+      function ensureParent(path) {
+        // return the parent node, creating subdirs as necessary
+        var parts = path.split('/');
+        var parent = root;
+        for (var i = 0; i < parts.length-1; i++) {
+          var curr = parts.slice(0, i+1).join('/');
+          if (!createdParents[curr]) {
+            createdParents[curr] = WORKERFS.createNode(parent, '/' + curr + '/', WORKERFS.DIR_MODE, 0, {});
+          }
+          parent = createdParents[curr];
+        }
+        return parent;
+      }
+      function base(path) {
+        var parts = path.split('/');
+        return parts[parts.length-1];
+      }
       // We also accept FileList here.
-      Array.prototype.forEach.call(mount.opts["files"] || [], function(file) {
-        WORKERFS.createNode(root, file.name, WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate);
+      (mount.opts["files"] || []).forEach(function(file) {
+        WORKERFS.createNode(ensureParent(file.name), base(file.name), WORKERFS.FILE_MODE, 0, file, file.lastModifiedDate);
       });
       (mount.opts["blobs"] || []).forEach(function(obj) {
-        WORKERFS.createNode(root, obj["name"], WORKERFS.FILE_MODE, 0, obj["data"]);
+        WORKERFS.createNode(ensureParent(obj["name"]), base(obj["name"]), WORKERFS.FILE_MODE, 0, obj["data"]);
       });
       return root;
     },
diff --git a/tests/fs/test_workerfs_package.cpp b/tests/fs/test_workerfs_package.cpp
index 4ffcc49..adfcb4e 100644
--- a/tests/fs/test_workerfs_package.cpp
+++ b/tests/fs/test_workerfs_package.cpp
@@ -20,16 +20,14 @@
   buffer[5] = 0;
   assert(strcmp(buffer, "first") == 0);
 
-/*
   printf("load second file\n");
   FILE *f2 = fopen("files/sub/file2.txt", "r");
   assert(f2);
   num = fread(buffer, 1, 6, f2);
-  assert(num == 5);
+  assert(num == 6);
   fclose(f2);
   buffer[6] = 0;
   assert(strcmp(buffer, "second") == 0);
-*/
 
   // all done
   printf("success\n");
@@ -54,6 +52,7 @@
       Module.print('loading into filesystem');
       meta = JSON.parse(meta);
       FS.mkdir('/files');
+      FS.mkdir('/files/sub');
       FS.mount(WORKERFS, {
         blobs: meta.files.map(function(file) {
           return { name: file.filename.substr(1), data: data.slice(file.start, file.end) };