diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2298a2348d4fff8615446b414ddb1e2a3e074bdd
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,13 @@
+setuptools
+bob.extension
+bob.blitz
+bob.core
+bob.io.base
+
+# For tests
+bob.io.image
+bob.ip.color
+
+# For documentation generation
+bob.ip.draw
+matplotlib
diff --git a/setup.py b/setup.py
index f780856e5e7d883e3efb6e625c18f4b67fa1f369..48ef2195cc27f70a386af6e17a40f3486a44a959 100644
--- a/setup.py
+++ b/setup.py
@@ -9,9 +9,12 @@
 bob_packages = ['bob.core', 'bob.io.base']
 
 from setuptools import setup, find_packages, dist
-dist.Distribution(dict(setup_requires=['bob.blitz'] + bob_packages))
+dist.Distribution(dict(setup_requires=['bob.extension', 'bob.blitz'] + bob_packages))
 from bob.blitz.extension import Extension, build_ext
 
+from bob.extension.utils import load_requirements
+build_requires = load_requirements()
+
 version = '2.0.0a0'
 
 packages = ['boost', 'opencv>=2.0']
@@ -32,16 +35,8 @@ setup(
     include_package_data=True,
     zip_safe=False,
 
-    install_requires=[
-      'setuptools',
-      'bob.blitz',
-      'bob.core',
-      'bob.io.base',
-      'bob.io.image', #for tests
-      'bob.ip.color', #for tests
-      'bob.ip.draw', #for doc generation
-      'matplotlib', #for doc generation
-    ],
+    setup_requires = build_requires,
+    install_requires = build_requires,
 
     namespace_packages=[
       "bob",