diff --git a/src/ContinuousTranslatorInterface.php b/src/ContinuousTranslatorInterface.php
new file mode 100644
index 0000000..7133764
--- /dev/null
+++ b/src/ContinuousTranslatorInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\tmgmt\ContinuousTranslatorInterface.
+ */
+
+namespace Drupal\tmgmt;
+
+/**
+ * Interface for continuous translators.
+ *
+ * @ingroup tmgmt_translator
+ */
+interface ContinuousTranslatorInterface {
+
+  /**
+   * Requests the translation of a JobItem.
+   *
+   * @param JobItemInterface[] $job_items
+   *   The JobItem we want to translate.
+   */
+  public function requestJobItemsTranslation(array $job_items);
+
+}
diff --git a/src/Tests/CrudTest.php b/src/Tests/CrudTest.php
index 2f910a2..87f40d7 100644
--- a/src/Tests/CrudTest.php
+++ b/src/Tests/CrudTest.php
@@ -1,12 +1,13 @@
 <?php
 
-/*
+/**
  * @file
  * Contains Drupal\tmgmt\Tests\CrudTest.
  */
 
 namespace Drupal\tmgmt\Tests;
 
+use Drupal\tmgmt\ContinuousTranslatorInterface;
 use Drupal\tmgmt\Entity\Job;
 use Drupal\tmgmt\Entity\JobItem;
 use Drupal\tmgmt\Entity\RemoteMapping;
@@ -59,10 +60,7 @@ class CrudTest extends TMGMTKernelTestBase {
   function testJobs() {
     $job = $this->createJob();
 
-    $continuous_job = $this->createJob('en', 'de', 0, ['job_type' => Job::TYPE_CONTINUOUS]);
-
     $this->assertEqual(Job::TYPE_NORMAL, $job->getJobType());
-    $this->assertEqual(Job::TYPE_CONTINUOUS, $continuous_job->getJobType());
 
     $loaded_job = Job::load($job->id());
 
@@ -550,4 +548,27 @@ class CrudTest extends TMGMTKernelTestBase {
     $this->assertEqual(31, $job->getCountAccepted());
   }
 
+  /**
+   * Test crud operations of jobs.
+   */
+  protected function testContinuousTranslators() {
+    $translator = $this->createTranslator();
+    $this->assertTrue($translator->getPlugin() instanceof ContinuousTranslatorInterface);
+
+    $job = $this->createJob('en', 'de', 0, ['job_type' => Job::TYPE_CONTINUOUS]);
+
+    $this->assertEqual(Job::TYPE_CONTINUOUS, $job->getJobType());
+    $job->translator = $translator->id();
+    $job->save();
+
+    // Add a test item.
+    $item = $job->addItem('test_source', 'test', 1);
+
+    /** @var ContinuousTranslatorInterface $plugin */
+    $plugin = $job->getTranslatorPlugin();
+    $plugin->requestJobItemsTranslation([$item]);
+
+    $this->assertEqual($item->getData()['dummy']['deep_nesting']['#translation']['#text'], 'de(de-ch): Text for job item with type test and id 1.');
+  }
+
 }
diff --git a/src/Tests/TMGMTKernelTestBase.php b/src/Tests/TMGMTKernelTestBase.php
index c74cb9d..0b7863e 100644
--- a/src/Tests/TMGMTKernelTestBase.php
+++ b/src/Tests/TMGMTKernelTestBase.php
@@ -72,10 +72,19 @@ abstract class TMGMTKernelTestBase extends KernelTestBase {
   /**
    * Creates, saves and returns a translation job.
    *
-   * @return \Drupal\tmgmt\JobInterface
+   * @param string $source
+   *   The source langcode.
+   * @param string $target
+   *   The target langcode.
+   * @param int $uid
+   *   The user ID.
+   * @param array $values
+   *   (Optional) An array of additional entity values.
+   *
+   * @return \Drupal\tmgmt\JobInterface A new job.
    *   A new job.
    */
-  function createJob($source = 'en', $target = 'de', $uid = 0, $values = array())  {
+  protected function createJob($source = 'en', $target = 'de', $uid = 0, array $values = array()) {
     $job = tmgmt_job_create($source, $target, $uid, $values);
     $this->assertEqual(SAVED_NEW, $job->save());
 
diff --git a/src/Tests/TMGMTUiTest.php b/src/Tests/TMGMTUiTest.php
index 7d1e0a4..2829b25 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -18,7 +18,7 @@ use Drupal\filter\Entity\FilterFormat;
  */
 class TMGMTUiTest extends TMGMTTestBase {
 
-  public static $modules = array('ckeditor');
+  public static $modules = ['ckeditor'];
 
   /**
    * {@inheritdoc}
@@ -727,6 +727,15 @@ class TMGMTUiTest extends TMGMTTestBase {
     $this->assertText(t('The field is empty.'));
 
     // Test that continuous jobs are not shown in the job overview.
+    $this->container->get('module_installer')->install(['tmgmt_file'], TRUE);
+    $non_continuous_translator = Translator::create([
+      'name' => strtolower($this->randomMachineName()),
+      'label' => $this->randomMachineName(),
+      'plugin' => 'file',
+      'remote_languages_mappings' => [],
+      'settings' => [],
+    ]);
+    $non_continuous_translator->save();
     $continuous_job = $this->createJob('en', 'de', 0, ['label' => 'Continuous job', 'job_type' => 'continuous']);
     $this->drupalGet('admin/tmgmt/jobs');
     $this->assertNoText($continuous_job->label(), 'Continuous job is not displayed on job overview page.');
@@ -740,11 +749,12 @@ class TMGMTUiTest extends TMGMTTestBase {
 
     // Create continuous job through the form.
     $this->drupalGet('admin/tmgmt/continuous_jobs/continuous_add');
+    $this->assertNoText($non_continuous_translator->label());
     $continuous_job_label = strtolower($this->randomMachineName());
     $edit_job = [
       'label[0][value]' => $continuous_job_label,
       'target_language' => 'de',
-      'translator' => $this->default_translator->id()
+      'translator' => $this->default_translator->id(),
     ];
     $this->drupalPostForm(NULL, $edit_job, t('Save job'));
     $this->assertText($continuous_job_label, 'Continuous job was created.');
diff --git a/tmgmt.module b/tmgmt.module
index bfe83ef..0a57b78 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -5,6 +5,7 @@
  * Main module file for the Translation Management module.
  */
 
+use Drupal\tmgmt\ContinuousTranslatorInterface;
 use Drupal\tmgmt\Entity\Job;
 use Drupal\tmgmt\Entity\Translator;
 use Drupal\Component\Utility\Html;
@@ -14,7 +15,6 @@ use Drupal\tmgmt\Entity\JobItem;
 use Drupal\tmgmt\JobInterface;
 use Drupal\tmgmt\JobItemInterface;
 use Drupal\tmgmt\TranslatorRejectDataInterface;
-use Drupal\Core\Render\Element;
 
 /**
  * @addtogroup tmgmt_job
@@ -235,14 +235,16 @@ function tmgmt_job_check_finished($tjid) {
 /**
  * Creates a translation job.
  *
- * @param $source_language
+ * @param string $source_language
  *   The source language from which should be translated.
- * @param $target_language
+ * @param string $target_language
  *   The target language into which should be translated.
- * @param $values
+ * @param int $uid
+ *   The user ID.
+ * @param array $values
  *   (Optional) An array of additional entity values.
  *
- * @return \Drupal\tmgmt\JobInterface
+ * @return \Drupal\tmgmt\JobInterface The job entity.
  *   The job entity.
  */
 function tmgmt_job_create($source_language, $target_language, $uid = 0, array $values = array()) {
@@ -471,6 +473,9 @@ function tmgmt_translator_labels_flagged(JobInterface $job = NULL) {
   uasort($translators, array('Drupal\Core\Config\Entity\ConfigEntityBase', 'sort'));
   /** @var \Drupal\tmgmt\Entity\Translator $translator */
   foreach ($translators as $translator) {
+    if (isset($job) && $job->isContinuous() && !($translator->getPlugin() instanceof ContinuousTranslatorInterface)) {
+      continue;
+    }
     if (!$translator->checkAvailable()->getSuccess()) {
       $labels[$translator->id()] = t('@label (not available)', array('@label' => $translator->label()));
     }
diff --git a/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php b/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php
index e85feea..08a1b09 100644
--- a/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php
+++ b/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php
@@ -8,6 +8,7 @@
 namespace Drupal\tmgmt_test\Plugin\tmgmt\Translator;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\tmgmt\ContinuousTranslatorInterface;
 use Drupal\tmgmt\Translator\AvailableResult;
 use Drupal\tmgmt\Translator\TranslatableResult;
 use Drupal\tmgmt\JobInterface;
@@ -29,9 +30,9 @@ use Drupal\tmgmt\TranslatorRejectDataInterface;
  *   ui = "Drupal\tmgmt_test\TestTranslatorUi"
  * )
  */
-class TestTranslator extends TranslatorPluginBase implements TranslatorRejectDataInterface {
+class TestTranslator extends TranslatorPluginBase implements TranslatorRejectDataInterface, ContinuousTranslatorInterface {
 
- /**
+  /**
    * {@inheritdoc}
    */
   protected $escapeStart = '[[[';
@@ -152,4 +153,38 @@ class TestTranslator extends TranslatorPluginBase implements TranslatorRejectDat
     return $form;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function requestJobItemsTranslation(array $job_items) {
+    /** @var JobItemInterface $job_item */
+    foreach ($job_items as $job_item) {
+      // Add a debug message.
+      $job_item->addMessage('Requested translation to the continuous translator.', [], 'debug');
+
+      // The dummy translation prefixes strings with the target language.
+      $data = array_filter(\Drupal::service('tmgmt.data')
+        ->flatten($job_item->getData()), [
+          \Drupal::service('tmgmt.data'),
+          'filterData',
+        ]);
+      $tdata = [];
+      foreach ($data as $key => $value) {
+        if ($job_item->getJob()->getTargetLangcode() != $job_item->getJob()
+            ->getRemoteTargetLanguage()
+        ) {
+          $tdata[$key]['#text'] = $job_item->getJob()
+              ->getTargetLangcode() . '(' . $job_item->getJob()
+              ->getRemoteTargetLanguage() . '): ' . $value['#text'];
+        }
+        else {
+          $tdata[$key]['#text'] = $job_item->getJob()
+              ->getTargetLangcode() . ': ' . $value['#text'];
+        }
+      }
+      $job_item->addTranslatedData(\Drupal::service('tmgmt.data')
+        ->unflatten($tdata));
+    }
+  }
+
 }
