          ~(spec "keyword")
          ~(spec "negation-char")
          ~(spec "preprocessor")
-         ~(spec "regexp-grouping-backslash")
-         ~(spec "regexp-grouping-construct")
          ~(spec "string")
          ~(spec "type")
          ~(spec "variable-name")
-         ~(spec "warning"))
-        (~'provide-theme (~'read ~(str name)))))))
+         (~'provide-theme (~'read ~(str name))))))))
+
+
+;;'(font-lock-warning-face ((t (:foreground "yellow" :background ... :italic ... :weight ... ))))
+(defn font-lock-faceify [[face-name props :as pair]]
+  (let [face-name' (str "font-lock-" face-name "-face")]
+    (if (= face-name "default")
+      pair
+      (vector face-name' (assoc props :face/name face-name')))))
+
+(defn xform-prop-emacs [[k v]]
+  (when v
+    (let [rec @reconciler]
+      (case (name k)
+        "color-fg"  `(:foreground ~(:color/rgb (get-in rec v)))
+        "color-bg"  `(:background ~(:color/rgb (get-in rec v)))
+        "bold"      `(:weight     ~'bold)
+        "italic"    `(:italic     ~'t)
+        "underline" `(:underline  ~'t)
+        nil))))
+
+(defn xform-face-emacs [{:keys [face/name] :as face}]
+  ;; TODO could use transducers here to optimize
+  (let [plist (filter identity (map xform-prop-emacs face))]
+    `(~(reader/read-string name) ((~'t ~(flatten plist))))))
+
+(defn xform-faces-emacs [default-faces-map user-faces-map]
+  (let [default-faces-map' (into {} (map font-lock-faceify default-faces-map))
+        bg-color           (get-in default-faces-map ["background" :face/color-fg])]
+    (map xform-face-emacs (-> default-faces-map'
+                            ;; remove background face
+                            (dissoc "background")
+                            ;; inject original bg color into default face (emacs sets its background through the default face)
+                            (assoc-in ["default" :face/color-bg] bg-color)
+                            ;; to list
+                            vals
+                            ;; combine with the user defined emacs faces
+                            (concat (filter #(= :emacs (:face/editor %)) (vals user-faces-map)))))))
+
+;; (pprint/pprint (xform-default-faces-emacs (:faces/by-name @reconciler) (:user-faces/by-name @reconciler)))
 
 ;; TODO use a multimethod here
 (defn build-emacs []
-  (let [{current-theme :theme/name
-         faces-by-name :faces/by-name
-         colors-by-id  :colors/by-id} @app-state]
-    (pr-str (emacs-theme current-theme faces-by-name colors-by-id))))
+  (let [{current-theme      :theme/name
+         faces-by-name      :faces/by-name
+         user-faces-by-name :user-faces/by-name} @reconciler
+
+        user-faces-by-name'  (collect-user-faces-emacs user-faces-by-name)
+        xformed-faces-list   (xform-faces-emacs (merge user-faces-by-name faces-by-name))]
+    (pr-str (emacs-theme current-theme faces-by-name' colors-by-id))))
+
 
 (defn build-vim []
   "stub")

              ([face-name property]
               (let [face-name-emacs (face-to-emacs face-name)
                     face            (get faces-by-name face-name)
                     face-color-id   (last (:face/color face))
                     fg-rgb          (pr-str (get-in colors-by-id [face-color-id :color/rgb]))]
                 ;; TODO This is gross because cljs doesn't support interning
                 ;; Need to cleanup
                 (if (= face-name "default")


      `(~'progn
        (~'eval (~'read ~(str "(deftheme " name " " doc ")")))
        ;;(~'eval (~'deftheme ~name ~doc))
        ;; adds someproperties to that theme
        (~'put (~'read ~(str name)) (quote ~'theme-immediate) ~'t)
        ;; executes in color scope
