diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e92d978a052a7bd4965b3fb0c3b765dcbd0c6107
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,74 @@
+language: php
+os: linux
+
+addons:
+  firefox: "47.0.1"
+  postgresql: "9.4"
+
+cache:
+  directories:
+    - $HOME/.composer/cache
+    - $HOME/.npm
+
+services:
+  - mysql
+
+php:
+  - 7.2
+  - 7.3
+
+env:
+  jobs:
+    - DB=pgsql MOODLE_BRANCH=MOODLE_38_STABLE
+    - DB=pgsql MOODLE_BRANCH=master
+
+before_install:
+  - phpenv config-rm xdebug.ini
+  - nvm install 8.9
+  - nvm use 8.9
+  - cd ../..
+  - composer create-project -n --no-dev --prefer-dist blackboard-open-source/moodle-plugin-ci ci dev-master
+  - export PATH="$(cd ci/bin; pwd):$(cd ci/vendor/bin; pwd):$PATH"
+
+jobs:
+  include:
+    # Prechecks against latest Moodle stable only.
+    - stage: static
+      php: 7.3
+      env: DB=mysqli MOODLE_BRANCH=MOODLE_38_STABLE
+      install:
+        - moodle-plugin-ci install --no-init
+      script:
+        - moodle-plugin-ci phpdoc
+        - moodle-plugin-ci phplint
+        - moodle-plugin-ci phpcpd
+        - moodle-plugin-ci phpmd
+        - moodle-plugin-ci codechecker
+        - moodle-plugin-ci validate
+        - moodle-plugin-ci savepoints
+        - moodle-plugin-ci mustache
+        - moodle-plugin-ci grunt
+    # Smaller build matrix for development builds
+    - stage: develop
+      php: 7.3
+      env: DB=mysqli MOODLE_BRANCH=MOODLE_38_STABLE
+      install:
+        - moodle-plugin-ci install
+      script:
+        - moodle-plugin-ci phpunit --coverage-clover
+        - moodle-plugin-ci behat
+  fast_finish: true
+
+# Unit tests and behat tests against full matrix.
+install:
+  - moodle-plugin-ci install
+script:
+  - moodle-plugin-ci phpunit --coverage-clover
+  - moodle-plugin-ci behat
+
+stages:
+  - static
+  - name: develop
+    if: branch != master AND (type != pull_request OR head_branch != master) AND (tag IS blank)
+  - name: test
+    if: branch = master OR (type = pull_request AND head_branch = master) OR (tag IS present)