diff --git a/CMakeLists.txt b/CMakeLists.txt
index a76751f64600ed3d5140ac69c80799745be011d2..0e0bb22ca538e6a1fb1c835403a78d42b78c0e80 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -54,6 +54,7 @@ project(TurTLE
         LANGUAGES CXX)
 
 
+set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
 set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/morse ${CMAKE_MODULE_PATH})
 set(TURTLE_LIBS "")
 
@@ -62,6 +63,79 @@ if(NDEBUG)
     add_definitions(-DNDEBUG)
 endif()
 
+# taken from https://vicrucann.github.io/tutorials/quick-cmake-doxygen/
+# indicate the documentation build as an option and set it to ON by default
+option(BUILD_DOC "Build documentation" OFF)
+
+# check if Doxygen is installed
+find_package(Doxygen)
+if (DOXYGEN_FOUND)
+    # set input and output files
+    set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/documentation/cpp/cpp_config)
+    set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
+
+    # request to configure the file
+    configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
+    message("Doxygen build started")
+
+    # note the option ALL which allows to build the docs together with the application
+    add_custom_target( doc_doxygen
+        COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
+        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+        COMMENT "Generating API documentation with Doxygen"
+        VERBATIM )
+else (DOXYGEN_FOUND)
+    message("Doxygen needs to be installed to generate the doxygen documentation")
+endif (DOXYGEN_FOUND)
+
+# check if sphinx is available
+find_package(Sphinx)
+if (SPHINX_FOUND)
+    if(NOT DEFINED SPHINX_THEME)
+        set(SPHINX_THEME default)
+    endif()
+
+    if(NOT DEFINED SPHINX_THEME_DIR)
+        set(SPHINX_THEME_DIR)
+    endif()
+
+    # configured documentation tools and intermediate build results
+    set(BINARY_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/sphinx_build")
+
+    # Sphinx cache with pickled ReST documents
+    set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/sphinx_doctrees")
+
+    # HTML output directory
+    set(SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/sphinx_html")
+    # LaTeX output directory
+    set(SPHINX_LATEX_DIR "${CMAKE_CURRENT_BINARY_DIR}/sphinx_latex")
+
+    configure_file(
+        "${PROJECT_SOURCE_DIR}/documentation/conf.py.in"
+        "${BINARY_BUILD_DIR}/conf.py"
+        @ONLY)
+
+    add_custom_target(doc_html
+        ${SPHINX_EXECUTABLE}
+            -q -b html
+            -c "${BINARY_BUILD_DIR}"
+            -d "${SPHINX_CACHE_DIR}"
+            "${PROJECT_SOURCE_DIR}/documentation"
+            "${SPHINX_HTML_DIR}"
+            COMMENT "Building HTML documentation with Sphinx")
+
+    add_custom_target(doc_latex
+        ${SPHINX_EXECUTABLE}
+            -q -b latex
+            -c "${BINARY_BUILD_DIR}"
+            -d "${SPHINX_CACHE_DIR}"
+            "${PROJECT_SOURCE_DIR}/documentation"
+            "${SPHINX_LATEX_DIR}"
+            COMMENT "Building LaTeX documentation with Sphinx")
+else (SPHINX_FOUND)
+    message("Sphinx needs to be installed to generate the full documentation")
+endif (SPHINX_FOUND)
+
 option(TIMING_OUTPUT "Toggle timing output. WARNING: memory usage is proportional to `niter_todo`" OFF)
 if(TIMING_OUTPUT)
     add_definitions(-DUSE_TIMINGOUTPUT)
diff --git a/README.rst b/README.rst
index 0997e9bc97ff11be477955163c44f5099358c543..0940247b080c8f37832b70ba875d6b9422119a22 100644
--- a/README.rst
+++ b/README.rst
@@ -1,5 +1,7 @@
-.. image:: https://gitlab.mpcdf.mpg.de/mjr/bfps/badges/develop/build.svg
-   :target: https://gitlab.mpcdf.mpg.de/mjr/bfps/commits/develop
+.. only:: html
+
+    .. image:: https://gitlab.mpcdf.mpg.de/mjr/bfps/badges/develop/build.svg
+        :target: https://gitlab.mpcdf.mpg.de/mjr/bfps/commits/develop
 
 =========================================
 Turbulence Tools: Lagrangian and Eulerian
diff --git a/cmake/FindSphinx.cmake b/cmake/FindSphinx.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..6e9efe350e5860f5fabea2d6695046313c85b593
--- /dev/null
+++ b/cmake/FindSphinx.cmake
@@ -0,0 +1,17 @@
+# taken from https://eb2.co/blog/2012/03/sphinx-and-cmake-beautiful-documentation-for-c---projects/
+
+find_program(SPHINX_EXECUTABLE NAMES sphinx-build
+    HINTS
+    $ENV{SPHINX_DIR}
+    PATH_SUFFIXES bin
+    DOC "Sphinx documentation generator"
+)
+
+include(FindPackageHandleStandardArgs)
+
+find_package_handle_standard_args(Sphinx DEFAULT_MSG
+    SPHINX_EXECUTABLE
+)
+
+mark_as_advanced(SPHINX_EXECUTABLE)
+
diff --git a/cpp/kspace.cpp b/cpp/kspace.cpp
index 86d692a25c099ab5d97dd0fd5b247533815e61b6..06afe4a88fbe6c1b1a05040dfbbae72d73c68d18 100644
--- a/cpp/kspace.cpp
+++ b/cpp/kspace.cpp
@@ -286,8 +286,8 @@ void kspace<be, dt>::ball_filter(
  *  Filter's  Fourier space expression:
  *  \f[
  *       \hat{\phi^M_\ell}(k) =
- *       \exp(-\frac{(3.54 k \ell)^(122*(\ell)^(0.0836))}{2}) 
- *       \left( 1 + \frac{(k \eta/0.0636)^3.44}{1 + (k \eta/ 0.0621)^3.44} \right)^{1/2}
+ *       \exp(-\frac{(3.54 k \ell)^{122 \ell^{0.0836}}}{2})
+ *       \left( 1 + \frac{(k \eta/0.0636)^{3.44}}{1 + (k \eta/ 0.0621)^{3.44}} \right)^{1/2}
  *  \f]
  */
 template <field_backend be,
@@ -352,25 +352,33 @@ void kspace<be, dt>::Gauss_filter(
  *  a Gaussian filter and a sharp real space spherical filter.
  *
  *  Filter expressions in real space are as follows:
- *  \f{eqnarray*}{
- *       \phi^b_\ell(r) &=&
- *           \frac{1}{\ell^3}\frac{6}{\pi} H(\ell/2 - r) \\
- *       \phi^g_\ell(r) &=&
+ *  \f[
+ *       \phi^b_\ell(r) =
+ *          \frac{1}{\ell^3}\frac{6}{\pi} H(\ell/2 - r)
+ *  \f]
+ *  \f[
+ *       \phi^g_\ell(r) =
  *           \frac{1}{\sigma_\ell^3}\frac{1}{(2\pi)^{3/2}}
- *           \exp\left(-\frac{1}{2}\left(\frac{r}{\sigma_\ell}\right)^2\right) \\
- *       \phi^s_\ell(r) &=&
+ *           \exp\left(-\frac{1}{2}\left(\frac{r}{\sigma_\ell}\right)^2\right)
+ *  \f]
+ *  \f[
+ *       \phi^s_\ell(r) =
  *           \frac{1}{2 \pi^2 r^3}
  *           \left(\sin k_\ell r - k_\ell r \cos k_\ell r\right)
- *  \f}
+ *  \f]
  *  and the corresponding expressions in Fourier space are:
- *  \f{eqnarray*}{
- *       \hat{\phi^b_\ell}(k) &=&
+ *  \f[
+ *       \hat{\phi^b_\ell}(k) =
  *       \frac{3}{2(k\ell/2)^3}
- *       \left(2\sin (k \ell/2) - k \ell \cos (k \ell/2)\right) \\
- *       \hat{\phi^g_\ell}(k) &=&
- *       \exp\left(-\frac{1}{2}k^2 \sigma_\ell^2\right) \\
- *       \hat{\phi^s_\ell}(k) &=& H(k_\ell - k)
- *  \f}
+ *       \left(2\sin (k \ell/2) - k \ell \cos (k \ell/2)\right)
+ *  \f]
+ *  \f[
+ *       \hat{\phi^g_\ell}(k) =
+ *       \exp\left(-\frac{1}{2}k^2 \sigma_\ell^2\right)
+ *  \f]
+ *  \f[
+ *       \hat{\phi^s_\ell}(k) = H(k_\ell - k)
+ *  \f]
  *
  *  \f$ k_\ell \f$ is given as a parameter, and then we use
  *  \f[
@@ -425,25 +433,38 @@ int kspace<be, dt>::filter(
  *  a Gaussian filter and a sharp real space spherical filter.
  *
  *  Filter expressions in real space are as follows:
- *  \f{eqnarray*}{
- *      \phi^b_\ell(r) &=&
- *          \frac{1}{\ell^3}\frac{6}{\pi} H(\ell/2 - r) \\
- *      \phi^g_\ell(r) &=&
- *          \frac{1}{\sigma_\ell^3}\frac{1}{(2\pi)^{3/2}}
- *          \exp\left(-\frac{1}{2}\left(\frac{r}{\sigma_\ell}\right)^2\right) \\
- *      \phi^s_\ell(r) &=&
- *          \frac{1}{2 \pi^2 r^3}
- *          \left(\sin k_\ell r - k_\ell r \cos k_\ell r\right)
- *  \f}
+ *  \rst
+ *  .. math::
+ *      :nowrap:
+ *
+ *      \begin{eqnarray*}
+ *          \phi^b_\ell(r) &=&
+ *              \frac{1}{\ell^3}\frac{6}{\pi} H(\ell/2 - r) \\
+ *          \phi^g_\ell(r) &=&
+ *              \frac{1}{\sigma_\ell^3}\frac{1}{(2\pi)^{3/2}}
+ *              \exp\left(-\frac{1}{2}\left(\frac{r}{\sigma_\ell}\right)^2\right) \\
+ *          \phi^s_\ell(r) &=&
+ *              \frac{1}{2 \pi^2 r^3}
+ *              \left(\sin k_\ell r - k_\ell r \cos k_\ell r\right)
+ *      \end{eqnarray*}
+ *
+ *  \endrst
+ *
  *  and the corresponding expressions in Fourier space are:
- *  \f{eqnarray*}{
- *      \hat{\phi^b_\ell}(k) &=&
- *      \frac{3}{2(k\ell/2)^3}
- *      \left(2\sin (k \ell/2) - k \ell \cos (k \ell/2)\right) \\
- *      \hat{\phi^g_\ell}(k) &=&
- *      \exp\left(-\frac{1}{2}k^2 \sigma_\ell^2\right) \\
- *      \hat{\phi^s_\ell}(k) &=& H(k_\ell - k)
- *  \f}
+ *  \rst
+ *  .. math::
+ *      :nowrap:
+ *
+ *      \begin{eqnarray*}
+ *          \hat{\phi^b_\ell}(k) &=&
+ *          \frac{3}{2(k\ell/2)^3}
+ *          \left(2\sin (k \ell/2) - k \ell \cos (k \ell/2)\right) \\
+ *          \hat{\phi^g_\ell}(k) &=&
+ *          \exp\left(-\frac{1}{2}k^2 \sigma_\ell^2\right) \\
+ *          \hat{\phi^s_\ell}(k) &=& H(k_\ell - k)
+ *      \end{eqnarray*}
+ *
+ *  \endrst
  *
  *  \f$\sigma_\ell\f$ and \f$k_\ell\f$ are calibrated such that the energy of
  *  the large scales is approximately the same (within the inertial range)
diff --git a/cpp/mainpage.dox b/cpp/mainpage.dox
new file mode 100644
index 0000000000000000000000000000000000000000..63151e345be74ea2a1e9acc4b283685b1155057d
--- /dev/null
+++ b/cpp/mainpage.dox
@@ -0,0 +1,32 @@
+/** \mainpage
+ *
+ * Turbulence Tools: Lagrangian and Eulerian
+ * =========================================
+ *
+ * In brief, this code runs pseudospectral direct numerical simulations
+ * (DNS) of the incompressible Navier-Stokes equations, using FFTW 3, and
+ * it can integrate particle trajectories in the resulting fields.
+ *
+ * The Navier-Stokes solver has been extensively tested (tests are included
+ * in the repository), and it is working as expected. Parameters and
+ * statistics are stored in HDF5 format, together with code information, so
+ * simulation data should be "future proof" --- suggestions of possible
+ * improvements to the current approach are always welcome.
+ *
+ * The primary aim of TurTLE is to reduce the time spent on setting up and
+ * baby sitting DNS, as well as simplify the analysis of the generated
+ * data. The wish is that this Python package provides an easy and general
+ * way of constructing efficient specialized DNS C++ codes for different
+ * turbulence problems encountered in research. At the same time, the
+ * package should provide a unified way of postprocessing, and accessing
+ * the postprocessing results. The code therefore consists of two main
+ * parts: the pure C++ code, a set of loosely related "building blocks",
+ * and the Python code, which can generate C++ code using the pure classes,
+ * but with a significant degree of flexibility.
+ *
+ * The code user is expected to write a small python script that will
+ * properly define the DNS they are interested in running. That code will
+ * generate an executable that can then be run directly on the user's
+ * machine, or submitted to a queue on a cluster.
+ *
+ */
diff --git a/documentation/Makefile b/documentation/Makefile
deleted file mode 100644
index 6da2f7a60d704280c87a27e38572b387de2b6347..0000000000000000000000000000000000000000
--- a/documentation/Makefile
+++ /dev/null
@@ -1,192 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = _build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  applehelp  to make an Apple Help Book"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-	@echo "  coverage   to run coverage check of the documentation (if enabled)"
-
-clean:
-	rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/bfps.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/bfps.qhc"
-
-applehelp:
-	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
-	@echo
-	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
-	@echo "N.B. You won't be able to view it unless you put it in" \
-	      "~/Library/Documentation/Help or install it in your application" \
-	      "bundle."
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/bfps"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/bfps"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-coverage:
-	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
-	@echo "Testing of coverage in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/coverage/python.txt."
-
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/documentation/_static/api.rst b/documentation/_static/api.rst
deleted file mode 100644
index a1288bad8a875cff458e68ce13f7bcb85debed9c..0000000000000000000000000000000000000000
--- a/documentation/_static/api.rst
+++ /dev/null
@@ -1,44 +0,0 @@
-===
-API
-===
-
-
-----------
-bfps.tools
-----------
-
-.. automodule:: bfps.tools
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-
------------------
-bfps.NavierStokes
------------------
-
-.. automodule:: bfps.NavierStokes
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-
------------------
-bfps.FluidConvert
------------------
-
-.. automodule:: bfps.FluidConvert
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
-
-----------------
-bfps.FluidResize
-----------------
-
-.. automodule:: bfps.FluidResize
-    :members:
-    :undoc-members:
-    :show-inheritance:
-
diff --git a/documentation/bandpass/notes0.rst b/documentation/bandpass/notes0.txt
similarity index 100%
rename from documentation/bandpass/notes0.rst
rename to documentation/bandpass/notes0.txt
diff --git a/documentation/_static/README.rst b/documentation/chapters/README.rst
similarity index 100%
rename from documentation/_static/README.rst
rename to documentation/chapters/README.rst
diff --git a/documentation/chapters/api.rst b/documentation/chapters/api.rst
new file mode 100644
index 0000000000000000000000000000000000000000..239ec0cac160c9a32fe5fe21d1eb1c208f664142
--- /dev/null
+++ b/documentation/chapters/api.rst
@@ -0,0 +1,53 @@
+===
+API
+===
+
+
+------------
+TurTLE
+------------
+
+.. automodule:: TurTLE
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+------------
+TurTLE.tools
+------------
+
+.. automodule:: TurTLE.tools
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+-----------
+TurTLE.TEST
+-----------
+
+.. automodule:: TurTLE.TEST
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+----------
+TurTLE.DNS
+----------
+
+.. automodule:: TurTLE.DNS
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
+
+---------
+TurTLE.PP
+---------
+
+.. automodule:: TurTLE.PP
+    :members:
+    :undoc-members:
+    :show-inheritance:
+
diff --git a/documentation/bandpass/bandpass.rst b/documentation/chapters/bandpass.rst
similarity index 96%
rename from documentation/bandpass/bandpass.rst
rename to documentation/chapters/bandpass.rst
index c23a8fbb1050da54f5b10a8bd9d1f11b87825cb9..400dffe56253418aa586782ab6a783f6e407ba4a 100644
--- a/documentation/bandpass/bandpass.rst
+++ b/documentation/chapters/bandpass.rst
@@ -1,14 +1,16 @@
--------------------------
+--------------------------------
 TurTLE: Post-processing tutorial
--------------------------
+--------------------------------
 
 Example problem:
 ----------------
 
 Statistics of band-passed fields.
 Please see
+
     Drivas, T. D. and Johnson, P. L. and Lalescu, C. C. and Wilczek, M. Phys Rev Fluids 2 104603 (2017)
     https://dx.doi.org/10.1103/PhysRevFluids.2.104603
+
 The relevant files are `cpp/full_code/bandpass_stats.?pp`,
 `TurTLE/PP.py` and `CMakeLists.txt` (the list of headers should be
 updated).
diff --git a/documentation/_static/cpp.rst b/documentation/chapters/cpp.rst
similarity index 100%
rename from documentation/_static/cpp.rst
rename to documentation/chapters/cpp.rst
diff --git a/documentation/chapters/cpp_doxygen.rst b/documentation/chapters/cpp_doxygen.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1e4246a162083d4508f590d7370d2d29028cd598
--- /dev/null
+++ b/documentation/chapters/cpp_doxygen.rst
@@ -0,0 +1,23 @@
+---
+CPP
+---
+
+.. doxygenclass:: kspace
+    :project: TurTLE
+    :members:
+
+.. doxygenclass:: field
+    :project: TurTLE
+    :members:
+
+.. doxygenclass:: code_base
+    :project: TurTLE
+    :members:
+
+.. doxygenclass:: direct_numerical_simulation
+    :project: TurTLE
+    :members:
+
+.. doxygenclass:: NSVE
+    :project: TurTLE
+    :members:
diff --git a/documentation/_static/development.rst b/documentation/chapters/development.rst
similarity index 100%
rename from documentation/_static/development.rst
rename to documentation/chapters/development.rst
diff --git a/documentation/_static/overview.rst b/documentation/chapters/overview.rst
similarity index 97%
rename from documentation/_static/overview.rst
rename to documentation/chapters/overview.rst
index 58af5653cab860961c71d057d92a21c9b99e6ddc..2ed997037f07026be50ee2976781c5eb7f861f92 100644
--- a/documentation/_static/overview.rst
+++ b/documentation/chapters/overview.rst
@@ -254,14 +254,14 @@ In brief the following takes place:
        NavierStokes`` command.
     2. reasonable DNS parameters are constructed from the command line
        arguments.
-    4. ``c`` generates a parameter file ``<simname>.h5``, into which the
+    3. ``c`` generates a parameter file ``<simname>.h5``, into which the
        various parameters are written.
        ``c`` also generates the various datasets that the backend code
        will write into (statistics and other stuff).
-    3. ``c`` writes a C++ file that is compiled and linked against
+    4. ``c`` writes a C++ file that is compiled and linked against
        ``libbfps``.
-    4. ``c`` executes the C++ code using ``mpirun``.
-    5. the C++ code actually performs the DNS, and outputs various
+    5. ``c`` executes the C++ code using ``mpirun``.
+    6. the C++ code actually performs the DNS, and outputs various
        results into the ``<simname>.h5`` file.
 
 After the simulation is done, things are simpler.
diff --git a/documentation/conf.py b/documentation/conf.py.in
similarity index 78%
rename from documentation/conf.py
rename to documentation/conf.py.in
index 5fc2f86699b6f446001efb8dda00fab733c434a4..f9cf674535546b9bcf1a05e7daddd94bd7752374 100644
--- a/documentation/conf.py
+++ b/documentation/conf.py.in
@@ -1,8 +1,7 @@
-#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 #
-# bfps documentation build configuration file, created by
-# sphinx-quickstart on Thu Jan 21 20:53:27 2016.
+# TurTLE documentation build configuration file, created by
+# sphinx-quickstart on Sat Nov 16 10:17:05 2019.
 #
 # This file is execfile()d with the current directory set to its
 # containing dir.
@@ -15,13 +14,16 @@
 
 import sys
 import os
-import shlex
 
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
 #sys.path.insert(0, os.path.abspath('.'))
-sys.path.insert(0, os.path.abspath('..'))
+sys.path.insert(0, os.path.abspath('@PROJECT_BINARY_DIR@/python'))
+
+breathe_projects = {
+        'TurTLE' : os.path.abspath('@CMAKE_CURRENT_BINARY_DIR@/xml/'),
+        }
 
 # -- General configuration ------------------------------------------------
 
@@ -32,13 +34,15 @@ sys.path.insert(0, os.path.abspath('..'))
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
+    'breathe',
     'sphinx.ext.autodoc',
     'sphinx.ext.mathjax',
     'sphinx.ext.viewcode',
+    'sphinx.ext.imgconverter',
 ]
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ['sphinx_templates']
 
 # The suffix(es) of source filenames.
 # You can specify multiple suffix as a list of string:
@@ -52,47 +56,18 @@ source_suffix = '.rst'
 master_doc = 'index'
 
 # General information about the project.
-project = 'bfps'
-copyright = '2016, Cristian C Lalescu'
-author = 'Cristian C Lalescu'
-
-### package versioning
-# get current time
-import datetime
-import shutil
-import subprocess
-now = datetime.datetime.now()
-# obtain version
-try:
-    git_branch = subprocess.check_output(['git',
-                                          'rev-parse',
-                                          '--abbrev-ref',
-                                          'HEAD']).strip().split()[-1].decode()
-    git_revision = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip()
-    git_date = datetime.datetime.fromtimestamp(int(subprocess.check_output(['git', 'log', '-1', '--format=%ct']).strip()))
-except:
-    git_revision = ''
-    git_branch = ''
-    git_date = now
-if git_branch == '':
-    # there's no git available or something
-    release = '{0:0>4}{1:0>2}{2:0>2}.{3:0>2}{4:0>2}{5:0>2}'.format(
-                git_date.year, git_date.month, git_date.day,
-                git_date.hour, git_date.minute, git_date.second)
-else:
-    if (('develop' in git_branch) or
-        ('feature' in git_branch) or
-        ('bugfix'  in git_branch)):
-        release = subprocess.check_output(['git', 'describe', '--tags']).strip().decode()
-    else:
-        release = subprocess.check_output(['git', 'describe', '--tags']).strip().decode().split('-')[0]
+project = u'TurTLE'
+copyright = u'2019, TurTLE team'
+author = u'TurTLE team'
+
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
-# release is the full version, including alpha/beta/rc tags.
-# version is supposed to be the short X.Y version.
-version = release
+VERSION = '@TURTLE_VERSION@'
+version = VERSION
+# The full version, including alpha/beta/rc tags.
+release = VERSION
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -109,7 +84,7 @@ language = None
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
-exclude_patterns = ['_build']
+exclude_patterns = ['sphinx_build']
 
 # The reST default role (used for this markup: `text`) to use for all
 # documents.
@@ -164,15 +139,15 @@ html_theme = 'alabaster'
 # of the sidebar.
 #html_logo = None
 
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
 #html_favicon = None
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ['@PROJECT_SOURCE_DIR@/documentation/_static']
 
 # Add any extra paths that contain custom files (such as robots.txt or
 # .htaccess) here, relative to this directory. These files are copied
@@ -222,8 +197,8 @@ html_static_path = ['_static']
 
 # Language to be used for generating the HTML full-text search index.
 # Sphinx supports the following languages:
-#   'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
-#   'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr'
+#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
 #html_search_language = 'en'
 
 # A dictionary with options for the search language support, empty by default.
@@ -235,7 +210,7 @@ html_static_path = ['_static']
 #html_search_scorer = 'scorer.js'
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = 'bfpsdoc'
+htmlhelp_basename = 'TurTLEdoc'
 
 # -- Options for LaTeX output ---------------------------------------------
 
@@ -247,7 +222,7 @@ latex_elements = {
 #'pointsize': '10pt',
 
 # Additional stuff for the LaTeX preamble.
-#'preamble': '',
+'preamble': '\usepackage{amssymb,amsmath,amsfonts}',
 
 # Latex figure (float) alignment
 #'figure_align': 'htbp',
@@ -257,8 +232,8 @@ latex_elements = {
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-  (master_doc, 'bfps.tex', 'bfps Documentation',
-   'Cristian C Lalescu', 'manual'),
+    (master_doc, 'TurTLE.tex', u'TurTLE Documentation',
+     u'TurTLE team', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -287,7 +262,7 @@ latex_documents = [
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    (master_doc, 'bfps', 'bfps Documentation',
+    (master_doc, 'turtle', u'TurTLE Documentation',
      [author], 1)
 ]
 
@@ -301,9 +276,9 @@ man_pages = [
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-  (master_doc, 'bfps', 'bfps Documentation',
-   author, 'bfps', 'One line description of project.',
-   'Miscellaneous'),
+    (master_doc, 'TurTLE', u'TurTLE Documentation',
+     author, 'TurTLE', 'One line description of project.',
+     'Miscellaneous'),
 ]
 
 # Documents to append as an appendix to all manuals.
diff --git a/documentation/cpp/cpp_config b/documentation/cpp/cpp_config
index d740e899e959ac587767427b9bcf4f91e86c55ba..73726c8d5130f1e1c566483e7817ff464f263c77 100644
--- a/documentation/cpp/cpp_config
+++ b/documentation/cpp/cpp_config
@@ -238,7 +238,10 @@ TAB_SIZE               = 4
 # "Side Effects:". You can put \n's in the value part of an alias to insert
 # newlines.
 
-ALIASES                =
+# added rst and endrst as per https://exhale.readthedocs.io/en/latest/mastering_doxygen.html (retrieved 2019-11-16)
+# this is such that we can use reStructuredText within the documentation
+ALIASES                = "rst=\verbatim embed:rst:leading-asterisk"
+ALIASES               += "endrst=\endverbatim"
 
 # This tag can be used to specify a number of word-keyword mappings (TCL only).
 # A mapping has the form "name=value". For example adding "class=itcl::class"
@@ -790,7 +793,7 @@ WARN_LOGFILE           =
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = ../../cpp
+INPUT                  = ../cpp
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -1666,7 +1669,7 @@ EXTRA_SEARCH_MAPPINGS  =
 # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
 # The default value is: YES.
 
-GENERATE_LATEX         = YES
+GENERATE_LATEX         = NO
 
 # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
 # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1946,7 +1949,7 @@ MAN_LINKS              = NO
 # captures the structure of the code including all documentation.
 # The default value is: NO.
 
-GENERATE_XML           = NO
+GENERATE_XML           = YES
 
 # The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
 # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -2099,7 +2102,7 @@ INCLUDE_FILE_PATTERNS  =
 # recursively expanded use the := operator instead of the = operator.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             =
+PREDEFINED             = IN_DOXYGEN
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
diff --git a/documentation/index.rst b/documentation/index.rst
index 9b0abc23648a08a9bd6692d2bc7651323c1b09d8..fc866054f00a40fcc9c07d1f0adfea7f8da81250 100644
--- a/documentation/index.rst
+++ b/documentation/index.rst
@@ -1,20 +1,23 @@
-.. bfps documentation master file, created by
-   sphinx-quickstart on Thu Jan 21 20:53:27 2016.
+.. TurTLE documentation master file, created by
+   sphinx-quickstart on Sat Nov 16 10:17:05 2019.
    You can adapt this file completely to your liking, but it should at least
    contain the root `toctree` directive.
 
+Welcome to TurTLE's documentation!
+==================================
 
-Welcome to bfps's documentation!
-================================
+Contents:
 
 .. toctree::
-    :maxdepth: 2
-
-    /_static/README
-    /_static/overview
-    /_static/development
-    /_static/api
-    /_static/cpp
+    :maxdepth: 4
+
+    chapters/README
+    chapters/overview
+    chapters/development
+    chapters/bandpass
+    chapters/api
+    chapters/cpp
+    chapters/cpp_doxygen
 
 
 Indices and tables