diff --git a/core/lib/Drupal/Core/Database/Install/Tasks.php b/core/lib/Drupal/Core/Database/Install/Tasks.php
index df58c25..04993bd 100644
--- a/core/lib/Drupal/Core/Database/Install/Tasks.php
+++ b/core/lib/Drupal/Core/Database/Install/Tasks.php
@@ -215,16 +215,24 @@ public function getFormOptions($database) {
       '#title' => t('Database name'),
       '#default_value' => empty($database['database']) ? '' : $database['database'],
       '#size' => 45,
-      '#required' => TRUE,
       '#description' => t('The name of the database your @drupal data will be stored in.', array('@drupal' => drupal_install_profile_distribution_name())),
+      '#states' => array(
+        'required' => array(
+          ':input[name=driver]' => array('value' => $this->pdoDriver),
+        ),
+      ),
     );
 
     $form['username'] = array(
       '#type' => 'textfield',
       '#title' => t('Database username'),
       '#default_value' => empty($database['username']) ? '' : $database['username'],
-      '#required' => TRUE,
       '#size' => 45,
+      '#states' => array(
+        'required' => array(
+          ':input[name=driver]' => array('value' => $this->pdoDriver),
+        ),
+      ),
     );
 
     $form['password'] = array(
diff --git a/core/misc/states.js b/core/misc/states.js
index d934ee5..81f4fcf 100644
--- a/core/misc/states.js
+++ b/core/misc/states.js
@@ -517,10 +517,10 @@ $(document).bind('state:disabled', function(e) {
 $(document).bind('state:required', function(e) {
   if (e.trigger) {
     if (e.value) {
-      $(e.target).closest('.form-item, .form-wrapper').find('label').append('<abbr class="form-required" title="' + Drupal.t('This field is required.') + '">*</abbr>');
+      $(e.target).attr({ 'required': 'required', 'aria-required': 'aria-required' }).closest('.form-item, .form-wrapper').find('label').append(Drupal.theme('requiredMarker'));
     }
     else {
-      $(e.target).closest('.form-item, .form-wrapper').find('label .form-required').remove();
+      $(e.target).removeAttr('required aria-required').closest('.form-item, .form-wrapper').find('label .form-required').remove();
     }
   }
 });
@@ -566,4 +566,10 @@ function compare (a, b) {
   return (a === b) ? (typeof a === 'undefined' ? a : true) : (typeof a === 'undefined' || typeof b === 'undefined');
 }
 
+$.extend(Drupal.theme, {
+  requiredMarker: function () {
+    return '<abbr class="form-required" title="' + Drupal.t('This field is required.') + '">*</abbr>';
+  }
+});
+
 })(jQuery);
diff --git a/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php b/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php
index 8a5429f..2589418 100644
--- a/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php
+++ b/core/modules/language/lib/Drupal/language/Form/LanguageAddForm.php
@@ -53,15 +53,24 @@ public function form(array $form, array &$form_state) {
       '#submit' => array(array($this, 'submitForm')),
     );
 
+    $custom_language_states_conditions = array(
+      'select#edit-predefined-langcode' => array('value' => 'custom'),
+    );
     $form['custom_language'] = array(
       '#type' => 'container',
       '#states' => array(
-        'visible' => array(
-          'select#edit-predefined-langcode' => array('value' => 'custom'),
-        ),
+        'visible' => $custom_language_states_conditions,
       ),
     );
     $this->commonForm($form['custom_language']);
+    $form['custom_language']['langcode']['#required'] = FALSE;
+    $form['custom_language']['langcode']['#states'] = array(
+      'required' => $custom_language_states_conditions,
+    );
+    $form['custom_language']['name']['#required'] = FALSE;
+    $form['custom_language']['name']['#states'] = array(
+      'required' => $custom_language_states_conditions,
+    );
     $form['custom_language']['submit'] = array(
       '#type' => 'submit',
       '#value' => $this->t('Add custom language'),
