diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 15c485b..bdb0687 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -239,6 +239,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 f01a6ab..cc1a71b 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -584,30 +584,85 @@ 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');
-  //locale_translation_flush_projects();
-
   $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;
+  }
+
+  module_load_include('compare.inc', 'locale');
+  locale_translation_flush_projects();
+  $projects = locale_translation_get_projects();
   $status = state()->get('locale_translation_status');
 
-  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) || $project_info->type != 'current') {
+        $projects_to_update['all'][$project_info->project] = $projects_to_update[$langcode][] = array(
+          'name' => $project_info->name,
+          'version' => $project_info->version,
+        );
+      }
+    }
   }
 
-  // @todo Add user interface update for translation update.
-  // Followup issues: Display translation status http://drupal.org/node/1804702
-  // and Translations update feature user experience http://drupal.org/node/1029554
-  $form['langcodes'] = array(
-    '#type' => 'value',
-    '#value' => drupal_map_assoc(array_keys($languages)),
+  // @todo It could be useful to consider refactoring theme_update_last_check().
+  $last = state()->get('locale_translation_status_last_update');
+  $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,
   );
 
+  $form['langcodes_title'] = array(
+    '#type' => 'item',
+    '#title' => t('Languages'),
+  );
+  $header = array(
+    'title' => t('Title'),
+    'operations' => t('Operations'),
+  );
+  $options = array();
+  foreach ($languages as $langcode => $language) {
+    if (isset($projects_to_update[$langcode])) {
+      $options[$langcode] = array(
+        'title' => $language->name,
+        'operations' => array(
+          'class' => 'update-details',
+          'data' => theme('locale_project_language_update_info', array(
+            'projects' => array(
+              'updates' => $projects_to_update[$langcode],
+            ),
+            'type' => 'inline_list',
+          )),
+        ),
+      );
+    }
+  }
+  $form['langcodes'] = array(
+    '#type' => 'tableselect',
+    '#header' => $header,
+    '#options' => $options,
+    '#default_value' => drupal_map_assoc(array_keys($options)),
+  );
+  $form['update_info'] = array(
+    '#markup' => theme('locale_project_language_update_info', array(
+      'projects' => array(
+        'updates' => $projects_to_update['all'],
+      ),
+    )),
+  );
   $form['actions'] = array(
-    '#type' => 'actions'
+    '#type' => 'actions',
   );
   $form['actions']['submit'] = array(
     '#type' => 'submit',
-    '#value' => t('Update')
+    '#value' => t('Update'),
   );
   return $form;
 }
@@ -680,3 +735,62 @@ function theme_locale_translate_edit_form_strings($variables) {
   $output .= theme('pager');
   return $output;
 }
+
+/**
+ * Returns HTML for language update status.
+ *
+ * Output contains the list of projects which language updates will be applied
+ * to. A separated list is rendered which contains projects which language
+ * updates were not found for.
+ *
+ * @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: Version of the project.
+ *   - type: Defines how the lists should be rendered ("list" or "inline_list").
+ *
+ * @ingroup themeable
+ */
+function theme_locale_project_language_update_info($variables) {
+  $output = '';
+  $projects = array();
+  // Process the project lists, prepare project names for displaying together
+  // with version.
+  foreach ($variables['projects'] as $status_type => $project_list) {
+    foreach ($project_list as $project) {
+      $projects[$status_type][] = format_string('!name (!version)', array(
+        '!name' => $project['name'],
+        '!version' => $project['version'],
+      ));
+    }
+  }
+  if (!empty($variables['projects']['updates'])) {
+    $output = '<p>' . t('This applies language updates to:') . '</p>';
+    if (!empty($variables['type']) && $variables['type'] == 'inline_list') {
+      $output .= implode(', ', $projects['updates']);
+    }
+    else {
+      $output .= theme('item_list', array('items' => $projects['updates']));
+    }
+  }
+  if (!empty($variables['projects']['not_found'])) {
+    $output .= '<p>' . t('Updates were not found for:') . '</p>';
+    if (!empty($variables['type']) && $variables['type'] == 'inline_list') {
+      $output .= implode(', ', $projects['not_found']);
+    }
+    else {
+      $output .= theme('item_list', array('items' => $projects['not_found']));
+    }
+  }
+  return $output;
+}
