 
   # Scrolling
 
-  scrollToTop: ->
-    @controller.scrollToPosition(x: 0, y: 0)
-
-  scrollToAnchor: ->
-    if @location.anchor?
-      @controller.scrollToAnchor(@location.anchor)
-    else
-      @scrollToTop()
+  performScroll: ->
+    unless @scrolled
+      if @action is "restore"
+        @scrollToRestoredPosition() or @scrollToTop()
+      else
+        @scrollToAnchor() or @scrollToTop()
+      @scrolled = true
 
   scrollToRestoredPosition: ->
     position = @restorationData?.scrollPosition
     if position?
       @controller.scrollToPosition(position)
-    else
-      @scrollToTop()
+      true
+
+  scrollToAnchor: ->
+    if @location.anchor?
+      @controller.scrollToAnchor(@location.anchor)
+      true
+
+  scrollToTop: ->
+    @controller.scrollToPosition(x: 0, y: 0)
 
   # Private
 

      @render ->
        @saveSnapshot()
        if @snapshotRestored = @controller.restoreSnapshotForLocation(@location)
          @scrollToRestoredPosition()
          @adapter.visitSnapshotRestored?(this)
          @complete() unless @shouldIssueRequest()


        @saveSnapshot()
        if @request.failed
          @controller.loadErrorResponse(@response)
          @performScroll()
          @adapter.visitResponseLoaded?(this)
          @fail()
        else
          @controller.loadResponse(@response)
          @performScroll()
          @adapter.visitResponseLoaded?(this)
          @complete()

