diff --git a/src/sieve-bin/mail-raw.c b/src/sieve-bin/mail-raw.c
index 9dbb4878bfebf62196d0148543bf3a0ca07f31e4..5f84213639f2ebccec6df65ee1109d5a66703e22 100644
--- a/src/sieve-bin/mail-raw.c
+++ b/src/sieve-bin/mail-raw.c
@@ -16,6 +16,7 @@
 #include "str-sanitize.h"
 #include "strescape.h"
 #include "message-address.h"
+#include "mbox-from.h"
 #include "raw-storage.h"
 #include "mail-namespace.h"
 
@@ -37,17 +38,32 @@
    where to read the mail. */
 #define MAIL_MAX_MEMORY_BUFFER (1024*128)
 
+static const char *wanted_headers[] = {
+	"From", "Message-ID", "Subject", "Return-Path",
+	NULL
+};
+
+/*
+ * Global data
+ */
+
+static struct mail_namespace *raw_ns;
+static struct mail_user *raw_mail_user;
+
 /*
  * Raw mail implementation
  */
 
-static struct istream *create_raw_stream(int fd)
+static struct istream *create_raw_stream
+	(int fd, time_t *mtime_r, const char **sender)
 {
 	struct istream *input, *input2, *input_list[2];
 	const unsigned char *data;
 	size_t i, size;
-	int ret;
+	int ret, tz;
+	char *env_sender;
 
+	*mtime_r = (time_t)-1;
 	fd_set_nonblock(fd, FALSE);
 
 	input = i_stream_create_fd(fd, 4096, FALSE);
@@ -63,12 +79,18 @@ static struct istream *create_raw_stream(int fd)
 					break;
 			}
 			if (i != size) {
+				(void)mbox_from_parse(data, i, mtime_r, &tz, &env_sender);
 				i_stream_skip(input, i + 1);
 				break;
 			}
 			i_stream_skip(input, size);
- 		}
+		}
+	}
+
+	if (sender != NULL) {
+		*sender = t_strdup(env_sender);
 	}
+	i_free(env_sender);
 
 	if (input->v_offset == 0) {
 		input2 = input;
@@ -80,41 +102,48 @@ static struct istream *create_raw_stream(int fd)
 
 	input_list[0] = input2; input_list[1] = NULL;
 	input = i_stream_create_seekable(input_list, MAIL_MAX_MEMORY_BUFFER,
-		"/tmp/dovecot.deliver.");
+					 "/tmp/dovecot.deliver.");
 	i_stream_unref(&input2);
 	return input;
 }
 
-static struct mail_namespace *raw_ns;
-
 void mail_raw_init(const char *user) 
 {
 	const char *error;
-	struct mail_user *raw_mail_user;
-
+	
 	raw_mail_user = mail_user_init(user, NULL);
-    raw_ns = mail_namespaces_init_empty(raw_mail_user);
-    raw_ns->flags |= NAMESPACE_FLAG_INTERNAL;
+	raw_ns = mail_namespaces_init_empty(raw_mail_user);
+	raw_ns->flags |= NAMESPACE_FLAG_INTERNAL;
+	
 	if (mail_storage_create(raw_ns, "raw", "/tmp",
 		MAIL_STORAGE_FLAG_FULL_FS_ACCESS,
 		FILE_LOCK_METHOD_FCNTL, &error) < 0)
 		i_fatal("Couldn't create internal raw storage: %s", error);	
 }	
 	
-struct mail_raw *mail_raw_open(int fd)
+struct mail_raw *mail_raw_open(const char *path)
 {
 	pool_t pool;
+	time_t mtime;
+	struct istream *input;
 	struct raw_mailbox *raw_box;
 	struct mail_raw *mailr;
+	const char *sender = NULL;
 	
 	pool = pool_alloconly_create("mail_raw", 1024);
 	mailr = p_new(pool, struct mail_raw, 1);
 	mailr->pool = pool;
 
-	mailr->input = create_raw_stream(fd);
-
-	mailr->box = mailbox_open(raw_ns->storage, 
-		"Dovecot Raw Mail", mailr->input, MAILBOX_OPEN_NO_INDEX_FILES);
+	if ( path == NULL || strcmp(path, "-") == 0 ) {
+		input = create_raw_stream(0, &mtime, &sender);
+		mailr->box = mailbox_open(raw_ns->storage, "Dovecot Delivery Mail",
+				   input, MAILBOX_OPEN_NO_INDEX_FILES);
+		i_stream_unref(&input);
+	} else {
+		mtime = (time_t)-1;
+		mailr->box = mailbox_open(raw_ns->storage, path, NULL,
+				   MAILBOX_OPEN_NO_INDEX_FILES);
+	}
 	
 	if (mailr->box == NULL)
 		i_fatal("Can't open mail stream as raw");
@@ -122,27 +151,25 @@ struct mail_raw *mail_raw_open(int fd)
 	if (mailbox_sync(mailr->box, 0, 0, NULL) < 0) {
 		enum mail_error error;
 
-		i_fatal("Can't sync raw mail: %s",
-		mail_storage_get_last_error(raw_ns->storage, &error));
+		i_fatal("Can't sync delivery mail: %s",
+			mail_storage_get_last_error(raw_ns->storage, &error));
 	}
-    raw_box = (struct raw_mailbox *) mailr->box;
-    raw_box->envelope_sender = DEFAULT_ENVELOPE_SENDER;
+	raw_box = (struct raw_mailbox *)mailr->box;
+	raw_box->envelope_sender = sender != NULL ? sender : DEFAULT_ENVELOPE_SENDER;
+	raw_box->mtime = mtime;
 
 	mailr->trans = mailbox_transaction_begin(mailr->box, 0);
-	mailr->mail = mail_alloc(mailr->trans, 0, NULL);
+	mailr->headers_ctx = mailbox_header_lookup_init(mailr->box, wanted_headers);
+	mailr->mail = mail_alloc(mailr->trans, 0, mailr->headers_ctx);
 	mail_set_seq(mailr->mail, 1);
 
-	/* */
-	i_stream_seek(mailr->input, 0);
-
 	return mailr;
 }
 
 void mail_raw_close(struct mail_raw *mailr) 
 {
-	i_stream_unref(&mailr->input);
-
 	mail_free(&mailr->mail);
+	mailbox_header_lookup_unref(&mailr->headers_ctx);
 	mailbox_transaction_rollback(&mailr->trans);
 	mailbox_close(&mailr->box);
 
@@ -151,6 +178,6 @@ void mail_raw_close(struct mail_raw *mailr)
 
 void mail_raw_deinit(void)
 {
-	mail_namespaces_deinit(&raw_ns);
+	mail_user_deinit(&raw_mail_user);
 }
 
diff --git a/src/sieve-bin/mail-raw.h b/src/sieve-bin/mail-raw.h
index 05017404765735ec0d702a0169e2188511338e85..b9e6ae4de8777a0e8c095737c4cec362fc86cea2 100644
--- a/src/sieve-bin/mail-raw.h
+++ b/src/sieve-bin/mail-raw.h
@@ -5,16 +5,16 @@
 #define __MAIL_RAW_H
 
 struct mail_raw {
-    pool_t pool;
-    struct mail *mail;
+	pool_t pool;
+	struct mail *mail;
 
-    struct istream *input;
-    struct mailbox *box;
-    struct mailbox_transaction_context *trans;
+	struct mailbox *box;
+	struct mailbox_header_lookup_ctx *headers_ctx;
+	struct mailbox_transaction_context *trans;
 };
 
 void mail_raw_init(const char *user);
-struct mail_raw *mail_raw_open(int fd);
+struct mail_raw *mail_raw_open(const char *path);
 void mail_raw_close(struct mail_raw *mailr);
 void mail_raw_deinit(void);
 
diff --git a/src/sieve-bin/sieve-exec.c b/src/sieve-bin/sieve-exec.c
index 193635220462521194dd4789dff15d1bdfbdf2a3..cc52aca761a85ead79dc7f65a562eb458179b384 100644
--- a/src/sieve-bin/sieve-exec.c
+++ b/src/sieve-bin/sieve-exec.c
@@ -85,9 +85,10 @@ int main(int argc, char **argv)
 	const char *scriptfile, *recipient, *sender, *mailbox, *dumpfile, *mailfile;
 	const char *mailloc; 
 	const char *user, *home;
-	int i, mfd;
+	int i;
 	struct mail_raw *mailr;
-	struct mail_namespace *ns;
+	struct mail_namespace *ns = NULL;
+	struct mail_user *mail_user = NULL;
 	struct sieve_binary *sbin;
 	struct sieve_message_data msgdata;
 	struct sieve_script_env scriptenv;
@@ -148,9 +149,6 @@ int main(int argc, char **argv)
 		print_help();
 		i_fatal("Missing <mailfile> argument");
 	}
-
-	/* Open the mail file */
-	mfd = bin_open_mail_file(mailfile);
 	
 	/* Compile sieve script */
 	sbin = bin_open_sieve_script(scriptfile);
@@ -165,8 +163,6 @@ int main(int argc, char **argv)
 
 	/* Obtain mail namespaces from -l argument */
 	if ( mailloc != NULL ) {
-		struct mail_user *mail_user;
-
 		env_put(t_strdup_printf("NAMESPACE_1=%s", mailloc));
 		env_put("NAMESPACE_1_INBOX=1");
 		env_put("NAMESPACE_1_LIST=1");
@@ -178,13 +174,11 @@ int main(int argc, char **argv)
     	    i_fatal("Namespace initialization failed");	
 
 		ns = mail_user->namespaces;
-	} else {
-		ns = NULL;
-	}
+	} 
 
 	/* Open text file as mail message */
 	mail_raw_init(user);
-	mailr = mail_raw_open(mfd);
+	mailr = mail_raw_open(mailfile);
 
 	bin_fill_in_envelope(mailr->mail, &recipient, &sender);
 
@@ -234,9 +228,12 @@ int main(int argc, char **argv)
 	sieve_close(&sbin);
 	sieve_error_handler_unref(&ehandler);
 
-	bin_close_mail_file(mfd);
 	mail_raw_close(mailr);
 	mail_raw_deinit();
+
+	if ( mail_user != NULL )
+		mail_user_deinit(&mail_user);
+
 	namespaces_deinit();
 
 	bin_deinit();  
diff --git a/src/sieve-bin/sieve-test.c b/src/sieve-bin/sieve-test.c
index f6656d1682bc2279fbe319369b81463c3a77ec3d..b2e9ff8af6d9a47dace21812f6746ca4b31bad3e 100644
--- a/src/sieve-bin/sieve-test.c
+++ b/src/sieve-bin/sieve-test.c
@@ -50,7 +50,7 @@ int main(int argc, char **argv)
 {
 	const char *scriptfile, *recipient, *sender, *mailbox, *dumpfile, *mailfile; 
 	const char *user;
-	int i, mfd;
+	int i;
 	struct mail_raw *mailr;
 	struct sieve_binary *sbin;
 	struct sieve_message_data msgdata;
@@ -118,9 +118,6 @@ int main(int argc, char **argv)
 		print_help();
 		i_fatal("Missing <mailfile> argument");
 	}
-
-	/* Open the mail file */
-	mfd = bin_open_mail_file(mailfile);
 	
 	/* Compile sieve script */
 	if ( force_compile ) {
@@ -137,7 +134,7 @@ int main(int argc, char **argv)
 
 	namespaces_init();
 	mail_raw_init(user);
-	mailr = mail_raw_open(mfd);
+	mailr = mail_raw_open(mailfile);
 
 	bin_fill_in_envelope(mailr->mail, &recipient, &sender);
 
@@ -179,8 +176,6 @@ int main(int argc, char **argv)
 	sieve_close(&sbin);
 	sieve_error_handler_unref(&ehandler);
 
-	bin_close_mail_file(mfd);
-	
 	mail_raw_close(mailr);
 	mail_raw_deinit();
 	namespaces_deinit();