diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index c51867e..c4537dc 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -358,10 +358,10 @@ function list_themes($refresh = FALSE) {
  *   The name of the theme hook to call. If the name contains a
  *   double-underscore ('__') and there isn't an implementation for the full
  *   name, the part before the '__' is checked. This allows a fallback to a
- *   more generic implementation. For example, if _theme('links__node', ...) is
+ *   more generic implementation. For example, if _theme('links__node', …) is
  *   called, but there is no implementation of that theme hook, then the
  *   'links' implementation is used. This process is iterative, so if
- *   _theme('links__contextual__node', ...) is called, _theme() checks for the
+ *   _theme('links__contextual__node', …) is called, _theme() checks for the
  *   following implementations, and uses the first one that exists:
  *   - links__contextual__node
  *   - links__contextual
@@ -509,7 +509,7 @@ function _theme($hook, $variables = array()) {
 
   // Check if each suggestion exists in the theme registry, and if so,
   // use it instead of the hook that _theme() was called with. For example, a
-  // function may call _theme('node', ...), but a module can add
+  // function may call _theme('node', …), but a module can add
   // 'node__article' as a suggestion via hook_theme_suggestions_HOOK_alter(),
   // enabling a theme to have an alternate template file for article nodes.
   foreach (array_reverse($suggestions) as $suggestion) {
diff --git a/core/includes/unicode.inc b/core/includes/unicode.inc
index 9540d42..1961a4b 100644
--- a/core/includes/unicode.inc
+++ b/core/includes/unicode.inc
@@ -167,7 +167,7 @@ function drupal_truncate_bytes($string, $len) {
  *   of the returned string fall within length guidelines (see parameters
  *   $max_length and $min_wordsafe_length), word boundaries are ignored.
  * @param $add_ellipsis
- *   If TRUE, add t('...') to the end of the truncated string (defaults to
+ *   If TRUE, add t('…') to the end of the truncated string (defaults to
  *   FALSE). The string length will still fall within $max_length.
  * @param $min_wordsafe_length
  *   If $wordsafe is TRUE, the minimum acceptable length for truncation (before
@@ -179,7 +179,7 @@ function drupal_truncate_bytes($string, $len) {
  *   is after the word "See", which wouldn't leave a very informative string. If
  *   you had set $min_wordsafe_length to 10, though, the function would realise
  *   that "See" alone is too short, and would then just truncate ignoring word
- *   boundaries, giving you "See myverylongurl..." (assuming you had set
+ *   boundaries, giving you "See myverylongurl…" (assuming you had set
  *   $add_ellipses to TRUE).
  *
  * @return string
diff --git a/core/misc/ajax.js b/core/misc/ajax.js
index 09621b2..6bec7a3 100644
--- a/core/misc/ajax.js
+++ b/core/misc/ajax.js
@@ -155,7 +155,7 @@
       method: 'replaceWith',
       progress: {
         type: 'throbber',
-        message: Drupal.t('Please wait...')
+        message: Drupal.t('Please wait…')
       },
       submit: {
         'js': true
diff --git a/core/misc/drupal.js b/core/misc/drupal.js
index afac700..9cfb283 100644
--- a/core/misc/drupal.js
+++ b/core/misc/drupal.js
@@ -48,10 +48,10 @@ if (window.jQuery) {
    * @code
    *    Drupal.behaviors.behaviorName = {
    *      attach: function (context, settings) {
-   *        ...
+   *        …
    *      },
    *      detach: function (context, settings, trigger) {
-   *        ...
+   *        …
    *      }
    *    };
    * @endcode
@@ -398,7 +398,7 @@ if (window.jQuery) {
    *
    * @param func
    *   The name of the theme function to call.
-   * @param ...
+   * @param …
    *   Additional arguments to pass along to the theme function.
    * @return
    *   Any data the theme function returns. This could be a plain HTML string,
diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 73aec62..c11d79f 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -964,7 +964,7 @@ function _filter_url_escape_comments($match, $escape = NULL) {
 }
 
 /**
- * Shortens long URLs to http://www.example.com/long/url...
+ * Shortens long URLs to http://www.example.com/long/url…
  */
 function _filter_url_trim($text, $length = NULL) {
   static $_length;
@@ -972,9 +972,9 @@ function _filter_url_trim($text, $length = NULL) {
     $_length = $length;
   }
 
-  // Use +3 for '...' string length.
+  // Use +3 for '…' string length.
   if ($_length && strlen($text) > $_length + 3) {
-    $text = substr($text, 0, $_length) . '...';
+    $text = substr($text, 0, $_length) . '…';
   }
 
   return $text;
diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchSimplifyTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchSimplifyTest.php
index 5b1e5d4..f866810 100644
--- a/core/modules/search/lib/Drupal/search/Tests/SearchSimplifyTest.php
+++ b/core/modules/search/lib/Drupal/search/Tests/SearchSimplifyTest.php
@@ -77,7 +77,7 @@ function testSearchSimplifyUnicode() {
   function testSearchSimplifyPunctuation() {
     $cases = array(
       array('20.03/94-28,876', '20039428876', 'Punctuation removed from numbers'),
-      array('great...drupal--module', 'great drupal module', 'Multiple dot and dashes are word boundaries'),
+      array('great…drupal--module', 'great drupal module', 'Multiple dot and dashes are word boundaries'),
       array('very_great-drupal.module', 'verygreatdrupalmodule', 'Single dot, dash, underscore are removed'),
       array('regular,punctuation;word', 'regular punctuation word', 'Punctuation is a word boundary'),
     );
diff --git a/core/modules/search/search.module b/core/modules/search/search.module
index e6ea9f0..111a2c0 100644
--- a/core/modules/search/search.module
+++ b/core/modules/search/search.module
@@ -712,9 +712,9 @@ function search_excerpt($keys, $text, $langcode = NULL) {
     $out[] = substr($text, $from, $to - $from);
   }
 
-  // Combine the text chunks with "..." separators. The "..." needs to be
-  // translated. Let translators have the ... separator text as one chunk.
-  $dots = explode('!excerpt', t('... !excerpt ... !excerpt ...'));
+  // Combine the text chunks with "…" separators. The "…" needs to be
+  // translated. Let translators have the … separator text as one chunk.
+  $dots = explode('!excerpt', t('… !excerpt … !excerpt …'));
   $text = (isset($new_ranges[0]) ? '' : $dots[0]) . implode($dots[1], $out) . (($max_end < strlen($text) - 1) ? $dots[2] : '');
   $text = check_plain($text);
 
diff --git a/core/modules/system/lib/Drupal/system/Plugin/Block/SystemMenuBlock.php b/core/modules/system/lib/Drupal/system/Plugin/Block/SystemMenuBlock.php
index 32a84d7..952e464 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/Block/SystemMenuBlock.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/Block/SystemMenuBlock.php
@@ -9,6 +9,8 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\block\BlockBase;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\menu_link\MenuTreeInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -66,6 +68,7 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function build() {
+    $menu_output = &drupal_static(__FUNCTION__, array());
     $menu = $this->getDerivativeId();
     return $this->menuTree->renderMenu($menu);
   }
diff --git a/core/modules/update/lib/Drupal/update/Controller/UpdateController.php b/core/modules/update/lib/Drupal/update/Controller/UpdateController.php
index f9419b3..c8bcef8 100644
--- a/core/modules/update/lib/Drupal/update/Controller/UpdateController.php
+++ b/core/modules/update/lib/Drupal/update/Controller/UpdateController.php
@@ -73,7 +73,7 @@ public function updateStatusManually() {
       ),
       'finished' => 'update_fetch_data_finished',
       'title' => t('Checking available update data'),
-      'progress_message' => t('Trying to check available update data ...'),
+      'progress_message' => t('Trying to check available update data …'),
       'error_message' => t('Error checking available update data.'),
     );
     batch_set($batch);
diff --git a/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php b/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
index 25d8233..f111cec 100644
--- a/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
+++ b/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
@@ -337,7 +337,7 @@ function testUpdateBrokenFetchURL() {
     $this->assertNoText(t('Update available'));
 
     // We need to check that this string is found as part of a project row,
-    // not just in the "Failed to get available update data for ..." message
+    // not just in the "Failed to get available update data for …" message
     // at the top of the page.
     $this->assertRaw('<div class="version-status">' . t('Failed to get available update data'));
 
diff --git a/core/modules/update/lib/Drupal/update/Tests/UpdateCoreTest.php b/core/modules/update/lib/Drupal/update/Tests/UpdateCoreTest.php
index 7928455..38a3c90 100644
--- a/core/modules/update/lib/Drupal/update/Tests/UpdateCoreTest.php
+++ b/core/modules/update/lib/Drupal/update/Tests/UpdateCoreTest.php
@@ -169,7 +169,7 @@ function testModulePageSecurityUpdate() {
 
     // Make sure duplicate messages don't appear on Update status pages.
     $this->drupalGet('admin/reports/status');
-    // We're expecting "There is a security update..." inside the status report
+    // We're expecting "There is a security update…" inside the status report
     // itself, but the drupal_set_message() appears as an li so we can prefix
     // with that and search for the raw HTML.
     $this->assertNoRaw('<li>' . t('There is a security update available for your version of Drupal.'));
@@ -186,7 +186,7 @@ function testModulePageSecurityUpdate() {
    */
   function testServiceUnavailable() {
     $this->refreshUpdateStatus(array(), '503-error');
-    // Ensure that no "Warning: SimpleXMLElement..." parse errors are found.
+    // Ensure that no "Warning: SimpleXMLElement…" parse errors are found.
     $this->assertNoText('SimpleXMLElement');
     $this->assertUniqueText(t('Failed to get available update data for one project.'));
   }
diff --git a/core/modules/update/lib/Drupal/update/UpdateManager.php b/core/modules/update/lib/Drupal/update/UpdateManager.php
index 8c7c48a..adbb945 100644
--- a/core/modules/update/lib/Drupal/update/UpdateManager.php
+++ b/core/modules/update/lib/Drupal/update/UpdateManager.php
@@ -179,7 +179,7 @@ public function fetchDataBatch(&$context) {
       $context['finished'] = 0;
       $context['sandbox']['max'] = $this->updateProcessor->numberOfQueueItems();
       $context['sandbox']['progress'] = 0;
-      $context['message'] = $this->t('Checking available update data ...');
+      $context['message'] = $this->t('Checking available update data …');
       $context['results']['updated'] = 0;
       $context['results']['failures'] = 0;
       $context['results']['processed'] = 0;
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 91a6f25..b0dde0c 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -627,7 +627,7 @@ function template_preprocess_username(&$variables) {
   // that $variables['name'] is safe for printing.
   $name = $variables['name_raw'] = $account->getUsername();
   if (drupal_strlen($name) > 20) {
-    $name = drupal_substr($name, 0, 15) . '...';
+    $name = drupal_substr($name, 0, 15) . '…';
     $variables['truncated'] = TRUE;
   }
   else {
@@ -1103,7 +1103,7 @@ function user_view($account, $view_mode = 'full', $langcode = NULL) {
  * @param $accounts
  *   An array of user accounts as returned by user_load_multiple().
  * @param $view_mode
- *   (optional) View mode, e.g., 'full', 'teaser'... Defaults to 'teaser.'
+ *   (optional) View mode, e.g., 'full', 'teaser'… Defaults to 'teaser.'
  * @param $langcode
  *   (optional) A language code to use for rendering. Defaults to the global
  *   content language of the current request.
