diff --git a/.gitignore b/.gitignore
index 8790ff7..7ab3e39 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,77 @@
-build
-node_modules
-coverage
-*.log
 *.ldif
 *.tar.*
 *.tgz
+
+# Lock files
+pnpm-lock.yaml
+shrinkwrap.yaml
+package-lock.json
+yarn.lock
+
+# Logs
+logs
+*.log
+npm-debug.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+node_modules
+
+# Optional npm cache directory
+.npm
+
+# Optional REPL history
+.node_repl_history
+
+# 0x
+.__browserify_string_empty.js
+profile-*
+*.flamegraph
+
+# tap --cov
+.nyc_output/
+
+# JetBrains IntelliJ IDEA
+.idea/
+*.iml
+
+# VS Code
+.vscode/
+
+# xcode
+build/*
+*.mode1
+*.mode1v3
+*.mode2v3
+*.perspective
+*.perspectivev3
+*.pbxuser
+*.xcworkspace
+xcuserdata
+
+# macOS
 .DS_Store
+
+# keys
+*.pem
+*.env.json
+*.env
diff --git a/.taprc b/.taprc
new file mode 100644
index 0000000..13df826
--- /dev/null
+++ b/.taprc
@@ -0,0 +1 @@
+esm: false
diff --git a/package.json b/package.json
index 4fecaaf..8429283 100644
--- a/package.json
+++ b/package.json
@@ -33,20 +33,20 @@
     "asn1": "0.2.3",
     "assert-plus": "^1.0.0",
     "backoff": "^2.5.0",
-    "ldap-filter": "^0.3.3",
     "dashdash": "^1.14.0",
+    "ldap-filter": "^0.3.3",
     "once": "^1.4.0",
     "vasync": "^1.6.4",
     "verror": "^1.8.1"
   },
   "devDependencies": {
-    "faucet": "0.0.1",
-    "istanbul": "^0.4.5",
-    "tape": "^4.6.2",
+    "tap": "^14.6.1",
     "uuid": "^3.3.3"
   },
   "scripts": {
-    "report": "./node_modules/.bin/istanbul report html && open ./coverage/lcov-report/index.html",
-    "test": "./node_modules/.bin/istanbul cover --print none test/test.js | ./node_modules/.bin/faucet"
+    "test": "tap --no-cov 'test/**/*.test.js'",
+    "test:cov": "tap 'test/**/*.test.js'",
+    "test:cov:html": "tap --coverage-report=html 'test/**/*.test.js'",
+    "test:watch": "tap -n -w --no-coverage-report 'test/**/*.test.js'"
   }
 }
diff --git a/test/attribute.test.js b/test/attribute.test.js
index 21759d6..861a4cd 100644
--- a/test/attribute.test.js
+++ b/test/attribute.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/change.test.js b/test/change.test.js
index a6ea7f5..c4c018a 100644
--- a/test/change.test.js
+++ b/test/change.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/client.test.js b/test/client.test.js
index fa3b786..199c7ee 100644
--- a/test/client.test.js
+++ b/test/client.test.js
@@ -2,7 +2,7 @@
 
 var logger = Object.create(require('abstract-logging'));
 
-var test = require('tape').test;
+var test = require('tap').test;
 var uuid = require('uuid');
 var vasync = require('vasync');
 var util = require('util');
@@ -642,10 +642,12 @@ test('search sizeLimit', function (t) {
       res.on('error', t2.ifError.bind(t));
     });
   });
+
+  t.end()
 });
 
 
-test('search paged', function (t) {
+test('search paged', {timeout: 10000}, function (t) {
   t.test('paged - no pauses', function (t2) {
     var countEntries = 0;
     var countPages = 0;
diff --git a/test/controls/control.test.js b/test/controls/control.test.js
index 86bdfac..3b7da62 100644
--- a/test/controls/control.test.js
+++ b/test/controls/control.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/controls/entry_change_notification_control_test.js b/test/controls/entry_change_notification_control.test.js
similarity index 100%
rename from test/controls/entry_change_notification_control_test.js
rename to test/controls/entry_change_notification_control.test.js
diff --git a/test/controls/paged_results_control_test.js b/test/controls/paged_results_control.test.js
similarity index 100%
rename from test/controls/paged_results_control_test.js
rename to test/controls/paged_results_control.test.js
diff --git a/test/controls/persistent_search_control.test.js b/test/controls/persistent_search_control.test.js
index 11962e0..37a7667 100644
--- a/test/controls/persistent_search_control.test.js
+++ b/test/controls/persistent_search_control.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/controls/server_side_sorting_control_request.test.js b/test/controls/server_side_sorting_control_request.test.js
index 1830c0c..e2787dd 100644
--- a/test/controls/server_side_sorting_control_request.test.js
+++ b/test/controls/server_side_sorting_control_request.test.js
@@ -1,5 +1,5 @@
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/controls/server_side_sorting_control_response.test.js b/test/controls/server_side_sorting_control_response.test.js
index 1c38f77..432edb7 100644
--- a/test/controls/server_side_sorting_control_response.test.js
+++ b/test/controls/server_side_sorting_control_response.test.js
@@ -1,4 +1,4 @@
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/dn.test.js b/test/dn.test.js
index d86ddcf..fc2f312 100644
--- a/test/dn.test.js
+++ b/test/dn.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 
 ///--- Globals
diff --git a/test/errors.test.js b/test/errors.test.js
index 68b1035..2632166 100644
--- a/test/errors.test.js
+++ b/test/errors.test.js
@@ -1,6 +1,6 @@
 // Copyright 2015 Joyent, Inc.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var ldap = require('../lib/index');
 
diff --git a/test/filters/and.test.js b/test/filters/and.test.js
index 12fe4d2..c7b22c3 100644
--- a/test/filters/and.test.js
+++ b/test/filters/and.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/approx.test.js b/test/filters/approx.test.js
index d376c40..44b0ed3 100644
--- a/test/filters/approx.test.js
+++ b/test/filters/approx.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/eq.test.js b/test/filters/eq.test.js
index c30d5a6..f6a51ad 100644
--- a/test/filters/eq.test.js
+++ b/test/filters/eq.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/ext.test.js b/test/filters/ext.test.js
index 92d97ab..a84f1fd 100644
--- a/test/filters/ext.test.js
+++ b/test/filters/ext.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/ge.test.js b/test/filters/ge.test.js
index 9f400f6..e67780e 100644
--- a/test/filters/ge.test.js
+++ b/test/filters/ge.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/le.test.js b/test/filters/le.test.js
index c709680..d4c41d7 100644
--- a/test/filters/le.test.js
+++ b/test/filters/le.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/not.test.js b/test/filters/not.test.js
index 782138d..5fc9566 100644
--- a/test/filters/not.test.js
+++ b/test/filters/not.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/or.test.js b/test/filters/or.test.js
index 21f91cd..8622f78 100644
--- a/test/filters/or.test.js
+++ b/test/filters/or.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/parse.test.js b/test/filters/parse.test.js
index d02ec30..f1acf1a 100644
--- a/test/filters/parse.test.js
+++ b/test/filters/parse.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var parse = require('../../lib/index').parseFilter;
 
diff --git a/test/filters/presence.test.js b/test/filters/presence.test.js
index ff40483..3ed6f99 100644
--- a/test/filters/presence.test.js
+++ b/test/filters/presence.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/filters/substr.test.js b/test/filters/substr.test.js
index 1c0a5b8..e8bc9f8 100644
--- a/test/filters/substr.test.js
+++ b/test/filters/substr.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/laundry.test.js b/test/laundry.test.js
index 2c4ece5..69c78b6 100644
--- a/test/laundry.test.js
+++ b/test/laundry.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 var uuid = require('uuid');
 
 var ldap = require('../lib/index');
diff --git a/test/messages/add_request.test.js b/test/messages/add_request.test.js
index 0361ddc..37043f9 100644
--- a/test/messages/add_request.test.js
+++ b/test/messages/add_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/add_response.test.js b/test/messages/add_response.test.js
index 18ba114..4b362e1 100644
--- a/test/messages/add_response.test.js
+++ b/test/messages/add_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/bind_request.test.js b/test/messages/bind_request.test.js
index 8ea84ae..02522c6 100644
--- a/test/messages/bind_request.test.js
+++ b/test/messages/bind_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/bind_response.test.js b/test/messages/bind_response.test.js
index bc7ea03..fd8caf7 100644
--- a/test/messages/bind_response.test.js
+++ b/test/messages/bind_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/compare_request.test.js b/test/messages/compare_request.test.js
index de892ac..c28b7d5 100644
--- a/test/messages/compare_request.test.js
+++ b/test/messages/compare_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/compare_response.test.js b/test/messages/compare_response.test.js
index 535536a..fd4594c 100644
--- a/test/messages/compare_response.test.js
+++ b/test/messages/compare_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/del_request.test.js b/test/messages/del_request.test.js
index 8600ac4..d5a8c74 100644
--- a/test/messages/del_request.test.js
+++ b/test/messages/del_request.test.js
@@ -3,7 +3,7 @@
 
 var asn1 = require('asn1');
 var logger = Object.create(require('abstract-logging'));
-var test = require('tape').test;
+var test = require('tap').test;
 
 
 ///--- Globals
diff --git a/test/messages/del_response.test.js b/test/messages/del_response.test.js
index 72f8641..ebecb5c 100644
--- a/test/messages/del_response.test.js
+++ b/test/messages/del_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/ext_request.test.js b/test/messages/ext_request.test.js
index 5c2903e..4c378ab 100644
--- a/test/messages/ext_request.test.js
+++ b/test/messages/ext_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/ext_response.test.js b/test/messages/ext_response.test.js
index 369793a..b31559a 100644
--- a/test/messages/ext_response.test.js
+++ b/test/messages/ext_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/moddn_request.test.js b/test/messages/moddn_request.test.js
index f3d2f1b..6b55ea7 100644
--- a/test/messages/moddn_request.test.js
+++ b/test/messages/moddn_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/moddn_response.test.js b/test/messages/moddn_response.test.js
index 8804490..e257c8d 100644
--- a/test/messages/moddn_response.test.js
+++ b/test/messages/moddn_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/modify_request.test.js b/test/messages/modify_request.test.js
index 81609ba..046e216 100644
--- a/test/messages/modify_request.test.js
+++ b/test/messages/modify_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/modify_response.test.js b/test/messages/modify_response.test.js
index c35ae5c..f63993e 100644
--- a/test/messages/modify_response.test.js
+++ b/test/messages/modify_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/parser.test.js b/test/messages/parser.test.js
index 8a2d0cb..f6d431d 100644
--- a/test/messages/parser.test.js
+++ b/test/messages/parser.test.js
@@ -1,6 +1,6 @@
 // Copyright 2014 Joyent, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 var logger = Object.create(require('abstract-logging'));
 
 ///--- Globals
diff --git a/test/messages/search_entry.test.js b/test/messages/search_entry.test.js
index f22ebf7..7b41d53 100644
--- a/test/messages/search_entry.test.js
+++ b/test/messages/search_entry.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/search_request.test.js b/test/messages/search_request.test.js
index fdf684d..30ec9c4 100644
--- a/test/messages/search_request.test.js
+++ b/test/messages/search_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/search_response.test.js b/test/messages/search_response.test.js
index d5fe111..83ffeb7 100644
--- a/test/messages/search_response.test.js
+++ b/test/messages/search_response.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/messages/unbind_request.test.js b/test/messages/unbind_request.test.js
index 83603b2..058a124 100644
--- a/test/messages/unbind_request.test.js
+++ b/test/messages/unbind_request.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;
 
 var asn1 = require('asn1');
 
diff --git a/test/server.test.js b/test/server.test.js
index d9be4ac..acbdacd 100644
--- a/test/server.test.js
+++ b/test/server.test.js
@@ -2,7 +2,8 @@
 
 var logger = Object.create(require('abstract-logging'));
 
-var test = require('tape').test;
+var fs = require('fs')
+var tap = require('tap');
 var uuid = require('uuid');
 var vasync = require('vasync');
 
@@ -33,19 +34,27 @@ function getSock() {
 
 ///--- Tests
 
-test('load library', function (t) {
+tap.beforeEach(function (done, t) {
+  // We do not need a `.afterEach` to clean up the sock files because that
+  // is done when the server is destroyed.
+  t.context.sock = getSock()
+  done()
+})
+
+tap.test('load library', function (t) {
   ldap = require('../lib/index');
   t.ok(ldap.createServer);
   t.end();
 });
 
-test('basic create', function (t) {
-  server = ldap.createServer();
+tap.test('basic create', function (t) {
+  const server = ldap.createServer();
   t.ok(server);
   t.end();
 });
 
-test('properties', function (t) {
+tap.test('properties', function (t) {
+  const server = ldap.createServer();
   t.equal(server.name, 'LDAPServer');
 
   // TODO: better test
@@ -62,11 +71,10 @@ test('properties', function (t) {
   });
 });
 
-test('listen on unix/named socket', function (t) {
+tap.test('listen on unix/named socket', function (t) {
   t.plan(2);
-  server = ldap.createServer();
-  sock = getSock();
-  server.listen(sock, function () {
+  const server = ldap.createServer();
+  server.listen(t.context.sock, function () {
     t.ok(server.url);
     t.equal(server.url.split(':')[0], 'ldapi');
     server.close();
@@ -74,9 +82,9 @@ test('listen on unix/named socket', function (t) {
   });
 });
 
-test('listen on static port', function (t) {
+tap.test('listen on static port', function (t) {
   t.plan(2);
-  server = ldap.createServer();
+  const server = ldap.createServer();
   server.listen(SERVER_PORT, '127.0.0.1', function () {
     var addr = server.address();
     t.equal(addr.port, parseInt(SERVER_PORT, 10));
@@ -86,9 +94,9 @@ test('listen on static port', function (t) {
   });
 });
 
-test('listen on ephemeral port', function (t) {
+tap.test('listen on ephemeral port', function (t) {
   t.plan(2);
-  server = ldap.createServer();
+  const server = ldap.createServer();
   server.listen(0, 'localhost', function () {
     var addr = server.address();
     t.ok(addr.port > 0);
@@ -98,7 +106,7 @@ test('listen on ephemeral port', function (t) {
   });
 });
 
-test('route order', function (t) {
+tap.test('route order', function (t) {
   function generateHandler(response) {
     var func = function handler(req, res, next) {
       res.send({
@@ -149,9 +157,8 @@ test('route order', function (t) {
   });
 });
 
-test('route absent', function (t) {
-  server = ldap.createServer();
-  sock = getSock();
+tap.test('route absent', function (t) {
+  const server = ldap.createServer();
   var DN_ROUTE = 'dc=base';
   var DN_MISSING = 'dc=absent';
 
@@ -160,12 +167,12 @@ test('route absent', function (t) {
     return next();
   });
 
-  server.listen(sock, function () {
+  server.listen(t.context.sock, function () {
     t.ok(true, 'server startup');
     vasync.parallel({
       'funcs': [
         function presentBind(cb) {
-          var clt = ldap.createClient({ socketPath: sock });
+          var clt = ldap.createClient({ socketPath: t.context.sock });
           clt.bind(DN_ROUTE, '', function (err) {
             t.notOk(err);
             clt.unbind();
@@ -173,7 +180,7 @@ test('route absent', function (t) {
           });
         },
         function absentBind(cb) {
-          var clt = ldap.createClient({ socketPath: sock });
+          var clt = ldap.createClient({ socketPath: t.context.sock });
           clt.bind(DN_MISSING, '', function (err) {
             t.ok(err);
             t.equal(err.code, ldap.LDAP_NO_SUCH_OBJECT);
@@ -190,10 +197,9 @@ test('route absent', function (t) {
   });
 });
 
-test('route unbind', function (t) {
+tap.test('route unbind', function (t) {
   t.plan(4);
-  server = ldap.createServer();
-  sock = getSock();
+  const server = ldap.createServer();
 
   server.unbind(function (req, res, next) {
     t.ok(true, 'server unbind successful');
@@ -201,9 +207,9 @@ test('route unbind', function (t) {
     return next();
   });
 
-  server.listen(sock, function () {
+  server.listen(t.context.sock, function () {
     t.ok(true, 'server startup');
-    client = ldap.createClient({ socketPath: sock });
+    client = ldap.createClient({ socketPath: t.context.sock });
     client.bind('', '', function (err) {
       t.ifError(err, 'client bind error');
       client.unbind(function (err) {
@@ -215,16 +221,17 @@ test('route unbind', function (t) {
   });
 });
 
-test('strict routing', function (t) {
+tap.test('strict routing', function (t) {
   var testDN = 'cn=valid';
   var clt;
+  var server;
+  var sock = t.context.sock;
   vasync.pipeline({
     funcs: [
       function setup(_, cb) {
         server = ldap.createServer({
           // strictDN: true - on by default
         });
-        sock = getSock();
         // invalid DNs would go to default handler
         server.search('', function (req, res, next) {
           t.ok(req.dn);
@@ -279,11 +286,10 @@ test('strict routing', function (t) {
   });
 });
 
-test('non-strict routing', function (t) {
-  server = ldap.createServer({
+tap.test('non-strict routing', function (t) {
+  const server = ldap.createServer({
     strictDN: false
   });
-  sock = getSock();
   var testDN = 'this ain\'t a DN';
 
   // invalid DNs go to default handler
@@ -295,10 +301,10 @@ test('non-strict routing', function (t) {
     next();
   });
 
-  server.listen(sock, function () {
+  server.listen(t.context.sock, function () {
     t.ok(true, 'server startup');
     var clt = ldap.createClient({
-      socketPath: sock,
+      socketPath: t.context.sock,
       strictDN: false
     });
     clt.search(testDN, {scope: 'base'}, function (err, res) {
@@ -310,32 +316,32 @@ test('non-strict routing', function (t) {
       });
     });
   });
+});
 
-  test('close accept a callback', function (t) {
-    server = ldap.createServer();
-    // callback is called when the server is closed
-    server.close(function(err){
-      t.end();
-    });
+tap.test('close accept a callback', function (t) {
+  const server = ldap.createServer();
+  // callback is called when the server is closed
+  server.close(function(err){
+    t.end();
   });
+});
 
-  test('close without error calls callback', function (t) {
-    server = ldap.createServer();
-    // when the server is closed without error, the callback parameter is undefined
-    server.listen(1389,'127.0.0.1',function(err){
-      server.close(function(err){
-        t.error(err);
-        t.end();
-      });
-    });
-  });
-
-  test('close passes error to callback', function (t) {
-    server = ldap.createServer();
-    // when the server is closed with an error, the error is the first parameter of the callback
+tap.test('close without error calls callback', function (t) {
+  const server = ldap.createServer();
+  // when the server is closed without error, the callback parameter is undefined
+  server.listen(1389,'127.0.0.1',function(err){
     server.close(function(err){
-      t.ok(err);
+      t.error(err);
       t.end();
     });
   });
 });
+
+tap.test('close passes error to callback', function (t) {
+  const server = ldap.createServer();
+  // when the server is closed with an error, the error is the first parameter of the callback
+  server.close(function(err){
+    t.ok(err);
+    t.end();
+  });
+});
diff --git a/test/test.js b/test/test.js
deleted file mode 100644
index 5030dd0..0000000
--- a/test/test.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 Mark Cavage.  All rights reserved.
-
-var assert = require('assert');
-var fs = require('fs');
-var path = require('path');
-
-
-function runTests(directory) {
-  fs.readdir(directory, function (err, files) {
-    assert.ifError(err);
-
-    console.dir(files);
-    files.filter(function (f) {
-      return (/\.test\.js$/.test(f));
-    }).map(function (f) {
-      return (path.join(directory, f));
-    }).forEach(require);
-  });
-}
-
-///--- Run All Tests
-
-(function main() {
-  runTests(__dirname);
-  runTests(path.join(__dirname, 'controls'));
-  runTests(path.join(__dirname, 'filters'));
-  runTests(path.join(__dirname, 'messages'));
-})();
diff --git a/test/url.test.js b/test/url.test.js
index cc6ad19..47882c78 100644
--- a/test/url.test.js
+++ b/test/url.test.js
@@ -1,6 +1,6 @@
 // Copyright 2011 Mark Cavage, Inc.  All rights reserved.
 
-var test = require('tape').test;
+var test = require('tap').test;