diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bf08b9f1c699dcc6b02b3128dfdb522e9ac0593e..b7496667573fc7294ca60f45f84e088f4e2e4806 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -57,7 +57,7 @@ Julia 1.9:
 
 
 docs:
-  image: docker.km3net.de/base/julia:1.8-tex
+  image: docker.km3net.de/base/julia:1.9-tex
   stage: docs
   script:
     - |
diff --git a/Project.toml b/Project.toml
index c4ee45ae3d0a23810d5eb51e60160447c54b00ff..53c98506189b4e03174bc82184ea3280c3d662d5 100644
--- a/Project.toml
+++ b/Project.toml
@@ -1,7 +1,7 @@
 name = "KM3io"
 uuid = "2cab5852-6f21-4982-99b0-6a4792870cfb"
 authors = ["Tamas Gal", "Johannes Schumann"]
-version = "0.16.2"
+version = "0.16.3"
 
 [deps]
 Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
diff --git a/docs/src/api.md b/docs/src/api.md
index a7c8e419e66a09cf0349bdc2c9396615cd4043eb..bb64c27229eaf9a225e10f7ac3b774d49bf14f93 100644
--- a/docs/src/api.md
+++ b/docs/src/api.md
@@ -150,3 +150,8 @@ bestaashower
 RecStageRange
 hashistory
 ```
+
+### Math
+```@docs
+angle
+```
diff --git a/src/KM3io.jl b/src/KM3io.jl
index 75df8d56f9287e45870109ec9961c1822fc31b16..4584cd8a4bfb2ee85b5e2454cce1a2b347236ff0 100644
--- a/src/KM3io.jl
+++ b/src/KM3io.jl
@@ -102,6 +102,7 @@ include("tools/general.jl")
 include("tools/daq.jl")
 include("tools/trigger.jl")
 include("tools/reconstruction.jl")
+include("tools/math.jl")
 include("tools/helpers.jl")
 
 include("physics.jl")
diff --git a/src/tools/math.jl b/src/tools/math.jl
new file mode 100644
index 0000000000000000000000000000000000000000..114bb448ff49efabd714983bbd5af1574dd6e1f2
--- /dev/null
+++ b/src/tools/math.jl
@@ -0,0 +1,7 @@
+"""
+Calculate the angle between two vectors.
+"""
+Base.angle(d1::Direction, d2::Direction) = acos(min(dot(normalize(d1), normalize(d2)), 1))
+Base.angle(a::T, b::T) where {T<:Union{KM3io.AbstractCalibratedHit, KM3io.PMT}} = Base.angle(a.dir, b.dir)
+Base.angle(a, b::Union{KM3io.AbstractCalibratedHit, KM3io.PMT}) = Base.angle(a, b.dir)
+Base.angle(a::Union{KM3io.AbstractCalibratedHit, KM3io.PMT}, b) = Base.angle(a.dir, b)
diff --git a/test/tools.jl b/test/tools.jl
index 83507ed4438643a205b52c20d4bf62208fceeacf..59221d304e70ba6fb7b76ed30f691b201ea81b7d 100644
--- a/test/tools.jl
+++ b/test/tools.jl
@@ -327,3 +327,11 @@ end
     @assert 111 == length(mc_event.mc_hits)
     @assert 4 == length(mc_event.mc_trks)
 end
+
+
+@testset "math" begin
+    @test 0 == angle(Direction(1.,0,0), Direction(1.,0,0))
+    @test π/2 ≈ angle(Direction(1.,0,0), Direction(0.,1,0))
+    @test π/2 ≈ angle(Direction(1.,0,0), Direction(0.,0,1))
+    @test π ≈ angle(Direction(1.,0,0), Direction(-1.,0,0))
+end