diff --git a/cloud.info.yml b/cloud.info.yml
index f2ce6fe0..668215eb 100644
--- a/cloud.info.yml
+++ b/cloud.info.yml
@@ -3,8 +3,14 @@ type: module
 description: Allows users to manage Clouds.
 package: Cloud
 dependencies:
-  - drupal:views
+  - drupal:field
+  - drupal:file
+  - drupal:filter
   - drupal:image
+  - drupal:options
+  - drupal:user
+  - drupal:text
+  - drupal:views
 core : 8.x
 scripts:
   - js/cloud.js
diff --git a/cloud.install b/cloud.install
index 6544d6c4..8b066b3c 100644
--- a/cloud.install
+++ b/cloud.install
@@ -5,22 +5,22 @@
  * Install and updates for aws_cloud.
  */
 
-use Drupal\Core\Config\FileStorage;
-use Drupal\Component\Serialization\Yaml;
-use Drupal\Core\Field\BaseFieldDefinition;
-use Drupal\cloud\Entity\CloudServerTemplateType;
-use Drupal\cloud\Entity\CloudServerTemplateTypeListBuilder;
-use Drupal\cloud\Form\CloudServerTemplateTypeForm;
-use Drupal\cloud\Form\CloudServerTemplateTypeDeleteForm;
-use Drupal\cloud\Routing\CloudServerTemplateTypeHtmlRouteProvider;
+use Drupal\cloud\Controller\CloudServerTemplateAccessControlHandler;
+use Drupal\cloud\Controller\CloudServerTemplateListBuilder;
 use Drupal\cloud\Entity\CloudServerTemplate;
 use Drupal\cloud\Entity\CloudServerTemplateStorage;
-use Drupal\cloud\Controller\CloudServerTemplateListBuilder;
-use Drupal\cloud\Entity\CloudServerTemplateViewsData;
 use Drupal\cloud\Entity\CloudServerTemplateTranslationHandler;
-use Drupal\cloud\Form\CloudServerTemplateForm;
+use Drupal\cloud\Entity\CloudServerTemplateType;
+use Drupal\cloud\Entity\CloudServerTemplateTypeListBuilder;
+use Drupal\cloud\Entity\CloudServerTemplateViewsData;
 use Drupal\cloud\Form\CloudServerTemplateDeleteForm;
-use Drupal\cloud\Controller\CloudServerTemplateAccessControlHandler;
+use Drupal\cloud\Form\CloudServerTemplateForm;
+use Drupal\cloud\Form\CloudServerTemplateTypeDeleteForm;
+use Drupal\cloud\Form\CloudServerTemplateTypeForm;
+use Drupal\cloud\Routing\CloudServerTemplateTypeHtmlRouteProvider;
+use Drupal\Component\Serialization\Yaml;
+use Drupal\Core\Config\FileStorage;
+use Drupal\Core\Field\BaseFieldDefinition;
 
 /**
  * Removed obsolete cloud_pricing interrupts update from beta1 to beta2.
@@ -518,14 +518,8 @@ function cloud_update_8127() {
  * Add launch resources field to cloud_server_template.
  */
 function cloud_update_8128() {
-  $config_path = realpath(drupal_get_path('module', 'cloud')) . '/config/install';
-  $source = new FileStorage($config_path);
-
-  // Obtain the storage manager for field termination protection bases
-  // Create a new field from the yaml configuration and save.
-  \Drupal::entityTypeManager()->getStorage('field_storage_config')
-    ->create($source->read('field.storage.cloud_server_template.field_launch_resources'))
-    ->save();
+  // Moved the field.storage.cloud_server_template.field_launch_resources.yml
+  // to k8s module.
 }
 
 /**
@@ -539,6 +533,15 @@ function cloud_update_8129() {
   ]);
 }
 
+/**
+ * Remove launch resources field to cloud_server_template.
+ */
+function cloud_update_8130() {
+  \Drupal::configFactory()
+    ->getEditable('field.storage.cloud_server_template.field_launch_resources')
+    ->delete();
+}
+
 /**
  * Set cloud_config field values.
  */
diff --git a/cloud.module b/cloud.module
index afd4f1f8..133d49d4 100644
--- a/cloud.module
+++ b/cloud.module
@@ -28,7 +28,10 @@ use Drupal\views\ViewExecutable;
 function cloud_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.cloud':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('Cloud') . '</p>';
       $output = '<p>' . t('The cloud module creates a user interface for users to manage clouds. Users can Create Instances,  Describe Instances etc.') . '</p>';
+      $output .= '<p>' . t('For more information, see the <a href=":cloud_documentation">online documentation for the Cloud module</a>.', [':cloud_documentation' => 'https://www.drupal.org/docs/8/modules/cloud']) . '</p>';
       return $output;
 
     case 'help.page.cloud_server_template':
@@ -36,6 +39,7 @@ function cloud_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<h3>' . t('About') . '</h3>';
       $output .= '<p>' . t('Cloud server template') . '</p>';
       $output .= '<p>' . t('The cloud_server_template module creates a user interface for users to manage clouds. Users can create cloud server templates.') . '</p>';
+      $output .= '<p>' . t('For more information, see the <a href=":cloud_documentation">online documentation for the Cloud module</a>.', [':cloud_documentation' => 'https://www.drupal.org/docs/8/modules/cloud']) . '</p>';
       return $output;
 
     default:
@@ -217,6 +221,34 @@ function cloud_uninstall_location_fields($module_name, $bundle = NULL) {
   }
 }
 
+/**
+ * Helper function to delete default icon.
+ *
+ * @param string $module
+ *   The module name.
+ */
+function cloud_delete_default_icon($module) {
+
+  try {
+    // Delete default icon.
+    $config_factory = \Drupal::configFactory();
+    $config = $config_factory->getEditable("${module}.settings");
+    $fid = !empty($config) ? $config->get("${module}_cloud_config_icon") : NULL;
+
+    // Delete file from disk and from database.
+    if (!empty($fid)) {
+      $storage = \Drupal::entityTypeManager()->getStorage('file');
+      $files = !empty($storage) ? $storage->loadMultiple([$fid]) : [];
+      $storage->delete($files);
+    }
+  } catch (\Exception $e) {
+    // @TODO: Add error handling.
+    $error_message = "An error occurred: ${e}";
+    \Drupal::messenger()->addError($error_message);
+    \Drupal::logger('cloud')->error($error_message);
+  }
+}
+
 /**
  * Implements hook_theme_suggestions_HOOK().
  */
diff --git a/config/install/image.style.icon.yml b/config/install/image.style.icon.yml
index 8c24079c..764d709b 100644
--- a/config/install/image.style.icon.yml
+++ b/config/install/image.style.icon.yml
@@ -2,7 +2,7 @@ langcode: en
 status: true
 dependencies:
   module:
-    - cloud
+    - image
   enforced:
     module:
       - cloud
diff --git a/config/install/image.style.icon_16x16.yml b/config/install/image.style.icon_16x16.yml
index 54559973..140f1c40 100644
--- a/config/install/image.style.icon_16x16.yml
+++ b/config/install/image.style.icon_16x16.yml
@@ -2,7 +2,7 @@ langcode: en
 status: true
 dependencies: 
   module:
-    - cloud
+    - image
   enforced:
     module:
       - cloud
diff --git a/config/install/image.style.icon_32x32.yml b/config/install/image.style.icon_32x32.yml
index f6ec959d..eb7ebe47 100644
--- a/config/install/image.style.icon_32x32.yml
+++ b/config/install/image.style.icon_32x32.yml
@@ -2,7 +2,7 @@ langcode: en
 status: true
 dependencies:
   module:
-    - cloud
+    - image
   enforced:
     module:
       - cloud
diff --git a/modules/cloud_budget/cloud_budget.module b/modules/cloud_budget/cloud_budget.module
index ae300f6c..355b2d8a 100644
--- a/modules/cloud_budget/cloud_budget.module
+++ b/modules/cloud_budget/cloud_budget.module
@@ -6,6 +6,23 @@
  */
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * Implements hook_help().
+ */
+function cloud_budget_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.cloud_budget':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The cloud budget module allows users to manage Cloud Budget.') . '</p>';
+      $output .= '<p>' . t('For more information, see the <a href=":cloud_documentation">online documentation for the Cloud Budget module</a>.', [':cloud_documentation' => 'https://www.drupal.org/docs/8/modules/cloud']) . '</p>';
+      return $output;
+
+    default:
+      return '';
+  }
+}
 
 /**
  * Implements hook_form_alter().
diff --git a/modules/cloud_budget/tests/src/Functional/Module/CloudBudgetInstallUninstallTest.php b/modules/cloud_budget/tests/src/Functional/Module/CloudBudgetInstallUninstallTest.php
new file mode 100644
index 00000000..45fcc156
--- /dev/null
+++ b/modules/cloud_budget/tests/src/Functional/Module/CloudBudgetInstallUninstallTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\Tests\cloud_budget\Functional\Module;
+
+use Drupal\Tests\cloud\Functional\Module\CloudModuleTestBase;
+
+/**
+ * Tests install / uninstall module(s) and confirm table creation/deletion.
+ *
+ * @group Cloud
+ */
+class CloudBudgetInstallUninstallTest extends CloudModuleTestBase {
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   */
+  public function testInstallUninstall() : void {
+    $this->repeatAssertInstallUninstallModules(['cloud_budget']);
+  }
+
+}
diff --git a/modules/cloud_service_providers/aws_cloud/aws_cloud.install b/modules/cloud_service_providers/aws_cloud/aws_cloud.install
index d4943da7..562c2fd6 100644
--- a/modules/cloud_service_providers/aws_cloud/aws_cloud.install
+++ b/modules/cloud_service_providers/aws_cloud/aws_cloud.install
@@ -35,6 +35,9 @@ function aws_cloud_uninstall() {
   // @TODO: Delete the following user later on.
   cloud_uninstall_service_provider('aws_ec2');
 
+  // Delete default icon.
+  cloud_delete_default_icon('aws_cloud');
+
   // Delete cloud config fields.
   // NOTE: field_location_* fields consists of two kinds of information
   // such as field.field.cloud_config.aws_cloud.field_location_* and
@@ -58,7 +61,7 @@ function aws_cloud_uninstall() {
  */
 function aws_cloud_add_fields($entity_type, $bundle, $fields) {
   $config_path = drupal_get_path('module', 'aws_cloud') . '/config/install';
-  $source      = new FileStorage($config_path);
+  $source = new FileStorage($config_path);
 
   if (!is_array($fields)) {
     $fields = [$fields];
@@ -2369,3 +2372,12 @@ function aws_cloud_update_8218() {
     \Drupal::messenger()->addError("An error occurred: {$e}");
   }
 }
+
+/**
+ * Change aws_cloud_config_icon to aws_cloud_cloud_config_icon.
+ */
+function aws_cloud_update_8219() {
+
+  // Creates 'aws_cloud_cloud_config_icon'.
+  cloud_add_default_icon('aws_cloud');
+}
diff --git a/modules/cloud_service_providers/aws_cloud/aws_cloud.module b/modules/cloud_service_providers/aws_cloud/aws_cloud.module
index d6568ffa..6ae11b7e 100644
--- a/modules/cloud_service_providers/aws_cloud/aws_cloud.module
+++ b/modules/cloud_service_providers/aws_cloud/aws_cloud.module
@@ -34,6 +34,47 @@ use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\file\Entity\File;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 
+/**
+ * Implements hook_help().
+ */
+function aws_cloud_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.aws_cloud':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('AWS Cloud (aws_cloud module) creates a user interface for managing AWS-related clouds. AWS Cloud is defined as Amazon EC2.') . '</p>';
+      $output .= '<h3>' . t('Features') . '</h3>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('<strong>EC2</strong>');
+      $output .= '<ul>';
+      $output .= '<li>' . t('Manage EC2.') . '</li>';
+      $output .= '<li>' . t('Integrate with AWS Instance Scheduler.') . '</li>';
+      $output .= '<li>' . t('Support EC2 launch templates.') . '</li>';
+      $output .= '<li>' . t('Support automatic termination scheduling.') . '</li>';
+      $output .= '<li>' . t('Support instance profile (instance IAM role), assume role and switch role') . '</li>';
+      $output .= '</ul></li></ul>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('<strong>VPC</strong>');
+      $output .= '<ul>';
+      $output .= '<li>' . t('Manage VPC.') . '</li>';
+      $output .= '<li>' . t('Create a VPC automatically based on each login user account.') . '</li>';
+      $output .= '<li>' . t('Create and manage bastion for each VPC.') . '</li>';
+      $output .= '<li>' . t('Support VPC flow logs.') . '</li>';
+      $output .= '<li>' . t('Support Cloud Formation templates to deploy a Cloud Orchestrator distribution.') . '</li>';
+      $output .= '</ul></li></ul>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('<strong>Cost</strong>');
+      $output .= '<ul>';
+      $output .= '<li>' . t('List up instance type specs and costs.') . '</li>';
+      $output .= '<li>' . t('Create Google Spreadsheets for instance type specs and costs.') . '</li>';
+      $output .= '<li>' . t('Send reminder alerts for long-running instances, unused volumes and snapshots.') . '</li>';
+      $output .= '<li>' . t('Manage budgets and credits.') . '</li>';
+      $output .= '</ul></li></ul>';
+      $output .= '<p>' . t('For more information, see the <a href=":cloud_documentation">online documentation for the AWS Cloud module</a>.', [':cloud_documentation' => 'https://www.drupal.org/docs/8/modules/cloud']) . '</p>';
+
+      return $output;
+  }
+}
+
 /**
  * Implements hook_libraries_info().
  */
@@ -57,18 +98,6 @@ function aws_cloud_libraries_info() {
   ];
 }
 
-/**
- * Implements hook_help().
- */
-function aws_cloud_help($route_name, RouteMatchInterface $route_match) {
-  switch ($route_name) {
-    case 'help.page.aws_cloud':
-      $output = '<p>' . t('The aws_cloud module creates a user interface for managing AWS related clouds. AWS Cloud is defined as Amazon EC2.') . '</p>';
-
-      return $output;
-  }
-}
-
 /**
  * Set dynamic allowed values for the alignment field.
  *
@@ -547,7 +576,7 @@ function aws_cloud_default_cloud_config_icon(EntityInterface $entity) {
   // Provides the calling hook with the default aws icon.
   if ($entity->bundle() === 'aws_cloud') {
     $config = \Drupal::config('aws_cloud.settings');
-    return $config->get('aws_cloud_config_icon');
+    return $config->get('aws_cloud_cloud_config_icon');
   }
 }
 
@@ -2473,7 +2502,7 @@ function aws_cloud_form_cloud_config_aws_cloud_add_form_submit_finished(
 function aws_cloud_form_cloud_config_aws_cloud_form_common_alter(array &$form, FormStateInterface $form_state, $form_id) {
   // Set the default aws icon.
   $config = \Drupal::config('aws_cloud.settings');
-  $default_image = $config->get('aws_cloud_config_icon');
+  $default_image = $config->get('aws_cloud_cloud_config_icon');
   if ($default_image) {
     try {
       $file = File::load($default_image);
@@ -4158,8 +4187,6 @@ function aws_cloud_cloud_config_fieldsets(array &$fields) {
   $fields['new_revision']['#access'] = FALSE;
   $fields['revision_log_message']['#access'] = FALSE;
 
-  $fields['#attached']['library'][] = 'aws_cloud/aws_cloud_config';
-
   cloud_form_reorder($fields, $fieldset_defs);
 }
 
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_config_type.aws_cloud.yml b/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_config_type.aws_cloud.yml
index 05d61cb1..80ed7fba 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_config_type.aws_cloud.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_config_type.aws_cloud.yml
@@ -1,5 +1,10 @@
 langcode: en
 status: true
-dependencies: {  }
+dependencies:
+  module:
+    - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: aws_cloud
-label: AWS Cloud
+label: 'AWS Cloud'
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_server_template_type.aws_cloud.yml b/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_server_template_type.aws_cloud.yml
index 05d61cb1..80ed7fba 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_server_template_type.aws_cloud.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/cloud.cloud_server_template_type.aws_cloud.yml
@@ -1,5 +1,10 @@
 langcode: en
 status: true
-dependencies: {  }
+dependencies:
+  module:
+    - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: aws_cloud
-label: AWS Cloud
+label: 'AWS Cloud'
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_config.aws_cloud.default.yml b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_config.aws_cloud.default.yml
index b4c3e3ee..33ebfb8c 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_config.aws_cloud.default.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_config.aws_cloud.default.yml
@@ -34,6 +34,11 @@ dependencies:
     - field.field.cloud_config.aws_cloud.field_use_instance_profile
     - field.field.cloud_config.aws_cloud.field_use_switch_role
     - field.field.cloud_config.aws_cloud.field_x_509_certificate
+  module:
+    - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.aws_cloud.default
 targetEntityType: cloud_config
 bundle: aws_cloud
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_server_template.aws_cloud.default.yml b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_server_template.aws_cloud.default.yml
index 5d466a92..fb23b0c8 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_server_template.aws_cloud.default.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_form_display.cloud_server_template.aws_cloud.default.yml
@@ -25,6 +25,11 @@ dependencies:
     - field.field.cloud_server_template.aws_cloud.field_iam_role
     - field.field.cloud_server_template.aws_cloud.field_tags
     - field.field.cloud_server_template.aws_cloud.field_version
+  module:
+    - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.aws_cloud.default
 targetEntityType: cloud_server_template
 bundle: aws_cloud
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_config.aws_cloud.default.yml b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_config.aws_cloud.default.yml
index 076c1cde..f87b683b 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_config.aws_cloud.default.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_config.aws_cloud.default.yml
@@ -35,8 +35,12 @@ dependencies:
     - field.field.cloud_config.aws_cloud.field_use_switch_role
     - field.field.cloud_config.aws_cloud.field_x_509_certificate
   module:
+    - cloud
     - options
     - user
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.aws_cloud.default
 targetEntityType: cloud_config
 bundle: aws_cloud
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_server_template.aws_cloud.default.yml b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_server_template.aws_cloud.default.yml
index 40541f30..b3500b75 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_server_template.aws_cloud.default.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/core.entity_view_display.cloud_server_template.aws_cloud.default.yml
@@ -26,8 +26,12 @@ dependencies:
     - field.field.cloud_server_template.aws_cloud.field_tags
     - field.field.cloud_server_template.aws_cloud.field_version
   module:
+    - cloud
     - options
     - user
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.aws_cloud.default
 targetEntityType: cloud_server_template
 bundle: aws_cloud
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_access_key.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_access_key.yml
index 28b623c2..7c9d8cd1 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_access_key.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_access_key.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_access_key
 field_name: field_access_key
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_account_id.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_account_id.yml
index 9ffe666a..1a8eacc4 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_account_id.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_account_id.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_account_id
 field_name: field_account_id
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_endpoint_uri.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_endpoint_uri.yml
index 84dd90e0..c22f8dfd 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_endpoint_uri.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_endpoint_uri.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_api_endpoint_uri
 field_name: field_api_endpoint_uri
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_version.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_version.yml
index b9bb368e..b2af6416 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_version.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_api_version.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_api_version
 field_name: field_api_version
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_automatically_assign_vpc.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_automatically_assign_vpc.yml
index d7112088..7915afd7 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_automatically_assign_vpc.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_automatically_assign_vpc.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_automatically_assign_vpc
 field_name: field_automatically_assign_vpc
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_cidr_block.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_cidr_block.yml
index 1a721077..433b26c3 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_cidr_block.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_cidr_block.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_default_subnet_cidr_block
 field_name: field_default_subnet_cidr_block
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_name.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_name.yml
index 3a98cab4..3cd82e15 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_name.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_subnet_name.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_default_subnet_name
 field_name: field_default_subnet_name
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_cidr_block.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_cidr_block.yml
index a4ef62b0..5ba575eb 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_cidr_block.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_cidr_block.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_default_vpc_cidr_block
 field_name: field_default_vpc_cidr_block
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_name.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_name.yml
index 1f076108..716e7be8 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_name.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_default_vpc_name.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_default_vpc_name
 field_name: field_default_vpc_name
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_description.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_description.yml
index 653477ae..c73241ef 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_description.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_description.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_description
 field_name: field_description
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_iam_role.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_iam_role.yml
index 12952417..dbe2cb0b 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_iam_role.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_iam_role.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_iam_role
 field_name: field_iam_role
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_image_upload_url.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_image_upload_url.yml
index 2eace508..a8690199 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_image_upload_url.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_image_upload_url.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_image_upload_url
 field_name: field_image_upload_url
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination.yml
index f4820cec..ca1a1051 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_log_destination
 field_name: field_log_destination
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination_type.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination_type.yml
index c4096d90..aea90444 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination_type.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_destination_type.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_log_destination_type
 field_name: field_log_destination_type
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_group_name.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_group_name.yml
index 87928337..708f89d2 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_group_name.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_log_group_name.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_log_group_name
 field_name: field_log_group_name
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_logs_permission_arn.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_logs_permission_arn.yml
index 2c1b6929..bf1f6f65 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_logs_permission_arn.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_logs_permission_arn.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_logs_permission_arn
 field_name: field_logs_permission_arn
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_region.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_region.yml
index 1d502523..0ee8deba 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_region.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_region.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_region
 field_name: field_region
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_secret_key.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_secret_key.yml
index cd6ee71b..ca16a7f2 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_secret_key.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_secret_key.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_secret_key
 field_name: field_secret_key
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_spreadsheet_pricing_url.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_spreadsheet_pricing_url.yml
index 0c7f33cd..4b5efa56 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_spreadsheet_pricing_url.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_spreadsheet_pricing_url.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_spreadsheet_pricing_url
 field_name: field_spreadsheet_pricing_url
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_account_id.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_account_id.yml
index 18fb8aff..ae494483 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_account_id.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_account_id.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_switch_role_account_id
 field_name: field_switch_role_account_id
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_iam_role.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_iam_role.yml
index 5d18bbdf..629ad378 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_iam_role.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_switch_role_iam_role.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_switch_role_iam_role
 field_name: field_switch_role_iam_role
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_system_vpc.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_system_vpc.yml
index 94083594..3a792402 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_system_vpc.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_system_vpc.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_system_vpc
 field_name: field_system_vpc
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_traffic_type.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_traffic_type.yml
index af099507..ede744ea 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_traffic_type.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_traffic_type.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_traffic_type
 field_name: field_traffic_type
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_assume_role.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_assume_role.yml
index 6164c5f0..629b18e7 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_assume_role.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_assume_role.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_use_assume_role
 field_name: field_use_assume_role
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_instance_profile.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_instance_profile.yml
index 0325264f..395e3b01 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_instance_profile.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_instance_profile.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_use_instance_profile
 field_name: field_use_instance_profile
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_switch_role.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_switch_role.yml
index 7c83ee0e..8a44a14a 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_switch_role.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_use_switch_role.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_use_switch_role
 field_name: field_use_switch_role
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_x_509_certificate.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_x_509_certificate.yml
index 31a4cd3c..a04b710a 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_x_509_certificate.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_config.field_x_509_certificate.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_config.field_x_509_certificate
 field_name: field_x_509_certificate
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_availability_zone.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_availability_zone.yml
index 3b96934c..82e8dc63 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_availability_zone.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_availability_zone.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_availability_zone
 field_name: field_availability_zone
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_description.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_description.yml
index 1bf7e1b5..cc765b76 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_description.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_description.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_description
 field_name: field_description
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_iam_role.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_iam_role.yml
index 70224430..9999ea1b 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_iam_role.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_iam_role.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_iam_role
 field_name: field_iam_role
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_image_id.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_image_id.yml
index 3ccb7a97..2e5f69eb 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_image_id.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_image_id.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_image_id
 field_name: field_image_id
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_shutdown_behavior.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_shutdown_behavior.yml
index 30ef426d..1477848d 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_shutdown_behavior.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_shutdown_behavior.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_instance_shutdown_behavior
 field_name: field_instance_shutdown_behavior
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_type.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_type.yml
index 33e287c7..63b9accb 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_type.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_instance_type.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_instance_type
 field_name: field_instance_type
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_kernel_id.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_kernel_id.yml
index d30f47af..e33171f1 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_kernel_id.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_kernel_id.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_kernel_id
 field_name: field_kernel_id
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_max_count.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_max_count.yml
index 885c358a..60a4c0b7 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_max_count.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_max_count.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_max_count
 field_name: field_max_count
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_min_count.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_min_count.yml
index 94bc5a73..660ef0e6 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_min_count.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_min_count.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_min_count
 field_name: field_min_count
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_monitoring.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_monitoring.yml
index b8471ca5..02c8abce 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_monitoring.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_monitoring.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_monitoring
 field_name: field_monitoring
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_network.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_network.yml
index c0365d90..1cfe1e7b 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_network.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_network.yml
@@ -2,8 +2,10 @@ langcode: en
 status: true
 dependencies:
   module:
-    - aws_cloud
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_network
 field_name: field_network
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ram.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ram.yml
index f7195f9f..67a215a3 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ram.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ram.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_ram
 field_name: field_ram
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_schedule.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_schedule.yml
index e2598eb4..ea1761a5 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_schedule.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_schedule.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_schedule
 field_name: field_schedule
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_security_group.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_security_group.yml
index abd3c294..d679b8bb 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_security_group.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_security_group.yml
@@ -2,8 +2,10 @@ langcode: en
 status: true
 dependencies:
   module:
-    - aws_cloud
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_security_group
 field_name: field_security_group
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ssh_key.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ssh_key.yml
index b1d88c78..d3a1b155 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ssh_key.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_ssh_key.yml
@@ -2,8 +2,10 @@ langcode: en
 status: true
 dependencies:
   module:
-    - aws_cloud
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_ssh_key
 field_name: field_ssh_key
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_subnet.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_subnet.yml
index 959939b2..3727815e 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_subnet.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_subnet.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_subnet
 field_name: field_subnet
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_tags.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_tags.yml
index e804d16e..14cd97f3 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_tags.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_tags.yml
@@ -2,8 +2,10 @@ langcode: en
 status: true
 dependencies:
   module:
-    - aws_cloud
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_tags
 field_name: field_tags
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_termination_protection.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_termination_protection.yml
index 7303bc44..f9d0892f 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_termination_protection.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_termination_protection.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_termination_protection
 field_name: field_termination_protection
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_test_only.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_test_only.yml
index 775b5eac..98a1c9b9 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_test_only.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_test_only.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_test_only
 field_name: field_test_only
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_user_data.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_user_data.yml
index 52b26cf1..8c46cd2e 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_user_data.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_user_data.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_user_data
 field_name: field_user_data
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_version.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_version.yml
index 5236ff62..107a0d94 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_version.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_version.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_version
 field_name: field_version
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_vpc.yml b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_vpc.yml
index c624c03d..3ccd812e 100644
--- a/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_vpc.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/install/field.storage.cloud_server_template.field_vpc.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - aws_cloud
 id: cloud_server_template.field_vpc
 field_name: field_vpc
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/aws_cloud/config/schema/aws_cloud.settings.schema.yml b/modules/cloud_service_providers/aws_cloud/config/schema/aws_cloud.settings.schema.yml
index 1f3b587f..6a20b6c5 100644
--- a/modules/cloud_service_providers/aws_cloud/config/schema/aws_cloud.settings.schema.yml
+++ b/modules/cloud_service_providers/aws_cloud/config/schema/aws_cloud.settings.schema.yml
@@ -107,5 +107,5 @@ aws_cloud.settings:
       type: integer
     aws_cloud_region_locations:
       type: ignore
-    aws_cloud_config_icon:
+    aws_cloud_cloud_config_icon:
       type: integer
diff --git a/modules/cloud_service_providers/aws_cloud/src/Form/Config/AwsCloudAdminSettings.php b/modules/cloud_service_providers/aws_cloud/src/Form/Config/AwsCloudAdminSettings.php
index 309df78f..7b191c6f 100644
--- a/modules/cloud_service_providers/aws_cloud/src/Form/Config/AwsCloudAdminSettings.php
+++ b/modules/cloud_service_providers/aws_cloud/src/Form/Config/AwsCloudAdminSettings.php
@@ -289,11 +289,11 @@ class AwsCloudAdminSettings extends ConfigFormBase {
       '#open' => TRUE,
     ];
 
-    $form['icon']['aws_cloud_config_icon'] = [
+    $form['icon']['aws_cloud_cloud_config_icon'] = [
       '#type' => 'managed_file',
       '#title' => $this->t('AWS Cloud Config Icon'),
       '#default_value' => [
-        'fids' => $config->get('aws_cloud_config_icon'),
+        'fids' => $config->get('aws_cloud_cloud_config_icon'),
       ],
       '#description' => $this->t('Upload the default image to represent Amazon EC2'),
       '#upload_location' => 'public://images/icons',
@@ -338,17 +338,17 @@ class AwsCloudAdminSettings extends ConfigFormBase {
         $views_settings[$key] = (boolean) $value;
       }
 
-      if ($key === 'aws_cloud_config_icon') {
-        $icon = $form_state->getValue('aws_cloud_config_icon');
+      if ($key === 'aws_cloud_cloud_config_icon') {
+        $icon = $form_state->getValue('aws_cloud_cloud_config_icon');
         $file = File::load($icon[0]);
         // Save the icon.
         if (!empty($file)) {
           $file->setPermanent();
           $file->save();
-          $config->set('aws_cloud_config_icon', $icon[0]);
+          $config->set('aws_cloud_cloud_config_icon', $icon[0]);
         }
         else {
-          $config->set('aws_cloud_config_icon', '');
+          $config->set('aws_cloud_cloud_config_icon', '');
         }
         continue;
       }
diff --git a/modules/cloud_service_providers/aws_cloud/tests/src/Functional/Module/AwsCloudInstallUninstallTest.php b/modules/cloud_service_providers/aws_cloud/tests/src/Functional/Module/AwsCloudInstallUninstallTest.php
new file mode 100644
index 00000000..ca74f31c
--- /dev/null
+++ b/modules/cloud_service_providers/aws_cloud/tests/src/Functional/Module/AwsCloudInstallUninstallTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\Tests\aws_cloud\Functional\Module;
+
+use Drupal\Tests\cloud\Functional\Module\CloudModuleTestBase;
+
+/**
+ * Tests install / uninstall module(s) and confirm table creation/deletion.
+ *
+ * @group AWS Cloud
+ */
+class AwsCloudInstallUninstallTest extends CloudModuleTestBase {
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   */
+  public function testInstallUninstall() : void {
+    $this->repeatAssertInstallUninstallModules(['aws_cloud']);
+  }
+
+}
diff --git a/modules/cloud_service_providers/k8s/config/install/cloud.cloud_config_type.k8s.yml b/modules/cloud_service_providers/k8s/config/install/cloud.cloud_config_type.k8s.yml
index 3ce8791b..cf692f88 100644
--- a/modules/cloud_service_providers/k8s/config/install/cloud.cloud_config_type.k8s.yml
+++ b/modules/cloud_service_providers/k8s/config/install/cloud.cloud_config_type.k8s.yml
@@ -1,5 +1,10 @@
 langcode: en
 status: true
-dependencies: {  }
+dependencies:
+  module:
+    - cloud
+  enforced:
+    module:
+      - k8s
 id: k8s
-label: K8s
+label: 'K8s'
diff --git a/modules/cloud_service_providers/k8s/config/install/cloud.cloud_server_template_type.k8s.yml b/modules/cloud_service_providers/k8s/config/install/cloud.cloud_server_template_type.k8s.yml
index f4ffce80..cf692f88 100644
--- a/modules/cloud_service_providers/k8s/config/install/cloud.cloud_server_template_type.k8s.yml
+++ b/modules/cloud_service_providers/k8s/config/install/cloud.cloud_server_template_type.k8s.yml
@@ -2,7 +2,7 @@ langcode: en
 status: true
 dependencies:
   module:
-    - k8s
+    - cloud
   enforced:
     module:
       - k8s
diff --git a/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_config.k8s.default.yml b/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_config.k8s.default.yml
index 7026cb98..79b5e898 100644
--- a/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_config.k8s.default.yml
+++ b/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_config.k8s.default.yml
@@ -12,10 +12,11 @@ dependencies:
     - field.field.cloud_config.k8s.field_token
     - image.style.thumbnail
   module:
+    - cloud
     - image
   enforced:
     module:
-    - image  
+      - k8s
 id: cloud_config.k8s.default
 targetEntityType: cloud_config
 bundle: k8s
diff --git a/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_server_template.k8s.default.yml b/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_server_template.k8s.default.yml
index 5d6c4b5f..856a74ec 100644
--- a/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_server_template.k8s.default.yml
+++ b/modules/cloud_service_providers/k8s/config/install/core.entity_form_display.cloud_server_template.k8s.default.yml
@@ -12,6 +12,11 @@ dependencies:
     - field.field.cloud_server_template.k8s.field_object
     - field.field.cloud_server_template.k8s.field_source_type
     - field.field.cloud_server_template.k8s.field_yaml_url
+  module:
+    - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.k8s.default
 targetEntityType: cloud_server_template
 bundle: k8s
diff --git a/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_config.k8s.default.yml b/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_config.k8s.default.yml
index f3ff0ae4..1e166fec 100644
--- a/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_config.k8s.default.yml
+++ b/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_config.k8s.default.yml
@@ -17,9 +17,7 @@ dependencies:
     - user
   enforced:
     module:
-    - cloud
-    - options
-    - user  
+      - k8s
 id: cloud_config.k8s.default
 targetEntityType: cloud_config
 bundle: k8s
diff --git a/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_server_template.k8s.default.yml b/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_server_template.k8s.default.yml
index 533994c3..d7b058ba 100644
--- a/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_server_template.k8s.default.yml
+++ b/modules/cloud_service_providers/k8s/config/install/core.entity_view_display.cloud_server_template.k8s.default.yml
@@ -14,8 +14,9 @@ dependencies:
     - field.field.cloud_server_template.k8s.field_yaml_url
   module:
     - cloud
-    - options
-    - user
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.k8s.default
 targetEntityType: cloud_server_template
 bundle: k8s
diff --git a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_config.k8s.field_tags.yml b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_config.k8s.field_tags.yml
index dd30cef0..1266008d 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_config.k8s.field_tags.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_config.k8s.field_tags.yml
@@ -5,6 +5,11 @@ dependencies:
     - cloud.cloud_config_type.k8s
     - field.storage.cloud_config.field_tags
     - taxonomy.vocabulary.k8s_tags
+  module:
+    - taxonomy
+  enforced:
+    module:
+      - k8s
 id: cloud_config.k8s.field_tags
 field_name: field_tags
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_launch_resources.yml b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_launch_resources.yml
index 50d781b3..8097e737 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_launch_resources.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_launch_resources.yml
@@ -4,8 +4,6 @@ dependencies:
   config:
     - cloud.cloud_server_template_type.k8s
     - field.storage.cloud_server_template.field_launch_resources
-  module:
-    - cloud
 id: cloud_server_template.k8s.field_launch_resources
 field_name: field_launch_resources
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_namespace.yml b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_namespace.yml
index a0d47d0b..ee3c34f6 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_namespace.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_namespace.yml
@@ -8,7 +8,7 @@ dependencies:
     - options
   enforced:
     module:
-    - options  
+      - k8s
 id: cloud_server_template.k8s.field_namespace
 field_name: field_namespace
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_object.yml b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_object.yml
index d0db9046..bc0a6b0e 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_object.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_object.yml
@@ -8,7 +8,7 @@ dependencies:
     - options
   enforced:
     module:
-    - options  
+      - k8s
 id: cloud_server_template.k8s.field_object
 field_name: field_object
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_source_type.yml b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_source_type.yml
index 422bf7d0..c94b8e60 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_source_type.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_source_type.yml
@@ -6,6 +6,9 @@ dependencies:
     - field.storage.cloud_server_template.field_source_type
   module:
     - options
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.k8s.field_source_type
 field_name: field_source_type
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_yaml_url.yml b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_yaml_url.yml
index c291a4f8..f0b9f86c 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_yaml_url.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.field.cloud_server_template.k8s.field_yaml_url.yml
@@ -8,7 +8,7 @@ dependencies:
     - link
   enforced:
     module:
-    - link  
+      - k8s
 id: cloud_server_template.k8s.field_yaml_url
 field_name: field_yaml_url
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_api_server.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_api_server.yml
index 5088782d..0c64f476 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_api_server.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_api_server.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_config.field_api_server
 field_name: field_api_server
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_tags.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_tags.yml
index 09580e1b..9b7eabec 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_tags.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_tags.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - taxonomy
+  enforced:
+    module:
+      - k8s
 id: cloud_config.field_tags
 field_name: field_tags
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_token.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_token.yml
index c2ecebcd..d6073923 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_token.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_config.field_token.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_config.field_token
 field_name: field_token
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_detail.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_detail.yml
index c5eb590a..5a6ba532 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_detail.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_detail.yml
@@ -5,7 +5,7 @@ dependencies:
     - cloud
   enforced:
     module:
-    - k8s  
+      - k8s
 id: cloud_server_template.field_detail
 field_name: field_detail
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_password.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_password.yml
index fd3f3dd2..d0d0a918 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_password.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_password.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.field_git_password
 field_name: field_git_password
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_path.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_path.yml
index a775a009..c168956b 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_path.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_path.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.field_git_path
 field_name: field_git_path
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_username.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_username.yml
index adc62df3..9f503be5 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_username.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_git_username.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.field_git_username
 field_name: field_git_username
 entity_type: cloud_server_template
diff --git a/config/install/field.storage.cloud_server_template.field_launch_resources.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_launch_resources.yml
similarity index 91%
rename from config/install/field.storage.cloud_server_template.field_launch_resources.yml
rename to modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_launch_resources.yml
index b5d4c71a..c46ecbd5 100644
--- a/config/install/field.storage.cloud_server_template.field_launch_resources.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_launch_resources.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.field_launch_resources
 field_name: field_launch_resources
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_namespace.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_namespace.yml
index 1653555d..833c0246 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_namespace.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_namespace.yml
@@ -6,8 +6,7 @@ dependencies:
     - options
   enforced:
     module:
-    - k8s
-    - options  
+      - k8s
 id: cloud_server_template.field_namespace
 field_name: field_namespace
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_object.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_object.yml
index 2ac9e0df..c1331d9c 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_object.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_object.yml
@@ -6,8 +6,7 @@ dependencies:
     - options
   enforced:
     module:
-    - k8s
-    - options  
+      - k8s
 id: cloud_server_template.field_object
 field_name: field_object
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_source_type.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_source_type.yml
index 945b6156..6c898368 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_source_type.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_source_type.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - cloud
     - options
+  enforced:
+    module:
+      - k8s
 id: cloud_server_template.field_source_type
 field_name: field_source_type
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_yaml_url.yml b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_yaml_url.yml
index e8d9df3e..092fc6c0 100644
--- a/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_yaml_url.yml
+++ b/modules/cloud_service_providers/k8s/config/install/field.storage.cloud_server_template.field_yaml_url.yml
@@ -6,8 +6,7 @@ dependencies:
     - link
   enforced:
     module:
-    - k8s
-    - link  
+      - k8s
 id: cloud_server_template.field_yaml_url
 field_name: field_yaml_url
 entity_type: cloud_server_template
diff --git a/modules/cloud_service_providers/k8s/config/install/taxonomy.vocabulary.k8s_tags.yml b/modules/cloud_service_providers/k8s/config/install/taxonomy.vocabulary.k8s_tags.yml
index a498075d..c7d1b4a8 100644
--- a/modules/cloud_service_providers/k8s/config/install/taxonomy.vocabulary.k8s_tags.yml
+++ b/modules/cloud_service_providers/k8s/config/install/taxonomy.vocabulary.k8s_tags.yml
@@ -1,6 +1,11 @@
 langcode: en
 status: true
-dependencies: {  }
+dependencies:
+  module:
+    - cloud
+  enforced:
+    module:
+      - k8s
 name: 'K8s Tags'
 vid: k8s_tags
 description: ''
diff --git a/modules/cloud_service_providers/k8s/k8s.info.yml b/modules/cloud_service_providers/k8s/k8s.info.yml
index 81fc8965..3a9e0e50 100644
--- a/modules/cloud_service_providers/k8s/k8s.info.yml
+++ b/modules/cloud_service_providers/k8s/k8s.info.yml
@@ -1,10 +1,9 @@
-name: 'Kubernetes'
+name: 'K8s'
 description: 'Kubernetes (K8s) Implementation'
 package: Cloud service providers
 dependencies:
   - drupal:views
   - drupal:options
-  - drupal:user
   - drupal:link
   - drupal:taxonomy
   - cloud:cloud
diff --git a/modules/cloud_service_providers/k8s/k8s.install b/modules/cloud_service_providers/k8s/k8s.install
index 8d14cd10..153775e7 100644
--- a/modules/cloud_service_providers/k8s/k8s.install
+++ b/modules/cloud_service_providers/k8s/k8s.install
@@ -7,6 +7,8 @@
 
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\File\FileSystemInterface;
+use Drupal\Core\Config\FileStorage;
 
 /**
  * Implements hook_install().
@@ -24,6 +26,9 @@ function k8s_uninstall() {
   // Delete K8s cloud service provider entities.
   cloud_uninstall_service_provider('k8s');
 
+  // Delete default icon.
+  cloud_delete_default_icon('k8s');
+
   // Delete cloud config fields.
   // NOTE: field_location_* fields consists of two kinds of information
   // such as field.field.cloud_config.aws_cloud.field_location_* and
@@ -1571,8 +1576,23 @@ function k8s_update_8272() {
  */
 function k8s_update_8273() {
   // Add a new field and update entity cloud_server_template.k8s.
+  // Do nothing, move to 8274.
+}
+
+/**
+ * Add launch resources field to cloud_server_template.
+ */
+function k8s_update_8274() {
+  $config_path = realpath(drupal_get_path('module', 'k8s')) . '/config/install';
+  $source = new FileStorage($config_path);
+
+  // Obtain the storage manager for field termination protection bases
+  // Create a new field from the yaml configuration and save.
+  \Drupal::entityTypeManager()->getStorage('field_storage_config')
+    ->create($source->read('field.storage.cloud_server_template.field_launch_resources'))
+    ->save();
+
   $files = [
-    'field.field.cloud_server_template.k8s.field_launch_resources.yml',
     'core.entity_form_display.cloud_server_template.k8s.default.yml',
     'core.entity_view_display.cloud_server_template.k8s.default.yml',
   ];
@@ -1585,11 +1605,16 @@ function k8s_update_8273() {
 function k8s_update_dependencies() {
   $dependencies = [];
 
-  $dependencies['k8s'][8226] = [
-    'cloud' => 8122,
-  ];
-  $dependencies['k8s'][8273] = [
-    'cloud' => 8128,
+  $dependencies['k8s'] = [
+    8226 => [
+      'cloud' => 8122,
+    ],
+    8273 => [
+      'cloud' => 8128,
+    ],
+    8274 => [
+      'cloud' => 8130,
+    ],
   ];
 
   return $dependencies;
diff --git a/modules/cloud_service_providers/k8s/k8s.module b/modules/cloud_service_providers/k8s/k8s.module
index 4b8f53ec..a231eea8 100644
--- a/modules/cloud_service_providers/k8s/k8s.module
+++ b/modules/cloud_service_providers/k8s/k8s.module
@@ -19,6 +19,7 @@ use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Link;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\file\Entity\File;
@@ -29,6 +30,37 @@ use Drupal\k8s\Service\K8sService;
 use Drupal\k8s\Service\K8sServiceException;
 use Drupal\k8s\Entity\K8sEntityBase;
 
+/**
+ * Implements hook_help().
+ */
+function k8s_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.k8s':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('This module creates a user interface for managing Kubernetes (K8s).') . '</p>';
+      $output .= '<h3>' . t('Features') . '</h3>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('<strong>K8s</strong>');
+      $output .= '<ul>';
+      $output .= '<li>' . t('Manage K8s clusters.') . '</li>';
+      $output .= '<li>' . t('Manage most of K8s resources.') . '</li>';
+      $output .= '<li>' . t('Support multi-tenant like a K8s as a service.') . '</li>';
+      $output .= '<li>' . t('Support K8s clusters under fully closed (Internet unreachable) network.') . '</li>';
+      $output .= '</ul></li></ul>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('<strong>K8s Resources Optimization</strong>');
+      $output .= '<ul>';
+      $output .= '<li>' . t('Integrate w/ Amazon EC2 / EKS.') . '</li>';
+      $output .= '<li>' . t('Visualize costs on EKS.') . '</li>';
+      $output .= '<li>' . t('Schedule and manage K8s resource allocation based on entire resource utilization.') . '</li>';
+      $output .= '<li>' . t('Support resource deployment under multi-cluster environment.') . '</li>';
+      $output .= '</ul></li></ul>';
+      $output .= '<p>' . t('For more information, see the <a href=":cloud_documentation">online documentation for the K8s module</a>.', [':cloud_documentation' => 'https://www.drupal.org/docs/8/modules/cloud']) . '</p>';
+
+      return $output;
+  }
+}
+
 /**
  * Implements hook_cloud_config_update().
  */
diff --git a/modules/cloud_service_providers/k8s/tests/src/Functional/Module/K8sInstallUninstallTest.php b/modules/cloud_service_providers/k8s/tests/src/Functional/Module/K8sInstallUninstallTest.php
new file mode 100644
index 00000000..fbf81015
--- /dev/null
+++ b/modules/cloud_service_providers/k8s/tests/src/Functional/Module/K8sInstallUninstallTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\Tests\k8s\Functional\Module;
+
+use Drupal\Tests\cloud\Functional\Module\CloudModuleTestBase;
+
+/**
+ * Tests install / uninstall module(s) and confirm table creation/deletion.
+ *
+ * @group K8s
+ */
+class K8sInstallUninstallTest extends CloudModuleTestBase {
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   */
+  public function testInstallUninstall() : void {
+    $this->repeatAssertInstallUninstallModules(['k8s']);
+  }
+
+}
diff --git a/modules/cloud_service_providers/openstack/config/install/cloud.cloud_config_type.openstack.yml b/modules/cloud_service_providers/openstack/config/install/cloud.cloud_config_type.openstack.yml
index d61a838c..c58bb063 100644
--- a/modules/cloud_service_providers/openstack/config/install/cloud.cloud_config_type.openstack.yml
+++ b/modules/cloud_service_providers/openstack/config/install/cloud.cloud_config_type.openstack.yml
@@ -1,5 +1,10 @@
 langcode: en
 status: true
-dependencies: {  }
+dependencies:
+  module:
+    - cloud
+  enforced:
+    module:
+      - openstack
 id: openstack
 label: OpenStack
diff --git a/modules/cloud_service_providers/openstack/config/install/core.entity_form_display.cloud_config.openstack.default.yml b/modules/cloud_service_providers/openstack/config/install/core.entity_form_display.cloud_config.openstack.default.yml
index 427e956f..1c59fa0f 100644
--- a/modules/cloud_service_providers/openstack/config/install/core.entity_form_display.cloud_config.openstack.default.yml
+++ b/modules/cloud_service_providers/openstack/config/install/core.entity_form_display.cloud_config.openstack.default.yml
@@ -12,6 +12,11 @@ dependencies:
     - field.field.cloud_config.openstack.field_location_longitude
     - field.field.cloud_config.openstack.field_os_region
     - field.field.cloud_config.openstack.field_secret_key
+  module:
+    - cloud
+  enforced:
+    module:
+      - openstack
 id: cloud_config.openstack.default
 targetEntityType: cloud_config
 bundle: openstack
diff --git a/modules/cloud_service_providers/openstack/config/install/core.entity_view_display.cloud_config.openstack.default.yml b/modules/cloud_service_providers/openstack/config/install/core.entity_view_display.cloud_config.openstack.default.yml
index 66dfd308..904dfb10 100644
--- a/modules/cloud_service_providers/openstack/config/install/core.entity_view_display.cloud_config.openstack.default.yml
+++ b/modules/cloud_service_providers/openstack/config/install/core.entity_view_display.cloud_config.openstack.default.yml
@@ -13,7 +13,11 @@ dependencies:
     - field.field.cloud_config.openstack.field_os_region
     - field.field.cloud_config.openstack.field_secret_key
   module:
+    - cloud
     - user
+  enforced:
+    module:
+      - openstack
 id: cloud_config.openstack.default
 targetEntityType: cloud_config
 bundle: openstack
diff --git a/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_api_endpoint.yml b/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_api_endpoint.yml
index b5f110f1..4ab561e1 100644
--- a/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_api_endpoint.yml
+++ b/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_api_endpoint.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - openstack
 id: cloud_config.field_api_endpoint
 field_name: field_api_endpoint
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_os_region.yml b/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_os_region.yml
index 4fa688ce..6c6ce0b3 100644
--- a/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_os_region.yml
+++ b/modules/cloud_service_providers/openstack/config/install/field.storage.cloud_config.field_os_region.yml
@@ -3,6 +3,9 @@ status: true
 dependencies:
   module:
     - cloud
+  enforced:
+    module:
+      - openstack
 id: cloud_config.field_os_region
 field_name: field_os_region
 entity_type: cloud_config
diff --git a/modules/cloud_service_providers/openstack/openstack.info.yml b/modules/cloud_service_providers/openstack/openstack.info.yml
index 310820b0..49817f5b 100644
--- a/modules/cloud_service_providers/openstack/openstack.info.yml
+++ b/modules/cloud_service_providers/openstack/openstack.info.yml
@@ -2,7 +2,7 @@ name: 'OpenStack'
 description: 'OpenStack implementation for cloud module'
 package: Cloud service providers
 dependencies:
-  - cloud:aws_cloud
+  - aws_cloud
 type: module
 core: '8.x'
 configure: openstack.settings
diff --git a/modules/cloud_service_providers/openstack/openstack.install b/modules/cloud_service_providers/openstack/openstack.install
index fd1cf654..8db2df3b 100644
--- a/modules/cloud_service_providers/openstack/openstack.install
+++ b/modules/cloud_service_providers/openstack/openstack.install
@@ -23,6 +23,9 @@ function openstack_uninstall() {
   // Delete OpenStack cloud service provider entities.
   cloud_uninstall_service_provider('openstack');
 
+  // Delete default icon.
+  cloud_delete_default_icon('openstack');
+
   // Delete cloud config fields.
   // NOTE: field_location_* fields consists of two kinds of information
   // such as field.field.cloud_config.aws_cloud.field_location_* and
diff --git a/modules/cloud_service_providers/openstack/openstack.links.menu.yml b/modules/cloud_service_providers/openstack/openstack.links.menu.yml
index 21843f5d..499286cb 100644
--- a/modules/cloud_service_providers/openstack/openstack.links.menu.yml
+++ b/modules/cloud_service_providers/openstack/openstack.links.menu.yml
@@ -3,7 +3,7 @@ openstack.menu.cloud_context:
   weight: 100
 
 openstack_cloud.settings:
-  title: OpenStack Cloud settings
+  title: OpenStack settings
   description: 'List OpenStack profiles and configure views, scheduling, notifications, and costs.'
   parent: system.admin_config_services
   route_name: 'openstack_cloud.settings.options'
diff --git a/modules/cloud_service_providers/openstack/openstack.module b/modules/cloud_service_providers/openstack/openstack.module
index 5baafe51..b6ce14d8 100644
--- a/modules/cloud_service_providers/openstack/openstack.module
+++ b/modules/cloud_service_providers/openstack/openstack.module
@@ -8,6 +8,7 @@
  */
 
 use Drupal\cloud\Entity\CloudConfig;
+use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\Url;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
@@ -15,6 +16,26 @@ use Drupal\Core\File\FileSystemInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\file\Entity\File;
 
+/**
+ * Implements hook_help().
+ */
+function openstack_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.openstack':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('This module creates a user interface for managing OpenStack, which is depending on AWS Cloud (aws_cloud) module working with a Drupal service (EC2Service).') . '</p>';
+      $output .= '<h3>' . t('Features') . '</h3>';
+      $output .= '<ul>';
+      $output .= '<li>' . t('<strong>OpenStack</strong>');
+      $output .= '<ul>';
+      $output .= '<li>' . t('Manage OpenStack.') . '</li>';
+      $output .= '</ul></li></ul>';
+      $output .= '<p>' . t('For more information, see the <a href=":cloud_documentation">online documentation for the OpenStack module</a>.', [':cloud_documentation' => 'https://www.drupal.org/docs/8/modules/cloud']) . '</p>';
+
+      return $output;
+  }
+}
+
 /**
  * Implements hook_cron().
  */
diff --git a/modules/cloud_service_providers/openstack/tests/src/Functional/Module/OpenStackInstallUninstallTest.php b/modules/cloud_service_providers/openstack/tests/src/Functional/Module/OpenStackInstallUninstallTest.php
new file mode 100644
index 00000000..f5621df2
--- /dev/null
+++ b/modules/cloud_service_providers/openstack/tests/src/Functional/Module/OpenStackInstallUninstallTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\Tests\openstack\Functional\Module;
+
+use Drupal\Tests\cloud\Functional\Module\CloudModuleTestBase;
+
+/**
+ * Tests install / uninstall module(s) and confirm table creation/deletion.
+ *
+ * @group OpenStack
+ */
+class OpenStackInstallUninstallTest extends CloudModuleTestBase {
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   */
+  public function testInstallUninstall() : void {
+    $this->repeatAssertInstallUninstallModules(['openstack']);
+  }
+
+}
diff --git a/src/Plugin/cloud/server_template/CloudServerTemplatePluginUninstallValidator.php b/src/Plugin/cloud/server_template/CloudServerTemplatePluginUninstallValidator.php
index 9670faed..6c79aa21 100644
--- a/src/Plugin/cloud/server_template/CloudServerTemplatePluginUninstallValidator.php
+++ b/src/Plugin/cloud/server_template/CloudServerTemplatePluginUninstallValidator.php
@@ -44,6 +44,13 @@ class CloudServerTemplatePluginUninstallValidator implements ModuleUninstallVali
 
     field_purge_batch(10000);
 
+    // @TODO: As long as CloudServerTemplateType for each bundl is deleted by
+    // Drupal core, we don't have to handle UninstallValidator, therefore this
+    // function returns an empty array [].
+    if (TRUE) {
+      return [];
+    }
+
     // First, check if there are entities related to $module.
     $entity_types = $this->entityTypeManager->getDefinitions();
     foreach ($entity_types ?: [] as $entity_type) {
diff --git a/tests/src/Functional/Module/CloudInstallUninstallTest.php b/tests/src/Functional/Module/CloudInstallUninstallTest.php
new file mode 100644
index 00000000..829fd10c
--- /dev/null
+++ b/tests/src/Functional/Module/CloudInstallUninstallTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Drupal\Tests\cloud\Functional\Module;
+
+/**
+ * Tests install / uninstall module(s) and confirm table creation/deletion.
+ *
+ * @group Cloud
+ */
+class CloudInstallUninstallTest extends CloudModuleTestBase {
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   */
+  public function testInstallUninstall() : void {
+    $this->repeatAssertInstallUninstallModules(['cloud']);
+  }
+
+}
diff --git a/tests/src/Functional/Module/CloudModuleTestBase.php b/tests/src/Functional/Module/CloudModuleTestBase.php
new file mode 100644
index 00000000..0e52a083
--- /dev/null
+++ b/tests/src/Functional/Module/CloudModuleTestBase.php
@@ -0,0 +1,336 @@
+<?php
+
+namespace Drupal\Tests\cloud\Functional\Module;
+
+use Drupal\Component\Render\FormattableMarkup;
+use Drupal\Core\Logger\RfcLogLevel;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\Tests\system\Functional\Module\ModuleTestBase;
+
+/**
+ * Tests install / uninstall module(s) and confirm table creation/deletion.
+ */
+abstract class CloudModuleTestBase extends ModuleTestBase {
+
+  use StringTranslationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'claro';
+
+  /**
+   * Repeat install / uninstall for a test case.
+   */
+  public const CLOUD_MODULE_INSTALL_UNINSTALL_REPEAT_COUNT = 1;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['dblog'];
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $excludedModules = ['filter'];
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   */
+  abstract public function testInstallUninstall() : void;
+
+  /**
+   * Tests that a fixed set of modules can be installed and uninstalled.
+   *
+   * @param array $modules
+   *   The module names to test install and uninstall.
+   * @param int $max_count
+   *   Max test repeating count.
+   */
+  protected function repeatAssertInstallUninstallModules(array $modules = ['cloud'], $max_count = self::CLOUD_MODULE_INSTALL_UNINSTALL_REPEAT_COUNT) : void {
+    for ($i = 0; $i < $max_count; $i++) {
+      // Install and uninstall $module.
+      $this->assertTestInstallUninstallModules($modules);
+    }
+  }
+
+  /**
+   * Repeating test cloud service provider redirect.
+   *
+   * @param array $modules
+   *   The module names to test install and uninstall.
+   */
+  protected function assertTestInstallUninstallModules(array $modules) : void {
+
+    $all_modules = $this->container->get('extension.list.module')->getList();
+
+    // Test help on required modules, but do not test uninstalling.
+    $required_modules = array_filter($all_modules, static function ($module) {
+      if (!empty($module->info['required']) || $module->status === TRUE) {
+        if ($module->info['package'] !== 'Testing' && empty($module->info['hidden'])) {
+          return TRUE;
+        }
+      }
+      return FALSE;
+    });
+
+    $required_modules['help'] = $all_modules['help'];
+
+    // Test uninstalling without hidden, required, and already enabled modules.
+    $all_modules = array_filter($all_modules, static function ($module) {
+      return !(!empty($module->info['hidden'])
+        || !empty($module->info['required'])
+        || $module->status === TRUE
+        || $module->info['package'] === 'Testing');
+    });
+
+    // Install the Help module, and verify it installed successfully.
+    unset($all_modules['help']);
+    $this->assertModuleNotInstalled('help');
+    $edit = [];
+    $edit['modules[help][enable]'] = TRUE;
+    $this->drupalPostForm('admin/modules', $edit, $this->t('Install'));
+    $this->assertText('has been enabled');
+    $this->assertModuleSuccessfullyInstalled('help');
+
+    // Test help for the required modules.
+    foreach ($required_modules ?: [] as $name => $module) {
+      $this->assertHelp($name, $module->info['name']);
+    }
+
+    // Go through each module in the list and try to install and uninstall
+    // it with its dependencies.
+    foreach ($all_modules ?: [] as $name => $module) {
+
+      $was_installed_list = \Drupal::moduleHandler()->getModuleList();
+
+      // Skip if $name is not a target module to validate.
+      foreach ($modules ?: [] as $module_name) {
+        if ($name !== $module_name) {
+          continue 2;
+        }
+      }
+
+      // Start a list of modules that we expect to be installed this time.
+      $modules_to_install = [$name];
+      foreach (array_keys($module->requires) ?: [] as $dependency) {
+        if (!empty($all_modules[$dependency])) {
+          $modules_to_install[] = $dependency;
+        }
+      }
+
+      // Check that each module is not yet enabled and does not have any
+      // database tables yet.
+      foreach ($modules_to_install ?: [] as $module_to_install) {
+        $this->assertModuleNotInstalled($module_to_install);
+      }
+
+      // Install the module.
+      $edit = [];
+      $package = $module->info['package'];
+      $edit["modules[${name}][enable]"] = TRUE;
+      $this->drupalPostForm('admin/modules', $edit, $this->t('Install'));
+
+      // Handle experimental modules, which require a confirmation screen.
+      if ($package === 'Core (Experimental)') {
+        $this->assertText('Are you sure you wish to enable experimental modules?');
+        if (count($modules_to_install) > 1) {
+          // When there are experimental modules, needed dependencies do not
+          // result in the same page title, but there will be expected text
+          // indicating they need to be enabled.
+          $this->assertText('You must enable');
+        }
+        $this->drupalPostForm(NULL, [], $this->t('Continue'));
+      }
+      // Handle the case where modules were installed along with this one and
+      // where we therefore hit a confirmation screen.
+      elseif (count($modules_to_install) > 1) {
+        // Verify that we are on the correct form and that the expected text
+        // about enabling dependencies appears.
+        $this->assertText('Some required modules must be enabled');
+        $this->assertText('You must enable');
+        $this->drupalPostForm(NULL, [], $this->t('Continue'));
+      }
+
+      // List the module display names to check the confirmation message.
+      $module_names = [];
+      foreach ($modules_to_install ?: [] as $module_to_install) {
+        $module_names[] = $all_modules[$module_to_install]->info['name'];
+      }
+      $expected_text = \Drupal::translation()->formatPlural(count($module_names), 'Module @name has been enabled.', '@count modules have been enabled: @names.', [
+        '@name' => $module_names[0],
+        '@names' => implode(', ', $module_names),
+      ]);
+      $this->assertSession()->pageTextContains($expected_text);
+
+      // Check that hook_modules_installed() was invoked with the expected list
+      // of modules, that each module's database tables now exist, and that
+      // appropriate messages appear in the logs.
+      foreach ($modules_to_install ?: [] as $module_to_install) {
+        $this->assertLogMessage('system', '%module module installed.', ['%module' => $module_to_install], RfcLogLevel::INFO);
+        $this->assertModuleSuccessfullyInstalled($module_to_install);
+      }
+
+      // Verify the help page.
+      $this->assertHelp($name, $module->info['name']);
+      $now_installed_list = \Drupal::moduleHandler()->getModuleList();
+      $added_modules = array_diff(array_keys($now_installed_list), array_keys($was_installed_list));
+      // Remove filter module since it is disabled and cannot be uninstalled.
+      $added_modules = array_diff($added_modules, self::$excludedModules);
+      while ($added_modules) {
+        $initial_count = count($added_modules);
+        foreach ($added_modules ?: [] as $to_uninstall) {
+          // See if we can currently uninstall this module (if its dependencies
+          // have been uninstalled), and do so if we can.
+          $this->drupalGet('admin/modules/uninstall');
+          $field_name = "uninstall[$to_uninstall]";
+          $has_checkbox = $this->xpath('//input[@type="checkbox" and @name="' . $field_name . '"]');
+          $disabled = $this->xpath('//input[@type="checkbox" and @name="' . $field_name . '" and @disabled="disabled"]');
+
+          if (!empty($has_checkbox) && empty($disabled)) {
+            // This one is eligible for being uninstalled.
+            $package = $all_modules[$to_uninstall]->info['package'];
+            $this->assertSuccessfulUninstall($to_uninstall, $package);
+            $added_modules = array_diff($added_modules, [$to_uninstall]);
+          }
+        }
+
+        // If we were not able to find a module to uninstall, fail and exit the
+        // loop.
+        $final_count = count($added_modules);
+        if ($initial_count === $final_count) {
+          $this->fail('Remaining modules could not be uninstalled for ' . $name);
+          break;
+        }
+      }
+    }
+
+    // Uninstall the help module and put it back into the list of modules.
+    $all_modules['help'] = $required_modules['help'];
+    $this->assertSuccessfulUninstall('help', $required_modules['help']->info['package']);
+
+    // Now that all modules have been tested, go back and try to enable them
+    // all again at once. This tests two things:
+    // - That each module can be successfully enabled again after being
+    //   uninstalled.
+    // - That enabling more than one module at the same time does not lead to
+    //   any errors.
+    // Currently some module cuases the error, so skip this assertion.
+    // See also:
+    // https://www.drupal.org/project/drupal/issues/3016131
+    if (FALSE) {
+      $this->assertEnableAllModules($all_modules);
+    }
+  }
+
+  /**
+   * Asserts that all module can be enabled.
+   *
+   * @param array $all_modules
+   *   Name of the module to check.
+   */
+  protected function assertEnableAllModules(array $all_modules) {
+
+    $edit = [];
+    $experimental = FALSE;
+    // Remove filter module since it is disabled and cannot be uninstalled.
+    foreach ($all_modules ?: [] as $name => $module) {
+      // Skip if $name is an excluded module name.
+      foreach (self::$excludedModules ?: [] as $module_name) {
+        if ($name === $module_name) {
+          continue 2;
+        }
+      }
+
+      $edit["modules[${name}][enable]"] = TRUE;
+      // Track whether there is at least one experimental module.
+      if ($module->info['package'] === 'Core (Experimental)') {
+        $experimental = TRUE;
+      }
+    }
+
+    $this->drupalPostForm('admin/modules', $edit, $this->t('Install'));
+
+    // If there are experimental modules, click the confirm form.
+    if ($experimental) {
+      $this->assertSession()->pageTextContains('Are you sure you wish to enable experimental modules?');
+      $this->drupalPostForm(NULL, [], $this->t('Continue'));
+    }
+    // The string tested here is translatable but we are only using a part of it
+    // so using a translated string is wrong. Doing so would create a new string
+    // to translate.
+    $this->assertSession()->pageTextContains(new FormattableMarkup('@count modules have been enabled: ', ['@count' => count($all_modules)]));
+  }
+
+  /**
+   * Asserts that a module is not yet installed.
+   *
+   * @param string $name
+   *   Name of the module to check.
+   */
+  protected function assertModuleNotInstalled($name) {
+    $this->assertModules([$name], FALSE);
+    // $this->assertModuleTablesDoNotExist($name);
+  }
+
+  /**
+   * Asserts that a module was successfully installed.
+   *
+   * @param string $name
+   *   Name of the module to check.
+   */
+  protected function assertModuleSuccessfullyInstalled($name) {
+    $this->assertModules([$name], TRUE);
+    $this->assertModuleTablesExist($name);
+    $this->assertModuleConfig($name);
+  }
+
+  /**
+   * Uninstalls a module and asserts that it was done correctly.
+   *
+   * @param string $module
+   *   The name of the module to uninstall.
+   * @param string $package
+   *   (optional) The package of the module to uninstall. Defaults
+   *   to 'Core'.
+   */
+  protected function assertSuccessfulUninstall($module, $package = 'Core') : void {
+    $edit = [];
+    $edit["uninstall[${module}]"] = TRUE;
+    $this->drupalPostForm('admin/modules/uninstall', $edit, $this->t('Uninstall'));
+    $this->drupalPostForm(NULL, NULL, $this->t('Uninstall'));
+    $this->assertSession()->pageTextContains(t('The selected modules have been uninstalled.'));
+    $this->assertModules([$module], FALSE);
+
+    // Check that the appropriate hook was fired and the appropriate log
+    // message appears. (But don't check for the log message if the dblog
+    // module was just uninstalled, since the {watchdog} table won't be there
+    // anymore.)
+    $this->assertLogMessage('system', '%module module uninstalled.', ['%module' => $module], RfcLogLevel::INFO);
+
+    // Check that the module's database tabless no longer exist.
+    $this->assertModuleTablesDoNotExist($module);
+    // Check that the module's config files no longer exist.
+    $this->assertNoModuleConfig($module);
+  }
+
+  /**
+   * Verifies a module's help.
+   *
+   * Verifies that the module help page from hook_help() exists and can be
+   * displayed, and that it contains the phrase "Foo Bar module", where "Foo
+   * Bar" is the name of the module from the .info.yml file.
+   *
+   * @param string $module
+   *   Machine name of the module to verify.
+   * @param string $name
+   *   Human-readable name of the module to verify.
+   */
+  protected function assertHelp($module, $name) : void {
+    $this->drupalGet('admin/help/' . $module);
+    $this->assertSession()->statusCodeEquals(200);
+    $this->assertSession()->pageTextContains($name . ' module');
+    $this->assertSession()->linkExists("online documentation for the ${name} module");
+  }
+
+}
