diff --git a/.gitignore b/.gitignore
index 6c2d979db4e1cf3f4009630577a08fa5324f4e69..b0b1e02bc2d08cc57eb6a6c33bb447438c2a531d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 MANIFEST
-dist
-build
+build/
+dist/
+htmlcov/
 *.pyc
 *.swp
 .tox
diff --git a/MANIFEST.in b/MANIFEST.in
index 534b54600aabda43b8fbb32e918c8b1e591b3f70..bdab56b0fdc488a929001684c9ff3c441e4e3896 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -2,4 +2,4 @@ include LICENSE OWNERS README.rst
 include chkcrontab
 include chkcrontab_lib.py
 include setup.py
-recursive-include tests test*
+recursive-include tests test* cq.sh
diff --git a/setup.py b/setup.py
index fcba3027baee3169ba0fd74c3841bb757672eeee..c2a3ac9732514978a9536f6ee2f0500cf50ea5a1 100755
--- a/setup.py
+++ b/setup.py
@@ -66,7 +66,7 @@ class CleanCmd(Command):
     # Configure for this project.
     suffixes2del = ['MANIFEST', '.pyc', 'chkcrontabc']
     dirs2del = ['./build', './dist', './.tox', './.coverage',
-                './__pycache__']
+                './__pycache__', './htmlcov']
     dirs2ign = ['./.git']
     # End config.
     doomed = set()
diff --git a/tests/cq.sh b/tests/cq.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3d3d37ef94ff497009425ca53b7843d8aeae9bf8
--- /dev/null
+++ b/tests/cq.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# code quality reports
+
+# Lint
+for f in chkcrontab chkcrontab_lib.py; do
+  pylint --rcfile=.pylintrc $f
+  /bin/echo -n "Completed '$f'.  Next..."
+  read dummy
+done
+
+# Coverage
+coverage run ./setup.py test
+coverage html --include=chkcrontab,chkcrontab_lib.py
+open htmlcov/index.html