diff --git a/.travis.yml b/.travis.yml
index 61478ceb835aea6591a5f527867400301e075a36..a53e2f8daad96bd2d2feb40463412649d07ece63 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,19 +1,11 @@
 # This is the language of our project.
 language: php
 
-# If using Behat, then this should be true due to an issue with Travis CI.
-# If not using Behat, recommended to use `sudo: false` as it is faster.
-sudo: false
-
 # Installs the required version of Firefox for Behat, an updated version
 # of PostgreSQL and extra APT packages. Java 8 is only required
 # for Mustache command.
 addons:
- firefox: "47.0.1"
- postgresql: "9.4"
- apt:
-  packages:
-   - openjdk-8-jre-headless
+ postgresql: "9.5"
 
 # Cache NPM's and Composer's caches to speed up build times.
 cache:
@@ -27,12 +19,15 @@ cache:
 php:
  - 7.0
  - 7.1
+ - 7.2
+ - 7.3
+ - 7.4
 
 # This section sets up the environment variables for the build.
 env:
  global:
   # This line determines which version branch of Moodle to test against.
-  - MOODLE_BRANCH=MOODLE_35_STABLE
+  - MOODLE_BRANCH=MOODLE_39_STABLE
   - IGNORE_PATHS=lang,editor,library,reporting
  # This matrix is used for testing against multiple databases.  So for
  # each version of PHP being tested, one build will be created for each
@@ -41,7 +36,7 @@ env:
  # using PHP 5.6 and mysqli.
  matrix:
   - DB=pgsql
-#  - DB=mysqli
+  - DB=mysqli
 
 # Optionally, it is possible to specify a different Moodle repo to use
 # (git://github.com/moodle/moodle.git is used by default):
@@ -51,14 +46,11 @@ env:
 before_install:
  # This disables XDebug which should speed up the build.
  - phpenv config-rm xdebug.ini
- # This installs NodeJS which is used by Grunt, etc.
- - nvm install 8.9
- - nvm use 8.9
  # Currently we are inside of the clone of your repository.  We move up two
  # directories to build the project.
  - cd ../..
  # Install this project into a directory called "ci".
- - composer create-project -n --no-dev --prefer-dist blackboard-open-source/moodle-plugin-ci ci ^2
+ - composer create-project -n --no-dev --prefer-dist moodlehq/moodle-plugin-ci ci ^3
  # Update the $PATH so scripts from this project can be called easily.
  - export PATH="$(cd ci/bin; pwd):$(cd ci/vendor/bin; pwd):$PATH"
 
diff --git a/classes/file_storage.php b/classes/file_storage.php
index aaf615c1478d410e890c1a7ac7c517a96950fd42..157837150d79cc189cf7ec88fc6c51483e219b66 100644
--- a/classes/file_storage.php
+++ b/classes/file_storage.php
@@ -730,7 +730,7 @@ class file_storage implements \H5PFileStorage {
             }
         }
 
-        // TODO: Return list of all files so they can be marked as temporary. JI-366
+        // TODO: Return list of all files so they can be marked as temporary. JI-366.
     }
 
     /**
@@ -874,7 +874,7 @@ class file_storage implements \H5PFileStorage {
         // Make sure the directory exists first.
         $matches = array();
         preg_match('/(.+)\/[^\/]*$/', $filepath, $matches);
-        // Recursively make directories
+        // Recursively make directories.
         if (!file_exists($matches[1])) {
             mkdir($matches[1], 0777, true);
         }
diff --git a/classes/framework.php b/classes/framework.php
index d5ad2c33cd081a48c3ed4b757577044f2b27d8a9..2d659b35f0fc6382fdde9157fe3046534a19a6e0 100644
--- a/classes/framework.php
+++ b/classes/framework.php
@@ -55,7 +55,7 @@ class framework implements \H5PFrameworkInterface {
         if (!isset($interface)) {
             $interface = new \mod_hvp\framework();
 
-            // Support alternate file storage class defined in $CFG
+            // Support alternate file storage class defined in $CFG.
             if (!empty($CFG->mod_hvp_file_storage_class)) {
                 $fsclass = $CFG->mod_hvp_file_storage_class;
             } else {
@@ -494,7 +494,7 @@ class framework implements \H5PFrameworkInterface {
 
         // Some strings such as error messages are not translatable, in this case use message
         // directly instead of crashing
-        // @see https://github.com/h5p/h5p-php-library/commit/2bd972168e7b22aaeea2dd13682ced9cf8233452#diff-5ca86cd0514d58be6708beff914aba66R1296
+        // @see https://github.com/h5p/h5p-php-library/commit/2bd972168e7b22aaeea2dd13682ced9cf8233452#diff-5ca86cd0514d58be6708beff914aba66R1296.
         if (!isset($translationsmap[$message])) {
             return $message;
         }
@@ -968,7 +968,7 @@ class framework implements \H5PFrameworkInterface {
             'timemodified' => time(),
         ));
 
-        if( isset( $content[ 'completionpass' ] ) ){
+        if (isset($content[ 'completionpass'])) {
             $data[ 'completionpass' ] = $content[ 'completionpass' ];
         }
 
diff --git a/classes/user_grades.php b/classes/user_grades.php
index b6ef20fc23b94a55e7a7daa2bbb08c4bdd9b42d4..3981875ab271d484b2a772e0388f77c1f029a6a2 100644
--- a/classes/user_grades.php
+++ b/classes/user_grades.php
@@ -96,7 +96,7 @@ class user_grades {
         $completion = new \completion_info( $course );
 
         if ( $completion->is_enabled( $cm) ) {
-            $completion->update_state($cm,COMPLETION_COMPLETE);
+            $completion->update_state($cm, COMPLETION_COMPLETE);
         }
 
         // Log results set event.
@@ -106,7 +106,7 @@ class user_grades {
                 $content->name, $content->major_version . '.' . $content->minor_version
         );
 
-        // Trigger Moodle event for async notification messages
+        // Trigger Moodle event for async notification messages.
         $event = \mod_hvp\event\attempt_submitted::create([
             'context' => $context,
         ]);
diff --git a/classes/view_assets.php b/classes/view_assets.php
index 49686fa183a80b09f73e8cf7d173d5240dd919b5..7c08bcef093f0d17a888068c31b773607b31b94e 100644
--- a/classes/view_assets.php
+++ b/classes/view_assets.php
@@ -339,7 +339,7 @@ class view_assets {
      */
     public static function getsiteroot() {
         global $CFG;
-        // In Moodle 3.4 version wwwroot is always the same as httpswwwroot
+        // In Moodle 3.4 version wwwroot is always the same as httpswwwroot.
         if ($CFG->version < 2017111300) {
             return $CFG->httpswwwroot;
         }
diff --git a/db/upgrade.php b/db/upgrade.php
index 642ffa41da7b6c48aaff62a914225aef5e2477fa..5303b4e2202bcd9ca93c108e7f3ea92e61621da0 100644
--- a/db/upgrade.php
+++ b/db/upgrade.php
@@ -481,7 +481,7 @@ function hvp_upgrade_2019030700() {
     }
 }
 
-function hvp_upgrade_2020080400(){
+function hvp_upgrade_2020080400() {
     global $DB;
     $dbman = $DB->get_manager();
     // Define field completionscorerequired to be added to hvp.
diff --git a/embed.php b/embed.php
index bb0b28c578c8c71fe15d68ac5a1f1fa9ff5e71f8..d6a8afefe3aeb727bdcea58e31737762e131eba9 100644
--- a/embed.php
+++ b/embed.php
@@ -75,7 +75,10 @@ require_capability('mod/hvp:view', $context);
 core\session\manager::write_close();
 
 // Set up view assets.
-$view    = new \mod_hvp\view_assets($cm, $course, ['disabledownload' => $disabledownload, 'disablefullscreen' => $disablefullscreen]);
+$view = new \mod_hvp\view_assets($cm, $course, [
+    'disabledownload'   => $disabledownload,
+    'disablefullscreen' => $disablefullscreen
+]);
 $content = $view->getcontent();
 $view->validatecontent();
 
diff --git a/lang/en/hvp.php b/lang/en/hvp.php
index b3cc6b28662b5c9b9e9d857cd64f3216f3a667e0..1cc289f7b5ce5d426a6c2002d39e80a12e6b7b7c 100644
--- a/lang/en/hvp.php
+++ b/lang/en/hvp.php
@@ -434,7 +434,7 @@ $string['reusecontent'] = 'Reuse Content';
 $string['reusedescription'] = 'Reuse this content.';
 $string['contentcopied'] = 'Content is copied to the clipboard';
 
-// Offline
+// Offline.
 $string['connectionlost'] = 'Connection lost. Results will be stored and sent when you regain connection.';
 $string['connectionreestablished'] = 'Connection reestablished.';
 $string['resubmitscores'] = 'Attempting to submit stored results.';
@@ -452,7 +452,7 @@ $string['couldnotparsejsonfromzip'] = 'Unable to parse JSON from the package: %f
 $string['couldnotparsepostdata'] = 'Could not parse post data.';
 $string['nombstringexteension'] = 'The mbstring PHP extension is not loaded. H5P needs this to function properly';
 
-// Messaging api
+// Messaging api.
 $string['messageprovider:confirmation'] = 'Confirmation of your own H5P submissions';
 $string['messageprovider:submission'] = 'Notification of H5P submissions';
 $string['emailnotifysubject'] = '{$a->studentname} has completed {$a->hvpname}';
diff --git a/lib.php b/lib.php
index 7a7234d6a03e9e0766cf53d32878d4981e201fdb..2db08dbbc78b639e6e87a35db2ab24b6d09d8e7f 100644
--- a/lib.php
+++ b/lib.php
@@ -421,4 +421,4 @@ function hvp_get_completion_state($course, $cm, $userid, $type) {
         }
     }
     return false;
-} 
+}
diff --git a/locallib.php b/locallib.php
index f75e4d344ad687d1e46070e57bbc9fe495980413..6679b0acccf29ca09410e344b7681c59ab23775a 100644
--- a/locallib.php
+++ b/locallib.php
@@ -64,7 +64,8 @@ function hvp_get_core_settings($context) {
     $settings = array(
         'baseUrl' => $basepath,
         'url' => "{$basepath}pluginfile.php/{$context->instanceid}/mod_hvp",
-        'urlLibraries' => "{$basepath}pluginfile.php/{$systemcontext->id}/mod_hvp/libraries", // NOTE: Separate context from content URL !
+        // NOTE: Separate context from content URL !
+        'urlLibraries' => "{$basepath}pluginfile.php/{$systemcontext->id}/mod_hvp/libraries",
         'postUserStatistics' => true,
         'ajax' => $ajaxpaths,
         'saveFreq' => $savefreq,
diff --git a/mod_form.php b/mod_form.php
index f3e546ca06ebc5d0e4b76f9cb6efdea801a63b08..403c2105528ae3cf2d81de3d7fb55824fab49729 100644
--- a/mod_form.php
+++ b/mod_form.php
@@ -393,7 +393,9 @@ class mod_hvp_mod_form extends moodleform_mod {
                 // Fix for legacy content upload to work.
                 // Fetch title from h5p.json or use a default string if not available.
                 $h5pvalidator = \mod_hvp\framework::instance('validator');
-                $data->metadata->title = empty($h5pvalidator->h5pC->mainJsonData['title']) ? 'Uploaded Content' : $h5pvalidator->h5pC->mainJsonData['title'];
+                $data->metadata->title = empty($h5pvalidator->h5pC->mainJsonData['title'])
+                    ? 'Uploaded Content'
+                    : $h5pvalidator->h5pC->mainJsonData['title'];
             }
             $data->name = $data->metadata->title; // Sort of a hack,
             // but there is no JavaScript that sets the value when there is no editor...
@@ -432,17 +434,18 @@ class mod_hvp_mod_form extends moodleform_mod {
         }
         return $data;
     }
-    
+
     public function add_completion_rules() {
-        $mform =& $this->_form;
-        $items = array();
-        $group = array();
+        $mform   =& $this->_form;
+        $items   = array();
+        $group   = array();
         $group[] = $mform->createElement('advcheckbox', 'completionpass', null, get_string('completionpass', 'hvp'),
-                array('group' => 'cpass'));
+            array('group' => 'cpass'));
         $mform->disabledIf('completionpass', 'completionusegrade', 'notchecked');
         $mform->addGroup($group, 'completionpassgroup', get_string('completionpass', 'hvp'), ' &nbsp; ', false);
         $mform->addHelpButton('completionpassgroup', 'completionpass', 'hvp');
         $items[] = 'completionpassgroup';
+
         return $items;
     }
 }