         @selection.end.row = @activeCellPosition.row
         @selection.start.row = @activeCellPosition.row
 
-      if row >= @getLastVisibleRow() - 1
-        @makeRowVisible(row + 1)
-      else if row <= @getFirstVisibleRow() + 1
-        @makeRowVisible(row - 1)
-
+      if column < @activeCellPosition.column
+        @selection.start.column = column
+        @selection.end.column = @activeCellPosition.column
+      else if column > @activeCellPosition.column
+        @selection.end.column = column
+        @selection.start.column = @activeCellPosition.column
+      else
+        @selection.end.column = @activeCellPosition.column
+        @selection.start.column = @activeCellPosition.column
+
+      @scrollDuringDrag(row)
+      @requestUpdate()
+
+  endDrag: (e) ->
+    return unless @dragging
+
+    @drag(e)
+    @dragging = false
+    @dragSubscription.dispose()
+
+  startGutterDrag: (e) ->
+    return if @dragging
+
+    @dragging = true
+
+    @body.on 'mousemove', stopPropagationAndDefault (e) => @gutterDrag(e)
+    @body.on 'mouseup', stopPropagationAndDefault (e) => @endGutterDrag(e)
+    @initializeDragDisposable()
+
+    row = @findRowAtScreenPosition(e.pageY)
+    @setSelection(@getRowRange(row)) if row?
+
+  gutterDrag: (e) ->
+    if @dragging
+      row = @findRowAtScreenPosition(e.pageY)
+
+      if row < @activeCellPosition.row
+        @selection.start.row = row
+        @selection.end.row = @activeCellPosition.row
+      else if row > @activeCellPosition.row
+        @selection.end.row = row
+        @selection.start.row = @activeCellPosition.row
+      else
+        @selection.end.row = @activeCellPosition.row
+        @selection.start.row = @activeCellPosition.row
+
+      @scrollDuringDrag(row)
       @requestUpdate()
 
   endGutterDrag: (e) ->

    @dragSubscription.dispose()
    @gutterDrag(e)
    @dragging = false

  #     ######   #######  ########  ######## #### ##    ##  ######
  #    ##    ## ##     ## ##     ##    ##     ##  ###   ## ##    ##


    @body.on 'mousemove', stopPropagationAndDefault (e) => @drag(e)
    @body.on 'mouseup', stopPropagationAndDefault (e) => @endDrag(e)
    @initializeDragDisposable()

  drag: (e) ->
    if @dragging
      {pageX, pageY} = e
      {row, column} = @cellPositionAtScreenPosition pageX, pageY

      if row < @activeCellPosition.row
        @selection.start.row = row
