diff --git a/theme/styles.php b/theme/styles.php
index 1f363231f92..2b25d142401 100644
--- a/theme/styles.php
+++ b/theme/styles.php
@@ -84,6 +84,15 @@ $candidatedir = "$CFG->localcachedir/theme/$rev/$themename/css";
 $candidatesheet = "{$candidatedir}/" . theme_styles_get_filename($type, $themesubrev, $usesvg);
 $etag = theme_styles_get_etag($themename, $rev, $type, $themesubrev, $usesvg);
 
+if (file_exists($candidatesheet)) {
+    if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
+        // We do not actually need to verify the etag value because our files
+        // never change in cache because we increment the rev counter.
+        css_send_unmodified(filemtime($candidatesheet), $etag);
+    }
+    css_send_cached_css($candidatesheet, $etag);
+}
+
 // Ok, now we need to start normal moodle script, we need to load all libs and $DB.
 define('ABORT_AFTER_CONFIG_CANCEL', true);