diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 1dbe5e80e648969b21782673351f175fc9b5df0a..e81cdbc74e59dfed0697c80f781bef566c85b3ad 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -449,7 +449,7 @@ static int ext_envelope_operation_execute
 	sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "envelope test");
 	
 	/* Initialize match */
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list);
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list);
 	
 	/* Iterate through all requested headers to match */
 	envp_item = NULL;
diff --git a/src/lib-sieve/mcht-matches.c b/src/lib-sieve/mcht-matches.c
index 1a2827eb9e9457c35e9bf6d1671b4a5c70da1ff8..3a1f1652e13fed7a4de81a58f16851e99e74a34f 100644
--- a/src/lib-sieve/mcht-matches.c
+++ b/src/lib-sieve/mcht-matches.c
@@ -121,7 +121,7 @@ static int mcht_matches_match
 	pvp = val;                  /* Previous value Pointer */
 
 	/* Start match values list if requested */
-	if ( (mvalues = sieve_match_values_start(mctx->interp)) != NULL ) {
+	if ( (mvalues = sieve_match_values_start(mctx->runenv)) != NULL ) {
 		/* Skip ${0} for now; added when match succeeds */
 		sieve_match_values_add(mvalues, NULL);
 
@@ -425,7 +425,7 @@ static int mcht_matches_match
 			sieve_match_values_set(mvalues, 0, matched);
 
 			/* Commit new match values */
-			sieve_match_values_commit(mctx->interp, &mvalues);
+			sieve_match_values_commit(mctx->runenv, &mvalues);
 		}
 		return TRUE;
 	}
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index f282529528b71284e38f51f50ed467807515155f..f416f586cdd0c8a308ccbae86b71431edada9c78 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -398,12 +398,12 @@ static int ext_body_operation_execute
 
 	/* Disable match values processing as required by RFC */
 		
-	mvalues_active = sieve_match_values_set_enabled(renv->interp, FALSE);
+	mvalues_active = sieve_match_values_set_enabled(renv, FALSE);
 
 	/* Iterate through all requested body parts to match */
 
 	matched = FALSE;	
-	mctx = sieve_match_begin(renv->interp, &mtch, &cmp, NULL, key_list); 	
+	mctx = sieve_match_begin(renv, &mtch, &cmp, NULL, key_list); 	
 	while ( !matched && body_parts->content != NULL ) {
 		if ( (mret=sieve_match_value(mctx, body_parts->content, body_parts->size)) 	
 			< 0) 
@@ -425,7 +425,7 @@ static int ext_body_operation_execute
 	
 	/* Restore match values processing */ 
 	
-	(void)sieve_match_values_set_enabled(renv->interp, mvalues_active);
+	(void)sieve_match_values_set_enabled(renv, mvalues_active);
 	
 	/* Set test result */	
 	
diff --git a/src/lib-sieve/plugins/date/tst-date.c b/src/lib-sieve/plugins/date/tst-date.c
index aa99017f4cf884ccb8234f4e592fe47af69328c8..541cbabaab39cdbab422aee402a3d5b14fef5d9c 100644
--- a/src/lib-sieve/plugins/date/tst-date.c
+++ b/src/lib-sieve/plugins/date/tst-date.c
@@ -518,7 +518,7 @@ static int tst_date_operation_execute
 	}
 
 	/* Initialize match */
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list); 	
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list); 	
 	
 	if ( got_date && part_value != NULL ) {		
 		/* Match value */
diff --git a/src/lib-sieve/plugins/enotify/tst-notify-method-capability.c b/src/lib-sieve/plugins/enotify/tst-notify-method-capability.c
index 9037bff7a8081314d3a008cd6f676b42db260637..e302178969962363a7c3b9608c238614e16c989b 100644
--- a/src/lib-sieve/plugins/enotify/tst-notify-method-capability.c
+++ b/src/lib-sieve/plugins/enotify/tst-notify-method-capability.c
@@ -228,7 +228,7 @@ static int tst_notifymc_operation_execute
 		(renv, 0 /* FIXME */, notify_uri, str_c(notify_capability));
 
 	if ( cap_value != NULL ) {
-		mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list); 	
+		mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list); 	
 
 		if ( (mret=sieve_match_value(mctx, cap_value, strlen(cap_value))) < 0 )
 			result = FALSE;
diff --git a/src/lib-sieve/plugins/environment/tst-environment.c b/src/lib-sieve/plugins/environment/tst-environment.c
index 28bd55e53b756c2206b38b91bd8dd52106afd7d9..54e1fb49b7b75c5cdf549c77c484c58f2ba4028d 100644
--- a/src/lib-sieve/plugins/environment/tst-environment.c
+++ b/src/lib-sieve/plugins/environment/tst-environment.c
@@ -201,7 +201,7 @@ static int tst_environment_operation_execute
 		(this_ext, str_c(name), renv->scriptenv);
 
 	if ( env_item != NULL ) {
-		mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list); 	
+		mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list); 	
 
 		if ( (mret=sieve_match_value(mctx, strlen(env_item) == 0 ? NULL : env_item, 
 			strlen(env_item))) < 0 ) {
diff --git a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
index aa18d90c069d510dc1e7759747ade0a6920867fb..fd370e91356b2e87c9d2fcabc22b2451ce1bd7c0 100644
--- a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
@@ -261,7 +261,7 @@ static int tst_hasflag_operation_execute
 
 	matched = FALSE;
 	mctx = sieve_match_begin
-		(renv->interp, &mtch, &cmp, &_flag_extractor, flag_list); 	
+		(renv, &mtch, &cmp, &_flag_extractor, flag_list); 	
 
 	matched = FALSE;
 
diff --git a/src/lib-sieve/plugins/notify/cmd-denotify.c b/src/lib-sieve/plugins/notify/cmd-denotify.c
index 36b2dcc33246ae24cffca1426e667a14520f8f29..82c1baa0eaba4d077fbe3e60ea73c0982c1801fd 100644
--- a/src/lib-sieve/plugins/notify/cmd-denotify.c
+++ b/src/lib-sieve/plugins/notify/cmd-denotify.c
@@ -339,7 +339,7 @@ static int cmd_denotify_operation_execute
 	if ( match_key != NULL ) { 	
 
 		/* Initialize match */
-    	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, match_key);
+    	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, match_key);
 
 		/* Iterate through all actions */
 		rictx = sieve_result_iterate_init(renv->result);
diff --git a/src/lib-sieve/plugins/regex/mcht-regex.c b/src/lib-sieve/plugins/regex/mcht-regex.c
index 5dd4969d76874cd35041b9b1e3afb8f2b2d57a45..2fda6940ab98676357aa37261021a4bf236733af 100644
--- a/src/lib-sieve/plugins/regex/mcht-regex.c
+++ b/src/lib-sieve/plugins/regex/mcht-regex.c
@@ -189,7 +189,7 @@ static void mcht_regex_match_init
 	ctx->value_index = -1;
 
 	/* Create storage for match values if match values are requested */
-	if ( sieve_match_values_are_enabled(mctx->interp) ) {
+	if ( sieve_match_values_are_enabled(mctx->runenv) ) {
 		ctx->pmatch = p_new(pool, regmatch_t, MCHT_REGEX_MAX_SUBSTITUTIONS);
 		ctx->nmatch = MCHT_REGEX_MAX_SUBSTITUTIONS;
 	} else {
@@ -274,7 +274,7 @@ static int mcht_regex_match
 			string_t *subst = t_str_new(32);
 
 			/* Start new list of match values */
-			mvalues = sieve_match_values_start(mctx->interp);
+			mvalues = sieve_match_values_start(mctx->runenv);
 
 			i_assert( mvalues != NULL );
 
@@ -296,7 +296,7 @@ static int mcht_regex_match
 			}
 
 			/* Substitute the new match values */
-			sieve_match_values_commit(mctx->interp, &mvalues);
+			sieve_match_values_commit(mctx->runenv, &mvalues);
 		}
 
 		return TRUE;
diff --git a/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c b/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c
index f13fe943ee176ebd67c3493141b8b17f6b6beafa..c195eb52fb4dfdd139ef370f4d15d04377319bd3 100644
--- a/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c
+++ b/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c
@@ -283,7 +283,7 @@ static int tst_spamvirustest_operation_execute
 		(renv, SIEVE_TRLVL_TESTS, "%s test", sieve_operation_mnemonic(op));
 
 	/* Initialize match */
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_value); 	
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_value); 	
 
 	/* Perform match */
 
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c
index 50b4b9dda63f57f27d4c2677a4b5d7e52e9e8f4e..b1843124bfe5c448a4a869e820a8309b2f3e8945 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.c
@@ -723,7 +723,7 @@ bool ext_variables_interpreter_load
 		(ext, renv->interp, scpbin);
 
 	/* Enable support for match values */
-	(void) sieve_match_values_set_enabled(renv->interp, TRUE);
+	(void) sieve_match_values_set_enabled(renv, TRUE);
 
 	return TRUE;
 }
diff --git a/src/lib-sieve/plugins/variables/ext-variables-operands.c b/src/lib-sieve/plugins/variables/ext-variables-operands.c
index 602fb99aba881d83959d443317b8b0edbf971c7d..11ef017317fb658d08d794958a9141ef0adc1147 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-operands.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-operands.c
@@ -246,7 +246,7 @@ static bool opr_match_value_read
 		 * actually read the argument.
 		 	*/
 		if ( str != NULL ) {
-			sieve_match_values_get(renv->interp, index, str);
+			sieve_match_values_get(renv, index, str);
 		
 			if ( *str == NULL ) 
 				*str = t_str_new(0);
diff --git a/src/lib-sieve/plugins/variables/tst-string.c b/src/lib-sieve/plugins/variables/tst-string.c
index fc05636ac60719a709e59ca82e8837a9b71abba5..9e8977febaaba72e7d7496d6dd2b41e00f10ee06 100644
--- a/src/lib-sieve/plugins/variables/tst-string.c
+++ b/src/lib-sieve/plugins/variables/tst-string.c
@@ -205,7 +205,7 @@ static int tst_string_operation_execute
 
 	sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "string test");
 
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list); 	
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list); 	
 
 	/* Iterate through all requested strings to match */
 	src_item = NULL;
diff --git a/src/lib-sieve/sieve-match-types.c b/src/lib-sieve/sieve-match-types.c
index 96d039278fc823adc6e70e61c4f3bf5c3b157ff0..cc5bd307dafa616b2c08ebf3ab8d43ffb1151e3d 100644
--- a/src/lib-sieve/sieve-match-types.c
+++ b/src/lib-sieve/sieve-match-types.c
@@ -185,10 +185,10 @@ static inline struct mtch_interpreter_context *get_interpreter_context
  */
 
 bool sieve_match_values_set_enabled
-(struct sieve_interpreter *interp, bool enable)
+(const struct sieve_runtime_env *renv, bool enable)
 {
 	struct mtch_interpreter_context *ctx = 
-		get_interpreter_context(interp, enable);
+		get_interpreter_context(renv->interp, enable);
 		
 	if ( ctx != NULL ) {
 		bool previous = ctx->match_values_enabled;
@@ -201,19 +201,19 @@ bool sieve_match_values_set_enabled
 }
 
 bool sieve_match_values_are_enabled
-(struct sieve_interpreter *interp)
+(const struct sieve_runtime_env *renv)
 {
 	struct mtch_interpreter_context *ctx = 
-		get_interpreter_context(interp, FALSE);
+		get_interpreter_context(renv->interp, FALSE);
 		
 	return ( ctx == NULL ? FALSE : ctx->match_values_enabled );
 }
 
 struct sieve_match_values *sieve_match_values_start
-(struct sieve_interpreter *interp)
+(const struct sieve_runtime_env *renv)
 {
 	struct mtch_interpreter_context *ctx = 
-		get_interpreter_context(interp, FALSE);
+		get_interpreter_context(renv->interp, FALSE);
 	struct sieve_match_values *match_values;
 	
 	if ( ctx == NULL || !ctx->match_values_enabled )
@@ -294,13 +294,13 @@ void sieve_match_values_skip
 }
 
 void sieve_match_values_commit
-(struct sieve_interpreter *interp, struct sieve_match_values **mvalues)
+(const struct sieve_runtime_env *renv, struct sieve_match_values **mvalues)
 {
 	struct mtch_interpreter_context *ctx;
 	
 	if ( (*mvalues) == NULL ) return;
 	
-	ctx = get_interpreter_context(interp, FALSE);
+	ctx = get_interpreter_context(renv->interp, FALSE);
 	if ( ctx == NULL || !ctx->match_values_enabled )
 		return;	
 		
@@ -323,10 +323,10 @@ void sieve_match_values_abort
 }
 
 void sieve_match_values_get
-(struct sieve_interpreter *interp, unsigned int index, string_t **value_r) 
+(const struct sieve_runtime_env *renv, unsigned int index, string_t **value_r) 
 {
 	struct mtch_interpreter_context *ctx = 
-		get_interpreter_context(interp, FALSE);
+		get_interpreter_context(renv->interp, FALSE);
 	struct sieve_match_values *mvalues;
 
 	if ( ctx == NULL || ctx->match_values == NULL ) {
diff --git a/src/lib-sieve/sieve-match-types.h b/src/lib-sieve/sieve-match-types.h
index b96fa7aaafbf30b54468b91850130d4b2a502cb1..dd040fb5677bb3b49b96128ecd04241f22cf3a7e 100644
--- a/src/lib-sieve/sieve-match-types.h
+++ b/src/lib-sieve/sieve-match-types.h
@@ -134,12 +134,12 @@ void sieve_match_type_register
 struct sieve_match_values;
 
 bool sieve_match_values_set_enabled
-	(struct sieve_interpreter *interp, bool enable);
+	(const struct sieve_runtime_env *renv, bool enable);
 bool sieve_match_values_are_enabled
-	(struct sieve_interpreter *interp);	
+	(const struct sieve_runtime_env *renv);	
 	
 struct sieve_match_values *sieve_match_values_start
-	(struct sieve_interpreter *interp);
+	(const struct sieve_runtime_env *renv);
 void sieve_match_values_set
 	(struct sieve_match_values *mvalues, unsigned int index, string_t *value);
 void sieve_match_values_add
@@ -150,12 +150,12 @@ void sieve_match_values_skip
 	(struct sieve_match_values *mvalues, int num);
 	
 void sieve_match_values_commit
-	(struct sieve_interpreter *interp, struct sieve_match_values **mvalues);
+	(const struct sieve_runtime_env *renv, struct sieve_match_values **mvalues);
 void sieve_match_values_abort
 	(struct sieve_match_values **mvalues);
 	
 void sieve_match_values_get
-	(struct sieve_interpreter *interp, unsigned int index, string_t **value_r);
+	(const struct sieve_runtime_env *renv, unsigned int index, string_t **value_r);
 
 /*
  * Match type tagged argument 
diff --git a/src/lib-sieve/sieve-match.c b/src/lib-sieve/sieve-match.c
index 7797fb192931d01c8ccf9d4385017059d8429ec8..43364f549bd063d485308d8d25e07ca2a77734e2 100644
--- a/src/lib-sieve/sieve-match.c
+++ b/src/lib-sieve/sieve-match.c
@@ -24,7 +24,7 @@
  */
 
 struct sieve_match_context *sieve_match_begin
-(struct sieve_interpreter *interp, const struct sieve_match_type *mcht, 
+(const struct sieve_runtime_env *renv, const struct sieve_match_type *mcht, 
 	const struct sieve_comparator *cmp, 
 	const struct sieve_match_key_extractor *kextract,
 	struct sieve_coded_stringlist *key_list)
@@ -36,7 +36,7 @@ struct sieve_match_context *sieve_match_begin
 	mctx = p_new(pool, struct sieve_match_context, 1);  
 
 	mctx->pool = pool;
-	mctx->interp = interp;
+	mctx->runenv = renv;
 	mctx->match_type = mcht;
 	mctx->comparator = cmp;
 	mctx->kextract = kextract;
diff --git a/src/lib-sieve/sieve-match.h b/src/lib-sieve/sieve-match.h
index 89d13c6aa1cef1d65900ac3cdf8cf7803a0c675b..cd79c9a00fbba1fda4f8a828ab0b9c1c72fa057c 100644
--- a/src/lib-sieve/sieve-match.h
+++ b/src/lib-sieve/sieve-match.h
@@ -18,7 +18,7 @@ struct sieve_match_key_extractor {
 struct sieve_match_context {
 	pool_t pool;
 
-	struct sieve_interpreter *interp;
+	const struct sieve_runtime_env *runenv;
 	const struct sieve_match_type *match_type;
 	const struct sieve_comparator *comparator;
 	const struct sieve_match_key_extractor *kextract;
@@ -34,7 +34,8 @@ struct sieve_match_context {
  */
 
 struct sieve_match_context *sieve_match_begin
-	(struct sieve_interpreter *interp, const struct sieve_match_type *mtch, 
+	(const struct sieve_runtime_env *renv,
+		const struct sieve_match_type *mtch, 
 		const struct sieve_comparator *cmp, 
 		const struct sieve_match_key_extractor *kextract,
 		struct sieve_coded_stringlist *key_list);
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index daede9ae0d1b10ada6f4b03106c10ce23d349d74..bdecded82a4dd77dbe43ddd46f4ca8081f9a7662 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -255,7 +255,7 @@ static int tst_address_operation_execute
 	sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "address test");
 
 	/* Initialize match context */
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list);
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list);
 	
 	/* Iterate through all requested headers to match */
 	hdr_item = NULL;
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 4e25b3d8bfab9aa42ac0ffc367529cbefe734a5c..438b2e42eb2adf0f329b35dbd0f558ec44adaba9 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -210,7 +210,7 @@ static int tst_header_operation_execute
 	sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "header test");
 
 	/* Initialize match */
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list); 	
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list); 	
 
 	/* Iterate through all requested headers to match */
 	hdr_item = NULL;
diff --git a/src/testsuite/tst-test-error.c b/src/testsuite/tst-test-error.c
index 9dcbac7fc42efdf19c4f8e7d774ee28457ba5f02..2e064f6b1ca31270aa9ef440e52ff80c2ed8224a 100644
--- a/src/testsuite/tst-test-error.c
+++ b/src/testsuite/tst-test-error.c
@@ -259,7 +259,7 @@ static int tst_test_error_operation_execute
 	testsuite_log_get_error_init();
 
 	/* Initialize match */
-	mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list);
+	mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list);
 
 	/* Iterate through all errors to match */
 	error = NULL;
diff --git a/src/testsuite/tst-test-result.c b/src/testsuite/tst-test-result.c
index d6cccc071ea03a5a8adbf2de7844c677afdd7531..d684acc9c9b8577ad94e1777b896d31ac4f627aa 100644
--- a/src/testsuite/tst-test-result.c
+++ b/src/testsuite/tst-test-result.c
@@ -266,7 +266,7 @@ static int tst_test_result_operation_execute
 	rictx = testsuite_result_iterate_init();
 
   /* Initialize match */
-  mctx = sieve_match_begin(renv->interp, &mcht, &cmp, NULL, key_list);
+  mctx = sieve_match_begin(renv, &mcht, &cmp, NULL, key_list);
 
   /* Iterate through all errors to match */
 	matched = FALSE;