           @_pan(deltaX)
 
       # Safari
-      L.DomEvent.on svg, 'mousewheel', (e) =>
-        return unless allowWheel
-
+      L.DomEvent.on svg, 'mousewheel', (e) ->
         deltaX = e.wheelDeltaX
         deltaY = e.wheelDeltaY
-        doScroll(deltaX, deltaY, e)
+        doScroll(deltaX, deltaY, getTime(e))
 
         e.preventDefault()
 
       # Chrome/Firefox
-      L.DomEvent.on svg, 'wheel', (e) =>
-        return unless allowWheel
+      L.DomEvent.on svg, 'wheel', (e) ->
         return if e.type == "mousewheel"
 
         # 'wheel' deltas are opposite from 'mousewheel'
         deltaX = -e.deltaX
         deltaY = -e.deltaY
-        doScroll(deltaX, deltaY, e)
+        doScroll(deltaX, deltaY, getTime(e))
 
         e.preventDefault()
+
+      touchSeparation = 0
+      touchCenter = 0
+      L.DomEvent.on svg, 'touchstart', (e) ->
+        return unless e.touches && e.touches.length == 2
+        center = (e.touches[0].clientX + e.touches[1].clientX) / 2
+        time = getTime(clientX: center)
+        touchSeparation = Math.abs(e.touches[0].clientX - e.touches[1].clientX)
+        e.preventDefault()
+
+      L.DomEvent.on svg, 'touchmove', (e) ->
+        return unless e.touches && e.touches.length == 2
+        deltaY = Math.abs(e.touches[0].clientX - e.touches[1].clientX) - touchSeparation
+        doScroll(0, -deltaY, touchCenter)
 
     _setupDragBehavior: (svg) ->
       self = this

        x = e.clientX - svg.clientLeft - origin
        time = @positionToTime(x)

      doScroll = (deltaX, deltaY, e) =>
        time = getTime(e)
        if Math.abs(deltaY) > Math.abs(deltaX)
          levels = if deltaY > 0 then -1 else 1
          @_deltaZoom(levels, time)

      @fire('drag')

    _onUp: (e) ->
      if @animate && @_positions?.length > 0
        dx = @_newPos.x - @_positions[0]
        dt = +new Date() - @_times[0]
        v = dx/dt
