diff --git a/.travis.yml b/.travis.yml
index d7364cb1e5abb243b4be48e67f1bf23a8f6591b6..ba4a48cc3f7959af82691e4909213e28e0006e1e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,33 +2,31 @@ language: python
 matrix:
   include:
   - python: 2.6
-#    env:
-#    - SCIPYSPEC===0.12.0
   - python: 2.7
     env:
-#    - SCIPYSPEC===0.12.0
     - secure: gBLc7oAwSQZtxHf/olpoPS1dmlA9nTcaFBBSTi62BPth8d8BlPrLoGluWuEIyyjbWgoVLbzNHLG0KL1zsjoV8ZWMIed7WSLZBGu+wU8K2gvgpTKwsFb0OEAix5bE2/QrMZtdPDM+izOMPlFGTT2xF2NFd3gn3N9dJxntTq/hcZA=
     - secure: aMJ2P2EwYHrsweAFa8X9cm2nrBFFDGoRBH98cXAbOfkgrbHseoIEZN9nx/ItYteGZqv8DOi0lMlucSxU5OhvdLN+YoGn67TIb7kHtux8V2XfO57P5d/fFkJjqBVbBzXolqHvIXVkDEdriaDvFrvIospPiaPgaL8JdqcHA5k7lRQ=
     - BOB_DOCUMENTATION_SERVER=https://www.idiap.ch/software/bob/docs/latest/bioidiap/%s/master
-#  - python: 3.2
-#    env:
-#    - NUMPYSPEC===1.8.0
-#    - SCIPYSPEC===0.13.1
+    - BOB_UPLOAD_WHEEL="--universal"
+  - python: 3.3
+  - python: 3.4
 before_install:
 - sudo add-apt-repository -y ppa:biometrics/bob
 - sudo apt-get update -qq
 - sudo apt-get install -qq --force-yes libjpeg8-dev libnetpbm10-dev libpng12-dev libtiff4-dev libgif-dev libboost-all-dev libblitz1-dev libhdf5-serial-dev libvl-dev dvipng texlive-latex-base texlive-latex-extra texlive-math-extra texlive-latex-recommended texlive-fonts-recommended libatlas-dev libatlas-base-dev liblapack-dev
-- if [ -n "${NUMPYSPEC}" ]; then sudo apt-get install -qq gfortran; fi
-- if [ -n "${NUMPYSPEC}" ]; then pip install --find-links http://wheels.astropy.org/ --find-links http://wheels2.astropy.org/ --use-wheel numpy$NUMPYSPEC; fi
-- pip install --find-links http://wheels.astropy.org/ --find-links http://wheels2.astropy.org/ --use-wheel scipy$SCIPYSPEC matplotlib==1.3.1 sphinx nose==1.3.0 jinja2==2.6 coveralls pygments==1.6
+- pip install --find-links https://www.idiap.ch/software/bob/wheels/travis/ --use-wheel sphinx nose numpy matplotlib coverage
+- pip install --find-links https://www.idiap.ch/software/bob/wheels/travis/ --use-wheel --pre -r requirements.txt coveralls
 install:
 - python bootstrap-buildout.py
-- ./bin/buildout -c develop.cfg
+- ./bin/buildout
 script:
-- ./bin/python -c 'from bob.example.faceverify import get_config; print(get_config())'
+- ./bin/python -c 'import pkg_resources; from bob.example.faceverify import get_config; print(get_config())'
 - ./bin/coverage run --source=bob.example.faceverify ./bin/nosetests -sv
 - ./bin/sphinx-build -b doctest doc sphinx
 - ./bin/sphinx-build -b html doc sphinx
 after_success:
 - coveralls
-- ./src/bob.extension/scripts/upload-sphinx.sh
+- wget https://raw.githubusercontent.com/bioidiap/bob.extension/master/scripts/upload-{sphinx,wheel}.sh
+- chmod a+x upload-sphinx.sh upload-wheel.sh
+- ./upload-sphinx.sh
+- ./upload-wheel.sh
diff --git a/MANIFEST.in b/MANIFEST.in
index fe26ed2b75a84d8a4698f728a02c2a9569f73628..925902b341749d953f627fc46f110de89f22c0fb 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,4 +1,3 @@
-include README.rst bootstrap-buildout.py buildout.cfg version.txt
+include README.rst bootstrap-buildout.py buildout.cfg develop.cfg version.txt requirements.txt
 recursive-include doc *.rst *.png conf.py
 recursive-include bob/example/faceverify/data *.hdf5
-
diff --git a/bob/example/faceverify/__init__.py b/bob/example/faceverify/__init__.py
index 511b76c203d5b7cfca2acc2e289b212652cdd80f..9046a151b9c1d6d57fba4f894127e373b3d8292e 100644
--- a/bob/example/faceverify/__init__.py
+++ b/bob/example/faceverify/__init__.py
@@ -22,18 +22,8 @@ from .utils import load_images
 def get_config():
   """Returns a string containing the configuration information.
   """
-
-  import pkg_resources
-
-  packages = pkg_resources.require(__name__)
-  this = packages[0]
-  deps = packages[1:]
-
-  retval =  "%s: %s (%s)\n" % (this.key, this.version, this.location)
-  retval += "  - python dependencies:\n"
-  for d in deps: retval += "    - %s: %s (%s)\n" % (d.key, d.version, d.location)
-
-  return retval.strip()
+  import bob.extension
+  return bob.extension.get_config(__name__)
 
 # gets sphinx autodoc done right - don't remove it
 __all__ = [_ for _ in dir() if not _.startswith('_')]
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..69e517452a5b7c29032453beb0742902bee489ca
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,9 @@
+setuptools
+bob.io.image              # image IO
+bob.ip.base               # tan-triggs dct-blocks
+bob.ip.color              # color image conversion
+bob.ip.gabor              # gabor graph
+bob.learn.linear          # eigenfaces
+bob.learn.em              # ubm-gmm
+bob.measure               # computing ROC
+bob.db.atnt               # the AT&T (ORL) database of images
diff --git a/setup.py b/setup.py
index b65a90ff08ca986794f1ab31e7fb2172d90ec834..02afa89af09873430f05f21c13fb1f9da841f239 100644
--- a/setup.py
+++ b/setup.py
@@ -19,11 +19,17 @@
 # allows you to test your package with new python dependencies w/o requiring
 # administrative interventions.
 
-from setuptools import setup, find_packages
+
+from setuptools import setup, find_packages, dist
+dist.Distribution(dict(setup_requires=['bob.extension']))
+
+from bob.extension.utils import load_requirements
+install_requires = load_requirements()
 
 # Define package version
 version = open("version.txt").read().rstrip()
 
+
 # The only thing we do in this file is to call the setup() function with all
 # parameters that define our package.
 setup(
@@ -51,17 +57,7 @@ setup(
     # scripts of this package. Don't worry - You won't need administrative
     # privileges when using buildout.
 
-    install_requires=[
-      "setuptools",
-      "bob.io.image",              # image IO
-      "bob.ip.base",               # tan-triggs, dct-blocks
-      "bob.ip.color",              # color image conversion
-      "bob.ip.gabor",              # gabor graph
-      "bob.learn.linear",          # eigenfaces
-      "bob.learn.em",              # ubm-gmm
-      "bob.measure",               # computing ROC
-      "bob.db.atnt",               # the AT&T (ORL) database of images
-    ],
+    install_requires=install_requires,
 
     # This package is good examples of namespace implementations
     # using several layers. You can check them out here:
diff --git a/version.txt b/version.txt
index 2091b3b9b939a71c6812e3cefd7b04139ade3682..8b26a157d452a8ac6fc3fa9f0583a7fc3ee666b2 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-2.1.1b0
\ No newline at end of file
+2.1.1b1