diff --git modules/dashboard/dashboard.js modules/dashboard/dashboard.js
index dc9019d..4f32273 100644
--- modules/dashboard/dashboard.js
+++ modules/dashboard/dashboard.js
@@ -160,32 +160,39 @@ Drupal.behaviors.dashboard = {
     $('#dashboard').addClass('customize-inactive');
     var item = $(ui.item);
 
-    // If the user dragged a disabled block, load the block contents.
-    if (item.hasClass('disabled-block')) {
-      var module, delta, itemClass;
-      itemClass = item.attr('class');
-      // Determine the block module and delta.
-      module = itemClass.match(/\bmodule-(\S+)\b/)[1];
-      delta = itemClass.match(/\bdelta-(\S+)\b/)[1];
-
-      // Load the newly enabled block's content.
-      $.get(Drupal.settings.dashboard.blockContent + '/' + module + '/' + delta, {},
-        function (block) {
-          if (block) {
-            item.html(block);
-          }
-
-          if (item.find('div.content').is(':empty')) {
-            item.find('div.content').html(Drupal.settings.dashboard.emptyBlockText);
-          }
-
-          Drupal.attachBehaviors(item);
-        },
-        'html'
-      );
-      // Remove the "disabled-block" class, so we don't reload its content the
-      // next time it's dragged.
-      item.removeClass("disabled-block");
+    // If the user dragged a disabled block out of the disabled region, load the
+    // block contents.
+    if (item.hasClass('disabled-block') && !item.parent().hasClass('disabled-blocks')) {
+      // If the block was previously fully loaded, no need to load it again.
+      if (!item.hasClass('dashboard-disabled')) {
+        item.removeClass('disabled-block');
+      }
+      else {
+        var module, delta, itemClass;
+        itemClass = item.attr('class');
+        itemId = item.attr('id');
+        // Determine the block module and delta.
+        module = itemClass.match(/\bmodule-(\S+)\b/)[1];
+        delta = itemClass.match(/\bdelta-(\S+)\b/)[1];
+        // Load the newly enabled block's content.
+        $.get(Drupal.settings.dashboard.blockContent + '/' + module + '/' + delta, {},
+          function (block) {
+            if (block) {
+              item.replaceWith(block);
+              item = $("#" + itemId);
+              item.addClass('module-' + module).addClass('delta-' + delta);
+              Drupal.attachBehaviors(item);
+            }
+            if (item.find('div.content').is(':empty')) {
+              item.find('div.content').html(Drupal.settings.dashboard.emptyBlockText);
+            }
+          },
+          'html'
+        );
+      }
+    }
+    else if (!item.hasClass('disabled-block') && item.parent().hasClass('disabled-blocks')) {
+      item.addClass('disabled-block');
     }
 
     Drupal.behaviors.dashboard.addPlaceholders();
diff --git modules/dashboard/dashboard.module modules/dashboard/dashboard.module
index 1917c87..547bde5 100644
--- modules/dashboard/dashboard.module
+++ modules/dashboard/dashboard.module
@@ -525,6 +525,14 @@ function dashboard_show_block_content($module, $delta) {
   $block_object->enabled = $block_object->page_match = TRUE;
   $blocks[$module . "_" . $delta] = $block_object;
   $block_content = _block_render_blocks($blocks);
+  // Ensure the block has a subject.
+  foreach ($block_content as $key => $value) {
+    if (empty($value->subject)) {
+      $info = module_invoke($module, 'block_info');
+      $value->subject = $info[$delta]['info'];
+      $block_content[$key] = $value;
+    }
+  }
   $build = _block_get_renderable_array($block_content);
   $rendered_block = drupal_render($build);
   print $rendered_block;
@@ -664,7 +672,7 @@ function theme_dashboard_disabled_block($variables) {
   $output = "";
   if (isset($block)) {
     $output .= '<div id="block-' . $block['module'] . '-' . $block['delta']
-    . '" class="disabled-block block block-' . $block['module'] . '-' . $block['delta']
+    . '" class="disabled-block dashboard-disabled block block-' . $block['module'] . '-' . $block['delta']
     . ' module-' . $block['module'] . ' delta-' . $block['delta'] . '">'
     . '<h2>' . (!empty($block['title']) && $block['title'] != '<none>' ? check_plain($block['title']) : check_plain($block['info'])) . '</h2>'
     . '<div class="content"></div>'
