diff --git a/src/lib-sieve/plugins/copy/ext-copy.c b/src/lib-sieve/plugins/copy/ext-copy.c
index ad4f7ddc4a00e38983e7e11e02dd4f40fa94a843..a0a5494024a1d32ff180f0eb60c819a25c3a0be9 100644
--- a/src/lib-sieve/plugins/copy/ext-copy.c
+++ b/src/lib-sieve/plugins/copy/ext-copy.c
@@ -14,6 +14,7 @@
 
 #include "sieve-code.h"
 #include "sieve-extensions.h"
+#include "sieve-actions.h"
 #include "sieve-commands.h"
 #include "sieve-validator.h"
 #include "sieve-generator.h"
@@ -44,6 +45,25 @@ static bool ext_copy_load(int ext_id)
 	return TRUE;
 }
 
+/* Side effect */
+
+const struct sieve_side_effect_extension ext_copy_side_effect;
+
+const struct sieve_side_effect copy_side_effect = {
+	"copy",
+	&act_store,
+	
+	&ext_copy_side_effect,
+	0,
+	NULL, NULL, NULL, NULL
+};
+
+const struct sieve_side_effect_extension ext_copy_side_effect = {
+	&copy_extension,
+
+	SIEVE_EXT_DEFINE_SIDE_EFFECT(copy_side_effect)
+};
+
 /* Tag validation */
 
 static bool tag_copy_validate
@@ -57,12 +77,30 @@ static bool tag_copy_validate
 	return TRUE;
 }
 
+/* Tag generation */
+
+static bool tag_copy_generate
+(struct sieve_generator *generator, struct sieve_ast_argument *arg,
+    struct sieve_command_context *context ATTR_UNUSED)
+{
+    struct sieve_binary *sbin = sieve_generator_get_binary(generator);
+
+    if ( sieve_ast_argument_type(arg) != SAAT_TAG ) {
+        return FALSE;
+    }
+
+    sieve_opr_side_effect_emit(sbin, &copy_side_effect, ext_my_id);
+
+    return TRUE;
+}
+
 /* Tag */
 
 static const struct sieve_argument copy_tag = { 
 	"copy", NULL, 
 	tag_copy_validate, 
-	NULL, NULL 
+	NULL,
+	tag_copy_generate
 };
 
 /* Load extension into validator */
@@ -72,8 +110,8 @@ static bool ext_copy_validator_load(struct sieve_validator *validator)
 	 * whether these commands are registered or even whether they will be
 	 * registered at all. The validator handles either situation gracefully 
 	 */
-	sieve_validator_register_external_tag(validator, &copy_tag, "redirect", 0);
-	sieve_validator_register_external_tag(validator, &copy_tag, "fileinto", 0);
+	sieve_validator_register_external_tag(validator, &copy_tag, "redirect", -1);
+	sieve_validator_register_external_tag(validator, &copy_tag, "fileinto", -1);
 
 	return TRUE;
 }
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags.c b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
index 82be527f9532731fa4d05010f5f8ac3b8ad21b59..d08a91f23f6d9daa1bede62dab4511454057a6b9 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
@@ -89,8 +89,8 @@ static bool ext_imapflags_validator_load
 	 * whether these commands are registered or even whether they will be
 	 * registered at all. The validator handles either situation gracefully 
 	 */
-	sieve_validator_register_external_tag(validator, &tag_flags, "keep", 0);
-	sieve_validator_register_external_tag(validator, &tag_flags, "fileinto", 0);
+	sieve_validator_register_external_tag(validator, &tag_flags, "keep", -1);
+	sieve_validator_register_external_tag(validator, &tag_flags, "fileinto", -1);
 
 	return TRUE;
 }
diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c
index cafa3d18b15893ef993588d28c32f790ab10379a..41de0063c3c4aa583eb538fdbb5e46b1c42b73c2 100644
--- a/src/lib-sieve/sieve-actions.c
+++ b/src/lib-sieve/sieve-actions.c
@@ -71,7 +71,8 @@ struct sieve_operand side_effect_operand =
 	{ "side-effect", &side_effect_class, FALSE };
 
 void sieve_opr_side_effect_emit
-	(struct sieve_binary *sbin, struct sieve_side_effect *seffect, int ext_id)
+	(struct sieve_binary *sbin, const struct sieve_side_effect *seffect, 
+		int ext_id)
 { 
 	sieve_binary_emit_extension
 		(sbin, seffect, ext_id, 0, SIEVE_OPERAND_SIDE_EFFECT, 
diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h
index b4edd6e55fcca7a845c7eeef2db7270ec3608140..64cdbd169c786adf236888e017b9b3e0ab1834a4 100644
--- a/src/lib-sieve/sieve-actions.h
+++ b/src/lib-sieve/sieve-actions.h
@@ -91,7 +91,8 @@ void sieve_side_effect_extension_set
 		const struct sieve_side_effect_extension *ext);
 
 void sieve_opr_side_effect_emit
-	(struct sieve_binary *sbin, struct sieve_side_effect *seffect, int ext_id);
+	(struct sieve_binary *sbin, const struct sieve_side_effect *seffect, 
+		int ext_id);
 
 /* Actions common to multiple commands */