diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 29402570ca77777b8bc61a72a3ad3f89732cbfa0..92f28af73a0bafeedf32b6366ab6c754c62cf191 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,15 +4,22 @@ cache:
   key: ${CI_PROJECT_PATH}
   paths:
     - _yarn_cache
+    - _cypress_cache
+
+before_script:
+  - yarn config set cache-folder "$CI_PROJECT_DIR/_yarn_cache"
+  - export CYPRESS_CACHE_FOLDER="$CI_PROJECT_DIR/_cypress_cache"
 
 stages:
   - test
   - deploy
+  - e2e-stage1
+  - e2e-stage2
+  - e2e-stage3
 
 test:
   stage: test
   script:
-    - yarn config set cache-folder "$CI_PROJECT_DIR/_yarn_cache"
     - yarn install
     - yarn run test
 
@@ -20,7 +27,6 @@ linting:
   stage: test
   allow_failure: true
   script:
-    - yarn config set cache-folder "$CI_PROJECT_DIR/_yarn_cache"
     - yarn install
     - yarn run lint
 
@@ -35,7 +41,6 @@ publish:
     # NPM_TOKEN needs to be a "Publish" token with 2FA disabled!
     # "Automation" tokens don't work with lerna (even if they would work with "npm publish")
     - echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > ~/.npmrc
-    - yarn config set cache-folder "$CI_PROJECT_DIR/_yarn_cache"
     - yarn install
     - yarn run build
     - yarn run publish
@@ -81,3 +86,46 @@ deploy_development:
     DEPLOY_KEY: "$DEPLOY_SSH_KEY"
   <<: *deploy_defaults
 
+# For docker images see:
+# https://github.com/cypress-io/cypress-docker-images/tree/master/browsers#cypressbrowsers
+
+.e2e_test_defaults: &e2e_test_defaults
+  only:
+    refs:
+      - master
+  # We don't need artifacts from previous runs
+  dependencies: []
+  script:
+    - git clone https://gitlab.tugraz.at/dbp/middleware/e2e-tests.git --depth 1
+    - cd e2e-tests
+    - yarn install
+    #    - ./node_modules/.bin/cypress run --browser "$BROWSER" --spec "cypress/integration/toolkit-showcase/*.spec.js"
+    - xvfb-run ./node_modules/.bin/cypress run --browser "$BROWSER" --headed --spec "cypress/integration/toolkit-showcase/*.spec.js"
+  artifacts:
+    paths:
+      - e2e-tests/cypress/videos/*
+      - e2e-tests/cypress/screenshots/*
+    expire_in: 4 week
+    when: always
+
+ff75:
+  image: cypress/browsers:node13.8.0-chrome81-ff75
+  stage: e2e-stage1
+  variables:
+    MOZ_FORCE_DISABLE_E10S: 'true'
+    BROWSER: 'firefox'
+  <<: *e2e_test_defaults
+
+chrome84:
+  image: cypress/browsers:node14.7.0-chrome84
+  stage: e2e-stage2
+  variables:
+    BROWSER: 'chrome'
+  <<: *e2e_test_defaults
+
+edge88:
+  image: cypress/browsers:node14.10.1-edge88
+  stage: e2e-stage3
+  variables:
+    BROWSER: 'edge'
+  <<: *e2e_test_defaults