             self.triggerPlaybackStateChanged()
         }
     }
-
+    
+    public func next() {
+        if !isPlayable { return }
+        
+        if hasNextItem {
+            self.cleanupCurrentItem()
+            self.play(self.currentIndex + 1)
+        }
+    }
+    
     public func stop() {
         if (self.player != nil) {
             self.cleanupCurrentItem()

        self.updateMediaInfo()
    }

    public func next() {
        if !isPlayable() {
            return
        }
    
        if hasNextItem {
            self.cleanupCurrentItem()
            self.play(self.currentIndex + 1)
        }
    }
    
    // TODO:
    // Check the repeat
    // Check the shuffle settings
    var hasNextItem: Bool {
        return self.currentIndex < self.dataSource!.twistNumberOfItems() - 1
    }
    
    // Check the repeat
    // Check the shuffle settings
    var hasPreviousItem: Bool {
        return self.currentIndex != 0
    }

    public func previous() {
        if !isPlayable() {
            return
        }

        // TODO:
        // Seek to 0 if time is more than 5 seconds, else go to previous
        if hasPreviousItem {
            self.cleanupCurrentItem()
            self.play(self.currentIndex - 1)
        }
    }

    func isPlayable() -> Bool {
        guard let dataSource = self.dataSource else { return false }
        return dataSource.twistNumberOfItems() > 0
    }

    override public func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if context == &myContext {
            if let player = self.player where object is AVPlayer {

            self.triggerPlaybackStateChanged()
        }
    }
    
    public func pause() {
        if !isPlayable { return }
        
        if self.currentState == .Playing {
            debug("Pausing current item")
            self.player?.pause()
