diff --git a/package.json b/package.json
index 2d4901d3943dd6a8d752ced976608016fe96ce45..ba711d11f86b83de502735e3c0267ca4475c0c70 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
   },
   "dependencies": {
     "aframe-billboard-component": "^1.0.0",
-    "aframe-extras": "^3.12.4",
+    "aframe-extras": "^4.0.0",
     "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/donmccurdy/aframe-physics-system",
diff --git a/src/assets/environments/FloorNav_mesh.glb b/src/assets/environments/FloorNav_mesh.glb
index ce12d15b22618becf0f6bab06ed466ea79e968c6..0ee9f5067c1492feb2ccb45d8f757bd28a9096c5 100644
Binary files a/src/assets/environments/FloorNav_mesh.glb and b/src/assets/environments/FloorNav_mesh.glb differ
diff --git a/src/components/character-controller.js b/src/components/character-controller.js
index 8aaa2240a24bf169bd72f6e957f54031f436e7eb..6c588daa4c61108e7e503a5980d512a1619d72c4 100644
--- a/src/components/character-controller.js
+++ b/src/components/character-controller.js
@@ -1,5 +1,6 @@
 const CLAMP_VELOCITY = 0.01;
 const MAX_DELTA = 0.2;
+const EPS = 10e-6;
 
 // Does not have any type of collisions yet.
 AFRAME.registerComponent("character-controller", {
@@ -74,6 +75,8 @@ AFRAME.registerComponent("character-controller", {
     const position = new THREE.Vector3();
     const currentPosition = new THREE.Vector3();
     const movementVector = new THREE.Vector3();
+    const end = new THREE.Vector3();
+    const clampedEnd = new THREE.Vector3();
 
     return function(t, dt) {
       const deltaSeconds = dt / 1000;
@@ -120,9 +123,23 @@ AFRAME.registerComponent("character-controller", {
         z: root.rotation.z * THREE.Math.RAD2DEG
       });
 
-      this.el.setAttribute("position", root.position);
-
       this.pendingSnapRotationMatrix.identity(); // Revert to identity
+
+      //copied from aframe-extras movement-controls
+      if (this.velocity.lengthSq() > EPS) {
+        let start = root.position;
+        end.copy(this.velocity).multiplyScalar(dt / 1000).add(start);
+        const nav = this.el.sceneEl.systems.nav;
+        this.navGroup = this.navGroup || nav.getGroup(start);
+        this.navNode = this.navNode || nav.getNode(start, this.navGroup);
+        this.navNode = nav.clampStep(start, end, this.navGroup, this.navNode, clampedEnd);
+        root.position.copy(clampedEnd);
+        root.position.x += this.velocity.x * dt / 1000;
+        root.position.y += this.velocity.y * dt / 1000;
+        root.z += this.velocity.z * dt / 1000;
+      } else {
+        this.el.setAttribute("position", root.position);
+      }
     };
   })(),
 
diff --git a/src/room.html b/src/room.html
index 52fd9ddd2a9ab2cdc4b54dba0f0093c55dee0d7f..ad4cd0e01c3e3bc50e50281b5e91395f5a5af9f6 100644
--- a/src/room.html
+++ b/src/room.html
@@ -126,7 +126,7 @@
             class="collidable" 
             class="collidable" 
             super-spawner="template: #interactable-template;" 
-            position="2.5 1.2 0" 
+            position="2.9 1.2 0" 
             body="mass: 0; type: static; shape: box;"
         ></a-entity>
 
@@ -168,7 +168,7 @@
                 class="left-controller"
                 hand-controls2="left"
                 tracked-controls
-                teleport-controls="cameraRig: #player-rig; teleportOrigin: #player-camera; button: action_teleport_"
+                teleport-controls="cameraRig: #player-rig; teleportOrigin: #player-camera; button: action_teleport_; collisionEntities: #floor-nav"
                 haptic-feedback
             ></a-entity>
 
@@ -177,7 +177,7 @@
                 class="right-controller"
                 hand-controls2="right"
                 tracked-controls
-                teleport-controls="cameraRig: #player-rig; teleportOrigin: #player-camera; button: action_teleport_"
+                teleport-controls="cameraRig: #player-rig; teleportOrigin: #player-camera; button: action_teleport_; collisionEntities: #floor-nav"
                 haptic-feedback
             ></a-entity>
 
@@ -252,6 +252,7 @@
 
         <a-gltf-entity
             id="floor-nav"
+            nav-mesh
             src="#floor-nav-mesh"
             visible="false"
             position="0 0 0"
diff --git a/src/room.js b/src/room.js
index b09ff896a09145e54bb76ea45f9f659606eaa022..f248dfaa0c0a03980d14b8dd6530a3eaaf5ba113 100644
--- a/src/room.js
+++ b/src/room.js
@@ -65,6 +65,7 @@ import "./elements/a-progressive-asset";
 
 import "aframe-physics-system";
 import "aframe-physics-extras";
+import "aframe-extras/src/pathfinding";
 import "super-hands";
 import "./components/super-networked-interactable";
 import "./components/networked-counter";
diff --git a/yarn.lock b/yarn.lock
index 7a0884a0ae0198f5d8f079ca59c2141f478966b8..83d077c76dead4deff857a2f331aeb0801285dca 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -131,12 +131,11 @@ 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@^3.12.4:
-  version "3.13.1"
-  resolved "https://registry.yarnpkg.com/aframe-extras/-/aframe-extras-3.13.1.tgz#f8b6ef18c29e92538d05d94913640942a307c46c"
+aframe-extras@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/aframe-extras/-/aframe-extras-4.0.0.tgz#fc851e2a1312c30a4d4addc3e0fa2dbf3e723ead"
   dependencies:
-    aframe-physics-system "^1.4.3"
-    three-pathfinding "^0.2.2"
+    three-pathfinding "^0.5.5"
 
 "aframe-input-mapping-component@https://github.com/johnshaughnessy/aframe-input-mapping-component#feature/map-to-array":
   version "0.1.2"
@@ -152,13 +151,6 @@ aframe-lerp-component@^1.1.0:
   version "0.1.2"
   resolved "https://github.com/infinitelee/aframe-physics-extras#49b2d5d3c0caac905783aee51d9e89dbdf7199b8"
 
-aframe-physics-system@^1.4.3:
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/aframe-physics-system/-/aframe-physics-system-1.4.3.tgz#c6927e847081bfe546658314aa4c04958ef27934"
-  dependencies:
-    cannon "github:donmccurdy/cannon.js#v0.6.2-dev1"
-    three-to-cannon "^1.1.1"
-
 "aframe-physics-system@https://github.com/donmccurdy/aframe-physics-system":
   version "3.0.1"
   resolved "https://github.com/donmccurdy/aframe-physics-system#08a98a4c3d77c4c38a1fa27067aa0d894447902e"
@@ -7576,11 +7568,11 @@ textextensions@2:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286"
 
-three-pathfinding@^0.2.2:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/three-pathfinding/-/three-pathfinding-0.2.3.tgz#469bb26fb6b331f536c9ec88fde78e9c9219f637"
+three-pathfinding@^0.5.5:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/three-pathfinding/-/three-pathfinding-0.5.5.tgz#ff05a8f8cfba343b3b07c05c25d11b0d161911f8"
 
-three-to-cannon@^1.1.1, three-to-cannon@^1.2.0:
+three-to-cannon@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/three-to-cannon/-/three-to-cannon-1.2.0.tgz#92b9a756a270851aa98c3058c51ef15891507c01"