diff --git a/modules/taxonomy/taxonomy.api.php b/modules/taxonomy/taxonomy.api.php
index c66ccdfb1de8d45e657a4391e2f1046b65d15f98..6ceab8f80ae9f98a6da7d060036e8ba516c6fa4f 100644
--- a/modules/taxonomy/taxonomy.api.php
+++ b/modules/taxonomy/taxonomy.api.php
@@ -26,6 +26,20 @@ function hook_taxonomy_vocabulary_load($vocabularies) {
   }
 }
 
+
+/**
+ * Act on taxonomy vocabularies before they are saved.
+ *
+ * Modules implementing this hook can act on the vocabulary object before it is
+ * inserted or updated.
+ *
+ * @param $vocabulary
+ *   A taxonomy vocabulary object.
+ */
+function hook_taxonomy_vocabulary_presave($vocabulary) {
+  $vocabulary->foo = 'bar';
+}
+
 /**
  * Act on taxonomy vocabularies when inserted.
  *
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index 8d25355f02be7c1c96378f24052d2ff9c4aa0a0b..a4bb1de84485f038bf4d6ffd881719f204eed300 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -375,6 +375,8 @@ function taxonomy_vocabulary_save($vocabulary) {
     $vocabulary->module = 'taxonomy';
   }
 
+  module_invoke_all('taxonomy_vocabulary_presave', $vocabulary);
+
   if (!empty($vocabulary->vid) && !empty($vocabulary->name)) {
     $status = drupal_write_record('taxonomy_vocabulary', $vocabulary, 'vid');
     module_invoke_all('taxonomy_vocabulary_update', $vocabulary);