diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index f39882db9011f431218e546a6d32828b8c2d26eb..a7cd3352b79c469feb28497358707d102be7dcb0 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -98,9 +98,8 @@ static bool cmd_redirect_validate
 		(validator, cmd, arg, "address", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);
-	 
-	return TRUE;
+	
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 }
 
 /*
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 67a187791c60ab40b4ed62c5d2a1e9e0c440fb49..4b307936d8dc67f907718a9c3a31af8dffa98850 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -115,7 +115,9 @@ static bool tst_envelope_validate(struct sieve_validator *validator, struct siev
 		(validator, tst, arg, "envelope part", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	arg = sieve_ast_argument_next(arg);
 	
@@ -123,12 +125,12 @@ static bool tst_envelope_validate(struct sieve_validator *validator, struct siev
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 056e1bed0c47449a50d7a15740796fd9b31fcb96..3f04785635cdda497caa1eee00b70ec367971a5b 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -93,9 +93,8 @@ static bool cmd_fileinto_validate(struct sieve_validator *validator, struct siev
 		(validator, cmd, arg, "folder", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 53a9aa66dcd7fbbc94ccc97cfb53e21bb726d31c..87d29086f76623a55e2256cc6b86fc996ae86768 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -131,9 +131,8 @@ static bool cmd_reject_validate(struct sieve_validator *validator, struct sieve_
 		(validator, cmd, arg, "reason", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index b825004765b2b3aac6f77ec9dbf2cdb2b38dd5a5..b6f3409b7af60f1abf67ade4b66492c6e5942e65 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -140,7 +140,9 @@ static bool tag_body_transform_validate
 			(validator, cmd, tag, *arg, SAAT_STRING_LIST) ) {
 			return FALSE;
 		}
-		sieve_validator_argument_activate(validator, cmd, *arg, FALSE);
+		
+		if ( !sieve_validator_argument_activate(validator, cmd, *arg, FALSE) )
+			return FALSE;
 		
 		/* Assign tag parameters */
 		tag->parameters = *arg;
@@ -192,12 +194,12 @@ static bool tst_body_validate
 		(validator, tst, arg, "key list", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /*
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
index 6160db49d41bcd515e5e2599490da2a8f4ab149e..10335f2ad6b54a2025b8df18f65b0f6536b265e7 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
@@ -36,7 +36,8 @@ bool ext_imapflags_command_validate
 
 	arg2 = sieve_ast_argument_next(arg);
 	if ( arg2 != NULL ) {		
-		sieve_validator_argument_activate(validator, cmd, arg, TRUE);
+		if ( !sieve_validator_argument_activate(validator, cmd, arg, TRUE) )
+			return FALSE;
 
 		/* First, check syntax sanity */
 				
@@ -73,9 +74,7 @@ bool ext_imapflags_command_validate
 	} else
 		arg2 = arg;
 
-	sieve_validator_argument_activate(validator, cmd, arg2, FALSE);	
-
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg2, FALSE);	
 }
 
 bool ext_imapflags_command_operation_dump
diff --git a/src/lib-sieve/plugins/imapflags/tst-hasflag.c b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
index abee7453893df5e2e6af94a65d808a87cc5cfbe2..2df3d6b3b26832bd8a3035bb569b80b51c9326e5 100644
--- a/src/lib-sieve/plugins/imapflags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
@@ -106,7 +106,8 @@ static bool tst_hasflag_validate
 	
 	arg2 = sieve_ast_argument_next(arg);
 	if ( arg2 != NULL ) {
-		sieve_validator_argument_activate(validator, tst, arg, TRUE);
+		if ( !sieve_validator_argument_activate(validator, tst, arg, TRUE) )
+			return FALSE;
 
 		/* First, check syntax sanity */
 		
@@ -133,13 +134,12 @@ static bool tst_hasflag_validate
 	} else 
 		arg2 = arg;
 
-	sieve_validator_argument_activate(validator, tst, arg2, FALSE);
+	if ( !sieve_validator_argument_activate(validator, tst, arg2, FALSE) )
+		return FALSE;
 	
 	/* Validate the key argument to a specified match type */
 	
-	sieve_match_type_validate(validator, tst, arg2);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg2);
 }
 
 /*
diff --git a/src/lib-sieve/plugins/vacation/ext-vacation.c b/src/lib-sieve/plugins/vacation/ext-vacation.c
index 0bf1f355d930415c8b626374cf3dc542c592cb27..c54c82c009385d5628701d9b3a714ec1e47c4f4b 100644
--- a/src/lib-sieve/plugins/vacation/ext-vacation.c
+++ b/src/lib-sieve/plugins/vacation/ext-vacation.c
@@ -287,9 +287,8 @@ static bool cmd_vacation_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "reason", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 }
 
 /* Load extension into validator */
diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index 2d911f85a28cfcb84a71a73cd9200fdc9caf476a..f3ae9e56713e13780072b9aeb106bd732f0393dd 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -155,6 +155,7 @@ static bool cmd_set_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "name", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
+	
 	ext_variables_variable_argument_activate(validator, arg);
 
 	arg = sieve_ast_argument_next(arg);
@@ -163,9 +164,8 @@ static bool cmd_set_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "value", 2, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, cmd, arg, FALSE);	
 }
 
 /*
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c
index 9fc481226558887b6d0db6b4fd060aac0bf5e720..ba39f72a49fb7e152d9b41116312f9527ac69273 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.c
@@ -428,10 +428,10 @@ static bool arg_variable_string_validate
 			(validator, cmd, *arg, TRUE);
 	}
 	
-	if ( substart > strstart ) {
+	if ( strend > strstart ) {
 		struct sieve_ast_argument *strarg = _add_string_element(arglist, *arg);
-		strarg->_value.str = str_new(pool, substart - strstart);
-		str_append_n(strarg->_value.str, strstart, substart - strstart); 
+		strarg->_value.str = str_new(pool, strend - strstart);
+		str_append_n(strarg->_value.str, strstart, strend - strstart); 
 		
 		if ( !sieve_validator_argument_activate_super
 			(validator, cmd, strarg, FALSE) )
diff --git a/src/lib-sieve/plugins/variables/tst-string.c b/src/lib-sieve/plugins/variables/tst-string.c
index ece3095a31a9666233c0bc17c890b8f6ebd45976..27597e17ce9b94a94d35eab5586336e5641e08a9 100644
--- a/src/lib-sieve/plugins/variables/tst-string.c
+++ b/src/lib-sieve/plugins/variables/tst-string.c
@@ -85,7 +85,9 @@ static bool tst_string_validate
 		(validator, tst, arg, "source", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	arg = sieve_ast_argument_next(arg);
 
@@ -93,12 +95,12 @@ static bool tst_string_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/plugins/variables/variables.sieve b/src/lib-sieve/plugins/variables/variables.sieve
index 207dbc0ec80f1f4aed2816eb95287d790ac9c3a6..450a5e685ac8750b6df805299d947f0bccef7494 100644
--- a/src/lib-sieve/plugins/variables/variables.sieve
+++ b/src/lib-sieve/plugins/variables/variables.sieve
@@ -4,4 +4,10 @@ require "fileinto";
 set :upper "foo" "foosome";
 set :lower "bar" "bareable";
 
-fileinto "${foo}.${bar}";
+#fileinto "${foo}.${bar}";
+
+#set "huts" "${foo} likes the ${bar}";
+#set "fluts" "${foo}";
+set "friep" "it is ${foo} but not ${bar}!";
+
+fileinto "${friep}";
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index 16f0aa79d5492a8d4ca4311ec3f75d9a6c9afb37..80735e93ae236374fe0b5c2cf5e07bd484c2e5de 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -457,7 +457,7 @@ static bool sieve_validator_argument_default_activate
 		
 	validator->current_defarg = prev_defarg;	
 		
-	return TRUE;
+	return result;
 }
 
 bool sieve_validator_argument_activate_super
@@ -470,6 +470,8 @@ bool sieve_validator_argument_activate_super
 		return FALSE;
 	
 	if ( validator->current_defarg->overrides == NULL ) {
+		enum sieve_argument_type prev_type = validator->current_defarg_type;
+		
 		switch ( validator->current_defarg_type ) {
 		case SAT_NUMBER:
 		case SAT_CONST_STRING:
@@ -482,6 +484,8 @@ bool sieve_validator_argument_activate_super
 		default: 
 			return FALSE;
 		}
+		
+		validator->current_defarg_type = prev_type;
 	} else
 		defarg = validator->current_defarg->overrides;
 	
@@ -554,10 +558,10 @@ bool sieve_validate_tag_parameter
 			sieve_ast_argument_type_name(req_type),	sieve_ast_argument_name(param));
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, cmd, param, FALSE);
+
 	param->arg_id_code = tag->arg_id_code;
-	
-	return TRUE;
+
+	return sieve_validator_argument_activate(validator, cmd, param, FALSE);
 }
 
 /* Test validation API */
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index fadb704776933c935c79ef9bacbd8f05b43f5440..bc835bf29ed9a95dde9c35a30a1b92136104a3b4 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -79,7 +79,9 @@ static bool tst_address_validate
 		(validator, tst, arg, "header list", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	arg = sieve_ast_argument_next(arg);
 	
@@ -87,12 +89,12 @@ static bool tst_address_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index a2cc385549f2084d36bf91662ff5a5735a1927dd..6c44cb6f127d70d7fc4f4c6fb2bb5ddd4c7dd02c 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -58,11 +58,8 @@ static bool tst_exists_validate
 		(validator, tst, arg, "header names", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
 	
-	tst->data = arg;
-	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, tst, arg, FALSE);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 020cc914f7379d8a610b1e2bfaebd72da1dcad80..d3191f448c42cd3940e5d8e634041538c3dd90e3 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -83,7 +83,9 @@ static bool tst_header_validate
 		(validator, tst, arg, "header names", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 	
 	arg = sieve_ast_argument_next(arg);
 
@@ -91,12 +93,12 @@ static bool tst_header_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
+	
+	if ( !sieve_validator_argument_activate(validator, tst, arg, FALSE) )
+		return FALSE;
 
 	/* Validate the key argument to a specified match type */
-	sieve_match_type_validate(validator, tst, arg);
-	
-	return TRUE;
+	return sieve_match_type_validate(validator, tst, arg);
 }
 
 /* Test generation */
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index 8efb6a852c9e2838d7d18aa09d7c6aaa84822b4e..9a916d28bdd465bacf77ba3c3ed25640f5efc388 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -155,9 +155,8 @@ static bool tst_size_validate
 		(validator, tst, arg, "limit", 1, SAAT_NUMBER) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, tst, arg, FALSE);
 	
-	return TRUE;
+	return sieve_validator_argument_activate(validator, tst, arg, FALSE);
 }
 
 /* Test generation */