     public var currentPosition: Double {
         get {
             PKLog.trace("get currentPosition: \(self.currentTime())")
-            return CMTimeGetSeconds(self.currentTime())
+            return CMTimeGetSeconds(self.currentTime() - rangeStart)
         }
         set {
             PKLog.trace("set currentPosition: \(currentPosition)")
-            let newTime = CMTimeMakeWithSeconds(newValue, 1)
+
+            let newTime = rangeStart + CMTimeMakeWithSeconds(newValue, 1)
             super.seek(to: newTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) { (isSeeked: Bool) in
                 if isSeeked {
                     self.postEvent(event: PlayerEvents.seeked())

        }
        
        return false
    }
    
    // MARK: Player Methods

    
    public var duration: Double {
        guard let currentItem = self.currentItem else { return 0.0 }
        
        var result = CMTimeGetSeconds(currentItem.duration)
    
        if result.isNaN {
            let seekableRanges = currentItem.seekableTimeRanges
            if seekableRanges.count > 0 {
                let range = seekableRanges.last!.timeRangeValue
                result = CMTimeGetSeconds(range.duration)
            }
        }
        
        PKLog.trace("get duration: \(result)")
        return result
    }
    
    public var isPlaying: Bool {
