diff --git a/src/lib-sieve/sieve-message.c b/src/lib-sieve/sieve-message.c
index 52bed3e8de2237bf6393bdb097c030f6670603d4..2ceb0cddd030369372d848193a2a1a2ebdbe651a 100644
--- a/src/lib-sieve/sieve-message.c
+++ b/src/lib-sieve/sieve-message.c
@@ -78,6 +78,7 @@ struct sieve_message_context {
 	ARRAY_DEFINE(ext_contexts, void *);
 
 	unsigned int edit_snapshot:1;
+	unsigned int substitute_snapshot:1;
 };
 
 /*
@@ -376,7 +377,7 @@ int sieve_message_substitute
 		return -1;
 	}
 
-	if ( msgctx->edit_snapshot ) {
+	if ( msgctx->substitute_snapshot ) {
 		version = sieve_message_version_new(msgctx);
 	} else {
 		version = sieve_message_version_get(msgctx);	
@@ -392,6 +393,7 @@ int sieve_message_substitute
 
 	sieve_message_context_flush(msgctx);
 
+	msgctx->substitute_snapshot = FALSE;
 	msgctx->edit_snapshot = FALSE;
 
 	return 1;
@@ -436,6 +438,7 @@ void sieve_message_snapshot
 (struct sieve_message_context *msgctx)
 {
 	msgctx->edit_snapshot = TRUE;
+	msgctx->substitute_snapshot = TRUE;
 }
 
 /*