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..0d49db5c04afdd56554a00e2bc37917b05ba3e8d
--- /dev/null
+++ b/.ci/analytics/head.html
@@ -0,0 +1,18 @@
+<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",
+        cookieDomain: "courses.lcsb.uni.lu"
+    };
+</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..9e9515e78d996b01fd5d942c72714b58b3e3a891 100644
--- a/.ci/deploy.sh
+++ b/.ci/deploy.sh
@@ -17,6 +17,16 @@ else
     version="unstable";
 fi
 
+# build the unstable version - can be optimized
+git submodule update --recursive --init
+
+# add matomo
+sed -i "/matomohead/r./.ci/analytics/head.html" theme/templates/_index.html
+sed -i "/matomopolicy/r./.ci/analytics/policy.html" theme/templates/_index.html
+sed -i "/matomobanner/r./.ci/analytics/gdpr-banner.html" theme/templates/_index.html
+
+echo " > LAP included"
+
 # loop through all the presentations
 nBlades=0
 for d in $(find . -maxdepth 1 -type d)
@@ -38,10 +48,6 @@ do
                 # change to the blade directory to be built
                 cd $BLADE
 
-                # build the unstable version - can be optimized
-                git config submodule.theme.url https://$CI_DEPLOY_USER:$CI_DEPLOY_PASSWORD@git-r3lab.uni.lu/R3-core/outreach/theme.git
-                git submodule update --recursive --init
-
                 # run contribute
                 cp ../../template/Gruntfile.coffee .
                 ln -s ../../theme/package.json package.json
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..8e70c7685bf9477f500bbc57f2d2c36072fe7741 160000
--- a/theme
+++ b/theme
@@ -1 +1 @@
-Subproject commit f2a496a345b21a440f73acba2181ae2cd2a1e05c
+Subproject commit 8e70c7685bf9477f500bbc57f2d2c36072fe7741