diff --git a/src/lib-sieve/sieve-plugins.c b/src/lib-sieve/sieve-plugins.c
index 2fadf27acf1deb9ee66b2de61ea51866af9311d4..178a178e608a2682e9900c1c9228daeb2115c45b 100644
--- a/src/lib-sieve/sieve-plugins.c
+++ b/src/lib-sieve/sieve-plugins.c
@@ -15,7 +15,7 @@
  * Types
  */
 
-typedef void
+typedef int
 (*sieve_plugin_load_func_t)(struct sieve_instance *svinst, void **context);
 typedef void
 (*sieve_plugin_unload_func_t)(struct sieve_instance *svinst, void *context);
@@ -53,8 +53,8 @@ static struct module *sieve_plugin_module_find(const char *name)
 	return NULL;
 }
 
-void sieve_plugins_load(struct sieve_instance *svinst, const char *path,
-			const char *plugins)
+int sieve_plugins_load(struct sieve_instance *svinst, const char *path,
+		       const char *plugins)
 {
 	struct module *module;
 	struct module_dir_load_settings mod_set;
@@ -69,7 +69,7 @@ void sieve_plugins_load(struct sieve_instance *svinst, const char *path,
 	}
 
 	if (plugins == NULL || *plugins == '\0')
-		return;
+		return 0;
 
 	if (path == NULL || *path == '\0')
 		path = MODULEDIR"/sieve";
@@ -123,10 +123,12 @@ void sieve_plugins_load(struct sieve_instance *svinst, const char *path,
 		plugin->module = module;
 
 		/* Call load function */
-		load_func = (sieve_plugin_load_func_t) module_get_symbol
-			(module, t_strdup_printf("%s_load", module->name));
-		if (load_func != NULL)
-			load_func(svinst, &plugin->context);
+		load_func = (sieve_plugin_load_func_t)
+			module_get_symbol(module,
+				t_strdup_printf("%s_load", module->name));
+		if (load_func != NULL &&
+		    load_func(svinst, &plugin->context) < 0)
+			return -1;
 
 		/* Add plugin to the instance */
 		if (svinst->plugins == NULL)
@@ -141,6 +143,7 @@ void sieve_plugins_load(struct sieve_instance *svinst, const char *path,
 			plugin_last->next = plugin;
 		}
 	}
+	return 0;
 }
 
 void sieve_plugins_unload(struct sieve_instance *svinst)
diff --git a/src/lib-sieve/sieve-plugins.h b/src/lib-sieve/sieve-plugins.h
index ae5f739443d1627c49cfe42d178a35e4bae13f28..5b621d59462174de25e6864e6ef5fcd65559f09f 100644
--- a/src/lib-sieve/sieve-plugins.h
+++ b/src/lib-sieve/sieve-plugins.h
@@ -3,8 +3,8 @@
 
 #include "sieve-common.h"
 
-void sieve_plugins_load(struct sieve_instance *svinst, const char *path,
-			const char *plugins);
+int sieve_plugins_load(struct sieve_instance *svinst, const char *path,
+		       const char *plugins);
 void sieve_plugins_unload(struct sieve_instance *svinst);
 
 #endif
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index 757e82f7424747e7d135996b8839128153c8faac..a0ba62f79cac8b622144339bd6e725995adb1e08 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -134,8 +134,11 @@ int sieve_init(const struct sieve_environment *env,
 	/* Initialize storage classes */
 	sieve_storages_init(svinst);
 
-	/* Initialize plugins */
-	sieve_plugins_load(svinst, NULL, NULL);
+	/* Load plugins */
+	if (sieve_plugins_load(svinst, NULL, NULL) < 0) {
+		sieve_deinit(&svinst);
+		return -1;
+	}
 
 	/* Load extensions */
 	if (sieve_extensions_load(svinst) < 0) {
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
index 11ff505d4f371b6ddbbfd6b1de31d951069acd61..38edfef3a068f2a23939709a74a3f9ccc4764ec0 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
@@ -182,21 +182,23 @@ const struct sieve_storage sieve_ldap_storage_plugin = {
 
 const char *sieve_storage_ldap_plugin_version = PIGEONHOLE_ABI_VERSION;
 
-void sieve_storage_ldap_plugin_load(struct sieve_instance *svinst,
-				    void **context);
+int sieve_storage_ldap_plugin_load(struct sieve_instance *svinst,
+				   void **context);
 void sieve_storage_ldap_plugin_unload(struct sieve_instance *svinst,
 				      void *context);
 void sieve_storage_ldap_plugin_init(void);
 void sieve_storage_ldap_plugin_deinit(void);
 
-void sieve_storage_ldap_plugin_load(struct sieve_instance *svinst,
-				    void **context ATTR_UNUSED)
+int sieve_storage_ldap_plugin_load(struct sieve_instance *svinst,
+				   void **context ATTR_UNUSED)
 {
 	sieve_storage_class_register(svinst, &sieve_ldap_storage_plugin);
 
 	e_debug(svinst->event,
 		"Sieve LDAP storage plugin for %s version %s loaded",
 		PIGEONHOLE_NAME, PIGEONHOLE_VERSION_FULL);
+
+	return 0;
 }
 
 void sieve_storage_ldap_plugin_unload(struct sieve_instance *svinst ATTR_UNUSED,
diff --git a/src/plugins/imapsieve/sieve-imapsieve-plugin.c b/src/plugins/imapsieve/sieve-imapsieve-plugin.c
index 819188f97f92933d75800c05f2f35ec0e672a77d..2c13e6dde523fdb5e8c8cd980bd45f0d902a4e36 100644
--- a/src/plugins/imapsieve/sieve-imapsieve-plugin.c
+++ b/src/plugins/imapsieve/sieve-imapsieve-plugin.c
@@ -20,7 +20,7 @@ struct _plugin_context {
 
 const char *sieve_imapsieve_plugin_version = PIGEONHOLE_ABI_VERSION;
 
-void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context)
+int sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context)
 {
 	const struct sieve_extension *ext_imapsieve;
 	const struct sieve_extension *ext_vnd_imapsieve;
@@ -28,10 +28,10 @@ void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context)
 
 	if (sieve_extension_register(svinst, &imapsieve_extension_dummy,
 				     TRUE, &ext_imapsieve) < 0)
-		ext_imapsieve = NULL;
+		return -1;
 	if (sieve_extension_register(svinst, &vnd_imapsieve_extension_dummy,
 				     TRUE, &ext_vnd_imapsieve) < 0)
-		ext_vnd_imapsieve = NULL;
+		return -1;
 
 	pctx = i_new(struct _plugin_context, 1);
 	pctx->ext_imapsieve = ext_imapsieve;
@@ -42,6 +42,7 @@ void sieve_imapsieve_plugin_load(struct sieve_instance *svinst, void **context)
 		PIGEONHOLE_NAME, PIGEONHOLE_VERSION_FULL);
 
 	*context = pctx;
+	return 0;
 }
 
 void sieve_imapsieve_plugin_unload(struct sieve_instance *svinst ATTR_UNUSED,
diff --git a/src/plugins/imapsieve/sieve-imapsieve-plugin.h b/src/plugins/imapsieve/sieve-imapsieve-plugin.h
index 1fffba1a73d33b8217155232d89f6aa882f95661..ae988a41bfb75f474b34a03e5d73cb85903e4013 100644
--- a/src/plugins/imapsieve/sieve-imapsieve-plugin.h
+++ b/src/plugins/imapsieve/sieve-imapsieve-plugin.h
@@ -5,8 +5,8 @@
  * Plugin interface
  */
 
-void sieve_imapsieve_plugin_load(struct sieve_instance *svinst,
-				 void **context);
+int sieve_imapsieve_plugin_load(struct sieve_instance *svinst,
+				void **context);
 void sieve_imapsieve_plugin_unload(struct sieve_instance *svinst,
 				   void *context);
 
diff --git a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c
index 4c4fdd18ca022ce8beada0f2fcaf9d819ffdec3c..df00bc047fc0c907c1010103d74212f988788559 100644
--- a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c
+++ b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.c
@@ -20,8 +20,8 @@ struct _plugin_context {
 
 const char *sieve_extprograms_plugin_version = PIGEONHOLE_ABI_VERSION;
 
-void sieve_extprograms_plugin_load(struct sieve_instance *svinst,
-				   void **context)
+int sieve_extprograms_plugin_load(struct sieve_instance *svinst,
+				  void **context)
 {
 	const struct sieve_extension *ext_pipe;
 	const struct sieve_extension *ext_filter;
@@ -30,13 +30,13 @@ void sieve_extprograms_plugin_load(struct sieve_instance *svinst,
 
 	if (sieve_extension_register(svinst, &sieve_ext_vnd_pipe, FALSE,
 				     &ext_pipe) < 0)
-		ext_pipe = NULL;
+		return -1;
 	if (sieve_extension_register(svinst, &sieve_ext_vnd_filter, FALSE,
 				     &ext_filter) < 0)
-		ext_filter = NULL;
+		return -1;
 	if (sieve_extension_register(svinst, &sieve_ext_vnd_execute, FALSE,
 				     &ext_execute) < 0)
-		ext_execute = NULL;
+		return -1;
 
 	pctx = i_new(struct _plugin_context, 1);
 	pctx->ext_pipe = ext_pipe;
@@ -50,6 +50,7 @@ void sieve_extprograms_plugin_load(struct sieve_instance *svinst,
 	}
 
 	*context = pctx;
+	return 0;
 }
 
 void sieve_extprograms_plugin_unload(struct sieve_instance *svinst ATTR_UNUSED,
diff --git a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h
index e6a4a9692f4517a448b0b696c3d154d3ed6f578a..127f2b1d58ff66554505c734a3cbe6b9972a0d9b 100644
--- a/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h
+++ b/src/plugins/sieve-extprograms/sieve-extprograms-plugin.h
@@ -5,8 +5,8 @@
  * Plugin interface
  */
 
-void sieve_extprograms_plugin_load(struct sieve_instance *svinst,
-				   void **context);
+int sieve_extprograms_plugin_load(struct sieve_instance *svinst,
+				  void **context);
 void sieve_extprograms_plugin_unload(struct sieve_instance *svinst,
 				     void *context);