diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2d62ed85f76aff9a444ec58a65e00d17ad0f29ff..7dde4e20a57fec3f4a8c1a365cb6dfb080200231 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,54 +3,143 @@ variables:
   version: "2020-04-x86"
   bootstrap: ""
 
-linux-runner:
-  artifacts:
-    paths:
-      - ansi-test/test.out
-      - benchmarks/cl-bench/results
+stages:
+  - install
+  - build
+  - test
+  - benchmark
+
+cache:
+
+
+linux:install:
+  stage: install
   tags:
     - linux
-  before_script:
-    - git clone https://gitlab.common-lisp.net/ansi-test/ansi-test.git
-    - (cd ansi-test; git checkout rtoy-cmucl-expected-failures)
+  artifacts:
+    paths:
+      - snapshot/
+  script:
     - wget -nv $download_url/cmucl-$version-linux.tar.bz2
     - wget -nv $download_url/cmucl-$version-linux.extra.tar.bz2
     - mkdir snapshot
     - (cd snapshot; tar xjf ../cmucl-$version-linux.tar.bz2; tar xjf ../cmucl-$version-linux.extra.tar.bz2)
+
+linux:build:
+  stage: build
+  tags:
+    - linux
+  artifacts:
+    paths:
+      - dist/
+  needs:
+    - job: linux:install
+      artifacts: true
   script:
     - bin/build.sh $bootstrap -R -C "" -o snapshot/bin/lisp
     - bin/make-dist.sh -I dist linux-4
+
+linux:test:
+  stage: test
+  tags:
+    - linux
+  artifacts:
+    paths:
+      - ansi-test/test.out
+      - test.log
+  needs:
+    # Needs artifacts from build (dist/)
+    - job: linux:build
+      artifacts: true
+  before_script:
+    - git clone https://gitlab.common-lisp.net/ansi-test/ansi-test.git
+    - (cd ansi-test; git checkout rtoy-cmucl-expected-failures)
+  script:
     - bin/run-tests.sh -l dist/bin/lisp 2>&1 | tee test.log
     - cd ansi-test
     - make LISP="../dist/bin/lisp -batch -noinit -nositeinit"
     - grep 'No unexpected \(successes\|failures\)' test.out
-    - cd ../benchmarks/cl-bench
+
+linux:benchmark:
+  stage: benchmark
+  tags:
+    - linux
+  artifacts:
+    paths:
+      - benchmarks/cl-bench/results
+  needs:
+    # Needs artifacts from install (snapshot/) and build (dist/)
+    - job: linux:install
+      artifacts: true
+    - job: linux:build
+  script:
+    - cd benchmarks/cl-bench
     - mkdir tmp
     - CMUCL=../../snapshot/bin/lisp ./run-cmucl.sh
     - CMUCL=../../dist/bin/lisp ./run-cmucl.sh
     - ../../snapshot/bin/lisp -load report
 
-osx-runner:
-  artifacts:
-    paths:
-      - ansi-test/test.out
-      - benchmarks/cl-bench/results
+osx:install:
+  stage: install
   tags:
     - osx
-  before_script:
-    - git clone https://gitlab.common-lisp.net/ansi-test/ansi-test.git
-    - (cd ansi-test; git checkout rtoy-cmucl-expected-failures)
+  artifacts:
+    paths:
+      - snapshot/
+  script:
     - curl -s -o cmucl-$version-darwin.tar.bz2 $download_url/cmucl-$version-darwin.tar.bz2
     - mkdir snapshot
     - (cd snapshot; tar xjf ../cmucl-$version-darwin.tar.bz2)
+
+osx:build:
+  stage: build
+  tags:
+    - osx
+  artifacts:
+    paths:
+      - dist/
+  needs:
+    - job: osx:install
+      artifacts: true
   script:
     - bin/build.sh $bootstrap -R -C "" -o snapshot/bin/lisp
     - bin/make-dist.sh -I dist darwin-4
+
+osx:test:
+  stage: test
+  tags:
+    - osx
+  artifacts:
+    paths:
+      - ansi-test/test.out
+      - test.log
+  needs:
+    # Needs artifacts from build (dist/)
+    - job: osx:build
+      artifacts: true
+  before_script:
+    - git clone https://gitlab.common-lisp.net/ansi-test/ansi-test.git
+    - (cd ansi-test; git checkout rtoy-cmucl-expected-failures)
+  script:
     - bin/run-tests.sh -l dist/bin/lisp 2>&1 | tee test.log
     - cd ansi-test
     - make LISP="../dist/bin/lisp -batch -noinit -nositeinit"
     - grep 'No unexpected \(successes\|failures\)' test.out 
-    - cd ../benchmarks/cl-bench
+
+osx:benchmark:
+  stage: benchmark
+  tags:
+    - osx
+  artifacts:
+    paths:
+      - benchmarks/cl-bench/results
+  needs:
+    # Needs artifacts from install (snapshot/) and build (dist/)
+    - job: osx:install
+      artifacts: true
+    - job:  osx:build
+  script:
+    - cd benchmarks/cl-bench
     - mkdir tmp
     - CMUCL=../../snapshot/bin/lisp ./run-cmucl.sh
     - CMUCL=../../dist/bin/lisp ./run-cmucl.sh