diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6c10a7aa73800b1ad466f2abfaed34b23b709045..60efabae11b43befa366cebb3cc5571bd54f0332 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,25 @@
 image: quantumtinkerer/research
 
-build and upload the contents:
+stages:
+  - build
+  - deploy
+
+build lectures:
+  stage: build
+  before_script:
+    - pip install -U mkdocs mkdocs-material python-markdown-math notedown
+  script:
+    - python execute.py
+    - mkdocs build
+  artifacts:
+    paths:
+      - site
+    expire_in: 1 week
+
+.prepare_deploy: &prepare_deploy
+  stage: deploy
+  only:
+    - branches@solidstate/lectures
   before_script:
     ## Install ssh-agent if not already installed, it is required by Docker.
     ## (change apt-get to yum if you use an RPM-based image)
@@ -20,12 +39,40 @@ build and upload the contents:
     - chmod 700 ~/.ssh
     - ssh-keyscan tnw-tn1.tudelft.net >> ~/.ssh/known_hosts
     - chmod 644 ~/.ssh/known_hosts
-    - pip install -U mkdocs mkdocs-material python-markdown-math notedown
-
   script:
-    # Compile lectures
-    - python execute.py
-    - mkdocs build
-    - "rsync -rv site/* solidstate@tnw-tn1.tudelft.net:"
+    - "rsync -rv site/* solidstate@tnw-tn1.tudelft.net:$DEPLOY_PATH"
+
+deploy delft version:
+  <<: *prepare_deploy
   only:
     - local@solidstate/lectures
+  variables:
+    DEPLOY_PATH: ""
+  environment:
+    name: $CI_COMMIT_REF_NAME
+    url: "https://solidstate.quantumtinkerer.tudelft.nl/"
+
+deploy test version:
+  <<: *prepare_deploy
+  except:
+    - local@solidstate/lectures
+  variables:
+    DEPLOY_PATH: "test_builds/$CI_COMMIT_REF_NAME"
+  environment:
+    name: $CI_COMMIT_REF_NAME
+    url: "https://solidstate.quantumtinkerer.tudelft.nl/test_builds/$CI_COMMIT_REF_NAME"
+    on_stop: undeploy test version
+
+undeploy test version:
+  <<: *prepare_deploy
+  except:
+    - local@solidstate/lectures
+  when: manual
+  variables:
+    DEPLOY_PATH: "test_builds/$CI_COMMIT_REF_NAME"
+  script:
+    - mkdir empty/
+    - "rsync -rlv --delete empty/ solidstate@tnw-tn1.tudelft.net:$DEPLOY_PATH"
+  environment:
+    name: $CI_COMMIT_REF_NAME
+    action: stop