diff --git a/core/includes/form.inc b/core/includes/form.inc
index 6956f04..80ee660 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -3795,6 +3795,14 @@ function form_process_vertical_tabs($element, &$form_state) {
     '#parents' => $element['#parents'],
   );
 
+  // Add an invisible label for accessibility.
+  if (!isset($element['#title'])) {
+    $element['#title'] = t('Vertical Tabs');
+    $element['#title_display'] = 'invisible';
+  }
+
+  $element['#attached']['library'][] = array('system', 'drupal.vertical-tabs');
+
   // The JavaScript stores the currently selected tab in this hidden
   // field so that the active tab can be restored the next time the
   // form is rendered, e.g. on preview pages or when form validation
@@ -3813,6 +3821,25 @@ function form_process_vertical_tabs($element, &$form_state) {
 }
 
 /**
+ * Prepares a vertical_tabs element for rendering.
+ *
+ * @param array $element
+ *   An associative array containing the properties and children of the
+ *   vertical tabs element.
+ *
+ * @return array
+ *   The modified element.
+ */
+function form_pre_render_vertical_tabs($element) {
+  // Do not render the vertical tabs element if it is empty.
+  $group = implode('][', $element['#parents']);
+  if (!element_get_visible_children($element['group']['#groups'][$group])) {
+    $element['#printed'] = TRUE;
+  }
+  return $element;
+}
+
+/**
  * Returns HTML for an element's children fieldsets as vertical tabs.
  *
  * @param $variables
@@ -3824,26 +3851,7 @@ function form_process_vertical_tabs($element, &$form_state) {
  */
 function theme_vertical_tabs($variables) {
   $element = $variables['element'];
-  // Even if there are no tabs the element will still have a child element for
-  // the active tab. We need to iterate over the tabs to ascertain if any
-  // are visible before showing the wrapper and h2.
-  $visible_tab = FALSE;
-  $output = '';
-  foreach (element_children($element['group']) as $tab_index) {
-    if (!isset($element['group'][$tab_index]['#access']) ||
-        !empty($element['group'][$tab_index]['#access'])) {
-      $visible_tab = TRUE;
-      break;
-    }
-  }
-  if ($visible_tab) {
-    // Add required JavaScript and Stylesheet.
-    drupal_add_library('system', 'drupal.vertical-tabs');
-
-    $output = '<h2 class="element-invisible">' . t('Vertical Tabs') . '</h2>';
-    $output .= '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
-  }
-  return $output;
+  return '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
 }
 
 /**
diff --git a/core/modules/block/block.admin.inc b/core/modules/block/block.admin.inc
index 2a17a55..63618b6 100644
--- a/core/modules/block/block.admin.inc
+++ b/core/modules/block/block.admin.inc
@@ -342,12 +342,9 @@ function block_admin_configure($form, &$form_state, $module, $delta) {
   }
 
   // Visibility settings.
-  $form['visibility_title'] = array(
-    '#type' => 'item',
-    '#title' => t('Visibility settings'),
-  );
   $form['visibility'] = array(
     '#type' => 'vertical_tabs',
+    '#title' => t('Visibility settings'),
     '#attached' => array(
       'library' => array(array('block', 'drupal.block')),
     ),
diff --git a/core/modules/filter/filter.admin.inc b/core/modules/filter/filter.admin.inc
index 4f56856..5fcd72a 100644
--- a/core/modules/filter/filter.admin.inc
+++ b/core/modules/filter/filter.admin.inc
@@ -267,12 +267,9 @@ function filter_admin_format_form($form, &$form_state, $format) {
   }
 
   // Filter settings.
-  $form['filter_settings_title'] = array(
-    '#type' => 'item',
-    '#title' => t('Filter settings'),
-  );
   $form['filter_settings'] = array(
     '#type' => 'vertical_tabs',
+    '#title' => t('Filter settings'),
   );
 
   foreach ($filter_info as $name => $filter) {
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 541f9bd..5c2c15f 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -531,7 +531,8 @@ function system_element_info() {
     '#theme_wrappers' => array('fieldset'),
   );
   $types['vertical_tabs'] = array(
-    '#theme_wrappers' => array('vertical_tabs'),
+    '#pre_render' => array('form_pre_render_vertical_tabs'),
+    '#theme_wrappers' => array('vertical_tabs', 'form_element'),
     '#default_tab' => '',
     '#process' => array('form_process_vertical_tabs'),
   );
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index f4363cf..ed5ea21 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -442,12 +442,9 @@ function user_admin_settings($form, &$form_state) {
     '#description' => t("This text is displayed at the picture upload form in addition to the default guidelines. It's useful for helping or instructing your users."),
   );
 
-  $form['email_title'] = array(
-    '#type' => 'item',
-    '#title' => t('E-mails'),
-  );
   $form['email'] = array(
     '#type' => 'vertical_tabs',
+    '#title' => t('E-mails'),
   );
   // These email tokens are shared for all settings, so just define
   // the list once to help ensure they stay in sync.
