diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 03572a6..566a19c 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -7,6 +7,7 @@
 use Drupal\Component\Datetime\DateTimePlus;
 use Drupal\Component\Utility\Crypt;
 use Drupal\Component\Utility\Environment;
+use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\DrupalKernel;
@@ -950,10 +951,16 @@ function drupal_static_reset($name = NULL) {
 /**
  * Formats text for emphasized display in a placeholder inside a sentence.
  *
- * @see \Drupal\Component\Utility\SafeMarkup::placeholder()
+ * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0. Use
+ *   \Drupal\Component\Utility\SafeMarkup::format() and a %variable in
+ *   associative array of replacements to make instead. Note this this method
+ *   should not be used to only emphasise a string and therefore has few valid
+ *   use-cases. Note also, that this method does not mark the string as safe.
+ *
+ * @see \Drupal\Component\Utility\SafeMarkup::format()
  */
 function drupal_placeholder($text) {
-  return SafeMarkup::placeholder($text);
+  return '<em class="placeholder">' . Html::escape($text) . '</em>';
 }
 
 /**
diff --git a/core/lib/Drupal/Component/Utility/SafeMarkup.php b/core/lib/Drupal/Component/Utility/SafeMarkup.php
index 2fb5152..c78c144 100644
--- a/core/lib/Drupal/Component/Utility/SafeMarkup.php
+++ b/core/lib/Drupal/Component/Utility/SafeMarkup.php
@@ -251,8 +251,8 @@ public static function checkPlain($text) {
    *   formatting depends on the first character of the key:
    *   - @variable: Escaped to HTML using self::escape(). Use this as the
    *     default choice for anything displayed on a page on the site.
-   *   - %variable: Escaped to HTML and formatted using self::placeholder(),
-   *     which makes the following HTML code:
+   *   - %variable: Escaped to HTML wrapped in <em> tags, which makes the
+   *     following HTML code:
    *     @code
    *       <em class="placeholder">text output here.</em>
    *     @endcode
@@ -286,7 +286,7 @@ public static function format($string, array $args = array()) {
         case '%':
         default:
           // Escaped and placeholder.
-          $args[$key] = static::placeholder($value);
+          $args[$key] = '<em class="placeholder">' . static::escape($value) . '</em>';
           break;
 
         case '!':
@@ -306,23 +306,6 @@ public static function format($string, array $args = array()) {
   }
 
   /**
-   * Formats text for emphasized display in a placeholder inside a sentence.
-   *
-   * Used automatically by self::format().
-   *
-   * @param string $text
-   *   The text to format (plain-text).
-   *
-   * @return string
-   *   The formatted text (html).
-   */
-  public static function placeholder($text) {
-    $string = '<em class="placeholder">' . static::escape($text) . '</em>';
-    static::$safeStrings[$string]['html'] = TRUE;
-    return $string;
-  }
-
-  /**
    * Replaces all occurrences of the search string with the replacement string.
    *
    * Functions identically to str_replace(), but marks the returned output as
diff --git a/core/modules/editor/editor.module b/core/modules/editor/editor.module
index 470f269..cd7d157 100644
--- a/core/modules/editor/editor.module
+++ b/core/modules/editor/editor.module
@@ -78,7 +78,7 @@ function editor_form_filter_admin_overview_alter(&$form, FormStateInterface $for
   $editors = \Drupal::service('plugin.manager.editor')->getDefinitions();
   foreach (Element::children($form['formats']) as $format_id) {
     $editor = editor_load($format_id);
-    $editor_name = ($editor && isset($editors[$editor->getEditor()])) ? $editors[$editor->getEditor()]['label'] : drupal_placeholder('—');
+    $editor_name = ($editor && isset($editors[$editor->getEditor()])) ? $editors[$editor->getEditor()]['label'] : '—';
     $editor_column['editor'] = array('#markup' => $editor_name);
     $position = array_search('name', array_keys($form['formats'][$format_id])) + 1;
     $start = array_splice($form['formats'][$format_id], 0, $position, $editor_column);
diff --git a/core/modules/filter/css/filter.admin.css b/core/modules/filter/css/filter.admin.css
index b67a86a..e6a0d96 100644
--- a/core/modules/filter/css/filter.admin.css
+++ b/core/modules/filter/css/filter.admin.css
@@ -79,3 +79,7 @@
 [dir="rtl"] .tips {
   padding-right: 0;
 }
+
+tr.fallback_format td {
+  font-style: italic;
+}
diff --git a/core/modules/filter/src/FilterFormatListBuilder.php b/core/modules/filter/src/FilterFormatListBuilder.php
index 8f46cbc..f5f925b 100644
--- a/core/modules/filter/src/FilterFormatListBuilder.php
+++ b/core/modules/filter/src/FilterFormatListBuilder.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Template\Attribute;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -94,19 +95,18 @@ public function buildHeader() {
   public function buildRow(EntityInterface $entity) {
     // Check whether this is the fallback text format. This format is available
     // to all roles and cannot be disabled via the admin interface.
+    $row['label'] = $this->getLabel($entity);
     if ($entity->isFallbackFormat()) {
-      $row['label'] = SafeMarkup::placeholder($entity->label());
-
+      $row['#attributes']['class'][] = 'fallback_format';
       $fallback_choice = $this->configFactory->get('filter.settings')->get('always_show_fallback_choice');
       if ($fallback_choice) {
-        $roles_markup = SafeMarkup::placeholder($this->t('All roles may use this format'));
+        $roles_markup = $this->t('All roles may use this format');
       }
       else {
-        $roles_markup = SafeMarkup::placeholder($this->t('This format is shown when no other formats are available'));
+        $roles_markup = $this->t('This format is shown when no other formats are available');
       }
     }
     else {
-      $row['label'] = $this->getLabel($entity);
       $roles = array_map('\Drupal\Component\Utility\SafeMarkup::checkPlain', filter_get_roles_by_format($entity));
       $roles_markup = $roles ? implode(', ', $roles) : $this->t('No roles may use this format');
     }
@@ -140,6 +140,7 @@ public function getDefaultOperations(EntityInterface $entity) {
   public function buildForm(array $form, FormStateInterface $form_state) {
     $form = parent::buildForm($form, $form_state);
     $form['actions']['submit']['#value'] = $this->t('Save changes');
+    $form['#attached']['library'][] = 'filter/drupal.filter.admin';
     return $form;
   }
 
diff --git a/core/modules/filter/src/FilterPermissions.php b/core/modules/filter/src/FilterPermissions.php
index ef4e694..9a5ad66 100644
--- a/core/modules/filter/src/FilterPermissions.php
+++ b/core/modules/filter/src/FilterPermissions.php
@@ -60,7 +60,11 @@ public function permissions() {
       if ($permission = $format->getPermissionName()) {
         $permissions[$permission] = [
           'title' => $this->t('Use the <a href="@url">@label</a> text format', ['@url' => $format->url(), '@label' => $format->label()]),
-          'description' => SafeMarkup::placeholder($this->t('Warning: This permission may have security implications depending on how the text format is configured.')),
+          'description' => [
+            '#prefix' => '<em>',
+            '#markup' => $this->t('Warning: This permission may have security implications depending on how the text format is configured.'),
+            '#suffix' => '</em>'
+          ],
         ];
       }
     }
diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php
index 3291f33..73076a3 100644
--- a/core/modules/node/src/Controller/NodeController.php
+++ b/core/modules/node/src/Controller/NodeController.php
@@ -205,7 +205,11 @@ public function revisionOverview(NodeInterface $node) {
       if ($vid == $node->getRevisionId()) {
         $row[0]['class'] = ['revision-current'];
         $row[] = [
-          'data' => SafeMarkup::placeholder($this->t('current revision')),
+          'data' => [
+            'prefix' => '<em>',
+            '#markup' => $this->t('current revision'),
+            'suffix' => '</em>',
+          ],
           'class' => ['revision-current'],
         ];
       }
diff --git a/core/modules/update/templates/update-project-status.html.twig b/core/modules/update/templates/update-project-status.html.twig
index b00e0b2..d98feee 100644
--- a/core/modules/update/templates/update-project-status.html.twig
+++ b/core/modules/update/templates/update-project-status.html.twig
@@ -109,7 +109,7 @@
   {% if base_themes %}
     {% set basethemes = base_themes|join(', ') %}
     {% trans %}
-      Depends on: {{ basethemes }}
+      Depends on: {{ basethemes|placeholder }}
     {% endtrans %}
   {% endif %}
 
diff --git a/core/modules/update/update.report.inc b/core/modules/update/update.report.inc
index dd2494f..d911fdf 100644
--- a/core/modules/update/update.report.inc
+++ b/core/modules/update/update.report.inc
@@ -5,6 +5,7 @@
  * Code required only when rendering the available updates report.
  */
 
+use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Template\Attribute;
 use Drupal\Core\Url;
@@ -242,7 +243,7 @@ function template_preprocess_update_project_status(&$variables) {
       $extra_item = array();
       $extra_item['attributes'] = new Attribute();
       $extra_item['label'] = $value['label'];
-      $extra_item['data'] = drupal_placeholder($value['data']);
+      $extra_item['data'] = ['prefix' => '<em>', '#markup' => $value['data'], '#prefix' => '</em>'];
       $variables['extras'][] = $extra_item;
     }
   }
@@ -266,13 +267,10 @@ function template_preprocess_update_project_status(&$variables) {
       }
 
       if ($base_status_label) {
-        $base_themes[] = t('%base_theme (!base_label)', array(
-          '%base_theme' => $base_theme,
-          '!base_label' => $base_status_label,
-        ));
+        $base_themes[] = $base_theme . " ($base_status_label)";
       }
       else {
-        $base_themes[] = drupal_placeholder($base_theme);
+        $base_themes[] = $base_theme;
       }
     }
     $variables['base_themes'] = $base_themes;
diff --git a/core/modules/user/src/Plugin/Validation/Constraint/UserMailRequired.php b/core/modules/user/src/Plugin/Validation/Constraint/UserMailRequired.php
index 0a6b8e9..f8ad3da 100644
--- a/core/modules/user/src/Plugin/Validation/Constraint/UserMailRequired.php
+++ b/core/modules/user/src/Plugin/Validation/Constraint/UserMailRequired.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\user\Plugin\Validation\Constraint;
 
-use Drupal\Component\Utility\SafeMarkup;
 use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\ConstraintValidatorInterface;
 use Symfony\Component\Validator\ExecutionContextInterface;
@@ -70,7 +69,7 @@ public function validate($items, Constraint $constraint) {
     $required = !(!$existing_value && \Drupal::currentUser()->hasPermission('administer users'));
 
     if ($required && (!isset($items) || $items->isEmpty())) {
-      $this->context->addViolation($this->message, array('!name' => SafeMarkup::placeholder($account->getFieldDefinition('mail')->getLabel())));
+      $this->context->addViolation($this->message, array('%name' => $account->getFieldDefinition('mail')->getLabel()));
     }
   }
 
diff --git a/core/modules/user/src/Tests/UserValidationTest.php b/core/modules/user/src/Tests/UserValidationTest.php
index c099dc3..db2bc14 100644
--- a/core/modules/user/src/Tests/UserValidationTest.php
+++ b/core/modules/user/src/Tests/UserValidationTest.php
@@ -136,7 +136,7 @@ function testValidation() {
     $violations = $user->validate();
     $this->assertEqual(count($violations), 1, 'E-mail addresses may not be removed');
     $this->assertEqual($violations[0]->getPropertyPath(), 'mail');
-    $this->assertEqual($violations[0]->getMessage(), t('!name field is required.', array('!name' => SafeMarkup::placeholder($user->getFieldDefinition('mail')->getLabel()))));
+    $this->assertEqual($violations[0]->getMessage(), t('%name field is required.', array('%name' => $user->getFieldDefinition('mail')->getLabel())));
     $user->set('mail', 'someone@example.com');
 
     $user->set('timezone', $this->randomString(33));
diff --git a/core/tests/Drupal/Tests/Component/Utility/SafeMarkupTest.php b/core/tests/Drupal/Tests/Component/Utility/SafeMarkupTest.php
index 90a475f..43f4379 100644
--- a/core/tests/Drupal/Tests/Component/Utility/SafeMarkupTest.php
+++ b/core/tests/Drupal/Tests/Component/Utility/SafeMarkupTest.php
@@ -193,15 +193,6 @@ function providerFormat() {
   }
 
   /**
-   * Tests SafeMarkup::placeholder().
-   *
-   * @covers ::placeholder
-   */
-  function testPlaceholder() {
-    $this->assertEquals('<em class="placeholder">Some text</em>', SafeMarkup::placeholder('Some text'));
-  }
-
-  /**
    * Tests SafeMarkup::replace().
    *
    * @dataProvider providerReplace
