diff --git a/core/lib/Drupal/Component/Utility/SafeStringInterface.php b/core/lib/Drupal/Component/Utility/SafeStringInterface.php
index 3729027..500728c 100644
--- a/core/lib/Drupal/Component/Utility/SafeStringInterface.php
+++ b/core/lib/Drupal/Component/Utility/SafeStringInterface.php
@@ -16,8 +16,11 @@
  *
  * @internal
  *   This interface is marked as internal because it should only be used by
- *   objects used during rendering. Currently, there is no use case for this
- *   interface in contrib or custom code.
+ *   objects used during rendering. This interface should be used by modules
+ *   that implement or interrupt the render pipeline and explicitly deal with
+ *   SafeString objects created by the render system, for example, Views
+ *   implements a custom render pipeline for fast rendering of fields. All
+ *   objects that implement this interface should be marked @internal as well.
  *
  * @see \Drupal\Component\Utility\SafeMarkup::set()
  * @see \Drupal\Component\Utility\SafeMarkup::isSafe()
diff --git a/core/lib/Drupal/Core/Render/SafeString.php b/core/lib/Drupal/Core/Render/SafeString.php
index 170331e..e3937df 100644
--- a/core/lib/Drupal/Core/Render/SafeString.php
+++ b/core/lib/Drupal/Core/Render/SafeString.php
@@ -19,8 +19,11 @@
  *
  * @internal
  *   This object is marked as internal because it should only be used during
- *   rendering. Currently, there is no use case for this object by contrib or
- *   custom code.
+ *   rendering. This object can be extended by modules if they implement or
+ *   interrupt the render pipeline and explicitly deal with SafeString objects
+ *   created by the render system, for example, Views implements a custom render
+ *   pipeline for fast rendering of fields. All objects that extend this object
+ *   should be marked @internal as well.
  *
  * @see \Drupal\Core\Template\TwigExtension::escapeFilter
  * @see \Twig_Markup
diff --git a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
index ee16994..80ceb75 100644
--- a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
+++ b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
@@ -16,10 +16,10 @@
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Renderer;
-use Drupal\Core\Render\SafeString;
 use Drupal\Core\Url as CoreUrl;
 use Drupal\views\Plugin\views\HandlerBase;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
+use Drupal\views\Render\ViewsRenderPipelineSafeString;
 use Drupal\views\ResultRow;
 use Drupal\views\ViewExecutable;
 
@@ -1291,7 +1291,7 @@ public function renderText($alter) {
    * Render this field as user-defined altered text.
    */
   protected function renderAltered($alter, $tokens) {
-    return SafeString::create($this->viewsTokenReplace($alter['text'], $tokens));
+    return ViewsRenderPipelineSafeString::create($this->viewsTokenReplace($alter['text'], $tokens));
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/style/StylePluginBase.php b/core/modules/views/src/Plugin/views/style/StylePluginBase.php
index 3bb472f..ccfd1ba 100644
--- a/core/modules/views/src/Plugin/views/style/StylePluginBase.php
+++ b/core/modules/views/src/Plugin/views/style/StylePluginBase.php
@@ -11,10 +11,10 @@
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\Element;
-use Drupal\Core\Render\SafeString;
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\Plugin\views\PluginBase;
 use Drupal\views\Plugin\views\wizard\WizardInterface;
+use Drupal\views\Render\ViewsRenderPipelineSafeString;
 use Drupal\views\ViewExecutable;
 
 /**
@@ -708,7 +708,7 @@ protected function renderFields(array $result) {
             foreach ($this->rendered_fields[$index] as &$rendered_field) {
               // Placeholders and rendered fields have been processed by the
               // render system and are therefore safe.
-              $rendered_field = SafeString::create(str_replace($placeholders, $values, $rendered_field));
+              $rendered_field = ViewsRenderPipelineSafeString::create(str_replace($placeholders, $values, $rendered_field));
             }
           }
         }
@@ -745,7 +745,7 @@ public function elementPreRenderRow(array $data) {
    * @param string $field
    *   The ID of the field.
    *
-   * @return \Drupal\Core\Render\SafeString|null
+   * @return \Drupal\Component\Utility\SafeStringInterface|null
    *   The output of the field, or NULL if it was empty.
    */
   public function getField($index, $field) {
diff --git a/core/modules/views/src/Render/ViewsRenderPipelineSafeString.php b/core/modules/views/src/Render/ViewsRenderPipelineSafeString.php
new file mode 100644
index 0000000..7dcfb5c
--- /dev/null
+++ b/core/modules/views/src/Render/ViewsRenderPipelineSafeString.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Render\ViewsRenderPipelineSafeString.
+ */
+
+namespace Drupal\views\Render;
+
+use Drupal\Core\Render\SafeString;
+
+/**
+ * Defines an object that passes safe strings through the Views render system.
+ *
+ * This object should only be constructed with a known safe string. If there is
+ * any risk that the string contains user-entered data that has not been
+ * filtered first, it must not be used.
+ *
+ * @internal
+ *   This object is marked as internal because it should only be used during
+ *   the Views render pipeline.
+ *
+ * @see \Drupal\Core\Render\SafeString
+ */
+class ViewsRenderPipelineSafeString extends SafeString {
+}
