diff --git a/src/elements.lisp b/src/elements.lisp
index 12b3454..d387e50 100644
--- a/src/elements.lisp
+++ b/src/elements.lisp
@@ -9,6 +9,8 @@
                 #:make-keyword
                 #:plist-alist
                 #:symbolicate)
+  (:import-from #:piccolo/groups
+                #:non-escape-tag-p)
   (:import-from #:piccolo/escape
                 #:escape-attrs-alist
                 #:escape-children
@@ -68,7 +70,9 @@
   (make-instance 'builtin-element
                  :tag tag
                  :attrs attrs
-                 :children (escape-children children)))
+                 :children (if (non-escape-tag-p tag)
+                               children
+                               (escape-children children))))
 
 (defun make-builtin-element-with-prefix (&key tag attrs children prefix)
   (make-instance 'builtin-element-with-prefix
diff --git a/src/generator.lisp b/src/generator.lisp
index d556624..d94bed6 100644
--- a/src/generator.lisp
+++ b/src/generator.lisp
@@ -1,9 +1,7 @@
 (uiop:define-package #:piccolo/generator
   (:use #:cl)
-  (:import-from #:alexandria
-                #:with-gensyms
-                #:make-keyword
-                #:symbolicate)
+  (:import-from #:piccolo/groups
+                #:self-closing-tag-p)
   (:import-from #:piccolo/elements
                 #:attrs
                 #:attrs-alist
@@ -21,26 +19,6 @@
            #:elem-str))
 (in-package #:piccolo/generator)
 
-;;; groups of specific tags and attributes
-
-(defun symbols-hash-table (symbols)
-  (let ((ht (make-hash-table)))
-    (mapcar (lambda (sym)
-              (setf (gethash (make-keyword sym) ht) t))
-            symbols)
-    ht))
-
-(defmacro define-group (name &body symbols)
-  (with-gensyms (ht)
-    `(progn
-       (let ((,ht (symbols-hash-table ',symbols)))
-         (defun ,(symbolicate name '-p) (symbol)
-           (gethash (make-keyword (string-upcase symbol)) ,ht))))))
-
-(define-group self-closing-tag
-  area base br col embed hr img input keygen
-  link meta param source track wbr)
-
 ;;; print-object
 
 (defparameter *expand-user-element* t)
diff --git a/src/groups.lisp b/src/groups.lisp
new file mode 100644
index 0000000..514624d
--- /dev/null
+++ b/src/groups.lisp
@@ -0,0 +1,30 @@
+(defpackage #:piccolo/groups
+  (:use #:cl)
+  (:import-from #:alexandria
+                #:with-gensyms
+                #:symbolicate
+                #:make-keyword)
+  (:export #:self-closing-tag-p
+           #:non-escape-tag-p))
+(in-package #:piccolo/groups)
+
+(defun symbols-hash-table (symbols)
+  (let ((ht (make-hash-table)))
+    (mapcar (lambda (sym)
+              (setf (gethash (make-keyword sym) ht) t))
+            symbols)
+    ht))
+
+(defmacro define-group (name &body symbols)
+  (with-gensyms (ht)
+    `(progn
+       (let ((,ht (symbols-hash-table ',symbols)))
+         (defun ,(symbolicate name '-p) (symbol)
+           (gethash (make-keyword (string-upcase symbol)) ,ht))))))
+
+(define-group self-closing-tag
+  area base br col embed hr img input keygen
+  link meta param source track wbr)
+
+(define-group non-escape-tag
+  style script textarea pre)