diff --git a/lxml-2.3.3.tar.gz b/lxml-2.3.3.tar.gz
new file mode 100644
index 0000000..52ef52c
--- /dev/null
+++ b/lxml-2.3.3.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2a3ca34f63b062ee8e059ca2460ac18040ec9622f0a31e143383f0db944ceb36
+size 3145451
diff --git a/lxml-2.3.tar.gz b/lxml-2.3.tar.gz
deleted file mode 100644
index 8c028c8..0000000
--- a/lxml-2.3.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eea1b8d29532739c1383cb4794c5eacd6176f0972b59e8d29348335b87ff2e66
-size 3187747
diff --git a/lxmldoc-2.3.3.pdf b/lxmldoc-2.3.3.pdf
new file mode 100644
index 0000000..c0a7518
--- /dev/null
+++ b/lxmldoc-2.3.3.pdf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c2f878090a27c8065822f4df0e9b3062bc672ebb3d88526fe515f4b1e6c9ef6
+size 1723289
diff --git a/lxmldoc-2.3.pdf b/lxmldoc-2.3.pdf
deleted file mode 100644
index eecb0f7..0000000
--- a/lxmldoc-2.3.pdf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ec2f55df1e916cb15065b5210de88d34abf76764ac27dfc4875f05feca05eb7a
-size 2080793
diff --git a/python-lxml.changes b/python-lxml.changes
index 7219f2b..42c4baa 100644
--- a/python-lxml.changes
+++ b/python-lxml.changes
@@ -1,3 +1,46 @@
+-------------------------------------------------------------------
+Fri Mar 9 20:57:25 UTC 2012 - saschpe@gmx.de
+
+- Update to version 2.3.3:
+ * lxml.html.tostring() gained new serialisation options with_tail and doctype.
+ * Fixed a crash when using iterparse() for HTML parsing and requesting start events.
+ * Fixed parsing of more selectors in cssselect. Whitespace before
+ pseudo-elements and pseudo-classes is significant as it is a descendant
+ combinator. "E :pseudo" should parse the same as "E *:pseudo", not "E:pseudo".
+ * lxml.html.diff no longer raises an exception when hitting 'img' tags without 'src' attribute.
+- Changes from version 2.3.2:
+ * lxml.objectify.deannotate() has a new boolean option cleanup_namespaces to
+ remove the objectify namespace declarations (and generally clean up the
+ namespace declarations) after removing the type annotations.
+ * lxml.objectify gained its own SubElement() function as a copy of
+ etree.SubElement to avoid an otherwise redundant import of lxml.etree on the user side.
+ * Fixed the "descendant" bug in cssselect a second time
+ * Fixed parsing of some selectors in cssselect.
+- Changes from version 2.3.1:
+ * New option kill_tags in lxml.html.clean to remove specific tags and their
+ content (i.e. their whole subtree).
+ * pi.get() and pi.attrib on processing instructions to parse
+ pseudo-attributes from the text content of processing instructions.
+ * lxml.get_include() returns a list of include paths that can be used to
+ compile external C code against lxml.etree.
+ * Resolver.resolve_file() takes an additional option close_file that
+ configures if the file(-like) object will be closed after reading or not.
+ * HTML cleaning didn't remove 'data:' links.
+ * The html5lib parser integration now uses the 'official' implementation in
+ html5lib itself, which makes it work with newer releases of the library.
+ * In lxml.sax, endElementNS() could incorrectly reject a plain tag name when
+ the corresponding start event inferred the same plain tag name to be in the default namespace.
+ * When an open file-like object is passed into parse() or iterparse(), the
+ parser will no longer close it after use.
+ * Assertion error in lxml.html.cleaner when discarding top-level elements.
+ * In lxml.cssselect, use the xpath 'A//B' (short for
+ 'A/descendant-or-self::node()/B') instead of 'A/descendant::B' for the css
+ descendant selector ('A B').
+ * In lxml.html, non-selected