diff --git a/core/modules/locale/lib/Drupal/locale/Form/ImportForm.php b/core/modules/locale/lib/Drupal/locale/Form/ImportForm.php
new file mode 100644
index 0000000..32afb37
--- /dev/null
+++ b/core/modules/locale/lib/Drupal/locale/Form/ImportForm.php
@@ -0,0 +1,191 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\locale\Form\ImportForm.
+ */
+
+namespace Drupal\locale\Form;
+
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Language\Language;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Language\LanguageManager;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Form constructor for the translation import screen.
+ */
+class ImportForm extends FormBase implements ContainerInjectionInterface {
+
+  /**
+   * Module Handler Service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManager
+   */
+  protected $languageManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('module_handler'),
+      $container->get('language_manager')
+    );
+  }
+  /**
+   * Constructs an ImportForm.
+   *
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   */
+  public function __construct(ModuleHandlerInterface $module_handler, LanguageManager $language_manager) {
+    $this->moduleHandler = $module_handler;
+    $this->languageManager = $language_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'locale_translate_import_form';
+  }
+
+  /**
+   * Form constructor for the translation import screen.
+   *
+   * @ingroup forms
+   */
+  public function buildForm(array $form, array &$form_state) {
+    $this->languageManager->reset();
+    $languages = $this->languageManager->getLanguages();
+
+    // Initialize a language list to the ones available, including English if we
+    // are to translate Drupal to English as well.
+    $existing_languages = array();
+    foreach ($languages as $langcode => $language) {
+      if ($langcode != 'en' || locale_translate_english()) {
+        $existing_languages[$langcode] = $language->name;
+      }
+    }
+
+    // If we have no languages available, present the list of predefined
+    // languages only. If we do have already added languages, set up two option
+    // groups with the list of existing and then predefined languages.
+    form_load_include($form_state, 'inc', 'language', 'language.admin');
+    if (empty($existing_languages)) {
+      $language_options = language_admin_predefined_list();
+      $default = key($language_options);
+    }
+    else {
+      $default = key($existing_languages);
+      $language_options = array(
+        $this->t('Existing languages') => $existing_languages,
+        $this->t('Languages not yet added') => language_admin_predefined_list()
+      );
+    }
+
+    $validators = array(
+      'file_validate_extensions' => array('po'),
+      'file_validate_size' => array(file_upload_max_size()),
+    );
+    $form['file'] = array(
+      '#type' => 'file',
+      '#title' => $this->t('Translation file'),
+      '#description' => array(
+        '#theme' => 'file_upload_help',
+        '#description' => $this->t('A Gettext Portable Object file.'),
+        '#upload_validators' => $validators,
+       ),
+      '#size' => 50,
+      '#upload_validators' => $validators,
+      '#attributes' => array('class' => array('file-import-input')),
+      '#attached' => array(
+        'js' => array(
+          drupal_get_path('module', 'locale') . '/locale.bulk.js' => array(),
+        ),
+      ),
+    );
+    $form['langcode'] = array(
+      '#type' => 'select',
+      '#title' => $this->t('Language'),
+      '#options' => $language_options,
+      '#default_value' => $default,
+      '#attributes' => array('class' => array('langcode-input')),
+    );
+
+    $form['customized'] = array(
+      '#title' => $this->t('Treat imported strings as custom translations'),
+      '#type' => 'checkbox',
+    );
+    $form['overwrite_options'] = array(
+      '#type' => 'container',
+      '#tree' => TRUE,
+    );
+    $form['overwrite_options']['not_customized'] = array(
+      '#title' => $this->t('Overwrite non-customized translations'),
+      '#type' => 'checkbox',
+      '#states' => array(
+        'checked' => array(
+          ':input[name="customized"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+    $form['overwrite_options']['customized'] = array(
+      '#title' => $this->t('Overwrite existing customized translations'),
+      '#type' => 'checkbox',
+    );
+
+    $form['actions'] = array(
+      '#type' => 'actions'
+    );
+    $form['actions']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => $this->t('Import')
+    );
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    // Ensure we have the file uploaded.
+    if ($file = file_save_upload('file', $form_state, $form['file']['#upload_validators'], 'translations://', 0)) {
+
+      // Add language, if not yet supported.
+      $language = language_load($form_state['values']['langcode']);
+      if (empty($language)) {
+        $language = new Language(array(
+          'id' => $form_state['values']['langcode']
+        ));
+        $language = language_save($language);
+        drupal_set_message(t('The language %language has been created.', array('%language' => t($language->name))));
+      }
+      $options = array(
+        'langcode' => $form_state['values']['langcode'],
+        'overwrite_options' => $form_state['values']['overwrite_options'],
+        'customized' => $form_state['values']['customized'] ? LOCALE_CUSTOMIZED : LOCALE_NOT_CUSTOMIZED,
+      );
+      $this->moduleHandler->loadInclude('locale', 'bulk.inc');
+      $file = locale_translate_file_attach_properties($file, $options);
+      $batch = locale_translate_batch_build(array($file->uri => $file), $options);
+      batch_set($batch);
+    }
+    else {
+      $this->setFormError('file', $form_state, $this->t('File to import not found.'));
+      $form_state['rebuild'] = TRUE;
+      return;
+    }
+
+    $form_state['redirect_route']['route_name'] = 'locale.translate_page';
+  }
+}
diff --git a/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php b/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php
index 41857d0..6ce06a1 100644
--- a/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php
+++ b/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php
@@ -22,6 +22,16 @@ public function import() {
   }
 
   /**
+   * Wraps locale_translate_export_form().
+   *
+   * @todo Remove locale_translate_export_form().
+   */
+  public function export() {
+    module_load_include('bulk.inc', 'locale');
+    return drupal_get_form('locale_translate_export_form');
+  }
+
+  /**
    * Wraps locale_translation_status_form().
    *
    * @todo Remove locale_translation_status_form().
diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc
index e93469f..8012e80 100644
--- a/core/modules/locale/locale.bulk.inc
+++ b/core/modules/locale/locale.bulk.inc
@@ -10,96 +10,70 @@
 use Drupal\file\FileInterface;
 
 /**
- * Form constructor for the translation import screen.
+ * Form constructor for the Gettext translation files export form.
  *
- * @see locale_translate_import_form_submit()
+ * @see locale_translate_export_form_submit()
  * @ingroup forms
  *
- * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0.
- *   Use \Drupal\locale\Form\LocaleForm::import().
+ * @deprecated Use \Drupal\locale\Form\LocaleForm::export()
  */
-function locale_translate_import_form($form, &$form_state) {
-  Drupal::languageManager()->reset();
-  $languages = \Drupal::languageManager()->getLanguages();
-
-  // Initialize a language list to the ones available, including English if we
-  // are to translate Drupal to English as well.
-  $existing_languages = array();
+function locale_translate_export_form($form, &$form_state) {
+  $languages = language_list();
+  $language_options = array();
   foreach ($languages as $langcode => $language) {
     if ($langcode != 'en' || locale_translate_english()) {
-      $existing_languages[$langcode] = $language->name;
+      $language_options[$langcode] = $language->name;
     }
   }
+  $language_default = language_default();
 
-  // If we have no languages available, present the list of predefined languages
-  // only. If we do have already added languages, set up two option groups with
-  // the list of existing and then predefined languages.
-  form_load_include($form_state, 'inc', 'language', 'language.admin');
-  if (empty($existing_languages)) {
-    $language_options = language_admin_predefined_list();
-    $default = key($language_options);
+  if (empty($language_options)) {
+    $form['langcode'] = array(
+      '#type' => 'value',
+      '#value' => Language::LANGCODE_SYSTEM,
+    );
+    $form['langcode_text'] = array(
+      '#type' => 'item',
+      '#title' => t('Language'),
+      '#markup' => t('No language available. The export will only contain source strings.'),
+    );
   }
   else {
-    $default = key($existing_languages);
-    $language_options = array(
-      t('Existing languages') => $existing_languages,
-      t('Languages not yet added') => language_admin_predefined_list()
+    $form['langcode'] = array(
+      '#type' => 'select',
+      '#title' => t('Language'),
+      '#options' => $language_options,
+      '#default_value' => $language_default->id,
+      '#empty_option' => t('Source text only, no translations'),
+      '#empty_value' => Language::LANGCODE_SYSTEM,
     );
-  }
-
-  $validators = array(
-    'file_validate_extensions' => array('po'),
-    'file_validate_size' => array(file_upload_max_size()),
-  );
-  $file_description = array(
-    '#theme'             => 'file_upload_help',
-    '#description'       => t('A Gettext Portable Object file.'),
-    '#upload_validators' => $validators,
-  );
-
-  $form['file'] = array(
-    '#type' => 'file',
-    '#title' => t('Translation file'),
-    '#description' => drupal_render($file_description),
-    '#size' => 50,
-    '#upload_validators' => $validators,
-    '#attributes' => array('class' => array('file-import-input')),
-    '#attached' => array(
-      'js' => array(
-        drupal_get_path('module', 'locale') . '/locale.bulk.js' => array(),
+    $form['content_options'] = array(
+      '#type' => 'details',
+      '#title' => t('Export options'),
+      '#collapsed' => TRUE,
+      '#tree' => TRUE,
+      '#states' => array(
+        'invisible' => array(
+          ':input[name="langcode"]' => array('value' => Language::LANGCODE_SYSTEM),
+        ),
       ),
-    ),
-  );
-  $form['langcode'] = array(
-    '#type' => 'select',
-    '#title' => t('Language'),
-    '#options' => $language_options,
-    '#default_value' => $default,
-    '#attributes' => array('class' => array('langcode-input')),
-  );
-
-  $form['customized'] = array(
-    '#title' => t('Treat imported strings as custom translations'),
-    '#type' => 'checkbox',
-  );
-  $form['overwrite_options'] = array(
-    '#type' => 'container',
-    '#tree' => TRUE,
-  );
-  $form['overwrite_options']['not_customized'] = array(
-    '#title' => t('Overwrite non-customized translations'),
-    '#type' => 'checkbox',
-    '#states' => array(
-      'checked' => array(
-        ':input[name="customized"]' => array('checked' => TRUE),
-      ),
-    ),
-  );
-  $form['overwrite_options']['customized'] = array(
-    '#title' => t('Overwrite existing customized translations'),
-    '#type' => 'checkbox',
-  );
-
+    );
+    $form['content_options']['not_customized'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Include non-customized translations'),
+      '#default_value' => TRUE,
+    );
+    $form['content_options']['customized'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Include customized translations'),
+      '#default_value' => TRUE,
+    );
+    $form['content_options']['not_translated'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Include untranslated text'),
+      '#default_value' => TRUE,
+    );
+  }
   $form['actions'] = array(
     '#type' => 'actions'
   );
@@ -111,38 +85,56 @@ function locale_translate_import_form($form, &$form_state) {
 }
 
 /**
- * Form submission handler for locale_translate_import_form().
+ * Form submission handler for locale_translate_export_form().
  */
-function locale_translate_import_form_submit($form, &$form_state) {
-  // Ensure we have the file uploaded.
-  if ($file = file_save_upload('file', $form['file']['#upload_validators'], 'translations://', 0)) {
-
-    // Add language, if not yet supported.
-    $language = \Drupal::languageManager()->getLanguage($form_state['values']['langcode']);
-    if (empty($language)) {
-      $language = new Language(array(
-        'id' => $form_state['values']['langcode']
-      ));
-      $language = language_save($language);
-      drupal_set_message(t('The language %language has been created.', array('%language' => t($language->name))));
-    }
-    $options = array(
-      'langcode' => $form_state['values']['langcode'],
-      'overwrite_options' => $form_state['values']['overwrite_options'],
-      'customized' => $form_state['values']['customized'] ? LOCALE_CUSTOMIZED : LOCALE_NOT_CUSTOMIZED,
-    );
-    $file = locale_translate_file_attach_properties($file, $options);
-    $batch = locale_translate_batch_build(array($file->uri => $file), $options);
-    batch_set($batch);
+function locale_translate_export_form_submit($form, &$form_state) {
+  // If template is required, language code is not given.
+  if ($form_state['values']['langcode'] != Language::LANGCODE_SYSTEM) {
+    $language = language_load($form_state['values']['langcode']);
+  }
+  else {
+    $language = NULL;
+  }
+  $content_options = isset($form_state['values']['content_options']) ? $form_state['values']['content_options'] : array();
+  $reader = new PoDatabaseReader();
+  $languageName = '';
+  if ($language != NULL) {
+    $reader->setLangcode($language->id);
+    $reader->setOptions($content_options);
+    $languages = language_list();
+    $languageName = isset($languages[$language->id]) ? $languages[$language->id]->name : '';
+    $filename = $language->id .'.po';
   }
   else {
-    drupal_set_message(t('File to import not found.'), 'error');
-    $form_state['rebuild'] = TRUE;
-    return;
+    // Template required.
+    $filename = 'drupal.pot';
   }
 
-  $form_state['redirect_route']['route_name'] = 'locale.translate_page';
-  return;
+  $item = $reader->readItem();
+  if (!empty($item)) {
+    $uri = tempnam('temporary://', 'po_');
+    $header = $reader->getHeader();
+    $header->setProjectName(\Drupal::config('system.site')->get('name'));
+    $header->setLanguageName($languageName);
+
+    $writer = new PoStreamWriter;
+    $writer->setUri($uri);
+    $writer->setHeader($header);
+
+    $writer->open();
+    $writer->writeItem($item);
+    $writer->writeItems($reader);
+    $writer->close();
+
+    $response = new BinaryFileResponse($uri);
+    $response->setContentDisposition('attachment', $filename);
+    // @todo remove lines below once converted to new routing system.
+    $response->prepare(\Drupal::request())
+      ->send();
+  }
+  else {
+    drupal_set_message('Nothing to export.');
+  }
 }
 
 /**
diff --git a/core/modules/locale/locale.routing.yml b/core/modules/locale/locale.routing.yml
index 6658dad..705d5ea 100644
--- a/core/modules/locale/locale.routing.yml
+++ b/core/modules/locale/locale.routing.yml
@@ -24,7 +24,7 @@ locale.translate_page:
 locale.translate_import:
   path: '/admin/config/regional/translate/import'
   defaults:
-    _content: '\Drupal\locale\Form\LocaleForm::import'
+    _form: '\Drupal\locale\Form\ImportForm'
     _title: 'Import'
   requirements:
     _permission: 'translate interface'
