diff --git a/includes/handlers.inc b/includes/handlers.inc
index 47e0a49..5b3c3b0 100644
--- a/includes/handlers.inc
+++ b/includes/handlers.inc
@@ -1587,3 +1587,5 @@ function upload_views_api() { return views_views_api(); }
 function user_views_api() { return views_views_api(); }
 
 function contact_views_api() { return views_views_api(); }
+
+function ctools_views_api() { return views_views_api(); }
diff --git a/modules/ctools.views.inc b/modules/ctools.views.inc
new file mode 100644
index 0000000..982f3eb
--- /dev/null
+++ b/modules/ctools.views.inc
@@ -0,0 +1,52 @@
+<?php
+// $Id
+
+/**
+ * @file
+ * Provide basic views data for ctools.module.
+ */
+
+/**
+ * Implementation of hook_views_data()
+ */
+function ctools_views_data() {
+  ctools_include('content');
+  // Set up the handlers for our unique items.
+  $types = ctools_content_get_available_types();
+  $data = array();
+  foreach ($types as $key => $type) {
+    foreach ($type as $name => $option) {
+      $data['ctools-'. $option['category']][$key .'-'. $name] = array(
+        'title' => $option['title'],
+        'help' => $option['title'],
+        'area' => array(
+          'handler' => 'ctools_handler_area',
+          'type' => $key,
+          'subtype' => $name,
+        ),
+      );
+      $data['ctools-'. $option['category']]['table']['group'] = $option['category'];
+      $data['ctools-'. $option['category']]['table']['join'] = array(
+        '#global' => array(),
+      );
+    }
+  }
+  return $data;
+}
+
+/**
+ * Implement hook_views_handlers() to register all of the
+ * basic handlers views uses.
+ */
+function ctools_views_handlers() {
+  return array(
+     'info' => array(
+      'path' => drupal_get_path('module', 'views') . '/modules/ctools',
+    ),
+    'handlers' => array(
+      'ctools_handler_area' => array(
+        'parent' => 'views_handler_area',
+      ),
+    ),
+  );
+}
diff --git a/modules/ctools/ctools_handler_area.inc b/modules/ctools/ctools_handler_area.inc
new file mode 100644
index 0000000..d7d05fc
--- /dev/null
+++ b/modules/ctools/ctools_handler_area.inc
@@ -0,0 +1,101 @@
+<?php
+
+class ctools_handler_area extends views_handler_area {
+  // Allow for handler-specific options.
+  function option_definition() {
+    $options = parent::option_definition();
+    $content = $this->ctools_content();
+    $options['label']['default'] = isset($content->subject) ? $content->subject : '';
+    $options['label-dynamic']['default'] = TRUE;
+    $options['label-header']['default'] = 'h2';
+    $options['css-id']['default'] = $content->type .'-'. $content->subtype;
+    $options['css-class']['default'] = $content->subtype;
+    return $options;
+  }
+
+  // Allow for handler-specific forms.
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['label-dynamic'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use dynamic label'),
+      '#description' => t('If selected, use the label generated by the content.'),
+      '#default_value' => $this->options['label-dynamic'],
+      '#weight' => -1,
+    );
+    $options = array(
+      'strong',
+      'em',
+      'h1',
+      'h2',
+      'h3',
+      'h4',
+      'h5',
+      'h6',
+    );
+    $form['label-header'] = array(
+      '#type' => 'select',
+      '#title' => t('Label HTML'),
+      '#options' => drupal_map_assoc($options),
+      '#description' => t('HTML tag to use around the header item.'),
+      '#default_value' => $this->options['label-header'],
+    );
+    $form['css-id'] = array(
+      '#type' => 'textfield',
+      '#title' => t('CSS ID'),
+      '#description' => t('A CSS id to wrap around this content.'),
+      '#default_value' => $this->options['css-id'],
+    );
+    $form['css-class'] = array(
+      '#type' => 'textfield',
+      '#title' => t('CSS Class'),
+      '#description' => t('A CSS class to wrap around this content.'),
+      '#default_value' => $this->options['css-class'],
+    );
+  }
+
+  // Call the registered output function.
+  function render($empty = FALSE) {
+    $args = isset($this->view->args) ? $this->view->args : array();
+    $conf = $this->options;
+    $keywords = array();
+    $context = array();
+    if (!empty($this->definition['render_callback'])) {
+      $func = $this->definition['render_callback'];
+      if (function_exists($func)) {
+        return $func($this->options);
+      }
+    }
+    $content = $this->ctools_content($conf, $keywords, $args, $context, $incoming_content);
+    $id = '';
+    $class = '';
+    if (!empty($this->options['css-id'])) {
+      $id = 'id="'. check_plain($this->options['css-id']) .'" ';
+    }
+    if (!empty($this->options['css-class'])) {
+      $class = 'class="'. check_plain($this->options['css-class']) .'" ';
+    }
+    $output = "<div $id$class>\n";
+    $tag = $close_tag = '';
+    if (!empty($this->options['label-header'])) {
+      $tag =  '<'. $this->options['label-header'] .'>';
+      $close_tag =  '</'. $this->options['label-header'] .'>';
+    }
+    if (!empty($this->options['label-dynamic']) && isset($content->subject)) {
+      $output .= $tag . check_plain($content->subject) . $close_tag;
+    }
+    else if (!empty($this->options['label'])) {
+      $output .= $tag . check_plain($this->options['label']) . $close_tag;
+    }
+    $output .= $content->content;
+    $output .= "\n</div>\n";
+    return $output;
+  }
+
+  // Generate CTools content for this object.
+  function ctools_content($conf = array(), $keywords = array(), $args = array(), $context = array(), $incoming_content = '') {
+    ctools_include('content');
+    return ctools_content_render($this->definition['type'], $this->definition['subtype'], $conf, $keywords, $args, $context, $incoming_content);
+  }
+
+}
