diff --git a/modules/block.views.inc b/modules/block.views.inc
new file mode 100644
index 0000000..a212b11
--- /dev/null
+++ b/modules/block.views.inc
@@ -0,0 +1,31 @@
+<?php
+/**
+ * @file
+ * Provide views data and handlers that aren't tied to any other module.
+ */
+
+/**
+ * @defgroup views_block_module block.module handlers
+ *
+ * @{
+ */
+
+/**
+ * Implements hook_views_data()
+ */
+function block_views_data() {
+
+  $data['views']['block'] = array(
+    'title' => t('Block area'),
+    'help' => t('Insert a block inside an area.'),
+    'area' => array(
+      'handler' => 'views_handler_area_block',
+    ),
+  );
+
+  return $data;
+}
+
+/**
+ * @}
+ */
diff --git a/modules/block/views_handler_area_block.inc b/modules/block/views_handler_area_block.inc
new file mode 100644
index 0000000..5e89b7b
--- /dev/null
+++ b/modules/block/views_handler_area_block.inc
@@ -0,0 +1,67 @@
+<?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 '';
+  }
+}
\ No newline at end of file
diff --git a/test.patch b/test.patch
new file mode 100644
index 0000000..e69de29
diff --git a/views.info b/views.info
index 17929ec..c1db387 100644
--- a/views.info
+++ b/views.info
@@ -69,6 +69,7 @@ files[] = modules/aggregator/views_handler_field_aggregator_item_description.inc
 files[] = modules/aggregator/views_handler_field_aggregator_xss.inc
 files[] = modules/aggregator/views_handler_filter_aggregator_category_cid.inc
 files[] = modules/aggregator/views_plugin_row_aggregator_rss.inc
+files[] = modules/block/views_handler_area_block.inc
 files[] = modules/comment/views_handler_argument_comment_user_uid.inc
 files[] = modules/comment/views_handler_field_comment.inc
 files[] = modules/comment/views_handler_field_comment_depth.inc
diff --git a/views.module b/views.module
index 1b637e4..a770922 100644
--- a/views.module
+++ b/views.module
@@ -2387,6 +2387,10 @@ if (!function_exists('aggregator_views_api')) {
   function aggregator_views_api() { return views_views_api(); }
 }
 
+if (!function_exists('block_views_api')) {
+  function block_views_api() { return views_views_api(); }
+}
+
 if (!function_exists('book_views_api')) {
   function book_views_api() { return views_views_api(); }
 }
