Code by Tom
Docs using doxygen