diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-script.c b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
index 7c7dc67c7e1cadacb130e166f410f2df6227e84a..affe5898597278535b262998d931a663825dbd59 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-script.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-script.c
@@ -125,17 +125,26 @@ static int sieve_ldap_script_binary_read_metadata
 {
 	struct sieve_ldap_script *lscript =
 		(struct sieve_ldap_script *)script;
+	struct sieve_ldap_storage *lstorage =
+		(struct sieve_ldap_storage *)script->storage;		
 	struct sieve_binary *sbin =
 		sieve_binary_block_get_binary(sblock);
 	string_t *dn, *modattr;
 
+	/* config file changed? */
+	if ( sieve_binary_mtime(sbin) <= lstorage->set_mtime )
+		return 0;
+
+	/* open script if not open already */
 	if ( lscript->dn == NULL &&
 		sieve_script_open(script, NULL) < 0 )
 		return 0;
 
+	/* if modattr not found recompile always */
 	if ( lscript->modattr == NULL || *lscript->modattr == '\0' )
 		return 0;
 
+	/* compare DN in binary and from search result */
 	if ( !sieve_binary_read_string(sblock, offset, &dn) ) {
 		sieve_script_sys_error(script,
 			"Binary `%s' has invalid metadata for script `%s': "
@@ -147,6 +156,7 @@ static int sieve_ldap_script_binary_read_metadata
 	if ( strcmp(str_c(dn), lscript->dn) != 0 )
 		return 0;
 
+	/* compare modattr in binary and from search result */
 	if ( !sieve_binary_read_string(sblock, offset, &modattr) ) {
 		sieve_script_sys_error(script,
 			"Binary `%s' has invalid metadata for script `%s': "
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
index 548d2530f02dffd1a8a5fd50f4ecb261768d2081..040eb1b686080a5e6d99dc1661b9c8c66048b188 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c
@@ -15,6 +15,10 @@
 
 #include "sieve-ldap-db.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #define DEF_STR(name) DEF_STRUCT_STR(name, sieve_ldap_storage_settings)
 #define DEF_INT(name) DEF_STRUCT_INT(name, sieve_ldap_storage_settings)
 #define DEF_BOOL(name) DEF_STRUCT_BOOL(name, sieve_ldap_storage_settings)
@@ -87,8 +91,18 @@ int sieve_ldap_storage_read_settings
 {
 	struct sieve_storage *storage = &lstorage->storage;
 	const char *str, *error;
+	struct stat st;
+
+	if ( stat(config_path, &st) < 0 ) {
+		sieve_storage_sys_error(storage,
+			"Failed to read LDAP storage config: "
+			"stat(%s) failed: %m", config_path);
+		return -1;
+	}
 
 	lstorage->set = default_settings;
+	lstorage->set_mtime = st.st_mtime;
+	
 	if (!settings_read_nosection
 		(config_path, parse_setting, lstorage, &error)) {
 		sieve_storage_set_critical(storage,
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
index fbd9aa90664ce654340536474b6372a5ffdc3196..5ddbc5a4437dfc84928b0968abbf4a31068bfa94 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.h
@@ -64,7 +64,9 @@ int sieve_ldap_storage_read_settings
 
 struct sieve_ldap_storage {
 	struct sieve_storage storage;
+
 	struct sieve_ldap_storage_settings set;
+	time_t set_mtime;
 
 	const char *username; // FIXME: needed?