diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b1cdd4c6c0495f146e669a54cffaf463e6f264d7..dfa8f1f57e6dfcc43d4ffd78c9156bf5d72b4c80 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: kwant/testing
+image: gitlab.kwant-project.org:5005/kwant/testing
 
 stages:
   - build
@@ -12,7 +12,7 @@ variables:
   IGNORE_HOSTKEY: "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
 
 
-build package:
+.build: &build
   stage: build
   script:
     - echo -e "[DEFAULT]\ndefine_macros = CYTHON_TRACE=1" >build.conf
@@ -22,12 +22,74 @@ build package:
     untracked: true
     expire_in: 1 hour
 
+
+.stable-env: &stable_env
+  before_script:
+    - source deactivate
+    - source activate kwant-stable
+    - unset CFLAGS  # https://github.com/conda-forge/toolchain-feedstock/issues/41
+
+.no-extras-env: &no_extras_env
+  before_script:
+    - source deactivate
+    - source activate kwant-stable-no-extras
+    - unset CFLAGS  # https://github.com/conda-forge/toolchain-feedstock/issues/41
+
+# Note that this is 'latest' as of when the image was last built
+.latest-env: &latest_env
+  before_script:
+    - source deactivate
+    - source activate kwant-latest
+    - unset CFLAGS  # https://github.com/conda-forge/toolchain-feedstock/issues/41
+
+.bleeding-edge-env: &bleeding_edge_env
+  before_script:
+    - source deactivate
+    - conda env update -f /kwant-latest.yml
+    - source activate kwant-latest
+
+.ubuntu-env: &ubuntu_env
+  image: gitlab.kwant-project.org:5005/kwant/testing/ubuntu
+
+.debian-env: &debian_env
+  image: gitlab.kwant-project.org:5005/kwant/testing/debian
+
+
+## Build Jobs
+
+build:ubuntu:
+  <<: *build
+  <<: *ubuntu_env
+
+build:debian:
+  <<: *build
+  <<: *debian_env
+
+build:stable:
+  <<: *build
+  <<: *stable_env
+
+build:no-extras:
+  <<: *build
+  <<: *no_extras_env
+
+build:latest:
+  <<: *build
+  <<: *latest_env
+
+build:bleeding-edge:
+  <<: *build
+  <<: *bleeding_edge_env
+  only:
+    - schedules
+
+## Test Jobs
+
 check whitespace style:
-  stage: build
+  stage: test
   script: ./check_whitespace
   allow_failure: true
 
-
 check for dependencies installed:
   stage: test
   script:
@@ -35,7 +97,59 @@ check for dependencies installed:
   allow_failure: true
 
 
+.test: &test
+  stage: test
+  script:
+    - py.test -r w --cov=kwant --cov-report term --cov-report html --flakes kwant
+  artifacts:
+    paths:
+      - htmlcov
+
+
+test:stable:
+  <<: *test
+  <<: *stable_env
+  dependencies:
+    - build:stable
+
+test:no-extras:
+  <<: *test
+  <<: *no_extras_env
+  dependencies:
+    - build:no-extras
+
+test:ubuntu:
+  <<: *test
+  <<: *ubuntu_env
+  dependencies:
+    - build:ubuntu
+
+test:debian:
+  <<: *test
+  <<: *debian_env
+  dependencies:
+    - build:debian
+
+test:latest:
+  <<: *test
+  <<: *latest_env
+  dependencies:
+    - build:latest
+
+test:bleeding-edge:
+  <<: *test
+  <<: *bleeding_edge_env
+  dependencies:
+    - build:bleeding-edge
+  only:
+    - schedules
+
+## Documentation building
+
 build documentation:
+  <<: *latest_env
+  dependencies:
+    - build:latest
   stage: test
   script:
     - make -C doc realclean; make -C doc html SPHINXOPTS='-A website_deploy=True -n -W' SOURCE_LINK_TEMPLATE="$CI_PROJECT_URL"/blob/\$\$r/\$\$f
@@ -45,9 +159,11 @@ build documentation:
     expire_in: 1 month
 
 build PDF documentation:
+  <<: *latest_env
+  dependencies:
+    - build:latest
   stage: test
   script:
-    - pip3 install sympy
     - make -C doc latex SPHINXOPTS='-n -W'
     - cd doc/build/latex
     - make all-pdf
@@ -56,22 +172,18 @@ build PDF documentation:
       - doc/build/latex/kwant.pdf
     expire_in: 1 month
 
-run tests:
-  stage: test
-  script:
-    - py.test -r w --cov=kwant --cov-report term --cov-report html --flakes kwant
-  artifacts:
-    paths:
-      - htmlcov
-
-
 check for broken links in doc:
+  <<: *latest_env
+  dependencies:
+    - build:latest
   stage: test
   script:
     - make -C doc linkcheck
   allow_failure: true
 
 
+## Conda package building
+
 .conda-template: &conda_job
   stage: deploy
   image: condaforge/linux-anvil
@@ -105,6 +217,7 @@ build and upload conda package (manual):
     - master@kwant/kwant
   when: manual
 
+## Upload coverage reports and dev documentation
 
 upload coverage:
   stage: deploy
@@ -192,7 +305,8 @@ upload dev version docs:
   after_script:
     - rm -rf ~/.ssh
 
-# tagged version deploy
+
+## Build documentation for tagged releases
 
 .tagged-version: &tagged_version
     only: