diff --git a/app/code/Magento/Theme/Block/Html/Header/CriticalCss.php b/app/code/Magento/Theme/Block/Html/Header/CriticalCss.php
new file mode 100644
index 0000000000000..6ac1ba344469c
--- /dev/null
+++ b/app/code/Magento/Theme/Block/Html/Header/CriticalCss.php
@@ -0,0 +1,58 @@
+assetRepo = $assetRepo;
+ $this->filePath = $filePath;
+ }
+
+ /**
+ * Returns critical css data as string.
+ *
+ * @return bool|string
+ */
+ public function getCriticalCssData()
+ {
+ try {
+ $asset = $this->assetRepo->createAsset($this->filePath, ['_secure' => 'false']);
+ $content = $asset->getContent();
+ } catch (NotFoundException $e) {
+ $content = '';
+ }
+
+ return $content;
+ }
+}
diff --git a/app/code/Magento/Theme/Controller/Result/AsyncCssPlugin.php b/app/code/Magento/Theme/Controller/Result/AsyncCssPlugin.php
new file mode 100644
index 0000000000000..d15e5e69b1759
--- /dev/null
+++ b/app/code/Magento/Theme/Controller/Result/AsyncCssPlugin.php
@@ -0,0 +1,79 @@
+scopeConfig = $scopeConfig;
+ }
+
+ /**
+ * Load CSS asynchronously if it is enabled in configuration.
+ *
+ * @param Http $subject
+ * @return void
+ */
+ public function beforeSendResponse(Http $subject)
+ {
+ $content = $subject->getContent();
+
+ if (\is_string($content) && strpos($content, '