diff --git a/ctools.module b/ctools.module
index 7b7499e..88e44f9 100644
--- a/ctools.module
+++ b/ctools.module
@@ -439,6 +439,14 @@ function ctools_flush_caches() {
 }
 
 /**
+ * Implements hook_element_info().
+ */
+function ctools_element_info() {
+  ctools_include('elements');
+  return ctools_elements_element_info();
+}
+
+/**
  * Implements hook_element_info_alter().
  *
  */
diff --git a/includes/elements.inc b/includes/elements.inc
new file mode 100644
index 0000000..4eb8b21
--- /dev/null
+++ b/includes/elements.inc
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @file
+ * Provide a HTML element select element.
+ */
+
+/**
+ * Implements hook_element_info().
+ */
+function ctools_elements_element_info() {
+  $types['html_element'] = array(
+    '#input' => TRUE,
+    '#process' => array('ctools_elements_html_element_process'),
+    '#submit' => array('ctools_elements_html_element_submit'),
+    '#element_validate' => array('ctools_elements_html_element_validate'),
+    '#autocomplete_path' => FALSE,
+    '#pre_render' => array('ctools_dependent_pre_render', 'ctools_elements_html_element_pre_render'),
+    '#value_callback' => 'ctools_elements_html_element_value',
+  );
+
+  return $types;
+}
+
+/**
+ * Process callback for the HTML element.
+ */
+function ctools_elements_html_element_process($element, &$form_state, $complete_form) {
+  $element['#tree'] = TRUE;
+
+  $options = isset($element['#options']) ? $element['#options'] : array(
+    '' => t('- Use default -'),
+    '0' => t('- None -'),
+    'custom' => t('- Custom -'),
+    'div' => t('DIV'),
+    'span' => t('SPAN'),
+    'h1' => t('H1'),
+    'h2' => t('H2'),
+    'h3' => t('H3'),
+    'h4' => t('H4'),
+    'h5' => t('H5'),
+    'h6' => t('H6'),
+    'p' => t('P'),
+    'strong' => t('STRONG'),
+    'em' => t('EM'),
+  );
+  $element['element_type_list'] = array(
+    '#type' => 'select',
+    '#title' => t('HTML element'),
+    '#value' => $element['#default_value']['element_type_list'],
+    '#options' => $options,
+  );
+  if (isset($element['#dependency'])) {
+    $element['element_type_list']['#dependency'] = $element['#dependency'];
+  }
+  $element['element_type_custom'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Custom HTML element'),
+    '#value' => $element['#default_value']['element_type_custom'],
+    '#size' => 16,
+    '#maxlength' => 128,
+    '#dependency' => array(
+      $element['#id'] . '-element-type-list' => array('custom'),
+    ),
+  );
+
+  return $element;
+}
+
+function ctools_elements_html_element_value(&$element, $input = FALSE, $form_state = NULL) {
+  if (!isset($input['element_type_list'])) {
+    return '';
+  }
+
+  if (isset($input['element_type_custom']) && $input['element_type_list'] == 'custom') {
+    return $input['element_type_custom'];
+  }
+
+  return $input['element_type_list'];
+}
+
+function ctools_elements_html_element_pre_render($element, &$form_state) {
+  if (isset($element['element_type_list']['#options'][$element['#default_value']])) {
+    $element['element_type_list']['#value'] = $element['#default_value'];
+    $element['element_type_custom']['#value'] = '';
+  }
+  else {
+    $element['element_type_list']['#value'] = 'custom';
+    $element['element_type_custom']['#value'] = $element['#default_value'];
+  }
+  return $element;
+}
+
+function ctools_elements_html_element_validate($element, &$form_state) {
+  $form_state['values']['options']['element_type'] = $element['#value'];
+  return $element;
+}
