             playlists = playCache
         }
         else
-        if let playArray = defaults.array(forKey: UserSettings.Playlists.keyPath) {
-            playlistArrayController.remove(contentsOf: playlistArrayController.arrangedObjects as! [AnyObject])
-
-            for playlist in playArray {
-                let play = playlist as! Dictionary<String,AnyObject>
-                let items = play[k.list] as! [Dictionary <String,AnyObject>]
+        if let playArray = defaults.dictionary(forKey: UserSettings.Playlists.keyPath) {
+            for (name,plist) in playArray {
+                guard let items = plist as? [Dictionary<String,Any>] else {
+                    let item = PlayItem.init(with: (plist as? Dictionary<String,Any>)!)
+                    playlists[name] = [item]
+                    continue
+                }
                 var list : [PlayItem] = [PlayItem]()
                 for playitem in items {
-                    let item = playitem as Dictionary <String,AnyObject>
-                    let name = item[k.name] as! String
-                    let path = item[k.link] as! String
-                    let time = item[k.time] as? TimeInterval
-                    let link = URL.init(string: path)
-                    let rank = item[k.rank] as! Int
-                    let temp = PlayItem(name:name, link:link!, time:time!, rank:rank)
-                    
-                    // Non-visible (tableView) cells
-                    temp.rect = item[k.rect]?.rectValue ?? NSZeroRect
-                    temp.label = item[k.label]?.boolValue ?? false
-                    temp.hover = item[k.hover]?.boolValue ?? false
-                    temp.alpha = item[k.alpha]?.floatValue ?? 0.6
-                    temp.trans = item[k.trans]?.intValue ?? 0
-
-                    list.append(temp)
-                }
-                let name = play[k.name] as? String
-
-                // Use NSDictionaryControllerKeyValuePair Protocol setKey
-                let temp = playlistArrayController.newObject() as NSDictionaryControllerKeyValuePair
-                temp.key = name
-                temp.value = list
-                playlistArrayController.addObject(temp)
+                    let item = PlayItem.init(with: playitem)
+                    list.append(item)
+                }
+                playlists[name] = list
             }
         }
     }

    @IBOutlet weak var saveButton: NSButton!
    @IBAction func savePlaylists(_ sender: AnyObject) {
        let playArray = playlistArrayController.arrangedObjects as! [NSDictionaryControllerKeyValuePair]
        var temp = [Dictionary<String,AnyObject>]()
        for playlist in playArray {
            var list = Array<AnyObject>()
            for playitem in playlist.value as! [PlayItem] {
                let item : [String:AnyObject] = [k.name:playitem.name as AnyObject, k.link:playitem.link.absoluteString as AnyObject, k.time:playitem.time as AnyObject, k.rank:playitem.rank as AnyObject]
                list.append(item as AnyObject)
            }
            temp.append([k.name:playlist.key as AnyObject, k.list:list as AnyObject])
        }
        defaults.set(temp, forKey: UserSettings.Playlists.keyPath)
        defaults.synchronize()

        playlistTableView.doubleAction = #selector(playPlaylist(_:))
        playitemTableView.doubleAction = #selector(playPlaylist(_:))
        
        //  Load playlists shared by all document; our delegate maintains history
        self.restorePlaylists(restoreButton)

        NotificationCenter.default.addObserver(
            self,
