diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 814f4b4f95f6dd7693758ce15e72aad36d737e21..82e5c1e2b2d6ff6a7aa22537cd2e7ee698d8d772 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -151,23 +151,23 @@ static bool ext_envelope_opcode_dump
 	printf("ENVELOPE\n");
 
 	/* Handle any optional arguments */
-    if ( sieve_operand_optional_present(sbin, address) ) {
-        while ( (opt_code=sieve_operand_optional_read(sbin, address)) ) {
-            switch ( opt_code ) {
-            case OPT_COMPARATOR:
-                sieve_opr_comparator_dump(interp, sbin, address);
-                break;
-            case OPT_MATCH_TYPE:
-                sieve_opr_match_type_dump(interp, sbin, address);
-                break;
+	if ( sieve_operand_optional_present(sbin, address) ) {
+		while ( (opt_code=sieve_operand_optional_read(sbin, address)) ) {
+			switch ( opt_code ) {
+			case OPT_COMPARATOR:
+				sieve_opr_comparator_dump(interp, sbin, address);
+				break;
+			case OPT_MATCH_TYPE:
+				sieve_opr_match_type_dump(interp, sbin, address);
+				break;
 			case OPT_ADDRESS_PART:
-                sieve_opr_address_part_dump(interp, sbin, address);
+				sieve_opr_address_part_dump(interp, sbin, address);
 				break;
-            default:
-                return FALSE;
-            }
-        }
-    }
+			default:
+				return FALSE;
+			}
+		}
+	}
 
 	return
 		sieve_opr_stringlist_dump(sbin, address) &&
diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h
index eecbf3eec7a62c667d18c3a84b1fbedb1d766dfb..03a6dad95ef57f80cf6777495f2ce1f60d306c2c 100644
--- a/src/lib-sieve/sieve-common.h
+++ b/src/lib-sieve/sieve-common.h
@@ -4,6 +4,8 @@
 #include <sys/types.h>
 #include <stdint.h>
 
+#include "sieve.h"
+
 /* 
  * Types
  */
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index defabf3d39d7b8c2f491341ede01a5b8f63434e5..9710d04d67990e2b8bf2c9ccc6263608d2f8bad2 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -30,7 +30,7 @@ struct sieve_interpreter {
 	struct sieve_result *result; 
 	
 	/* Execution environment */
-	struct mail *mail;	
+	struct sieve_message_data *msgdata;	
 };
 
 struct sieve_interpreter *sieve_interpreter_create(struct sieve_binary *binary) 
@@ -108,9 +108,10 @@ inline const void *sieve_interpreter_extension_get_context
 
 /* Accessing runtinme environment */
 
-inline struct mail *sieve_interpreter_get_mail(struct sieve_interpreter *interpreter) 
+inline struct sieve_message_data *
+	sieve_interpreter_get_msgdata(struct sieve_interpreter *interpreter) 
 {
-	return interpreter->mail;
+	return interpreter->msgdata;
 }
 
 /* Program counter */
@@ -194,7 +195,7 @@ void sieve_interpreter_dump_code(struct sieve_interpreter *interpreter)
 	sieve_interpreter_reset(interpreter);
 	
 	interpreter->result = NULL;
-	interpreter->mail = NULL;
+	interpreter->msgdata = NULL;
 	
 	while ( interpreter->pc < sieve_binary_get_code_size(interpreter->binary) ) {
 		if ( !sieve_interpreter_dump_operation(interpreter) ) {
@@ -226,14 +227,14 @@ bool sieve_interpreter_execute_operation
 }		
 
 struct sieve_result *sieve_interpreter_run
-	(struct sieve_interpreter *interp, struct mail *mail) 
+	(struct sieve_interpreter *interp, struct sieve_message_data *msgdata) 
 {
 	struct sieve_result *result;
 	sieve_interpreter_reset(interp);
 	
 	result = sieve_result_create();
 	interp->result = result;
-	interp->mail = mail;
+	interp->msgdata = msgdata;
 	
 	while ( interp->pc < sieve_binary_get_code_size(interp->binary) ) {
 		printf("%08x: ", interp->pc);
diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h
index ce339320b68068136cf4b7ade91af62d7c87e3c1..f1aac73fb1a93e7183afa8fe09e9136c361ba02c 100644
--- a/src/lib-sieve/sieve-interpreter.h
+++ b/src/lib-sieve/sieve-interpreter.h
@@ -43,7 +43,8 @@ bool sieve_interpreter_read_offset_operand
 
 /* Accessing runtime information */
 
-inline struct mail *sieve_interpreter_get_mail(struct sieve_interpreter *interpreter);
+inline struct sieve_message_data *
+	sieve_interpreter_get_msgdata(struct sieve_interpreter *interpreter);
 
 /* Code dump (debugging purposes) */
 
@@ -53,7 +54,7 @@ void sieve_interpreter_dump_code(struct sieve_interpreter *interp);
 
 bool sieve_interpreter_execute_operation(struct sieve_interpreter *interp); 
 struct sieve_result *sieve_interpreter_run
-	(struct sieve_interpreter *interp, struct mail *mail);
+	(struct sieve_interpreter *interp, struct sieve_message_data *message);
 
 
 #endif /* __SIEVE_INTERPRETER_H */
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 11fd336c1ed99aa60bb4300c01ddad5e0181d214..1416ee2694ce171257cb1a1a8742e9286deb032b 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -139,13 +139,14 @@ void sieve_dump(struct sieve_binary *binary)
 	sieve_interpreter_free(interpreter);
 }
 	
-bool sieve_execute(struct sieve_binary *binary, struct mail *mail) 
+bool sieve_execute
+	(struct sieve_binary *binary, struct sieve_message_data *msgdata) 
 {
 	struct sieve_interpreter *interpreter = sieve_interpreter_create(binary);			
 	bool result = TRUE;
 							
 	printf("Code Execute:\n\n");
-	if ( sieve_interpreter_run(interpreter, mail) == NULL ) {
+	if ( sieve_interpreter_run(interpreter, msgdata) == NULL ) {
 		result = FALSE;
 	}
 				
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 049b8675d33f10e0841b1bd6924a55259b1a77b8..e7b10fcbb8b81e66b0de98946c7afed1b28f2d21 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -1,15 +1,24 @@
 #ifndef __SIEVE_H
 #define __SIEVE_H
 
+#include "lib.h"
 #include "mail-storage.h"
 
 struct sieve_binary;
 
+struct sieve_message_data {
+	struct mail *mail;
+	const char *return_path;
+	const char *rcpt_address;
+	const char *auth_user;
+};	
+
 bool sieve_init(const char *plugins);
 void sieve_deinit(void);
 
 struct sieve_binary *sieve_compile(int fd);
 void sieve_dump(struct sieve_binary *binary);
-bool sieve_execute(struct sieve_binary *binary, struct mail *mail);
+bool sieve_execute
+	(struct sieve_binary *binary, struct sieve_message_data *msgdata);
 
 #endif
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index b53356a0fd25b41d4d503afd1f95bfc9a179273e..d0aef5d484d7017abc06bdb09de9d7b853896d40 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -151,7 +151,7 @@ static bool tst_address_opcode_dump
 static bool tst_address_opcode_execute
 	(struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address)
 {
-	struct mail *mail = sieve_interpreter_get_mail(interp);
+	struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp);
 	
 	const struct sieve_comparator *cmp = &i_octet_comparator;
 	const struct sieve_match_type *mtch = &is_match_type;
@@ -202,7 +202,7 @@ static bool tst_address_opcode_execute
 	}
 
 	/* Initialize match context */
-    mctx = sieve_match_begin(mtch, cmp, key_list);
+	mctx = sieve_match_begin(mtch, cmp, key_list);
 	
 	/* Iterate through all requested headers to match */
 	hdr_item = NULL;
@@ -210,7 +210,7 @@ static bool tst_address_opcode_execute
 	while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && hdr_item != NULL ) {
 		const char *const *headers;
 			
-		if ( mail_get_headers_utf8(mail, str_c(hdr_item), &headers) >= 0 ) {	
+		if ( mail_get_headers_utf8(msgdata->mail, str_c(hdr_item), &headers) >= 0 ) {	
 			
 			int i;
 			for ( i = 0; !matched && headers[i] != NULL; i++ ) {
@@ -220,7 +220,7 @@ static bool tst_address_opcode_execute
 		}
 	}
 	
-    matched = sieve_match_end(mctx) || matched;
+	matched = sieve_match_end(mctx) || matched;
 
 	t_pop();
 	
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index ca81fffc1672b483e1b95af231cdf936ffc8725b..523d4aa942a9bfa6ceed4a245830d09326fbfaa2 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -87,7 +87,7 @@ static bool tst_exists_opcode_dump
 static bool tst_exists_opcode_execute
 	(struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address)
 {
-	struct mail *mail = sieve_interpreter_get_mail(interp);
+	struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp);
 	struct sieve_coded_stringlist *hdr_list;
 	string_t *hdr_item;
 	bool matched;
@@ -105,10 +105,12 @@ static bool tst_exists_opcode_execute
 	/* Iterate through all requested headers to match */
 	hdr_item = NULL;
 	matched = FALSE;
-	while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && hdr_item != NULL ) {
+	while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && 
+		hdr_item != NULL ) {
 		const char *const *headers;
 			
-		if ( mail_get_headers_utf8(mail, str_c(hdr_item), &headers) >= 0 && headers[0] != NULL ) {	
+		if ( mail_get_headers_utf8(msgdata->mail, str_c(hdr_item), &headers) >= 0 && 
+			headers[0] != NULL ) {	
 			matched = TRUE;				 
 		}
 	}
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 38e7e283de45f0aed464fec769cb0ee2ecb64672..791cb8ca6fe8d644600c5ac4514c6fd1ae7660ce 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -140,7 +140,7 @@ static bool tst_header_opcode_dump
 static bool tst_header_opcode_execute
 	(struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address)
 {
-	struct mail *mail = sieve_interpreter_get_mail(interp);
+	struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp);
 	unsigned int opt_code;
 	const struct sieve_comparator *cmp = &i_octet_comparator;
 	const struct sieve_match_type *mtch = &is_match_type;
@@ -190,7 +190,7 @@ static bool tst_header_opcode_execute
 	while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && hdr_item != NULL ) {
 		const char *const *headers;
 			
-		if ( mail_get_headers_utf8(mail, str_c(hdr_item), &headers) >= 0 ) {	
+		if ( mail_get_headers_utf8(msgdata->mail, str_c(hdr_item), &headers) >= 0 ) {	
 			
 			int i;
 			for ( i = 0; !matched && headers[i] != NULL; i++ ) {
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index 3e85a39588795a494b00f190f722f59ff5292a4c..07ab7b10d23b905d6465efe95e51fb541da58350 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -195,10 +195,10 @@ static bool tst_size_under_opcode_dump
 
 static bool tst_size_get(struct sieve_interpreter *interp, sieve_size_t *size) 
 {
-	struct mail *mail = sieve_interpreter_get_mail(interp);
+	struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp);
 	uoff_t psize;
 
-	if ( mail_get_physical_size(mail, &psize) < 0 )
+	if ( mail_get_physical_size(msgdata->mail, &psize) < 0 )
 		return FALSE;
 
 	*size = psize;
diff --git a/src/sieve-bin/sieve_test.c b/src/sieve-bin/sieve_test.c
index c8c57d3a8222d8c2494ae14824077a335cd500f8..83498fe5bfb9e11e928f116a53d0131e34d12381 100644
--- a/src/sieve-bin/sieve_test.c
+++ b/src/sieve-bin/sieve_test.c
@@ -117,19 +117,20 @@ static struct istream *create_raw_stream(int fd)
 	return input;
 }
 
-static void sieve_test(struct sieve_binary *sbin, struct mail *mail)
+static void sieve_test
+	(struct sieve_binary *sbin, struct sieve_message_data *msgdata)
 {
 	const char *const *headers;
 
 	printf("HEADERS\n");
-	if (mail_get_headers_utf8(mail, "from", &headers) >= 0) {	
+	if (mail_get_headers_utf8(msgdata->mail, "from", &headers) >= 0) {	
 		int i;
 		for ( i = 0; headers[i] != NULL; i++ ) {
 			printf("HEADER: From: %s\n", headers[i]);
 		} 
 	}
 	
-	sieve_execute(sbin, mail);
+	sieve_execute(sbin, msgdata);
 }
 
 int main(int argc, char **argv) 
@@ -149,6 +150,7 @@ int main(int argc, char **argv)
 	pool_t namespace_pool;
 	int fd;
 	struct sieve_binary *sbin;
+	struct sieve_message_data msgdata;
 
 	lib_init();
 	ioloop = io_loop_create();
@@ -233,7 +235,11 @@ int main(int argc, char **argv)
 	/* */
 	i_stream_seek(input, 0);
 
-	sieve_test(sbin, mail);
+	msgdata.mail = mail;
+	msgdata.return_path = "nico@example.com";
+	msgdata.rcpt_address = "sirius+sieve@rename-it.nl";
+	msgdata.auth_user = "stephan";
+	sieve_test(sbin, &msgdata);
 
 	sieve_deinit();
 	//ret = deliver_save(ns, &storage, mailbox, mail, 0, NULL);