diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h
index 6b86285c289b10f51755262890cae6db197b7ed2..f06286b6353ea11348e39f562566418caa953976 100644
--- a/src/lib-sieve/sieve-script-private.h
+++ b/src/lib-sieve/sieve-script-private.h
@@ -98,7 +98,4 @@ void sieve_script_set_critical(struct sieve_script *script,
  * Script sequence
  */
 
-void sieve_script_sequence_init(struct sieve_script_sequence *sseq,
-				struct sieve_storage *storage);
-
 #endif
diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index b3fb348c3d834cd86cb623c25b789c0cb7bf6e79..718ee67b9a1b974665597ddb9f5475d20fc8bf2c 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -875,20 +875,15 @@ const char *sieve_script_get_last_error_lcase(struct sieve_script *script)
  * Script sequence
  */
 
-void sieve_script_sequence_init(struct sieve_script_sequence *sseq,
-				struct sieve_storage *storage)
-{
-	sseq->storage = storage;
-	sieve_storage_ref(storage);
-}
-
 int sieve_script_sequence_create(struct sieve_instance *svinst,
 				 const char *location,
 				 struct sieve_script_sequence **sseq_r,
 				 enum sieve_error *error_code_r)
 {
 	struct sieve_storage *storage;
+	struct sieve_script_sequence *sseq;
 	enum sieve_error error_code;
+	int ret;
 
 	*sseq_r = NULL;
 	if (error_code_r != NULL)
@@ -900,10 +895,14 @@ int sieve_script_sequence_create(struct sieve_instance *svinst,
 				 &storage, error_code_r) < 0)
 		return -1;
 
-	*sseq_r = sieve_storage_get_script_sequence(storage, error_code_r);
+	sseq = i_new(struct sieve_script_sequence, 1);
+	sseq->storage = storage;
 
-	sieve_storage_unref(&storage);
-	return 0;
+	i_assert(storage->v.script_sequence_init != NULL);
+        ret = storage->v.script_sequence_init(sseq, error_code_r);
+
+	*sseq_r = sseq;
+	return ret;
 }
 
 int sieve_script_sequence_next(struct sieve_script_sequence *sseq,
@@ -937,4 +936,5 @@ void sieve_script_sequence_free(struct sieve_script_sequence **_sseq)
 		storage->v.script_sequence_destroy(sseq);
 
 	sieve_storage_unref(&storage);
+	i_free(sseq);
 }
diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index b0ab0d92b16ac3486212fb17aea9b73e6b9ed34d..69c797f2a4ca9395330d60d7687585f51f547488 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -37,8 +37,8 @@ struct sieve_storage_vfuncs {
 			  struct sieve_script **script_r);
 
 	/* script sequence */
-	struct sieve_script_sequence *(*get_script_sequence)(
-		struct sieve_storage *storage, enum sieve_error *error_code_r);
+	int (*script_sequence_init)(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r);
 	int (*script_sequence_next)(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r);
@@ -154,6 +154,7 @@ struct sieve_storage_list_context {
 
 struct sieve_script_sequence {
 	struct sieve_storage *storage;
+	void *storage_data;
 };
 
 /*
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index c1900ee4d1f18e7670d2a69d5a9f7b636ffd8b3c..d6e16a36c5cfdd2656ae758a55bc47a4f0741596 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -852,25 +852,6 @@ int sieve_storage_check_script(struct sieve_storage *storage, const char *name,
 	return 1;
 }
 
-/*
- * Script sequence
- */
-
-struct sieve_script_sequence *
-sieve_storage_get_script_sequence(struct sieve_storage *storage,
-				  enum sieve_error *error_code_r)
-{
-	enum sieve_error error_code;
-
-	if (error_code_r != NULL)
-		*error_code_r = SIEVE_ERROR_NONE;
-	else
-		error_code_r = &error_code;
-
-	i_assert(storage->v.get_script_sequence != NULL);
-	return storage->v.get_script_sequence(storage, error_code_r);
-}
-
 /*
  * Active script
  */
diff --git a/src/lib-sieve/sieve-storage.h b/src/lib-sieve/sieve-storage.h
index ffb25a0861ade4871cc591106eea094150ce9fbf..333d0e9ffa1521fa31020616fadaca599efb9895 100644
--- a/src/lib-sieve/sieve-storage.h
+++ b/src/lib-sieve/sieve-storage.h
@@ -51,14 +51,6 @@ int sieve_storage_open_script(struct sieve_storage *storage, const char *name,
 int sieve_storage_check_script(struct sieve_storage *storage, const char *name,
 			       enum sieve_error *error_code_r);
 
-/*
- * Script sequence
- */
-
-struct sieve_script_sequence *
-sieve_storage_get_script_sequence(struct sieve_storage *storage,
-				  enum sieve_error *error_code_r);
-
 /*
  * Active script
  */
diff --git a/src/lib-sieve/storage/dict/sieve-dict-script.c b/src/lib-sieve/storage/dict/sieve-dict-script.c
index 167fe8fe907fde32eff0ccc7644dd8b12819e678..b03fbc31c98f33cf988184623d9339e3a656fb59 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-script.c
+++ b/src/lib-sieve/storage/dict/sieve-dict-script.c
@@ -300,42 +300,36 @@ const struct sieve_script sieve_dict_script = {
  */
 
 struct sieve_dict_script_sequence {
-	struct sieve_script_sequence seq;
-
 	bool done:1;
 };
 
-struct sieve_script_sequence *
-sieve_dict_storage_get_script_sequence(struct sieve_storage *storage,
-				       enum sieve_error *error_code_r)
+int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r ATTR_UNUSED)
 {
-	struct sieve_dict_script_sequence *dseq = NULL;
-
-	if (error_code_r != NULL)
-		*error_code_r = SIEVE_ERROR_NONE;
+	struct sieve_dict_script_sequence *dseq;
 
 	/* Create sequence object */
 	dseq = i_new(struct sieve_dict_script_sequence, 1);
-	sieve_script_sequence_init(&dseq->seq, storage);
+	sseq->storage_data = dseq;
 
-	return &dseq->seq;
+	return 0;
 }
 
 int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r)
 {
-	struct sieve_dict_script_sequence *dseq =
-		container_of(sseq, struct sieve_dict_script_sequence, seq);
+	struct sieve_dict_script_sequence *dseq = sseq->storage_data;
+	struct sieve_storage *storage = sseq->storage;
 	struct sieve_dict_storage *dstorage =
-		container_of(sseq->storage, struct sieve_dict_storage, storage);
+		container_of(storage, struct sieve_dict_storage, storage);
 	struct sieve_dict_script *dscript;
 
 	if (dseq->done)
 		return 0;
 	dseq->done = TRUE;
 
-	dscript = sieve_dict_script_init(dstorage, sseq->storage->script_name);
+	dscript = sieve_dict_script_init(dstorage, storage->script_name);
 	if (sieve_script_open(&dscript->script, error_code_r) < 0) {
 		struct sieve_script *script = &dscript->script;
 
@@ -349,8 +343,7 @@ int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq,
 
 void sieve_dict_script_sequence_destroy(struct sieve_script_sequence *sseq)
 {
-	struct sieve_dict_script_sequence *dseq =
-		container_of(sseq, struct sieve_dict_script_sequence, seq);
+	struct sieve_dict_script_sequence *dseq = sseq->storage_data;
 
 	i_free(dseq);
 }
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.c b/src/lib-sieve/storage/dict/sieve-dict-storage.c
index 07617e29b878a56b56212e00238af651c67c7ab9..2d65a6765bd29389200c483a66c0bf0a907cb214 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.c
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.c
@@ -179,7 +179,7 @@ const struct sieve_storage sieve_dict_storage = {
 
 		.get_script = sieve_dict_storage_get_script,
 
-		.get_script_sequence = sieve_dict_storage_get_script_sequence,
+		.script_sequence_init = sieve_dict_script_sequence_init,
 		.script_sequence_next = sieve_dict_script_sequence_next,
 		.script_sequence_destroy = sieve_dict_script_sequence_destroy,
 
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.h b/src/lib-sieve/storage/dict/sieve-dict-storage.h
index f6f61413a8612583786f0164d3645e8e2e2c997b..be5f269f2c775e7853ea37e50176a85208cb5a2e 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.h
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.h
@@ -53,10 +53,8 @@ sieve_dict_script_init(struct sieve_dict_storage *dstorage, const char *name);
  * Script sequence
  */
 
-struct sieve_script_sequence *
-sieve_dict_storage_get_script_sequence(struct sieve_storage *storage,
-				       enum sieve_error *error_code_r);
-
+int sieve_dict_script_sequence_init(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r);
 int sieve_dict_script_sequence_next(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r);
diff --git a/src/lib-sieve/storage/file/sieve-file-script-sequence.c b/src/lib-sieve/storage/file/sieve-file-script-sequence.c
index 2ffa34c932812d885ac0543f9b15dae626b222d0..fba7f7ba1707de7cee9ba755fb1a4f9b67b6b11f 100644
--- a/src/lib-sieve/storage/file/sieve-file-script-sequence.c
+++ b/src/lib-sieve/storage/file/sieve-file-script-sequence.c
@@ -19,7 +19,6 @@
  */
 
 struct sieve_file_script_sequence {
-	struct sieve_script_sequence seq;
 	pool_t pool;
 
 	ARRAY_TYPE(const_string) script_files;
@@ -29,10 +28,11 @@ struct sieve_file_script_sequence {
 };
 
 static int
-sieve_file_script_sequence_read_dir(struct sieve_file_script_sequence *fseq,
+sieve_file_script_sequence_read_dir(struct sieve_script_sequence *sseq,
+				    struct sieve_file_script_sequence *fseq,
 				    const char *path)
 {
-	struct sieve_storage *storage = fseq->seq.storage;
+	struct sieve_storage *storage = sseq->storage;
 	DIR *dirp;
 	int ret = 0;
 
@@ -123,10 +123,10 @@ sieve_file_script_sequence_read_dir(struct sieve_file_script_sequence *fseq,
 	return ret;
 }
 
-struct sieve_script_sequence *
-sieve_file_storage_get_script_sequence(struct sieve_storage *storage,
-				       enum sieve_error *error_code_r)
+int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r)
 {
+	struct sieve_storage *storage = sseq->storage;
 	struct sieve_file_storage *fstorage =
 		container_of(storage, struct sieve_file_storage, storage);
 	struct sieve_file_script_sequence *fseq = NULL;
@@ -158,14 +158,14 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage,
 			break;
 		}
 		*error_code_r = storage->error_code;
-		return NULL;
+		return -1;
 	}
 
 	/* Create sequence object */
 	pool = pool_alloconly_create("sieve_file_script_sequence", 1024);
 	fseq = p_new(pool, struct sieve_file_script_sequence, 1);
 	fseq->pool = pool;
-	sieve_script_sequence_init(&fseq->seq, storage);
+	sseq->storage_data = fseq;
 
 	if (S_ISDIR(st.st_mode)) {
 		i_array_init(&fseq->script_files, 16);
@@ -174,10 +174,10 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage,
 		if (name == 0 || *name == '\0') {
 			/* Read all '.sieve' files in directory */
 			if (sieve_file_script_sequence_read_dir(
-				fseq, fstorage->path) < 0) {
+				sseq, fseq, fstorage->path) < 0) {
 				*error_code_r = storage->error_code;
-				sieve_file_script_sequence_destroy(&fseq->seq);
-				return NULL;
+				pool_unref(&fseq->pool);
+				return -1;
 			}
 
 		}	else {
@@ -193,15 +193,14 @@ sieve_file_storage_get_script_sequence(struct sieve_storage *storage,
 		fseq->storage_is_file = TRUE;
 	}
 
-	return &fseq->seq;
+	return 0;
 }
 
 int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r)
 {
-	struct sieve_file_script_sequence *fseq =
-		container_of(sseq, struct sieve_file_script_sequence, seq);
+	struct sieve_file_script_sequence *fseq = sseq->storage_data;
 	struct sieve_storage *storage = sseq->storage;
 	struct sieve_file_storage *fstorage =
 		container_of(storage, struct sieve_file_storage, storage);
@@ -230,7 +229,7 @@ int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 				&fscript);
 			if (ret == 0)
 				break;
-			if (sseq->storage->error_code != SIEVE_ERROR_NOT_FOUND)
+			if (storage->error_code != SIEVE_ERROR_NOT_FOUND)
 				break;
 			sieve_storage_clear_error(storage);
 			if (fseq->index >= count)
@@ -250,8 +249,7 @@ int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 
 void sieve_file_script_sequence_destroy(struct sieve_script_sequence *sseq)
 {
-	struct sieve_file_script_sequence *fseq =
-		container_of(sseq, struct sieve_file_script_sequence, seq);
+	struct sieve_file_script_sequence *fseq = sseq->storage_data;
 
 	if (array_is_created(&fseq->script_files))
 		array_free(&fseq->script_files);
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index 325f1511c2571ec5c389313cd4caafaaaafefd41..532eedd540c1ab9b3d82911a51996047faf95687 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -909,7 +909,7 @@ const struct sieve_storage sieve_file_storage = {
 
 		.get_script = sieve_file_storage_get_script,
 
-		.get_script_sequence = sieve_file_storage_get_script_sequence,
+		.script_sequence_init = sieve_file_script_sequence_init,
 		.script_sequence_next = sieve_file_script_sequence_next,
 		.script_sequence_destroy = sieve_file_script_sequence_destroy,
 
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.h b/src/lib-sieve/storage/file/sieve-file-storage.h
index 7d3eda2a247248af47ee59aba6773d0c0ca4fa7f..da614455d465c8cd867c3317307b91a2c8d03541 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.h
+++ b/src/lib-sieve/storage/file/sieve-file-storage.h
@@ -172,10 +172,8 @@ const char *sieve_file_script_get_path(const struct sieve_script *script);
  * Script sequence
  */
 
-struct sieve_script_sequence *
-sieve_file_storage_get_script_sequence(struct sieve_storage *storage,
-				       enum sieve_error *error_code_r);
-
+int sieve_file_script_sequence_init(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r);
 int sieve_file_script_sequence_next(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r);
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
index 6bea3e7aaaab2aab0e22892a0bf4335130bb2fe7..a4fed92dd826676a978e47406086ad4605e852d5 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
@@ -316,42 +316,36 @@ const struct sieve_script sieve_ldap_script = {
  */
 
 struct sieve_ldap_script_sequence {
-	struct sieve_script_sequence seq;
-
 	bool done:1;
 };
 
-struct sieve_script_sequence *
-sieve_ldap_storage_get_script_sequence(struct sieve_storage *storage,
-				       enum sieve_error *error_code_r)
+int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r ATTR_UNUSED)
 {
-	struct sieve_ldap_script_sequence *lsec = NULL;
-
-	if (error_code_r != NULL)
-		*error_code_r = SIEVE_ERROR_NONE;
+	struct sieve_ldap_script_sequence *lseq = NULL;
 
 	/* Create sequence object */
-	lsec = i_new(struct sieve_ldap_script_sequence, 1);
-	sieve_script_sequence_init(&lsec->seq, storage);
+	lseq = i_new(struct sieve_ldap_script_sequence, 1);
+	sseq->storage_data = lseq;
 
-	return &lsec->seq;
+	return 0;
 }
 
 int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r)
 {
-	struct sieve_ldap_script_sequence *lsec =
-		container_of(sseq, struct sieve_ldap_script_sequence, seq);
+	struct sieve_ldap_script_sequence *lseq = sseq->storage_data;
+	struct sieve_storage *storage = sseq->storage;
 	struct sieve_ldap_storage *lstorage =
-		container_of(sseq->storage, struct sieve_ldap_storage, storage);
+		container_of(storage, struct sieve_ldap_storage, storage);
 	struct sieve_ldap_script *lscript;
 
-	if (lsec->done)
+	if (lseq->done)
 		return 0;
-	lsec->done = TRUE;
+	lseq->done = TRUE;
 
-	lscript = sieve_ldap_script_init(lstorage, sseq->storage->script_name);
+	lscript = sieve_ldap_script_init(lstorage, storage->script_name);
 	if (sieve_script_open(&lscript->script, error_code_r) < 0) {
 		struct sieve_script *script = &lscript->script;
 
@@ -364,10 +358,9 @@ int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq,
 
 void sieve_ldap_script_sequence_destroy(struct sieve_script_sequence *sseq)
 {
-	struct sieve_ldap_script_sequence *lsec =
-		container_of(sseq, struct sieve_ldap_script_sequence, seq);
+	struct sieve_ldap_script_sequence *lseq = sseq->storage_data;
 
-	i_free(lsec);
+	i_free(lseq);
 }
 
 #endif
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
index 9f27b4d7e73a0040c7e3b7721e8529c4cbb56b1a..36a66a42e0c7fcef1cafdda5011aa17eab31b7ab 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
@@ -164,7 +164,7 @@ const struct sieve_storage sieve_ldap_storage_plugin = {
 
 		.get_script = sieve_ldap_storage_get_script,
 
-		.get_script_sequence = sieve_ldap_storage_get_script_sequence,
+		.script_sequence_init = sieve_ldap_script_sequence_init,
 		.script_sequence_next = sieve_ldap_script_sequence_next,
 		.script_sequence_destroy = sieve_ldap_script_sequence_destroy,
 
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
index 2341900eeacdf80f66493fa0e0ac246ffe8065ea..978ad0e2f911386bf37f3bc7c459b7d84044e9c5 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
@@ -93,10 +93,8 @@ sieve_ldap_script_init(struct sieve_ldap_storage *lstorage, const char *name);
  * Script sequence
  */
 
-struct sieve_script_sequence *
-sieve_ldap_storage_get_script_sequence(struct sieve_storage *storage,
-				       enum sieve_error *error_code_r);
-
+int sieve_ldap_script_sequence_init(struct sieve_script_sequence *sseq,
+				    enum sieve_error *error_code_r);
 int sieve_ldap_script_sequence_next(struct sieve_script_sequence *sseq,
 				    struct sieve_script **script_r,
 				    enum sieve_error *error_code_r);