diff --git a/Cargo.lock b/Cargo.lock
index 0c80836d0bedb2b16506508e5533ceaa7a0d4c69..eeab304acd93920c90e62262212f7c28ad91fd31 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -17,6 +17,17 @@ version = "1.0.56"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27"
 
+[[package]]
+name = "async-recursion"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cda8f4bcc10624c4e85bc66b3f452cca98cfa5ca002dc83a16aad2367641bea"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "async-trait"
 version = "0.1.52"
@@ -381,6 +392,7 @@ name = "nm-reactor"
 version = "0.1.0"
 dependencies = [
  "anyhow",
+ "async-recursion",
  "async-trait",
  "clap",
  "collective",
diff --git a/Cargo.toml b/Cargo.toml
index 4c0a5472a1c7008e1367736059dba090d52216d1..f3254c8ae86245d056c1016c9f3414fd391f958f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -28,3 +28,4 @@ num-traits = "0.2"
 futures = "0.3.18"
 async-trait = "0.1.52"
 nm-reactor_dbus_codegen = {path = "dbus_codegen"}
+async-recursion = "1.0"
diff --git a/src/condition.rs b/src/condition.rs
index a523683f6d02a532c372ba623e781e106a6acfed..7d03aa7ede60f8bbdc3d3fcd199b8863347920af 100644
--- a/src/condition.rs
+++ b/src/condition.rs
@@ -1,6 +1,7 @@
 use std::{collections::HashSet, sync::Arc};
 
 use anyhow::Result;
+use async_recursion::async_recursion;
 use dbus::nonblock::SyncConnection;
 use futures::{stream, StreamExt};
 use serde_derive::{Deserialize, Serialize};
@@ -62,9 +63,13 @@ pub enum Condition {
     StateIsAnyOf {
         states: HashSet<State>,
     },
+    Not {
+        condition: Box<Condition>,
+    }
 }
 
 impl Condition {
+    #[async_recursion]
     pub async fn evaluate(&self, conn: &Arc<SyncConnection>) -> Result<bool> {
         match self {
             Condition::AlwaysTrue => Ok(true),
@@ -156,6 +161,11 @@ impl Condition {
 
                 Ok(states.contains(&manager.get_state().await?))
             }
+            Condition::Not { condition } => {
+                let result = condition.evaluate(conn).await?;
+
+                Ok(!result)
+            }
         }
     }
 }