diff --git a/core/modules/locale/locale.install b/core/modules/locale/locale.install
index 2745f55..a82c44b 100644
--- a/core/modules/locale/locale.install
+++ b/core/modules/locale/locale.install
@@ -283,6 +283,70 @@ function locale_schema() {
 }
 
 /**
+ * Implements hook_requirements().
+ */
+function locale_requirements($phase) {
+  $requirements = array();
+  if ($phase == 'runtime') {
+    $available_updates = array();
+    $updates_not_found = array();
+    $languages = locale_translatable_language_list();
+
+    if ($languages) {
+      // Determine the status of the translation updates per lanuage.
+      $status = state()->get('locale.translation_status');
+      if ($status) {
+        foreach ($status as $project_id => $project) {
+          foreach ($project as $langcode => $project_info) {
+            if (!isset($project_info->type)) {
+              $updates_not_found[$langcode] = $languages[$langcode]->name;
+            }
+            elseif ($project_info->type == LOCALE_TRANSLATION_LOCAL || $project_info->type == LOCALE_TRANSLATION_REMOTE) {
+              $available_updates[$langcode] = $languages[$langcode]->name;
+            }
+          }
+        }
+
+        if ($available_updates || $updates_not_found) {
+          if ($available_updates) {
+            $requirements['locale_translation'] = array(
+              'title' => 'Translation update status',
+              'value' => l(t('Updates available'), 'admin/reports/translations'),
+              'severity' => REQUIREMENT_WARNING,
+              'description' => t('Updates available for: @languages. See the <a href="@updates">Available translation updates</a> page for more information.', array('@languages' => implode(', ', $available_updates), '@updates' => url('admin/reports/translations'))),
+            );
+          }
+          else {
+            $requirements['locale_translation'] = array(
+              'title' => 'Translation update status',
+              'value' => t('Updates not found'),
+              'severity' => REQUIREMENT_WARNING,
+              'description' => t('Updates not found for: @languages. See the <a href="@updates">Available translation updates</a> page for more information.', array('@languages' => implode(', ', $updates_not_found), '@updates' => url('admin/reports/translations'))),
+            );
+          }
+        }
+        else {
+          $requirements['locale_translation'] = array(
+            'title' => 'Translation update status',
+            'value' => t('Up to date'),
+            'severity' => REQUIREMENT_OK,
+          );
+        }
+      }
+      else {
+        $requirements['locale_translation'] = array(
+          'title' => 'Translation update status',
+          'value' => l(t('Can not determine status'), 'admin/reports/translations'),
+          'severity' => REQUIREMENT_WARNING,
+          'description' => t('No translation status is available. See the <a href="@updates">Available translation updates</a> page for more information.', array('@updates' => url('admin/reports/translations'))),
+        );
+      }
+    }
+  }
+  return $requirements;
+}
+
+/**
  * @addtogroup updates-7.x-to-8.x
  * @{
  */
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 58051d5..16a196e 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -263,6 +263,9 @@ function locale_theme() {
       'render element' => 'form',
       'file' => 'locale.pages.inc',
     ),
+    'locale_project_language_update_info' => array(
+      'arguments' => array('projects' => array(), 'type' => ''),
+    ),
   );
 }
 
diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc
index cf4edce..c51543a 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -596,15 +596,52 @@ function locale_translate_settings_submit($form, &$form_state) {
  * @see locale_menu()
  */
 function locale_translation_status_form($form, &$form_state) {
-  module_load_include('compare.inc', 'locale');
-
   $languages = locale_translatable_language_list();
+  if (!$languages) {
+    drupal_set_message(t('No translatable languages available. <a href="@add_language">Add language</a> first.', array('@add_language' => url('admin/config/regional/language'))), 'warning');
+    return $form;
+  }
+
+  // @todo It could be useful to consider refactoring theme_update_last_check().
+  $last = state()->get('locale.translation_last_checked');
+  $markup = '<div class="locale checked">';
+  $markup .= $last ? t('Last checked: @time ago', array('@time' => format_interval(REQUEST_TIME - $last))) : t('Last checked: never');
+  $markup .= ' <span class="check-manually">(' . l(t('Check manually'), 'admin/reports/translations/check', array('query' => drupal_get_destination())) . ')</span>';
+  $markup .= "</div>\n";
+  $form['last_checked'] = array(
+    '#markup' => $markup,
+  );
+
+  module_load_include('compare.inc', 'locale');
+  locale_translation_flush_projects();
+  $projects = locale_translation_get_projects();
   $status = state()->get('locale.translation_status');
+  if (!$status) {
+    return $form;
+  }
 
-  if (!$languages) {
-    drupal_set_message(t('No translatable languages available. <a href="@add_lanuage">Add language</a> first.', array('@add_lanuage' => url('admin/config/regional/language'))), 'warning');
+  // Prepare information about projects which have available translation
+  // updates.
+  $projects_to_update = array();
+  foreach ($status as $project_id => $project) {
+    foreach ($project as $langcode => $project_info) {
+      if (!isset($project_info->type)) {
+        $projects_to_update[$langcode]['not_found'][] = array(
+          'name' => $project_info->name,
+          'version' => $project_info->version,
+          'debug_info' => _locale_translation_status_debug_info($project_info->version, $project_info->files['remote']->uri, $project_info->files['local']->uri),
+        );
+      }
+      elseif ($project_info->type != 'current') {
+        $projects_to_update[$langcode]['updates'][] = array(
+          'name' => $project_info->name,
+          'version' => $project_info->version,
+        );
+      }
+    }
   }
 
+  // @todo It could be useful to consider refactoring theme_update_last_check().
   $last = state()->get('locale.translation_last_checked');
   $markup = '<div class="locale checked">';
   $markup .= $last ? t('Last checked: @time ago', array('@time' => format_interval(REQUEST_TIME - $last))) : t('Last checked: never');
@@ -619,13 +656,85 @@ function locale_translation_status_form($form, &$form_state) {
     '#value' => drupal_map_assoc(array_keys($languages)),
   );
 
-  $form['actions'] = array(
-    '#type' => 'actions'
+  $form['langcodes_title'] = array(
+    '#type' => 'item',
+    '#title' => t('Languages'),
   );
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Update')
+  $header = array(
+    'title' => t('Title'),
+    'operations' => t('Operations'),
   );
+  $options = array();
+  foreach ($languages as $langcode => $language) {
+    if (isset($projects_to_update[$langcode])) {
+      $project_list = array(
+        'updates' => isset($projects_to_update[$langcode]['updates']) ? $projects_to_update[$langcode]['updates'] : NULL,
+        'not_found' => isset($projects_to_update[$langcode]['not_found']) ? $projects_to_update[$langcode]['not_found'] : NULL,
+      );
+      $options[$langcode] = array(
+        'language' => $language->name,
+        'description' => array(
+          'class' => 'description',
+          'data' => theme('locale_project_language_update_info', array(
+            'projects' => $project_list,
+            'type' => 'summary',
+          )),
+        ),
+        'operations' => array(
+          'class' => 'operations',
+          'data' => theme('locale_project_language_update_info', array(
+            'projects' => $project_list,
+            'type' => 'detailed',
+          )),
+        ),
+      );
+    }
+  }
+  if (!empty($options)) {
+    $header = array(
+      'language' => t('Language'),
+      'description' => t('Description'),
+      'operations' => t('Operations'),
+    );
+    $form['langcodes'] = array(
+      '#type' => 'tableselect',
+      '#header' => $header,
+      '#options' => $options,
+      '#default_value' => drupal_map_assoc(array_keys($options)),
+    );
+    // Disable language rows without available updates.
+    foreach ($form['langcodes']['#options'] as $langcode => $language_row) {
+      if (!isset($language_row['operations']['data']['updates_info'])) {
+        $form['langcodes'][$langcode]['#disable'] = TRUE;
+      }
+    }
+
+    $form['modules']['one'] = array(
+      '#type' => 'details',
+      '#title' => 'One',
+      '#collapsible' => FALSE,
+      '#theme' => 'system_modules_details',
+      '#header' => array(
+        array('data' => t('<span class="element-invisible">Enabled</span>'), 'class' => array('checkbox')),
+        array('data' => t('Name'), 'class' => array('name')),
+        array('data' => t('Description'), 'class' => array('description', RESPONSIVE_PRIORITY_LOW)),
+      ),
+    );
+
+
+    $form['actions'] = array(
+      '#type' => 'actions',
+    );
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Update translations'),
+    );
+    $form['#attached']['js'] = array(
+      drupal_get_path('module', 'locale') . '/locale.toggle-interface-update-details.js' => array(
+        'type' => 'file',
+      ),
+    );
+  }
   return $form;
 }
 
@@ -656,6 +765,40 @@ function locale_translation_status_form_submit($form, &$form_state) {
 }
 
 /**
+ * Provides debug info when translation update were not found for a project.
+ *
+ * Translations files are being fetched either from Drupal translation server
+ * and local files or only from the local filesystem depending on the
+ * "Translation source" setting at admin/config/regional/translate/settings.
+ * This method will produce debug information including the respective path(s)
+ * based on this setting.
+ * Translations for development versions are never fetched, so the debug info
+ * for that is a fixed message.
+ *
+ * @param string $version
+ *   Version of the project.
+ * @param string $remote_path
+ *   Remote path where the translation file was tried to load from.
+ * @param string $local_path
+ *   Local path where the translation file was tried to load from.
+ */
+function _locale_translation_status_debug_info($version, $remote_path, $local_path) {
+  if (strpos($version, 'dev') !== FALSE) {
+    return t('no translations provided for development releases');
+  }
+  $config = config('locale.settings');
+  if ($config->get('translation.use_source') == LOCALE_TRANSLATION_USE_SOURCE_REMOTE_AND_LOCAL) {
+    return t('File not found at %remote_path nor at %local_path', array(
+      '%remote_path' => $remote_path,
+      '%local_path' => $local_path,
+    ));
+  }
+  elseif ($config->get('translation.use_source') == LOCALE_TRANSLATION_USE_SOURCE_LOCAL) {
+    return t('File not found at %local_path', array('%local_path' => $local_path));
+  }
+}
+
+/**
  * Default theme function for translation edit form.
  */
 function theme_locale_translate_edit_form_strings($variables) {
@@ -689,3 +832,167 @@ function theme_locale_translate_edit_form_strings($variables) {
   $output .= theme('pager');
   return $output;
 }
+
+/**
+ * Returns HTML to be displayed in the interface translation status overview.
+ *
+ * Output can be rendered in two modes. "Summary" displays a short sentence with
+ * a simple flat list of modules which updates are available for, possibly along
+ * with another sentence informing us about the number of modules which updates
+ * were not found for.
+ * The detailed view displays the aforementioned sentences following with a list
+ * of modules together with version numbers and possibly with debug information
+ * when updates were not found.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - projects: An array containing the list of projects. List is divided into
+ *     two arrays with the following keys:
+ *     - updates: An array containing the projects which language
+ *       updates will be applied to. Each element of the array is an associative
+ *       array with the following keys:
+ *       - project: Human readable name of the project.
+ *       - version: Version of the project.
+ *     - not_found: An array containing the projects which language updates were
+ *       not found for. Each element of the array is an associative array with
+ *       the following keys:
+ *       - project: Human readable name of the project.
+ *       - version: Optional. Version of the project.
+ *       - debug_info: Optional. Reason of why update were not found for the
+ *         project.
+ *  - type: Optional. 'summary' or 'detailed'. Summary view will be returned if
+ *    parameter is not provided.
+ *
+ * @ingroup themeable
+ */
+/*
+function theme_locale_project_language_update_info($variables) {
+  $output = array();
+  $type = (isset($variables['type'])) ? $variables['type'] : 'summary';
+  $project_list = array();
+
+  foreach ($variables['projects'] as $update_status => $projects) {
+    if (is_array($projects)) {
+      foreach ($projects as $project) {
+        if ($type == 'detailed') {
+          $project_display = $project['name'];
+          if (!empty($project['version'])) {
+            $project_display .= format_string(' (!version)', array('!version' => $project['version']));
+          }
+          if (!empty($project['debug_info'])) {
+            $project_display .= format_string(': !info', array('!info' => $project['debug_info']));
+          }
+          $project_list[$update_status][] = $project_display;
+        }
+        else {
+          $project_list[$update_status][] = $project['name'];
+        }
+      }
+    }
+  }
+
+  if (!empty($project_list['updates'])) {
+    $output['updates_info'] = array();
+    if ($type == 'detailed') {
+      $summary = t('Translation updates available for:');
+      $output['updates_info']['#suffix'] = theme('item_list', array(
+        'items' => $project_list['updates'],
+        'attributes' => array(
+          'class' => array('detailed-list'),
+        ),
+      ));
+    }
+    else {
+      $summary = t('Translation updates available for: %projects.', array(
+        '%projects' => implode(', ', $project_list['updates']),
+      ));
+    }
+    $output['updates_info']['#markup'] = '<p class="summary">' . $summary . '</p>';
+  }
+
+  if (!empty($project_list['not_found'])) {
+    $output['not_found_info'] = array();
+    if ($type == 'detailed') {
+      $summary = t('No translations found for:');
+      $output['not_found_info']['#suffix'] = theme('item_list', array(
+        'items' => $project_list['not_found'],
+        'attributes' => array(
+          'class' => array('detailed-list'),
+        ),
+      ));
+    }
+    else {
+      $summary = t('No translations found for %count projects.', array(
+        '%count' => count($project_list['not_found']),
+      ));
+    }
+    $output['not_found_info']['#markup'] = '<p class="summary">' . $summary . '</p>';
+  }
+
+  if ($type == 'detailed') {
+    // Wrapping everything in a div helps adding toggle links with JS.
+    $output['#prefix'] = '<div class="details">';
+    $output['#suffix'] = '</div>';
+  }
+  return $output;
+}
+//*/
+
+function theme_locale_project_language_update_info($variables) {
+  $form = $variables['form'];
+
+  // Individual table headers.
+  $rows = array();
+  // Iterate through all the modules, which are children of this element.
+  foreach (element_children($form) as $key) {
+    // Stick the key into $module for easier access.
+    $module = $form[$key];
+    // Create the row for the table.
+    $row = array();
+    // Add the checkbox into the first cell.
+    unset($module['enable']['#title']);
+    $module['#requires'] = array_filter($module['#requires']);
+    $module['#required_by'] = array_filter($module['#required_by']);
+
+    $requires = !empty($module['#requires']);
+    $required_by = !empty($module['#required_by']);
+    $version = !empty($module['version']['#markup']);
+
+    $row[] = array('class' => array('checkbox'), 'data' => drupal_render($module['enable']));
+
+    // Add the module label and expand/collapse functionalty.
+    $col2 = '<label for="' . $module['enable']['#id'] . '" class="module-name">' . drupal_render($module['name']) . '</label>';
+    $row[] = array('class' => array('module'), 'data' => $col2);
+
+    // Add the description, along with any modules it requires.
+    $description = '<span class="details"><span class="text">' . drupal_render($module['description']) . '</span></span>';
+    if ($version || $requires || $required_by) {
+      $description .= ' <div class="requirements">';
+      if ($version) {
+        $description .= '<div class="admin-requirements">' . t('Version: !module-version', array('!module-version' => drupal_render($module['version']))) . '</div>';
+      }
+      if ($requires) {
+        $description .= '<div class="admin-requirements">' . t('Requires: !module-list', array('!module-list' => implode(', ', $module['#requires']))) . '</div>';
+      }
+      if ($required_by) {
+        $description .= '<div class="admin-requirements">' . t('Required by: !module-list', array('!module-list' => implode(', ', $module['#required_by']))) . '</div>';
+      }
+      $description .= '</div>';
+    }
+    $links = '';
+    foreach (array('help', 'permissions', 'configure') as $key) {
+      $links .= drupal_render($module['links'][$key]);
+    }
+    if ($links) {
+      $description .= '  <div class="links">';
+      $description .= $links;
+      $description .= '</div>';
+    }
+    $col4 = '<div class="inner" tabindex="0" role="button"><span class="module-description-prefix element-invisible">Show description</span> ' . $description . '</div>';
+    $row[] = array('class' => array('description', 'expand'), 'data' => $col4);
+
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $form['#header'], 'rows' => $rows));
+}
\ No newline at end of file
diff --git a/core/modules/locale/locale.toggle-interface-update-details.js b/core/modules/locale/locale.toggle-interface-update-details.js
new file mode 100644
index 0000000..fa2ff0c
--- /dev/null
+++ b/core/modules/locale/locale.toggle-interface-update-details.js
@@ -0,0 +1,21 @@
+(function ($) {
+
+"use strict";
+
+/**
+ * Attaching the toggle behavior to interface translation update details.
+ */
+Drupal.behaviors.toggleInterfaceUpdateDetails = {
+  attach: function (context, settings) {
+    $('<a class="toggle-details" href="#">' + Drupal.t('Show details') + '</a>').insertBefore('td.operations > .details')
+      .toggle(function() {
+        $(this).text(Drupal.t('Hide details'));
+        $(this).next().show();
+      }, function() {
+        $(this).text(Drupal.t('Show details'));
+        $(this).next().hide();
+      }).next().hide()
+  }
+};
+
+})(jQuery);
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 46b4b9d..2d70207 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -931,6 +931,7 @@ function system_modules($form, $form_state = array()) {
 
   // Lastly, sort all packages by title.
   uasort($form['modules'], 'element_sort_by_title');
+dpm($form);
 
   $form['#attached']['library'][] = array('system', 'drupal.system.modules');
   $form['actions'] = array('#type' => 'actions');
