 										if result.length == 0
 											eof = true
 											console.log "appended: requested #{bufferSize} records starting from #{next} recieved: eof"
-											finalize()
+											finalize(scrolling)
 											return
 										clipTop()
 										for item in result
 											lastScope = insert ++next, item, false
 
 										console.log "appended: requested #{bufferSize} received #{result.length} buffer size #{buffer.length} first #{first} next #{next}"
-										finalize()
-										lastScope.$watch 'adjustBuffer', ->
-											adjustBuffer()
+										finalize(scrolling)
+										dereg = lastScope.$watch 'adjustBuffer', ->
+											adjustBuffer(scrolling)
+											dereg()
 
 							else
 								if buffer.length && !shouldLoadTop()
-									finalize()
+									finalize(scrolling)
 								else
 									#console.log "prepending... requested #{size} records starting from #{start}"
 									datasource.get first-bufferSize, bufferSize,

									else
										# if not, increment scrollTop
										scrollTop = viewport.scrollTop() + wrapper.element.outerHeight(true)
										# below is an attempt to ensure that the scrollbar is always there even if
										# there is not enough data. But now I am not sure it is necessary. Commenting out for now
										#if viewport.height() + scrollTop > canvas.height()
										#handler.bottomPadding(handler.bottomPadding() + viewport.height() + scrollTop - canvas.height())
										viewport.scrollTop(scrollTop)
								else
									handler.bottomPadding(Math.max(0,handler.bottomPadding() - wrapper.element.outerHeight(true)))

							itemScope


						finalize = ->
							pending.shift()
							if pending.length == 0
								isLoading = false
								loading(false)
							else
								fetch()

						fetch = () ->
							direction = pending[0]
							#console.log "Running fetch... #{{true:'bottom', false: 'top'}[direction]} pending #{pending.length}"
							lastScope = null
							if direction
								if buffer.length && !shouldLoadBottom()
									finalize()
								else
									#console.log "appending... requested #{bufferSize} records starting from #{next}"
									datasource.get next, bufferSize,

								first += overage
								console.log "clipped off top #{overage} top padding #{handler.topPadding()}"

						enqueueFetch = (direction, scrolling)->
							if (!isLoading)
								isLoading = true
								loading(true)
							if pending.push(direction) == 1
								fetch(scrolling)

						adjustBuffer = (scrolling)->

							console.log "top {actual=#{handler.topDataPos()} visible from=#{topVisiblePos()} bottom {visible through=#{bottomVisiblePos()} actual=#{handler.bottomDataPos()}}"
							if shouldLoadBottom()
								enqueueFetch(true, scrolling)
							else
								enqueueFetch(false, scrolling) if shouldLoadTop()

						insert = (index, item, top) ->
							itemScope = $scope.$new()
