diff --git a/examples/defaultScripts.js b/examples/defaultScripts.js
index 05ffb0bd3f..a5c086fc44 100644
--- a/examples/defaultScripts.js
+++ b/examples/defaultScripts.js
@@ -18,3 +18,4 @@ Script.load("lobby.js");
 Script.load("notifications.js");
 Script.load("look.js");
 Script.load("users.js");
+Script.load("grab.js");
diff --git a/examples/grab.js b/examples/grab.js
new file mode 100644
index 0000000000..eca457f0b2
--- /dev/null
+++ b/examples/grab.js
@@ -0,0 +1,223 @@
+var isGrabbing = false;
+var grabbedEntity = null;
+var prevMouse = {};
+var deltaMouse = {
+  z: 0
+}
+var entityProps;
+var box, box2, ground;
+var baseMoveFactor = .001;
+var finalMoveMultiplier;
+var avatarEntityDistance;
+var camYaw, dv;
+var prevPosition;
+var newPosition;
+var flingVelocity;
+var flingMultiplier = 10;
+var moveUpDown = false;
+var savedGravity;
+
+var DROP_DISTANCE = 5.0;
+var DROP_COLOR = {
+  red: 200,
+  green: 200,
+  blue: 200
+};
+var DROP_WIDTH = 4;
+
+
+var autoBox = false;
+if (autoBox) {
+  setUpTestObjects();
+}
+
+var dropLine = Overlays.addOverlay("line3d", {
+  start: {
+    x: 0,
+    y: 0,
+    z: 0
+  },
+  end: {
+    x: 0,
+    y: 0,
+    z: 0
+  },
+  color: DROP_COLOR,
+  alpha: 1,
+  visible: false,
+  lineWidth: DROP_WIDTH
+});
+
+
+function mousePressEvent(event) {
+  var pickRay = Camera.computePickRay(event.x, event.y);
+  var intersection = Entities.findRayIntersection(pickRay);
+  if (intersection.intersects && intersection.properties.collisionsWillMove) {
+    grabbedEntity = intersection.entityID;
+    var props = Entities.getEntityProperties(grabbedEntity)
+    prevPosition = props.position;
+    isGrabbing = true;
+    savedGravity = props.gravity;
+    Overlays.editOverlay(dropLine, {
+      visible: true
+    });
+    Entities.editEntity(grabbedEntity, {
+      gravity: {
+        x: 0,
+        y: 0,
+        z: 0
+      }
+    });
+    //We need to store entity's current gravity, and then disable it while we move
+
+  }
+
+}
+
+
+function mouseReleaseEvent() {
+  if (isGrabbing) {
+    flingObject();
+    Entities.editEntity(grabbedEntity, {
+      gravity: savedGravity
+    });
+  }
+  isGrabbing = false;
+  Overlays.editOverlay(dropLine, {
+    visible: false
+  });
+}
+
+function flingObject() {
+  //calculate velocity to give object base on current and previous position
+  entityProps = Entities.getEntityProperties(grabbedEntity);
+
+  flingVelocity = Vec3.subtract(entityProps.position, prevPosition);
+  flingVelocity = Vec3.multiply(flingMultiplier, flingVelocity);
+  flingVelocity.y = 0;
+  Entities.editEntity(grabbedEntity, {
+    velocity: flingVelocity
+  });
+}
+
+function mouseMoveEvent(event) {
+  if (isGrabbing) {
+    entityProps = Entities.getEntityProperties(grabbedEntity);
+    prevPosition = entityProps.position;
+    avatarEntityDistance = Vec3.distance(MyAvatar.position, entityProps.position);
+    finalMoveMultiplier = baseMoveFactor * Math.pow(avatarEntityDistance, 1.5);
+    deltaMouse.x = event.x - prevMouse.x;
+    if (!moveUpDown) {
+      deltaMouse.z = event.y - prevMouse.y;
+    } else {
+      deltaMouse.y = (event.y - prevMouse.y) * -1;
+    }
+    finalMoveMultiplier = baseMoveFactor * Math.pow(avatarEntityDistance, 1.5);
+    deltaMouse = Vec3.multiply(deltaMouse, finalMoveMultiplier);
+    camYaw = Quat.safeEulerAngles(Camera.getOrientation()).y;
+    dv = Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, camYaw, 0), deltaMouse);
+    newPosition = Vec3.sum(entityProps.position, dv);
+    Entities.editEntity(grabbedEntity, {
+      position: newPosition
+    });
+    Overlays.editOverlay(dropLine, {
+      start: newPosition,
+      end: Vec3.sum(newPosition, {
+        x: 0,
+        y: -DROP_DISTANCE,
+        z: 0
+      })
+    });
+  }
+  prevMouse.x = event.x;
+  prevMouse.y = event.y;
+}
+
+function keyReleaseEvent(event) {
+  if (event.text === "SHIFT") {
+    moveUpDown = false;
+  }
+}
+
+function keyPressEvent(event) {
+  if (event.text === "SHIFT") {
+    moveUpDown = true;
+  }
+}
+
+function cleanup() {
+  Entities.deleteEntity(box);
+  Entities.deleteEntity(box2);
+  Entities.deleteEntity(ground);
+}
+
+function setUpTestObjects() {
+  var distance = 4;
+  box = Entities.addEntity({
+    type: 'Box',
+    position: Vec3.sum(MyAvatar.position, Vec3.multiply(distance, Quat.getFront(Camera.getOrientation()))),
+    dimensions: {
+      x: .5,
+      y: .5,
+      z: .5
+    },
+    color: {
+      red: 200,
+      green: 50,
+      blue: 192
+    },
+    collisionsWillMove: true,
+    gravity: {
+      x: 0,
+      y: -1,
+      z: 0
+    }
+  });
+
+  box2 = Entities.addEntity({
+    type: 'Box',
+    position: Vec3.sum(MyAvatar.position, Vec3.multiply(distance + 1, Quat.getFront(Camera.getOrientation()))),
+    dimensions: {
+      x: .5,
+      y: .5,
+      z: .5
+    },
+    color: {
+      red: 200,
+      green: 50,
+      blue: 192
+    },
+    collisionsWillMove: true,
+    gravity: {
+      x: 0,
+      y: -1,
+      z: 0
+    }
+  });
+
+  ground = Entities.addEntity({
+    type: 'Box',
+    position: {
+      x: MyAvatar.position.x,
+      y: MyAvatar.position.y - 5,
+      z: MyAvatar.position.z
+    },
+    dimensions: {
+      x: 100,
+      y: 2,
+      z: 100
+    },
+    color: {
+      red: 20,
+      green: 200,
+      blue: 50
+    }
+  });
+}
+
+Controller.mouseMoveEvent.connect(mouseMoveEvent);
+Controller.mousePressEvent.connect(mousePressEvent);
+Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
+Controller.keyPressEvent.connect(keyPressEvent);
+Controller.keyReleaseEvent.connect(keyReleaseEvent);
+Script.scriptEnding.connect(cleanup);
\ No newline at end of file