 
 class MovieOverviewControl: NSView {
     var player: AVPlayer? {
-        didSet { reload() }
+        willSet {
+            guard let playerTimeObserver = playerTimeObserver else { return }
+            player?.removeTimeObserver(playerTimeObserver)
+        }
+        didSet {
+            reload()
+            observePlayer()
+        }
+    }
+    var playerTimeObserver: AnyObject?
+    var currentTimePercent: CGFloat? {
+        didSet {
+            // FIXME: redraw only dirty rect
+            setNeedsDisplayInRect(bounds)
+        }
     }
     var imageGenerator: AVAssetImageGenerator?
     var numberOfPages: UInt = 0 {


        setContentCompressionResistancePriority(NSLayoutPriorityDefaultHigh, forOrientation: .Vertical)
        setContentHuggingPriority(NSLayoutPriorityDefaultHigh, forOrientation: .Vertical)
    }

    required init?(coder: NSCoder) {

        }
    }

    func observePlayer() {
        if let playerTimeObserver = playerTimeObserver {
            player?.removeTimeObserver(playerTimeObserver)
        }

        if  let player = player,
            let item = player.currentItem {
                playerTimeObserver = player.addPeriodicTimeObserverForInterval(CMTime(value: 1, timescale: 30), queue: dispatch_get_main_queue()) { [weak self] time in
                    let duration = item.duration
                    self?.currentTimePercent =
                        CGFloat(time.convertScale(duration.timescale, method: CMTimeRoundingMethod.Default).value)
                        / CGFloat(duration.value)
                }
        }
    }

    override func viewDidEndLiveResize() {
        super.viewDidEndLiveResize()

