             player?.removeObserver(playerObserver)
         }
         playerObserver = nil
+        playlistObserver?.dispose()
+        playlistObserver = nil
     }
 
     func updateNavbar() {

            (action, indexPath) in
            Logger.sendUIActionEvent(self, action: "removeTrack", label: "\(indexPath.item)")
            self.playlist.removeTrackAtIndex(UInt(indexPath.item))
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        }

        remove.backgroundColor = UIColor.red

        playerObserver = TrackTableViewPlayerObserver(viewController: self)
        player?.addObserver(playerObserver)
        updateSelection()
    }

    func observePlaylist() {
        playlistObserver?.dispose()
        playlistObserver = Playlist.shared.signal.observeNext({ event in
            switch event {
            case .Created(_): break
            case .Removed(_): break
            case .Updated(let playlist):
                if self.playlist == playlist {
                    self.tableView.reloadData()
                }
            case .TracksAdded(let playlist, _):
                if self.playlist == playlist {
                    self.tableView.reloadData()
                }
            case .TrackRemoved(let playlist, _, let index):
                if self.playlist == playlist {
                    let indexPath = NSIndexPath(forItem: index, inSection: 0)
                    self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
                }
            case .TrackUpdated(let playlist, _):
                if self.playlist == playlist {
                    self.tableView.reloadData()
                }
            }
            return
        })

    }

    func isPlaylistPlaying() -> Bool {
