diff --git a/polkadot/.gitlab-ci.yml b/polkadot/.gitlab-ci.yml
index 0e8c64dc074fd5b346296ae846c7de67d49dd8ef..84d63aa9818d8a0c4790230365b9b85fb9fe9754 100644
--- a/polkadot/.gitlab-ci.yml
+++ b/polkadot/.gitlab-ci.yml
@@ -227,6 +227,8 @@ build-linux-stable:
     # Enable debug assertions since we are running optimized builds for testing
     # but still want to have debug assertions.
     RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings"
+    # Ensure we run the UI tests.
+    RUN_UI_TESTS: 1
   script:
     - time cargo build --profile testnet --features pyroscope --verbose --bin polkadot
     - sccache -s
diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock
index 4e989fd4502b5b984b5d0fd808c5a4f8c097ca01..5365e05947f7a4d044d847b6622e79d796e78333 100644
--- a/polkadot/Cargo.lock
+++ b/polkadot/Cargo.lock
@@ -7106,6 +7106,7 @@ dependencies = [
  "polkadot-node-network-protocol",
  "polkadot-node-primitives",
  "polkadot-overseer-gen-proc-macro",
+ "rustversion",
  "thiserror",
  "tracing-gum",
  "trybuild",
diff --git a/polkadot/node/overseer/overseer-gen/Cargo.toml b/polkadot/node/overseer/overseer-gen/Cargo.toml
index 7296a1aaf747e50a54daf1348381419b83f19d49..282113d244973f33ce79120bfb409de80e1d0dfb 100644
--- a/polkadot/node/overseer/overseer-gen/Cargo.toml
+++ b/polkadot/node/overseer/overseer-gen/Cargo.toml
@@ -20,6 +20,7 @@ pin-project = "1.0"
 
 [dev-dependencies]
 trybuild = "1.0.53"
+rustversion = "1.0.6"
 
 [features]
 default = []
diff --git a/polkadot/node/overseer/overseer-gen/src/tests.rs b/polkadot/node/overseer/overseer-gen/src/tests.rs
index ad8745b386697979f3b72173cfc47580225c693c..09de7ed4d3d4a4f657fe88e73735acc6bca85680 100644
--- a/polkadot/node/overseer/overseer-gen/src/tests.rs
+++ b/polkadot/node/overseer/overseer-gen/src/tests.rs
@@ -1,15 +1,39 @@
-// The generated code requires quite a bit of surrounding code to work.
-// Please refer to [the examples](examples/dummy.rs) and
-// [the minimal usage example](../examples/minimal-example.rs).
+// Copyright 2022 Parity Technologies (UK) Ltd.
+// This file is part of Polkadot.
+
+// Polkadot is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Polkadot is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
 
 #[test]
+#[rustversion::attr(not(stable), ignore)]
 fn ui_compile_fail() {
+	// Only run the ui tests when `RUN_UI_TESTS` is set.
+	if std::env::var("RUN_UI_TESTS").is_err() {
+		return
+	}
+
 	let t = trybuild::TestCases::new();
 	t.compile_fail("tests/ui/err-*.rs");
 }
 
 #[test]
+#[rustversion::attr(not(stable), ignore)]
 fn ui_pass() {
+	// Only run the ui tests when `RUN_UI_TESTS` is set.
+	if std::env::var("RUN_UI_TESTS").is_err() {
+		return
+	}
+
 	let t = trybuild::TestCases::new();
 	t.pass("tests/ui/ok-*.rs");
 }
diff --git a/polkadot/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr b/polkadot/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr
index 18ba674324b567f1090edc1fb39e8d89ce2b7e1a..ea67ef7aad5bdbdb7133017c603920d8da97d1d5 100644
--- a/polkadot/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr
+++ b/polkadot/node/overseer/overseer-gen/tests/ui/err-01-duplicate-consumer.stderr
@@ -1,21 +1,21 @@
-error[E0119]: conflicting implementations of trait `std::convert::From<MsgStrukt>` for type `AllMessages`
+error[E0119]: conflicting implementations of trait `polkadot_overseer_gen::SubsystemSender<MsgStrukt>` for type `OverseerSubsystemSender`
   --> tests/ui/err-01-duplicate-consumer.rs:19:1
    |
 19 | #[overlord(signal=SigSigSig, event=Event, gen=AllMessages, error=OverseerError)]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | |
    | first implementation here
-   | conflicting implementation for `AllMessages`
+   | conflicting implementation for `OverseerSubsystemSender`
    |
    = note: this error originates in the attribute macro `overlord` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error[E0119]: conflicting implementations of trait `polkadot_overseer_gen::SubsystemSender<MsgStrukt>` for type `OverseerSubsystemSender`
+error[E0119]: conflicting implementations of trait `std::convert::From<MsgStrukt>` for type `AllMessages`
   --> tests/ui/err-01-duplicate-consumer.rs:19:1
    |
 19 | #[overlord(signal=SigSigSig, event=Event, gen=AllMessages, error=OverseerError)]
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    | |
    | first implementation here
-   | conflicting implementation for `OverseerSubsystemSender`
+   | conflicting implementation for `AllMessages`
    |
    = note: this error originates in the attribute macro `overlord` (in Nightly builds, run with -Z macro-backtrace for more info)
diff --git a/polkadot/scripts/update-rust-stable.sh b/polkadot/scripts/update-rust-stable.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4e24d6338d523601ce9a2111448cca6daa659f6d
--- /dev/null
+++ b/polkadot/scripts/update-rust-stable.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+#
+# Script for updating the UI tests for a new rust stable version.
+#
+# It needs to be called like this:
+#
+# update-rust-stable.sh 1.61
+#
+# This will run all UI tests with the rust stable 1.61. The script
+# requires that rustup is installed.
+set -e
+
+if [ "$#" -ne 1 ]; then
+	echo "Please specify the rust version to use. E.g. update-rust-stable.sh 1.61"
+	exit
+fi
+
+RUST_VERSION=$1
+
+if ! command -v rustup &> /dev/null
+then
+	echo "rustup needs to be installed"
+	exit
+fi
+
+rustup install $RUST_VERSION
+rustup component add rust-src --toolchain $RUST_VERSION
+
+# Ensure we run the ui tests
+export RUN_UI_TESTS=1
+# We don't need any wasm files for ui tests
+export SKIP_WASM_BUILD=1
+# Let trybuild overwrite the .stderr files
+export TRYBUILD=overwrite
+
+# Run all the relevant UI tests
+#
+# Any new UI tests in different crates need to be added here as well.
+rustup run $RUST_VERSION cargo test -p polkadot-overseer-gen ui