diff --git a/doc/c_cpp_api.rst b/doc/c_cpp_api.rst
index 270e6455e657e19f64873067b556709bcbd857a7..88a6870aa92f65e77f30e7c3ab624f3b1b091845 100644
--- a/doc/c_cpp_api.rst
+++ b/doc/c_cpp_api.rst
@@ -68,6 +68,7 @@ Generic Functions
    Returns ``0`` in case of failure, or a **new reference** to the tuple
    described above in case of success.
 
+
 Bob File Support
 ----------------
 
@@ -86,4 +87,120 @@ Bob File Support
 
       A pointer to a file being read or written.
 
+.. cpp:type:: PyBobIoFileIteratorObject
+
+   The pythonic object representation for an iterator over a ``bob::io::File``
+   object.
+
+   .. code-block:: cpp
+
+      typedef struct {
+        PyObject_HEAD
+        PyBobIoFileObject* pyfile;
+        Py_ssize_t curpos;
+      } PyBobIoFileIteratorObject;
+
+   .. cpp:member:: PyBobIoFileObject* pyfile
+
+      A pointer to the pythonic representation of a file.
+
+   .. cpp:member:: Py_ssize_t curpos
+
+      The current position at the file being pointed to.
+
+
+Bob HDF5 Support
+----------------
+
+.. cpp:type:: PyBobIoHDF5FileObject
+
+   The pythonic object representation for a ``bob::io::HDF5File`` object.
+
+   .. code-block:: cpp
+
+      typedef struct {
+        PyObject_HEAD
+        boost::shared_ptr<bob::io::HDF5File> f;
+      } PyBobIoHDF5FileObject;
+
+   .. cpp:member:: boost::shared_ptr<bob::io::HDF5File> f
+
+      A pointer to a Bob object being used to read/write data into an HDF5
+      file.
+
+
+.. cpp:function:: int PyBobIoHDF5File_Check(PyObject* o)
+
+   Checks if the input object ``o`` is a ``PyBobIoHDF5FileObject``. Returns
+   ``1`` if it is, and ``0`` otherwise.
+
+
+.. cpp:function:: int PyBobIoHDF5File_Converter(PyObject* o, PyBobIoHDF5FileObject** a)
+
+   This function is meant to be used with :c:func:`PyArg_ParseTupleAndKeywords`
+   family of functions in the Python C-API. It checks the input object to be of
+   type ``PyBobIoHDF5FileObject`` and sets a **new reference** to it (in
+   ``*a``) if it is the case. Returns ``0`` in case of failure, ``1`` in case
+   of success.
+
+Bob VideoReader Support
+-----------------------
+
+.. note::
+
+   The video C-API (and Python) is only available if the package was compiled
+   with FFMPEG or LibAV support.
+
+.. cpp:type:: PyBobIoVideoReaderObject
+
+   The pythonic object representation for a ``bob::io::VideoReader`` object.
+
+   .. code-block:: cpp
+
+      typedef struct {
+        PyObject_HEAD
+        boost::shared_ptr<bob::io::VideoReader> v;
+      } PyBobIoVideoReaderObject;
+
+   .. cpp:member:: boost::shared_ptr<bob::io::VideoReader> v
+
+      A pointer to a Bob object being used to read the video contents
+
+.. cpp:type:: PyBobIoVideoReaderIteratorObject
+
+   The pythonic object representation for an iterator over a
+   ``bob::io::VideoReader`` object.
+
+   .. code-block:: cpp
+
+      typedef struct {
+        PyObject_HEAD
+        PyBobIoVideoReaderObject* pyreader;
+        boost::shared_ptr<bob::io::VideoReader::const_iterator> iter;
+      } PyBobIoFileIteratorObject;
+
+   .. cpp:member:: PyBobIoVideoReaderObject* pyreader
+
+      A pointer to the pythonic representation of the video reader.
+
+   .. cpp:member:: boost::shared_ptr<bob::io::VideoReader::const_iterator> iter
+
+      The current position at the file being pointed to, represented by a
+      formal iterator over the VideoReader.
+
+.. cpp:type:: PyBobIoVideoReaderObject
+
+   The pythonic object representation for a ``bob::io::VideoWriter`` object.
+
+   .. code-block:: cpp
+
+      typedef struct {
+        PyObject_HEAD
+        boost::shared_ptr<bob::io::VideoWriter> v;
+      } PyBobIoVideoWriterObject;
+
+   .. cpp:member:: boost::shared_ptr<bob::io::VideoWriter> v
+
+      A pointer to a Bob object being used to write contents to the video.
+
 .. include:: links.rst
diff --git a/doc/conf.py b/doc/conf.py
index 1450d0a8ca967bbe1d540d46313911487276aeea..df9e2e3de93443b24260968f54519b64fb70bb05 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -244,6 +244,7 @@ latex_logo = ''
 # Included after all input documents
 rst_epilog = """
 .. |version| replace:: %s
+.. |project| replace:: Bob
 """ % (version,)
 
 # -- Options for manual page output --------------------------------------------
diff --git a/doc/index.rst b/doc/index.rst
index 70de9db71e669d4cb9559950247865356c459db8..e20b85fd521fd3aa80673409c0d8213ae395a72a 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -3,30 +3,14 @@
 .. Mon  4 Nov 20:58:04 2013 CET
 .. 
 .. Copyright (C) 2011-2013 Idiap Research Institute, Martigny, Switzerland
-.. 
-.. This program is free software: you can redistribute it and/or modify
-.. it under the terms of the GNU General Public License as published by
-.. the Free Software Foundation, version 3 of the License.
-.. 
-.. This program is distributed in the hope that it will be useful,
-.. but WITHOUT ANY WARRANTY; without even the implied warranty of
-.. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.. GNU General Public License for more details.
-.. 
-.. You should have received a copy of the GNU General Public License
-.. along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-.. Master file, created by sphinx-quickstart on Mon Mar 21 18:07:34 2011.  You
-   can adapt this file completely to your liking, but it should at least contain
-   the root `toctree` directive.
 
-=====================
- Bob's Core Routines
-=====================
+====================
+ Bob's I/O Routines
+====================
 
 This module contains base functionality from Bob bound to Python, available in
-the C++ counter-part ``bob::core``. It includes basic conversion routines,
-random number generation and central logging facilities.
+the C++ counter-part ``bob::io``. It includes input and output operations to
+and from files.
 
 Reference
 ---------
@@ -35,6 +19,7 @@ Reference
    :maxdepth: 2
 
    py_api
+   video
    c_cpp_api
 
 Indices and tables
diff --git a/doc/links.rst b/doc/links.rst
index 2a4f8df5169043f427831d3226f6dc722c097e69..8709c8706d9601abde3c8cf5dd0b069306e94ede 100644
--- a/doc/links.rst
+++ b/doc/links.rst
@@ -20,15 +20,61 @@
 
 .. Place here references to all citations in lower case
 
+.. _argparse: http://code.google.com/p/argparse/
+.. _blitz++: http://www.oonumerics.org/blitz
+.. _bob's idiap guide: http://github.com/idiap/bob/wiki/Using-Bob-at-Idiap
+.. _bob's website: https://www.idiap.ch/software/bob
 .. _boost: http://www.boost.org
+.. _buildbot: http://trac.buildbot.net
 .. _buildout: http://pypi.python.org/pypi/zc.buildout/
 .. _c++: http://www2.research.att.com/~bs/C++.html
+.. _cmake: http://www.cmake.org
+.. _doxygen: http://www.doxygen.org
+.. _dvipng: http://savannah.nongnu.org/projects/dvipng/
+.. _ffmpeg: http://ffmpeg.org
+.. _libav: http://libav.org
+.. _fftw: http://www.fftw.org/
+.. _fink: http://www.finkproject.org
+.. _git: http://git-scm.com/
+.. _github: http://github.com/
+.. _google perftools: http://code.google.com/p/google-perftools
+.. _hdf5: http://www.hdfgroup.org/HDF5
+.. _idiap: http://www.idiap.ch
+.. _ipython: http://ipython.scipy.org
+.. _lapack: http://www.netlib.org/lapack
+.. _latex: http://www.latex-project.org/
+.. _libjpeg: http://libjpeg.sourceforge.net/
+.. _libnetpbm: http://netpbm.sourceforge.net/doc/libnetpbm.html
+.. _libpng: http://libpng.org/pub/png/libpng.html
+.. _libsvm: http://www.csie.ntu.edu.tw/~cjlin/libsvm/
+.. _libtiff: http://www.remotesensing.org/libtiff/
+.. _giflib: http://giflib.sourceforge.net/
+.. _macports installation instructions: http://www.macports.org/install.php
+.. _macports: http://www.macports.org
+.. _matio: http://matio.sourceforge.net
+.. _matlab: http://www.mathworks.ch/products/matlab/
+.. _matplotlib: http://matplotlib.sourceforge.net
 .. _numpy: http://numpy.scipy.org
 .. _nose: http://nose.readthedocs.org
+.. _opencv: http://opencv.willowgarage.com/
+.. _pil: http://www.pythonware.com/products/pil/
+.. _pillow: https://pypi.python.org/pypi/Pillow/
+.. _python: http://www.python.org
 .. _pypi: http://pypi.python.org
+.. _qt4: http://qt.nokia.com/ 
+.. _satellite packages: https://github.com/idiap/bob/wiki/Satellite-Packages
 .. _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/
+.. _submit a new bug report: https://github.com/idiap/bob/issues
+.. _torch 3 vision: http://torch3vision.idiap.ch
+.. _torch 3: http://www.torch.ch
+.. _torch 5: http://torch5.sourceforge.net
+.. _torch: https://github.com/andresy/torch
+.. _vlfeat launchpad webpage: https://launchpad.net/~gezakovacs/+archive/vlfeat
+.. _vlfeat: http://www.vlfeat.org/
 
 .. Place here references to licenses
 
diff --git a/doc/py_api.rst b/doc/py_api.rst
index d375d9e6f74d342547e3996be9493e86aed1a9be..d29149c641e8a39ce26d4c16ef64863092771ef7 100644
--- a/doc/py_api.rst
+++ b/doc/py_api.rst
@@ -11,14 +11,500 @@
  User Guide
 ============
 
-Basic I/O
----------
+This section gives an overview of the operations for storing and retrieving the
+basic data structures in |project|, such as `NumPy`_ arrays. |project| uses
+`HDF5`_  format for storing binary coded data. Using the |project| support for
+`HDF5`_, it is very simple to import and export data.
+
+`HDF5`_  uses a neat descriptive language for representing the data in the HDF5
+files, called Data Description Language (`DDL`_).
+
+To perform the functionalities given in this section, you should have `NumPy`_
+and |project| loaded into the `Python`_ environment.
+
+.. testsetup:: *
+
+   import numpy
+   import xbob.io
+   import tempfile
+   import os
+
+   current_directory = os.path.realpath(os.curdir)
+   temp_dir = tempfile.mkdtemp(prefix='bob_doctest_')
+   os.chdir(temp_dir)
+
+HDF5 standard utilities
+-----------------------
+
+Before explaining the basics of reading and writing to `HDF5`_ files, it is
+important to list some `HDF5`_ standard utilities for checking the content of
+an `HDF5`_ file. These are supplied by the `HDF5`_ project.
+
+``h5dump``
+  Dumps the content of the file using the DDL.
+
+``h5ls``
+  Lists the content of the file using DDL, but does not show the data.
+
+``h5diff``
+  Finds the differences between HDF5 files.
+
+I/O operations using the class `xbob.io.HDF5File`
+-------------------------------------------------
+
+Writing operations
+------------------
+
+Let's take a look at how to write simple scalar data such as integers or
+floats.
+
+.. doctest::
+
+   >>> an_integer = 5
+   >>> a_float = 3.1416
+   >>> f = xbob.io.HDF5File('testfile1.hdf5', 'w')
+   >>> f.set('my_integer', an_integer)
+   >>> f.set('my_float', a_float)
+   >>> del f
+
+If after this you use the **h5dump** utility on the file ``testfile1.hdf5``,
+you will verify that the file now contains:
+
+.. code-block:: none
+
+  HDF5 "testfile1.hdf5" {
+  GROUP "/" {
+    DATASET "my_float" {
+       DATATYPE  H5T_IEEE_F64LE
+       DATASPACE  SIMPLE { ( 1 ) / ( 1 ) }
+       DATA {
+       (0): 3.1416
+       }
+    }
+    DATASET "my_integer" {
+       DATATYPE  H5T_STD_I32LE
+       DATASPACE  SIMPLE { ( 1 ) / ( 1 ) }
+       DATA {
+       (0): 5
+       }
+    }
+  }
+  }
+
+.. note::
+
+   In |project|, when you open a HDF5 file, you can choose one of the following
+   options:
+
+   **'r'** Open the file in reading mode; writing operations will fail (this is the default).
+
+   **'a'** Open the file in reading and writing mode with appending.
+
+   **'w'** Open the file in reading and writing mode, but truncate it.
+
+   **'x'** Read/write/append with exclusive access.
+
+The dump shows that there are two datasets inside a group named ``/`` in the
+file.  HDF5 groups are like file system directories. They create namespaces for
+the data. In the root group (or directory), you will find the two variables,
+named as you set them to be.  The variable names are the complete path to the
+location where they live. You could write a new variable in the same file but
+in a different directory like this:
+
+.. doctest::
+
+  >>> f = xbob.io.HDF5File('testfile1.hdf5', 'a')
+  >>> f.create_group('/test')
+  >>> f.set('/test/my_float', numpy.float32(6.28))
+  >>> del f
+
+Line 1 opens the file for reading and writing, but without truncating it. This
+will allow you to access the file contents. Next, the directory ``/test`` is
+created and a new variable is written inside the subdirectory. As you can
+verify, **for simple scalars**, you can also force the storage type. Where
+normally one would have a 64-bit real value, you can impose that this variable
+is saved as a 32-bit real value. You can verify the dump correctness with
+``h5dump``:
+
+.. code-block:: none
+
+  GROUP "/" {
+  ...
+   GROUP "test" {
+      DATASET "my_float" {
+         DATATYPE  H5T_IEEE_F32LE
+         DATASPACE  SIMPLE { ( 1 ) / ( 1 ) }
+         DATA {
+         (0): 6.28
+         }
+      }
+   }
+  }
+
+Notice the subdirectory ``test`` has been created and inside it a floating
+point number has been stored. Such a float point number has a 32-bit precision
+as it was defined.
+
+.. note::
+
+  If you need to place lots of variables in a subfolder, it may be better to
+  setup the prefix folder before starting the writing operations on the
+  :py:class:`xbob.io.HDF5File` object. You can do this using the method
+  :py:meth:`HDF5File.cd`.  Look up its help for more information and usage
+  instructions.
+
+Writing arrays is a little simpler as the :py:class:`numpy.ndarray` objects
+encode all the type information we need to write and read them correctly. Here
+is an example:
+
+.. doctest::
+
+  >>> A = numpy.array(range(4), 'int8').reshape(2,2)
+  >>> f = xbob.io.HDF5File('testfile1.hdf5', 'a')
+  >>> f.set('my_array', A)
+  >>> del f
+
+The result of running ``h5dump`` on the file ``testfile3.hdf5`` should be:
+
+.. code-block:: none
+
+  ...
+   DATASET "my_array" {
+      DATATYPE  H5T_STD_I8LE
+      DATASPACE  SIMPLE { ( 2, 2 ) / ( 2, 2 ) }
+      DATA {
+      (0,0): 0, 1,
+      (1,0): 2, 3
+      }
+   }
+  ...
+
+You don't need to limit yourself to single variables, you can also save lists
+of scalars and arrays using the function :py:meth:`xbob.io.HDF5.append` instead
+of :py:meth:`xbob.io.HDF5.set`.
+
+Reading operations
+------------------
+
+Reading data from a file that you just wrote to is just as easy. For this task
+you should use :py:meth:`xbob.io.HDF5File.read`. The read method will read all
+the contents of the variable pointed to by the given path. This is the normal
+way to read a variable you have written with :py:meth:`xbob.io.HDF5File.set`. If
+you decided to create a list of scalar or arrays, the way to read that up would
+be using :py:meth:`xbob.io.HDF5File.lread` instead. Here is an example:
+
+.. doctest::
+
+  >>> f = xbob.io.HDF5File('testfile1.hdf5') #read only
+  >>> f.read('my_integer') #reads integer
+  5
+  >>> print(f.read('my_array')) # reads the array
+  [[0 1]
+   [2 3]]
+  >>> del f
+
+Now let's look at an example where we have used
+:py:meth:`xbob.io.HDF5File.append` instead of :py:meth:`xbob.io.HDF5File.set`
+to write data to a file. That is normally the case when you write lists of
+variables to a dataset.
+
+.. doctest::
+
+  >>> f = xbob.io.HDF5File('testfile2.hdf5', 'w')
+  >>> f.append('arrayset', numpy.array(range(10), 'float64'))
+  >>> f.append('arrayset', 2*numpy.array(range(10), 'float64'))
+  >>> f.append('arrayset', 3*numpy.array(range(10), 'float64'))
+  >>> print(f.lread('arrayset', 0))
+  [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]
+  >>> print(f.lread('arrayset', 2))
+  [  0.   3.   6.   9.  12.  15.  18.  21.  24.  27.]
+  >>> del f
+
+This is what the ``h5dump`` of the file would look like:
+
+.. code-block:: none
+
+  HDF5 "testfile4.hdf5" {
+  GROUP "/" {
+     DATASET "arrayset" {
+        DATATYPE  H5T_IEEE_F64LE
+        DATASPACE  SIMPLE { ( 3, 10 ) / ( H5S_UNLIMITED, 10 ) }
+        DATA {
+        (0,0): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+        (1,0): 0, 2, 4, 6, 8, 10, 12, 14, 16, 18,
+        (2,0): 0, 3, 6, 9, 12, 15, 18, 21, 24, 27
+        }
+     }
+  }
+  }
+
+Notice that the expansion limits for the first dimension have been correctly
+set by |project| so you can insert an *unlimited* number of 1D float vectors.
+Of course, you can also read the whole contents of the arrayset in a single
+shot:
+
+.. doctest::
+
+  >>> f = xbob.io.HDF5File('testfile2.hdf5')
+  >>> print(f.read('arrayset'))
+  [[  0.   1.   2.   3.   4.   5.   6.   7.   8.   9.]
+   [  0.   2.   4.   6.   8.  10.  12.  14.  16.  18.]
+   [  0.   3.   6.   9.  12.  15.  18.  21.  24.  27.]]
+
+As you can see, the only difference between :py:meth:`xbob.io.HDF5File.read`
+and :py:meth:`xbob.io.HDF5File.lread` is on how |project| considers the
+available data (as a single array with N dimensions or as a set of arrays with
+N-1 dimensions). In the first example, you would have also been able to read
+the variable `my_array` as an arrayset using :py:meth:`xbob.io.HDF5File.lread`
+instead of :py:meth:`xbob.io.HDF5File.read`. In this case, each position
+readout would return a 1D uint8 array instead of a 2D array.
+
+Array interfaces
+----------------
+
+What we have shown so far is the generic API to read and write data using HDF5.
+You will use it when you want to import or export data from |project| into
+other software frameworks, debug your data or just implement your own classes
+that can serialize and de-serialize from HDF5 file containers. In |project|,
+most of the time you will be working with :py:class:`numpy.ndarrays`\s. In
+special situations though, you may be asked to handle
+:py:class:`xbob.io.File`\s. :py:class:`xbob.io.File` objects create a
+transparent connection between C++ (`Blitz++`_) / Python (`NumPy`_) arrays and
+file access.  You specify the filename from which you want to input data and
+the :py:class:`xbob.io.File` object decides what is the best codec to be used
+(from the extension) and how to read the data back into your array.
+
+To create an :py:class:`xbob.io.File` from a file path, just do the following:
+
+.. doctest::
+
+  >>> a = xbob.io.File('testfile2.hdf5', 'r')
+  >>> a.filename
+  'testfile2.hdf5'
+
+:py:class:`xbob.io.File`\s simulate containers for :py:class:`numpy.ndarray`\s,
+transparently accessing the file data when requested. Note, however, that when
+you instantiate an :py:class:`xbob.io.File` it does **not** load the file
+contents into memory. It waits until you emit another explicit instruction to
+do so. We do this with the :py:meth:`xbob.io.File.read` method:
+
+.. doctest::
+
+  >>> array = a.read()
+  >>> array
+  array([[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
+         [  0.,   2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.],
+         [  0.,   3.,   6.,   9.,  12.,  15.,  18.,  21.,  24.,  27.]])
+
+Every time you say :py:meth:`xbob.io.File.read`, the file contents will be read
+from the file and into a new array.
+
+Saving arrays to the :py:class:`xbob.io.File` is as easy, just call the
+:py:meth:`xbob.io.File.write` method:
+
+.. doctest::
+
+  >>> f = xbob.io.File('copy1.hdf5', 'w')
+  >>> f.write(a)
+
+Numpy ndarray shortcuts
+-----------------------
+
+To just load an :py:class:`numpy.ndarray` in memory, you can use a short cut
+that lives at :py:func:`xbob.io.load`. With it, you don't have to go through
+the :py:class:`xbob.io.File` container:
+
+.. doctest::
+
+  >>> t = xbob.io.load('testfile2.hdf5')
+  >>> t
+  array([[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
+         [  0.,   2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.],
+         [  0.,   3.,   6.,   9.,  12.,  15.,  18.,  21.,  24.,  27.]])
+
+You can also directly save :py:class:`numpy.ndarray`\s without going
+through the :py:class:`xbob.io.Array` container:
+
+.. doctest::
+
+  >>> xbob.io.save(t, 'copy2.hdf5')
+
+.. note::
+
+  Under the hood, we still use the :py:class:`xbob.io.File` API to execute
+  the read and write operations. Have a look at the manual section for
+  :py:mod:`xbob.io` for more details and other shortcuts available.
+
+Reading and writing images
+--------------------------
+
+|project| provides support to load and save data from many different file types
+including Matlab ``.mat`` files, various image file types and video data. File
+types and specific serialization and de-serialization is switched automatically
+using filename extensions. Knowing this, saving an array in a different format
+is just a matter of choosing the right extension. This is illustrated in the
+following example, where an image generated randomly using the method `NumPy`
+:py:meth:`numpy.random.random_integers`, is saved in JPEG format. The image
+must be of type uint8 or uint16.
+
+.. doctest::
+
+  >>> my_image = numpy.random.random_integers(0,255,(3,256,256))
+  >>> xbob.io.save(my_image.astype('uint8'), 'testimage.jpg') # saving the image in jpeg format
+  >>> my_image_copy = xbob.io.load('testimage.jpg')
+
+.. tip::
+
+  To find out about which formats and extensions are supported in a given
+  installation of |project|, just call ``bob_config.py`` on your prompt. It
+  will print a list of compiled-in software and supported extensions.
+
+The loaded image files can be 3D arrays (for RGB format) or 2D arrays (for
+greyscale) of type ``uint8`` or ``uint16``.
+
+Dealing with videos
+-------------------
+
+|project| has support for dealing with videos in an equivalent way to dealing
+with images:
+
+.. doctest::
+
+  >>> my_video = numpy.random.random_integers(0,255,(30,3,256,256))
+  >>> xbob.io.save(my_video.astype('uint8'), 'testvideo.avi') # saving the video avi format with a default codec
+  >>> my_video_copy = xbob.io.load('testvideo.avi')
+
+Video reading and writing is performed using an `FFmpeg`_ (or `libav`_ if
+`FFmpeg`_ is not available) bridge. |project|'s :py:meth:`xbob.io.save` method
+will allow you to choose the output format with the same extension mechanism as
+mentioned earlier. `FFmpeg`_ will then choose a default codec for the format
+and perform encoding. The output file can be as easily loaded using
+:py:meth:`xbob.io.load`.
+
+For finer control over the loading, saving, format and codecs used for a
+specific encoding or decoding operation, you must directly use either
+:py:class:`xbob.io.VideoReader` or :py:class:`xbob.io.VideoWriter` classes. For
+example, it is possible to use :py:class:`xbob.io.VideoReader` to read videos
+frame by frame and avoid overloading your machine's memory. In the following
+example you can see how to create a video, save it using the class
+:py:class:`xbob.io.VideoWriter` and load it again using the class
+:py:class:`xbob.io.VideoReader`. The created video will have 30 frames
+generated randomly.
+
+.. note::
+
+  Due to `FFmpeg`_ constrains, the width and height of the video need to be
+  multiples of two.
+
+.. doctest::
+
+  >>> width = 50; height = 50;
+  >>> framerate = 24
+  >>> outv = xbob.io.VideoWriter('testvideo.avi', height, width, framerate, codec='mpeg1video') # output video
+  >>> for i in range(0, 30):
+  ...   newframe = (numpy.random.random_integers(0,255,(3,height,width)))
+  ...   outv.append(newframe.astype('uint8'))
+  >>> outv.close()
+  >>> input = xbob.io.VideoReader('testvideo.avi')
+  >>> input.number_of_frames
+  30
+  >>> inv = input.load()
+  >>> inv.shape
+  (30, 3, 50, 50)
+  >>> type(inv)
+  <... 'numpy.ndarray'>
+
+Videos in |project| are represented as sequences of colored images, i.e. 4D
+arrays of type ``uint8``. All the extensions and formats for videos supported
+in version of |project| installed on your machine can be listed using the
+|project|'s utility ``bob_config.py``.
+
+.. testcleanup:: *
+
+  import shutil
+  os.chdir(current_directory)
+  shutil.rmtree(temp_dir)
+
+.. warning::
+
+  Please read :doc:`video` for details on choosing codecs and formats that are
+  adequate to your application, as well as drawbacks and pitfalls with video
+  encoding and decoding.
+
+Loading and saving Matlab data
+------------------------------
+
+An alternative for saving data in ``.mat`` files using :py:meth:`xbob.io.save`,
+would be to save them as a `HDF5`_ file which then can be easily read in
+Matlab. Similarly, instead of having to read ``.mat`` files using
+:py:meth:`xbob.io.load`, you can save your Matlab data in `HDF5`_ format, which
+then can be easily read from |project|. Detailed instructions about how to save
+and load data from Matlab to and from `HDF5`_ files can be found `here`__.
+
+.. _audiosignal:
+
+Loading and saving audio files
+------------------------------
+
+|project| does not yet support audio files (no wav codec). However, it is
+possible to use the `SciPy`_ module :py:mod:`scipy.io.wavfile` to do the job.
+For instance, to read a wave file, just use the
+:py:func:`scipy.io.wavfile.read` function.
+
+.. code-block:: python
+
+   >>> import scipy.io.wavfile
+   >>> filename = '/home/user/sample.wav'
+   >>> samplerate, data = scipy.io.wavfile.read(filename)
+   >>> print(type(data))
+   <... 'numpy.ndarray'>
+   >>> print(data.shape)
+   (132474, 2)
+
+In the above example, the stereo audio signal is represented as a 2D `NumPy`
+:py:class:`numpy.ndarray`. The first dimension corresponds to the time index
+(132474 frames) and the second dimesnion correpsonds to one of the audio
+channel (2 channels, stereo). The values in the array correpsond to the wave
+magnitudes.
+
+To save a `NumPy` :py:class:`numpy.ndarray` into a wave file, the
+:py:func:`scipy.io.wavfile.write` could be used, which also requires the
+framerate to be specified.
 
 Reference
 ---------
 
 This section includes information for using the pure Python API of ``xbob.io``.
 
+.. autoclass:: xbob.io.File
+
+.. autoclass:: xbob.io.HDF5File
+
+.. autoclass:: xbob.io.VideoReader
+
+.. autoclass:: xbob.io.VideoWriter
+
+.. autofunction:: xbob.io.load
+
+.. autofunction:: xbob.io.merge
+
+.. autofunction:: xbob.io.save
+
+.. autofunction:: xbob.io.append
+
+.. autofunction:: xbob.io.peek
+
+.. autofunction:: xbob.io.peek_all
+
+.. autofunction:: xbob.io.create_directories_save
+
 .. autofunction:: xbob.io.get_include
 
-.. autoclass:: xbob.io.file
+.. include:: links.rst
+
+.. Place here your external references
+
+.. _ddl: http://www.hdfgroup.org/HDF5/doc/ddl.html
+.. _matlab-hdf5: http://www.mathworks.ch/help/techdoc/ref/hdf5write.html
+__ matlab-hdf5_
+
diff --git a/doc/video.rst b/doc/video.rst
new file mode 100644
index 0000000000000000000000000000000000000000..ab72d859bed48b9d04d390edb9cf26ea6edade57
--- /dev/null
+++ b/doc/video.rst
@@ -0,0 +1,568 @@
+.. vim: set fileencoding=utf-8 :
+.. Andre Anjos <andre.anjos@idiap.ch>
+.. Wed 20 Mar 2013 11:30:02 CET 
+.. 
+.. Copyright (C) 2011-2013 Idiap Research Institute, Martigny, Switzerland
+.. 
+.. This program is free software: you can redistribute it and/or modify
+.. it under the terms of the GNU General Public License as published by
+.. the Free Software Foundation, version 3 of the License.
+.. 
+.. This program is distributed in the hope that it will be useful,
+.. but WITHOUT ANY WARRANTY; without even the implied warranty of
+.. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.. GNU General Public License for more details.
+.. 
+.. You should have received a copy of the GNU General Public License
+.. along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+=============================
+ Using Videos with |project|
+=============================
+
+Video read and write support in |project| uses FFmpeg_ as implementation
+backend. In Ubuntu-based distributions, FFmpeg_ was replaced by libav_, which
+is a fork based on FFmpeg_ version 0.8. |project| can detect and use libav_
+when FFmpeg_ is not available on the machine. We currently support a variety of
+FFmpeg_ (and libav_) releases, ranging from FFmpeg_ 0.5 until the most recent
+branches.
+
+FFmpeg_ (and libav_) provide a (reasonably) uniform API for reading and writing
+data into a variety of video container formats, using different video and audio
+codecs. |project| leverages on this API to propose a sub-range of formats and
+codecs that work well together, with low distortion patterns and accross
+platforms.
+
+.. note::
+
+  As much as we strive to make video formats and codecs available to all
+  platforms in which |project| is available, codecs, in particular may be
+  disabled by compilation options on FFmpeg_ or libav_, in which case |project|
+  builds will not be able to use them.
+
+.. note::
+
+  Currently, |project| does not support reading or writing of audio streams on
+  video data - only images.
+
+This section provides guidance in choosing a set of formats and codecs for your
+project, so you will be able to leverage the maximum from |project|.
+
+Codec and Format Availability
+-----------------------------
+
+To get a list of all FFmpeg_ (or libav_) supported formats for a given build of
+|project|, use the ``bob_video_test.py`` application:
+
+.. code-block:: sh
+
+  $ bob_video_test.py --list-all-codecs # lists all codecs available
+  
+  $ bob_video_test.py --list-all-formats # lists all formats available
+
+These listings represent all that is compiled with your current installation of
+FFmpeg_ or libav_. To list supported formats and codecs by |project| use
+another set of command-line options:
+
+.. code-block:: sh
+
+  $ bob_video_test.py --list-codecs # lists all codecs currently supported
+  
+  $ bob_video_test.py --list-formats # lists all formats currently supported
+
+The program ``bob_video_test.py`` can be used to run a sequence of tests using
+all combinations of *supported* formats and tests:
+
+.. code-block:: sh
+
+  $ bob_video_test.py # runs all tests
+
+This will run through all combinations of supported codecs and formats and will
+report average distortion figures for each of 4 different tests, which exercise
+different aspects of each combination of format and codec. Here is a an example
+output:
+
+.. code-block:: text
+
+  Video Encoding/Decoding Test Tool v1.2.0a0 (bob_video_test)
+  Settings:
+    Width    : 128 pixels
+    Height   : 128 pixels
+    Length   : 30 frames
+    Framerate: 30.000000 Hz
+  Legend:
+    C: Color test
+    N: Noise test
+    U: User test
+    S: Frameskip test
+  Running 4 test(s)...CSNU
+
+  =========== ===== ======= =======================================
+   test        fmt   codec   figure (lower means better quality)           
+  =========== ===== ======= =======================================
+   color       mov   h264    4.603 min=0.890@22 max=8.387@9
+   frameskip   mov   h264    0.108 min=0.009@11 max=0.344@0
+   noise       mov   h264    44.900 min=43.916@4 max=46.103@29
+   user        mov   h264    1.983 min=1.525@0 max=2.286@7 
+  =========== ===== ======= =======================================
+
+Each line in the output table represents the average distortion patterns for
+the particular test using the format and codec described. The lower the
+distortion, the better the combination of format and codecs is. Different tests
+have different levels of baseline performance. The figures above were obtained
+in a healthy (no know bugs) system, running libav_ 0.8.13 (Ubuntu 12.10). Each
+line indicates, besides the average distortion per frame, the minimum and the
+maximum obtained and in which frame (counting from 0 - zero), that figure was
+obtained.
+
+The video tests are made on temporary files that are discarded after the test
+is completed. You can use the option ``--output=<directory>`` to specify a
+directory in which the generated files will be saved. You can then go to these
+directories and explore potential problems you may find.
+
+Each test creates a video from an artificially generated test signal, encodes
+it using the defined format and codec and reads it back, comparing the output
+result with the original sequence. The sole exception is the ``user`` test. In
+this test, a user test sequence is (partially) loaded and tested. If you don't
+specify any sequence, a default sequence from |project| is used. If you want to
+test a specific sequence of your own, use ``--user-video`` to specify the path
+of the video sequence you want to test with. By default, only the first 10
+frames of the sequence are used for the test, to speed-up execution. You can
+change this behavior with the option ``--user-frames``. Here is an example:
+
+.. code-block:: sh
+
+  $ bob_video_test.py --user-video=test_sample.avi
+
+All tests are executed by default, on all combination of formats and codecs.
+That can be long. You can limit the test execution by properly choosing the
+format (``--format``), the codec (``--codec``) and the tests to execute. For
+example:
+
+.. code-block:: sh
+  
+  # execute only the user video test with a user provided video and
+  # using the H.264 built-in codec and a MOV output file format.
+  $ xbob_video_test.py --format mov --codec h264 --user-video=test_sample.avi -- user
+
+.. note::
+
+  Not all codecs can be used by all formats available. For example, the ``mp4``
+  file format cannot use the ``vp8`` codec, even if both are supported by
+  |project|. To know which formats support each codec, you can execute the
+  following python code:
+
+  .. code-block:: python
+
+    import xbob.io
+    xbob.io.supported_videowriter_formats()['mp4']['supported_codecs'].keys()
+    ['h264', 'libx264', 'mjpeg', 'mpeg1video']
+
+  You can see from the output command that only 4 codecs are supported by the
+  file format ``mp4``.
+
+You can test new combinations of formats and codecs which are not currently
+supported by |project|, as long as they are supported by the underlying FFmpeg_
+or libav_ installations. In this case, just specify the format and/or codec
+names using ``--format`` and ``--codec`` options in the application
+``xbob_video_test.py``. The advantage of using *supported* formats and codecs is
+that we make sure a minimal distortion figure is respected in all platform
+nightly builds, with our unit and integration tests. We cannot, currently,
+test all possible combinations of codecs and formats.
+
+Know Your Platforms
+-------------------
+
+One important aspect when working with videos is to know there will be some
+lossy compression applied to the output. This means you will **loose**
+information when re-encoding. When working with videos, you will want to choose
+the combination of format and codec that will work well accross different
+platforms. We recommend to run ``xbob_video_test.py`` with a few of your video
+inputs to make sure they can be decoded with low distortion where you plan to
+work.
+
+.. note::
+
+  The only codec that supports lossless compression in |project| is ``zlib``.
+  Of course, the output files are considerably bigger, but they continue to be
+  readable using any FFmpeg_-based movie player or even QuickTime (on OSX), if
+  Perian is installed.
+
+Example Output in Different Platforms
+-------------------------------------
+
+In what follows, you will find some tabbed output for different combinations of
+operating systems and FFmpeg_/libav_ versions. To run these tests we only
+executed:
+
+.. code-block:: sh
+
+  $ xbob_video_test.py
+
+Idiap Linux (Xubuntu), version 12.10 + libav 0.8.3
+==================================================
+
+=========== ===== ============ ================================================
+ test        fmt     codec      figure (lower means better quality)           
+=========== ===== ============ ================================================
+ color       avi   ffv1         4.569 min=0.888\@22 max=8.377\@9                
+ color       avi   h264         4.603 min=0.890\@22 max=8.388\@9                
+ color       avi   libvpx       4.657 min=0.955\@26 max=8.528\@9                
+ color       avi   libx264      4.603 min=0.890\@22 max=8.388\@9                
+ color       avi   mjpeg        4.676 min=0.965\@22 max=8.469\@9                
+ color       avi   mpeg1video   4.781 min=1.103\@28 max=8.483\@9                
+ color       avi   mpeg2video   4.741 min=1.004\@16 max=8.466\@9                
+ color       avi   mpeg4        4.892 min=1.087\@24 max=8.658\@9                
+ color       avi   msmpeg4      4.921 min=1.073\@24 max=8.717\@9                
+ color       avi   msmpeg4v2    4.921 min=1.073\@24 max=9.181\@17               
+ color       avi   vp8          4.657 min=0.955\@26 max=8.528\@9                
+ color       avi   wmv1         4.871 min=1.087\@24 max=8.729\@9                
+ color       avi   wmv2         4.884 min=1.093\@24 max=8.823\@9                
+ color       avi   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ color       mov   ffv1         4.569 min=0.888\@22 max=8.377\@9                
+ color       mov   h264         4.603 min=0.890\@22 max=8.387\@9                
+ color       mov   libvpx       4.657 min=0.955\@26 max=8.528\@9                
+ color       mov   libx264      4.603 min=0.890\@22 max=8.387\@9                
+ color       mov   mjpeg        4.676 min=0.965\@22 max=8.469\@9                
+ color       mov   mpeg1video   4.781 min=1.103\@28 max=8.483\@9                
+ color       mov   mpeg2video   4.741 min=1.004\@16 max=8.466\@9                
+ color       mov   mpeg4        4.892 min=1.087\@24 max=8.658\@9                
+ color       mov   msmpeg4      4.921 min=1.073\@24 max=8.717\@9                
+ color       mov   msmpeg4v2    4.921 min=1.073\@24 max=9.181\@17               
+ color       mov   vp8          4.657 min=0.955\@26 max=8.528\@9                
+ color       mov   wmv1         4.871 min=1.087\@24 max=8.729\@9                
+ color       mov   wmv2         4.884 min=1.093\@24 max=8.823\@9                
+ color       mov   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ color       mp4   ffv1         format+codec unsupported                      
+ color       mp4   h264         4.603 min=0.890\@22 max=8.387\@9                
+ color       mp4   libvpx       format+codec unsupported                      
+ color       mp4   libx264      4.603 min=0.890\@22 max=8.387\@9                
+ color       mp4   mjpeg        4.676 min=0.965\@22 max=8.469\@9                
+ color       mp4   mpeg1video   4.781 min=1.103\@28 max=8.483\@9                
+ color       mp4   mpeg2video   4.741 min=1.004\@16 max=8.466\@9                
+ color       mp4   mpeg4        4.892 min=1.087\@24 max=8.658\@9                
+ color       mp4   msmpeg4      format+codec unsupported                      
+ color       mp4   msmpeg4v2    format+codec unsupported                      
+ color       mp4   vp8          format+codec unsupported                      
+ color       mp4   wmv1         format+codec unsupported                      
+ color       mp4   wmv2         format+codec unsupported                      
+ color       mp4   zlib         format+codec unsupported                      
+ frameskip   avi   ffv1         0.018 min=0.002\@11 max=0.029\@8                
+ frameskip   avi   h264         0.108 min=0.009\@11 max=0.344\@0                
+ frameskip   avi   libvpx       0.129 min=0.042\@11 max=0.198\@8                
+ frameskip   avi   libx264      0.108 min=0.009\@11 max=0.344\@0                
+ frameskip   avi   mjpeg        0.380 min=0.141\@11 max=1.108\@0                
+ frameskip   avi   mpeg1video   0.426 min=0.237\@17 max=1.338\@0                
+ frameskip   avi   mpeg2video   0.411 min=0.223\@15 max=1.284\@0                
+ frameskip   avi   mpeg4        0.454 min=0.263\@17 max=0.858\@0                
+ frameskip   avi   msmpeg4      1.684 min=0.257\@12 max=3.766\@15               
+ frameskip   avi   msmpeg4v2    1.683 min=0.257\@12 max=3.765\@15               
+ frameskip   avi   vp8          0.129 min=0.042\@11 max=0.198\@8                
+ frameskip   avi   wmv1         0.627 min=0.191\@11 max=1.568\@8                
+ frameskip   avi   wmv2         0.626 min=0.191\@11 max=1.566\@8                
+ frameskip   avi   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ frameskip   mov   ffv1         0.018 min=0.002\@11 max=0.029\@8                
+ frameskip   mov   h264         0.108 min=0.009\@11 max=0.344\@0                
+ frameskip   mov   libvpx       0.129 min=0.042\@11 max=0.198\@8                
+ frameskip   mov   libx264      0.108 min=0.009\@11 max=0.344\@0                
+ frameskip   mov   mjpeg        0.380 min=0.141\@11 max=1.108\@0                
+ frameskip   mov   mpeg1video   0.426 min=0.237\@17 max=1.338\@0                
+ frameskip   mov   mpeg2video   0.411 min=0.223\@15 max=1.284\@0                
+ frameskip   mov   mpeg4        0.454 min=0.263\@17 max=0.858\@0                
+ frameskip   mov   msmpeg4      1.684 min=0.257\@12 max=3.766\@15               
+ frameskip   mov   msmpeg4v2    1.683 min=0.257\@12 max=3.765\@15               
+ frameskip   mov   vp8          0.129 min=0.042\@11 max=0.198\@8                
+ frameskip   mov   wmv1         0.627 min=0.191\@11 max=1.568\@8                
+ frameskip   mov   wmv2         0.626 min=0.191\@11 max=1.566\@8                
+ frameskip   mov   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ frameskip   mp4   ffv1         format+codec unsupported                      
+ frameskip   mp4   h264         0.108 min=0.009\@11 max=0.344\@0                
+ frameskip   mp4   libvpx       format+codec unsupported                      
+ frameskip   mp4   libx264      0.108 min=0.009\@11 max=0.344\@0                
+ frameskip   mp4   mjpeg        0.380 min=0.141\@11 max=1.108\@0                
+ frameskip   mp4   mpeg1video   0.426 min=0.237\@17 max=1.338\@0                
+ frameskip   mp4   mpeg2video   0.411 min=0.223\@15 max=1.284\@0                
+ frameskip   mp4   mpeg4        0.454 min=0.263\@17 max=0.858\@0                
+ frameskip   mp4   msmpeg4      format+codec unsupported                      
+ frameskip   mp4   msmpeg4v2    format+codec unsupported                      
+ frameskip   mp4   vp8          format+codec unsupported                      
+ frameskip   mp4   wmv1         format+codec unsupported                      
+ frameskip   mp4   wmv2         format+codec unsupported                      
+ frameskip   mp4   zlib         format+codec unsupported                      
+ noise       avi   ffv1         44.192 min=43.887\@0 max=44.568\@8              
+ noise       avi   h264         44.882 min=43.738\@2 max=45.848\@27             
+ noise       avi   libvpx       48.629 min=44.156\@12 max=54.365\@27            
+ noise       avi   libx264      44.883 min=44.089\@2 max=45.857\@29             
+ noise       avi   mjpeg        45.723 min=43.942\@3 max=48.283\@28             
+ noise       avi   mpeg1video   46.270 min=44.412\@2 max=48.632\@29             
+ noise       avi   mpeg2video   45.227 min=44.008\@5 max=48.528\@29             
+ noise       avi   mpeg4        45.769 min=43.720\@4 max=48.472\@27             
+ noise       avi   msmpeg4      45.757 min=44.034\@7 max=48.055\@24             
+ noise       avi   msmpeg4v2    45.789 min=43.908\@6 max=48.423\@27             
+ noise       avi   vp8          48.796 min=43.765\@0 max=50.864\@15             
+ noise       avi   wmv1         45.729 min=43.878\@6 max=47.921\@29             
+ noise       avi   wmv2         46.105 min=44.205\@3 max=48.261\@28             
+ noise       avi   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ noise       mov   ffv1         44.200 min=43.869\@20 max=44.719\@22            
+ noise       mov   h264         44.882 min=43.991\@6 max=46.183\@27             
+ noise       mov   libvpx       48.692 min=43.934\@0 max=50.906\@15             
+ noise       mov   libx264      44.909 min=43.773\@3 max=46.079\@29             
+ noise       mov   mjpeg        45.754 min=43.823\@8 max=48.278\@28             
+ noise       mov   mpeg1video   46.353 min=44.326\@1 max=48.712\@29             
+ noise       mov   mpeg2video   45.970 min=43.952\@4 max=50.645\@29             
+ noise       mov   mpeg4        45.772 min=43.961\@4 max=48.414\@28             
+ noise       mov   msmpeg4      45.764 min=43.867\@5 max=48.156\@29             
+ noise       mov   msmpeg4v2    45.844 min=44.009\@6 max=48.317\@27             
+ noise       mov   vp8          48.323 min=43.985\@12 max=50.512\@19            
+ noise       mov   wmv1         45.803 min=44.109\@3 max=48.334\@29             
+ noise       mov   wmv2         46.081 min=43.950\@4 max=48.293\@26             
+ noise       mov   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ noise       mp4   ffv1         format+codec unsupported                      
+ noise       mp4   h264         44.856 min=43.749\@1 max=46.045\@27             
+ noise       mp4   libvpx       format+codec unsupported                      
+ noise       mp4   libx264      44.785 min=43.820\@0 max=46.093\@28             
+ noise       mp4   mjpeg        45.725 min=43.979\@7 max=48.208\@28             
+ noise       mp4   mpeg1video   46.227 min=44.144\@2 max=48.241\@27             
+ noise       mp4   mpeg2video   46.060 min=43.991\@5 max=51.358\@29             
+ noise       mp4   mpeg4        45.690 min=44.072\@6 max=47.974\@28             
+ noise       mp4   msmpeg4      format+codec unsupported                      
+ noise       mp4   msmpeg4v2    format+codec unsupported                      
+ noise       mp4   vp8          format+codec unsupported                      
+ noise       mp4   wmv1         format+codec unsupported                      
+ noise       mp4   wmv2         format+codec unsupported                      
+ noise       mp4   zlib         format+codec unsupported                      
+ user        avi   ffv1         1.174 min=1.166\@2 max=1.187\@7                 
+ user        avi   h264         1.988 min=1.525\@0 max=2.290\@7                 
+ user        avi   libvpx       1.614 min=1.464\@0 max=1.711\@8                 
+ user        avi   libx264      1.988 min=1.525\@0 max=2.290\@7                 
+ user        avi   mjpeg        1.067 min=1.014\@2 max=1.444\@0                 
+ user        avi   mpeg1video   1.586 min=1.447\@1 max=1.895\@0                 
+ user        avi   mpeg2video   1.743 min=1.515\@3 max=1.891\@8                 
+ user        avi   mpeg4        1.794 min=1.606\@1 max=1.906\@9                 
+ user        avi   msmpeg4      1.802 min=1.599\@1 max=1.925\@8                 
+ user        avi   msmpeg4v2    1.775 min=1.599\@1 max=1.868\@9                 
+ user        avi   vp8          1.614 min=1.464\@0 max=1.711\@8                 
+ user        avi   wmv1         1.802 min=1.599\@1 max=1.925\@8                 
+ user        avi   wmv2         1.799 min=1.596\@1 max=1.921\@8                 
+ user        avi   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ user        mov   ffv1         1.174 min=1.166\@2 max=1.187\@7                 
+ user        mov   h264         1.983 min=1.525\@0 max=2.286\@7                 
+ user        mov   libvpx       1.614 min=1.464\@0 max=1.711\@8                 
+ user        mov   libx264      1.983 min=1.525\@0 max=2.286\@7                 
+ user        mov   mjpeg        1.067 min=1.014\@2 max=1.444\@0                 
+ user        mov   mpeg1video   1.586 min=1.447\@1 max=1.895\@0                 
+ user        mov   mpeg2video   1.743 min=1.515\@3 max=1.891\@8                 
+ user        mov   mpeg4        1.794 min=1.606\@1 max=1.906\@9                 
+ user        mov   msmpeg4      1.802 min=1.599\@1 max=1.925\@8                 
+ user        mov   msmpeg4v2    1.775 min=1.599\@1 max=1.868\@9                 
+ user        mov   vp8          1.614 min=1.464\@0 max=1.711\@8                 
+ user        mov   wmv1         1.802 min=1.599\@1 max=1.925\@8                 
+ user        mov   wmv2         1.799 min=1.596\@1 max=1.921\@8                 
+ user        mov   zlib         0.000 min=0.000\@0 max=0.000\@0                 
+ user        mp4   ffv1         format+codec unsupported                      
+ user        mp4   h264         1.983 min=1.525\@0 max=2.286\@7                 
+ user        mp4   libvpx       format+codec unsupported                      
+ user        mp4   libx264      1.983 min=1.525\@0 max=2.286\@7                 
+ user        mp4   mjpeg        1.067 min=1.014\@2 max=1.444\@0                 
+ user        mp4   mpeg1video   1.586 min=1.447\@1 max=1.895\@0                 
+ user        mp4   mpeg2video   1.743 min=1.515\@3 max=1.891\@8                 
+ user        mp4   mpeg4        1.794 min=1.606\@1 max=1.906\@9                 
+ user        mp4   msmpeg4      format+codec unsupported                      
+ user        mp4   msmpeg4v2    format+codec unsupported                      
+ user        mp4   vp8          format+codec unsupported                      
+ user        mp4   wmv1         format+codec unsupported                      
+ user        mp4   wmv2         format+codec unsupported                      
+ user        mp4   zlib         format+codec unsupported                      
+=========== ===== ============ ================================================
+
+MacOSX 10.8.3 + FFmpeg 1.1.2
+============================
+
+=========== ===== ================== ========================================
+ test        fmt   codec              figure (lower is better quality)
+=========== ===== ================== ========================================
+ color       avi   ffv1               4.643 min=0.999\@24 max=8.420\@9
+ color       avi   h264               4.685 min=1.001\@24 max=8.473\@9
+ color       avi   libvpx             4.736 min=1.079\@26 max=8.503\@9
+ color       avi   libx264            4.685 min=1.001\@24 max=8.473\@9
+ color       avi   mjpeg              4.617 min=0.934\@24 max=8.440\@9
+ color       avi   mpeg1video         4.820 min=1.125\@16 max=8.548\@9
+ color       avi   mpeg2video         4.787 min=1.130\@16 max=8.465\@9
+ color       avi   mpeg4              4.956 min=1.129\@24 max=8.725\@9
+ color       avi   mpegvideo          4.787 min=1.130\@16 max=8.465\@9
+ color       avi   msmpeg4            4.987 min=1.114\@24 max=8.731\@9
+ color       avi   msmpeg4v2          4.949 min=1.114\@24 max=8.667\@9
+ color       avi   vp8                4.736 min=1.079\@26 max=8.503\@9
+ color       avi   wmv1               4.925 min=1.129\@24 max=8.728\@9
+ color       avi   wmv2               4.936 min=1.138\@24 max=8.796\@9
+ color       avi   zlib               0.000 min=0.000\@0 max=0.000\@0
+ color       mov   ffv1               4.643 min=0.999\@24 max=8.420\@9
+ color       mov   h264               4.645 min=1.001\@24 max=8.424\@9
+ color       mov   libvpx             4.736 min=1.079\@26 max=8.503\@9
+ color       mov   libx264            4.645 min=1.001\@24 max=8.424\@9
+ color       mov   mjpeg              4.617 min=0.934\@24 max=8.440\@9
+ color       mov   mpeg1video         4.820 min=1.125\@16 max=8.548\@9
+ color       mov   mpeg2video         4.787 min=1.130\@16 max=8.465\@9
+ color       mov   mpeg4              4.956 min=1.129\@24 max=8.725\@9
+ color       mov   mpegvideo          4.787 min=1.130\@16 max=8.465\@9
+ color       mov   msmpeg4            4.987 min=1.114\@24 max=8.731\@9
+ color       mov   msmpeg4v2          4.949 min=1.114\@24 max=8.667\@9
+ color       mov   vp8                4.736 min=1.079\@26 max=8.503\@9
+ color       mov   wmv1               4.925 min=1.129\@24 max=8.728\@9
+ color       mov   wmv2               4.936 min=1.138\@24 max=8.796\@9
+ color       mov   zlib               0.000 min=0.000\@0 max=0.000\@0
+ color       mp4   ffv1               format+codec unsupported
+ color       mp4   h264               4.645 min=1.001\@24 max=8.424\@9
+ color       mp4   libvpx             format+codec unsupported
+ color       mp4   libx264            4.645 min=1.001\@24 max=8.424\@9
+ color       mp4   mjpeg              4.617 min=0.934\@24 max=8.440\@9
+ color       mp4   mpeg1video         4.820 min=1.125\@16 max=8.548\@9
+ color       mp4   mpeg2video         4.787 min=1.130\@16 max=8.465\@9
+ color       mp4   mpeg4              4.956 min=1.129\@24 max=8.725\@9
+ color       mp4   mpegvideo          4.787 min=1.130\@16 max=8.465\@9
+ color       mp4   msmpeg4            format+codec unsupported
+ color       mp4   msmpeg4v2          format+codec unsupported
+ color       mp4   vp8                format+codec unsupported
+ color       mp4   wmv1               format+codec unsupported
+ color       mp4   wmv2               format+codec unsupported
+ color       mp4   zlib               format+codec unsupported
+ frameskip   avi   ffv1               0.018 min=0.002\@11 max=0.029\@8
+ frameskip   avi   h264               0.120 min=0.017\@21 max=0.300\@0
+ frameskip   avi   libvpx             0.122 min=0.051\@11 max=0.181\@0
+ frameskip   avi   libx264            0.120 min=0.017\@21 max=0.300\@0
+ frameskip   avi   mjpeg              0.386 min=0.147\@11 max=1.085\@0
+ frameskip   avi   mpeg1video         0.427 min=0.243\@11 max=1.310\@0
+ frameskip   avi   mpeg2video         0.408 min=0.229\@17 max=1.258\@0
+ frameskip   avi   mpeg4              0.456 min=0.253\@12 max=0.849\@0
+ frameskip   avi   mpegvideo          0.408 min=0.229\@17 max=1.258\@0
+ frameskip   avi   msmpeg4            1.608 min=0.434\@24 max=3.409\@25
+ frameskip   avi   msmpeg4v2          1.600 min=0.434\@24 max=3.708\@5
+ frameskip   avi   vp8                0.122 min=0.051\@11 max=0.181\@0
+ frameskip   avi   wmv1               0.617 min=0.191\@11 max=1.981\@8
+ frameskip   avi   wmv2               0.614 min=0.191\@11 max=1.978\@8
+ frameskip   avi   zlib               0.000 min=0.000\@0 max=0.000\@0
+ frameskip   mov   ffv1               0.018 min=0.002\@11 max=0.029\@8
+ frameskip   mov   h264               0.042 min=0.011\@11 max=0.085\@9
+ frameskip   mov   libvpx             0.122 min=0.051\@11 max=0.181\@0
+ frameskip   mov   libx264            0.042 min=0.011\@11 max=0.085\@9
+ frameskip   mov   mjpeg              0.386 min=0.147\@11 max=1.085\@0
+ frameskip   mov   mpeg1video         0.427 min=0.243\@11 max=1.310\@0
+ frameskip   mov   mpeg2video         0.408 min=0.229\@17 max=1.258\@0
+ frameskip   mov   mpeg4              0.456 min=0.253\@12 max=0.849\@0
+ frameskip   mov   mpegvideo          0.408 min=0.229\@17 max=1.258\@0
+ frameskip   mov   msmpeg4            1.608 min=0.434\@24 max=3.409\@25
+ frameskip   mov   msmpeg4v2          1.600 min=0.434\@24 max=3.708\@5
+ frameskip   mov   vp8                0.122 min=0.051\@11 max=0.181\@0
+ frameskip   mov   wmv1               0.617 min=0.191\@11 max=1.981\@8
+ frameskip   mov   wmv2               0.614 min=0.191\@11 max=1.978\@8
+ frameskip   mov   zlib               0.000 min=0.000\@0 max=0.000\@0
+ frameskip   mp4   ffv1               format+codec unsupported
+ frameskip   mp4   h264               0.042 min=0.011\@11 max=0.085\@9
+ frameskip   mp4   libvpx             format+codec unsupported
+ frameskip   mp4   libx264            0.042 min=0.011\@11 max=0.085\@9
+ frameskip   mp4   mjpeg              0.386 min=0.147\@11 max=1.085\@0
+ frameskip   mp4   mpeg1video         0.427 min=0.243\@11 max=1.310\@0
+ frameskip   mp4   mpeg2video         0.408 min=0.229\@17 max=1.258\@0
+ frameskip   mp4   mpeg4              0.456 min=0.253\@12 max=0.849\@0
+ frameskip   mp4   mpegvideo          0.408 min=0.229\@17 max=1.258\@0
+ frameskip   mp4   msmpeg4            format+codec unsupported
+ frameskip   mp4   msmpeg4v2          format+codec unsupported
+ frameskip   mp4   vp8                format+codec unsupported
+ frameskip   mp4   wmv1               format+codec unsupported
+ frameskip   mp4   wmv2               format+codec unsupported
+ frameskip   mp4   zlib               format+codec unsupported
+ noise       avi   ffv1               44.108 min=43.717\@16 max=44.565\@22
+ noise       avi   h264               44.509 min=43.859\@4 max=45.146\@27
+ noise       avi   libvpx             46.882 min=43.812\@1 max=49.422\@18
+ noise       avi   libx264            44.572 min=43.917\@5 max=45.236\@29
+ noise       avi   mjpeg              45.739 min=43.819\@4 max=48.211\@29
+ noise       avi   mpeg1video         46.320 min=44.273\@3 max=48.996\@29
+ noise       avi   mpeg2video         46.054 min=43.987\@7 max=51.580\@29
+ noise       avi   mpeg4              45.755 min=44.071\@2 max=48.502\@28
+ noise       avi   mpegvideo          44.951 min=43.775\@1 max=46.796\@24
+ noise       avi   msmpeg4            45.749 min=43.934\@5 max=48.267\@29
+ noise       avi   msmpeg4v2          45.846 min=43.987\@0 max=48.264\@27
+ noise       avi   vp8                46.457 min=43.931\@12 max=48.857\@27
+ noise       avi   wmv1               45.804 min=44.219\@10 max=48.252\@28
+ noise       avi   wmv2               46.091 min=44.113\@3 max=48.380\@25
+ noise       avi   zlib               0.000 min=0.000\@0 max=0.000\@0
+ noise       mov   ffv1               44.128 min=43.657\@15 max=44.513\@21
+ noise       mov   h264               44.168 min=43.794\@24 max=44.577\@7
+ noise       mov   libvpx             47.009 min=44.127\@4 max=49.547\@17
+ noise       mov   libx264            44.143 min=43.813\@23 max=44.529\@16
+ noise       mov   mjpeg              44.378 min=44.020\@18 max=44.670\@0
+ noise       mov   mpeg1video         44.564 min=43.903\@9 max=45.314\@0
+ noise       mov   mpeg2video         44.340 min=44.021\@26 max=44.733\@0
+ noise       mov   mpeg4              44.338 min=43.923\@3 max=44.677\@11
+ noise       mov   mpegvideo          44.343 min=43.978\@8 max=44.904\@29
+ noise       mov   msmpeg4            44.293 min=43.870\@9 max=44.669\@24
+ noise       mov   msmpeg4v2          44.256 min=43.859\@5 max=44.596\@21
+ noise       mov   vp8                47.558 min=43.955\@0 max=52.720\@25
+ noise       mov   wmv1               44.283 min=43.848\@24 max=44.643\@14
+ noise       mov   wmv2               44.323 min=43.957\@10 max=44.727\@0
+ noise       mov   zlib               0.000 min=0.000\@0 max=0.000\@0
+ noise       mp4   ffv1               format+codec unsupported
+ noise       mp4   h264               44.118 min=43.717\@18 max=44.439\@1
+ noise       mp4   libvpx             format+codec unsupported
+ noise       mp4   libx264            44.218 min=43.870\@8 max=44.730\@19
+ noise       mp4   mjpeg              44.374 min=44.061\@2 max=44.902\@0
+ noise       mp4   mpeg1video         44.537 min=44.157\@18 max=45.222\@0
+ noise       mp4   mpeg2video         44.397 min=43.834\@5 max=44.825\@0
+ noise       mp4   mpeg4              44.276 min=43.875\@9 max=44.912\@17
+ noise       mp4   mpegvideo          44.339 min=43.812\@2 max=45.328\@0
+ noise       mp4   msmpeg4            format+codec unsupported
+ noise       mp4   msmpeg4v2          format+codec unsupported
+ noise       mp4   vp8                format+codec unsupported
+ noise       mp4   wmv1               format+codec unsupported
+ noise       mp4   wmv2               format+codec unsupported
+ noise       mp4   zlib               format+codec unsupported
+ user        avi   ffv1               1.463 min=1.457\@5 max=1.472\@7
+ user        avi   h264               2.028 min=1.666\@0 max=2.201\@9
+ user        avi   libvpx             1.999 min=1.646\@0 max=2.420\@2
+ user        avi   libx264            2.028 min=1.666\@0 max=2.201\@9
+ user        avi   mjpeg              1.197 min=1.149\@6 max=1.532\@0
+ user        avi   mpeg1video         1.760 min=1.641\@1 max=2.061\@0
+ user        avi   mpeg2video         1.882 min=1.694\@3 max=2.026\@0
+ user        avi   mpeg4              1.960 min=1.782\@1 max=2.076\@9
+ user        avi   mpegvideo          1.882 min=1.694\@3 max=2.026\@0
+ user        avi   msmpeg4            1.964 min=1.773\@1 max=2.088\@8
+ user        avi   msmpeg4v2          1.921 min=1.773\@1 max=2.008\@9
+ user        avi   vp8                1.999 min=1.646\@0 max=2.420\@2
+ user        avi   wmv1               1.964 min=1.773\@1 max=2.088\@8
+ user        avi   wmv2               1.958 min=1.768\@1 max=2.082\@8
+ user        avi   zlib               0.000 min=0.000\@0 max=0.000\@0
+ user        mov   ffv1               1.463 min=1.457\@5 max=1.472\@7
+ user        mov   h264               1.533 min=1.477\@0 max=1.566\@7
+ user        mov   libvpx             2.103 min=1.646\@0 max=2.547\@2
+ user        mov   libx264            1.533 min=1.477\@0 max=1.566\@7
+ user        mov   mjpeg              1.197 min=1.149\@6 max=1.532\@0
+ user        mov   mpeg1video         1.760 min=1.641\@1 max=2.061\@0
+ user        mov   mpeg2video         1.882 min=1.694\@3 max=2.026\@0
+ user        mov   mpeg4              1.960 min=1.782\@1 max=2.076\@9
+ user        mov   mpegvideo          1.882 min=1.694\@3 max=2.026\@0
+ user        mov   msmpeg4            1.964 min=1.773\@1 max=2.088\@8
+ user        mov   msmpeg4v2          1.921 min=1.773\@1 max=2.008\@9
+ user        mov   vp8                2.103 min=1.646\@0 max=2.547\@2
+ user        mov   wmv1               1.964 min=1.773\@1 max=2.088\@8
+ user        mov   wmv2               1.958 min=1.768\@1 max=2.082\@8
+ user        mov   zlib               0.000 min=0.000\@0 max=0.000\@0
+ user        mp4   ffv1               format+codec unsupported
+ user        mp4   h264               1.533 min=1.477\@0 max=1.566\@7
+ user        mp4   libvpx             format+codec unsupported
+ user        mp4   libx264            1.533 min=1.477\@0 max=1.566\@7
+ user        mp4   mjpeg              1.197 min=1.149\@6 max=1.532\@0
+ user        mp4   mpeg1video         1.760 min=1.641\@1 max=2.061\@0
+ user        mp4   mpeg2video         1.882 min=1.694\@3 max=2.026\@0
+ user        mp4   mpeg4              1.960 min=1.782\@1 max=2.076\@9
+ user        mp4   mpegvideo          1.882 min=1.694\@3 max=2.026\@0
+ user        mp4   msmpeg4            format+codec unsupported
+ user        mp4   msmpeg4v2          format+codec unsupported
+ user        mp4   vp8                format+codec unsupported
+ user        mp4   wmv1               format+codec unsupported
+ user        mp4   wmv2               format+codec unsupported
+ user        mp4   zlib               format+codec unsupported
+=========== ===== ================== ========================================
+
+.. include:: links.rst
+
+.. Place here your external references
diff --git a/xbob/io/hdf5.cpp b/xbob/io/hdf5.cpp
index d4c8bd4f3da7b0c5973384ba104ed28a64606e8f..0deb128834c7c3657c9edc34fe38302182ccd94f 100644
--- a/xbob/io/hdf5.cpp
+++ b/xbob/io/hdf5.cpp
@@ -40,7 +40,7 @@ cross-architecture format.\n\
 \n\
 Objects of this class allows users to read and write data from\n\
 and to files in HDF5 format. For an introduction to HDF5, visit\n\
-the `HDF5 Website<http://www.hdfgroup.org/HDF5>`_.\n\
+the `HDF5 Website <http://www.hdfgroup.org/HDF5>`_.\n\
 \n\
 ");
 
diff --git a/xbob/io/videoreader.cpp b/xbob/io/videoreader.cpp
index 24216e2b2368f709fd85947e09ed7c241b362023..e86ede81b6a2a685244034f7d90d7d986baf6bdf 100644
--- a/xbob/io/videoreader.cpp
+++ b/xbob/io/videoreader.cpp
@@ -41,14 +41,15 @@ implementation uses `FFmpeg <http://ffmpeg.org>`_ (or\n\
 a stable freely available video encoding and decoding library,\n\
 designed specifically for these tasks. You can read an entire\n\
 video in memory by using the 'load()' method or use iterators\n\
-to read it frame by frame and avoid overloading your machine's\n\
-memory. The maximum precision data `FFmpeg` will yield is a 24-bit\n\
+to read it frame by frame and avoid overloading your machine\'s\n\
+memory. The maximum precision data `FFmpeg`_ will yield is a 24-bit\n\
 (8-bit per band) representation of each pixel (32-bit depths are\n\
-also supported by `FFmpeg`, but not by this extension presently).\n\
+also supported by `FFmpeg`_, but not by this extension presently).\n\
 So, the output of data is done with ``uint8`` as data type.\n\
 Output will be colored using the RGB standard, with each band\n\
 varying between 0 and 255, with zero meaning pure black and 255,\n\
 pure white (color).\n\
+\n\
 ");
 
 /* How to create a new PyBobIoVideoReaderObject */