diff --git a/src/components/character-controller.js b/src/components/character-controller.js
index 2b86ff0a353b406d073238c8aca664197ff7084d..7b2145a4a65341dac2b1f9cb93d928a339650a72 100644
--- a/src/components/character-controller.js
+++ b/src/components/character-controller.js
@@ -75,7 +75,9 @@ AFRAME.registerComponent("character-controller", {
   },
 
   handleTeleport: function(event) {
-    this.setPositionOnNavMesh(event.detail.oldPosition, event.detail.newPosition, this.el.object3D, true);
+    const position = event.detail.newPosition;
+    const navPosition = event.detail.hitPoint;
+    this.resetPositionOnNavMesh(position, navPosition, this.el.object3D);
   },
 
   tick: (function() {
@@ -147,21 +149,26 @@ AFRAME.registerComponent("character-controller", {
     };
   })(),
 
-  setPositionOnNavMesh: function(startPosition, endPosition, object3D, resetPosition = false) {
+  setPositionOnNavMesh: function(startPosition, endPosition, object3D) {
     const nav = this.el.sceneEl.systems.nav;
     if (nav.navMesh) {
-      if (!this.navGroup || resetPosition) {
+      if (!this.navGroup) {
         this.navGroup = nav.getGroup(endPosition);
       }
-
-      if (!this.navNode || resetPosition) {
-        this.navNode = nav.getNode(endPosition, this.navGroup) || this.navNode;
-      }
-
+      this.navNode = this.navNode || nav.getNode(endPosition, this.navGroup);
       this.navNode = nav.clampStep(startPosition, endPosition, this.navGroup, this.navNode, object3D.position);
     }
   },
 
+  resetPositionOnNavMesh: function(position, navPosition, object3D) {
+    const nav = this.el.sceneEl.systems.nav;
+    if (nav.navMesh) {
+      this.navGroup = nav.getGroup(position);
+      this.navNode = nav.getNode(navPosition, this.navGroup) || this.navNode;
+      this.navNode = nav.clampStep(position, position, this.navGroup, this.navNode, object3D.position);
+    }
+  },
+
   updateVelocity: function(dt) {
     const data = this.data;
     const velocity = this.velocity;