diff --git a/doc/xml.html b/doc/xml.html
index ca0e27e..8cf3f69 100644
--- a/doc/xml.html
+++ b/doc/xml.html
@@ -1302,7 +1302,302 @@
 <p>You can check the <a
 href="http://cvs.gnome.org/lxr/source/libxslt/FEATURES">features</a>
 supported and the progresses on the <a
-href="http://cvs.gnome.org/lxr/source/libxslt/ChangeLog">Changelog</a></p>
+href="http://cvs.gnome.org/lxr/source/libxslt/ChangeLog"
+name="Changelog">Changelog</a></p>
+
+<h2><a name="Python">Python and bindings</a></h2>
+
+<p>There is a number of language bindings and wrappers available for libxml2,
+the list below is not exhaustive. Please contact the <a
+href="http://mail.gnome.org/mailman/listinfo/xml-bindings">xml-bindings@gnome.org</a>
+(<a href="http://mail.gnome.org/archives/xml-bindings/">archives</a>) in
+order to get updates to this list or to discuss the specific topic of libxml2
+or libxslt wrappers or bindings:</p>
+<ul>
+  <li><a href="mailto:ari@lusis.org">Ari Johnson</a>
+     provides a  C++ wrapper for libxml:<br>
+    Website: <a
+    href="http://lusis.org/~ari/xml++/">http://lusis.org/~ari/xml++/</a><br>
+    Download: <a
+    href="http://lusis.org/~ari/xml++/libxml++.tar.gz">http://lusis.org/~ari/xml++/libxml++.tar.gz</a></li>
+  <li>There is another <a href="http://libgdome-cpp.berlios.de/">C++ wrapper
+    based on the gdome2 </a>bindings maintained by Tobias Peters.</li>
+  <li><a
+    href="http://mail.gnome.org/archives/xml/2001-March/msg00014.html">Matt
+    Sergeant</a>
+     developped <a href="http://axkit.org/download/">XML::LibXSLT</a>, a perl
+    wrapper for libxml2/libxslt as part of the <a
+    href="http://axkit.com/">AxKit XML application server</a></li>
+  <li><a href="mailto:dkuhlman@cutter.rexx.com">Dave Kuhlman</a>
+     provides and earlier version of the libxml/libxslt <a
+    href="http://www.rexx.com/~dkuhlman">wrappers for Python</a></li>
+  <li>Petr Kozelka provides <a
+    href="http://sourceforge.net/projects/libxml2-pas">Pascal units to glue
+    libxml2</a> with Kylix, Delphi and other Pascal compilers</li>
+  <li>Wai-Sun "Squidster" Chia provides <a
+    href="http://www.rubycolor.org/arc/redist/">bindings for Ruby</a>  and
+    libxml2 bindings are also available in Ruby through the <a
+    href="http://libgdome-ruby.berlios.de/">libgdome-ruby</a> module
+    maintained by Tobias Peters.</li>
+</ul>
+
+<p>The distribution includes a set of Python bindings, which are garanteed to
+be maintained as part of the library in the future, though the Python
+interface have not yet reached the maturity of the C API. The distribution
+includes a set of examples and regression tests for the python bindings in
+the <code>python/tests</code> directory. Here are some excepts from those
+tests:</p>
+
+<h3>tst.py:</h3>
+
+<p>This is a basic test of the file interface and DOM navigation:</p>
+<pre>import libxml2
+
+doc = libxml2.parseFile("tst.xml")
+if doc.name != "tst.xml":
+    print "doc.name failed"
+    sys.exit(1)
+root = doc.children
+if root.name != "doc":
+    print "root.name failed"
+    sys.exit(1)
+child = root.children
+if child.name != "foo":
+    print "child.name failed"
+    sys.exit(1)
+doc.freeDoc()</pre>
+
+<p>The Python module is called libxml2, parseFile is the equivalent of
+xmlParseFile (most of the bindings are automatically generated, and the xml
+prefix is removed and the casing convention are kept). All node seen at the
+binding level share the same subset of accesors:</p>
+<ul>
+  <li><code>name</code>
+    : returns the node name</li>
+  <li><code>type</code>
+    : returns a string indicating the node typ<code>e</code></li>
+  <li><code>content</code>
+    : returns the content of the node, it is based on xmlNodeGetContent() and
+    hence is recursive.</li>
+  <li><code>parent</code>
+    , <code>children</code>, <code>last</code>, <code>next</code>,
+    <code>prev</code>, <code>doc</code>, <code>properties</code>: pointing to
+    the associated element in the tree, those may return None in case no such
+    link exists.</li>
+</ul>
+
+<p>Also note the need to explicitely deallocate documents with freeDoc() .
+Reference counting for libxml2 trees would need quite a lot of work to
+function properly, and rather than risk memory leaks if not implemented
+correctly it sounds safer to have an explicit function to free a tree. The
+wrapper python objects like doc, root or child are them automatically garbage
+collected.</p>
+
+<h3>validate.py:</h3>
+
+<p>This test check the validation interfaces and redirection of error
+messages:</p>
+<pre>import libxml2
+
+#desactivate error messages from the validation
+def noerr(ctx, str):
+    pass
+
+libxml2.registerErrorHandler(noerr, None)
+
+ctxt = libxml2.createFileParserCtxt("invalid.xml")
+ctxt.validate(1)
+ctxt.parseDocument()
+doc = ctxt.doc()
+valid = ctxt.isValid()
+doc.freeDoc()
+if valid != 0:
+    print "validity chec failed"</pre>
+
+<p>The first thing to notice is the call to registerErrorHandler(), it
+defines a new error handler global to the library. It is used to avoid seeing
+the error messages when trying to validate the invalid document.</p>
+
+<p>The main interest of that test is the creation of a parser context with
+createFileParserCtxt() and how the behaviour can be changed before calling
+parseDocument() . Similary the informations resulting from the parsing phase
+are also available using context methods.</p>
+
+<p>Contexts like nodes are defined as class and the libxml2 wrappers maps the
+C function interfaces in terms of objects method as much as possible. The
+best to get a complete view of what methods are supported is to look at the
+libxml2.py module containing all the wrappers.</p>
+
+<h3>push.py:</h3>
+
+<p>This test show how to activate the push parser interface:</p>
+<pre>import libxml2
+
+ctxt = libxml2.createPushParser(None, "&lt;foo", 4, "test.xml")
+ctxt.parseChunk("/&gt;", 2, 1)
+doc = ctxt.doc()
+
+doc.freeDoc()</pre>
+
+<p>The context is created with a speciall call based on the
+xmlCreatePushParser() from the C library. The first argument is an optional
+SAX callback object, then the initial set of data, the lenght and the name of
+the resource in case URI-References need to be computed by the parser.</p>
+
+<p>Then the data are pushed using the parseChunk() method, the last call
+setting the thrird argument terminate to 1.</p>
+
+<h3>pushSAX.py:</h3>
+
+<p>this test show the use of the event based parsing interfaces. In this case
+the parser does not build a document, but provides callback information as
+the parser makes progresses analyzing the data being provided:</p>
+<pre>import libxml2
+log = ""
+
+class callback:
+    def startDocument(self):
+        global log
+        log = log + "startDocument:"
+
+    def endDocument(self):
+        global log
+        log = log + "endDocument:"
+
+    def startElement(self, tag, attrs):
+        global log
+        log = log + "startElement %s %s:" % (tag, attrs)
+
+    def endElement(self, tag):
+        global log
+        log = log + "endElement %s:" % (tag)
+
+    def characters(self, data):
+        global log
+        log = log + "characters: %s:" % (data)
+
+    def warning(self, msg):
+        global log
+        log = log + "warning: %s:" % (msg)
+
+    def error(self, msg):
+        global log
+        log = log + "error: %s:" % (msg)
+
+    def fatalError(self, msg):
+        global log
+        log = log + "fatalError: %s:" % (msg)
+
+handler = callback()
+
+ctxt = libxml2.createPushParser(handler, "&lt;foo", 4, "test.xml")
+chunk = " url='tst'&gt;b"
+ctxt.parseChunk(chunk, len(chunk), 0)
+chunk = "ar&lt;/foo&gt;"
+ctxt.parseChunk(chunk, len(chunk), 1)
+
+reference = "startDocument:startElement foo {'url': 'tst'}:characters: bar:endElement foo:endDocument:"
+if log != reference:
+    print "Error got: %s" % log
+    print "Exprected: %s" % reference</pre>
+
+<p>The key object in that test is the handler, it provides a number of entry
+points which can be called by the parser as it makes progresses to indicate
+the information set obtained. The full set of callback is larger than what
+the callback class in that specific example implements (see the SAX
+definition for a complete list). The wrapper will only call those supplied by
+the object when activated. The startElement receives the names of the element
+and a dictionnary containing the attributes carried by this element.</p>
+
+<p>Also note that the reference string generated from the callback shows a
+single character call even though the string "bar" is passed to the parser
+from 2 different call to parseChunk()</p>
+
+<h3>xpath.py:</h3>
+
+<p>This is a basic test of XPath warppers support</p>
+<pre>import libxml2
+
+doc = libxml2.parseFile("tst.xml")
+ctxt = doc.xpathNewContext()
+res = ctxt.xpathEval("//*")
+if len(res) != 2:
+    print "xpath query: wrong node set size"
+    sys.exit(1)
+if res[0].name != "doc" or res[1].name != "foo":
+    print "xpath query: wrong node set value"
+    sys.exit(1)
+doc.freeDoc()
+ctxt.xpathFreeContext()</pre>
+
+<p>This test parses a file, then create an XPath context to evaluate XPath
+expression on it. The xpathEval() method execute an XPath query and returns
+the result mapped in a Python way. String and numbers are natively converted,
+and node sets are returned as a tuple of libxml2 Python nodes wrappers. Like
+the document, the XPath context need to be freed explicitely, also not that
+the result of the XPath query may point back to the document tree and hence
+the document must be freed after the result of the query is used.</p>
+
+<h3>xpathext.py:</h3>
+
+<p>This test shows how to extend the XPath engine with functions written in
+python:</p>
+<pre>import libxml2
+
+def foo(ctx, x):
+    return x + 1
+
+doc = libxml2.parseFile("tst.xml")
+ctxt = doc.xpathNewContext()
+libxml2.registerXPathFunction(ctxt._o, "foo", None, foo)
+res = ctxt.xpathEval("foo(1)")
+if res != 2:
+    print "xpath extension failure"
+doc.freeDoc()
+ctxt.xpathFreeContext()</pre>
+
+<p>Note how the extension function is registered with the context (but that
+part is not yet finalized, ths may change slightly in the future).</p>
+
+<h3>tstxpath.py:</h3>
+
+<p>This test is similar to the previousone but shows how the extension
+function can access the XPath evaluation context:</p>
+<pre>def foo(ctx, x):
+    global called
+
+    #
+    # test that access to the XPath evaluation contexts
+    #
+    pctxt = libxml2.xpathParserContext(_obj=ctx)
+    ctxt = pctxt.context()
+    called = ctxt.function()
+    return x + 1</pre>
+
+<p>All the interfaces around the XPath parser(or rather evaluation) context
+are not finalized, but it should be sufficient to do contextual work at the
+evaluation point.</p>
+
+<h3>Memory debugging:</h3>
+
+<p>last but not least, all tests starts with the following prologue:</p>
+<pre>#memory debug specific
+libxml2.debugMemory(1)
+</pre>
+
+<p>and ends with the following epilogue:</p>
+<pre>#memory debug specific
+libxml2.cleanupParser()
+if libxml2.debugMemory(1) == 0:
+    print "OK"
+else:
+    print "Memory leak %d bytes" % (libxml2.debugMemory(1))
+    libxml2.dumpMemory()</pre>
+
+<p>Those activate the memory debugging interface of libxml2 where all
+alloacted block in the library are tracked. The prologue then cleans up the
+library state and checks that all allocated memory has been freed. If not it
+calls dumpMemory() which saves that list in a <code>.memdump</code> file.</p>
 
 <h2><a name="architecture">libxml architecture</a></h2>
 
@@ -2232,6 +2527,9 @@
 
 
 
+
+
+
 } </pre>
   </li>
   <li>And then use it to save the document:
