                                       (.preventDefault e)))
                      :on-change (fn [e]
                                   (let [value (.. e -target -value)]
-                                    (swap! fields assoc :url value)))}]
+                                    (swap! fields assoc-in [:url :value] value)))}]
             [:span ".braid.chat"]]
            (when (and (show-status? :url) (not (valid? :url)))
-             [:div.error-message (first (messages :url))])
+             [:div.error-message (first (get-in @fields [:url :errors]))])
            [:div.explanation
             [:p "Pick something short and recognizeable."]
             [:p "Lowercase letters, numbers and dashes only."]]]]
 
          [:div.option.group-type
           [:h2 "Group Type"]
-          [:label {:class (when (= "public" (@fields :type)) "checked")}
+          [:label {:class (when (= "public" (get-in @fields [:type :value])) "checked")}
            [:input {:type "radio"
                     :name "type"
                     :value "public"
-                    :checked (when (= "public" (@fields :type)))
+                    :checked (when (= "public" (get-in @fields [:type :value])))
                     :on-focus (fn [_]
-                                (swap! focused? assoc :type true))
+                                (swap! fields assoc-in [:type :focused?] true))
                     :on-blur (fn [_]
-                               (swap! focused? assoc :type false))
+                               (swap! fields assoc-in [:type :focused?] false)
+                               (validate!))
                     :on-click (fn [e]
                                 (let [value (.. e -target -value)]
-                                  (swap! fields assoc :type value)))}]
+                                  (swap! fields assoc-in [:type :value] value)))}]
            [:span "Public Group"]
            [:div.explanation
             [:p "Anyone can find and join your group through the Braid Group Directory."]
             [:p "Unlimited everything. Free forever."]]]
-          [:label {:class (when (= "private" (@fields :type)) "checked")}
+          [:label {:class (when (= "private" (get-in @fields [:type :value])) "checked")}
            [:input {:type "radio"
                     :name "type"
                     :value "private"
-                    :checked (when (= "private" (@fields :type)))
+                    :checked (when (= "private" (get-in @fields [:type :value])))
                     :on-focus (fn [_]
-                                (swap! focused? assoc :type true))
+                                (swap! fields assoc-in [:type :focused?] true))
                     :on-blur (fn [_]
-                               (swap! focused? assoc :type false))
+                               (swap! fields assoc-in [:type :focused?] false)
+                               (validate!))
                     :on-click (fn [e]
                                 (let [value (.. e -target -value)]
-                                  (swap! fields assoc :type value)))}]
+                                  (swap! fields assoc-in [:type :value] value)))}]
            [:span "Private Group"]
            [:div.explanation
             [:p "Invite-only and hidden from the Braid Group Directory."]

            [:input {:type "text"
                     :placeholder "Team Awesome"
                     :auto-focus true
                     :value (@fields :name) ; TODO guess from email
                     :on-focus (fn [_]
                                 (swap! focused? assoc :name true))
                     :on-blur (fn [_]
                                (swap! focused? assoc :name false))
                     :on-change (fn [e]
                                  (let [value (.. e -target -value)]
                                    (swap! fields assoc :name value)))}]]
           (when (and (show-status? :name) (not (valid? :name)))
             [:div.error-message (first (messages :name))])
           [:div.explanation
            [:p "Your group's name will show up in menus and headings."]
            [:p "It doesn't need to be formal and can always be changed later."]]]]

                     :autocorrect false
                     :autocapitalize false
                     :spellcheck false
                     :value (get-in @fields [:url :value])
                     :on-focus (fn [_]
                                 (swap! fields assoc-in [:url :focused?] true))
                     :on-blur (fn [_]
                                (swap! fields assoc-in [:url :focused?] false)
                                (validate!))
                     :on-key-down (fn [e]
                                    (when (and
                                            (not (contains? #{KeyCodes.LEFT KeyCodes.RIGHT
