       this)
 
     IKeysetCursor
-    (-keyset [this] (keyset state))
-    (-add-keyset-watch [this key f])
-    (-remove-keyset-watch [this key])
+    (-keyset [this] (coll-keyset state))
+    (-add-keyset-watch [this key f]
+      (when-not (contains? keyset-watches key)
+        (.activate this)
+        (set! (.-watchers this) (inc watchers))
+        (set! (.-keyset-watches this) (assoc keyset-watches key f))))
+    (-remove-keyset-watch [this key]
+      (when (contains? keyset-watches key)
+        (set! (.-watchers this) (dec watchers))
+        (set! (.-keyset-watches this) (dissoc keyset-watches key))
+        (.clean this)))
 
     IHash
     (-hash [this] (goog/getUid this))

      (set! (.-change-ks this) [key])
      (swap-fn assoc key val)
      this)
    (notifyChild [this child-key new-val]
      (doseq [child (get child-cursors child-key)]
        (.updateCursor child new-val)))
    (updateCursor [this new-state]
      (when-not (identical? state new-state)
        (let [old-state state]
          (set! state new-state)
          (if-let [change-ks (.-change-ks this)]
            (let [change-ks (if (keyword? change-ks)
                              [(case change-ks

                          new-val (get state ckey)]
                      (when-not (identical? old-val new-val)
                        (doseq [cur cursors]
                          (.updateCursor cur new-val))))))))))
    (rawDeref [this]
      (when (.-dirty this)
        (.updateCursor this (get-fn)))
