diff --git a/src/mousetracker.js b/src/mousetracker.js
index f70bef3f..a52d761b 100644
--- a/src/mousetracker.js
+++ b/src/mousetracker.js
@@ -201,7 +201,9 @@
             touchstart:            function ( event ) { onTouchStart( _this, event ); },
             touchmove:             function ( event ) { onTouchMove( _this, event ); },
             touchend:              function ( event ) { onTouchEnd( _this, event ); },
-            tracking:              false,
+            gesturestart:          function ( event ) { onGestureStart( _this, event ); },
+            gesturechange:         function ( event ) { onGestureChange( _this, event ); },
+            tracking: false,
             capturing:             false,
             // Contact Points
             mousePoints:           {},
@@ -614,7 +616,7 @@
         $.MouseTracker.subscribeEvents.push( "mouseover", "mouseout", "mousedown", "mouseup", "mousemove" );
         if ( 'ontouchstart' in window ) {
             // iOS, Android, and other W3c Touch Event implementations (see http://www.w3.org/TR/2011/WD-touch-events-20110505)
-            $.MouseTracker.subscribeEvents.push( "touchstart", "touchmove", "touchend" );
+            $.MouseTracker.subscribeEvents.push( "touchstart", "touchmove", "touchend", "gesturestart", "gesturechange" );
         }
         $.MouseTracker.mousePointerId = "legacy-mouse";
         $.MouseTracker.maxTouchPoints = 10;
@@ -1168,10 +1170,10 @@
         }
 
         if ( $.MouseTracker.unprefixedPointerEvents ) {
-            event.target.setPointerCapture(event.pointerId);
+            event.currentTarget.setPointerCapture(event.pointerId);
         }
         else {
-            event.target.msSetPointerCapture(event.pointerId);
+            event.currentTarget.msSetPointerCapture(event.pointerId);
         }
 
         time = $.now();
@@ -1193,9 +1195,12 @@
 
         addPointers( tracker, event, [pointer] );
 
-        if ( tracker.pressHandler || tracker.dragHandler || tracker.pinchHandler || tracker.swipeHandler ) {
-            $.cancelEvent( event );
-        }
+        //if ( tracker.pressHandler || tracker.dragHandler || tracker.pinchHandler || tracker.swipeHandler ) {
+        //    $.cancelEvent(event);
+        event.stopPropagation();
+        event.preventDefault();
+            return false;
+        //}
     }
 
 
@@ -1266,10 +1271,10 @@
         }
 
         if ( $.MouseTracker.unprefixedPointerEvents ) {
-            event.target.releasePointerCapture(event.pointerId);
+            event.currentTarget.releasePointerCapture(event.pointerId);
         }
         else {
-            event.target.msReleasePointerCapture(event.pointerId);
+            event.currentTarget.msReleasePointerCapture(event.pointerId);
         }
 
         time = $.now();
@@ -1289,7 +1294,14 @@
             currentTime: time
         };
 
-        removePointers( tracker, event, [pointer] );
+        removePointers(tracker, event, [pointer]);
+
+        //if ( tracker.pressHandler || tracker.dragHandler || tracker.pinchHandler || tracker.swipeHandler ) {
+        //    $.cancelEvent(event);
+        event.stopPropagation();
+        event.preventDefault();
+        return false;
+        //}
     }
 
 
@@ -1388,7 +1400,14 @@
             currentTime: time
         };
 
-        updatePointers( tracker, event, [pointer] );
+        updatePointers(tracker, event, [pointer]);
+
+        //if ( tracker.pressHandler || tracker.dragHandler || tracker.pinchHandler || tracker.swipeHandler ) {
+        //    $.cancelEvent(event);
+        event.stopPropagation();
+        event.preventDefault();
+        return false;
+        //}
     }
 
 
@@ -1511,7 +1530,9 @@
 
         addPointers( tracker, event, pointers );
 
+        event.stopPropagation();
         event.preventDefault();
+        return false;
 ////****************************************************************
 //        var touchA,
 //            touchB;
@@ -1597,7 +1618,9 @@
             updatePointersOut( tracker, event, [pointer] );
         }
 
+        event.stopPropagation();
         event.preventDefault();
+        return false;
 //****************************************************************************************
 //        if ( event.touches.length === 0 &&
 //            event.targetTouches.length === 0 &&
@@ -1652,7 +1675,9 @@
 
         updatePointers( tracker, event, pointers );
 
+        event.stopPropagation();
         event.preventDefault();
+        return false;
 //*******************************************************************************
 //        var touchA,
 //            touchB,
@@ -1705,6 +1730,28 @@
     }
 
 
+    /**
+     * @private
+     * @inner
+     */
+    function onGestureStart( tracker, event ) {
+        event.stopPropagation();
+        event.preventDefault();
+        return false;
+    }
+
+
+    /**
+     * @private
+     * @inner
+     */
+    function onGestureChange( tracker, event ) {
+        event.stopPropagation();
+        event.preventDefault();
+        return false;
+    }
+
+
 //*******************************************************************************************************************************************
 //** Event Processing Functions
 
@@ -2157,18 +2204,17 @@
                 gesturePoints.push( delegate.touchPoints[ p ] );
             }
             delta = gesturePoints[0].currentPos.distanceTo( gesturePoints[1].currentPos );
-            //if ( delta != delegate.currentPinchDist ) {
-            if (delta != delegate.currentPinchDist && Math.abs(delta - delegate.lastPinchDist) > 75) {
+            if ( delta != delegate.currentPinchDist ) {
                 delegate.lastPinchDist = delegate.currentPinchDist;
                 delegate.currentPinchDist = delta;
-
                 propagate = tracker.pinchHandler(
                     {
                         eventSource:          tracker,
-                        position:             getPointRelative( updatePointer.currentPos, tracker.element ),
-                        delta:                delegate.currentPinchDist - delegate.lastPinchDist,
-                        shift:                event.shiftKey,
-                        isTouchEvent:         curPointer.type === 'touch',
+                        gesturePoints:        gesturePoints,
+                        center:               getPointRelative( new $.Point( ( gesturePoints[0].currentPos.x + gesturePoints[1].currentPos.x ) / 2,
+                                                                                ( gesturePoints[0].currentPos.y + gesturePoints[1].currentPos.y ) / 2 ) ),
+                        lastDistance:         delegate.lastPinchDist,
+                        currentDistance:      delegate.currentPinchDist,
                         originalEvent:        event,
                         preventDefaultAction: false,
                         userData:             tracker.userData
diff --git a/src/viewer.js b/src/viewer.js
index 1d53fa2c..d8564294 100644
--- a/src/viewer.js
+++ b/src/viewer.js
@@ -1850,12 +1850,21 @@ function onCanvasScroll( event ) {
 }
 
 function onCanvasPinch(event) {
+//{
+//    eventSource:          tracker,
+//    gesturePoints:        gesturePoints,
+//    center:               getPointRelative( new $.Point( ( gesturePoints[0].currentPos.x + gesturePoints[1].currentPos.x ) / 2,
+//                                                         ( gesturePoints[0].currentPos.y + gesturePoints[1].currentPos.y ) / 2 ) ),
+//    lastDistance:         delegate.lastPinchDist,
+//    currentDistance:      delegate.currentPinchDist,
+//    originalEvent:        event,
+//    preventDefaultAction: false,
+//    userData:             tracker.userData
+//}
     if (!event.preventDefaultAction && this.viewport) {
-        //TODO This is temporary for testing. Zoom should track pinch gesture one-to-one, around center point!
-        this.viewport.zoomBy(
-            ( event.delta > 0 ) ? 1.2 : 0.8,
-            this.viewport.pointFromPixel(event.position, true)
-        );
+        //TODO This is temporary for testing. Zoom should track pinch gesture one-to-one!
+        this.viewport.zoomBy( event.currentDistance / event.lastDistance,
+                              this.viewport.pointFromPixel( event.center, true ) );
         this.viewport.applyConstraints();
     }
     /**
@@ -1883,7 +1892,7 @@ function onCanvasPinch(event) {
     return false;
 }
 
-function onContainerExit(event) {
+function onContainerExit( event ) {
     if ( !event.insideElementPressed ) {
         THIS[ this.hash ].mouseInside = false;
         if ( !THIS[ this.hash ].animating ) {