       (swap! state assoc-in [:last-stage-positions stage-dev] [x y]))))
 
 (defn set-property
-  ([prop] (let [[d p v] prop]
-            (device-best-effort d (core setProperty d p v)))))
+  [prop]
+  (let [[d p v] prop]
+    (when (not= v (get-in @state [:last-property-settings d p]))
+      (device-best-effort d (core setProperty d p v))
+      (swap! state assoc-in [:last-property-settings d p] v))))
 
 (defn run-autofocus []
   (let [z-drive (@state :default-z-drive)

          (for [runnable (event :runnables)]
            #(.run runnable))
          #(device-best-effort (core getCameraDevice)
             (wait-for-pending-devices)
             (expose event)
             (collect event out-queue)
             (stop-trigger)))))))

(defn execute [event-fns]
  (doseq [event-fn event-fns :while (not (:stop @state))]

            #(set-property [d p v]))
          #(when-lets [exposure (:exposure event)
                       camera (core getCameraDevice)]
             (set-exposure camera exposure))
          #(when check-z-ref
             (recall-z-reference current-position))
          #(when-let [wait-time-ms (:wait-time-ms event)]
