   setScrollState: ->
     scrollState = @getScrollStateByScroll(@state.scrollTop)
     @setState({scrollState})
-    @goToStep(@state.scrollState.key)() if @state.scrollState?.key?
+
+  componentDidMount: ->
+    @sortScrollPoints()
+    @scrollToKey(@state.currentStep)
+    @setScrollState()
+
+  componentWillUpdate: (nextProps, nextState) ->
+    willScrollStateKeyChange = not (nextState.scrollState.key is @state.scrollState.key)
+    @goToStep(nextState.scrollState.key)() if willScrollStateKeyChange
 
   componentDidUpdate: (prevProps, prevState) ->
-    didScrollStateChange = not (prevState.scrollState.key is @getScrollStateByScroll(@state.scrollTop).key)
+    doesScrollStateMatch = (prevState.scrollState.key is @getScrollStateByScroll(@state.scrollTop).key)
     didCurrentStepChange = not (@state.currentStep is prevState.scrollState?.key)
+    didScrollPointsChange = not (prevState.scrollPoints.length is @state.scrollPoints.length)
 
-    if didCurrentStepChange and not didScrollStateChange
+    @sortScrollPoints() if didScrollPointsChange
+
+    unless doesScrollStateMatch
+      @setScrollState()
+    else if didCurrentStepChange
       @scrollToKey(@state.currentStep)
-    else if didScrollStateChange
-      @setScrollState()
 
   scrollToKey: (stepKey) ->
     scrollState = @getScrollStateByKey(stepKey)

    scrollPointData = _.extend({scrollPoint: scrollPoint}, scrollState)
    @state.scrollPoints.push(scrollPointData)

  getScrollStateByScroll: (scrollTop) ->
    sortedDescScrollPoints = _.sortBy @state.scrollPoints, (scrollData) ->
      -1 * scrollData.scrollPoint

    scrollState = _.find sortedDescScrollPoints, (scrollData) =>
      scrollTop > (scrollData.scrollPoint - @state.scrollTopBuffer)

    scrollState or _.last(sortedDescScrollPoints)

  getScrollStateByKey: (stepKey) ->
    scrollState = _.find @state.scrollPoints, (scrollData) ->

      params.stepIndex = stepKey + 1
      params.id = @props.id # if we were rendered directly, the router might not have the id

      @context.router.replaceWith('reviewTaskStep', params)

  getCrumb: (crumbKey) ->
