diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 0000000000000000000000000000000000000000..37410a36771566bf4fec216794a37fdfd2b3c3ea
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,27 @@
+# .coveragerc to control coverage.py
+[run]
+branch = True
+
+[report]
+# Regexes for lines to exclude from consideration
+exclude_lines =
+    # Have to re-enable the standard pragma
+    pragma: no cover
+
+    # Don't complain about missing debug-only code:
+    def __repr__
+    if self\.debug
+
+    # Don't complain if tests don't hit defensive assertion code:
+    raise AssertionError
+    raise NotImplementedError
+
+    # Don't complain if non-runnable code isn't run:
+    if 0:
+    if False:
+    if __name__ == .__main__.:
+
+ignore_errors = True
+
+[html]
+directory = htmlcov
diff --git a/.gitignore b/.gitignore
index 4b97de5d507070780e7773cd8672c4edf792c168..643e5d9b03cbdc8db56a0d8745ba8036e5d0e996 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@
 /share/spack/dotkit
 /share/spack/modules
 /TAGS
+/htmlcov
+.coverage
diff --git a/.style.yapf b/.style.yapf
new file mode 100644
index 0000000000000000000000000000000000000000..b4a1f688b8055335269122548f0693285e2670b1
--- /dev/null
+++ b/.style.yapf
@@ -0,0 +1,3 @@
+[style]
+based_on_style = pep8
+column_limit = 120
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 1bed6b087407bef0c3a5e6810852b96156fd6445..30dfebf783e8cebd5788ebad713504af2f1ef0d7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,20 +6,32 @@ python:
 # Use new Travis infrastructure (Docker can't sudo yet)
 sudo: false
 
-# No need to install any deps.
-install: true
+# Install coveralls to obtain code coverage
+install:
+  - "pip install coveralls"
+  - "pip install flake8"
 
 before_install:
   # Need this for the git tests to succeed.
   - git config --global user.email "spack@example.com"
   - git config --global user.name "Test User"
+  # Need this to be able to compute the list of changed files
+  - git fetch origin develop:develop
 
 script:
   - . share/spack/setup-env.sh
   - spack compilers
   - spack config get compilers
-  - spack test
   - spack install -v libdwarf
+  # Run unit tests with code coverage
+  - coverage run --source=lib --omit=lib/spack/spack/test/*,lib/spack/env/*,lib/spack/docs/*,lib/spack/external/* bin/spack test
+  # Checks if the file that have been changed are flake8 conformant
+  - CHANGED_PYTHON_FILES=`git diff develop... --name-only | perl -ne 'print if /\.py/g'`
+  - if [[ ${CHANGED_PYTHON_FILES} ]] ; then flake8 --format pylint --config flake8.ini ${CHANGED_PYTHON_FILES} ; fi
+
+
+after_success:
+  - coveralls
 
 notifications:
   email:
diff --git a/README.md b/README.md
index 1977a4fee9641954eed2cb30d57b9ea33cbf53dd..7797da299cd5ff88799f5eebe7c3584a203af586 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
 ============
 
 [![Build Status](https://travis-ci.org/LLNL/spack.png?branch=develop)](https://travis-ci.org/LLNL/spack)
+[![Coverage Status](https://coveralls.io/repos/github/LLNL/spack/badge.svg?branch=develop)](https://coveralls.io/github/LLNL/spack?branch=develop)
 
 Spack is a package management tool designed to support multiple
 versions and configurations of software on a wide variety of platforms
diff --git a/flake8.ini b/flake8.ini
new file mode 100644
index 0000000000000000000000000000000000000000..757c71705e50cdf3f67c31c4e77191839cecbd19
--- /dev/null
+++ b/flake8.ini
@@ -0,0 +1,3 @@
+[flake8]
+ignore = W391,F403
+max-line-length = 120
\ No newline at end of file