- use py.test as default test runner
- upgrade tox file to use py35, coverage, etc.
- add flake8 rules
diff --git a/doc/build/changelog.rst b/doc/build/changelog.rst
index a371f7e..29914a8 100644
--- a/doc/build/changelog.rst
+++ b/doc/build/changelog.rst
@@ -10,6 +10,13 @@
     :released:
 
     .. change::
+        :tags: feature, test
+
+      The default test runner is now py.test.  Running "python setup.py test"
+      will make use of py.test instead of nose.  nose still works as a test
+      runner as well, however.
+
+    .. change::
         :tags: bug, lexer
         :pullreq: github:19
 
diff --git a/setup.py b/setup.py
index 56754aa..5b64d3f 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,5 @@
 from setuptools import setup, find_packages
+from setuptools.command.test import test as TestCommand
 import os
 import re
 import sys
@@ -13,8 +14,8 @@
     raise Exception("Mako requires Python 2.6 or higher.")
 
 markupsafe_installs = (
-            sys.version_info >= (2, 6) and sys.version_info < (3, 0)
-        ) or sys.version_info >= (3, 3)
+    sys.version_info >= (2, 6) and sys.version_info < (3, 0)
+) or sys.version_info >= (3, 3)
 
 install_requires = []
 
@@ -26,6 +27,26 @@
 except ImportError:
     install_requires.append('argparse')
 
+
+class PyTest(TestCommand):
+    user_options = [('pytest-args=', 'a', "Arguments to pass to py.test")]
+
+    def initialize_options(self):
+        TestCommand.initialize_options(self)
+        self.pytest_args = []
+
+    def finalize_options(self):
+        TestCommand.finalize_options(self)
+        self.test_args = []
+        self.test_suite = True
+
+    def run_tests(self):
+        # import here, cause outside the eggs aren't loaded
+        import pytest
+        errno = pytest.main(self.pytest_args)
+        sys.exit(errno)
+
+
 setup(name='Mako',
       version=VERSION,
       description="A super-fast templating language that borrows the \
@@ -47,8 +68,8 @@
       url='http://www.makotemplates.org/',
       license='MIT',
       packages=find_packages('.', exclude=['examples*', 'test*']),
-      tests_require=['nose >= 0.11', 'mock'],
-      test_suite="nose.collector",
+      tests_require=['pytest', 'mock'],
+      cmdclass={'test': PyTest},
       zip_safe=False,
       install_requires=install_requires,
       extras_require={},
diff --git a/tox.ini b/tox.ini
index d73c377..19016de 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,16 +1,30 @@
 # content of: tox.ini , put in same dir as setup.py
 [tox]
-envlist = py{26,27,33,34}
+minversion=1.8.dev1
+envlist = py{26,27,34,35}
 
 [testenv]
+cov_args=--cov=mako --cov-report term --cov-report xml
+
 deps=pytest
-     py{26,27}: mock
+     mock
      beaker
      markupsafe
      pygments
      babel
      dogpile.cache
      lingua<4
-     
-commands=py.test
+     cov: pytest-cov
 
+setenv=
+    cov: COVERAGE={[testenv]cov_args}
+
+commands=py.test {env:COVERAGE:} {posargs}
+
+
+[flake8]
+
+show-source = True
+ignore = E711,E712,E721,D,N
+# F841,F811,F401
+exclude=.venv,.git,.tox,dist,doc,*egg,build