diff --git a/Project.toml b/Project.toml
index d3f21fb460d4a1ac99e49e5f583a5c75706235de..7ba527de8bf87ef1122fe8dd34428c3538840d23 100644
--- a/Project.toml
+++ b/Project.toml
@@ -9,6 +9,7 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
 Formatting = "59287772-0a20-5a39-b81b-1366585eb4c0"
 JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
 JSServe = "824d6782-a2ef-11e9-3a09-e5662e0c26f9"
+LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
 Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
 Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
 Meshes = "eacbb407-ea5a-433e-ab97-5258b1ca43fa"
@@ -16,6 +17,7 @@ Observables = "510215fc-4207-5dde-b226-833fc4488ee2"
 ObservationPolicies = "6317928a-6b1a-42e8-b853-b8e2fc3e9ca3"
 OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
 PlanarLarvae = "c2615984-ef14-4d40-b148-916c85b43307"
+Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
 StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
 Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
 TidyObservables = "c8131bbd-73a8-4254-a42d-d5d4c5febb31"
diff --git a/src/LarvaTagger.jl b/src/LarvaTagger.jl
index a2423378dda39adb91f4edfa0bd6e302ef334bf4..d605d979f4cf84a1b976c17e915ce11f5ebe0f85 100644
--- a/src/LarvaTagger.jl
+++ b/src/LarvaTagger.jl
@@ -16,6 +16,8 @@ using Meshes
 using Logging
 import Dates
 using OrderedCollections
+using Random
+using LinearAlgebra
 
 export larvaviewer, larvaeditor
 
diff --git a/src/controllers.jl b/src/controllers.jl
index 489616d2f222b6ab10a66db05d8bc006917285c7..1f2671f96bb57443bb159ffb8c050d9608bc55bd 100644
--- a/src/controllers.jl
+++ b/src/controllers.jl
@@ -173,6 +173,7 @@ struct LarvaController
     player::AbstractAnimator
     # could make LarvaController mutable instead...
     boundingbox::Ref{<:NTuple{4, <:AbstractFloat}}
+    medianlarvasize::AbstractFloat
 end
 
 function LarvaController(main::ControllerHub,
@@ -181,7 +182,8 @@ function LarvaController(main::ControllerHub,
         player::AbstractAnimator)
     activelarva = Observable{ActiveLarva}(nothing)
     boundingbox = Ref((0.0, 10.0, 0.0, 10.0))
-    LarvaController(main, model, tag_lut, activelarva, player, boundingbox)
+    mediansize = medianlarvasize(model)
+    LarvaController(main, model, tag_lut, activelarva, player, boundingbox, mediansize)
 end
 
 function LarvaController(main::ControllerHub,
@@ -211,6 +213,9 @@ getlarva(c, id) = getlarvae(c)[id]
 setboundingbox!(c, bb) = setboundingbox!(gethub(c)[:larva], bb)
 setboundingbox!(c::LarvaController, bb) = (c.boundingbox[] = bb)
 
+getmedianlarvasize(c) = getmedianlarvasize(gethub(c)[:larva])
+getmedianlarvasize(c::LarvaController) = c.medianlarvasize
+
 getplayer(c::LarvaController) = c.player
 getplayer(c) = getplayer(gethub(c))
 getplayer(hub::ControllerHub) = haskey(hub, :player) ? hub[:player] : getplayer(hub[:larva])
@@ -327,7 +332,8 @@ function slave(master::LarvaController,
                     tag_lut,
                     master.activelarva,
                     player,
-                    master.boundingbox)
+                    master.boundingbox,
+                    master.medianlarvasize)
 end
 
 stop!(controller::LarvaController) = stop!(controller.player)
diff --git a/src/models.jl b/src/models.jl
index fc0f7e3daf1d96a3257a0ca938e8dada2fba9b26..065687ff37d728c25623c86c124e89c4c00c0b1e 100644
--- a/src/models.jl
+++ b/src/models.jl
@@ -254,3 +254,19 @@ function downsample(timestamps::Vector{Int}, path::PathOrOutline; step::Int=20)
     start = mod1(timestamps[1], step)
     (timestamps[start:step:end], path[start:step:end])
 end
+
+medianlarvasize(larvae::Dict; n::Int=100) = medianlarvasize(collect(values(larvae)); n=n)
+
+function medianlarvasize(larvae::Vector{LarvaModel}; n::Int=100)
+    larvae = Random.shuffle(larvae)
+    sizes = Float64[]
+    sizehint!(sizes, n)
+    for k in 1:n
+        larva = larvae[mod1(k, length(larvae))]
+        _, state = larva.fullstates[rand(1:length(larva.fullstates))]
+        spine = state[:spine]
+        size = sum(norm.(diff(spine.vertices)))
+        push!(sizes, size)
+    end
+    return median(sizes)
+end
diff --git a/src/plots.jl b/src/plots.jl
index c2233d8504fa86db01f6cc164a157b7fb803eb8a..a424f665cdc49a2c8e62fca334b9cc182bb21b14 100644
--- a/src/plots.jl
+++ b/src/plots.jl
@@ -299,8 +299,6 @@ function assign_tag_to_segment!(larvaview, firststep)
     flag_active_larva_as_edited(controller)
 end
 
-const reference_larva_size = 2.25
-
 function setmouseevents!(scene, larva::SingleLarvaView; blocking=true, priority=Int8(10), kwargs...)
     # WGLMakie does not support addmouseevents! with plots as additional input args
     mouseevents = Makie.addmouseevents!(scene; priority=priority)
@@ -311,6 +309,8 @@ function setmouseevents!(scene, larva::SingleLarvaView; blocking=true, priority=
         return Consume(false)
     end
 
+    reference_larva_size = getmedianlarvasize(larva.controller)
+
     # dead code
     modifier_active() = ispressed(scene, Keyboard.left_shift)