diff --git a/src/hub.html b/src/hub.html
index 5af532ed669a0578a279f7b6edc84e3307b6bd01..cebb916097781d9c110270019725d7ae69c2106c 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -165,7 +165,7 @@
                     class="pen interactable toggle"
                     super-networked-interactable="counter: #pen-counter;"
                     body="type: dynamic; shape: none; mass: 1;"
-                    grabbable
+                    grabbable="maxGrabbers: 1"
                     sticky-object="autoLockOnRelease: true; autoLockOnLoad: true;"
                     hoverable
                     scale="0.5 0.5 0.5"
diff --git a/src/systems/userinput/bindings/vive-user.js b/src/systems/userinput/bindings/vive-user.js
index 1a94b245f848417411b5ad9cd4d9cc81086afe7f..1da37128181c77e59a3fbd8c63e836977c032b73 100644
--- a/src/systems/userinput/bindings/vive-user.js
+++ b/src/systems/userinput/bindings/vive-user.js
@@ -21,6 +21,9 @@ const lDpadEast = v("left/dpad/east");
 const lDpadWest = v("left/dpad/west");
 const lDpadCenter = v("left/dpad/center");
 const lTriggerFalling = v("left/trigger/falling");
+const lTriggerFallingStopDrawing = v("left/trigger/falling/stopDrawing");
+const lGripFallingStopDrawing = v("left/grip/falling/stopDrawing");
+
 const lTriggerRising = v("left/trigger/rising");
 const lTriggerRisingGrab = v("right/trigger/rising/grab");
 const lGripRisingGrab = v("right/grab/rising/grab");
@@ -78,6 +81,51 @@ const keyboardSnapLeft = k("snap-left");
 const keyboardCharacterAcceleration = k("characterAcceleration");
 const keyboardBoost = k("boost");
 
+const teleportLeft = [
+  {
+    src: { value: lButton("trigger").pressed },
+    dest: { value: lTriggerStartTeleport },
+    xform: xforms.rising,
+    root: lTriggerRising,
+    priority: 100
+  },
+  {
+    src: {
+      bool: lTouchpadRising,
+      value: lDpadCenter
+    },
+    dest: { value: lDpadCenterStartTeleport },
+    xform: xforms.copyIfTrue
+  },
+  {
+    src: [lTriggerStartTeleport, lDpadCenterStartTeleport],
+    dest: { value: paths.actions.leftHand.startTeleport },
+    xform: xforms.any
+  }
+];
+const teleportRight = [
+  {
+    src: { value: rButton("trigger").pressed },
+    dest: { value: rTriggerStartTeleport },
+    xform: xforms.rising,
+    root: rTriggerRising,
+    priority: 100
+  },
+  {
+    src: {
+      bool: rTouchpadRising,
+      value: rDpadCenter
+    },
+    dest: { value: rDpadCenterStartTeleport },
+    xform: xforms.copyIfTrue
+  },
+  {
+    src: [rTriggerStartTeleport, rDpadCenterStartTeleport],
+    dest: { value: paths.actions.rightHand.startTeleport },
+    xform: xforms.any
+  }
+];
+
 export const viveUserBindings = {
   [sets.global]: [
     {
@@ -110,7 +158,16 @@ export const viveUserBindings = {
         west: lDpadWest,
         center: lDpadCenter
       },
-      xform: xforms.vec2dpad(0.2, false, true)
+      xform: xforms.vec2dpad(0.35)
+    },
+    {
+      src: {
+        value: lButton("touchpad").pressed
+      },
+      dest: {
+        value: lTouchpadRising
+      },
+      xform: xforms.rising
     },
     {
       src: {
@@ -133,7 +190,7 @@ export const viveUserBindings = {
         west: rDpadWest,
         center: rDpadCenter
       },
-      xform: xforms.vec2dpad(0.2)
+      xform: xforms.vec2dpad(0.35)
     },
     {
       src: {
@@ -283,13 +340,6 @@ export const viveUserBindings = {
       src: { value: lPose },
       dest: { value: paths.actions.leftHand.pose },
       xform: xforms.copy
-    },
-    {
-      src: { value: lButton("trigger").pressed },
-      dest: { value: paths.actions.leftHand.stopTeleport },
-      xform: xforms.falling,
-      root: lTriggerFalling,
-      priority: 100
     }
   ],
   [sets.rightHandTeleporting]: [
@@ -311,28 +361,8 @@ export const viveUserBindings = {
       xform: xforms.any
     }
   ],
-  [sets.leftHandHoveringOnNothing]: [
-    {
-      src: { value: lButton("trigger").pressed },
-      dest: { value: lTriggerStartTeleport },
-      xform: xforms.rising,
-      root: lTriggerRising,
-      priority: 100
-    },
-    {
-      src: {
-        bool: lTouchpadRising,
-        value: lDpadCenter
-      },
-      dest: { value: lDpadCenterStartTeleport },
-      xform: xforms.copyIfTrue
-    },
-    {
-      src: [lTriggerStartTeleport, lDpadCenterStartTeleport],
-      dest: { value: paths.actions.leftHand.startTeleport },
-      xform: xforms.any
-    }
-  ],
+  [sets.leftHandHoveringOnNothing]: [...teleportLeft],
+
   [sets.leftHandTeleporting]: [
     {
       src: { value: lButton("trigger").pressed },
@@ -353,28 +383,7 @@ export const viveUserBindings = {
     }
   ],
 
-  [sets.rightHandHoveringOnNothing]: [
-    {
-      src: { value: rButton("trigger").pressed },
-      dest: { value: rTriggerStartTeleport },
-      xform: xforms.rising,
-      root: rTriggerRising,
-      priority: 100
-    },
-    {
-      src: {
-        bool: rTouchpadRising,
-        value: rDpadCenter
-      },
-      dest: { value: rDpadCenterStartTeleport },
-      xform: xforms.copyIfTrue
-    },
-    {
-      src: [rTriggerStartTeleport, rDpadCenterStartTeleport],
-      dest: { value: paths.actions.rightHand.startTeleport },
-      xform: xforms.any
-    }
-  ],
+  [sets.rightHandHoveringOnNothing]: [...teleportRight],
 
   [sets.cursorHoveringOnNothing]: [],
 
@@ -422,6 +431,14 @@ export const viveUserBindings = {
 
   [sets.leftHandHoveringOnPen]: [],
   [sets.leftHandHoldingPen]: [
+    {
+      src: {
+        bool: lTouchpadRising,
+        value: lDpadCenter
+      },
+      dest: { value: paths.actions.leftHand.startTeleport },
+      xform: xforms.copyIfTrue
+    },
     {
       src: { value: lButton("trigger").pressed },
       dest: { value: paths.actions.leftHand.startDrawing },
@@ -429,40 +446,41 @@ export const viveUserBindings = {
     },
     {
       src: { value: lButton("trigger").pressed },
-      dest: { value: paths.actions.leftHand.stopDrawing },
+      dest: { value: lTriggerFallingStopDrawing },
       xform: xforms.falling
     },
     {
-      src: {
-        value: lButton("touchpad").pressed
-      },
-      dest: {
-        value: lTouchpadRising
-      },
-      xform: xforms.rising
+      src: { value: lButton("grip").pressed },
+      dest: { value: lGripFallingStopDrawing },
+      xform: xforms.falling
+    },
+    {
+      src: [lTriggerFallingStopDrawing, lGripFallingStopDrawing],
+      dest: { value: paths.actions.leftHand.stopDrawing },
+      xform: xforms.any
     },
     {
       src: {
         bool: lTouchpadRising,
-        value: lDpadEast
+        value: lDpadNorth
       },
       dest: {
         value: paths.actions.leftHand.penNextColor
       },
       xform: xforms.copyIfTrue,
-      root: lDpadEast,
+      root: lDpadNorth,
       priority: 200
     },
     {
       src: {
         bool: lTouchpadRising,
-        value: lDpadWest
+        value: lDpadSouth
       },
       dest: {
         value: paths.actions.leftHand.penPrevColor
       },
       xform: xforms.copyIfTrue,
-      root: lDpadWest,
+      root: lDpadSouth,
       priority: 200
     },
     {
@@ -532,6 +550,14 @@ export const viveUserBindings = {
   [sets.cursorHoveringOnPen]: [],
 
   [sets.cursorHoldingPen]: [
+    {
+      src: {
+        bool: rTouchpadRising,
+        value: rDpadCenter
+      },
+      dest: { value: paths.actions.rightHand.startTeleport },
+      xform: xforms.copyIfTrue
+    },
     {
       src: { value: rButton("trigger").pressed },
       dest: { value: paths.actions.cursor.startDrawing },
@@ -550,7 +576,31 @@ export const viveUserBindings = {
         touching: rButton("touchpad").touched
       },
       dest: { value: paths.actions.cursor.scalePenTip },
-      xform: xforms.touch_axis_scroll(-0.1)
+      xform: xforms.touch_axis_scroll(0.1)
+    },
+    {
+      src: {
+        bool: rTouchpadRising,
+        value: rDpadNorth
+      },
+      dest: {
+        value: paths.actions.cursor.penNextColor
+      },
+      xform: xforms.copyIfTrue,
+      root: rDpadNorth,
+      priority: 200
+    },
+    {
+      src: {
+        bool: rTouchpadRising,
+        value: rDpadSouth
+      },
+      dest: {
+        value: paths.actions.cursor.penPrevColor
+      },
+      xform: xforms.copyIfTrue,
+      root: rDpadSouth,
+      priority: 200
     }
   ],
 
@@ -601,6 +651,14 @@ export const viveUserBindings = {
   ],
   [sets.rightHandHoveringOnPen]: [],
   [sets.rightHandHoldingPen]: [
+    {
+      src: {
+        bool: rTouchpadRising,
+        value: rDpadCenter
+      },
+      dest: { value: paths.actions.rightHand.startTeleport },
+      xform: xforms.copyIfTrue
+    },
     {
       src: { value: rButton("trigger").pressed },
       dest: { value: paths.actions.rightHand.startDrawing },
@@ -613,37 +671,28 @@ export const viveUserBindings = {
       root: rTriggerFalling,
       priority: 300
     },
-    {
-      src: {
-        value: rButton("touchpad").pressed
-      },
-      dest: {
-        value: rTouchpadRising
-      },
-      xform: xforms.rising
-    },
     {
       src: {
         bool: rTouchpadRising,
-        value: rDpadEast
+        value: rDpadNorth
       },
       dest: {
         value: paths.actions.rightHand.penNextColor
       },
       xform: xforms.copyIfTrue,
-      root: rDpadEast,
+      root: rDpadNorth,
       priority: 200
     },
     {
       src: {
         bool: rTouchpadRising,
-        value: rDpadWest
+        value: rDpadSouth
       },
       dest: {
         value: paths.actions.rightHand.penPrevColor
       },
       xform: xforms.copyIfTrue,
-      root: rDpadWest,
+      root: rDpadSouth,
       priority: 200
     },
     {
diff --git a/src/systems/userinput/resolve-action-sets.js b/src/systems/userinput/resolve-action-sets.js
index 0892d347e96cebc2e54960961f0ee51f395e0b06..18a945daaf7a41e4230394a8178e150a78696787 100644
--- a/src/systems/userinput/resolve-action-sets.js
+++ b/src/systems/userinput/resolve-action-sets.js
@@ -34,6 +34,7 @@ export function updateActionSetsBasedOnSuperhands() {
     leftHandState.get("grab-start").matches(".icamera, .icamera *");
   const leftHandHovering = !leftTeleporter.active && leftHandState.has("hover-start");
   const leftHandHoveringOnNothing = !leftHandHovering && !leftHandState.has("grab-start");
+  const leftHandTeleporting = leftTeleporter.active;
 
   const cursorGrabbing = cursorHand.has("grab-start");
 
@@ -135,6 +136,7 @@ export function updateActionSetsBasedOnSuperhands() {
   userinput.toggleActive(sets.leftHandHoldingPen, leftHandHoldingPen);
   userinput.toggleActive(sets.leftHandHoldingInteractable, leftHandHoldingInteractable);
   userinput.toggleActive(sets.leftHandHoldingCamera, leftHandHoldingCamera);
+  userinput.toggleActive(sets.leftHandTeleporting, leftHandTeleporting);
 
   userinput.toggleActive(sets.rightHandHoveringOnInteractable, rightHandHoveringOnInteractable);
   userinput.toggleActive(sets.rightHandHoveringOnPen, rightHandHoveringOnPen);
diff --git a/src/systems/userinput/sets.js b/src/systems/userinput/sets.js
index e896e2c5f8dd97c9f78c5297b61ec9ab65c2c773..c764b47cfaddd0a0ea635bfff267031a033ee1c5 100644
--- a/src/systems/userinput/sets.js
+++ b/src/systems/userinput/sets.js
@@ -16,6 +16,7 @@ sets.rightHandHoveringOnNothing = "rightHandHoveringOnNothing";
 sets.rightHandHoldingPen = "rightHandHoldingPen";
 sets.rightHandHoldingCamera = "rightHandHoldingCamera";
 sets.rightHandHoldingInteractable = "rightHandHoldingInteractable";
+sets.leftHandTeleporting = "leftHandTeleporting";
 sets.leftHandHoveringOnPen = "leftHandHoveringOnPen";
 sets.leftHandHoveringOnCamera = "leftHandHoveringOnCamera";
 sets.leftHandHoveringOnInteractable = "leftHandHoveringOnInteractable";