diff --git a/src/managesieve/main.c b/src/managesieve/main.c
index 158246c43c83240bae63563a41620e8f8460f087..49ceac5fcda55d4e5a73ba62ef4bf3b1ddc6c5ec 100644
--- a/src/managesieve/main.c
+++ b/src/managesieve/main.c
@@ -172,6 +172,7 @@ client_create_from_input(const struct mail_storage_service_input *input,
 
 	client = client_create(fd_in, fd_out, input->session_id,
 			       event, mail_user, user, set);
+	client_create_finish(client);
 	T_BEGIN {
 		client_add_input(client, input_buf);
 	} T_END;
diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c
index cf1b0cfa213b37716ec3133a4dc059f92111dc2b..bacf4600266dff8b870f46abc42e877711439c2a 100644
--- a/src/managesieve/managesieve-client.c
+++ b/src/managesieve/managesieve-client.c
@@ -154,7 +154,6 @@ client_create(int fd_in, int fd_out, const char *session_id,
 
 	o_stream_set_flush_callback(client->output, client_output, client);
 
-	client->io = io_add_istream(client->input, client_input, client);
 	client->last_input = ioloop_time;
 	client->to_idle = timeout_add(CLIENT_IDLE_TIMEOUT_MSECS,
 				      client_idle_timeout, client);
@@ -165,14 +164,6 @@ client_create(int fd_in, int fd_out, const char *session_id,
 	client->cmd.event = event_create(client->event);
 	client->user = user;
 
-	if (set->rawlog_dir[0] != '\0') {
-		(void)iostream_rawlog_create(set->rawlog_dir, &client->input,
-					     &client->output);
-	}
-
-	client->parser = managesieve_parser_create(
-		client->input, set->managesieve_max_line_length);
-
 	client->svinst = svinst;
 	client->storage = storage;
 
@@ -194,6 +185,17 @@ client_create(int fd_in, int fd_out, const char *session_id,
 	return client;
 }
 
+void client_create_finish(struct client *client)
+{
+	if (client->set->rawlog_dir[0] != '\0') {
+		(void)iostream_rawlog_create(client->set->rawlog_dir,
+					     &client->input, &client->output);
+	}
+	client->parser = managesieve_parser_create(
+		client->input, client->set->managesieve_max_line_length);
+	client->io = io_add_istream(client->input, client_input, client);
+}
+
 static const char *client_stats(struct client *client)
 {
 	const struct var_expand_table logout_tab[] = {
diff --git a/src/managesieve/managesieve-client.h b/src/managesieve/managesieve-client.h
index 8367c259cac32dc8f37f584fb081cad7926f233c..6053eb6a86c8cce4401cdef34e95946e85fa14cf 100644
--- a/src/managesieve/managesieve-client.h
+++ b/src/managesieve/managesieve-client.h
@@ -91,6 +91,7 @@ client_create(int fd_in, int fd_out, const char *session_id,
 	      struct event *event, struct mail_user *user,
 	      struct mail_storage_service_user *service_user,
 	      const struct managesieve_settings *set);
+void client_create_finish(struct client *client);
 void client_destroy(struct client *client, const char *reason);
 
 void client_dump_capability(struct client *client);