diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp
index 2c769c37d4..c58157f3ee 100644
--- a/interface/src/scripting/HMDScriptingInterface.cpp
+++ b/interface/src/scripting/HMDScriptingInterface.cpp
@@ -57,6 +57,20 @@ bool HMDScriptingInterface::isHandControllerAvailable() {
     return PluginUtils::isHandControllerAvailable();
 }
 
+void HMDScriptingInterface::requestShowHandControllers() {
+    _showHandControllersCount++;
+    emit shouldShowHandControllersChanged();
+}
+
+void HMDScriptingInterface::requestHideHandControllers() {
+    _showHandControllersCount--;
+    emit shouldShowHandControllersChanged();
+}
+
+bool HMDScriptingInterface::shouldShowHandControllers() const {
+    return _showHandControllersCount > 0;
+}
+
 QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) {
     glm::vec3 hudIntersection;
     auto instance = DependencyManager::get<HMDScriptingInterface>();
diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h
index 4148b1cb4a..5b8a89fc4f 100644
--- a/interface/src/scripting/HMDScriptingInterface.h
+++ b/interface/src/scripting/HMDScriptingInterface.h
@@ -41,6 +41,10 @@ public:
     Q_INVOKABLE bool isHMDAvailable();
     Q_INVOKABLE bool isHandControllerAvailable();
 
+    Q_INVOKABLE void requestShowHandControllers();
+    Q_INVOKABLE void requestHideHandControllers();
+    Q_INVOKABLE bool shouldShowHandControllers() const;
+
     Q_INVOKABLE bool setHandLasers(int hands, bool enabled, const glm::vec4& color, const glm::vec3& direction) const;
 
     Q_INVOKABLE void disableHandLasers(int hands) const;
@@ -61,6 +65,9 @@ public:
     // rotate the overlay UI sphere so that it is centered about the the current HMD position and orientation
     Q_INVOKABLE void centerUI();
 
+signals:
+    bool shouldShowHandControllersChanged();
+
 public:
     HMDScriptingInterface();
     static QScriptValue getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine);
@@ -77,6 +84,7 @@ private:
 
     bool getHUDLookAtPosition3D(glm::vec3& result) const;
     glm::mat4 getWorldHMDMatrix() const;
+    std::atomic<int> _showHandControllersCount { 0 };
 };
 
 #endif // hifi_HMDScriptingInterface_h
diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js
index f9cd32be46..718b5f3d3e 100644
--- a/scripts/defaultScripts.js
+++ b/scripts/defaultScripts.js
@@ -23,6 +23,7 @@ var DEFAULT_SCRIPTS = [
     "system/mod.js",
     "system/selectAudioDevice.js",
     "system/notifications.js",
+    "system/controllers/controllerDisplayManager.js",
     "system/controllers/handControllerGrab.js",
     "system/controllers/handControllerPointer.js",
     "system/controllers/squeezeHands.js",
@@ -125,4 +126,4 @@ Script.scriptEnding.connect(function() {
     removeMenuItem();
 });
 
-Menu.menuItemEvent.connect(menuItemEvent);
\ No newline at end of file
+Menu.menuItemEvent.connect(menuItemEvent);
diff --git a/scripts/system/away.js b/scripts/system/away.js
index f4a1a22bf6..56ad5353e7 100644
--- a/scripts/system/away.js
+++ b/scripts/system/away.js
@@ -178,6 +178,8 @@ function goAway(fromStartup) {
     playAwayAnimation(); // animation is still seen by others
     showOverlay();
 
+    HMD.requestShowHandControllers();
+
     // remember the View > Overlays state...
     wasOverlaysVisible = Menu.isOptionChecked("Overlays");
 
@@ -222,6 +224,8 @@ function goActive() {
     MyAvatar.setEnableMeshVisible(true); // IWBNI we respected Developer->Avatar->Draw Mesh setting.
     stopAwayAnimation();
 
+    HMD.requestHideHandControllers();
+
     // update the UI sphere to be centered about the current HMD orientation.
     HMD.centerUI();
 
diff --git a/scripts/system/controllers/controllerDisplayManager.js b/scripts/system/controllers/controllerDisplayManager.js
index 999b6b3257..1ba7dda526 100644
--- a/scripts/system/controllers/controllerDisplayManager.js
+++ b/scripts/system/controllers/controllerDisplayManager.js
@@ -9,6 +9,9 @@
 
 /* globals ControllerDisplayManager:true createControllerDisplay deleteControllerDisplay
    VIVE_CONTROLLER_CONFIGURATION_LEFT VIVE_CONTROLLER_CONFIGURATION_RIGHT */
+/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
+
+(function () {
 
 Script.include("controllerDisplay.js");
 Script.include("viveControllerConfiguration.js");
@@ -35,7 +38,7 @@ ControllerDisplayManager = function() {
     };
 
     function updateControllers() {
-        if (HMD.active) {
+        if (HMD.active && HMD.shouldShowHandControllers()) {
             if ("Vive" in Controller.Hardware) {
                 if (!controllerLeft) {
                     controllerLeft = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION_LEFT);
@@ -139,12 +142,23 @@ ControllerDisplayManager = function() {
 
     this.destroy = function() {
         Messages.messageReceived.disconnect(handleMessages);
+
+        HMD.displayModeChanged.disconnect(updateControllers);
+        HMD.shouldShowHandControllersChanged.disconnect(updateControllers);
+
         self.deleteControllerDisplays();
     };
 
     HMD.displayModeChanged.connect(updateControllers);
+    HMD.shouldShowHandControllersChanged.connect(updateControllers);
 
     updateControllers();
 };
 
 var controllerDisplayManager = new ControllerDisplayManager();
+
+Script.scriptEnding.connect(function () {
+    controllerDisplayManager.destroy();
+});
+
+}());
diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js
deleted file mode 100644
index 3bc0e05a96..0000000000
--- a/tutorial/controllerDisplay.js
+++ /dev/null
@@ -1,195 +0,0 @@
-var VISIBLE_BY_DEFAULT = false;
-var PARENT_ID = "{00000000-0000-0000-0000-000000000001}";
-
-var DEBUG = false;
-function debug() {
-    if (DEBUG) {
-        print.apply(self, arguments);
-    }
-}
-
-createControllerDisplay = function(config) {
-    var controllerDisplay = {
-        overlays: [],
-        partOverlays: {
-        },
-        parts: {
-        },
-        mappingName: "mapping-display",
-
-        setVisible: function(visible) {
-            print("CONTROLLER_DISPLAY::Setting visible", this.overlays.length);
-            for (var i = 0; i < this.overlays.length; ++i) {
-                print("i", i, this.overlays[i]);
-                Overlays.editOverlay(this.overlays[i], {
-                    visible: visible
-                });
-            }
-        },
-
-        setPartVisible: function(partName, visible) {
-            return;
-            if (partName in this.partOverlays) {
-                debug("Setting part visible", partName, visible);
-                for (var i = 0; i < this.partOverlays[partName].length; ++i) {
-                    Overlays.editOverlay(this.partOverlays[partName][i], {
-                        //visible: visible
-                    });
-                }
-            }
-        },
-
-        setLayerForPart: function(partName, layerName) {
-            if (partName in this.parts) {
-                debug("Setting layer...", partName, layerName);
-                var part = this.parts[partName];
-                if (part.textureLayers && layerName in part.textureLayers) {
-                    var layer = part.textureLayers[layerName];
-                    var textures = {};
-                    if (layer.defaultTextureURL) {
-                        textures[part.textureName] = layer.defaultTextureURL;
-                    }
-                    for (var i = 0; i < this.partOverlays[partName].length; ++i) {
-                        Overlays.editOverlay(this.partOverlays[partName][i], {
-                            textures: textures
-                        });
-                    }
-                }
-            }
-        }
-    };
-    var mapping = Controller.newMapping(controllerDisplay.mappingName);
-    for (var i = 0; i < config.controllers.length; ++i) {
-        var controller = config.controllers[i];
-        var position = controller.position;
-
-        if (controller.naturalPosition) {
-            position = Vec3.sum(Vec3.multiplyQbyV(
-                        controller.rotation, controller.naturalPosition), position);
-        }
-
-        var overlayID = Overlays.addOverlay("model", {
-            url: controller.modelURL,
-            dimensions: controller.dimensions,
-            localRotation: controller.rotation,
-            localPosition: position,
-            parentID: PARENT_ID,
-            parentJointIndex: controller.jointIndex,
-            ignoreRayIntersection: true,
-        });
-
-        controllerDisplay.overlays.push(overlayID);
-        overlayID = null;
-
-        function clamp(value, min, max) {
-            if (value < min) {
-                return min;
-            } else if (value > max) {
-                return max
-            }
-            return value;
-        }
-
-        if (controller.parts) {
-            for (var partName in controller.parts) {
-                var part = controller.parts[partName];
-                var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition));
-                var innerRotation = controller.rotation
-
-                controllerDisplay.parts[partName] = controller.parts[partName];
-
-                var properties = {
-                    url: part.modelURL,
-                    localPosition: partPosition,
-                    localRotation: innerRotation,
-                    parentID: PARENT_ID,
-                    parentJointIndex: controller.jointIndex,
-                    ignoreRayIntersection: true,
-                };
-
-                if (part.defaultTextureLayer) {
-                    var textures = {};
-                    textures[part.textureName] = part.textureLayers[part.defaultTextureLayer].defaultTextureURL;
-                    properties['textures'] = textures;
-                }
-
-                var overlayID = Overlays.addOverlay("model", properties);
-
-                if (part.type == "rotational") {
-                    var range = part.maxValue - part.minValue;
-                    mapping.from([part.input]).peek().to(function(controller, overlayID, part) {
-                        return function(value) {
-                            value = clamp(value, part.minValue, part.maxValue);
-
-                            var pct = (value - part.minValue) / part.maxValue;
-                            var angle = pct * part.maxAngle;
-                            var rotation = Quat.angleAxis(angle, part.axis);
-
-                            var offset = { x: 0, y: 0, z: 0 };
-                            if (part.origin) {
-                                var offset = Vec3.multiplyQbyV(rotation, part.origin);
-                                offset = Vec3.subtract(offset, part.origin);
-                            }
-
-                            var partPosition = Vec3.sum(controller.position,
-                                    Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition)));
-
-                            Overlays.editOverlay(overlayID, {
-                                localPosition: partPosition,
-                                localRotation: Quat.multiply(controller.rotation, rotation)
-                            });
-                        }
-                    }(controller, overlayID, part));
-                } else if (part.type == "touchpad") {
-                    function resolveHardware(path) {
-                        var parts = path.split(".");
-                        function resolveInner(base, path, i) {
-                            if (i >= path.length) {
-                                return base;
-                            }
-                            return resolveInner(base[path[i]], path, ++i);
-                        }
-                        return resolveInner(Controller.Hardware, parts, 0);
-                    }
-
-                    var visibleInput = resolveHardware(part.visibleInput);
-                    var xinput = resolveHardware(part.xInput);
-                    var yinput = resolveHardware(part.yInput);
-
-                    // TODO: Touchpad inputs are currently only working for half
-                    // of the touchpad. When that is fixed, it would be useful
-                    // to update these to display the current finger position.
-                    mapping.from([visibleInput]).peek().to(function(value) {
-                    });
-                    mapping.from([xinput]).peek().to(function(value) {
-                    });
-                    mapping.from([yinput]).peek().invert().to(function(value) {
-                    });
-                } else if (part.type == "static") {
-                } else {
-                    print("TYPE NOT SUPPORTED: ", part.type);
-                }
-
-                controllerDisplay.overlays.push(overlayID);
-                if (!(partName in controllerDisplay.partOverlays)) {
-                    controllerDisplay.partOverlays[partName] = [];
-                }
-                controllerDisplay.partOverlays[partName].push(overlayID);
-            }
-        }
-    }
-    Controller.enableMapping(controllerDisplay.mappingName);
-    return controllerDisplay;
-}
-
-ControllerDisplay = function() {
-};
-
-deleteControllerDisplay = function(controllerDisplay) {
-    print("Deleting controller display");
-    for (var i = 0; i < controllerDisplay.overlays.length; ++i) {
-        Overlays.deleteOverlay(controllerDisplay.overlays[i]);
-    }
-    Controller.disableMapping(controllerDisplay.mappingName);
-}
-
diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js
index c8b3bd38c1..8c74bddc29 100644
--- a/tutorial/tutorial.js
+++ b/tutorial/tutorial.js
@@ -9,7 +9,6 @@
 //
 
 Script.include("entityData.js");
-Script.include("viveHandsv2.js");
 Script.include("lighter/createButaneLighter.js");
 Script.include("tutorialEntityIDs.js");
 
@@ -235,7 +234,7 @@ var stepDisableControllers = function(name) {
 }
 stepDisableControllers.prototype = {
     start: function(onFinish) {
-        controllerDisplayManager = new ControllerDisplayManager();
+        HMD.requestShowHandControllers();
         disableEverything();
 
         onFinish();
@@ -276,10 +275,7 @@ function reenableEverything() {
     setControllerPartLayer('touchpad', 'blank');
     setControllerPartLayer('tips', 'blank');
     MyAvatar.shouldRenderLocally = true;
-    if (controllerDisplayManager) {
-        controllerDisplayManager.destroy();
-        controllerDisplayManager = null;
-    }
+    HMD.requestHideHandControllers();
     setAwayEnabled(true);
 }
 
diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js
deleted file mode 100644
index 022717a29b..0000000000
--- a/tutorial/viveControllerConfiguration.js
+++ /dev/null
@@ -1,285 +0,0 @@
-var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND");
-var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND");
-
-var leftBaseRotation = Quat.multiply(
-    Quat.fromPitchYawRollDegrees(0, 0, 45),
-    Quat.multiply(
-        Quat.fromPitchYawRollDegrees(90, 0, 0),
-        Quat.fromPitchYawRollDegrees(0, 0, 90)
-    )
-);
-
-var rightBaseRotation = Quat.multiply(
-    Quat.fromPitchYawRollDegrees(0, 0, -45),
-    Quat.multiply(
-        Quat.fromPitchYawRollDegrees(90, 0, 0),
-        Quat.fromPitchYawRollDegrees(0, 0, -90)
-    )
-);
-
-// keep these in sync with the values from plugins/openvr/src/OpenVrHelpers.cpp:303
-var CONTROLLER_LATERAL_OFFSET = 0.0381;
-var CONTROLLER_VERTICAL_OFFSET = 0.0495;
-var CONTROLLER_FORWARD_OFFSET = 0.1371;
-var leftBasePosition = {
-    x: CONTROLLER_VERTICAL_OFFSET,
-    y: CONTROLLER_FORWARD_OFFSET,
-    z: CONTROLLER_LATERAL_OFFSET
-};
-var rightBasePosition = {
-    x: -CONTROLLER_VERTICAL_OFFSET,
-    y: CONTROLLER_FORWARD_OFFSET,
-    z: CONTROLLER_LATERAL_OFFSET
-};
-
-var viveNaturalDimensions = {
-    x: 0.1174320001155138,
-    y: 0.08361100335605443,
-    z: 0.21942697931081057
-};
-
-var viveNaturalPosition = {
-    x: 0,
-    y: -0.034076502197422087,
-    z: 0.06380049744620919
-};
-
-var viveModelURL = "atp:/controller/vive_body.fbx";
-var viveTipsModelURL = "atp:/controller/vive_tips.fbx"
-
-VIVE_CONTROLLER_CONFIGURATION_LEFT = {
-    name: "Vive",
-    controllers: [
-        {
-            modelURL: viveModelURL,
-            jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"),
-            naturalPosition: viveNaturalPosition,
-            rotation: leftBaseRotation,
-            position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, 45), leftBasePosition),
-
-            dimensions: viveNaturalDimensions,
-
-            parts: {
-                tips: {
-                    type: "static",
-                    modelURL: viveTipsModelURL,
-                    naturalPosition: {"x":-0.004377640783786774,"y":-0.034371938556432724,"z":0.06769277155399323},
-
-                    textureName: "Tex.Blank",
-
-                    defaultTextureLayer: "blank",
-                    textureLayers: {
-                        blank: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Blank.png",
-                        },
-                        trigger: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Trigger.png",
-                        },
-                        arrows: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Rotate.png",
-                        },
-                        grip: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Grip.png",
-                        },
-                        teleport: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Teleport.png",
-                        },
-                    }
-                },
-
-                // The touchpad type draws a dot indicating the current touch/thumb position
-                // and swaps in textures based on the thumb position.
-                touchpad: {
-                    type: "touchpad",
-                    modelURL: "atp:/controller/vive_trackpad.fbx",
-                    visibleInput: "Vive.RSTouch",
-                    xInput: "Vive.LX",
-                    yInput: "Vive.LY",
-                    naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823},
-                    minValue: 0.0,
-                    maxValue: 1.0,
-                    minPosition: { x: -0.035, y: 0.004, z: -0.005 },
-                    maxPosition: { x: -0.035, y: 0.004, z: -0.005 },
-                    disable_textureName: "Tex.touchpad-blank",
-
-                    disable_defaultTextureLayer: "blank",
-                    disable_textureLayers: {
-                        blank: {
-                            defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg",
-                        },
-                        teleport: {
-                            defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg",
-                        },
-                        arrows: {
-                            defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg",
-                        }
-                    }
-                },
-
-                trigger: {
-                    type: "rotational",
-                    modelURL: "atp:/controller/vive_trigger.fbx",
-                    input: Controller.Standard.LT,
-                    naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763},
-                    origin: { x: 0, y: -0.015, z: -0.00 },
-                    minValue: 0.0,
-                    maxValue: 1.0,
-                    axis: { x: -1, y: 0, z: 0 },
-                    maxAngle: 20,
-                },
-
-                l_grip: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_l_grip.fbx",
-                    naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226},
-                },
-
-                r_grip: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_r_grip.fbx",
-                    naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226},
-                },
-
-                sys_button: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_sys_button.fbx",
-                    naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311},
-                },
-
-                button: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_button.fbx",
-                    naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564}
-                },
-                button2: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_button.fbx",
-                    naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564}
-                },
-            },
-        },
-    ]
-};
-
-
-
-VIVE_CONTROLLER_CONFIGURATION_RIGHT = {
-    name: "Vive Right",
-    controllers: [
-        {
-            modelURL: viveModelURL,
-            jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"),
-
-            rotation: rightBaseRotation,
-            position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, -45), rightBasePosition),
-
-            dimensions: viveNaturalDimensions,
-
-            naturalPosition: {
-                x: 0,
-                y: -0.034076502197422087,
-                z: 0.06380049744620919
-            },
-
-            parts: {
-                tips: {
-                    type: "static",
-                    modelURL: viveTipsModelURL,
-                    naturalPosition: {"x":-0.004377640783786774,"y":-0.034371938556432724,"z":0.06769277155399323},
-
-                    textureName: "Tex.Blank",
-
-                    defaultTextureLayer: "blank",
-                    textureLayers: {
-                        blank: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Blank.png",
-                        },
-                        trigger: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Trigger.png",
-                        },
-                        arrows: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Rotate.png",
-                        },
-                        grip: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Grip.png",
-                        },
-                        teleport: {
-                            defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Teleport.png",
-                        },
-                    }
-                },
-
-                // The touchpad type draws a dot indicating the current touch/thumb position
-                // and swaps in textures based on the thumb position.
-                touchpad: {
-                    type: "touchpad",
-                    modelURL: "atp:/controller/vive_trackpad.fbx",
-                    visibleInput: "Vive.RSTouch",
-                    xInput: "Vive.RX",
-                    yInput: "Vive.RY",
-                    naturalPosition: { x: 0, y: 0.000979491975158453, z: 0.04872849956154823 },
-                    minValue: 0.0,
-                    maxValue: 1.0,
-                    minPosition: { x: -0.035, y: 0.004, z: -0.005 },
-                    maxPosition: { x: -0.035, y: 0.004, z: -0.005 },
-                    disable_textureName: "Tex.touchpad-blank",
-
-                    disable_defaultTextureLayer: "blank",
-                    disable_textureLayers: {
-                        blank: {
-                            defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg",
-                        },
-                        teleport: {
-                            defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg",
-                        },
-                        arrows: {
-                            defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg",
-                        }
-                    }
-                },
-
-                trigger: {
-                    type: "rotational",
-                    modelURL: "atp:/controller/vive_trigger.fbx",
-                    input: Controller.Standard.RT,
-                    naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763},
-                    origin: { x: 0, y: -0.015, z: -0.00 },
-                    minValue: 0.0,
-                    maxValue: 1.0,
-                    axis: { x: -1, y: 0, z: 0 },
-                    maxAngle: 25,
-                },
-
-                l_grip: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_l_grip.fbx",
-                    naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226},
-                },
-
-                r_grip: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_r_grip.fbx",
-                    naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226},
-                },
-
-                sys_button: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_sys_button.fbx",
-                    naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311},
-                },
-
-                button: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_button.fbx",
-                    naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564}
-                },
-                button2: {
-                    type: "static",
-                    modelURL: "atp:/controller/vive_button.fbx",
-                    naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564}
-                },
-            },
-        }
-    ]
-};
-
diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js
deleted file mode 100644
index 890a5e1588..0000000000
--- a/tutorial/viveHandsv2.js
+++ /dev/null
@@ -1,194 +0,0 @@
-if (!Function.prototype.bind) {
-  Function.prototype.bind = function(oThis) {
-    if (typeof this !== 'function') {
-      // closest thing possible to the ECMAScript 5
-      // internal IsCallable function
-      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
-    }
-
-    var aArgs   = Array.prototype.slice.call(arguments, 1),
-        fToBind = this,
-        fNOP    = function() {},
-        fBound  = function() {
-          return fToBind.apply(this instanceof fNOP
-                 ? this
-                 : oThis,
-                 aArgs.concat(Array.prototype.slice.call(arguments)));
-        };
-
-    if (this.prototype) {
-      // Function.prototype doesn't have a prototype property
-      fNOP.prototype = this.prototype;
-    }
-    fBound.prototype = new fNOP();
-
-    return fBound;
-  };
-}
-
-Script.setTimeout(function() { print('timeout') }, 100);
-
-Script.include("controllerDisplay.js");
-Script.include("viveControllerConfiguration.js");
-
-function debug() {
-    var args = Array.prototype.slice.call(arguments);
-    args.unshift("CONTROLLER DEBUG:");
-    print.apply(this, args);
-}
-
-var zeroPosition = { x: 0, y: 0, z: 0 };
-var zeroRotation = { x: 0, y: 0, z: 0, w: 1 };
-
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
-// Management of controller display                                          //
-///////////////////////////////////////////////////////////////////////////////
-ControllerDisplayManager = function() {
-    var self = this;
-    var controllerLeft = null;
-    var controllerRight = null;
-    var controllerCheckerIntervalID = null;
-
-    this.setLeftVisible = function(visible) {
-        print("settings controller display to visible");
-        if (controllerLeft) {
-            print("doign it...", visible);
-            controllerLeft.setVisible(visible);
-        }
-    };
-
-    this.setRightVisible = function(visible) {
-        print("settings controller display to visible");
-        if (controllerRight) {
-            print("doign it...", visible);
-            controllerRight.setVisible(visible);
-        }
-    };
-
-    function updateControllers() {
-        if (HMD.active) {
-            if ("Vive" in Controller.Hardware) {
-                if (!controllerLeft) {
-                    debug("Found vive left!");
-                    controllerLeft = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION_LEFT);
-                }
-                if (!controllerRight) {
-                    debug("Found vive right!");
-                    controllerRight = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION_RIGHT);
-                }
-                // We've found the controllers, we no longer need to look for active controllers
-                if (controllerCheckerIntervalID) {
-                    Script.clearInterval(controllerCheckerIntervalID);
-                    controllerCheckerIntervalID = null;
-                }
-            } else {
-                debug("HMD active, but no controllers found");
-                self.deleteControllerDisplays();
-                if (controllerCheckerIntervalID == null) {
-                    controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000);
-                }
-            }
-        } else {
-            debug("HMD inactive");
-            // We aren't in HMD mode, we no longer need to look for active controllers
-            if (controllerCheckerIntervalID) {
-                debug("Clearing controller checker interval");
-                Script.clearInterval(controllerCheckerIntervalID);
-                controllerCheckerIntervalID = null;
-            }
-            self.deleteControllerDisplays();
-        }
-    }
-
-    Messages.subscribe('Controller-Display');
-    var handleMessages = function(channel, message, sender) {
-        if (!controllerLeft && !controllerRight) {
-            return;
-        }
-
-        if (sender === MyAvatar.sessionUUID) {
-            if (channel === 'Controller-Display') {
-                var data = JSON.parse(message);
-                var name = data.name;
-                var visible = data.visible;
-                //c.setDisplayAnnotation(name, visible);
-                if (controllerLeft) {
-                    if (name in controllerLeft.annotations) {
-                        debug("hiding");
-                        for (var i = 0; i < controllerLeft.annotations[name].length; ++i) {
-                            debug("hiding", i);
-                            Overlays.editOverlay(controllerLeft.annotations[name][i], { visible: visible });
-                        }
-                    }
-                }
-                if (controllerRight) {
-                    if (name in controllerRight.annotations) {
-                        debug("hiding");
-                        for (var i = 0; i < controllerRight.annotations[name].length; ++i) {
-                            debug("hiding", i);
-                            Overlays.editOverlay(controllerRight.annotations[name][i], { visible: visible });
-                        }
-                    }
-                }
-            } else if (channel === 'Controller-Display-Parts') {
-                debug('here part');
-                var data = JSON.parse(message);
-                for (var name in data) {
-                    var visible = data[name];
-                    if (controllerLeft) {
-                        controllerLeft.setPartVisible(name, visible);
-                    }
-                    if (controllerRight) {
-                        controllerRight.setPartVisible(name, visible);
-                    }
-                }
-            } else if (channel === 'Controller-Set-Part-Layer') {
-                var data = JSON.parse(message);
-                for (var name in data) {
-                    var layer = data[name];
-                    if (controllerLeft) {
-                        controllerLeft.setLayerForPart(name, layer);
-                    }
-                    if (controllerRight) {
-                        controllerRight.setLayerForPart(name, layer);
-                    }
-                }
-            } else if (channel == 'Hifi-Object-Manipulation') {// && sender == MyAvatar.sessionUUID) {
-                //print("got manip");
-                var data = JSON.parse(message);
-                //print("post data", data);
-                var visible = data.action != 'equip';
-                //print("Calling...");
-                if (data.joint == "LeftHand") {
-                    self.setLeftVisible(visible);
-                 } else if (data.joint == "RightHand") {
-                    self.setRightVisible(visible);
-                 }
-            }
-        }
-    }
-
-    Messages.messageReceived.connect(handleMessages);
-
-    this.deleteControllerDisplays = function() {
-        if (controllerLeft) {
-            deleteControllerDisplay(controllerLeft);
-            controllerLeft = null;
-        }
-        if (controllerRight) {
-            deleteControllerDisplay(controllerRight);
-            controllerRight = null;
-        }
-    };
-
-    this.destroy = function() {
-        print("Destroying controller display");
-        Messages.messageReceived.disconnect(handleMessages);
-        self.deleteControllerDisplays();
-    };
-
-    HMD.displayModeChanged.connect(updateControllers);
-
-    updateControllers();
-}