diff --git a/src/tool/Tool.js b/src/tool/Tool.js
index ddac2cae..163b0f4a 100644
--- a/src/tool/Tool.js
+++ b/src/tool/Tool.js
@@ -19,8 +19,39 @@ var Tool = this.Tool = Base.extend({
 
 	beans: true,
 
+	// DOCS: rewrite Tool constructor explanation
 	/**
 	 * Initializes the tool's settings, so a new tool can be assigned to it
+	 * 
+	 * @constructs Tool
+	 *
+	 * @class The Tool object refers to a script that the user can interact with
+	 * by using the mouse and keyboard and can be accessed through the global
+	 * {@code tool} variable. All its properties are also available in the paper
+	 * scope.
+	 * 
+	 * The global {@code tool} variable only exists in scripts that contain mouse
+	 * handler functions ({@link #onMouseMove}, {@link #onMouseDown},
+	 * {@link #onMouseDrag}, {@link #onMouseUp}) or a keyboard handler
+	 * function ({@link #onKeyDown}, {@link #onKeyUp}).
+	 * 
+	 * @example
+	 * var path;
+	 * 
+	 * // Only execute onMouseDrag when the mouse
+	 * // has moved at least 10 points:
+	 * tool.distanceThreshold = 10;
+	 * 
+	 * function onMouseDown(event) {
+	 * 	// Create a new path every time the mouse is clicked
+	 * 	path = new Path();
+	 * 	path.strokeColor = 'black';
+	 * }
+	 * 
+	 * function onMouseDrag(event) {
+	 * 	// Add a point to the path every time the mouse is dragged
+	 * 	path.lineTo(event.point);
+	 * }
 	 */
 	initialize: function(handlers, scope) {
 		this._scope = scope;
@@ -32,18 +63,21 @@ var Tool = this.Tool = Base.extend({
 	},
 
 	/**
-	 * The fixed time delay between each call to the {@link #onMouseDrag}
-	 * event. Setting this to an interval means the {@link #onMouseDrag}
-	 * event is called repeatedly after the initial {@link #onMouseDown}
-	 * until the user releases the mouse.
+	 * The fixed time delay in milliseconds between each call to the
+	 * {@link #onMouseDrag} event. Setting this to an interval means the
+	 * {@link #onMouseDrag} event is called repeatedly after the initial
+	 * {@link #onMouseDown} until the user releases the mouse.
 	 * 
-	 * @return the interval time in milliseconds
+	 * @type number
 	 */
 	eventInterval: null,
 
 	/**
 	 * The minimum distance the mouse has to drag before firing the onMouseDrag
 	 * event, since the last onMouseDrag event.
+	 * 
+	 * @type number
+	 * @bean
 	 */
 	getMinDistance: function() {
 		return this._minDistance;
@@ -57,6 +91,13 @@ var Tool = this.Tool = Base.extend({
 		}
 	},
 
+	/**
+	 * The maximum distance the mouse has to drag before firing the onMouseDrag
+	 * event, since the last onMouseDrag event.
+	 * 
+	 * @type number
+	 * @bean
+	 */
 	getMaxDistance: function() {
 		return this._maxDistance;
 	},
@@ -69,6 +110,11 @@ var Tool = this.Tool = Base.extend({
 		}
 	},
 
+	// DOCS: document Tool#fixedDistance
+	/**
+	 * @type number
+	 * @bean
+	 */
 	getFixedDistance: function() {
 		return this._minDistance == this._maxDistance
 			? this._minDistance : null;
@@ -79,6 +125,87 @@ var Tool = this.Tool = Base.extend({
 		this._maxDistance = distance;
 	},
 
+	/**
+	 * {@grouptitle Mouse Event Handlers}
+	 * 
+	 * The function to be called when the mouse button is pushed down. The
+	 * function receives a {@link ToolEvent} object which contains information
+	 * about the mouse event.
+	 * 
+	 * @example
+	 * function onMouseDown(event) {
+	 * 	// the position of the mouse in project coordinates:
+	 * 	console.log(event.point);
+	 * }
+	 * 
+	 * @name Tool#onMouseDown
+	 * @property
+	 * @type function
+	 */
+
+	/**
+	 * The function to be called when the mouse position changes while the mouse
+	 * is being dragged. The function receives a {@link ToolEvent} object which
+	 * contains information about the mouse event.
+	 * 
+	 * This function can also be called periodically while the mouse doesn't
+	 * move by setting the {@link #eventInterval}
+	 * 
+	 * @example
+	 * function onMouseDrag(event) {
+	 * 	// the position of the mouse in project coordinates
+	 * 	console.log(event.point);
+	 * }
+	 * 
+	 * @name Tool#onMouseDrag
+	 * @property
+	 * @type function
+	 */
+
+	/**
+	 * The function to be called when the tool is selected and the mouse moves
+	 * within the document. The function receives a {@link ToolEvent} object
+	 * which contains information about the mouse event.
+	 * 
+	 * @example
+	 * function onMouseMove(event) {
+	 * 	// the position of the mouse in project coordinates
+	 * 	console.log(event.point);
+	 * }
+	 * @name Tool#onMouseMove
+	 * @property
+	 * @type function
+	 */
+
+	/**
+	 * The function to be called when the mouse button is released. The function
+	 * receives a {@link ToolEvent} object which contains information about the
+	 * mouse event.
+	 * 
+	 * @example
+	 * function onMouseUp(event) {
+	 * 	// the position of the mouse in project coordinates
+	 * 	console.log(event.point);
+	 * }
+	 * @name Tool#onMouseUp
+	 * @property
+	 * @type function
+	 */
+
+	// DOCS: document Tool#onKeyDown
+	/**
+	 * @name Tool#onKeyDown
+	 * @property
+	 * @type function
+	 */
+
+	// DOCS: document Tool#onKeyUp
+	/**
+	 * @name Tool#onKeyUp
+	 * @property
+	 * @type function
+	 */
+
 	updateEvent: function(type, pt, minDistance, maxDistance, start,
 			needsChange, matchMaxDistance) {
 		if (!start) {