diff --git a/external/.eslintrc b/external/.eslintrc
index b60ef2b5e..52a4bc203 100644
--- a/external/.eslintrc
+++ b/external/.eslintrc
@@ -5,7 +5,6 @@
 
   "env": {
     "node": true,
-    "shelljs": true,
   },
 
   "rules": {
diff --git a/package.json b/package.json
index e3ee2c866..a53fea4af 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,6 @@
     "mkdirp": "^0.5.1",
     "node-ensure": "^0.0.0",
     "rimraf": "^2.4.1",
-    "shelljs": "~0.4.0",
     "streamqueue": "^1.1.1",
     "systemjs": "^0.20.7",
     "systemjs-plugin-babel": "0.0.21",
diff --git a/test/.eslintrc b/test/.eslintrc
index 692abd312..30cdb53cc 100644
--- a/test/.eslintrc
+++ b/test/.eslintrc
@@ -5,7 +5,6 @@
 
   "env": {
     "node": true,
-    "shelljs": true,
     "jasmine": true,
   },
 }
diff --git a/test/webbrowser.js b/test/webbrowser.js
index 570d32874..aa158cd0c 100644
--- a/test/webbrowser.js
+++ b/test/webbrowser.js
@@ -22,7 +22,6 @@ var fs = require('fs');
 var path = require('path');
 var spawn = require('child_process').spawn;
 var testUtils = require('./testutils.js');
-var shelljs = require('shelljs');
 var crypto = require('crypto');
 
 var tempDirPrefix = 'pdfjs_';
@@ -141,28 +140,41 @@ WebBrowser.prototype = {
     var cmdKillAll, cmdCheckAllKilled, isAllKilled;
 
     if (process.platform === 'win32') {
-      var wmicPrefix = 'wmic process where "not Name = \'cmd.exe\' ' +
+      var wmicPrefix = ['process', 'where', '"not Name = \'cmd.exe\' ' +
         'and not Name like \'%wmic%\' ' +
-        'and CommandLine like \'%' + this.uniqStringId + '%\'" ';
-      cmdKillAll = wmicPrefix + 'call terminate';
-      cmdCheckAllKilled = wmicPrefix + 'get CommandLine';
+        'and CommandLine like \'%' + this.uniqStringId + '%\'"'];
+      cmdKillAll = {
+        file: 'wmic',
+        args: wmicPrefix.concat(['call', 'terminate'])
+      };
+      cmdCheckAllKilled = {
+        file: 'wmic',
+        args: wmicPrefix.concat(['get', 'CommandLine'])
+      };
       isAllKilled = function(exitCode, stdout) {
         return stdout.indexOf(this.uniqStringId) === -1;
       }.bind(this);
     } else {
-      cmdKillAll = 'pkill -f ' + this.uniqStringId;
-      cmdCheckAllKilled = 'pgrep -f ' + this.uniqStringId;
+      cmdKillAll = {file: 'pkill', args: ['-f', this.uniqStringId]};
+      cmdCheckAllKilled = {file: 'pgrep', args: ['-f', this.uniqStringId]};
       isAllKilled = function(pgrepStatus) {
         return pgrepStatus === 1; // "No process matched.", per man pgrep.
       };
     }
     function execAsyncNoStdin(cmd, onExit) {
-      var proc = shelljs.exec(cmd, {
-        async: true,
-        silent: true,
-      }, onExit);
+      var proc = spawn(cmd.file, cmd.args, {
+        shell: true,
+        stdio: 'pipe',
+      });
       // Close stdin, otherwise wmic won't run.
       proc.stdin.end();
+      var stdout = '';
+      proc.stdout.on('data', (data) => {
+        stdout += data;
+      });
+      proc.on('close', (code) => {
+        onExit(code, stdout);
+      });
     }
     var killDateStart = Date.now();
     // Note: First process' output it shown, the later outputs are suppressed.
@@ -235,7 +247,7 @@ ChromiumBrowser.prototype.buildArguments = function (url) {
 
 WebBrowser.create = function (desc) {
   var name = desc.name;
-  var path = shelljs.which(desc.path);
+  var path = fs.realpathSync(desc.path);
   if (!path) {
     throw new Error('Browser executable not found: ' + desc.path);
   }