diff --git a/core/modules/language/lib/Drupal/language/Form/ContentLanguageSettingsForm.php b/core/modules/language/lib/Drupal/language/Form/ContentLanguageSettingsForm.php
new file mode 100644
index 0000000..362de0c
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Form/ContentLanguageSettingsForm.php
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\language\Form\ContentLanguageSettingsForm.
+ */
+
+namespace Drupal\language\Form;
+
+use Drupal\Core\Config\ConfigFactory;
+use Drupal\Core\Config\Context\ContextInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Form\ConfigFormBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Configure the content language settings for this site.
+ */
+class ContentLanguageSettingsForm extends ConfigFormBase {
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManagerInterface
+   */
+  protected $entityManager;
+
+  /**
+   * Constructs a ContentLanguageSettingsForm object.
+   *
+   * @param \Drupal\Core\Config\ConfigFactory $config_factory
+   *   The config factory.
+   * @param \Drupal\Core\Config\Context\ContextInterface $context
+   *   The configuration context to use.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(ConfigFactory $config_factory, ContextInterface $context, EntityManagerInterface $entity_manager) {
+    parent::__construct($config_factory, $context);
+
+    $this->entityManager = $entity_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('config.factory'),
+      $container->get('config.context.free'),
+      $container->get('plugin.manager.entity')
+    );
+  }
+
+  /**
+   * Return a list of entity types for which language settings are supported.
+   *
+   * @return array
+   *   A list of entity types which are translatable.
+   */
+  protected function entitySupported() {
+    $supported = array();
+    foreach ($this->entityManager->getDefinitions() as $entity_type => $info) {
+      if (!empty($info['translatable'])) {
+        $supported[$entity_type] = $entity_type;
+      }
+    }
+    return $supported;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'language_content_settings_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, array &$form_state) {
+    $entity_info = $this->entityManager->getDefinitions();
+    $labels = array();
+    $default = array();
+
+    $bundles = entity_get_bundles();
+    $language_configuration = array();
+    foreach ($this->entitySupported() as $entity_type) {
+      $labels[$entity_type] = isset($entity_info[$entity_type]['label']) ? $entity_info[$entity_type]['label'] : $entity_type;
+      $default[$entity_type] = FALSE;
+
+      // Check whether we have any custom setting.
+      foreach ($bundles as $bundle => $bundle_info) {
+        $conf = language_get_default_configuration($entity_type, $bundle);
+        if (!empty($conf['language_show']) || $conf['langcode'] != 'site_default') {
+          $default[$entity_type] = $entity_type;
+        }
+        $language_configuration[$entity_type][$bundle] = $conf;
+      }
+    }
+
+    asort($labels);
+
+    $form = array(
+      '#labels' => $labels,
+      '#attached' => array(
+        'library' => array(
+          array('language', 'drupal.language.admin'),
+        ),
+      ),
+    );
+
+    $form['entity_types'] = array(
+      '#title' => $this->t('Custom language settings'),
+      '#type' => 'checkboxes',
+      '#options' => $labels,
+      '#default_value' => $default,
+    );
+
+    $form['settings'] = array('#tree' => TRUE);
+
+    foreach ($labels as $entity_type => $label) {
+      $info = $entity_info[$entity_type];
+
+      $form['settings'][$entity_type] = array(
+        '#title' => $label,
+        '#type' => 'container',
+        '#entity_type' => $entity_type,
+        '#theme' => 'language_content_settings_table',
+        '#bundle_label' => isset($info['bundle_label']) ? $info['bundle_label'] : $label,
+        '#states' => array(
+          'visible' => array(
+            ':input[name="entity_types[' . $entity_type . ']"]' => array('checked' => TRUE),
+          ),
+        ),
+      );
+
+      foreach ($bundles as $bundle => $bundle_info) {
+        $form['settings'][$entity_type][$bundle]['settings'] = array(
+          '#type' => 'item',
+          '#label' => $bundle_info['label'],
+          'language' => array(
+            '#type' => 'language_configuration',
+            '#entity_information' => array(
+              'entity_type' => $entity_type,
+              'bundle' => $bundle,
+            ),
+            '#default_value' => $language_configuration[$entity_type][$bundle],
+          ),
+        );
+      }
+    }
+
+    $form['actions'] = array('#type' => 'actions');
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => $this->t('Save'),
+    );
+
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $config = $this->configFactory->get('language.settings');
+    foreach ($form_state['values']['settings'] as $entity_type => $entity_settings) {
+      foreach ($entity_settings as $bundle => $bundle_settings) {
+          $config->set(language_get_default_configuration_settings_key($entity_type, $bundle),
+            array(
+              'langcode' => $bundle_settings['settings']['language']['langcode'],
+              'language_show' => $bundle_settings['settings']['langcode']['language_show'],
+            )
+          );
+      }
+    }
+    $config->save();
+    parent::submitForm($form, $form_state);
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/AccessibilityTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/AccessibilityTest.php
new file mode 100644
index 0000000..83c94e4
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/AccessibilityTest.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Form\AccessibilityTest.
+ */
+
+namespace Drupal\system\Tests\Form;
+
+use Drupal\Core\SystemListing;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Performs basic accessibility tests for all forms provided by extensions.
+ *
+ * To save some processing power, this test only scans for forms in the
+ * Drupal\$extension\Form namespace of all modules.
+ */
+class AccessibilityTest extends WebTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Form accessibility',
+      'description' => 'Tests that all forms follow basic accessibility best practices.',
+      'group' => 'Form API',
+    );
+  }
+
+  /**
+   * Performs accessibility tests on all forms provided by modules.
+   */
+  public function testFormAccessibility() {
+    $module_handler = \Drupal::moduleHandler();
+
+    // Scan all modules for forms.
+    $forms = array();
+    $scanner = new SystemListing(array(drupal_get_profile()));
+    $modules = $scanner->scan('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info.yml$/', 'modules');
+    foreach ($modules as $module_file) {
+      $module_name = basename($module_file->filename, '.info.yml');
+      // We only look for files in the Drupal\$module_name\Form namespace, and assume
+      // there are no further directories.
+      $directory = dirname($module_file->uri) . "/lib/Drupal/$module_name/Form";
+      if (is_dir($directory)) {
+        $files = array_diff(scandir($directory), array('.', '..'));
+        foreach ($files as $file) {
+          $class = "Drupal\\$module_name\\Form\\" . basename($file, '.php');
+          if (is_subclass_of($class, 'Drupal\Core\Form\FormInterface')) {
+            $forms[$module_name][] = $class;
+          }
+        }
+      }
+    }
+
+    // Perform tests on all forms.
+    foreach ($forms as $module_name => $module_forms) {
+      $module_handler->install(array($module_name));
+      foreach ($module_forms as $form_class) {
+        $this->doTestFormElementTitle($form_class);
+      }
+    }
+  }
+
+  /**
+   * Tests that all form elements of a form have a title.
+   *
+   * @param string $class
+   *   The class name of the form.
+   */
+  public function doTestFormElementTitle($class) {
+    // @todo Entity form controllers need an entity to be constructed
+    //   properly.
+    if (is_subclass_of($class, 'Drupal\Core\Entity\EntityFormControllerInterface')) {
+      $this->verbose("Skipping class '$class' because entity forms cannot be instantiated generically.");
+      return;
+    }
+    // Some forms throw exceptions if the arguments passed into
+    // FormInterface::buildForm() are missing or incorrect.
+    try {
+      $form = \Drupal::formBuilder()->getForm($class);
+    }
+    catch (\Exception $e) {
+      $this->verbose("Skipping class '$class' because it threw an exception during form building.");
+      return;
+    }
+  }
+
+}
