diff --git a/.ci/analytics/gdpr-banner.html b/.ci/analytics/gdpr-banner.html
new file mode 100644
index 0000000000000000000000000000000000000000..ac37c68c175c766bcc65a8be65185ab133fd180a
--- /dev/null
+++ b/.ci/analytics/gdpr-banner.html
@@ -0,0 +1,22 @@
+<div id="lap-cookies-banner" class="presentation-banner">
+    <div class="banner-intro">
+        <div class="close-button">
+            <a class="lap-refuse">
+                <i class="fa fa-times" aria-hidden="true"></i>
+            </a>
+        </div>
+        <div class="banner-img">
+            <img src="https://analytics.lcsb.uni.lu/lap/static/logos/r3-logo.svg" type="image/svg+xml"/>
+        </div>
+        <div class="banner-title">This website needs some cookies and similar means to function.</div>
+        <div class="banner-text">If you permit us, we will use those means to collect data on your visits for aggregated
+            statistics to improve our service.
+        </div>
+    </div>
+
+    <div class="banner-buttons">
+        <a class="btn lap-accept">Accept cookies for aggregated statistics</a>
+        <a class="btn lap-refuse">No thanks, only technically necessary cookies</a>
+        <a class="btn lap-cookies-more" href="https://courses.lcsb.uni.lu/privacy-policy">More information</a>
+    </div>
+</div>
\ No newline at end of file
diff --git a/.ci/analytics/head.html b/.ci/analytics/head.html
new file mode 100644
index 0000000000000000000000000000000000000000..c76b0a51354196ad60b49084a859b486c7cead5b
--- /dev/null
+++ b/.ci/analytics/head.html
@@ -0,0 +1,17 @@
+<script>
+    const settings = {
+        expires: "180",
+        matomoURL: "https://analytics.lcsb.uni.lu/hub/",
+        siteID: "8", //you get this siteID by sending an email to lcsb-r3@uni.lu
+        accept_all_text: "Aggregate statistics cookies accepted",
+        only_necessary_text: "Only necessary cookies accepted",
+        doNotTrack_text: "Do Not Track is enabled",
+        cookieName: "lap",
+        bots: /bot|crawler|spider|crawling/i,
+        timeout_hidebanner: "500",
+    };
+</script>
+<script src="https://analytics.lcsb.uni.lu/lap/static/js/jquery.min.js"></script>
+<script src="https://analytics.lcsb.uni.lu/lap/static/js/lap.js"></script>
+
+<link rel="stylesheet" type="text/css" href="https://analytics.lcsb.uni.lu/lap/static/css/lap.css" />
diff --git a/.ci/analytics/policy.html b/.ci/analytics/policy.html
new file mode 100644
index 0000000000000000000000000000000000000000..fcae58efd2e89f6f96fdd2c7e7909321d225ec04
--- /dev/null
+++ b/.ci/analytics/policy.html
@@ -0,0 +1,4 @@
+<div class="bottomPrivacy">
+    <a href="https://courses.lcsb.uni.lu/privacy-policy">Privacy Policy</a>
+    (<span id="doNotTrack-text"><span id="gdpr-result-text"></span> - <a href="javascript: showBanner();">change</a></span>)
+</div>
\ No newline at end of file
diff --git a/.ci/deploy.sh b/.ci/deploy.sh
index c6fc4d21334a23bb786a2c61f21c814aabe7c7c8..0abc904ab547b59c23bcb047a40715879f1ee633 100644
--- a/.ci/deploy.sh
+++ b/.ci/deploy.sh
@@ -47,6 +47,16 @@ do
                 ln -s ../../theme/package.json package.json
                 ln -s ../../theme theme
 
+                # add matomo
+                if [[ -v matomoID ]]; then
+                    matomoTagOrig='<!-- matomohead -->'
+                    sed -i '' "/${matomoTagOrig}/r./.ci/analytics/head.html" theme/templates/_index.html
+                    matomoTagOrig='<!-- matomopolicy -->'
+                    sed -i '' "/${matomoTagOrig}/r./.ci/analytics/policy.html" theme/templates/_index.html
+                    matomoTagOrig='<!-- matomobanner -->'
+                    sed -i '' "/${matomoTagOrig}/r./.ci/analytics/gdpr-banner.html" theme/templates/_index.html
+                fi
+
                 # install npm
                 yarn global add grunt-cli generator-reveal
                 yarn install
diff --git a/contribute.py b/contribute.py
index ea625ac904b127a1f0fc68bfb19110657e34a89e..0f3bbbf328076d1824219ddc1a37fea2cb45f4a2 100644
--- a/contribute.py
+++ b/contribute.py
@@ -46,7 +46,7 @@ def main(date, name):
 
         click.echo(' > Directory for slides {0} created.' . format(slidesPath))
     else:
-        click.echo(' > Directory for slides{0} already exists.' . format(slidesPath))
+        click.echo(' > Directory for slides {0} already exists.' . format(slidesPath))
 
     # change to the root directory of the presentation
     os.chdir(fullPath)
@@ -55,6 +55,13 @@ def main(date, name):
     createSymlink('../../theme', 'theme')
     createSymlink('../../theme/package.json', 'package.json')
 
+    # reset the theme
+    os.chdir('../../theme')
+    os.system('git checkout -- templates/_index.html')
+    os.chdir(fullPath)
+    click.echo(' > Theme reset.')
+
+
     # copy the contents of the template folder
     if not os.path.isfile(os.path.join(fullPath, 'slides', 'index.md')):
         copy_tree(os.path.join(rootDir, 'template', 'slides'), slidesPath)
@@ -79,6 +86,13 @@ def main(date, name):
     else:
         click.echo(' > All dependencies already installed.')
 
+    # add analytics
+    os.system('sed -i "/matomohead/r./../../.ci/analytics/head.html" theme/templates/_index.html')
+    os.system('sed -i "/matomopolicy/r./../../.ci/analytics/policy.html" theme/templates/_index.html')
+    os.system('sed -i "/matomobanner/r./../../.ci/analytics/gdpr-banner.html" theme/templates/_index.html')
+
+    click.echo(' > Matomo added.')
+
     # launch the server
     os.system('grunt server')
 
diff --git a/theme b/theme
index f2a496a345b21a440f73acba2181ae2cd2a1e05c..8c78d6caeb5aa478e3928ad01c158c0060f1f81c 160000
--- a/theme
+++ b/theme
@@ -1 +1 @@
-Subproject commit f2a496a345b21a440f73acba2181ae2cd2a1e05c
+Subproject commit 8c78d6caeb5aa478e3928ad01c158c0060f1f81c