diff --git a/src/Taggers.jl b/src/Taggers.jl
index 833096a3c396afeb5a258c4497bf2f17ccbaada4..dbfccf2eaba740b45c9c0c01dc164cbf29bc8644 100644
--- a/src/Taggers.jl
+++ b/src/Taggers.jl
@@ -8,14 +8,18 @@ struct Tagger
     backend_dir::String
     model_instance::String
     sandbox::Union{Nothing, String}
+    output_filenames::Dict{String, String}
 end
 
-Tagger(backend_dir, model_instance) = Tagger(backend_dir, model_instance, nothing)
+function Tagger(backend_dir, model_instance)
+    Tagger(backend_dir, model_instance, nothing, Dict{String, String}())
+end
 
 function isolate(tagger)
     mkpath(joinpath(tagger.backend_dir, "data", "raw"))
     rawdatadir = mktempdir(joinpath(tagger.backend_dir, "data", "raw"); cleanup=false)
-    Tagger(tagger.backend_dir, tagger.model_instance, basename(rawdatadir))
+    Tagger(tagger.backend_dir, tagger.model_instance, basename(rawdatadir),
+           tagger.output_filenames)
 end
 
 isbackend(path) = isdir(joinpath(path, "models")) &&
@@ -134,7 +138,8 @@ function pull(tagger::Tagger, dest_dir::String)
             parent′= joinpath(dest_dir, relpath(parent, proc_data_dir))
             for file in files
                 src_file = normpath(joinpath(parent, file))
-                dest_file = normpath(joinpath(parent′, file))
+                file′= get(tagger.output_filenames, file, file)
+                dest_file = normpath(joinpath(parent′, file′))
                 if dest_file != src_file
                     open(src_file, "r") do f
                         open(dest_file, "w") do g
diff --git a/src/cli.jl b/src/cli.jl
index 9fdf28250fcc86fb906e1370f79181e432c66bb7..ab9a0341feff42dd394f059febff75c9314090e4 100644
--- a/src/cli.jl
+++ b/src/cli.jl
@@ -11,8 +11,8 @@ usage = """Larva Tagger.
 Usage:
   larvatagger.jl open <file-path> [--backends=<path>] [--port=<number>] [--quiet] [--viewer] [--browser] [--manual-label=<label>]
   larvatagger.jl import <input-path> [<output-file>] [--id=<id>] [--framerate=<fps>] [--pixelsize=<μm>] [--overrides=<comma-separated-list>] [--default-label=<label>] [--manual-label=<label>] [--decode]
-  larvatagger.jl train <backend-path> <data-path> <model-instance> [--pretrained-model=<instance>] [--labels=<comma-separated-list>] [--sample-size=<N>] [--balancing-strategy=<strategy>] [--class-weights=<csv>] [--manual-label=<label>] [--layers=<N>] [--iterations=<N>]
-  larvatagger.jl predict <backend-path> <model-instance> <data-path> [--make-dataset] [--skip-make-dataset] [--data-isolation]
+  larvatagger.jl train <backend-path> <data-path> <model-instance> [--pretrained-model=<instance>] [--labels=<comma-separated-list>] [--sample-size=<N>] [--balancing-strategy=<strategy>] [--class-weights=<csv>] [--manual-label=<label>] [--layers=<N>] [--iterations=<N>] [--seed=<seed>]
+  larvatagger.jl predict <backend-path> <model-instance> <data-path> [--output=<filename>] [--make-dataset] [--skip-make-dataset] [--data-isolation]
   larvatagger.jl merge <input-path> <input-file> [<output-file>] [--manual-label=<label>] [--decode]
   larvatagger.jl -V | --version
   larvatagger.jl -h | --help
@@ -34,6 +34,7 @@ Options:
   --sample-size=<N>    Sample only N track segments from the data repository.
   --layers=<N>         (MaggotUBA) Number of layers of the classifier.
   --iterations=<N>     (MaggotUBA) Number of training iterations (can be two integers separated by a comma).
+  --seed=<seed>        Seed for the backend's random number generators.
   --decode             Do not encode the labels into integer indices.
   --default-label=<label>             Label all untagged data as <label>.
   --manual-label=<label>              Secondary label for manually labelled data [default: edited].
@@ -42,6 +43,7 @@ Options:
   --pretrained-model=<instance>       Name of the pretrained encoder (from `pretrained_models` registry).
   --balancing-strategy=<strategy>     Any of `auto`, `maggotuba`, `none` [default: auto].
   --overrides=<comma-separated-list>  Comma-separated list of key:value pairs.
+  -o <filename> --output=<filename>   Predicted labels filename.
 
 
 Commands:
diff --git a/src/cli_toolkit.jl b/src/cli_toolkit.jl
index b387f2ad3fa7369194e2b1c72cfed4fd59ac80d2..632863c76dd1a3268637090f19aaf4b026ce968d 100644
--- a/src/cli_toolkit.jl
+++ b/src/cli_toolkit.jl
@@ -15,7 +15,7 @@ usage = """Larva Tagger.
 Usage:
   larvatagger-toolkit.jl import <input-path> [<output-file>] [--id=<id>] [--framerate=<fps>] [--pixelsize=<μm>] [--overrides=<comma-separated-list>] [--default-label=<label>] [--manual-label=<label>] [--decode]
   larvatagger-toolkit.jl train <backend-path> <data-path> <model-instance> [--pretrained-model=<instance>] [--labels=<comma-separated-list>] [--sample-size=<N>] [--balancing-strategy=<strategy>] [--class-weights=<csv>] [--manual-label=<label>] [--layers=<N>] [--iterations=<N>] [--seed=<seed>]
-  larvatagger-toolkit.jl predict <backend-path> <model-instance> <data-path> [--make-dataset] [--skip-make-dataset] [--data-isolation]
+  larvatagger-toolkit.jl predict <backend-path> <model-instance> <data-path> [--output=<filename>] [--make-dataset] [--skip-make-dataset] [--data-isolation]
   larvatagger-toolkit.jl merge <input-path> <input-file> [<output-file>] [--manual-label=<label>] [--decode]
   larvatagger-toolkit.jl -V | --version
   larvatagger-toolkit.jl -h | --help
@@ -41,6 +41,7 @@ Options:
   --pretrained-model=<instance>       Name of the pretrained encoder (from `pretrained_models` registry).
   --balancing-strategy=<strategy>     Any of `auto`, `maggotuba`, `none` [default: auto].
   --overrides=<comma-separated-list>  Comma-separated list of key:value pairs.
+  -o <filename> --output=<filename>   Predicted labels filename.
 
 
 Commands:
@@ -277,6 +278,7 @@ function main(args=ARGS; exit_on_error=true)
         model_instance = parsed_args["<model-instance>"]
         data_path = parsed_args["<data-path>"]
         data_isolation = parsed_args["--data-isolation"]
+        output_filename = parsed_args["--output"]
         #
         datapath = abspath(data_path)
         destination = if isfile(datapath)
@@ -292,6 +294,9 @@ function main(args=ARGS; exit_on_error=true)
         end
         #
         tagger = Tagger(backend_path, model_instance)
+        if !isnothing(output_filename)
+            tagger.output_filenames["predicted.label"] = output_filename
+        end
         if data_isolation
             tagger = Taggers.isolate(tagger)
             @info "Tagger isolated" sandbox=tagger.sandbox