diff --git a/.github/workflows/proof_tools.yml b/.github/workflows/proof_tools.yml
new file mode 100644
index 0000000000000000000000000000000000000000..66b1f2c76161df073df5cae6bbfaea2d73809423
--- /dev/null
+++ b/.github/workflows/proof_tools.yml
@@ -0,0 +1,30 @@
+name: proof_tools
+
+on: [push]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v2
+      with:
+        path: personoj
+
+    - name: setup
+      run: ${GITHUB_WORKSPACE}/personoj/tools/bootstrap.sh
+      shell: sh
+
+    - name: compile and run tests
+      run: |
+        cd "${GITHUB_WORKSPACE}"/personoj/proofs/ || exit 1
+        (cd dopth || exit 1
+         opam switch create . --packages dune --yes
+         eval $(opam env)
+         dune build) # TODO implement tests
+        (cd chainprops || exit 1
+         opam switch create . --deps-only --yes
+         eval $(opam env)
+         opam pin add ~/lambdapi --yes
+         eval $(opam env)
+         bmake tests)
diff --git a/proofs/man/.gitignore b/proofs/.gitignore
similarity index 100%
rename from proofs/man/.gitignore
rename to proofs/.gitignore
diff --git a/proofs/asciidoc.mk b/proofs/asciidoc.mk
deleted file mode 100644
index 117f9e5af94851d8fbac4d3582af1654ceec64a9..0000000000000000000000000000000000000000
--- a/proofs/asciidoc.mk
+++ /dev/null
@@ -1,6 +0,0 @@
-A2X ?= a2x
-
-.SUFFIXES: .1 .asciidoc
-
-.asciidoc.1:
-	${A2X} -f manpage -d manpage $<
diff --git a/proofs/chainprops/Makefile b/proofs/chainprops/Makefile
index dc2e1f754990d7e82d7a3fe3762e036f3021ca66..ff5959654bd062200620d481b313f2dab3c9a17b 100644
--- a/proofs/chainprops/Makefile
+++ b/proofs/chainprops/Makefile
@@ -1,24 +1,18 @@
-PREFIX ?= /usr/local/
-DUNE ?= dune
+EXE = psnj-chainprops
+MAN1 = psnj-chainprops.1
 
-all: psnj-chainprops psnj-chainprops.1
+DUNE ?= dune
 
 _build/default/chainprops.exe: chainprops.ml
 	@${DUNE} build
 
 psnj-chainprops: _build/default/chainprops.exe
-	@ln -sf _build/default/chainprops.exe $@
-
-tests:
-	@${DUNE} runtest
+	@cp -f _build/default/chainprops.exe $@
 
 psnj-chainprops.1: psnj-chainprops
 	@./psnj-chainprops --help=groff > $@
 
-man: psnj-chainprops.1
-
-install: all
-	cp -f psnj-chainprops ${PREFIX}/bin/
-	cp -f psnj-chainprops.1 ${PREFIX}/man/man1/
+tests:
+	@${DUNE} runtest
 
-.PHONY: install all man
+.include "../tools.mk"
diff --git a/proofs/dopth/Makefile b/proofs/dopth/Makefile
index 4cbb2807aed0a35c18b25696010f0487b4464c36..c3226ed70346397aadce64b1d0d7d007270e550c 100644
--- a/proofs/dopth/Makefile
+++ b/proofs/dopth/Makefile
@@ -1,19 +1,12 @@
 DUNE ?= dune
-PREFIX ?= /usr/local
-all: psnj-dopth psnj-dopth.1
 
-.include "../asciidoc.mk"
+EXE  = psnj-dopth
+MAN1 = psnj-dopth.1
 
 _build/default/dopth.exe: dopth.ml
 	${DUNE} build
 
 psnj-dopth: _build/default/dopth.exe
-	@ln -f _build/default/dopth.exe $@
+	@cp -f _build/default/dopth.exe $@
 
-man: psnj-dopth.1
-
-install: all
-	@cp -f psnj-dopth ${PREFIX}/bin/
-	@cp -f psnj-dopth.1 ${PREFIX}/man/man1/
-
-.PHONY: man install all
+.include "../tools.mk"
diff --git a/proofs/man/Makefile b/proofs/man/Makefile
deleted file mode 100644
index 11d645d5dd8527b4c1bc1b23bf140b74a7d168d8..0000000000000000000000000000000000000000
--- a/proofs/man/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-all: psnj-split.1
-	
-.include "../asciidoc.mk"
diff --git a/proofs/split/Makefile b/proofs/split/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d556daf606412b9250c3a8f997a3a55b93320f44
--- /dev/null
+++ b/proofs/split/Makefile
@@ -0,0 +1,4 @@
+EXE  = psnj-split
+MAN1 = psnj-split.1
+
+.include "../tools.mk"
diff --git a/proofs/bin/psnj-split b/proofs/split/psnj-split
similarity index 100%
rename from proofs/bin/psnj-split
rename to proofs/split/psnj-split
diff --git a/proofs/man/psnj-split.asciidoc b/proofs/split/psnj-split.asciidoc
similarity index 100%
rename from proofs/man/psnj-split.asciidoc
rename to proofs/split/psnj-split.asciidoc
diff --git a/proofs/tools.mk b/proofs/tools.mk
new file mode 100644
index 0000000000000000000000000000000000000000..35db2b0e0b4aa814e347203f8e318a128be33c12
--- /dev/null
+++ b/proofs/tools.mk
@@ -0,0 +1,36 @@
+PREFIX ?= /usr/local
+A2X    ?= a2x
+EXE    ?=
+MAN1   ?=
+MAN5   ?=
+
+.SUFFIXES: .1 .5 .asciidoc
+
+.asciidoc.1:
+	${A2X} -f manpage -d manpage $<
+
+.asciidoc.5:
+	${A2X} -f manpage -d manpage $<
+
+install: ${EXE} ${MAN}
+	cp -f ${EXE} ${PREFIX}/bin/
+	cp -f ${MAN1} ${PREFIX}/man/man1/
+	cp -f ${MAN5} ${PREFIX}/man/man5
+
+uninstall:
+.for e in ${EXE}
+	rm -f ${PREFIX}/bin/$e
+.endfor
+.for m in ${MAN1}
+	rm -f ${PREFIX}/man/man1/$m
+.endfor
+.for m in ${MAN5}
+	rm -f ${PREFIX}/man/man5/$m
+.endfor
+
+man: ${MAN1} ${MAN5}
+
+all: ${EXE} ${MAN1} ${MAN5}
+
+.MAIN: all
+.PHONY: man all install uninstall
diff --git a/tools/bootstrap.sh b/tools/bootstrap.sh
index cd208d300af415cad38b5c626e2ba38f34ef7a2d..52bd155ec10a876ba1ee96a6db30c32daa98445d 100755
--- a/tools/bootstrap.sh
+++ b/tools/bootstrap.sh
@@ -5,6 +5,8 @@ SCRIPT=$(realpath "$0")
 DIR=$(dirname "$SCRIPT")
 ROOT=$(realpath "${DIR}/..") # Root of personoj repo
 
+## Opam
+
 yes | sudo apt-get -q install \
 	zlib1g-dev libx11-dev libgmp-dev bubblewrap m4 gcc autoconf \
 	make unzip pkg-config git rsync bmake gcc perl \
@@ -12,13 +14,15 @@ yes | sudo apt-get -q install \
 sudo sysctl kernel.unprivileged_userns_clone=1 
 yes '/usr/local/bin' | sudo bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) --version 2.1.0"
 
+opam init --bare --no-setup -q
+
+## SBCL
+
 url="https://downloads.sourceforge.net/project/sbcl/sbcl/1.4.16/sbcl-1.4.16-x86-64-linux-binary.tar.bz2"
 (cd "${HOME}" || exit 1
  curl "$url" -L | tar jx
  ln -s sbcl* sbcl)
 
-opam init --bare --no-setup -q
-
 gclone () {
     (cd "$HOME"
      git clone "$1"
@@ -26,8 +30,9 @@ gclone () {
       git checkout "$3"))
 }
 
-gclone https://github.com/gabrielhdt/lambdapi.git lambdapi aae26f2d
-gclone https://github.com/SRI-CSL/PVS.git PVS pvs7.1
+# Lambdapi
+
+gclone https://github.com/gabrielhdt/lambdapi.git lambdapi 1a7031e4
 
 (cd "${HOME}/lambdapi" || exit 1
  opam switch create . --locked --deps-only --yes
@@ -35,6 +40,10 @@ gclone https://github.com/SRI-CSL/PVS.git PVS pvs7.1
  make install
  why3 config detect)
 
+# PVS
+
+gclone https://github.com/SRI-CSL/PVS.git PVS pvs7.1
+
 (cd "${HOME}/PVS" || exit 1
  autoconf
  ./configure)