diff --git a/src/Entity/Job.php b/src/Entity/Job.php
index 056f3cf..7202101 100644
--- a/src/Entity/Job.php
+++ b/src/Entity/Job.php
@@ -18,6 +18,7 @@ use Drupal\Core\Session\AccountInterface;
 use Drupal\tmgmt\JobInterface;
 use Drupal\tmgmt\JobItemInterface;
 use Drupal\tmgmt\TMGMTException;
+use Drupal\tmgmt\Translator\TranslatableResult;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\user\UserInterface;
 
@@ -517,11 +518,11 @@ class Job extends ContentEntityBase implements EntityOwnerInterface, JobInterfac
    */
   public function canRequestTranslation() {
     if ($translator = $this->getTranslator()) {
-      if ($translator->canTranslate($this)) {
-        return TRUE;
+      if (TranslatableResult::canTranslate($this)) {
+        return TranslatableResult::yes();
       }
     }
-    return FALSE;
+    return TranslatableResult::no(t('Translation can not be requested'));
   }
 
   /**
diff --git a/src/Entity/Translator.php b/src/Entity/Translator.php
index 676e6b2..82d8d3a 100644
--- a/src/Entity/Translator.php
+++ b/src/Entity/Translator.php
@@ -306,26 +306,6 @@ class Translator extends ConfigEntityBase implements TranslatorInterface {
   /**
    * {@inheritdoc}
    */
-  public function canTranslate(JobInterface $job) {
-    if ($controller = $this->getPlugin()) {
-      return $controller->canTranslate($this, $job);
-    }
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isAvailable() {
-    if ($controller = $this->getPlugin()) {
-      return $controller->isAvailable($this);
-    }
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function hasCheckoutSettings(JobInterface $job) {
     if ($controller = $this->getPlugin()) {
       return $controller->hasCheckoutSettings($job);
@@ -336,26 +316,6 @@ class Translator extends ConfigEntityBase implements TranslatorInterface {
   /**
    * {@inheritdoc}
    */
-  public function getNotAvailableReason() {
-    if ($controller = $this->getPlugin()) {
-      return $controller->getNotAvailableReason($this);
-    }
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getNotCanTranslateReason(JobInterface $job) {
-    if ($controller = $this->getPlugin()) {
-      return $controller->getNotCanTranslateReason($job);
-    }
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getRemoteLanguagesMappings() {
     if (!empty($this->remoteLanguagesMappings)) {
       return $this->remoteLanguagesMappings;
diff --git a/src/Form/JobForm.php b/src/Form/JobForm.php
index 6d1d532..bd9b8dd 100644
--- a/src/Form/JobForm.php
+++ b/src/Form/JobForm.php
@@ -17,6 +17,8 @@ use Drupal\Core\Url;
 use Drupal\tmgmt\Entity\Job;
 use Drupal\tmgmt\Entity\JobItem;
 use Drupal\tmgmt\JobInterface;
+use Drupal\tmgmt\Translator\AvailableResult;
+use Drupal\tmgmt\Translator\TranslatableResult;
 use Drupal\views\Views;
 
 /**
@@ -421,11 +423,13 @@ class JobForm extends TmgmtFormBase {
     $translator = $job->getTranslator();
     // Check translator availability.
     if (!empty($translator)) {
-      if (!$translator->isAvailable()) {
-        $form_state->setErrorByName('translator', $translator->getNotAvailableReason());
+      $available_result = AvailableResult::isAvailable();
+      $translatable_result = TranslatableResult::canTranslate($job, $translator);
+      if (!($available_result)) {
+        $form_state->setErrorByName('translator', AvailableResult::getMessage());
       }
-      elseif (!$translator->canTranslate($job)) {
-        $form_state->setErrorByName('translator', $translator->getNotCanTranslateReason($job));
+      elseif (!($translatable_result)) {
+        $form_state->setErrorByName('translator', TranslatableResult::getMessage());
       }
     }
   }
@@ -497,12 +501,13 @@ class JobForm extends TmgmtFormBase {
     if (!$translator) {
       return $form;
     }
-    if (!$translator->isAvailable()) {
-      $form['#description'] = Xss::filter($job->getTranslator()->getNotAvailableReason());
+    if (!AvailableResult::isAvailable()) {
+      AvailableResult::no(t('@translator is not available. Make sure it is properly !configured.'), array('@translator' => $translator->label(), '!configured' => $translator->link(t('configured'))));
+      $form['#description'] = Xss::filter(AvailableResult::getMessage());
     }
     // @todo: if the target language is not defined, the check will not work if the first language in the list is not available.
-    elseif ($job->getTargetLangcode() && !$translator->canTranslate($job)) {
-      $form['#description'] = Xss::filter($job->getTranslator()->getNotCanTranslateReason($job));
+    elseif ($job->getTargetLangcode() && !TranslatableResult::canTranslate($job, $translator)) {
+      $form['#description'] = Xss::filter(TranslatableResult::getMessage());
     }
     else {
       $plugin_ui = $this->translatorManager->createUIInstance($translator->getPluginId());
diff --git a/src/Tests/TMGMTUiTest.php b/src/Tests/TMGMTUiTest.php
index b42e8bf..e878d8c 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -289,6 +289,13 @@ class TMGMTUiTest extends TMGMTTestBase {
     // Verify that we are on the submit job page.
     $this->drupalPostForm(NULL, array(), t('Submit to translator'));
 
+    // Test for Unavailable/Unconfigured Translators.
+    $this->default_translator->setSetting('action', 'not_translatable');
+    $this->default_translator->save();
+    $this->drupalGet('admin/tmgmt/jobs/' . $job->id());
+    $this->drupalPostForm(NULL, array(), t('Submit to translator'));
+    $this->assertText(t('Test translator (auto created) can not translate from English to German.'));
+
     // Login as administrator to delete a job.
     $this->loginAsAdmin();
     $this->drupalGet('admin/tmgmt/jobs');
diff --git a/src/Translator/AvailableResult.php b/src/Translator/AvailableResult.php
new file mode 100644
index 0000000..aa268d3
--- /dev/null
+++ b/src/Translator/AvailableResult.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\tmgmt\Translator\AvailableResult
+ */
+
+namespace Drupal\tmgmt\Translator;
+
+use Drupal\tmgmt\TranslatorInterface;
+
+/**
+ * Class AvailableResult
+ *
+ * @package Drupal\tmgmt\Translator
+ *  @param TranslatorInterface $translator
+ *   The Translator entity that should handle the translation.
+ * @param \Drupal\tmgmt\JobInterface $job
+ *   The Job entity that should be translated.
+ */
+
+class AvailableResult extends TranslatorResult {
+
+  public static function isAvailable(TranslatorInterface $translator = NULL) {
+
+    if (!is_null($translator)) {
+      if ($translator->hasPlugin()) {
+        return parent::yes();
+      }
+      return parent::no(t('@translator is not available. Make sure it is properly !configured.'), [
+        '@translator' => $translator->label(),
+        '!configured' => $translator->link(t('configured'))
+      ]);
+    }
+    else {
+      return parent::yes();
+    }
+  }
+
+}
diff --git a/src/Translator/TranslatableResult.php b/src/Translator/TranslatableResult.php
new file mode 100644
index 0000000..08534ad
--- /dev/null
+++ b/src/Translator/TranslatableResult.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\tmgmt\TranslatableResult.
+ */
+
+namespace Drupal\tmgmt\Translator;
+
+use Drupal\tmgmt\TranslatorInterface;
+use Drupal\tmgmt\JobInterface;
+
+/**
+ * Class AvailableResult
+ *
+ * @package Drupal\tmgmt\Translator
+ *
+ *
+ * @param TranslatorInterface $translator
+ *   The Translator entity that should handle the translation.
+ * @param \Drupal\tmgmt\JobInterface $job
+ *   The Job entity that should be translated.
+ */
+
+class TranslatableResult extends TranslatorResult {
+
+  public static function canTranslate(JobInterface $job = NULL, TranslatorInterface $translator = NULL) {
+    // The job is only translatable if the translator is available too.
+    if ($job->getSetting('action') == 'not_translatable') {
+      return parent::no(t('@translator can not translate from @source to @target.', array(
+        '@translator' => $job->getTranslator()->label(),
+        '@source' => $job->getSourceLanguage()->getName(),
+        '@target' => $job->getTargetLanguage()->getName(),
+      )));
+    }
+    if (!is_null($translator)  && !is_null($job)) {
+      if (AvailableResult::isAvailable($translator) && array_key_exists($job->getTargetLangcode(), $translator->getSupportedTargetLanguages($job->getSourceLangcode()))) {
+        // We can only translate this job if the target language of the job is in
+        // one of the supported languages.
+        return parent::yes();
+      }
+      return parent::no(t('@translator can not translate from @source to @target.', array(
+        '@translator' => $translator->label(),
+        '@source' => $job->getSourceLanguage()->getName(),
+        '@target' => $job->getTargetLanguage()->getName(),
+      )));
+    }
+    else {
+      if ($job->getTranslatorPlugin()) {
+        return TranslatableResult::canTranslate($job, $job->getTranslator());
+      }
+      return parent::no(t('Job can not be translated.'));
+    }
+  }
+
+}
diff --git a/src/Translator/TranslatorResult.php b/src/Translator/TranslatorResult.php
new file mode 100644
index 0000000..bc42c75
--- /dev/null
+++ b/src/Translator/TranslatorResult.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\tmgmt\TranslatorResult.
+ */
+
+namespace Drupal\tmgmt\Translator;
+
+/**
+ * TMGMT Translator Result abstract class.
+ */
+abstract class TranslatorResult {
+
+  /**
+   * TRUE or FALSE for response.
+   *
+   * @var boolean
+   */
+  protected static $success;
+
+  /**
+   * Message in case success is FALSE.
+   *
+   * @var string
+   */
+  protected static $message;
+
+  /**
+   * Returns the object message.
+   */
+  public static function getMessage() {
+    $argumented_message = t(self::$message);
+    return $argumented_message;
+  }
+
+  /**
+   * Returns the object state on success.
+   */
+  public static function getSuccess() {
+    return self::$success;
+  }
+
+  /**
+   * Returns the object with TRUE.
+   */
+  public static function yes() {
+    self::$success = TRUE;
+    return TRUE;
+  }
+
+  /**
+   * Returns the object with FALSE and a Message.
+   */
+  public static function no($message) {
+    self::$success = FALSE;
+    self::$message = $message;
+    return FALSE;
+  }
+}
diff --git a/src/TranslatorInterface.php b/src/TranslatorInterface.php
index 6379292..604c095 100644
--- a/src/TranslatorInterface.php
+++ b/src/TranslatorInterface.php
@@ -135,25 +135,6 @@ interface TranslatorInterface extends ConfigEntityInterface {
   public function clearLanguageCache();
 
   /**
-   * Check whether this translator can handle a particular translation job.
-   *
-   * @param \Drupal\tmgmt\JobInterface Job
-   *   The Job entity that should be translated.
-   *
-   * @return bool
-   *   TRUE if the job can be processed and translated, FALSE otherwise.
-   */
-  public function canTranslate(JobInterface $job);
-
-  /**
-   * Checks whether a translator is available.
-   *
-   * @return bool
-   *   TRUE if the translator plugin is available, FALSE otherwise.
-   */
-  public function isAvailable();
-
-  /**
    * Returns if the plugin has any settings for this job.
    *
    * @param \Drupal\tmgmt\JobInterface $job
@@ -162,19 +143,6 @@ interface TranslatorInterface extends ConfigEntityInterface {
   public function hasCheckoutSettings(JobInterface $job);
 
   /**
-   * @todo Remove this once http://drupal.org/node/1420364 is done.
-   */
-  public function getNotAvailableReason();
-
-  /**
-   * @todo Remove this once http://drupal.org/node/1420364 is done.
-   *
-   * * @param \Drupal\tmgmt\JobInterface $job
-   *   The Job entity that should be translated.
-   */
-  public function getNotCanTranslateReason(JobInterface $job);
-
-  /**
    * Gets existing remote languages mappings.
    *
    * This method is responsible to provide all local to remote language pairs.
diff --git a/src/TranslatorPluginBase.php b/src/TranslatorPluginBase.php
index f3b8813..854350c 100644
--- a/src/TranslatorPluginBase.php
+++ b/src/TranslatorPluginBase.php
@@ -35,26 +35,6 @@ abstract class TranslatorPluginBase extends PluginBase implements TranslatorPlug
    */
   protected $escapeEnd = '';
 
-  /**
-   * {@inheritdoc}
-   */
-  public function isAvailable(TranslatorInterface $translator) {
-    // Assume that the translation service is always available.
-    return TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function canTranslate(TranslatorInterface $translator, JobInterface $job) {
-    // The job is only translatable if the translator is available too.
-    if ($this->isAvailable($translator) && array_key_exists($job->getTargetLangcode(), $translator->getSupportedTargetLanguages($job->getSourceLangcode()))) {
-      // We can only translate this job if the target language of the job is in
-      // one of the supported languages.
-      return TRUE;
-    }
-    return FALSE;
-  }
 
   /**
    * {@inheritdoc}
@@ -83,11 +63,15 @@ abstract class TranslatorPluginBase extends PluginBase implements TranslatorPlug
    * {@inheritdoc}
    */
   public function getSupportedTargetLanguages(TranslatorInterface $translator, $source_language) {
-    $languages = entity_metadata_language_list();
-    unset($languages[LANGUAGE_NONE], $languages[$source_language]);
-    return drupal_map_assoc(array_keys($languages));
+    $list = array();
+    $list['und'] = t('Language neutral');
+    $var = \Drupal::languageManager()->getLanguages();
+    foreach ($var as $language) {
+      $list[$language->getId()] = $language->getName();
+    }
+    unset($list['und'], $list[$source_language]);
+    return array_combine(array_keys($list), array_keys($list));
   }
-
   /**
    * {@inheritdoc}
    *
@@ -111,20 +95,6 @@ abstract class TranslatorPluginBase extends PluginBase implements TranslatorPlug
   /**
    * {@inheritdoc}
    */
-  public function getNotCanTranslateReason(JobInterface $job) {
-    return t('@translator can not translate from @source to @target.', array('@translator' => $job->getTranslator()->label(), '@source' => $job->getSourceLanguage()->getName(), '@target' => $job->getTargetLanguage()->getName()));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getNotAvailableReason(TranslatorInterface $translator) {
-    return t('@translator is not available. Make sure it is properly !configured.', array('@translator' => $this->pluginDefinition['label'], '!configured' => $translator->link(t('configured'))));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function defaultSettings() {
     $defaults = array('auto_accept' => FALSE);
     // Check if any default settings are defined in the plugin info.
diff --git a/src/TranslatorPluginInterface.php b/src/TranslatorPluginInterface.php
index 21373d4..7c8d088 100644
--- a/src/TranslatorPluginInterface.php
+++ b/src/TranslatorPluginInterface.php
@@ -17,56 +17,6 @@ use Drupal\Component\Plugin\PluginInspectionInterface;
 interface TranslatorPluginInterface extends PluginInspectionInterface {
 
   /**
-   * Checks whether a translator is available.
-   *
-   * @param TranslatorInterface $translator
-   *   The translator entity.
-   *
-   * @return boolean
-   *   TRUE if the translator plugin is available, FALSE otherwise.
-   */
-  public function isAvailable(TranslatorInterface $translator);
-
-  /**
-   * Return a reason why the translator is not available.
-   *
-   * @param TranslatorInterface $translator
-   *   The translator entity.
-   *
-   * Might be called when isAvailable() returns FALSE to get a reason that
-   * can be displayed to the user.
-   *
-   * @todo Remove this once http://drupal.org/node/1420364 is done.
-   */
-  public function getNotAvailableReason(TranslatorInterface $translator);
-
-  /**
-   * Check whether this service can handle a particular translation job.
-   *
-   * @param TranslatorInterface $translator
-   *   The Translator entity that should handle the translation.
-   * @param \Drupal\tmgmt\JobInterface $job
-   *   The Job entity that should be translated.
-   *
-   * @return boolean
-   *   TRUE if the job can be processed and translated, FALSE otherwise.
-   */
-  public function canTranslate(TranslatorInterface $translator, JobInterface $job);
-
-  /**
-   * Return a reason why the translator is not able to translate this job.
-   *
-   * @param \Drupal\tmgmt\JobInterface $job
-   *   The job entity.
-   *
-   * Might be called when canTranslate() returns FALSE to get a reason that
-   * can be displayed to the user.
-   *
-   * @todo Remove this once http://drupal.org/node/1420364 is done.
-   */
-  public function getNotCanTranslateReason(JobInterface $job);
-
-  /**
    * Specifies default mappings for local to remote language codes.
    *
    * This method can be used in case we know in advance what language codes are
diff --git a/tmgmt.module b/tmgmt.module
index 20046b1..8dfb91d 100644
--- a/tmgmt.module
+++ b/tmgmt.module
@@ -11,7 +11,8 @@ use Drupal\Component\Utility\Unicode;
 use Drupal\tmgmt\Entity\Job;
 use Drupal\tmgmt\Entity\Translator;
 use Drupal\Component\Utility\Html;
-use Drupal\Component\Utility\Xss;
+use Drupal\tmgmt\Translator\TranslatableResult;
+use Drupal\tmgmt\Translator\AvailableResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\tmgmt\Entity\JobItem;
@@ -391,7 +392,7 @@ function tmgmt_message_create($message = '', $variables = array(), $values = arr
 function tmgmt_translator_load_available($job) {
   $translators = Translator::loadMultiple();
   foreach ($translators as $name => $translator) {
-    if (!$translator->isAvailable() || (isset($job) && !$translator->canTranslate($job))) {
+    if (!AvailableResult::isAvailable() || (isset($job) && !TranslatableResult::canTranslate($job, $translator))) {
       unset($translators[$name]);
     }
   }
@@ -468,10 +469,10 @@ function tmgmt_translator_labels() {
 function tmgmt_translator_labels_flagged($job = NULL) {
   $labels = array();
   foreach (Translator::loadMultiple() as $translator) {
-    if (!$translator->isAvailable()) {
+    if (!AvailableResult::isAvailable()) {
       $labels[$translator->id()] = t('@label (not available)', array('@label' => $translator->label()));
     }
-    elseif (isset($job) && !$translator->canTranslate($job)) {
+    elseif (isset($job) && !TranslatableResult::canTranslate($job, $translator)) {
       $labels[$translator->id()] = t('@label (unsupported)', array('@label' => $translator->label()));
     }
     else {
diff --git a/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php b/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php
index 9d6f6be..cd04837 100644
--- a/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php
+++ b/tmgmt_test/src/Plugin/tmgmt/Translator/TestTranslator.php
@@ -97,16 +97,6 @@ class TestTranslator extends TranslatorPluginBase implements TranslatorRejectDat
   /**
    * {@inheritdoc}
    */
-  function canTranslate(TranslatorInterface $translator, JobInterface $job) {
-    if ($job->getSetting('action') == 'not_translatable') {
-      return FALSE;
-    }
-    return parent::canTranslate($translator, $job);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getSupportedTargetLanguages(TranslatorInterface $translator, $source_language) {
     $languages = array('en', 'de', 'es', 'it', 'zh-hans', 'gsw-berne');
     $languages = array_combine($languages, $languages);
diff --git a/translators/tmgmt_file/src/Plugin/tmgmt/Translator/FileTranslator.php b/translators/tmgmt_file/src/Plugin/tmgmt/Translator/FileTranslator.php
index e8e8213..ca9c3d7 100644
--- a/translators/tmgmt_file/src/Plugin/tmgmt/Translator/FileTranslator.php
+++ b/translators/tmgmt_file/src/Plugin/tmgmt/Translator/FileTranslator.php
@@ -26,14 +26,6 @@ class FileTranslator extends TranslatorPluginBase {
   /**
    * {@inheritdoc}
    */
-  public function canTranslate(TranslatorInterface $translator, JobInterface $job) {
-    // Anything can be exported.
-    return TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function requestTranslation(JobInterface $job) {
     $name = "JobID" . $job->id() . '_' . $job->getSourceLangcode() . '_' . $job->getTargetLangcode();
 
