     (setq boop--format-result-func 'boop--format-result-as-id)
     (run-at-time "2 sec" nil `(lambda () (setq boop--format-result-func (quote ,previous-format-func))))))
 
-(defun boop (id status)
+(defun boop (id status &optional group)
   "Manually boop something and set ID to have a status of STATUS."
   (if (assoc id boop-result-alist)
       (boop--update-result id status)
     (progn
       ;; Add the new boop to the config and results
-      (setq boop-config-alist (append (list (list id)) boop-config-alist))
-      (setq boop-result-alist (append (list (cons id status)) boop-result-alist)))))
+      (setq boop-config-alist (append (list (list id :group group)) boop-config-alist))
+      (setq boop-result-alist (append (list (list id :result status :group group)) boop-result-alist)))))
 
 (defun deboop (&optional id)
   "Remove boop with ID from `boop-config-alist` and sync with the results."

(defun boop--format-results-sorted (f)
  "Format `boop-result-alist` into a propertized display string."
  (let ((sorted-result-alist
         (if boop-sort-func (--sort (funcall boop-sort-func (cdr it) (cdr other)) boop-result-alist)
           boop-result-alist)))
    (mapconcat f sorted-result-alist "")))

(defun boop--format-results-grouped-by-result (f)
  "Format `boop-result-alist` into a propertized display string."
  (let ((results (-group-by 'cdr boop-result-alist)))
    (mapconcat (lambda (it) (format "[ %s]" (mapconcat f (cdr it) ""))) results " ")))

;;;;;; individual results

(defun boop--format-result-as-id (result)
  "Format an individual RESULT using its ID."
  (let* ((form (or (cdr (assoc (cdr result) boop-format-alist))
                   boop-default-format))
         (map-symbol (intern (format "boop-%s-mode-line-map" (car result))))
         (string-id (format "%s" (car result)))
         (short-id (funcall boop--shorten-id-func string-id)))

    (format "[%s] " (boop--propertize form string-id (when (boundp map-symbol) map-symbol) short-id))))

(defun boop--format-result (result)
  "Format an individual RESULT normally."
  (let ((form (or (cdr (assoc (cdr result) boop-format-alist))
                  boop-default-format))
        (map-symbol (intern (format "boop-%s-mode-line-map" (car result)))))
    (boop--propertize form (format "%s" (car result)) (when (boundp map-symbol) map-symbol))))

(defun boop--propertize (form &optional help-echo map symbol-override)
  "Propertizes FORM with optional HELP-ECHO string.

                'local-map (eval map)
                'pointer (when map 'hand))))

;; Shorten functions

(defun boop--shorten-substring (id)
  "Formats an ID string to be the substring of up to 5 characters."
  (substring id 0 (min (length id) 5)))

(defun boop--shorten-delim (id)
  "Formats an ID string to be the substring of up to 5 characters."
  (downcase (mapconcat (lambda (s) (substring s 0 1)) (s-split-words id) "-")))

;; Click bindings

(defmacro boop-defmodelinemap (id f)
