         [state {:status :not-found :status-info :no-kvs}])
       [state {:status :invalid :status-info :no-kvs-ident}])))
 
-(defn state-work [actx state-ch m work-fn]
-  (let [done-ch (achan actx)]
-    (act state-work actx
-         (aput state-work state-ch [work-fn done-ch]))
-         (aput state-work (:res-ch m)
-               (merge m (or (atake state-work done-ch)
-                            {:status :error :status-info :closed-ch})))))
+(defn kvs-do [actx state-ch m done-ch work-fn]
+  (act kvs-do actx
+       (aput kvs-do state-ch [work-fn done-ch])
+       (when done-ch
+         (aput kvs-do (:res-ch m)
+               (merge m (or (atake kvs-do done-ch)
+                            {:status :error :status-info :closed-ch}))))))
 
 (defn make-scan-fn [scan-kind result-key get-entry]
   (fn [actx state-ch m]

                            (aput scan-work res-ch
                                  (merge res-m {:status :ok}))))
                     nil)]
       (act scan-start actx
         (aput scan-start state-ch
               [(kvs-ident-check (:kvs-ident m) work-fn) nil])))))

(def op-handlers
  {:kvs-open
   (fn [actx state-ch m]
     (state-work actx state-ch m
                 #(if-let [name (:name m)]
                    (if-let [kvs (get-in % [:kvss name])]
                      [% {:status :ok :status-info :reopened

                              (aput multi-change res-ch (merge res-m res)))
                            (aput multi-change res-ch (merge res-m {:status :ok})))
                       [(assoc-in state [:kvss (:name kvs)] next-kvs) nil]))]
       (kvs-do actx state-ch m nil
               (kvs-checker (:kvs-ident m) work-fn))))

   :scan-keys
   (make-scan-fn :keys :key kc-entry-by-key-sq)
