? modules/book/book.js
? modules/comment/comment-node-form.js
? modules/menu/menu.js
? modules/node/node.js
? modules/path/path.js
? modules/upload/upload.js
Index: install.php
===================================================================
RCS file: /cvs/drupal/drupal/install.php,v
retrieving revision 1.166
diff -u -p -r1.166 install.php
--- install.php	27 Apr 2009 20:19:34 -0000	1.166
+++ install.php	29 Apr 2009 14:08:47 -0000
@@ -618,7 +618,7 @@ function install_already_done_error() {
  * Tasks performed after the database is initialized.
  */
 function install_tasks($profile, $task) {
-  global $base_url, $install_locale;
+  global $base_url, $install_locale, $conf;
 
   // Bootstrap newly installed Drupal, while preserving existing messages.
   $messages = isset($_SESSION['messages']) ? $_SESSION['messages'] : '';
@@ -697,15 +697,16 @@ function install_tasks($profile, $task) 
   }
 
   if ($task == 'configure') {
-    if (variable_get('site_name', FALSE) || variable_get('site_mail', FALSE)) {
+    // We need to check if a variable has been saved, because variable_get
+    // returns a different default value than we need here.
+    if (isset($conf['site_name']) || isset($conf['site_email'])) {
       // Site already configured: This should never happen, means re-running
       // the installer, possibly by an attacker after the 'install_task' variable
       // got accidentally blown somewhere. Stop it now.
       install_already_done_error();
     }
     $form = drupal_get_form('install_configure_form', $url);
-
-    if (!variable_get('site_name', FALSE) && !variable_get('site_mail', FALSE)) {
+    if (!isset($conf['site_name']) && !isset($conf['site_email'])) {
       // Not submitted yet: Prepare to display the form.
       $output = $form;
       drupal_set_title(st('Configure site'));
Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.277
diff -u -p -r1.277 bootstrap.inc
--- includes/bootstrap.inc	24 Apr 2009 08:15:50 -0000	1.277
+++ includes/bootstrap.inc	29 Apr 2009 14:08:52 -0000
@@ -625,14 +625,16 @@ function variable_init($conf = array()) 
  * @param $name
  *   The name of the variable to return.
  * @param $default
- *   The default value to use if this variable has never been set.
+ *   The default value for dynamic variables. Static variables defaults should
+ *   be declared in hook_variable_info().
  * @return
  *   The value of the variable.
  */
 function variable_get($name, $default = NULL) {
   global $conf;
 
-  return isset($conf[$name]) ? $conf[$name] : $default;
+  $value = isset($conf[$name]) ? $conf[$name] : variable_default($name);
+  return !is_null($value) ? $value : $default;
 }
 
 /**
@@ -643,15 +645,89 @@ function variable_get($name, $default = 
  * @param $value
  *   The value to set. This can be any PHP data type; these functions take care
  *   of serialization as necessary.
+ * @return
+ *   The value of the variable.
  */
 function variable_set($name, $value) {
   global $conf;
 
-  db_merge('variable')->key(array('name' => $name))->fields(array('value' => serialize($value)))->execute();
-
+  // Do not store default values in the database.
+  if ($value === variable_default($name)) {
+    variable_del($name);
+  }
+  else {
+    db_merge('variable')
+      ->key(array('name' => $name))
+      ->fields(array('value' => serialize($value)))
+      ->execute();
+  }
+  // Clear the cache and reset the variable.
   cache_clear_all('variables', 'cache');
 
-  $conf[$name] = $value;
+  return $conf[$name] = $value;
+}
+
+/**
+ * Gets the default value for a given variable.
+ *
+ * @param $name
+ *   The name of the variable in question.
+ * @return
+ *   The default value for that variable, to be used in case no value is set.
+ */
+function variable_default($name) {
+  $defaults = &drupal_static(__FILE__, array());
+  $loaded = &drupal_static(__FILE__ . ':loaded', FALSE);
+  $built = &drupal_static(__FILE__ . ':built', FALSE);
+
+  if (empty($defaults)) {
+    $built = FALSE;
+    // These variables need to be initialized here because they are required to
+    // exist before the database is set up and the variable system initialized.
+    $defaults['cache_inc'] = './includes/cache.inc';
+    $defaults['page_cache_fastpath'] = FALSE;
+    $defaults['blocked_ips'] = NULL;
+    $defaults['session_inc'] = './includes/session.inc';
+    $defaults['dev_query'] = 0;
+    $defaults['reverse_proxy'] = 0;
+    $defaults['reverse_proxy_addresses'] = array();
+    $defaults['cache'] = CACHE_DISABLED;
+    $defaults['cache_flush'] = 0;
+    $defaults['language_count'] = 1;
+    $defaults['session_write_interval'] = 180;
+    $defaults['site_frontpage'] = 'node';
+    $defaults['install_profile_modules'] = array();
+    $defaults['install_locale_batch_components'] = array();
+    $defaults['password_inc'] = './includes/password.inc';
+    $defaults['field_storage_module'] = 'field_sql_storage';
+    $defaults['language_default'] = (object) array('language' => 'en', 'name' => 'English', 'native' => 'English', 'direction' => 0, 'enabled' => 1, 'plurals' => 0, 'formula' => '', 'domain' => '', 'prefix' => '', 'weight' => 0, 'javascript' => '');
+  }
+  // We can only retrieve from the cache if the cache is available.
+  if (($loaded === FALSE) && function_exists('cache_get') && function_exists('db_query')) {
+    // Only try to load from cache once, set $loaded to TRUE.
+    $loaded = TRUE;
+    if (!defined('MAINTENANCE_MODE') && $cache = cache_get('variable_defaults') && !empty($cache->data)) {
+      $defaults = $cache->data;
+    }
+  }
+  // We use function_exists() here, because the registry may not be available early on in the page process.
+  if (($built === FALSE) && !isset($defaults[$name]) && function_exists('module_invoke_all') && function_exists('drupal_alter') && (!defined('MAINTENANCE_MODE') || MAINTENANCE_MODE != 'update')) {
+    // already set $built to prevent loops
+    $built = TRUE;
+
+    // Construct the default variables registry by invoking hook_variable_info() and hook_variable_info_alter().
+    $defaults += module_invoke_all('variable_info');
+    drupal_alter('variable_info', $defaults);
+
+    // We now have the full variables defaults, so save them to the cache, unless we are in maintenaince mode.
+    if (!defined('MAINTENANCE_MODE')) {
+      cache_set('variable_defaults', $defaults, 'cache');
+    }
+  }
+  if (array_key_exists($name, $defaults)) {
+    return $defaults[$name];
+  }
+  return NULL;
 }
 
 /**
Index: includes/password.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/password.inc,v
retrieving revision 1.6
diff -u -p -r1.6 password.inc
--- includes/password.inc	26 Feb 2009 07:30:26 -0000	1.6
+++ includes/password.inc	29 Apr 2009 14:08:52 -0000
@@ -15,23 +15,6 @@
  */
 
 /**
- * The standard log2 number of iterations for password stretching. This should
- * increase by 1 at least every other Drupal version in order to counteract
- * increases in the speed and power of computers available to crack the hashes.
- */
-define('DRUPAL_HASH_COUNT', 14);
-
-/**
- * The minimum allowed log2 number of iterations for password stretching.
- */
-define('DRUPAL_MIN_HASH_COUNT', 7);
-
-/**
- * The maximum allowed log2 number of iterations for password stretching.
- */
-define('DRUPAL_MAX_HASH_COUNT', 30);
-
-/**
  * Returns a string for mapping an int to the corresponding base 64 character.
  */
 function _password_itoa64() {
Index: modules/aggregator/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v
retrieving revision 1.406
diff -u -p -r1.406 aggregator.module
--- modules/aggregator/aggregator.module	26 Apr 2009 19:59:31 -0000	1.406
+++ modules/aggregator/aggregator.module	29 Apr 2009 14:08:54 -0000
@@ -30,6 +30,20 @@ function aggregator_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function aggregator_variable_info() {
+  return array(
+    'aggregator_allowed_html_tags' => '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>',
+    'aggregator_category_selector' => 'checkboxes',
+    'aggregator_clear' => 9676800,
+    'aggregator_summary_items' => 3,
+    'feed_default_items' => 10,
+    'feed_item_length' => 'teaser',
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function aggregator_theme() {
Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.329
diff -u -p -r1.329 block.module
--- modules/block/block.module	26 Apr 2009 16:30:28 -0000	1.329
+++ modules/block/block.module	29 Apr 2009 14:08:57 -0000
@@ -88,6 +88,15 @@ function block_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function block_variable_info() {
+  return array(
+    'block_cache' => CACHE_DISABLED,
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function block_theme() {
Index: modules/blogapi/blogapi.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/blogapi/blogapi.module,v
retrieving revision 1.149
diff -u -p -r1.149 blogapi.module
--- modules/blogapi/blogapi.module	26 Apr 2009 09:14:31 -0000	1.149
+++ modules/blogapi/blogapi.module	29 Apr 2009 14:08:59 -0000
@@ -21,6 +21,25 @@ function blogapi_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function blogapi_variable_info() {
+  return array(
+    'blogapi_node_types' => blogapi_node_types_default(),
+  );
+}
+
+/**
+ * Returns the default value for the node types listing.
+ */
+function blogapi_node_types_default() {
+  if (node_get_types('type', 'blog')) {
+    return array('blog' => 1);
+  }
+  return array();
+}
+
+/**
  * Implementation of hook_perm().
  */
 function blogapi_perm() {
Index: modules/book/book.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.module,v
retrieving revision 1.491
diff -u -p -r1.491 book.module
--- modules/book/book.module	27 Apr 2009 07:08:00 -0000	1.491
+++ modules/book/book.module	29 Apr 2009 14:09:03 -0000
@@ -164,6 +164,17 @@ function book_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function book_variable_info() {
+  return array(
+    'book_allowed_types' => array('book'),
+    'book_block_mode' => 'all pages',
+    'book_child_type' => 'book',
+  );
+}
+
+/**
  * Menu item access callback - determine if the outline tab is accessible.
  */
 function _book_outline_access($node) {
Index: modules/color/color.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/color/color.module,v
retrieving revision 1.57
diff -u -p -r1.57 color.module
--- modules/color/color.module	20 Apr 2009 20:02:31 -0000	1.57
+++ modules/color/color.module	29 Apr 2009 14:09:04 -0000
@@ -28,6 +28,19 @@ function color_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function color_variable_info() {
+  return array(
+    'color_screenshot' => NULL,
+    'color_stylesheets' => array(),
+    'color_logo' => NULL,
+    'color_palette' => array(),
+    'color_files' => array(),
+  );
+}
+
+/**
  * Implementation of hook_form_FORM_ID_alter().
  */
 function color_form_system_theme_settings_alter(&$form, &$form_state) {
Index: modules/comment/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v
retrieving revision 1.706
diff -u -p -r1.706 comment.module
--- modules/comment/comment.module	27 Apr 2009 07:09:58 -0000	1.706
+++ modules/comment/comment.module	29 Apr 2009 14:09:16 -0000
@@ -214,6 +214,22 @@ function comment_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function comment_variable_info() {
+  return array(
+    'comment_block_count' => 10,
+    'node_cron_comments_scale' => 0,
+    'comment_default_mode' => COMMENT_MODE_THREADED_EXPANDED,
+    'comment_default_per_page' => 50,
+    'comment_anonymous' => COMMENT_ANONYMOUS_MAYNOT_CONTACT,
+    'comment_subject_field' => 1,
+    'comment_preview' => COMMENT_PREVIEW_REQUIRED,
+    'comment_form_location' => COMMENT_FORM_SEPARATE_PAGE,
+  );
+}
+
+/**
  * Implementation of hook_node_type().
  */
 function comment_node_type($op, $info) {
Index: modules/contact/contact.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v
retrieving revision 1.112
diff -u -p -r1.112 contact.module
--- modules/contact/contact.module	8 Mar 2009 05:08:22 -0000	1.112
+++ modules/contact/contact.module	29 Apr 2009 14:09:17 -0000
@@ -112,6 +112,17 @@ function contact_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function contact_variable_info() {
+  return array(
+    'contact_default_status' => 1,
+    'contact_form_information' => t('You can leave a message using the contact form below.'),
+    'contact_hourly_threshold' => 3,
+  );
+}
+
+/**
  * Determine if a user can access to the contact tab.
  */
 function _contact_user_tab_access($account) {
Index: modules/dblog/dblog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/dblog/dblog.module,v
retrieving revision 1.37
diff -u -p -r1.37 dblog.module
--- modules/dblog/dblog.module	13 Apr 2009 08:48:58 -0000	1.37
+++ modules/dblog/dblog.module	29 Apr 2009 14:09:17 -0000
@@ -73,6 +73,15 @@ function dblog_menu() {
   return $items;
 }
 
+/**
+ * Implementation of hook_variable_info().
+ */
+function dblog_variable_info() {
+  return array(
+    'dblog_row_limit' => 1000,
+  );
+}
+
 function dblog_init() {
   if (arg(0) == 'admin' && arg(1) == 'reports') {
     // Add the CSS for this module
Index: modules/field/field.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.module,v
retrieving revision 1.7
diff -u -p -r1.7 field.module
--- modules/field/field.module	26 Mar 2009 13:31:24 -0000	1.7
+++ modules/field/field.module	29 Apr 2009 14:09:18 -0000
@@ -606,5 +606,13 @@ function template_preprocess_field(&$var
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function field_variable_info() {
+  return array(
+    'field_storage_module' => 'field_sql_storage',
+  );
+}
+/**
  * @} End of "defgroup field"
  */
\ No newline at end of file
Index: modules/filter/filter.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/filter/filter.module,v
retrieving revision 1.248
diff -u -p -r1.248 filter.module
--- modules/filter/filter.module	25 Apr 2009 18:01:10 -0000	1.248
+++ modules/filter/filter.module	29 Apr 2009 14:09:19 -0000
@@ -133,6 +133,19 @@ function filter_menu() {
   return $items;
 }
 
+/**
+ * Implementation of hook_variable_info().
+ */
+function filter_variable_info() {
+  return array(
+    'allowed_html' => '<a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>',
+    'filter_allowed_protocols' => array('ftp', 'http', 'https', 'irc', 'mailto', 'news', 'nntp', 'rtsp', 'sftp', 'ssh', 'telnet', 'webcal'),
+    'filter_default_format' => 1,
+    'filter_html_help' => 1,
+    'filter_html_nofollow' => FALSE,
+  );
+}
+
 function filter_format_load($arg) {
   return filter_formats($arg);
 }
Index: modules/forum/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.module,v
retrieving revision 1.491
diff -u -p -r1.491 forum.module
--- modules/forum/forum.module	26 Apr 2009 19:44:38 -0000	1.491
+++ modules/forum/forum.module	29 Apr 2009 14:09:20 -0000
@@ -33,6 +33,21 @@ function forum_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function forum_variable_info() {
+  return array(
+    'forum_block_num_active' => 5,
+    'forum_block_num_new' => 5,
+    'forum_containers' => array(),
+    'forum_hot_topic' => 15,
+    'forum_nav_vocabulary' => '',
+    'forum_order' => 1,
+    'forum_per_page' => 25,
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function forum_theme() {
Index: modules/locale/locale.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/locale/locale.module,v
retrieving revision 1.238
diff -u -p -r1.238 locale.module
--- modules/locale/locale.module	31 Mar 2009 02:02:21 -0000	1.238
+++ modules/locale/locale.module	29 Apr 2009 14:09:23 -0000
@@ -173,6 +173,15 @@ function locale_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function locale_variable_info() {
+  return array(
+    'locale_cache_strings' => 1,
+  );
+}
+
+/**
  * Wrapper function to be able to set callbacks in locale.inc
  */
 function locale_inc_callback() {
Index: modules/menu/menu.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v
retrieving revision 1.184
diff -u -p -r1.184 menu.module
--- modules/menu/menu.module	11 Apr 2009 22:19:45 -0000	1.184
+++ modules/menu/menu.module	29 Apr 2009 14:09:24 -0000
@@ -152,6 +152,16 @@ function menu_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function menu_variable_info() {
+  return array(
+    'menu_default_node_menu' => 'main-menu',
+    'menu_override_parent_selector' => FALSE,
+  );
+}
+
+/**
  * Implementation of hook_enable().
  *
  *  Add a link for each custom menu.
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1042
diff -u -p -r1.1042 node.module
--- modules/node/node.module	26 Apr 2009 19:44:39 -0000	1.1042
+++ modules/node/node.module	29 Apr 2009 14:09:40 -0000
@@ -145,6 +145,20 @@ function node_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function node_variable_info() {
+  return array(
+    'default_nodes_main' => 10,
+    'node_access_needs_rebuild' => FALSE,
+    'node_cron_last' => 0,
+    'node_options' => array('status', 'promote'),
+    'node_preview' => 0,
+    'teaser_length' => 600,
+  );
+}
+
+/**
  * Implementation of hook_cron().
  */
 function node_cron() {
Index: modules/profile/profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.module,v
retrieving revision 1.252
diff -u -p -r1.252 profile.module
--- modules/profile/profile.module	14 Mar 2009 23:01:37 -0000	1.252
+++ modules/profile/profile.module	29 Apr 2009 14:09:41 -0000
@@ -126,6 +126,15 @@ function profile_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function profile_variable_info() {
+  return array(
+    'profile_block_author_fields' => array(),
+  );
+}
+
+/**
  * Implementation of hook_block_list().
  */
 function profile_block_list() {
Index: modules/search/search.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.module,v
retrieving revision 1.288
diff -u -p -r1.288 search.module
--- modules/search/search.module	20 Apr 2009 21:28:15 -0000	1.288
+++ modules/search/search.module	29 Apr 2009 14:09:43 -0000
@@ -141,6 +141,31 @@ function search_theme() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function search_variable_info() {
+  return array(
+    'minimum_word_size' => 3,
+    'overlap_cjk' => TRUE,
+    'search_cron_limit' => 100,
+    'search_tag_weights' => array(
+      'h1' => 25,
+      'h2' => 18,
+      'h3' => 15,
+      'h4' => 12,
+      'h5' => 9,
+      'h6' => 6,
+      'u' => 3,
+      'b' => 3,
+      'i' => 3,
+      'strong' => 3,
+      'em' => 3,
+      'a' => 10,
+    ),
+  );
+}
+
+/**
  * Implementation of hook_perm().
  */
 function search_perm() {
Index: modules/simpletest/simpletest.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/simpletest.module,v
retrieving revision 1.40
diff -u -p -r1.40 simpletest.module
--- modules/simpletest/simpletest.module	27 Apr 2009 07:44:09 -0000	1.40
+++ modules/simpletest/simpletest.module	29 Apr 2009 14:09:44 -0000
@@ -51,6 +51,16 @@ function simpletest_perm() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function simpletest_variable_info() {
+  return array(
+    'simpletest_httpauth_pass' => '',
+    'simpletest_httpauth_username' => '',
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function simpletest_theme() {
Index: modules/simpletest/tests/bootstrap.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v
retrieving revision 1.15
diff -u -p -r1.15 bootstrap.test
--- modules/simpletest/tests/bootstrap.test	22 Apr 2009 09:45:03 -0000	1.15
+++ modules/simpletest/tests/bootstrap.test	29 Apr 2009 14:09:45 -0000
@@ -194,23 +194,31 @@ class BootstrapVariableTestCase extends 
   }
 
   /**
-   * testVariable
+   * Test the variable system.
    */
   function testVariable() {
+    // Retrieving default values for variables.
+    $default_cache = './includes/cache.inc'; // The default anonymous variable from System module.
+    $cache = variable_get('cache_inc');
+    $this->assertIdentical($cache, $default_cache, t('Retrieving default values for variables'));
+
+    // Retrieving default values for variables held in a hook_variable_info() implementation.
+    $name = variable_get('site_name');
+    $this->assertIdentical('Drupal', $name, t('Retrieving default values for variables held in hook_variable_info().'));
+
     // Setting and retrieving values.
     $variable = $this->randomName();
     variable_set('simpletest_bootstrap_variable_test', $variable);
     $this->assertIdentical($variable, variable_get('simpletest_bootstrap_variable_test'), t('Setting and retrieving values'));
 
     // Make sure the variable persists across multiple requests.
-    $this->drupalGet('system-test/variable-get');
-    $this->assertText($variable, t('Variable persists across multiple requests'));
+    $retrieved_variable = $this->drupalGet('system-test/variable-get');
+    $this->assertIdentical($retrieved_variable, $variable, t('Variable persists across multiple requests'));
 
     // Deleting variables.
-    $default_value = $this->randomName();
     variable_del('simpletest_bootstrap_variable_test');
-    $variable = variable_get('simpletest_bootstrap_variable_test', $default_value);
-    $this->assertIdentical($variable, $default_value, t('Deleting variables'));
+    $variable = variable_get('simpletest_bootstrap_variable_test');
+    $this->assertIdentical($variable, NULL, t('Deleting variables'));
   }
 
   /**
Index: modules/simpletest/tests/common.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v
retrieving revision 1.36
diff -u -p -r1.36 common.test
--- modules/simpletest/tests/common.test	27 Apr 2009 20:19:38 -0000	1.36
+++ modules/simpletest/tests/common.test	29 Apr 2009 14:09:46 -0000
@@ -653,21 +653,21 @@ class DrupalErrorHandlerUnitTest extends
       '%type' => 'Notice',
       '%message' => 'Undefined variable: bananas',
       '%function' => 'system_test_generate_warnings()',
-      '%line' => 194,
+      '%line' => 201,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
     $error_warning = array(
       '%type' => 'Warning',
       '%message' => 'Division by zero',
       '%function' => 'system_test_generate_warnings()',
-      '%line' => 196,
+      '%line' => 203,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
     $error_user_notice = array(
       '%type' => 'User notice',
       '%message' => 'Drupal is awesome',
       '%function' => 'system_test_generate_warnings()',
-      '%line' => 198,
+      '%line' => 205,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
 
@@ -701,14 +701,14 @@ class DrupalErrorHandlerUnitTest extends
       '%type' => 'Exception',
       '%message' => 'Drupal is awesome',
       '%function' => 'system_test_trigger_exception()',
-      '%line' => 207,
+      '%line' => 214,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
     $error_pdo_exception = array(
       '%type' => 'PDOException',
       '%message' => 'SQLSTATE',
       '%function' => 'system_test_trigger_pdo_exception()',
-      '%line' => 215,
+      '%line' => 222,
       '%file' => realpath('modules/simpletest/tests/system_test.module'),
     );
 
Index: modules/simpletest/tests/system_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/system_test.module,v
retrieving revision 1.9
diff -u -p -r1.9 system_test.module
--- modules/simpletest/tests/system_test.module	22 Apr 2009 09:45:03 -0000	1.9
+++ modules/simpletest/tests/system_test.module	29 Apr 2009 14:09:46 -0000
@@ -47,8 +47,7 @@ function system_test_menu() {
 
   $items['system-test/variable-get'] = array(
     'title' => 'Variable Get',
-    'page callback' => 'variable_get',
-    'page arguments' => array('simpletest_bootstrap_variable_test', NULL),
+    'page callback' => 'simpletest_bootstrap_variable_test',
     'access arguments' => array('access content'),
     'type' => MENU_CALLBACK,
   );
@@ -91,6 +90,14 @@ function system_test_basic_auth_page() {
   return $output;
 }
 
+/**
+ * Menu callback; SimpleTest bootstrap variable test.
+ */
+function simpletest_bootstrap_variable_test() {
+  echo variable_get('simpletest_bootstrap_variable_test');
+  exit;
+}
+
 function system_test_redirect($code) {
   $code = (int)$code;
   if ($code != 200) {
Index: modules/statistics/statistics.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/statistics/statistics.module,v
retrieving revision 1.302
diff -u -p -r1.302 statistics.module
--- modules/statistics/statistics.module	26 Apr 2009 09:14:32 -0000	1.302
+++ modules/statistics/statistics.module	29 Apr 2009 14:09:46 -0000
@@ -101,6 +101,22 @@ function statistics_perm() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function statistics_variable_info() {
+  return array (
+    'node_cron_views_scale' => 0,
+    'statistics_block_top_all_num' => 0,
+    'statistics_block_top_day_num' => 0,
+    'statistics_block_top_last_num' => 0,
+    'statistics_count_content_views' => 0,
+    'statistics_day_timestamp' => '',
+    'statistics_enable_access_log' => 0,
+    'statistics_flush_accesslog_timer' => 259200,
+  );
+}
+
+/**
  * Implementation of hook_node_view().
  */
 function statistics_node_view($node, $teaser) {
Index: modules/syslog/syslog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/syslog/syslog.module,v
retrieving revision 1.22
diff -u -p -r1.22 syslog.module
--- modules/syslog/syslog.module	13 Apr 2009 08:49:01 -0000	1.22
+++ modules/syslog/syslog.module	29 Apr 2009 14:09:46 -0000
@@ -27,6 +27,15 @@ function syslog_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function syslog_variable_info() {
+  return array(
+    'syslog_facility' => DEFAULT_SYSLOG_FACILITY,
+  );
+}
+
+/**
  * Implementation of hook_form_FORM_ID_alter().
  */
 function syslog_form_system_logging_settings_alter(&$form, &$form_state) {
Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.31
diff -u -p -r1.31 system.api.php
--- modules/system/system.api.php	28 Apr 2009 00:27:06 -0000	1.31
+++ modules/system/system.api.php	29 Apr 2009 14:09:51 -0000
@@ -1693,5 +1693,32 @@ function hook_disable() {
 }
 
 /**
+ * The construction of any default variables associated with the given module.
+ *
+ * @return
+ *   An associative array, where the keys are the names of the variables, and
+ *   the values are the default values to be used if not overridden by the
+ *   administrator.
+ */
+function hook_variable_info() {
+  return array(
+    'upload_max_resolution' => 0,
+    'upload_list_default' => 1,
+    'upload_extensions' => 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp',
+    'upload_uploadsize' => 1,
+    'upload_usersize' => 1,
+    'upload' => 1,
+  );
+}
+
+/**
+ * Allows alteration of the default variables created in hook_variable_info().
+ */
+function hook_variable_info_alter(&$variables) {
+  $variables['upload_max_resolution'] = 1024;
+  $variables['upload_usersize'] = 0;
+}
+
+/**
  * @} End of "addtogroup hooks".
  */
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.688
diff -u -p -r1.688 system.module
--- modules/system/system.module	29 Apr 2009 08:04:24 -0000	1.688
+++ modules/system/system.module	29 Apr 2009 14:09:58 -0000
@@ -115,6 +115,85 @@ function system_help($path, $arg) {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function system_variable_info() {
+  return array(
+    'actions_max_stack' => 35,
+    'admin_compact_mode' => FALSE,
+    'admin_theme' => 0,
+    'allow_insecure_uploads' => 0,
+    'anonymous' => 'Anonymous',
+    'cache_flush' => 0,
+    'cache_lifetime' => 0,
+    'clean_url' => '0',
+    'configurable_timezones' => 1,
+    'cron_key' => 'drupal',
+    'cron_last' => NULL,
+    'cron_semaphore' => FALSE,
+    'cron_threshold_error' => 1209600,
+    'cron_threshold_warning' => 172800,
+    'css_js_query_string' => '0',
+    'date_default_timezone' => 'UTC',
+    'date_first_day' => 0,
+    'date_format_long' => 'l, F j, Y - H:i',
+    'date_format_long_custom' => '',
+    'date_format_medium' => 'D, m/d/Y - H:i',
+    'date_format_medium_custom' => '',
+    'date_format_short' => 'm/d/Y - H:i',
+    'date_format_short_custom' => '',
+    'drupal_badge_color' => 'powered-blue',
+    'drupal_badge_size' => '80x15',
+    'drupal_http_request_fails' => FALSE,
+    'drupal_private_key' => '',
+    'error_level' => 1,
+    'file_directory_path' => conf_path() . '/files',
+    'file_directory_temp' => NULL,
+    'file_downloads' => FILE_DOWNLOADS_PUBLIC,
+    'forum_block_num_0' => NULL,
+    'forum_block_num_1' => NULL,
+    'image_jpeg_quality' => 75,
+    'image_toolkit' => 'gd',
+    'install_locale_batch_components' => array(),
+    'install_profile' => 'default',
+    'install_profile_modules' => array(),
+    'install_time' => 0,
+    'javascript_parsed' => array(),
+    'language_negotiation' => LANGUAGE_NEGOTIATION_NONE,
+    'locale_custom_strings' => array(),
+    'locale_js_directory' => 'languages',
+    'maintenance_theme' => 'minnelli',
+    'menu_expanded' => array(),
+    'menu_main_menu_source' => 'main-menu',
+    'menu_masks' => array(),
+    'menu_parent_items' => 0,
+    'menu_primary_menu' => 0,
+    'menu_rebuild_needed' => FALSE,
+    'menu_secondary_menu' => 0,
+    'menu_secondary_menu_source' => 'secondary-menu',
+    'node_admin_theme' => 0,
+    'page_compression' => TRUE,
+    'preprocess_css' => FALSE,
+    'preprocess_js' => FALSE,
+    'site_403' => '',
+    'site_404' => '',
+    'site_footer' => '',
+    'site_mail' => FALSE,
+    'site_mission' => '',
+    'site_name' => 'Drupal',
+    'site_offline' => 0,
+    'site_offline_message' => '@site is currently under maintenance. We should be back shortly. Thank you for your patience.',
+    'site_slogan' => '',
+    'smtp_library' => '',
+    'system_update_6043_RC2' => FALSE,
+    'theme_default' => 'garland',
+    'theme_settings' => array(),
+    'update_d6_requirements' => FALSE,
+    'upload_extensions_default' => 'jpg jpeg gif png txt html doc xls pdf ppt pps odt ods odp',
+  );
+}
+
+/**
  * Implementation of hook_theme().
  */
 function system_theme() {
Index: modules/taxonomy/taxonomy.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v
retrieving revision 1.470
diff -u -p -r1.470 taxonomy.module
--- modules/taxonomy/taxonomy.module	18 Apr 2009 06:32:24 -0000	1.470
+++ modules/taxonomy/taxonomy.module	29 Apr 2009 14:10:08 -0000
@@ -187,6 +187,15 @@ function taxonomy_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function taxonomy_variable_info() {
+  return array(
+    'taxonomy_override_selector' => FALSE,
+  );
+}
+
+/**
  * Return the vocabulary name given the vocabulary object.
  */
 function taxonomy_admin_vocabulary_title_callback($vocabulary) {
Index: modules/update/update.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/update/update.module,v
retrieving revision 1.31
diff -u -p -r1.31 update.module
--- modules/update/update.module	29 Apr 2009 03:57:21 -0000	1.31
+++ modules/update/update.module	29 Apr 2009 14:10:09 -0000
@@ -142,6 +142,19 @@ function update_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function update_variable_info() {
+  return array(
+    'update_check_frequency' => 1,
+    'update_fetch_url' => UPDATE_DEFAULT_URL,
+    'update_last_check' => 0,
+    'update_notify_emails' => array(),
+    'update_notification_threshold' => 'all',
+  );
+}
+
+/**
  * Implementation of the hook_theme() registry.
  */
 function update_theme() {
Index: modules/upload/upload.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/upload/upload.module,v
retrieving revision 1.234
diff -u -p -r1.234 upload.module
--- modules/upload/upload.module	26 Apr 2009 09:14:32 -0000	1.234
+++ modules/upload/upload.module	29 Apr 2009 14:10:10 -0000
@@ -105,6 +105,20 @@ function upload_menu() {
 }
 
 /**
+ * Implementation of hook_variable_info().
+ */
+function upload_variable_info() {
+  return array(
+    'upload' => 1,
+    'upload_extensions' => 'jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp',
+    'upload_list_default' => 1,
+    'upload_max_resolution' => 0,
+    'upload_uploadsize' => 1,
+    'upload_usersize' => 1,
+  );
+}
+
+/**
  * Determine the limitations on files that a given user may upload. The user
  * may be in multiple roles so we select the most permissive limitations from
  * all of their roles.
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.981
diff -u -p -r1.981 user.module
--- modules/user/user.module	29 Apr 2009 08:04:24 -0000	1.981
+++ modules/user/user.module	29 Apr 2009 14:10:14 -0000
@@ -18,6 +18,23 @@ define('EMAIL_MAX_LENGTH', 64);
 
 
 /**
+ * The standard log2 number of iterations for password stretching. This should
+ * increase by 1 at least every other Drupal version in order to counteract
+ * increases in the speed and power of computers available to crack the hashes.
+ */
+define('DRUPAL_HASH_COUNT', 14);
+
+/**
+ * The minimum allowed log2 number of iterations for password stretching.
+ */
+define('DRUPAL_MIN_HASH_COUNT', 7);
+
+/**
+ * The maximum allowed log2 number of iterations for password stretching.
+ */
+define('DRUPAL_MAX_HASH_COUNT', 30);
+
+/**
  * Invokes hook_user() in every module.
  *
  * We cannot use module_invoke() for this, because the arguments need to
@@ -109,6 +126,34 @@ function user_field_build_modes($obj_typ
   return $modes;
 }
 
+/**
+ * Implementation of hook_variable_info().
+ */
+function user_variable_info() {
+  return array(
+    'password_count_log2' => DRUPAL_HASH_COUNT,
+    'user_block_max_list_count' => 10,
+    'user_block_seconds_online' => 900,
+    'user_block_whois_new_count' => 5,
+    // Use user_mail_notify_status as a fallback for an unknown $op, which will
+    // default to TRUE; however, we don't want mail notifications on by default
+    // with deletions and blockings.
+    'user_mail_notify_status' => TRUE,
+    'user_mail_notify_status_blocked' => FALSE,
+    'user_mail_notify_status_deleted' => FALSE,
+    'user_email_verification' => TRUE,
+    'user_pictures' => 0,
+    'user_picture_default' => '',
+    'user_picture_dimensions' => '85x85',
+    'user_picture_file_size' => 30,
+    'user_picture_guidelines' => '',
+    'user_picture_path' => 'pictures',
+    'user_register' => 1,
+    'user_registration_help' => '',
+    'user_signatures' => 0,
+  );
+}
+
 function user_external_load($authname) {
   $uid = db_query("SELECT uid FROM {authmap} WHERE authname = :authname", array(':authname' => $authname))->fetchField();
 
Index: modules/user/user.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.test,v
retrieving revision 1.34
diff -u -p -r1.34 user.test
--- modules/user/user.test	25 Apr 2009 17:52:43 -0000	1.34
+++ modules/user/user.test	29 Apr 2009 14:10:18 -0000
@@ -45,7 +45,7 @@ class UserRegistrationTestCase extends D
     $this->assertEqual($user->status, variable_get('user_register', 1) == 1 ? 1 : 0, t('Correct status field.'));
     $this->assertEqual($user->timezone, variable_get('date_default_timezone'), t('Correct time zone field.'));
     $this->assertEqual($user->language, '', t('Correct language field.'));
-    $this->assertEqual($user->picture, '', t('Correct picture field.'));
+    $this->assertEqual($user->picture, 0, t('Correct picture field.'));
     $this->assertEqual($user->init, $mail, t('Correct init field.'));
 
     // Attempt to login with incorrect password.
