diff --git a/core/includes/common.inc b/core/includes/common.inc
index df552ed..03c0850 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -1,6 +1,7 @@
 <?php
 
 use Drupal\Component\Utility\Crypt;
+use Drupal\Component\Utility\Css;
 use Drupal\Component\Utility\Json;
 use Drupal\Component\Utility\Settings;
 use Drupal\Component\Utility\SortArray;
@@ -1902,22 +1903,11 @@ function drupal_delete_file_if_stale($uri) {
  *
  * @return
  *   The cleaned identifier.
+ *
+ * @deprecated Use Drupal\Component\Utility\Css::cleanIdentifier()
  */
 function drupal_clean_css_identifier($identifier, $filter = array(' ' => '-', '_' => '-', '__' => '__', '/' => '-', '[' => '-', ']' => '')) {
-  // By default, we filter using Drupal's coding standards.
-  $identifier = strtr($identifier, $filter);
-
-  // Valid characters in a CSS identifier are:
-  // - the hyphen (U+002D)
-  // - a-z (U+0030 - U+0039)
-  // - A-Z (U+0041 - U+005A)
-  // - the underscore (U+005F)
-  // - 0-9 (U+0061 - U+007A)
-  // - ISO 10646 characters U+00A1 and higher
-  // We strip out any character not in the above list.
-  $identifier = preg_replace('/[^\x{002D}\x{0030}-\x{0039}\x{0041}-\x{005A}\x{005F}\x{0061}-\x{007A}\x{00A1}-\x{FFFF}]/u', '', $identifier);
-
-  return $identifier;
+  return Css::cleanIdentifier($identifier, $filter);
 }
 
 /**
diff --git a/core/lib/Drupal/Component/Utility/Css.php b/core/lib/Drupal/Component/Utility/Css.php
new file mode 100644
index 0000000..df71e55
--- /dev/null
+++ b/core/lib/Drupal/Component/Utility/Css.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Component\Utility\Css.
+ */
+
+namespace Drupal\Component\Utility;
+
+/**
+ * Utility CSS methods.
+ */
+class Css {
+
+  /**
+   * Prepares a string for use as a CSS identifier (element, class, or ID name).
+   *
+   * http://www.w3.org/TR/CSS21/syndata.html#characters
+   * The above URL shows the syntax for valid CSS identifiers
+   * (including element names, classes, and IDs in selectors.)
+   *
+   * @param string $identifier
+   *   The identifier to clean.
+   * @param array $filter
+   *   An array of string replacements to use on the identifier.
+   *
+   * @return string
+   *   The cleaned identifier.
+   */
+  public static function cleanIdentifier($identifier, $filter = array(' ' => '-', '_' => '-', '__' => '__', '/' => '-', '[' => '-', ']' => '')) {
+    // By default, we filter using Drupal's coding standards.
+    $identifier = strtr($identifier, $filter);
+
+    // Valid characters in a CSS identifier are:
+    // - the hyphen (U+002D)
+    // - a-z (U+0030 - U+0039)
+    // - A-Z (U+0041 - U+005A)
+    // - the underscore (U+005F)
+    // - 0-9 (U+0061 - U+007A)
+    // - ISO 10646 characters U+00A1 and higher
+    // We strip out any character not in the above list.
+    $identifier = preg_replace('/[^\x{002D}\x{0030}-\x{0039}\x{0041}-\x{005A}\x{005F}\x{0061}-\x{007A}\x{00A1}-\x{FFFF}]/u', '', $identifier);
+
+    return $identifier;
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/HtmlIdentifierUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/HtmlIdentifierUnitTest.php
index a81feb8..300dd53 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/HtmlIdentifierUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/HtmlIdentifierUnitTest.php
@@ -22,26 +22,6 @@ public static function getInfo() {
   }
 
   /**
-   * Tests that drupal_clean_css_identifier() cleans the identifier properly.
-   */
-  function testDrupalCleanCSSIdentifier() {
-    // Verify that no valid ASCII characters are stripped from the identifier.
-    $identifier = 'abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789';
-    $this->assertIdentical(drupal_clean_css_identifier($identifier, array()), $identifier, 'Verify valid ASCII characters pass through.');
-
-    // Verify that valid UTF-8 characters are not stripped from the identifier.
-    $identifier = '¡¢£¤¥';
-    $this->assertIdentical(drupal_clean_css_identifier($identifier, array()), $identifier, 'Verify valid UTF-8 characters pass through.');
-
-    // Verify that invalid characters (including non-breaking space) are stripped from the identifier.
-    $this->assertIdentical(drupal_clean_css_identifier('invalid !"#$%&\'()*+,./:;<=>?@[\\]^`{|}~ identifier', array()), 'invalididentifier', 'Strip invalid characters.');
-
-    // Verify that double underscores are not stripped from the identifier.
-    $identifier = 'css__identifier__with__double__underscores';
-    $this->assertIdentical(drupal_clean_css_identifier($identifier), $identifier, 'Verify double underscores pass through.');
-  }
-
-  /**
    * Tests that drupal_html_class() cleans the class name properly.
    */
   function testDrupalHTMLClass() {
diff --git a/core/modules/tour/lib/Drupal/tour/TourRenderController.php b/core/modules/tour/lib/Drupal/tour/TourRenderController.php
index aea0d33..de868cf 100644
--- a/core/modules/tour/lib/Drupal/tour/TourRenderController.php
+++ b/core/modules/tour/lib/Drupal/tour/TourRenderController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\tour;
 
+use Drupal\Component\Utility\Css;
 use Drupal\Core\Entity\EntityRenderController;
 use Drupal\Core\Entity\EntityInterface;
 
@@ -28,9 +29,9 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
         if ($output = $tip->getOutput()) {
           $attributes = array(
             'class' => array(
-              'tip-module-' . drupal_clean_css_identifier($entity->get('module')),
-              'tip-type-' . drupal_clean_css_identifier($tip->get('plugin')),
-              'tip-' . drupal_clean_css_identifier($tip->get('id')),
+              'tip-module-' . Css::cleanIdentifier($entity->get('module')),
+              'tip-type-' . Css::cleanIdentifier($tip->get('plugin')),
+              'tip-' . Css::cleanIdentifier($tip->get('id')),
             ),
           );
           $list_items[] = array(
diff --git a/core/tests/Drupal/Tests/Component/Utility/CssTest.php b/core/tests/Drupal/Tests/Component/Utility/CssTest.php
new file mode 100644
index 0000000..c71aa6a
--- /dev/null
+++ b/core/tests/Drupal/Tests/Component/Utility/CssTest.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Component\Utility\CssTest.
+ */
+
+namespace Drupal\Tests\Component\Utility;
+
+use Drupal\Tests\UnitTestCase;
+use Drupal\Component\Utility\Css;
+
+/**
+ * Tests cleaning HTML identifiers.
+ *
+ * @see \Drupal\Component\Utility\Css
+ *
+ * @group Drupal
+ */
+class CssTest extends UnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'CSS utility tests',
+      'description' => 'Test CSS utility methods.',
+      'group' => 'Common',
+    );
+  }
+
+  /**
+   * Tests that Css::cleanIdentifier cleans the identifier properly.
+   *
+   * @dataProvider providerTestDrupalCleanCssIdenfier
+   */
+  function testDrupalCleanCssIdentifier($input, $filters, $output, $message) {
+    $this->assertEquals(Css::cleanIdentifier($input, $filters), $output, $message);
+  }
+
+  /**
+   * Provides test cases.
+   */
+  public function providerTestDrupalCleanCssIdenfier() {
+    return array(
+      array(
+        'abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789',
+        array(),
+        'abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789',
+        'Verify valid ASCII characters pass through.',
+      ),
+      array(
+        '¡¢£¤¥',
+        array(),
+        '¡¢£¤¥',
+        'Verify valid UTF-8 characters pass through.',
+      ),
+      array(
+        'invalid !"#$%&\'()*+,./:;<=>?@[\\]^`{|}~ identifier',
+        array(),
+        'invalididentifier',
+        'Strip invalid characters.',
+      ),
+      array(
+        'css__identifier__with__double__underscores',
+        array(' ' => '-', '_' => '-', '__' => '__', '/' => '-', '[' => '-', ']' => ''),
+        'css__identifier__with__double__underscores',
+        'Verify double underscores pass through.',
+      ),
+    );
+  }
+
+}
