diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 080e775984841167a538192c6cc820119e0d08e5..08d5e9d27d5f2c205157dd8f17917b842de0288f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,74 +1,57 @@
 stages:
-  - build
+  - vendor
   - test
 
-variables:
-  COMPOSER_ALLOW_SUPERUSER: "1"
-  COMPOSER_NO_INTERACTION: "1"
-  COMPOSER_HOME: "$CI_PROJECT_DIR/.composer"
-
-install-vendors:
-  tags: [ docker ]
-  stage: build
-  image: composer:1.8
-  dependencies: []
+.php: &php
+  tags:
+    - docker
+  image: php:${PHP_VERSION}-cli-stretch
+  variables:
+    COMPOSER_HOME: "$CI_PROJECT_DIR/.composer"
+    COMPOSER_NO_INTERACTION: "1"
+    COMPOSER_ALLOW_SUPERUSER: "1"
+    COMPOSER_INSTALLER_COMMITID: "5eb0614d3fa7130b363698d3dca52c619b463615"
+    PHP_VERSION: "7.1"
   before_script:
-    - mkdir -p "$COMPOSER_HOME" vendor/bin
-    - composer global require hirak/prestissimo
-    - cp $(which composer) vendor/bin/composer
+    - apt-get update -yqq && apt-get install -yqq unzip git-core
+    - php -v
+    - curl -sSfL https://raw.githubusercontent.com/composer/getcomposer.org/${COMPOSER_INSTALLER_COMMITID}/web/installer | php -- --install-dir=/usr/local/bin --filename=composer --quiet
+    - composer -V
+
+vendor:
+  <<: *php
+  stage: vendor
+  dependencies: []
   script:
-    - composer validate
-    - composer install -n --prefer-dist --no-suggest --no-progress --no-scripts --ignore-platform-reqs
-  cache:
-    key: "$CI_COMMIT_REF_NAME-composer"
-    paths:
-      - $COMPOSER_HOME
+    - composer global require hirak/prestissimo --quiet
+    - composer install --no-suggest --no-progress
   artifacts:
-    name: vendors
+    name: "$CI_JOB_NAME"
     paths:
       - vendor
-    expire_in: "1 day"
+    expire_in: 4 hours
+  cache:
+    key: "$CI_BUILD_REF_NAME-composer"
+    paths:
+      - "$COMPOSER_HOME"
 
-.test: &test
-  tags: [ docker ]
+.php-test: &php-test
+  <<: *php
   stage: test
-  image: php:7.1-cli
-  dependencies: [ install-vendors ]
-
-phploc:
-  <<: *test
-  script: vendor/bin/composer test:phploc
-
-phpstan:
-  <<: *test
-  script: vendor/bin/composer test:phpstan
-
-lint:
-  <<: *test
-  script: vendor/bin/composer test:lint
-
-php-cs-fixer:
-  <<: *test
-  before_script:
-    - apt-get update -yqq && apt-get install -yqq git
-  script: vendor/bin/composer test:php-cs-fixer
-
-phpcpd:
-  <<: *test
-  script: vendor/bin/composer test:phpcpd
+  dependencies:
+    - vendor
+  script: composer ${CI_JOB_NAME}
+
+phploc: { <<: *php-test }
+
+test:lint: { <<: *php-test }
+test:phpmd: { <<: *php-test }
+test:phpstan: { <<: *php-test }
+test:phpunit: { <<: *php-test }
+test:composer-validate: { <<: *php-test }
+test:composer-require: { <<: *php-test }
+test:security: { <<: *php-test }
+
+test:phpcpd:
+  <<: *php-test
   allow_failure: true
-
-phpunit:
-  <<: *test
-  script: vendor/bin/composer test:phpunit
-
-composer-require-checker:
-  <<: *test
-  before_script:
-    - apt-get update -yqq && apt-get install -yqq zlib1g-dev
-    - docker-php-ext-install -j$(nproc) zip
-  script: vendor/bin/composer test:composer-require-checker
-
-phpmd:
-  <<: *test
-  script: vendor/bin/composer test:phpmd