diff --git a/flutter/lib/desktop/pages/connection_page.dart b/flutter/lib/desktop/pages/connection_page.dart
index 506a03b7a..fc5b8e574 100644
--- a/flutter/lib/desktop/pages/connection_page.dart
+++ b/flutter/lib/desktop/pages/connection_page.dart
@@ -288,7 +288,7 @@ class _ConnectionPageState extends State<ConnectionPage>
                 offstage: !svcStopped.value,
                 child: GestureDetector(
                         onTap: () async {
-                          bool checked =
+                          bool checked = !bind.mainIsInstalled() ||
                               await bind.mainCheckSuperUserPermission();
                           if (checked) {
                             bind.mainSetOption(key: "stop-service", value: "");
diff --git a/libs/hbb_common/protos/message.proto b/libs/hbb_common/protos/message.proto
index aaa02c327..34983599a 100644
--- a/libs/hbb_common/protos/message.proto
+++ b/libs/hbb_common/protos/message.proto
@@ -564,6 +564,7 @@ message Misc {
     bool restart_remote_device = 14;
     bool uac = 15;
     bool foreground_window_elevated = 16;
+    bool stop_service = 17;
   }
 }
 
diff --git a/src/rendezvous_mediator.rs b/src/rendezvous_mediator.rs
index 9fc59816f..9350085c4 100644
--- a/src/rendezvous_mediator.rs
+++ b/src/rendezvous_mediator.rs
@@ -90,6 +90,8 @@ impl RendezvousMediator {
                     }));
                 }
                 join_all(futs).await;
+            } else {
+                server.write().unwrap().close_connections();
             }
             sleep(1.).await;
         }
diff --git a/src/server.rs b/src/server.rs
index 04814db42..08b8c5b5b 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -264,6 +264,17 @@ impl Server {
         self.connections.remove(&conn.id());
     }
 
+    pub fn close_connections(&mut self) {
+        let conn_inners: Vec<_> = self.connections.values_mut().collect();
+        for c in conn_inners {
+            let mut misc = Misc::new();
+            misc.set_stop_service(true);
+            let mut msg = Message::new();
+            msg.set_misc(misc);
+            c.send(Arc::new(msg));
+        }
+    }
+
     fn add_service(&mut self, service: Box<dyn Service>) {
         let name = service.name();
         self.services.insert(name, service);
diff --git a/src/server/connection.rs b/src/server/connection.rs
index c4dc615be..96d202199 100644
--- a/src/server/connection.rs
+++ b/src/server/connection.rs
@@ -250,14 +250,7 @@ impl Connection {
                             }
                         }
                         ipc::Data::Close => {
-                            conn.close_manually = true;
-                            let mut misc = Misc::new();
-                            misc.set_close_reason("Closed manually by the peer".into());
-                            let mut msg_out = Message::new();
-                            msg_out.set_misc(misc);
-                            conn.send(msg_out).await;
-                            conn.on_close("Close requested from connection manager", false).await;
-                            SESSIONS.lock().unwrap().remove(&conn.lr.my_id);
+                            conn.on_close_manually("connection manager").await;
                             break;
                         }
                         ipc::Data::ChatMessage{text} => {
@@ -404,6 +397,18 @@ impl Connection {
                             _ => {}
                         }
                     }
+                    match &msg.union {
+                        Some(message::Union::Misc(m)) => {
+                            match &m.union {
+                                Some(misc::Union::StopService(_)) => {
+                                    conn.on_close_manually("stop service").await;
+                                    break;
+                                }
+                                _ => {},
+                            }
+                        }
+                        _ => {}
+                    }
                     if let Err(err) = conn.stream.send(msg).await {
                         conn.on_close(&err.to_string(), false).await;
                         break;
@@ -1490,6 +1495,18 @@ impl Connection {
         self.port_forward_socket.take();
     }
 
+    async fn on_close_manually(&mut self, close_from: &str) {
+        self.close_manually = true;
+        let mut misc = Misc::new();
+        misc.set_close_reason("Closed manually by the peer".into());
+        let mut msg_out = Message::new();
+        msg_out.set_misc(misc);
+        self.send(msg_out).await;
+        self.on_close(&format!("Close requested from {}", close_from), false)
+            .await;
+        SESSIONS.lock().unwrap().remove(&self.lr.my_id);
+    }
+
     fn read_dir(&mut self, dir: &str, include_hidden: bool) {
         let dir = dir.to_string();
         self.send_fs(ipc::FS::ReadDir {