diff --git modules/block/block.admin.inc modules/block/block.admin.inc
index 06111cc..42e81c9 100644
--- modules/block/block.admin.inc
+++ modules/block/block.admin.inc
@@ -286,7 +286,7 @@ function block_admin_configure($form, &$form_state, $module, $delta) {
     '#type' => 'fieldset',
     '#title' => t('Region settings'),
     '#collapsible' => FALSE,
-    '#description' => t('Specify in which themes and regions this block is displayed.'),
+    '#description' => t('Specify the regions in which this block is displayed.'),
     '#tree' => TRUE,
   );
 
diff --git modules/dashboard/dashboard.module modules/dashboard/dashboard.module
index 376090a..fe12e7a 100644
--- modules/dashboard/dashboard.module
+++ modules/dashboard/dashboard.module
@@ -20,9 +20,7 @@ function dashboard_help($path, $arg) {
       return $output;
 
     case 'admin/dashboard/configure':
-      // @todo This assumes the current page is being displayed using the same
-      //   theme that the dashboard is displayed in.
-      $output = '<p>' . t('Rearrange blocks for display on the <a href="@dashboard-url">dashboard</a>. Disabling a block makes it available on the main <a href="@blocks-url">blocks administration page</a>.', array('@dashboard-url' => url('admin/dashboard'), '@blocks-url' => url("admin/structure/block/list/{$GLOBALS['theme_key']}"))) . '</p>';
+      $output = '<p>' . t('Rearrange blocks for display on the <a href="@dashboard-url">dashboard</a>.', array('@dashboard-url' => url('admin/dashboard'))) . '</p>';
       return $output;
   }
 }
@@ -76,6 +74,17 @@ function dashboard_menu() {
 }
 
 /**
+ * Implements hook_menu_alter().
+ */
+function dashboard_menu_alter(&$items) {
+  // Do not allow dashboard blocks to be configured via the Block module's user
+  // interface.
+  if (isset($items['admin/structure/block/list/dashboard_theme'])) {
+    $items['admin/structure/block/list/dashboard_theme']['access callback'] = FALSE;
+  }
+}
+
+/**
  * Implements hook_permission().
  */
 function dashboard_permission() {
@@ -90,20 +99,15 @@ function dashboard_permission() {
 }
 
 /**
- * Implements hook_block_list_alter().
- *
- * Skip rendering dashboard blocks when not on the dashboard page itself. This
- * prevents expensive dashboard blocks from causing performance issues on pages
- * where they will never be displayed.
+ * Implements hook_system_rebuild_theme_data().
  */
-function dashboard_block_list_alter(&$blocks) {
-  if (!dashboard_is_visible()) {
-    foreach ($blocks as $key => $block) {
-      if (in_array($block->region, dashboard_regions())) {
-        unset($blocks[$key]);
-      }
-    }
-  }
+function dashboard_system_rebuild_theme_data() {
+  $themes['dashboard_theme'] = (object) array(
+    'uri' => drupal_get_path('module', 'dashboard') . '/dashboard_theme/dashboard_theme.info',
+    'filename' => 'dashboard_theme.info',
+    'name' => 'dashboard_theme',
+  );
+  return $themes;
 }
 
 /**
@@ -172,16 +176,11 @@ function dashboard_page_build(&$page) {
 
 /**
  * Implements hook_system_info_alter().
- *
- * Add regions to each theme to store the dashboard blocks.
  */
 function dashboard_system_info_alter(&$info, $file, $type) {
-  if ($type == 'theme') {
-    $info['regions'] += dashboard_region_descriptions();
-    // Indicate that these regions are intended to be displayed whenever the
-    // dashboard is displayed in an overlay. This information is provided for
-    // any module that might need to use it, not just the core Overlay module.
-    $info['overlay_regions'] = !empty($info['overlay_regions']) ? array_merge($info['overlay_regions'], dashboard_regions()) : dashboard_regions();
+  if ($type == 'theme' && $file->name == 'dashboard_theme') {
+    // Set the dashboard regions.
+    $info['regions'] = dashboard_region_descriptions();
   }
 }
 
@@ -276,50 +275,17 @@ function dashboard_admin($launch_customize = FALSE) {
  * @see template_preprocess_dashboard_admin_display_form()
  */
 function dashboard_admin_blocks() {
-  global $theme_key;
-  drupal_theme_initialize();
   module_load_include('inc', 'block', 'block.admin');
-
-  // Prepare the blocks for the current theme, and remove those that are
-  // currently displayed in non-dashboard regions.
-  // @todo This assumes the current page is being displayed using the same
-  //   theme that the dashboard is displayed in.
-  $blocks = block_admin_display_prepare_blocks($theme_key);
-  $dashboard_regions = dashboard_region_descriptions();
-  $regions_to_remove = array_diff_key(system_region_list($theme_key, REGIONS_VISIBLE), $dashboard_regions);
+  $blocks = block_admin_display_prepare_blocks('dashboard_theme');
   foreach ($blocks as $id => $block) {
-    if (isset($regions_to_remove[$block['region']])) {
+    // The main system content block cannot be placed in any region, since the
+    // dashboard regions themselves are displayed as part of the main page
+    // content.
+    if ($block['module'] == 'system' && $block['delta'] == 'main') {
       unset($blocks[$id]);
     }
   }
-
-  // Pass in the above blocks and dashboard regions to the form, so that only
-  // dashboard-related regions will be displayed.
-  return drupal_get_form('dashboard_admin_display_form', $blocks, $theme_key, $dashboard_regions);
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- */
-function dashboard_form_block_admin_display_form_alter(&$form, &$form_state, $form_id) {
-  // Hide dashboard regions (and any blocks placed within them) from the block
-  // administration form and from the options list on that form. This
-  // function is called for both the dashboard block configuration form and the
-  // standard block configuration form so that both forms can share the same
-  // constructor. As a result the form_id must be checked.
-  if ($form_id != 'dashboard_admin_display_form') {
-    $dashboard_regions = dashboard_region_descriptions();
-    $form['block_regions']['#value'] = array_diff_key($form['block_regions']['#value'], $dashboard_regions);
-    foreach (element_children($form['blocks']) as $i) {
-      $block = &$form['blocks'][$i];
-      if (isset($block['region']['#default_value']) && isset($dashboard_regions[$block['region']['#default_value']])) {
-        $block['#access'] = FALSE;
-      }
-      elseif (isset($block['region']['#options'])) {
-        $block['region']['#options'] = array_diff_key($block['region']['#options'], $dashboard_regions);
-      }
-    }
-  }
+  return drupal_get_form('dashboard_admin_display_form', $blocks, 'dashboard_theme');
 }
 
 /**
@@ -339,33 +305,6 @@ function dashboard_form_dashboard_admin_display_form_alter(&$form, &$form_state)
 }
 
 /**
- * Implements hook_form_FORM_ID_alter().
- */
-function dashboard_form_block_admin_configure_alter(&$form, &$form_state) {
-  global $theme_key;
-  drupal_theme_initialize();
-  // Hide the dashboard regions from the region select list on the block
-  // configuration form, for all themes except the current theme (since the
-  // other themes do not display the dashboard).
-  // @todo This assumes the current page is being displayed using the same
-  //   theme that the dashboard is displayed in.
-  $dashboard_regions = dashboard_region_descriptions();
-  foreach (element_children($form['regions']) as $region_name) {
-    $region = &$form['regions'][$region_name];
-    if ($region_name != $theme_key && isset($region['#options'])) {
-      $region['#options'] = array_diff_key($region['#options'], $dashboard_regions);
-    }
-  }
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- */
-function dashboard_form_block_add_block_form_alter(&$form, &$form_state) {
-  dashboard_form_block_admin_configure_alter($form, $form_state);
-}
-
-/**
  * Preprocesses variables for block-admin-display-form.tpl.php.
  */
 function template_preprocess_dashboard_admin_display_form(&$variables) {
diff --git modules/dashboard/dashboard.test modules/dashboard/dashboard.test
index af96de7..798a3c0 100644
--- modules/dashboard/dashboard.test
+++ modules/dashboard/dashboard.test
@@ -42,7 +42,7 @@ class DashboardBlocksTestCase extends DrupalWebTestCase {
     $custom_block['info'] = $this->randomName(8);
     $custom_block['title'] = $this->randomName(8);
     $custom_block['body[value]'] = $this->randomName(32);
-    $custom_block['regions[stark]'] = 'dashboard_main';
+    $custom_block['regions[dashboard_theme]'] = 'dashboard_main';
     $this->drupalPost('admin/structure/block/add', $custom_block, t('Save block'));
 
     // Ensure admin access.
diff --git modules/system/system.module modules/system/system.module
index 0f21925..f19f273 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -2405,6 +2405,10 @@ function _system_update_bootstrap_status() {
 function _system_rebuild_theme_data() {
   // Find themes
   $themes = drupal_system_listing('/\.info$/', 'themes');
+
+  // Allow modules to add further themes.
+  $themes = array_merge($themes, module_invoke_all('system_rebuild_theme_data'));
+
   // Find theme engines
   $engines = drupal_system_listing('/\.engine$/', 'themes/engines');
 
diff --git profiles/standard/standard.install profiles/standard/standard.install
index 10900ce..7122d89 100644
--- profiles/standard/standard.install
+++ profiles/standard/standard.install
@@ -90,7 +90,7 @@ function standard_install() {
     array(
       'module' => 'node',
       'delta' => 'recent',
-      'theme' => $admin_theme,
+      'theme' => 'dashboard_theme',
       'status' => 1,
       'weight' => 10,
       'region' => 'dashboard_main',
@@ -170,7 +170,7 @@ function standard_install() {
     array(
       'module' => 'user',
       'delta' => 'new',
-      'theme' => $admin_theme,
+      'theme' => 'dashboard_theme',
       'status' => 1,
       'weight' => 0,
       'region' => 'dashboard_sidebar',
@@ -180,7 +180,7 @@ function standard_install() {
     array(
       'module' => 'search',
       'delta' => 'form',
-      'theme' => $admin_theme,
+      'theme' => 'dashboard_theme',
       'status' => 1,
       'weight' => -10,
       'region' => 'dashboard_sidebar',
