Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.161
diff -u -p -r1.161 install.php
--- install.php	25 Mar 2009 16:40:51 -0000	1.161
+++ install.php	2 Apr 2009 13:07:18 -0000
@@ -185,7 +185,8 @@ function install_verify_settings() {
     include_once DRUPAL_ROOT . '/includes/form.inc';
 
     $database = $databases['default']['default'];
-    $settings_file = './' . conf_path(FALSE, TRUE) . '/settings.php';
+    drupal_static_reset('conf_path');
+    $settings_file = './' . conf_path(FALSE) . '/settings.php';
 
     $form_state = array();
     _install_settings_form_validate($database, $settings_file, $form_state);
@@ -202,7 +203,8 @@ function install_verify_settings() {
 function install_change_settings($profile = 'default', $install_locale = '') {
   global $databases, $db_prefix;
 
-  $conf_path = './' . conf_path(FALSE, TRUE);
+  drupal_static_reset('conf_path');
+  $conf_path = './' . conf_path(FALSE);
   $settings_file = $conf_path . '/settings.php';
   $database = isset($databases['default']['default']) ? $databases['default']['default'] : array();
 
Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.272
diff -u -p -r1.272 bootstrap.inc
--- includes/bootstrap.inc	18 Mar 2009 09:21:21 -0000	1.272
+++ includes/bootstrap.inc	2 Apr 2009 13:07:19 -0000
@@ -360,7 +360,7 @@ function timer_stop($name) {
  *   The path of the matching directory.
  */
 function conf_path($require_settings = TRUE, $reset = FALSE) {
-  static $conf = '';
+  $conf = &drupal_static(__FUNCTION__, '');
 
   if ($conf && !$reset) {
     return $conf;
@@ -558,7 +558,7 @@ function conf_init() {
  *   The filename of the requested item.
  */
 function drupal_get_filename($type, $name, $filename = NULL) {
-  static $files = array();
+  $files = &drupal_static(__FUNCTION__, array());
 
   if (!isset($files[$type])) {
     $files[$type] = array();
@@ -727,7 +727,7 @@ function page_get_cache($retrieve) {
  *   TRUE if the item is loaded or has already been loaded.
  */
 function drupal_load($type, $name) {
-  static $files = array();
+  $files = &drupal_static(__FUNCTION__, array());
 
   if (isset($files[$type][$name])) {
     return TRUE;
@@ -1093,7 +1093,19 @@ function drupal_anonymous_user($session 
  *     DRUPAL_BOOTSTRAP_FULL: Drupal is fully loaded, validate and fix input data.
  */
 function drupal_bootstrap($phase = NULL) {
-  static $phases = array(DRUPAL_BOOTSTRAP_CONFIGURATION, DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE, DRUPAL_BOOTSTRAP_DATABASE, DRUPAL_BOOTSTRAP_ACCESS, DRUPAL_BOOTSTRAP_SESSION, DRUPAL_BOOTSTRAP_VARIABLES, DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE, DRUPAL_BOOTSTRAP_LANGUAGE, DRUPAL_BOOTSTRAP_PATH, DRUPAL_BOOTSTRAP_FULL), $completed_phase = -1;
+  $phases = &drupal_static(__FUNCTION__ . '_phases', array(
+    DRUPAL_BOOTSTRAP_CONFIGURATION,
+    DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE,
+    DRUPAL_BOOTSTRAP_DATABASE,
+    DRUPAL_BOOTSTRAP_ACCESS,
+    DRUPAL_BOOTSTRAP_SESSION,
+    DRUPAL_BOOTSTRAP_VARIABLES,
+    DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE,
+    DRUPAL_BOOTSTRAP_LANGUAGE,
+    DRUPAL_BOOTSTRAP_PATH,
+    DRUPAL_BOOTSTRAP_FULL,
+  ));
+  $completed_phase = &drupal_static(__FUNCTION__ . '_completed_phase', -1);
 
   if (isset($phase)) {
     while ($phases && $phase > $completed_phase) {
@@ -1251,7 +1263,9 @@ function drupal_maintenance_theme() {
  */
 function get_t() {
   static $t;
-  if (is_null($t)) {
+  // This is not converted to drupal_static because there is no point in
+  // resetting this as it can not change in the course of a request.
+  if (!isset($t)) {
     $t = function_exists('install_main') ? 'st' : 't';
   }
   return $t;
@@ -1278,16 +1292,9 @@ function drupal_init_language() {
  * Get a list of languages set up indexed by the specified key
  *
  * @param $field The field to index the list with.
- * @param $reset Boolean to request a reset of the list.
  */
-function language_list($field = 'language', $reset = FALSE) {
-  static $languages = NULL;
-
-  // Reset language list
-  if ($reset) {
-    $languages = NULL;
-  }
-
+function language_list($field = 'language') {
+  $languages = &drupal_static(__FUNCTION__);
   // Init language list
   if (!isset($languages)) {
     if (variable_get('language_count', 1) > 1 || module_exists('locale')) {
@@ -1333,16 +1340,14 @@ function language_default($property = NU
  * the proxy server, and not the client's. If Drupal is run in a cluster
  * we use the X-Cluster-Client-Ip header instead.
  *
- * @param $reset
- *   Reset the current IP address saved in static.
  * @return
  *   IP address of client machine, adjusted for reverse proxy and/or cluster
  *   environments.
  */
-function ip_address($reset = FALSE) {
-  static $ip_address = NULL;
+function ip_address() {
+  $ip_address = &drupal_static(__FUNCTION__);
 
-  if (!isset($ip_address) || $reset) {
+  if (!isset($ip_address)) {
     $ip_address = $_SERVER['REMOTE_ADDR'];
 
     if (variable_get('reverse_proxy', 0)) {
@@ -1616,3 +1621,55 @@ function registry_rebuild() {
 /**
  * @} End of "ingroup registry".
  */
+
+/**
+ * Central static variable storage.
+ *
+ * @param $name
+ *   Globally unique name for the variable. For a function with only one static,
+ *   variable, the function name (e.g. via the PHP magic __FUNCTION__ constant)
+ *   is recommended. For a function with multiple static variables add a 
+ *   distinguishing suffix to the function name for each one.
+ * @param $default_value
+ *   Optional default value.
+ * @param $reset
+ *   TRUE to reset a specific named variable, or all variables if $name is NULL.
+ *   Resetting every variable should only be used, for example, for running
+ *   unit tests with a clean environment. Should be used only though via
+ *   function drupal_static_reset().
+ *
+ * @return
+ *   Returns a variable by reference if $reset is FALSE.
+ */
+function &drupal_static($name, $default_value = NULL, $reset = FALSE) {
+  static $data = array();
+
+  // Reset a single value, or all values.
+  if ($reset) {
+    if (isset($name)) {
+      unset($data[$name]);
+    }
+    else {
+      $data = array();
+    }
+    // We must return a reference to a variable.
+    $dummy = NULL;
+    return $dummy;
+  }
+
+  if (!isset($data[$name])) {
+    $data[$name] = $default_value;
+  }
+
+  return $data[$name];
+}
+
+/**
+ * Reset one or all centrally stored static variable(s).
+ *
+ * @param $name
+ *   Name of the static variable to reset. Omit to reset all variables.
+ */
+function drupal_static_reset($name = NULL) {
+  drupal_static($name, NULL, TRUE);
+}
Index: includes/install.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.inc,v
retrieving revision 1.86
diff -u -p -r1.86 install.inc
--- includes/install.inc	1 Mar 2009 09:32:17 -0000	1.86
+++ includes/install.inc	2 Apr 2009 13:07:20 -0000
@@ -335,7 +335,8 @@ abstract class DatabaseInstaller {
  */
 function drupal_rewrite_settings($settings = array(), $prefix = '') {
   $default_settings = 'sites/default/default.settings.php';
-  $settings_file = conf_path(FALSE, TRUE) . '/' . $prefix . 'settings.php';
+  drupal_static_reset('conf_path');
+  $settings_file = conf_path(FALSE) . '/' . $prefix . 'settings.php';
 
   // Build list of setting names and insert the values into the global namespace.
   $keys = array();
Index: includes/locale.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/locale.inc,v
retrieving revision 1.209
diff -u -p -r1.209 locale.inc
--- includes/locale.inc	31 Mar 2009 02:02:21 -0000	1.209
+++ includes/locale.inc	2 Apr 2009 13:07:21 -0000
@@ -32,7 +32,8 @@ define('LOCALE_IMPORT_KEEP', 1);
  * User interface for the language overview screen.
  */
 function locale_languages_overview_form() {
-  $languages = language_list('language', TRUE);
+  drupal_static_reset('language');
+  $languages = language_list('language');
 
   $options = array();
   $form['weight'] = array('#tree' => TRUE);
@@ -515,7 +516,8 @@ function locale_languages_configure_form
  * Overview screen for translations.
  */
 function locale_translate_overview_screen() {
-  $languages = language_list('language', TRUE);
+  drupal_static_reset('language_list');
+  $languages = language_list('language');
   $groups = module_invoke_all('locale', 'groups');
 
   // Build headers with all groups in order.
@@ -577,7 +579,8 @@ function locale_translation_filters() {
   $filters = array();
 
   // Get all languages, except English
-  $languages = locale_language_list('name', TRUE);
+  drupal_static_reset('language_list');
+  $languages = locale_language_list('name');
   unset($languages['en']);
 
   $filters['string'] = array(
@@ -699,7 +702,8 @@ function locale_translation_filter_form_
  */
 function locale_translate_import_form() {
   // Get all languages, except English
-  $names = locale_language_list('name', TRUE);
+  drupal_static_reset('language_list');
+  $names = locale_language_list('name');
   unset($names['en']);
 
   if (!count($names)) {
@@ -757,7 +761,8 @@ function locale_translate_import_form_su
   if ($file = file_save_upload('file')) {
 
     // Add language, if not yet supported
-    $languages = language_list('language', TRUE);
+    drupal_static_reset('language_list');
+    $languages = language_list('language');
     $langcode = $form_state['values']['langcode'];
     if (!isset($languages[$langcode])) {
       include_once DRUPAL_ROOT . '/includes/iso.inc';
@@ -796,7 +801,8 @@ function locale_translate_import_form_su
  */
 function locale_translate_export_screen() {
   // Get all languages, except English
-  $names = locale_language_list('name', TRUE);
+  drupal_static_reset('language_list');
+  $names = locale_language_list('name');
   unset($names['en']);
   $output = '';
   // Offer translation export if any language is set up.
Index: modules/forum/forum.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.test,v
retrieving revision 1.16
diff -u -p -r1.16 forum.test
--- modules/forum/forum.test	31 Mar 2009 01:49:52 -0000	1.16
+++ modules/forum/forum.test	2 Apr 2009 13:07:22 -0000
@@ -135,7 +135,8 @@ class ForumTestCase extends DrupalWebTes
     $this->assertRaw(t('Updated vocabulary %name.', array('%name' => $title)), t('Vocabulary was edited'));
 
     // Grab the newly edited vocabulary.
-    $current_settings = taxonomy_vocabulary_load($vid, TRUE);
+    drupal_static_reset('taxonomy_vocabulary_load_multiple');
+    $current_settings = taxonomy_vocabulary_load($vid);
 
     // Make sure we actually edited the vocabulary properly.
     $this->assertEqual($current_settings->name, $title, t('The name was updated'));
@@ -143,7 +144,8 @@ class ForumTestCase extends DrupalWebTes
 
     // Restore the original vocabulary.
     taxonomy_vocabulary_save($original_settings);
-    $current_settings = taxonomy_vocabulary_load($vid, TRUE);
+    drupal_static_reset('taxonomy_vocabulary_load');
+    $current_settings = taxonomy_vocabulary_load($vid);
     $this->assertEqual($current_settings->name, $original_settings->name, 'The original vocabulary settings were restored');
   }
 
Index: modules/simpletest/tests/bootstrap.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v
retrieving revision 1.13
diff -u -p -r1.13 bootstrap.test
--- modules/simpletest/tests/bootstrap.test	31 Mar 2009 01:49:53 -0000	1.13
+++ modules/simpletest/tests/bootstrap.test	2 Apr 2009 13:07:23 -0000
@@ -20,6 +20,8 @@ class BootstrapIPAddressTestCase extends
     $this->cluster_ip = '127.0.0.4';
     $this->untrusted_ip = '0.0.0.0';
 
+    drupal_static_reset('ip_address');
+
     $_SERVER['REMOTE_ADDR'] = $this->remote_ip;
     unset($_SERVER['HTTP_X_FORWARDED_FOR']);
     unset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']);
@@ -29,6 +31,7 @@ class BootstrapIPAddressTestCase extends
 
   function tearDown() {
     $_SERVER = $this->oldserver;
+    drupal_static_reset('ip_address');
     parent::tearDown();
   }
 
@@ -38,37 +41,40 @@ class BootstrapIPAddressTestCase extends
   function testIPAddressHost() {
     // Test the normal IP address.
     $this->assertTrue(
-      ip_address(true) == $this->remote_ip,
+      ip_address() == $this->remote_ip,
       t('Got remote IP address')
     );
 
     // Proxy forwarding on but no proxy addresses defined.
     variable_set('reverse_proxy', 1);
     $this->assertTrue(
-      ip_address(true) == $this->remote_ip,
+      ip_address() == $this->remote_ip,
       t('Proxy forwarding without trusted proxies got remote IP address')
     );
 
     // Proxy forwarding on and proxy address not trusted.
     variable_set('reverse_proxy_addresses', array($this->proxy_ip));
+    drupal_static_reset('ip_address');
     $_SERVER['REMOTE_ADDR'] = $this->untrusted_ip;
     $this->assertTrue(
-      ip_address(true) == $this->untrusted_ip,
+      ip_address() == $this->untrusted_ip,
       t('Proxy forwarding with untrusted proxy got remote IP address')
     );
 
     // Proxy forwarding on and proxy address trusted.
     $_SERVER['REMOTE_ADDR'] = $this->proxy_ip;
     $_SERVER['HTTP_X_FORWARDED_FOR'] = $this->forwarded_ip;
+    drupal_static_reset('ip_address');
     $this->assertTrue(
-      ip_address(true) == $this->forwarded_ip,
+      ip_address() == $this->forwarded_ip,
       t('Proxy forwarding with trusted proxy got forwarded IP address')
     );
 
     // Cluster environment.
     $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] = $this->cluster_ip;
+    drupal_static_reset('ip_address');
     $this->assertTrue(
-      ip_address(TRUE) == $this->cluster_ip,
+      ip_address() == $this->cluster_ip,
       t('Cluster environment got cluster client IP')
     );
     $this->assertFalse(drupal_valid_http_host('security/.drupal.org:80'), t('HTTP_HOST with / is invalid'));
Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.464
diff -u -p -r1.464 taxonomy.module
--- modules/taxonomy/taxonomy.module	30 Mar 2009 05:18:49 -0000	1.464
+++ modules/taxonomy/taxonomy.module	2 Apr 2009 13:07:24 -0000
@@ -227,6 +227,7 @@ function taxonomy_vocabulary_save($vocab
   }
 
   cache_clear_all();
+  drupal_static_reset('taxonomy_vocabulary_load_multiple');
 
   return $status;
 }
@@ -252,6 +253,7 @@ function taxonomy_vocabulary_delete($vid
   module_invoke_all('taxonomy', 'delete', 'vocabulary', $vocabulary);
 
   cache_clear_all();
+  drupal_static_reset('taxonomy_vocabulary_load_multiple');
 
   return SAVED_DELETED;
 }
@@ -361,6 +363,7 @@ function taxonomy_term_save($term) {
   }
 
   cache_clear_all();
+  taxonomy_terms_static_reset();
 
   return $status;
 }
@@ -404,11 +407,23 @@ function taxonomy_term_delete($tid) {
   }
 
   cache_clear_all();
-
+  taxonomy_terms_static_reset();
+  
   return SAVED_DELETED;
 }
 
 /**
+ * Clear all static cache variables for terms..
+ */
+function taxonomy_terms_static_reset() {
+  drupal_static_reset('taxonomy_term_count_nodes');
+  drupal_static_reset('taxonomy_get_tree');
+  drupal_static_reset('taxonomy_get_synonym_root');
+  drupal_static_reset('taxonomy_term_load_multiple');
+  drupal_static_reset('taxonomy_get_term_data');
+}
+
+/**
  * Generate a form element for selecting terms from a vocabulary.
  */
 function taxonomy_form($vid, $value = 0, $help = NULL, $name = 'taxonomy') {
@@ -452,9 +467,9 @@ function taxonomy_form_all($free_tags = 
  * @param $type
  *   If set, return only those vocabularies associated with this node type.
  */
-function taxonomy_get_vocabularies($type = NULL, $reset = FALSE) {
+function taxonomy_get_vocabularies($type = NULL) {
   $conditions = !empty($type) ? array('type' => $type) : NULL;
-  return taxonomy_vocabulary_load_multiple(array(), $conditions, $reset);
+  return taxonomy_vocabulary_load_multiple(array(), $conditions);
 }
 
 /**
@@ -616,7 +631,7 @@ function taxonomy_get_tids_from_nodes($n
  * Find all terms associated with the given node, ordered by vocabulary and term weight.
  */
 function taxonomy_node_get_terms($node, $key = 'tid') {
-  static $terms;
+  $terms = &drupal_static(__FUNCTION__);
 
   if (!isset($terms[$node->vid][$key])) {
     $result = db_query(db_rewrite_sql('SELECT t.* FROM {taxonomy_term_node} r INNER JOIN {taxonomy_term_data} t ON r.tid = t.tid INNER JOIN {taxonomy_vocabulary} v ON t.vid = v.vid WHERE r.vid = %d ORDER BY v.weight, t.weight, t.name', 't', 'tid'), $node->vid);
@@ -701,6 +716,7 @@ function taxonomy_node_type($op, $info) 
   elseif ($op == 'delete') {
     db_query("DELETE FROM {taxonomy_vocabulary_node_type} WHERE type = '%s'", $info->type);
   }
+  drupal_static_reset('taxonomy_term_count_nodes');
 }
 
 /**
@@ -780,9 +796,6 @@ function taxonomy_get_children($tid, $vi
  *   for the entire vocabulary.
  * @param $max_depth
  *   The number of levels of the tree to return. Leave NULL to return all levels.
- * @param $reset
- *   Whether to reset the static cache, you should only use this if
- *   updating and loading term hierarchies during a page request.
  * @param $depth
  *   Internal use only.
  *
@@ -791,12 +804,10 @@ function taxonomy_get_children($tid, $vi
  *   to have "depth" and "parents" attributes in addition to its normal ones.
  *   Results are statically cached.
  */
-function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $reset = FALSE, $depth = -1) {
-  static $children, $parents, $terms;
-
-  if ($reset) {
-    $children = $parents = $terms = array();
-  }
+function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $depth = -1) {
+  $children = &drupal_static(__FUNCTION__, array());
+  $parents = &drupal_static(__FUNCTION__ . 'parents', array());
+  $terms = &drupal_static(__FUNCTION__ . 'terms', array());
 
   $depth++;
 
@@ -804,6 +815,8 @@ function taxonomy_get_tree($vid, $parent
   // and its children, too.
   if (!isset($children[$vid])) {
     $children[$vid] = array();
+    $parents[$vid] = array();
+    $terms[$vid] = array();
 
     $result = db_query(db_rewrite_sql('SELECT t.tid, t.*, parent FROM {taxonomy_term_data} t INNER JOIN {taxonomy_term_hierarchy} h ON t.tid = h.tid WHERE t.vid = %d ORDER BY weight, name', 't', 'tid'), $vid);
     while ($term = db_fetch_object($result)) {
@@ -826,7 +839,7 @@ function taxonomy_get_tree($vid, $parent
         $tree[] = $term;
 
         if (!empty($children[$vid][$child])) {
-          $tree = array_merge($tree, taxonomy_get_tree($vid, $child, $max_depth, $reset, $depth));
+          $tree = array_merge($tree, taxonomy_get_tree($vid, $child, $max_depth, $depth));
         }
       }
     }
@@ -857,17 +870,11 @@ function taxonomy_get_synonyms($tid) {
  *
  * @param $synonym
  *   The string to compare against.
- * @param $reset
- *   Whether to reset the internal cache for this synonym.
  * @return
  *   A term object, or FALSE if no matching term is found.
  */
-function taxonomy_get_synonym_root($synonym, $reset = FALSE) {
-  static $synonyms = array();
-
-  if ($reset) {
-    unset($synonyms[$synonym]);
-  }
+function taxonomy_get_synonym_root($synonym) {
+  $synonyms = &drupal_static(__FUNCTION__, array());
 
   if (!isset($synonyms[$synonym])) {
     $synonyms[$synonym] = db_query("SELECT * FROM {taxonomy_term_synonym} s, {taxonomy_term_data} t WHERE t.tid = s.tid AND s.name = :name", array(':name' => $synonym))->fetch();
@@ -883,26 +890,24 @@ function taxonomy_get_synonym_root($syno
  * @param $type
  *   (Optional) The $node->type. If given, taxonomy_term_count_nodes only counts
  *   nodes of $type that are classified with the term $tid.
- * @param $reset
- *   (Optional) Boolean to indicated whether to reset the internal cache.
  *
  * @return
  *   An integer representing a number of nodes.
  *   Results are statically cached.
  */
-function taxonomy_term_count_nodes($tid, $type = NULL, $reset = FALSE) {
-  static $count = array();
-  if ($reset) {
-    $count = array();
+function taxonomy_term_count_nodes($tid, $type = NULL) {
+  $count = &drupal_static(__FUNCTION__, array());
+  // Reset the taxonomy tree when first called (or if reset).
+  if (empty($count)) {
+    drupal_static_reset('taxonomy_get_tree');
   }
-
   // If $type is NULL, change it to 0 to allow it to be used as an array key
   // for the static cache.
   $type = empty($type) ? 0 : $type;
 
   if (!isset($count[$type][$tid])) {
     $term = taxonomy_term_load($tid);
-    $tree = taxonomy_get_tree($term->vid, $tid, NULL, $reset);
+    $tree = taxonomy_get_tree($term->vid, $tid, NULL);
     $tids = array($tid);
     foreach ($tree as $descendent) {
       $tids[] = $descendent->tid;
@@ -955,14 +960,12 @@ function taxonomy_get_term_by_name($name
  *  An array of taxonomy vocabulary IDs.
  * @param $conditions
  *  An array of conditions to add to the query.
- * @param $reset
- *  Whether to reset the internal cache.
  *
  * @return
  *  An array of vocabulary objects, indexed by vid.
  */
-function taxonomy_vocabulary_load_multiple($vids = array(), $conditions = array(), $reset = FALSE) {
-  static $vocabulary_cache = array();
+function taxonomy_vocabulary_load_multiple($vids = array(), $conditions = array()) {
+  $vocabulary_cache = &drupal_static(__FUNCTION__, array());
   // Node type associations are not stored in the vocabulary table, so remove
   // this from conditions into it's own variable.
   if (isset($conditions['type'])) {
@@ -970,10 +973,6 @@ function taxonomy_vocabulary_load_multip
     unset($conditions['type']);
   }
 
-  if ($reset) {
-    $vocabulary_cache = array();
-  }
-
   $vocabularies = array();
 
   // Create a new variable which is either a prepared version of the $vids
@@ -1087,15 +1086,12 @@ function taxonomy_vocabulary_load_multip
  * @param $vid
  *   The vocabulary's ID.
  *
- * @param $reset
- *   A boolean flag indicating whether to reset the internal cache.
- *
  * @return
  *   The vocabulary object with all of its metadata, if exists, FALSE otherwise.
  *   Results are statically cached.
  */
-function taxonomy_vocabulary_load($vid, $reset = FALSE) {
-  return reset(taxonomy_vocabulary_load_multiple(array($vid), array(), $reset));
+function taxonomy_vocabulary_load($vid) {
+  return reset(taxonomy_vocabulary_load_multiple(array($vid), array()));
 }
 
 /**
@@ -1120,18 +1116,12 @@ function taxonomy_terms_load($str_tids) 
  *  An array of taxonomy term IDs.
  * @param $conditions
  *  An array of conditions to add to the query.
- * @param $reset
- *  Whether to reset the internal cache.
  *
  * @return
  *  An array of term objects, indexed by tid.
  */
-function taxonomy_term_load_multiple($tids = array(), $conditions = array(), $reset = FALSE) {
-  static $term_cache = array();
-
-  if ($reset) {
-    $term_cache = array();
-  }
+function taxonomy_term_load_multiple($tids = array(), $conditions = array()) {
+  $term_cache = &drupal_static(__FUNCTION__, array());
 
   $terms = array();
 
@@ -1216,17 +1206,15 @@ function taxonomy_term_load_multiple($ti
  *
  * @param $tid
  *   A term's ID
- * @param $reset
- *   Whether to reset the static cache.
  *
  * @return
  *   A term object. Results are statically cached.
  */
-function taxonomy_term_load($tid, $reset = FALSE) {
+function taxonomy_term_load($tid) {
   if (!is_numeric($tid)) {
     return FALSE;
   }
-  $term = taxonomy_term_load_multiple(array($tid), array(), $reset);
+  $term = taxonomy_term_load_multiple(array($tid), array());
   return $term ? $term[$tid] : FALSE;
 }
 
@@ -1237,10 +1225,10 @@ function taxonomy_term_load($tid, $reset
  * @return Object
  *  A term object. Results are statically cached.
  */
-function taxonomy_get_term_data($tid, $reset = FALSE) {
-   static $terms = array();
+function taxonomy_get_term_data($tid) {
+   $terms = &drupal_static(__FUNCTION__, array());
 
-  if (!isset($terms[$tid]) || $reset) {
+  if (!isset($terms[$tid])) {
     $terms[$tid] = db_query('SELECT * FROM {taxonomy_term_data} WHERE tid = :tid', array(':tid' => $tid))->fetchObject();
   }
   return $terms[$tid];
@@ -1398,6 +1386,7 @@ function taxonomy_node_update($node) {
  */
 function taxonomy_node_delete($node) {
   db_query('DELETE FROM {taxonomy_term_node} WHERE nid = %d', $node->nid);
+  drupal_static_reset('taxonomy_term_count_nodes');
 }
 
 /**
@@ -1407,6 +1396,7 @@ function taxonomy_node_delete($node) {
  */
 function taxonomy_node_delete_revision($node) {
   db_query('DELETE FROM {taxonomy_term_node} WHERE vid = %d', $node->vid);
+  drupal_static_reset('taxonomy_term_count_nodes');
 }
 
 /**
Index: modules/taxonomy/taxonomy.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.test,v
retrieving revision 1.28
diff -u -p -r1.28 taxonomy.test
--- modules/taxonomy/taxonomy.test	31 Mar 2009 01:49:54 -0000	1.28
+++ modules/taxonomy/taxonomy.test	2 Apr 2009 13:07:24 -0000
@@ -151,7 +151,8 @@ class TaxonomyVocabularyFunctionalTest e
     // Check the created vocabulary.
     $vocabularies = taxonomy_get_vocabularies();
     $vid = $vocabularies[count($vocabularies)-1]->vid;
-    $vocabulary = taxonomy_vocabulary_load($vid, TRUE);
+    drupal_static_reset('taxonomy_vocabulary_load_multiple');
+    $vocabulary = taxonomy_vocabulary_load($vid);
     $this->assertTrue($vocabulary, t('Vocabulary found in database'));
 
     // Delete the vocabulary.
@@ -163,7 +164,8 @@ class TaxonomyVocabularyFunctionalTest e
     // Confirm deletion.
     $this->drupalPost(NULL, NULL, t('Delete'));
     $this->assertRaw(t('Deleted vocabulary %name.', array('%name' => $vocabulary->name)), t('Vocabulary deleted'));
-    $this->assertFalse(taxonomy_vocabulary_load($vid, TRUE), t('Vocabulary is not found in the database'));
+    drupal_static_reset('taxonomy_vocabulary_load_multiple');
+    $this->assertFalse(taxonomy_vocabulary_load($vid), t('Vocabulary is not found in the database'));
   }
 }
 
@@ -213,7 +215,7 @@ public static function getInfo() {
    * Ensure that the vocabulary static reset works correctly.
    */
   function testTaxonomyVocabularyLoadStaticReset() {
-    $original_vocabulary = taxonomy_vocabulary_load($this->vocabulary->vid, TRUE);
+    $original_vocabulary = taxonomy_vocabulary_load($this->vocabulary->vid);
     $this->assertTrue(is_object($original_vocabulary), t('Vocabulary loaded successfully'));
     $this->assertEqual($this->vocabulary->name, $original_vocabulary->name, t('Vocabulary loaded successfully'));
 
@@ -223,8 +225,8 @@ public static function getInfo() {
     $vocabulary->description = $this->randomName();
     taxonomy_vocabulary_save($vocabulary);
 
-    // Load the vocabulary with $reset TRUE.
-    $new_vocabulary = taxonomy_vocabulary_load($original_vocabulary->vid, TRUE);
+    // Load the vocabulary.
+    $new_vocabulary = taxonomy_vocabulary_load($original_vocabulary->vid);
     $this->assertEqual($new_vocabulary->name, $vocabulary->name);
     $this->assertEqual($new_vocabulary->name, $vocabulary->name);
 
@@ -316,7 +318,7 @@ class TaxonomyTermUnitTest extends Taxon
     $this->assertEqual(taxonomy_term_count_nodes($term2->tid), 1, t('Term has one valid node association.'));
 
     // Confirm that term3 is not associated with any nodes.
-    //$this->assertEqual(taxonomy_term_count_nodes($term3->tid), NULL, t('Term is not associated with any nodes'));
+    $this->assertEqual(taxonomy_term_count_nodes($term3->tid), 0, t('Term is not associated with any nodes'));
 
     // Set term3 as the parent of term1.
     $term1->parent = array($term3->tid);
@@ -326,29 +328,27 @@ class TaxonomyTermUnitTest extends Taxon
     $children = taxonomy_get_children($term3->tid);
     $this->assertTrue(isset($children[$term1->tid]), t('Term 3 saved as parent of term 1'));
 
-    // Reset the taxonomy_get_tree() static cache to avoid stale data, since
-    // the hierarchy has been updated during this page request.
-    $this->assertEqual(count(taxonomy_get_tree($term3->vid, $term3->tid, NULL, TRUE)), 1, t('Term 3 has one child term'));
+    $this->assertEqual(count(taxonomy_get_tree($term3->vid, $term3->tid)), 1, t('Term 3 has one child term'));
 
     // Confirm that term3's parental relationship with term1 leads to a
     // node assocation being counted.
-    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, NULL, TRUE), 1, t('Term has one valid node association due to child term.'));
+    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, NULL), 1, t('Term has one valid node association due to child term.'));
 
     // Set term3 as the parent of term2.
     $term2->parent = array($term3->tid);
     taxonomy_term_save($term2);
 
     // term3 should now have two node associations counted.
-    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, NULL, TRUE), 2, t('Term has two valid node associations due to child terms.'));
+    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, NULL), 2, t('Term has two valid node associations due to child terms.'));
 
     // Save node1 with both child taxonomy terms, this should still result
     // in term3 having two node associations.
     $node1->taxonomy = array($term1->tid, $term2->tid);
     node_save($node1);
-    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, NULL, TRUE), 2, t('Term has two valid node associations.'));
+    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, NULL), 2, t('Term has two valid node associations.'));
 
     // Confirm that the node type argument returns a single node association.
-    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, 'page', TRUE), 1, t("Term is associated with one node of type 'page'."));
+    $this->assertEqual(taxonomy_term_count_nodes($term3->tid, 'page'), 1, t("Term is associated with one node of type 'page'."));
   }
 }
 
@@ -608,11 +608,11 @@ class TaxonomyLoadMultipleUnitTest exten
     // Remove one term from the array, then delete it.
     $deleted = array_shift($terms3);
     taxonomy_term_delete($deleted->tid);
-    $deleted_term = taxonomy_term_load($deleted->tid, TRUE);
+    $deleted_term = taxonomy_term_load($deleted->tid);
     $this->assertFalse($deleted_term);
 
     // Load terms from the vocabulary by vid.
-    $terms4 = taxonomy_term_load_multiple(NULL, array('vid' => $vocabulary->vid), TRUE);
+    $terms4 = taxonomy_term_load_multiple(NULL, array('vid' => $vocabulary->vid));
     $this->assertTrue(count($terms4 == 4), t('Correct number of terms were loaded.'));
     $this->assertFalse(isset($terms4[$deleted->tid]));
 
@@ -669,7 +669,8 @@ class TaxonomyHooksTestCase extends Drup
       'antonyms' => 'Short',
     );
     $this->drupalPost('taxonomy/term/' . $term->tid . '/edit', $edit, t('Save'));
-    $term = taxonomy_term_load($term->tid, TRUE);
+    taxonomy_terms_static_reset();
+    $term = taxonomy_term_load($term->tid);
     $this->assertTrue(in_array($edit['antonyms'], $term->antonyms), t('Antonym was successfully edited'));
 
     // Delete the term.
Index: modules/translation/translation.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/translation/translation.test,v
retrieving revision 1.10
diff -u -p -r1.10 translation.test
--- modules/translation/translation.test	31 Mar 2009 02:02:23 -0000	1.10
+++ modules/translation/translation.test	2 Apr 2009 13:07:24 -0000
@@ -100,7 +100,9 @@ class TranslationTestCase extends Drupal
       $edit['langcode'] = $language_code;
       $this->drupalPost('admin/international/language/add', $edit, t('Add language'));
 
-      $languages = language_list('language', TRUE); // Make sure we're not using a stale list.
+      // Make sure we're not using a stale list.
+      drupal_static_reset('language_list');
+      $languages = language_list('language');
       $this->assertTrue(array_key_exists($language_code, $languages), t('Language was installed successfully.'));
 
       if (array_key_exists($language_code, $languages)) {
