diff --git a/src/managesieve/main.c b/src/managesieve/main.c
index 340b7b6f99dfe43ec4aacd2157149b95e3eb679f..c5fa3e1b7f37a635bbca20f5f910de6de43bcd9f 100644
--- a/src/managesieve/main.c
+++ b/src/managesieve/main.c
@@ -14,6 +14,7 @@
 #include "restrict-access.h"
 #include "settings-parser.h"
 #include "master-interface.h"
+#include "master-admin-client.h"
 #include "master-service.h"
 #include "master-login.h"
 #include "mail-user.h"
@@ -276,6 +277,26 @@ login_client_failed(const struct master_login_client *client,
 	}
 }
 
+static unsigned int
+master_admin_cmd_kick_user(const char *user, const guid_128_t conn_guid)
+{
+	struct client *client, *next;
+	unsigned int count = 0;
+
+	for (client = managesieve_clients; client != NULL; client = next) {
+		next = client->next;
+		if (strcmp(client->user->username, user) == 0 &&
+		    (guid_128_is_empty(conn_guid) ||
+		     guid_128_cmp(client->anvil_conn_guid, conn_guid) == 0))
+			client_kick(client);
+	}
+	return count;
+}
+
+static const struct master_admin_client_callback admin_callbacks = {
+	.cmd_kick_user = master_admin_cmd_kick_user,
+};
+
 static void client_connected(struct master_service_connection *conn)
 {
 	/* when running standalone, we shouldn't even get here */
@@ -338,6 +359,7 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	master_admin_clients_init(&admin_callbacks);
 	master_service_set_die_callback(master_service, managesieve_die);
 
 	/* plugins may want to add commands, so this needs to be called early */
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index 79d0f864042ded758c4d627371a1ef011323df86..f7fb0ccf4be628111d2430cee2abc7c3a899f276 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -777,11 +777,16 @@ int client_output(struct client *client)
 	return ret;
 }
 
+void client_kick(struct client *client)
+{
+	mail_storage_service_io_activate_user(client->service_user);
+	if (!client->command_pending)
+		client_send_bye(client, "Server shutting down.");
+	client_destroy(client, "Server shutting down.");
+}
+
 void clients_destroy_all(void)
 {
-	while (managesieve_clients != NULL) {
-		mail_storage_service_io_activate_user(managesieve_clients->service_user);
-		client_send_bye(managesieve_clients, "Server shutting down.");
-		client_destroy(managesieve_clients, "Server shutting down.");
-	}
+	while (managesieve_clients != NULL)
+		client_kick(managesieve_clients);
 }
diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h
index 2448dc22bf1decded3133a1a17f5dc5fdbd27b95..96a6646f07288f9eeebac76f7d345d2d1633062c 100644
--- a/src/managesieve/managesieve-client.h
+++ b/src/managesieve/managesieve-client.h
@@ -159,6 +159,7 @@ void _client_reset_command(struct client *client);
 void client_input(struct client *client);
 int client_output(struct client *client);
 
+void client_kick(struct client *client);
 void clients_destroy_all(void);
 
 #endif