diff --git a/src/lib-sieve/ext-encoded-character.c b/src/lib-sieve/ext-encoded-character.c
index 5105e40f37a07b25dd1eaf09f1a63eabf5aa59d4..c58c189a291f2c1f512306ac8096cb9c0a71a384 100644
--- a/src/lib-sieve/ext-encoded-character.c
+++ b/src/lib-sieve/ext-encoded-character.c
@@ -31,6 +31,7 @@ static int ext_my_id;
 	
 struct sieve_extension encoded_character_extension = { 
 	"encoded-character", 
+	&ext_my_id,
 	ext_encoded_character_load,
 	ext_encoded_character_validator_load, 
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 1ccb0c7595b44061653502b952195abc8f95f807..98c14f77b394220aa930fa9e606fe4cd1edd9ec3 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -45,6 +45,7 @@ static bool ext_envelope_validator_load(struct sieve_validator *validator);
 
 const struct sieve_extension envelope_extension = { 
 	"envelope", 
+	&ext_my_id,
 	ext_envelope_load,
 	ext_envelope_validator_load, 
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 07d0ab088011101450a02f32d99e42e12d106720..68a1ba06d40ec54bd2e8354ee64193507ac8ca82 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -41,6 +41,7 @@ static bool ext_fileinto_validator_load(struct sieve_validator *validator);
 
 const struct sieve_extension fileinto_extension = { 
 	"fileinto", 
+	&ext_my_id,
 	ext_fileinto_load,
 	ext_fileinto_validator_load, 
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index faecfc279485192310c7bb38fdb5b3e1f30a9209..2435305f30804830ce342d18d08579d00d35ec97 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -49,6 +49,7 @@ static bool ext_reject_validator_load(struct sieve_validator *validator);
 	
 struct sieve_extension reject_extension = { 
 	"reject", 
+	&ext_my_id,
 	ext_reject_load,
 	ext_reject_validator_load, 
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/plugins/body/ext-body.c b/src/lib-sieve/plugins/body/ext-body.c
index 1b6d218ac496c23c95543aa426c0947569b816f3..0fa141e68aaac7b0b188d799cb9677de3006edf0 100644
--- a/src/lib-sieve/plugins/body/ext-body.c
+++ b/src/lib-sieve/plugins/body/ext-body.c
@@ -64,6 +64,7 @@ static bool ext_body_validator_load(struct sieve_validator *validator);
 
 const struct sieve_extension body_extension = { 
 	"body", 
+	&ext_body_my_id,
 	ext_body_load,
 	ext_body_validator_load, 
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/plugins/comparator-i-ascii-numeric/ext-cmp-i-ascii-numeric.c b/src/lib-sieve/plugins/comparator-i-ascii-numeric/ext-cmp-i-ascii-numeric.c
index 35de40f837a68cbe46bec0fde1fbeadf5e4c32c6..f2e069d32e8c819e4640bf1a5cf391b48cf7aba9 100644
--- a/src/lib-sieve/plugins/comparator-i-ascii-numeric/ext-cmp-i-ascii-numeric.c
+++ b/src/lib-sieve/plugins/comparator-i-ascii-numeric/ext-cmp-i-ascii-numeric.c
@@ -37,6 +37,7 @@ static int ext_my_id;
 
 const struct sieve_extension comparator_i_ascii_numeric_extension = { 
 	"comparator-i;ascii-numeric", 
+	&ext_my_id,
 	ext_cmp_i_ascii_numeric_load,
 	ext_cmp_i_ascii_numeric_validator_load,
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/plugins/copy/ext-copy.c b/src/lib-sieve/plugins/copy/ext-copy.c
index f1810f2b0dc0f2027ed488e010cab839549431a0..9153ce98092d7d00fac3dfb588687be9f325bcaa 100644
--- a/src/lib-sieve/plugins/copy/ext-copy.c
+++ b/src/lib-sieve/plugins/copy/ext-copy.c
@@ -34,6 +34,7 @@ static int ext_my_id;
 
 const struct sieve_extension copy_extension = { 
 	"copy", 
+	&ext_my_id,
 	ext_copy_load,
 	ext_copy_validator_load, 
 	NULL, NULL, NULL, NULL, NULL, 
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags.c b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
index e14c6cab5581b636f5675d06fb758b6b8299ad69..3a785f4281814e8b65c8ebf60074217afd13250a 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
@@ -60,6 +60,7 @@ int ext_imapflags_my_id;
 
 const struct sieve_extension imapflags_extension = { 
 	"imap4flags", 
+	&ext_imapflags_my_id,
 	ext_imapflags_load,
 	ext_imapflags_validator_load, 
 	NULL, NULL,
diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c
index 4592de5885666d85e1332a62e600d5a00b07d8a8..47e9bb778c7b6e62b11f46defaece288bd3bd83f 100644
--- a/src/lib-sieve/plugins/include/ext-include.c
+++ b/src/lib-sieve/plugins/include/ext-include.c
@@ -51,6 +51,7 @@ int ext_include_my_id;
 
 const struct sieve_extension include_extension = { 
 	"include", 
+	&ext_include_my_id,
 	ext_include_load,
 	ext_include_validator_load, 
 	ext_include_generator_load,
diff --git a/src/lib-sieve/plugins/regex/ext-regex.c b/src/lib-sieve/plugins/regex/ext-regex.c
index 0117b15c90fc4c2f1fce515ceb9c6705590280fc..c62cb95da26baf83bae2f749f9d21cdc853abb90 100644
--- a/src/lib-sieve/plugins/regex/ext-regex.c
+++ b/src/lib-sieve/plugins/regex/ext-regex.c
@@ -47,6 +47,7 @@ static int ext_my_id;
 
 const struct sieve_extension regex_extension = { 
 	"regex", 
+	&ext_my_id,
 	ext_regex_load,
 	ext_regex_validator_load,
 	NULL, NULL, NULL, NULL, NULL,  
diff --git a/src/lib-sieve/plugins/relational/ext-relational.c b/src/lib-sieve/plugins/relational/ext-relational.c
index 8f93092c4baea82af1a1b2c5be5cf6b8aecea425..6555777b8d95c4a0d111145162a43a4f696b963e 100644
--- a/src/lib-sieve/plugins/relational/ext-relational.c
+++ b/src/lib-sieve/plugins/relational/ext-relational.c
@@ -38,6 +38,7 @@ int ext_relational_my_id;
 
 const struct sieve_extension relational_extension = { 
 	"relational", 
+	&ext_relational_my_id,
 	ext_relational_load,
 	ext_relational_validator_load,
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
index 5538979ec78db8e6bb0224ad923044d42eb7da93..d7489640d4f05d29ffdaed7614ecbcac99f1c728 100644
--- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c
+++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
@@ -40,6 +40,7 @@ static int ext_my_id;
 
 const struct sieve_extension subaddress_extension = { 
 	"subaddress", 
+	&ext_my_id,
 	ext_subaddress_load,
 	ext_subaddress_validator_load,
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/plugins/vacation/ext-vacation.c b/src/lib-sieve/plugins/vacation/ext-vacation.c
index dad01342ce18cad281593f4e701f51d0a01f7147..582da44c61ac225ccefd284bf95524cbc5d37388 100644
--- a/src/lib-sieve/plugins/vacation/ext-vacation.c
+++ b/src/lib-sieve/plugins/vacation/ext-vacation.c
@@ -36,7 +36,8 @@ static bool ext_vacation_validator_load(struct sieve_validator *validator);
 int ext_vacation_my_id;
 
 const struct sieve_extension vacation_extension = { 
-	"vacation", 
+	"vacation",
+	&ext_vacation_my_id,
 	ext_vacation_load,
 	ext_vacation_validator_load, 
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/plugins/variables/ext-variables.c b/src/lib-sieve/plugins/variables/ext-variables.c
index b831c7936e5a671509c55e99227c3ea52a450cef..b7b66a99bea5a16cae64032911d836569b1633b9 100644
--- a/src/lib-sieve/plugins/variables/ext-variables.c
+++ b/src/lib-sieve/plugins/variables/ext-variables.c
@@ -66,6 +66,7 @@ int ext_variables_my_id;
 	
 struct sieve_extension variables_extension = { 
 	"variables", 
+	&ext_variables_my_id,
 	ext_variables_load,
 	ext_variables_validator_load, 
 	NULL, 
diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c
index 594278fc1cf8327c9e9b2cc3245f7dd41f03bdae..e5801fe7dec52bd7dfe17341b6e0ffd64f472710 100644
--- a/src/lib-sieve/sieve-actions.c
+++ b/src/lib-sieve/sieve-actions.c
@@ -26,28 +26,6 @@ const char *sieve_get_new_message_id
     count++, senv->hostname);
 }
 
-/* 
- * Side-effects 'extension' 
- */
-
-static int ext_my_id = -1;
-
-static bool seffect_extension_load(int ext_id);
-
-const struct sieve_extension side_effects_extension = {
-	"@side-effects",
-	seffect_extension_load,
-	NULL, NULL, NULL, NULL, NULL,	NULL,
-	SIEVE_EXT_DEFINE_NO_OPERATIONS, /* Opcode is hardcoded */
-	SIEVE_EXT_DEFINE_NO_OPERANDS
-};
-	
-static bool seffect_extension_load(int ext_id) 
-{
-	ext_my_id = ext_id;
-	return TRUE;
-}
-
 /*
  * Side-effect operand
  */
diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c
index 9a5faec29f8f23a68b2ad4c54bdf114b7b70e898..d9bccee5de7f7d292d83cae0687cc64ec2c0ed7d 100644
--- a/src/lib-sieve/sieve-address-parts.c
+++ b/src/lib-sieve/sieve-address-parts.c
@@ -44,6 +44,7 @@ static bool addrp_validator_load(struct sieve_validator *validator);
 
 const struct sieve_extension address_part_extension = {
 	"@address-parts",
+	&ext_my_id,
 	addrp_extension_load,
 	addrp_validator_load,
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/sieve-comparators.c b/src/lib-sieve/sieve-comparators.c
index 479d0466b1ec227a24cd81d2730f636c77cb8447..1affea88a8cdb5294b6d2a239f563e7b7f7e9c89 100644
--- a/src/lib-sieve/sieve-comparators.c
+++ b/src/lib-sieve/sieve-comparators.c
@@ -49,6 +49,7 @@ static bool cmp_validator_load(struct sieve_validator *validator);
 
 const struct sieve_extension comparator_extension = {
 	"@comparators",
+	&ext_my_id,
 	cmp_extension_load,
 	cmp_validator_load,
 	NULL, NULL, NULL, NULL,	NULL,
diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c
index bbb6944813c7a574f04b4c617dce54dac50295c8..543f382b2a0e175649b848ce0635ad759727e81a 100644
--- a/src/lib-sieve/sieve-extensions.c
+++ b/src/lib-sieve/sieve-extensions.c
@@ -17,11 +17,9 @@ static void sieve_extensions_deinit_registry(void);
 extern const struct sieve_extension comparator_extension;
 extern const struct sieve_extension match_type_extension;
 extern const struct sieve_extension address_part_extension;
-extern const struct sieve_extension side_effects_extension;
 
 const struct sieve_extension *sieve_preloaded_extensions[] = {
-	&comparator_extension, &match_type_extension, &address_part_extension,
-	&side_effects_extension 
+	&comparator_extension, &match_type_extension, &address_part_extension
 };
 
 const unsigned int sieve_preloaded_extensions_count = 
@@ -30,15 +28,15 @@ const unsigned int sieve_preloaded_extensions_count =
 /* Dummy extensions */
 
 static const struct sieve_extension comparator_i_octet_extension = {
-	"comparator-i;octet",
-	NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+	"comparator-i;octet", 
+	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 	SIEVE_EXT_DEFINE_NO_OPERATIONS, 
 	SIEVE_EXT_DEFINE_NO_OPERANDS
 };
 
 static const struct sieve_extension comparator_i_ascii_casemap_extension = {
-	"comparator-i;ascii-casemap",
-	NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+	"comparator-i;ascii-casemap", 
+	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 	SIEVE_EXT_DEFINE_NO_OPERATIONS, 
 	SIEVE_EXT_DEFINE_NO_OPERANDS
 };
@@ -66,7 +64,6 @@ extern const struct sieve_extension variables_extension;
 const struct sieve_extension *sieve_core_extensions[] = {
 	/* Preloaded 'extensions' */
 	&comparator_extension, &match_type_extension, &address_part_extension,
-	&side_effects_extension,
 	
 	/* Dummy extensions */ 
 	&comparator_i_octet_extension, &comparator_i_ascii_casemap_extension, 
@@ -200,16 +197,7 @@ int sieve_extension_get_id(const struct sieve_extension *extension)
 
 static bool _list_extension(const struct sieve_extension *ext)
 {
-	if ( *ext->name == '@' ) return FALSE;
-
-	if ( ext->validator_load == NULL && ext->generator_load == NULL &&
-		ext->binary_load == NULL && ext->interpreter_load == NULL &&
-		ext->runtime_load == NULL && ext->load == NULL &&
-		ext->operations.count == 0 && ext->operands.count == 0 ) {
-		return FALSE;
-	}
-
-	return TRUE;
+	return ( ext->id != NULL && *ext->name != '@' );
 }
 
 const char *sieve_extensions_get_string(void)
diff --git a/src/lib-sieve/sieve-extensions.h b/src/lib-sieve/sieve-extensions.h
index d60dc9067d4bec3cf07bff1e4ac01092a24201de..20d065845b9251a80883882b37ffa52da6a71e42 100644
--- a/src/lib-sieve/sieve-extensions.h
+++ b/src/lib-sieve/sieve-extensions.h
@@ -15,6 +15,7 @@ struct sieve_extension_obj_registry {
 
 struct sieve_extension {
 	const char *name;
+	const int *id;
 	
 	bool (*load)(int ext_id);
 
diff --git a/src/lib-sieve/sieve-match-types.c b/src/lib-sieve/sieve-match-types.c
index d860e94a5feceb444c02ab78c57c8a771c17865f..4e6ad7fdce9e7726eb3507da269c34dd1c392038 100644
--- a/src/lib-sieve/sieve-match-types.c
+++ b/src/lib-sieve/sieve-match-types.c
@@ -49,6 +49,7 @@ static bool mtch_validator_load(struct sieve_validator *validator);
 
 const struct sieve_extension match_type_extension = {
 	"@match-types",
+	&ext_my_id,
 	mtch_extension_load,
 	mtch_validator_load,
 	NULL, NULL, NULL, NULL, NULL,
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index b7be9fd2f0b0b691f1cdc96718b3c5b3bc086e59..dc7eb66d255468f637831786f48ef77049199cbc 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -126,7 +126,7 @@ struct sieve_validator *sieve_validator_create
 		const struct sieve_extension *ext = sieve_preloaded_extensions[i];
 		
 		if ( ext->validator_load != NULL )
-			(void)ext->validator_load(validator);		
+			(void)ext->validator_load(validator);
 	}
 	
 	return validator;
diff --git a/src/testsuite/ext-testsuite.c b/src/testsuite/ext-testsuite.c
index bc2ccaec44479167c49a69dea0d53ab992375531..2d493b3debc53d894587adad71d71e59b6ea08c5 100644
--- a/src/testsuite/ext-testsuite.c
+++ b/src/testsuite/ext-testsuite.c
@@ -59,6 +59,7 @@ int ext_testsuite_my_id;
 
 const struct sieve_extension testsuite_extension = { 
 	"vnd.dovecot.testsuite", 
+	&ext_testsuite_my_id,
 	ext_testsuite_load,
 	ext_testsuite_validator_load,
 	ext_testsuite_generator_load,