diff --git a/src/lib-sieve/cmd-discard.c b/src/lib-sieve/cmd-discard.c
index 232f4e5a1cfe38ab74bd5b28791f333cd6d15937..0e6fcd40b9f33b27d9c3341ec4e1df311c737791 100644
--- a/src/lib-sieve/cmd-discard.c
+++ b/src/lib-sieve/cmd-discard.c
@@ -2,6 +2,7 @@
 
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
diff --git a/src/lib-sieve/cmd-keep.c b/src/lib-sieve/cmd-keep.c
index 1031be7db32fa1550f13f3a1b4d54fcd8ab5102d..7834f2056dd461e21980227db06aa57b0592a4e4 100644
--- a/src/lib-sieve/cmd-keep.c
+++ b/src/lib-sieve/cmd-keep.c
@@ -2,6 +2,7 @@
 
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 4671c4d9f9fafad4b6e3f9ebdbb7a566db00dc1d..17d35e68c8da50339888d6063a2943ecff68c0cf 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -6,6 +6,7 @@
 
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
@@ -97,7 +98,7 @@ static bool cmd_redirect_validate
 		(validator, cmd, arg, "address", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	 
 	return TRUE;
 }
diff --git a/src/lib-sieve/cmd-require.c b/src/lib-sieve/cmd-require.c
index 83ec9d82abcb96272b3e10aea428d436ccbe39ff..f69e94d1c05e343b30f0cae589e461db815d3028 100644
--- a/src/lib-sieve/cmd-require.c
+++ b/src/lib-sieve/cmd-require.c
@@ -4,6 +4,7 @@
 #include "sieve-commands-private.h"
 #include "sieve-extensions.h"
 #include "sieve-validator.h" 
+#include "sieve-generator.h"
 
 /* Types */
 
diff --git a/src/lib-sieve/ext-encoded-character.c b/src/lib-sieve/ext-encoded-character.c
index 69f944b021b1043df0e01d9574e648b120545293..2c6d3451fefd29eaa37c3765914abb661be69158 100644
--- a/src/lib-sieve/ext-encoded-character.c
+++ b/src/lib-sieve/ext-encoded-character.c
@@ -11,6 +11,7 @@
 #include "lib.h"
 
 #include "sieve-extensions.h"
+#include "sieve-commands.h"
 #include "sieve-validator.h"
 
 /* Forward declarations */
@@ -37,10 +38,27 @@ static bool ext_encoded_character_load(int ext_id)
 	return TRUE;
 }
 
+/* New argument */
+
+bool arg_encoded_string_validate
+	(struct sieve_validator *validator, struct sieve_ast_argument **arg, 
+		struct sieve_command_context *context);
+
+const struct sieve_argument encoded_string_argument =
+	{ "@encoded-string", NULL, arg_encoded_string_validate, NULL, NULL };
+
+bool arg_encoded_string_validate
+	(struct sieve_validator *validator, struct sieve_ast_argument **arg, 
+		struct sieve_command_context *context)
+{
+	return TRUE;
+}
+
 /* Load extension into validator */
 
 static bool ext_encoded_character_validator_load
 	(struct sieve_validator *validator ATTR_UNUSED)
 {
+//	sieve_validator_argument_override(validator, 
 	return TRUE;
 }
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 49351e67587dfb4b402fa5f4ae13b6c6f31f485e..5efa31dd8ee315859838538d4895e602747f64f3 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -15,6 +15,7 @@
 
 #include "sieve-extensions.h"
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-comparators.h"
 #include "sieve-match-types.h"
 #include "sieve-address-parts.h"
@@ -115,7 +116,7 @@ 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, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	arg = sieve_ast_argument_next(arg);
 	
@@ -123,7 +124,7 @@ 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, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 
 	/* Validate the key argument to a specified match type */
 	sieve_match_type_validate(validator, tst, arg);
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 365247b3d04230bb1b02d151515d62606d3b9d0b..770a828fab04daaa7cf0bac3adb02e17c5cc8fd3 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -12,6 +12,7 @@
 
 #include "sieve-extensions.h"
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-validator.h"
 #include "sieve-generator.h"
@@ -93,7 +94,7 @@ 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, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	return TRUE;
 }
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 2e839fac5d0e9dd0731a085f3e5c6b48c65667a6..099fc58ae9cdddd885bba007e409295d909233da 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -18,8 +18,11 @@
 
 #include "sieve-extensions.h"
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-validator.h"
+#include "sieve-generator.h"
+#include "sieve-binary.h"
 #include "sieve-interpreter.h"
 #include "sieve-code-dumper.h"
 #include "sieve-result.h"
@@ -129,7 +132,7 @@ 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, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	return TRUE;
 }
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index 5176c17ac92be90f519ecd7289ffd7a4a2afddb9..fc64e9f4cf87ddd54e7752dc9f4318fa2d4e7c6e 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -1,5 +1,6 @@
 #include "sieve-extensions.h"
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-comparators.h"
 #include "sieve-match-types.h"
 #include "sieve-address-parts.h"
@@ -140,7 +141,7 @@ static bool tag_body_transform_validate
 			(validator, cmd, tag, *arg, SAAT_STRING_LIST) ) {
 			return FALSE;
 		}
-		sieve_validator_argument_activate(validator, *arg);
+		sieve_validator_argument_activate(validator, *arg, FALSE);
 		
 		/* Assign tag parameters */
 		tag->parameters = *arg;
@@ -192,7 +193,7 @@ static bool tst_body_validate
 		(validator, tst, arg, "key list", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 
 	/* Validate the key argument to a specified match type */
 	sieve_match_type_validate(validator, tst, arg);
diff --git a/src/lib-sieve/plugins/imapflags/cmd-addflag.c b/src/lib-sieve/plugins/imapflags/cmd-addflag.c
index 7d5502a8599d20360ef7be19174c4a1464eeb277..fa727c41e9a6bd17b2c344f9e21e1ad00eb31cfd 100644
--- a/src/lib-sieve/plugins/imapflags/cmd-addflag.c
+++ b/src/lib-sieve/plugins/imapflags/cmd-addflag.c
@@ -1,6 +1,7 @@
 #include "lib.h"
 
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
 #include "sieve-interpreter.h"
diff --git a/src/lib-sieve/plugins/imapflags/cmd-setflag.c b/src/lib-sieve/plugins/imapflags/cmd-setflag.c
index a1eeaa7b6eaa55d6e1de4d9c0efe64ef6745c695..246e3b7c12d5d2ac65d0cb0c11dd63490eff4489 100644
--- a/src/lib-sieve/plugins/imapflags/cmd-setflag.c
+++ b/src/lib-sieve/plugins/imapflags/cmd-setflag.c
@@ -1,6 +1,7 @@
 #include "lib.h"
 
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
 #include "sieve-interpreter.h"
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
index f805c31660d633f51ebdbe8e28ec091699d0c7bb..411f37335eea0e18f4b72714c114f07b0f737273 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
@@ -1,7 +1,7 @@
 #include "lib.h"
 
-#include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
 #include "sieve-interpreter.h"
@@ -35,10 +35,9 @@ bool ext_imapflags_command_validate
 	}
 
 	arg2 = sieve_ast_argument_next(arg);
-	
-	if ( arg2 != NULL ) {
-		sieve_validator_argument_activate(validator, arg);
-		
+	if ( arg2 != NULL ) {		
+		sieve_validator_argument_activate(validator, arg, TRUE);
+
 		/* First, check syntax sanity */
 				
 		if ( sieve_ast_argument_type(arg) != SAAT_STRING ) 
@@ -71,12 +70,11 @@ bool ext_imapflags_command_validate
 				cmd->command->identifier);
 			return FALSE;
 		}
-		
-	} else 
+	} else
 		arg2 = arg;
-	
-	sieve_validator_argument_activate(validator, arg2);
-	
+
+	sieve_validator_argument_activate(validator, arg2, FALSE);	
+
 	return TRUE;
 }
 
diff --git a/src/lib-sieve/plugins/imapflags/tag-flags.c b/src/lib-sieve/plugins/imapflags/tag-flags.c
index 663812402c11fefae1c4ee97f111c4913fa1fc90..943b6ce2f02a5c4a64edc26bbd38a917770ab5e7 100644
--- a/src/lib-sieve/plugins/imapflags/tag-flags.c
+++ b/src/lib-sieve/plugins/imapflags/tag-flags.c
@@ -4,6 +4,7 @@
 
 #include "sieve-extensions.h"
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-result.h"
 #include "sieve-validator.h" 
diff --git a/src/lib-sieve/plugins/imapflags/tst-hasflag.c b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
index 716278b0682ea9f17c04ccf5ffdf051208f97099..d62276ebb061c06ab9984b47abbd59d43c3f7c24 100644
--- a/src/lib-sieve/plugins/imapflags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
@@ -1,6 +1,7 @@
 #include "lib.h"
 
 #include "sieve-commands.h"
+#include "sieve-code.h"
 #include "sieve-comparators.h"
 #include "sieve-match-types.h"
 #include "sieve-validator.h" 
@@ -103,10 +104,11 @@ static bool tst_hasflag_validate
 			"as first argument, but %s was found", sieve_ast_argument_name(arg));
 		return FALSE; 
 	}
-	sieve_validator_argument_activate(validator, arg);
 	
 	arg2 = sieve_ast_argument_next(arg);
 	if ( arg2 != NULL ) {
+		sieve_validator_argument_activate(validator, arg, TRUE);
+
 		/* First, check syntax sanity */
 		
 		if ( sieve_ast_argument_type(arg2) != SAAT_STRING && 
@@ -129,10 +131,10 @@ static bool tst_hasflag_validate
 				"variable list when the variables extension is active");
 			return FALSE;
 		}
-	
-		sieve_validator_argument_activate(validator, arg2);
 	} else 
 		arg2 = arg;
+
+	sieve_validator_argument_activate(validator, arg2, FALSE);
 	
 	/* Validate the key argument to a specified match type */
 	
diff --git a/src/lib-sieve/plugins/include/cmd-return.c b/src/lib-sieve/plugins/include/cmd-return.c
index 5f0cff94427fe339c8d64c8fd69f6d6157890ef9..d684de2e26d49d21866efd73125c97ad899d1a3f 100644
--- a/src/lib-sieve/plugins/include/cmd-return.c
+++ b/src/lib-sieve/plugins/include/cmd-return.c
@@ -1,5 +1,6 @@
 #include "lib.h"
 
+#include "sieve-code.h"
 #include "sieve-commands.h"
 #include "sieve-validator.h" 
 #include "sieve-generator.h"
diff --git a/src/lib-sieve/plugins/vacation/ext-vacation.c b/src/lib-sieve/plugins/vacation/ext-vacation.c
index abb40ac25b92e225770f63f7fe868965ebfb4f92..f0e269e8248b9958a12d579d242d531347449071 100644
--- a/src/lib-sieve/plugins/vacation/ext-vacation.c
+++ b/src/lib-sieve/plugins/vacation/ext-vacation.c
@@ -288,7 +288,7 @@ static bool cmd_vacation_validate(struct sieve_validator *validator,
 		(validator, cmd, arg, "reason", 1, SAAT_STRING) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);	
+	sieve_validator_argument_activate(validator, arg, FALSE);	
 	
 	return TRUE;
 }
diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c
index ec007f62e12d74f0876416c160b1811b37e909a4..1ecfa9f75680fdc68952dc1dafad3ded8544f1ff 100644
--- a/src/lib-sieve/sieve-address-parts.c
+++ b/src/lib-sieve/sieve-address-parts.c
@@ -9,6 +9,7 @@
 
 #include "sieve-extensions.h"
 #include "sieve-code.h"
+#include "sieve-commands.h"
 #include "sieve-binary.h"
 #include "sieve-comparators.h"
 #include "sieve-match-types.h"
diff --git a/src/lib-sieve/sieve-ast.h b/src/lib-sieve/sieve-ast.h
index 4268bb8fed504cabdcab84dcaab4051984561933..d958aeb48f456a002ff6987996d02fc715fb2601 100644
--- a/src/lib-sieve/sieve-ast.h
+++ b/src/lib-sieve/sieve-ast.h
@@ -5,7 +5,6 @@
 #include "str.h"
 
 #include "sieve-common.h"
-#include "sieve-commands.h"
 
 /*
 	Abstract Syntax Tree (AST) structure:
@@ -51,10 +50,10 @@ enum sieve_ast_argument_type {
 	SAAT_NONE,
 	
 	/* Arguments generated by parser */
+	SAAT_NUMBER,
 	SAAT_STRING,
 	SAAT_STRING_LIST,
 	SAAT_TAG,
-	SAAT_NUMBER,
 };
 
 struct sieve_ast_argument {
diff --git a/src/lib-sieve/sieve-code-dumper.c b/src/lib-sieve/sieve-code-dumper.c
index 0c8ebb7e0e6cdd48382c349fe55c806a2e06c705..b85846361ca41908f96db56e1e8b16cd34808f32 100644
--- a/src/lib-sieve/sieve-code-dumper.c
+++ b/src/lib-sieve/sieve-code-dumper.c
@@ -8,6 +8,7 @@
 
 #include "sieve-extensions.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-generator.h"
 #include "sieve-binary.h"
diff --git a/src/lib-sieve/sieve-commands.c b/src/lib-sieve/sieve-commands.c
index 23737c8233cb49f297508586f27acf570289249e..675557c5fc561acde48e4d029f612337f08cf35d 100644
--- a/src/lib-sieve/sieve-commands.c
+++ b/src/lib-sieve/sieve-commands.c
@@ -5,8 +5,8 @@
 #include "sieve-generator.h"
 #include "sieve-binary.h"
 
-#include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-interpreter.h"
 
 /* Default arguments implemented in this file */
diff --git a/src/lib-sieve/sieve-commands.h b/src/lib-sieve/sieve-commands.h
index 8736904dc2238cd27b684ad20eca559f998efcab..bd86026b3f9e9bb44f6868b8e9323fc1d24969d8 100644
--- a/src/lib-sieve/sieve-commands.h
+++ b/src/lib-sieve/sieve-commands.h
@@ -5,8 +5,6 @@
 
 #include "sieve-common.h"
 #include "sieve-ast.h"
-#include "sieve-validator.h"
-#include "sieve-generator.h"
 
 /* Argument */
 
diff --git a/src/lib-sieve/sieve-comparators.c b/src/lib-sieve/sieve-comparators.c
index b338be06486dac0909640ba0aaf4a170989abff1..234d0916ad65ed655dc2d66580a2b45504b7c050 100644
--- a/src/lib-sieve/sieve-comparators.c
+++ b/src/lib-sieve/sieve-comparators.c
@@ -5,6 +5,7 @@
 
 #include "sieve-extensions.h"
 #include "sieve-code.h"
+#include "sieve-commands.h"
 #include "sieve-binary.h"
 #include "sieve-validator.h"
 #include "sieve-generator.h"
diff --git a/src/lib-sieve/sieve-comparators.h b/src/lib-sieve/sieve-comparators.h
index e9325f5b837900d29f9055613346cc30772bd34c..340fc50cd197238f82ec00ea8593b1f288bf803a 100644
--- a/src/lib-sieve/sieve-comparators.h
+++ b/src/lib-sieve/sieve-comparators.h
@@ -1,6 +1,8 @@
 #ifndef __SIEVE_COMPARATORS_H
 #define __SIEVE_COMPARATORS_H
 
+#include "sieve-common.h"
+
 enum sieve_comparator_code {
 	SIEVE_COMPARATOR_I_OCTET,
 	SIEVE_COMPARATOR_I_ASCII_CASEMAP,
diff --git a/src/lib-sieve/sieve-generator.h b/src/lib-sieve/sieve-generator.h
index 49029784562744a835fc8d1135bab9c83e41f199..8b832dbb7b1984a9cd782b9629ecab108e96943f 100644
--- a/src/lib-sieve/sieve-generator.h
+++ b/src/lib-sieve/sieve-generator.h
@@ -1,8 +1,7 @@
 #ifndef __SIEVE_GENERATOR_H
 #define __SIEVE_GENERATOR_H
 
-#include "sieve-ast.h"
-#include "sieve-code.h"
+#include "sieve-common.h"
 
 struct sieve_generator;
 
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 1f99af2be8e4358593a69e04daa4fe29fa443f57..1a4d7cb44a529e9b82fbd16e29b4f1a04c776858 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -10,6 +10,7 @@
 #include "sieve-error.h"
 #include "sieve-extensions.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-actions.h"
 #include "sieve-generator.h"
 #include "sieve-binary.h"
diff --git a/src/lib-sieve/sieve-parser.h b/src/lib-sieve/sieve-parser.h
index b06854f7857a6ca81c966200441fee6878255028..d12eb2a4d8e11222ea70f8918ed800f22d8375b7 100644
--- a/src/lib-sieve/sieve-parser.h
+++ b/src/lib-sieve/sieve-parser.h
@@ -2,8 +2,8 @@
 #define __SIEVE_PARSER_H
 
 #include "lib.h"
-#include "sieve-lexer.h"
-#include "sieve-ast.h"
+
+#include "sieve-common.h"
 
 struct sieve_parser;
 
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index 77d0fbd74bcdfcdd79c49ba1e3a27823b1aa9a8f..42252a1abbe817093c8e7ef7f3ea21594508bd96 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -1,4 +1,6 @@
 #include "lib.h"
+#include "array.h"
+#include "buffer.h"
 #include "mempool.h"
 #include "hash.h"
 
@@ -12,6 +14,11 @@
 #include "sieve-comparators.h"
 #include "sieve-address-parts.h"
 
+struct sieve_default_argument {
+	const struct sieve_argument *argument;
+	struct sieve_default_argument *overrides;
+};
+
 /* Context/Semantics checker implementation */
 
 struct sieve_validator {
@@ -23,9 +30,12 @@ struct sieve_validator {
 	struct sieve_error_handler *ehandler;
 	
 	/* Registries */
+	
 	struct hash_table *commands;
 	
 	ARRAY_DEFINE(ext_contexts, void *);
+	
+	struct sieve_default_argument default_arguments[SAT_COUNT];
 };
 
 /* Predeclared statics */
@@ -87,6 +97,14 @@ struct sieve_validator *sieve_validator_create
 	validator->script = sieve_ast_script(ast);
 	sieve_ast_ref(ast);
 
+	/* Setup default arguments */
+	validator->default_arguments[SAT_NUMBER].
+		argument = &number_argument;
+	validator->default_arguments[SAT_CONST_STRING].
+		argument = &string_argument;
+	validator->default_arguments[SAT_CONST_STRING_LIST].
+		argument = &string_list_argument;
+
 	/* Setup storage for extension contexts */		
 	array_create(&validator->ext_contexts, pool, sizeof(void *), 
 		sieve_extensions_get_count());
@@ -415,20 +433,30 @@ bool sieve_validate_positional_argument
 }
 
 void sieve_validator_argument_activate
-	(struct sieve_validator *validator ATTR_UNUSED, struct sieve_ast_argument *arg)
+	(struct sieve_validator *validator ATTR_UNUSED, 
+		struct sieve_ast_argument *arg, bool constant)
 {
 	switch ( sieve_ast_argument_type(arg) ) {
 	case SAAT_NUMBER:
-		arg->argument = &number_argument;
+		arg->argument = validator->default_arguments[SAT_NUMBER].argument;
 		break;
 	case SAAT_STRING:
-		arg->argument = &string_argument;
+		if ( validator->default_arguments[SAT_VAR_STRING].argument == NULL ||
+			constant )
+			arg->argument = validator->
+					default_arguments[SAT_CONST_STRING].argument;
+		else
+			arg->argument = validator->
+					default_arguments[SAT_VAR_STRING].argument;
 		break;
 	case SAAT_STRING_LIST:
-		arg->argument = &string_list_argument;
-		break;
-	case SAAT_TAG:
-		i_error("!!BUG!!: sieve_validator_argument_activate: cannot activate tagged argument.");
+		if ( validator->default_arguments[SAT_VAR_STRING_LIST].argument == NULL ||
+			constant )
+			arg->argument = validator->
+					default_arguments[SAT_CONST_STRING_LIST].argument;
+		else
+			arg->argument = validator->
+					default_arguments[SAT_VAR_STRING_LIST].argument;
 		break;
 	default:
 		break;
@@ -451,7 +479,7 @@ bool sieve_validate_tag_parameter
 			sieve_ast_argument_type_name(req_type),	sieve_ast_argument_name(param));
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, param);
+	sieve_validator_argument_activate(validator, param, FALSE);
 	param->arg_id_code = tag->arg_id_code;
 	
 	return TRUE;
diff --git a/src/lib-sieve/sieve-validator.h b/src/lib-sieve/sieve-validator.h
index 4072ff5c1a798ef7190135a141b45b004a0a1d33..e565175b69463f03cd81772633706123a4602147 100644
--- a/src/lib-sieve/sieve-validator.h
+++ b/src/lib-sieve/sieve-validator.h
@@ -4,7 +4,16 @@
 #include "lib.h"
 
 #include "sieve-common.h"
-#include "sieve-error.h"
+
+enum sieve_argument_type {
+	SAT_NUMBER,
+	SAT_CONST_STRING,
+	SAT_CONST_STRING_LIST,
+	SAT_VAR_STRING,
+	SAT_VAR_STRING_LIST,
+	
+	SAT_COUNT
+};
 
 struct sieve_validator;
 struct sieve_command_registration;
@@ -55,7 +64,8 @@ bool sieve_validate_positional_argument
 	struct sieve_ast_argument *arg, const char *arg_name, unsigned int arg_pos,
 	enum sieve_ast_argument_type req_type);
 void sieve_validator_argument_activate
-	(struct sieve_validator *validator, struct sieve_ast_argument *arg);	 
+	(struct sieve_validator *validator, struct sieve_ast_argument *arg,
+		bool constant);	 
 bool sieve_validate_tag_parameter
 	(struct sieve_validator *validator, struct sieve_command_context *cmd,
 	struct sieve_ast_argument *tag, struct sieve_ast_argument *param,
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index b7026648ea130cb88f657c67a2f5657aa2c2a06d..d3c68214e3c661e6d62e77d7b9a58758d6e64203 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -2,6 +2,7 @@
 
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 
 #include "sieve-comparators.h"
 #include "sieve-match-types.h"
@@ -78,7 +79,7 @@ static bool tst_address_validate
 		(validator, tst, arg, "header list", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 
 	arg = sieve_ast_argument_next(arg);
 	
@@ -86,7 +87,7 @@ static bool tst_address_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	/* Validate the key argument to a specified match type */
 	sieve_match_type_validate(validator, tst, arg);
diff --git a/src/lib-sieve/tst-allof.c b/src/lib-sieve/tst-allof.c
index d23090ab19323bad016b858ebf167e650884cf2d..fb16b86ea6515c3577617e83b5e0b3e3e9d0833b 100644
--- a/src/lib-sieve/tst-allof.c
+++ b/src/lib-sieve/tst-allof.c
@@ -1,6 +1,8 @@
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
 #include "sieve-validator.h"
+#include "sieve-generator.h"
+#include "sieve-binary.h"
 #include "sieve-code.h"
 #include "sieve-binary.h"
 
diff --git a/src/lib-sieve/tst-anyof.c b/src/lib-sieve/tst-anyof.c
index 55fca774b4bd8947297cc4c26fc4a3ebdb0d551c..687a7a2bdf33dec4a5dde4ed6f64d1ca9a1da0c2 100644
--- a/src/lib-sieve/tst-anyof.c
+++ b/src/lib-sieve/tst-anyof.c
@@ -1,6 +1,8 @@
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-generator.h"
 #include "sieve-validator.h"
+#include "sieve-binary.h"
 #include "sieve-code.h"
 #include "sieve-binary.h"
 
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index f06d7359ede9aea01da9480ba385c47c6dee59cf..2a8058481545a24d55eb394ed44572ba263261c1 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -2,6 +2,7 @@
 
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-validator.h"
 #include "sieve-generator.h"
 #include "sieve-interpreter.h"
@@ -57,7 +58,7 @@ static bool tst_exists_validate
 		(validator, tst, arg, "header names", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	tst->data = arg;
 	
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 8e9d6d4ec5749517133afd7ec328ad862f61a4f8..087f4cb7ae551141e7539091ad9d31756ac0118d 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -2,6 +2,7 @@
 
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
+#include "sieve-code.h"
 #include "sieve-comparators.h"
 #include "sieve-match-types.h"
 #include "sieve-validator.h"
@@ -82,7 +83,7 @@ static bool tst_header_validate
 		(validator, tst, arg, "header names", 1, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	arg = sieve_ast_argument_next(arg);
 
@@ -90,7 +91,7 @@ static bool tst_header_validate
 		(validator, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 
 	/* Validate the key argument to a specified match type */
   sieve_match_type_validate(validator, tst, arg);
diff --git a/src/lib-sieve/tst-not.c b/src/lib-sieve/tst-not.c
index 95bf74cc6b0fd82d8482dc607793b4944fcfb318..5594afe5dd53785a0f8d4414b1c6bf468edf9a17 100644
--- a/src/lib-sieve/tst-not.c
+++ b/src/lib-sieve/tst-not.c
@@ -1,6 +1,7 @@
 #include "sieve-commands.h"
 #include "sieve-commands-private.h"
 #include "sieve-validator.h"
+#include "sieve-generator.h"
 
 /* Not test 
  *
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index 8d19e804beb4488f42b55c9172e5daa8053703d4..5643f3ff7b0b1fbd6e2124e7e258e434eee05ccc 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -155,7 +155,7 @@ static bool tst_size_validate
 		(validator, tst, arg, "limit", 1, SAAT_NUMBER) ) {
 		return FALSE;
 	}
-	sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg, FALSE);
 	
 	return TRUE;
 }