diff --git a/src/managesieve/main.c b/src/managesieve/main.c
index 6a4466ec6f0b8644f0125356de40c44f8ae3bf9f..462e0517fcf4493d9586885a19be5ea3f6b3002b 100644
--- a/src/managesieve/main.c
+++ b/src/managesieve/main.c
@@ -36,6 +36,10 @@ static struct master_login *master_login = NULL;
 
 void (*hook_client_created)(struct client **client) = NULL;
 
+struct event_category event_category_managesieve = {
+	.name = "managesieve",
+};
+
 void managesieve_refresh_proctitle(void)
 {
 #define MANAGESIEVE_PROCTITLE_PREFERRED_LEN 80
@@ -125,15 +129,29 @@ client_create_from_input(const struct mail_storage_service_input *input,
 			 int fd_in, int fd_out, const buffer_t *input_buf,
 			 const char **error_r)
 {
+	struct mail_storage_service_input service_input;
 	struct mail_storage_service_user *user;
 	struct mail_user *mail_user;
 	struct client *client;
 	struct managesieve_settings *set;
+	struct event *event;
 	const char *error;
 
-	if (mail_storage_service_lookup_next(storage_service, input,
-					     &user, &mail_user, error_r) <= 0)
+	event = event_create(NULL);
+	event_add_category(event, &event_category_managesieve);
+	event_add_fields(event, (const struct event_add_field []){
+		{ .key = "user", .value = input->username },
+		{ .key = "session", .value = input->session_id },
+		{ .key = NULL }
+	});
+
+	service_input = *input;
+	service_input.parent_event = event;
+	if (mail_storage_service_lookup_next(storage_service, &service_input,
+					     &user, &mail_user, error_r) <= 0) {
+		event_unref(&event);
 		return -1;
+	}
 	restrict_access_allow_coredumps(TRUE);
 
 	set = mail_storage_service_user_get_set(user)[1];
@@ -147,14 +165,16 @@ client_create_from_input(const struct mail_storage_service_input *input,
 		i_error("Failed to expand settings: %s", error);
 		mail_storage_service_user_unref(&user);
 		mail_user_unref(&mail_user);
+		event_unref(&event);
 		return -1;
 	}
 
 	client = client_create(fd_in, fd_out, input->session_id,
-			       mail_user, user, set);
+			       event, mail_user, user, set);
 	T_BEGIN {
 		client_add_input(client, input_buf);
 	} T_END;
+	event_unref(&event);
 	return 0;
 }
 
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index c4c8e970dced0738d2e80b522051f5061e4b9c12..28c154028981a0b04e878877e8f69721fadf332a 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -103,7 +103,7 @@ client_get_storage(struct sieve_instance *svinst, struct mail_user *user,
 
 struct client *
 client_create(int fd_in, int fd_out, const char *session_id,
-	      struct mail_user *user,
+	      struct event *event, struct mail_user *user,
 	      struct mail_storage_service_user *service_user,
 	      const struct managesieve_settings *set)
 {
@@ -136,6 +136,8 @@ client_create(int fd_in, int fd_out, const char *session_id,
 	pool = pool_alloconly_create("managesieve client", 1024);
 	client = p_new(pool, struct client, 1);
 	client->pool = pool;
+	client->event = event;
+	event_ref(client->event);
 	client->set = set;
 	client->service_user = service_user;
 	client->session_id = p_strdup(pool, session_id);
@@ -289,6 +291,7 @@ void client_destroy(struct client *client, const char *reason)
 
 	managesieve_client_count--;
 	DLLIST_REMOVE(&managesieve_clients, client);
+	event_unref(&client->event);
 	pool_unref(&client->pool);
 
 	master_service_client_connection_destroyed(master_service);
diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h
index 9c40448ccd451390221777e203cc7a795fc73bf4..d53b39e015dd77e95677f35fbd03d263c424837f 100644
--- a/src/managesieve/managesieve-client.h
+++ b/src/managesieve/managesieve-client.h
@@ -37,6 +37,7 @@ extern struct managesieve_module_register managesieve_module_register;
 struct client {
 	struct client *prev, *next;
 
+	struct event *event;
 	const char *session_id;
 	int fd_in, fd_out;
 	struct io *io;
@@ -86,7 +87,7 @@ extern unsigned int managesieve_client_count;
    if the handle is a socket. */
 struct client *
 client_create(int fd_in, int fd_out, const char *session_id,
-	      struct mail_user *user,
+	      struct event *event, struct mail_user *user,
 	      struct mail_storage_service_user *service_user,
 	      const struct managesieve_settings *set);
 void client_destroy(struct client *client, const char *reason);
diff --git a/src/managesieve/managesieve-common.h b/src/managesieve/managesieve-common.h
index 7c3b5457acb57a749ab9ab758f036c60e437020c..e1df589ec6813f610a0ffcec5ae6a5003b0bb874 100644
--- a/src/managesieve/managesieve-common.h
+++ b/src/managesieve/managesieve-common.h
@@ -24,6 +24,7 @@
 #include "managesieve-settings.h"
 
 extern void (*hook_client_created)(struct client **client);
+extern struct event_category event_category_managesieve;
 
 void managesieve_refresh_proctitle(void);