diff --git a/core/modules/language/config/language.negotiation.yml b/core/modules/language/config/language.negotiation.yml
index 8ebea15..e5dcccf 100644
--- a/core/modules/language/config/language.negotiation.yml
+++ b/core/modules/language/config/language.negotiation.yml
@@ -6,3 +6,5 @@ url:
       en: ''
     domains:
       en: ''
+customized_language_negotiation:
+    language_interface: true
diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index a3500fd..dd5de50 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -389,6 +389,18 @@ function language_negotiation_configure_form_table(&$form, $type) {
     '#show_operations' => FALSE,
     'weight' => array('#tree' => TRUE),
   );
+  if ($type != LANGUAGE_TYPE_INTERFACE) {
+    $customizations = config('language.negotiation')->get('customized_language_negotiation');
+    $table_form['customized'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Customize %language_name language detection to differ from User interface text language detection settings.', array('%language_name' => $info['name'])),
+      '#default_value' => empty($customizations[$type]) ? FALSE : $customizations[$type],
+      '#attributes' => array('class' => array('language-customization-checkbox')),
+      '#attached' => array(
+        'js' => array(drupal_get_path('module', 'language') . '/language.admin.js' => array('type' => 'file')),
+      ),
+    );
+  }
 
   $negotiation_info = $form['#language_negotiation_info'];
   $enabled_methods = variable_get("language_negotiation_$type", array());
@@ -519,12 +531,13 @@ function theme_language_negotiation_configure_form($variables) {
       'rows' => $rows,
       'attributes' => array('id' => "language-negotiation-methods-$type"),
     );
-    $table  = theme('table', $variables);
+    $table  = drupal_render($form[$type]['customized']);
+    $table .= theme('table', $variables);
     $table .= drupal_render_children($form[$type]);
 
     drupal_add_tabledrag("language-negotiation-methods-$type", 'order', 'sibling', "language-method-weight-$type");
 
-    $output .= '<div class="form-item">' . $title . $description . $table . '</div>';
+    $output .= '<div class="form-item table-' . $type . '-wrapper">' . $title . $description . $table . '</div>';
   }
 
   $output .= drupal_render_children($form);
@@ -537,11 +550,16 @@ function theme_language_negotiation_configure_form($variables) {
 function language_negotiation_configure_form_submit($form, &$form_state) {
   $configurable_types = $form['#language_types'];
 
+  $customizations = config('language.negotiation')->get('customized_language_negotiation');
+
   foreach ($configurable_types as $type) {
     $method_weights = array();
     $enabled_methods = $form_state['values'][$type]['enabled'];
     $enabled_methods[LANGUAGE_NEGOTIATION_SELECTED] = TRUE;
     $method_weights_input = $form_state['values'][$type]['weight'];
+    if ($type != LANGUAGE_TYPE_INTERFACE) {
+      $customizations[$type] = !empty($form_state['values'][$type]['customized']);
+    }
 
     foreach ($method_weights_input as $method_id => $weight) {
       if ($enabled_methods[$method_id]) {
@@ -552,6 +570,12 @@ function language_negotiation_configure_form_submit($form, &$form_state) {
     language_negotiation_set($type, $method_weights);
     variable_set("language_negotiation_methods_weight_$type", $method_weights_input);
   }
+  // Always set the default language type LANGUAGE_TYPE_INTERFACE.
+  $customizations[LANGUAGE_TYPE_INTERFACE] = TRUE;
+  config('language.negotiation')
+    ->set('customized_language_negotiation', $customizations)
+    ->save();
+
 
   // Update non-configurable language types and the related language negotiation
   // configuration.
diff --git a/core/modules/language/language.admin.js b/core/modules/language/language.admin.js
new file mode 100644
index 0000000..1ae8918
--- /dev/null
+++ b/core/modules/language/language.admin.js
@@ -0,0 +1,65 @@
+(function ($) {
+
+"use strict";
+
+/**
+ * Makes language negotiation inherit user interface negotiation.
+ */
+Drupal.behaviors.negotiationLanguage = {
+  attach: function (context) {
+    var $context = $(context);
+    // Given a customization checkbox derive the language type being changed.
+    var toggleTable = function ($checkbox) {
+      // Get the language detection type. For instance User interface text
+      // language detection, Content language detection, ...
+      var detectiontype = $checkbox.attr('name').replace('[customized]', '');
+      var $table = $('.table-' + detectiontype + '-wrapper');
+      var $interfaceWeight = $(':input[name="' + detectiontype + '[weight][language-interface]"]', $table);
+      var minAvailableWeight = languageMinSelectValue($table);
+      $(':input[name^="' + detectiontype + '[weight]"]', $table).each(function (index, element) {
+        if (typeof($(element).data('initial-value')) == 'undefined') {
+          // If this is the first time save the original weights for toggling.
+          $(element).data('initial-value', $(element).val());
+        };
+        if ($checkbox.is(':checked')) {
+          // If the table is shown get back the original values.
+          $(element).val($(element).data('initial-value'));
+        }
+        else {
+          // If the table is hidden then make room for language interface to be
+          // the lowest value. Keep in mind that since weight is a select not
+          // any value is allowed.
+          $(element).val(++minAvailableWeight);
+        }
+      });
+      if ($checkbox.is(':checked')) {
+        $table.find('table, .tabledrag-toggle-weight-wrapper').show();
+      }
+      else {
+        // Make sure language-interface gets selected.
+        $(':input[name="' + detectiontype + '[enabled][language-interface]"]').prop('checked', true);
+        // Make sure the language-interface is at the top of the list.
+        $interfaceWeight.val(languageMinSelectValue($table));
+        $table.find('table, .tabledrag-toggle-weight-wrapper').hide();
+      }
+    };
+    // Bind hide/show + rearrange to customization checkboxes.
+    $('body').once('negotiation-language-admin-bind').on('click', '#language-negotiation-configure-form :input.language-customization-checkbox', function (e) {
+      toggleTable($(e.target));
+    });
+    // Initially, hide language detection types that are not customized.
+    $('#language-negotiation-configure-form :input.language-customization-checkbox:not(:checked)').each(function (index, element) {
+      toggleTable($(element));
+    });
+  }
+};
+
+/**
+ * Helper function to get the minimum weight available in the selector.
+ */
+function languageMinSelectValue($table) {
+  // Gets all the values from the select options and return the lowest.
+  return Math.min.apply(null, $table.find('[name*="[weight]"] option').map(function () { return parseInt($(this).val()); }));;
+}
+
+})(jQuery);
