       (save-layout nil))
     (save-layout nil)))
 
+;;; Freese layout
+
+(defn- freese
+  [frame scn buttons]
+  (let [^JButton btn    (make-button buttons "Freese"),
+        ^JSpinner spn   (make-spinner buttons 0 (* 2 Math/PI) 0 0.01),
+        layout          (freese-layout (lattice (get-layout-from-scene scn))),
+        get-value       #(.getValue spn),
+        ^JButton rotate (make-button buttons "Rotate"),
+        rotate-thread   (atom nil)]
+    (with-action-on btn
+      (update-layout-of-scene scn (layout (get-value))))
+    (with-change-on spn
+      (update-layout-of-scene scn (layout (get-value))))
+    (with-action-on rotate
+      (if-not (nil? @rotate-thread)
+        (do
+          (.stop @rotate-thread)
+          (reset! rotate-thread nil))
+        (do
+          (reset! rotate-thread
+                  (Thread. #(doseq [angle (drop-while (let [y (get-value)]
+                                                        (fn [x] (<= x y)))
+                                                      (cycle (range 0 (* 2 Math/PI) 0.05)))]
+                              (Thread/sleep 100)
+                              (.setValue spn angle))))
+          (.start @rotate-thread))))))
+
 ;;; Technical Helpers
 
 (defmacro- with-layout-modifiers

  (:import [javax.swing JFrame JPanel JButton JTextField JLabel
                        JSeparator SwingConstants BoxLayout Box
                        JScrollBar JComboBox JScrollPane JFileChooser
                        JSlider]
           [javax.swing.filechooser FileNameExtensionFilter]
           [java.awt Canvas Color Dimension BorderLayout GridLayout Component Graphics]
           [java.awt.event ActionEvent ActionListener]

        change-parameters
        improve-layout-by-force
        snapshot-saver
        export-as-file
        freese)

      ;; drawing area
      (doto canvas-panel
