       delete @lineNodesByLineId[lineId]
       node.removeChild(lineNode)
 
-  appendOrUpdateVisibleLineNodes: (visibleLines) ->
-    {scrollTop, scrollLeft, lineHeight} = @props
+  appendOrUpdateVisibleLineNodes: (visibleLines, startRow) ->
+    {lineHeight} = @props
     newLines = null
     newLinesHTML = null
-    verticalScrollOffset = -scrollTop % lineHeight
-    horizontalScrollOffset = -scrollLeft
 
     for line, index in visibleLines
-      top = (index * lineHeight) + verticalScrollOffset
-      left = horizontalScrollOffset
+      screenRow = startRow + index
+      top = (screenRow * lineHeight)
 
       if @hasLineNode(line.id)
-        @updateLineNode(line, top, left)
+        @updateLineNode(line, top)
       else
         newLines ?= []
         newLinesHTML ?= ""
         newLines.push(line)
-        newLinesHTML += @buildLineHTML(line, top, left)
+        newLinesHTML += @buildLineHTML(line, top)
 
     return unless newLines?
 

  displayName: 'LinesComponent'

  render: ->
    div {className: 'lines'}

  getVisibleSelectionRegions: ->
    {editor, visibleRowRange, lineHeight} = @props

  updateLines: ->
    {editor, visibleRowRange, showIndentGuide, selectionChanged} = @props
    [startRow, endRow] = visibleRowRange

    startRow = Math.max(0, startRow - 8)
    endRow = Math.min(editor.getLineCount(), endRow + 8)

    visibleLines = editor.linesForScreenRows(startRow, endRow - 1)
    @removeNonVisibleLineNodes(visibleLines)
    @appendOrUpdateVisibleLineNodes(visibleLines, startRow)

  removeNonVisibleLineNodes: (visibleLines) ->
    visibleLineIds = new Set
