diff --git a/css/webform-admin.css b/css/webform-admin.css
index b354df2..671df4e 100644
--- a/css/webform-admin.css
+++ b/css/webform-admin.css
@@ -99,9 +99,6 @@ table.webform-file-extensions input.form-text {
 .webform-container-inline div.form-item {
   display: inline;
 }
-.webform-default-value {
-  color: #999;
-}
 .webform-results-per-page a.selected {
   font-weight: bold;
 }
diff --git a/includes/webform.components.inc b/includes/webform.components.inc
index 6ae4cc6..539f75f 100644
--- a/includes/webform.components.inc
+++ b/includes/webform.components.inc
@@ -167,11 +167,10 @@ function template_preprocess_webform_components_form(&$variables) {
 
   // Add a row containing form elements for a new item.
   unset($form['add']['name']['#title'], $form['add_type']['#description']);
-  $form['add']['name']['#attributes']['rel'] = t('New component name');
-  $form['add']['name']['#attributes']['class'] = array('webform-default-value');
-  $form['add']['cid']['#attributes']['class'] = array('webform-cid');
-  $form['add']['pid']['#attributes']['class'] = array('webform-pid');
-  $form['add']['weight']['#attributes']['class'] = array('webform-weight');
+  $form['add']['name']['#attributes']['placeholder'] = t('New component name');
+  $form['add']['cid']['#attributes']['class'][] = 'webform-cid';
+  $form['add']['pid']['#attributes']['class'][] = 'webform-pid';
+  $form['add']['weight']['#attributes']['class'][] = 'webform-weight';
   $row_data = array(
     drupal_render($form['add']['name']),
     drupal_render($form['add']['type']),
diff --git a/includes/webform.emails.inc b/includes/webform.emails.inc
index d178768..d753222 100644
--- a/includes/webform.emails.inc
+++ b/includes/webform.emails.inc
@@ -131,15 +131,17 @@ function theme_webform_email_add_form($variables) {
   $form = $variables['form'];
 
   // Add a default value to the custom e-mail textfield.
-  $form['email_custom']['#attributes']['rel'] = t('email@example.com');
-  $form['email_custom']['#attributes']['class'] = array('webform-set-active', 'webform-default-value');
+  $form['email_custom']['#attributes']['placeholder'] = t('email@example.com');
+  $form['email_custom']['#attributes']['class'][] = 'webform-set-active';
+  $form['email_custom']['#theme_wrappers'] = array();
   $form['email_option']['custom']['#theme_wrappers'] = array('webform_inline_radio');
-  $form['email_option']['custom']['#inline_element'] = drupal_render($form['email_custom']);
+  $form['email_option']['custom']['#title'] = t('Address: !email', array('!email' => drupal_render($form['email_custom'])));
 
   // Render the component value.
-  $form['email_component']['#attributes']['class'] = array('webform-set-active');
+  $form['email_component']['#theme_wrappers'] = array();
+  $form['email_component']['#attributes']['class'][] = 'webform-set-active';
   $form['email_option']['component']['#theme_wrappers'] = array('webform_inline_radio');
-  $form['email_option']['component']['#inline_element'] = drupal_render($form['email_component']);
+  $form['email_option']['component']['#title'] = t('Component value: !component', array('!component' => drupal_render($form['email_component'])));
 
   return drupal_render_children($form);
 }
@@ -367,11 +369,13 @@ function theme_webform_email_edit_form($variables) {
   // Loop through fields, rendering them into radio button options.
   foreach (array('email', 'subject', 'from_address', 'from_name') as $field) {
     foreach (array('custom', 'component') as $option) {
-      $form[$field . '_' . $option]['#attributes']['class'] = array('webform-set-active');
+      $form[$field . '_' . $option]['#attributes']['class'][] = 'webform-set-active';
+      $form[$field . '_' . $option]['#theme_wrappers'] = array();
       $form[$field . '_option'][$option]['#theme_wrappers'] = array('webform_inline_radio');
-      $form[$field . '_option'][$option]['#inline_element'] = drupal_render($form[$field . '_' . $option]);
+      $form[$field . '_option'][$option]['#title'] = t('!title: !field', array('!title' => $form[$field . '_option'][$option]['#title'], '!field' => drupal_render($form[$field . '_' . $option])));
     }
     if (isset($form[$field . '_option']['#options']['default'])) {
+      $form[$field]['#theme_wrappers'] = array();
       $form[$field . '_option']['default']['#theme_wrappers'] = array('webform_inline_radio');
     }
   }
diff --git a/includes/webform.pages.inc b/includes/webform.pages.inc
index c1cccdd..fb13868 100644
--- a/includes/webform.pages.inc
+++ b/includes/webform.pages.inc
@@ -74,6 +74,7 @@ function webform_configure_form($form, &$form_state, $node) {
       'url' => t('Custom URL'),
       'none' => t('No redirect (reload current page)'),
     ),
+    '#parents' => array('redirect'),
   );
   $form['submission']['redirection']['redirect_url'] = array(
     '#type' => 'textfield',
@@ -81,6 +82,8 @@ function webform_configure_form($form, &$form_state, $node) {
     '#description' => t('URL to redirect the user to upon successful submission.'),
     '#default_value' => $redirect_url,
     '#maxlength' => 2048,
+    '#parents' => array('redirect_url'),
+    '#attributes' => array('title' => t('Custom URL value')),
   );
 
   // Submission limit settings for all submissions.
@@ -355,17 +358,15 @@ function webform_configure_form_submit_save($form, &$form_state) {
 function theme_webform_advanced_redirection_form($variables) {
   $form = $variables['form'];
   // Add special class for setting the active radio button.
-  $form['redirect_url']['#attributes']['class'] = array('webform-set-active');
+  $form['redirect_url']['#attributes']['class'][] = 'webform-set-active';
 
-  // Remove title and description for Redirect URL field.
-  $form['redirect_url']['#title'] = NULL;
-  $form['redirect_url']['#description'] = NULL;
+  // Remove wrappers around the inline Redirect URL field.
+  $form['redirect_url']['#theme_wrappers'] = array();
 
   $form['redirect']['confirmation']['#theme_wrappers'] = array('webform_inline_radio');
   $form['redirect']['url']['#theme_wrappers'] = array('webform_inline_radio');
   $form['redirect']['none']['#theme_wrappers'] = array('webform_inline_radio');
-  $form['redirect']['url']['#inline_element'] = $form['redirect']['url']['#title'] . ': ' . drupal_render($form['redirect_url']);
-  $form['redirect']['url']['#title'] = NULL;
+  $form['redirect']['url']['#title'] = t('Custom URL: !redirect_url', array('!redirect_url' => drupal_render($form['redirect_url'])));
 
   return drupal_render_children($form);
 }
@@ -375,20 +376,15 @@ function theme_webform_advanced_redirection_form($variables) {
  */
 function theme_webform_advanced_submit_limit_form($variables) {
   $form = $variables['form'];
-  $form['submit_limit']['#attributes']['class'] = array('webform-set-active');
-  $form['submit_interval']['#attributes']['class'] = array('webform-set-active');
+  $form['submit_limit']['#attributes']['class'][] = 'webform-set-active';
+  $form['submit_interval']['#attributes']['class'][] = 'webform-set-active';
   // Remove div wrappers around limit options.
   $form['submit_limit']['#theme_wrappers'] = array();
   $form['submit_interval']['#theme_wrappers'] = array();
-  $replacements = array(
-    '!count' => drupal_render($form['submit_limit']),
-    '!timespan' => drupal_render($form['submit_interval']),
-  );
 
   $form['enforce_limit']['no']['#theme_wrappers'] = array('webform_inline_radio');
-  $form['enforce_limit']['yes']['#title'] = NULL;
-  $form['enforce_limit']['yes']['#inline_element'] = t('Limit each user to !count submission(s) !timespan', $replacements);
   $form['enforce_limit']['yes']['#theme_wrappers'] = array('webform_inline_radio');
+  $form['enforce_limit']['yes']['#title'] = t('Limit each user to !count submission(s) !timespan', array('!count' => drupal_render($form['submit_limit']), '!timespan' => drupal_render($form['submit_interval'])));
 
   return drupal_render_children($form);
 }
@@ -398,20 +394,15 @@ function theme_webform_advanced_submit_limit_form($variables) {
  */
 function theme_webform_advanced_total_submit_limit_form($variables) {
   $form = $variables['form'];
-  $form['total_submit_limit']['#attributes']['class'] = array('webform-set-active');
-  $form['total_submit_interval']['#attributes']['class'] = array('webform-set-active');
+  $form['total_submit_limit']['#attributes']['class'][] = 'webform-set-active';
+  $form['total_submit_interval']['#attributes']['class'][] = 'webform-set-active';
   // Remove div wrappers around limit options.
   $form['total_submit_limit']['#theme_wrappers'] = array();
   $form['total_submit_interval']['#theme_wrappers'] = array();
-  $replacements = array(
-    '!count' => drupal_render($form['total_submit_limit']),
-    '!timespan' => drupal_render($form['total_submit_interval']),
-  );
 
   $form['enforce_total_limit']['no']['#theme_wrappers'] = array('webform_inline_radio');
-  $form['enforce_total_limit']['yes']['#title'] = NULL;
-  $form['enforce_total_limit']['yes']['#inline_element'] = t('Limit to !count total submission(s) !timespan', $replacements);
   $form['enforce_total_limit']['yes']['#theme_wrappers'] = array('webform_inline_radio');
+  $form['enforce_total_limit']['yes']['#title'] = t('Limit to !count total submission(s) !timespan', array('!count' => drupal_render($form['total_submit_limit']), '!timespan' => drupal_render($form['total_submit_interval'])));
 
   return drupal_render_children($form);
 }
diff --git a/includes/webform.report.inc b/includes/webform.report.inc
index 7b2fe46..a14138a 100644
--- a/includes/webform.report.inc
+++ b/includes/webform.report.inc
@@ -606,17 +606,18 @@ function theme_webform_results_download_range($variables) {
   }
 
   // Render latest x submissions option.
-  $element['latest']['#attributes']['class'] = array('webform-set-active');
+  $element['latest']['#attributes']['class'][] = 'webform-set-active';
+  $element['latest']['#theme_wrappers'] = array();
   $element['range_type']['latest']['#theme_wrappers'] = array('webform_inline_radio');
-  $element['range_type']['latest']['#inline_element'] = t('Only the latest !number submissions', array('!number' => drupal_render($element['latest'])));
-  $element['range_type']['latest']['#title'] = NULL;
+  $element['range_type']['latest']['#title'] = t('Only the latest !number submissions', array('!number' => drupal_render($element['latest'])));
 
   // Render Start-End submissions option.
-  $element['start']['#attributes']['class'] = array('webform-set-active');
-  $element['end']['#attributes']['class'] = array('webform-set-active');
+  $element['start']['#attributes']['class'][] = 'webform-set-active';
+  $element['end']['#attributes']['class'][] = 'webform-set-active';
+  $element['start']['#theme_wrappers'] = array();
+  $element['end']['#theme_wrappers'] = array();
   $element['range_type']['range']['#theme_wrappers'] = array('webform_inline_radio');
-  $element['range_type']['range']['#inline_element'] = t('All submissions starting from: !start and optionally to: !end', array('!start' => drupal_render($element['start']), '!end' => drupal_render($element['end'])));
-  $element['range_type']['range']['#title'] = NULL;
+  $element['range_type']['range']['#title'] = t('All submissions starting from: !start and optionally to: !end', array('!start' => drupal_render($element['start']), '!end' => drupal_render($element['end'])));
 
   $last_sid = $download_info['sid'] ? $download_info['sid'] : drupal_placeholder(t('none'));
   $element['range_type']['range']['#description'] = '(' . t('Use submission IDs for the range. Last downloaded end SID: !sid.', array('!sid' => $last_sid)) . ')';
diff --git a/js/webform-admin.js b/js/webform-admin.js
index 0e9546e..3850fad 100644
--- a/js/webform-admin.js
+++ b/js/webform-admin.js
@@ -6,8 +6,6 @@
 
 Drupal.behaviors.webformAdmin = {};
 Drupal.behaviors.webformAdmin.attach = function(context) {
-  // Apply special behaviors to fields with default values.
-  Drupal.webform.defaultValues(context);
   // On click or change, make a parent radio button selected.
   Drupal.webform.setActive(context);
   // Update the template select list upon changing a template.
@@ -22,40 +20,14 @@ Drupal.behaviors.webformAdmin.attach = function(context) {
 
 Drupal.webform = Drupal.webform || {};
 
-Drupal.webform.defaultValues = function(context) {
-  var $fields = $('.webform-default-value:not(.error)', context);
-  var $forms = $fields.parents('form:first');
-  $fields.each(function() {
-    this.defaultValue = $(this).attr('rel');
-    if (this.value != this.defaultValue) {
-      $(this).removeClass('webform-default-value');
-    }
-    $(this).focus(function() {
-      if (this.value == this.defaultValue) {
-        this.value = '';
-        $(this).removeClass('webform-default-value');
-      }
-    });
-    $(this).blur(function() {
-      if (this.value == '') {
-        $(this).addClass('webform-default-value');
-        this.value = this.defaultValue;
-      }
-    });
-  });
-
-  // Clear all the form elements before submission.
-  $forms.submit(function() {
-    $fields.focus();
-  });
-};
-
 Drupal.webform.setActive = function(context) {
   var setActive = function(e) {
-    $('.form-radio', $(this).parent().parent()).attr('checked', true);
+    if ($(this).val()) {
+      $(this).closest('.form-type-radio').find('input[type=radio]').attr('checked', true);
+    }
     e.preventDefault();
   };
-  $('.webform-set-active', context).click(setActive).change(setActive);
+  $('.webform-set-active', context).change(setActive);
 };
 
 Drupal.webform.updateTemplate = function(context) {
diff --git a/webform.module b/webform.module
index c2a862d..8ef8861 100644
--- a/webform.module
+++ b/webform.module
@@ -637,6 +637,9 @@ function webform_theme() {
     'webform_inline_radio' => array(
       'render element' => 'element',
     ),
+    'webform_inline_radio_label' => array(
+      'render element' => 'element',
+    ),
     'webform_mail_message' => array(
       'variables' => array('node' => NULL, 'submission' => NULL, 'email' => NULL),
       'template' => 'templates/webform-mail',
@@ -3171,10 +3174,7 @@ function theme_webform_inline_radio($variables) {
   $output = '<div class="' . implode(' ', $class) . '">' . "\n";
   $output .= ' ' . $element['#children'];
   if (!empty($element['#title'])) {
-    $output .= ' ' . theme('form_element_label', $variables) . "\n";
-  }
-  if (isset($element['#inline_element'])) {
-    $output .= ' ' . $element['#inline_element'] . "\n";
+    $output .= ' ' . theme('webform_inline_radio_label', $variables) . "\n";
   }
 
   if (!empty($element['#description'])) {
@@ -3187,6 +3187,45 @@ function theme_webform_inline_radio($variables) {
 }
 
 /**
+ * Replacement for theme_form_element_label()
+ *
+ * This varies from theme_element_label in that it allows inline fields such
+ * as select and input tags within the label itself.
+ */
+function theme_webform_inline_radio_label($variables) {
+  $element = $variables['element'];
+  // This is also used in the installer, pre-database setup.
+  $t = get_t();
+
+  // If title and required marker are both empty, output no label.
+  if ((!isset($element['#title']) || $element['#title'] === '') && empty($element['#required'])) {
+    return '';
+  }
+
+  // If the element is required, a required marker is appended to the label.
+  $required = !empty($element['#required']) ? theme('form_required_marker', array('element' => $element)) : '';
+
+  $title = filter_xss($element['#title'], array('input', 'select', 'option', 'a', 'abbr', 'acronym', 'address', 'article', 'aside', 'b', 'bdi', 'bdo', 'big', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'command', 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'figcaption', 'figure', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'i', 'img', 'ins', 'kbd', 'li', 'mark', 'menu', 'meter', 'nav', 'ol', 'output', 'p', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'small', 'span', 'strong', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'time', 'tr', 'tt', 'u', 'ul', 'var', 'wbr'));
+
+  $attributes = array();
+  // Style the label as class option to display inline with the element.
+  if ($element['#title_display'] == 'after') {
+    $attributes['class'] = 'option';
+  }
+  // Show label only to screen readers to avoid disruption in visual flows.
+  elseif ($element['#title_display'] == 'invisible') {
+    $attributes['class'] = 'element-invisible';
+  }
+
+  if (!empty($element['#id'])) {
+    $attributes['for'] = $element['#id'];
+  }
+
+  // The leading whitespace helps visually separate fields from inline labels.
+  return ' <label' . drupal_attributes($attributes) . '>' . $t('!title !required', array('!title' => $title, '!required' => $required)) . "</label>\n";
+}
+
+/**
  * Theme the headers when sending an email from webform.
  *
  * @param $node
