     }
 
     public func skipToNextTrack() {
-        let nextIndex: Int = currentIndex + 1
+        let isLastTrack: Bool = currentIndex == lastTrackIndex()
+        let nextIndex: Int    = isLastTrack ? 0 : currentIndex + 1
 
-        if isValidIndex(nextIndex) {
+        switch playMode {
+        case .RepeatPlayList:
             setCurrentIndex(nextIndex)
-            player.play()
-            return
+            play()
+        case .RepeatItem:
+            seekToTrackBeginning()
+        case .NoRepeat:
+            setCurrentIndex(nextIndex)
+            if isLastTrack {
+                pause()
+            }
         }
-
-        player.pause()
-        seekToTrackBeginning()
     }
 
     public func beginRewinding() {

    }

    public func jumpToPreviousTrack() {
        let previousIndex: Int = currentIndex - 1

        if isValidIndex(previousIndex) {
            setCurrentIndex(previousIndex)
            play()
            return
        }

        seekToTrackBeginning()
        play()
    }

    //MARK: - private

    private func setupPlayerItem() {
        if !hasPlayList() {
            return
        }
        if !isValidIndex(currentIndex) {
            return
        }

    private func playerDidFinishTrackPlaying(notification: NSNotification) {
        didFinishPlayingTrack?()

        if currentIndex == lastTrackIndex() {
            didFinishPlayingPlayList?()
        }

        skipToNextTrack()
    }
}
