diff --git a/cli.js b/cli.js
index 83fb342..284eeae 100755
--- a/cli.js
+++ b/cli.js
@@ -1,9 +1,10 @@
 #!/usr/bin/env node
 'use strict';
-var spawn = require('child_process').spawn;
-var mozjpeg = require('./');
 
-var input = process.argv.slice(2);
+const spawn = require('child_process').spawn;
+const mozjpeg = require('.');
+
+const input = process.argv.slice(2);
 
 spawn(mozjpeg, input, {stdio: 'inherit'})
 	.on('exit', process.exit);
diff --git a/index.js b/index.js
index fb0971d..7f82843 100644
--- a/index.js
+++ b/index.js
@@ -1,2 +1,3 @@
 'use strict';
+
 module.exports = require('./lib').path();
diff --git a/lib/index.js b/lib/index.js
index 628adc0..951334f 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -1,13 +1,14 @@
 'use strict';
-var path = require('path');
-var BinWrapper = require('bin-wrapper');
-var pkg = require('../package.json');
 
-var url = 'https://raw.githubusercontent.com/imagemin/mozjpeg-bin/v' + pkg.version + '/vendor/';
+const path = require('path');
+const BinWrapper = require('bin-wrapper');
+const pkg = require('../package.json');
+
+const url = `https://raw.githubusercontent.com/imagemin/mozjpeg-bin/v${pkg.version}/vendor/`;
 
 module.exports = new BinWrapper()
-	.src(url + 'macos/cjpeg', 'darwin')
-	.src(url + 'linux/cjpeg', 'linux')
-	.src(url + 'win/cjpeg.exe', 'win32')
+	.src(`${url}macos/cjpeg`, 'darwin')
+	.src(`${url}linux/cjpeg`, 'linux')
+	.src(`${url}win/cjpeg.exe`, 'win32')
 	.dest(path.join(__dirname, '../vendor'))
 	.use(process.platform === 'win32' ? 'cjpeg.exe' : 'cjpeg');
diff --git a/lib/install.js b/lib/install.js
index 8547617..963301b 100644
--- a/lib/install.js
+++ b/lib/install.js
@@ -1,31 +1,31 @@
 'use strict';
-var os = require('os');
-var BinBuild = require('bin-build');
-var log = require('logalot');
-var bin = require('./');
 
-var cpuNum = os.cpus().length;
+const os = require('os');
+const BinBuild = require('bin-build');
+const log = require('logalot');
+const bin = require('.');
 
-bin.run(['-version'], function (err) {
+const cpuNum = os.cpus().length;
+
+bin.run(['-version'], err => {
 	if (err) {
 		log.warn(err.message);
 		log.warn('mozjpeg pre-build test failed');
 		log.info('compiling from source');
 
-		var cfg = [
+		const cfg = [
 			'./configure --disable-shared --disable-dependency-tracking --with-jpeg8',
-			'--prefix="' + bin.dest() + '" --bindir="' + bin.dest() + '"',
-			'--libdir="' + bin.dest() + '"'
+			`--prefix="${bin.dest()}" --bindir="${bin.dest()}" --libdir="${bin.dest()}"`
 		].join(' ');
 
-		var builder = new BinBuild()
+		const builder = new BinBuild()
 			.src('https://github.com/mozilla/mozjpeg/releases/download/v3.1/mozjpeg-3.1-release-source.tar.gz')
 			.cmd('autoreconf -fiv')
 			.cmd(cfg)
-			.cmd('make --jobs=' + String(cpuNum))
-			.cmd('make install --jobs=' + String(cpuNum));
+			.cmd(`make --jobs=${cpuNum}`)
+			.cmd(`make install --jobs=${cpuNum}`);
 
-		return builder.run(function (err) {
+		return builder.run(err => {
 			if (err) {
 				log.error(err.stack);
 				return;
diff --git a/package.json b/package.json
index 15ec71a..b607f45 100644
--- a/package.json
+++ b/package.json
@@ -21,12 +21,12 @@
     }
   ],
   "engines": {
-    "node": ">=0.10.0"
+    "node": ">=4"
   },
   "bin": "cli.js",
   "scripts": {
     "postinstall": "node lib/install.js",
-    "test": "xo && mocha"
+    "test": "xo && ava"
   },
   "files": [
     "index.js",
@@ -44,16 +44,16 @@
     "optimize"
   ],
   "dependencies": {
-    "bin-build": "^2.0.0",
+    "bin-build": "^2.2.0",
     "bin-wrapper": "^3.0.0",
     "logalot": "^2.0.0"
   },
   "devDependencies": {
-    "bin-check": "^2.0.0",
-    "compare-size": "^1.0.1",
-    "mkdirp": "^0.5.0",
-    "mocha": "^2.2.4",
-    "rimraf": "^2.3.2",
+    "ava": "*",
+    "bin-check": "^4.0.1",
+    "compare-size": "^3.0.0",
+    "execa": "^0.6.3",
+    "tempy": "^0.1.0",
     "xo": "*"
   }
 }
diff --git a/test/fixtures/test.jpg b/test/fixtures/test.jpg
index 67b6e48..831b437 100644
Binary files a/test/fixtures/test.jpg and b/test/fixtures/test.jpg differ
diff --git a/test/test.js b/test/test.js
index 7d14f95..5737de6 100644
--- a/test/test.js
+++ b/test/test.js
@@ -1,92 +1,53 @@
-/* eslint-env mocha */
 'use strict';
-var assert = require('assert');
-var execFile = require('child_process').execFile;
-var fs = require('fs');
-var os = require('os');
-var path = require('path');
-var binCheck = require('bin-check');
-var BinBuild = require('bin-build');
-var compareSize = require('compare-size');
-var mkdirp = require('mkdirp');
-var rimraf = require('rimraf');
 
-var tmp = path.join(__dirname, 'tmp');
-var cpuNum = os.cpus().length;
-
-beforeEach(function (cb) {
-	mkdirp(tmp, cb);
-});
-
-afterEach(function (cb) {
-	rimraf(tmp, {disableGlob: true}, cb);
-});
-
-it('rebuild the mozjpeg binaries', function (cb) {
-	this.timeout(150000);
-
-	var cfg = [
+const fs = require('fs');
+const os = require('os');
+const path = require('path');
+const test = require('ava');
+const execa = require('execa');
+const tempy = require('tempy');
+const binCheck = require('bin-check');
+const BinBuild = require('bin-build');
+const compareSize = require('compare-size');
+const mozjpeg = require('..');
+
+const cpuNum = os.cpus().length;
+
+test.cb('rebuild the mozjpeg binaries', t => {
+	const tmp = tempy.directory();
+	const cfg = [
 		'./configure --disable-shared --disable-dependency-tracking --with-jpeg8',
-		'--prefix="' + tmp + '" --bindir="' + tmp + '"',
-		'--libdir="' + tmp + '"'
+		`--prefix="${tmp}" --bindir="${tmp}" --libdir="${tmp}"`
 	].join(' ');
 
 	new BinBuild()
 		.src('https://github.com/mozilla/mozjpeg/releases/download/v3.1/mozjpeg-3.1-release-source.tar.gz')
 		.cmd('autoreconf -fiv')
 		.cmd(cfg)
-		.cmd('make --jobs=' + String(cpuNum))
-		.cmd('make install --jobs=' + String(cpuNum))
-		.run(function (err) {
-			if (err) {
-				cb(err);
-				return;
-			}
-
-			assert(fs.statSync(path.join(tmp, 'cjpeg')).isFile());
-			cb();
+		.cmd(`make --jobs=${cpuNum}`)
+		.cmd(`make install --jobs=${cpuNum}`)
+		.run(err => {
+			t.ifError(err);
+			t.true(fs.existsSync(path.join(tmp, 'cjpeg')));
+			t.end();
 		});
 });
 
-it('return path to binary and verify that it is working', function (cb) {
-	var args = [
-		'-outfile', path.join(tmp, 'test.jpg'),
-		path.join(__dirname, 'fixtures/test.jpg')
-	];
-
-	binCheck(require('../'), args, function (err, works) {
-		if (err) {
-			cb(err);
-			return;
-		}
-
-		assert(works);
-		cb();
-	});
+test('return path to binary and verify that it is working', async t => {
+	t.true(await binCheck(mozjpeg, ['-version']));
 });
 
-it('minify a JPG', function (cb) {
-	var src = path.join(__dirname, 'fixtures/test.jpg');
-	var dest = path.join(tmp, 'test.jpg');
-	var args = [
+test('minify a JPG', async t => {
+	const tmp = tempy.directory();
+	const src = path.join(__dirname, 'fixtures/test.jpg');
+	const dest = path.join(tmp, 'test.jpg');
+	const args = [
 		'-outfile', dest,
 		src
 	];
 
-	execFile(require('../'), args, function (err) {
-		if (err) {
-			cb(err);
-			return;
-		}
-
-		compareSize(src, dest, function (err, res) {
-			if (err) {
-				cb(err);
-				return;
-			}
+	await execa(mozjpeg, args);
+	const res = await compareSize(src, dest);
 
-			assert(res[dest] < res[src]);
-			cb();
-		});
-	});
+	t.true(res[dest] < res[src]);
 });