diff --git a/core/includes/form.inc b/core/includes/form.inc
index d602d54..27c0ab9 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -1856,6 +1856,22 @@ function form_builder($form_id, &$element, &$form_state) {
     '#title_display' => 'before',
   );
 
+  // Checks if the element needs property validation.
+  if (isset($element['#property_validate']) && is_array($element['#property_validate'])) {
+    // Validates required properties.
+    foreach ($element['#property_validate'] as $property => $callbacks) {
+      foreach ($callbacks as $callback) {
+        if (!isset($element[$property]) || !$callback($element)) {
+          trigger_error(t("'@type' element in form '@form_id' has a non-valid '@property' property.", array(
+            '@type' => $element['#type'],
+            '@form_id' => $form_id,
+            '@property' => $property,
+          )), E_USER_ERROR);
+        }
+      }
+    }
+  }
+
   // Special handling if we're on the top level form element.
   if (isset($element['#type']) && $element['#type'] == 'form') {
     if (!empty($element['#https']) && settings()->get('mixed_mode_sessions', FALSE) &&
@@ -4009,6 +4025,16 @@ function form_process_vertical_tabs($element, &$form_state) {
     '#parents' => $element['#parents'],
   );
 
+  // Details within a vertical tab do not require a title.
+  $details_validation = element_info_property('details', '#property_validate');
+  if (isset($details_validation['#title'])) {
+    $key = array_search('element_validate_title', $details_validation['#title']);
+    if ($key !== FALSE) {
+      unset($details_validation['#title'][$key]);
+    }
+  }
+  $element['group']['#property_validate'] = $details_validation;
+
   // Add an invisible label for accessibility.
   if (!isset($element['#title'])) {
     $element['#title'] = t('Vertical Tabs');
@@ -5255,3 +5281,20 @@ function _batch_queue($batch_set) {
 /**
  * @} End of "defgroup batch".
  */
+
+/**
+ * Validates the title property of a form component that requires it.
+ * @param $element
+ *   The element definition to validate #title for.
+ */
+function element_validate_title(&$element) {
+  // Ensures that $title does not start with, end with or contain only spaces.
+  $title = trim($element['#title']);
+  // Ensures that $title contains a string by verifying its length.
+  if (strlen($title) !== 0) {
+    return TRUE;
+  }
+  else {
+    return false;
+  }
+}
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index eefe926..58d66e3 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -2462,6 +2462,7 @@ function _install_configure_form($form, &$form_state, &$install_state) {
   );
   $form['update_notifications']['update_status_module'] = array(
     '#type' => 'checkboxes',
+    '#title' => t('Update notifications'),
     '#options' => array(
       1 => t('Check for updates automatically'),
       2 => t('Receive e-mail notifications'),
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
index cf88f5d..c9029a3 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockTypeFormController.php
@@ -31,6 +31,7 @@ public function form(array $form, array &$form_state) {
     );
     $form['id'] = array(
       '#type' => 'machine_name',
+      '#title' => t('Machine name'),
       '#default_value' => $block_type->id(),
       '#machine_name' => array(
         'exists' => 'custom_block_type_load',
diff --git a/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc
index 63e71fc..bf835ca 100644
--- a/core/modules/content_translation/content_translation.admin.inc
+++ b/core/modules/content_translation/content_translation.admin.inc
@@ -89,6 +89,7 @@ function _content_translation_form_language_content_settings_form_alter(array &$
         if ($fields) {
           $form['settings'][$entity_type][$bundle]['translatable'] = array(
             '#type' => 'checkbox',
+            '#title' => t($bundle),
             '#default_value' => content_translation_enabled($entity_type, $bundle),
           );
 
@@ -99,6 +100,7 @@ function _content_translation_form_language_content_settings_form_alter(array &$
             $form['settings'][$entity_type][$bundle]['fields'][$field_name] = array(
               '#label' => $instance['label'],
               '#type' => 'checkbox',
+              '#title' => $instance['label'],
               '#default_value' => $field['translatable'],
             );
             $column_element = content_translation_field_sync_widget($field, $instance);
diff --git a/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php b/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php
index 98495d5..335abf1 100644
--- a/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php
+++ b/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php
@@ -79,6 +79,7 @@ public function form(array $form, array &$form_state) {
     );
     $form['format'] = array(
       '#type' => 'machine_name',
+      '#title' => t('Machine name'),
       '#required' => TRUE,
       '#default_value' => $format->id(),
       '#maxlength' => 255,
diff --git a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php
index ec465e1..251eea4 100644
--- a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php
@@ -49,6 +49,7 @@ public function form(array $form, array &$form_state) {
 
     $form['type'] = array(
       '#type' => 'machine_name',
+      '#title' => t('Machine name'),
       '#default_value' => $type->id(),
       '#maxlength' => 32,
       '#disabled' => $type->isLocked(),
diff --git a/core/modules/node/lib/Drupal/node/Plugin/Condition/NodeType.php b/core/modules/node/lib/Drupal/node/Plugin/Condition/NodeType.php
index 4f30bb7..8622a93 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/Condition/NodeType.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/Condition/NodeType.php
@@ -39,6 +39,7 @@ public function buildForm(array $form, array &$form_state) {
       $options[$type->type] = $type->name;
     }
     $form['bundles'] = array(
+      '#title' => t('Node types'),
       '#type' => 'checkboxes',
       '#options' => $options,
       '#required' => TRUE,
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index ac42ea3..e30c6fd 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -329,6 +329,9 @@ function system_element_info() {
     '#autocomplete_path' => FALSE,
     '#process' => array('form_process_autocomplete', 'ajax_process_form', 'form_process_pattern'),
     '#pre_render' => array('form_pre_render_textfield'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__textfield',
     '#theme_wrappers' => array('form_element'),
   );
@@ -339,6 +342,9 @@ function system_element_info() {
     '#autocomplete_path' => FALSE,
     '#process' => array('form_process_autocomplete', 'ajax_process_form', 'form_process_pattern'),
     '#pre_render' => array('form_pre_render_tel'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__tel',
     '#theme_wrappers' => array('form_element'),
   );
@@ -351,6 +357,9 @@ function system_element_info() {
     '#process' => array('form_process_autocomplete', 'ajax_process_form', 'form_process_pattern'),
     '#element_validate' => array('form_validate_email'),
     '#pre_render' => array('form_pre_render_email'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__email',
     '#theme_wrappers' => array('form_element'),
   );
@@ -362,6 +371,9 @@ function system_element_info() {
     '#process' => array('form_process_autocomplete', 'ajax_process_form', 'form_process_pattern'),
     '#element_validate' => array('form_validate_url'),
     '#pre_render' => array('form_pre_render_url'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__url',
     '#theme_wrappers' => array('form_element'),
   );
@@ -372,6 +384,9 @@ function system_element_info() {
     '#autocomplete_path' => FALSE,
     '#process' => array('form_process_autocomplete', 'ajax_process_form'),
     '#pre_render' => array('form_pre_render_search'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__search',
     '#theme_wrappers' => array('form_element'),
   );
@@ -381,6 +396,9 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#element_validate' => array('form_validate_number'),
     '#pre_render' => array('form_pre_render_number'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__number',
     '#theme_wrappers' => array('form_element'),
   );
@@ -392,6 +410,9 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#element_validate' => array('form_validate_number'),
     '#pre_render' => array('form_pre_render_range'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__range',
     '#theme_wrappers' => array('form_element'),
   );
@@ -400,6 +421,9 @@ function system_element_info() {
     '#process' => array('ajax_process_form'),
     '#element_validate' => array('form_validate_color'),
     '#pre_render' => array('form_pre_render_color'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__color',
     '#theme_wrappers' => array('form_element'),
   );
@@ -413,6 +437,9 @@ function system_element_info() {
     '#process' => array('form_process_machine_name', 'form_process_autocomplete', 'ajax_process_form'),
     '#element_validate' => array('form_validate_machine_name'),
     '#pre_render' => array('form_pre_render_textfield'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__textfield',
     '#theme_wrappers' => array('form_element'),
   );
@@ -422,6 +449,9 @@ function system_element_info() {
     '#maxlength' => 128,
     '#process' => array('ajax_process_form', 'form_process_pattern'),
     '#pre_render' => array('form_pre_render_password'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__password',
     '#theme_wrappers' => array('form_element'),
   );
@@ -436,12 +466,18 @@ function system_element_info() {
     '#rows' => 5,
     '#resizable' => 'vertical',
     '#process' => array('ajax_process_form'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'textarea',
     '#theme_wrappers' => array('form_element'),
   );
   $types['radios'] = array(
     '#input' => TRUE,
     '#process' => array('form_process_radios'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme_wrappers' => array('radios'),
     '#pre_render' => array('form_pre_render_conditional_form_element'),
   );
@@ -450,6 +486,9 @@ function system_element_info() {
     '#default_value' => NULL,
     '#process' => array('ajax_process_form'),
     '#pre_render' => array('form_pre_render_radio'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__radio',
     '#theme_wrappers' => array('form_element'),
     '#title_display' => 'after',
@@ -458,6 +497,9 @@ function system_element_info() {
     '#input' => TRUE,
     '#process' => array('form_process_checkboxes'),
     '#pre_render' => array('form_pre_render_conditional_form_element'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme_wrappers' => array('checkboxes'),
   );
   $types['checkbox'] = array(
@@ -465,6 +507,9 @@ function system_element_info() {
     '#return_value' => 1,
     '#process' => array('form_process_checkbox', 'ajax_process_form'),
     '#pre_render' => array('form_pre_render_checkbox'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__checkbox',
     '#theme_wrappers' => array('form_element'),
     '#title_display' => 'after',
@@ -473,6 +518,9 @@ function system_element_info() {
     '#input' => TRUE,
     '#multiple' => FALSE,
     '#process' => array('form_process_select', 'ajax_process_form'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'select',
     '#theme_wrappers' => array('form_element'),
     '#options' => array(),
@@ -480,15 +528,24 @@ function system_element_info() {
   $types['language_select'] = array(
     '#input' => TRUE,
     '#default_value' => Language::LANGCODE_NOT_SPECIFIED,
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
   );
   $types['weight'] = array(
     '#input' => TRUE,
     '#delta' => 10,
     '#default_value' => 0,
     '#process' => array('form_process_weight', 'ajax_process_form'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
   );
   $types['date'] = array(
     '#input' => TRUE,
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'date',
     '#theme_wrappers' => array('form_element'),
   );
@@ -498,6 +555,9 @@ function system_element_info() {
     '#process' => array('form_process_file'),
     '#size' => 60,
     '#pre_render' => array('form_pre_render_file'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme' => 'input__file',
     '#theme_wrappers' => array('form_element'),
   );
@@ -543,6 +603,9 @@ function system_element_info() {
     '#value' => NULL,
     '#process' => array('form_process_group', 'ajax_process_form'),
     '#pre_render' => array('form_pre_render_group'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme_wrappers' => array('fieldset'),
   );
   $types['details'] = array(
@@ -550,6 +613,9 @@ function system_element_info() {
     '#value' => NULL,
     '#process' => array('form_process_group', 'ajax_process_form'),
     '#pre_render' => array('form_pre_render_details', 'form_pre_render_group'),
+    '#property_validate' => array(
+      '#title' => array('element_validate_title'),
+    ),
     '#theme_wrappers' => array('details'),
   );
   $types['vertical_tabs'] = array(
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
index a84eb92..62fa461 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/wizard/WizardPluginBase.php
@@ -209,8 +209,10 @@ public function buildForm(array $form, array &$form_state) {
     $this->buildFilters($form, $form_state);
     $this->buildSorts($form, $form_state);
 
+    // @Todo: Consider removing this fieldset or converting it to #type details
     $form['displays']['page'] = array(
       '#type' => 'fieldset',
+      '#title' => t('Page settings'),
       '#attributes' => array('class' => array('views-attachment', 'fieldset-no-legend')),
       '#tree' => TRUE,
     );
@@ -246,8 +248,10 @@ public function buildForm(array $form, array &$form_state) {
       '#type' => 'textfield',
       '#field_prefix' => $path_prefix,
     );
+    // @Todo: Consider removing this fieldset or converting it to #type details
     $form['displays']['page']['options']['style'] = array(
       '#type' => 'fieldset',
+      '#title' => t('Page display settings'),
       '#attributes' => array('class' => array('container-inline', 'fieldset-no-legend')),
     );
 
@@ -352,8 +356,10 @@ public function buildForm(array $form, array &$form_state) {
       return $form;
     }
 
+    // @Todo: Consider removing this fieldset or converting it to #type details
     $form['displays']['block'] = array(
       '#type' => 'fieldset',
+      '#title' => t('Block settings'),
       '#attributes' => array('class' => array('views-attachment', 'fieldset-no-legend')),
       '#tree' => TRUE,
     );
@@ -383,8 +389,10 @@ public function buildForm(array $form, array &$form_state) {
       '#title' => t('Block title'),
       '#type' => 'textfield',
     );
+    // @Todo: Consider removing this fieldset or converting it to #type details
     $form['displays']['block']['options']['style'] = array(
       '#type' => 'fieldset',
+      '#title' => t('Block display settings'),
       '#attributes' => array('class' => array('container-inline', 'fieldset-no-legend')),
     );
 
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php b/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php
index bfac4e6..1397e00 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/Form/BasicSettingsForm.php
@@ -95,6 +95,7 @@ public function buildForm(array $form, array &$form_state) {
 
     $form['live_preview']['options']['ui_show_sql_query_where'] = array(
       '#type' => 'radios',
+      '#title' => t('Show SQL query'),
       '#options' => array(
         'above' => t('Above the preview'),
         'below' => t('Below the preview'),
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php
index 4ad9376..7331dab 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php
@@ -74,8 +74,10 @@ public function form(array $form, array &$form_state) {
     $form['#attached']['js'][] = drupal_get_path('module', 'views_ui') . '/js/views-admin.js';
     $form['#attributes']['class'] = array('views-admin');
 
+      // @Todo: Consider removing this fieldset.
     $form['name'] = array(
       '#type' => 'fieldset',
+      '#title' => t('Biew basic information'),
       '#attributes' => array('class' => array('fieldset-no-legend')),
     );
 
@@ -89,6 +91,7 @@ public function form(array $form, array &$form_state) {
     );
     $form['name']['id'] = array(
       '#type' => 'machine_name',
+      '#title' => t('Machine name'),
       '#maxlength' => 128,
       '#machine_name' => array(
         'exists' => 'views_get_view',
@@ -123,8 +126,10 @@ public function form(array $form, array &$form_state) {
 
     // Create the part of the form that allows the user to select the basic
     // properties of what the view will display.
+    // @todo: Consider removing the fieldset below.
     $form['displays']['show'] = array(
       '#type' => 'fieldset',
+      '#title' => t('View settings'),
       '#tree' => TRUE,
       '#attributes' => array('class' => array('container-inline')),
     );
