diff --git a/Cargo.lock b/Cargo.lock
index 8f4e3e8e7ce64bf6417d4fa6c9fc2b5e2094cd2d..31bc3573f1b5b7a43f89672b1c573fc0049ed56b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -122,7 +122,7 @@ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
 [[package]]
 name = "bootloader"
-version = "0.1.0"
+version = "0.2.0"
 dependencies = [
  "bootloader-params",
  "build-support",
@@ -679,7 +679,7 @@ dependencies = [
 
 [[package]]
 name = "firmware-updater"
-version = "0.1.0"
+version = "0.2.0"
 dependencies = [
  "bootloader-params",
  "clap",
diff --git a/README.org b/README.org
index 7af08af31e3a1a1adf3175dbcd1fdccd0e53d156..204fa42b7d5fadf6299f7ed5f1b344ce34ac0310 100644
--- a/README.org
+++ b/README.org
@@ -211,6 +211,7 @@ Returns two bytes:
     - 0x01: system is in programming mode
     - 0x02: at least one error was detected since the last time the
       system has been put in programming mode
+    - 0x04: a program is currently present in flash
 - A XORed version of all data received so far since the programming
   address was last set, either by entering programming mode, or by
   using the SET PROGRAMMING ADDRESS command.
diff --git a/bootloader/Cargo.toml b/bootloader/Cargo.toml
index 10e700810234434dbf4b62fd842a8f8d9d49b0fa..93dae20a16ca35f006e72336c7b54fddff350f8a 100644
--- a/bootloader/Cargo.toml
+++ b/bootloader/Cargo.toml
@@ -2,7 +2,7 @@
 name = "bootloader"
 description = "I²C bootloader for DC Motor Driver Hat DFR0592"
 authors = ["Samuel Tardieu <sam@rfc1149.net>"]
-version = "0.1.0"
+version = "0.2.0"
 edition = "2021"
 
 [dependencies]
diff --git a/bootloader/src/flash.rs b/bootloader/src/flash.rs
index 1ed99d899ef694e30c0ae4e479754567dcc6e89c..096df8c97cdcd39984546a49ac03345c0844f0e8 100644
--- a/bootloader/src/flash.rs
+++ b/bootloader/src/flash.rs
@@ -11,7 +11,7 @@ use embassy_stm32::{
 };
 use heapless::Vec;
 use i2c2_target::MESSAGE_SIZE;
-use support::boot_control::APPLICATION_MAGIC;
+use support::boot_control::{self, APPLICATION_MAGIC};
 
 pub struct ProgrammingState {
     flash: Flash<'static, Blocking>,
@@ -87,8 +87,9 @@ impl ProgrammingState {
     ) -> bool {
         match command {
             [CMD_STATUS] => {
-                let flags =
-                    u8::from(self.programming_mode) | (u8::from(self.programming_error) << 1);
+                let flags = u8::from(self.programming_mode)
+                    | (u8::from(self.programming_error) << 1)
+                    | (u8::from(boot_control::is_application_present()) << 2);
                 response.push(flags).unwrap();
                 response.push(self.checksum).unwrap();
             }
diff --git a/firmware-updater/Cargo.toml b/firmware-updater/Cargo.toml
index 64043c4375af9721a2ecad6e221424f0ef48fc4f..41a7a09619417ca6a6215f3f6bb291156171f5f2 100644
--- a/firmware-updater/Cargo.toml
+++ b/firmware-updater/Cargo.toml
@@ -2,7 +2,7 @@
 name = "firmware-updater"
 description = "Firmware updater for DC Motor Driver Hat DFR0592"
 authors = ["Samuel Tardieu <sam@rfc1149.net>"]
-version = "0.1.0"
+version = "0.2.0"
 edition = "2021"
 rust-version = "1.80.0"
 
diff --git a/firmware-updater/src/bootloader.rs b/firmware-updater/src/bootloader.rs
index f592b9e8752ce788d150ce35e26d7d3200b48b5a..eaaae3ce82bb6f4340d4ed5a95f9475f72d8350d 100644
--- a/firmware-updater/src/bootloader.rs
+++ b/firmware-updater/src/bootloader.rs
@@ -67,6 +67,7 @@ pub type Result<T, E = Error> = std::result::Result<T, E>;
 pub struct Status {
     pub programming_mode: bool,
     pub error_detected: bool,
+    pub application_present: bool,
     pub checksum: u8,
 }
 
@@ -98,6 +99,7 @@ pub fn get_status(i2c: &I2c) -> Result<Status> {
     Ok(Status {
         programming_mode: data[0] & 1 != 0,
         error_detected: data[0] & 2 != 0,
+        application_present: data[0] & 4 != 0,
         checksum: data[1],
     })
 }
diff --git a/firmware-updater/src/cli.rs b/firmware-updater/src/cli.rs
index f8cd635fa65766a1a9291f0fc786afcd29c877ed..81c1ed8c0fdc51469b6865f3d420ad557ef66c17 100644
--- a/firmware-updater/src/cli.rs
+++ b/firmware-updater/src/cli.rs
@@ -14,7 +14,9 @@ pub enum Command {
     CheckFile(CheckFileArgs),
     /// Flash firmware
     Flash(FlashArgs),
-    /// Read the status of the program currently running
+    /// Read the status of the program currently running, and
+    /// check if there is a firmware installed if we are in
+    /// bootloader mode.
     Status(StatusArgs),
 }
 
diff --git a/firmware-updater/src/main.rs b/firmware-updater/src/main.rs
index 40349afacab629ba7584b7b429a9d2a68a11a22d..6b6bba66dcf4df997198d821e3401d1bf53c193c 100644
--- a/firmware-updater/src/main.rs
+++ b/firmware-updater/src/main.rs
@@ -233,6 +233,14 @@ fn cmd_flash(args: FlashArgs) -> Result<()> {
 
 fn cmd_status(args: StatusArgs) -> Result<()> {
     let mut i2c = I2c::with_bus(args.i2c_bus)?;
-    println!("Running program: {}", bootloader::active_program(&mut i2c)?);
+    let active_program = bootloader::active_program(&mut i2c)?;
+    println!("Running program: {active_program}");
+    if matches!(active_program, ActiveProgram::Bootloader(_)) {
+        if bootloader::get_status(&i2c)?.application_present {
+            println!("Application present in flash memory");
+        } else {
+            println!("No application present in flash memory");
+        }
+    }
     Ok(())
 }