diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 499b238bca526f914a7f9b82381ea3c817903acc..8875166f3c8d77cf71e6128cb99a0b04b6f6d4ae 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -41,6 +41,8 @@ build_containers:
                 --context "${CI_PROJECT_DIR}/${DOCKER_DIR}" \
                 --dockerfile "${CI_PROJECT_DIR}/${DOCKER_DIR}/Dockerfile" \
                 --destination "${CI_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_REF_SLUG}" \
+                --build-arg "CI_AWE_IMAGE_BASE=${CI_AWE_IMAGE_BASE}" \
+                --build-arg "CI_AWE_IMAGE_TAG=${CI_COMMIT_REF_SLUG}" \
                 --cleanup
           fi
       done
diff --git a/dockerfiles/latex-builder/Dockerfile b/dockerfiles/latex-builder/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..18b989b0a31825a4698c5e8e784fa59421a02be5
--- /dev/null
+++ b/dockerfiles/latex-builder/Dockerfile
@@ -0,0 +1,25 @@
+# Set actual values are set in .gitlab-ci.yml when calling kaniko.
+# The defaults here are to assist building this image locally.
+ARG CI_AWE_IMAGE_BASE=registry.astro-wise.org/omegacen/ci-templates
+ARG CI_AWE_IMAGE_TAG=master
+
+# Note: building this image in GitLab CI will only work if the conda-builder image
+# is not already built for the revelant tag CI_AWE_IMAGE_TAG or if the
+# conda-builder image is built along with this image.
+FROM ${CI_AWE_IMAGE_BASE}/conda-builder:${CI_AWE_IMAGE_TAG}
+
+LABEL version="1.3"
+LABEL description="Image for building LaTeX documentation through tectonic"
+
+# Compiling the example will let tectonic pull most common LaTeX packages,
+# thereby increasing continuous integration speed.
+COPY example.tex /root/example.tex
+
+# Sourcing bashrc activates the base conda environment.
+# Biber and tectonic need to have matching versions, so it is not feasible to
+# release the pin on either of them.
+RUN source ~/.bashrc \
+    && mamba install "tectonic==0.9.0" texlive-core "malramsay::biber==2.14" \
+    && tectonic /root/example.tex \
+    && curl -o /usr/local/bin/git-latexdiff https://gitlab.com/git-latexdiff/git-latexdiff/-/raw/1.6.0/git-latexdiff \
+    && chmod +x /usr/local/bin/git-latexdiff
diff --git a/dockerfiles/latex-builder/README.rst b/dockerfiles/latex-builder/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d92b679f07b5afb1dbb4cb215c1cf52e161c5159
--- /dev/null
+++ b/dockerfiles/latex-builder/README.rst
@@ -0,0 +1,41 @@
+=============
+latex-builder
+=============
+
+Minimal Docker image for building LaTeX documentation.
+
+Tectonic is used to compile the LaTeX files because tectonic will automatically
+fetch any required packages. A large set of packages is prefetched.
+
+Contains
+========
+
+* tectonic for the LaTeX compilation,
+* texlive-core for latexdiff,
+* git-latexdiff, and
+* biber for biblatex support.
+
+History
+=======
+
+V1.3, 2022/06/30
+----------------
+
+* Bump biber to 2.15 and tectonic to the latest, 0.9.0.
+
+V1.2, 2020/09/14
+----------------
+
+* Add biber 2.11. Version hardcoded because the latest (2.12) is not compatible with the latest tectonic (0.1.15).
+* Therefore hardcode tectonic to 0.1.15.
+
+V1.1, 2020/05/19
+----------------
+
+* Add git-latexdiff.
+
+V1.0, 2020/15/21
+----------------
+
+* Add tectonic.
+* Initial version.
diff --git a/dockerfiles/latex-builder/example.tex b/dockerfiles/latex-builder/example.tex
new file mode 100644
index 0000000000000000000000000000000000000000..44cfd52bd5a34453b945057bfab893d0c3d4c33c
--- /dev/null
+++ b/dockerfiles/latex-builder/example.tex
@@ -0,0 +1,172 @@
+\documentclass[a4paper,twoside,11pt]{article}
+
+\usepackage{pdfpages}
+\usepackage{color}
+\usepackage{amsmath}
+\usepackage{listings}
+\lstloadlanguages{csh, python}
+
+\usepackage{url}
+\usepackage{upgreek}
+\usepackage{rotating}
+\usepackage[
+   pagebackref=false,
+   pdfpagelabels=true,
+   plainpages=false,
+   colorlinks=true]{hyperref}
+
+\usepackage{chngcntr}
+
+\usepackage[english]{babel}
+\usepackage{lastpage}
+\usepackage{multirow}
+\usepackage{longtable}
+\usepackage{supertabular}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{mathptmx}
+\usepackage{verbatim}
+\usepackage{titlesec}
+\usepackage{epsfig}
+\usepackage{fontspec}
+
+\usepackage{acronym}
+\usepackage{suffix}
+\usepackage{xstring}
+\usepackage{csquotes}
+\usepackage{etoolbox}
+\usepackage{biblatex}
+\usepackage{pdftexcmds}
+\usepackage{ifluatex}
+\usepackage{kvsetkeys}
+\usepackage{etexcmds}
+\usepackage{logreq}
+
+\setlongtables
+
+\begin{document}
+
+\lstset{basicstyle=\ttfamily,
+        columns=flexible,
+        frame=single,
+        backgroundcolor=\color{listingbg},
+        captionpos=b,
+        showspaces=false}
+
+\setcounter{tocdepth}{2}
+\tableofcontents
+\cleardoublepage
+
+Example document that imports many packages for tectonic to cache.
+
+\section{Section}{}\label{sec:mysec}
+Section~\ref{sec:mysec} contains $x < 3$.
+
+$r_\textrm{H}=10 to 80$
+
+\begin{sidewaysfigure}[ht]
+  \centering
+  \caption{\textbf{Bold}: normal.}
+  \label{fig:myfig}
+\end{sidewaysfigure}
+
+\normalsize
+
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+\large
+
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+\Large
+
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+\huge
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+\Huge
+
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+\small
+
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+\tiny
+
+\textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+{\fontencoding{T1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{lmtt}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{rsfs}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{OT1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+{\fontencoding{T1}\fontfamily{cmsy}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+
+
+\itshape
+
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont \textbf{ab}cd\textit{ef}ghijklmnopqrstuvwxyzfifl \fontname\font}
+ABCDEFGHIJKLMNOPQRSTUVWXYZ\fontname\font
+{\fontencoding{OT1}\fontfamily{ptm}\selectfont ABCDEFGHIJKLMNOPQRSTUVWXYZ \fontname\font}
+
+\end{document}
diff --git a/templates/latex.yml b/templates/latex.yml
index d661038b6dc53b79d31d25ca9ec6585c0ee7a7ab..b021c47fcf61b0e1154224c6b11bb2fb7b4bced0 100644
--- a/templates/latex.yml
+++ b/templates/latex.yml
@@ -2,8 +2,7 @@ include:
   - local: '/templates/shared/all.yml'
 
 .abstract_pdf_job:
-  # Image from https://github.com/omegacen/docker-latex-builder
-  image: omegacen/latex-builder:latest
+  image: ${CI_AWE_IMAGE_BASE}/latex-builder:${CI_AWE_IMAGE_TAG}
   before_script:
     # Determine the main LaTeX file. Can be specified manually in FILENAME_TEX.
     # 1) Use git grep to find all tex files with a documentclass.
@@ -21,18 +20,16 @@ latex_pdf:
   # Compile the main pdf.
   # Tectonic is used to compile LaTeX because it automatically fetches the
   # required packages.
-  # biber is used for the bibliography because it is the spiritual successor
-  # to bibtex, has better unicode support, and is easier to program.
+  # biber is automatically used when necessary, e.g. for the MICADO
+  # documentation.
   extends: .abstract_pdf_job
   stage: build
   script:
-    # Workaround to use biber, see https://github.com/tectonic-typesetting/tectonic/issues/53#issuecomment-404370890
-    # TODO: Replace with just tectonic once it has biber support.
-    - tectonic --reruns 0 --keep-intermediates "${BASENAME}.tex"
-    - biber "${BASENAME}"
     - tectonic "${BASENAME}.tex"
-    - rm -f "${BASENAME}.aux" "${BASENAME}.bbl" "${BASENAME}.bcf" "${BASENAME}.blg" "${BASENAME}.out" "${BASENAME}.run.xml" "${BASENAME}.toc"
   artifacts:
+    # It would be nicer to have "${BASENAME}.pdf" as artifact, but that
+    # is not possible. So instead everything untracked is an artifact and
+    # this is only the pdf because it removes all intermediate files.
     untracked: true
   rules:
     - if: $CI_AWE_SKIP_LATEX_PDF