diff --git a/interface/resources/controllers/oculus_touch.json b/interface/resources/controllers/oculus_touch.json
index cc8c2f8bdc..b59bf54e5b 100644
--- a/interface/resources/controllers/oculus_touch.json
+++ b/interface/resources/controllers/oculus_touch.json
@@ -1,22 +1,40 @@
 {
     "name": "Oculus Touch to Standard",
     "channels": [
-        { "from": "OculusTouch.LY",  "filters": "invert", "to": "Standard.LY" },
-        { "from": "OculusTouch.LX",  "to": "Standard.LX" },
+        { "from": "OculusTouch.A", "to": "Standard.A" },
+        { "from": "OculusTouch.B", "to": "Standard.B" },
+        { "from": "OculusTouch.X", "to": "Standard.X" },
+        { "from": "OculusTouch.Y", "to": "Standard.Y" },
+
+        { "from": "OculusTouch.LY", "filters": "invert", "to": "Standard.LY" },
+        { "from": "OculusTouch.LX", "to": "Standard.LX" },
         { "from": "OculusTouch.LT", "to": "Standard.LT" },
+        { "from": "OculusTouch.LS", "to": "Standard.LS" },
+        { "from": "OculusTouch.LeftGrip", "to": "Standard.LeftGrip" },
+        { "from": "OculusTouch.LeftHand", "to": "Standard.LeftHand" },
 
-        { "from": "OculusTouch.RY",  "filters": "invert", "to": "Standard.RY" },
-        { "from": "OculusTouch.RX",  "to": "Standard.RX" },
-
+        { "from": "OculusTouch.RY", "filters": "invert", "to": "Standard.RY" },
+        { "from": "OculusTouch.RX", "to": "Standard.RX" },
         { "from": "OculusTouch.RT", "to": "Standard.RT" },
-        { "from": "OculusTouch.RB", "to": "Standard.RB" },
         { "from": "OculusTouch.RS", "to": "Standard.RS" },
+        { "from": "OculusTouch.RightGrip", "to": "Standard.RightGrip" },
+        { "from": "OculusTouch.RightHand", "to": "Standard.RightHand" },
 
         { "from": "OculusTouch.LeftApplicationMenu", "to": "Standard.Back" },
         { "from": "OculusTouch.RightApplicationMenu", "to": "Standard.Start" },
 
-        { "from": "OculusTouch.LeftHand", "to": "Standard.LeftHand" },
-        { "from": "OculusTouch.RightHand", "to": "Standard.RightHand" }
+        { "from": "OculusTouch.LeftPrimaryThumbTouch", "to": "Standard.LeftPrimaryThumbTouch" },
+        { "from": "OculusTouch.LeftSecondaryThumbTouch", "to": "Standard.LeftSecondaryThumbTouch" },
+        { "from": "OculusTouch.RightPrimaryThumbTouch", "to": "Standard.RightPrimaryThumbTouch" },
+        { "from": "OculusTouch.RightSecondaryThumbTouch", "to": "Standard.RightSecondaryThumbTouch" },
+        { "from": "OculusTouch.LeftPrimaryIndexTouch", "to": "Standard.LeftPrimaryIndexTouch" },
+        { "from": "OculusTouch.RightPrimaryIndexTouch", "to": "Standard.RightPrimaryIndexTouch" },
+        { "from": "OculusTouch.LSTouch", "to": "Standard.LSTouch" },
+        { "from": "OculusTouch.RSTouch", "to": "Standard.RSTouch" },
+        { "from": "OculusTouch.LeftThumbUp", "to": "Standard.LeftThumbUp" },
+        { "from": "OculusTouch.RightThumbUp", "to": "Standard.RightThumbUp" },
+        { "from": "OculusTouch.LeftIndexPoint", "to": "Standard.LeftIndexPoint" },
+        { "from": "OculusTouch.RightIndexPoint", "to": "Standard.RightIndexPoint" }
     ]
 }
 
diff --git a/interface/resources/controllers/vive.json b/interface/resources/controllers/vive.json
index 60a46ba3ce..dc3ca3755e 100644
--- a/interface/resources/controllers/vive.json
+++ b/interface/resources/controllers/vive.json
@@ -5,7 +5,7 @@
         { "from": "Vive.LX", "when": "Vive.LSOuter", "to": "Standard.LX" },
 
         { "from": "Vive.LT", "to": "Standard.LT" },
-        { "from": "Vive.LeftGrip", "to": "Standard.LB" },
+        { "from": "Vive.LeftGrip", "to": "Standard.LeftGrip" },
         { "from": "Vive.LS", "to": "Standard.LS" },
         { "from": "Vive.LSTouch", "to": "Standard.LSTouch" },
 
@@ -13,7 +13,7 @@
         { "from": "Vive.RX", "when": "Vive.RSOuter", "to": "Standard.RX" },
 
         { "from": "Vive.RT", "to": "Standard.RT" },
-        { "from": "Vive.RightGrip", "to": "Standard.RB" },
+        { "from": "Vive.RightGrip", "to": "Standard.RightGrip" },
         { "from": "Vive.RS", "to": "Standard.RS" },
         { "from": "Vive.RSTouch", "to": "Standard.RSTouch" },
 
diff --git a/libraries/controllers/src/controllers/StandardControls.h b/libraries/controllers/src/controllers/StandardControls.h
index 79c23bc6ee..d7eb3de2c2 100644
--- a/libraries/controllers/src/controllers/StandardControls.h
+++ b/libraries/controllers/src/controllers/StandardControls.h
@@ -66,9 +66,7 @@ namespace controller {
         RIGHT_SECONDARY_INDEX_TOUCH,
         RIGHT_INDEX_POINT,
 
-        LEFT_GRIP,
         LEFT_GRIP_TOUCH,
-        RIGHT_GRIP,
         RIGHT_GRIP_TOUCH,
 
         NUM_STANDARD_BUTTONS
@@ -85,9 +83,9 @@ namespace controller {
         // Triggers
         LT,
         RT,
-        // Grips (Oculus touch squeeze)
-        LG,
-        RG,
+        // Grips
+        LEFT_GRIP,
+        RIGHT_GRIP,
         NUM_STANDARD_AXES,
         LZ = LT,
         RZ = RT
diff --git a/plugins/oculus/src/OculusControllerManager.cpp b/plugins/oculus/src/OculusControllerManager.cpp
index 09ab6ec159..9eadb83ea7 100644
--- a/plugins/oculus/src/OculusControllerManager.cpp
+++ b/plugins/oculus/src/OculusControllerManager.cpp
@@ -120,14 +120,14 @@ static const std::vector<std::pair<ovrButton, StandardButtonChannel>> BUTTON_MAP
     { ovrButton_B, B },
     { ovrButton_LThumb, LS },
     { ovrButton_RThumb, RS },
-    { ovrButton_LShoulder, LB },
-    { ovrButton_RShoulder, RB },
+    //{ ovrButton_LShoulder, LB },
+    //{ ovrButton_RShoulder, RB },
 } };
 
 static const std::vector<std::pair<ovrTouch, StandardButtonChannel>> TOUCH_MAP { {
-    { ovrTouch_X, LEFT_SECONDARY_THUMB_TOUCH },
+    { ovrTouch_X, LEFT_PRIMARY_THUMB_TOUCH },
     { ovrTouch_Y, LEFT_SECONDARY_THUMB_TOUCH },
-    { ovrTouch_A, RIGHT_SECONDARY_THUMB_TOUCH },
+    { ovrTouch_A, RIGHT_PRIMARY_THUMB_TOUCH },
     { ovrTouch_B, RIGHT_SECONDARY_THUMB_TOUCH },
     { ovrTouch_LIndexTrigger, LEFT_PRIMARY_INDEX_TOUCH },
     { ovrTouch_RIndexTrigger, RIGHT_PRIMARY_INDEX_TOUCH },
@@ -183,6 +183,8 @@ void OculusControllerManager::TouchDevice::update(float deltaTime, const control
         ++numTrackedControllers;
         if (REQUIRED_HAND_STATUS == (tracking.HandStatusFlags[hand] & REQUIRED_HAND_STATUS)) {
             handlePose(deltaTime, inputCalibrationData, hand, tracking.HandPoses[hand]);
+        } else {
+            _poseStateMap[hand == ovrHand_Left ? controller::LEFT_HAND : controller::RIGHT_HAND].valid = false;
         }
     });
     using namespace controller;
@@ -191,12 +193,12 @@ void OculusControllerManager::TouchDevice::update(float deltaTime, const control
     _axisStateMap[LX] = inputState.Thumbstick[ovrHand_Left].x;
     _axisStateMap[LY] = inputState.Thumbstick[ovrHand_Left].y;
     _axisStateMap[LT] = inputState.IndexTrigger[ovrHand_Left];
-    _axisStateMap[LG] = inputState.HandTrigger[ovrHand_Left];
+    _axisStateMap[LEFT_GRIP] = inputState.HandTrigger[ovrHand_Left];
 
     _axisStateMap[RX] = inputState.Thumbstick[ovrHand_Right].x;
     _axisStateMap[RY] = inputState.Thumbstick[ovrHand_Right].y;
     _axisStateMap[RT] = inputState.IndexTrigger[ovrHand_Right];
-    _axisStateMap[RG] = inputState.HandTrigger[ovrHand_Right];
+    _axisStateMap[RIGHT_GRIP] = inputState.HandTrigger[ovrHand_Right];
 
     // Buttons
     for (const auto& pair : BUTTON_MAP) {
@@ -220,38 +222,142 @@ void OculusControllerManager::TouchDevice::focusOutEvent() {
 void OculusControllerManager::TouchDevice::handlePose(float deltaTime, 
     const controller::InputCalibrationData& inputCalibrationData, ovrHandType hand, 
     const ovrPoseStatef& handPose) {
+    // When the sensor-to-world rotation is identity the coordinate axes look like this:
+    //
+    //                       user
+    //                      forward
+    //                        -z
+    //                         |
+    //                        y|      user
+    //      y                  o----x right
+    //       o-----x         user
+    //       |                up
+    //       |
+    //       z
+    //
+    //     Rift
+
+    // From ABOVE the hand canonical axes looks like this:
+    //
+    //      | | | |          y        | | | |
+    //      | | | |          |        | | | |
+    //      |     |          |        |     |
+    //      |left | /  x---- +      \ |right|
+    //      |     _/          z      \_     |
+    //       |   |                     |   |
+    //       |   |                     |   |
+    //
+
+    // So when the user is in Rift space facing the -zAxis with hands outstretched and palms down
+    // the rotation to align the Touch axes with those of the hands is:
+    //
+    //    touchToHand = halfTurnAboutY * quaterTurnAboutX
+
+    // Due to how the Touch controllers fit into the palm there is an offset that is different for each hand.
+    // You can think of this offset as the inverse of the measured rotation when the hands are posed, such that
+    // the combination (measurement * offset) is identity at this orientation.
+    //
+    //    Qoffset = glm::inverse(deltaRotation when hand is posed fingers forward, palm down)
+    //
+    // An approximate offset for the Touch can be obtained by inspection:
+    //
+    //    Qoffset = glm::inverse(glm::angleAxis(sign * PI/2.0f, zAxis) * glm::angleAxis(PI/4.0f, xAxis))
+    //
+    // So the full equation is:
+    //
+    //    Q = combinedMeasurement * touchToHand
+    //
+    //    Q = (deltaQ * QOffset) * (yFlip * quarterTurnAboutX)
+    //
+    //    Q = (deltaQ * inverse(deltaQForAlignedHand)) * (yFlip * quarterTurnAboutX)
+
     auto poseId = hand == ovrHand_Left ? controller::LEFT_HAND : controller::RIGHT_HAND;
     auto& pose = _poseStateMap[poseId];
+
+    static const glm::quat yFlip = glm::angleAxis(PI, Vectors::UNIT_Y);
+    static const glm::quat quarterX = glm::angleAxis(PI_OVER_TWO, Vectors::UNIT_X);
+    static const glm::quat touchToHand = yFlip * quarterX;
+
+    static const glm::quat leftQuarterZ = glm::angleAxis(-PI_OVER_TWO, Vectors::UNIT_Z);
+    static const glm::quat rightQuarterZ = glm::angleAxis(PI_OVER_TWO, Vectors::UNIT_Z);
+    static const glm::quat eighthX = glm::angleAxis(PI / 4.0f, Vectors::UNIT_X);
+
+    static const glm::quat leftRotationOffset = glm::inverse(leftQuarterZ * eighthX) * touchToHand;
+    static const glm::quat rightRotationOffset = glm::inverse(rightQuarterZ * eighthX) * touchToHand;
+
+    static const float CONTROLLER_LENGTH_OFFSET = 0.0762f;  // three inches
+    static const glm::vec3 CONTROLLER_OFFSET = glm::vec3(CONTROLLER_LENGTH_OFFSET / 2.0f,
+                                                         CONTROLLER_LENGTH_OFFSET / 2.0f,
+                                                         CONTROLLER_LENGTH_OFFSET * 2.0f);
+    static const glm::vec3 leftTranslationOffset = glm::vec3(-1.0f, 1.0f, 1.0f) * CONTROLLER_OFFSET;
+    static const glm::vec3 rightTranslationOffset = CONTROLLER_OFFSET;
+
+    auto translationOffset = (hand == ovrHand_Left ? leftTranslationOffset : rightTranslationOffset);
+    auto rotationOffset = (hand == ovrHand_Left ? leftRotationOffset : rightRotationOffset);
+
+    glm::quat rotation = toGlm(handPose.ThePose.Orientation);
+
     pose.translation = toGlm(handPose.ThePose.Position);
-    pose.rotation = toGlm(handPose.ThePose.Orientation);
+    pose.translation += rotation * translationOffset;
+    pose.rotation = rotation * rotationOffset;
     pose.angularVelocity = toGlm(handPose.AngularVelocity);
     pose.velocity = toGlm(handPose.LinearVelocity);
+    pose.valid = true;
+
+    // transform into avatar frame
+    glm::mat4 controllerToAvatar = glm::inverse(inputCalibrationData.avatarMat) * inputCalibrationData.sensorToWorldMat;
+    pose = pose.transform(controllerToAvatar);
 }
 
 controller::Input::NamedVector OculusControllerManager::TouchDevice::getAvailableInputs() const {
     using namespace controller;
     QVector<Input::NamedPair> availableInputs{
-        // Trackpad analogs
+        // buttons
+        makePair(A, "A"),
+        makePair(B, "B"),
+        makePair(X, "X"),
+        makePair(Y, "Y"),
+
+        // trackpad analogs
         makePair(LX, "LX"),
         makePair(LY, "LY"),
         makePair(RX, "RX"),
         makePair(RY, "RY"),
-        // trigger analogs
+
+        // triggers
         makePair(LT, "LT"),
         makePair(RT, "RT"),
 
-        makePair(LB, "LB"),
-        makePair(RB, "RB"),
+        // trigger buttons
+        //makePair(LB, "LB"),
+        //makePair(RB, "RB"),
 
+        // side grip triggers
+        makePair(LEFT_GRIP, "LeftGrip"),
+        makePair(RIGHT_GRIP, "RightGrip"),
+
+        // joystick buttons
         makePair(LS, "LS"),
         makePair(RS, "RS"),
+
         makePair(LEFT_HAND, "LeftHand"),
         makePair(RIGHT_HAND, "RightHand"),
 
-        makePair(LEFT_PRIMARY_THUMB, "LeftPrimaryThumb"),
-        makePair(LEFT_SECONDARY_THUMB, "LeftSecondaryThumb"),
-        makePair(RIGHT_PRIMARY_THUMB, "RightPrimaryThumb"),
-        makePair(RIGHT_SECONDARY_THUMB, "RightSecondaryThumb"),
+        makePair(LEFT_PRIMARY_THUMB_TOUCH, "LeftPrimaryThumbTouch"),
+        makePair(LEFT_SECONDARY_THUMB_TOUCH, "LeftSecondaryThumbTouch"),
+        makePair(RIGHT_PRIMARY_THUMB_TOUCH, "RightPrimaryThumbTouch"),
+        makePair(RIGHT_SECONDARY_THUMB_TOUCH, "RightSecondaryThumbTouch"),
+        makePair(LEFT_PRIMARY_INDEX_TOUCH, "LeftPrimaryIndexTouch"),
+        makePair(RIGHT_PRIMARY_INDEX_TOUCH, "RightPrimaryIndexTouch"),
+        makePair(LS_TOUCH, "LSTouch"),
+        makePair(RS_TOUCH, "RSTouch"),
+        makePair(LEFT_THUMB_UP, "LeftThumbUp"),
+        makePair(RIGHT_THUMB_UP, "RightThumbUp"),
+        makePair(LEFT_INDEX_POINT, "LeftIndexPoint"),
+        makePair(RIGHT_INDEX_POINT, "RightIndexPoint"),
+
+        makePair(BACK, "LeftApplicationMenu"),
+        makePair(START, "RightApplicationMenu"),
     };
     return availableInputs;
 }
diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp
index 953501ccec..830448cf7f 100644
--- a/plugins/openvr/src/ViveControllerManager.cpp
+++ b/plugins/openvr/src/ViveControllerManager.cpp
@@ -347,7 +347,7 @@ void ViveControllerManager::InputDevice::handleButtonEvent(float deltaTime, uint
         if (button == vr::k_EButton_ApplicationMenu) {
             _buttonPressedMap.insert(isLeftHand ? LEFT_APP_MENU : RIGHT_APP_MENU);
         } else if (button == vr::k_EButton_Grip) {
-            _buttonPressedMap.insert(isLeftHand ? LEFT_GRIP : RIGHT_GRIP);
+            _axisStateMap[isLeftHand ? LEFT_GRIP : RIGHT_GRIP] = 1.0f;
         } else if (button == vr::k_EButton_SteamVR_Trigger) {
             _buttonPressedMap.insert(isLeftHand ? LT : RT);
         } else if (button == vr::k_EButton_SteamVR_Touchpad) {
diff --git a/scripts/system/away.js b/scripts/system/away.js
index 2b2ea8a42b..38b0f13c00 100644
--- a/scripts/system/away.js
+++ b/scripts/system/away.js
@@ -265,9 +265,11 @@ eventMapping.from(Controller.Standard.RightSecondaryThumb).peek().to(goActive);
 eventMapping.from(Controller.Standard.LT).peek().to(goActive);
 eventMapping.from(Controller.Standard.LB).peek().to(goActive);
 eventMapping.from(Controller.Standard.LS).peek().to(goActive);
+eventMapping.from(Controller.Standard.LeftGrip).peek().to(goActive);
 eventMapping.from(Controller.Standard.RT).peek().to(goActive);
 eventMapping.from(Controller.Standard.RB).peek().to(goActive);
 eventMapping.from(Controller.Standard.RS).peek().to(goActive);
+eventMapping.from(Controller.Standard.RightGrip).peek().to(goActive);
 eventMapping.from(Controller.Standard.Back).peek().to(goActive);
 eventMapping.from(Controller.Standard.Start).peek().to(goActive);
 Controller.enableMapping(eventMappingName);
diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js
index 06549a38b5..986a4c0722 100644
--- a/scripts/system/controllers/handControllerGrab.js
+++ b/scripts/system/controllers/handControllerGrab.js
@@ -271,7 +271,7 @@ function MyController(hand) {
 
     this.triggerValue = 0; // rolling average of trigger value
     this.rawTriggerValue = 0;
-    this.rawBumperValue = 0;
+    this.rawSecondaryValue = 0;
     this.rawThumbValue = 0;
 
     //for visualizations
@@ -509,10 +509,10 @@ function MyController(hand) {
         var searchSphereLocation = Vec3.sum(distantPickRay.origin,
                                             Vec3.multiply(distantPickRay.direction, this.searchSphereDistance));
         this.searchSphereOn(searchSphereLocation, SEARCH_SPHERE_SIZE * this.searchSphereDistance,
-                            (this.triggerSmoothedGrab() || this.bumperSqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
+                            (this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
         if ((USE_OVERLAY_LINES_FOR_SEARCHING === true) && PICK_WITH_HAND_RAY) {
             this.overlayLineOn(handPosition, searchSphereLocation,
-                               (this.triggerSmoothedGrab() || this.bumperSqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
+                               (this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR);
         }
     }
 
@@ -768,8 +768,8 @@ function MyController(hand) {
         _this.rawTriggerValue = value;
     };
 
-    this.bumperPress = function(value) {
-        _this.rawBumperValue = value;
+    this.secondaryPress = function(value) {
+        _this.rawSecondaryValue = value;
     };
 
     this.updateSmoothedTrigger = function() {
@@ -791,20 +791,20 @@ function MyController(hand) {
         return this.triggerValue < TRIGGER_OFF_VALUE;
     };
 
-    this.bumperSqueezed = function() {
-        return _this.rawBumperValue > BUMPER_ON_VALUE;
+    this.secondarySqueezed = function() {
+        return _this.rawSecondaryValue > BUMPER_ON_VALUE;
     };
 
-    this.bumperReleased = function() {
-        return _this.rawBumperValue < BUMPER_ON_VALUE;
+    this.secondaryReleased = function() {
+        return _this.rawSecondaryValue < BUMPER_ON_VALUE;
     };
 
-    // this.triggerOrBumperSqueezed = function() {
-    //     return triggerSmoothedSqueezed() || bumperSqueezed();
+    // this.triggerOrsecondarySqueezed = function() {
+    //     return triggerSmoothedSqueezed() || secondarySqueezed();
     // }
 
-    // this.triggerAndBumperReleased = function() {
-    //     return triggerSmoothedReleased() && bumperReleased();
+    // this.triggerAndSecondaryReleased = function() {
+    //     return triggerSmoothedReleased() && secondaryReleased();
     // }
 
     this.thumbPress = function(value) {
@@ -820,13 +820,13 @@ function MyController(hand) {
     };
 
     this.off = function() {
-        if (this.triggerSmoothedSqueezed() || this.bumperSqueezed()) {
+        if (this.triggerSmoothedSqueezed() || this.secondarySqueezed()) {
             this.lastPickTime = 0;
             var controllerHandInput = (this.hand === RIGHT_HAND) ? Controller.Standard.RightHand : Controller.Standard.LeftHand;
             this.startingHandRotation = Controller.getPoseValue(controllerHandInput).rotation;
             if (this.triggerSmoothedSqueezed()) {
                 this.setState(STATE_SEARCHING);
-            } else if (this.bumperSqueezed()) {
+            } else if (this.secondarySqueezed()) {
                 this.setState(STATE_HOLD_SEARCHING);
             }
         }
@@ -843,7 +843,7 @@ function MyController(hand) {
             this.setState(STATE_RELEASE);
             return;
         }
-        if (this.state == STATE_HOLD_SEARCHING && this.bumperReleased()) {
+        if (this.state == STATE_HOLD_SEARCHING && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             return;
         }
@@ -1000,7 +1000,7 @@ function MyController(hand) {
                 grabbableData = grabbableDataForCandidate;
             }
         }
-        if ((this.grabbedEntity !== null) && (this.triggerSmoothedGrab() || this.bumperSqueezed())) {
+        if ((this.grabbedEntity !== null) && (this.triggerSmoothedGrab() || this.secondarySqueezed())) {
             // We are squeezing enough to grab, and we've found an entity that we'll try to do something with.
             var near = (nearPickedCandidateEntities.indexOf(this.grabbedEntity) >= 0) || minDistance <= NEAR_PICK_MAX_DISTANCE;
             var isPhysical = this.propsArePhysical(props);
@@ -1166,7 +1166,7 @@ function MyController(hand) {
     };
 
     this.continueDistanceHolding = function() {
-        if (this.triggerSmoothedReleased() && this.bumperReleased()) {
+        if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("releaseGrab");
             return;
@@ -1390,7 +1390,7 @@ function MyController(hand) {
             this.callEntityMethodOnGrabbed("releaseGrab");
             return;
         }
-        if (this.state == STATE_HOLD && this.bumperReleased()) {
+        if (this.state == STATE_HOLD && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("releaseGrab");
             return;
@@ -1504,7 +1504,7 @@ function MyController(hand) {
             this.callEntityMethodOnGrabbed("releaseGrab");
             return;
         }
-        if (this.state == STATE_CONTINUE_HOLD && this.bumperReleased()) {
+        if (this.state == STATE_CONTINUE_HOLD && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("releaseEquip");
             return;
@@ -1633,7 +1633,7 @@ function MyController(hand) {
     };
 
     this.nearTrigger = function() {
-        if (this.triggerSmoothedReleased() && this.bumperReleased()) {
+        if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("stopNearTrigger");
             return;
@@ -1643,7 +1643,7 @@ function MyController(hand) {
     };
 
     this.farTrigger = function() {
-        if (this.triggerSmoothedReleased() && this.bumperReleased()) {
+        if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("stopFarTrigger");
             return;
@@ -1653,7 +1653,7 @@ function MyController(hand) {
     };
 
     this.continueNearTrigger = function() {
-        if (this.triggerSmoothedReleased() && this.bumperReleased()) {
+        if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("stopNearTrigger");
             return;
@@ -1662,7 +1662,7 @@ function MyController(hand) {
     };
 
     this.continueFarTrigger = function() {
-        if (this.triggerSmoothedReleased() && this.bumperReleased()) {
+        if (this.triggerSmoothedReleased() && this.secondaryReleased()) {
             this.setState(STATE_RELEASE);
             this.callEntityMethodOnGrabbed("stopFarTrigger");
             return;
@@ -1942,8 +1942,10 @@ var mapping = Controller.newMapping(MAPPING_NAME);
 mapping.from([Controller.Standard.RT]).peek().to(rightController.triggerPress);
 mapping.from([Controller.Standard.LT]).peek().to(leftController.triggerPress);
 
-mapping.from([Controller.Standard.RB]).peek().to(rightController.bumperPress);
-mapping.from([Controller.Standard.LB]).peek().to(leftController.bumperPress);
+mapping.from([Controller.Standard.RB]).peek().to(rightController.secondaryPress);
+mapping.from([Controller.Standard.LB]).peek().to(leftController.secondaryPress);
+mapping.from([Controller.Standard.LeftGrip]).peek().to(leftController.secondaryPress);
+mapping.from([Controller.Standard.RightGrip]).peek().to(rightController.secondaryPress);
 
 mapping.from([Controller.Standard.LeftPrimaryThumb]).peek().to(leftController.thumbPress);
 mapping.from([Controller.Standard.RightPrimaryThumb]).peek().to(rightController.thumbPress);
@@ -2036,4 +2038,4 @@ function cleanup() {
     Reticle.setVisible(true);
 }
 Script.scriptEnding.connect(cleanup);
-Script.update.connect(update);
+Script.update.connect(update);
\ No newline at end of file