diff --git a/interface/resources/html/img/controls-help-oculus.png b/interface/resources/html/img/controls-help-oculus.png
index 85e25c2a19..0bd0a656de 100644
Binary files a/interface/resources/html/img/controls-help-oculus.png and b/interface/resources/html/img/controls-help-oculus.png differ
diff --git a/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx b/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx
index 4f1f60be0b..50f415b7ca 100644
Binary files a/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx and b/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx differ
diff --git a/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx b/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx
index 49a3d6c832..9e9d92541c 100644
Binary files a/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx and b/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx differ
diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js
index 513e70d18c..2ed09232e6 100644
--- a/scripts/system/controllers/handControllerGrab.js
+++ b/scripts/system/controllers/handControllerGrab.js
@@ -195,6 +195,8 @@ var STATE_OVERLAY_TOUCHING = 8;
 var holdEnabled = true;
 var nearGrabEnabled = true;
 var farGrabEnabled = true;
+var myAvatarScalingEnabled = true;
+var objectScalingEnabled = true;
 
 // "collidesWith" is specified by comma-separated list of group names
 // the possible group names are:  static, dynamic, kinematic, myAvatar, otherAvatar
@@ -2312,6 +2314,10 @@ function MyController(hand) {
     };
 
     this.maybeScale = function(props) {
+        if (!objectScalingEnabled) {
+            return;
+        }
+
         if (!this.shouldScale) {
             //  If both secondary triggers squeezed, and the non-holding hand is empty, start scaling
             if (this.secondarySqueezed() && this.getOtherHandController().secondarySqueezed() && this.getOtherHandController().state === STATE_OFF) {
@@ -2331,6 +2337,10 @@ function MyController(hand) {
     }
 
     this.maybeScaleMyAvatar = function() {
+        if (!myAvatarScalingEnabled) {
+            return;
+        }
+
         if (!this.shouldScale) {
             //  If both secondary triggers squeezed, start scaling
             if (this.secondarySqueezed() && this.getOtherHandController().secondarySqueezed()) {
@@ -3016,6 +3026,14 @@ var handleHandMessages = function(channel, message, sender) {
                 print("farGrabEnabled: ", data.farGrabEnabled);
                 farGrabEnabled = data.farGrabEnabled;
             }
+            if (data.myAvatarScalingEnabled !== undefined) {
+                print("myAvatarScalingEnabled: ", data.myAvatarScalingEnabled);
+                myAvatarScalingEnabled = data.myAvatarScalingEnabled;
+            }
+            if (data.objectScalingEnabled !== undefined) {
+                print("objectScalingEnabled: ", data.objectScalingEnabled);
+                objectScalingEnabled = data.objectScalingEnabled;
+            }
         } else if (channel === 'Hifi-Hand-Grab') {
             try {
                 data = JSON.parse(message);
diff --git a/scripts/system/controllers/touchControllerConfiguration.js b/scripts/system/controllers/touchControllerConfiguration.js
index 6241a776c4..a4622fd5e6 100644
--- a/scripts/system/controllers/touchControllerConfiguration.js
+++ b/scripts/system/controllers/touchControllerConfiguration.js
@@ -74,6 +74,9 @@ TOUCH_CONTROLLER_CONFIGURATION_LEFT = {
                         teleport: {
                             defaultTextureURL: BASE_URL + "Oculus-Labels-L.fbx/Oculus-Labels-L.fbm/Teleport.png"
                         },
+                        both_triggers: {
+                            defaultTextureURL: BASE_URL + "Oculus-Labels-L.fbx/Oculus-Labels-L.fbm/Grip-Trigger.png"
+                        },
                     }
                 },
 
@@ -212,7 +215,7 @@ TOUCH_CONTROLLER_CONFIGURATION_RIGHT = {
                     modelURL: BASE_URL + "Oculus-Labels-R.fbx",
                     naturalPosition: { x: 0.009739525616168976, y: -0.0017818436026573181, z: 0.016794726252555847 },
 
-                    textureName: "Texture",
+                    textureName: "blank",
                     defaultTextureLayer: "blank",
                     textureLayers: {
                         blank: {
@@ -230,6 +233,9 @@ TOUCH_CONTROLLER_CONFIGURATION_RIGHT = {
                         teleport: {
                             defaultTextureURL: BASE_URL + "Oculus-Labels-R.fbx/Oculus-Labels-R.fbm/Teleport.png"
                         },
+                        both_triggers: {
+                            defaultTextureURL: BASE_URL + "Oculus-Labels-R.fbx/Oculus-Labels-R.fbm/Grip-Trigger.png"
+                        },
                     }
                 },
 
diff --git a/server-console/src/main.js b/server-console/src/main.js
index c99e39faf8..b387aa5dd0 100644
--- a/server-console/src/main.js
+++ b/server-console/src/main.js
@@ -42,7 +42,7 @@ const appIcon = path.join(__dirname, '../resources/console.png');
 const DELETE_LOG_FILES_OLDER_THAN_X_SECONDS = 60 * 60 * 24 * 7; // 7 Days
 const LOG_FILE_REGEX = /(domain-server|ac-monitor|ac)-.*-std(out|err).txt/;
 
-const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-release-5572.tar.gz";
+const HOME_CONTENT_URL = "http://cdn.highfidelity.com/content-sets/home-tutorial-28.tar.gz";
 
 function getBuildInfo() {
     var buildInfoPath = null;
diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js
index b75bf74579..26fa51e896 100644
--- a/tutorial/tutorial.js
+++ b/tutorial/tutorial.js
@@ -58,6 +58,9 @@ function info() {
     }
 }
 
+const CONTROLLER_TOUCH = 'touch';
+const CONTROLLER_VIVE = 'vive';
+
 var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn";
 var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn";
 var GUN_SPAWN_NAME = "tutorial/gun_spawn";
@@ -323,7 +326,7 @@ function hideEntitiesWithTag(tag) {
     //});
 }
 
-/** 
+/**
  * Return the entity properties for an entity with a given name if it is in our
  * cached list of entities. Otherwise, return undefined.
  */
@@ -371,6 +374,8 @@ function disableEverything() {
         nearGrabEnabled: true,
         holdEnabled: false,
         farGrabEnabled: false,
+        myAvatarScalingEnabled: false,
+        objectScalingEnabled: false,
     }));
     setControllerPartLayer('touchpad', 'blank');
     setControllerPartLayer('trigger', 'blank');
@@ -399,6 +404,8 @@ function reenableEverything() {
         nearGrabEnabled: true,
         holdEnabled: true,
         farGrabEnabled: true,
+        myAvatarScalingEnabled: true,
+        objectScalingEnabled: true,
     }));
     setControllerPartLayer('touchpad', 'blank');
     setControllerPartLayer('trigger', 'blank');
@@ -516,12 +523,14 @@ stepOrient.prototype = {
 // STEP: Near Grab                                                           //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
-var stepNearGrab = function() {
+var stepNearGrab = function(tutorialManager) {
     this.name = 'nearGrab';
-    this.tag = "nearGrab";
+    this.tags = ["bothGrab", "nearGrab", "nearGrab-" + tutorialManager.controllerName];
     this.tempTag = "nearGrab-temporary";
     this.birdIDs = [];
 
+    this.controllerName = tutorialManager.controllerName;
+
     Messages.subscribe("Entity-Exploded");
     Messages.messageReceived.connect(this.onMessage.bind(this));
 }
@@ -530,12 +539,17 @@ stepNearGrab.prototype = {
         this.finished = false;
         this.onFinish = onFinish;
 
-        setControllerPartLayer('tips', 'trigger');
-        setControllerPartLayer('trigger', 'highlight');
+        if (this.controllerName === CONTROLLER_TOUCH) {
+            setControllerPartLayer('tips', 'both_triggers');
+            setControllerPartLayer('trigger', 'highlight');
+            setControllerPartLayer('grip', 'highlight');
+        } else {
+            setControllerPartLayer('tips', 'trigger');
+            setControllerPartLayer('trigger', 'highlight');
+        }
 
-        // Spawn content set
-        showEntitiesWithTag(this.tag, { visible: true });
-        showEntitiesWithTag('bothGrab', { visible: true });
+        // Show content set
+        showEntitiesWithTags(this.tags);
 
         var boxSpawnPosition = getEntityWithName(NEAR_BOX_SPAWN_NAME).position;
         function createBlock(fireworkNumber) {
@@ -573,8 +587,8 @@ stepNearGrab.prototype = {
         this.finished = true;
         setControllerPartLayer('tips', 'blank');
         setControllerPartLayer('trigger', 'normal');
-        hideEntitiesWithTag(this.tag, { visible: false});
-        hideEntitiesWithTag('bothGrab', { visible: false});
+        setControllerPartLayer('grip', 'normal');
+        hideEntitiesWithTags(this.tags);
         deleteEntitiesWithTag(this.tempTag);
         if (this.positionWatcher) {
             this.positionWatcher.destroy();
@@ -696,6 +710,7 @@ PositionWatcher.prototype = {
 ///////////////////////////////////////////////////////////////////////////////
 var stepEquip = function(tutorialManager) {
     const controllerName = tutorialManager.controllerName;
+    this.controllerName = controllerName;
 
     this.name = 'equip';
 
@@ -714,8 +729,13 @@ var stepEquip = function(tutorialManager) {
 }
 stepEquip.prototype = {
     start: function(onFinish) {
-        setControllerPartLayer('tips', 'trigger');
-        setControllerPartLayer('trigger', 'highlight');
+        if (this.controllerName === CONTROLLER_TOUCH) {
+            setControllerPartLayer('tips', 'grip');
+            setControllerPartLayer('grip', 'highlight');
+        } else {
+            setControllerPartLayer('tips', 'trigger');
+            setControllerPartLayer('trigger', 'highlight');
+        }
 
         Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({
             holdEnabled: true,
diff --git a/tutorial/tutorialEntityIDs.js b/tutorial/tutorialEntityIDs.js
index 0200c2c247..f53ac1a56c 100644
--- a/tutorial/tutorialEntityIDs.js
+++ b/tutorial/tutorialEntityIDs.js
@@ -52,6 +52,16 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = {
             "tag": "farGrab"
         }
     },
+    "nearGrab-vive": {
+        "{88221a22-b710-4d35-852b-5257b0aa77dc}": {
+            "tag": "nearGrab-vive"
+        }
+    },
+    "nearGrab-touch": {
+        "{7c0f2fde-6c5c-459b-bf82-421979cebf2e}": {
+            "tag": "nearGrab-touch"
+        }
+    },
     "nearGrab": {
         "{55c861ef-60ca-4722-a6c5-9c6967966ec5}": {
             "tag": "nearGrab"
@@ -59,9 +69,6 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = {
         "{644d655b-ae66-43b1-9bab-a44b9a8ad632}": {
             "tag": "nearGrab"
         },
-        "{88221a22-b710-4d35-852b-5257b0aa77dc}": {
-            "tag": "nearGrab"
-        },
         "{8bf0baa1-88d0-448a-a782-100d4413bd82}": {
             "tag": "nearGrab"
         },
@@ -70,13 +77,20 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = {
             "tag": "nearGrab"
         }
     },
+    "equip-part1-touch": {
+        "{470f0634-8be7-4b52-a8bd-5183d489fcb6}": {
+            "tag": "equip-part1-touch"
+        }
+    },
+    "equip-part1-vive": {
+        "{97ced5e7-fc81-40f9-a9e8-f85b4b30f24c}": {
+            "tag": "equip-part1-vive"
+        }
+    },
     "equip-part1": {
         "{d73822ca-0a34-4cf4-a530-3258ac459a14}": {
             "tag": "equip-part1"
         },
-        "{97ced5e7-fc81-40f9-a9e8-f85b4b30f24c}": {
-            "tag": "equip-part1"
-        },
         "{8572d991-5777-45df-97bf-7243d7b12f81}": {
             "tag": "equip-part1"
         },
@@ -102,16 +116,17 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = {
     "equip-part2-vive": {
         "{b5d17eda-90ab-40cf-b973-efcecb2e992e}": {
             "tag": "equip-part2-vive"
+        },
+        "{6307cd16-dd1d-4988-a339-578178436b45}": {
+            "tag": "equip-part2-vive"
         }
     },
     "equip-part2-touch": {
         "{69195139-e020-4739-bb2c-50faebc6860a}": {
             "tag": "equip-part2-touch"
-        }
-    },
-    "equip-part2": {
-        "{6307cd16-dd1d-4988-a339-578178436b45}": {
-            "tag": "equip-part2"
+        },
+        "{9b0a99ae-221b-4e59-ba3c-d8e64a083774}": {
+            "tag": "equip-part2-touch"
         }
     },
     "bothGrab": {