diff --git a/src/lib-sieve/sieve-binary.h b/src/lib-sieve/sieve-binary.h
index b118a6c501782da1066c3767cbc6d396ea8aeba9..dce5e49e96a99b4c554eb36a84c788854a878081 100644
--- a/src/lib-sieve/sieve-binary.h
+++ b/src/lib-sieve/sieve-binary.h
@@ -13,7 +13,7 @@
  */
 
 #define SIEVE_BINARY_VERSION_MAJOR     1
-#define SIEVE_BINARY_VERSION_MINOR     1
+#define SIEVE_BINARY_VERSION_MINOR     2
 
 /*
  * Binary object
diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index 142c35530bcc35cbf9e747676841e2fd0270830f..1f70cce5077243b89234d2d5a1f7be2c49a57ab5 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -338,6 +338,7 @@ int sieve_script_binary_read_metadata
 {
 	struct sieve_binary *sbin = sieve_binary_block_get_binary(sblock);
 	string_t *storage_class, *location;
+	unsigned int version;
 
 	if ( sieve_binary_block_get_size(sblock) - *offset == 0 )
 		return 0;
@@ -353,6 +354,23 @@ int sieve_script_binary_read_metadata
 	if ( strcmp(str_c(storage_class), script->driver_name) != 0 )
 		return 0;
 
+	/* version */
+	if ( !sieve_binary_read_unsigned(sblock, offset, &version) ) {
+		sieve_script_sys_error(script,
+			"Binary %s has invalid metadata for script %s: "
+			"Invalid version",
+			sieve_binary_path(sbin), sieve_script_location(script));
+		return -1;
+	}
+	if ( script->storage->version != version ) {
+		sieve_script_sys_debug(script,
+			"Binary %s was compiled with different version "
+			"of the `%s' script storage class (compiled v%d, expected v%d;"
+			"automatically fixed when re-compiled)", sieve_binary_path(sbin),
+			script->driver_name, version, script->storage->version);
+		return 0;
+	}
+
 	/* location */
 	if ( !sieve_binary_read_string(sblock, offset, &location) ) {
 		sieve_script_sys_error(script,
@@ -376,6 +394,7 @@ void sieve_script_binary_write_metadata
 (struct sieve_script *script, struct sieve_binary_block *sblock)
 {
 	sieve_binary_emit_cstring(sblock, script->driver_name);
+	sieve_binary_emit_unsigned(sblock, script->storage->version);
 	sieve_binary_emit_cstring(sblock,
 		( script->location == NULL ? "" : script->location ));
 
diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index 16352843368204f260eb4bf2d766085b804fc4c9..5fd7787a61eece76766aeb610b1d831aa44f5b54 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -93,6 +93,8 @@ struct sieve_storage {
 	struct sieve_instance *svinst;
 
 	const char *driver_name;
+	unsigned int version;
+
 	const struct sieve_storage *storage_class;
 	struct sieve_storage_vfuncs v;
 
diff --git a/src/lib-sieve/storage/dict/sieve-dict-storage.c b/src/lib-sieve/storage/dict/sieve-dict-storage.c
index c89bee0edaba0a7a5f2d46daa356b967452dec9f..c859214ed469b402d63f9661f62503e5a5fd5ab6 100644
--- a/src/lib-sieve/storage/dict/sieve-dict-storage.c
+++ b/src/lib-sieve/storage/dict/sieve-dict-storage.c
@@ -166,6 +166,7 @@ int sieve_dict_storage_active_script_get_name
 
 const struct sieve_storage sieve_dict_storage = {
 	.driver_name = SIEVE_DICT_STORAGE_DRIVER_NAME,
+	.version = 0,
 	.v = {
 		.alloc = sieve_dict_storage_alloc,
 		.destroy = sieve_dict_storage_destroy,
diff --git a/src/lib-sieve/storage/file/sieve-file-storage.c b/src/lib-sieve/storage/file/sieve-file-storage.c
index 2b7bf7461b7970d7a4d113d3ce17d8ebdfe2359a..b4c382a098b06b12229780d18a35074fe499ec6b 100644
--- a/src/lib-sieve/storage/file/sieve-file-storage.c
+++ b/src/lib-sieve/storage/file/sieve-file-storage.c
@@ -640,6 +640,7 @@ static struct sieve_script *sieve_file_storage_get_script
 
 const struct sieve_storage sieve_file_storage = {
 	.driver_name = SIEVE_FILE_STORAGE_DRIVER_NAME,
+	.version = 0,
 	.allows_synchronization = TRUE,
 	.v = {
 		.alloc = sieve_file_storage_alloc,
diff --git a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
index adc5076df9deecc928728d4472523e4419640e85..3b8474418b0ee5bd58d611d51e6d13a2edb90a13 100644
--- a/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
+++ b/src/lib-sieve/storage/ldap/sieve-ldap-storage.c
@@ -158,6 +158,7 @@ const struct sieve_storage sieve_ldap_storage = {
 const struct sieve_storage sieve_ldap_storage_plugin = {
 #endif
 	.driver_name = SIEVE_LDAP_STORAGE_DRIVER_NAME,
+	.version = 0,
 	.v = {
 		.alloc = sieve_ldap_storage_alloc,
 		.init = sieve_ldap_storage_init,