diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 3ebe97d..465493a 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -103,6 +103,27 @@
 const LOCALE_TRANSLATION_DEFAULT_FILENAME = '%project-%version.%language.po';
 
 /**
+ * The number of seconds that the translations status entry should be considered.
+ */
+const LOCALE_TRANSLATION_STATUS_TTL = 600;
+
+/**
+ * @todo
+ */
+const LOCALE_TRANSLATION_OVERWRITE_ALL = 'all';
+
+/**
+ * @todo
+ */
+const LOCALE_TRANSLATION_OVERWRITE_NON_CUSTOMIZED = 'non_customized';
+
+/**
+ * @todo
+ */
+const LOCALE_TRANSLATION_OVERWRITE_NONE = 'none';
+
+
+/**
  * Implements hook_help().
  */
 function locale_help($path, $arg) {
@@ -176,10 +197,20 @@ function locale_menu() {
     'type' => MENU_LOCAL_TASK,
     'file' => 'locale.bulk.inc',
   );
+  $items['admin/config/regional/translate/settings'] = array(
+    'title' => 'Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_translate_settings'),
+    'access arguments' => array('translate interface'),
+    'weight' => 40,
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'locale.pages.inc',
+  );
   $items['admin/reports/translations'] = array(
     'title' => 'Available translation updates',
     'description' => 'Get a status report about available interface translations for your installed modules and themes.',
-    'page callback' => 'locale_translation_status',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('locale_translation_status_form'),
     'access arguments' => array('translate interface'),
     'file' => 'locale.pages.inc',
   );
@@ -698,7 +729,7 @@ function locale_form_system_file_system_settings_alter(&$form, $form_state) {
     '#title' => t('Interface translations directory'),
     '#default_value' => variable_get('locale_translate_file_directory', conf_path() . '/files/translations'),
     '#maxlength' => 255,
-    '#description' => t('A local file system path where interface translation files are looked for. This directory must exist.'),
+    '#description' => t('A local file system path where interface translation files will be stored.'),
     '#after_build' => array('system_check_directory'),
     '#weight' => 10,
   );
diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc
index 8ea8780..6cec6fa 100644
--- a/core/modules/locale/locale.pages.inc
+++ b/core/modules/locale/locale.pages.inc
@@ -467,19 +467,258 @@ function locale_translation_manual_status() {
 }
 
 /**
+ * Page callback: Configuration for interface translation.
+ *
+ * @see locale_menu()
+ */
+function locale_translate_settings($form, &$form_state) {
+  $config = config('locale.settings');
+
+  $form['update_interval_days'] = array(
+    '#type' => 'radios',
+    '#title' => t('Check for updates'),
+    '#default_value' => $config->get('translation.update_interval_days'),
+    '#options' => array(
+      '0' => t('Never (manually)'),
+      '1' => t('Daily'),
+      '7' => t('Weekly'),
+    ),
+    '#description' => t('Select how frequently you want to check for new interface translations for your currently installed modules and themes.'),
+  );
+
+  $form['check_disabled_modules'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Check for updates of disabled modules and themes'),
+    '#default_value' => $config->get('translation.check_disabled_modules'),
+  );
+
+  if ($directory = variable_get('locale_translate_file_directory', conf_path() . '/files/translations')) {
+    $description = t('Translation files are stored locally in the  %path directory. You can change this directory on the <a href="@url">File system</a> configuration page.', array('%path' => $directory, '@url' => url('admin/config/media/file-system')));
+  }
+  else {
+    $description = t('Translation files will not be stored locally. Change the Interface translation directory on the <a href="@url">File system configuration</a> page.', array('@url' => url('admin/config/media/file-system')));
+  }
+  $form['#translation_directory'] = $directory;
+  $form['use_source'] = array(
+    '#type' => 'radios',
+    '#title' => t('Translation source'),
+    '#default_value' => $config->get('translation.use_source'),
+    '#options' => array(
+      LOCALE_TRANSLATION_USE_SOURCE_REMOTE_AND_LOCAL => t('Remote and local'),
+      LOCALE_TRANSLATION_USE_SOURCE_LOCAL => t('Local only'),
+    ),
+    '#description' => t('The source of translation files for automatic interface translation.') . ' ' . $description,
+  );
+
+  if ($config->get('translation.overwrite_not_customized') == FALSE) {
+    $default = LOCALE_TRANSLATION_OVERWRITE_NONE;
+  }
+  elseif ($config->get('translation.overwrite_customized') == TRUE) {
+    $default = LOCALE_TRANSLATION_OVERWRITE_ALL;
+  }
+  else {
+    $default = LOCALE_TRANSLATION_OVERWRITE_NON_CUSTOMIZED;
+  }
+  $form['overwrite'] = array(
+    '#type' => 'radios',
+    '#title' => t('Import behaviour'),
+    '#default_value' => $default,
+    '#options' => array(
+      LOCALE_TRANSLATION_OVERWRITE_NONE => t("Don't overwrite existing translations."),
+      LOCALE_TRANSLATION_OVERWRITE_NON_CUSTOMIZED => t('Only overwrite imported translations, customized translations are kept.'),
+      LOCALE_TRANSLATION_OVERWRITE_ALL => t('Overwrite existing translations.'),
+    ),
+    '#description' => t('How to treat existing translations when automatically updating the interface translations.'),
+  );
+
+  return system_config_form($form, $form_state);
+}
+
+/**
+ * @todo
+ */
+function locale_translate_settings_validate($form, &$form_state) {
+  if (empty($form['#translation_directory']) && $form_state['values']['use_source'] == LOCALE_TRANSLATION_USE_SOURCE_LOCAL) {
+    form_set_error('use_source', t('You have selected local translation source, but no <a href="@url">Interface translation directory</a> was configured.', array('@url' => url('admin/config/media/file-system'))));
+  }
+}
+
+/**
+ * @todo
+ */
+function locale_translate_settings_submit($form, &$form_state) {
+  $values = $form_state['values'];
+
+  $config = config('locale.settings');
+  $config->set('translation.update_interval_days', $values['update_interval_days'])->save();
+  $config->set('translation.use_source', $values['use_source'])->save();
+
+  switch ($values['overwrite']) {
+    case LOCALE_TRANSLATION_OVERWRITE_ALL:
+      $config->set('translation.overwrite_customized', TRUE)->save();
+      $config->set('translation.overwrite_not_customized', TRUE)->save();
+      break;
+    case LOCALE_TRANSLATION_OVERWRITE_NON_CUSTOMIZED:
+      $config->set('translation.overwrite_customized', FALSE)->save();
+      $config->set('translation.overwrite_not_customized', TRUE)->save();
+      break;
+    case LOCALE_TRANSLATION_OVERWRITE_NONE:
+      $config->set('translation.overwrite_customized', FALSE)->save();
+      $config->set('translation.overwrite_not_customized', FALSE)->save();
+      break;
+  }
+
+  $config->set('translation.check_disabled_modules', $values['check_disabled_modules'])->save();
+
+  // Invalidate the cached translation status when the configuration setting of
+  // 'use_source' and 'check_disabled_modules' change.
+  if ($form['use_source']['#default_value'] != $form_state['values']['use_source'] ||
+      $form['check_disabled_modules']['#default_value'] != $form_state['values']['check_disabled_modules']) {
+    locale_translation_clear_status();
+  }
+}
+
+/**
  * Page callback: Display the current translation status.
  *
  * @see locale_menu()
  */
-function locale_translation_status() {
+function locale_translation_status_form($form, &$form_state) {
+  module_load_include('compare.inc', 'locale');
+  //locale_translation_flush_projects();
+  $projects = locale_translation_get_projects();
   $languages = locale_translatable_language_list();
+  $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');
   }
 
+  // === Start of temporay code. For development only ===
+  $last = state()->get('locale_translation_status_last_update');
+  $markup = '<p 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 .= '</p>';
+  $form['last_checked'] = array(
+    '#markup' => $markup,
+  );
+
+  $table_header = array(t('Project'), t('Version'), t('Status'), t('Current version'), t('Timestamp'), t('Recommended version'), t('Timestamp'), t('Source'));
+  $rows = array();
+  foreach ($projects as $name => $project) {
+    foreach ($languages as $langcode => $language) {
+      if (isset($status[$name][$langcode])) {
+        $source = $status[$name][$langcode];
+        $row = array(
+          'project' => $name,
+          'version' => $source->version,
+          'status' => isset($source->type) ? $source->type == 'current' ? t('Up to date') : t('Translations available') : t('Unknown'),
+          'current version' => '',
+          'current timestamp' => '',
+          'recommended version' => '',
+          'recommended timestamp' => '',
+          'recommended source' => '',
+        );
+        if (isset($source->files['current'])) {
+          $current = $source->files['current'];
+          $row['current version'] = $current->version;
+          $row['current timestamp'] = format_date($current->timestamp, 'custom', 'j M - G:i:s');
+        }
+        if ($row['status'] == t('Translations available')) {
+          $available = $source->files[$source->type];
+          $row['recommended version'] = $available->version;
+          $row['recommended timestamp'] = format_date($available->timestamp, 'custom', 'j M - G:i:s');
+          $row['recommended source'] = $available->type;
+        }
+      }
+      else {
+        $row = array(
+          'project' => $project,
+          'version' => $source->version,
+          'status' => t('Unknown'),
+          'current version' => '',
+          'current timestamp' => '',
+          'recommended version' => '',
+          'recommended timestamp' => '',
+          'recommended source' => '',
+        );
+      }
+      $rows[] = $row;
+    }
+  }
+  $form['table'] = array(
+    '#markup' => theme('table', array('header' => $table_header, 'rows' => $rows)),
+  );
+
   // @todo Calculate and display the translation status here. See the follow-up
   // issue for translation interface: http://drupal.org/node/1804702
-  return 'TODO: Show the translation status here';
+  // This form content is temporary and required to get the tests working.
+  $options = array();
+  foreach ($projects as $name => $project) {
+    $options[$name] = $project->name;
+  }
+  $form['projects'] = array(
+    '#title' => t('Projects'),
+    '#type' => 'checkboxes',
+    '#options' => $options,
+    '#default_value' => drupal_map_assoc(array_keys($options)),
+    '#required' => TRUE,
+  );
+
+  $options = array();
+  foreach ($languages as $langcode => $language) {
+    $options[$langcode] = $language->name;
+  }
+  $form['langcodes'] = array(
+    '#title' => t('Languages'),
+    '#type' => 'checkboxes',
+    '#options' => $options,
+    '#default_value' => drupal_map_assoc(array_keys($options)),
+    '#required' => TRUE,
+  );
+
+  // === End of temporay code. For development only ===
+
+  $form['actions'] = array(
+    '#type' => 'actions'
+  );
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Update')
+  );
+  return $form;
+}
+
+/**
+ * Form submission handler for locale_translation_status().
+ */
+function locale_translation_status_form_submit($form, &$form_state) {
+  $langcodes = array_filter($form_state['values']['langcodes']);
+  $projects = array_filter($form_state['values']['projects']);
+
+  // If the status was updated recently we can immediately start updating. If
+  // the status is not expired we will get the status first.
+  $last_checked = state()->get('locale_translation_status_last_update');
+  if ($last_checked < REQUEST_TIME - LOCALE_TRANSLATION_STATUS_TTL) {
+    locale_translation_clear_status();
+    // @todo Batch with check status + download + import.
+  }
+  else {
+    module_load_include('fetch.inc', 'locale');
+    $status = state()->get('locale_translation_status');
+    // Use only the selected projects and languages for update.
+    $sources = array();
+    foreach($projects as $project) {
+      foreach ($langcodes as $langcode) {
+        if (isset($status[$project][$langcode])) {
+          $sources[] = $status[$project][$langcode];
+        }
+      }
+    }
+    $batch = locale_translation_batch_fetch_build($sources);
+    batch_set($batch);
+  }
 }
 
 /**
