     @_scrollPositionManuallySet = false
 
     @_pendingState._scrollPosition = switch _tracking
-      when null, "start" then (if !scrolled then 0 else mainChildrenOffset)
-      when "end"         then (if !scrolled then 0 else mainChildrenOffset - mainElementSizeForChildren + mainChildrenSize)
+      when null, "start" then 2 * (if !scrolled then 0 else mainChildrenOffset)
+      when "end"         then 2 * (if !scrolled then 0 else mainChildrenOffset - mainElementSizeForChildren + mainChildrenSize)
       when "child"       then @_findFocusedChild mainCoordinate, inFlowChildren, mainChildrenSize, mainElementSizeForChildren
 
     if _tracking != "child"
       @_pendingState._focusedChild = null
-    if @_focusedChild != @_pendingState._focusedChild
-      @queueEvent "focusedChildChanged", focusedChild: @_pendingState._focusedChild
+
+    @_updateOnScreenInfo()
 
     log "tracking: #{@_pendingState._tracking} #{_scrollPosition}"
+
+  _updateOnScreenInfo: (inFlowChildren) ->
+    {isVertical, childrenSize, windowSize} = @
+
+    focusedChild = @_pendingState._focusedChild
+
+    children = @_pendingState._children
+    firstOnScreenChildIndex = children.length
+    focusedChildIndex = lastOnScreenChildIndex = -1
+
+    for child, i in children
+      if child.getPendingInFlow()
+        if isVertical
+          pos = child.getCurrentLocationY false, point0
+          size = child.getCurrentSize().y
+        else
+          pos = child.getCurrentLocationX false, point0
+          size = child.getCurrentSize().x
+
+        if pos < windowSize && pos + size > 0
+          firstOnScreenChildIndex = min i, firstOnScreenChildIndex
+          lastOnScreenChildIndex  = max i, lastOnScreenChildIndex
+          if child == focusedChild
+            focusedChildIndex = i
+
+    firstOnScreenChildIndex = -1 if firstOnScreenChildIndex == children.length
+
+    if (
+        firstOnScreenChildIndex != @_firstOnScreenChildIndex ||
+        lastOnScreenChildIndex  != @_lastOnScreenChildIndex ||
+        focusedChildIndex       != @_focusedChildIndex ||
+        focusedChild            != @_focusedChild
+      )
+      @queueEvent "scrollUpdate", =>
+        {
+          childrenSize
+          windowSize
+          focusedChild
+          firstOnScreenChildIndex
+          lastOnScreenChildIndex
+          focusedChildIndex
+        }
+
+    @_firstOnScreenChildIndex = firstOnScreenChildIndex
+    @_lastOnScreenChildIndex  = lastOnScreenChildIndex
+    @_focusedChildIndex       = focusedChildIndex
+
+    null
 
   # OUT: child's position relative to this, it's parent
   _findFocusedChild: (mainCoordinate, inFlowChildren, mainChildrenSize, mainElementSizeForChildren) ->

  animateToValidScrollPosition: ->
    pendingScrollPosition = @getScrollPosition true

    @scrollPosition = switch @getTracking true
      when "start"  then bound -@_maxScrollPosition, pendingScrollPosition, 0
      when "end"    then bound 0, pendingScrollPosition, @_maxScrollPosition
      when null     then 0
      when "child"  then pendingScrollPosition


  #       @_scrollContents.setLocation @newPoint position
  # # maxCount = 5

  _scrollPositionChanged: ->
    unless @_activelyScrolling
      @queueEvent "scrollingActive"
      @_activelyScrolling = true

    @_lastScrollUpdatedAt = thisScrollUpdateWasAt = currentSecond()
    timeout 250, =>
      if @_lastScrollUpdatedAt == thisScrollUpdateWasAt
        @_activelyScrolling = false
        @queueEvent "scrollingIdle"

  # _updatePagesSplit: (pages = @getPendingPages(), referenceFrame = @getPendingReferenceFrame())->

