diff --git a/.gitignore b/.gitignore
index e1cf205905d93c46016f27f9e4df6a1da11cfd86..966ef052e8cb1dfe9ab17eff54ee874231f5dbb0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ __pycache__
 .vagrant/
 *.log
 *.retry
+.tox
diff --git a/.travis.yml b/.travis.yml
index 3d5ac3473f5e72fb4667a7dcb58304b3ae70b605..cf2d8cdeb597c91ea008ff87a318c100c0684f6a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,14 +8,15 @@ env:
     global:
         - VBOX_MEMORY=2048
     matrix:
-        - platform: openbsd60
-        - &openbsd59 platform=openbsd59
-        - platform: xenial
-        - platform: trusty
-        - platform: precise
-        - &stretch platform=stretch
-        - &jessie platform=jessie
-        - platform: wheezy
+        - TOXENV=pre-commit
+        - TOXENV=openbsd60
+        - &openbsd59 TOXENV=openbsd59
+        - TOXENV=xenial
+        - TOXENV=trusty
+        - TOXENV=precise
+        - &stretch TOXENV=stretch
+        - &jessie TOXENV=jessie
+        - TOXENV=wheezy
 matrix:
     fast_finish: True
     allow_failures:
@@ -33,13 +34,10 @@ install:
   - sudo apt-get install -y linux-headers-$(uname -r) virtualbox
   - wget https://releases.hashicorp.com/vagrant/1.9.1/vagrant_1.9.1_x86_64.deb
   - sudo dpkg -i vagrant_1.9.1_x86_64.deb
-  - pip install -r tests/requirements.txt | cat
-  - ansible-galaxy install git+file://$(pwd),$(git rev-parse --abbrev-ref HEAD) -p .molecule/roles
-  - molecule dependency
+  - pip install tox-travis | cat
 
 script:
-  - pre-commit run --all-files
-  - travis_wait 45 molecule test --platform $platform
+  - travis_wait 45 tox
 
 notifications:
   webhooks: https://galaxy.ansible.com/api/v1/notifications/
diff --git a/README.rst b/README.rst
index 9336623a7cbf4ae9089bf443fba4aeb4404d48ae..d50fb09c8eb2981fc3817e27116a87b161505707 100644
--- a/README.rst
+++ b/README.rst
@@ -31,21 +31,9 @@ See :code:`tests/playbook.yml`.
 Testing
 -------
 
-Testing requires Python 2.7, Vagrant and Virtualbox. Install the Python
-dependencies, dependent roles and roles required for testing:
-
-.. code:: shell
-
-    pip install -r tests/requirements.txt
-    ansible-galaxy install git+file://$(pwd),$(git rev-parse --abbrev-ref HEAD) -p .molecule/roles
-    molecule dependency
-
-To run the full test suite:
-
-.. code:: shell
-
-    pre-commit run --all-files
-    molecule test --platform all
+Testing requires Python 2.7, Tox, Vagrant and Virtualbox. To test simply run
+:code:`tox`. `Pre-commit <http://pre-commit.com/>`_ is also setup for this
+project.
 
 License
 -------
diff --git a/molecule.yml b/molecule.yml
index eb1bc5a972d02b4cfef2d38d47accdf26ac56931..da87f7ab5478d1327d485feece04da28bbc98e11 100644
--- a/molecule.yml
+++ b/molecule.yml
@@ -5,6 +5,10 @@ ansible:
   diff: True
   config_file: ../ansible.cfg
 
+molecule:
+  ignore_paths:
+  - .tox
+
 dependency:
   name: galaxy
   requirements_file: tests/requirements.yml
diff --git a/tests/requirements.txt b/tests/requirements.txt
index 57c94d957f72c9d89286e5275edda7bf2932707b..c0ffb8cc7e76a09533f8b216ed2374b29e94fdff 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -2,7 +2,6 @@ ansible==2.3.0.0
 testinfra==1.5.5
 molecule==1.23.2
 ansible-lint==3.4.12
-pre-commit==0.13.6
 python-vagrant==0.5.14
 netaddr==0.7.19
 passlib==1.7.1
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000000000000000000000000000000000000..112a2649757d2e1ecf413c1e12b47f1bdfd031ce
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,27 @@
+[tox]
+skip_install = True
+skipsdist = True
+envlist = openbsd60,openbsd59,xenial,trusty,precise,stretch,jessie,wheezy
+
+[testenv]
+envdir = {toxinidir}/.tox
+deps = -rtests/requirements.txt
+passenv = HOME VBOX* ANSIBLE_*
+whitelist_externals =
+    sh
+commands =
+    sh -c "ansible-galaxy install git+file://$(pwd),$(git rev-parse --abbrev-ref HEAD) -p .molecule/roles"
+    molecule test --platform {envname}
+
+[testenv:pre-commit]
+envdir = {toxinidir}/.tox
+deps =
+    -rtests/requirements.txt
+    pre-commit
+passenv = HOME VBOX* ANSIBLE_*
+whitelist_externals =
+    sh
+commands =
+    sh -c "ansible-galaxy install git+file://$(pwd),$(git rev-parse --abbrev-ref HEAD) -p .molecule/roles"
+    molecule dependency
+    pre-commit run --all-files