diff --git a/Jenkinsfile b/Jenkinsfile
index 62339faab1c24ef76501d68b320e9a9f149332af..1bd9d684a9ea859a641c4570b33b18605f9b1698 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,5 +1,5 @@
 #!/usr/bin/env groovy
-@Library('jenkins-pipeline@1.0.19') _
+@Library('jenkins-pipeline@1.0.21') _
 
 def stage_required = [build: false, data: false, full: false, docker: false]
 def build_shared = 'ON'
@@ -30,7 +30,7 @@ pipeline {
         sh "git config core.whitespace -blank-at-eof"
         sh "git diff --check `git merge-base origin/master HEAD` HEAD -- . ':!*.md' ':!*.pandoc' ':!*.asc'"
         dir('scripts/jenkins') { stash(name: 'known_hosts', includes: 'known_hosts') }
-        ciSkip action: 'check' // Check for [ci skip] commit message.
+        ciSkip action: 'check' // Check for [ci skip] or [web] commit message.
 
         // ********* Check changesets for conditional stage execution **********
         script {
diff --git a/web/assets/js/fancybox.js b/web/assets/js/fancybox.js
index 8ddaaa2ca66d47370cdce4ba5c4bd99594877ad9..3f908ea9a1cae11b4b9cdb7cfc9c6f9b9b8605be 100644
--- a/web/assets/js/fancybox.js
+++ b/web/assets/js/fancybox.js
@@ -7,4 +7,23 @@ $(document).ready(function(){
     autoplaySpeed: 3000,
   });
   $('.carousel-play').slick('slickPlay');
+
+  // wrap all img elements in fancybox wrapper
+  var imgs = document.querySelectorAll("img");
+
+  for(var index=0; index < imgs.length; index++) {
+    var img = imgs[index];
+    // Check for other fancybox
+    if(img.parentNode.hasAttribute("data-fancybox")) {
+      continue;
+    }
+    var wrapper = document.createElement("a");
+    wrapper.setAttribute("data-fancybox", "");
+    if(img.hasAttribute("alt")) {
+      wrapper.setAttribute("data-caption", img.getAttribute("alt"));
+    }
+    wrapper.setAttribute("href", img.getAttribute("src"));
+    img.parentNode.insertBefore(wrapper, img);
+    wrapper.appendChild(img);
+  }
 });
diff --git a/web/assets/scss/main.scss b/web/assets/scss/main.scss
index a00116eb08c1a77b94f5ff84ddf3ae3152579999..8adc1e694a20f78ead17e2e608afc095526e34ab 100644
--- a/web/assets/scss/main.scss
+++ b/web/assets/scss/main.scss
@@ -222,6 +222,19 @@ a.btn-inverse:hover {
   color: config('mycolors.text-accent');
 }
 
+/* -------------------------------- Images ---------------------------------- */
+body {
+  counter-reset: figcaption;
+}
+figcaption::before {
+  counter-increment: figcaption;
+  content: "Fig. " counter(figcaption) ": "
+}
+figcaption {
+  @apply .text-center;
+  @apply .mb-6;
+}
+
 /* ------------------------------- Components ------------------------------- */
 .btn {
   @apply text-grey-darkest;
diff --git a/web/content/_index.pandoc b/web/content/_index.pandoc
index 3aa5efaf141f55c90796a6d9719f38ef1d4fa7e2..4509122530828c62ae41b6c7e5019ba4a6cdc4d5 100644
--- a/web/content/_index.pandoc
+++ b/web/content/_index.pandoc
@@ -27,7 +27,7 @@ features:
 
     Parametrize the model with material parameters, boundary conditions and source terms.
   visual:
-    permalink: "/docs/tools/meshing/extract-surface/TopBottomSideSurface.png"
+    permalink: "/docs/tools/meshing-submeshes/extract-surface/TopBottomSideSurface.png"
     alt: Extracted surfaces
   links:
     - text: See Docs
diff --git a/web/layouts/partials/components/feature.html b/web/layouts/partials/components/feature.html
index f0e5040287c95f86aff24ea51ab0dca30b8365c3..2294690293028ab2292cf6071b232236d6edfc95 100644
--- a/web/layouts/partials/components/feature.html
+++ b/web/layouts/partials/components/feature.html
@@ -16,9 +16,7 @@
       </div>
       <div class="w-full md:w-1/2 md:px-4">
         {{ if .feature.visual }}
-          <a data-fancybox data-caption="{{ .feature.visual.alt | default ""}}" href="{{ .feature.visual.permalink }}">
-            <img class="{{ if .feature.visual.rounded }}rounded shadow-lg{{ end }}" src="{{ .feature.visual.permalink }}" alt="{{ .feature.visual.alt }}">
-          </a>
+          <img class="{{ if .feature.visual.rounded }}rounded shadow-lg{{ end }}" src="{{ .feature.visual.permalink }}" alt="{{ .feature.visual.alt }}">
         {{ end }}
         {{ if .feature.carousel }}
           {{ partial "components/carousel" (dict "carousel" .feature.carousel "page" .page) }}
diff --git a/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.content b/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.content
index b8150ed86a2d49cfb8d1d3999dc7e523393b9fca..57b7fe8bbc2ac227ae7496cd4568edb742453f20 100644
--- a/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.content
+++ b/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.content
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:cdaa95be2c953bb3c7fa6b71864b8ff07f823120c380311532f319f7fae436ee
-size 1585
+oid sha256:66f99318de88f6d8f1b19886d32881654c1f339439987a23e5c765ba2b2782cd
+size 2042
diff --git a/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.json b/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.json
index 852a44ea29522d9f922fffa7b89a9b6f0bd43454..90d1638e5b929b54da19d772881ba50513c00933 100644
--- a/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.json
+++ b/web/resources/_gen/assets/js/bundle.js_d11fe7b62c27961c87ecd0f2490357b9.json
@@ -1 +1 @@
-{"Target":"bundle.min.cdaa95be2c953bb3c7fa6b71864b8ff07f823120c380311532f319f7fae436ee.js","MediaType":"application/javascript","Data":{"Integrity":"sha256-zaqVviyVO7PH+mtxhkuP8H+CMSDDgDEVMvMZ9/rkNu4="}}
\ No newline at end of file
+{"Target":"bundle.min.66f99318de88f6d8f1b19886d32881654c1f339439987a23e5c765ba2b2782cd.js","MediaType":"application/javascript","Data":{"Integrity":"sha256-ZvmTGN6I9tjxsZiG0yiBZUwfM5Q5mHoj5cdluisngs0="}}
\ No newline at end of file
diff --git a/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.content b/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.content
index e3530193069150fe213af25bcdd856e2e89d3307..b9870e968064b329ee33bde382df32b671179a27 100644
--- a/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.content
+++ b/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.content
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:2ae350b937be7c2840ce93fd86eff932de7f1c643a0dd9f1be580575e9b4a61c
-size 304695
+oid sha256:a87dd5842d01ae39d018d113a1eb50ddc1b7fe92bcaec5b15119dbdff230805f
+size 304864
diff --git a/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.json b/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.json
index df214235076f453b4f46588f591d517203aeb3c6..bea82bb4770e2fe2e4a600e871c194417a489b46 100644
--- a/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.json
+++ b/web/resources/_gen/assets/scss/scss/main.scss_4e7f57577ae5587f96f0311b7197bce0.json
@@ -1 +1 @@
-{"Target":"main.min.2ae350b937be7c2840ce93fd86eff932de7f1c643a0dd9f1be580575e9b4a61c.css","MediaType":"text/css","Data":{"Integrity":"sha256-KuNQuTe+fChAzpP9hu/5Mt5/HGQ6DdnxvlgFdem0phw="}}
\ No newline at end of file
+{"Target":"main.min.a87dd5842d01ae39d018d113a1eb50ddc1b7fe92bcaec5b15119dbdff230805f.css","MediaType":"text/css","Data":{"Integrity":"sha256-qH3VhC0BrjnQGNEToetQ3cG3/pK8rsWxURnb3/IwgF8="}}
\ No newline at end of file
diff --git a/web/resources/_gen/assets/scss/scss/main.scss_fb23c2453b1d1395eb4b9e3814032563.content b/web/resources/_gen/assets/scss/scss/main.scss_fb23c2453b1d1395eb4b9e3814032563.content
index 843adc4bf0e42392a255bc31d442380e2d3aff61..ab9bd61a49c76abdc3f31e4f33465b3e85af22d2 100644
--- a/web/resources/_gen/assets/scss/scss/main.scss_fb23c2453b1d1395eb4b9e3814032563.content
+++ b/web/resources/_gen/assets/scss/scss/main.scss_fb23c2453b1d1395eb4b9e3814032563.content
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:b1a589a85d9508af2c5f81efd2f75c9999bf2b6c9fde278d703f91ca9ad64dff
-size 410552
+oid sha256:d77d9cedeca16fd9e3521ff27ec24b6b5ab07c2ddcee016a430770aa1a59c5c5
+size 410834