diff --git a/package.json b/package.json
index 91d6afcaa90cb55570054b8592b67719a0d9742e..16cb3510f746fba6b10af1bff7ca8dcc65f22709 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
     "react-intl": "^2.4.0",
     "react-router-dom": "^4.2.2",
     "screenfull": "^3.3.2",
-    "super-hands": "https://github.com/infinitelee/aframe-super-hands-component#mr-social-client/master",
+    "super-hands": "https://github.com/mozillareality/aframe-super-hands-component#hubs/master",
     "uuid": "^3.2.1",
     "webrtc-adapter": "^6.0.2"
   },
diff --git a/src/assets/stylesheets/hub.scss b/src/assets/stylesheets/hub.scss
index dd69bc88ab5e30c2022269a128f1f910171a6673..d9519c92fcc0b05dae6916bcf1b06f087c0e14d2 100644
--- a/src/assets/stylesheets/hub.scss
+++ b/src/assets/stylesheets/hub.scss
@@ -8,7 +8,7 @@
 @import 'audio';
 @import 'info-dialog';
 
-.a-enter-vr {
+.a-enter-vr, .a-orientation-modal {
   display: none;
 }
 
diff --git a/src/components/hand-controls2.js b/src/components/hand-controls2.js
index e8aca3e7c9f99d5517498ad63b9bc9f8e637c158..d99d5fc063d9a2c487c60490616b959b79c297ea 100644
--- a/src/components/hand-controls2.js
+++ b/src/components/hand-controls2.js
@@ -13,6 +13,7 @@ const POSES = {
 export const CONTROLLER_OFFSETS = {
   default: new THREE.Matrix4(),
   "oculus-touch-controls": new THREE.Matrix4().makeTranslation(0, -0.015, 0.04),
+  "oculus-go-controls": new THREE.Matrix4(),
   "vive-controls": new THREE.Matrix4().compose(
     new THREE.Vector3(0, -0.017, 0.13),
     new THREE.Quaternion().setFromEuler(new THREE.Euler(-40 * THREE.Math.DEG2RAD, 0, 0)),
@@ -109,12 +110,14 @@ AFRAME.registerComponent("hand-controls2", {
 
     const controlConfiguration = {
       hand: hand,
-      model: false
+      model: false,
+      orientationOffset: { x: 0, y: 0, z: 0 }
     };
 
     if (hand !== prevData) {
       el.setAttribute("vive-controls", controlConfiguration);
       el.setAttribute("oculus-touch-controls", controlConfiguration);
+      el.setAttribute("oculus-go-controls", controlConfiguration);
       el.setAttribute("windows-motion-controls", controlConfiguration);
       el.setAttribute("daydream-controls", controlConfiguration);
       el.setAttribute("gearvr-controls", controlConfiguration);
diff --git a/src/components/hud-controller.js b/src/components/hud-controller.js
index d2439b3765d0272ae5b113fa174b1738ab213c2b..67f9c4616285d38efe31e84e63475879463d84fb 100644
--- a/src/components/hud-controller.js
+++ b/src/components/hud-controller.js
@@ -21,6 +21,8 @@ AFRAME.registerComponent("hud-controller", {
   init() {
     this.isYLocked = false;
     this.lockedHeadPositionY = 0;
+    this.lookDir = new THREE.Vector3();
+    this.lookEuler = new THREE.Euler();
   },
 
   pause() {
@@ -62,12 +64,14 @@ AFRAME.registerComponent("hud-controller", {
     // Reorient the hud only if the user is looking away from the hud, for right now this arbitrarily means the hud is 1/2 way animated away
     // TODO: come up with better huristics for this that maybe account for the user turning away from the hud "too far", also animate the position so that it doesnt just snap.
     if (yawDif >= yawCutoff || pitch < lookCutoff - animRange / 2) {
-      const lookDir = new THREE.Vector3(0, 0, -1);
-      lookDir.applyQuaternion(head.quaternion);
-      lookDir.add(head.position);
-      hud.position.x = lookDir.x;
-      hud.position.z = lookDir.z;
-      hud.setRotationFromEuler(new THREE.Euler(0, head.rotation.y, 0));
+      this.lookDir.set(0, 0, -1);
+      this.lookDir.applyQuaternion(head.quaternion);
+      this.lookDir.add(head.position);
+      hud.position.x = this.lookDir.x;
+      hud.position.z = this.lookDir.z;
+      hud.rotation.copy(head.rotation);
+      hud.rotation.x = 0;
+      hud.rotation.z = 0;
     }
     hud.position.y = (this.isYLocked ? this.lockedHeadPositionY : head.position.y) + offset + (1 - t) * offset;
     hud.rotation.x = (1 - t) * THREE.Math.DEG2RAD * 90;
diff --git a/src/components/offset-relative-to.js b/src/components/offset-relative-to.js
index f940b687284b34677c579e931557fc9671631f41..39361022488971c5b41a160520594020d81f36ac 100644
--- a/src/components/offset-relative-to.js
+++ b/src/components/offset-relative-to.js
@@ -18,12 +18,6 @@ AFRAME.registerComponent("offset-relative-to", {
     const offsetVector = new THREE.Vector3().copy(this.data.offset);
     this.data.target.object3D.localToWorld(offsetVector);
     this.el.setAttribute("position", offsetVector);
-
-    const headWorldRotation = this.data.target.object3D.getWorldRotation();
-    this.el.setAttribute("rotation", {
-      x: headWorldRotation.x * THREE.Math.RAD2DEG,
-      y: headWorldRotation.y * THREE.Math.RAD2DEG,
-      z: headWorldRotation.z * THREE.Math.RAD2DEG
-    });
+    this.data.target.object3D.getWorldQuaternion(this.el.object3D.quaternion);
   }
 });
diff --git a/src/components/virtual-gamepad-controls.js b/src/components/virtual-gamepad-controls.js
index 87433f427c00fc64054405e5efea91f841dc579a..5b45d07cbb197ae144f0450b31b7e29078c368f1 100644
--- a/src/components/virtual-gamepad-controls.js
+++ b/src/components/virtual-gamepad-controls.js
@@ -143,6 +143,7 @@ AFRAME.registerComponent("virtual-gamepad-controls", {
   remove() {
     this.el.sceneEl.removeEventListener("entervr", this.onEnterVr);
     this.el.sceneEl.removeEventListener("exitvr", this.onExitVr);
+    document.body.removeChild(this.mockJoystickContainer);
     document.body.removeChild(this.leftTouchZone);
     document.body.removeChild(this.rightTouchZone);
   }
diff --git a/src/hub.html b/src/hub.html
index f2cd67d65ffe7f83ef04edb970538fc40f8d1e71..40c79888a0d96e89106558619b21162e2b25b4f1 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -28,12 +28,14 @@
     </audio>
 
     <a-scene
+        renderer="antialias: true"
         networked-scene="adapter: janus; audio: true; debug: true; connectOnLoad: false;"
         physics="gravity: -6;"
         mute-mic="eventSrc: a-scene; toggleEvents: action_mute"
         freeze-controller="toggleEvent: action_freeze"
         personal-space-bubble="debug: false;"
-        >
+        vr-mode-ui="enabled: false"
+    >
 
         <a-assets>
             <img id="tooltip"  src="./assets/hud/tooltip.9.png" >
diff --git a/src/hub.js b/src/hub.js
index daa2849a300693d7be49714d4c4e34150ef156f3..6fc06c28a17e2d9682fc0fc51d49ee7855d0fb4a 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -109,7 +109,7 @@ import { inGameActions, config as inputConfig } from "./input-mappings";
 import registerTelemetry from "./telemetry";
 
 import { generateDefaultProfile, generateRandomName } from "./utils/identity.js";
-import { getAvailableVREntryTypes } from "./utils/vr-caps-detect.js";
+import { getAvailableVREntryTypes, VR_DEVICE_AVAILABILITY } from "./utils/vr-caps-detect.js";
 import ConcurrentLoadDetector from "./utils/concurrent-load-detector.js";
 
 function qsTruthy(param) {
@@ -335,7 +335,11 @@ const onReady = async () => {
   }
 
   getAvailableVREntryTypes().then(availableVREntryTypes => {
-    remountUI({ availableVREntryTypes });
+    if (availableVREntryTypes.gearvr === VR_DEVICE_AVAILABILITY.yes) {
+      remountUI({ availableVREntryTypes, forcedVREntryType: "gearvr" });
+    } else {
+      remountUI({ availableVREntryTypes });
+    }
   });
 
   const environmentRoot = document.querySelector("#environment-root");
diff --git a/src/input-mappings.js b/src/input-mappings.js
index f9985498157ac70bec292eacfe241dfbb5927355..5413bbac75868938b92986d40c2e2aa21f0effb2 100644
--- a/src/input-mappings.js
+++ b/src/input-mappings.js
@@ -34,6 +34,9 @@ const config = {
       },
       "gearvr-controls": {
         trackpad: "trackpad_dpad4"
+      },
+      "oculus-go-controls": {
+        trackpad: "trackpad_dpad4"
       }
     }
   },
@@ -77,8 +80,8 @@ const config = {
         surfacetouchend: "thumb_up",
         thumbsticktouchstart: "thumb_down",
         thumbsticktouchend: "thumb_up",
-        triggerdown: ["action_primary_down", "action_grab", "index_down"],
-        triggerup: ["action_primary_up", "action_release", "index_up"],
+        triggerdown: ["action_grab", "index_down"],
+        triggerup: ["action_release", "index_up"],
         "axismove.reverseY": { left: "move" },
         abuttondown: "action_primary_down",
         abuttonup: "action_primary_up"
@@ -123,6 +126,16 @@ const config = {
         triggerdown: ["action_primary_down"],
         triggerup: ["action_primary_up"]
       },
+      "oculus-go-controls": {
+        trackpad_dpad4_pressed_west_down: "snap_rotate_left",
+        trackpad_dpad4_pressed_east_down: "snap_rotate_right",
+        trackpad_dpad4_pressed_center_down: ["action_primary_down"],
+        trackpad_dpad4_pressed_north_down: ["action_primary_down"],
+        trackpad_dpad4_pressed_south_down: ["action_primary_down"],
+        trackpadup: ["action_primary_up"],
+        triggerdown: ["action_primary_down"],
+        triggerup: ["action_primary_up"]
+      },
       keyboard: {
         m_press: "action_mute",
         q_press: "snap_rotate_left",
@@ -182,6 +195,10 @@ const config = {
       "gearvr-controls": {
         trackpaddown: { right: "action_ui_select_down" },
         trackpadup: { right: "action_ui_select_up" }
+      },
+      "oculus-go-controls": {
+        trackpaddown: { right: "action_ui_select_down" },
+        trackpadup: { right: "action_ui_select_up" }
       }
     }
   }
diff --git a/src/systems/exit-on-blur.js b/src/systems/exit-on-blur.js
index ae4c9c00a6cb9d979e9df025ec28bf0c28e1002e..c6820a4016cbd3440bab91997e19741b006b6b29 100644
--- a/src/systems/exit-on-blur.js
+++ b/src/systems/exit-on-blur.js
@@ -2,18 +2,39 @@ AFRAME.registerSystem("exit-on-blur", {
   init() {
     this.onBlur = this.onBlur.bind(this);
     this.onFocus = this.onFocus.bind(this);
+    this.onTimeout = this.onTimeout.bind(this);
+    this.onEnterVR = this.onEnterVR.bind(this);
+
+    this.isOculusBrowser = navigator.userAgent.match(/Oculus/);
+    this.enteredVR = false;
 
     window.addEventListener("blur", this.onBlur);
     window.addEventListener("focus", this.onFocus);
+    this.el.addEventListener("enter-vr", this.onEnterVR);
 
     this.exitTimeout = null;
   },
 
+  tick() {
+    // This is a hack to detect when an Oculus Go user has taken off the headset and the headset has
+    // entered standby mode. Currently Oculus Browser is not emitting a blur, vrdisplaydeactivate,
+    // vrdisplayblur, visibilitychange, or vrdisplaypresentchange event, so we wait 15 seconds after
+    // the last requestAnimationFrame callback to determine if the headset has gone into standby mode.
+    // We also check that you have entered VR so that this timeout does not occur in the setup UI.
+    if (this.isOculusBrowser && this.enteredVR) {
+      clearTimeout(this.exitTimeout);
+      this.exitTimeout = setTimeout(this.onTimeout, 15 * 1000);
+    }
+  },
+
+  onEnterVR() {
+    this.enteredVR = true;
+  },
+
   onBlur() {
     if (this.el.isMobile) {
-      this.exitTimeout = setTimeout(() => {
-        this.el.dispatchEvent(new CustomEvent("exit"));
-      }, 30 * 1000);
+      clearTimeout(this.exitTimeout);
+      this.exitTimeout = setTimeout(this.onTimeout, 30 * 1000);
     }
   },
 
@@ -23,6 +44,10 @@ AFRAME.registerSystem("exit-on-blur", {
     }
   },
 
+  onTimeout() {
+    this.el.dispatchEvent(new CustomEvent("exit"));
+  },
+
   remove() {
     clearTimeout(this.exitTimeout);
     window.removeEventListener("blur", this.onBlur);
diff --git a/yarn.lock b/yarn.lock
index 1870294edb1ff4ced007f90eb5a2145b788b0ce9..e02de0e3740390d0cded16bbe216c82af9372883 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7751,9 +7751,9 @@ subarg@^1.0.0:
   dependencies:
     minimist "^1.1.0"
 
-"super-hands@https://github.com/infinitelee/aframe-super-hands-component#mr-social-client/master":
+"super-hands@https://github.com/mozillareality/aframe-super-hands-component#hubs/master":
   version "2.1.0"
-  resolved "https://github.com/infinitelee/aframe-super-hands-component#e4d91f4b9bc91a57f35aa9d43f3e797ebfc5477d"
+  resolved "https://github.com/mozillareality/aframe-super-hands-component#579024a260f8b9821cf1cbabd403055116bc2eb9"
 
 supports-color@1.3.1:
   version "1.3.1"