diff --git a/src/Plugin/tmgmt/Translator/SmartlingTranslator.php b/src/Plugin/tmgmt/Translator/SmartlingTranslator.php
index 1c691df..130b890 100755
--- a/src/Plugin/tmgmt/Translator/SmartlingTranslator.php
+++ b/src/Plugin/tmgmt/Translator/SmartlingTranslator.php
@@ -127,7 +127,7 @@ class SmartlingTranslator extends TranslatorPluginBase implements ContainerFacto
   public function requestTranslation(JobInterface $job) {
     $name = $this->getFileName($job);
 
-    $export_format = $job->getSetting('export_format');
+    $export_format = pathinfo($name, PATHINFO_EXTENSION) == 'xlf' ? 'xlf' : 'html';
     $export = $this->formatPluginsManager->createInstance($export_format);
 
     $path = $job->getSetting('scheme') . '://tmgmt_sources/' . $name;
@@ -161,7 +161,7 @@ class SmartlingTranslator extends TranslatorPluginBase implements ContainerFacto
       $this->getSmartlingApi($job->getTranslator())->uploadFile(
           \Drupal::service('file_system')->realpath($file->getFileUri()),
           $file->getFilename(),
-          $job->getSetting('export_format') === 'xlf' ? 'xliff' : 'xml',
+          $export_format === 'xlf' ? 'xliff' : 'xml',
           $upload_params
       );
 
@@ -264,8 +264,19 @@ class SmartlingTranslator extends TranslatorPluginBase implements ContainerFacto
   }
 
   public function getFileName(JobInterface $job) {
-    $extension = $job->getSetting('export_format') === 'xlf' ? 'xlf' : 'xml';
-    return  "JobID" . $job->id() . '_' . $job->getSourceLangcode() . '_' . $job->getTargetLangcode() . '.' . $extension;
+    try {
+      $filename = $job->get('job_file_name');
+      $filename = $filename->getValue()[0]['value'];
+    } catch (\Exception $e) {
+      $filename = '';
+    }
+
+    if (empty($filename)) {
+      $extension = $job->getSetting('export_format') === 'xlf' ? 'xlf' : 'xml';
+      $filename = "JobID" . $job->id() . '_' . $job->getSourceLangcode() . '_' . $job->getTargetLangcode() . '.' . $extension;
+    }
+
+    return  $filename;
   }
 
   /**
diff --git a/tmgmt_smartling.install b/tmgmt_smartling.install
index 24ce45a..3b15ace 100644
--- a/tmgmt_smartling.install
+++ b/tmgmt_smartling.install
@@ -20,3 +20,51 @@ function tmgmt_smartling_update_8001() {
       ->save(TRUE);
   }
 }
+
+/**
+ * Add file name into job entries.
+ */
+function tmgmt_smartling_update_8002() {
+  // Apply new field to a job entity.
+  Drupal::service('entity.definition_update_manager')->applyUpdates();
+
+  // Select all existing jobs.
+  $query = Drupal::database()->select('tmgmt_job', 'job');
+  $query->fields('job', [
+    'tjid',
+    'source_language',
+    'target_language',
+  ]);
+  $jobs = $query->execute()->fetchAll();
+
+  // We don't want to execute as many update queries as amount of existing
+  // jobs. So we just generate one update query with
+  // CASE .. WHEN .. THEN .. ELSE .. END syntax and execute one update query.
+  // @see https://dev.mysql.com/doc/refman/5.7/en/case.html.
+  $update_values = [];
+  $new_column_name = 'job_file_name';
+
+  foreach ($jobs as $job) {
+    $update_values[$job->tjid] = [
+      $new_column_name => "JobID{$job->tjid}_{$job->source_language}_{$job->target_language}.xlf",
+    ];
+  }
+
+  $update_query = "UPDATE `tmgmt_job` SET ";
+  $columns = [
+    $new_column_name => '`job_file_name` = CASE ',
+  ];
+
+  foreach ($update_values as $id => $values) {
+    $columns[$new_column_name] .= "WHEN `tjid`='$id' THEN '" . $values[$new_column_name] . "' ";
+  }
+
+  foreach ($columns as $column_name => $query_part) {
+    $columns[$column_name] .= " ELSE `$column_name` END ";
+  }
+
+  $where = " WHERE `tjid` IN (" . implode(", ", array_keys($update_values)) . ")";
+  $update_query .= implode(', ', $columns) . $where;
+
+  Drupal::database()->query($update_query);
+}
diff --git a/tmgmt_smartling.module b/tmgmt_smartling.module
index d18a337..3a779a1 100644
--- a/tmgmt_smartling.module
+++ b/tmgmt_smartling.module
@@ -5,9 +5,11 @@
  * Contains
  */
 
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\tmgmt\TMGMTException;
 use Drupal\views\ViewExecutable;
-use Drupal\tmgmt\JobInterface;
 
 function tmgmt_smartling_download_file_submit(array &$form, FormStateInterface $form_state) {
   /* @var \Drupal\tmgmt\Entity\Job $job */
@@ -21,9 +23,9 @@ function tmgmt_smartling_download_file(\Drupal\tmgmt\JobInterface $job) {
     $smartlingApi = $job->getTranslatorPlugin()->getSmartlingApi($job->getTranslator());
     $retrieval_type = $job->getTranslator()->getSetting('retrieval_type');
     $filename = $job->getTranslatorPlugin()->getFileName($job);
-    $export_format = $job->getSetting('export_format');
+    $extension = pathinfo($filename, PATHINFO_EXTENSION) === 'xlf' ? 'xlf' : 'html';
     $xml = $smartlingApi->downloadFile($filename, $job->getRemoteTargetLanguage(), ['retrievalType' => $retrieval_type]);
-    if ('xlf' !== $export_format) {
+    if ('xlf' !== $extension) {
       $xml = $job->getTranslatorPlugin()->convertXML2HTML($xml);
     }
   }
@@ -35,7 +37,6 @@ function tmgmt_smartling_download_file(\Drupal\tmgmt\JobInterface $job) {
   $path = $job->getSetting('scheme') . '://tmgmt_smartling_translations/' . $job->getTranslatorPlugin()->getFileName($job);
   $dirname = dirname($path);
   if (file_prepare_directory($dirname, FILE_CREATE_DIRECTORY) && ($file = file_save_data($xml, $path, FILE_EXISTS_REPLACE))) {
-    $extension = pathinfo($file->getFileUri(), PATHINFO_EXTENSION) === 'xlf' ? 'xlf' : 'html';
     $plugin = \Drupal::service('plugin.manager.tmgmt_file.format')->createInstance($extension);
     if ($plugin) {
       // Validate the file on job.
@@ -146,4 +147,43 @@ function tmgmt_smartling_views_pre_view(ViewExecutable $view, $display_id, array
 
     $view->addHandler($view->current_display, 'field', 'tmgmt_job_item', 'operations', $handlers['operations']);
   }
-}
\ No newline at end of file
+}
+
+/**
+ * Implements hook_entity_base_field_info_alter().
+ *
+ * TODO: move this hook into tmgmt_extension_suit module.
+ *
+ * @param $fields
+ * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+ */
+function tmgmt_smartling_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {
+  if ($entity_type->id() === 'tmgmt_job') {
+    $fields['job_file_name'] = BaseFieldDefinition::create('string')
+      ->setLabel(t('Generated file name'))
+      ->setSetting('max_length', 1024)
+      ->setTranslatable(FALSE)
+      ->setProvider('tmgmt_smartling')
+      ->setName('job_file_name')
+      ->setTargetEntityTypeId($entity_type->id())
+      ->setTargetBundle(NULL);
+  }
+}
+
+/**
+ * Implements hook_ENTITY_TYPE_update().
+ *
+ * TODO: move this hook into tmgmt_extension_suit module.
+ *
+ * @param \Drupal\Core\Entity\EntityInterface $entity
+ */
+function tmgmt_smartling_tmgmt_job_update(Drupal\Core\Entity\EntityInterface $entity) {
+  try {
+    if ($entity->hasTranslator()) {
+      $entity->set('job_file_name', $entity->getTranslatorPlugin()->getFileName($entity));
+    }
+  }
+  catch (TMGMTException $e) {
+    watchdog_exception('tmgmt_smartling', $e);
+  }
+}
