diff --git a/interdiff-2560951-29-30.txt b/interdiff-2560951-29-30.txt
new file mode 100644
index 0000000..babc09a
--- /dev/null
+++ b/interdiff-2560951-29-30.txt
@@ -0,0 +1,67 @@
+diff -u b/src/Entity/JobItem.php b/src/Entity/JobItem.php
+--- b/src/Entity/JobItem.php
++++ b/src/Entity/JobItem.php
+@@ -19,6 +19,7 @@
+ use Drupal\tmgmt\JobItemInterface;
+ use Drupal\tmgmt\TMGMTException;
+ use Drupal\Core\Render\Element;
++use Drupal\Component\Utility\SafeMarkup;
+ 
+ /**
+  * Entity class for the tmgmt_job_item entity.
+@@ -272,6 +273,7 @@
+    */
+   public function addMessage($message, $variables = array(), $type = 'status') {
+     // Save the job item if it hasn't yet been saved.
++    $message = SafeMarkup::format($message, $variables);
+     if (!$this->isNew() || $this->save()) {
+       $message = tmgmt_message_create($message, $variables, array('tjid' => $this->getJobId(), 'tjiid' => $this->id(), 'type' => $type));
+       if ($message->save()) {
+@@ -434,11 +436,11 @@
+   public function needsReview($message = NULL, $variables = array(), $type = 'status') {
+     if (!isset($message)) {
+       $source_url = $this->getSourceUrl();
+-      $message = $source_url ? 'The translation for <a href="@source_url">@source</a> needs to be reviewed.' : 'The translation for @source needs to be reviewed.';
++      $message = $source_url ? 'The translation for <a href=":source_url">:source</a> needs to be reviewed.' : 'The translation for :source needs to be reviewed.';
+       $variables = $source_url ? array(
+-        '@source_url' => $source_url->toString(),
+-        '@source' => ($this->getSourceLabel()),
+-      ) : array('@source' => ($this->getSourceLabel()));
++        ':source_url' => $source_url->toString(),
++        ':source' => ($this->getSourceLabel()),
++      ) : array(':source' => ($this->getSourceLabel()));
+     }
+     $return = $this->setState(static::STATE_REVIEW, $message, $variables, $type);
+     // Auto accept the trganslation if the translator is configured for it.
+@@ -454,11 +456,11 @@
+   public function accepted($message = NULL, $variables = array(), $type = 'status') {
+     if (!isset($message)) {
+       $source_url = $this->getSourceUrl();
+-      $message = $source_url ? 'The translation for <a href="@source_url">@source</a> has been accepted.' : 'The translation for @source has been accepted.';
++      $message = $source_url ? 'The translation for <a href=":source_url">:source</a> has been accepted.' : 'The translation for :source has been accepted.';
+       $variables = $source_url ? array(
+-        '@source_url' => $source_url->toString(),
+-        '@source' => ($this->getSourceLabel()),
+-      ) : array('@source' => ($this->getSourceLabel()));
++        ':source_url' => $source_url->toString(),
++        ':source' => ($this->getSourceLabel()),
++      ) : array(':source' => ($this->getSourceLabel()));
+     }
+     $return = $this->setState(static::STATE_ACCEPTED, $message, $variables, $type);
+     // Check if this was the last unfinished job item in this job.
+@@ -475,11 +477,11 @@
+   public function active($message = NULL, $variables = array(), $type = 'status') {
+     if (!isset($message)) {
+       $source_url = $this->getSourceUrl();
+-      $message = $source_url ? 'The translation for <a href="@source_url">@source</a> is now being processed.' : 'The translation for @source is now being processed.';
++      $message = $source_url ? 'The translation for <a href=":source_url">:source</a> is now being processed.' : 'The translation for :source is now being processed.';
+       $variables = $source_url ? array(
+-        '@source_url' => $source_url->toString(),
+-        '@source' => ($this->getSourceLabel()),
+-      ) : array('@source' => ($this->getSourceLabel()));
++        ':source_url' => $source_url->toString(),
++        ':source' => ($this->getSourceLabel()),
++      ) : array(':source' => ($this->getSourceLabel()));
+     }
+     return $this->setState(static::STATE_ACTIVE, $message, $variables, $type);
+   }
diff --git a/sources/content/src/Tests/ContentEntitySourceUiTest.php b/sources/content/src/Tests/ContentEntitySourceUiTest.php
index b457e4c..7875484 100644
--- a/sources/content/src/Tests/ContentEntitySourceUiTest.php
+++ b/sources/content/src/Tests/ContentEntitySourceUiTest.php
@@ -240,6 +240,9 @@ class ContentEntitySourceUiTest extends EntityTestBase {
     )));
     $this->assertText(t('The translation for @title has been accepted.', array('@title' => $node->getTitle())));
 
+    //Assert link is clickable.
+    $this->clickLink($node->getTitle());
+
     // Translated nodes should now be listed and be clickable.
     // @todo Use links on translate tab.
     $this->drupalGet('de/node/' . $node->id());
diff --git a/src/Entity/JobItem.php b/src/Entity/JobItem.php
index c862ef4..ff9555d 100644
--- a/src/Entity/JobItem.php
+++ b/src/Entity/JobItem.php
@@ -15,9 +15,11 @@ use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Language\Language;
+use Drupal\Core\Url;
 use Drupal\tmgmt\JobItemInterface;
 use Drupal\tmgmt\TMGMTException;
 use Drupal\Core\Render\Element;
+use Drupal\Component\Utility\SafeMarkup;
 
 /**
  * Entity class for the tmgmt_job_item entity.
@@ -272,7 +274,14 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
   public function addMessage($message, $variables = array(), $type = 'status') {
     // Save the job item if it hasn't yet been saved.
     if (!$this->isNew() || $this->save()) {
-      $message = tmgmt_message_create($message, $variables, array('tjid' => $this->getJobId(), 'tjiid' => $this->id(), 'type' => $type));
+      $message = tmgmt_message_create($message,
+        $variables,
+        array(
+          'tjid' => $this->getJobId(),
+          'tjiid' => $this->id(),
+          'type' => $type,
+        )
+      );
       if ($message->save()) {
         return $message;
       }
@@ -432,9 +441,12 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
    */
   public function needsReview($message = NULL, $variables = array(), $type = 'status') {
     if (!isset($message)) {
-      $url = $this->getSourceUrl();
-      $message = 'The translation for @source needs to be reviewed.';
-      $variables = array('@source' => \Drupal::l($this->getSourceLabel(), $url));
+      $source_url = $this->getSourceUrl();
+      $message = $source_url ? 'The translation for <a href=":source_url">@source</a> needs to be reviewed.' : 'The translation for @source needs to be reviewed.';
+      $variables = $source_url ? array(
+        ':source_url' => $source_url,
+        '@source' => ($this->getSourceLabel()),
+      ) : array('@source' => ($this->getSourceLabel()));
     }
     $return = $this->setState(static::STATE_REVIEW, $message, $variables, $type);
     // Auto accept the trganslation if the translator is configured for it.
@@ -449,9 +461,12 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
    */
   public function accepted($message = NULL, $variables = array(), $type = 'status') {
     if (!isset($message)) {
-      $url = $this->getSourceUrl();
-      $message = 'The translation for @source has been accepted.';
-      $variables = array('@source' => $url ? \Drupal::l($this->getSourceLabel(), $url) : $this->getSourceLabel());
+      $source_url = $this->getSourceUrl();
+      $message = $source_url ? 'The translation for <a href=":source_url">@source</a> has been accepted.' : 'The translation for @source has been accepted.';
+      $variables = $source_url ? array(
+        ':source_url' => $source_url->toString(),
+        '@source' => ($this->getSourceLabel()),
+      ) : array('@source' => ($this->getSourceLabel()));
     }
     $return = $this->setState(static::STATE_ACCEPTED, $message, $variables, $type);
     // Check if this was the last unfinished job item in this job.
@@ -467,9 +482,12 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
    */
   public function active($message = NULL, $variables = array(), $type = 'status') {
     if (!isset($message)) {
-      $url = $this->getSourceUrl();
-      $message = 'The translation for @source is now being processed.';
-      $variables = array('@source' => $url ? \Drupal::l($this->getSourceLabel(), $url) : $this->getSourceLabel());
+      $source_url = $this->getSourceUrl();
+      $message = $source_url ? 'The translation for <a href=":source_url">@source</a> is now being processed.' : 'The translation for @source is now being processed.';
+      $variables = $source_url ? array(
+        ':source_url' => $source_url->toString(),
+        '@source' => ($this->getSourceLabel()),
+      ) : array('@source' => ($this->getSourceLabel()));
     }
     return $this->setState(static::STATE_ACTIVE, $message, $variables, $type);
   }
@@ -716,11 +734,12 @@ class JobItem extends ContentEntityBase implements JobItemInterface {
           // language and links to the review form.
           $job_url = $this->getJob()->url();
           $variables = array(
-            '@source' => $this->link($this->getSourceLabel()),
+            '@source' => $this->getSourceLabel(),
             '@language' => $this->getJob()->getTargetLanguage()->getName(),
-            '@review_url' => $this->url('canonical', array('query' => array('destination' => $job_url))),
+            ':review_url' => Url::fromUserInput($job_url)->toString(),
           );
-          $this->needsReview('The translation of @source to @language is finished and can now be <a href="@review_url">reviewed</a>.', $variables);
+          (!$this->getSourceUrl()) ? $variables[':source_url'] = (string) $job_url : $variables[':source_url'] = $this->getSourceUrl()->toString();
+          $this->needsReview('The translation of <a href=":source_url">@source</a> to @language is finished and can now be <a href=":review_url">reviewed</a>.', $variables);
         }
       }
     }
diff --git a/src/Form/JobItemForm.php b/src/Form/JobItemForm.php
index 6b52acd..493e8bf 100644
--- a/src/Form/JobItemForm.php
+++ b/src/Form/JobItemForm.php
@@ -9,6 +9,7 @@ namespace Drupal\tmgmt\Form;
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Utility\Html;
+use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Url;
 use Drupal\tmgmt\Entity\JobItem;
@@ -238,7 +239,7 @@ class JobItemForm extends TmgmtFormBase {
           continue;
         }
         if ($text = $message->getMessage()) {
-          drupal_set_message(Xss::filter($text), $message->getType());
+          drupal_set_message(SafeMarkup::format($text, []), $message->getType());
         }
       }
     }
diff --git a/src/Tests/CrudTest.php b/src/Tests/CrudTest.php
index c4474b8..213cde5 100644
--- a/src/Tests/CrudTest.php
+++ b/src/Tests/CrudTest.php
@@ -230,7 +230,7 @@ class CrudTest extends TMGMTKernelTestBase {
     $messages = $job->getMessages();
     $this->assertEqual(count($messages), 1);
     $last_message = end($messages);
-    $this->assertEqual($last_message->message->value, 'The translation of @source to @language is finished and can now be <a href="@review_url">reviewed</a>.');
+    $this->assertEqual($last_message->message->value, 'The translation of <a href=":source_url">@source</a> to @language is finished and can now be <a href=":review_url">reviewed</a>.');
 
     // Initial state - translation has been received for the first time.
     $this->assertEqual($data['#translation']['#text'], 'translated 1');
diff --git a/src/Tests/PluginsTest.php b/src/Tests/PluginsTest.php
index be321e5..0e7b6b3 100644
--- a/src/Tests/PluginsTest.php
+++ b/src/Tests/PluginsTest.php
@@ -78,7 +78,7 @@ class PluginsTest extends TMGMTKernelTestBase {
 
     // The third message is specific to a job item and has different state
     // constants.
-    $this->assertEqual('The translation of @source to @language is finished and can now be <a href="@review_url">reviewed</a>.', $needs_review->message->value);
+    $this->assertEqual('The translation of <a href=":source_url">@source</a> to @language is finished and can now be <a href=":review_url">reviewed</a>.', $needs_review->message->value);
     $this->assertEqual('status', $needs_review->type->value);
 
     $i = 1;
diff --git a/src/Tests/TMGMTUiTest.php b/src/Tests/TMGMTUiTest.php
index 1f189de..4c1e60a 100644
--- a/src/Tests/TMGMTUiTest.php
+++ b/src/Tests/TMGMTUiTest.php
@@ -485,11 +485,13 @@ class TMGMTUiTest extends TMGMTTestBase {
     ));
     $item5 = $job->addItem('test_source', 'test', 5);
 
+    $this->drupalGet('admin/tmgmt/jobs/' . $job->id());
+    $this->assertText('The translation of test_source:test:1 to German is finished and can now be reviewed.');
     $edit = array(
       'target_language' => 'de',
       'settings[action]' => 'translate',
     );
-    $this->drupalPostForm('admin/tmgmt/jobs/' . $job->id(), $edit, t('Submit to translator'));
+    $this->drupalPostForm(NULL, $edit, t('Submit to translator'));
 
     $this->drupalGet('admin/tmgmt/items/' . $item5->id());
     $rows5 = $this->xpath('//textarea[@name="dummy|deep_nesting[source][value]"]');
