diff --git a/README.rst b/README.rst
index a90209139b9382bbd282d83380994ebf0bf99e28..68cfdb2e5c5957b2e51905c51aa15d7a6418ac9d 100644
--- a/README.rst
+++ b/README.rst
@@ -14,9 +14,9 @@ To add a new package:
 * Make sure the package is **public** first. Do not add private packages here.
 * Make sure the package is in https://gitlab.idiap.ch/bob/bob first.
 * The list of packages here should be in sync with `bob/bob`.
-* **Remove** packages which are here but no longer are in `bob/bob`.
+* Remove packages which are here but no longer are in `bob/bob`.
 * Add it in ``conda/meta.yaml`` and ``packages.txt``.
-* Add it in ``doc/index.rst`` (you need to add it in several places in this file).
+* Add it in ``doc/packages.rst`` (you need to add it in several places in this file).
 * Add it in ``doc/readme_index.rst``.
 * If it plots something using matplotlib during its documentation generation,
   make sure you add a symlink for it in the docs folder.
diff --git a/conda/meta.yaml b/conda/meta.yaml
index 1df25fb58d438e7618bc0a952c3c6825d9e70309..e695f659e79ada7be1b6a4e784a4bb5dad5ae9b0 100644
--- a/conda/meta.yaml
+++ b/conda/meta.yaml
@@ -13,8 +13,7 @@ requirements:
     - python
     - setuptools
     # This list should be the same as packages.txt.
-    # This list should also be the same as in bob/bob conda recipe + bob and bob.devtools
-    - bob
+    # This list should also be the same as in bob/bob conda recipe + bob.devtools
     - bob.ap
     - bob.bio.base
     - bob.bio.face
diff --git a/doc/envs/v262py27.yaml b/doc/envs/v262py27.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..57330559d3c5a572b61a8ccacdaa6210647257e3
--- /dev/null
+++ b/doc/envs/v262py27.yaml
@@ -0,0 +1,293 @@
+name: v262py27
+channels:
+  - https://www.idiap.ch/software/bob/conda/label/archive
+  - defaults
+  - https://www.idiap.ch/software/bob/conda
+dependencies:
+  - _license=1.1=py27_1
+  - alabaster=0.7.9=py27_0
+  - anaconda=4.3.0=np111py27_0
+  - anaconda-client=1.6.0=py27_0
+  - anaconda-navigator=1.4.3=py27_0
+  - argcomplete=1.0.0=py27_1
+  - astroid=1.4.9=py27_0
+  - astropy=1.3=np111py27_0
+  - babel=2.3.4=py27_0
+  - backports=1.0=py27_0
+  - backports_abc=0.5=py27_0
+  - beautifulsoup4=4.5.3=py27_0
+  - bitarray=0.8.1=py27_0
+  - blaze=0.10.1=py27_0
+  - bokeh=0.12.4=py27_0
+  - boost=1.61.0=py27_0
+  - boto=2.45.0=py27_0
+  - bottleneck=1.2.0=np111py27_0
+  - bzip2=1.0.6=3
+  - caffe=1.0.0rc3=np111py27_nomkl_0
+  - cairo=1.14.8=0
+  - cdecimal=2.3=py27_2
+  - cffi=1.9.1=py27_0
+  - chardet=2.3.0=py27_0
+  - chest=0.2.3=py27_0
+  - click=6.7=py27_0
+  - cloog=0.18.0=0
+  - cloudpickle=0.2.2=py27_0
+  - clyent=1.2.2=py27_0
+  - cmake=3.6.3=0
+  - colorama=0.3.7=py27_0
+  - configobj=5.0.6=py27_0
+  - configparser=3.5.0=py27_0
+  - contextlib2=0.5.4=py27_0
+  - coverage=4.2=py27_0
+  - cryptography=1.7.1=py27_0
+  - curl=7.52.1=0
+  - cycler=0.10.0=py27_0
+  - cython=0.25.2=py27_0
+  - cytoolz=0.8.2=py27_0
+  - dask=0.13.0=py27_0
+  - datashape=0.5.4=py27_0
+  - dbus=1.10.10=0
+  - decorator=4.0.11=py27_0
+  - dill=0.2.5=py27_0
+  - docopt=0.6.2=py27_0
+  - docutils=0.13.1=py27_0
+  - entrypoints=0.2.2=py27_0
+  - enum34=1.1.6=py27_0
+  - et_xmlfile=1.0.1=py27_0
+  - expat=2.1.0=0
+  - fastcache=1.0.2=py27_1
+  - flask=0.12=py27_0
+  - flask-cors=3.0.2=py27_0
+  - fontconfig=2.12.1=2
+  - freetype=2.5.5=2
+  - funcsigs=1.0.2=py27_0
+  - functools32=3.2.3.2=py27_0
+  - futures=3.0.5=py27_0
+  - gcc=4.8.5=7
+  - get_terminal_size=1.0.0=py27_0
+  - gevent=1.2.1=py27_0
+  - gflags=2.1.2=0
+  - glib=2.50.2=1
+  - glog=0.3.4=0
+  - gmp=6.1.0=0
+  - greenlet=0.4.11=py27_0
+  - grin=1.2.1=py27_3
+  - gst-plugins-base=1.8.0=0
+  - gstreamer=1.8.0=0
+  - h5py=2.6.0=np111py27_2
+  - harfbuzz=0.9.39=2
+  - hdf5=1.8.17=1
+  - heapdict=1.0.0=py27_1
+  - icu=54.1=0
+  - idna=2.2=py27_0
+  - imagesize=0.7.1=py27_0
+  - ipaddress=1.0.18=py27_0
+  - ipykernel=4.5.2=py27_0
+  - ipython=5.1.0=py27_0
+  - ipython_genutils=0.1.0=py27_0
+  - ipywidgets=5.2.2=py27_1
+  - isl=0.12.2=0
+  - isort=4.2.5=py27_0
+  - itsdangerous=0.24=py27_0
+  - jbig=2.1=0
+  - jdcal=1.3=py27_0
+  - jedi=0.9.0=py27_1
+  - jinja2=2.9.4=py27_0
+  - jpeg=9b=0
+  - jsonschema=2.5.1=py27_0
+  - jupyter=1.0.0=py27_3
+  - jupyter_client=4.4.0=py27_0
+  - jupyter_console=5.0.0=py27_0
+  - jupyter_core=4.2.1=py27_0
+  - lazy-object-proxy=1.2.2=py27_0
+  - leveldb=1.19=0
+  - libffi=3.2.1=1
+  - libgcc=4.8.5=2
+  - libgfortran=3.0.0=1
+  - libiconv=1.14=0
+  - libpng=1.6.27=0
+  - libprotobuf=3.0.0=0
+  - libsodium=1.0.10=0
+  - libtiff=4.0.6=3
+  - libxcb=1.12=1
+  - libxml2=2.9.4=0
+  - libxslt=1.1.29=0
+  - llvmlite=0.15.0=py27_0
+  - lmdb=0.9.18=0
+  - locket=0.2.0=py27_1
+  - lxml=3.7.2=py27_0
+  - markupsafe=0.23=py27_2
+  - matplotlib=2.0.0=np111py27_0
+  - mistune=0.7.3=py27_0
+  - mkl=2017.0.1=0
+  - mkl-service=1.1.2=py27_3
+  - mock=2.0.0=py27_0
+  - mpc=1.0.3=0
+  - mpfr=3.1.5=0
+  - mpmath=0.19=py27_1
+  - multipledispatch=0.4.9=py27_0
+  - nbconvert=4.2.0=py27_0
+  - nbformat=4.2.0=py27_0
+  - ncurses=5.9=10
+  - networkx=1.11=py27_0
+  - nltk=3.2.2=py27_0
+  - nomkl=1.0=0
+  - nose=1.3.7=py27_1
+  - notebook=4.3.1=py27_0
+  - numba=0.30.1=np111py27_0
+  - numexpr=2.6.1=np111py27_2
+  - numpy=1.11.3=py27_0
+  - numpydoc=0.6.0=py27_0
+  - odo=0.5.0=py27_1
+  - openblas=0.2.19=0
+  - openpyxl=2.4.1=py27_0
+  - openssl=1.0.2k=0
+  - pandas=0.19.2=np111py27_1
+  - partd=0.3.7=py27_0
+  - path.py=10.0=py27_0
+  - pathlib2=2.2.0=py27_0
+  - patsy=0.4.1=py27_0
+  - pbr=1.10.0=py27_0
+  - pcre=8.39=1
+  - pep8=1.7.0=py27_0
+  - pexpect=4.2.1=py27_0
+  - pickleshare=0.7.4=py27_0
+  - pillow=4.0.0=py27_0
+  - pip=9.0.1=py27_1
+  - pixman=0.34.0=0
+  - pkg-config=0.28=1
+  - ply=3.9=py27_0
+  - prompt_toolkit=1.0.9=py27_0
+  - protobuf=3.0.0=py27_1
+  - psutil=5.0.1=py27_0
+  - ptyprocess=0.5.1=py27_0
+  - py=1.4.32=py27_0
+  - pyasn1=0.1.9=py27_0
+  - pycairo=1.10.0=py27_0
+  - pycosat=0.6.1=py27_1
+  - pycparser=2.17=py27_0
+  - pycrypto=2.6.1=py27_4
+  - pycurl=7.43.0=py27_2
+  - pyflakes=1.5.0=py27_0
+  - pygments=2.1.3=py27_0
+  - pylint=1.6.4=py27_1
+  - pyopenssl=16.2.0=py27_0
+  - pyparsing=2.1.4=py27_0
+  - pyqt=5.6.0=py27_2
+  - pytables=3.3.0=np111py27_0
+  - pytest=3.0.5=py27_0
+  - python=2.7.13=0
+  - python-dateutil=2.6.0=py27_0
+  - python-gflags=2.0=py27_0
+  - python-leveldb=0.194=py27_0
+  - pytz=2016.10=py27_0
+  - pyyaml=3.12=py27_0
+  - pyzmq=16.0.2=py27_0
+  - qt=5.6.2=3
+  - qtawesome=0.4.3=py27_0
+  - qtconsole=4.2.1=py27_1
+  - qtpy=1.2.1=py27_0
+  - readline=6.2=2
+  - redis=3.2.0=0
+  - redis-py=2.10.5=py27_0
+  - requests=2.12.4=py27_0
+  - rope=0.9.4=py27_1
+  - scandir=1.4=py27_0
+  - scikit-image=0.12.3=np111py27_1
+  - scikit-learn=0.18.1=np111py27_1
+  - scipy=0.18.1=np111py27_1
+  - seaborn=0.7.1=py27_0
+  - setuptools=27.2.0=py27_0
+  - simplegeneric=0.8.1=py27_1
+  - singledispatch=3.4.0.3=py27_0
+  - sip=4.18=py27_0
+  - six=1.10.0=py27_0
+  - snappy=1.1.3=0
+  - snowballstemmer=1.2.1=py27_0
+  - sockjs-tornado=1.0.3=py27_0
+  - sphinx=1.5.1=py27_0
+  - sphinx_rtd_theme=0.1.9=py27_1
+  - spyder=3.1.2=py27_0
+  - sqlalchemy=1.1.5=py27_0
+  - sqlite=3.13.0=0
+  - ssl_match_hostname=3.4.0.2=py27_1
+  - statsmodels=0.6.1=np111py27_1
+  - subprocess32=3.2.7=py27_0
+  - sympy=1.0=py27_0
+  - tensorflow=0.10.0rc0=np111py27_0
+  - terminado=0.6=py27_0
+  - tk=8.5.18=0
+  - toolz=0.8.2=py27_0
+  - tornado=4.4.2=py27_0
+  - traitlets=4.3.1=py27_0
+  - unicodecsv=0.14.1=py27_0
+  - wcwidth=0.1.7=py27_0
+  - werkzeug=0.11.15=py27_0
+  - wheel=0.29.0=py27_0
+  - widgetsnbextension=1.2.6=py27_0
+  - wrapt=1.10.8=py27_0
+  - xlrd=1.0.0=py27_0
+  - xlsxwriter=0.9.6=py27_0
+  - xlwt=1.2.0=py27_0
+  - xz=5.2.2=1
+  - yaml=0.1.6=0
+  - zeromq=4.1.5=0
+  - zlib=1.2.8=3
+  - bob=2.6.2=py27_0
+  - bob.ap=2.1.2=py27_0
+  - bob.blitz=2.0.12=np111py27_0
+  - bob.core=2.1.7=py27_0
+  - bob.db.atnt=2.0.8=py27_0
+  - bob.db.base=2.2.0=py27_0
+  - bob.db.iris=2.0.8=py27_0
+  - bob.db.mnist=2.0.7=py27_0
+  - bob.db.wine=2.0.7=py27_0
+  - bob.extension=2.3.9=py27_0
+  - bob.io.audio=2.0.4=py27_0
+  - bob.io.base=2.0.13=py27_0
+  - bob.io.image=2.2.1=py27_0
+  - bob.io.matlab=2.0.8=py27_0
+  - bob.io.video=2.0.14=py27_0
+  - bob.ip.base=2.0.14=py27_0
+  - bob.ip.color=2.0.8=py27_0
+  - bob.ip.draw=2.0.7=py27_0
+  - bob.ip.facedetect=2.1.2=py27_0
+  - bob.ip.flandmark=2.1.4=py27_0
+  - bob.ip.gabor=2.0.9=py27_0
+  - bob.ip.optflow.hornschunck=2.0.11=py27_0
+  - bob.ip.optflow.liu=2.0.10=py27_0
+  - bob.learn.activation=2.0.8=py27_0
+  - bob.learn.boosting=2.0.11=py27_0
+  - bob.learn.em=2.0.12=py27_0
+  - bob.learn.libsvm=2.0.10=py27_0
+  - bob.learn.linear=2.1.0=py27_0
+  - bob.learn.mlp=2.1.4=py27_0
+  - bob.math=2.1.0=np111py27_0
+  - bob.measure=2.3.0=py27_0
+  - bob.sp=2.0.8=py27_0
+  - cyvlfeat=0.4.5=np111py27_2
+  - dlib=19.0=np111py27_1
+  - ffmpeg=2.8.10=4
+  - giflib=5.1.4=3
+  - ipdb=0.10.2=py27_0
+  - kaldi=r7271.1a4dbf6=0
+  - libblitz=0.10=3
+  - libmatio=1.5.6=3
+  - libogg=1.3.2=0
+  - libsvm=3.21=3
+  - menpo=0.7.7=np111py27_4
+  - menpofit=0.4.1=py27_1
+  - menpowidgets=0.2.1p3=py27_0
+  - mne=0.13.1=np111py27_0
+  - opencv=3.1.0=np111py27_4
+  - openfst=1.6.1=0
+  - pathlib=1.0=py27_0
+  - pkgtools=0.7.3=py27_0
+  - pyedflib=0.1.6=np111py27_2
+  - schema=0.6.5=py27_0
+  - sox=14.4.2=5
+  - speex=1.2.0=0
+  - toolchain=2.3.2=0
+  - vlfeat=0.9.20=3
+  - x264=20131217=3
+  - zc.buildout=2.9.2=py27_0
diff --git a/doc/envs/v262py35.yaml b/doc/envs/v262py35.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..701deb7930aa6bf0cb0d6a788229d9cb9866b8d4
--- /dev/null
+++ b/doc/envs/v262py35.yaml
@@ -0,0 +1,266 @@
+name: v262py35
+channels:
+  - https://www.idiap.ch/software/bob/conda/label/archive
+  - defaults
+  - https://www.idiap.ch/software/bob/conda
+dependencies:
+  - _license=1.1=py35_1
+  - alabaster=0.7.9=py35_0
+  - anaconda=4.3.0=np111py35_0
+  - anaconda-client=1.6.0=py35_0
+  - anaconda-navigator=1.4.3=py35_0
+  - argcomplete=1.0.0=py35_1
+  - astroid=1.4.9=py35_0
+  - astropy=1.3=np111py35_0
+  - babel=2.3.4=py35_0
+  - backports=1.0=py35_0
+  - beautifulsoup4=4.5.3=py35_0
+  - bitarray=0.8.1=py35_0
+  - blaze=0.10.1=py35_0
+  - bokeh=0.12.4=py35_0
+  - boost=1.61.0=py35_0
+  - boto=2.45.0=py35_0
+  - bottleneck=1.2.0=np111py35_0
+  - bzip2=1.0.6=3
+  - cairo=1.14.8=0
+  - cffi=1.9.1=py35_0
+  - chardet=2.3.0=py35_0
+  - chest=0.2.3=py35_0
+  - click=6.7=py35_0
+  - cloog=0.18.0=0
+  - cloudpickle=0.2.2=py35_0
+  - clyent=1.2.2=py35_0
+  - cmake=3.6.3=0
+  - colorama=0.3.7=py35_0
+  - configobj=5.0.6=py35_0
+  - contextlib2=0.5.4=py35_0
+  - coverage=4.2=py35_0
+  - cryptography=1.7.1=py35_0
+  - curl=7.52.1=0
+  - cycler=0.10.0=py35_0
+  - cython=0.25.2=py35_0
+  - cytoolz=0.8.2=py35_0
+  - dask=0.13.0=py35_0
+  - datashape=0.5.4=py35_0
+  - dbus=1.10.10=0
+  - decorator=4.0.11=py35_0
+  - dill=0.2.5=py35_0
+  - docopt=0.6.2=py35_0
+  - docutils=0.13.1=py35_0
+  - entrypoints=0.2.2=py35_0
+  - et_xmlfile=1.0.1=py35_0
+  - expat=2.1.0=0
+  - fastcache=1.0.2=py35_1
+  - flask=0.12=py35_0
+  - flask-cors=3.0.2=py35_0
+  - fontconfig=2.12.1=2
+  - freetype=2.5.5=2
+  - gcc=4.8.5=7
+  - get_terminal_size=1.0.0=py35_0
+  - gevent=1.2.1=py35_0
+  - glib=2.50.2=1
+  - gmp=6.1.0=0
+  - greenlet=0.4.11=py35_0
+  - gst-plugins-base=1.8.0=0
+  - gstreamer=1.8.0=0
+  - h5py=2.6.0=np111py35_2
+  - harfbuzz=0.9.39=2
+  - hdf5=1.8.17=1
+  - heapdict=1.0.0=py35_1
+  - icu=54.1=0
+  - idna=2.2=py35_0
+  - imagesize=0.7.1=py35_0
+  - ipykernel=4.5.2=py35_0
+  - ipython=5.1.0=py35_0
+  - ipython_genutils=0.1.0=py35_0
+  - ipywidgets=5.2.2=py35_1
+  - isl=0.12.2=0
+  - isort=4.2.5=py35_0
+  - itsdangerous=0.24=py35_0
+  - jbig=2.1=0
+  - jdcal=1.3=py35_0
+  - jedi=0.9.0=py35_1
+  - jinja2=2.9.4=py35_0
+  - jpeg=9b=0
+  - jsonschema=2.5.1=py35_0
+  - jupyter=1.0.0=py35_3
+  - jupyter_client=4.4.0=py35_0
+  - jupyter_console=5.0.0=py35_0
+  - jupyter_core=4.2.1=py35_0
+  - lazy-object-proxy=1.2.2=py35_0
+  - libffi=3.2.1=1
+  - libgcc=4.8.5=2
+  - libgfortran=3.0.0=1
+  - libiconv=1.14=0
+  - libpng=1.6.27=0
+  - libprotobuf=3.0.0=0
+  - libsodium=1.0.10=0
+  - libtiff=4.0.6=3
+  - libxcb=1.12=1
+  - libxml2=2.9.4=0
+  - libxslt=1.1.29=0
+  - llvmlite=0.15.0=py35_0
+  - locket=0.2.0=py35_1
+  - lxml=3.7.2=py35_0
+  - markupsafe=0.23=py35_2
+  - matplotlib=2.0.0=np111py35_0
+  - mistune=0.7.3=py35_0
+  - mkl=2017.0.1=0
+  - mkl-service=1.1.2=py35_3
+  - mock=2.0.0=py35_0
+  - mpc=1.0.3=0
+  - mpfr=3.1.5=0
+  - mpmath=0.19=py35_1
+  - multipledispatch=0.4.9=py35_0
+  - nbconvert=4.2.0=py35_0
+  - nbformat=4.2.0=py35_0
+  - ncurses=5.9=10
+  - networkx=1.11=py35_0
+  - nltk=3.2.2=py35_0
+  - nose=1.3.7=py35_1
+  - notebook=4.3.1=py35_0
+  - numba=0.30.1=np111py35_0
+  - numexpr=2.6.1=np111py35_2
+  - numpy=1.11.3=py35_0
+  - numpydoc=0.6.0=py35_0
+  - odo=0.5.0=py35_1
+  - openblas=0.2.19=0
+  - openpyxl=2.4.1=py35_0
+  - openssl=1.0.2k=0
+  - pandas=0.19.2=np111py35_1
+  - partd=0.3.7=py35_0
+  - path.py=10.0=py35_0
+  - pathlib2=2.2.0=py35_0
+  - patsy=0.4.1=py35_0
+  - pbr=1.10.0=py35_0
+  - pcre=8.39=1
+  - pep8=1.7.0=py35_0
+  - pexpect=4.2.1=py35_0
+  - pickleshare=0.7.4=py35_0
+  - pillow=4.0.0=py35_0
+  - pip=9.0.1=py35_1
+  - pixman=0.34.0=0
+  - pkg-config=0.28=1
+  - ply=3.9=py35_0
+  - prompt_toolkit=1.0.9=py35_0
+  - protobuf=3.0.0=py35_1
+  - psutil=5.0.1=py35_0
+  - ptyprocess=0.5.1=py35_0
+  - py=1.4.32=py35_0
+  - pyasn1=0.1.9=py35_0
+  - pycosat=0.6.1=py35_1
+  - pycparser=2.17=py35_0
+  - pycrypto=2.6.1=py35_4
+  - pycurl=7.43.0=py35_2
+  - pyflakes=1.5.0=py35_0
+  - pygments=2.1.3=py35_0
+  - pylint=1.6.4=py35_1
+  - pyopenssl=16.2.0=py35_0
+  - pyparsing=2.1.4=py35_0
+  - pyqt=5.6.0=py35_2
+  - pytables=3.3.0=np111py35_0
+  - pytest=3.0.5=py35_0
+  - python=3.5.2=0
+  - python-dateutil=2.6.0=py35_0
+  - pytz=2016.10=py35_0
+  - pyyaml=3.12=py35_0
+  - pyzmq=16.0.2=py35_0
+  - qt=5.6.2=3
+  - qtawesome=0.4.3=py35_0
+  - qtconsole=4.2.1=py35_1
+  - qtpy=1.2.1=py35_0
+  - readline=6.2=2
+  - redis=3.2.0=0
+  - redis-py=2.10.5=py35_0
+  - requests=2.12.4=py35_0
+  - rope=0.9.4=py35_1
+  - scikit-image=0.12.3=np111py35_1
+  - scikit-learn=0.18.1=np111py35_1
+  - scipy=0.18.1=np111py35_1
+  - seaborn=0.7.1=py35_0
+  - setuptools=27.2.0=py35_0
+  - simplegeneric=0.8.1=py35_1
+  - singledispatch=3.4.0.3=py35_0
+  - sip=4.18=py35_0
+  - six=1.10.0=py35_0
+  - snowballstemmer=1.2.1=py35_0
+  - sockjs-tornado=1.0.3=py35_0
+  - sphinx=1.5.1=py35_0
+  - sphinx_rtd_theme=0.1.9=py35_1
+  - spyder=3.1.2=py35_0
+  - sqlalchemy=1.1.5=py35_0
+  - sqlite=3.13.0=0
+  - statsmodels=0.6.1=np111py35_1
+  - sympy=1.0=py35_0
+  - tensorflow=0.10.0rc0=np111py35_0
+  - terminado=0.6=py35_0
+  - tk=8.5.18=0
+  - toolz=0.8.2=py35_0
+  - tornado=4.4.2=py35_0
+  - traitlets=4.3.1=py35_0
+  - unicodecsv=0.14.1=py35_0
+  - wcwidth=0.1.7=py35_0
+  - werkzeug=0.11.15=py35_0
+  - wheel=0.29.0=py35_0
+  - widgetsnbextension=1.2.6=py35_0
+  - wrapt=1.10.8=py35_0
+  - xlrd=1.0.0=py35_0
+  - xlsxwriter=0.9.6=py35_0
+  - xlwt=1.2.0=py35_0
+  - xz=5.2.2=1
+  - yaml=0.1.6=0
+  - zeromq=4.1.5=0
+  - zlib=1.2.8=3
+  - bob=2.6.2=py35_0
+  - bob.ap=2.1.2=py35_0
+  - bob.blitz=2.0.12=np111py35_0
+  - bob.core=2.1.7=py35_0
+  - bob.db.atnt=2.0.8=py35_0
+  - bob.db.base=2.2.0=py35_0
+  - bob.db.iris=2.0.8=py35_0
+  - bob.db.mnist=2.0.7=py35_0
+  - bob.db.wine=2.0.7=py35_0
+  - bob.extension=2.3.9=py35_0
+  - bob.io.audio=2.0.4=py35_0
+  - bob.io.base=2.0.13=py35_0
+  - bob.io.image=2.2.1=py35_0
+  - bob.io.matlab=2.0.8=py35_0
+  - bob.io.video=2.0.14=py35_0
+  - bob.ip.base=2.0.14=py35_0
+  - bob.ip.color=2.0.8=py35_0
+  - bob.ip.draw=2.0.7=py35_0
+  - bob.ip.facedetect=2.1.2=py35_0
+  - bob.ip.flandmark=2.1.4=py35_0
+  - bob.ip.gabor=2.0.9=py35_0
+  - bob.ip.optflow.hornschunck=2.0.11=py35_0
+  - bob.ip.optflow.liu=2.0.10=py35_0
+  - bob.learn.activation=2.0.8=py35_0
+  - bob.learn.boosting=2.0.11=py35_0
+  - bob.learn.em=2.0.12=py35_0
+  - bob.learn.libsvm=2.0.10=py35_0
+  - bob.learn.linear=2.1.0=py35_0
+  - bob.learn.mlp=2.1.4=py35_0
+  - bob.math=2.1.0=np111py35_0
+  - bob.measure=2.3.0=py35_0
+  - bob.sp=2.0.8=py35_0
+  - cyvlfeat=0.4.5=np111py35_2
+  - dlib=19.0=np111py35_1
+  - ffmpeg=2.8.10=4
+  - giflib=5.1.4=3
+  - ipdb=0.10.2=py35_0
+  - libblitz=0.10=3
+  - libmatio=1.5.6=3
+  - libsvm=3.21=3
+  - menpo=0.7.7=np111py35_4
+  - menpofit=0.4.1=py35_1
+  - menpowidgets=0.2.1p3=py35_0
+  - mne=0.13.1=np111py35_0
+  - opencv=3.1.0=np111py35_4
+  - pkgtools=0.7.3=py35_0
+  - pyedflib=0.1.6=np111py35_2
+  - schema=0.6.5=py35_0
+  - sox=14.4.2=5
+  - toolchain=2.3.2=0
+  - vlfeat=0.9.20=3
+  - x264=20131217=3
+  - zc.buildout=2.9.2=py35_0
diff --git a/doc/envs/v270py27.yaml b/doc/envs/v270py27.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..36e90f911f42312a80682b781af2a347d9b43560
--- /dev/null
+++ b/doc/envs/v270py27.yaml
@@ -0,0 +1,281 @@
+name: v270py27
+channels:
+  - https://www.idiap.ch/software/bob/conda/label/archive
+  - defaults
+  - https://www.idiap.ch/software/bob/conda
+dependencies:
+  - alabaster=0.7.10=py27_0
+  - anaconda=custom=py27_0
+  - astroid=1.4.9=py27_0
+  - babel=2.4.0=py27_0
+  - backports=1.0=py27_0
+  - backports_abc=0.5=py27_0
+  - bleach=1.5.0=py27_0
+  - bokeh=0.12.5=py27_1
+  - boost=1.61.0=py27_0
+  - bzip2=1.0.6=3
+  - caffe=1.0.0rc5=np112py27_0
+  - cairo=1.14.8=0
+  - certifi=2017.7.27.1=py27h9ceb091_0
+  - chardet=3.0.3=py27_0
+  - chest=0.2.3=py27_0
+  - cloog=0.18.0=0
+  - cloudpickle=0.2.2=py27_0
+  - cmake=3.6.3=0
+  - configparser=3.5.0=py27_0
+  - coverage=4.3.4=py27_0
+  - curl=7.52.1=0
+  - cycler=0.10.0=py27_0
+  - cython=0.25.2=py27_0
+  - cytoolz=0.8.2=py27_0
+  - dask=0.13.0=py27_0
+  - dbus=1.10.10=0
+  - decorator=4.0.11=py27_0
+  - docopt=0.6.2=py27_0
+  - docutils=0.13.1=py27_0
+  - entrypoints=0.2.2=py27_1
+  - enum34=1.1.6=py27_0
+  - expat=2.1.0=0
+  - fontconfig=2.12.1=3
+  - freetype=2.5.5=2
+  - funcsigs=1.0.2=py27_0
+  - functools32=3.2.3.2=py27_0
+  - futures=3.1.1=py27_0
+  - gcc=4.8.5=7
+  - get_terminal_size=1.0.0=py27_0
+  - gflags=2.1.2=0
+  - glib=2.50.2=1
+  - glog=0.3.4=0
+  - gmp=6.1.0=0
+  - gst-plugins-base=1.8.0=0
+  - gstreamer=1.8.0=0
+  - h5py=2.7.0=np112py27_0
+  - hdf5=1.8.17=1
+  - heapdict=1.0.0=py27_1
+  - html5lib=0.999=py27_0
+  - icu=54.1=0
+  - imagesize=0.7.1=py27_0
+  - ipykernel=4.6.1=py27_0
+  - ipython=5.1.0=py27_0
+  - ipython_genutils=0.2.0=py27_0
+  - ipywidgets=5.2.2=py27_1
+  - isl=0.12.2=0
+  - isort=4.2.14=py27_0
+  - jbig=2.1=0
+  - jedi=0.10.2=py27_2
+  - jinja2=2.9.6=py27_0
+  - jpeg=9b=0
+  - jsonschema=2.6.0=py27_0
+  - jupyter=1.0.0=py27_3
+  - jupyter_client=5.0.1=py27_0
+  - jupyter_console=5.1.0=py27_0
+  - jupyter_core=4.3.0=py27_0
+  - lazy-object-proxy=1.2.2=py27_0
+  - leveldb=1.19=1
+  - libffi=3.2.1=1
+  - libgcc=4.8.5=2
+  - libgfortran=3.0.0=1
+  - libiconv=1.14=0
+  - libpng=1.6.27=0
+  - libprotobuf=3.2.0=0
+  - libsodium=1.0.10=0
+  - libtiff=4.0.6=3
+  - libxcb=1.12=1
+  - libxml2=2.9.4=0
+  - llvmlite=0.17.0=py27_0
+  - lmdb=0.9.18=0
+  - locket=0.2.0=py27_1
+  - markupsafe=0.23=py27_2
+  - matplotlib=2.0.0=np112py27_0
+  - mistune=0.7.4=py27_0
+  - mkl=2017.0.1=0
+  - mock=2.0.0=py27_0
+  - mpc=1.0.3=0
+  - mpfr=3.1.5=0
+  - nbconvert=5.1.1=py27_0
+  - nbformat=4.3.0=py27_0
+  - ncurses=5.9=10
+  - networkx=1.11=py27_0
+  - nose=1.3.7=py27_1
+  - notebook=5.0.0=py27_0
+  - numba=0.32.0=np112py27_0
+  - numexpr=2.6.1=np112py27_2
+  - numpy=1.12.1=py27_0
+  - numpydoc=0.6.0=py27_0
+  - olefile=0.44=py27_0
+  - openblas=0.2.19=0
+  - openssl=1.0.2l=0
+  - pandas=0.19.2=np112py27_1
+  - pandocfilters=1.4.1=py27_0
+  - partd=0.3.8=py27_0
+  - path.py=10.3.1=py27_0
+  - pathlib2=2.2.1=py27_0
+  - pbr=1.10.0=py27_0
+  - pcre=8.39=1
+  - pep8=1.7.0=py27_0
+  - pexpect=4.2.1=py27_0
+  - pickleshare=0.7.4=py27_0
+  - pillow=4.0.0=py27_1
+  - pip=9.0.1=py27_1
+  - pixman=0.34.0=0
+  - pkg-config=0.28=1
+  - prompt_toolkit=1.0.14=py27_0
+  - protobuf=3.2.0=py27_0
+  - psutil=5.2.2=py27_0
+  - ptyprocess=0.5.1=py27_0
+  - pycairo=1.10.0=py27_0
+  - pyflakes=1.5.0=py27_0
+  - pygments=2.2.0=py27_0
+  - pylint=1.6.4=py27_1
+  - pyparsing=2.1.4=py27_0
+  - pyqt=5.6.0=py27_2
+  - python=2.7.13=0
+  - python-dateutil=2.6.0=py27_0
+  - python-gflags=2.0=py27_0
+  - python-leveldb=0.194=py27_1
+  - pytz=2017.2=py27_0
+  - pyyaml=3.12=py27_0
+  - pyzmq=16.0.2=py27_0
+  - qt=5.6.2=4
+  - qtawesome=0.4.4=py27_0
+  - qtconsole=4.3.0=py27_0
+  - qtpy=1.2.1=py27_0
+  - readline=6.2=2
+  - requests=2.14.2=py27_0
+  - rope=0.9.4=py27_1
+  - scandir=1.5=py27_0
+  - scikit-image=0.12.3=np112py27_1
+  - scikit-learn=0.18.1=np112py27_1
+  - scipy=0.18.1=np112py27_1
+  - setuptools=36.4.0=py27_1
+  - simplegeneric=0.8.1=py27_1
+  - singledispatch=3.4.0.3=py27_0
+  - sip=4.18=py27_0
+  - six=1.10.0=py27_0
+  - snappy=1.1.4=0
+  - snowballstemmer=1.2.1=py27_0
+  - sphinx=1.5.1=py27_0
+  - sphinx_rtd_theme=0.2.4=py27_0
+  - spyder=3.1.4=py27_0
+  - sqlalchemy=1.1.5=py27_0
+  - sqlite=3.13.0=0
+  - ssl_match_hostname=3.4.0.2=py27_1
+  - subprocess32=3.2.7=py27_0
+  - tensorflow=1.0.1=np112py27_0
+  - terminado=0.6=py27_0
+  - testpath=0.3=py27_0
+  - tk=8.5.18=0
+  - toolz=0.8.2=py27_0
+  - tornado=4.5.1=py27_0
+  - traitlets=4.3.2=py27_0
+  - wcwidth=0.1.7=py27_0
+  - wheel=0.29.0=py27_0
+  - widgetsnbextension=2.0.0=py27_0
+  - wrapt=1.10.10=py27_0
+  - xz=5.2.2=1
+  - yaml=0.1.6=0
+  - zeromq=4.1.5=0
+  - zlib=1.2.8=3
+  - bob=2.7.0=py27_0
+  - bob-extras=2017.06.06=0
+  - bob.ap=2.1.4=np112py27_0
+  - bob.bio.base=3.1.2=py_0
+  - bob.bio.face=3.2.0=py_0
+  - bob.bio.gmm=3.0.2=py_0
+  - bob.bio.spear=3.1.0=py_0
+  - bob.bio.video=3.2.0=py_0
+  - bob.blitz=2.0.13=np112py27_0
+  - bob.core=2.1.8=np112py27_0
+  - bob.db.arface=2.1.3=py_0
+  - bob.db.asvspoof=1.1.6=py_0
+  - bob.db.asvspoof2017=1.0.2=py_0
+  - bob.db.atnt=2.0.9=py27_0
+  - bob.db.atvskeystroke=2.1.4=py_0
+  - bob.db.avspoof=2.2.7=py_0
+  - bob.db.banca=2.1.4=py_0
+  - bob.db.base=2.3.1=py27_0
+  - bob.db.biosecure=2.1.4=py_0
+  - bob.db.biosecurid.face=2.1.7=py_0
+  - bob.db.casme2=2.1.4=py_0
+  - bob.db.caspeal=2.1.4=py_0
+  - bob.db.cohface=1.0.3=py_0
+  - bob.db.cuhk_cufs=2.1.3=py_0
+  - bob.db.frgc=2.1.2=py_0
+  - bob.db.gbu=2.1.3=py_0
+  - bob.db.hci_tagging=1.0.3=py_0
+  - bob.db.ijba=2.0.2=py_0
+  - bob.db.iris=2.1.0=py27_0
+  - bob.db.kboc16=2.0.10=py_0
+  - bob.db.lfw=2.1.4=py_0
+  - bob.db.livdet2013=2.0.5=py_0
+  - bob.db.mnist=2.1.0=py27_0
+  - bob.db.mobio=2.1.4=py_0
+  - bob.db.msu_mfsd_mod=2.2.1=py_0
+  - bob.db.multipie=2.1.3=py_0
+  - bob.db.nist_sre12=3.0.2=py_0
+  - bob.db.pericrosseye=1.0.1=py_0
+  - bob.db.putvein=1.1.3=py_0
+  - bob.db.replay=3.0.2=py_0
+  - bob.db.replaymobile=1.1.2=py_0
+  - bob.db.scface=2.1.3=py_0
+  - bob.db.utfvp=2.3.6=py_0
+  - bob.db.voicepa=1.0.1=py_0
+  - bob.db.voxforge=2.1.3=py_0
+  - bob.db.wine=2.0.8=py27_0
+  - bob.db.xm2vts=2.1.3=py_0
+  - bob.db.youtube=2.1.3=py_0
+  - bob.extension=2.4.0=py27_0
+  - bob.io.audio=2.0.5=np112py27_0
+  - bob.io.base=2.1.0=py27_0
+  - bob.io.image=2.2.2=py27_0
+  - bob.io.matlab=2.0.9=py27_0
+  - bob.io.video=2.0.15=py27_0
+  - bob.ip.base=2.0.15=np112py27_0
+  - bob.ip.color=2.0.9=py27_0
+  - bob.ip.draw=2.0.8=py27_0
+  - bob.ip.facedetect=2.1.3=np112py27_0
+  - bob.ip.facelandmarks=1.0.4=py_0
+  - bob.ip.flandmark=2.1.5=np112py27_0
+  - bob.ip.gabor=2.0.10=np112py27_0
+  - bob.ip.optflow.hornschunck=2.0.12=np112py27_0
+  - bob.ip.optflow.liu=2.0.11=py27_0
+  - bob.ip.skincolorfilter=0.0.3=py_0
+  - bob.kaldi=1.0.4=py_0
+  - bob.learn.activation=2.0.9=py27_0
+  - bob.learn.boosting=2.0.12=py27_0
+  - bob.learn.em=2.0.13=np112py27_0
+  - bob.learn.libsvm=2.0.12=py27_0
+  - bob.learn.linear=2.1.1=np112py27_0
+  - bob.learn.mlp=2.1.5=np112py27_0
+  - bob.math=2.1.1=np112py27_0
+  - bob.measure=2.4.0=py27_0
+  - bob.pad.base=1.0.8=py_0
+  - bob.pad.voice=1.0.4=py_0
+  - bob.sp=2.0.9=np112py27_0
+  - cyvlfeat=0.4.5=np112py27_2
+  - dlib=19.0=np112py27_1
+  - ffmpeg=2.8.10=4
+  - giflib=5.1.4=3
+  - gridtk=1.4.3=py_0
+  - ipdb=0.10.2=py27_0
+  - kaldi=r7271.1a4dbf6=0
+  - libblitz=0.10=3
+  - libmatio=1.5.6=3
+  - libogg=1.3.2=0
+  - libsvm=3.21=3
+  - menpo=0.7.7=np112py27_4
+  - menpofit=0.4.1=py27_1
+  - menpowidgets=0.2.1p3=py27_0
+  - mne=0.13.1=np112py27_0
+  - opencv=3.1.0=np112py27_4
+  - openfst=1.6.1=0
+  - pathlib=1.0=py27_0
+  - pkgtools=0.7.3=py27_0
+  - pyedflib=0.1.6=np112py27_2
+  - schema=0.6.5=py27_0
+  - sox=14.4.2=5
+  - speex=1.2.0=0
+  - toolchain=2.3.2=0
+  - vlfeat=0.9.20=3
+  - x264=20131217=3
+  - zc.buildout=2.9.5=py27_0
diff --git a/doc/envs/v270py35.yaml b/doc/envs/v270py35.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e6567cc38ec038fb3f7460f7c2624a65fb6c382b
--- /dev/null
+++ b/doc/envs/v270py35.yaml
@@ -0,0 +1,262 @@
+name: v270py35
+channels:
+  - https://www.idiap.ch/software/bob/conda/label/archive
+  - defaults
+  - https://www.idiap.ch/software/bob/conda
+dependencies:
+  - alabaster=0.7.10=py35_0
+  - anaconda=custom=py35_0
+  - astroid=1.4.9=py35_0
+  - babel=2.4.0=py35_0
+  - bleach=1.5.0=py35_0
+  - bokeh=0.12.5=py35_1
+  - boost=1.61.0=py35_0
+  - bzip2=1.0.6=3
+  - caffe=1.0.0rc5=np112py35_0
+  - certifi=2017.7.27.1=py35h19f42a1_0
+  - chardet=3.0.3=py35_0
+  - chest=0.2.3=py35_0
+  - cloog=0.18.0=0
+  - cloudpickle=0.2.2=py35_0
+  - cmake=3.6.3=0
+  - coverage=4.3.4=py35_0
+  - curl=7.52.1=0
+  - cycler=0.10.0=py35_0
+  - cython=0.25.2=py35_0
+  - cytoolz=0.8.2=py35_0
+  - dask=0.13.0=py35_0
+  - dbus=1.10.10=0
+  - decorator=4.0.11=py35_0
+  - docopt=0.6.2=py35_0
+  - docutils=0.13.1=py35_0
+  - entrypoints=0.2.2=py35_1
+  - expat=2.1.0=0
+  - fontconfig=2.12.1=3
+  - freetype=2.5.5=2
+  - gcc=4.8.5=7
+  - gflags=2.1.2=0
+  - glib=2.50.2=1
+  - glog=0.3.4=0
+  - gmp=6.1.0=0
+  - gst-plugins-base=1.8.0=0
+  - gstreamer=1.8.0=0
+  - h5py=2.7.0=np112py35_0
+  - hdf5=1.8.17=1
+  - heapdict=1.0.0=py35_1
+  - html5lib=0.999=py35_0
+  - icu=54.1=0
+  - imagesize=0.7.1=py35_0
+  - ipykernel=4.6.1=py35_0
+  - ipython=5.1.0=py35_0
+  - ipython_genutils=0.2.0=py35_0
+  - ipywidgets=5.2.2=py35_1
+  - isl=0.12.2=0
+  - isort=4.2.14=py35_0
+  - jbig=2.1=0
+  - jedi=0.10.2=py35_2
+  - jinja2=2.9.6=py35_0
+  - jpeg=9b=0
+  - jsonschema=2.6.0=py35_0
+  - jupyter=1.0.0=py35_3
+  - jupyter_client=5.0.1=py35_0
+  - jupyter_console=5.1.0=py35_0
+  - jupyter_core=4.3.0=py35_0
+  - lazy-object-proxy=1.2.2=py35_0
+  - leveldb=1.19=1
+  - libffi=3.2.1=1
+  - libgcc=4.8.5=2
+  - libgfortran=3.0.0=1
+  - libiconv=1.14=0
+  - libpng=1.6.27=0
+  - libprotobuf=3.2.0=0
+  - libsodium=1.0.10=0
+  - libtiff=4.0.6=3
+  - libxcb=1.12=1
+  - libxml2=2.9.4=0
+  - llvmlite=0.17.0=py35_0
+  - lmdb=0.9.18=0
+  - locket=0.2.0=py35_1
+  - markupsafe=0.23=py35_2
+  - matplotlib=2.0.0=np112py35_0
+  - mistune=0.7.4=py35_0
+  - mkl=2017.0.1=0
+  - mpc=1.0.3=0
+  - mpfr=3.1.5=0
+  - nbconvert=5.1.1=py35_0
+  - nbformat=4.3.0=py35_0
+  - ncurses=5.9=10
+  - networkx=1.11=py35_0
+  - nose=1.3.7=py35_1
+  - notebook=5.0.0=py35_0
+  - numba=0.32.0=np112py35_0
+  - numexpr=2.6.1=np112py35_2
+  - numpy=1.12.1=py35_0
+  - numpydoc=0.6.0=py35_0
+  - olefile=0.44=py35_0
+  - openblas=0.2.19=0
+  - openssl=1.0.2l=0
+  - pandas=0.19.2=np112py35_1
+  - pandocfilters=1.4.1=py35_0
+  - partd=0.3.8=py35_0
+  - path.py=10.3.1=py35_0
+  - pcre=8.39=1
+  - pep8=1.7.0=py35_0
+  - pexpect=4.2.1=py35_0
+  - pickleshare=0.7.4=py35_0
+  - pillow=4.0.0=py35_1
+  - pip=9.0.1=py35_1
+  - pkg-config=0.28=1
+  - prompt_toolkit=1.0.14=py35_0
+  - protobuf=3.2.0=py35_0
+  - psutil=5.2.2=py35_0
+  - ptyprocess=0.5.1=py35_0
+  - pyflakes=1.5.0=py35_0
+  - pygments=2.2.0=py35_0
+  - pylint=1.6.4=py35_1
+  - pyparsing=2.1.4=py35_0
+  - pyqt=5.6.0=py35_2
+  - python=3.5.3=1
+  - python-dateutil=2.6.0=py35_0
+  - python-gflags=2.0=py35_0
+  - python-leveldb=0.194=py35_1
+  - pytz=2017.2=py35_0
+  - pyyaml=3.12=py35_0
+  - pyzmq=16.0.2=py35_0
+  - qt=5.6.2=4
+  - qtawesome=0.4.4=py35_0
+  - qtconsole=4.3.0=py35_0
+  - qtpy=1.2.1=py35_0
+  - readline=6.2=2
+  - requests=2.14.2=py35_0
+  - rope=0.9.4=py35_1
+  - scikit-image=0.12.3=np112py35_1
+  - scikit-learn=0.18.1=np112py35_1
+  - scipy=0.18.1=np112py35_1
+  - setuptools=36.4.0=py35_1
+  - simplegeneric=0.8.1=py35_1
+  - sip=4.18=py35_0
+  - six=1.10.0=py35_0
+  - snappy=1.1.4=0
+  - snowballstemmer=1.2.1=py35_0
+  - sphinx=1.5.1=py35_0
+  - sphinx_rtd_theme=0.2.4=py35_0
+  - spyder=3.1.4=py35_0
+  - sqlalchemy=1.1.5=py35_0
+  - sqlite=3.13.0=0
+  - tensorflow=1.0.1=np112py35_0
+  - terminado=0.6=py35_0
+  - testpath=0.3=py35_0
+  - tk=8.5.18=0
+  - toolz=0.8.2=py35_0
+  - tornado=4.5.1=py35_0
+  - traitlets=4.3.2=py35_0
+  - wcwidth=0.1.7=py35_0
+  - wheel=0.29.0=py35_0
+  - widgetsnbextension=2.0.0=py35_0
+  - wrapt=1.10.10=py35_0
+  - xz=5.2.2=1
+  - yaml=0.1.6=0
+  - zeromq=4.1.5=0
+  - zlib=1.2.8=3
+  - bob=2.7.0=py35_0
+  - bob-extras=2017.06.06=0
+  - bob.ap=2.1.4=np112py35_0
+  - bob.bio.base=3.1.2=py_0
+  - bob.bio.face=3.2.0=py_0
+  - bob.bio.gmm=3.0.2=py_0
+  - bob.bio.spear=3.1.0=py_0
+  - bob.bio.video=3.2.0=py_0
+  - bob.blitz=2.0.13=np112py35_0
+  - bob.core=2.1.8=np112py35_0
+  - bob.db.arface=2.1.3=py_0
+  - bob.db.asvspoof=1.1.6=py_0
+  - bob.db.asvspoof2017=1.0.2=py_0
+  - bob.db.atnt=2.0.9=py35_0
+  - bob.db.atvskeystroke=2.1.4=py_0
+  - bob.db.avspoof=2.2.7=py_0
+  - bob.db.banca=2.1.4=py_0
+  - bob.db.base=2.3.1=py35_0
+  - bob.db.biosecure=2.1.4=py_0
+  - bob.db.biosecurid.face=2.1.7=py_0
+  - bob.db.casme2=2.1.4=py_0
+  - bob.db.caspeal=2.1.4=py_0
+  - bob.db.cohface=1.0.3=py_0
+  - bob.db.cuhk_cufs=2.1.3=py_0
+  - bob.db.frgc=2.1.2=py_0
+  - bob.db.gbu=2.1.3=py_0
+  - bob.db.hci_tagging=1.0.3=py_0
+  - bob.db.ijba=2.0.2=py_0
+  - bob.db.iris=2.1.0=py35_0
+  - bob.db.kboc16=2.0.10=py_0
+  - bob.db.lfw=2.1.4=py_0
+  - bob.db.livdet2013=2.0.5=py_0
+  - bob.db.mnist=2.1.0=py35_0
+  - bob.db.mobio=2.1.4=py_0
+  - bob.db.msu_mfsd_mod=2.2.1=py_0
+  - bob.db.multipie=2.1.3=py_0
+  - bob.db.nist_sre12=3.0.2=py_0
+  - bob.db.pericrosseye=1.0.1=py_0
+  - bob.db.putvein=1.1.3=py_0
+  - bob.db.replay=3.0.2=py_0
+  - bob.db.replaymobile=1.1.2=py_0
+  - bob.db.scface=2.1.3=py_0
+  - bob.db.utfvp=2.3.6=py_0
+  - bob.db.voicepa=1.0.1=py_0
+  - bob.db.voxforge=2.1.3=py_0
+  - bob.db.wine=2.0.8=py35_0
+  - bob.db.xm2vts=2.1.3=py_0
+  - bob.db.youtube=2.1.3=py_0
+  - bob.extension=2.4.0=py35_0
+  - bob.io.audio=2.0.5=np112py35_0
+  - bob.io.base=2.1.0=py35_0
+  - bob.io.image=2.2.2=py35_0
+  - bob.io.matlab=2.0.9=py35_0
+  - bob.io.video=2.0.15=py35_0
+  - bob.ip.base=2.0.15=np112py35_0
+  - bob.ip.color=2.0.9=py35_0
+  - bob.ip.draw=2.0.8=py35_0
+  - bob.ip.facedetect=2.1.3=np112py35_0
+  - bob.ip.facelandmarks=1.0.4=py_0
+  - bob.ip.flandmark=2.1.5=np112py35_0
+  - bob.ip.gabor=2.0.10=np112py35_0
+  - bob.ip.optflow.hornschunck=2.0.12=np112py35_0
+  - bob.ip.optflow.liu=2.0.11=py35_0
+  - bob.ip.skincolorfilter=0.0.3=py_0
+  - bob.kaldi=1.0.4=py_0
+  - bob.learn.activation=2.0.9=py35_0
+  - bob.learn.boosting=2.0.12=py35_0
+  - bob.learn.em=2.0.13=np112py35_0
+  - bob.learn.libsvm=2.0.12=py35_0
+  - bob.learn.linear=2.1.1=np112py35_0
+  - bob.learn.mlp=2.1.5=np112py35_0
+  - bob.math=2.1.1=np112py35_0
+  - bob.measure=2.4.0=py35_0
+  - bob.pad.base=1.0.8=py_0
+  - bob.pad.voice=1.0.4=py_0
+  - bob.sp=2.0.9=np112py35_0
+  - cyvlfeat=0.4.5=np112py35_2
+  - dlib=19.0=np112py35_1
+  - ffmpeg=2.8.10=4
+  - giflib=5.1.4=3
+  - gridtk=1.4.3=py_0
+  - ipdb=0.10.2=py35_0
+  - kaldi=r7271.1a4dbf6=0
+  - libblitz=0.10=3
+  - libmatio=1.5.6=3
+  - libogg=1.3.2=0
+  - libsvm=3.21=3
+  - menpo=0.7.7=np112py35_4
+  - menpofit=0.4.1=py35_1
+  - menpowidgets=0.2.1p3=py35_0
+  - mne=0.13.1=np112py35_0
+  - opencv=3.1.0=np112py35_4
+  - openfst=1.6.1=0
+  - pkgtools=0.7.3=py35_0
+  - pyedflib=0.1.6=np112py35_2
+  - schema=0.6.5=py35_0
+  - sox=14.4.2=5
+  - speex=1.2.0=0
+  - toolchain=2.3.2=0
+  - vlfeat=0.9.20=3
+  - x264=20131217=3
+  - zc.buildout=2.9.5=py35_0
diff --git a/doc/envs/v300py27.yaml b/doc/envs/v300py27.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f4f47a378a3af90ead2be42adafa5c2578874c18
--- /dev/null
+++ b/doc/envs/v300py27.yaml
@@ -0,0 +1,279 @@
+name: v300py27
+channels:
+  - https://www.idiap.ch/software/bob/conda/label/archive
+  - defaults
+  - https://www.idiap.ch/software/bob/conda
+dependencies:
+  - alabaster=0.7.10=py27_0
+  - babel=2.5.0=py27_0
+  - backports=1.0=py27_0
+  - backports.weakref=1.0rc1=py27_0
+  - backports_abc=0.5=py27_0
+  - bkcharts=0.2=py27_0
+  - bleach=1.5.0=py27_0
+  - bokeh=0.12.7=py27_0
+  - boost=1.61.0=py27_0
+  - bzip2=1.0.6=3
+  - caffe=1.0.0rc5=np112py27_0
+  - cairo=1.14.8=0
+  - certifi=2016.2.28=py27_0
+  - cloog=0.18.0=0
+  - cloudpickle=0.4.0=py27_0
+  - cmake=3.6.3=0
+  - configparser=3.5.0=py27_0
+  - coverage=4.3.4=py27_0
+  - curl=7.52.1=0
+  - cycler=0.10.0=py27_0
+  - cython=0.25.2=py27_0
+  - cytoolz=0.8.2=py27_0
+  - dask=0.14.3=py27_1
+  - dbus=1.10.20=0
+  - decorator=4.1.2=py27_0
+  - docopt=0.6.2=py27_0
+  - docutils=0.14=py27_0
+  - entrypoints=0.2.3=py27_0
+  - enum34=1.1.6=py27_0
+  - expat=2.1.0=0
+  - fontconfig=2.12.1=3
+  - freetype=2.5.5=2
+  - funcsigs=1.0.2=py27_0
+  - functools32=3.2.3.2=py27_0
+  - futures=3.1.1=py27_0
+  - gcc=4.8.5=7
+  - get_terminal_size=1.0.0=py27_0
+  - gflags=2.2.0=1
+  - glib=2.50.2=1
+  - glog=0.3.5=0
+  - gmp=6.1.0=0
+  - gst-plugins-base=1.8.0=0
+  - gstreamer=1.8.0=0
+  - h5py=2.7.0=np112py27_0
+  - hdf5=1.8.17=2
+  - html5lib=0.9999999=py27_0
+  - icu=54.1=0
+  - imagesize=0.7.1=py27_0
+  - ipykernel=4.6.1=py27_0
+  - ipython=5.3.0=py27_0
+  - ipython_genutils=0.2.0=py27_0
+  - ipywidgets=6.0.0=py27_0
+  - isl=0.12.2=0
+  - jbig=2.1=0
+  - jinja2=2.9.6=py27_0
+  - jpeg=9b=0
+  - jsonschema=2.6.0=py27_0
+  - jupyter=1.0.0=py27_3
+  - jupyter_client=5.1.0=py27_0
+  - jupyter_console=5.2.0=py27_0
+  - jupyter_core=4.3.0=py27_0
+  - leveldb=1.20=0
+  - libffi=3.2.1=1
+  - libgcc=4.8.5=2
+  - libgfortran=3.0.0=1
+  - libiconv=1.14=0
+  - libpng=1.6.27=0
+  - libprotobuf=3.2.0=0
+  - libsodium=1.0.10=0
+  - libtiff=4.0.6=3
+  - libxcb=1.12=1
+  - libxml2=2.9.4=0
+  - llvmlite=0.18.0=py27_0
+  - lmdb=0.9.21=0
+  - locket=0.2.0=py27_1
+  - markdown=2.6.9=py27_0
+  - markupsafe=1.0=py27_0
+  - matplotlib=2.0.2=np112py27_0
+  - mistune=0.7.4=py27_0
+  - mkl=2017.0.1=0
+  - mock=2.0.0=py27_0
+  - mpc=1.0.3=0
+  - mpfr=3.1.5=0
+  - nbconvert=5.2.1=py27_0
+  - nbformat=4.4.0=py27_0
+  - ncurses=5.9=10
+  - networkx=1.11=py27_0
+  - nose=1.3.7=py27_1
+  - notebook=5.0.0=py27_0
+  - numba=0.33.0=np112py27_0
+  - numexpr=2.6.2=np112py27_0
+  - numpy=1.12.1=py27_0
+  - olefile=0.44=py27_0
+  - openblas=0.2.19=0
+  - openssl=1.0.2l=0
+  - pandas=0.20.1=np112py27_0
+  - pandocfilters=1.4.2=py27_0
+  - partd=0.3.8=py27_0
+  - path.py=10.3.1=py27_0
+  - pathlib2=2.3.0=py27_0
+  - pbr=1.10.0=py27_0
+  - pcre=8.39=1
+  - pexpect=4.2.1=py27_0
+  - pickleshare=0.7.4=py27_0
+  - pillow=4.1.1=py27_0
+  - pip=9.0.1=py27_1
+  - pixman=0.34.0=0
+  - pkg-config=0.28=1
+  - prompt_toolkit=1.0.15=py27_0
+  - protobuf=3.2.0=py27_0
+  - ptyprocess=0.5.2=py27_0
+  - pycairo=1.10.0=py27_0
+  - pygments=2.2.0=py27_0
+  - pyparsing=2.2.0=py27_0
+  - pyqt=5.6.0=py27_2
+  - python=2.7.13=0
+  - python-dateutil=2.6.1=py27_0
+  - python-gflags=3.1.1=py27_0
+  - python-leveldb=0.194=py27_1
+  - pytz=2017.2=py27_0
+  - pywavelets=0.5.2=np112py27_0
+  - pyyaml=3.12=py27_0
+  - pyzmq=16.0.2=py27_0
+  - qt=5.6.2=5
+  - qtconsole=4.3.1=py27_0
+  - readline=6.2=2
+  - requests=2.14.2=py27_0
+  - scandir=1.5=py27_0
+  - scikit-image=0.13.0=np112py27_0
+  - scikit-learn=0.18.1=np112py27_1
+  - scipy=0.19.0=np112py27_0
+  - setuptools=36.4.0=py27_1
+  - simplegeneric=0.8.1=py27_1
+  - singledispatch=3.4.0.3=py27_0
+  - sip=4.18=py27_0
+  - six=1.10.0=py27_0
+  - snappy=1.1.6=0
+  - snowballstemmer=1.2.1=py27_0
+  - sphinx=1.5.6=py27_0
+  - sphinx_rtd_theme=0.2.4=py27_0
+  - sqlalchemy=1.1.9=py27_0
+  - sqlite=3.13.0=0
+  - ssl_match_hostname=3.5.0.1=py27_0
+  - subprocess32=3.2.7=py27_0
+  - tensorflow=1.2.1=py27_0
+  - terminado=0.6=py27_0
+  - testpath=0.3.1=py27_0
+  - tk=8.5.18=0
+  - toolz=0.8.2=py27_0
+  - tornado=4.5.2=py27_0
+  - traitlets=4.3.2=py27_0
+  - virtualenv=15.1.0=py27_0
+  - wcwidth=0.1.7=py27_0
+  - werkzeug=0.12.2=py27_0
+  - wheel=0.29.0=py27_0
+  - widgetsnbextension=3.0.2=py27_0
+  - xz=5.2.3=0
+  - yaml=0.1.6=0
+  - zeromq=4.1.5=0
+  - zlib=1.2.11=0
+  - bob=3.0.0=np112py27_0
+  - bob-devel=2017.10.30=np112py27_2
+  - bob-extras=2017.10.22=0
+  - bob.ap=2.1.5=np112py27_0
+  - bob.bio.base=3.2.1=py_0
+  - bob.bio.caffe_face=1.1.0=py_0
+  - bob.bio.face=3.3.0=py_0
+  - bob.bio.gmm=3.1.0=py_0
+  - bob.bio.spear=3.1.1=py_0
+  - bob.bio.vein=1.0.1=py27_0
+  - bob.bio.video=3.3.0=py_0
+  - bob.blitz=2.0.14=np112py27_0
+  - bob.core=2.1.9=np112py27_0
+  - bob.db.arface=2.1.4=py_0
+  - bob.db.asvspoof=1.1.7=py_0
+  - bob.db.asvspoof2017=1.0.3=py_0
+  - bob.db.atnt=2.0.10=py27_0
+  - bob.db.atvskeystroke=2.1.5=py_0
+  - bob.db.avspoof=2.2.8=py_0
+  - bob.db.banca=2.1.5=py_0
+  - bob.db.base=2.3.2=py27_0
+  - bob.db.biosecure=2.1.5=py_0
+  - bob.db.biosecurid.face=2.1.8=py_0
+  - bob.db.casme2=2.1.5=py_0
+  - bob.db.caspeal=2.1.5=py_0
+  - bob.db.cohface=1.0.4=py_0
+  - bob.db.cuhk_cufs=2.1.3=py_0
+  - bob.db.frgc=2.1.3=py_0
+  - bob.db.fv3d=1.0.0=py_0
+  - bob.db.gbu=2.1.4=py_0
+  - bob.db.hci_tagging=1.0.4=py_0
+  - bob.db.ijba=2.0.3=py_0
+  - bob.db.iris=2.1.1=py27_0
+  - bob.db.kboc16=2.0.11=py_0
+  - bob.db.lfw=2.1.5=py_0
+  - bob.db.livdet2013=2.0.6=py_0
+  - bob.db.mnist=2.1.1=py27_0
+  - bob.db.mobio=2.1.5=py_0
+  - bob.db.msu_mfsd_mod=2.2.3=py_0
+  - bob.db.multipie=2.1.4=py_0
+  - bob.db.nist_sre12=3.0.3=py_0
+  - bob.db.pericrosseye=1.0.1=py_0
+  - bob.db.putvein=1.2.1=py_0
+  - bob.db.replay=3.0.3=py_0
+  - bob.db.replaymobile=1.1.3=py_0
+  - bob.db.scface=2.1.5=py_0
+  - bob.db.utfvp=2.4.1=py_0
+  - bob.db.verafinger=1.0.0=py_0
+  - bob.db.voicepa=1.0.2=py_0
+  - bob.db.voxforge=2.2.0=py_0
+  - bob.db.wine=2.0.9=py27_0
+  - bob.db.xm2vts=2.1.4=py_0
+  - bob.db.youtube=2.1.4=py_0
+  - bob.extension=2.4.5=py27_0
+  - bob.io.audio=2.0.6=np112py27_0
+  - bob.io.base=3.0.2=np112py27_0
+  - bob.io.image=2.3.0=np112py27_0
+  - bob.io.matlab=2.0.10=np112py27_0
+  - bob.io.video=2.0.19=np112py27_0
+  - bob.ip.base=2.1.0=np112py27_0
+  - bob.ip.caffe_extractor=1.1.1=py_0
+  - bob.ip.color=2.0.10=np112py27_0
+  - bob.ip.dlib=1.0.1=py27_0
+  - bob.ip.draw=2.0.9=np112py27_0
+  - bob.ip.facedetect=2.1.4=np112py27_0
+  - bob.ip.facelandmarks=1.0.4=py_0
+  - bob.ip.flandmark=2.1.6=np112py27_0
+  - bob.ip.gabor=2.0.11=np112py27_0
+  - bob.ip.optflow.hornschunck=2.0.13=np112py27_0
+  - bob.ip.optflow.liu=2.0.12=np112py27_0
+  - bob.ip.qualitymeasure=1.0.5=np112py27_0
+  - bob.ip.skincolorfilter=0.0.3=py_0
+  - bob.kaldi=1.1.0=py_0
+  - bob.learn.activation=2.0.10=np112py27_0
+  - bob.learn.boosting=2.0.13=np112py27_0
+  - bob.learn.em=2.1.0=np112py27_0
+  - bob.learn.libsvm=2.0.13=np112py27_0
+  - bob.learn.linear=2.1.2=np112py27_0
+  - bob.learn.mlp=2.1.6=np112py27_0
+  - bob.math=3.0.0=np112py27_1
+  - bob.measure=2.4.1=np112py27_0
+  - bob.pad.base=1.0.8=py_0
+  - bob.pad.voice=1.0.4=py_0
+  - bob.sp=2.0.10=np112py27_0
+  - cyvlfeat=0.4.5=np112py27_2
+  - dlib=19.0=np112py27_1
+  - ffmpeg=2.8.10=4
+  - giflib=5.1.4=3
+  - gridtk=1.4.4=py_0
+  - ipdb=0.10.2=py27_0
+  - kaldi=r7271.1a4dbf6=0
+  - keras=2.0.8=py27_1
+  - libblitz=0.10=3
+  - libmatio=1.5.6=3
+  - libogg=1.3.2=0
+  - libsvm=3.21=3
+  - madmom=0.15.1=py27_0
+  - menpo=0.8.1=np112py27_0
+  - menpofit=0.5.0=py27_0
+  - menpowidgets=0.3.0p6=py27_0
+  - mne=0.14.1=np112py27_0
+  - opencv=3.1.0=np112py27_4
+  - openfst=1.6.1=0
+  - pathlib=1.0=py27_0
+  - pkgtools=0.7.3=py27_0
+  - pyedflib=0.1.9=np112py27_0
+  - schema=0.6.5=py27_0
+  - sox=14.4.2=5
+  - speex=1.2.0=0
+  - toolchain=2.3.2=0
+  - vlfeat=0.9.20=3
+  - x264=20131217=3
+  - zc.buildout=2.9.5=py27_0
diff --git a/doc/envs/v300py36.yaml b/doc/envs/v300py36.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9c1d94f1dba3fe43de27b9a64ba46aa6983715c7
--- /dev/null
+++ b/doc/envs/v300py36.yaml
@@ -0,0 +1,261 @@
+name: v300py36
+channels:
+  - https://www.idiap.ch/software/bob/conda/label/archive
+  - defaults
+  - https://www.idiap.ch/software/bob/conda
+dependencies:
+  - alabaster=0.7.10=py36_0
+  - babel=2.5.0=py36_0
+  - backports=1.0=py36_0
+  - backports.weakref=1.0rc1=py36_0
+  - bkcharts=0.2=py36_0
+  - bleach=1.5.0=py36_0
+  - bokeh=0.12.7=py36_0
+  - boost=1.61.0=py36_0
+  - bzip2=1.0.6=3
+  - caffe=1.0.0rc5=np112py36_0
+  - certifi=2016.2.28=py36_0
+  - cloog=0.18.0=0
+  - cloudpickle=0.4.0=py36_0
+  - cmake=3.6.3=0
+  - coverage=4.3.4=py36_0
+  - curl=7.52.1=0
+  - cycler=0.10.0=py36_0
+  - cython=0.25.2=py36_0
+  - cytoolz=0.8.2=py36_0
+  - dask=0.14.3=py36_1
+  - dbus=1.10.20=0
+  - decorator=4.1.2=py36_0
+  - docopt=0.6.2=py36_0
+  - docutils=0.14=py36_0
+  - entrypoints=0.2.3=py36_0
+  - expat=2.1.0=0
+  - fontconfig=2.12.1=3
+  - freetype=2.5.5=2
+  - gcc=4.8.5=7
+  - gflags=2.2.0=1
+  - glib=2.50.2=1
+  - glog=0.3.5=0
+  - gmp=6.1.0=0
+  - gst-plugins-base=1.8.0=0
+  - gstreamer=1.8.0=0
+  - h5py=2.7.0=np112py36_0
+  - hdf5=1.8.17=2
+  - html5lib=0.9999999=py36_0
+  - icu=54.1=0
+  - imagesize=0.7.1=py36_0
+  - ipykernel=4.6.1=py36_0
+  - ipython=5.3.0=py36_0
+  - ipython_genutils=0.2.0=py36_0
+  - ipywidgets=6.0.0=py36_0
+  - isl=0.12.2=0
+  - jbig=2.1=0
+  - jinja2=2.9.6=py36_0
+  - jpeg=9b=0
+  - jsonschema=2.6.0=py36_0
+  - jupyter=1.0.0=py36_3
+  - jupyter_client=5.1.0=py36_0
+  - jupyter_console=5.2.0=py36_0
+  - jupyter_core=4.3.0=py36_0
+  - leveldb=1.20=0
+  - libffi=3.2.1=1
+  - libgcc=4.8.5=2
+  - libgfortran=3.0.0=1
+  - libiconv=1.14=0
+  - libpng=1.6.27=0
+  - libprotobuf=3.2.0=0
+  - libsodium=1.0.10=0
+  - libtiff=4.0.6=3
+  - libxcb=1.12=1
+  - libxml2=2.9.4=0
+  - llvmlite=0.18.0=py36_0
+  - lmdb=0.9.21=0
+  - locket=0.2.0=py36_1
+  - markdown=2.6.9=py36_0
+  - markupsafe=1.0=py36_0
+  - matplotlib=2.0.2=np112py36_0
+  - mistune=0.7.4=py36_0
+  - mkl=2017.0.1=0
+  - mpc=1.0.3=0
+  - mpfr=3.1.5=0
+  - nbconvert=5.2.1=py36_0
+  - nbformat=4.4.0=py36_0
+  - ncurses=5.9=10
+  - networkx=1.11=py36_0
+  - nose=1.3.7=py36_1
+  - notebook=5.0.0=py36_0
+  - numba=0.33.0=np112py36_0
+  - numexpr=2.6.2=np112py36_0
+  - numpy=1.12.1=py36_0
+  - olefile=0.44=py36_0
+  - openblas=0.2.19=0
+  - openssl=1.0.2l=0
+  - pandas=0.20.1=np112py36_0
+  - pandocfilters=1.4.2=py36_0
+  - partd=0.3.8=py36_0
+  - path.py=10.3.1=py36_0
+  - pcre=8.39=1
+  - pexpect=4.2.1=py36_0
+  - pickleshare=0.7.4=py36_0
+  - pillow=4.1.1=py36_0
+  - pip=9.0.1=py36_1
+  - pkg-config=0.28=1
+  - prompt_toolkit=1.0.15=py36_0
+  - protobuf=3.2.0=py36_0
+  - ptyprocess=0.5.2=py36_0
+  - pygments=2.2.0=py36_0
+  - pyparsing=2.2.0=py36_0
+  - pyqt=5.6.0=py36_2
+  - python=3.6.2=0
+  - python-dateutil=2.6.1=py36_0
+  - python-gflags=3.1.1=py36_0
+  - python-leveldb=0.194=py36_1
+  - pytz=2017.2=py36_0
+  - pywavelets=0.5.2=np112py36_0
+  - pyyaml=3.12=py36_0
+  - pyzmq=16.0.2=py36_0
+  - qt=5.6.2=5
+  - qtconsole=4.3.1=py36_0
+  - readline=6.2=2
+  - requests=2.14.2=py36_0
+  - scikit-image=0.13.0=np112py36_0
+  - scikit-learn=0.18.1=np112py36_1
+  - scipy=0.19.0=np112py36_0
+  - setuptools=36.4.0=py36_1
+  - simplegeneric=0.8.1=py36_1
+  - sip=4.18=py36_0
+  - six=1.10.0=py36_0
+  - snappy=1.1.6=0
+  - snowballstemmer=1.2.1=py36_0
+  - sphinx=1.5.6=py36_0
+  - sphinx_rtd_theme=0.2.4=py36_0
+  - sqlalchemy=1.1.9=py36_0
+  - sqlite=3.13.0=0
+  - tensorflow=1.2.1=py36_0
+  - terminado=0.6=py36_0
+  - testpath=0.3.1=py36_0
+  - tk=8.5.18=0
+  - toolz=0.8.2=py36_0
+  - tornado=4.5.2=py36_0
+  - traitlets=4.3.2=py36_0
+  - virtualenv=15.1.0=py36_0
+  - wcwidth=0.1.7=py36_0
+  - werkzeug=0.12.2=py36_0
+  - wheel=0.29.0=py36_0
+  - widgetsnbextension=3.0.2=py36_0
+  - xz=5.2.3=0
+  - yaml=0.1.6=0
+  - zeromq=4.1.5=0
+  - zlib=1.2.11=0
+  - bob=3.0.0=np112py36_0
+  - bob-devel=2017.10.30=np112py36_2
+  - bob-extras=2017.10.22=0
+  - bob.ap=2.1.5=np112py36_0
+  - bob.bio.base=3.2.1=py_0
+  - bob.bio.caffe_face=1.1.0=py_0
+  - bob.bio.face=3.3.0=py_0
+  - bob.bio.gmm=3.1.0=py_0
+  - bob.bio.spear=3.1.1=py_0
+  - bob.bio.vein=1.0.1=py36_0
+  - bob.bio.video=3.3.0=py_0
+  - bob.blitz=2.0.14=np112py36_0
+  - bob.core=2.1.9=np112py36_0
+  - bob.db.arface=2.1.4=py_0
+  - bob.db.asvspoof=1.1.7=py_0
+  - bob.db.asvspoof2017=1.0.3=py_0
+  - bob.db.atnt=2.0.10=py36_0
+  - bob.db.atvskeystroke=2.1.5=py_0
+  - bob.db.avspoof=2.2.8=py_0
+  - bob.db.banca=2.1.5=py_0
+  - bob.db.base=2.3.2=py36_0
+  - bob.db.biosecure=2.1.5=py_0
+  - bob.db.biosecurid.face=2.1.8=py_0
+  - bob.db.casme2=2.1.5=py_0
+  - bob.db.caspeal=2.1.5=py_0
+  - bob.db.cohface=1.0.4=py_0
+  - bob.db.cuhk_cufs=2.1.3=py_0
+  - bob.db.frgc=2.1.3=py_0
+  - bob.db.fv3d=1.0.0=py_0
+  - bob.db.gbu=2.1.4=py_0
+  - bob.db.hci_tagging=1.0.4=py_0
+  - bob.db.ijba=2.0.3=py_0
+  - bob.db.iris=2.1.1=py36_0
+  - bob.db.kboc16=2.0.11=py_0
+  - bob.db.lfw=2.1.5=py_0
+  - bob.db.livdet2013=2.0.6=py_0
+  - bob.db.mnist=2.1.1=py36_0
+  - bob.db.mobio=2.1.5=py_0
+  - bob.db.msu_mfsd_mod=2.2.3=py_0
+  - bob.db.multipie=2.1.4=py_0
+  - bob.db.nist_sre12=3.0.3=py_0
+  - bob.db.pericrosseye=1.0.1=py_0
+  - bob.db.putvein=1.2.1=py_0
+  - bob.db.replay=3.0.3=py_0
+  - bob.db.replaymobile=1.1.3=py_0
+  - bob.db.scface=2.1.5=py_0
+  - bob.db.utfvp=2.4.1=py_0
+  - bob.db.verafinger=1.0.0=py_0
+  - bob.db.voicepa=1.0.2=py_0
+  - bob.db.voxforge=2.2.0=py_0
+  - bob.db.wine=2.0.9=py36_0
+  - bob.db.xm2vts=2.1.4=py_0
+  - bob.db.youtube=2.1.4=py_0
+  - bob.extension=2.4.5=py36_0
+  - bob.io.audio=2.0.6=np112py36_0
+  - bob.io.base=3.0.2=np112py36_0
+  - bob.io.image=2.3.0=np112py36_0
+  - bob.io.matlab=2.0.10=np112py36_0
+  - bob.io.video=2.0.19=np112py36_0
+  - bob.ip.base=2.1.0=np112py36_0
+  - bob.ip.caffe_extractor=1.1.1=py_0
+  - bob.ip.color=2.0.10=np112py36_0
+  - bob.ip.dlib=1.0.1=py36_0
+  - bob.ip.draw=2.0.9=np112py36_0
+  - bob.ip.facedetect=2.1.4=np112py36_0
+  - bob.ip.facelandmarks=1.0.4=py_0
+  - bob.ip.flandmark=2.1.6=np112py36_0
+  - bob.ip.gabor=2.0.11=np112py36_0
+  - bob.ip.optflow.hornschunck=2.0.13=np112py36_0
+  - bob.ip.optflow.liu=2.0.12=np112py36_0
+  - bob.ip.qualitymeasure=1.0.5=np112py36_0
+  - bob.ip.skincolorfilter=0.0.3=py_0
+  - bob.kaldi=1.1.0=py_0
+  - bob.learn.activation=2.0.10=np112py36_0
+  - bob.learn.boosting=2.0.13=np112py36_0
+  - bob.learn.em=2.1.0=np112py36_0
+  - bob.learn.libsvm=2.0.13=np112py36_0
+  - bob.learn.linear=2.1.2=np112py36_0
+  - bob.learn.mlp=2.1.6=np112py36_0
+  - bob.math=3.0.0=np112py36_1
+  - bob.measure=2.4.1=np112py36_0
+  - bob.pad.base=1.0.8=py_0
+  - bob.pad.voice=1.0.4=py_0
+  - bob.sp=2.0.10=np112py36_0
+  - cyvlfeat=0.4.5=np112py36_2
+  - dlib=19.0=np112py36_1
+  - ffmpeg=2.8.10=4
+  - giflib=5.1.4=3
+  - gridtk=1.4.4=py_0
+  - ipdb=0.10.2=py36_0
+  - kaldi=r7271.1a4dbf6=0
+  - keras=2.0.8=py36_1
+  - libblitz=0.10=3
+  - libmatio=1.5.6=3
+  - libogg=1.3.2=0
+  - libsvm=3.21=3
+  - madmom=0.15.1=py36_0
+  - menpo=0.8.1=np112py36_0
+  - menpofit=0.5.0=py36_0
+  - menpowidgets=0.3.0p6=py36_0
+  - mne=0.14.1=np112py36_0
+  - opencv=3.1.0=np112py36_4
+  - openfst=1.6.1=0
+  - pkgtools=0.7.3=py36_0
+  - pyedflib=0.1.9=np112py36_0
+  - schema=0.6.5=py36_0
+  - sox=14.4.2=5
+  - speex=1.2.0=0
+  - toolchain=2.3.2=0
+  - vlfeat=0.9.20=3
+  - x264=20131217=3
+  - zc.buildout=2.9.5=py36_0
diff --git a/doc/example.rst b/doc/example.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9dfe886768463c093ce35a21d74d4c6072bb5aeb
--- /dev/null
+++ b/doc/example.rst
@@ -0,0 +1,160 @@
+.. vim: set fileencoding=utf-8 :
+
+.. _bob.iris_example:
+
+===============================================
+ Tutorial: Analysis of the Fisher Iris Dataset
+===============================================
+
+In this tutorial, we collect bits and pieces of the previous tutorials and build a
+complete example that discriminates Iris species based on Bob.
+
+The `Iris flower data set <http://en.wikipedia.org/wiki/Iris_flower_data_set>`_ or
+Fisher's Iris data set is a multivariate data set introduced by Sir Ronald Aylmer Fisher
+(1936) as an example of discriminant analysis. It is sometimes called Anderson's Iris
+data set because Edgar Anderson collected the data to quantify the morphologic variation
+of Iris flowers of three related species. The dataset consists of 50 samples from each
+of three species of Iris flowers (Iris setosa, Iris virginica and Iris versicolor). Four
+features were measured from each sample, they are the length and the width of sepal and
+petal, in centimeters. Based on the combination of the four features, Fisher developed a
+linear discriminant model to distinguish the species from each other.
+
+
+.. note::
+
+  This example will consider all 3 classes for the LDA training.
+  This is **not** what Fisher did in his paper [Fisher1936]_ .
+  In that work Fisher did the *right* thing only for the first 2-class problem (setosa *versus* versicolor).
+  You can reproduce the 2-class LDA using bob's LDA training system without problems.
+  When inserting the virginica class, Fisher decides for a different metric (:math:`4vi + ve - 5se`) and solves for the matrices in the last row of Table VIII.
+
+  This is OK, but does not generalize the method proposed in the beginning of his paper.
+  Results achieved by the generalized LDA method [Duda1973]_ will not match Fisher's result on that last table, be aware.
+  That being said, the final histogram presented on that paper looks quite similar to the one produced by this script, showing that Fisher's solution was a good approximation for the generalized LDA implementation available in Bob.
+
+.. [Fisher1936] **R. A. FISHER**, *The Use of Multiple Measurements in Taxonomic Problems*, Annals of Eugenics, pp. 179-188, 1936
+.. [Duda1973] **R.O. Duda and P.E. Hart**, *Pattern Classification and Scene Analysis*, (Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. 1973 (See page 218).
+
+
+.. testsetup:: iris
+
+  import bob
+  import numpy
+  import matplotlib
+  if not hasattr(matplotlib, 'backends'):
+    matplotlib.use('pdf') #non-interactive avoids exception on display
+
+
+Training a :py:class:`bob.learn.linear.Machine` with LDA
+---------------------------------------------------------
+
+Creating a :py:class:`bob.learn.linear.Machine` to perform Linear Discriminant Analysis on the Iris dataset involves using the :py:class:`bob.learn.linear.FisherLDATrainer`:
+
+.. doctest:: iris
+
+  >>> import bob.db.iris
+  >>> import bob.learn.linear
+  >>> trainer = bob.learn.linear.FisherLDATrainer()
+  >>> data = bob.db.iris.data()
+  >>> machine, unused_eigen_values = trainer.train(data.values())
+  >>> machine.shape
+  (4, 2)
+
+That is it! The returned :py:class:`bob.learn.linear.Machine` is now setup to perform LDA on the Iris data set.
+A few things should be noted:
+
+1. The returned :py:class:`bob.learn.linear.Machine` represents the linear projection of the input features to a new 3D space which maximizes the between-class scatter and minimizes the within-class scatter.
+   In other words, the internal matrix :math:`\mathbf{W}` is 4-by-2.
+   The projections are calculated internally using `Singular Value Decomposition <http://en.wikipedia.org/wiki/Singular_value_decomposition>`_ (SVD).
+   The first projection (first row of :math:`\mathbf{W}` corresponds to the highest eigenvalue resulting from the decomposition, the second, the second highest, and so on;
+
+2. The trainer also returns the eigenvalues generated after the SVD for our LDA implementation, in case you would like to use them.
+   For this example, we just discard this information.
+
+Looking at the first LDA component
+----------------------------------
+
+To reproduce Fisher's results, we must pass the data through the created machine:
+
+.. doctest:: iris
+
+  >>> output = {}
+  >>> for key in data:
+  ...   output[key] = machine.forward(data[key])
+
+At this point the variable ``output`` contains the LDA-projected information as 2D :py:class:`numpy.ndarray` objects.
+The only step missing is the visualization of the results.
+Fisher proposed the use of a histogram showing the separation achieved by looking at the first only.
+Let's reproduce it.
+
+.. doctest:: iris
+
+  >>> from matplotlib import pyplot
+  >>> pyplot.hist(output['setosa'][:,0], bins=8, color='green', label='Setosa', alpha=0.5) # doctest: +SKIP
+  >>> pyplot.hist(output['versicolor'][:,0], bins=8, color='blue', label='Versicolor', alpha=0.5) # doctest: +SKIP
+  >>> pyplot.hist(output['virginica'][:,0], bins=8, color='red', label='Virginica', alpha=0.5) # doctest: +SKIP
+
+We can certainly throw in more decoration:
+
+.. doctest:: iris
+
+  >>> pyplot.legend() # doctest: +SKIP
+  >>> pyplot.grid(True) # doctest: +SKIP
+  >>> pyplot.axis([-3,+3,0,20]) # doctest: +SKIP
+  >>> pyplot.title("Iris Plants / 1st. LDA component") # doctest: +SKIP
+  >>> pyplot.xlabel("LDA[0]") # doctest: +SKIP
+  >>> pyplot.ylabel("Count") # doctest: +SKIP
+
+Finally, to display the plot, do:
+
+.. code-block:: python
+
+  >>> pyplot.show()
+
+You should see an image like this:
+
+.. plot:: plot/iris_lda.py
+
+
+Measuring performance
+---------------------
+
+You can measure the performance of the system on classifying, say, *Iris Virginica* as compared to the other two variants.
+We can use the functions in :ref:`bob.measure <bob.measure>` for that purpose.
+Let's first find a threshold that separates this variant from the others.
+We choose to find the threshold at the point where the relative error rate considering both *Versicolor* and *Setosa* variants is the same as for the *Virginica* one.
+
+.. doctest:: iris
+
+  >>> import bob.measure
+  >>> negatives = numpy.vstack([output['setosa'], output['versicolor']])[:,0]
+  >>> positives = output['virginica'][:,0]
+  >>> threshold= bob.measure.eer_threshold(negatives, positives)
+
+With the threshold at hand, we can estimate the number of correctly classified *negatives* (or true-rejections) and *positives* (or true-accepts).
+Let's translate that: plants from the *Versicolor* and *Setosa* variants that have the first LDA component smaller than the threshold (so called *negatives* at this point) and plants from the *Virginica* variant that have the first LDA component greater than the threshold defined (the *positives*).
+To calculate the rates, we just use :ref:`bob.measure <bob.measure>` again:
+
+.. doctest:: iris
+
+  >>> true_rejects = bob.measure.correctly_classified_negatives(negatives, threshold)
+  >>> true_accepts = bob.measure.correctly_classified_positives(positives, threshold)
+
+From that you can calculate, for example, the number of misses at the defined ``threshold``:
+
+.. doctest:: iris
+
+  >>> sum(true_rejects)
+  98
+  >>> sum(true_accepts)
+  49
+
+You can also plot an ROC curve.
+Here is the full code that will lead you to the following plot:
+
+.. plot:: plot/iris_lda_roc.py
+  :include-source: True
+
+.. include:: links.rst
+
+
diff --git a/doc/help.rst b/doc/help.rst
new file mode 100644
index 0000000000000000000000000000000000000000..404bad264549914cb61b405d2b143c85f8c7f39a
--- /dev/null
+++ b/doc/help.rst
@@ -0,0 +1,59 @@
+.. _bob.help:
+
+================================
+ How to Get Help and Contribute
+================================
+
+Example usages of Bob
+=====================
+
+Bob paper packages can serve as good examples of how to use Bob. Search for
+``bob.paper`` in our Gitlab: https://gitlab.idiap.ch/bob?filter=bob.paper
+**AND** in PyPI: https://pypi.org/search/?q=bob.paper&c=Framework+::+Bob for
+paper packages. Please note that the older a ``bob.paper`` package is, it is
+more likely that it uses some deprecated practices.
+
+For example, you can look at:
+
+* https://gitlab.idiap.ch/bob/bob.paper.icml2017 on how to evaluate a new
+  CNN-based face recognition algorithm on face recognition databases. (Note that
+  the ``evaluate.py`` command is replaced by ``bob bio evaluate`` in recent
+  versions of Bob.)
+* https://gitlab.idiap.ch/bob/bob.paper.btas2018_siliconemask/tree/master/bob/paper/btas2018_siliconemask/database
+  and https://gitlab.idiap.ch/bob/bob.db.oulunpu/ for good examples of how to
+  create new database interfaces for the ``bob.bio`` and ``bob.pad`` frameworks.
+
+
+How to Get Help
+===============
+
+There are several ways to get help if you are facing a problem.
+
+First, you should search for possible existing answers in:
+
+* https://stackoverflow.com/questions/tagged/python-bob
+* https://www.idiap.ch/software/bob/discuss
+* https://www.idiap.ch/software/bob/wiki
+
+or you may just want to search on the Internet for possible answers.
+
+Second, feel free to ask us. We encourage you to do so. The preferred way of asking is
+by using public channels. Here is a list of places that you can ask questions:
+
+* Ask on https://stackoverflow.com and tag your questions with ``python-bob``.
+  This is the preferred way.
+* Ask on our mailing list: https://www.idiap.ch/software/bob/discuss
+
+
+How to Contribute
+=================
+
+Bob is open source and we welcome contributions.
+If you find a bug, please let use know through our mailing list:
+https://www.idiap.ch/software/bob/discuss.
+If you want to contribute, please also get in touch with us through our mailing list
+first.
+We maintain a mirror of Bob packages on https://github.com/bioidiap/ which should allow
+you to open pull requests on Bob packages.
+
+.. include:: links.rst
diff --git a/doc/index.rst b/doc/index.rst
index 3f997c23edb4934e1edb21408093424a2155d350..cbd376ad9fb5287de03c294da421feb55fff1fb0 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -1,335 +1,29 @@
 .. vim: set fileencoding=utf-8 :
 
-===================================
- Documentation of all Bob packages
-===================================
+.. _bob_main_page:
 
-Start here
-----------
+=======================
+ Bob
+=======================
 
-* :ref:`bob_main_page`
+Bob_ is a free signal-processing and machine learning toolbox originally developed by
+the Biometrics Security and Privacy Group, the Biosignal Processing Group, and the
+Research and Development Engineers at `Idiap`_ Research Institute, Switzerland.
 
-.. note::
-   Bob paper packages can serve as good examples of how to use Bob. Search for
-   ``bob.paper`` in our Gitlab: https://gitlab.idiap.ch/bob?filter=bob.paper **AND** in
-   PyPI: https://pypi.org/search/?q=bob.paper&c=Framework+::+Bob for paper packages.
-   Please note that the older a ``bob.paper`` package is, it is more likely that it uses
-   some deprecated practices.
+The toolbox is written in a mix of `Python`_ and `C++`_ and is designed to be both
+efficient and reduce development time. It is composed of a reasonably large number of
+:ref:`independent packages <bob.packages>` that implement tools for image, audio &
+video processing, machine learning & pattern recognition, and a lot more task specific
+packages.
 
-   For example, you can look at:
-
-   * https://gitlab.idiap.ch/bob/bob.paper.icml2017 on how to evaluate a new CNN-based
-     face recognition algorithm on face recognition databases. (Note that the
-     ``evaluate.py`` command is replaced by ``bob bio evaluate`` in recent versions of
-     Bob.)
-   * https://gitlab.idiap.ch/bob/bob.paper.btas2018_siliconemask/tree/master/bob/paper/btas2018_siliconemask/database
-     and https://gitlab.idiap.ch/bob/bob.db.oulunpu/ for good examples of how to create
-     new database interfaces for the ``bob.bio`` and ``bob.pad`` frameworks.
-
-.. note::
-   Use :ref:`bob.devtools <bob.devtools>` if you want to develop Bob packages or create
-   a new package. **DO NOT** modify (including adding extra files) the source code of
-   Bob packages in your Conda environments. Typically, Bob packages can be extended
-   without modifying the original package. So you may want to put your new code in a new
-   package instead of modifying the original package. Also, Conda uses hard links to
-   create new environments from a cache folder. Editing a file in one of the
-   environments will edit that file in **ALL** of your environments. The only safe way
-   to recover from this is to delete your Conda installation completely and installing
-   everything again from scratch.
-
-Please find the documentation of all Bob packages below.
-
-Basic Functionality
--------------------
-
-* :ref:`bob.core`
-* :ref:`bob.math`
-
-Data Input and Output
----------------------
-
-* :ref:`bob.io.base`
-* :ref:`bob.io.image`
-* :ref:`bob.io.video`
-* :ref:`bob.io.audio`
-* :ref:`bob.io.matlab`
-
-Signal, Audio, Image and Video Processing
------------------------------------------
-
-* :ref:`bob.sp`
-* :ref:`bob.ap`
-* :ref:`bob.ip.base`
-* :ref:`bob.ip.color`
-* :ref:`bob.ip.draw`
-* :ref:`bob.ip.gabor`
-* :ref:`bob.ip.facedetect`
-* :ref:`bob.ip.facelandmarks`
-* :ref:`bob.ip.optflow.liu`
-* :ref:`bob.ip.optflow.hornschunck`
-* :ref:`bob.ip.flandmark`
-* :ref:`bob.ip.dlib`
-* :ref:`bob.ip.qualitymeasure`
-* :ref:`bob.ip.skincolorfilter`
-* :ref:`bob.ip.tensorflow_extractor`
-* :ref:`bob.ip.binseg`
-
-
-Machine Learning
-----------------
-
-* :ref:`bob.measure`
-* :ref:`bob.learn.linear`
-* :ref:`bob.learn.mlp`
-* :ref:`bob.learn.activation`
-* :ref:`bob.learn.libsvm`
-* :ref:`bob.learn.em`
-* :ref:`bob.learn.boosting`
-* :ref:`bob.learn.tensorflow`
-* :ref:`bob.learn.pytorch`
-
-Modules for Developers
-----------------------
-
-* :ref:`bob.devtools`
-* :ref:`bob.extension`
-* :ref:`bob.blitz`
-* :ref:`bob.buildout`
-
-Parallel Execution
-------------------
-
-* :ref:`gridtk`
-
-Biometric Recognition
----------------------
-
-* :ref:`bob.bio.base`
-* :ref:`bob.bio.face`
-* :ref:`bob.bio.spear`
-* :ref:`bob.bio.vein`
-* :ref:`bob.bio.video`
-* :ref:`bob.bio.gmm`
-* :ref:`bob.bio.face_ongoing`
-* :ref:`bob.bio.htface`
-* :ref:`bob.ip.tensorflow_extractor`
-* :ref:`bob.fusion.base`
-
-
-Presentation Attack Detection (anti-spoofing)
----------------------------------------------
-
-* :ref:`bob.pad.base`
-* :ref:`bob.pad.face`
-* :ref:`bob.pad.vein`
-* :ref:`bob.pad.voice`
-* :ref:`bob.fusion.base`
-
-
-Remote Heart Rate Measurement
------------------------------
-
-* :ref:`bob.rppg.base`
-
-
-Database Interfaces
--------------------
-
-Base Database Packages
-^^^^^^^^^^^^^^^^^^^^^^
-
-* :ref:`bob.db.base`
-* :ref:`bob.bio.base`
-* :ref:`bob.pad.base`
-
-Interfaces
-^^^^^^^^^^
-
-* :ref:`bob.db.arface`
-* :ref:`bob.db.asvspoof2017`
-* :ref:`bob.db.asvspoof`
-* :ref:`bob.db.atnt`
-* :ref:`bob.db.atvskeystroke`
-* :ref:`bob.db.avspoof`
-* :ref:`bob.db.banca`
-* :ref:`bob.db.biosecure`
-* :ref:`bob.db.biosecurid.face`
-* :ref:`bob.db.casia_fasd`
-* :ref:`bob.db.casiasurf`
-* :ref:`bob.db.casme2`
-* :ref:`bob.db.caspeal`
-* :ref:`bob.db.cbsr_nir_vis_2`
-* :ref:`bob.db.chasedb1`
-* :ref:`bob.db.cohface`
-* :ref:`bob.db.cuhk_cufs`
-* :ref:`bob.db.cuhk_cufsf`
-* :ref:`bob.db.drionsdb`
-* :ref:`bob.db.drishtigs1`
-* :ref:`bob.db.drive`
-* :ref:`bob.db.fargo`
-* :ref:`bob.db.frgc`
-* :ref:`bob.db.fv3d`
-* :ref:`bob.db.gbu`
-* :ref:`bob.db.hci_tagging`
-* :ref:`bob.db.hrf`
-* :ref:`bob.db.ijba`
-* :ref:`bob.db.ijbc`
-* :ref:`bob.db.iostar`
-* :ref:`bob.db.iris`
-* :ref:`bob.db.kboc16`
-* :ref:`bob.db.ldhf`
-* :ref:`bob.db.lfw`
-* :ref:`bob.db.livdet2013`
-* :ref:`bob.db.maskattack`
-* :ref:`bob.db.mnist`
-* :ref:`bob.db.mobio`
-* :ref:`bob.db.msu_mfsd_mod`
-* :ref:`bob.db.multipie`
-* :ref:`bob.db.nist_sre12`
-* :ref:`bob.db.nivl`
-* :ref:`bob.db.oulunpu`
-* :ref:`bob.db.pericrosseye`
-* :ref:`bob.db.pola_thermal`
-* :ref:`bob.db.putvein`
-* :ref:`bob.db.refuge`
-* :ref:`bob.db.replay`
-* :ref:`bob.db.replaymobile`
-* :ref:`bob.db.rimoner3`
-* :ref:`bob.db.scface`
-* :ref:`bob.db.siw`
-* :ref:`bob.db.stare`
-* :ref:`bob.db.swan`
-* :ref:`bob.db.utfvp`
-* :ref:`bob.db.uvad`
-* :ref:`bob.db.verafinger`
-* :ref:`bob.db.voicepa`
-* :ref:`bob.db.voxforge`
-* :ref:`bob.db.wine`
-* :ref:`bob.db.xm2vts`
-* :ref:`bob.db.youtube`
-
-
-
-Index of all Packages
-=====================
 
 .. toctree::
-   :maxdepth: 1
-   :titlesonly:
+   :maxdepth: 2
+
+   tutorial
+   example
+   install
+   help
+   packages
 
-   bob <bob/bob/doc/index.rst>
-   bob.ap <bob/bob.ap/doc/index.rst>
-   bob.bio.base <bob/bob.bio.base/doc/index.rst>
-   bob.bio.face <bob/bob.bio.face/doc/index.rst>
-   bob.bio.face_ongoing <bob/bob.bio.face_ongoing/doc/index.rst>
-   bob.bio.gmm <bob/bob.bio.gmm/doc/index.rst>
-   bob.bio.htface <bob/bob.bio.htface/doc/index.rst>
-   bob.bio.spear <bob/bob.bio.spear/doc/index.rst>
-   bob.bio.vein <bob/bob.bio.vein/doc/index.rst>
-   bob.bio.video <bob/bob.bio.video/doc/index.rst>
-   bob.blitz <bob/bob.blitz/doc/index.rst>
-   bob.buildout <bob/bob.buildout/doc/index.rst>
-   bob.core <bob/bob.core/doc/index.rst>
-   bob.db.arface <bob/bob.db.arface/doc/index.rst>
-   bob.db.asvspoof <bob/bob.db.asvspoof/doc/index.rst>
-   bob.db.asvspoof2017 <bob/bob.db.asvspoof2017/doc/index.rst>
-   bob.db.atnt <bob/bob.db.atnt/doc/index.rst>
-   bob.db.atvskeystroke <bob/bob.db.atvskeystroke/doc/index.rst>
-   bob.db.avspoof <bob/bob.db.avspoof/doc/index.rst>
-   bob.db.banca <bob/bob.db.banca/doc/index.rst>
-   bob.db.base <bob/bob.db.base/doc/index.rst>
-   bob.db.biosecure <bob/bob.db.biosecure/doc/index.rst>
-   bob.db.biosecurid.face <bob/bob.db.biosecurid.face/doc/index.rst>
-   bob.db.casia_fasd <bob/bob.db.casia_fasd/doc/index.rst>
-   bob.db.casiasurf <bob/bob.db.casiasurf/doc/index.rst>
-   bob.db.casme2 <bob/bob.db.casme2/doc/index.rst>
-   bob.db.caspeal <bob/bob.db.caspeal/doc/index.rst>
-   bob.db.cbsr_nir_vis_2 <bob/bob.db.cbsr_nir_vis_2/doc/index.rst>
-   bob.db.chasedb1 <bob/bob.db.chasedb1/doc/index.rst>
-   bob.db.cohface <bob/bob.db.cohface/doc/index.rst>
-   bob.db.cuhk_cufs <bob/bob.db.cuhk_cufs/doc/index.rst>
-   bob.db.cuhk_cufsf <bob/bob.db.cuhk_cufsf/doc/index.rst>
-   bob.db.drionsdb <bob/bob.db.drionsdb/doc/index.rst>
-   bob.db.drishtigs1 <bob/bob.db.drishtigs1/doc/index.rst>
-   bob.db.drive <bob/bob.db.drive/doc/index.rst>
-   bob.db.fargo <bob/bob.db.fargo/doc/index.rst>
-   bob.db.frgc <bob/bob.db.frgc/doc/index.rst>
-   bob.db.fv3d <bob/bob.db.fv3d/doc/index.rst>
-   bob.db.gbu <bob/bob.db.gbu/doc/index.rst>
-   bob.db.hci_tagging <bob/bob.db.hci_tagging/doc/index.rst>
-   bob.db.hrf <bob/bob.db.hrf/doc/index.rst>
-   bob.db.ijba <bob/bob.db.ijba/doc/index.rst>
-   bob.db.ijbc <bob/bob.db.ijbc/doc/index.rst>
-   bob.db.iostar <bob/bob.db.iostar/doc/index.rst>
-   bob.db.iris <bob/bob.db.iris/doc/index.rst>
-   bob.db.kboc16 <bob/bob.db.kboc16/doc/index.rst>
-   bob.db.ldhf <bob/bob.db.ldhf/doc/index.rst>
-   bob.db.lfw <bob/bob.db.lfw/doc/index.rst>
-   bob.db.livdet2013 <bob/bob.db.livdet2013/doc/index.rst>
-   bob.db.maskattack <bob/bob.db.maskattack/doc/index.rst>
-   bob.db.mnist <bob/bob.db.mnist/doc/index.rst>
-   bob.db.mobio <bob/bob.db.mobio/doc/index.rst>
-   bob.db.msu_mfsd_mod <bob/bob.db.msu_mfsd_mod/doc/index.rst>
-   bob.db.multipie <bob/bob.db.multipie/doc/index.rst>
-   bob.db.nist_sre12 <bob/bob.db.nist_sre12/doc/index.rst>
-   bob.db.nivl <bob/bob.db.nivl/doc/index.rst>
-   bob.db.oulunpu <bob/bob.db.oulunpu/doc/index.rst>
-   bob.db.pericrosseye <bob/bob.db.pericrosseye/doc/index.rst>
-   bob.db.pola_thermal<bob/bob.db.pola_thermal/doc/index.rst>
-   bob.db.putvein <bob/bob.db.putvein/doc/index.rst>
-   bob.db.refuge <bob/bob.db.refuge/doc/index.rst>
-   bob.db.replay <bob/bob.db.replay/doc/index.rst>
-   bob.db.replaymobile <bob/bob.db.replaymobile/doc/index.rst>
-   bob.db.rimoner3 <bob/bob.db.rimoner3/doc/index.rst>
-   bob.db.scface <bob/bob.db.scface/doc/index.rst>
-   bob.db.siw <bob/bob.db.siw/doc/index.rst>
-   bob.db.stare <bob/bob.db.stare/doc/index.rst>
-   bob.db.swan <bob/bob.db.swan/doc/index.rst>
-   bob.db.utfvp <bob/bob.db.utfvp/doc/index.rst>
-   bob.db.uvad <bob/bob.db.uvad/doc/index.rst>
-   bob.db.verafinger <bob/bob.db.verafinger/doc/index.rst>
-   bob.db.voicepa <bob/bob.db.voicepa/doc/index.rst>
-   bob.db.voxforge <bob/bob.db.voxforge/doc/index.rst>
-   bob.db.wine <bob/bob.db.wine/doc/index.rst>
-   bob.db.xm2vts <bob/bob.db.xm2vts/doc/index.rst>
-   bob.db.youtube <bob/bob.db.youtube/doc/index.rst>
-   bob.devtools <bob/bob.devtools/doc/index.rst>
-   bob.extension <bob/bob.extension/doc/index.rst>
-   bob.fusion.base <bob/bob.fusion.base/doc/index.rst>
-   bob.io.audio <bob/bob.io.audio/doc/index.rst>
-   bob.io.base <bob/bob.io.base/doc/index.rst>
-   bob.io.image <bob/bob.io.image/doc/index.rst>
-   bob.io.matlab <bob/bob.io.matlab/doc/index.rst>
-   bob.io.video <bob/bob.io.video/doc/index.rst>
-   bob.ip.base <bob/bob.ip.base/doc/index.rst>
-   bob.ip.binseg <bob/bob.ip.binseg/doc/index.rst>
-   bob.ip.color <bob/bob.ip.color/doc/index.rst>
-   bob.ip.dlib <bob/bob.ip.dlib/doc/index.rst>
-   bob.ip.draw <bob/bob.ip.draw/doc/index.rst>
-   bob.ip.facedetect <bob/bob.ip.facedetect/doc/index.rst>
-   bob.ip.facelandmarks <bob/bob.ip.facelandmarks/doc/index.rst>
-   bob.ip.flandmark <bob/bob.ip.flandmark/doc/index.rst>
-   bob.ip.gabor <bob/bob.ip.gabor/doc/index.rst>
-   bob.ip.optflow.hornschunck <bob/bob.ip.optflow.hornschunck/doc/index.rst>
-   bob.ip.optflow.liu <bob/bob.ip.optflow.liu/doc/index.rst>
-   bob.ip.qualitymeasure <bob/bob.ip.qualitymeasure/doc/index.rst>
-   bob.ip.skincolorfilter <bob/bob.ip.skincolorfilter/doc/index.rst>
-   bob.ip.tensorflow_extractor <bob/bob.ip.tensorflow_extractor/doc/index.rst>
-   bob.learn.activation <bob/bob.learn.activation/doc/index.rst>
-   bob.learn.boosting <bob/bob.learn.boosting/doc/index.rst>
-   bob.learn.em <bob/bob.learn.em/doc/index.rst>
-   bob.learn.libsvm <bob/bob.learn.libsvm/doc/index.rst>
-   bob.learn.linear <bob/bob.learn.linear/doc/index.rst>
-   bob.learn.mlp <bob/bob.learn.mlp/doc/index.rst>
-   bob.learn.pytorch <bob/bob.learn.pytorch/doc/index.rst>
-   bob.learn.tensorflow <bob/bob.learn.tensorflow/doc/index.rst>
-   bob.math <bob/bob.math/doc/index.rst>
-   bob.measure <bob/bob.measure/doc/index.rst>
-   bob.pad.base <bob/bob.pad.base/doc/index.rst>
-   bob.pad.face <bob/bob.pad.face/doc/index.rst>
-   bob.pad.vein <bob/bob.pad.vein/doc/index.rst>
-   bob.pad.voice <bob/bob.pad.voice/doc/index.rst>
-   bob.rppg.base <bob/bob.rppg.base/doc/index.rst>
-   bob.sp <bob/bob.sp/doc/index.rst>
-   gridtk <bob/gridtk/doc/index.rst>
-   readme_index.rst
+.. include:: links.rst
diff --git a/doc/install.rst b/doc/install.rst
new file mode 100644
index 0000000000000000000000000000000000000000..653bc976481d9cb47d7b36163ada3c8fef569dd3
--- /dev/null
+++ b/doc/install.rst
@@ -0,0 +1,159 @@
+.. _bob.install:
+
+***************************
+ Installation instructions
+***************************
+
+By now you should know that Bob is made of several :ref:`bob.packages`. There is no single
+package that installs all Bob packages because that would just take too much space.
+Follow the instruction below to install any Bob package.
+
+We offer pre-compiled binary installations of Bob using `conda`_ for Linux and
+MacOS 64-bit operating systems. Follow the guide below to learn to install any Bob
+package. Bob does not work on Windows.
+
+#.  Install `conda`_ (miniconda is preferred) and get familiar with it.
+#.  Make sure you have an up-to-date `conda`_ installation (conda 4.4 and above
+    is needed) with the **correct configuration** by running the commands
+    below:
+
+    .. code:: sh
+
+       $ conda update -n base -c defaults conda
+       $ conda config --set show_channel_urls True
+
+#.  Create an environment with the specific Bob packages that you need. For example if
+    you want to install ``bob.io.image`` and ``bob.bio.face``:
+
+    .. code:: sh
+
+       $ conda create --name bob_env1 --override-channels \
+         -c https://www.idiap.ch/software/bob/conda -c defaults \
+         python=3 bob.io.image bob.bio.face
+
+#.  Then activate the environment and configure its channels to make sure the channel
+    list is correct in the future as well:
+
+    .. code:: sh
+
+       $ conda activate bob_env1
+       $ conda config --env --add channels defaults
+       $ conda config --env --add channels https://www.idiap.ch/software/bob/conda
+
+#.  If you decide to install more packages in the future, just conda install them:
+
+    .. code:: sh
+
+       $ conda activate bob_env1
+       $ conda install bob.io.video bob.bio.video ...
+
+For a comprehensive list of packages that are either part of |project| or use
+|project|, please visit :ref:`bob.packages`.
+
+.. warning::
+
+    Be aware that if you use packages from our channel and other user/community
+    channels (especially ``conda-forge``) in one environment, you may end up
+    with a broken envrionment. We can only guarantee that the packages in our
+    channel are compatible with the ``defaults`` channel.
+
+.. note::
+
+    Bob does not work on Windows and hence no conda packages are available for
+    it. It will not work even if you install it from source. If you are an
+    experienced user and manage to make Bob work on Windows, please let us know
+    through our `mailing list`_.
+
+.. note::
+
+    Bob has been reported to run on arm processors (e.g. Raspberry Pi) but is
+    not installable with conda. Please see https://stackoverflow.com/questions/50803148
+    for installations on how to install Bob from source.
+
+
+.. _bob.source:
+
+Developing Bob packages
+=======================
+
+Use :ref:`bob.devtools <bob.devtools>` if you want to develop Bob packages or create
+a new package. **DO NOT** modify (including adding extra files) the source code of Bob
+packages in your Conda environments. Typically, Bob packages can be extended without
+modifying the original package. So you may want to put your new code in a new package
+instead of modifying the original package.
+
+.. warning::
+
+  Conda uses hard links to create new
+  environments from a cache folder. Editing a file in one of the environments will edit
+  that file in **ALL** of your environments. The only safe way to recover from this is to
+  delete your Conda installation completely and installing everything again from scratch.
+
+
+Installing older versions of Bob
+================================
+
+Since Bob 4, you can easily select the Bob version that you want to install
+using conda. For example:
+
+.. code:: sh
+
+    $ conda install \
+    -c https://www.idiap.ch/software/bob/conda \
+    -c defaults \
+    -c https://www.idiap.ch/software/bob/conda/label/archive \
+    bob=4.0.0 bob.io.base
+
+will install the version of ``bob.io.base`` that was associated with the Bob
+4.0.0 release.
+
+.. note::
+
+    If you install the ``bob`` conda package, you may need to change your channel list
+    to:
+
+    .. code:: sh
+
+       $ conda activate <bob-env-name>
+       $ conda config --env --add channels https://www.idiap.ch/software/bob/conda/label/archive
+       $ conda config --env --add channels defaults
+       $ conda config --env --add channels https://www.idiap.ch/software/bob/conda
+
+Bob packages that were released before Bob 4 are not easily installable. Here,
+we provide conda environment files (**Linux 64-bit only**) that will install
+all Bob packages associated with an older release of Bob:
+
+===========  ==============================================================
+Bob Version  Environment Files
+===========  ==============================================================
+2.6.2        :download:`envs/v262py27.yaml`, :download:`envs/v262py35.yaml`
+2.7.0        :download:`envs/v270py27.yaml`, :download:`envs/v270py35.yaml`
+3.0.0        :download:`envs/v300py27.yaml`, :download:`envs/v300py36.yaml`
+===========  ==============================================================
+
+To install them, download one of the files above and run:
+
+.. code:: sh
+
+    $ conda env create --file v300py36.yaml
+
+
+Details (advanced users)
+========================
+
+Since Bob 4, the ``bob`` conda package is just a meta package that pins all
+packages to a specific version. Installing ``bob`` will not install anything;
+it will just impose pinnings in your environment. Normally, installations of
+Bob packages should work without installing ``bob`` itself. For example,
+running:
+
+.. code:: sh
+
+    $ conda create --name env_name --override-channels \
+      -c https://www.idiap.ch/software/bob/conda -c defaults \
+      bob.<package-name>
+
+should always create a working environment. If it doesn't, please let us know.
+
+
+.. include:: links.rst
diff --git a/doc/links.rst b/doc/links.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9a37bd3398d8364b505c2cc7eeebd8462e2e7c8d
--- /dev/null
+++ b/doc/links.rst
@@ -0,0 +1,51 @@
+.. _anaconda: https://www.continuum.io/anaconda
+.. _Artistic-2.0: http://www.opensource.org/licenses/Artistic-2.0
+.. _Blitz++: https://github.com/blitzpp/blitz
+.. _Bob: https://www.idiap.ch/software/bob
+.. _Boost: http://www.boost.org
+.. _BSD-2-Clause: http://www.opensource.org/licenses/BSD-2-Clause
+.. _BSD-3-Clause: http://www.opensource.org/licenses/BSD-3-Clause
+.. _BSL-1.0: http://www.opensource.org/licenses/BSL-1.0
+.. _c++: https://isocpp.org/
+.. _CMake: http://www.cmake.org
+.. _conda: https://conda.io/
+.. _Dvipng: http://savannah.nongnu.org/projects/dvipng/
+.. _FFMpeg: http://ffmpeg.org
+.. _fftw: http://www.fftw.org/
+.. _giflib: http://giflib.sourceforge.net/
+.. _GPL-2.0: http://www.opensource.org/licenses/GPL-2.0
+.. _GPL-3.0: http://www.opensource.org/licenses/GPL-3.0
+.. _HDF5 License: ftp://ftp.hdfgroup.org/HDF5/current/src/unpacked/COPYING
+.. _HDF5: http://www.hdfgroup.org/HDF5
+.. _idiap: http://www.idiap.ch
+.. _install: https://www.idiap.ch/software/bob/install
+.. _IPython: http://ipython.scipy.org
+.. _Lapack: http://www.netlib.org/lapack
+.. _LaTeX: http://www.latex-project.org/
+.. _LGPL-2.1: http://www.opensource.org/licenses/LGPL-2.1
+.. _libAV: http://libav.org
+.. _libjpeg: http://libjpeg.sourceforge.net/
+.. _libpng license: http://www.libpng.org/pub/png/src/libpng-LICENSE.txt
+.. _libpng: http://libpng.org/pub/png/libpng.html
+.. _LIBSVM: http://www.csie.ntu.edu.tw/~cjlin/libsvm/
+.. _libtiff: http://www.remotesensing.org/libtiff/
+.. _mailing list: https://www.idiap.ch/software/bob/discuss
+.. _MatIO: http://matio.sourceforge.net
+.. _Matplotlib: http://matplotlib.sourceforge.net
+.. _miniconda: http://conda.pydata.org/miniconda.html
+.. _MIT: http://www.opensource.org/licenses/MIT
+.. _nose: http://nose.readthedocs.org
+.. _NumPy Reference: https://docs.scipy.org/doc/numpy/
+.. _NumPy: http://www.numpy.org
+.. _packages: https://www.idiap.ch/software/bob/packages
+.. _Pillow: http://python-pillow.github.io/
+.. _pkg-config: http://www.freedesktop.org/wiki/Software/pkg-config/
+.. _Python-2.0: http://www.opensource.org/licenses/Python-2.0
+.. _python: http://www.python.org
+.. _SciPy: http://www.scipy.org
+.. _Setuptools: http://trac.edgewall.org/wiki/setuptools
+.. _Sphinx: http://sphinx.pocoo.org
+.. _SQLAlchemy: http://www.sqlalchemy.org/
+.. _SQLite: http://www.sqlite.org
+.. _VLFeat: http://www.vlfeat.org/
+.. _Wiki: https://www.idiap.ch/software/bob/wiki
diff --git a/doc/packages.rst b/doc/packages.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c225bff3a716dc40fac5fe37dafabe3075bce10b
--- /dev/null
+++ b/doc/packages.rst
@@ -0,0 +1,311 @@
+.. _bob.packages:
+
+==========
+ Packages
+==========
+
+Bob is organized in several independent python packages.
+
+* You can
+  `search PyPI <https://pypi.org/search/?o=-created&c=Framework+%3A%3A+Bob>`_
+  for a comprehensive list of packages **that either use Bob or are part of
+  Bob**.
+
+You can find the documentation of the Bob packages that we maintain below.
+
+
+Basic Functionality
+-------------------
+
+* :ref:`bob.core`
+* :ref:`bob.math`
+
+Data Input and Output
+---------------------
+
+* :ref:`bob.io.base`
+* :ref:`bob.io.image`
+* :ref:`bob.io.video`
+* :ref:`bob.io.audio`
+* :ref:`bob.io.matlab`
+
+Signal, Audio, Image and Video Processing
+-----------------------------------------
+
+* :ref:`bob.sp`
+* :ref:`bob.ap`
+* :ref:`bob.ip.base`
+* :ref:`bob.ip.color`
+* :ref:`bob.ip.draw`
+* :ref:`bob.ip.gabor`
+* :ref:`bob.ip.facedetect`
+* :ref:`bob.ip.facelandmarks`
+* :ref:`bob.ip.optflow.liu`
+* :ref:`bob.ip.optflow.hornschunck`
+* :ref:`bob.ip.flandmark`
+* :ref:`bob.ip.dlib`
+* :ref:`bob.ip.qualitymeasure`
+* :ref:`bob.ip.skincolorfilter`
+* :ref:`bob.ip.tensorflow_extractor`
+* :ref:`bob.ip.binseg`
+
+
+Machine Learning
+----------------
+
+* :ref:`bob.measure`
+* :ref:`bob.learn.linear`
+* :ref:`bob.learn.mlp`
+* :ref:`bob.learn.activation`
+* :ref:`bob.learn.libsvm`
+* :ref:`bob.learn.em`
+* :ref:`bob.learn.boosting`
+* :ref:`bob.learn.tensorflow`
+* :ref:`bob.learn.pytorch`
+
+Modules for Developers
+----------------------
+
+* :ref:`bob.devtools`
+* :ref:`bob.extension`
+* :ref:`bob.blitz`
+* :ref:`bob.buildout`
+
+Parallel Execution
+------------------
+
+* :ref:`gridtk`
+
+Biometric Recognition
+---------------------
+
+* :ref:`bob.bio.base`
+* :ref:`bob.bio.face`
+* :ref:`bob.bio.spear`
+* :ref:`bob.bio.vein`
+* :ref:`bob.bio.video`
+* :ref:`bob.bio.gmm`
+* :ref:`bob.bio.face_ongoing`
+* :ref:`bob.bio.htface`
+* :ref:`bob.ip.tensorflow_extractor`
+* :ref:`bob.fusion.base`
+
+
+Presentation Attack Detection (anti-spoofing)
+---------------------------------------------
+
+* :ref:`bob.pad.base`
+* :ref:`bob.pad.face`
+* :ref:`bob.pad.vein`
+* :ref:`bob.pad.voice`
+* :ref:`bob.fusion.base`
+
+
+Remote Heart Rate Measurement
+-----------------------------
+
+* :ref:`bob.rppg.base`
+
+
+Database Interfaces
+-------------------
+
+Base Database Packages
+^^^^^^^^^^^^^^^^^^^^^^
+
+* :ref:`bob.db.base`
+* :ref:`bob.bio.base`
+* :ref:`bob.pad.base`
+
+Interfaces
+^^^^^^^^^^
+
+* :ref:`bob.db.arface`
+* :ref:`bob.db.asvspoof2017`
+* :ref:`bob.db.asvspoof`
+* :ref:`bob.db.atnt`
+* :ref:`bob.db.atvskeystroke`
+* :ref:`bob.db.avspoof`
+* :ref:`bob.db.banca`
+* :ref:`bob.db.biosecure`
+* :ref:`bob.db.biosecurid.face`
+* :ref:`bob.db.casia_fasd`
+* :ref:`bob.db.casiasurf`
+* :ref:`bob.db.casme2`
+* :ref:`bob.db.caspeal`
+* :ref:`bob.db.cbsr_nir_vis_2`
+* :ref:`bob.db.chasedb1`
+* :ref:`bob.db.cohface`
+* :ref:`bob.db.cuhk_cufs`
+* :ref:`bob.db.cuhk_cufsf`
+* :ref:`bob.db.drionsdb`
+* :ref:`bob.db.drishtigs1`
+* :ref:`bob.db.drive`
+* :ref:`bob.db.fargo`
+* :ref:`bob.db.frgc`
+* :ref:`bob.db.fv3d`
+* :ref:`bob.db.gbu`
+* :ref:`bob.db.hci_tagging`
+* :ref:`bob.db.hrf`
+* :ref:`bob.db.ijba`
+* :ref:`bob.db.ijbc`
+* :ref:`bob.db.iostar`
+* :ref:`bob.db.iris`
+* :ref:`bob.db.kboc16`
+* :ref:`bob.db.ldhf`
+* :ref:`bob.db.lfw`
+* :ref:`bob.db.livdet2013`
+* :ref:`bob.db.maskattack`
+* :ref:`bob.db.mnist`
+* :ref:`bob.db.mobio`
+* :ref:`bob.db.msu_mfsd_mod`
+* :ref:`bob.db.multipie`
+* :ref:`bob.db.nist_sre12`
+* :ref:`bob.db.nivl`
+* :ref:`bob.db.oulunpu`
+* :ref:`bob.db.pericrosseye`
+* :ref:`bob.db.pola_thermal`
+* :ref:`bob.db.putvein`
+* :ref:`bob.db.refuge`
+* :ref:`bob.db.replay`
+* :ref:`bob.db.replaymobile`
+* :ref:`bob.db.rimoner3`
+* :ref:`bob.db.scface`
+* :ref:`bob.db.siw`
+* :ref:`bob.db.stare`
+* :ref:`bob.db.swan`
+* :ref:`bob.db.utfvp`
+* :ref:`bob.db.uvad`
+* :ref:`bob.db.verafinger`
+* :ref:`bob.db.voicepa`
+* :ref:`bob.db.voxforge`
+* :ref:`bob.db.wine`
+* :ref:`bob.db.xm2vts`
+* :ref:`bob.db.youtube`
+
+
+
+Index of all Packages
+=====================
+
+.. toctree::
+   :maxdepth: 1
+   :titlesonly:
+
+   bob.ap <bob/bob.ap/doc/index.rst>
+   bob.bio.base <bob/bob.bio.base/doc/index.rst>
+   bob.bio.face <bob/bob.bio.face/doc/index.rst>
+   bob.bio.face_ongoing <bob/bob.bio.face_ongoing/doc/index.rst>
+   bob.bio.gmm <bob/bob.bio.gmm/doc/index.rst>
+   bob.bio.htface <bob/bob.bio.htface/doc/index.rst>
+   bob.bio.spear <bob/bob.bio.spear/doc/index.rst>
+   bob.bio.vein <bob/bob.bio.vein/doc/index.rst>
+   bob.bio.video <bob/bob.bio.video/doc/index.rst>
+   bob.blitz <bob/bob.blitz/doc/index.rst>
+   bob.buildout <bob/bob.buildout/doc/index.rst>
+   bob.core <bob/bob.core/doc/index.rst>
+   bob.db.arface <bob/bob.db.arface/doc/index.rst>
+   bob.db.asvspoof <bob/bob.db.asvspoof/doc/index.rst>
+   bob.db.asvspoof2017 <bob/bob.db.asvspoof2017/doc/index.rst>
+   bob.db.atnt <bob/bob.db.atnt/doc/index.rst>
+   bob.db.atvskeystroke <bob/bob.db.atvskeystroke/doc/index.rst>
+   bob.db.avspoof <bob/bob.db.avspoof/doc/index.rst>
+   bob.db.banca <bob/bob.db.banca/doc/index.rst>
+   bob.db.base <bob/bob.db.base/doc/index.rst>
+   bob.db.biosecure <bob/bob.db.biosecure/doc/index.rst>
+   bob.db.biosecurid.face <bob/bob.db.biosecurid.face/doc/index.rst>
+   bob.db.casia_fasd <bob/bob.db.casia_fasd/doc/index.rst>
+   bob.db.casiasurf <bob/bob.db.casiasurf/doc/index.rst>
+   bob.db.casme2 <bob/bob.db.casme2/doc/index.rst>
+   bob.db.caspeal <bob/bob.db.caspeal/doc/index.rst>
+   bob.db.cbsr_nir_vis_2 <bob/bob.db.cbsr_nir_vis_2/doc/index.rst>
+   bob.db.chasedb1 <bob/bob.db.chasedb1/doc/index.rst>
+   bob.db.cohface <bob/bob.db.cohface/doc/index.rst>
+   bob.db.cuhk_cufs <bob/bob.db.cuhk_cufs/doc/index.rst>
+   bob.db.cuhk_cufsf <bob/bob.db.cuhk_cufsf/doc/index.rst>
+   bob.db.drionsdb <bob/bob.db.drionsdb/doc/index.rst>
+   bob.db.drishtigs1 <bob/bob.db.drishtigs1/doc/index.rst>
+   bob.db.drive <bob/bob.db.drive/doc/index.rst>
+   bob.db.fargo <bob/bob.db.fargo/doc/index.rst>
+   bob.db.frgc <bob/bob.db.frgc/doc/index.rst>
+   bob.db.fv3d <bob/bob.db.fv3d/doc/index.rst>
+   bob.db.gbu <bob/bob.db.gbu/doc/index.rst>
+   bob.db.hci_tagging <bob/bob.db.hci_tagging/doc/index.rst>
+   bob.db.hrf <bob/bob.db.hrf/doc/index.rst>
+   bob.db.ijba <bob/bob.db.ijba/doc/index.rst>
+   bob.db.ijbc <bob/bob.db.ijbc/doc/index.rst>
+   bob.db.iostar <bob/bob.db.iostar/doc/index.rst>
+   bob.db.iris <bob/bob.db.iris/doc/index.rst>
+   bob.db.kboc16 <bob/bob.db.kboc16/doc/index.rst>
+   bob.db.ldhf <bob/bob.db.ldhf/doc/index.rst>
+   bob.db.lfw <bob/bob.db.lfw/doc/index.rst>
+   bob.db.livdet2013 <bob/bob.db.livdet2013/doc/index.rst>
+   bob.db.maskattack <bob/bob.db.maskattack/doc/index.rst>
+   bob.db.mnist <bob/bob.db.mnist/doc/index.rst>
+   bob.db.mobio <bob/bob.db.mobio/doc/index.rst>
+   bob.db.msu_mfsd_mod <bob/bob.db.msu_mfsd_mod/doc/index.rst>
+   bob.db.multipie <bob/bob.db.multipie/doc/index.rst>
+   bob.db.nist_sre12 <bob/bob.db.nist_sre12/doc/index.rst>
+   bob.db.nivl <bob/bob.db.nivl/doc/index.rst>
+   bob.db.oulunpu <bob/bob.db.oulunpu/doc/index.rst>
+   bob.db.pericrosseye <bob/bob.db.pericrosseye/doc/index.rst>
+   bob.db.pola_thermal<bob/bob.db.pola_thermal/doc/index.rst>
+   bob.db.putvein <bob/bob.db.putvein/doc/index.rst>
+   bob.db.refuge <bob/bob.db.refuge/doc/index.rst>
+   bob.db.replay <bob/bob.db.replay/doc/index.rst>
+   bob.db.replaymobile <bob/bob.db.replaymobile/doc/index.rst>
+   bob.db.rimoner3 <bob/bob.db.rimoner3/doc/index.rst>
+   bob.db.scface <bob/bob.db.scface/doc/index.rst>
+   bob.db.siw <bob/bob.db.siw/doc/index.rst>
+   bob.db.stare <bob/bob.db.stare/doc/index.rst>
+   bob.db.swan <bob/bob.db.swan/doc/index.rst>
+   bob.db.utfvp <bob/bob.db.utfvp/doc/index.rst>
+   bob.db.uvad <bob/bob.db.uvad/doc/index.rst>
+   bob.db.verafinger <bob/bob.db.verafinger/doc/index.rst>
+   bob.db.voicepa <bob/bob.db.voicepa/doc/index.rst>
+   bob.db.voxforge <bob/bob.db.voxforge/doc/index.rst>
+   bob.db.wine <bob/bob.db.wine/doc/index.rst>
+   bob.db.xm2vts <bob/bob.db.xm2vts/doc/index.rst>
+   bob.db.youtube <bob/bob.db.youtube/doc/index.rst>
+   bob.devtools <bob/bob.devtools/doc/index.rst>
+   bob.extension <bob/bob.extension/doc/index.rst>
+   bob.fusion.base <bob/bob.fusion.base/doc/index.rst>
+   bob.io.audio <bob/bob.io.audio/doc/index.rst>
+   bob.io.base <bob/bob.io.base/doc/index.rst>
+   bob.io.image <bob/bob.io.image/doc/index.rst>
+   bob.io.matlab <bob/bob.io.matlab/doc/index.rst>
+   bob.io.video <bob/bob.io.video/doc/index.rst>
+   bob.ip.base <bob/bob.ip.base/doc/index.rst>
+   bob.ip.binseg <bob/bob.ip.binseg/doc/index.rst>
+   bob.ip.color <bob/bob.ip.color/doc/index.rst>
+   bob.ip.dlib <bob/bob.ip.dlib/doc/index.rst>
+   bob.ip.draw <bob/bob.ip.draw/doc/index.rst>
+   bob.ip.facedetect <bob/bob.ip.facedetect/doc/index.rst>
+   bob.ip.facelandmarks <bob/bob.ip.facelandmarks/doc/index.rst>
+   bob.ip.flandmark <bob/bob.ip.flandmark/doc/index.rst>
+   bob.ip.gabor <bob/bob.ip.gabor/doc/index.rst>
+   bob.ip.optflow.hornschunck <bob/bob.ip.optflow.hornschunck/doc/index.rst>
+   bob.ip.optflow.liu <bob/bob.ip.optflow.liu/doc/index.rst>
+   bob.ip.qualitymeasure <bob/bob.ip.qualitymeasure/doc/index.rst>
+   bob.ip.skincolorfilter <bob/bob.ip.skincolorfilter/doc/index.rst>
+   bob.ip.tensorflow_extractor <bob/bob.ip.tensorflow_extractor/doc/index.rst>
+   bob.learn.activation <bob/bob.learn.activation/doc/index.rst>
+   bob.learn.boosting <bob/bob.learn.boosting/doc/index.rst>
+   bob.learn.em <bob/bob.learn.em/doc/index.rst>
+   bob.learn.libsvm <bob/bob.learn.libsvm/doc/index.rst>
+   bob.learn.linear <bob/bob.learn.linear/doc/index.rst>
+   bob.learn.mlp <bob/bob.learn.mlp/doc/index.rst>
+   bob.learn.pytorch <bob/bob.learn.pytorch/doc/index.rst>
+   bob.learn.tensorflow <bob/bob.learn.tensorflow/doc/index.rst>
+   bob.math <bob/bob.math/doc/index.rst>
+   bob.measure <bob/bob.measure/doc/index.rst>
+   bob.pad.base <bob/bob.pad.base/doc/index.rst>
+   bob.pad.face <bob/bob.pad.face/doc/index.rst>
+   bob.pad.vein <bob/bob.pad.vein/doc/index.rst>
+   bob.pad.voice <bob/bob.pad.voice/doc/index.rst>
+   bob.rppg.base <bob/bob.rppg.base/doc/index.rst>
+   bob.sp <bob/bob.sp/doc/index.rst>
+   gridtk <bob/gridtk/doc/index.rst>
+   readme_index.rst
+
+.. include:: links.rst
diff --git a/doc/plot/convolve.py b/doc/plot/convolve.py
deleted file mode 120000
index 6fb55a06ebf013e5f8a7f1495a1251e9c9deff4d..0000000000000000000000000000000000000000
--- a/doc/plot/convolve.py
+++ /dev/null
@@ -1 +0,0 @@
-../bob/bob.ip.caffe_extractor/doc/plot/convolve.py
\ No newline at end of file
diff --git a/doc/plot/iris_lda.py b/doc/plot/iris_lda.py
deleted file mode 120000
index 28cbfda1a8b1af14231d89d2dd28e1db66d0b296..0000000000000000000000000000000000000000
--- a/doc/plot/iris_lda.py
+++ /dev/null
@@ -1 +0,0 @@
-../bob/bob/doc/plot/iris_lda.py
\ No newline at end of file
diff --git a/doc/plot/iris_lda.py b/doc/plot/iris_lda.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d3d3b152b13150a743d7978c9fb379e8b7c215a
--- /dev/null
+++ b/doc/plot/iris_lda.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# Andre Anjos <andre.anjos@idiap.ch>
+# Sat 24 Mar 2012 18:51:21 CET 
+
+"""The Iris Flower Recognition using Linear Discriminant Analysis and Bob.
+"""
+
+import bob.db.iris
+import bob.learn.linear
+import bob.measure
+import numpy
+from matplotlib import pyplot
+
+# Training is a 3-step thing
+data = bob.db.iris.data()
+trainer = bob.learn.linear.FisherLDATrainer()
+machine, eigen_values = trainer.train(data.values())
+
+# A simple way to forward the data
+output = {}
+for key in data.keys(): output[key] = machine(data[key])
+
+# Here starts the plotting
+pyplot.hist(output['setosa'][:,0], bins=8, 
+    color='green', label='Setosa', alpha=0.5) 
+pyplot.hist(output['versicolor'][:,0], bins=8,
+    color='blue', label='Versicolor', alpha=0.5)
+pyplot.hist(output['virginica'][:,0], bins=8, 
+    color='red', label='Virginica', alpha=0.5)
+
+# This is just some decoration...
+pyplot.legend()
+pyplot.grid(True)
+pyplot.axis([-3,+3,0,20])
+pyplot.title("Iris Plants / 1st. LDA component")
+pyplot.xlabel("LDA[0]")
+pyplot.ylabel("Count")
diff --git a/doc/plot/iris_lda_roc.py b/doc/plot/iris_lda_roc.py
deleted file mode 120000
index 09d614eb83c2132f22339be6144da88b7dd39ac5..0000000000000000000000000000000000000000
--- a/doc/plot/iris_lda_roc.py
+++ /dev/null
@@ -1 +0,0 @@
-../bob/bob/doc/plot/iris_lda_roc.py
\ No newline at end of file
diff --git a/doc/plot/iris_lda_roc.py b/doc/plot/iris_lda_roc.py
new file mode 100644
index 0000000000000000000000000000000000000000..f5aeccea13c6faadcb3407666995d57b9771b017
--- /dev/null
+++ b/doc/plot/iris_lda_roc.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+# Andre Anjos <andre.anjos@idiap.ch>
+# Sat 24 Mar 2012 18:51:21 CET 
+
+"""Computes an ROC curve for the Iris Flower Recognition using Linear Discriminant Analysis and Bob.
+"""
+
+import bob.db.iris
+import bob.learn.linear
+import bob.measure
+import numpy
+from matplotlib import pyplot
+
+# Training is a 3-step thing
+data = bob.db.iris.data()
+trainer = bob.learn.linear.FisherLDATrainer()
+machine, eigen_values = trainer.train(data.values())
+
+# A simple way to forward the data
+output = {}
+for key in data.keys(): output[key] = machine(data[key])
+
+# Performance
+negatives = numpy.vstack([output['setosa'], output['versicolor']])[:,0]
+positives = output['virginica'][:,0]
+
+# Plot ROC curve
+bob.measure.plot.roc(negatives, positives)
+pyplot.xlabel("False Virginica Acceptance (%)")
+pyplot.ylabel("False Virginica Rejection (%)")
+pyplot.title("ROC Curve for Virginica Classification")
+pyplot.grid()
+pyplot.axis([0, 5, 0, 15]) #xmin, xmax, ymin, ymax
diff --git a/doc/readme_index.rst b/doc/readme_index.rst
index 4a239ad64a8fee8abae647bddbeeb1828ca2f826..3012ffa38c08c4893e6cf586130dfe270cb87d55 100644
--- a/doc/readme_index.rst
+++ b/doc/readme_index.rst
@@ -7,7 +7,6 @@ README of all Packages
    :maxdepth: 1
    :titlesonly:
 
-   bob <bob/bob/README.rst>
    bob.ap <bob/bob.ap/README.rst>
    bob.bio.base <bob/bob.bio.base/README.rst>
    bob.bio.face <bob/bob.bio.face/README.rst>
diff --git a/doc/tutorial.rst b/doc/tutorial.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e5d1287a36ae2a4717c4ef93946e7eb54fd3e331
--- /dev/null
+++ b/doc/tutorial.rst
@@ -0,0 +1,264 @@
+.. _bob.tutorial:
+
+********************************
+ Getting started with |project|
+********************************
+
+The following tutorial constitutes a suitable starting point to get to
+know how to use |project|'s packages and to learn its fundamental concepts.
+
+They all rely on the lab-like environment which is `Python`_. Using |project|
+within a Python environment is convenient because:
+
+-  you can easily glue together all of the components of an experiment
+   within a single Python script (which does not require to be
+   compiled),
+
+-  scripts may easily rely on other Python tools like `SciPy`_ as well
+   as |project|, and
+
+-  Python bindings are used to transparently run the underlying
+   efficient C++ compiled code for the key features of the library.
+
+
+Multi-dimensional Arrays
+========================
+
+The fundamental data structure of |project| is a multi-dimensional array. In
+signal processing and machine learning, arrays are a suitable representation
+for many different types of digital signals such as images, audio data and
+extracted features. Python is the working environment selected for this library
+and so when using Python we have relied on the existing `NumPy`_
+multi-dimensional arrays :any:`numpy.ndarray`. This provides with greater
+flexibility within the Python environment.
+
+At the C++ level, the `Blitz++`_ library is used to handle arrays. |project|
+provides internal conversion routines to transparently and efficiently convert
+NumPy ndarrays to/from Blitz++. As they are done implicitly, the user has no
+need to care about this aspect and should just use NumPy ndarrays everywhere
+while inside Python code.
+
+For an introduction and tutorials about NumPy ndarrays, just visit the `NumPy
+Reference`_ website. For a short tutorial on the bindings from NumPy ndarrays
+to Blitz++, you can read the documentation of our :ref:`bob.blitz` package.
+
+.. note::
+
+   Many functions in Bob will return multi-dimensional arrays type
+   :any:`bob.blitz.array`, which are **wrapped** by as a :any:`numpy.ndarray`. While
+   you can use these arrays in all contexts inside Bob, NumPy and Scipy, some
+   functionality of the :any:`numpy.ndarray` are **not available**. In
+   particular, resizing the arrays with :any:`numpy.ndarray.resize` will raise an
+   exception. In such cases, please make a **copy** of the array using
+   :any:`numpy.ndarray.copy`.
+
+Digital signals as multi-dimensional arrays
+===========================================
+
+For Bob, we have decided to represent digital signals directly as
+:any:`numpy.ndarray` rather than having dedicated classes for each type of
+signals. This implies that some convention has been defined.
+
+Vectors and matrices
+--------------------
+
+A vector is represented as a 1D NumPy array, whereas a matrix is
+represented by a 2D array whose first dimension corresponds to the rows,
+and second dimension to the columns.
+
+.. code:: python
+
+    >>> import numpy
+    >>> A = numpy.array([[1, 2, 3], [4, 5, 6]], dtype='uint8') # A is a matrix 2x3
+    >>> print(A)
+    [[1 2 3]
+     [4 5 6]]
+    >>> b = numpy.array([1, 2, 3], dtype='uint8') # b is a vector of length 3
+    >>> print(b)
+    [1 2 3]
+
+Images
+------
+
+**Grayscale** images are represented as 2D arrays, the first dimension
+being the height (number of rows) and the second dimension being the
+width (number of columns). For instance:
+
+.. code:: python
+
+    >>> img = numpy.ndarray((480,640), dtype='uint8')
+
+``img`` which is a 2D array can be seen as a gray-scale image of
+dimension 640 (width) by 480 (height). In addition, ``img`` can be seen
+as a matrix with 480 rows and 640 columns. This is the reason why we
+have decided that for images, the first dimension is the height and the
+second one the width, such that it matches the matrix convention as
+well.
+
+**Color** images are represented as 3D arrays, the first dimension being
+the number of color planes, the second dimension the height and the
+third the width. As an image is an array, this is the responsibility of
+the user to know in which color space the content is stored.
+:ref:`bob.ip.color` provides functions to perform color-space conversion:
+
+.. code:: python
+
+    >>> import bob.ip.color
+    >>> colored = numpy.ndarray((3,480,640), dtype='uint8')
+    >>> gray = bob.ip.color.rgb_to_gray(colored)
+    >>> print (gray.shape)
+    [480 640]
+
+Videos
+------
+
+A video can be seen as a sequence of images over time. By convention, the first
+dimension is for the frame indices (time index), whereas the remaining ones are
+related to the corresponding image frame. More information about loading and
+handling video sources can be found in :ref:`bob.io.video`.
+
+Audio signals
+-------------
+
+Audio signals in Bob are represented as 2D arrays: the first dimension being
+the number of channels and the second dimension corresponding to the time
+index. For instance:
+
+.. code:: python
+
+   >>> import bob.io.audio
+   >>> audio = bob.io.audio.reader("test.wav")
+   >>> audio.rate
+   16000.0
+   >>> signal = audio.load()
+   >>> signal.shape
+   (1, 268197)
+
+:ref:`bob.io.audio` supports loading a variety of audio files. Please refer to
+its documentation for more information.
+
+.. warning::
+
+   You can also use ``scipy.io.wavfile`` to load wav files in Python but the
+   returned data is slightly different compared to ``bob.io.audio``. In Scipy
+   the first dimension corresponds to the time index rather than the audio
+   channel. Also in Scipy, the loaded signal maybe an ``int8`` or ``int16`` or
+   something else depending on the audio but ``bob.io.audio`` always returns
+   the data as ``float`` arrays. We recommend using ``bob.io.audio`` since it
+   supports more audio formats and it is more consistent with the rest of Bob
+   packages.
+
+
+Input and output
+================
+
+The default way to read and write data from and to files with Bob is
+using the binary `HDF5`_ format which has several tools to inspect those
+files. Bob's support for HDF5 files is given through the :ref:`bob.io.base`
+package.
+
+On the other hand, loading and writing of different kinds of data is provided
+in other :ref:`bob.packages` of Bob using a plug-in strategy. Many image types can be
+read using :ref:`bob.io.image`, and many video codecs are supported through
+the :ref:`bob.io.video` plug-in. Also, a comprehensive support for
+MatLab files is given through the :ref:`bob.io.matlab` interface.
+
+Additionally, :ref:`bob.io.base` provides two generic functions
+:any:`bob.io.base.load` and :any:`bob.io.base.save` to load and save data of
+various types, based on the filename extension. For example, to load a
+.jpg image, simply call:
+
+.. code:: python
+
+    >>> import bob.io.base
+    >>> import bob.io.image #under the hood: loads Bob plug-in for image files
+    >>> img = bob.io.base.load("myimg.jpg")
+
+Image processing
+================
+
+The image processing module is split into several packages, where most
+functionality is contained in the :ref:`bob.ip.base` module. For an
+introduction in simple affine image transformations such as scaling and
+rotating images, as well as for more complex operations like Gaussian or Sobel
+filtering, please refer to the :ref:`bob.ip.base`. Also, simple
+texture features like LBP's can be extracted using :any:`bob.ip.base.LBP`.
+
+Gabor wavelet functionality has made it into its own package
+:ref:`bob.ip.gabor`. A tutorial on how to perform a Gabor wavelet transform,
+extract Gabor jets in grid graphs and compare Gabor jets, please read the
+:ref:`bob.ip.gabor`.
+
+Machine learning
+================
+
+*Machines* and *Trainers* are one of the core components of Bob.
+Machines represent statistical models or other functions defined by
+parameters that can be trained or set by using trainers. Two examples of
+machines are multi-layer perceptrons (MLPs) and Gaussian mixture models
+(GMMs).
+
+The operation you normally expect from a machine is to be able to feed a
+feature vector and extract the machine response or output for that input
+vector. It works, in many ways, similarly to signal processing blocks.
+Different types of machines will give you a different type of output.
+Here, we examine a few of the machines and trainers available in Bob.
+
+-  For a start, you should read the :ref:`bob.learn.linear`,
+   which is able to perform subspace projections like PCA and LDA.
+
+-  Multi-Layer Perceptron (MLP) Machines and Trainers are provided within the
+   :ref:`bob.learn.mlp` package.
+
+-  :ref:`bob.learn.libsvm` are provided though a bridge to
+   `LibSVM`_.
+
+-  Generating strong classifiers by Boosting Strong Classifiers
+   weak classifiers is provided by :ref:`bob.learn.boosting`.
+
+-  K-Means clustering and Gaussian Mixture Modeling, as well as Joint
+   Factor Analysis, Inter-Session Variability and Total Variability
+   modeling and, finally, Probabilistic Linear Discriminant Analysis is
+   implemented in :ref:`bob.learn.em`.
+
+Database interfaces
+===================
+
+Bob provides an API to easily query and interface with well known databases. A
+database contains information about the organization of the files, functions to
+query information such as the data which might be used for training a model,
+but it usually does **not** contain the data itself (except for some toy
+examples). Please visit :ref:`bob.db.base` for an excellent guide on Bob's
+datbases.
+
+Bob includes a (growing) list of supported database interfaces. There are some
+small toy databases like :ref:`bob.db.iris` and the :ref:`bob.db.mnist`
+database can be used to train and evaluate classification experiments. For the
+former, a detailed example on how to use Bob's machine learning techniques to
+classify the Iris flowers is given in :doc:`example`.
+
+However, most of the databases contain face images, speech data or videos that
+are used for biometric recognition and presentation attack detection
+(anti-spoofing). A complete (and growing) list of database packages can be
+found in our :ref:`bob.packages`.
+
+Several databases that can be used for biometric recognition share a common
+interface, which is defined in the :any:`bob.bio.base.database.BioDatabase`
+package. Generic functionality that is available in all verification database
+packages is defined in the :ref:`bob.bio.base <bob.bio.base>`, while a list of
+databases that implement this interface can be found in
+:ref:`bob.bio.face <bob.bio.face>`, :ref:`bob.bio.video <bob.bio.video>`,
+:ref:`bob.bio.spear <bob.bio.spear>`, or any other biometric package depending
+on the modality of the database.
+
+Performance evaluation
+======================
+
+Methods in the :ref:`bob.measure` module can be used evaluate error for
+multi-class or binary classification problems. Several evaluation
+techniques such as Root Mean Squared Error, F-score, Recognition Rates,
+False Acceptance and False Rejection Rates, and Equal Error Rates can be
+computed, but also functionality for plotting CMC, ROC, DET and EPC
+curves are described in more detail in the :ref:`bob.measure`.
+
+.. include:: links.rst
diff --git a/packages.txt b/packages.txt
index 4030c1c84272b464294fb77bcaa2ad3f27d2b954..6515ea17fa0a67eb23badda6bd75dddbeec08672 100644
--- a/packages.txt
+++ b/packages.txt
@@ -1,4 +1,3 @@
-bob/bob
 bob/bob.ap
 bob/bob.bio.base
 bob/bob.bio.face