diff --git a/doc/contrib/release.rst b/doc/contrib/release.rst
index a15714308e839d2bcf9dd6852756922ed1477bfb..fec49ee60d78f80604d9eade9fca33b6bf7f4a61 100644
--- a/doc/contrib/release.rst
+++ b/doc/contrib/release.rst
@@ -75,6 +75,8 @@ Release
    
 #. Change ``VERSION``. Make sure does not end with ``-rc`` or ``-dev``.
 
+#. Update ``scripts/check-all-tags.sh`` to check the current tag.
+
 #. Tag
 
    - commit and open a PR for the above changes.
diff --git a/scripts/check-all-tags.sh b/scripts/check-all-tags.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4a913befa73925f002308b19ccd0765f0f67aa6e
--- /dev/null
+++ b/scripts/check-all-tags.sh
@@ -0,0 +1,74 @@
+#!/usr/bin/env bash
+# Runs all C++ examples
+
+set -Eeuo pipefail
+
+if [[ "$#" -gt 1 ]]; then
+    echo "usage: run_cpp_examples.sh <prefix, e.g., mpirun -n 4 -oversubscribe>"
+	exit 1
+fi
+
+PREFIX="${1:-} `pwd`/build/bin"
+
+cxx=/usr/local/opt/llvm/bin/clang++
+cc=/usr/local/opt/llvm/bin/clang
+
+for tag in v0.4 v0.5.2 v0.6 v0.7
+do
+    echo "Version=$tag"
+    rm -rf ext/*
+    git checkout $tag
+    git checkout $tag -- ext/
+    git submodule update --init
+    for simd in ON OFF
+    do
+        echo " * simd=$simd"
+        out=results/$tag-`git rev-parse --short HEAD`/cpp/simd=$simd
+        cd build
+        cmake .. -DARB_USE_BUNDLED_LIBS=ON -DCMAKE_CXX_COMPILER=$cxx -DCMAKE_C_COMPILER=$cc -DCMAKE_BUILD_TYPE=release -DARB_VECTORIZE=$simd -DARB_ARCH=native
+        ninja install examples
+        cd -
+        for ex in bench brunel gap_junctions generators lfp ring single-cell "probe-demo v"
+        do
+            echo "   - $ex"
+            dir=`echo $ex | tr ' ' '_'`
+            mkdir -p $out/$dir
+            cd $out/$dir
+            $PREFIX/$ex > stdout.txt 2> stderr.txt
+            cd -
+        done
+    done
+done
+
+ok=0
+check () {
+    prog=$1
+    expected="$2 spikes"
+    actual=$(/usr/bin/grep -Eo '\d+ spikes' results/$tag/cpp/SIMD=$simd/$prog/stdout.txt || echo "N/A")
+    if [ "$expected" == "$actual" ]
+    then
+        echo "   - $prog: OK"
+    else
+        echo "   - $prog: ERROR wrong number of spikes: $expected ./. $actual"
+        ok=1
+    fi
+}
+
+for tag in "v0.4-79855b66" "v0.5.2-51e35898" "v0.6-930c23eb" "v0.7-d0e424b4"
+do
+    echo "Version=$tag"
+    for simd in ON OFF
+    do
+        echo " * SIMD=$simd"
+        check brunel 6998
+        check bench 972
+        if [[ "$tag" < "v0.7" ]]
+        then
+            check ring 19
+        else
+            check ring 94
+        fi
+        check gap_junctions 30
+    done
+done
+exit $ok
diff --git a/scripts/run_cpp_examples.sh b/scripts/run_cpp_examples.sh
index d463b29f3b3cf4b02edf7cb0144e765e4b62cc62..36c70669204872503052897a89ba508edd1fdb3e 100755
--- a/scripts/run_cpp_examples.sh
+++ b/scripts/run_cpp_examples.sh
@@ -8,14 +8,38 @@ if [[ "$#" -gt 1 ]]; then
 	exit 1
 fi
 
-PREFIX=${1:-}
+PREFIX="${1:-} `pwd`/build/bin"
+tag=dev-`git rev-parse --short HEAD`
+out="results/$tag/cpp/"
 
-$PREFIX build/bin/bench
-$PREFIX build/bin/brunel
-$PREFIX build/bin/dryrun
-$PREFIX build/bin/gap_junctions
-$PREFIX build/bin/generators
-$PREFIX build/bin/lfp
-$PREFIX build/bin/probe-demo v
-$PREFIX build/bin/ring
-$PREFIX build/bin/single-cell
+ok=0
+check () {
+    prog=$1
+    expected="$2 spikes"
+    actual=$(grep -Eo '[0-9]+ spikes' $out/$prog/stdout.txt || echo "N/A")
+    if [ "$expected" == "$actual" ]
+    then
+        echo "   - $prog: OK"
+    else
+        echo "   - $prog: ERROR wrong number of spikes: $expected ./. $actual"
+        ok=1
+    fi
+}
+
+for ex in bench brunel gap_junctions generators lfp ring single-cell "probe-demo v"
+do
+    echo "   - $ex"
+    dir=`echo $ex | tr ' ' '_'`
+    mkdir -p $out/$dir
+    cd $out/$dir
+    $PREFIX/$ex > stdout.txt 2> stderr.txt
+    cd -
+done
+
+# Do some sanity checks.
+check brunel 6998
+check bench 972
+check ring 94
+check gap_junctions 30
+
+exit $ok