diff --git a/core/core.services.yml b/core/core.services.yml
index 05be1bb..fb9706b 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -297,6 +297,11 @@ services:
     tags:
       - { name: module_install.uninstall_validator }
     arguments: ['@entity.manager', '@string_translation']
+  required_module_uninstall_validator:
+    class: Drupal\Core\Extension\RequiredModuleUninstallValidator
+    tags:
+      - { name: module_install.uninstall_validator }
+    arguments: ['@string_translation']
   theme_handler:
     class: Drupal\Core\Extension\ThemeHandler
     arguments: ['@app.root', '@config.factory', '@module_handler', '@state', '@info_parser', '@logger.channel.default', '@asset.css.collection_optimizer', '@config.installer', '@config.manager', '@router.builder_indicator']
diff --git a/core/lib/Drupal/Core/Extension/RequiredModuleUninstallValidator.php b/core/lib/Drupal/Core/Extension/RequiredModuleUninstallValidator.php
new file mode 100644
index 0000000..fd95140
--- /dev/null
+++ b/core/lib/Drupal/Core/Extension/RequiredModuleUninstallValidator.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Extension\RequiredModuleUninstallValidator.
+ */
+
+namespace Drupal\Core\Extension;
+
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * @todo.
+ */
+class RequiredModuleUninstallValidator implements ModuleUninstallValidatorInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($module) {
+    $reasons = [];
+    $modules = system_rebuild_module_data();
+    if (!empty($modules[$module]->info['required'])) {
+      $reasons[] = $this->t('This module is required.');
+    }
+    return $reasons;
+  }
+
+}
