       (om/transact! data (fn [d] (assoc d :result :none))))))
 
 
-(om/root
- (gen-app-view a/labour-market-model)
- app-state
- {:target (. js/document (getElementById "app"))
-  :init-state {:animation-step 500}})
+(defn render-cellular-automaton
+  [view]
+  (om/root
+   view
+   app-state
+   {:target (. js/document (getElementById "app"))
+    :init-state {:animation-step 500}}))
+
+(defn menu-view
+  [data owner]
+  (reify
+    om/IRender
+    (render [_]
+      (dom/div #js {:className "app-menu"}
+        (dom/div #js {:className "page-header"}
+          (dom/h1 nil "Cellular automata experiments"))
+        (navigation-button
+         "Game of Life"
+         (partial render-cellular-automaton (gen-app-view a/game-of-life)))
+        (navigation-button
+         "Unrestricted language parser"
+         (partial render-cellular-automaton
+                  (gen-app-view
+                   a/unrestricted-language-parser
+                   unrestricted-language-parser-customization)))
+        (navigation-button
+         "Economic model parser"
+         (partial render-cellular-automaton
+                  (gen-app-view a/labour-market-model)))))))
+
+(defn render-menu-view
+  []
+  (om/root
+   menu-view
+   app-state
+   {:target (. js/document (getElementById "app"))}))
+
+
+(render-menu-view)


(def ^:private empty-view
  (fn [data owner] (reify om/IRender (render [_] (dom/span nil "")))))

(defn gen-app-view
  ([automaton-spec]


(enable-console-print!)

(def app-state {:grid {:width 10 :height 10 :cells {}}
                :display {:width 600 :height 600}
                :started false})


(defn cell-view
