diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..9b3e9f2
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,26 @@
+# Wire up travis
+language: python
+sudo: false
+
+matrix:
+  include:
+    - python: 3.5
+      env: TOXENV=py35
+
+env:
+  - TOXENV=py27
+  - TOXENV=py33
+  - TOXENV=py34
+  - TOXENV=pypy
+  - TOXENV=pypy3
+  - TOXENV=cover
+
+install:
+  - travis_retry pip install tox
+
+script:
+  - travis_retry tox
+
+notifications:
+  email:
+    - repoze-checkins@lists.repoze.org
diff --git a/CHANGES.rst b/CHANGES.rst
index 195a70d..f0eee26 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,6 +1,15 @@
 Changelog
 =========
 
+2.1 (2016-06-03)
+----------------
+
+- Add support for Python 3.4, 3.5 and PyPy3.
+
+- Drop support for Python 2.6 and 3.2.
+
+- Add support for testing under Travis.
+
 2.0 (2013-06-26)
 ----------------
 
diff --git a/PKG-INFO b/PKG-INFO
index 5efcf11..337581e 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: repoze.tm2
-Version: 2.0
+Version: 2.1
 Summary: Per-request transactions via WSGI middleware
 Home-page: http://www.repoze.org
 Author: Agendaless Consulting
@@ -9,17 +9,37 @@ License: BSD-derived (http://www.repoze.org/LICENSE.txt)
 Description: repoze.tm2 (Transaction Manager)
         ================================
         
+        .. image:: https://travis-ci.org/repoze/repoze.tm2.png?branch=master
+                :target: https://travis-ci.org/repoze/repoze.tm2
+        
+        .. image:: https://readthedocs.org/projects/repozetm2/badge/?version=latest
+                :target: http://repozetm2.readthedocs.org/en/latest/ 
+                :alt: Documentation Status
+        
+        .. image:: https://img.shields.io/pypi/v/repoze.tm2.svg
+                :target: https://pypi.python.org/pypi/repoze.tm2
+        
+        .. image:: https://img.shields.io/pypi/pyversions/repoze.tm2.svg
+                :target: https://pypi.python.org/pypi/repoze.tm2
+        
         Middleware which uses the ZODB transaction manager to wrap a call to
         its pipeline children inside a transaction.  This is a fork of the
         ``repoze.tm`` package which depends only on the ``transaction``
         package rather than the entirety of ZODB (for users who don't rely on ZODB).
         
-        See docs/index.rst for documentation.
-        
         
         Changelog
         =========
         
+        2.1 (2016-06-03)
+        ----------------
+        
+        - Add support for Python 3.4, 3.5 and PyPy3.
+        
+        - Drop support for Python 2.6 and 3.2.
+        
+        - Add support for testing under Travis.
+        
         2.0 (2013-06-26)
         ----------------
         
@@ -180,14 +200,15 @@ Description: repoze.tm2 (Transaction Manager)
         
 Keywords: web application server wsgi zope repoze
 Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.2
 Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Internet :: WWW/HTTP
diff --git a/README.rst b/README.rst
index fb6d6e0..5e1e564 100644
--- a/README.rst
+++ b/README.rst
@@ -1,9 +1,20 @@
 repoze.tm2 (Transaction Manager)
 ================================
 
+.. image:: https://travis-ci.org/repoze/repoze.tm2.png?branch=master
+        :target: https://travis-ci.org/repoze/repoze.tm2
+
+.. image:: https://readthedocs.org/projects/repozetm2/badge/?version=latest
+        :target: http://repozetm2.readthedocs.org/en/latest/ 
+        :alt: Documentation Status
+
+.. image:: https://img.shields.io/pypi/v/repoze.tm2.svg
+        :target: https://pypi.python.org/pypi/repoze.tm2
+
+.. image:: https://img.shields.io/pypi/pyversions/repoze.tm2.svg
+        :target: https://pypi.python.org/pypi/repoze.tm2
+
 Middleware which uses the ZODB transaction manager to wrap a call to
 its pipeline children inside a transaction.  This is a fork of the
 ``repoze.tm`` package which depends only on the ``transaction``
 package rather than the entirety of ZODB (for users who don't rely on ZODB).
-
-See docs/index.rst for documentation.
diff --git a/debian/changelog b/debian/changelog
index 4297b30..cb2ad70 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-python-repoze.tm2 (2.0-3) UNRELEASED; urgency=low
+python-repoze.tm2 (2.1-1) UNRELEASED; urgency=low
 
   [ Debian Janitor ]
   * Use secure URI in debian/watch.
@@ -16,8 +16,9 @@ python-repoze.tm2 (2.0-3) UNRELEASED; urgency=low
   * Apply multi-arch hints.
     + python-repoze.tm2-doc: Add Multi-Arch: foreign.
   * Bump debhelper from old 12 to 13.
+  * New upstream release.
 
- -- Debian Janitor <janitor@jelmer.uk>  Sun, 21 Jun 2020 20:10:42 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 16 May 2022 12:57:26 -0000
 
 python-repoze.tm2 (2.0-2) unstable; urgency=medium
 
diff --git a/debian/patches/build-apidoc.patch b/debian/patches/build-apidoc.patch
index a90ddc4..f7e98bf 100644
--- a/debian/patches/build-apidoc.patch
+++ b/debian/patches/build-apidoc.patch
@@ -9,10 +9,10 @@ Patch-Name: build-apidoc.patch
  docs/conf.py | 2 ++
  1 file changed, 2 insertions(+)
 
-diff --git a/docs/conf.py b/docs/conf.py
-index 64c0aa9..9ef19e6 100644
---- a/docs/conf.py
-+++ b/docs/conf.py
+Index: python-repoze.tm2/docs/conf.py
+===================================================================
+--- python-repoze.tm2.orig/docs/conf.py
++++ python-repoze.tm2/docs/conf.py
 @@ -29,6 +29,8 @@ os.chdir(wd)
  for item in os.listdir(parent):
      if item.endswith('.egg'):
diff --git a/docs/.static/logo_hi.gif b/docs/.static/logo_hi.gif
deleted file mode 100644
index cb2a6aa..0000000
Binary files a/docs/.static/logo_hi.gif and /dev/null differ
diff --git a/docs/Makefile b/docs/Makefile
index e996997..e9c11d0 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -9,7 +9,7 @@ PAPER         =
 # Internal variables.
 PAPEROPT_a4     = -D latex_paper_size=a4
 PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d .build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+ALLSPHINXOPTS   = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
 
 .PHONY: help clean html web pickle htmlhelp latex changes linkcheck
 
@@ -23,48 +23,48 @@ help:
 	@echo "  linkcheck to check all external links for integrity"
 
 clean:
-	-rm -rf .build/*
+	-rm -rf _build/*
 
 html:
-	mkdir -p .build/html .build/doctrees
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) .build/html
+	mkdir -p _build/html _build/doctrees
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html
 	@echo
-	@echo "Build finished. The HTML pages are in .build/html."
+	@echo "Build finished. The HTML pages are in _build/html."
 
 pickle:
-	mkdir -p .build/pickle .build/doctrees
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) .build/pickle
+	mkdir -p _build/pickle _build/doctrees
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle
 	@echo
 	@echo "Build finished; now you can process the pickle files or run"
-	@echo "  sphinx-web .build/pickle"
+	@echo "  sphinx-web _build/pickle"
 	@echo "to start the sphinx-web server."
 
 web: pickle
 
 htmlhelp:
-	mkdir -p .build/htmlhelp .build/doctrees
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) .build/htmlhelp
+	mkdir -p _build/htmlhelp _build/doctrees
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp
 	@echo
 	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in .build/htmlhelp."
+	      ".hhp project file in _build/htmlhelp."
 
 latex:
-	mkdir -p .build/latex .build/doctrees
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) .build/latex
+	mkdir -p _build/latex _build/doctrees
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex
 	@echo
-	@echo "Build finished; the LaTeX files are in .build/latex."
+	@echo "Build finished; the LaTeX files are in _build/latex."
 	@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
 	      "run these through (pdf)latex."
 
 changes:
-	mkdir -p .build/changes .build/doctrees
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) .build/changes
+	mkdir -p _build/changes _build/doctrees
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes
 	@echo
-	@echo "The overview file is in .build/changes."
+	@echo "The overview file is in _build/changes."
 
 linkcheck:
-	mkdir -p .build/linkcheck .build/doctrees
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) .build/linkcheck
+	mkdir -p _build/linkcheck _build/doctrees
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck
 	@echo
 	@echo "Link check complete; look for any errors in the above output " \
-	      "or in .build/linkcheck/output.txt."
+	      "or in _build/linkcheck/output.txt."
diff --git a/docs/_static/logo_hi.png b/docs/_static/logo_hi.png
new file mode 100644
index 0000000..1db5180
Binary files /dev/null and b/docs/_static/logo_hi.png differ
diff --git a/docs/.static/repoze.css b/docs/_static/repoze.css
similarity index 100%
rename from docs/.static/repoze.css
rename to docs/_static/repoze.css
diff --git a/docs/api.rst b/docs/api.rst
index a32e9d6..44b9659 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -1,5 +1,5 @@
-:mod:`repoze.tm`
-----------------
+:mod:`repoze.tm2` API
+---------------------
 
 .. automodule:: repoze.tm
 
diff --git a/docs/changes.rst b/docs/changes.rst
index da1a2e7..3729ebc 100644
--- a/docs/changes.rst
+++ b/docs/changes.rst
@@ -1,4 +1,4 @@
-:mod:`repoze.tm` Change History
-===============================
+:mod:`repoze.tm2` Change History
+================================
 
 .. include:: ../CHANGES.rst
diff --git a/docs/conf.py b/docs/conf.py
index 64c0aa9..de65130 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -38,7 +38,7 @@ for item in os.listdir(parent):
 extensions = ['sphinx.ext.autodoc']
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['.templates']
+templates_path = ['_templates']
 
 # The suffix of source filenames.
 source_suffix = '.rst'
@@ -56,7 +56,7 @@ copyright = '2008-2013, Repoze Developers <repoze-dev@lists.repoze.org>'
 # The short X.Y version.
 version = '2.0'
 # The full version, including alpha/beta/rc tags.
-release = '2.0b1'
+release = '2.0'
 
 # There are two options for replacing |today|: either, you set today to
 # some non-false value, then it is used:
@@ -108,7 +108,7 @@ html_style = 'repoze.css'
 
 # The name of an image file (within the static path) to place at the top of
 # the sidebar.
-html_logo = '.static/logo_hi.gif'
+html_logo = '_static/logo_hi.png'
 
 # The name of an image file (within the static path) to use as favicon of
 # the docs.  This file should be a Windows icon file (.ico) being 16x16 or
@@ -119,7 +119,7 @@ html_logo = '.static/logo_hi.gif'
 # here, relative to this directory. They are copied after the builtin
 # static files, so a file named "default.css" will overwrite the builtin
 # "default.css".
-html_static_path = ['.static']
+html_static_path = ['_static']
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page
 # bottom, using the given strftime format.
@@ -180,7 +180,7 @@ latex_documents = [
 
 # The name of an image file (relative to this directory) to place at the
 # top of the title page.
-latex_logo = '.static/logo_hi.gif'
+latex_logo = '_static/logo_hi.png'
 
 # For "manual" documents, if this is true, then toplevel headings are
 # parts, not chapters.
diff --git a/docs/index.rst b/docs/index.rst
index c2edb71..8d95150 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -408,9 +408,7 @@ look in these places to see how to implement a more real-world
 transaction-aware database connector that uses this module in non-Zope
 applications:
 
-- http://svn.zope.org/ZODB/branches/3.7/src/transaction/
-
-- http://svn.zope.org/ZODB/branches/3.8/src/transaction/
+- http://www.zodb.org/en/latest/documentation/guide/transactions.html
 
 - http://mysql-python.sourceforge.net/ (ZMySQLDA)
 
@@ -423,6 +421,10 @@ The `repoze-dev maillist
 <http://lists.repoze.org/mailman/listinfo/repoze-dev>`_ should be used
 for communications about this software.
 
+Report bugs on Github:  https://github.com/repoze/repoze.tm2/issues
+
+Fork it on Github:  https://github.com/repoze/repoze.tm2/
+
 API Docs
 ------------------------
 
diff --git a/repoze.tm2.egg-info/PKG-INFO b/repoze.tm2.egg-info/PKG-INFO
index 5efcf11..337581e 100644
--- a/repoze.tm2.egg-info/PKG-INFO
+++ b/repoze.tm2.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: repoze.tm2
-Version: 2.0
+Version: 2.1
 Summary: Per-request transactions via WSGI middleware
 Home-page: http://www.repoze.org
 Author: Agendaless Consulting
@@ -9,17 +9,37 @@ License: BSD-derived (http://www.repoze.org/LICENSE.txt)
 Description: repoze.tm2 (Transaction Manager)
         ================================
         
+        .. image:: https://travis-ci.org/repoze/repoze.tm2.png?branch=master
+                :target: https://travis-ci.org/repoze/repoze.tm2
+        
+        .. image:: https://readthedocs.org/projects/repozetm2/badge/?version=latest
+                :target: http://repozetm2.readthedocs.org/en/latest/ 
+                :alt: Documentation Status
+        
+        .. image:: https://img.shields.io/pypi/v/repoze.tm2.svg
+                :target: https://pypi.python.org/pypi/repoze.tm2
+        
+        .. image:: https://img.shields.io/pypi/pyversions/repoze.tm2.svg
+                :target: https://pypi.python.org/pypi/repoze.tm2
+        
         Middleware which uses the ZODB transaction manager to wrap a call to
         its pipeline children inside a transaction.  This is a fork of the
         ``repoze.tm`` package which depends only on the ``transaction``
         package rather than the entirety of ZODB (for users who don't rely on ZODB).
         
-        See docs/index.rst for documentation.
-        
         
         Changelog
         =========
         
+        2.1 (2016-06-03)
+        ----------------
+        
+        - Add support for Python 3.4, 3.5 and PyPy3.
+        
+        - Drop support for Python 2.6 and 3.2.
+        
+        - Add support for testing under Travis.
+        
         2.0 (2013-06-26)
         ----------------
         
@@ -180,14 +200,15 @@ Description: repoze.tm2 (Transaction Manager)
         
 Keywords: web application server wsgi zope repoze
 Platform: UNKNOWN
-Classifier: Development Status :: 3 - Alpha
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.2
 Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Internet :: WWW/HTTP
diff --git a/repoze.tm2.egg-info/SOURCES.txt b/repoze.tm2.egg-info/SOURCES.txt
index 854c778..358c867 100644
--- a/repoze.tm2.egg-info/SOURCES.txt
+++ b/repoze.tm2.egg-info/SOURCES.txt
@@ -1,4 +1,5 @@
 .gitignore
+.travis.yml
 CHANGES.rst
 CONTRIBUTORS.txt
 COPYRIGHT.txt
@@ -13,8 +14,8 @@ docs/api.rst
 docs/changes.rst
 docs/conf.py
 docs/index.rst
-docs/.static/logo_hi.gif
-docs/.static/repoze.css
+docs/_static/logo_hi.png
+docs/_static/repoze.css
 repoze/__init__.py
 repoze.tm2.egg-info/PKG-INFO
 repoze.tm2.egg-info/SOURCES.txt
diff --git a/repoze.tm2.egg-info/requires.txt b/repoze.tm2.egg-info/requires.txt
index 5c9c66c..6e03b4a 100644
--- a/repoze.tm2.egg-info/requires.txt
+++ b/repoze.tm2.egg-info/requires.txt
@@ -7,4 +7,4 @@ Sphinx
 [testing]
 transaction
 nose
-coverage
\ No newline at end of file
+coverage
diff --git a/setup.py b/setup.py
index e641527..6186037 100644
--- a/setup.py
+++ b/setup.py
@@ -8,22 +8,29 @@ testing_extras = install_requires + ['nose', 'coverage']
 docs_extras = install_requires + ['Sphinx']
 
 here = os.path.abspath(os.path.dirname(__file__))
-README = open(os.path.join(here, 'README.rst')).read()
-CHANGES = open(os.path.join(here, 'CHANGES.rst')).read()
+def _read_file(filename):
+    try:
+        with open(os.path.join(here, filename)) as f:
+            return f.read()
+    except IOError:  # Travis???
+        return ''
+README = _read_file('README.rst')
+CHANGES = _read_file('CHANGES.rst')
 
 setup(name='repoze.tm2',
-      version='2.0',
+      version='2.1',
       description='Per-request transactions via WSGI middleware',
       long_description=README + "\n\n" + CHANGES,
       classifiers=[
-        "Development Status :: 3 - Alpha",
+        "Development Status :: 5 - Production/Stable",
         "Intended Audience :: Developers",
         "Programming Language :: Python",
-        "Programming Language :: Python :: 2.6",
+        "Programming Language :: Python :: 2",
         "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.2",
         "Programming Language :: Python :: 3.3",
+        "Programming Language :: Python :: 3.4",
+        "Programming Language :: Python :: 3.5",
         "Programming Language :: Python :: Implementation :: CPython",
         "Programming Language :: Python :: Implementation :: PyPy",
         "Topic :: Internet :: WWW/HTTP",
diff --git a/tox.ini b/tox.ini
index c82b8d9..ac386d6 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,17 +1,17 @@
 [tox]
 envlist = 
-    py26,py27,py32,py33,pypy,cover,docs
+    py27,pypy,py33,py34,py35,pypy3,cover,docs
 
 [testenv]
 commands = 
-    python setup.py test -q
+    python setup.py -q test -q
 deps =
     zope.interface
     transaction
 
 [testenv:cover]
 basepython =
-    python2.6
+    python2.7
 commands = 
     nosetests --with-xunit --with-xcoverage
 deps =
@@ -27,7 +27,7 @@ deps =
 
 [testenv:docs]
 basepython =
-    python2.6
+    python2.7
 commands = 
     sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
 deps =