diff --git a/src/lib-sieve/cmd-discard.c b/src/lib-sieve/cmd-discard.c
index 2e93b11f7c126e818821fe6ae5ab887269956c44..b193ee552bf9e49df18a8dbcf5bc0fe9273fdeb8 100644
--- a/src/lib-sieve/cmd-discard.c
+++ b/src/lib-sieve/cmd-discard.c
@@ -26,12 +26,13 @@ static bool cmd_discard_generate
 		struct sieve_command *ctx ATTR_UNUSED);
 
 const struct sieve_command_def cmd_discard = {
-	"discard",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	cmd_discard_generate,
-	NULL
+	.identifier = "discard",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = cmd_discard_generate
 };
 
 /*
diff --git a/src/lib-sieve/cmd-if.c b/src/lib-sieve/cmd-if.c
index a4b55e2c488f7f373f842b690886cfe2ced0e3d5..d8cabad18beb6af037dcfbf7527b1d86bed9acaa 100644
--- a/src/lib-sieve/cmd-if.c
+++ b/src/lib-sieve/cmd-if.c
@@ -31,14 +31,15 @@ static bool cmd_else_generate
  */
 
 const struct sieve_command_def cmd_if = {
-	"if",
-	SCT_COMMAND,
-	0, 1, TRUE, TRUE,
-	NULL, NULL,
-	cmd_if_validate,
-	cmd_if_validate_const,
-	cmd_if_generate,
-	NULL
+	.identifier = "if",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 1,
+	.block_allowed = TRUE,
+	.block_required = TRUE,
+	.validate = cmd_if_validate,
+	.validate_const = cmd_if_validate_const,
+	.generate = cmd_if_generate
 };
 
 /* ElsIf command
@@ -48,14 +49,15 @@ const struct sieve_command_def cmd_if = {
  */
 
 const struct sieve_command_def cmd_elsif = {
-    "elsif",
-	SCT_COMMAND,
-	0, 1, TRUE, TRUE,
-	NULL, NULL,
-	cmd_elsif_validate,
-	cmd_if_validate_const,
-	cmd_if_generate,
-	NULL
+	.identifier = "elsif",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 1,
+	.block_allowed = TRUE,
+	.block_required = TRUE,
+	.validate = cmd_elsif_validate,
+	.validate_const = cmd_if_validate_const,
+	.generate = cmd_if_generate
 };
 
 /* Else command
@@ -64,16 +66,16 @@ const struct sieve_command_def cmd_elsif = {
  *   else <block>
  */
 
-
 const struct sieve_command_def cmd_else = {
-    "else",
-	SCT_COMMAND,
-	0, 0, TRUE, TRUE,
-	NULL, NULL,
-	cmd_elsif_validate,
-	cmd_if_validate_const,
-	cmd_else_generate,
-	NULL
+	.identifier = "else",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = TRUE,
+	.block_required = TRUE,
+	.validate = cmd_elsif_validate,
+	.validate_const = cmd_if_validate_const,
+	.generate = cmd_else_generate
 };
 
 /*
diff --git a/src/lib-sieve/cmd-keep.c b/src/lib-sieve/cmd-keep.c
index 01506380e0c2cb7ae53bbd05c0e0ff47d71e0891..03a9248d29d3217ae6bc468b3e44b73c8cad887e 100644
--- a/src/lib-sieve/cmd-keep.c
+++ b/src/lib-sieve/cmd-keep.c
@@ -25,12 +25,13 @@ static bool cmd_keep_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_keep = {
-	"keep",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	cmd_keep_generate,
-	NULL
+	.identifier = "keep",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = cmd_keep_generate
 };
 
 /*
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 6d2b02f699263505636e3e5a5a5e10d1aecf2f69..7b9a12e0d66092e9b98201eda5c0bba07902a138 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -48,14 +48,14 @@ static bool cmd_redirect_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_redirect = {
-	"redirect",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_redirect_validate,
-	NULL,
-	cmd_redirect_generate,
-	NULL
+	.identifier = "redirect",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_redirect_validate,
+	.generate = cmd_redirect_generate
 };
 
 /*
diff --git a/src/lib-sieve/cmd-require.c b/src/lib-sieve/cmd-require.c
index 251f5203a67a161a1069e19d00aa05f5c883085c..4d5b90a76b4a11e888b4f142148fcd4db6e081fc 100644
--- a/src/lib-sieve/cmd-require.c
+++ b/src/lib-sieve/cmd-require.c
@@ -20,12 +20,13 @@ static bool cmd_require_validate
 	(struct sieve_validator *valdtr, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_require = {
-	"require",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_require_validate,
-	NULL, NULL, NULL
+	.identifier = "require",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_require_validate
 };
 
 /*
diff --git a/src/lib-sieve/cmd-stop.c b/src/lib-sieve/cmd-stop.c
index e3091d44ed9e941ba26fd913bc0d64314979da34..feb049b56e40738e682a6f228984098e91ab9594 100644
--- a/src/lib-sieve/cmd-stop.c
+++ b/src/lib-sieve/cmd-stop.c
@@ -21,14 +21,14 @@ static bool cmd_stop_validate
 	(struct sieve_validator *valdtr, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_stop = {
-	"stop",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_stop_validate,
-	NULL,
-	cmd_stop_generate,
-	NULL
+	.identifier = "stop",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_stop_validate,
+	.generate = cmd_stop_generate
 };
 
 /*
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index dd615cd5f13b5a094d7c99b4e7f77a6e437dd245..e1912d00f17479004fd1026b44e5dc23229c08cb 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -79,15 +79,15 @@ static bool tst_envelope_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 static const struct sieve_command_def envelope_test = {
-	"envelope",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_envelope_registered,
-	NULL,
-	tst_envelope_validate,
-	NULL,
-	tst_envelope_generate,
-	NULL
+	.identifier = "envelope",
+	.type = SCT_TEST,
+	.positional_args= 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_envelope_registered,
+	.validate = tst_envelope_validate,
+	.generate = tst_envelope_generate
 };
 
 /*
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 4f12b9eacd80837cce47efa0cdb4fbe78593e3ff..69b5e4f4ccd0b8209714eef9822a4622ed956a00 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -71,14 +71,14 @@ static bool cmd_fileinto_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 static const struct sieve_command_def fileinto_command = {
-	"fileinto",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_fileinto_validate,
-	NULL,
-	cmd_fileinto_generate,
-	NULL
+	.identifier = "fileinto",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_fileinto_validate,
+	.generate = cmd_fileinto_generate
 };
 
 /*
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 926263742d2c0588df31d165e52be29408b795c3..ac78ac8c3149d494e5c113c819db050de4051678 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -108,14 +108,14 @@ static bool cmd_reject_generate
  */
 
 static const struct sieve_command_def reject_command = {
-	"reject",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_reject_validate,
-	NULL,
-	cmd_reject_generate,
-	NULL
+	.identifier = "reject",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_reject_validate,
+	.generate = cmd_reject_generate
 };
 
 /* EReject command
@@ -125,14 +125,14 @@ static const struct sieve_command_def reject_command = {
  */
 
 static const struct sieve_command_def ereject_command = {
-	"ereject",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_reject_validate,
-	NULL,
-	cmd_reject_generate,
-	NULL
+	.identifier = "ereject",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_reject_validate,
+	.generate = cmd_reject_generate,
 };
 
 /*
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index 677acad675db4d0fe351ebf9a392a024965f02ab..1bbb42005ef9b49a0ac736149fbbcb649d2659a1 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -35,15 +35,15 @@ static bool tst_body_generate
 	(const struct sieve_codegen_env *cgenv,	struct sieve_command *ctx);
 
 const struct sieve_command_def body_test = {
-	"body",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	tst_body_registered,
-	NULL,
-	tst_body_validate,
-	NULL,
-	tst_body_generate,
-	NULL
+	.identifier = "body",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_body_registered,
+	.validate = tst_body_validate,
+	.generate = tst_body_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/date/tst-date.c b/src/lib-sieve/plugins/date/tst-date.c
index a1e2941a8151acad2bf9afd7557e680e484beee1..a3ce8521d479fe339b2b9f737d6940fc9b69bc87 100644
--- a/src/lib-sieve/plugins/date/tst-date.c
+++ b/src/lib-sieve/plugins/date/tst-date.c
@@ -43,15 +43,15 @@ static bool tst_date_registered
 		struct sieve_command_registration *cmd_reg);
 
 const struct sieve_command_def date_test = {
-	"date",
-	SCT_TEST,
-	3, 0, FALSE, FALSE,
-	tst_date_registered,
-	NULL,
-	tst_date_validate,
-	NULL,
-	tst_date_generate,
-	NULL
+	.identifier = "date",
+	.type = SCT_TEST,
+	.positional_args = 3,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_date_registered,
+	.validate = tst_date_validate,
+	.generate = tst_date_generate
 };
 
 /* Currentdate test
@@ -67,15 +67,15 @@ static bool tst_currentdate_registered
 		struct sieve_command_registration *cmd_reg);
 
 const struct sieve_command_def currentdate_test = {
-	"currentdate",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_currentdate_registered,
-	NULL,
-	tst_date_validate,
-	NULL,
-	tst_date_generate,
-	NULL
+	.identifier = "currentdate",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_currentdate_registered,
+	.validate = tst_date_validate,
+	.generate = tst_date_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/duplicate/tst-duplicate.c b/src/lib-sieve/plugins/duplicate/tst-duplicate.c
index 84d0527d36a7726de1f1ef7862473082061486d9..ae85862fd3778b914e7d94a45acccc4bace244c3 100644
--- a/src/lib-sieve/plugins/duplicate/tst-duplicate.c
+++ b/src/lib-sieve/plugins/duplicate/tst-duplicate.c
@@ -31,13 +31,14 @@ static bool tst_duplicate_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def tst_duplicate = {
-	"duplicate",
-	SCT_TEST,
-	0, 0, FALSE, FALSE,
-	tst_duplicate_registered,
-	NULL, NULL, NULL,
-	tst_duplicate_generate,
-	NULL,
+	.identifier = "duplicate",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_duplicate_registered,
+	.generate = tst_duplicate_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/editheader/cmd-addheader.c b/src/lib-sieve/plugins/editheader/cmd-addheader.c
index f4c78f8fc46f96929329c03904d935a92e3af401..26fdda625acf061bea487276df331323e5af9979 100644
--- a/src/lib-sieve/plugins/editheader/cmd-addheader.c
+++ b/src/lib-sieve/plugins/editheader/cmd-addheader.c
@@ -37,15 +37,15 @@ static bool cmd_addheader_generate
 	(const struct sieve_codegen_env *cgenv,	struct sieve_command *ctx);
 
 const struct sieve_command_def addheader_command = {
-	"addheader",
-	SCT_COMMAND,
-	2, 0, FALSE, FALSE,
-	cmd_addheader_registered,
-	NULL,
-	cmd_addheader_validate,
-	NULL,
-	cmd_addheader_generate,
-	NULL
+	.identifier = "addheader",
+	.type = SCT_COMMAND,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_addheader_registered,
+	.validate = cmd_addheader_validate,
+	.generate = cmd_addheader_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/editheader/cmd-deleteheader.c b/src/lib-sieve/plugins/editheader/cmd-deleteheader.c
index c38e6f22b00a307037e51bfe317dd4bf8f55f6b2..3700c4acd8a750cff8a6deb58d893692a8eb6c0e 100644
--- a/src/lib-sieve/plugins/editheader/cmd-deleteheader.c
+++ b/src/lib-sieve/plugins/editheader/cmd-deleteheader.c
@@ -41,16 +41,15 @@ static bool cmd_deleteheader_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def deleteheader_command = {
-	"deleteheader",
-	SCT_COMMAND,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	cmd_deleteheader_registered,
-	NULL,
-	cmd_deleteheader_validate,
-	NULL,
-	cmd_deleteheader_generate,
-	NULL
+	.identifier = "deleteheader",
+	.type = SCT_COMMAND,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_deleteheader_registered,
+	.validate = cmd_deleteheader_validate,
+	.generate = cmd_deleteheader_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/enotify/cmd-notify.c b/src/lib-sieve/plugins/enotify/cmd-notify.c
index 423d71dc0b8f22c8e54090892f576b2aba768195..9018a9329d57dde7255a701d6bbfec3794c5a76f 100644
--- a/src/lib-sieve/plugins/enotify/cmd-notify.c
+++ b/src/lib-sieve/plugins/enotify/cmd-notify.c
@@ -49,15 +49,16 @@ static bool cmd_notify_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def notify_command = {
-	"notify",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	cmd_notify_registered,
-	cmd_notify_pre_validate,
-	cmd_notify_validate,
-	NULL,
-	cmd_notify_generate,
-	NULL
+	.identifier = "notify",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_notify_registered,
+	.pre_validate = cmd_notify_pre_validate,
+	.validate = cmd_notify_validate,
+	.generate = cmd_notify_generate,
 };
 
 /*
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 0b2695673a20152aa4c57cb583f2e1a8a8bfb10e..9229b6763ffea5ea41d7088de09c44a4bebd28f4 100644
--- a/src/lib-sieve/plugins/enotify/tst-notify-method-capability.c
+++ b/src/lib-sieve/plugins/enotify/tst-notify-method-capability.c
@@ -34,15 +34,15 @@ static bool tst_notifymc_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def notify_method_capability_test = {
-	"notify_method_capability",
-	SCT_TEST,
-	3, 0, FALSE, FALSE,
-	tst_notifymc_registered,
-	NULL,
-	tst_notifymc_validate,
-	NULL,
-	tst_notifymc_generate,
-	NULL
+	.identifier = "notify_method_capability",
+	.type = SCT_TEST,
+	.positional_args = 3,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_notifymc_registered,
+	.validate = tst_notifymc_validate,
+	.generate = tst_notifymc_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/enotify/tst-valid-notify-method.c b/src/lib-sieve/plugins/enotify/tst-valid-notify-method.c
index 780af9bedad573e6ea82addb5b1978efe7b4f6a6..d526f61ed0fc12bc6fc036e9921e738699048354 100644
--- a/src/lib-sieve/plugins/enotify/tst-valid-notify-method.c
+++ b/src/lib-sieve/plugins/enotify/tst-valid-notify-method.c
@@ -28,14 +28,14 @@ static bool tst_vnotifym_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def valid_notify_method_test = {
-	"valid_notify_method",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_vnotifym_validate,
-	NULL,
-	tst_vnotifym_generate,
-	NULL
+	.identifier = "valid_notify_method",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_vnotifym_validate,
+	.generate = tst_vnotifym_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/environment/tst-environment.c b/src/lib-sieve/plugins/environment/tst-environment.c
index d9463455d6347527ddb69ce83fe1a105d3916479..a3dd0b58ed1f473fe701fd4a07b73e767f921b67 100644
--- a/src/lib-sieve/plugins/environment/tst-environment.c
+++ b/src/lib-sieve/plugins/environment/tst-environment.c
@@ -32,15 +32,15 @@ static bool tst_environment_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def tst_environment = {
-	"environment",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_environment_registered,
-	NULL,
-	tst_environment_validate,
-	NULL,
-	tst_environment_generate,
-	NULL
+	.identifier = "environment",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_environment_registered,
+	.validate = tst_environment_validate,
+	.generate = tst_environment_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/ihave/cmd-error.c b/src/lib-sieve/plugins/ihave/cmd-error.c
index 4120bf1f047f1e5619b2db5260b208e6f0f4a1c2..5a5d7f28d40784455da582e925140219f85bfa5b 100644
--- a/src/lib-sieve/plugins/ihave/cmd-error.c
+++ b/src/lib-sieve/plugins/ihave/cmd-error.c
@@ -29,14 +29,14 @@ static bool cmd_error_generate
 	(const struct sieve_codegen_env *cgenv,	struct sieve_command *ctx);
 
 const struct sieve_command_def error_command = {
-	"error",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_error_validate,
-	NULL,
-	cmd_error_generate,
-	NULL
+	.identifier = "error",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_error_validate,
+	.generate = cmd_error_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/ihave/tst-ihave.c b/src/lib-sieve/plugins/ihave/tst-ihave.c
index 17d03a565f1d6c51eb28a4b123fc37d8395c7119..a8b2ce7cc79fcfba5bbd452de79424223f900b47 100644
--- a/src/lib-sieve/plugins/ihave/tst-ihave.c
+++ b/src/lib-sieve/plugins/ihave/tst-ihave.c
@@ -26,13 +26,14 @@ static bool tst_ihave_validate_const
 		int *const_current, int const_next);
 
 const struct sieve_command_def ihave_test = {
-	"ihave",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_ihave_validate,
-	tst_ihave_validate_const,
-	NULL, NULL
+	.identifier = "ihave",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_ihave_validate,
+	.validate_const = tst_ihave_validate_const
 };
 
 /*
diff --git a/src/lib-sieve/plugins/imap4flags/cmd-flag.c b/src/lib-sieve/plugins/imap4flags/cmd-flag.c
index 5152035e358c2665d9724f58a44dd7997eb50484..2bef5268885f903d59c72a3271cee679675c51f6 100644
--- a/src/lib-sieve/plugins/imap4flags/cmd-flag.c
+++ b/src/lib-sieve/plugins/imap4flags/cmd-flag.c
@@ -29,15 +29,14 @@ static bool cmd_flag_generate
  */
 
 const struct sieve_command_def cmd_setflag = {
-	"setflag",
-	SCT_COMMAND,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	NULL, NULL,
-	ext_imap4flags_command_validate,
-	NULL,
-	cmd_flag_generate,
-	NULL
+	.identifier = "setflag",
+	.type = SCT_COMMAND,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = ext_imap4flags_command_validate,
+	.generate = cmd_flag_generate
 };
 
 /* Addflag command
@@ -47,15 +46,14 @@ const struct sieve_command_def cmd_setflag = {
  */
 
 const struct sieve_command_def cmd_addflag = {
-	"addflag",
-	SCT_COMMAND,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	NULL, NULL,
-	ext_imap4flags_command_validate,
-	NULL,
-	cmd_flag_generate,
-	NULL
+	.identifier = "addflag",
+	.type = SCT_COMMAND,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = ext_imap4flags_command_validate,
+	.generate = cmd_flag_generate
 };
 
 
@@ -66,15 +64,14 @@ const struct sieve_command_def cmd_addflag = {
  */
 
 const struct sieve_command_def cmd_removeflag = {
-	"removeflag",
-	SCT_COMMAND,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	NULL, NULL,
-	ext_imap4flags_command_validate,
-	NULL,
-	cmd_flag_generate,
-	NULL
+	.identifier = "removeflag",
+	.type = SCT_COMMAND,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = ext_imap4flags_command_validate,
+	.generate = cmd_flag_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/imap4flags/ext-imapflags.c b/src/lib-sieve/plugins/imap4flags/ext-imapflags.c
index 82ac5c7f6f09c83414e6915333447108f5d28d4a..916ad36a1fffdad4020a258d6a689afcbee488ce 100644
--- a/src/lib-sieve/plugins/imap4flags/ext-imapflags.c
+++ b/src/lib-sieve/plugins/imap4flags/ext-imapflags.c
@@ -42,12 +42,13 @@ static bool cmd_mark_validate
  */
 
 static const struct sieve_command_def cmd_mark = {
-    "mark",
-    SCT_COMMAND,
-    0, 0, FALSE, FALSE,
-    NULL, NULL,
-    cmd_mark_validate,
-    NULL, NULL, NULL
+	.identifier = "mark",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_mark_validate
 };
 
 /* Unmark command
@@ -56,12 +57,13 @@ static const struct sieve_command_def cmd_mark = {
  *   unmark
  */
 static const struct sieve_command_def cmd_unmark = {
-    "unmark",
-    SCT_COMMAND,
-    0, 0, FALSE, FALSE,
-    NULL, NULL,
-    cmd_mark_validate,
-    NULL, NULL, NULL
+	.identifier = "unmark",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_mark_validate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
index 7b63eed1365d1352a386d6b4ff9e96124530179c..9867394a23f54442464fb3966fb6af41585b2cc0 100644
--- a/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imap4flags/tst-hasflag.c
@@ -33,16 +33,15 @@ static bool tst_hasflag_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def tst_hasflag = {
-	"hasflag",
-	SCT_TEST,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	tst_hasflag_registered,
-	NULL,
-	tst_hasflag_validate,
-	NULL,
-	tst_hasflag_generate,
-	NULL
+	.identifier = "hasflag",
+	.type = SCT_TEST,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_hasflag_registered,
+	.validate = tst_hasflag_validate,
+	.generate = tst_hasflag_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/include/cmd-global.c b/src/lib-sieve/plugins/include/cmd-global.c
index 4d86a64902b64c6c8af66aa0d56b0b2733a3b12c..3c28492ac17d4dad64815afa69bacef63e076c4d 100644
--- a/src/lib-sieve/plugins/include/cmd-global.c
+++ b/src/lib-sieve/plugins/include/cmd-global.c
@@ -28,14 +28,14 @@ static bool cmd_global_generate
 (const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_global = {
-  "global",
-  SCT_COMMAND,
-  1, 0, FALSE, FALSE,
-  NULL, NULL,
-  cmd_global_validate,
-	NULL,
-  cmd_global_generate,
-  NULL
+  .identifier = "global",
+  .type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+  .validate = cmd_global_validate,
+  .generate = cmd_global_generate,
 };
 
 /* DEPRICATED:
@@ -47,14 +47,14 @@ const struct sieve_command_def cmd_global = {
  *   import
  */
 const struct sieve_command_def cmd_import = {
-	"import",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_global_validate,
-	NULL,
-	cmd_global_generate,
-	NULL
+	.identifier = "import",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_global_validate,
+	.generate = cmd_global_generate,
 };
 
 /* Export command
@@ -63,14 +63,14 @@ const struct sieve_command_def cmd_import = {
  *   export
  */
 const struct sieve_command_def cmd_export = {
-	"export",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_global_validate,
-	NULL,
-	cmd_global_generate,
-	NULL
+	.identifier = "export",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_global_validate,
+	.generate = cmd_global_generate,
 };
 
 /*
diff --git a/src/lib-sieve/plugins/include/cmd-include.c b/src/lib-sieve/plugins/include/cmd-include.c
index ac666830ebe0c56e4cbcb86ef1976a4f2d5a4571..cbb0039db0f59ee16f89317ed8b4f070e9b2a2e7 100644
--- a/src/lib-sieve/plugins/include/cmd-include.c
+++ b/src/lib-sieve/plugins/include/cmd-include.c
@@ -41,15 +41,16 @@ static bool cmd_include_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_include = {
-	"include",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	cmd_include_registered,
-	cmd_include_pre_validate,
-	cmd_include_validate,
-	NULL,
-	cmd_include_generate,
-	NULL
+	.identifier = "include",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_include_registered,
+	.pre_validate = cmd_include_pre_validate,
+	.validate = cmd_include_validate,
+	.generate = cmd_include_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/include/cmd-return.c b/src/lib-sieve/plugins/include/cmd-return.c
index 130e4dfba28d9049cf43b155194984ed12394450..5e64f3616a525a20c7bf2e2779a99bc5f5fb160e 100644
--- a/src/lib-sieve/plugins/include/cmd-return.c
+++ b/src/lib-sieve/plugins/include/cmd-return.c
@@ -22,12 +22,13 @@ static bool cmd_return_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_return = {
-	"return",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	cmd_return_generate,
-	NULL
+	.identifier = "return",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = cmd_return_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/mailbox/tst-mailboxexists.c b/src/lib-sieve/plugins/mailbox/tst-mailboxexists.c
index 48b9b64855549e18750a402996a909ea4497d3a6..d7763ce53873c8b86b7983112f909d3699cf7db7 100644
--- a/src/lib-sieve/plugins/mailbox/tst-mailboxexists.c
+++ b/src/lib-sieve/plugins/mailbox/tst-mailboxexists.c
@@ -32,14 +32,14 @@ static bool tst_mailboxexists_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def mailboxexists_test = {
-	"mailboxexists",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_mailboxexists_validate,
-	NULL,
-	tst_mailboxexists_generate,
-	NULL
+	.identifier = "mailboxexists",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_mailboxexists_validate,
+	.generate = tst_mailboxexists_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/metadata/tst-metadata.c b/src/lib-sieve/plugins/metadata/tst-metadata.c
index 145b00710b24fc935bf6b5f244e3adb3e578132f..2d9e813f03d5db609cfc5faa6388d32a1cce2752 100644
--- a/src/lib-sieve/plugins/metadata/tst-metadata.c
+++ b/src/lib-sieve/plugins/metadata/tst-metadata.c
@@ -48,15 +48,15 @@ static bool tst_metadata_generate
  */
 
 const struct sieve_command_def metadata_test = {
-	"metadata",
-	SCT_TEST,
-	3, 0, FALSE, FALSE,
-	tst_metadata_registered,
-	NULL,
-	tst_metadata_validate,
-	NULL,
-	tst_metadata_generate,
-	NULL
+	.identifier = "metadata",
+	.type = SCT_TEST,
+	.positional_args = 3,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_metadata_registered,
+	.validate = tst_metadata_validate,
+	.generate = tst_metadata_generate,
 };
 
 /* Servermetadata test
@@ -67,15 +67,15 @@ const struct sieve_command_def metadata_test = {
  */
 
 const struct sieve_command_def servermetadata_test = {
-	"servermetadata",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_metadata_registered,
-	NULL,
-	tst_metadata_validate,
-	NULL,
-	tst_metadata_generate,
-	NULL
+	.identifier = "servermetadata",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_metadata_registered,
+	.validate = tst_metadata_validate,
+	.generate = tst_metadata_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/metadata/tst-metadataexists.c b/src/lib-sieve/plugins/metadata/tst-metadataexists.c
index 16fbfb8bdbb7e14bf58387cde4577ebc3a2e5119..0469fdbb20cf37c8abb0ed5f71546c777221643b 100644
--- a/src/lib-sieve/plugins/metadata/tst-metadataexists.c
+++ b/src/lib-sieve/plugins/metadata/tst-metadataexists.c
@@ -44,14 +44,14 @@ static bool tst_metadataexists_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def metadataexists_test = {
-	"metadataexists",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_metadataexists_validate,
-	NULL,
-	tst_metadataexists_generate,
-	NULL
+	.identifier = "metadataexists",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_metadataexists_validate,
+	.generate = tst_metadataexists_generate,
 };
 
 /* Servermetadataexists command
@@ -61,17 +61,16 @@ const struct sieve_command_def metadataexists_test = {
  */
 
 const struct sieve_command_def servermetadataexists_test = {
-	"servermetadataexists",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_metadataexists_validate,
-	NULL,
-	tst_metadataexists_generate,
-	NULL
+	.identifier = "servermetadataexists",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_metadataexists_validate,
+	.generate = tst_metadataexists_generate,
 };
 
-
 /*
  * Opcode definitions
  */
diff --git a/src/lib-sieve/plugins/mime/cmd-break.c b/src/lib-sieve/plugins/mime/cmd-break.c
index b087c523cc06dae54241a3ce5565973044156d9a..762ecd6a43633545fdf994c975f46cf63acb26a8 100644
--- a/src/lib-sieve/plugins/mime/cmd-break.c
+++ b/src/lib-sieve/plugins/mime/cmd-break.c
@@ -34,15 +34,16 @@ static bool cmd_break_generate
 		struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_break = {
-	"break",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	cmd_break_registered,
-	cmd_break_pre_validate,
-	cmd_break_validate,
-	NULL,
-	cmd_break_generate,
-	NULL,
+	.identifier = "break",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_break_registered,
+	.pre_validate = cmd_break_pre_validate,
+	.validate = cmd_break_validate,
+	.generate = cmd_break_generate,
 };
 
 /*
diff --git a/src/lib-sieve/plugins/mime/cmd-foreverypart.c b/src/lib-sieve/plugins/mime/cmd-foreverypart.c
index 9fcff9f31630c6da4905dbf789c6d061cd82093f..52f522ae72019780319688e0c9dd39d204193751 100644
--- a/src/lib-sieve/plugins/mime/cmd-foreverypart.c
+++ b/src/lib-sieve/plugins/mime/cmd-foreverypart.c
@@ -36,15 +36,16 @@ static bool cmd_foreverypart_generate
 		struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_foreverypart = {
-	"foreverypart",
-	SCT_COMMAND,
-	0, 0, TRUE, TRUE,
-	cmd_foreverypart_registered,
-	cmd_foreverypart_pre_validate,
-	cmd_foreverypart_validate,
-	NULL,
-	cmd_foreverypart_generate,
-	NULL,
+	.identifier = "foreverypart",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = TRUE,
+	.block_required = TRUE,
+	.registered = cmd_foreverypart_registered,
+	.pre_validate = cmd_foreverypart_pre_validate,
+	.validate = cmd_foreverypart_validate,
+	.generate = cmd_foreverypart_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/notify/cmd-denotify.c b/src/lib-sieve/plugins/notify/cmd-denotify.c
index 7fec014ed47e3dcc1883c054ec4320a93bd3dcc5..a1acbb6bb4398756f9f622e08fb6f1a22ac48bfc 100644
--- a/src/lib-sieve/plugins/notify/cmd-denotify.c
+++ b/src/lib-sieve/plugins/notify/cmd-denotify.c
@@ -39,15 +39,16 @@ static bool cmd_denotify_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_denotify = {
-	"denotify",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	cmd_denotify_registered,
-	cmd_denotify_pre_validate,
-	cmd_denotify_validate,
-	NULL,
-	cmd_denotify_generate,
-	NULL
+	.identifier = "denotify",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_denotify_registered,
+	.pre_validate = cmd_denotify_pre_validate,
+	.validate = cmd_denotify_validate,
+	.generate = cmd_denotify_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/notify/cmd-notify.c b/src/lib-sieve/plugins/notify/cmd-notify.c
index 6c27185a77a77b75174cccdaba26f5f66b65eda9..fdcbac4ab64470d789f9fab554e418d8603c083f 100644
--- a/src/lib-sieve/plugins/notify/cmd-notify.c
+++ b/src/lib-sieve/plugins/notify/cmd-notify.c
@@ -52,15 +52,16 @@ static bool cmd_notify_generate
 		struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_notify_old = {
-	"notify",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	cmd_notify_registered,
-	cmd_notify_pre_validate,
-	cmd_notify_validate,
-	NULL,
-	cmd_notify_generate,
-	NULL,
+	.identifier = "notify",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_notify_registered,
+	.pre_validate = cmd_notify_pre_validate,
+	.validate = cmd_notify_validate,
+	.generate = cmd_notify_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c b/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c
index 74d921164a63436dc64a90e38866dad40bbd7689..5f923e0a4881cc5b2ce34c82812e5fb75efa76d1 100644
--- a/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c
+++ b/src/lib-sieve/plugins/spamvirustest/tst-spamvirustest.c
@@ -38,15 +38,15 @@ static bool tst_spamvirustest_registered
  */
 
 const struct sieve_command_def spamtest_test = {
-	"spamtest",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	tst_spamvirustest_registered,
-	NULL,
-	tst_spamvirustest_validate,
-	NULL,
-	tst_spamvirustest_generate,
-	NULL
+	.identifier = "spamtest",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_spamvirustest_registered,
+	.validate = tst_spamvirustest_validate,
+	.generate = tst_spamvirustest_generate
 };
 
 /* Virustest test
@@ -56,15 +56,15 @@ const struct sieve_command_def spamtest_test = {
  */
 
 const struct sieve_command_def virustest_test = {
-	"virustest",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	tst_spamvirustest_registered,
-	NULL,
-	tst_spamvirustest_validate,
-	NULL,
-	tst_spamvirustest_generate,
-	NULL
+	.identifier = "virustest",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_spamvirustest_registered,
+	.validate = tst_spamvirustest_validate,
+	.generate = tst_spamvirustest_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c
index a72e30fff0356f5b49d0560554b19ad1520c87b3..92f70dc49b61aaee085035d47b1660c3754a34f3 100644
--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c
+++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c
@@ -65,15 +65,16 @@ static bool cmd_vacation_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def vacation_command = {
-	"vacation",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	cmd_vacation_registered,
-	cmd_vacation_pre_validate,
-	cmd_vacation_validate,
-	NULL,
-	cmd_vacation_generate,
-	NULL
+	.identifier = "vacation",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_vacation_registered,
+	.pre_validate = cmd_vacation_pre_validate,
+	.validate = cmd_vacation_validate,
+	.generate = cmd_vacation_generate,
 };
 
 /*
diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index 125aed961778ddd05eb9c31da7393acdd3b7ba40..72ada5af65c69d1915346176af94f358a00760bd 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -40,15 +40,16 @@ static bool cmd_set_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_set = {
-	"set",
-	SCT_COMMAND,
-	2, 0, FALSE, FALSE,
-	cmd_set_registered,
-	cmd_set_pre_validate,
-	cmd_set_validate,
-	NULL,
-	cmd_set_generate,
-	NULL
+	.identifier = "set",
+	.type = SCT_COMMAND,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_set_registered,
+	.pre_validate = cmd_set_pre_validate,
+	.validate = cmd_set_validate,
+	.generate = cmd_set_generate,
 };
 
 /*
diff --git a/src/lib-sieve/plugins/variables/tst-string.c b/src/lib-sieve/plugins/variables/tst-string.c
index bf38919ba2613af95e3e314beeb4c194fc8c1959..7aaf23c08b24770eda5be381f0bd8c2dc4e40436 100644
--- a/src/lib-sieve/plugins/variables/tst-string.c
+++ b/src/lib-sieve/plugins/variables/tst-string.c
@@ -32,15 +32,15 @@ static bool tst_string_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def tst_string = {
-	"string",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_string_registered,
-	NULL,
-	tst_string_validate,
-	NULL,
-	tst_string_generate,
-	NULL
+	.identifier = "string",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_string_registered,
+	.validate = tst_string_validate,
+	.generate = tst_string_generate
 };
 
 /*
diff --git a/src/lib-sieve/plugins/vnd.dovecot/debug/cmd-debug-log.c b/src/lib-sieve/plugins/vnd.dovecot/debug/cmd-debug-log.c
index 6b425926dc0bcc9732f62b254b924c0045c2349e..7ee38650d86f7b098802cab5a45f422eb5df6933 100644
--- a/src/lib-sieve/plugins/vnd.dovecot/debug/cmd-debug-log.c
+++ b/src/lib-sieve/plugins/vnd.dovecot/debug/cmd-debug-log.c
@@ -29,14 +29,14 @@ static bool cmd_debug_log_generate
 	(const struct sieve_codegen_env *cgenv,	struct sieve_command *ctx);
 
 const struct sieve_command_def debug_log_command = {
-	"debug_log",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_debug_log_validate,
-	NULL,
-	cmd_debug_log_generate,
-	NULL
+	.identifier = "debug_log",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_debug_log_validate,
+	.generate = cmd_debug_log_generate
 };
 
 /*
diff --git a/src/lib-sieve/sieve-commands.h b/src/lib-sieve/sieve-commands.h
index 4aeee8f420db180fce5213725a82ab84b7b0130c..50c8e0101b3e8075d0ff94d58d607c7ce483c780 100644
--- a/src/lib-sieve/sieve-commands.h
+++ b/src/lib-sieve/sieve-commands.h
@@ -114,7 +114,7 @@ struct sieve_command_def {
 	enum sieve_command_type type;
 
 	/* High-level command syntax */
-	int positional_arguments;
+	int positional_args;
 	int subtests;
 	bool block_allowed;
 	bool block_required;
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index c70cd0dcbb5d4957e11d380b1dfe94daf7cd091f..777a8ce34353d99dea73f9a89e5cd74e56f3bc5c 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -274,8 +274,13 @@ static bool _cmd_unknown_validate
 }
 
 static const struct sieve_command_def unknown_command = {
-	"", SCT_NONE, 0, 0, FALSE, FALSE ,
-	NULL, NULL, _cmd_unknown_validate, NULL, NULL, NULL
+	.identifier = "",
+	.type = SCT_NONE,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = _cmd_unknown_validate
 };
 
 /* Registration of the core commands of the language */
@@ -883,7 +888,7 @@ bool sieve_validate_tag_parameter
 static bool sieve_validate_command_arguments
 (struct sieve_validator *valdtr, struct sieve_command *cmd)
 {
-	int arg_count = cmd->def->positional_arguments;
+	int arg_count = cmd->def->positional_args;
 	int real_count = 0;
 	struct sieve_ast_argument *arg;
 	struct sieve_command_registration *cmd_reg = cmd->reg;
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index 10f3b3e216d7513b5845c801c40d2059d4966d84..93ac3116029975bc5a851b80f4729c8ac8f6a494 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -38,15 +38,15 @@ static bool tst_address_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def tst_address = {
-	"address",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_address_registered,
-	NULL,
-	tst_address_validate,
-	NULL,
-	tst_address_generate,
-	NULL
+	.identifier = "address",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_address_registered,
+	.validate = tst_address_validate,
+	.generate = tst_address_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-allof.c b/src/lib-sieve/tst-allof.c
index 43945ef3347a21c7298694ead3571b7460cbd991..ff7234c0ac8e471617b8580fdfe2472f3bcb3b3f 100644
--- a/src/lib-sieve/tst-allof.c
+++ b/src/lib-sieve/tst-allof.c
@@ -24,13 +24,14 @@ static bool tst_allof_validate_const
 		int *const_current, int const_new);
 
 const struct sieve_command_def tst_allof = {
-	"allof",
-	SCT_TEST,
-	0, 2, FALSE, FALSE,
-	NULL, NULL, NULL,
-	tst_allof_validate_const,
-	NULL,
-	tst_allof_generate
+	.identifier = "allof",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 2,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate_const = tst_allof_validate_const,
+	.control_generate = tst_allof_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-anyof.c b/src/lib-sieve/tst-anyof.c
index 3952fbf152ef31c7ed3ed29c7f185bee99683203..795958bc480e020e2b6bce99755c16f63c7d0eba 100644
--- a/src/lib-sieve/tst-anyof.c
+++ b/src/lib-sieve/tst-anyof.c
@@ -24,13 +24,14 @@ static bool tst_anyof_validate_const
 		int *const_current, int const_next);
 
 const struct sieve_command_def tst_anyof = {
-	"anyof",
-	SCT_TEST,
-	0, 2, FALSE, FALSE,
-	NULL, NULL, NULL,
-	tst_anyof_validate_const,
-	NULL,
-	tst_anyof_generate
+	.identifier = "anyof",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 2,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate_const = tst_anyof_validate_const,
+	.control_generate = tst_anyof_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index 37e03b6105fd600f557dc4941210879b77a48724..faa54dcab4175084fc4c3d04f5b24559acab9cef 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -27,15 +27,14 @@ static bool tst_exists_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *tst);
 
 const struct sieve_command_def tst_exists = {
-	"exists",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL,
-	NULL,
-	tst_exists_validate,
-	NULL,
-	tst_exists_generate,
-	NULL
+	.identifier = "exists",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_exists_validate,
+	.generate = tst_exists_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 2746a9b9982dbf443a7590b9b95a179f995061bf..3803ac821e706b203bf05940efef197833b29078 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -33,15 +33,15 @@ static bool tst_header_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *tst);
 
 const struct sieve_command_def tst_header = {
-	"header",
-	SCT_TEST,
-	2, 0, FALSE, FALSE,
-	tst_header_registered,
-	NULL,
-	tst_header_validate,
-	NULL,
-	tst_header_generate,
-	NULL
+	.identifier = "header",
+	.type = SCT_TEST,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_header_registered,
+	.validate = tst_header_validate,
+	.generate = tst_header_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-not.c b/src/lib-sieve/tst-not.c
index 63d296c6786002e7b7afa82e9a29582c7d0f2c97..ad1c879cf36636d9633b670158dde78e74e8627e 100644
--- a/src/lib-sieve/tst-not.c
+++ b/src/lib-sieve/tst-not.c
@@ -21,13 +21,14 @@ static bool tst_not_validate_const
 		int *const_current, int const_next);
 
 const struct sieve_command_def tst_not = {
-	"not",
-	SCT_TEST,
-	0, 1, FALSE, FALSE,
-	NULL, NULL, NULL,
-	tst_not_validate_const,
-	NULL,
-	tst_not_generate
+	.identifier = "not",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 1,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate_const = tst_not_validate_const,
+	.control_generate = tst_not_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index bacb1f2f6df021d34b8691f34ee0f812928dc5ce..5dea2b95cb57e931fb40c0120d047ca2f1f15cec 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -31,15 +31,16 @@ static bool tst_size_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def tst_size = {
-	"size",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	tst_size_registered,
-	tst_size_pre_validate,
-	tst_size_validate,
-	NULL,
-	tst_size_generate,
-	NULL
+	.identifier = "size",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_size_registered,
+	.pre_validate = tst_size_pre_validate,
+	.validate = tst_size_validate,
+	.generate = tst_size_generate
 };
 
 /*
diff --git a/src/lib-sieve/tst-truefalse.c b/src/lib-sieve/tst-truefalse.c
index 6ada9527a5b9d98f4e4661a6fb59fdcb3c5e276b..aa3c07f0ffee206ecb004a1e460905c6c84ed77a 100644
--- a/src/lib-sieve/tst-truefalse.c
+++ b/src/lib-sieve/tst-truefalse.c
@@ -22,13 +22,14 @@ static bool tst_false_generate
 		struct sieve_jumplist *jumps, bool jump_true);
 
 const struct sieve_command_def tst_false = {
-	"false",
-	SCT_TEST,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL,
-	tst_false_validate_const,
-	NULL,
-	tst_false_generate
+	.identifier = "false",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate_const = tst_false_validate_const,
+	.control_generate = tst_false_generate
 };
 
 static bool tst_true_validate_const
@@ -39,13 +40,14 @@ static bool tst_true_generate
 		struct sieve_jumplist *jumps, bool jump_true);
 
 const struct sieve_command_def tst_true = {
-	"true",
-	SCT_TEST,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL,
-	tst_true_validate_const,
-	NULL,
-	tst_true_generate
+	.identifier = "true",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate_const = tst_true_validate_const,
+	.control_generate = tst_true_generate
 };
 
 /*
diff --git a/src/plugins/sieve-extprograms/cmd-execute.c b/src/plugins/sieve-extprograms/cmd-execute.c
index 0b03c2901046edbca3f2b496e5f311cc622d291f..0691bed240c3a39634992f9acc1c5bbc31baebd0 100644
--- a/src/plugins/sieve-extprograms/cmd-execute.c
+++ b/src/plugins/sieve-extprograms/cmd-execute.c
@@ -44,16 +44,15 @@ static bool cmd_execute_generate
 		struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_execute = {
-	"execute",
-	SCT_HYBRID,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	cmd_execute_registered,
-	NULL,
-	sieve_extprogram_command_validate,
-	NULL,
-	cmd_execute_generate,
-	NULL,
+	.identifier = "execute",
+	.type = SCT_HYBRID,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_execute_registered,
+	.validate = sieve_extprogram_command_validate,
+	.generate = cmd_execute_generate,
 };
 
 /*
diff --git a/src/plugins/sieve-extprograms/cmd-filter.c b/src/plugins/sieve-extprograms/cmd-filter.c
index 841d433a9335c6dcfd09d42cbd3b56748010a422..54e991f1c858cf88d39b399d474d4f9b8bcf14e8 100644
--- a/src/plugins/sieve-extprograms/cmd-filter.c
+++ b/src/plugins/sieve-extprograms/cmd-filter.c
@@ -41,15 +41,14 @@ static bool cmd_filter_generate
 		struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_filter = {
-	"filter",
-	SCT_HYBRID,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	NULL, NULL,
-	sieve_extprogram_command_validate,
-	NULL,
-	cmd_filter_generate,
-	NULL,
+	.identifier = "filter",
+	.type = SCT_HYBRID,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = sieve_extprogram_command_validate,
+	.generate = cmd_filter_generate
 };
 
 /* 
diff --git a/src/plugins/sieve-extprograms/cmd-pipe.c b/src/plugins/sieve-extprograms/cmd-pipe.c
index ce82480bc87b31899f81da9e9eb60251d233726b..14857e10269c930ee82393330642b7ddb54a598c 100644
--- a/src/plugins/sieve-extprograms/cmd-pipe.c
+++ b/src/plugins/sieve-extprograms/cmd-pipe.c
@@ -36,16 +36,15 @@ static bool cmd_pipe_generate
 		struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_pipe = {
-	"pipe",
-	SCT_COMMAND,
-	-1, /* We check positional arguments ourselves */
-	0, FALSE, FALSE,
-	cmd_pipe_registered,
-	NULL,
-	sieve_extprogram_command_validate,
-	NULL,
-	cmd_pipe_generate,
-	NULL,
+	.identifier = "pipe",
+	.type = SCT_COMMAND,
+	.positional_args = -1, /* We check positional arguments ourselves */
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_pipe_registered,
+	.validate = sieve_extprogram_command_validate,
+	.generate = cmd_pipe_generate
 };
 
 /*
diff --git a/src/testsuite/cmd-test-binary.c b/src/testsuite/cmd-test-binary.c
index 6f529297008fa237378314232dac635e967dca19..2f42fcd97343c4838d58fa5538aa5e6896da9891 100644
--- a/src/testsuite/cmd-test-binary.c
+++ b/src/testsuite/cmd-test-binary.c
@@ -30,15 +30,14 @@ static bool cmd_test_binary_generate
  */
 
 const struct sieve_command_def cmd_test_binary_load = {
-	"test_binary_load",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL,
-	NULL,
-	cmd_test_binary_validate,
-	NULL,
-	cmd_test_binary_generate,
-	NULL
+	.identifier = "test_binary_load",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_binary_validate,
+	.generate = cmd_test_binary_generate
 };
 
 /* Test_binary_save command
@@ -48,15 +47,14 @@ const struct sieve_command_def cmd_test_binary_load = {
  */
 
 const struct sieve_command_def cmd_test_binary_save = {
-	"test_binary_save",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL,
-	NULL,
-	cmd_test_binary_validate,
-	NULL,
-	cmd_test_binary_generate,
-	NULL
+	.identifier = "test_binary_save",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_binary_validate,
+	.generate = cmd_test_binary_generate,
 };
 
 /*
diff --git a/src/testsuite/cmd-test-config.c b/src/testsuite/cmd-test-config.c
index c9b49235c8bb2d83ca6849fd7c1914d748eb2449..c3219d5b19ff86aa58b3117498a0934f4497351c 100644
--- a/src/testsuite/cmd-test-config.c
+++ b/src/testsuite/cmd-test-config.c
@@ -32,14 +32,14 @@ static bool cmd_test_config_set_validate
 	(struct sieve_validator *valdtr, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_test_config_set = {
-	"test_config_set",
-	SCT_COMMAND,
-	2, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_test_config_set_validate,
-	NULL,
-	cmd_test_config_generate,
-	NULL
+	.identifier = "test_config_set",
+	.type = SCT_COMMAND,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_config_set_validate,
+	.generate = cmd_test_config_generate
 };
 
 /* Test_config_unset command
@@ -52,14 +52,14 @@ static bool cmd_test_config_unset_validate
 	(struct sieve_validator *valdtr, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_test_config_unset = {
-	"test_config_unset",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_test_config_unset_validate,
-	NULL,
-	cmd_test_config_generate,
-	NULL
+	.identifier = "test_config_unset",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_config_unset_validate,
+	.generate = cmd_test_config_generate,
 };
 
 /* Test_config_reload command
@@ -73,13 +73,14 @@ static bool cmd_test_config_reload_registered
 	struct sieve_command_registration *cmd_reg);
 
 const struct sieve_command_def cmd_test_config_reload = {
-	"test_config_reload",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	cmd_test_config_reload_registered,
-	NULL, NULL, NULL,
-	cmd_test_config_generate,
-	NULL
+	.identifier = "test_config_reload",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_test_config_reload_registered,
+	.generate = cmd_test_config_generate
 };
 
 /*
diff --git a/src/testsuite/cmd-test-fail.c b/src/testsuite/cmd-test-fail.c
index b28927b1bd8200277f94b01b6c4bc6b3b26e5a71..52695852f6dea689215a5dc1568642186ebe38e6 100644
--- a/src/testsuite/cmd-test-fail.c
+++ b/src/testsuite/cmd-test-fail.c
@@ -25,14 +25,14 @@ static bool cmd_test_fail_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_test_fail = {
-	"test_fail",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_test_fail_validate,
-	NULL,
-	cmd_test_fail_generate,
-	NULL
+	.identifier = "test_fail",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_fail_validate,
+	.generate = cmd_test_fail_generate
 };
 
 /*
diff --git a/src/testsuite/cmd-test-imap-metadata.c b/src/testsuite/cmd-test-imap-metadata.c
index 9356959175956190b2aecab651a9f648537da863..309d5c4e152b4c81979e066377292cdeaaf57452 100644
--- a/src/testsuite/cmd-test-imap-metadata.c
+++ b/src/testsuite/cmd-test-imap-metadata.c
@@ -33,15 +33,15 @@ static bool cmd_test_imap_metadata_generate
  */
 
 const struct sieve_command_def cmd_test_imap_metadata_set = {
-	"test_imap_metadata_set",
-	SCT_COMMAND,
-	2, 0, FALSE, FALSE,
-	cmd_test_imap_metadata_registered,
-	NULL,
-	cmd_test_imap_metadata_validate,
-	NULL,
-	cmd_test_imap_metadata_generate,
-	NULL
+	.identifier = "test_imap_metadata_set",
+	.type = SCT_COMMAND,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_test_imap_metadata_registered,
+	.validate = cmd_test_imap_metadata_validate,
+	.generate = cmd_test_imap_metadata_generate,
 };
 
 /*
diff --git a/src/testsuite/cmd-test-mailbox.c b/src/testsuite/cmd-test-mailbox.c
index cb90cb3e0a028298f24022ede9c2619a796b59b3..f392f454982ea82f8d66fdefa48ff6ea3ab543f4 100644
--- a/src/testsuite/cmd-test-mailbox.c
+++ b/src/testsuite/cmd-test-mailbox.c
@@ -29,14 +29,14 @@ static bool cmd_test_mailbox_generate
  */
 
 const struct sieve_command_def cmd_test_mailbox_create = {
-	"test_mailbox_create",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_test_mailbox_validate,
-	NULL,
-	cmd_test_mailbox_generate,
-	NULL
+	.identifier = "test_mailbox_create",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_mailbox_validate,
+	.generate = cmd_test_mailbox_generate
 };
 
 /* Test_mailbox_delete command
@@ -46,14 +46,14 @@ const struct sieve_command_def cmd_test_mailbox_create = {
  */
 
 const struct sieve_command_def cmd_test_mailbox_delete = {
-	"test_mailbox_delete",
-	SCT_COMMAND,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_test_mailbox_validate,
-	NULL,
-	cmd_test_mailbox_generate,
-	NULL
+	.identifier = "test_mailbox_delete",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_mailbox_validate,
+	.generate = cmd_test_mailbox_generate
 };
 
 /*
diff --git a/src/testsuite/cmd-test-message.c b/src/testsuite/cmd-test-message.c
index c6aaf99b96cbee799eb11a5896f139a955e976be..2f6ce25180c54b0e81fd3f7c1fe1870248f03aa6 100644
--- a/src/testsuite/cmd-test-message.c
+++ b/src/testsuite/cmd-test-message.c
@@ -38,15 +38,15 @@ static bool cmd_test_message_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def cmd_test_message = {
-	"test_message",
-	SCT_HYBRID,
-	1, 0, FALSE, FALSE,
-	cmd_test_message_registered,
-	NULL,
-	cmd_test_message_validate,
-	NULL,
-	cmd_test_message_generate,
-	NULL
+	.identifier = "test_message",
+	.type = SCT_HYBRID,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = cmd_test_message_registered,
+	.validate = cmd_test_message_validate,
+	.generate = cmd_test_message_generate
 };
 
 /* Test_message_print command
@@ -59,15 +59,15 @@ static bool cmd_test_message_print_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_test_message_print = {
-	"test_message_print",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	cmd_test_message_print_generate
-	, NULL
+	.identifier = "test_message_print",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = cmd_test_message_print_generate
 };
 
-
 /*
  * Operations
  */
diff --git a/src/testsuite/cmd-test-result.c b/src/testsuite/cmd-test-result.c
index 0e43153a7f27d5bcf3af3331855c8fd4b107d194..3bfdfaa57312fa55dda122625e5145290ebcf74d 100644
--- a/src/testsuite/cmd-test-result.c
+++ b/src/testsuite/cmd-test-result.c
@@ -30,12 +30,13 @@ static bool cmd_test_result_generate
  */
 
 const struct sieve_command_def cmd_test_result_reset = {
-	"test_result_reset",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	cmd_test_result_generate,
-	NULL
+	.identifier = "test_result_reset",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = cmd_test_result_generate
 };
 
 /* Test_result_print command
@@ -45,12 +46,13 @@ const struct sieve_command_def cmd_test_result_reset = {
  */
 
 const struct sieve_command_def cmd_test_result_print = {
-	"test_result_print",
-	SCT_COMMAND,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	cmd_test_result_generate,
-	NULL
+	.identifier = "test_result_print",
+	.type = SCT_COMMAND,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = cmd_test_result_generate
 };
 
 /*
diff --git a/src/testsuite/cmd-test-set.c b/src/testsuite/cmd-test-set.c
index 4308f9e98389751d2498ffdfb8439c2e42e0b0c8..d1eccc72470a4a6be8fff2146446852ce00e7420 100644
--- a/src/testsuite/cmd-test-set.c
+++ b/src/testsuite/cmd-test-set.c
@@ -35,14 +35,14 @@ static bool cmd_test_set_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def cmd_test_set = {
-	"test_set",
-	SCT_COMMAND,
-	2, 0, FALSE, FALSE,
-	NULL, NULL,
-	cmd_test_set_validate,
-	NULL,
-	cmd_test_set_generate,
-	NULL
+	.identifier = "test_set",
+	.type = SCT_COMMAND,
+	.positional_args = 2,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = cmd_test_set_validate,
+	.generate = cmd_test_set_generate
 };
 
 /*
diff --git a/src/testsuite/cmd-test.c b/src/testsuite/cmd-test.c
index c232a694c07ed092d8a4aa5728312853b6f51f9a..e5d96bf1c8bc268cc1595b329448fba911b56ee6 100644
--- a/src/testsuite/cmd-test.c
+++ b/src/testsuite/cmd-test.c
@@ -25,14 +25,14 @@ static bool cmd_test_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *md);
 
 const struct sieve_command_def cmd_test = {
-	"test",
-	SCT_COMMAND,
-	1, 0, TRUE, TRUE,
-	NULL, NULL,
-	cmd_test_validate,
-	NULL,
-	cmd_test_generate,
-	NULL
+	.identifier = "test",
+	.type = SCT_COMMAND,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = TRUE,
+	.block_required = TRUE,
+	.validate = cmd_test_validate,
+	.generate = cmd_test_generate,
 };
 
 /*
diff --git a/src/testsuite/tst-test-error.c b/src/testsuite/tst-test-error.c
index f2cc225a9c50c94b0e1d9fd2726285f5b80e4fe8..ba4918fc442a2ff38e9cbb954dff3b2789e3cf41 100644
--- a/src/testsuite/tst-test-error.c
+++ b/src/testsuite/tst-test-error.c
@@ -34,15 +34,15 @@ static bool tst_test_error_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def tst_test_error = {
-	"test_error",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	tst_test_error_registered,
-	NULL,
-	tst_test_error_validate,
-	NULL,
-	tst_test_error_generate,
-	NULL
+	.identifier = "test_error",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_test_error_registered,
+	.validate = tst_test_error_validate,
+	.generate = tst_test_error_generate
 };
 
 /*
diff --git a/src/testsuite/tst-test-multiscript.c b/src/testsuite/tst-test-multiscript.c
index 04c3fac3415496f0fcb1f808b5e649310216091d..d8b9bfeef9131f5f3bc46fc638c0c669d45cc92d 100644
--- a/src/testsuite/tst-test-multiscript.c
+++ b/src/testsuite/tst-test-multiscript.c
@@ -29,14 +29,14 @@ static bool tst_test_multiscript_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *tst);
 
 const struct sieve_command_def tst_test_multiscript = {
-	"test_multiscript",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_test_multiscript_validate,
-	NULL,
-	tst_test_multiscript_generate,
-	NULL
+	.identifier = "test_multiscript",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_test_multiscript_validate,
+	.generate = tst_test_multiscript_generate,
 };
 
 /*
diff --git a/src/testsuite/tst-test-result-action.c b/src/testsuite/tst-test-result-action.c
index 158bbaeb821992ff4aa402aa59c97cf0b53fc550..a7cce73f459ca1a86126f082c67889c4c91b7d13 100644
--- a/src/testsuite/tst-test-result-action.c
+++ b/src/testsuite/tst-test-result-action.c
@@ -37,15 +37,15 @@ static bool tst_test_result_action_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
 
 const struct sieve_command_def tst_test_result_action = {
-	"test_result_action",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	tst_test_result_action_registered,
-	NULL,
-	tst_test_result_action_validate,
-	NULL,
-	tst_test_result_action_generate,
-	NULL
+	.identifier = "test_result_action",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_test_result_action_registered,
+	.validate = tst_test_result_action_validate,
+	.generate = tst_test_result_action_generate
 };
 
 /*
diff --git a/src/testsuite/tst-test-result-execute.c b/src/testsuite/tst-test-result-execute.c
index 5f8bbb4063d8c0af5c67ba8690ccebe5f494e9be..2e5bb231dc0e2c082c500a3b23adbfe45bdf9815 100644
--- a/src/testsuite/tst-test-result-execute.c
+++ b/src/testsuite/tst-test-result-execute.c
@@ -26,12 +26,13 @@ static bool tst_test_result_execute_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def tst_test_result_execute = {
-	"test_result_execute",
-	SCT_TEST,
-	0, 0, FALSE, FALSE,
-	NULL, NULL, NULL, NULL,
-	tst_test_result_execute_generate,
-	NULL
+	.identifier = "test_result_execute",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.generate = tst_test_result_execute_generate
 };
 
 /*
diff --git a/src/testsuite/tst-test-script-compile.c b/src/testsuite/tst-test-script-compile.c
index c277b49270a82fe188dff91fd2d0950cfae91fe8..57f9a6955144c0304b31e3ecf1fcf7208daa3fad 100644
--- a/src/testsuite/tst-test-script-compile.c
+++ b/src/testsuite/tst-test-script-compile.c
@@ -28,14 +28,14 @@ static bool tst_test_script_compile_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def tst_test_script_compile = {
-	"test_script_compile",
-	SCT_TEST,
-	1, 0, FALSE, FALSE,
-	NULL, NULL,
-	tst_test_script_compile_validate,
-	NULL,
-	tst_test_script_compile_generate,
-	NULL
+	.identifier = "test_script_compile",
+	.type = SCT_TEST,
+	.positional_args = 1,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.validate = tst_test_script_compile_validate,
+	.generate = tst_test_script_compile_generate
 };
 
 /*
diff --git a/src/testsuite/tst-test-script-run.c b/src/testsuite/tst-test-script-run.c
index cc02842d6935338517bb346134cdd50531c09f3b..d3f0bb54a996e2f7778d9e264ee780a2a461f0fc 100644
--- a/src/testsuite/tst-test-script-run.c
+++ b/src/testsuite/tst-test-script-run.c
@@ -30,13 +30,14 @@ static bool tst_test_script_run_generate
 	(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd);
 
 const struct sieve_command_def tst_test_script_run = {
-	"test_script_run",
-	SCT_TEST,
-	0, 0, FALSE, FALSE,
-	tst_test_script_run_registered,
-	NULL, NULL, NULL,
-	tst_test_script_run_generate,
-	NULL
+	.identifier = "test_script_run",
+	.type = SCT_TEST,
+	.positional_args = 0,
+	.subtests = 0,
+	.block_allowed = FALSE,
+	.block_required = FALSE,
+	.registered = tst_test_script_run_registered,
+	.generate = tst_test_script_run_generate
 };
 
 /*