diff --git modules/block/block.admin.inc modules/block/block.admin.inc
index 133ff2b..56b261e 100644
--- modules/block/block.admin.inc
+++ modules/block/block.admin.inc
@@ -34,7 +34,7 @@ function block_admin_display_form(&$form_state, $blocks, $theme = NULL) {
   $custom_theme = isset($theme) ? $theme : variable_get('theme_default', 'garland');
   init_theme();
 
-  $block_regions = system_region_list($theme_key) + array(BLOCK_REGION_NONE => '<' . t('none') . '>');
+  $block_regions = system_region_list($theme_key, REGIONS_VISIBLE) + array(BLOCK_REGION_NONE => '<' . t('none') . '>');
 
   // Weights range from -delta to +delta, so delta should be at least half
   // of the amount of blocks present. This makes sure all blocks in the same
@@ -469,7 +469,7 @@ function block_box_delete_submit($form, &$form_state) {
 function template_preprocess_block_admin_display_form(&$variables) {
   global $theme_key;
 
-  $block_regions = system_region_list($theme_key);
+  $block_regions = system_region_list($theme_key, REGIONS_VISIBLE);
   $variables['block_regions'] = $block_regions + array(BLOCK_REGION_NONE => t('Disabled'));
 
   foreach ($block_regions as $key => $value) {
diff --git modules/block/block.module modules/block/block.module
index 60fa0e1..1a66632 100644
--- modules/block/block.module
+++ modules/block/block.module
@@ -236,10 +236,11 @@ function block_page_alter($page) {
   init_theme();
 
   // Populate all block regions
-  $regions = system_region_list($theme);
+  $all_regions = system_region_list($theme);
+  $visible_regions = system_region_list($theme, REGIONS_VISIBLE);
 
   // Load all region content assigned via blocks.
-  foreach (array_keys($regions) as $region) {
+  foreach (array_keys($all_regions) as $region) {
     // Prevent left and right regions from rendering blocks when 'show_blocks' == FALSE.
     if (!empty($page['#show_blocks']) || ($region != 'left' && $region != 'right')) {
       // Assign blocks to region.
@@ -249,8 +250,8 @@ function block_page_alter($page) {
 
       // Append region description if we are rendering the block admin page.
       $item = menu_get_item();
-      if ($item['path'] == 'admin/build/block') {
-        $description = '<div class="block-region">' . $regions[$region] . '</div>';
+      if ($item['path'] == 'admin/build/block' && isset($visible_regions[$region])) {
+        $description = '<div class="block-region">' . $all_regions[$region] . '</div>';
         $page[$region]['block_description'] = array(
           '#markup' => $description,
           '#weight' => 15,
diff --git modules/system/system.module modules/system/system.module
index fa0f5c7..6bacb13 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -72,6 +72,17 @@ define('DRUPAL_OPTIONAL', 1);
 define('DRUPAL_REQUIRED', 2);
 
 /**
+ * Return only visible regions. @see system_region_list().
+ */
+define('REGIONS_VISIBLE', 'visible');
+
+/**
+ * Return all visible regions. @see system_region_list().
+ */
+define('REGIONS_ALL', 'all');
+
+
+/**
  * Implement hook_help().
  */
 function system_help($path, $arg) {
@@ -1815,14 +1826,14 @@ function _system_get_theme_data() {
     // Set defaults for theme info.
     $defaults = array(
       'regions' => array(
-        'left' => 'Left sidebar',
-        'right' => 'Right sidebar',
-        'content' => 'Content',
-        'header' => 'Header',
-        'footer' => 'Footer',
-        'highlight' => 'Highlighted content',
-        'help' => 'Help',
-        'page_top' => 'Page top',
+        'left' => array('label' => 'Left sidebar'),
+        'right' => array('label' => 'Right sidebar'),
+        'content' => array('label' => 'Content'),
+        'header' => array('label' => 'Header'),
+        'footer' => array('label' => 'Footer'),
+        'highlight' => array('label' => 'Highlighted content'),
+        'help' => array('label' => 'Help'),
+        'page_top' => array('label' => 'Page top', 'hidden' => TRUE),
       ),
       'description' => '',
       'features' => array(
@@ -1974,18 +1985,26 @@ function system_find_base_theme($themes, $key, $used_keys = array()) {
  *
  * @param $theme_key
  *   The name of a theme.
+ * @param $show
+ *   Possible values: REGIONS_ALL or REGIONS_VISIBLE. Visible excludes hidden 
+ *   regions.
  * @return
- *   An array of regions in the form $region['name'] = 'description'.
+ *   An array of regions in the form $region['name'] = 'label'.
  */
-function system_region_list($theme_key) {
+function system_region_list($theme_key, $show = REGIONS_ALL) {
   $list = &drupal_static(__FUNCTION__, array());
 
-  if (!array_key_exists($theme_key, $list)) {
+  if (empty($list[$theme_key][$show])) {
     $info = unserialize(db_query("SELECT info FROM {system} WHERE type = :type AND name = :name", array(':type' => 'theme', ':name' => $theme_key))->fetchField());
-    $list[$theme_key] = array_map('t', $info['regions']);
+    foreach ($info['regions'] as $name => $region) {
+      // If requested, suppress hidden regions. @see block_admin_display_form().
+      if ($show == REGIONS_ALL || empty($region['hidden'])) {
+        $list[$theme_key][$show][$name] = t($region['label']);
+      }
+    }
   }
 
-  return $list[$theme_key];
+  return $list[$theme_key][$show];
 }
 
 /**
