Index: src/lxml/etree.pyx
===================================================================
--- src/lxml/etree.pyx	(revision 22661)
+++ src/lxml/etree.pyx	(working copy)
@@ -175,14 +179,16 @@
     def getroot(self):
         return self._context_node
     
-    def write(self, file, encoding='us-ascii'):
+    def write(self, file, encoding='us-ascii', pretty_print=False, declaration=False):
         if not hasattr(file, 'write'):
             # file is a filename, we want a file object
             file = open(file, 'wb')
 
-        m = tostring(self._context_node, encoding)
+        if encoding in ('utf8', 'UTF8', 'utf-8'):
+            encoding = 'UTF-8'
+        m = tostring(self._context_node, encoding, pretty_print)
         # XXX this is purely for ElementTree compatibility..
-        if encoding == 'UTF-8' or encoding == 'us-ascii':
+        if not declaration and (encoding == 'UTF-8' or encoding == 'us-ascii'):
             m = _stripDeclaration(m)
             if m[-1:] == '\n':
                 m = m[:-1]
@@ -1013,14 +1098,19 @@
     assert elem is not None, "Must supply element."
     _dumpToFile(sys.stdout, elem._doc._c_doc, elem._c_node)
 
-def tostring(_NodeBase element, encoding='us-ascii'):
+def tostring(_NodeBase element, encoding='us-ascii', pretty_print=False):
     cdef _Document doc
     cdef tree.xmlOutputBuffer* c_buffer
     cdef tree.xmlCharEncodingHandler* enchandler
     cdef char* enc
+    cdef int c_pretty_print
+    cdef xmlNode* c_next
 
     assert element is not None
-    
+    # print "dumping node:", <int>element._c_node
+    # print "next node:", <int>element._c_node.next
+
+    c_pretty_print = int(bool(pretty_print))
     #if encoding is None:
     #    encoding = 'UTF-8'
     if encoding in ('utf8', 'UTF8', 'utf-8'):
@@ -1031,16 +1121,26 @@
     # encoding during output
     enchandler = tree.xmlFindCharEncodingHandler(enc)
     c_buffer = tree.xmlAllocOutputBuffer(enchandler)
-    tree.xmlNodeDumpOutput(c_buffer, doc._c_doc, element._c_node, 0, 0,
+    if c_pretty_print:
+        tree.xmlKeepBlanksDefault(0)
+    tree.xmlNodeDumpOutput(c_buffer, doc._c_doc, element._c_node, 0, c_pretty_print,
                            enc)
     _dumpNextNode(c_buffer, doc._c_doc, element._c_node, enc)
+    c_next = element._c_node.next
+    while <int>c_next != 0:
+        # print "dumping next:", c_next
+        _dumpNextNode(c_buffer, doc._c_doc, c_next, enc)
+        c_next = c_next.next
+
     tree.xmlOutputBufferFlush(c_buffer)
     if c_buffer.conv is not NULL: 
         result = tree.xmlBufferContent(c_buffer.conv)
     else:
         result = tree.xmlBufferContent(c_buffer.buffer)
     tree.xmlOutputBufferClose(c_buffer)
-    return result
+    if c_pretty_print:
+        tree.xmlKeepBlanksDefault(1)
+    return '<?xml version="1.0"?>\n' + result
 
 def parse(source, parser=None):
     """Return an ElementTree object loaded with source elements
@@ -1162,12 +1262,11 @@
 cdef _dumpToFile(f, xmlDoc* c_doc, xmlNode* c_node):
     cdef tree.PyObject* o
     cdef tree.xmlOutputBuffer* c_buffer
-    
     if not tree.PyFile_Check(f):
         raise ValueError, "Not a file"
     o = <tree.PyObject*>f
     c_buffer = tree.xmlOutputBufferCreateFile(tree.PyFile_AsFile(o), NULL)
-    tree.xmlNodeDumpOutput(c_buffer, c_doc, c_node, 0, 0, NULL)
+    tree.xmlNodeDumpOutput(c_buffer, c_doc, c_node, 0, 1, NULL)
     # dump next node if it's a text node
     _dumpNextNode(c_buffer, c_doc, c_node, NULL)
     tree.xmlOutputBufferWriteString(c_buffer, '\n')
@@ -1177,10 +1276,14 @@
                    xmlNode* c_node, char* encoding):
     cdef xmlNode* c_next
     c_next = c_node.next
+    tree.xmlNodeDumpOutput(c_buffer, c_doc, c_next, 0, 1, encoding)
+    return
     if not (c_next is not NULL and c_next.type == tree.XML_TEXT_NODE):
         c_next = NULL
+        print "setting c_next to none"
     if c_next is not NULL:
-        tree.xmlNodeDumpOutput(c_buffer, c_doc, c_next, 0, 0, encoding)
+        print "dumping output of node", <int>c_node
+        tree.xmlNodeDumpOutput(c_buffer, c_doc, c_next, 0, 1, encoding)
         
 cdef object _stripDeclaration(object xml_string):
     xml_string = xml_string.strip()
Index: src/lxml/tree.pxd
===================================================================
--- src/lxml/tree.pxd	(revision 22661)
+++ src/lxml/tree.pxd	(working copy)
@@ -156,6 +158,7 @@
     cdef int xmlReconciliateNs(xmlDoc* doc, xmlNode* tree)
     cdef xmlBuffer* xmlBufferCreate()
     cdef char* xmlBufferContent(xmlBuffer* buf)
+    cdef int xmlKeepBlanksDefault(int val)
     
 cdef extern from "libxml/xmlIO.h":
 
