     func reloadWithLanguageId(_ langId:String) {
         // no op
     }
+    
+    private func removeObserver() {
+        if let observer = self.observer {
+            videoPlayer.removeTimeObserver(observer)
+            self.observer = nil
+            print("remove observer")
+        }
+    }
 
     func moveToPageAt(index:Int) {
         print("moveToPageAt", index)

            self.index = index
            let page = pages[self.index]
            let start = page["start"] as? Double ?? 0.0
            //let duration = page["duration"] as? CGFloat ?? 0.0
            guard let playerItem = videoPlayer.currentItem else {
                return // something is wrong
            }
            let time = CMTime(seconds: start, preferredTimescale: 600)
            playerItem.seek(to: time) { (success) in
                print("seek complete", success)
            }
        }
    }

    fileprivate let videoPlayer = AVPlayer()
    fileprivate var videoLayer:AVPlayerLayer!
    fileprivate var index = 0
    fileprivate var observer:Any?
    
    deinit {
        print("deinit")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
