diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c
index 1782170987749e157b981a87de7e58e70ea1ed69..3d7e04858889d4a1d8f66671b1ce0b7ebb01d8a3 100644
--- a/src/lib-sieve/sieve-actions.c
+++ b/src/lib-sieve/sieve-actions.c
@@ -780,6 +780,15 @@ void sieve_action_duplicate_mark
 	senv->duplicate_mark(senv, id, id_size, time);
 }
 
+void sieve_action_duplicate_flush
+(const struct sieve_script_env *senv)
+{
+	if ( senv->duplicate_flush == NULL )
+		return;
+	senv->duplicate_flush(senv);
+}
+
+
 /* Rejecting the mail */
 
 static bool sieve_action_do_reject_mail
diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h
index 19bc139acd464ffb0a2ef3fcfd964bea7091829e..37d952290c246285ee8b7d27da9e2fdfade75d60 100644
--- a/src/lib-sieve/sieve-actions.h
+++ b/src/lib-sieve/sieve-actions.h
@@ -265,6 +265,8 @@ int sieve_action_duplicate_check
 void sieve_action_duplicate_mark
 	(const struct sieve_script_env *senv, const void *id, size_t id_size,
 		time_t time);
+void sieve_action_duplicate_flush
+	(const struct sieve_script_env *senv);
 
 /* Rejecting mail */
 
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index 3e2813b5b17932a00c03057955e3a6df60730f55..9b6743fa42a1aa1ad9fe99467f3fd189b3e2f70f 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1248,8 +1248,10 @@ static int sieve_result_transaction_commit_or_rollback
 	struct sieve_result_action *last,
 	bool *implicit_keep, bool *keep)
 {
+	const struct sieve_script_env *senv = result->action_env.scriptenv;
 	struct sieve_result_action *rac;
 	int commit_status = status;
+	bool dup_flushed = FALSE;
 
 	/* First commit/rollback all storage actions */
 	rac = first;
@@ -1262,6 +1264,11 @@ static int sieve_result_transaction_commit_or_rollback
 			continue;
 		}
 
+		if (!dup_flushed) {
+			sieve_action_duplicate_flush(senv);
+			dup_flushed = TRUE;
+		}
+
 		status = sieve_result_action_commit_or_rollback
 			(result, rac, status, implicit_keep, keep, &commit_status);
 
diff --git a/src/lib-sieve/sieve-types.h b/src/lib-sieve/sieve-types.h
index 293e298882c191fd66fdd9a7513ba57b8f0cef87..8567dc4e299df94d491fd4919897731ac1a02989 100644
--- a/src/lib-sieve/sieve-types.h
+++ b/src/lib-sieve/sieve-types.h
@@ -206,6 +206,8 @@ struct sieve_script_env {
 	void (*duplicate_mark)
 		(const struct sieve_script_env *senv, const void *id, size_t id_size,
 			time_t time);
+	void (*duplicate_flush)
+		(const struct sieve_script_env *senv);
 
 	/* Interface for rejecting mail */
 	int (*reject_mail)(const struct sieve_script_env *senv,
diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c
index 406070b73048f6840c76d7fb68cb2caecf666825..183c22b63e6e6f4d7ac7e560e4c03f096e20cb91 100644
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c
@@ -132,6 +132,14 @@ static void lda_sieve_duplicate_mark
 	duplicate_mark(dctx->dup_ctx, id, id_size, senv->user->username, time);
 }
 
+static void lda_sieve_duplicate_flush
+(const struct sieve_script_env *senv)
+{
+	struct mail_deliver_context *dctx =
+		(struct mail_deliver_context *) senv->script_context;
+	duplicate_flush(dctx->dup_ctx);
+}
+
 /*
  * Plugin implementation
  */
@@ -906,6 +914,7 @@ static int lda_sieve_execute
 		scriptenv.smtp_finish = lda_sieve_smtp_finish;
 		scriptenv.duplicate_mark = lda_sieve_duplicate_mark;
 		scriptenv.duplicate_check = lda_sieve_duplicate_check;
+		scriptenv.duplicate_flush = lda_sieve_duplicate_flush;
 		scriptenv.reject_mail = lda_sieve_reject_mail;
 		scriptenv.script_context = (void *) mdctx;
 		scriptenv.exec_status = &estatus;