diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4d0a2dce475df9a8657dd8a325375dcad0b41ea9..7e5f99584f769abdf244d9da13950bd54d3845d5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,18 +1,53 @@
+# This file creates automated tests on GitLab CI for Purr Data.
+# See https://docs.gitlab.com/ee/ci/yaml/README.html for details of the format.
+
+# These are script snippets used in the jobs defined below.
+.debian_image_preparation: &debian_image_preparation
+  - echo "" | sudo -S apt-get -qq purge -y pd-l2ork > /dev/null || echo "couldn't purge..."
+  - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y update > /dev/null
+  - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y upgrade > /dev/null
+
+.build_all: &build_all
+  - echo -e "section_start:`date +%s`:build_all\r\e[0KBuilding Purr Data"
+  - cd l2ork_addons
+  - ./tar_em_up.sh $BUILD_TYPE_FLAG
+  - cd ..
+  - echo -e "section_end:`date +%s`:build_all\r\e[0K"
+
+.test_linux: &test_linux
+  - echo -e "section_start:`date +%s`:test_linux\r\e[0KTesting Purr Data for Linux"
+  - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
+  - valgrind pd-l2ork -noprefs -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
+  - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
+  - echo -e "section_end:`date +%s`:text_linux\r\e[0K"
+
+.test_osx: &test_osx
+  - echo -e "section_start:`date +%s`:test_osx\r\e[0KTesting Purr Data for Mac OSX"
+  - cd scripts
+  - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nogui -noaudio -send "init dollarzero \$0" regression_tests.pd
+  - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nostdpath -nogui -noaudio external-tests.pd
+  - echo -e "section_end:`date +%s`:text_osx\r\e[0K"
+
+.test_windows: &test_windows
+  - echo -e "section_start:`date +%s`:test_windows\r\e[0KTesting Purr Data for Windows"
+  - cd scripts
+  - ../packages/win32_inno/build/bin/pd.com -noprefs -nogui -noaudio -send "init dollarzero \$0" regression_tests.pd
+  - ../packages/win32_inno/build/bin/pd.com -noprefs -nostdpath -nogui -noaudio external-tests.pd
+  - echo -e "section_end:`date +%s`:text_windows\r\e[0K"
+
+
 debian_stretch_x86_64_deb:
    tags:
      - debian
      - stretch
      - x86_64
+   variables:
+     BUILD_TYPE_FLAG: -B
+   before_script:
+     - *debian_image_preparation
    script:
-     - echo "" | sudo -S apt-get -qq purge -y pd-l2ork > /dev/null || echo "couldn't purge..."
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y update > /dev/null
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y upgrade > /dev/null
-     - cd l2ork_addons
-     - ./tar_em_up.sh -B
-     - cd ..
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
-     - valgrind pd-l2ork -noprefs -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
-     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
+     - *build_all
+     - *test_linux
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
      expire_in: 1 day
@@ -24,17 +59,13 @@ ubuntu_16.04_x86_64_deb:
      - ubuntu
      - v16.04
      - x86_64
+   variables:
+     BUILD_TYPE_FLAG: -B
+   before_script:
+     - *debian_image_preparation
    script:
-     - echo "" | sudo -S apt-get -qq purge -y pd-l2ork > /dev/null || echo "couldn't purge..."
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y update > /dev/null
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y upgrade > /dev/null
-     - cd l2ork_addons
-     - ./tar_em_up.sh -B
-     - cd ..
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
-     - cd scripts
-     - valgrind pd-l2ork -noprefs -nogui -nrt -noaudio -send "init dollarzero \$0" regression_tests.pd
-     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio external-tests.pd
+     - *build_all
+     - *test_linux
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
      expire_in: 1 day
@@ -46,13 +77,12 @@ osx_10.11_x86_64_dmg:
      - osx
      - v10.11
      - dmg
+   variables:
+     BUILD_TYPE_FLAG: -X
    script:
      - echo `pwd`
-     - cd l2ork_addons
-     - ./tar_em_up.sh -X
-     - cd ../scripts
-     - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nogui -noaudio -send "init dollarzero \$0" regression_tests.pd
-     - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nostdpath -nogui -noaudio external-tests.pd
+     - *build_all
+     - *test_osx
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
      expire_in: 1 day
@@ -64,13 +94,12 @@ osx_10.8_x86_64_dmg:
      - osx
      - v10.8
      - dmg
+   variables:
+     BUILD_TYPE_FLAG: -X
    script:
      - echo `pwd`
-     - cd l2ork_addons
-     - osx_version=10.8 ./tar_em_up.sh -X
-     - cd ../scripts
-     - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nogui -noaudio -send "init dollarzero \$0" regression_tests.pd
-     - ../packages/darwin_app/build/*.app/Contents/Resources/app.nw/bin/pd-l2ork -noprefs -nostdpath -nogui -noaudio external-tests.pd
+     - *build_all
+     - *test_osx
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
      expire_in: 1 day
@@ -81,13 +110,12 @@ windows_i386_innosetup:
   tags:
     - windows
     - i386
+  variables:
+    BUILD_TYPE_FLAG: -Z
   script:
     - echo `pwd`
-    - cd l2ork_addons
-    - ./tar_em_up.sh -Z
-    - cd ../scripts
-    - ../packages/win32_inno/build/bin/pd.com -noprefs -nogui -noaudio -send "init dollarzero \$0" regression_tests.pd
-    - ../packages/win32_inno/build/bin/pd.com -noprefs -nostdpath -nogui -noaudio external-tests.pd
+    - *build_all
+    - *test_windows
   artifacts:
     name: "$CI_RUNNER_DESCRIPTION"
     expire_in: 1 day
@@ -99,17 +127,14 @@ raspbian_stretch_armv7l_deb:
      - raspbian
      - arm 
      - stretch
+   variables:
+     BUILD_TYPE_FLAG: -r
+   before_script:
+     - *debian_image_preparation
    script:
-     - echo "" | sudo -S apt-get -qq purge -y pd-l2ork > /dev/null || echo "couldn't purge..."
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y update > /dev/null
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive apt-get -qq -y upgrade > /dev/null
      - echo `pwd`
-     - cd l2ork_addons
-     - ./tar_em_up.sh -r
-     - cd ..
-     - echo "" | sudo -S DEBIAN_FRONTEND=noninteractive dpkg --force-all -i pd-l2ork*.deb > /dev/null
-     - valgrind pd-l2ork -noprefs -nogui -nrt -noaudio -send "init dollarzero \$0" scripts/regression_tests.pd
-     - valgrind pd-l2ork -noprefs -nostdpath -nogui -nrt -noaudio scripts/external-tests.pd
+     - *build_all
+     - *test_linux
    artifacts:
      name: "$CI_RUNNER_DESCRIPTION"
      expire_in: 1 day