diff --git includes/plugins.inc includes/plugins.inc
index 646f78c..ea931b5 100644
--- includes/plugins.inc
+++ includes/plugins.inc
@@ -267,6 +267,34 @@ 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,
+      ),
+      'php' => array(
+        'title' => t('PHP'),
+        'help' => t('PHP Code which is evaled'),
+        'handler' => 'views_plugin_area_php',
+        'help topic' => 'area-php',
+        'uses options' => TRUE,
+      ),
+    ),
   );
 }
 
diff --git plugins/views_plugin_area.inc plugins/views_plugin_area.inc
new file mode 100644
index 0000000..d7a4cea
--- /dev/null
+++ plugins/views_plugin_area.inc
@@ -0,0 +1,26 @@
+<?php
+// $Id$
+/**
+ * The base plugin to handle area.
+ */
+class views_plugin_area extends views_plugin {
+  function init($view, $display, $type) {
+    $this->view = &$view;
+    $this->display = &$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);
+    }
+  }
+
+  function options_form(&$form, &$form_state) {
+  }
+
+  function summary_title() { }
+
+  function render() { }
+}
+
diff --git plugins/views_plugin_area_none.inc plugins/views_plugin_area_none.inc
new file mode 100644
index 0000000..39b0c90
--- /dev/null
+++ plugins/views_plugin_area_none.inc
@@ -0,0 +1,22 @@
+<?php
+// $Id$
+/**
+ * The base plugin to handle area.
+ */
+class views_plugin_area_none extends views_plugin_area {
+  function init($view, $display, $type) {
+    parent::init($view, $display, $type);
+  }
+
+  function options_form(&$form, &$form_state) {
+  }
+
+  function render() {
+    return '';
+  }
+
+  function summary_title() {
+    return t('None');
+  }
+}
+
diff --git plugins/views_plugin_area_php.inc plugins/views_plugin_area_php.inc
new file mode 100644
index 0000000..9b2a27e
--- /dev/null
+++ plugins/views_plugin_area_php.inc
@@ -0,0 +1,45 @@
+<?php
+// $Id$
+/**
+ * @file
+ *   Block plugin for textarea content.
+ */
+class views_plugin_area_php extends views_plugin_area {
+  function init($view, $display, $type) {
+    parent::init($view, $display, $type);
+  }
+
+  function option_defaults(&$options) {
+    $options['empty'] = FALSE;
+    $options['content'] = '';
+  }
+
+  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('Php code to render the page.'),
+    );
+  }
+
+  function render($empty = FALSE) {
+    if (!$empty || $this->options['empty']) {
+      return drupal_eval($this->options['content']);
+    }
+    else {
+      return '';
+    }
+  }
+
+
+  function summary_title() {
+    return t('PHP');
+  }
+}
+
diff --git plugins/views_plugin_area_text.inc plugins/views_plugin_area_text.inc
new file mode 100644
index 0000000..a1a4052
--- /dev/null
+++ plugins/views_plugin_area_text.inc
@@ -0,0 +1,53 @@
+<?php
+// $Id$
+/**
+ * @file
+ *   Block plugin for textarea content.
+ */
+class views_plugin_area_text extends views_plugin_area {
+  function init($view, $display, $type) {
+    parent::init($view, $display, $type);
+  }
+
+  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'], NULL, array('format'));
+  }
+
+  function render($empty = FALSE) {
+    if (!$empty || $this->options['empty']) {
+      return check_markup($this->options['content'], $this->options['format'], FALSE);
+    }
+    else {
+      return '';
+    }
+  }
+
+  function summary_title() {
+    return t('Text');
+  }
+
+
+  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 de3df38..712a1cb 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,
@@ -520,6 +515,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 +787,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 +1007,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,
+        );
+
+        $header = $this->get_option('header');
+        $form['header']['type'] =  array(
+          '#type' => 'radios',
+          '#options' => views_fetch_plugin_names('area'),
+          '#default_value' => $header['type'],
         );
 
-        $form['header_format'] = filter_form($this->get_option('header_format'), NULL, array('header_format'));
+        $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 style 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 style 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['#title'] .= t('Empty');
         $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,
+        );
+
+        $empty = $this->get_option('empty');
+        $form['empty']['type'] =  array(
+          '#type' => 'radios',
+          '#options' => views_fetch_plugin_names('area'),
+          '#default_value' => $empty['type'],
         );
 
-        $form['empty_format'] = filter_form($this->get_option('empty_format'), NULL, array('empty_format'));
+        $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 style 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 +1625,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':
diff --git theme/theme.inc theme/theme.inc
index abd8b9b..9e1c4e5 100644
--- theme/theme.inc
+++ theme/theme.inc
@@ -49,26 +49,34 @@ function template_preprocess_views_view(&$vars) {
   $vars['name']       = $view->name;
   $vars['display_id'] = $view->current_display;
 
+  $header = $view->display_handler->get_area_plugin($view->display_handler->options['header']['type'], 'header');
+  $footer = $view->display_handler->get_area_plugin($view->display_handler->options['footer']['type'], 'footer');
+  if (!$header) {
+    $header = views_get_plugin('area', 'none');
+  }
+  if (!$footer) {
+    $footer = views_get_plugin('area', 'none');
+  }
+
   if (!$vars['rows']) {
-    $vars['empty']    = $view->display_handler->render_empty();
-    if (!$view->display_handler->get_option('header_empty')) {
-      $vars['header'] = '';
-    }
-    if (!$view->display_handler->get_option('footer_empty')) {
-      $vars['footer'] = '';
+    $empty = $view->display_handler->get_area_plugin($view->display_handler->options['empty']['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['empty'] = '';
   }
 
   $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 : '';
