diff --git a/src/components/gltf-model-plus.js b/src/components/gltf-model-plus.js
index f51a2d9abe626ba9cfe7d9e05cea605e84bd480c..a2116b932398e691e22c7fc2aa96108de5567195 100644
--- a/src/components/gltf-model-plus.js
+++ b/src/components/gltf-model-plus.js
@@ -197,25 +197,28 @@ function getFilesFromSketchfabZip(src) {
 }
 
 function cachedLoadGLTF(src, basePath, contentType, preferredTechnique, onProgress) {
-  // Load the gltf model from the cache if it exists.
   if (!GLTFCache[src]) {
     GLTFCache[src] = new Promise(async (resolve, reject) => {
-      let gltfUrl = src;
-      let onLoad = resolve;
-      if (contentType === "model/gltf+zip") {
-        const fileMap = await getFilesFromSketchfabZip(src);
-        gltfUrl = fileMap["scene.gtlf"];
-        onLoad = model => {
-          // The GLTF is now cached as a THREE object, we can get rid of the original blobs
-          Object.keys(fileMap).forEach(URL.revokeObjectURL);
-          resolve(model);
-        };
-      }
+      try {
+        let gltfUrl = src;
+        let onLoad = resolve;
+        if (contentType === "model/gltf+zip") {
+          const fileMap = await getFilesFromSketchfabZip(src);
+          gltfUrl = fileMap["scene.gtlf"];
+          onLoad = model => {
+            // The GLTF is now cached as a THREE object, we can get rid of the original blobs
+            Object.keys(fileMap).forEach(URL.revokeObjectURL);
+            resolve(model);
+          };
+        }
 
-      const gltfLoader = new THREE.GLTFLoader();
-      gltfLoader.path = basePath;
-      gltfLoader.preferredTechnique = preferredTechnique;
-      gltfLoader.load(gltfUrl, onLoad, onProgress, reject);
+        const gltfLoader = new THREE.GLTFLoader();
+        gltfLoader.path = basePath;
+        gltfLoader.preferredTechnique = preferredTechnique;
+        gltfLoader.load(gltfUrl, onLoad, onProgress, reject);
+      } catch (e) {
+        reject(e);
+      }
     });
   }
   return GLTFCache[src].then(cloneGltf);
diff --git a/src/utils/media-utils.js b/src/utils/media-utils.js
index 112996db1208849474e490043784cfeff0479c12..7d699d172b74d8582741132bd2e28c44d2b4c959 100644
--- a/src/utils/media-utils.js
+++ b/src/utils/media-utils.js
@@ -18,7 +18,7 @@ export const resolveFarsparkUrl = async url => {
           headers: { "Content-Type": "application/json" },
           body: JSON.stringify({ media: { url } })
         }).then(r => r.json());
-  // farsparkCache.set(url, resolved);
+  farsparkCache.set(url, resolved);
   return resolved;
 };
 
diff --git a/src/workers/sketchfab-zip.worker.js b/src/workers/sketchfab-zip.worker.js
index 2ba952fb6c932b25da9514f9f298bbb97c9b9721..2bfadd0e1949d751ab029701a41e09bd69853035 100644
--- a/src/workers/sketchfab-zip.worker.js
+++ b/src/workers/sketchfab-zip.worker.js
@@ -6,13 +6,14 @@ async function fetchZipAndGetBlobs(src) {
     .then(JSZip.loadAsync);
 
   // Rewrite any url refferences in the GLTF to blob urls
+  const fileMap = {};
+  const files = Object.values(zip.files);
+  const fileBlobs = await Promise.all(files.map(f => f.async("blob")));
+  for (let i = 0; i < fileBlobs.length; i++) {
+    fileMap[files[i].name] = URL.createObjectURL(fileBlobs[i]);
+  }
+
   const gltfJson = JSON.parse(await zip.file("scene.gltf").async("text"));
-  const fileMap = await Object.values(zip.files).reduce(async (prev, file) => {
-    if (file.name === "scene.gltf") return prev;
-    const out = await prev;
-    out[file.name] = URL.createObjectURL(await file.async("blob"));
-    return out;
-  }, Promise.resolve({}));
   gltfJson.buffers && gltfJson.buffers.forEach(b => (b.uri = fileMap[b.uri]));
   gltfJson.images && gltfJson.images.forEach(i => (i.uri = fileMap[i.uri]));
 
@@ -26,6 +27,6 @@ self.onmessage = async e => {
     const fileMap = await fetchZipAndGetBlobs(e.data);
     self.postMessage([true, fileMap]);
   } catch (e) {
-    self.postMessage([false, e]);
+    self.postMessage([false, e.message]);
   }
 };