diff --git a/components/fieldset.inc b/components/fieldset.inc
index 5936289..798856b 100644
--- a/components/fieldset.inc
+++ b/components/fieldset.inc
@@ -63,6 +63,11 @@ function _webform_render_fieldset($component, $value = NULL, $filter = TRUE) {
     '#webform_component' => $component,
   );
 
+  // Hide the fieldset title if #title_display is 'none'.
+  if (!empty($component['extra']['title_display']) && $component['extra']['title_display'] == 'none') {
+    $element['#title'] = NULL;
+  }
+
   return $element;
 }
 
diff --git a/components/hidden.inc b/components/hidden.inc
index ef29fda..142d985 100644
--- a/components/hidden.inc
+++ b/components/hidden.inc
@@ -47,7 +47,7 @@ function _webform_edit_hidden($component) {
   );
   $form['extra']['description'] = array(); // Hide the description box.
   $form['display'] = array('#type' => 'markup'); // Hide the display options.
-  $form['display']['title_display'] = array();
+
   return $form;
 }
 
diff --git a/components/markup.inc b/components/markup.inc
index ae84684..2a99d1b 100644
--- a/components/markup.inc
+++ b/components/markup.inc
@@ -38,7 +38,6 @@ function _webform_edit_markup($component) {
 
   $form['extra']['description'] = array(); // No description for markup.
   $form['display'] = array('#type' => 'markup'); // Hide the display options.
-  $form['display']['title_display'] = array();
 
   return $form;
 }
diff --git a/components/pagebreak.inc b/components/pagebreak.inc
index 5440054..b373ca4 100644
--- a/components/pagebreak.inc
+++ b/components/pagebreak.inc
@@ -42,7 +42,6 @@ function _webform_edit_pagebreak($component) {
 
   $form['extra']['description'] = array();  // No description.
   $form['display'] = array('#type' => 'markup'); // Hide the display options.
-  $form['display']['title_display'] = array();
 
   return $form;
 }
diff --git a/css/webform.css b/css/webform.css
index 2238101..cd379d0 100644
--- a/css/webform.css
+++ b/css/webform.css
@@ -7,7 +7,14 @@ input.webform-calendar {
   padding: 3px;
   vertical-align: top;
 }
+.webform-container-inline label {
+  display: inline;
+  margin-right: 1em;
+}
 .webform-container-inline div,
 .webform-container-inline div.form-item {
   display: inline;
 }
+.webform-container-inline div.description {
+  display: block;
+}
diff --git a/includes/webform.components.inc b/includes/webform.components.inc
index 4dafc3e..555bc10 100644
--- a/includes/webform.components.inc
+++ b/includes/webform.components.inc
@@ -396,15 +396,32 @@ function webform_component_edit_form($form, $form_state, $node, $component, $clo
     '#collapsed' => FALSE,
     '#weight' => 8,
   );
-  $form['display']['title_display'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Hide component title'),
-    '#default_value' => !empty($component['extra']['title_display']),
-    '#return_value' => 'none',
-    '#description' => t('Do not display the title or label of this field in the form.'),
-    '#weight' => 8,
-    '#parents' => array('extra', 'title_display'),
-  );
+  if (webform_component_feature($component['type'], 'title_display')) {
+    if (webform_component_feature($component['type'], 'title_inline')) {
+      $form['display']['title_display'] = array(
+        '#type' => 'select',
+        '#title' => t('Label display'),
+        '#default_value' => !empty($component['extra']['title_display']) ? $component['extra']['title_display'] : 'before',
+        '#options' => array(
+          'before' => t('Above'),
+          'inline' => t('Inline'),
+          'none' => t('None'),
+        ),
+        '#description' => t('Determines the placement of the component\'s label.'),
+      );
+    }
+    else {
+      $form['display']['title_display'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Hide label'),
+        '#default_value' => !empty($component['extra']['title_display']),
+        '#return_value' => 'none',
+        '#description' => t('Do not display the label of this component.'),
+      );
+    }
+    $form['display']['title_display']['#weight'] = 8;
+    $form['display']['title_display']['#parents'] = array('extra', 'title_display');
+  }
 
   // Validation settings.
   $form['validation'] = array(
@@ -830,6 +847,8 @@ function webform_component_clone(&$node, &$component) {
 
 /**
  * Check if a component has a particular feature.
+ *
+ * @see hook_webform_component_info()
  */
 function webform_component_feature($type, $feature) {
   $components = webform_components();
@@ -839,9 +858,12 @@ function webform_component_feature($type, $feature) {
     'email_address' => FALSE,
     'email_name' => FALSE,
     'required' => TRUE,
+    'title_display' => TRUE,
+    'title_inline' => TRUE,
     'conditional' => TRUE,
     'spam_analysis' => FALSE,
     'group' => FALSE,
+    'attachment' => FALSE,
   );
   return isset($components[$type]['features'][$feature]) ? $components[$type]['features'][$feature] : !empty($defaults[$feature]);
 }
diff --git a/webform.module b/webform.module
index e76b482..d6cbfa3 100644
--- a/webform.module
+++ b/webform.module
@@ -737,6 +737,7 @@ function webform_webform_component_info() {
         'required' => FALSE,
         'conditional' => FALSE,
         'group' => TRUE,
+        'title_inline' => FALSE,
       ),
       'file' => 'components/fieldset.inc',
     ),
@@ -754,6 +755,7 @@ function webform_webform_component_info() {
       'description' => t('Allows creation of grid questions, denoted by radio buttons.'),
       'features' => array(
         'conditional' => FALSE,
+        'title_inline' => FALSE,
       ),
       'file' => 'components/grid.inc',
     ),
@@ -765,6 +767,7 @@ function webform_webform_component_info() {
         'required' => FALSE,
         'email_address' => TRUE,
         'email_name' => TRUE,
+        'title_display' => FALSE,
       ),
     ),
     'markup' => array(
@@ -775,6 +778,7 @@ function webform_webform_component_info() {
         'email' => FALSE,
         'required' => FALSE,
         'conditional' => FALSE,
+        'title_display' => FALSE,
       ),
       'file' => 'components/markup.inc',
     ),
@@ -784,6 +788,7 @@ function webform_webform_component_info() {
       'features' => array(
         'csv' => FALSE,
         'required' => FALSE,
+        'title_display' => FALSE,
       ),
       'file' => 'components/pagebreak.inc',
     ),
@@ -802,6 +807,7 @@ function webform_webform_component_info() {
       'file' => 'components/textarea.inc',
       'features' => array(
         'spam_analysis' => TRUE,
+        'title_inline' => FALSE,
       ),
     ),
     'textfield' => array(
@@ -2426,6 +2432,9 @@ function theme_webform_element($variables) {
    'webform-component',
    'webform-component-' . $type,
   );
+  if (isset($element['#title_display']) && $element['#title_display'] == 'inline') {
+    $wrapper_classes[] = 'webform-container-inline';
+  }
   $output = '<div class="' . implode(' ', $wrapper_classes) . '" id="webform-component-' . $parents . '">' . "\n";
   $required = !empty($element['#required']) ? '<span class="form-required" title="' . t('This field is required.') . '">*</span>' : '';
 
@@ -2437,6 +2446,7 @@ function theme_webform_element($variables) {
   $suffix = isset($element['#field_suffix']) ? ' <span class="field-suffix">' . _webform_filter_xss($element['#field_suffix']) . '</span>' : '';
 
   switch ($element['#title_display']) {
+    case 'inline':
     case 'before':
     case 'invisible':
       $output .= ' ' . theme('form_element_label', $variables);
diff --git a/webform_hooks.php b/webform_hooks.php
index 43b610b..d4d0578 100644
--- a/webform_hooks.php
+++ b/webform_hooks.php
@@ -307,23 +307,39 @@ function hook_webform_component_info() {
     'features' => array(
       // Add content to CSV downloads. Defaults to TRUE.
       'csv' => TRUE,
+
       // Show this field in e-mailed submissions. Defaults to TRUE.
       'email' => TRUE,
+
       // Allow this field to be used as an e-mail FROM or TO address. Defaults
       // to FALSE.
       'email_address' => FALSE,
+
       // Allow this field to be used as an e-mail SUBJECT or FROM name. Defaults
       // to FALSE.
       'email_name' => TRUE,
+
       // This field may be toggled as required or not. Defaults to TRUE.
       'required' => TRUE,
+
+      // This field has a title that can be toggled as displayed or not.
+      'title_display' => TRUE,
+
+      // This field has a title that can be displayed inline.
+      'title_inline' => TRUE,
+
       // If this field can be used as a conditional SOURCE. All fields may
       // always be displayed conditionally, regardless of this setting.
       // Defaults to TRUE.
       'conditional' => TRUE,
+
       // If this field allows other fields to be grouped within it (like a
       // fieldset or tabs). Defaults to FALSE.
       'group' => FALSE,
+
+      // If this field can be used for SPAM analysis, usually with Mollom.
+      'spam_analysis' => FALSE,
+
       // If this field saves a file that can be used as an e-mail attachment.
       // Defaults to FALSE.
       'attachment' => FALSE,
