         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 {

    var _playlist: Playlist!
    var playlistLoader: PlaylistLoader!
    var indicator:  UIActivityIndicatorView!
    var playerObserver: TrackTableViewPlayerObserver!

    var playlist: Playlist {
        return _playlist

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        observePlayer()
        observePlaylist()
    }

    override func viewWillAppear(animated: Bool) {
