diff --git a/.travis.yml b/.travis.yml
index 607c80cf19e42a72abd2b946d5f60c72e477973c..1e94b2598ea3da1ed7f773415bbde0b30b89875a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,21 +22,20 @@ php:
 env:
   jobs:
     - DB=pgsql MOODLE_BRANCH=MOODLE_35_STABLE
-    - DB=pgsql MOODLE_BRANCH=MOODLE_37_STABLE
     - DB=pgsql MOODLE_BRANCH=MOODLE_38_STABLE
     - DB=pgsql MOODLE_BRANCH=MOODLE_39_STABLE
+    - DB=pgsql MOODLE_BRANCH=MOODLE_310_STABLE
     - DB=pgsql MOODLE_BRANCH=master
     - DB=mysqli MOODLE_BRANCH=MOODLE_35_STABLE
-    - DB=mysqli MOODLE_BRANCH=MOODLE_37_STABLE
     - DB=mysqli MOODLE_BRANCH=MOODLE_38_STABLE
     - DB=mysqli MOODLE_BRANCH=MOODLE_39_STABLE
+    - DB=mysqli MOODLE_BRANCH=MOODLE_310_STABLE
     - DB=mysqli MOODLE_BRANCH=master
 
 before_install:
   - phpenv config-rm xdebug.ini
-  - nvm install 14
   - cd ../..
-  - composer create-project -n --no-dev --prefer-dist blackboard-open-source/moodle-plugin-ci ci dev-master
+  - composer create-project -n --no-dev --prefer-dist moodlehq/moodle-plugin-ci ci ^3
   - export PATH="$(cd ci/bin; pwd):$(cd ci/vendor/bin; pwd):$PATH"
 
 jobs:
@@ -45,7 +44,7 @@ jobs:
     # Prechecks against latest Moodle stable only.
     - stage: static
       php: 7.4
-      env: DB=mysqli MOODLE_BRANCH=MOODLE_39_STABLE
+      env: DB=mysqli MOODLE_BRANCH=MOODLE_310_STABLE
       install:
         - moodle-plugin-ci install --no-init
       script:
@@ -61,7 +60,7 @@ jobs:
     # Smaller build matrix for development builds
     - stage: develop
       php: 7.4
-      env: DB=mysqli MOODLE_BRANCH=MOODLE_39_STABLE
+      env: DB=mysqli MOODLE_BRANCH=MOODLE_310_STABLE
   exclude:
     - php: 7.3
       env: DB=pgsql MOODLE_BRANCH=MOODLE_35_STABLE
@@ -71,14 +70,9 @@ jobs:
       env: DB=pgsql MOODLE_BRANCH=MOODLE_35_STABLE
     - php: 7.4
       env: DB=mysqli MOODLE_BRANCH=MOODLE_35_STABLE
-    - php: 7.4
-      env: DB=pgsql MOODLE_BRANCH=MOODLE_37_STABLE
-    - php: 7.4
-      env: DB=mysqli MOODLE_BRANCH=MOODLE_37_STABLE
 
 # Unit tests and behat tests against full matrix.
 install:
-  - docker run -d -p 127.0.0.1:4444:4444 --net=host -v /dev/shm:/dev/shm selenium/standalone-firefox:2.53.1
   - moodle-plugin-ci install
 script:
   - moodle-plugin-ci phpunit --coverage-clover
diff --git a/adminlib.php b/adminlib.php
index dbbe59051681a12e86d0689be061f07b6d71ea70..76afb02e086d0f681dcfa10108e9f9cd03b484f3 100644
--- a/adminlib.php
+++ b/adminlib.php
@@ -266,7 +266,7 @@ class admin_settings {
 
     /**
      * This is the entry point for this controller class.
-     * @param string $action Action string (see {@link action}).
+     * @param string $action Action string (see {@see action}).
      * @param int $workflowid Id of the workflow.
      * @throws \coding_exception
      * @throws \dml_exception
diff --git a/classes/local/manager/settings_manager.php b/classes/local/manager/settings_manager.php
index b6ca7de23f84f7de61341e5934ff4c78614764e7..7e76238a773697f5c1f81892b320b42a34fb6277 100644
--- a/classes/local/manager/settings_manager.php
+++ b/classes/local/manager/settings_manager.php
@@ -122,7 +122,7 @@ class settings_manager {
     /**
      * Returns an array of local subplugin settings for a given instance id
      * @param int $instanceid id of the step instance
-     * @param string $type Type of the setting (see {@link settings_type}).
+     * @param string $type Type of the setting (see {@see settings_type}).
      * @return array|null settings key-value pairs
      * @throws \coding_exception
      * @throws \dml_exception
@@ -164,7 +164,7 @@ class settings_manager {
     /**
      * Removes all local settings for a given instance id
      * @param int $instanceid id of the step instance
-     * @param string $type Type of the setting (see {@link settings_type}).
+     * @param string $type Type of the setting (see {@see settings_type}).
      * @throws \coding_exception
      * @throws \dml_exception
      */
@@ -179,7 +179,7 @@ class settings_manager {
 
     /**
      * Validates the type param for the two possibilities 'step' and 'trigger'.
-     * @param string $type Type of the setting (see {@link settings_type}).
+     * @param string $type Type of the setting (see {@see settings_type}).
      * @throws \coding_exception
      */
     private static function validate_type($type) {
diff --git a/tests/active_workflow_is_manual_test.php b/tests/active_workflow_is_manual_test.php
index 0ae330dccc176c98010fbeb7b1d039cfc07499f1..508a91feebcd1d60bf3f56a3cffe70916892dbf7 100644
--- a/tests/active_workflow_is_manual_test.php
+++ b/tests/active_workflow_is_manual_test.php
@@ -57,7 +57,7 @@ class tool_lifecycle_workflow_is_manual_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         global $USER;
         $this->resetAfterTest(true);
         $generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
diff --git a/tests/backup_and_restore_workflow_test.php b/tests/backup_and_restore_workflow_test.php
index ed8135613129e3d0e20b32efb84bdfe3508c543b..2e08e1a5339b299d0ee53340dc9e2a499b5bc3dd 100644
--- a/tests/backup_and_restore_workflow_test.php
+++ b/tests/backup_and_restore_workflow_test.php
@@ -56,7 +56,7 @@ class tool_lifecycle_backup_and_restore_workflow_testcase extends \advanced_test
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
         $this->workflow = $generator->create_workflow(['startdatedelay', 'categories'], ['email', 'createbackup', 'deletecourse']);
diff --git a/tests/backup_manager_test.php b/tests/backup_manager_test.php
index 9e9865a6dced9c842a01969921630f4e7cae5504..6e09ec2cafc4eccebef5a81aff8e4f8e2e818c9b 100644
--- a/tests/backup_manager_test.php
+++ b/tests/backup_manager_test.php
@@ -42,7 +42,7 @@ class tool_lifecycle_backup_manager_testcase extends \advanced_testcase {
     /**
      * Setup the testcase.
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(false);
         $this->course = $this->getDataGenerator()->create_course();
     }
diff --git a/tests/manual_trigger_tools_test.php b/tests/manual_trigger_tools_test.php
index 81ba80a03ab0358bef9f1e25f77edd8c6c851274..c609ddec4bcea95afc79a91af89d8230f60203d1 100644
--- a/tests/manual_trigger_tools_test.php
+++ b/tests/manual_trigger_tools_test.php
@@ -62,7 +62,7 @@ class tool_lifecycle_manual_trigger_tools_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         global $USER;
         $this->resetAfterTest(true);
         $generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
diff --git a/tests/manually_triggered_process_test.php b/tests/manually_triggered_process_test.php
index 5251f4064c31d85cc1644257b5759a9ad9c16e6f..6e7c4a180f2498307c6f237e371afce106352915 100644
--- a/tests/manually_triggered_process_test.php
+++ b/tests/manually_triggered_process_test.php
@@ -65,7 +65,7 @@ class tool_lifecycle_manually_triggered_process_testcase extends \advanced_testc
      * @throws coding_exception
      * @throws moodle_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         global $USER;
 
         // We do not need a sesskey check in theses tests.
diff --git a/tests/persistence/persist_process_data_test.php b/tests/persistence/persist_process_data_test.php
index 2803171ca199ec6d270ab90efb4273d0f334dedb..462d2d913029727b7e9cbf59b304fe12d1b282c6 100644
--- a/tests/persistence/persist_process_data_test.php
+++ b/tests/persistence/persist_process_data_test.php
@@ -54,7 +54,7 @@ class tool_lifecycle_persist_process_data_testcase extends \advanced_testcase {
      * @throws coding_exception
      * @throws dml_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
 
diff --git a/tests/persistence/persist_process_test.php b/tests/persistence/persist_process_test.php
index 08a7cfaf6399aaa69ebe9416728a259f90a4dca3..cf985dd0066baeca3cb3515adb84d67dac7c18e0 100644
--- a/tests/persistence/persist_process_test.php
+++ b/tests/persistence/persist_process_test.php
@@ -50,7 +50,7 @@ class tool_lifecycle_persist_process_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
 
diff --git a/tests/persistence/persist_step_test.php b/tests/persistence/persist_step_test.php
index 0432a6734a06157bdbda47aa5e227b02be25f50b..e87f466eaf2da5009af4718c337ad7e55a97840f 100644
--- a/tests/persistence/persist_step_test.php
+++ b/tests/persistence/persist_step_test.php
@@ -51,7 +51,7 @@ class tool_lifecycle_persist_step_testcase extends \advanced_testcase {
      * @throws coding_exception
      * @throws moodle_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $this->generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
 
diff --git a/tests/persistence/persist_workflow_test.php b/tests/persistence/persist_workflow_test.php
index 57dc4c0c0464a90c9dc05a7fa4ed1e34baa64418..a68aae36de1e845c2312a90c3f83eb704714b307 100644
--- a/tests/persistence/persist_workflow_test.php
+++ b/tests/persistence/persist_workflow_test.php
@@ -45,7 +45,7 @@ class tool_lifecycle_persist_workflow_testcase extends \advanced_testcase {
     /**
      * Setup the testcase.
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $record = new stdClass();
         $record->id = null;
diff --git a/tests/privacy_test.php b/tests/privacy_test.php
index 8ffe855a725dfac9b6d0029ebda2fa6993fd115f..07aada6fb096d4b53fc314a11e116ea9502b27e5 100644
--- a/tests/privacy_test.php
+++ b/tests/privacy_test.php
@@ -74,7 +74,7 @@ class tool_lifecycle_privacy_test extends provider_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         global $USER;
 
         // We do not need a sesskey check in theses tests.
diff --git a/tests/process_status_message_test.php b/tests/process_status_message_test.php
index 1a9105c9e0fc5f9e8784b26594eb6895d166425d..b7b313ffec136e1a7c8291496bbcdfe1d9f90ff4 100644
--- a/tests/process_status_message_test.php
+++ b/tests/process_status_message_test.php
@@ -54,7 +54,7 @@ class tool_lifecycle_process_status_message_testcase extends \advanced_testcase
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         global $USER;
 
         // We do not need a sesskey check in theses tests.
diff --git a/tests/settings_manager_test.php b/tests/settings_manager_test.php
index 4e5c770fe838e614d3cdb1754afe98eb32c448f4..204dd41fac0e3e765caed162866070893c68e5eb 100644
--- a/tests/settings_manager_test.php
+++ b/tests/settings_manager_test.php
@@ -59,7 +59,7 @@ class tool_lifecycle_settings_manager_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(false);
         $generator = $this->getDataGenerator()->get_plugin_generator('tool_lifecycle');
 
diff --git a/tests/workflow_actions_testcase.php b/tests/workflow_actions_testcase.php
index cc9ee82fd31477058ba2981fc148d6e11c039a6b..06b8780fe6aafd324d8f45aaecdbfb38e0a52751 100644
--- a/tests/workflow_actions_testcase.php
+++ b/tests/workflow_actions_testcase.php
@@ -50,7 +50,7 @@ abstract class workflow_actions_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         global $USER;
         // We do not need a sesskey check in theses tests.
         $USER->ignoresesskey = true;
diff --git a/trigger/categories/tests/trigger_test.php b/trigger/categories/tests/trigger_test.php
index 3c92c857e68d237d03ed0fa0444e5aae2170c55e..4012ff69afc65cee71307ea5fb2660c2a27e3376 100644
--- a/trigger/categories/tests/trigger_test.php
+++ b/trigger/categories/tests/trigger_test.php
@@ -60,7 +60,7 @@ class tool_lifecycle_trigger_categories_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws \moodle_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $this->setAdminUser();
 
diff --git a/trigger/delayedcourses/tests/trigger_test.php b/trigger/delayedcourses/tests/trigger_test.php
index 6560af542e44f7ed67a43ae69850f4cef6cdfe29..6238981fd6feaefaee162f86bdfa33dca149cedd 100644
--- a/trigger/delayedcourses/tests/trigger_test.php
+++ b/trigger/delayedcourses/tests/trigger_test.php
@@ -57,7 +57,7 @@ class tool_lifecycle_trigger_delayedcourses_testcase extends \advanced_testcase
     /** @var workflow Workflow delaying processes for all workflows */
     private $workflowdealayingallworkflows;
 
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $this->setAdminUser();
 
diff --git a/trigger/sitecourse/tests/trigger_test.php b/trigger/sitecourse/tests/trigger_test.php
index 1cec1ea8ae39e167589378cff02b2b6d22577f69..d9babbbf4ebf77aba518eb8c84faea6ad496effb 100644
--- a/trigger/sitecourse/tests/trigger_test.php
+++ b/trigger/sitecourse/tests/trigger_test.php
@@ -49,7 +49,7 @@ class tool_lifecycle_trigger_sitecourse_testcase extends \advanced_testcase {
      * Setup the testcase.
      * @throws coding_exception
      */
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $this->setAdminUser();
 
diff --git a/trigger/startdatedelay/tests/trigger_test.php b/trigger/startdatedelay/tests/trigger_test.php
index eeab387b7e0b9b79121b41479d56fd868b178eb9..04ac2aea5039f93a3deba29b321b988d00bb4a4f 100644
--- a/trigger/startdatedelay/tests/trigger_test.php
+++ b/trigger/startdatedelay/tests/trigger_test.php
@@ -48,7 +48,7 @@ class tool_lifecycle_trigger_startdatedelay_testcase extends \advanced_testcase
     /** @var $processor processor Instance of the lifecycle processor. */
     private $processor;
 
-    public function setUp() {
+    public function setUp() : void {
         $this->resetAfterTest(true);
         $this->setAdminUser();