diff --git includes/plugins.inc includes/plugins.inc
index 646f78c..2947f3d 100644
--- includes/plugins.inc
+++ includes/plugins.inc
@@ -267,6 +267,27 @@ function views_views_plugins() {
         'help topic' => 'cache-time',
       ),
     ),
+    'area' => array(
+      'parent' => array(
+        'no ui' => TRUE,
+        'handler' => 'views_plugin_area',
+        'parent' => '',
+        'uses options' => TRUE,
+      ),
+      'none' => array(
+        'title' => t('None'),
+        'help' => t('No text area'),
+        'handler' => 'views_plugin_area_none',
+        'help topic' => 'area-none',
+      ),
+      'text' => array(
+        'title' => t('Basic Textarea'),
+        'help' => t('Basic html textarea'),
+        'handler' => 'views_plugin_area_text',
+        'help topic' => 'area-text',
+        'uses options' => TRUE,
+      ),
+    ),
   );
 }
 
diff --git plugins/views_plugin_area.inc plugins/views_plugin_area.inc
new file mode 100644
index 0000000..b6a51d1
--- /dev/null
+++ plugins/views_plugin_area.inc
@@ -0,0 +1,37 @@
+<?php
+// $Id$
+/**
+ * The base plugin to handle area.
+ */
+class views_plugin_area extends views_plugin {
+  function init(&$view, &$display, &$type) {
+    parent::init($view, $display);
+    $this->options = array();
+    $this->type = $type;
+
+    if (is_object($display->handler)) {
+      // Note: The below is read only.
+      $this->options = $display->handler->get_option($this->type);
+    }
+  }
+
+  /**
+   * Generate the title, that should be shown for the user.
+   *
+   * @return string
+   *   The title, that is shown to the user.
+   */
+  function summary_title() { }
+
+  /**
+   * Returns the output of the area.
+   *
+   * @param boolean $empty
+   *   Does the view has results.
+   *
+   * @return
+   *  Output of the area.
+   */
+  function render($empty = FALSE) { }
+}
+
diff --git plugins/views_plugin_area_none.inc plugins/views_plugin_area_none.inc
new file mode 100644
index 0000000..c31a0c2
--- /dev/null
+++ plugins/views_plugin_area_none.inc
@@ -0,0 +1,16 @@
+<?php
+// $Id$
+/**
+ * The base plugin to handle area.
+ */
+class views_plugin_area_none extends views_plugin_area {
+
+  function render($empty = FALSE) {
+    return '';
+  }
+
+  function summary_title() {
+    return t('None');
+  }
+}
+
diff --git plugins/views_plugin_area_text.inc plugins/views_plugin_area_text.inc
new file mode 100644
index 0000000..c4b1d6f
--- /dev/null
+++ plugins/views_plugin_area_text.inc
@@ -0,0 +1,74 @@
+<?php
+// $Id$
+/**
+ * @file
+ *   Block plugin for textarea content.
+ */
+class views_plugin_area_text extends views_plugin_area {
+
+  function option_defaults(&$options) {
+    $options['empty'] = FALSE;
+    $options['content'] = '';
+    $options['format'] = variable_get('filter_default_format', 1);
+  }
+
+  function options_form(&$form, &$form_state) {
+    $form['empty'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Display even if view has no result'),
+      '#default_value' => $this->options['empty'],
+    );
+    $form['content'] = array(
+      '#type' => 'textarea',
+      '#default_value' => $this->options['content'],
+      '#rows' => 6,
+      '#description' => t('Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional.'),
+    );
+
+    $form['format'] = filter_form($this->options['format']);
+  }
+
+  function render($empty = FALSE) {
+    if (!$empty || !empty($this->options['empty'])) {
+      return $this->render_textarea($this->options['content'], $this->options['format']);
+    }
+    else {
+      return '';
+    }
+  }
+
+  /**
+   * Render a text area, using the proper format.
+   */
+  function render_textarea($value, $format) {
+    static $formats = array();
+
+    // Check to make sure the filter format exists; if not, we don't
+    // display anything.
+    $format = filter_resolve_format($format);
+
+    if (!array_key_exists($format, $formats)) {
+      $formats[$format] = db_result(db_query("SELECT name FROM {filter_formats} WHERE format = %d", $format));
+    }
+
+    if (!$formats[$format]) {
+      return;
+    }
+
+    if ($value) {
+      return check_markup($value, $format, FALSE);
+    }
+  }
+
+  function summary_title() {
+    $formats = filter_formats();
+    return t('Text @format', array('@format' => $formats[$this->options['format']]->name));
+  }
+
+
+  function options_submit(&$form, &$form_state) {
+    $form_state['values'][$this->type .'_options']['format'] = $form_state['values']['format'];
+    parent::options_submit($form, $form_state);
+  }
+}
+
diff --git plugins/views_plugin_display.inc plugins/views_plugin_display.inc
index 3d25dad..88d7472 100644
--- plugins/views_plugin_display.inc
+++ plugins/views_plugin_display.inc
@@ -160,9 +160,9 @@ class views_plugin_display extends views_plugin {
       'access' => array('access'),
       'cache' => array('cache'),
       'title' => array('title'),
-      'header' => array('header', 'header_format', 'header_empty'),
-      'footer' => array('footer', 'footer_format', 'footer_empty'),
-      'empty' => array('empty', 'empty_format'),
+      'header' => array('area'),
+      'footer' => array('area'),
+      'empty' => array('area'),
       'use_ajax' => array('use_ajax'),
       'items_per_page' => array('items_per_page', 'offset', 'use_pager', 'pager_element'),
       'use_pager' => array('items_per_page', 'offset', 'use_pager', 'pager_element'),
@@ -225,14 +225,9 @@ class views_plugin_display extends views_plugin {
           'access' => TRUE,
           'cache' => TRUE,
           'title' => TRUE,
-          'header' => TRUE,
-          'header_format' => TRUE,
-          'header_empty' => TRUE,
-          'footer' => TRUE,
-          'footer_format' => TRUE,
-          'footer_empty' => TRUE,
-          'empty' => TRUE,
-          'empty_format' => TRUE,
+          'header' => 'text',
+          'footer' => 'text',
+          'empty' => 'text',
 
           'use_ajax' => TRUE,
           'items_per_page' => TRUE,
@@ -293,31 +288,19 @@ class views_plugin_display extends views_plugin {
         'translatable' => TRUE,
       ),
       'header' => array(
-        'default' => '',
-        'translatable' => TRUE,
-      ),
-      'header_format' => array(
-        'default' => FILTER_FORMAT_DEFAULT,
+        'contains' => array(
+          'type' => array('default' => 'none'),
       ),
-      'header_empty' => array(
-        'default' => FALSE,
       ),
       'footer' => array(
-        'default' => '',
-        'translatable' => TRUE,
-      ),
-      'footer_format' => array(
-        'default' => FILTER_FORMAT_DEFAULT,
+        'contains' => array(
+          'type' => array('default' => 'none'),
       ),
-      'footer_empty' => array(
-        'default' => FALSE,
       ),
       'empty' => array(
-        'default' => '',
-        'translatable' => TRUE,
+        'contains' => array(
+          'type' => array('default' => 'none'),
       ),
-      'empty_format' => array(
-        'default' => FILTER_FORMAT_DEFAULT,
       ),
       'use_ajax' => array(
         'default' => FALSE,
@@ -520,6 +503,22 @@ class views_plugin_display extends views_plugin {
   }
 
   /**
+   * Get the area plugin.
+   */
+  function get_area_plugin($name = NULL, $type = '') {
+    if (!$name) {
+      $area = $this->get_option('area_'. $name);
+      $name = $area['type'];
+    }
+
+    $plugin = views_get_plugin('area', $name);
+    if ($plugin) {
+      $plugin->init($this->view, $this->display, $type);
+      return $plugin;
+    }
+  }
+
+  /**
    * Get the handler object for a single handler.
    */
   function &get_handler($type, $id) {
@@ -776,31 +775,27 @@ class views_plugin_display extends views_plugin {
     );
 
     foreach (array('header' => t('Header'), 'footer' => t('Footer'), 'empty' => t('Empty text')) as $type => $name) {
-      if (!$this->get_option($type)) {
-        $field = t('None');
-      }
-      else {
-        // A lot of code to get the name of the filter format.
-        $fmt_string = $this->get_option($type . '_format');
-        if (empty($fmt_string)) {
-          $fmt_string = FILTER_FORMAT_DEFAULT;
-        }
-        $format_val = filter_resolve_format($fmt_string);
-        $format = filter_formats($format_val);
-        if ($format) {
-          $field = check_plain($format->name);
-        }
-        else {
-          $field = t('Unknown/missing format');
-        }
+      $field = $type;
+      $area = $this->get_option($type);
+
+      $area_plugin = $this->get_area_plugin($area['type'], $type);
+      if (!$area_plugin) {
+        // default to the no cache control plugin.
+        $area_plugin = views_get_plugin('area', 'none');
       }
 
+
       $options[$type] = array(
         'category' => 'basic',
         'title' => $name,
-        'value' => $field,
+        'value' => $area_plugin->summary_title(),
         'desc' => t("Change this display's !name.", array('!name' => strtolower($name))),
       );
+
+      if (!empty($area_plugin->definition['uses options'])) {
+        $options[$type]['links'][$type .'_options'] = t('Change settings for this %area type.', array('%area' => $name));
+      }
+
     }
 
     $options['analyze-theme'] = array(
@@ -1000,46 +995,126 @@ class views_plugin_display extends views_plugin {
         break;
       case 'header':
         $form['#title'] .= t('Header');
-        $form['header_empty'] = array(
-          '#type' => 'checkbox',
-          '#title' => t('Display even if view has no result'),
-          '#default_value' => $this->get_option('header_empty'),
-        );
         $form['header'] = array(
-          '#type' => 'textarea',
-          '#default_value' => $this->get_option('header'),
-          '#rows' => 6,
-          '#description' => t('Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional.'),
+          '#prefix' => '<div class="clear-block">',
+          '#suffix' => '</div>',
+          '#tree' => TRUE,
         );
 
-        $form['header_format'] = filter_form($this->get_option('header_format'), NULL, array('header_format'));
+        $header = $this->get_option('header');
+        $form['header']['type'] =  array(
+          '#type' => 'radios',
+          '#options' => views_fetch_plugin_names('area'),
+          '#default_value' => $header['type'],
+        );
+
+        $area_plugin = views_fetch_plugin_data('area', $header['type']);
+        if (!empty($area_plugin['uses options'])) {
+          $form['markup'] = array(
+            '#prefix' => '<div class="form-item description">',
+            '#suffix' => '</div>',
+            '#value' => t('You may also adjust the !settings for the currently selected area-plugin by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'header_options'))),
+          );
+        }
+        break;
+      case 'header_options':
+        $header = $this->get_option('header');
+        $plugin = $this->get_area_plugin($header['type'], 'header');
+        $form['#title'] .= t('Header options');
+        if ($plugin) {
+          $form['#help_topic'] = $plugin->definition['help topic'];
+
+          $form['header_options'] = array(
+            '#tree' => TRUE,
+          );
+          $form['header_options']['type'] = array(
+            '#type' => 'value',
+            '#value' => $header['type'],
+          );
+          $plugin->options_form($form['header_options'], $form_state);
+        }
         break;
       case 'footer':
         $form['#title'] .= t('Footer');
-        $form['footer_empty'] = array(
-          '#type' => 'checkbox',
-          '#title' => t('Display even if view has no result'),
-          '#default_value' => $this->get_option('footer_empty'),
-        );
         $form['footer'] = array(
-          '#type' => 'textarea',
-          '#default_value' => $this->get_option('footer'),
-          '#rows' => 6,
-          '#description' => t('Text to display beneath the view. May contain an explanation or links or whatever you like. Optional.'),
+          '#prefix' => '<div class="clear-block">',
+          '#suffix' => '</div>',
+          '#tree' => TRUE,
+        );
+
+        $footer = $this->get_option('footer');
+        $form['footer']['type'] =  array(
+          '#type' => 'radios',
+          '#options' => views_fetch_plugin_names('area'),
+          '#default_value' => $footer['type'],
         );
 
-        $form['footer_format'] = filter_form($this->get_option('footer_format'), NULL, array('footer_format'));
+        $area_plugin = views_fetch_plugin_data('area', $footer['type']);
+        if (!empty($area_plugin['uses options'])) {
+          $form['markup'] = array(
+            '#prefix' => '<div class="form-item description">',
+            '#suffix' => '</div>',
+            '#value' => t('You may also adjust the !settings for the currently selected area-plugin by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'footer_options'))),
+          );
+        }
+        break;
+      case 'footer_options':
+        $footer = $this->get_option('footer');
+        $plugin = $this->get_area_plugin($footer['type'], 'footer');
+        $form['#title'] .= t('Footer options');
+        if ($plugin) {
+          $form['#help_topic'] = $plugin->definition['help topic'];
+
+          $form['footer_options'] = array(
+            '#tree' => TRUE,
+          );
+          $form['footer_options']['type'] = array(
+            '#type' => 'value',
+            '#value' => $footer['type'],
+          );
+          $plugin->options_form($form['footer_options'], $form_state);
+        }
         break;
       case 'empty':
         $form['#title'] .= t('Empty text');
         $form['empty'] = array(
-          '#type' => 'textarea',
-          '#default_value' => $this->get_option('empty'),
-          '#rows' => 6,
-          '#description' => t('Text to display if the view has no results. Optional.'),
+          '#prefix' => '<div class="clear-block">',
+          '#suffix' => '</div>',
+          '#tree' => TRUE,
         );
 
-        $form['empty_format'] = filter_form($this->get_option('empty_format'), NULL, array('empty_format'));
+        $empty = $this->get_option('empty');
+        $form['empty']['type'] =  array(
+          '#type' => 'radios',
+          '#options' => views_fetch_plugin_names('area'),
+          '#default_value' => $empty['type'],
+        );
+
+        $area_plugin = views_fetch_plugin_data('area', $empty['type']);
+        if (!empty($area_plugin['uses options'])) {
+          $form['markup'] = array(
+            '#prefix' => '<div class="form-item description">',
+            '#suffix' => '</div>',
+            '#value' => t('You may also adjust the !settings for the currently selected area-plugin by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'empty_options'))),
+          );
+        }
+        break;
+      case 'empty_options':
+        $empty = $this->get_option('empty');
+        $plugin = $this->get_area_plugin($empty['type'], 'empty');
+        $form['#title'] .= t('Empty options');
+        if ($plugin) {
+          $form['#help_topic'] = $plugin->definition['help topic'];
+
+          $form['empty_options'] = array(
+            '#tree' => TRUE,
+          );
+          $form['empty_options']['type'] = array(
+            '#type' => 'value',
+            '#value' => $empty['type'],
+          );
+          $plugin->options_form($form['empty_options'], $form_state);
+        }
         break;
       case 'style_plugin':
         $form['#title'] .= t('How should this view be styled');
@@ -1538,10 +1613,29 @@ class views_plugin_display extends views_plugin {
       case 'header':
       case 'footer':
       case 'empty':
-        $this->set_option($section, $form_state['values'][$section]);
-        $this->set_option($section . '_format', $form_state['values'][$section . '_format']);
-        if ($section != 'empty') {
-          $this->set_option($section . '_empty', $form_state['values'][$section . '_empty']);
+        $sec = $form_state['values'][$section];
+        $area = $this->get_option[$sec];
+        if ($area['type'] != $sec['type']) {
+          $plugin = views_get_plugin('area', $sec['type']);
+          if ($plugin) {
+            $area = array('type' => $sec['type']);
+            $plugin->option_defaults($area);
+            $this->set_option($section, $area);
+            if (!empty($plugin->definition['uses options'])) {
+              views_ui_add_form_to_stack('display', $this->view, $this->display->id, array($section .'_options'));
+            }
+          }
+        }
+        break;
+      case 'header_options':
+      case 'footer_options':
+      case 'empty_options':
+        $sec = $form_state['values'][$section];
+        $area = str_replace('_options', '', $section);
+        $plugin = $this->get_area_plugin($sec['type'], $area);
+        if ($plugin) {
+          $plugin->options_submit($form[$section], $form_state);
+          $this->set_option($area, $form_state['values'][$section]);
         }
         break;
       case 'exposed_block':
@@ -1666,30 +1760,6 @@ class views_plugin_display extends views_plugin {
   }
 
   /**
-   * Render a text area, using the proper format.
-   */
-  function render_textarea($area) {
-    static $formats = array();
-
-    $value = $this->get_option($area);
-    // Check to make sure the filter format exists; if not, we don't
-    // display anything.
-    $format = filter_resolve_format($this->get_option($area . '_format'));
-
-    if (!array_key_exists($format, $formats)) {
-      $formats[$format] = db_result(db_query("SELECT name FROM {filter_formats} WHERE format = %d", $format));
-    }
-
-    if (!$formats[$format]) {
-      return;
-    }
-
-    if ($value) {
-      return check_markup($value, $format, FALSE);
-    }
-  }
-
-  /**
    * Render the header of the view.
    */
   function render_header() {
diff --git theme/theme.inc theme/theme.inc
index b9080ee..d8fcf98 100644
--- theme/theme.inc
+++ theme/theme.inc
@@ -49,26 +49,37 @@ function template_preprocess_views_view(&$vars) {
   $vars['name']       = $view->name;
   $vars['display_id'] = $view->current_display;
 
-  if (!$vars['rows']) {
-    $vars['empty']    = $view->display_handler->render_empty();
-    if (!$view->display_handler->get_option('header_empty')) {
-      $vars['header'] = '';
+  $header_options = $view->display_handler->get_option('header');
+  $footer_options = $view->display_handler->get_option('footer');
+  $header = $view->display_handler->get_area_plugin($header_options['type'], 'header');
+  $footer = $view->display_handler->get_area_plugin($footer_options['type'], 'footer');
+  if (!$header) {
+    $header = views_get_plugin('area', 'none');
+  }
+  if (!$footer) {
+    $footer = views_get_plugin('area', 'none');
     }
-    if (!$view->display_handler->get_option('footer_empty')) {
-      $vars['footer'] = '';
+
+  if (!$vars['rows']) {
+    $empty_options = $view->display_handler->get_option('empty');
+    $empty = $view->display_handler->get_area_plugin($empty_options['type'], 'empty');
+    if (!$empty) {
+      $empty = views_get_plugin('area', 'none');
     }
+    $vars['empty'] = $empty->render();
+    $vars['header'] = $header->render(TRUE);
+    $vars['footer'] = $footer->render(TRUE);
   }
   else {
     $vars['empty']    = '';
-    $header = TRUE;
   }
 
   $vars['exposed']    = !empty($view->exposed_widgets) ? $view->exposed_widgets : '';
   if (!isset($vars['header'])) {
-    $vars['header']   = $view->display_handler->render_header();
+    $vars['header']   = $header->render();
   }
   if (!isset($vars['footer'])) {
-    $vars['footer']   = $view->display_handler->render_footer();
+    $vars['footer']   = $footer->render();
   }
   $vars['more']       = $view->display_handler->render_more_link();
   $vars['feed_icon']  = !empty($view->feed_icon) ? $view->feed_icon : '';
