diff --git a/src/components/character-controller.js b/src/components/character-controller.js
index 174148d9c0109bde06e52f4cd68a89c798331208..2b86ff0a353b406d073238c8aca664197ff7084d 100644
--- a/src/components/character-controller.js
+++ b/src/components/character-controller.js
@@ -184,7 +184,15 @@ AFRAME.registerComponent("character-controller", {
       velocity.y -= velocity.y * data.easing * dt;
     }
 
-    // Clamp velocity easing.
+    const dvx = data.groundAcc * dt * this.accelerationInput.x;
+    const dvz = data.groundAcc * dt * -this.accelerationInput.z;
+    velocity.x += dvx;
+    velocity.z += dvz;
+
+    const decay = 0.7;
+    this.accelerationInput.x = this.accelerationInput.x * decay;
+    this.accelerationInput.z = this.accelerationInput.z * decay;
+
     if (Math.abs(velocity.x) < CLAMP_VELOCITY) {
       velocity.x = 0;
     }
@@ -194,14 +202,5 @@ AFRAME.registerComponent("character-controller", {
     if (Math.abs(velocity.z) < CLAMP_VELOCITY) {
       velocity.z = 0;
     }
-
-    const dvx = data.groundAcc * dt * this.accelerationInput.x;
-    const dvz = data.groundAcc * dt * -this.accelerationInput.z;
-    velocity.x += dvx;
-    velocity.z += dvz;
-
-    const decay = 0.7;
-    this.accelerationInput.x = this.accelerationInput.x * decay;
-    this.accelerationInput.z = this.accelerationInput.z * decay;
   }
 });
diff --git a/src/network-schemas.js b/src/network-schemas.js
index d30176a299f5ff7fd5336509454910325c116e58..9e20a17ca68bf2d669fbeb68d78f665c94de2ed9 100644
--- a/src/network-schemas.js
+++ b/src/network-schemas.js
@@ -1,30 +1,46 @@
 function registerNetworkSchemas() {
+  const positionRequiresUpdate = (oldData, newData) => {
+    return !NAF.utils.almostEqualVec3(oldData, newData, 0.001);
+  };
+
+  const rotationRequiresUpdate = (oldData, newData) => {
+    return !NAF.utils.almostEqualVec3(oldData, newData, 0.5);
+  };
+
   NAF.schemas.add({
     template: "#remote-avatar-template",
     components: [
-      "position",
+      {
+        component: "position",
+        requiresNetworkUpdate: positionRequiresUpdate
+      },
       {
         component: "rotation",
-        lerp: false
+        lerp: false,
+        requiresNetworkUpdate: rotationRequiresUpdate
       },
       "scale",
       "player-info",
       "networked-avatar",
       {
         selector: ".camera",
-        component: "position"
+        component: "position",
+        requiresNetworkUpdate: positionRequiresUpdate
       },
       {
         selector: ".camera",
-        component: "rotation"
+        component: "rotation",
+        requiresNetworkUpdate: rotationRequiresUpdate
       },
       {
         selector: ".left-controller",
-        component: "position"
+        component: "position",
+        requiresNetworkUpdate: positionRequiresUpdate
       },
       {
         selector: ".left-controller",
-        component: "rotation"
+        component: "rotation",
+        requiresNetworkUpdate: rotationRequiresUpdate
       },
       {
         selector: ".left-controller",
@@ -32,11 +48,13 @@ function registerNetworkSchemas() {
       },
       {
         selector: ".right-controller",
-        component: "position"
+        component: "position",
+        requiresNetworkUpdate: positionRequiresUpdate
       },
       {
         selector: ".right-controller",
-        component: "rotation"
+        component: "rotation",
+        requiresNetworkUpdate: rotationRequiresUpdate
       },
       {
         selector: ".right-controller",
@@ -47,12 +65,30 @@ function registerNetworkSchemas() {
 
   NAF.schemas.add({
     template: "#video-template",
-    components: ["position", "rotation", "visible"]
+    components: [
+      {
+        component: "position"
+      },
+      {
+        component: "rotation"
+      },
+      "visible"
+    ]
   });
 
   NAF.schemas.add({
     template: "#interactable-template",
-    components: ["position", "rotation", "scale"]
+    components: [
+      {
+        component: "position",
+        requiresNetworkUpdate: positionRequiresUpdate
+      },
+      {
+        component: "rotation",
+        requiresNetworkUpdate: rotationRequiresUpdate
+      },
+      "scale"
+    ]
   });
 }
 
diff --git a/yarn.lock b/yarn.lock
index cc1b5ae12aacde99c092845e4ad4a16764c33b83..9f1d228ef4b5405d6abb35b06f0d53511d37171d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2016,8 +2016,8 @@ colormin@^1.0.5:
     has "^1.0.1"
 
 colors@*:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.3.tgz#1b152a9c4f6c9f74bc4bb96233ad0b7983b79744"
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc"
 
 colors@1.0.3:
   version "1.0.3"
@@ -5452,7 +5452,7 @@ neo-async@^2.5.0:
 
 "networked-aframe@https://github.com/mozillareality/networked-aframe#mr-social-client/master":
   version "0.6.1"
-  resolved "https://github.com/mozillareality/networked-aframe#641b5e44b8514d02925e3efb4289ca36a41c1006"
+  resolved "https://github.com/mozillareality/networked-aframe#424b41cfdf53db64033885da411c33685644db97"
   dependencies:
     easyrtc "1.1.0"
     express "^4.10.7"