diff --git a/genshi/_speedups.c b/genshi/_speedups.c
--- a/genshi/_speedups.c
+++ b/genshi/_speedups.c
@@ -54,6 +54,18 @@
     if (PyObject_TypeCheck(text, &MarkupType)) {
         Py_INCREF(text);
         return text;
+    }
+    if (PyObject_HasAttrString(text, "__html__")) {
+        ret = PyObject_CallMethod(text, "__html__", NULL);
+        args = PyTuple_New(1);
+        if (args == NULL) {
+            Py_DECREF(ret);
+            return NULL;
+        }
+        PyTuple_SET_ITEM(args, 0, ret);
+        ret = MarkupType.tp_new(&MarkupType, args, NULL);
+        Py_DECREF(args);
+        return ret;
     }
     in = (PyUnicodeObject *) PyObject_Unicode(text);
     if (in == NULL) {
@@ -183,6 +195,13 @@
         return text;
     }
     return escape(text, quotes);
+}
+
+static PyObject *
+Markup_html(PyObject *self)
+{
+    Py_INCREF(self);
+    return self;
 }
 
 PyDoc_STRVAR(join__doc__,
@@ -513,6 +532,7 @@
 } MarkupObject;
 
 static PyMethodDef Markup_methods[] = {
+    {"__html__", (PyCFunction) Markup_html, METH_NOARGS, NULL},
     {"escape", (PyCFunction) Markup_escape,
      METH_VARARGS|METH_CLASS|METH_KEYWORDS, escape__doc__},
     {"join", (PyCFunction)Markup_join, METH_VARARGS|METH_KEYWORDS, join__doc__},
diff --git a/genshi/builder.py b/genshi/builder.py
--- a/genshi/builder.py
+++ b/genshi/builder.py
@@ -68,7 +68,8 @@
 Hello, <em>world</em>!
 """
 
-from genshi.core import Attrs, Namespace, QName, Stream, START, END, TEXT
+from genshi.core import Attrs, Namespace, QName, Stream, START, END, TEXT, \
+                        Markup
 
 __all__ = ['Fragment', 'Element', 'ElementFactory', 'tag']
 __docformat__ = 'restructuredtext en'
@@ -105,6 +106,9 @@
         return str(self.generate())
 
     def __unicode__(self):
+        return unicode(self.generate())
+
+    def __html__(self):
         return unicode(self.generate())
 
     def append(self, node):
diff --git a/genshi/core.py b/genshi/core.py
--- a/genshi/core.py
+++ b/genshi/core.py
@@ -442,6 +442,9 @@
     def __repr__(self):
         return '<%s %r>' % (self.__class__.__name__, unicode(self))
 
+    def __html__(self):
+        return self
+
     def join(self, seq, escape_quotes=True):
         """Return a `Markup` object which is the concatenation of the strings
         in the given sequence, where this `Markup` object is the separator
@@ -484,6 +487,9 @@
             return cls()
         if type(text) is cls:
             return text
+        if hasattr(text, '__html__'):
+            return Markup(text.__html__())
+
         text = unicode(text).replace('&', '&amp;') \
                             .replace('<', '&lt;') \
                             .replace('>', '&gt;')
diff --git a/genshi/tests/builder.py b/genshi/tests/builder.py
--- a/genshi/tests/builder.py
+++ b/genshi/tests/builder.py
@@ -51,6 +51,11 @@
         self.assertEqual((Stream.END, 'b'), xml[3][:2])
         self.assertEqual((Stream.END, 'span'), xml[4][:2])
 
+    def test_Markup_escape(self):
+        from genshi.core import Markup
+        m = Markup("See %s") % tag.a("genshi", href='http://genshi.edgwall.org')
+        self.assertEqual(m, Markup('See <a href="http://genshi.edgwall.org">'
+                                   'genshi</a>'))
 
 def suite():
     suite = unittest.TestSuite()
