diff --git a/firmware/rust1/rtumaster_pymodbus.py b/firmware/rust1/rtumaster_pymodbus.py
index a5cb29d43aa8814cc0b9fe8faaa1b92df0dbf38a..08b36a4ce7a81f30f3363b4fe40dc608c036c9b0 100644
--- a/firmware/rust1/rtumaster_pymodbus.py
+++ b/firmware/rust1/rtumaster_pymodbus.py
@@ -54,6 +54,10 @@ def main():
             write_registers=[struct.unpack(">H", b"PI")[0], 103], slave=DEVICE_ADDR)
         logger.info("read/write regs: %s: %r", x, x.registers)
 
+        if False:
+            x = client.write_registers(1, struct.unpack(">H", b"RE")[0], slave=DEVICE_ADDR)
+            logger.info("write to reset: %s", x)
+
         x = client.read_file_record([
             # documentation says tuple of: Reference type, File number, Record Number, Record Length
             # but actually an object is expected:
diff --git a/firmware/rust1/src/bin/heizung.rs b/firmware/rust1/src/bin/heizung.rs
index ef40a5a814d0a6068b5b58b97be2997a54b8c58f..d9bd06fff50b89cca4a87262d6fbfa51e4c38fe9 100644
--- a/firmware/rust1/src/bin/heizung.rs
+++ b/firmware/rust1/src/bin/heizung.rs
@@ -306,6 +306,13 @@ async fn adc_task(shared_data: &'static AdcData, adc: ADC, mut en_measure_curren
 }
 
 
+#[embassy_executor::task]
+async fn reset_soon(delay: Duration) {
+    Timer::after(delay).await;
+    cortex_m::peripheral::SCB::sys_reset();
+}
+
+
 const FLASH_SIZE: usize = 2 * 1024 * 1024;
 
 #[derive(Clone, Copy, PartialEq, Eq)]
@@ -334,6 +341,8 @@ struct ModBusRegs<'a> {
     consistent_read_addr: u16,
     consistent_read_length: u16,
     consistent_read_data: [u16; 4],
+
+    spawner: Spawner,
 }
 
 impl<'a> ModBusRegs<'a> {
@@ -471,6 +480,7 @@ impl<'a> ModbusRegisters for ModBusRegs<'a> {
                 const OK: u16 = be("OK");  // mark booted
                 const UP: u16 = be("UP");  // mark updated -> swap to DFU on next reset
                 const PI: u16 = be("PI");  // ping / no-op
+                const RE: u16 = be("RE");  // reset
                 match value {
                     OK => {
                         self.uf2updater.mark_booted().map(|_| value)
@@ -484,6 +494,15 @@ impl<'a> ModbusRegisters for ModBusRegs<'a> {
                     PI => {
                         Ok(value)
                     },
+                    RE => {
+                        match self.spawner.spawn(reset_soon(Duration::from_millis(100))) {
+                            Ok(()) => Ok(value),
+                            Err(err) => {
+                                error!("Couldn't spawn reset_soon: {:?}", err);
+                                Err(ModbusErrorCode::ServerDeviceFailure)
+                            }
+                        }
+                    },
                     _ => Err(ModbusErrorCode::IllegalDataValue),
                 }
             },
@@ -649,6 +668,7 @@ async fn main2(spawner: Spawner) {
             consistent_read_addr: u16::default(),
             consistent_read_length: u16::default(),
             consistent_read_data: [0; 4],
+            spawner: spawner.clone(),
         }),
     );
     unwrap!(spawner.spawn(uart_task(rs485)));