diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 06f8c68..193a802 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -2321,7 +2321,7 @@ function language_list($field = 'language') {
   // Init language list
   if (!isset($languages)) {
     if (drupal_multilingual() || module_exists('locale')) {
-      $languages['language'] = db_query('SELECT * FROM {languages} ORDER BY weight ASC, name ASC')->fetchAllAssoc('language');
+      $languages['language'] = db_query('SELECT * FROM {language} ORDER BY weight ASC, name ASC')->fetchAllAssoc('language');
       // Users cannot uninstall the native English language. However, we allow
       // it to be hidden from the installed languages. Therefore, at least one
       // other language must be enabled then.
diff --git a/includes/install.core.inc b/includes/install.core.inc
index a74dfdf..1dd64f8 100644
--- a/includes/install.core.inc
+++ b/includes/install.core.inc
@@ -1122,7 +1122,7 @@ function install_find_locales($profilename) {
   foreach ($locales as $key => $locale) {
     // The locale (file name) might be drupal-7.2.cs.po instead of cs.po.
     $locales[$key]->langcode = preg_replace('!^(.+\.)?([^\.]+)$!', '\2', $locale->name);
-    // Language codes cannot exceed 12 characters to fit into the {languages}
+    // Language codes cannot exceed 12 characters to fit into the {language}
     // table.
     if (strlen($locales[$key]->langcode) > 12) {
       unset($locales[$key]);
diff --git a/includes/locale.inc b/includes/locale.inc
index 6154cf3..d2a4104 100644
--- a/includes/locale.inc
+++ b/includes/locale.inc
@@ -531,7 +531,7 @@ function _locale_import_po($file, $langcode, $mode, $group = NULL) {
   drupal_set_time_limit(240);
 
   // Check if we have the language already in the database.
-  if (!db_query("SELECT COUNT(language) FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchField()) {
+  if (!db_query("SELECT COUNT(language) FROM {language} WHERE language = :language", array(':language' => $langcode))->fetchField()) {
     drupal_set_message(t('The language selected for import is not supported.'), 'error');
     return FALSE;
   }
@@ -1945,7 +1945,7 @@ function _locale_rebuild_js($langcode = NULL) {
     // version of the language and to prevent checking against an outdated hash.
     $default_langcode = language_default('language');
     if ($default_langcode == $language->language) {
-      $default = db_query("SELECT * FROM {languages} WHERE language = :language", array(':language' => $default_langcode))->fetchObject();
+      $default = db_query("SELECT * FROM {language} WHERE language = :language", array(':language' => $default_langcode))->fetchObject();
       variable_set('language_default', $default);
     }
   }
diff --git a/modules/comment/comment.install b/modules/comment/comment.install
index dc051c3..54e534d 100644
--- a/modules/comment/comment.install
+++ b/modules/comment/comment.install
@@ -168,7 +168,7 @@ function comment_schema() {
         'description' => "The comment author's home page address from the comment form, if user is anonymous, and the 'Anonymous users may/must leave their contact information' setting is turned on.",
       ),
       'language' => array(
-        'description' => 'The {languages}.language of this comment.',
+        'description' => 'The {language}.language of this comment.',
         'type' => 'varchar',
         'length' => 12,
         'not null' => TRUE,
diff --git a/modules/locale/locale.admin.inc b/modules/locale/locale.admin.inc
index b0a77c5..084cbc4 100644
--- a/modules/locale/locale.admin.inc
+++ b/modules/locale/locale.admin.inc
@@ -232,7 +232,7 @@ function locale_languages_custom_form($form) {
  *   Language code of the language to edit.
  */
 function locale_languages_edit_form($form, &$form_state, $langcode) {
-  if ($language = db_query("SELECT * FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchObject()) {
+  if ($language = db_query("SELECT * FROM {language} WHERE language = :language", array(':language' => $langcode))->fetchObject()) {
     _locale_languages_common_controls($form, $language);
     $form['actions'] = array('#type' => 'actions');
     $form['actions']['submit'] = array(
@@ -325,7 +325,7 @@ function _locale_languages_common_controls(&$form, $language = NULL) {
 function locale_languages_predefined_form_validate($form, &$form_state) {
   $langcode = $form_state['values']['langcode'];
 
-  if (($duplicate = db_query("SELECT COUNT(*) FROM {languages} WHERE language = :language", array(':language' => $langcode))->fetchField()) != 0) {
+  if (($duplicate = db_query("SELECT COUNT(*) FROM {language} WHERE language = :language", array(':language' => $langcode))->fetchField()) != 0) {
     form_set_error('langcode', t('The language %language (%code) already exists.', array('%language' => $form_state['values']['name'], '%code' => $langcode)));
   }
 
@@ -388,13 +388,13 @@ function locale_languages_edit_form_validate($form, &$form_state) {
   if (!empty($form_state['values']['domain']) && !empty($form_state['values']['prefix'])) {
     form_set_error('prefix', t('Domain and path prefix values should not be set at the same time.'));
   }
-  if (!empty($form_state['values']['domain']) && $duplicate = db_query("SELECT language FROM {languages} WHERE domain = :domain AND language <> :language", array(':domain' => $form_state['values']['domain'], ':language' => $form_state['values']['langcode']))->fetchField()) {
+  if (!empty($form_state['values']['domain']) && $duplicate = db_query("SELECT language FROM {language} WHERE domain = :domain AND language <> :language", array(':domain' => $form_state['values']['domain'], ':language' => $form_state['values']['langcode']))->fetchField()) {
     form_set_error('domain', t('The domain (%domain) is already tied to a language (%language).', array('%domain' => $form_state['values']['domain'], '%language' => $duplicate->language)));
   }
   if (empty($form_state['values']['prefix']) && language_default('language') != $form_state['values']['langcode'] && empty($form_state['values']['domain'])) {
     form_set_error('prefix', t('Only the default language can have both the domain and prefix empty.'));
   }
-  if (!empty($form_state['values']['prefix']) && $duplicate = db_query("SELECT language FROM {languages} WHERE prefix = :prefix AND language <> :language", array(':prefix' => $form_state['values']['prefix'], ':language' => $form_state['values']['langcode']))->fetchField()) {
+  if (!empty($form_state['values']['prefix']) && $duplicate = db_query("SELECT language FROM {language} WHERE prefix = :prefix AND language <> :language", array(':prefix' => $form_state['values']['prefix'], ':language' => $form_state['values']['langcode']))->fetchField()) {
     form_set_error('prefix', t('The prefix (%prefix) is already tied to a language (%language).', array('%prefix' => $form_state['values']['prefix'], '%language' => $duplicate->language)));
   }
 }
diff --git a/modules/locale/locale.install b/modules/locale/locale.install
index a144813..c700b94 100644
--- a/modules/locale/locale.install
+++ b/modules/locale/locale.install
@@ -13,7 +13,7 @@ function locale_install() {
   // fields; non-MySQL database servers need to ensure the field type is text
   // and that LIKE produces a case-sensitive comparison.
 
-  db_insert('languages')
+  db_insert('language')
     ->fields(array(
       'language' => 'en',
       'name' => 'English',
@@ -34,7 +34,7 @@ function locale_uninstall() {
   $locale_js_directory = 'public://' . variable_get('locale_js_directory', 'languages');
 
   if (is_dir($locale_js_directory)) {
-    $files = db_query('SELECT language, javascript FROM {languages}');
+    $files = db_query('SELECT language, javascript FROM {language}');
     foreach ($files as $file) {
       if (!empty($file->javascript)) {
         file_unmanaged_delete($locale_js_directory . '/' . $file->language . '_' . $file->javascript . '.js');
@@ -80,7 +80,7 @@ function locale_uninstall() {
  * Implements hook_schema().
  */
 function locale_schema() {
-  $schema['languages'] = array(
+  $schema['language'] = array(
     'description' => 'List of all available languages in the system.',
     'fields' => array(
       'language' => array(
@@ -231,7 +231,7 @@ function locale_schema() {
         'length' => 12,
         'not null' => TRUE,
         'default' => '',
-        'description' => 'Language code. References {languages}.language.',
+        'description' => 'Language code. References {language}.language.',
       ),
       'plid' => array(
         'type' => 'int',
@@ -262,3 +262,11 @@ function locale_schema() {
 
   return $schema;
 }
+
+/**
+ * Implementation of hook_update_N()
+ * Rename languages table to language
+ */
+function local_update_8001() {
+  db_rename_table('languages', 'language');
+}
diff --git a/modules/locale/locale.test b/modules/locale/locale.test
index 3ae6d91..bedcd0f 100644
--- a/modules/locale/locale.test
+++ b/modules/locale/locale.test
@@ -645,7 +645,7 @@ class LocaleImportFunctionalTest extends DrupalWebTestCase {
     $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 9, '%update' => 0, '%delete' => 0)), t('The translation file was successfully imported.'));
 
     // This import should have saved plural forms to have 2 variants.
-    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, t('Plural number initialized.'));
+    $this->assert(db_query("SELECT plurals FROM {language} WHERE language = 'fr'")->fetchField() == 2, t('Plural number initialized.'));
 
     // Ensure we were redirected correctly.
     $this->assertEqual($this->getUrl(), url('admin/config/regional/translate', array('absolute' => TRUE)), t('Correct page redirection.'));
@@ -703,7 +703,7 @@ class LocaleImportFunctionalTest extends DrupalWebTestCase {
     $this->assertText(t('No strings available.'), t('String not overwritten by imported string.'));
 
     // This import should not have changed number of plural forms.
-    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, t('Plural numbers untouched.'));
+    $this->assert(db_query("SELECT plurals FROM {language} WHERE language = 'fr'")->fetchField() == 2, t('Plural numbers untouched.'));
 
     // Try importing a .po file with overriding strings, and ensure existing
     // strings are overwritten.
@@ -724,7 +724,7 @@ class LocaleImportFunctionalTest extends DrupalWebTestCase {
     $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
     $this->assertNoText(t('No strings available.'), t('String overwritten by imported string.'));
     // This import should have changed number of plural forms.
-    $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 3, t('Plural numbers changed.'));
+    $this->assert(db_query("SELECT plurals FROM {language} WHERE language = 'fr'")->fetchField() == 3, t('Plural numbers changed.'));
   }
 
   /**
@@ -1151,7 +1151,7 @@ class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
     $edit = array('translations[fr]' => 'french translation');
     $this->drupalPost('admin/config/regional/translate/edit/' . $string->lid, $edit, t('Save translations'));
     _locale_rebuild_js('fr');
-    $file = db_query('SELECT javascript FROM {languages} WHERE language = :language', array(':language' => 'fr'))->fetchObject();
+    $file = db_query('SELECT javascript FROM {language} WHERE language = :language', array(':language' => 'fr'))->fetchObject();
     $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/fr_' . $file->javascript . '.js';
     $this->assertTrue($result = file_exists($js_file), t('JavaScript file created: %file', array('%file' => $result ? $js_file : t('none'))));
 
diff --git a/modules/node/node.install b/modules/node/node.install
index 3f732a4..dcef82a 100644
--- a/modules/node/node.install
+++ b/modules/node/node.install
@@ -33,7 +33,7 @@ function node_schema() {
         'default' => '',
       ),
       'language' => array(
-        'description' => 'The {languages}.language of this node.',
+        'description' => 'The {language}.language of this node.',
         'type' => 'varchar',
         'length' => 12,
         'not null' => TRUE,
diff --git a/modules/system/system.install b/modules/system/system.install
index 6d80c43..9442f63 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -770,7 +770,7 @@ function system_schema() {
         'not null' => TRUE,
       ),
       'language' => array(
-        'description' => 'A {languages}.language for this format to be used with.',
+        'description' => 'A {language}.language for this format to be used with.',
         'type' => 'varchar',
         'length' => 12,
         'not null' => TRUE,
