diff --git a/handlers/views_handler_area_block.inc b/handlers/views_handler_area_block.inc
index e69de29..dc55567 100644
--- a/handlers/views_handler_area_block.inc
+++ b/handlers/views_handler_area_block.inc
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Block area handlers. Insert a block inside of an area.
+ */
+class views_handler_area_block extends views_handler_area {
+
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['block_to_insert'] = array('default' => '');
+    return $options;
+  }
+
+  /**
+   * Default options form that provides the label widget that all fields
+   * should have.
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $query = db_select('block', 'b');
+    $result = $query
+      ->fields('b')
+      ->orderBy('b.module')
+      ->condition('b.module', 'views', '!=')
+      ->addTag('block_load')
+      ->addTag('translatable')
+      ->execute();
+
+    $block_info = $result->fetchAllAssoc('bid');
+    // Allow modules to modify the block list.
+    drupal_alter('block_list', $block_info);
+
+    $options = array();
+    foreach ($block_info as $block) {
+      $options["{$block->module}:{$block->delta}"] = "{$block->module}:{$block->delta}"; // @TODO: fetch the correct block title
+    }
+
+    $form['block_to_insert'] = array(
+      '#type' => 'select',
+      '#title' => t('Block to insert'),
+      '#default_value' => $this->options['block_to_insert'],
+      '#description' => t('The block to insert into this area.'),
+      '#options' => $options,
+    );
+  }
+
+  /**
+   * Render the area
+   */
+  function render($empty = FALSE) {
+    if ((!$empty || !empty($this->options['empty'])) && !empty($this->options['block_to_insert'])) {
+      list ($module, $delta) = explode(':', $this->options['block_to_insert'], 2);
+      $block = block_load($module, $delta);
+      if (empty($block)) {
+        return;
+      }
+      $block_content = _block_render_blocks(array($block));
+      $build = _block_get_renderable_array($block_content);
+      return drupal_render($build);
+    }
+    return '';
+  }
+}
diff --git a/modules/views.views.inc b/modules/views.views.inc
index bfbfb63..9d9e279 100644
--- a/modules/views.views.inc
+++ b/modules/views.views.inc
@@ -67,6 +67,16 @@ function views_views_data() {
     ),
   );
 
+  if (module_exists('block')) {
+    $data['views']['block'] = array(
+      'title' => t('Block area'),
+      'help' => t('Insert a block inside an area.'),
+      'area' => array(
+        'handler' => 'views_handler_area_block',
+      ),
+    );
+  }
+
   if (module_invoke('ctools', 'api_version', '1.7.1')) {
     $data['views']['expression'] = array(
       'title' => t('Math expression'),
diff --git a/views.info b/views.info
index 9466cbd..dc75889 100644
--- a/views.info
+++ b/views.info
@@ -10,6 +10,7 @@ stylesheets[all][] = css/views.css
 dependencies[] = ctools
 ; Handlers
 files[] = handlers/views_handler_area.inc
+files[] = handlers/views_handler_area_block.inc
 files[] = handlers/views_handler_area_text.inc
 files[] = handlers/views_handler_area_view.inc
 files[] = handlers/views_handler_argument.inc
@@ -274,4 +275,4 @@ files[] = tests/user/views_user_argument_validate.test
 files[] = tests/user/views_user.test
 files[] = tests/views_cache.test
 files[] = tests/views_view.test
-files[] = tests/views_ui.test
\ No newline at end of file
+files[] = tests/views_ui.test
