=== modified file 'modules/block/block.module'
--- modules/block/block.module	
+++ modules/block/block.module	
@@ -171,10 +171,11 @@ function _block_rehash() {
           $block['pages'] = $old_blocks[$module][$delta]->pages;
           $block['custom'] = $old_blocks[$module][$delta]->custom;
           $block['throttle'] = $old_blocks[$module][$delta]->throttle;
+          $block['title'] = $old_blocks[$module][$delta]->title;
         }
         // Otherwise, use any set values, or else substitute defaults.
         else {
-          $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0);
+          $properties = array('status' => 0, 'weight' => 0, 'region' => 'left', 'pages' => '', 'custom' => 0, 'title' => '');
           foreach ($properties as $property => $default) {
             if (!isset($block[$property])) {
               $block[$property] = $default;
@@ -183,8 +184,8 @@ function _block_rehash() {
         }
 
         // Reinsert blocks into table
-        db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d)",
-          $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle']);
+        db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle, title) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d, '%s')",
+          $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle'], $block['title']);
         $blocks[] = $block;
       }
     }
@@ -271,7 +272,7 @@ function _block_compare($a, $b) {
  */
 function block_admin_display_submit($form_id, $form_values) {
   foreach ($form_values as $block) {
-    db_query("UPDATE {blocks} SET status = %d, weight = %d, region = '%s', throttle = %d WHERE module = '%s' AND delta = '%s' AND theme = '%s'", $block['status'], $block['weight'], $block['region'], $block['throttle'], $block['module'], $block['delta'], $block['theme']);
+    db_query("UPDATE {blocks} SET status = %d, weight = %d, region = '%s', throttle = %d, title = '%s' WHERE module = '%s' AND delta = '%s' AND theme = '%s'", $block['status'], $block['weight'], $block['region'], $block['throttle'], $block['title'], $block['module'], $block['delta'], $block['theme']);
   }
   drupal_set_message(t('The block settings have been updated.'));
   cache_clear_all();
@@ -362,7 +363,7 @@ function block_admin_configure($module =
   $form['module'] = array('#type' => 'value', '#value' => $module);
   $form['delta'] = array('#type' => 'value', '#value' => $delta);
 
-  $edit = db_fetch_array(db_query("SELECT pages, visibility, custom FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta));
+  $edit = db_fetch_array(db_query("SELECT pages, visibility, custom, title FROM {blocks} WHERE module = '%s' AND delta = '%s'", $module, $delta));
 
   // Module-specific block configurations.
   if ($settings = module_invoke($module, 'block', 'configure', $delta)) {
@@ -383,6 +384,13 @@ function block_admin_configure($module =
 
   // Standard block configurations.
 
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Display title'),
+    '#maxlength' => 64,
+    '#description' =>  t('Enter a custom title to override the default title for the block when it is displayed on the page. Enter <em>&lt;none&gt;</em> for no display title, or leave blank to use the default block title.'),
+    '#default_value' => $edit['title'],
+  );
   $form['user_vis_settings'] = array(
     '#type' => 'fieldset',
     '#title' => t('User specific visibility settings'),
@@ -476,7 +484,7 @@ function block_admin_configure_validate(
 
 function block_admin_configure_submit($form_id, $form_values) {
   if (!form_get_errors()) {
-    db_query("UPDATE {blocks} SET visibility = %d, pages = '%s', custom = %d WHERE module = '%s' AND delta = '%s'", $form_values['visibility'], $form_values['pages'], $form_values['custom'], $form_values['module'], $form_values['delta']);
+    db_query("UPDATE {blocks} SET visibility = %d, pages = '%s', custom = %d, title = '%s' WHERE module = '%s' AND delta = '%s'", $form_values['visibility'], $form_values['pages'], $form_values['custom'], $form_values['title'], $form_values['module'], $form_values['delta']);
     db_query("DELETE FROM {blocks_roles} WHERE module = '%s' AND delta = '%s'", $form_values['module'], $form_values['delta']);
     foreach (array_filter($form_values['roles']) as $rid) {
       db_query("INSERT INTO {blocks_roles} (rid, module, delta) VALUES (%d, '%s', '%s')", $rid, $form_values['module'], $form_values['delta']);
@@ -683,6 +691,10 @@ function block_list($region) {
           }
         }
         if (isset($block->content) && $block->content) {
+          // Override default block title if a custom display title is present.
+          if ($block->title) {
+            $block->subject = $block->title == '<none>' ? '' : $block->title;
+          }
           $blocks[$block->region]["{$block->module}_{$block->delta}"] = $block;
         }
       }
=== modified file 'modules/system/system.install'
--- modules/system/system.install	
+++ modules/system/system.install	
@@ -32,7 +32,8 @@ function system_install() {
         custom tinyint(2) DEFAULT '0' NOT NULL,
         throttle tinyint(1) DEFAULT '0' NOT NULL,
         visibility tinyint(1) DEFAULT '0' NOT NULL,
-        pages text DEFAULT '' NOT NULL
+        pages text DEFAULT '' NOT NULL,
+        title varchar(64) DEFAULT '' NOT NULL
       ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");
 
       db_query("CREATE TABLE {boxes} (
@@ -2524,3 +2525,18 @@ function system_update_187() {
   }
   return $ret;
 }
+
+function system_update_188() {
+  // Add a customizable title to blocks.
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+    $ret[] = update_sql("ALTER TABLE {blocks} ADD title VARCHAR(64) NOT NULL DEFAULT ''");
+      break;
+    case 'pgsql':
+      db_add_column($ret, 'blocks', 'title', 'varchar(64)', array('default' => '', 'not null' => TRUE));
+      break;
+  }
+  return $ret;
+}
