diff --git a/src/core/server.rs b/src/core/server.rs
index 45ba7420..80493c94 100644
--- a/src/core/server.rs
+++ b/src/core/server.rs
@@ -69,6 +69,10 @@ impl Server {
 			return Err!("Reloading not enabled");
 		}
 
+		#[cfg(all(feature = "systemd", target_os = "linux"))]
+		sd_notify::notify(true, &[sd_notify::NotifyState::Reloading])
+			.expect("failed to notify systemd of reloading state");
+
 		if self.reloading.swap(true, Ordering::AcqRel) {
 			return Err!("Reloading already in progress");
 		}
@@ -83,7 +87,7 @@ impl Server {
 		})
 	}
 
-	pub fn restart(&self) -> Result<()> {
+	pub fn restart(&self) -> Result {
 		if self.restarting.swap(true, Ordering::AcqRel) {
 			return Err!("Restart already in progress");
 		}
@@ -93,7 +97,11 @@ impl Server {
 		})
 	}
 
-	pub fn shutdown(&self) -> Result<()> {
+	pub fn shutdown(&self) -> Result {
+		#[cfg(all(feature = "systemd", target_os = "linux"))]
+		sd_notify::notify(true, &[sd_notify::NotifyState::Stopping])
+			.expect("failed to notify systemd of stopping state");
+
 		if self.stopping.swap(true, Ordering::AcqRel) {
 			return Err!("Shutdown already in progress");
 		}
diff --git a/src/router/run.rs b/src/router/run.rs
index 26701735..024cb813 100644
--- a/src/router/run.rs
+++ b/src/router/run.rs
@@ -100,10 +100,6 @@ pub(crate) async fn stop(services: Arc<Services>) -> Result<()> {
 		);
 	}
 
-	#[cfg(all(feature = "systemd", target_os = "linux"))]
-	sd_notify::notify(true, &[sd_notify::NotifyState::Stopping])
-		.expect("failed to notify systemd of stopping state");
-
 	info!("Shutdown complete.");
 	Ok(())
 }
diff --git a/src/service/config/mod.rs b/src/service/config/mod.rs
index 8bd09a52..c9ac37a3 100644
--- a/src/service/config/mod.rs
+++ b/src/service/config/mod.rs
@@ -43,7 +43,15 @@ impl Deref for Service {
 #[implement(Service)]
 fn handle_reload(&self) -> Result {
 	if self.server.config.config_reload_signal {
+		#[cfg(all(feature = "systemd", target_os = "linux"))]
+		sd_notify::notify(true, &[sd_notify::NotifyState::Reloading])
+			.expect("failed to notify systemd of reloading state");
+
 		self.reload(iter::empty())?;
+
+		#[cfg(all(feature = "systemd", target_os = "linux"))]
+		sd_notify::notify(true, &[sd_notify::NotifyState::Ready])
+			.expect("failed to notify systemd of ready state");
 	}
 
 	Ok(())