diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7279786
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.tox/
+AUTHORS
+ChangeLog
+doc/build/
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100755
index 0000000..04837f0
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath('../..'))
+# -- General configuration ----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = [
+    'sphinx.ext.autodoc',
+]
+
+# autodoc generation is a bit aggressive and a nuisance when doing heavy
+# text edit cycles.
+# execute "export SPHINX_DEBUG=1" in your terminal to disable
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'ansible-role-diskimage-builder'
+copyright = u'2013, OpenStack Foundation'
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+add_module_names = True
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# -- Options for HTML output --------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+# html_theme_path = ["."]
+# html_theme = '_theme'
+# html_static_path = ['static']
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = '%sdoc' % project
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass
+# [howto/manual]).
+latex_documents = [
+    ('index',
+     '%s.tex' % project,
+     u'%s Documentation' % project,
+     u'OpenStack Foundation', 'manual'),
+]
+
+# Example configuration for intersphinx: refer to the Python standard library.
+# intersphinx_mapping = {'http://docs.python.org/': None}
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 0000000..a6210d3
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1 @@
+.. include:: ../../README.rst
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..90d4055
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+ansible
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..a70f2cf
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,23 @@
+[metadata]
+name = ansible-role-diskimage-builder
+summary = Ansible role to manage Diskimage Builder
+description-file =
+    README.rst
+author = OpenStack
+author-email = openstack-dev@lists.openstack.org
+home-page = http://www.openstack.org/
+classifier =
+    Intended Audience :: System Administrators
+    License :: OSI Approved :: Apache Software License
+    Operating System :: POSIX :: Linux
+
+[build_sphinx]
+source-dir = doc/source
+build-dir = doc/build
+all_files = 1
+
+[pbr]
+warnerrors = True
+
+[wheel]
+universal = 1
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..bb3db27
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,28 @@
+# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import setuptools
+
+# In python < 2.7.4, a lazy loading of package `pbr` will break
+# setuptools if some other modules registered functions in `atexit`.
+# solution from: http://bugs.python.org/issue15881#msg170215
+try:
+    import multiprocessing  # noqa
+except ImportError:
+    pass
+
+setuptools.setup(
+    setup_requires=['pbr'],
+    pbr=True)
diff --git a/test-requirements.txt b/test-requirements.txt
new file mode 100644
index 0000000..9ea7158
--- /dev/null
+++ b/test-requirements.txt
@@ -0,0 +1,3 @@
+ansible-lint
+hacking<0.11,>=0.10
+sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3
diff --git a/tests/test001.yaml b/tests/test.yaml
similarity index 67%
rename from tests/test001.yaml
rename to tests/test.yaml
index 8a669b1..5fa16b8 100644
--- a/tests/test001.yaml
+++ b/tests/test.yaml
@@ -13,5 +13,15 @@
 # under the License.
 ---
 - hosts: localhost
+  sudo: yes
+  vars:
+    rolename: "{{ lookup('pipe', 'pwd') | dirname | basename }}"
+  pre_tasks:
+    # Make sure OS does not have a stale package cache.
+    - name: Update apt cache.
+      apt:
+        update_cache: yes
+      when: ansible_os_family == 'Debian'
+
   roles:
-    - ansible-role-diskimage-builder
+    - "{{ rolename }}"
diff --git a/tests/test002.yaml b/tests/test002.yaml
deleted file mode 100644
index 6615def..0000000
--- a/tests/test002.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2015 Red Hat, Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
----
-- hosts: localhost
-  roles:
-    - { role: ansible-role-diskimage-builder, diskimage_builder_install_method: 'pip' }
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..23d78a3
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,36 @@
+[tox]
+minversion = 1.4.2
+envlist = ansible-lint,docs,pep8
+skipsdist = True
+
+[testenv]
+deps = -r{toxinidir}/requirements.txt
+       -r{toxinidir}/test-requirements.txt
+
+[testenv:ansible-lint]
+setenv =
+  ANSIBLE_CONFIG = tests/ansible.cfg
+whitelist_externals = bash
+commands =
+  bash -c "find . -type f -regex '.*.y[a]?ml' -print0 | xargs -t -n1 -0 \
+    ansible-lint"
+  bash -c "find tests -type f -regex '.*.y[a]?ml' -print | xargs -t -n1 \
+    ansible-playbook --syntax-check -i tests/inventory \
+    -e rolename=$(basename $(pwd)) > /dev/null"
+
+[testenv:ansible-functional]
+commands =
+  ansible-playbook -i tests/inventory tests/test.yaml
+passenv = HOME
+setenv =
+  ANSIBLE_CONFIG = {toxinidir}/tests/ansible.cfg
+  PYTHONUNBUFFERED = 1
+
+[testenv:docs]
+commands = python setup.py build_sphinx
+
+[testenv:pep8]
+commands = flake8
+
+[testenv:venv]
+commands = {posargs}