diff --git a/core/includes/unicode.inc b/core/includes/unicode.inc
index a2ff76b..97c9cd0 100644
--- a/core/includes/unicode.inc
+++ b/core/includes/unicode.inc
@@ -462,6 +462,24 @@ function drupal_ucfirst($text) {
 }
 
 /**
+ * Capitalizes the first letter of each word in a UTF-8 string.
+ *
+ * @param string $text
+ *   The text that will be converted.
+ *
+ * @return string
+ *   The input $text with each word capitalized.
+ *
+ * @ingroup php_wrappers
+ */
+function drupal_ucwords($text) {
+  $regex = '/(^|[' . PREG_CLASS_UNICODE_WORD_BOUNDARY . '])([^' . PREG_CLASS_UNICODE_WORD_BOUNDARY . '])/u';
+  return preg_replace_callback($regex, function(array $matches) {
+    return $matches[1] . drupal_strtoupper($matches[2]);
+  }, $text);
+}
+
+/**
  * Cut off a piece of a string based on character indices and counts. Follows
  * the same behavior as PHP's own substr() function.
  *
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/UnicodeUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/System/UnicodeUnitTest.php
index 58bef10..3503b80 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/UnicodeUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/UnicodeUnitTest.php
@@ -49,6 +49,7 @@ function testMbStringUnicode() {
     $this->helperTestStrToLower();
     $this->helperTestStrToUpper();
     $this->helperTestUcFirst();
+    $this->helperTestUcWords();
     $this->helperTestStrLen();
     $this->helperTestSubStr();
     $this->helperTestTruncate();
@@ -69,6 +70,7 @@ function testEmulatedUnicode() {
     $this->helperTestStrToLower();
     $this->helperTestStrToUpper();
     $this->helperTestUcFirst();
+    $this->helperTestUcWords();
     $this->helperTestStrLen();
     $this->helperTestSubStr();
     $this->helperTestTruncate();
@@ -118,6 +120,30 @@ function helperTestUcFirst() {
     }
   }
 
+  /**
+   * Tests 'drupal_ucwords' functionality with examples.
+   */
+  function helperTestUcWords() {
+    $testcase = array(
+      'tHe QUIcK bRoWn' => 'THe QUIcK BRoWn',
+      'françAIS' => 'FrançAIS',
+      'über' => 'Über',
+      'åwesome' => 'Åwesome',
+      // Make sure we don't mangle extra spaces.
+      'frànçAIS is  über-åwesome' => 'FrànçAIS Is  Über-Åwesome',
+    );
+    if ($this->extendedMode) {
+      $testcase['σion'] = 'Σion';
+    }
+
+    foreach ($testcase as $input => $output) {
+      $this->assertEqual(drupal_ucwords($input), $output, format_string('%input is ucword-ed as %output', array(
+        '%input' => $input,
+        '%output' => $output,
+      )));
+    }
+  }
+
   function helperTestStrLen() {
     $testcase = array(
       'tHe QUIcK bRoWn' => 15,
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php
index 0b897ea..50a508d 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php
@@ -264,7 +264,7 @@ protected function caseTransform($string, $option) {
           return mb_convert_case($string, MB_CASE_TITLE);
         }
         else {
-          return ucwords($string);
+          return drupal_ucwords($string);
         }
     }
   }
