diff --git a/core/modules/language/tests/language_test.info b/core/modules/language/tests/language_test.info
new file mode 100644
index 0000000..6a9a7aa
--- /dev/null
+++ b/core/modules/language/tests/language_test.info
@@ -0,0 +1,6 @@
+name = "Language test"
+description = "Support module for the language layer tests."
+core = 8.x
+package = Testing
+version = VERSION
+hidden = TRUE
diff --git a/core/modules/locale/tests/locale_test.module b/core/modules/language/tests/language_test.module
similarity index 61%
rename from core/modules/locale/tests/locale_test.module
rename to core/modules/language/tests/language_test.module
index 93dfaa1..1f1dd0a 100644
--- a/core/modules/locale/tests/locale_test.module
+++ b/core/modules/language/tests/language_test.module
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Mock module for locale layer tests.
+ * Mock module for language layer tests.
  */
 
 /**
@@ -11,17 +11,17 @@
  * For testing domain language negotiation, we fake it by setting
  * the HTTP_HOST here
  */
-function locale_test_boot() {
-  if (variable_get('locale_test_domain')) {
-    $_SERVER['HTTP_HOST'] = variable_get('locale_test_domain');
+function language_test_boot() {
+  if (variable_get('language_test_domain')) {
+    $_SERVER['HTTP_HOST'] = variable_get('language_test_domain');
   }
 }
 
 /**
  * Implements hook_init().
  */
-function locale_test_init() {
-  locale_test_store_language_negotiation();
+function language_test_init() {
+  language_test_store_language_negotiation();
   if (isset($GLOBALS['language_interface']) && isset($GLOBALS['language_interface']->method_id)) {
     drupal_set_message(t('Language negotiation method: @name', array('@name' => $GLOBALS['language_interface']->method_id)));
   }
@@ -30,8 +30,8 @@ function locale_test_init() {
 /**
  * Implements hook_language_types_info().
  */
-function locale_test_language_types_info() {
-  if (variable_get('locale_test_language_types', FALSE)) {
+function language_test_language_types_info() {
+  if (variable_get('language_test_language_types', FALSE)) {
     return array(
       'test_language_type' => array(
         'name' => t('Test'),
@@ -47,8 +47,8 @@ function locale_test_language_types_info() {
 /**
  * Implements hook_language_types_info_alter().
  */
-function locale_test_language_types_info_alter(array &$language_types) {
-  if (variable_get('locale_test_content_language_type', FALSE)) {
+function language_test_language_types_info_alter(array &$language_types) {
+  if (variable_get('language_test_content_language_type', FALSE)) {
     unset($language_types[LANGUAGE_TYPE_CONTENT]['fixed']);
   }
 }
@@ -56,13 +56,13 @@ function locale_test_language_types_info_alter(array &$language_types) {
 /**
  * Implements hook_language_negotiation_info().
  */
-function locale_test_language_negotiation_info() {
-  if (variable_get('locale_test_language_negotiation_info', FALSE)) {
+function language_test_language_negotiation_info() {
+  if (variable_get('language_test_language_negotiation_info', FALSE)) {
     $info = array(
       'callbacks' => array(
-        'negotiation' => 'locale_test_language_negotiation_method',
+        'negotiation' => 'language_test_language_negotiation_method',
       ),
-      'file' => drupal_get_path('module', 'locale_test') .'/locale_test.module',
+      'file' => drupal_get_path('module', 'language_test') .'/language_test.module',
       'weight' => -10,
       'description' => t('This is a test language negotiation method.'),
     );
@@ -83,8 +83,8 @@ function locale_test_language_negotiation_info() {
 /**
  * Implements hook_language_negotiation_info_alter().
  */
-function locale_test_language_negotiation_info_alter(array &$negotiation_info) {
-  if (variable_get('locale_test_language_negotiation_info_alter', FALSE)) {
+function language_test_language_negotiation_info_alter(array &$negotiation_info) {
+  if (variable_get('language_test_language_negotiation_info_alter', FALSE)) {
     unset($negotiation_info[LANGUAGE_NEGOTIATION_INTERFACE]);
   }
 }
@@ -92,17 +92,17 @@ function locale_test_language_negotiation_info_alter(array &$negotiation_info) {
 /**
  * Store the last negotiated languages.
  */
-function locale_test_store_language_negotiation() {
+function language_test_store_language_negotiation() {
   $last = array();
   foreach (language_types_get_all() as $type) {
     $last[$type] = $GLOBALS[$type]->langcode;
   }
-  variable_set('locale_test_language_negotiation_last', $last);
+  variable_set('language_test_language_negotiation_last', $last);
 }
 
 /**
  * Provides a test language negotiation method.
  */
-function locale_test_language_negotiation_method($languages) {
+function language_test_language_negotiation_method($languages) {
   return 'it';
 }
diff --git a/core/modules/locale/locale.test b/core/modules/locale/locale.test
index fa78e14..5eea2ec 100644
--- a/core/modules/locale/locale.test
+++ b/core/modules/locale/locale.test
@@ -24,17 +24,17 @@
 /**
  * Functional tests for language configuration's effect on negotiation setup.
  */
-class LocaleConfigurationTest extends DrupalWebTestCase {
+class LanguageConfigurationTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
       'name' => 'Language negotiation autoconfiguration',
       'description' => 'Adds and configures languages to check negotiation changes.',
-      'group' => 'Locale',
+      'group' => 'Language',
     );
   }
 
   function setUp() {
-    parent::setUp('locale');
+    parent::setUp('language');
   }
 
   /**
@@ -100,12 +100,12 @@ class LocaleJavascriptTranslationTest extends DrupalWebTestCase {
   }
 
   function setUp() {
-    parent::setUp('locale', 'locale_test');
+    parent::setUp('locale');
   }
 
   function testFileParsing() {
 
-    $filename = drupal_get_path('module', 'locale_test') . '/locale_test.js';
+    $filename = drupal_get_path('module', 'locale') . '/tests/locale_test.js';
 
     // Parse the file to look for source strings.
     _locale_parse_js_file($filename);
@@ -915,10 +915,10 @@ class LocaleImportFunctionalTest extends DrupalWebTestCase {
   protected $admin_user = NULL;
 
   function setUp() {
-    parent::setUp(array('locale', 'locale_test', 'dblog'));
+    parent::setUp(array('locale', 'dblog'));
 
     // Set the translation file directory.
-    variable_set('locale_translate_file_directory', drupal_get_path('module', 'locale_test'));
+    variable_set('locale_translate_file_directory', drupal_get_path('module', 'locale') . '/tests');
 
     $this->admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
     $this->drupalLogin($this->admin_user);
@@ -1392,7 +1392,7 @@ class LocaleExportFunctionalTest extends DrupalWebTestCase {
   protected $admin_user = NULL;
 
   function setUp() {
-    parent::setUp('locale', 'locale_test');
+    parent::setUp('locale');
 
     $this->admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
     $this->drupalLogin($this->admin_user);
@@ -1694,21 +1694,21 @@ class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest
 /**
  * Functional tests for the language switching feature.
  */
-class LocaleLanguageSwitchingFunctionalTest extends DrupalWebTestCase {
+class LanguageSwitchingFunctionalTestCase extends DrupalWebTestCase {
 
   public static function getInfo() {
     return array(
       'name' => 'Language switching',
       'description' => 'Tests for the language switching feature.',
-      'group' => 'Locale',
+      'group' => 'Language',
     );
   }
 
   function setUp() {
-    parent::setUp(array('locale', 'block'));
+    parent::setUp(array('language', 'block'));
 
     // Create and login user.
-    $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer languages', 'translate interface', 'access administration pages'));
+    $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer languages', 'access administration pages'));
     $this->drupalLogin($admin_user);
   }
 
@@ -1772,13 +1772,13 @@ class LocaleLanguageSwitchingFunctionalTest extends DrupalWebTestCase {
 /**
  * Test browser language detection.
  */
-class LocaleBrowserDetectionTest extends DrupalUnitTestCase {
+class LanguageBrowserDetectionTestCase extends DrupalUnitTestCase {
 
   public static function getInfo() {
     return array(
       'name' => 'Browser language detection',
       'description' => 'Tests for the browser language detection.',
-      'group' => 'Locale',
+      'group' => 'Language',
     );
   }
 
@@ -2424,17 +2424,20 @@ class LocaleContentFunctionalTest extends DrupalWebTestCase {
  *        http://example.cn/admin/config
  *          UI language in Chinese
  */
-class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
+class LanguageNegotiationTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
       'name' => 'UI language negotiation',
       'description' => 'Test UI language switching by url path prefix and domain.',
-      'group' => 'Locale',
+      'group' => 'Language',
     );
   }
 
   function setUp() {
-    parent::setUp(array('locale', 'locale_test', 'block'));
+    // We marginally use interface translation functionality here, so need to
+    // use the locale module instead of language only, but the 90% of the test
+    // is about the negotiation process which is solely in language module.
+    parent::setUp(array('locale', 'language_test', 'block'));
     require_once DRUPAL_ROOT . '/core/includes/language.inc';
     drupal_load('module', 'locale');
     $admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages', 'administer blocks'));
@@ -2578,11 +2581,11 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
         'message' => 'URL (DOMAIN) > DEFAULT: default domain should get default language',
       ),
       // Language domain specific URL, we set the $_SERVER['HTTP_HOST'] in
-      // locale_test.module hook_boot() to simulate this.
+      // language_test.module hook_boot() to simulate this.
       array(
         'language_negotiation' => array(LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
         'language_negotiation_url_part' => LANGUAGE_NEGOTIATION_URL_DOMAIN,
-        'locale_test_domain' => $language_domain,
+        'language_test_domain' => $language_domain,
         'path' => 'admin/config',
         'expect' => $language_string,
         'expected_method_id' => LANGUAGE_NEGOTIATION_URL,
@@ -2604,8 +2607,8 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
     if (!empty($test['language_negotiation_url_part'])) {
       variable_set('language_negotiation_url_part', $test['language_negotiation_url_part']);
     }
-    if (!empty($test['locale_test_domain'])) {
-      variable_set('locale_test_domain', $test['locale_test_domain']);
+    if (!empty($test['language_test_domain'])) {
+      variable_set('language_test_domain', $test['language_test_domain']);
     }
     $this->drupalGet($test['path'], array(), $test['http_header']);
     $this->assertText($test['expect'], $test['message']);
@@ -2718,17 +2721,17 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 /**
  * Test that URL rewriting works as expected.
  */
-class LocaleUrlRewritingTest extends DrupalWebTestCase {
+class LanguageUrlRewritingTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
       'name' => 'URL rewriting',
       'description' => 'Test that URL rewriting works as expected.',
-      'group' => 'Locale',
+      'group' => 'Language',
     );
   }
 
   function setUp() {
-    parent::setUp('locale');
+    parent::setUp('language');
 
     // Create and login user.
     $this->web_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
@@ -2929,7 +2932,10 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
   }
 
   function setUp() {
-    parent::setUp('locale', 'locale_test');
+    // We also use language_test module here to be able to turn on content
+    // language negotiation. Drupal core does not provide a way in itself
+    // to do that.
+    parent::setUp('locale', 'language_test');
 
     // Create and login user.
     $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'create article content'));
@@ -2944,7 +2950,7 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
     $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
 
     // Enable content language negotiation UI.
-    variable_set('locale_test_content_language_type', TRUE);
+    variable_set('language_test_content_language_type', TRUE);
 
     // Set interface language detection to user and content language detection
     // to URL. Disable inheritance from interface language to ensure content
@@ -3084,18 +3090,18 @@ class LocaleDateFormatsFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional test for language types/negotiation info.
  */
-class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
+class LanguageNegotiationInfoTestCase extends DrupalWebTestCase {
 
   public static function getInfo() {
     return array(
       'name' => 'Language negotiation info',
       'description' => 'Tests alterations to language types/negotiation info.',
-      'group' => 'Locale',
+      'group' => 'Language',
     );
   }
 
   function setUp() {
-    parent::setUp('locale');
+    parent::setUp('language');
     require_once DRUPAL_ROOT .'/core/includes/language.inc';
     $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'view the administration theme'));
     $this->drupalLogin($admin_user);
@@ -3107,8 +3113,8 @@ class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
    */
   function testInfoAlterations() {
     // Enable language type/negotiation info alterations.
-    variable_set('locale_test_language_types', TRUE);
-    variable_set('locale_test_language_negotiation_info', TRUE);
+    variable_set('language_test_language_types', TRUE);
+    variable_set('language_test_language_negotiation_info', TRUE);
     $this->languageNegotiationUpdate();
 
     // Check that fixed language types are properly configured without the need
@@ -3117,7 +3123,7 @@ class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
 
     // Make the content language type configurable by updating the language
     // negotiation settings with the proper flag enabled.
-    variable_set('locale_test_content_language_type', TRUE);
+    variable_set('language_test_content_language_type', TRUE);
     $this->languageNegotiationUpdate();
     $type = LANGUAGE_TYPE_CONTENT;
     $language_types = variable_get('language_types', language_types_get_default());
@@ -3138,7 +3144,7 @@ class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
 
     // Remove the interface language negotiation method by updating the language
     // negotiation settings with the proper flag enabled.
-    variable_set('locale_test_language_negotiation_info_alter', TRUE);
+    variable_set('language_test_language_negotiation_info_alter', TRUE);
     $this->languageNegotiationUpdate();
     $negotiation = variable_get("language_negotiation_$type", array());
     $this->assertFalse(isset($negotiation[$interface_method_id]), t('Interface language negotiation method removed from the stored settings.'));
@@ -3158,15 +3164,15 @@ class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
 
     // Check language negotiation results.
     $this->drupalGet('');
-    $last = variable_get('locale_test_language_negotiation_last', array());
+    $last = variable_get('language_test_language_negotiation_last', array());
     foreach (language_types_get_all() as $type) {
       $langcode = $last[$type];
       $value = $type == LANGUAGE_TYPE_CONTENT || strpos($type, 'test') !== FALSE ? 'it' : 'en';
       $this->assertEqual($langcode, $value, t('The negotiated language for %type is %language', array('%type' => $type, '%language' => $langcode)));
     }
 
-    // Disable locale_test and check that everything is set back to the original
-    // status.
+    // Disable language_test and check that everything is set back to the
+    // original status.
     $this->languageNegotiationUpdate('disable');
 
     // Check that only the core language types are available.
@@ -3191,15 +3197,15 @@ class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
   /**
    * Update language types/negotiation information.
    *
-   * Manually invoke locale_modules_enabled()/locale_modules_disabled() since
-   * they would not be invoked after enabling/disabling locale_test the first
-   * time.
+   * Manually invoke language_modules_enabled()/language_modules_disabled()
+   * since they would not be invoked after enabling/disabling language_test the
+   * first time.
    */
   protected function languageNegotiationUpdate($op = 'enable') {
     static $last_op = NULL;
-    $modules = array('locale_test');
+    $modules = array('language_test');
 
-    // Enable/disable locale_test only if we did not already before.
+    // Enable/disable language_test only if we did not already before.
     if ($last_op != $op) {
       $function = "module_{$op}";
       $function($modules);
diff --git a/core/modules/locale/tests/locale_test.info b/core/modules/locale/tests/locale_test.info
deleted file mode 100644
index 83cae4f..0000000
--- a/core/modules/locale/tests/locale_test.info
+++ /dev/null
@@ -1,6 +0,0 @@
-name = "Locale Test"
-description = "Support module for the locale layer tests."
-core = 8.x
-package = Testing
-version = VERSION
-hidden = TRUE
diff --git a/core/modules/path/path.test b/core/modules/path/path.test
index 0066071..298752f 100644
--- a/core/modules/path/path.test
+++ b/core/modules/path/path.test
@@ -507,17 +507,17 @@ class PathLanguageUITestCase extends PathTestCase {
 /**
  * Tests that paths are not prefixed on a monolingual site.
  */
-class PathMonolingualTestCase extends PathTestCase {
+class LanguagePathMonolingualTestCase extends DrupalWebTestCase {
   public static function getInfo() {
     return array(
       'name' => 'Paths on non-English monolingual sites',
       'description' => 'Confirm that paths are not changed on monolingual non-English sites',
-      'group' => 'Path',
+      'group' => 'Language',
     );
   }
 
   function setUp() {
-    parent::setUp('path', 'locale', 'translation');
+    parent::setUp('path', 'language');
 
     // Create and login user.
     $web_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
