diff --git a/Makefile.am b/Makefile.am
index 3e0005334923fc5c9199721df4e8de205aeddfad..6c1b79827331ef362c41057cd23e51dedba9f3e2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -37,6 +37,7 @@ test_cases = \
 	tests/execute/errors.svtest \
 	tests/execute/actions.svtest \
 	tests/execute/smtp.svtest \
+	tests/execute/mailstore.svtest \
 	tests/exists.svtest \
 	tests/header.svtest \
 	tests/address.svtest \
diff --git a/TODO b/TODO
index eaa307a8605358a94d84d2f29e76a2ea7f12457f..9e793c3d518979e2406792eb21fa17e21951aef3 100644
--- a/TODO
+++ b/TODO
@@ -6,9 +6,7 @@ Current activities:
 	- Write manual page
 * Testsuite:
 	- add support for testing binary load/save
-	- add support for testing messages stored into a mailbox by looping these back
-	  as the tested mail message
-	- add execution tests for fileinto and imap4flags extensions.
+	- add execution tests for imap4flags extensions.
 
 Next (in order of descending priority/precedence):
 
diff --git a/src/testsuite/cmd-test-message.c b/src/testsuite/cmd-test-message.c
index c269d02622a9c2665f5d7fa78f97582c1757ded4..4a4d804d4216ea62f2f3d2eb5be6df1c6be77468 100644
--- a/src/testsuite/cmd-test-message.c
+++ b/src/testsuite/cmd-test-message.c
@@ -12,6 +12,7 @@
 
 #include "testsuite-common.h"
 #include "testsuite-smtp.h"
+#include "testsuite-mailstore.h"
 
 /*
  * Test_message command
@@ -196,6 +197,9 @@ static bool cmd_test_message_validate_folder_tag
 		(valdtr, cmd, tag, *arg, SAAT_STRING) ) {
 		return FALSE;
 	}
+
+	/* Skip parameter */
+	*arg = sieve_ast_argument_next(*arg);
 			
 	return TRUE;
 }
@@ -346,7 +350,8 @@ static int cmd_test_message_mailbox_operation_execute
 {
 	string_t *folder;
 	sieve_number_t msg_index;
-    unsigned int is_test = -1;
+	unsigned int is_test = -1;
+	bool result;
 
 	/*
 	 * Read operands
@@ -377,7 +382,15 @@ static int cmd_test_message_mailbox_operation_execute
 	sieve_runtime_trace(renv, "TEST_MESSAGE_MAILBOX (%s) \"%s\" [%d]", 
 		( is_test ? "TEST" : "COMMAND" ), str_c(folder), msg_index);
 
-	/* FIXME: to be implemented */
+	result = testsuite_mailstore_mail_index(renv, str_c(folder), msg_index);
+
+	if ( is_test ) {
+		sieve_interpreter_set_test_result(renv->interp, result);
+		return SIEVE_EXEC_OK;
+	}
+
+	if ( !result )
+		testsuite_test_failf("no outgoing SMTP message with index %d", msg_index);
 
 	return SIEVE_EXEC_OK;
 }
diff --git a/src/testsuite/testsuite-mailstore.c b/src/testsuite/testsuite-mailstore.c
index 4882a9f8808e88bb818439f3fc0c86ec44a7a9ad..91746e5c6ac9b72b42a85f8ff83c99e0c5b56773 100644
--- a/src/testsuite/testsuite-mailstore.c
+++ b/src/testsuite/testsuite-mailstore.c
@@ -194,7 +194,7 @@ bool testsuite_mailstore_mail_index
 	if ( mail == NULL )
 		return FALSE;
 
-	mail_set_seq(mail, index);
+	mail_set_seq(mail, index+1);
 	testsuite_message_set_mail(renv, mail);
 
 	return TRUE;
diff --git a/tests/execute/mailstore.svtest b/tests/execute/mailstore.svtest
new file mode 100644
index 0000000000000000000000000000000000000000..5ecdaa8830546a666c783fc5d8bd9358068f192a
--- /dev/null
+++ b/tests/execute/mailstore.svtest
@@ -0,0 +1,84 @@
+require "vnd.dovecot.testsuite";
+require "fileinto";
+require "variables";
+require "mailbox";
+
+set "message1" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: First message
+
+Frop
+.
+;
+
+set "message2" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Second message
+
+Frop
+.
+;
+
+set "message3" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Third message
+
+Frop
+.
+;
+
+test "Duplicates" {
+	test_set "message" "${message1}";
+
+	fileinto :create "Folder";
+	fileinto :create "Folder";
+
+	if not test_result_execute {
+		test_fail "failed to execute first result";
+	}
+
+	test_result_reset;
+
+	test_set "message" "${message2}";
+
+	fileinto :create "Folder";
+	fileinto :create "Folder";
+
+	if not test_result_execute {
+		test_fail "failed to execute second result";
+	}
+
+	test_result_reset;
+
+	test_set "message" "${message3}";
+
+	fileinto :create "Folder";
+	fileinto :create "Folder";
+
+	if not test_result_execute {
+		test_fail "failed to execute third result";
+	}
+
+	test_message :folder "Folder" 0;
+	
+	if not header :is "subject" "First message" {
+		test_fail "first message incorrect";
+	}
+
+	test_message :folder "Folder" 1;
+
+	if not header :is "subject" "Second message" {
+		test_fail "first message incorrect";
+	}
+
+	test_message :folder "Folder" 2;
+
+	if not header :is "subject" "Third message" {
+		test_fail "first message incorrect";
+	}
+}
+
+
diff --git a/tests/extensions/mailbox/execute.svtest b/tests/extensions/mailbox/execute.svtest
index 22c0d0f2991ffccd8b7d939237239899b442dbcb..6bea193739253f650b62e339dfcb9a214341d219 100644
--- a/tests/extensions/mailbox/execute.svtest
+++ b/tests/extensions/mailbox/execute.svtest
@@ -36,6 +36,15 @@ test ":Create" {
 		test_fail "mailbox exists already";
 	}
 
+	test_set "message" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Frop 1
+
+Frop!
+.
+	;
+
 	fileinto :create "created";
 
 	if not test_result_execute {
@@ -45,4 +54,27 @@ test ":Create" {
 	if not mailboxexists "created" {
 		test_fail "mailbox somehow not created";
 	}
+
+	test_result_reset;
+
+	test_set "message" text:
+From: stephan@rename-it.nl
+To: nico@vestingbar.nl
+Subject: Frop 2
+
+Frop!
+.
+	;
+
+	fileinto "created";
+
+	if not test_result_execute {
+		test_fail "execution of result failed second time";
+	}
+
+	test_message :folder "created" 0;
+
+	if not header :is "subject" "Frop 1" {
+		test_fail "incorrect message read back from mail store";
+	}
 }