diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index f949155404698dae5af6d337da40e9a23b8b55fc..89d1cb986ddd14b1a3b565d577854a4f3d5ac084 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -49,7 +49,7 @@ struct sieve_script *sieve_script_init
 	const char *filename, *dirpath, *basename;
 
 	if ( exists_r != NULL )
-		*exists_r = FALSE;
+		*exists_r = TRUE;
 
 	T_BEGIN {
 		/* Extract filename from path */
@@ -71,9 +71,11 @@ struct sieve_script *sieve_script_init
 		/* First obtain stat data from the system */
 		
 		if ( (ret=lstat(path, &st)) < 0 && (errno != ENOENT || exists_r == NULL) ) {
-			if ( errno == ENOENT ) 
+			if ( errno == ENOENT ) {
 				sieve_error(ehandler, basename, "sieve script does not exist");
-			else
+				if ( exists_r != NULL )
+					*exists_r = FALSE;
+			} else
 				sieve_critical(ehandler, basename, "failed to lstat sieve script file '%s': %m", path);
 			script = NULL;
 			ret = 1;
@@ -84,9 +86,11 @@ struct sieve_script *sieve_script_init
 			/* Only create/init the object if it stat()s without problems */
 			if (S_ISLNK(st.st_mode)) {
 				if ( (ret=stat(path, &st)) < 0 && (errno != ENOENT || exists_r == NULL) ) {
-					if ( errno == ENOENT )
+					if ( errno == ENOENT ) {
                 		sieve_error(ehandler, basename, "sieve script does not exist");
-		            else
+						if ( exists_r != NULL )
+							*exists_r = FALSE;
+					} else
         		        sieve_critical(ehandler, basename, 
 							"failed to stat sieve script file '%s': %m", path);
 		            script = NULL;	
@@ -102,9 +106,6 @@ struct sieve_script *sieve_script_init
 		}
 
 		if ( ret <= 0 ) {
-			if ( exists_r != NULL )
-				*exists_r = ( ret == 0 );
-
 			if ( script == NULL ) {
 				pool = pool_alloconly_create("sieve_script", 1024);
 				script = p_new(pool, struct sieve_script, 1);
diff --git a/src/lib-sieve/sieve-script.h b/src/lib-sieve/sieve-script.h
index 78c37e34df116f28d1fc1cf57c0a2d88daafb1d4..c484c46cd82086d8536deef3f45a18bde2e28ed9 100644
--- a/src/lib-sieve/sieve-script.h
+++ b/src/lib-sieve/sieve-script.h
@@ -16,7 +16,7 @@ struct sieve_script *sieve_script_create_in_directory
 void sieve_script_ref(struct sieve_script *script);
 void sieve_script_unref(struct sieve_script **script);
 
-/* Stream manageement */
+/* Stream management */
 
 struct istream *sieve_script_open(struct sieve_script *script, bool *deleted_r);
 void sieve_script_close(struct sieve_script *script);
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 7e330420619594282a2045d4337ba09c7db24b8d..8b46281551896d21a828288e5b9c37e52acaba9f 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -156,14 +156,14 @@ struct sieve_binary *sieve_compile
  */
 
 struct sieve_binary *sieve_open
-(const char *script_path, struct sieve_error_handler *ehandler)
+(const char *script_path, struct sieve_error_handler *ehandler, bool *exists_r)
 {
 	struct sieve_script *script;
 	struct sieve_binary *sbin;
 	const char *binpath;
 	
 	/* First open the scriptfile itself */
-	script = sieve_script_create(script_path, NULL, ehandler, NULL);
+	script = sieve_script_create(script_path, NULL, ehandler, exists_r);
 
 	if ( script == NULL ) {
 		/* Failed */
diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h
index 819ad61235e86862c686680c3b2280e676db6503..84fdb1271251db092390436d11ef46f5744b0eb2 100644
--- a/src/lib-sieve/sieve.h
+++ b/src/lib-sieve/sieve.h
@@ -61,7 +61,8 @@ struct sieve_binary *sieve_compile
  *
  */
 struct sieve_binary *sieve_open
-	(const char *scriptpath, struct sieve_error_handler *ehandler);
+	(const char *scriptpath, struct sieve_error_handler *ehandler,
+		bool *exists_r);
 
 /* sieve_save:
  *  Saves the binary as the file indicated by the path parameter.
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 6a74edb02144003abd923d91385aac6942b8e98b..85e0326747258c6488b614d4b999b0489746ba16 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -89,6 +89,7 @@ static int lda_sieve_run
 	struct sieve_error_handler *ehandler;
 	struct sieve_binary *sbin;
 	const char *scriptlog;
+	bool exists = TRUE;
 	int ret = 0;
 
 	/* Create error handler */
@@ -100,12 +101,19 @@ static int lda_sieve_run
 	if ( debug )
 		sieve_sys_info("opening script %s", script_path);
 
-	if ( (sbin=sieve_open(script_path, ehandler)) == NULL ) {
-		sieve_sys_error("failed to open script %s; "
-			"log should be available as %s", script_path, scriptlog);
+	if ( (sbin=sieve_open(script_path, ehandler, &exists)) == NULL ) {
+
+		ret = sieve_get_errors(ehandler) > 0 ? -1 : 0;
+
+		if ( debug ) {
+			if ( !exists && ret == 0 ) 
+				sieve_sys_info("script file %s is missing; ending sieve processing", script_path);
+			else
+				sieve_sys_info("failed to openscript file %s; ending sieve processing", script_path);
+		}
 
 		sieve_error_handler_unref(&ehandler);
-		return -1;
+		return ret;
 	}
 
 	/* Log the messages to the system error handlers as well from this moment
@@ -179,6 +187,7 @@ static int lda_sieve_run
 	case SIEVE_EXEC_FAILURE:
 		sieve_sys_error("execution of script %s failed, but implicit keep was successful", 
 			script_path);
+		ret = SIEVE_EXEC_OK;
 		break;
 	case SIEVE_EXEC_BIN_CORRUPT:		
    	    sieve_sys_error("!!BUG!!: binary compiled from %s is still corrupt; bailing out", 
diff --git a/src/sieve-bin/bin-common.c b/src/sieve-bin/bin-common.c
index cfcf717bcbab57680816ee8d65d61dd3d36139ef..47f9622b485870bda0891453e8b7d601ff1deca7 100644
--- a/src/sieve-bin/bin-common.c
+++ b/src/sieve-bin/bin-common.c
@@ -93,7 +93,7 @@ struct sieve_binary *bin_open_sieve_script(const char *filename)
 	ehandler = sieve_stderr_ehandler_create(0);
 	sieve_error_handler_accept_infolog(ehandler, TRUE);
 
-	if ( (sbin = sieve_open(filename, ehandler)) == NULL ) {
+	if ( (sbin = sieve_open(filename, ehandler, NULL)) == NULL ) {
 		sieve_error_handler_unref(&ehandler);
 		i_fatal("Failed to compile sieve script\n");
 	}