diff --git a/package.json b/package.json
index 0d9ed6b57e38dc448a3da828e3acb5cc24a33035..9d59019056feb5ed76502c4332748f2530f593bb 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
     "@fortawesome/fontawesome-free-solid": "^5.0.9",
     "@fortawesome/react-fontawesome": "^0.0.18",
     "aframe-billboard-component": "^1.0.0",
-    "aframe-extras": "^4.0.0",
+    "aframe-extras": "https://github.com/MozillaReality/aframe-extras#feature/precompute-nav-mesh",
     "aframe-input-mapping-component": "https://github.com/johnshaughnessy/aframe-input-mapping-component#feature/map-to-array",
     "aframe-physics-extras": "https://github.com/infinitelee/aframe-physics-extras#fix/physics-collider-crash",
     "aframe-physics-system": "https://github.com/infinitelee/aframe-physics-system#feature/shape-component",
diff --git a/src/components/gltf-model-plus.js b/src/components/gltf-model-plus.js
index 41b6b50200ad273fdc5729866a9809245c3c23ff..be581a9a5b61ae13b81430841b43008b3e1865f6 100644
--- a/src/components/gltf-model-plus.js
+++ b/src/components/gltf-model-plus.js
@@ -1,7 +1,7 @@
 const GLTFCache = {};
 
 AFRAME.GLTFModelPlus = {
-  defaultInflator(el, componentName, componentData) {
+  defaultInflator(el, componentName, componentData, gltfPath) {
     if (!AFRAME.components[componentName]) {
       throw new Error(`Inflator failed. "${componentName}" component does not exist.`);
     }
@@ -73,7 +73,7 @@ function cloneGltf(gltf) {
   return clone;
 }
 
-const inflateEntities = function(parentEl, node) {
+const inflateEntities = function(parentEl, node, gltfPath) {
   // setObject3D mutates the node's parent, so we have to copy
   const children = node.children.slice(0);
 
@@ -131,14 +131,14 @@ const inflateEntities = function(parentEl, node) {
         const { inflator, componentName } = AFRAME.GLTFModelPlus.components[prop];
 
         if (inflator) {
-          inflator(el, componentName, entityComponents[prop]);
+          inflator(el, componentName, entityComponents[prop], gltfPath);
         }
       }
     }
   }
 
   children.forEach(childNode => {
-    inflateEntities(el, childNode);
+    inflateEntities(el, childNode, gltfPath);
   });
 
   return el;
@@ -223,18 +223,7 @@ AFRAME.registerComponent("gltf-model-plus", {
       // If the src attribute is a selector, get the url from the asset item.
       if (src && src.charAt(0) === "#") {
         const assetEl = document.getElementById(src.substring(1));
-
-        const fallbackSrc = assetEl.getAttribute("src");
-        const highSrc = assetEl.getAttribute("high-src");
-        const lowSrc = assetEl.getAttribute("low-src");
-
-        if (highSrc && window.APP.quality === "high") {
-          src = highSrc;
-        } else if (lowSrc && window.APP.quality === "low") {
-          src = lowSrc;
-        } else {
-          src = fallbackSrc;
-        }
+        src = assetEl.getAttribute("src");
       }
 
       if (src === this.lastSrc) return;
@@ -248,6 +237,7 @@ AFRAME.registerComponent("gltf-model-plus", {
         return;
       }
 
+      const gltfPath = THREE.LoaderUtils.extractUrlBase(src);
       const model = await cachedLoadGLTF(src, this.data.preferredTechnique);
 
       // If we started loading something else already
@@ -263,7 +253,7 @@ AFRAME.registerComponent("gltf-model-plus", {
       this.el.setObject3D("mesh", this.model);
 
       if (this.data.inflate) {
-        this.inflatedEl = inflateEntities(this.el, this.model);
+        this.inflatedEl = inflateEntities(this.el, this.model, gltfPath);
         // TODO: Still don't fully understand the lifecycle here and how it differs between browsers, we should dig in more
         // Wait one tick for the appended custom elements to be connected before attaching templates
         await nextTick();
diff --git a/src/gltf-component-mappings.js b/src/gltf-component-mappings.js
index 2166e7a62a186c9caa1ce3da8f39b5cafa4fff31..e2177fb25a1025ad56e9b135626b3abca64b1d97 100644
--- a/src/gltf-component-mappings.js
+++ b/src/gltf-component-mappings.js
@@ -1,7 +1,14 @@
 import "./components/gltf-model-plus";
+import { resolveURL } from "./utils/resolveURL";
 
 AFRAME.GLTFModelPlus.registerComponent("scale-audio-feedback", "scale-audio-feedback");
 AFRAME.GLTFModelPlus.registerComponent("loop-animation", "loop-animation");
 AFRAME.GLTFModelPlus.registerComponent("shape", "shape");
 AFRAME.GLTFModelPlus.registerComponent("visible", "visible");
-AFRAME.GLTFModelPlus.registerComponent("nav-mesh", "nav-mesh");
+AFRAME.GLTFModelPlus.registerComponent("nav-mesh", "nav-mesh", (el, componentName, componentData, gltfPath) => {
+  if (componentData.src) {
+    componentData.src = resolveURL(componentData.src, gltfPath);
+  }
+
+  el.setAttribute(componentName, componentData);
+});
diff --git a/src/utils/resolveURL.js b/src/utils/resolveURL.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddc6c86803b9adc7ea028b2b127ae0783270f521
--- /dev/null
+++ b/src/utils/resolveURL.js
@@ -0,0 +1,17 @@
+// From THREE.GLTFLoader https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/GLTFLoader.js#L1117
+export function resolveURL(url, path) {
+  // Invalid URL
+  if (typeof url !== "string" || url === "") return "";
+
+  // Absolute URL http://,https://,//
+  if (/^(https?:)?\/\//i.test(url)) return url;
+
+  // Data URI
+  if (/^data:.*,.*$/i.test(url)) return url;
+
+  // Blob URL
+  if (/^blob:.*$/i.test(url)) return url;
+
+  // Relative URL
+  return path + url;
+}
diff --git a/yarn.lock b/yarn.lock
index 6ae1ce2d8e2b6fb237724d975e27a2145a189ca7..ed95874754ff7a710d0ad19cd2ec5b40657265e8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -160,9 +160,9 @@ aframe-billboard-component@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/aframe-billboard-component/-/aframe-billboard-component-1.0.0.tgz#10ce2482729eef7386c5844d65917581a62d3adc"
 
-aframe-extras@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/aframe-extras/-/aframe-extras-4.0.0.tgz#fc851e2a1312c30a4d4addc3e0fa2dbf3e723ead"
+"aframe-extras@https://github.com/MozillaReality/aframe-extras#feature/precompute-nav-mesh":
+  version "4.0.2"
+  resolved "https://github.com/MozillaReality/aframe-extras#c4451b03ca0fe39a5517f81b153b3f801ccaa711"
   dependencies:
     three-pathfinding "^0.5.5"