                                     
             }, completion: { [weak self] _ in
                 guard let `self` = self else { return }
+
+                let nextIndex = min(self.pageIndex + 1, self.pageCount - 1)
                 
-                self.pageIndex += 1
+                let finishTransition: () -> Void  = {
+                    self.pageIndex = nextIndex
+                    self.isPaging = false
+                }
                 
                 // Animate the Next button after the other animations are finished to give the video
                 // clip a bit more time to finish. The first clip is a bit longer than the others and
                 // includes a slick bitcoin transfer animation at the end.
-                if self.pageIndex == 1 {
+                if nextIndex == 1 {
                     UIView.animate(withDuration: 0.5, delay: self.firstTransitionDelay, options: .curveEaseInOut, animations: { 
                         self.nextButtonAnimationConstraint?.constant = self.nextButtonVisibleYOffset
                         self.view.layoutIfNeeded()                    
+                    }, completion: { _ in
+                        finishTransition()
                     })
+                } else {
+                    finishTransition()
                 }
         })
     }

    let coinsPageIndex = 2
    let finalPageIndex = 3
    
    var pageIndex: Int = 0 {
        didSet {
            // Show/hide the Back and Skip buttons.

    }
        
    private func animateToNextPage() {
        guard !isPaging, pageIndex >= 0, pageIndex + 1 < pageCount else {
            return
        }
        
        isPaging = true
        
        let nextIndex = pageIndex + 1
        
