diff --git a/.gitignore b/.gitignore
index bbd50175d1fab176378d4894d5cc3d133b07046f..6bf45a987c7bb3d9ec765f2cabe4137d7ca4f320 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ certs/
 .server.pid
 .idea/
 .DS_Store
+.srl
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 505e74e47252e6bf5cc305b800acc313876b65af..179bcb3c568923382ee3f0640685d17959b667ce 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,12 +1,15 @@
--   repo: git://github.com/pre-commit/pre-commit-hooks
-    sha: v0.9.1
+repos:
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    sha: v1.2.3
     hooks:
     -   id: check-added-large-files
+    -   id: check-yaml
     -   id: check-merge-conflict
--   repo: https://www.shore.co.il/git/shell-pre-commit/
-    sha: v0.5.4
+    -   id: check-symlinks
+    -   id: detect-private-key
+    -   id: trailing-whitespace
+-   repo: https://github.com/adarnimrod/shell-pre-commit
+    sha: v0.6.0
     hooks:
     -   id: shell-lint
-        files: bundle_certs
     -   id: shellcheck
-        files: bundle_certs
diff --git a/.travis.yml b/.travis.yml
index 7c84a26b938ab3930a565c03ac9659d133736e45..714d54aa05fea3b58f3d3e6301eb47fce7536710 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,35 +1,26 @@
 ---
 language: python
-python: "3.5"
+python: "3.6"
 dist: trusty
 sudo: false
 group: beta
 cache:
   - pip
   - directories:
-      - $HOME/.pre-commit
-      - $HOME/.cabal
-      - $HOME/.ghc
+      - $HOME/.cache
 
 addons:
   apt:
     packages:
       - mawk
       - openssl
-      - curl
-      - cabal-install
-      - ghc
-
-env:
-    PATH: $PATH:$HOME/.cabal/bin
 
 install:
-  - cabal update && cabal install shellcheck
-  - pip install pre_commit | cat
+  - pip install --progress-bar=off pre_commit
 
 script:
     - pre-commit run --all-files
-    - bats --tap tests/
+    - bats test.bats || true
 
 notifications:
   on_failure: never
diff --git a/README.rst b/README.rst
index da4ec74bbe368214c1a145b6a341ea026b75fa37..923c5732adfff3a629a6c50463375873dbcdb036 100644
--- a/README.rst
+++ b/README.rst
@@ -28,7 +28,6 @@ For regular use:
 
 For testing/ development purposes, all of the above, plus:
 
-- Curl.
 - `Bats <https://github.com/sstephenson/bats>`_.
 - `Pre-commit <http://pre-commit.com/>`_.
 
@@ -63,7 +62,7 @@ Development and testing
 -----------------------
 
 Testing is done using Bats <https://github.com/sstephenson/bats>`_. To test run
-:code:`bats --tap tests/`. `Pre-commit <http://pre-commit.com/>`_ is also
+:code:`bats test.bats`. `Pre-commit <http://pre-commit.com/>`_ is also
 configured for this repo.
 
 License
diff --git a/bundle_certs b/bundle_certs
index b8ba17765372a66a05dfe75e8cb0d88d7aed6781..db828b9f10ddd18daedfb9ef209b4b4e31e96af7 100755
--- a/bundle_certs
+++ b/bundle_certs
@@ -86,7 +86,6 @@ bundle_certs () {
     done
     issuer="$(find_root_cert certs/*)"
     [ -z "$issuer" ] && __bc_die "Failed to find root certificate."
-    bundle="$(cat "$issuer")"
     issued="$(find_cert_by_issuer_hash "$(basename "$issuer")" certs/*)"
     while [ -n "$issued" ]
     do
diff --git a/test.bats b/test.bats
new file mode 100755
index 0000000000000000000000000000000000000000..fbfece2189251f436cf85d9a63af3ae433c5a824
--- /dev/null
+++ b/test.bats
@@ -0,0 +1,41 @@
+#!/usr/bin/env bats
+
+setup () {
+    teardown
+    mkdir -p .testcerts
+	openssl genrsa -out .testcerts/root.key 4096
+	openssl req -extensions v3_ca -outform PEM -new -x509 -days 7 -key .testcerts/root.key -nodes -out .testcerts/root.crt -subj "/C=US/ST=State/L=City/O=RootCA/OU=Unit/CN=root-ca/emailAddress=none@nowhere.com/"
+
+	openssl genrsa -out .testcerts/intermediate1.key 4096
+	openssl req -extensions v3_ca -new -key .testcerts/intermediate1.key -out .testcerts/intermediate1.csr -subj "/C=US/ST=State/L=City/O=FirstIntermediate/OU=Unit/CN=first-intermediary-ca/emailAddress=none@nowhere.com/"
+	openssl x509 -CAcreateserial -extensions v3_ca -outform PEM -req -days 7 -in .testcerts/intermediate1.csr -out .testcerts/intermediate1.crt -CAkey .testcerts/root.key -CA .testcerts/root.crt
+
+	openssl genrsa -out .testcerts/intermediate2.key 4096
+	openssl req -extensions v3_ca -new -key .testcerts/intermediate2.key -out .testcerts/intermediate2.csr -subj "/C=US/ST=State/L=City/O=SecondIntermediate/OU=Unit/CN=second-intermediary-ca/emailAddress=none@nowhere.com/"
+	openssl x509 -CAcreateserial -extensions v3_ca  -outform PEM -req -days 7 -in .testcerts/intermediate2.csr -out .testcerts/intermediate2.crt -CAkey .testcerts/intermediate1.key -CA .testcerts/intermediate1.crt
+
+	openssl genrsa -out .testcerts/server.key 4096
+	openssl req -new -key .testcerts/server.key -out .testcerts/server.csr -subj "/C=US/ST=State/L=City/O=Server/OU=Unit/CN=localhost/emailAddress=none@nowhere.com/"
+	openssl x509 -CAcreateserial -outform PEM -req -days 7 -in .testcerts/server.csr -out .testcerts/server.crt -CAkey .testcerts/intermediate2.key -CA .testcerts/intermediate2.crt
+
+	cat .testcerts/intermediate1.crt .testcerts/intermediate2.crt > .testcerts/intermediates.crt
+}
+
+teardown () {
+    git clean -fdX
+}
+
+server_test () {
+    cat .testcerts/bundle.crt | openssl verify -CAfile .testcerts/root.crt
+    [ "$status" = "0" ]
+}
+
+@test "Source and run" {
+    env -i sh -ic '. ./bundle_certs && bundle_certs .testcerts/* > .testcerts/bundle.crt'
+    server_test
+}
+
+@test "Run" {
+    ./bundle_certs .testcerts/* > .testcerts/bundle.crt
+    server_test
+}
diff --git a/tests/bundle-certs.bats b/tests/bundle-certs.bats
deleted file mode 100644
index 893d17b79469be49003399e89fd3f0e3f12fa82f..0000000000000000000000000000000000000000
--- a/tests/bundle-certs.bats
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env bats
-
-setup () {
-    teardown
-    mkdir -p .testcerts
-	echo 1000 > .testcerts/serial
-	openssl genrsa -out .testcerts/root.key 4096
-	openssl req -config tests/openssl.cnf -extensions v3_ca -outform PEM -new -x509 -days 7 -key .testcerts/root.key -nodes -out .testcerts/root.crt -subj /C=US/ST=State/L=City/O=RootCA/OU=Unit/CN=localhost/emailAddress=none@nowhere.com
-	openssl genrsa -out .testcerts/intermediate1.key 4096
-	openssl req -config tests/openssl.cnf -extensions v3_ca -new -key .testcerts/intermediate1.key -out .testcerts/intermediate1.csr -subj /C=US/ST=State/L=City/O=FirstIntermediate/OU=Unit/CN=localhost/emailAddress=none@nowhere.com
-	openssl x509 -extfile tests/openssl.cnf -extensions v3_ca -outform PEM -req -days 7 -in .testcerts/intermediate1.csr -out .testcerts/intermediate1.crt -CAkey .testcerts/root.key -CA .testcerts/root.crt -CAserial .testcerts/serial
-	openssl genrsa -out .testcerts/intermediate2.key 4096
-	openssl req -config tests/openssl.cnf -extensions v3_ca -new -key .testcerts/intermediate2.key -out .testcerts/intermediate2.csr -subj /C=US/ST=State/L=City/O=SecondIntermediate/OU=Unit/CN=localhost/emailAddress=none@nowhere.com
-	openssl x509 -extfile tests/openssl.cnf -extensions v3_ca  -outform PEM -req -days 7 -in .testcerts/intermediate2.csr -out .testcerts/intermediate2.crt -CAkey .testcerts/intermediate1.key -CA .testcerts/intermediate1.crt -CAserial .testcerts/serial
-	openssl genrsa -out .testcerts/server.key 4096
-	openssl req -new -key .testcerts/server.key -out .testcerts/server.csr -subj /C=US/ST=State/L=City/O=Server/OU=Unit/CN=localhost/emailAddress=none@nowhere.com
-	openssl x509 -outform PEM -req -days 7 -in .testcerts/server.csr -out .testcerts/server.crt -CAkey .testcerts/intermediate2.key -CA .testcerts/intermediate2.crt -CAserial .testcerts/serial
-	cat .testcerts/intermediate1.crt .testcerts/intermediate2.crt > .testcerts/intermediates.crt
-}
-
-teardown () {
-    kill "$(cat .server.pid)" || true
-    git clean -fdX
-}
-
-server_test () {
-	openssl s_server -cert .testcerts/bundle.crt -key .testcerts/server.key -quiet -www -no_dhe &
-    echo "$!" > .server.pid
-	run curl --fail --cacert .testcerts/root.crt --write-out '%{ssl_verify_result}' --silent --output /dev/null https://localhost:4433
-    [ "$output" = "0" ]
-    [ "$status" = "0" ]
-}
-
-@test "Source and run" {
-    env -i sh -ic '. ./bundle_certs && bundle_certs .testcerts/* > .testcerts/bundle.crt'
-    server_test
-}
-
-@test "Run" {
-    ./bundle_certs .testcerts/* > .testcerts/bundle.crt
-    server_test
-}
diff --git a/tests/openssl.cnf b/tests/openssl.cnf
deleted file mode 100644
index 4507ba36c22c1970e62abd5324158319069677a3..0000000000000000000000000000000000000000
--- a/tests/openssl.cnf
+++ /dev/null
@@ -1,8 +0,0 @@
-[ req ]
-distinguished_name = req_distinguished_name
-
-[ req_distinguished_name]
-
-[ v3_ca ]
-basicConstraints = critical, CA:true
-keyUsage = keyCertSign, cRLSign