diff --git a/core/core.libraries.yml b/core/core.libraries.yml
index 60261676fa0ec6b14c116c2ca3126a136aeafd9b..cf74707b51e4aa496e4173ffe136f4978113995f 100644
--- a/core/core.libraries.yml
+++ b/core/core.libraries.yml
@@ -730,6 +730,21 @@ drupal.tableselect:
     - core/jquery
     - core/once
 
+drupal.tablesort:
+  version: VERSION
+  css:
+    component:
+      misc/components/tablesort.module.css: { weight: -10 }
+  moved_files:
+    system/base:
+      deprecation_version: 11.2.0
+      removed_version: 12.0.0
+      deprecation_link: https://www.drupal.org/node/3432346
+      css:
+        component:
+          css/components/tablesort.module.css:
+            base: misc/components/tablesort.module.css
+
 drupal.time-diff:
   version: VERSION
   js:
diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 7d72c4e8e8dc5eb1e28b7b365eac98802b67e466..8d14d430cdbcc84ac6aa2a427d19714296a5f55e 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1287,6 +1287,15 @@ function theme_get_suggestions($args, $base, $delimiter = '__') {
   return $suggestions;
 }
 
+/**
+ * Prepares variables for tablesort indicators.
+ *
+ * Default template: tablesort-indicator.html.twig.
+ */
+function template_preprocess_tablesort_indicator(&$variables): void {
+  $variables['#attached']['library'][] = 'core/drupal.tablesort';
+}
+
 /**
  * Prepares variables for maintenance page templates.
  *
diff --git a/core/modules/system/css/components/tablesort.module.css b/core/misc/components/tablesort.module.css
similarity index 60%
rename from core/modules/system/css/components/tablesort.module.css
rename to core/misc/components/tablesort.module.css
index f531ae01f3cbbbbfb0792d17527700555298c550..bfc9540a03f733ab4897f1478820dc63e2347c7d 100644
--- a/core/modules/system/css/components/tablesort.module.css
+++ b/core/misc/components/tablesort.module.css
@@ -12,8 +12,8 @@
   background-size: 100%;
 }
 .tablesort--asc {
-  background-image: url(../../../../misc/icons/787878/twistie-down.svg);
+  background-image: url(../icons/787878/twistie-down.svg);
 }
 .tablesort--desc {
-  background-image: url(../../../../misc/icons/787878/twistie-up.svg);
+  background-image: url(../icons/787878/twistie-up.svg);
 }
diff --git a/core/modules/system/system.libraries.yml b/core/modules/system/system.libraries.yml
index a368e7e1f9c87bbb681be1bd8b8e58cc9735dc00..0688c39e76fde99a503c2d353531c265b53ff7c7 100644
--- a/core/modules/system/system.libraries.yml
+++ b/core/modules/system/system.libraries.yml
@@ -12,7 +12,6 @@ base:
       css/components/nowrap.module.css: { weight: -10 }
       css/components/position-container.module.css: { weight: -10 }
       css/components/reset-appearance.module.css: { weight: -10 }
-      css/components/tablesort.module.css: { weight: -10 }
 
 admin:
   version: VERSION
diff --git a/core/profiles/demo_umami/tests/src/FunctionalJavascript/AssetAggregationAcrossPagesTest.php b/core/profiles/demo_umami/tests/src/FunctionalJavascript/AssetAggregationAcrossPagesTest.php
index 270848ef150080db65810a74a8d444b839af891f..0b56bdd18c396524675d22fcd386e0801187b476 100644
--- a/core/profiles/demo_umami/tests/src/FunctionalJavascript/AssetAggregationAcrossPagesTest.php
+++ b/core/profiles/demo_umami/tests/src/FunctionalJavascript/AssetAggregationAcrossPagesTest.php
@@ -30,7 +30,7 @@ public function testFrontAndRecipesPages(): void {
       'ScriptCount' => 1,
       'ScriptBytes' => 11700,
       'StylesheetCount' => 6,
-      'StylesheetBytes' => 120500,
+      'StylesheetBytes' => 119600,
     ];
     $this->assertMetrics($expected, $performance_data);
   }
@@ -50,7 +50,7 @@ public function testFrontAndRecipesPagesAuthenticated(): void {
       'ScriptCount' => 3,
       'ScriptBytes' => 170500,
       'StylesheetCount' => 5,
-      'StylesheetBytes' => 86650,
+      'StylesheetBytes' => 85600,
     ];
     $this->assertMetrics($expected, $performance_data);
   }
@@ -71,7 +71,7 @@ public function testFrontAndRecipesPagesEditor(): void {
       'ScriptCount' => 5,
       'ScriptBytes' => 338200,
       'StylesheetCount' => 5,
-      'StylesheetBytes' => 206750,
+      'StylesheetBytes' => 205700,
     ];
     $this->assertMetrics($expected, $performance_data);
   }
diff --git a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
index aa8d6dca9bb039d7fde13f6874e0ed5d0b365e2c..cfa4c2673c9cc89c2bf9ab98a77e3f175c8cc930 100644
--- a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
+++ b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php
@@ -275,7 +275,7 @@ protected function testAnonymous(): void {
         ['config:user.role.anonymous'],
       ],
       'StylesheetCount' => 1,
-      'StylesheetBytes' => 2100,
+      'StylesheetBytes' => 1750,
     ];
     $this->assertMetrics($expected, $performance_data);
 
diff --git a/core/themes/claro/claro.info.yml b/core/themes/claro/claro.info.yml
index 647a22a1568e8dfdbb856edddf6074b339bbce19..87156826550e0c66f732b70c1e454c2c2119c108 100644
--- a/core/themes/claro/claro.info.yml
+++ b/core/themes/claro/claro.info.yml
@@ -123,6 +123,8 @@ libraries-extend:
     - claro/claro.tabledrag
   core/drupal.tableselect:
     - claro/tableselect
+  core/drupal.tablesort:
+    - claro/drupal.tablesort
   core/drupal.vertical-tabs:
     - claro/vertical-tabs
   file/drupal.file:
diff --git a/core/themes/claro/claro.libraries.yml b/core/themes/claro/claro.libraries.yml
index 5d94d224c16cc5cb807d3b68ff0558b18085a1e8..b10eb233ba429ae0bc33c05aab0f692251aeb7b4 100644
--- a/core/themes/claro/claro.libraries.yml
+++ b/core/themes/claro/claro.libraries.yml
@@ -17,7 +17,6 @@ global-styling:
       css/classy/components/links.css: {}
       css/classy/components/menu.css: {}
       css/classy/components/more-link.css: {}
-      css/classy/components/tablesort.css: {}
       css/classy/components/textarea.css: {}
       css/classy/components/ui-dialog.css: {}
       css/components/accordion.css: {}
@@ -50,7 +49,6 @@ global-styling:
       css/components/tables.css: {}
       css/components/table--file-multiple-widget.css: {}
       css/components/search-admin-settings.css: {}
-      css/components/tablesort-indicator.css: {}
       css/components/tableselect.css: {}
       css/components/tabs.css: {}
     theme:
@@ -135,6 +133,13 @@ drupal.node.preview:
     theme:
       css/components/node-preview.css: {}
 
+drupal.tablesort:
+  version: VERSION
+  css:
+    component:
+      css/classy/components/tablesort.css: {}
+      css/components/tablesort-indicator.css: {}
+
 media-form:
   version: VERSION
   css:
diff --git a/core/themes/stable9/css/system/components/tablesort.module.css b/core/themes/stable9/css/core/components/tablesort.module.css
similarity index 100%
rename from core/themes/stable9/css/system/components/tablesort.module.css
rename to core/themes/stable9/css/core/components/tablesort.module.css
diff --git a/core/themes/stable9/stable9.info.yml b/core/themes/stable9/stable9.info.yml
index 5e276f3634f81cd02ddf8eeb0028221c94746a31..c1bcec2907c7b9b52f22025f795e22ea15dd5182 100644
--- a/core/themes/stable9/stable9.info.yml
+++ b/core/themes/stable9/stable9.info.yml
@@ -94,6 +94,11 @@ libraries-override:
       component:
         misc/components/sticky-header.module.css: css/core/components/sticky-header.module.css
 
+  core/drupal.tablesort:
+    css:
+      component:
+        misc/components/tablesort.module.css: css/core/components/tablesort.module.css
+
   core/drupal.vertical-tabs:
     css:
       component:
@@ -238,7 +243,6 @@ libraries-override:
         css/components/nowrap.module.css: css/system/components/nowrap.module.css
         css/components/position-container.module.css: css/system/components/position-container.module.css
         css/components/reset-appearance.module.css: css/system/components/reset-appearance.module.css
-        css/components/tablesort.module.css: css/system/components/tablesort.module.css
   system/admin:
     css:
       theme:
diff --git a/core/themes/starterkit_theme/starterkit_theme.info.yml b/core/themes/starterkit_theme/starterkit_theme.info.yml
index c62f1c42230f7da4c7217d9b9aaee82160f3352a..ca7e542349a3e466b7bfc7d39cac90d3045a39a9 100644
--- a/core/themes/starterkit_theme/starterkit_theme.info.yml
+++ b/core/themes/starterkit_theme/starterkit_theme.info.yml
@@ -18,3 +18,5 @@ libraries-extend:
     - starterkit_theme/file
   core/drupal.progress:
     - starterkit_theme/progress
+  core/drupal.tablesort:
+    - starterkit_theme/drupal.tablesort
diff --git a/core/themes/starterkit_theme/starterkit_theme.libraries.yml b/core/themes/starterkit_theme/starterkit_theme.libraries.yml
index de8638e3b13c82fbf385f7ce3fccc4c00eadc798..dfe9d8daa06beed8483db80d5a8b57ce7b08b899 100644
--- a/core/themes/starterkit_theme/starterkit_theme.libraries.yml
+++ b/core/themes/starterkit_theme/starterkit_theme.libraries.yml
@@ -38,8 +38,6 @@ base:
         weight: -10
       css/components/tableselect.css:
         weight: -10
-      css/components/tablesort.css:
-        weight: -10
       css/components/tabs.css:
         weight: -10
       css/components/textarea.css:
@@ -92,6 +90,14 @@ progress:
     component:
       css/components/progress.css:
         weight: -10
+
+drupal.tablesort:
+  version: VERSION
+  css:
+    component:
+      css/components/tablesort.css:
+        weight: -10
+
 search-results:
   version: VERSION
   css: