diff --git a/core/lib/Drupal/Component/Utility/Html.php b/core/lib/Drupal/Component/Utility/Html.php
index a775cdb..7bd98d9 100644
--- a/core/lib/Drupal/Component/Utility/Html.php
+++ b/core/lib/Drupal/Component/Utility/Html.php
@@ -393,4 +393,19 @@ public static function escape($text) {
     return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
   }
 
+  /**
+   * Decodes HTML entities back to characters.
+   *
+   * This method is the opposite of Html::escape().
+   *
+   * @param $text
+   *   The input text
+   *
+   * @return string
+   *   The text with all HTML entities decoded back to characters.
+   */
+  public static function descape($text) {
+    return htmlspecialchars_decode($text, ENT_QUOTES | ENT_SUBSTITUTE);
+  }
+
 }
diff --git a/core/modules/views/src/Plugin/views/HandlerBase.php b/core/modules/views/src/Plugin/views/HandlerBase.php
index 7b5fe3a..c6ae4b7 100644
--- a/core/modules/views/src/Plugin/views/HandlerBase.php
+++ b/core/modules/views/src/Plugin/views/HandlerBase.php
@@ -185,7 +185,7 @@ public function adminLabel($short = FALSE) {
       return $this->options['admin_label'];
     }
     $title = ($short && isset($this->definition['title short'])) ? $this->definition['title short'] : $this->definition['title'];
-    return $this->t('!group: !title', array('!group' => $this->definition['group'], '!title' => $title));
+    return $this->t('@group: @title', array('@group' => $this->definition['group'], '@title' => $title));
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/PluginBase.php b/core/modules/views/src/Plugin/views/PluginBase.php
index cbe7526..cf2bcf4 100644
--- a/core/modules/views/src/Plugin/views/PluginBase.php
+++ b/core/modules/views/src/Plugin/views/PluginBase.php
@@ -585,7 +585,7 @@ protected function listLanguages($flags = LanguageInterface::STATE_ALL, array $c
           $name = $types_info[$id]['name'];
           // Surround IDs by '***LANGUAGE_...***', to avoid query collisions.
           $id = '***LANGUAGE_' . $id . '***';
-          $list[$id] = $this->t('!type language selected for page', array('!type' => $name));
+          $list[$id] = $this->t('@type language selected for page', array('@type' => $name));
         }
       }
       if (!empty($current_values)) {
@@ -595,7 +595,7 @@ protected function listLanguages($flags = LanguageInterface::STATE_ALL, array $c
           // add that option too, so it is not lost. If not among the current
           // values, skip displaying it to avoid user confusion.
           if (isset($type['name']) && !isset($list[$id]) && in_array($id, $current_values)) {
-            $list[$id] = $this->t('!type language selected for page', array('!type' => $type['name']));
+            $list[$id] = $this->t('@type language selected for page', array('@type' => $type['name']));
           }
         }
       }
diff --git a/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php b/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php
index 036e369..cadb796 100644
--- a/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php
+++ b/core/modules/views/src/Plugin/views/area/HTTPStatusCode.php
@@ -48,7 +48,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
 
     // Add the HTTP status code, so it's easier for people to find it.
     array_walk($options, function($title, $code) use(&$options) {
-      $options[$code] = $this->t('@code (!title)', array('@code' => $code, '!title' => $title));
+      $options[$code] = $this->t('@code (@title)', array('@code' => $code, '@title' => $title));
     });
 
     $form['status_code'] = array(
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index 76ae608..980da73 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -1544,7 +1544,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
         if ($access_plugin->usesOptions()) {
           $form['markup'] = array(
             '#prefix' => '<div class="js-form-item form-item description">',
-            '#markup' => $this->t('You may also adjust the !settings for the currently selected access restriction.', array('!settings' => $this->optionLink(t('settings'), 'access_options'))),
+            '#markup' => $this->t('You may also adjust the @settings for the currently selected access restriction.', array('@settings' => $this->optionLink($this->t('settings'), 'access_options'))),
             '#suffix' => '</div>',
           );
         }
@@ -1582,7 +1582,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           $form['markup'] = array(
             '#prefix' => '<div class="js-form-item form-item description">',
             '#suffix' => '</div>',
-            '#markup' => $this->t('You may also adjust the !settings for the currently selected cache mechanism.', array('!settings' => $this->optionLink(t('settings'), 'cache_options'))),
+            '#markup' => $this->t('You may also adjust the @settings for the currently selected cache mechanism.', array('@settings' => $this->optionLink($this->t('settings'), 'cache_options'))),
           );
         }
         break;
@@ -1654,7 +1654,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           $form['markup'] = array(
             '#prefix' => '<div class="js-form-item form-item description">',
             '#suffix' => '</div>',
-            '#markup' => $this->t('You may also adjust the !settings for the currently selected style.', array('!settings' => $this->optionLink(t('settings'), 'style_options'))),
+            '#markup' => $this->t('You may also adjust the @settings for the currently selected style.', array('@settings' => $this->optionLink($this->t('settings'), 'style_options'))),
           );
         }
 
@@ -1702,7 +1702,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           $form['markup'] = array(
             '#prefix' => '<div class="js-form-item form-item description">',
             '#suffix' => '</div>',
-            '#markup' => $this->t('You may also adjust the !settings for the currently selected row style.', array('!settings' => $this->optionLink(t('settings'), 'row_options'))),
+            '#markup' => $this->t('You may also adjust the @settings for the currently selected row style.', array('@settings' => $this->optionLink($this->t('settings'), 'row_options'))),
           );
         }
 
@@ -1803,7 +1803,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           $form['markup'] = array(
             '#prefix' => '<div class="js-form-item form-item description">',
             '#suffix' => '</div>',
-            '#markup' => $this->t('You may also adjust the !settings for the currently selected style.', array('!settings' => $this->optionLink(t('settings'), 'exposed_form_options'))),
+            '#markup' => $this->t('You may also adjust the @settings for the currently selected style.', array('@settings' => $this->optionLink($this->t('settings'), 'exposed_form_options'))),
           );
         }
         break;
@@ -1839,7 +1839,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           $form['markup'] = array(
             '#prefix' => '<div class="js-form-item form-item description">',
             '#suffix' => '</div>',
-            '#markup' => $this->t('You may also adjust the !settings for the currently selected pager.', array('!settings' => $this->optionLink(t('settings'), 'pager_options'))),
+            '#markup' => $this->t('You may also adjust the @settings for the currently selected pager.', array('@settings' => $this->optionLink($this->t('settings'), 'pager_options'))),
           );
         }
 
diff --git a/core/modules/views/src/Plugin/views/filter/Date.php b/core/modules/views/src/Plugin/views/filter/Date.php
index 60dd605..52dabbe 100644
--- a/core/modules/views/src/Plugin/views/filter/Date.php
+++ b/core/modules/views/src/Plugin/views/filter/Date.php
@@ -37,7 +37,7 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
         '#title' => $this->t('Value type'),
         '#options' => array(
           'date' => $this->t('A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred.'),
-          'offset' => $this->t('An offset from the current time such as "!example1" or "!example2"', array('!example1' => '+1 day', '!example2' => '-2 hours -30 minutes')),
+          'offset' => $this->t('An offset from the current time such as "@example1" or "@example2"', array('@example1' => '+1 day', '@example2' => '-2 hours -30 minutes')),
         ),
         '#default_value' => !empty($this->value['type']) ? $this->value['type'] : 'date',
       );
diff --git a/core/modules/views/src/Tests/FieldApiDataTest.php b/core/modules/views/src/Tests/FieldApiDataTest.php
index 96ff642..cbfa389 100644
--- a/core/modules/views/src/Tests/FieldApiDataTest.php
+++ b/core/modules/views/src/Tests/FieldApiDataTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Tests;
 
+use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Tests\Views\FieldTestBase;
 
 /**
@@ -26,9 +27,20 @@ protected function setUp() {
       'field_name' => $field_names[0],
       'entity_type' => 'node',
       'bundle' => 'page',
+      'label' => 'The giraffe" label'
     );
     entity_create('field_config', $field)->save();
 
+    // Attach the same to a different bundle with a different label.
+    $this->drupalCreateContentType(['type' => 'article']);
+    $field = FieldConfig::create([
+      'field_name' => $field_names[0],
+      'entity_type' => 'node',
+      'bundle' => 'article',
+      'label' => 'The giraffe2" label'
+    ]);
+    $field->save();
+
     // Now create some example nodes/users for the view result.
     for ($i = 0; $i < 5; $i++) {
       $edit = array(
@@ -86,6 +98,8 @@ function testViewsData() {
     $this->assertTrue($data[$current_table][$field_storage->getName()]['field']['click sortable'], 'String field is click sortable.');
     // Click sort should only be on the primary field.
     $this->assertTrue(empty($data[$revision_table][$field_storage->getName()]['field']['click sortable']), 'Non-primary fields are not click sortable');
+
+    $this->assertEqual($data[$current_table][$field_storage->getName()]['help'], 'Appears in: page, article. Also known as: Content: The giraffe2" label');
   }
 
 }
diff --git a/core/modules/views/views.api.php b/core/modules/views/views.api.php
index e88fbc7..ffa39e0 100644
--- a/core/modules/views/views.api.php
+++ b/core/modules/views/views.api.php
@@ -487,7 +487,7 @@ function hook_field_views_data(\Drupal\field\FieldStorageConfigInterface $field_
       'id' => 'standard',
       'base' => 'file_managed',
       'base field' => 'target_id',
-      'label' => t('image from !field_name', array('!field_name' => $field_storage->getName())),
+      'label' => t('image from @field_name', array('@field_name' => $field_storage->getName())),
     );
   }
 
@@ -531,7 +531,7 @@ function hook_field_views_data_alter(array &$data, \Drupal\field\FieldStorageCon
     'field field' => $field_name . '_target_id',
     'base' => $entity_type->getBaseTable(),
     'base field' => $entity_type->getKey('id'),
-    'label' => t('!field_name', array('!field_name' => $field_name)),
+    'label' => $field_name,
     'join_extra' => array(
       0 => array(
         'field' => 'deleted',
@@ -588,7 +588,7 @@ function hook_field_views_data_views_data_alter(array &$data, \Drupal\field\Fiel
     'field field' => $field_name . '_target_id',
     'base' => $entity_type->getBaseTable(),
     'base field' => $entity_type->getKey('id'),
-    'label' => t('!field_name', array('!field_name' => $field_name)),
+    'label' => t('@field_name', array('@field_name' => $field_name)),
     'join_extra' => array(
       0 => array(
         'field' => 'deleted',
diff --git a/core/modules/views/views.views.inc b/core/modules/views/views.views.inc
index 4f28122..3c89023 100644
--- a/core/modules/views/views.views.inc
+++ b/core/modules/views/views.views.inc
@@ -5,6 +5,7 @@
  * Provide views data that isn't tied to any other module.
  */
 
+use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
@@ -321,6 +322,9 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
     }
   }
 
+  /** @var \Drupal\Core\Render\RendererInterface $renderer */
+  $renderer = \Drupal::service('renderer');
+
   // Description of the field tables.
   // @todo Generalize this code to make it work with any table layout. See
   //   https://www.drupal.org/node/2079019.
@@ -449,7 +453,8 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
     }
     if ($aliases) {
       $data[$table_alias][$field_alias]['aliases'] = $aliases;
-      $data[$table_alias][$field_alias]['help'] .= ' ' . t('Also known as: !also.', array('!also' => implode(', ', $also_known)));
+      // Decode the entities, as they might have been escaped before.
+      $data[$table_alias][$field_alias]['help'] .= ' ' . t('Also known as: ') . Html::descape(implode(', ', $also_known));
     }
 
     $keys = array_keys($field_columns);
@@ -497,12 +502,12 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
     }
 
     if (count($field_columns) == 1 || $column == 'value') {
-      $title = t('@label (!name)', array('@label' => $label, '!name' => $field_name));
+      $title = t('@label (@name)', array('@label' => $label, '@name' => $field_name));
       $title_short = $label;
     }
     else {
-      $title = t('@label (!name:!column)', array('@label' => $label, '!name' => $field_name, '!column' => $column));
-      $title_short = t('@label:!column', array('@label' => $label, '!column' => $column));
+      $title = t('@label (@name:@column)', array('@label' => $label, '@name' => $field_name, '@column' => $column));
+      $title_short = t('@label:@column', array('@label' => $label, '@column' => $column));
     }
 
     // Expose data for the property.
@@ -535,10 +540,10 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
       foreach ($all_labels as $label_name => $true) {
         if ($label != $label_name) {
           if (count($field_columns) == 1 || $column == 'value') {
-            $alias_title = t('@label (!name)', array('@label' => $label_name, '!name' => $field_name));
+            $alias_title = t('@label (@name)', array('@label' => $label_name, '@name' => $field_name));
           }
           else {
-            $alias_title = t('@label (!name:!column)', array('@label' => $label_name, '!name' => $field_name, '!column' => $column));
+            $alias_title = t('@label (@name:@column)', array('@label' => $label_name, '@name' => $field_name, '@column' => $column));
           }
           $aliases[] = array(
             'group' => $group_name,
@@ -550,7 +555,8 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
       }
       if ($aliases) {
         $data[$table_alias][$column_real_name]['aliases'] = $aliases;
-        $data[$table_alias][$column_real_name]['help'] .= ' ' . t('Also known as: !also.', array('!also' => implode(', ', $also_known)));
+        // Decode the entities, as they might have been escaped before.
+        $data[$table_alias][$column_real_name]['help'] .= ' ' . t('Also known as: ') . Html::descape(implode(', ', $also_known));
       }
 
       $data[$table_alias][$column_real_name]['argument'] = array(
@@ -589,7 +595,7 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
 
       // Expose additional delta column for multiple value fields.
       if ($field_storage->isMultiple()) {
-        $title_delta = t('@label (!name:delta)', array('@label' => $label, '!name' => $field_name));
+        $title_delta = t('@label (@name:delta)', array('@label' => $label, '@name' => $field_name));
         $title_short_delta = t('@label:delta', array('@label' => $label));
 
         $data[$table_alias]['delta'] = array(
diff --git a/core/modules/views_ui/css/views_ui.admin.theme.css b/core/modules/views_ui/css/views_ui.admin.theme.css
index 6e7f1e0..5dc2e4d 100644
--- a/core/modules/views_ui/css/views_ui.admin.theme.css
+++ b/core/modules/views_ui/css/views_ui.admin.theme.css
@@ -512,6 +512,14 @@ td.group-title {
   margin-right: 0.2083em;
 }
 
+.views-ui-display-tab-setting > span {
+  margin-left: 0.5em; /* LTR */
+}
+[dir="rtl"] .views-ui-display-tab-setting > span {
+  margin-left: 0;
+  margin-right: 0.5em;
+}
+
 /** Applies an overridden(italics) font style to overridden buckets.
  * The better way to implement this would be to add the overridden class
  * to the bucket header when the bucket is overridden and style it as a
diff --git a/core/modules/views_ui/src/Form/Ajax/AddHandler.php b/core/modules/views_ui/src/Form/Ajax/AddHandler.php
index eef8f7d..56cb435 100644
--- a/core/modules/views_ui/src/Form/Ajax/AddHandler.php
+++ b/core/modules/views_ui/src/Form/Ajax/AddHandler.php
@@ -139,7 +139,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
         foreach ($group_options as $key => $option) {
           $form['options']['name'][$key] = array(
             '#type' => 'checkbox',
-            '#title' => $this->t('!group: !field', array('!group' => $option['group'], '!field' => $option['title'])),
+            '#title' => $this->t('@group: @field', array('@group' => $option['group'], '@field' => $option['title'])),
             '#description' => $option['help'],
             '#return_value' => $key,
             '#prefix' => "<div class='filterable-option'>",
diff --git a/core/modules/views_ui/src/Form/BreakLockForm.php b/core/modules/views_ui/src/Form/BreakLockForm.php
index 82f1f6f..89f0ce0 100644
--- a/core/modules/views_ui/src/Form/BreakLockForm.php
+++ b/core/modules/views_ui/src/Form/BreakLockForm.php
@@ -79,7 +79,7 @@ public function getDescription() {
       '#theme' => 'username',
       '#account' => $account,
     );
-    return $this->t('By breaking this lock, any unsaved changes made by !user will be lost.', array('!user' => drupal_render($username)));
+    return $this->t('By breaking this lock, any unsaved changes made by @user will be lost.', array('@user' => drupal_render($username)));
   }
 
   /**
diff --git a/core/modules/views_ui/src/ViewEditForm.php b/core/modules/views_ui/src/ViewEditForm.php
index 1b335de..fec9708 100644
--- a/core/modules/views_ui/src/ViewEditForm.php
+++ b/core/modules/views_ui/src/ViewEditForm.php
@@ -139,14 +139,14 @@ public function form(array $form, FormStateInterface $form_state) {
         '#account' => $this->entityManager->getStorage('user')->load($view->lock->owner),
       );
       $lock_message_substitutions = array(
-        '!user' => drupal_render($username),
-        '!age' => $this->dateFormatter->formatTimeDiffSince($view->lock->updated),
+        '@user' => drupal_render($username),
+        '@age' => $this->dateFormatter->formatTimeDiffSince($view->lock->updated),
         '@url' => $view->url('break-lock-form'),
       );
       $form['locked'] = array(
         '#type' => 'container',
         '#attributes' => array('class' => array('view-locked', 'messages', 'messages--warning')),
-        '#children' => $this->t('This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to <a href="@url">break this lock</a>.', $lock_message_substitutions),
+        '#children' => $this->t('This view is being edited by user @user, and is therefore locked from editing by others. This lock is @age old. Click here to <a href="@url">break this lock</a>.', $lock_message_substitutions),
         '#weight' => -10,
       );
     }
@@ -752,14 +752,14 @@ public function renderDisplayTop(ViewUI $view) {
     foreach (Views::fetchPluginNames('display', NULL, array($view->get('base_table'))) as $type => $label) {
       $element['add_display'][$type] = array(
         '#type' => 'submit',
-        '#value' => $this->t('Add !display', array('!display' => $label)),
+        '#value' => $this->t('Add @display', array('@display' => $label)),
         '#limit_validation_errors' => array(),
         '#submit' => array('::submitDisplayAdd', '::submitDelayDestination'),
         '#attributes' => array('class' => array('add-display')),
         // Allow JavaScript to remove the 'Add ' prefix from the button label when
         // placing the button in a "Add" dropdown menu.
         '#process' => array_merge(array('views_ui_form_button_was_clicked'), $this->elementInfo->getInfoProperty('submit', '#process', array())),
-        '#values' => array($this->t('Add !display', array('!display' => $label)), $label),
+        '#values' => array($this->t('Add @display', array('@display' => $label)), $label),
       );
     }
 
@@ -1130,12 +1130,8 @@ public function getFormBucket(ViewUI $view, $type, $display) {
         $last = end($keys);
         foreach ($contents as $key => $pid) {
           if ($key != $last) {
-            if ($group_info['groups'][$gid] == 'OR') {
-              $store[$pid]['#link'] = $this->t('!link &nbsp;&nbsp; OR', ['!link' => $store[$pid]['#link']]);
-            }
-            else {
-              $store[$pid]['#link'] = $this->t('!link &nbsp;&nbsp; AND', ['!link' => $store[$pid]['#link']]);
-            }
+            $operator = $group_info['groups'][$gid] == 'OR' ? $this->t('OR') : $this->t('AND');
+            $store[$pid]['#link'] = SafeMarkup::format('@link <span>@operator</span>', ['@link' => $store[$pid]['#link'], '@operator' => $operator]);
           }
           $build['fields'][$pid] = $store[$pid];
         }
diff --git a/core/tests/Drupal/Tests/Component/Utility/HtmlTest.php b/core/tests/Drupal/Tests/Component/Utility/HtmlTest.php
index 28a2846..32b9fc7 100644
--- a/core/tests/Drupal/Tests/Component/Utility/HtmlTest.php
+++ b/core/tests/Drupal/Tests/Component/Utility/HtmlTest.php
@@ -310,4 +310,47 @@ public function testDecodeEntitiesAndEscape() {
     $this->assertSame('&lt;em&gt;répété&lt;/em&gt;', $escaped);
   }
 
+  /**
+   * Tests Html::descape().
+   *
+   * @dataProvider providerDescape
+   * @covers ::descape
+   */
+  public function testDescape($expected, $text) {
+    $this->assertEquals($expected, Html::descape($text));
+  }
+
+  /**
+   * Data provider for testDescape().
+   *
+   * @see testDescape()
+   */
+  public function providerDescape() {
+    return [
+      ['Drupal', 'Drupal'],
+      ['<script>', '&lt;script&gt;'],
+      ['&lt;script&gt;', '&amp;lt;script&amp;gt;'],
+      ['&#34;', '&amp;#34;'],
+      ['"', '&quot;'],
+      ['&quot;', '&amp;quot;'],
+      ["'", '&#039;'],
+      ['&#039;', '&amp;#039;'],
+      ['©', '©'],
+      ['→', '→'],
+      ['➼', '➼'],
+      ['€', '€'],
+    ];
+  }
+
+  /**
+   * Ensure Html::descape() is the opposite of Html::escape().
+   *
+   * @covers ::descape
+   * @covers ::escape
+   */
+  public function testEscapeAndDescape() {
+    $string = "<em>kittén&eacute;</em>";
+    $this->assertEquals($string, Html::descape(Html::escape($string)));
+  }
+
 }
