diff --git a/src/lib-sieve/sieve-script-dict.c b/src/lib-sieve/sieve-script-dict.c
index 14358662d53e21157792aba5a3f6988adefb65ce..939328b609102c90f411c926b61e46631506265c 100644
--- a/src/lib-sieve/sieve-script-dict.c
+++ b/src/lib-sieve/sieve-script-dict.c
@@ -289,6 +289,7 @@ const struct sieve_script sieve_dict_script = {
 		sieve_dict_script_binary_write_metadata,
 		sieve_dict_script_binary_load,
 		sieve_dict_script_binary_save,
+		NULL,
 
 		NULL,
 		sieve_dict_script_equals
diff --git a/src/lib-sieve/sieve-script-file.c b/src/lib-sieve/sieve-script-file.c
index eee6f5082199b79b7551439ed0ad9873e815976b..71c13266991500ff8a714e948cb0eebac54fb7da 100644
--- a/src/lib-sieve/sieve-script-file.c
+++ b/src/lib-sieve/sieve-script-file.c
@@ -354,6 +354,14 @@ static int sieve_file_script_binary_save
 		script->st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO), error_r);
 }
 
+static const char *sieve_file_script_binary_get_directory
+(struct sieve_script *_script)
+{
+	struct sieve_file_script *script = (struct sieve_file_script *)_script;
+	
+	return script->	dirpath;
+}
+
 const struct sieve_script sieve_file_script = {
 	.driver_name = SIEVE_FILE_SCRIPT_DRIVER_NAME,
 	.v = {
@@ -368,6 +376,7 @@ const struct sieve_script sieve_file_script = {
 		NULL,
 		sieve_file_script_binary_load,
 		sieve_file_script_binary_save,
+		sieve_file_script_binary_get_directory,
 
 		sieve_file_script_get_size,
 
diff --git a/src/lib-sieve/sieve-script-private.h b/src/lib-sieve/sieve-script-private.h
index 753d64a6b8031e4336468364fbb6fa464eb0749a..edc343716b38445e5bc245ce7c23c634b8053b6e 100644
--- a/src/lib-sieve/sieve-script-private.h
+++ b/src/lib-sieve/sieve-script-private.h
@@ -32,6 +32,8 @@ struct sieve_script_vfuncs {
 	int (*binary_save)
 		(struct sieve_script *script, struct sieve_binary *sbin,
 			bool update, enum sieve_error *error_r);
+	const char *(*binary_get_directory)
+		(struct sieve_script *script);
 
 	int (*get_size)
 		(const struct sieve_script *script, uoff_t *size_r);
diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index 19869483b330614b6aaadb7ac333d219aa6e3220..720b16c5e4fe389e5eb5139a1005af31e1465da6 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -542,6 +542,20 @@ int sieve_script_binary_save
 	return script->v.binary_save(script, sbin, update, error_r);
 }
 
+const char *sieve_script_binary_get_directory
+(struct sieve_script *script)
+{
+	if ( script->bin_dir != NULL &&
+		sieve_script_setup_bindir(script, 0700) >= 0 ) {
+		return script->bin_dir;
+	}
+
+	if ( script->v.binary_get_directory == NULL )
+		return NULL;
+
+	return script->v.binary_get_directory(script);
+}
+
 int sieve_script_setup_bindir
 (struct sieve_script *script, mode_t mode)
 {
diff --git a/src/lib-sieve/sieve-script.h b/src/lib-sieve/sieve-script.h
index 74c02b823b4d9110d3a59c6d6b8675e5674d607c..eb2dc73f14ba645716fe0556eff2999e41ee546d 100644
--- a/src/lib-sieve/sieve-script.h
+++ b/src/lib-sieve/sieve-script.h
@@ -68,6 +68,9 @@ int sieve_script_binary_save
 	(struct sieve_script *script, struct sieve_binary *sbin, bool update,
 		enum sieve_error *error_r);
 
+const char *sieve_script_binary_get_directory
+	(struct sieve_script *script);
+
 /*
  * Stream management
  */