diff --git a/src/components/grabbable-toggle.js b/src/components/grabbable-toggle.js
index 54b62bc574b4a61be7843c4fefda61e165a231b1..55b022b01fb361c7d6441fc5f008f31ae95092e0 100644
--- a/src/components/grabbable-toggle.js
+++ b/src/components/grabbable-toggle.js
@@ -1,7 +1,7 @@
 AFRAME.registerComponent("grabbable-toggle", {
   schema: {
-    primaryReleaseEvents: { default: ["hand_release", "action_release"] },
-    secondaryReleaseEvents: { default: ["secondary_hand_release", "secondary_action_release"] }
+    primaryReleaseEvents: { default: ["primary_hand_release"] },
+    secondaryReleaseEvents: { default: ["secondary_hand_release"] }
   },
 
   init() {
diff --git a/src/components/tools/pen.js b/src/components/tools/pen.js
index 78f09bba1de45fb878f072e8cf8a185b7934aacd..214591f6c7825b8f0b4d3e00ce43f02a9141d673 100644
--- a/src/components/tools/pen.js
+++ b/src/components/tools/pen.js
@@ -14,12 +14,16 @@ AFRAME.registerComponent("pen", {
     defaultDirection: { default: { x: 1, y: 0, z: 0 } },
     camera: { type: "selector" },
     drawing: { type: "string" },
-    drawingManager: { type: "string" }
+    drawingManager: { type: "string" },
+    color: { type: "color", default: "#FF0000" },
+    availableColors: {
+      default: ["#FF0033", "FFFF00", "#00FF33", "#0099FF", "#9900FF", "#FFFFFF", "#000000"]
+    }
   },
 
   init() {
-    this.startDraw = this.startDraw.bind(this);
-    this.endDraw = this.endDraw.bind(this);
+    this.stateAdded = this.stateAdded.bind(this);
+    this.stateRemoved = this.stateRemoved.bind(this);
 
     this.timeSinceLastDraw = 0;
 
@@ -34,18 +38,22 @@ AFRAME.registerComponent("pen", {
     this.normal = new THREE.Vector3();
 
     this.worldPosition = new THREE.Vector3();
+
+    this.el.setAttribute("material", { color: this.data.color });
+
+    this.colorIndex = 0;
   },
 
   play() {
     this.drawingManager = document.querySelector(this.data.drawingManager).components["drawing-manager"];
 
-    this.el.parentNode.addEventListener("activate-start", this.startDraw);
-    this.el.parentNode.addEventListener("activate-end", this.endDraw);
+    this.el.parentNode.addEventListener("stateadded", this.stateAdded);
+    this.el.parentNode.addEventListener("stateremoved", this.stateRemoved);
   },
 
   pause() {
-    this.el.parentNode.removeEventListener("activate-start", this.startDraw);
-    this.el.parentNode.removeEventListener("activate-end", this.endDraw);
+    this.el.parentNode.removeEventListener("stateadded", this.stateAdded);
+    this.el.parentNode.removeEventListener("stateremoved", this.stateRemoved);
   },
 
   tick(t, dt) {
@@ -84,13 +92,8 @@ AFRAME.registerComponent("pen", {
     if (this.currentDrawing) {
       this.el.object3D.getWorldPosition(this.worldPosition);
       this.getNormal(this.normal, this.worldPosition, this.direction);
-      const color =
-        "#" +
-        Math.random()
-          .toString(16)
-          .slice(2, 8);
-      this.el.setAttribute("material", { color: color });
-      this.currentDrawing.startDraw(this.worldPosition, this.direction, this.normal, color);
+
+      this.currentDrawing.startDraw(this.worldPosition, this.direction, this.normal, this.data.color);
     }
   },
 
@@ -103,5 +106,33 @@ AFRAME.registerComponent("pen", {
       this.drawingManager.returnDrawing(this);
       this.currentDrawing = null;
     }
+  },
+
+  changeColor(mod) {
+    this.colorIndex = (this.colorIndex + mod + this.data.availableColors.length) % this.data.availableColors.length;
+    this.data.color = this.data.availableColors[this.colorIndex];
+    this.el.setAttribute("material", { color: this.data.color });
+  },
+
+  stateAdded(evt) {
+    switch (evt.detail) {
+      case "activated":
+        this.startDraw();
+        break;
+      case "colorNext":
+        this.changeColor(1);
+        break;
+      case "colorPrev":
+        this.changeColor(-1);
+        break;
+    }
+  },
+
+  stateRemoved(evt) {
+    switch (evt.detail) {
+      case "activated":
+        this.endDraw();
+        break;
+    }
   }
 });
diff --git a/src/hub.html b/src/hub.html
index 682ad418ae554f44f2d5661eebc7d1af1ef964b5..4f583366f64a59d527b9be96fe50faccea476d26 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -193,8 +193,10 @@
                     grabbable-toggle
                     grabbable="maxGrabbers: 1; maxGrabBehavior: drop;"
                     hoverable
-                    activatable__hands="buttonStartEvent: secondary_action_grab; buttonEndEvent: secondary_action_release;"
-                    activatable__cursor="buttonStartEvent: secondary-cursor-grab; buttonEndEvent: secondary-cursor-release;"
+                    activatable__drawHand="buttonStartEvent: secondary_hand_grab; buttonEndEvent: secondary_hand_release;"
+                    activatable__drawCursor="buttonStartEvent: secondary-cursor-grab; buttonEndEvent: secondary-cursor-release;"
+                    activatable__colorNext="buttonStartEvent: tertiary_action_north; buttonEndEvent: action_primary_up; activatedState: colorNext;"
+                    activatable__colorPrev="buttonStartEvent: tertiary_action_south; buttonEndEvent: action_primary_up; activatedState: colorPrev;"
                     scale="0.5 0.5 0.5"
                 >
                     <a-sphere 
@@ -239,14 +241,14 @@
                          colliderEventProperty: els;
                          colliderEndEvent: collisions; 
                          colliderEndEventProperty: clearedEls;
-                         grabStartButtons: hand_grab, secondary_hand_grab; 
-                         grabEndButtons: hand_release, secondary_hand_release;
-                         stretchStartButtons: hand_grab, secondary_hand_grab; 
-                         stretchEndButtons: hand_release, secondary_hand_release;
+                         grabStartButtons: primary_hand_grab, secondary_hand_grab; 
+                         grabEndButtons: primary_hand_release, secondary_hand_release;
+                         stretchStartButtons: primary_hand_grab, secondary_hand_grab; 
+                         stretchEndButtons: primary_hand_release, secondary_hand_release;
                          dragDropStartButtons: hand_grab, secondary_hand_grab; 
                          dragDropEndButtons: hand_release, secondary_hand_release;
-                         activateStartButtons: secondary_hand_grab, secondary_action_grab; 
-                         activateEndButtons: secondary_hand_release, secondary_action_release;"
+                         activateStartButtons: secondary_hand_grab, tertiary_action_north, tertiary_action_south; 
+                         activateEndButtons: secondary_hand_release, action_primary_up;"
                      collision-filter="collisionForces: false"
                      physics-collider
             ></a-mixin>
@@ -279,14 +281,14 @@
                 colliderEventProperty: els;
                 colliderEndEvent: raycaster-intersection-cleared; 
                 colliderEndEventProperty: clearedEls;
-                grabStartButtons: cursor-grab, hand_grab, secondary_hand_grab; 
-                grabEndButtons: cursor-release, hand_release, secondary_hand_release;
-                stretchStartButtons: cursor-grab, hand_grab, secondary_hand_grab; 
-                stretchEndButtons: cursor-release, hand_release, secondary_hand_release;
-                dragDropStartButtons: cursor-grab, hand_grab, secondary_hand_grab; 
-                dragDropEndButtons: cursor-release, hand_release, secondary_hand_release;
-                activateStartButtons: secondary_hand_grab, secondary_action_grab, secondary-cursor-grab; 
-                activateEndButtons: secondary_hand_release, secondary_action_release, secondary-cursor-release;"
+                grabStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab; 
+                grabEndButtons: cursor-release, primary_hand_release, secondary_hand_release;
+                stretchStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab;
+                stretchEndButtons: cursor-release, primary_hand_release, secondary_hand_release;
+                dragDropStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab;
+                dragDropEndButtons: cursor-release, primary_hand_release, secondary_hand_release;
+                activateStartButtons: secondary-cursor-grab, secondary_hand_grab, tertiary_action_north, tertiary_action_south; 
+                activateEndButtons: secondary-cursor-release, secondary_hand_release, action_primary_up;"
             segments-height="9"
             segments-width="9"
             event-repeater="events: raycaster-intersection, raycaster-intersection-cleared; eventSource: #cursor-controller"
diff --git a/src/input-mappings.js b/src/input-mappings.js
index fa2c39126db95fd69d03a87d7e28b6f470d02844..58f7cdc39608a4787c9678586fd6a93bfbd6b430 100644
--- a/src/input-mappings.js
+++ b/src/input-mappings.js
@@ -52,28 +52,27 @@ const config = {
         trackpad_dpad4_pressed_west_down: { right: "snap_rotate_left" },
         trackpad_dpad4_pressed_east_down: { right: "snap_rotate_right" },
         trackpad_dpad4_pressed_center_down: { right: "action_primary_down" },
-        trackpad_dpad4_pressed_north_down: { right: "action_primary_down" },
-        trackpad_dpad4_pressed_south_down: { right: "action_primary_down" },
-        trackpadup: { right: "action_primary_up" },
+        trackpad_dpad4_pressed_north_down: { left: "tertiary_action_north", right: "tertiary_action_north" },
+        trackpad_dpad4_pressed_south_down: { left: "tertiary_action_south", right: "tertiary_action_south" },
+        trackpadup: { left: "action_primary_up", right: "action_primary_up" },
         menudown: "thumb_down",
         menuup: "thumb_up",
-        gripdown: ["action_grab", "middle_ring_pinky_down"],
-        gripup: ["action_release", "middle_ring_pinky_up"],
+        gripdown: ["primary_action_grab", "middle_ring_pinky_down"],
+        gripup: ["primary_action_release", "middle_ring_pinky_up"],
         trackpadtouchstart: "thumb_down",
         trackpadtouchend: "thumb_up",
         triggerdown: ["secondary_action_grab", "index_down"],
         triggerup: ["secondary_action_release", "index_up"],
-        scroll: { right: "move_duck" }
+        scroll: { right: "scroll_move" }
       },
       "oculus-touch-controls": {
-        joystick_dpad4_west: {
-          right: "snap_rotate_left"
-        },
-        joystick_dpad4_east: {
-          right: "snap_rotate_right"
-        },
-        gripdown: ["action_grab", "middle_ring_pinky_down"],
-        gripup: ["action_release", "middle_ring_pinky_up"],
+        joystick_dpad4_west: { right: "snap_rotate_left" },
+        joystick_dpad4_east: { right: "snap_rotate_right" },
+        joystick_dpad4_north: { left: "tertiary_action_north", right: "tertiary_action_north" },
+        joystick_dpad4_south: { left: "tertiary_action_south", right: "tertiary_action_south" },
+        joystick_dpad4_center: { left: "action_primary_up", right: "action_primary_up" },
+        gripdown: ["primary_action_grab", "middle_ring_pinky_down"],
+        gripup: ["primary_action_release", "middle_ring_pinky_up"],
         abuttontouchstart: "thumb_down",
         abuttontouchend: "thumb_up",
         bbuttontouchstart: "thumb_down",
@@ -88,7 +87,7 @@ const config = {
         thumbsticktouchend: "thumb_up",
         triggerdown: ["secondary_action_grab", "index_down"],
         triggerup: ["secondary_action_release", "index_up"],
-        "axismove.reverseY": { left: "move", right: "move_duck" },
+        "axismove.reverseY": { left: "move", right: "scroll_move" },
         abuttondown: "action_primary_down",
         abuttonup: "action_primary_up"
       },
@@ -102,17 +101,19 @@ const config = {
         "trackpad.pressedmove": { left: "move" },
         joystick_dpad4_pressed_west_down: { right: "snap_rotate_left" },
         joystick_dpad4_pressed_east_down: { right: "snap_rotate_right" },
+        trackpad_dpad4_pressed_north_down: { left: "tertiary_action_north", right: "tertiary_action_north" },
+        trackpad_dpad4_pressed_south_down: { left: "tertiary_action_south", right: "tertiary_action_south" },
         trackpaddown: { right: "action_primary_down" },
-        trackpadup: { right: "action_primary_up" },
+        trackpadup: { left: "action_primary_up", right: "action_primary_up" },
         menudown: "thumb_down",
         menuup: "thumb_up",
-        gripdown: ["action_grab", "middle_ring_pinky_down"],
-        gripup: ["action_release", "middle_ring_pinky_up"],
+        gripdown: ["primary_action_grab", "middle_ring_pinky_down"],
+        gripup: ["primary_action_release", "middle_ring_pinky_up"],
         trackpadtouchstart: "thumb_down",
         trackpadtouchend: "thumb_up",
         triggerdown: ["secondary_action_grab", "index_down"],
         triggerup: ["secondary_action_release", "index_up"],
-        axisMoveWithDeadzone: { left: "move", right: "move_duck" }
+        axisMoveWithDeadzone: { left: "move", right: "scroll_move" }
       },
       "daydream-controls": {
         trackpad_dpad4_pressed_west_down: "snap_rotate_left",
@@ -121,7 +122,7 @@ const config = {
         trackpad_dpad4_pressed_north_down: ["action_primary_down"],
         trackpad_dpad4_pressed_south_down: ["action_primary_down"],
         trackpadup: ["action_primary_up"],
-        axisMoveWithDeadzone: "move_duck"
+        axisMoveWithDeadzone: "scroll_move"
       },
       "gearvr-controls": {
         trackpad_dpad4_pressed_west_down: "snap_rotate_left",
@@ -132,7 +133,7 @@ const config = {
         trackpadup: ["action_primary_up"],
         triggerdown: ["action_primary_down"],
         triggerup: ["action_primary_up"],
-        scroll: "move_duck"
+        scroll: "scroll_move"
       },
       "oculus-go-controls": {
         trackpad_dpad4_pressed_west_down: "snap_rotate_left",
@@ -143,7 +144,7 @@ const config = {
         trackpadup: ["action_primary_up"],
         triggerdown: ["action_secondary_down"],
         triggerup: ["action_secondary_up"],
-        scroll: "move_duck"
+        scroll: "scroll_move"
       },
       keyboard: {
         m_press: "action_mute",
@@ -170,44 +171,6 @@ const config = {
         arrowright_down: "d_down",
         arrowright_up: "d_up"
       }
-    },
-    hud: {
-      "vive-controls": {
-        triggerdown: ["action_grab", "index_down"],
-        triggerup: ["action_release", "index_up"]
-      },
-      "oculus-touch-controls": {
-        abuttondown: "action_ui_select_down",
-        abuttonup: "action_ui_select_up",
-        gripdown: "middle_ring_pinky_down",
-        gripup: "middle_ring_pinky_up",
-        abuttontouchstart: "thumb_down",
-        abuttontouchend: "thumb_up",
-        bbuttontouchstart: "thumb_down",
-        bbuttontouchend: "thumb_up",
-        xbuttontouchstart: "thumb_down",
-        xbuttontouchend: "thumb_up",
-        ybuttontouchstart: "thumb_down",
-        ybuttontouchend: "thumb_up",
-        surfacetouchstart: "thumb_down",
-        surfacetouchend: "thumb_up",
-        thumbsticktouchstart: "thumb_down",
-        thumbsticktouchend: "thumb_up",
-        triggertouchstart: "index_down",
-        triggertouchend: "index_up"
-      },
-      "daydream-controls": {
-        trackpaddown: { right: "action_ui_select_down" },
-        trackpadup: { right: "action_ui_select_up" }
-      },
-      "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/utils/action-event-handler.js b/src/utils/action-event-handler.js
index 8e0676a455e126a86c56ea495eba4d310baae9ff..a5d057a448d3520bd05df0e922d027cea2fe5965 100644
--- a/src/utils/action-event-handler.js
+++ b/src/utils/action-event-handler.js
@@ -10,26 +10,28 @@ export default class ActionEventHandler {
 
     this.onPrimaryDown = this.onPrimaryDown.bind(this);
     this.onPrimaryUp = this.onPrimaryUp.bind(this);
+    this.onSecondaryDown = this.onSecondaryDown.bind(this);
+    this.onSecondaryUp = this.onSecondaryUp.bind(this);
     this.onPrimaryGrab = this.onPrimaryGrab.bind(this);
     this.onPrimaryRelease = this.onPrimaryRelease.bind(this);
     this.onSecondaryGrab = this.onSecondaryGrab.bind(this);
     this.onSecondaryRelease = this.onSecondaryRelease.bind(this);
     this.onCardboardButtonDown = this.onCardboardButtonDown.bind(this);
     this.onCardboardButtonUp = this.onCardboardButtonUp.bind(this);
-    this.onMoveDuck = this.onMoveDuck.bind(this);
+    this.onScrollMove = this.onScrollMove.bind(this);
     this.addEventListeners();
   }
 
   addEventListeners() {
     this.scene.addEventListener("action_primary_down", this.onPrimaryDown);
     this.scene.addEventListener("action_primary_up", this.onPrimaryUp);
-    this.scene.addEventListener("action_secondary_down", this.onPrimaryDown);
-    this.scene.addEventListener("action_secondary_up", this.onPrimaryUp);
-    this.scene.addEventListener("action_grab", this.onPrimaryGrab);
-    this.scene.addEventListener("action_release", this.onPrimaryRelease);
+    this.scene.addEventListener("action_secondary_down", this.onSecondaryDown);
+    this.scene.addEventListener("action_secondary_up", this.onSecondaryUp);
+    this.scene.addEventListener("primary_action_grab", this.onPrimaryGrab);
+    this.scene.addEventListener("primary_action_release", this.onPrimaryRelease);
     this.scene.addEventListener("secondary_action_grab", this.onSecondaryGrab);
     this.scene.addEventListener("secondary_action_release", this.onSecondaryRelease);
-    this.scene.addEventListener("move_duck", this.onMoveDuck);
+    this.scene.addEventListener("scroll", this.onScrollMove);
     this.scene.addEventListener("cardboardbuttondown", this.onCardboardButtonDown); // TODO: These should be actions
     this.scene.addEventListener("cardboardbuttonup", this.onCardboardButtonUp);
   }
@@ -37,18 +39,18 @@ export default class ActionEventHandler {
   tearDown() {
     this.scene.removeEventListener("action_primary_down", this.onPrimaryDown);
     this.scene.removeEventListener("action_primary_up", this.onPrimaryUp);
-    this.scene.removeEventListener("action_secondary_down", this.onPrimaryDown);
-    this.scene.removeEventListener("action_secondary_up", this.onPrimaryUp);
-    this.scene.removeEventListener("action_grab", this.onPrimaryGrab);
-    this.scene.removeEventListener("action_release", this.onPrimaryRelease);
+    this.scene.removeEventListener("action_secondary_down", this.onSecondaryDown);
+    this.scene.removeEventListener("action_secondary_up", this.onSecondaryUp);
+    this.scene.removeEventListener("primary_action_grab", this.onPrimaryGrab);
+    this.scene.removeEventListener("primary_action_release", this.onPrimaryRelease);
     this.scene.removeEventListener("secondary_action_grab", this.onSecondaryGrab);
     this.scene.removeEventListener("secondary_action_release", this.onSecondaryRelease);
-    this.scene.removeEventListener("move_duck", this.onMoveDuck);
+    this.scene.removeEventListener("scroll_move", this.onScrollMove);
     this.scene.removeEventListener("cardboardbuttondown", this.onCardboardButtonDown);
     this.scene.removeEventListener("cardboardbuttonup", this.onCardboardButtonUp);
   }
 
-  onMoveDuck(e) {
+  onScrollMove(e) {
     this.cursor.changeDistanceMod(-e.detail.axis[1] / 8);
   }
 
@@ -65,11 +67,11 @@ export default class ActionEventHandler {
   }
 
   onGrab(e, event) {
+    event = event || e.type;
     const superHand = e.target.components["super-hands"];
     const isCursorHand = this.isHandThatAlsoDrivesCursor(e.target);
-
     if (isCursorHand && !this.isCursorInteracting) {
-      if (superHand.state.has("hover-start")) {
+      if (superHand.state.has("hover-start") || superHand.state.get("grab-start")) {
         e.target.emit(event);
       } else {
         this.isCursorInteracting = this.cursor.startInteraction();
@@ -82,8 +84,8 @@ export default class ActionEventHandler {
   }
 
   onRelease(e, event) {
+    event = event || e.type;
     const isCursorHand = this.isHandThatAlsoDrivesCursor(e.target);
-
     if (this.isCursorInteracting && isCursorHand) {
       //need to check both grab-start and hover-start in the case that the spawner is being grabbed this frame
       if (this.isSticky(this.cursorHand.state.get("grab-start") || this.cursorHand.state.get("hover-start"))) {
@@ -99,11 +101,11 @@ export default class ActionEventHandler {
   }
 
   onPrimaryGrab(e) {
-    this.onGrab(e, "hand_grab");
+    this.onGrab(e, "primary_hand_grab");
   }
 
   onPrimaryRelease(e) {
-    this.onRelease(e, "hand_release");
+    this.onRelease(e, "primary_hand_release");
   }
 
   onSecondaryGrab(e) {
@@ -114,8 +116,8 @@ export default class ActionEventHandler {
     this.onRelease(e, "secondary_hand_release");
   }
 
-  onPrimaryDown(e) {
-    this.onGrab(e, "secondary_hand_grab");
+  onDown(e, event) {
+    this.onGrab(e, event);
 
     if (this.isHandThatAlsoDrivesCursor(e.target) && !this.isCursorInteracting) {
       this.cursor.setCursorVisibility(false);
@@ -125,7 +127,7 @@ export default class ActionEventHandler {
     }
   }
 
-  onPrimaryUp(e) {
+  onUp(e, event) {
     if (this.isTeleporting && this.isHandThatAlsoDrivesCursor(e.target)) {
       const superHand = e.target.components["super-hands"];
       this.cursor.setCursorVisibility(!superHand.state.has("hover-start"));
@@ -133,10 +135,26 @@ export default class ActionEventHandler {
       e.target.emit(button + "up");
       this.isTeleporting = false;
     } else {
-      this.onRelease(e, "secondary_hand_release");
+      this.onRelease(e, event);
     }
   }
 
+  onPrimaryDown(e) {
+    this.onDown(e, "primary_hand_grab");
+  }
+
+  onPrimaryUp(e) {
+    this.onUp(e, "primary_hand_release");
+  }
+
+  onSecondaryDown(e) {
+    this.onDown(e, "secondary_hand_grab");
+  }
+
+  onSecondaryUp(e) {
+    this.onUp(e, "secondary_hand_release");
+  }
+
   onCardboardButtonDown(e) {
     this.isCursorInteracting = this.cursor.startInteraction();
     if (this.isCursorInteracting) {