diff --git a/.travis.yml b/.travis.yml
index 2b9bf173..806e70ad 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,18 +5,10 @@ node_js:
   - "10"
   - "12"
 
+addons:
+  chrome: stable
+
 after_success: npm run coverage
 
-# see https://www.npmjs.com/package/phantomjs-prebuilt#continuous-integration
-cache:
-  directories:
-    - travis_phantomjs
 before_install:
   - npm config set registry http://ci.strongloop.com:4873/
-  # Upgrade PhantomJS to v2.1.1.
-  - "export PHANTOMJS_VERSION=2.1.1"
-  - "export PATH=$PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin:$PATH"
-  - "if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then rm -rf $PWD/travis_phantomjs; mkdir -p $PWD/travis_phantomjs; fi"
-  - "if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then wget https://github.com/Medium/phantomjs/releases/download/v$PHANTOMJS_VERSION/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -O $PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2; fi"
-  - "if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then tar -xvf $PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs; fi"
-  - "phantomjs --version"
diff --git a/Gruntfile.js b/Gruntfile.js
index 01e33dc9..19671a44 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -31,11 +31,6 @@ module.exports = function(grunt) {
         },
       },
     },
-    run: {
-      optionalInstall: {
-        exec: 'npm install --no-save --silent karma-phantomjs-launcher phantomjs-prebuilt',
-      },
-    },
     eslint: {
       gruntfile: {
         src: 'Gruntfile.js',
@@ -109,7 +104,7 @@ module.exports = function(grunt) {
     karma: {
       'unit-once': {
         configFile: 'test/karma.conf.js',
-        browsers: ['PhantomJS'],
+        browsers: ['ChromeHeadless'],
         singleRun: true,
         reporters: ['dots', 'junit'],
 
@@ -216,7 +211,6 @@ module.exports = function(grunt) {
   });
 
   // These plugins provide necessary tasks.
-  grunt.loadNpmTasks('grunt-run');
   grunt.loadNpmTasks('grunt-browserify');
   grunt.loadNpmTasks('grunt-contrib-uglify');
   grunt.loadNpmTasks('grunt-eslint');
@@ -242,14 +236,12 @@ module.exports = function(grunt) {
   // Default task.
   grunt.registerTask('default', ['browserify']);
 
-  grunt.registerTask('phantomTests', ['run', 'karma:unit-once']);
-
   grunt.registerTask('test', [
     'eslint',
     process.env.JENKINS_HOME ? 'mochaTest:unit-xml' : 'mochaTest:unit',
     process.env.JENKINS_HOME && (/^win/.test(process.platform) ||
       /^s390x/.test(process.arch) || /^ppc64/.test(process.arch)) ?
-      'skip-karma' : 'phantomTests',
+      'skip-karma' : 'karma:unit-once',
   ]);
 
   // alias for sl-ci-run and `npm test`
diff --git a/package.json b/package.json
index 3aea05ec..b6dbd7e1 100644
--- a/package.json
+++ b/package.json
@@ -63,9 +63,7 @@
     "underscore.string": "^3.3.5"
   },
   "devDependencies": {
-    "babel-preset-es2015": "^6.22.0",
-    "babelify": "^7.3.0",
-    "browserify": "^13.1.0",
+    "browserify": "^16.5.0",
     "chai": "^3.5.0",
     "cookie-parser": "^1.3.4",
     "coveralls": "^3.0.2",
@@ -82,7 +80,6 @@
     "grunt-eslint": "^21.0.0",
     "grunt-karma": "^3.0.2",
     "grunt-mocha-test": "^0.13.3",
-    "grunt-run": "^0.8.1",
     "karma": "^4.1.0",
     "karma-browserify": "^6.0.0",
     "karma-chrome-launcher": "^2.2.0",
diff --git a/test/karma.conf.js b/test/karma.conf.js
index 1180b0f5..1567fe20 100644
--- a/test/karma.conf.js
+++ b/test/karma.conf.js
@@ -64,7 +64,6 @@ module.exports = function(config) {
       'karma-browserify',
       'karma-es6-shim',
       'karma-mocha',
-      'karma-phantomjs-launcher',
       'karma-chrome-launcher',
       'karma-junit-reporter',
     ],
@@ -104,27 +103,18 @@ module.exports = function(config) {
         'superagent',
         'supertest',
       ],
-      transform: [
-        ['babelify', {
-          presets: [
-            ['es2015', {
-              // Disable transform-es2015-modules-commonjs which adds
-              // "use strict" to all files, even those that don't work
-              // in strict mode
-              // (e.g. chai, loopback-datasource-juggler, etc.)
-              modules: false,
-            }],
-          ],
-          // By default, browserify does not transform node_modules
-          // As a result, our dependencies like strong-remoting and juggler
-          // are kept in original ES6 form that does not work in PhantomJS
-          global: true,
-          // Prevent SyntaxError in strong-task-emitter:
-          //   strong-task-emitter/lib/task.js (83:4):
-          //   arguments is a reserved word in strict mode
-          ignore: /node_modules\/(strong-task-emitter)\//,
-        }],
-      ],
+      packageFilter: function(pkg, dir) {
+        // async@3 (used e.g. by loopback-connector) is specifying custom
+        // browserify config, in particular it wants to apply transformation
+        // `babelify`. We don't have `babelify` installed because we are
+        // testing using latest Chrome and thus don't need any transpilation.
+        // Let's remove the browserify config from the package and force
+        // browserify to use our config instead.
+        if (pkg.name === 'async') {
+          delete pkg.browserify;
+        }
+        return pkg;
+      },
       debug: true,
       // noParse: ['jquery'],
       watch: true,