diff --git a/src/lib-sieve/util/edit-mail.c b/src/lib-sieve/util/edit-mail.c
index 5034e5803a3ba634aad81d14936b61422ba10b5d..1ad9406c1d560398593f96e8bed1f619745d82f2 100644
--- a/src/lib-sieve/util/edit-mail.c
+++ b/src/lib-sieve/util/edit-mail.c
@@ -2002,9 +2002,14 @@ static ssize_t edit_mail_istream_read(struct istream_private *stream)
 		 */
 		hdr_size = (prep_hdr_size +
 			    edmail->wrapped_hdr_size.physical_size);
-		i_assert(hdr_size > 0);
-		if (append_v_offset <= (hdr_size - 1) &&
-		    edmail->wrapped_hdr_size.physical_size > 0) {
+		if (hdr_size == 0) {
+			/* Corner case that doesn't happen in practice (the
+			   original message is never empty). */
+			edstream->cur_header = edmail->header_fields_appended;
+			edstream->cur_header_v_offset = v_offset;
+			edstream->header_read = TRUE;
+		} else if (append_v_offset <= (hdr_size - 1) &&
+			   edmail->wrapped_hdr_size.physical_size > 0) {
 			parent_v_offset = stream->parent_start_offset;
 			parent_end_v_offset =
 				(stream->parent_start_offset +
@@ -2055,6 +2060,11 @@ static ssize_t edit_mail_istream_read(struct istream_private *stream)
 				   edmail->wrapped_hdr_size.physical_size -
 				   (edmail->eoh_crlf ? 2 : 1));
 		copy_v_offset = edmail->hdr_size.physical_size;
+	/* Corner case that doesn't happen in practice (the original message is
+	   never empty). */
+	} else if (edmail->wrapped_hdr_size.physical_size == 0) {
+		parent_v_offset = stream->parent_start_offset;
+		copy_v_offset = edmail->hdr_size.physical_size;
 	/* Header comes partially from original mail and headers are added
 	   between header and body. */
 	} else if (edmail->header_fields_appended != NULL) {
diff --git a/src/lib-sieve/util/test-edit-mail.c b/src/lib-sieve/util/test-edit-mail.c
index 0e263a2c205034c96e841a2c7ab3d9b7dd5652b7..a6623ff10f36f5182a19b587f65cbd2791f29779 100644
--- a/src/lib-sieve/util/test-edit-mail.c
+++ b/src/lib-sieve/util/test-edit-mail.c
@@ -809,12 +809,69 @@ static void test_edit_mail_small_buffer(void)
 	test_end();
 }
 
+static void test_edit_mail_empty(void)
+{
+	struct istream *input_msg, *input_mail;
+	buffer_t *buffer;
+	struct mail_raw *rawmail;
+	struct edit_mail *edmail;
+	struct mail *mail;
+	const char *value;
+
+	test_begin("edit-mail - empty message");
+	test_init();
+
+	/* Compose the message */
+
+	input_msg = i_stream_create_from_data("", 0);
+
+	rawmail = mail_raw_open_stream(test_raw_mail_user, input_msg);
+
+	edmail = edit_mail_wrap(rawmail->mail);
+
+	/* Add header */
+
+	edit_mail_header_add(edmail, "X-B", "Frop", TRUE);
+	mail = edit_mail_get_mail(edmail);
+
+	/* Prepare tests */
+
+	if (mail_get_stream(mail, NULL, NULL, &input_mail) < 0) {
+		i_fatal("Failed to open mail stream: %s",
+			mailbox_get_last_error(mail->box, NULL));
+	}
+
+	buffer = buffer_create_dynamic(default_pool, 1024);
+
+	/* Evaluate modified header */
+
+	test_assert(mail_get_first_header_utf8(mail, "X-B", &value) > 0 &&
+		    strcmp(value, "Frop") == 0);
+
+	/* Added */
+
+	i_stream_seek(input_mail, 0);
+	buffer_set_used_size(buffer, 0);
+
+	test_stream_data(input_mail, buffer);
+
+	/* Clean up */
+
+	buffer_free(&buffer);
+	edit_mail_unwrap(&edmail);
+	mail_raw_close(&rawmail);
+	i_stream_unref(&input_msg);
+	test_deinit();
+	test_end();
+}
+
 int main(int argc, char *argv[])
 {
 	static void (*test_functions[])(void) = {
 		test_edit_mail_concatenated,
 		test_edit_mail_big_header,
 		test_edit_mail_small_buffer,
+		test_edit_mail_empty,
 		NULL
 	};
 	const enum master_service_flags service_flags =
diff --git a/tests/extensions/editheader/addheader.svtest b/tests/extensions/editheader/addheader.svtest
index 426b43dd277296fdc19c908d118649b8b8f1cd9c..cf0d46a77c0ad4fe34fc0bfe23967b7a5390db5b 100644
--- a/tests/extensions/editheader/addheader.svtest
+++ b/tests/extensions/editheader/addheader.svtest
@@ -831,3 +831,56 @@ test "Addheader - devious characters" {
 		test_fail "body not retained in stored mail";
 	}
 }
+
+test_result_reset;
+test_set "message" "";
+test "Addheader - empty" {
+	addheader :last "X-Some-Header" "Header content";
+
+	if not size :over 0 {
+		test_fail "mail is not larger";
+	}
+
+	if not exists "x-some-header" {
+		test_fail "header not added";
+	}
+
+	if not header :is "x-some-header" "Header content" {
+		test_fail "wrong content added";
+	}
+
+	redirect "frop@example.com";
+	fileinto :create "folder8";
+
+	if not test_result_execute {
+		test_fail "failed to execute result";
+	}
+
+	if not test_message :folder "folder8" 0 {
+		test_fail "message not stored";
+	}
+
+	if not size :over 0 {
+		test_fail "stored mail is not larger";
+	}
+
+	if not exists "x-some-header" {
+		test_fail "header not in stored mail";
+	}
+
+	if not header :is "x-some-header" "Header content" {
+		test_fail "wrong content in stored mail ";
+	}
+
+	if not test_message :smtp 0 {
+		test_fail "message not redirected";
+	}
+
+	if not exists "x-some-header" {
+		test_fail "header not in redirected mail";
+	}
+
+	if not header :is "x-some-header" "Header content" {
+		test_fail "wrong content in redirected mail ";
+	}
+}