         let item = findPageByHref(href)
         let pageUpdateNeeded = item+1 != currentPage.pageNumber
         let indexPath = NSIndexPath(forRow: item, inSection: 0)
-        changePageWith(indexPath: indexPath, animated: true)
-
-        // Delay to wait animation complete
-        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.2 * Double(NSEC_PER_SEC)))
-        dispatch_after(delayTime, dispatch_get_main_queue()) {
-            if pageUpdateNeeded { self.updateCurrentPage() }
-            self.currentPage.audioMarkID(markID);
-        }
-    }
-
-    func changePageWith(indexPath indexPath: NSIndexPath, animated: Bool = false) {
-        collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Top, animated: animated)
+        changePageWith(indexPath: indexPath, animated: true) { () -> Void in
+            if pageUpdateNeeded {
+                self.updateCurrentPage({ () -> Void in
+                    self.currentPage.audioMarkID(markID);
+                })
+            } else {
+                self.currentPage.audioMarkID(markID);
+            }
+        }
+    }
+
+    func changePageWith(indexPath indexPath: NSIndexPath, animated: Bool = false, completion: (() -> Void)? = nil) {
+        UIView.animateWithDuration(animated ? 0.3 : 0, delay: 0, options: .CurveEaseInOut, animations: { () -> Void in
+            self.collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Top, animated: false)
+            }) { (finished: Bool) -> Void in
+                if (completion != nil) { completion!() }
+        }
     }
 
     func changePageToNext(completion: (() -> Void)? = nil) {

        }
    }
    
    func updateCurrentPage() { updateCurrentPage(nil) }
    func updateCurrentPage(page: FolioReaderPage!) {
        if let page = page {
            currentPage = page
            previousPageNumber = page.pageNumber-1

                pagesForCurrentPage(page)
            }
        }
        
        if (completion != nil) { completion!() }
    }
    
    func pagesForCurrentPage(page: FolioReaderPage?) {
