Index: genshi/filters/tests/transform.py
===================================================================
--- genshi/filters/tests/transform.py	(revision 783)
+++ genshi/filters/tests/transform.py	(working copy)
@@ -19,9 +19,12 @@
 
 def suite():
     from genshi.input import HTML
+    from genshi.core import Markup
+    from genshi.builder import tag
     suite = doctest.DocTestSuite(genshi.filters.transform,
                                  optionflags=doctest.NORMALIZE_WHITESPACE,
-                                 extraglobs={'HTML': HTML})
+                                 extraglobs={'HTML': HTML, 'tag': tag, 
+                                     'Markup': Markup})
     return suite
 
 if __name__ == '__main__':
Index: genshi/filters/transform.py
===================================================================
--- genshi/filters/transform.py	(revision 783)
+++ genshi/filters/transform.py	(working copy)
@@ -51,7 +51,7 @@
 import sys
 
 from genshi.builder import Element
-from genshi.core import Stream, Attrs, QName, TEXT, START, END, _ensure
+from genshi.core import Stream, Attrs, QName, TEXT, START, END, _ensure, Markup
 from genshi.path import Path
 
 __all__ = ['Transformer', 'StreamBuffer', 'InjectorTransformation', 'ENTER',
@@ -549,6 +549,10 @@
         ...             '<b>some bold text</b></body></html>')
         >>> print html | Transformer('body').substitute('(?i)some', 'SOME')
         <html><body>SOME text, some more text and <b>SOME bold text</b></body></html>
+        >>> tags = tag.html(tag.body('Some text, some more text and ',
+        ...      Markup('<b>some bold text</b>')))
+        >>> print tags.generate() | Transformer('body').substitute('(?i)some', 'SOME')
+        <html><body>SOME text, some more text and <b>SOME bold text</b></body></html>
 
         :param pattern: A regular expression object or string.
         :param replace: Replacement pattern.
@@ -865,7 +869,8 @@
         """
         for mark, (kind, data, pos) in stream:
             if kind is TEXT:
-                data = self.pattern.sub(self.replace, data, self.count)
+                data1 = self.pattern.sub(self.replace, data, self.count)
+                data = isinstance(data, Markup) and Markup(data1) or data1
             yield mark, (kind, data, pos)
 
 

