diff --git a/src/ContinuousTranslatorInterface.php b/src/ContinuousTranslatorInterface.php
new file mode 100644
index 0000000..16b8783
--- /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_item
+   *   The JobItem we want to translate.
+   */
+  public function requestJobItemTranslation(JobItemInterface $job_item);
+
+}
diff --git a/src/Tests/CrudTest.php b/src/Tests/CrudTest.php
index 2f910a2..6031636 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->requestJobItemTranslation($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/tmgmt.module b/tmgmt.module
index bfe83ef..1ffe24b 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 ($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..74e919b 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,32 @@ class TestTranslator extends TranslatorPluginBase implements TranslatorRejectDat
     return $form;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function requestJobItemTranslation(JobItemInterface $job_item) {
+    // Add a debug message.
+    $job_item->addMessage('Test translator called.', array(), 'debug');
+
+    // Do something different based on the action, if defined.
+    $action = $job_item->getJob()->getSetting('action') ?: '';
+    switch ($action) {
+      case 'translate':
+      default:
+        // The dummy translation prefixes strings with the target language.
+        $data = array_filter(\Drupal::service('tmgmt.data')->flatten($job_item->getData()), array(\Drupal::service('tmgmt.data'), 'filterData'));
+        $tdata = array();
+        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));
+        break;
+    }
+  }
+
 }
diff --git a/translators/tmgmt_file/src/Tests/FileTranslatorTest.php b/translators/tmgmt_file/src/Tests/FileTranslatorTest.php
index b41d107..fb2e6b7 100644
--- a/translators/tmgmt_file/src/Tests/FileTranslatorTest.php
+++ b/translators/tmgmt_file/src/Tests/FileTranslatorTest.php
@@ -452,6 +452,11 @@ class FileTranslatorTest extends TMGMTTestBase {
     $messages = $job->getMessages();
     $message = reset($messages);
 
+    // Ensure this Job is not listed as continuous jobs as FileTranslator is not
+    // a ContinuousTranslator.
+    $this->drupalGet('admin/tmgmt/continuous_jobs');
+    $this->assertText('No jobs available.');
+
     $this->drupalGet('admin/tmgmt/jobs');
     $this->clickLink(t('Manage'));
 
