diff --git a/debian/patches/apertis/tsort-Switch-to-BTreeHash-and-BTreeSet.patch b/debian/patches/apertis/tsort-Switch-to-BTreeHash-and-BTreeSet.patch
new file mode 100644
index 0000000000000000000000000000000000000000..323a5190b63fb2f5dac46197b755f0814f677b8e
--- /dev/null
+++ b/debian/patches/apertis/tsort-Switch-to-BTreeHash-and-BTreeSet.patch
@@ -0,0 +1,51 @@
+From: Detlev Casanova <detlev.casanova@collabora.com>
+Date: Fri, 2 Jun 2023 14:42:47 -0400
+Subject: tsort: Switch to BTreeHash and BTreeSet
+
+Using HashMap and HashSet give a valid topological sort, but the output
+will change randomly at each run.
+
+BTree based structures will guarantee that the output is always ordered
+in the same way.
+
+This also makes the ouptut similar to the output of the C version of the
+tools, on which some applications rely.
+
+Forwarded: https://github.com/uutils/coreutils/pull/4931
+---
+ src/uu/tsort/src/tsort.rs | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/uu/tsort/src/tsort.rs b/src/uu/tsort/src/tsort.rs
+index 1ef8537..a0c149f 100644
+--- a/src/uu/tsort/src/tsort.rs
++++ b/src/uu/tsort/src/tsort.rs
+@@ -6,7 +6,7 @@
+ //  * For the full copyright and license information, please view the LICENSE
+ //  * file that was distributed with this source code.
+ use clap::{crate_version, Arg, Command};
+-use std::collections::{HashMap, HashSet};
++use std::collections::{BTreeMap, BTreeSet};
+ use std::fs::File;
+ use std::io::{stdin, BufRead, BufReader, Read};
+ use std::path::Path;
+@@ -105,8 +105,8 @@ pub fn uu_app() -> Command {
+ // but using integer may improve performance.
+ #[derive(Default)]
+ struct Graph {
+-    in_edges: HashMap<String, HashSet<String>>,
+-    out_edges: HashMap<String, Vec<String>>,
++    in_edges: BTreeMap<String, BTreeSet<String>>,
++    out_edges: BTreeMap<String, Vec<String>>,
+     result: Vec<String>,
+ }
+ 
+@@ -124,7 +124,7 @@ impl Graph {
+     }
+ 
+     fn init_node(&mut self, n: &str) {
+-        self.in_edges.insert(n.to_string(), HashSet::new());
++        self.in_edges.insert(n.to_string(), BTreeSet::new());
+         self.out_edges.insert(n.to_string(), vec![]);
+     }
+ 
diff --git a/debian/patches/series b/debian/patches/series
index a00f9b9170158f6e592ea4b5b88ba562d29113d2..88aadf7633035b0d2fc66c6f64112cabe51e8b1d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -34,3 +34,4 @@ unbreak-s390x.patch
 # Apertis patches
 apertis/HACK-cp-mv-add-dummy-missing-arguments.patch
 apertis/Add-hack-for-missing-argument-to-mkdir.patch
+apertis/tsort-Switch-to-BTreeHash-and-BTreeSet.patch