diff --git a/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/AwsCloudContentForm.php b/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/AwsCloudContentForm.php
index ed6e1493e81f4347c21431135fb5093c8aa31773..3eb9be2f44c5c39111be365c16c8b0fcd5601bf1 100644
--- a/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/AwsCloudContentForm.php
+++ b/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/AwsCloudContentForm.php
@@ -347,6 +347,10 @@ class AwsCloudContentForm extends CloudContentForm {
       ];
     }
 
+    if (!method_exists($this->ec2Service, 'createTags')) {
+      return;
+    }
+
     // Create Tags with different parameters for AWS and OpenStack.
     if (preg_match('[^aws_cloud]', $this->entity->getEntityTypeId()) === 1) {
       $this->ec2Service->createTags([
diff --git a/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageCreateForm.php b/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageCreateForm.php
index 217c0c1b272714e29c8c8d82170c6eb6d9e7d101..9f92f2089e65f79df3257d8309b1cfd1a4a0e6eb 100644
--- a/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageCreateForm.php
+++ b/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageCreateForm.php
@@ -92,10 +92,12 @@ class ImageCreateForm extends AwsCloudContentForm {
       'InstanceId'  => $entity->getInstanceId(),
       'Name'        => $entity->getName(),
       'Description' => $entity->getDescription(),
+      'Visibility'  => $entity->getVisibility(),
     ]);
 
     $this->cloudConfigPluginManager->setCloudContext($entity->getCloudContext());
     $account_id = $this->cloudConfigPluginManager->loadConfigEntity()->get('field_account_id')->value;
+
     if (!empty($entity) && !empty($result['ImageId'])
       && ($entity->setName($form_state->getValue('name')))
       && ($entity->set('ami_name', $form_state->getValue('name')))
diff --git a/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageEditForm.php b/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageEditForm.php
index 4d4945bf5c93bdafd60b3ef5bb55785e7389331c..a84b6bf58f2c6058cb73bb13c3344643b45d18fb 100644
--- a/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageEditForm.php
+++ b/modules/cloud_service_providers/aws_cloud/src/Form/Ec2/ImageEditForm.php
@@ -281,6 +281,10 @@ class ImageEditForm extends AwsCloudContentForm {
     // Update image.
     $this->ec2Service->setCloudContext($entity->getCloudContext());
 
+    if (!method_exists($this->ec2Service, 'modifyImageAttribute')) {
+      return;
+    }
+
     // Update image description.
     $this->ec2Service->modifyImageAttribute([
       'ImageId' => $entity->getImageId(),
diff --git a/modules/cloud_service_providers/openstack/openstack.module b/modules/cloud_service_providers/openstack/openstack.module
index 75386c2d27c940d26b7b58694431a99d6f7095eb..d969d1722a2b821e5501476cdfb7c1a197e9cbb8 100644
--- a/modules/cloud_service_providers/openstack/openstack.module
+++ b/modules/cloud_service_providers/openstack/openstack.module
@@ -85,6 +85,7 @@ function openstack_update_resources(CloudConfig $cloud_config) {
   }
   else {
     $openstack_service->updateInstances();
+    $openstack_service->updateImages();
   }
 }
 
diff --git a/modules/cloud_service_providers/openstack/openstack.services.yml b/modules/cloud_service_providers/openstack/openstack.services.yml
index 3c64decad711e2153f0e7fbda23d1aefaee92e3c..1467f94b97374d62743460266c4f9a54e6ee2234 100644
--- a/modules/cloud_service_providers/openstack/openstack.services.yml
+++ b/modules/cloud_service_providers/openstack/openstack.services.yml
@@ -1,3 +1,6 @@
+parameters:
+  cloud_context: ''
+
 services:
   openstack.factory:
     class: Drupal\openstack\Service\OpenStackServiceFactory
diff --git a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageCreateForm.php b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageCreateForm.php
index a1127a5d367a8f22183268b81483616469905e53..31246d8b3f4a1eb203548873ace5b7f854b52e43 100644
--- a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageCreateForm.php
+++ b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageCreateForm.php
@@ -2,7 +2,24 @@
 
 namespace Drupal\openstack\Form;
 
+use Drupal\openstack\Service\Rest\OpenStackService as OpenStackRestService;
 use Drupal\aws_cloud\Form\Ec2\ImageCreateForm;
+use Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface;
+use Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface;
+use Drupal\cloud\Service\EntityLinkRendererInterface;
+use Drupal\Component\Datetime\TimeInterface;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Entity\EntityTypeManager;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Messenger\Messenger;
+use Drupal\Core\Plugin\CachedDiscoveryClearerInterface;
+use Drupal\Core\Render\Renderer;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\openstack\Service\OpenStackServiceFactoryInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -13,10 +30,94 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 class OpenStackImageCreateForm extends ImageCreateForm {
 
   /**
-   * {@inheritdoc}
+   * The OpenStack Service Factory.
+   *
+   * @var \Drupal\openstack\Service\OpenStackServiceFactoryInterface
+   */
+  protected $openStackServiceFactory;
+
+  /**
+   * OpenStackImageCreateForm constructor.
+   *
+   * @param \Drupal\openstack\Service\OpenStackServiceFactoryInterface $openstack_service_factory
+   *   Object for interfacing with OpenStack Service.
+   * @param \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service
+   *   The AWS Cloud or OpenStack EC2 Service.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository service.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle service.
+   * @param \Drupal\Component\Datetime\TimeInterface $time
+   *   The time service.
+   * @param \Drupal\Core\Messenger\Messenger $messenger
+   *   The Messenger Service.
+   * @param \Drupal\cloud\Service\EntityLinkRendererInterface $entity_link_renderer
+   *   The entity link render service.
+   * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
+   *   The Entity Type Manager.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cacheRender
+   *   A cache backend interface instance.
+   * @param \Drupal\Core\Plugin\CachedDiscoveryClearerInterface $plugin_cache_clearer
+   *   A plugin cache clear instance.
+   * @param \Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface $cloud_config_plugin_manager
+   *   The cloud service provider plugin manager (CloudConfigPluginManager).
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The current user.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The route match.
+   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
+   *   The date formatter.
+   * @param \Drupal\Core\Render\Renderer $renderer
+   *   The general renderer.
+   */
+  public function __construct(OpenStackServiceFactoryInterface $openstack_service_factory,
+                              Ec2ServiceInterface $ec2_service,
+                              EntityRepositoryInterface $entity_repository,
+                              EntityTypeBundleInfoInterface $entity_type_bundle_info,
+                              TimeInterface $time,
+                              Messenger $messenger,
+                              EntityLinkRendererInterface $entity_link_renderer,
+                              EntityTypeManager $entity_type_manager,
+                              CacheBackendInterface $cacheRender,
+                              CachedDiscoveryClearerInterface $plugin_cache_clearer,
+                              CloudConfigPluginManagerInterface $cloud_config_plugin_manager,
+                              AccountInterface $current_user,
+                              RouteMatchInterface $route_match,
+                              DateFormatterInterface $date_formatter,
+                              Renderer $renderer) {
+
+    parent::__construct(
+      $ec2_service,
+      $entity_repository,
+      $entity_type_bundle_info,
+      $time,
+      $messenger,
+      $entity_link_renderer,
+      $entity_type_manager,
+      $cacheRender,
+      $plugin_cache_clearer,
+      $cloud_config_plugin_manager,
+      $current_user,
+      $route_match,
+      $date_formatter,
+      $renderer
+    );
+
+    $this->openStackServiceFactory = $openstack_service_factory;
+  }
+
+  /**
+   * Dependency Injection.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   Instance of ContainerInterface.
+   *
+   * @return OpenStackImageCreateForm
+   *   return created object.
    */
   public static function create(ContainerInterface $container) {
     return new static(
+      $container->get('openstack.factory'),
       $container->get('openstack.ec2'),
       $container->get('entity.repository'),
       $container->get('entity_type.bundle.info'),
@@ -34,4 +135,68 @@ class OpenStackImageCreateForm extends ImageCreateForm {
     );
   }
 
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::buildForm().
+   *
+   * @param array $form
+   *   Array of form object.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   * @param string $cloud_context
+   *   A cloud_context string value from URL "path".
+   *
+   * @return array
+   *   Array of form object.
+   */
+  public function buildForm(array $form, FormStateInterface $form_state, $cloud_context = '') {
+
+    // Switch OpenStack EC2 or Rest service based on $cloud_context.
+    $this->ec2Service = $this->openStackServiceFactory->get($cloud_context);
+    $form = parent::buildForm($form, $form_state, $cloud_context);
+
+    // Custom buildForm logic for OpenStack REST API.
+    if ($this->ec2Service instanceof OpenStackRestService) {
+      $form['image']['launch_permission']['visibility_title'] = [
+        '#type'          => 'markup',
+        '#markup'        => '<b>Visibility: </b>',
+        '#prefix'        => '<div class="container-inline">',
+      ];
+
+      $form['image']['launch_permission']['visibility'] = [
+        '#type' => 'radios',
+        '#default_value' => '1',
+        '#options' => [
+          '0' => $this->t('Private'),
+          '1' => $this->t('Public'),
+        ],
+        '#suffix' => '</div>',
+      ];
+
+      $form['image']['instance_id']['#access'] = FALSE;
+      $form['image']['description']['#access'] = FALSE;
+      $form['image']['launch_permission_account_ids']['#access'] = FALSE;
+    }
+
+    return $form;
+  }
+
+  /**
+   * Submit handler.
+   *
+   * @param array $form
+   *   Array of form object.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return array
+   *   Array of form object.
+   */
+  public function save(array $form, FormStateInterface $form_state) {
+    $entity = $this->entity;
+    // Switch OpenStack EC2 or Rest service based on $entity->getCloudContext().
+    $this->ec2Service = $this->openStackServiceFactory->get($entity->getCloudContext());
+
+    return parent::save($form, $form_state);
+  }
+
 }
diff --git a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteForm.php b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteForm.php
index 7ad3756dbaf597584b32312a94e1d3b8c6fceb2d..c12d6a44c5dcaca410b42bc4e62f5fc072dccb8d 100644
--- a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteForm.php
+++ b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteForm.php
@@ -3,6 +3,18 @@
 namespace Drupal\openstack\Form;
 
 use Drupal\aws_cloud\Form\Ec2\ImageDeleteForm;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface;
+use Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface;
+use Drupal\cloud\Service\EntityLinkRendererInterface;
+use Drupal\Component\Datetime\TimeInterface;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Entity\EntityTypeManager;
+use Drupal\Core\Messenger\Messenger;
+use Drupal\Core\Plugin\CachedDiscoveryClearerInterface;
+use Drupal\openstack\Service\OpenStackServiceFactoryInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -13,10 +25,77 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 class OpenStackImageDeleteForm extends ImageDeleteForm {
 
   /**
-   * {@inheritdoc}
+   * The OpenStack Service Factory.
+   *
+   * @var \Drupal\openstack\Service\OpenStackServiceFactoryInterface
+   */
+  protected $openStackServiceFactory;
+
+  /**
+   * OpenStackImageDeleteForm constructor.
+   *
+   * @param \Drupal\openstack\Service\OpenStackServiceFactoryInterface $openstack_service_factory
+   *   Object for interfacing with OpenStack Service.
+   * @param \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service
+   *   The AWS Cloud EC2 Service.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository service.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle service.
+   * @param \Drupal\Component\Datetime\TimeInterface $time
+   *   The time service.
+   * @param \Drupal\Core\Messenger\Messenger $messenger
+   *   The messenger service.
+   * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
+   *   The Entity Type Manager.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cacheRender
+   *   A cache backend interface instance.
+   * @param \Drupal\Core\Plugin\CachedDiscoveryClearerInterface $plugin_cache_clearer
+   *   A plugin cache clear instance.
+   * @param \Drupal\cloud\Service\EntityLinkRendererInterface $entity_link_renderer
+   *   The entity link render service.
+   * @param \Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface $cloud_config_plugin_manager
+   *   The cloud service provider plugin manager (CloudConfigPluginManager).
+   */
+  public function __construct(OpenStackServiceFactoryInterface $openstack_service_factory,
+                              Ec2ServiceInterface $ec2_service,
+                              EntityRepositoryInterface $entity_repository,
+                              EntityTypeBundleInfoInterface $entity_type_bundle_info,
+                              TimeInterface $time,
+                              Messenger $messenger,
+                              EntityTypeManager $entity_type_manager,
+                              CacheBackendInterface $cacheRender,
+                              CachedDiscoveryClearerInterface $plugin_cache_clearer,
+                              EntityLinkRendererInterface $entity_link_renderer,
+                              CloudConfigPluginManagerInterface $cloud_config_plugin_manager) {
+    parent::__construct(
+      $ec2_service,
+      $entity_repository,
+      $entity_type_bundle_info,
+      $time,
+      $messenger,
+      $entity_type_manager,
+      $cacheRender,
+      $plugin_cache_clearer,
+      $entity_link_renderer,
+      $cloud_config_plugin_manager
+    );
+
+    $this->openStackServiceFactory = $openstack_service_factory;
+  }
+
+  /**
+   * Dependency Injection.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   Instance of ContainerInterface.
+   *
+   * @return OpenStackImageDeleteForm
+   *   return created object.
    */
   public static function create(ContainerInterface $container) {
     return new static(
+      $container->get('openstack.factory'),
       $container->get('openstack.ec2'),
       $container->get('entity.repository'),
       $container->get('entity_type.bundle.info'),
@@ -30,4 +109,23 @@ class OpenStackImageDeleteForm extends ImageDeleteForm {
     );
   }
 
+  /**
+   * Submit handler.
+   *
+   * @param array $form
+   *   Array of form object.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return array
+   *   Array of form object.
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+
+    $entity = $this->entity;
+    // Switch OpenStack EC2 or Rest service based on $entity->getCloudContext().
+    $this->ec2Service = $this->openStackServiceFactory->get($entity->getCloudContext());
+    return parent::submitForm($form, $form_state);
+  }
+
 }
diff --git a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteMultipleForm.php b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteMultipleForm.php
index bd251b3c28d12c66b1539768c9b681c2b2dd88ea..70213aa03e85175b8e06d4da6dd32128f9f8062e 100644
--- a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteMultipleForm.php
+++ b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageDeleteMultipleForm.php
@@ -2,6 +2,14 @@
 
 namespace Drupal\openstack\Form;
 
+use Drupal\openstack\Service\OpenStackServiceFactoryInterface;
+use Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface;
+use Drupal\cloud\Entity\CloudContentEntityBase;
+use Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Messenger\MessengerInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\TempStore\PrivateTempStoreFactory;
 use Drupal\aws_cloud\Form\Ec2\ImageDeleteMultipleForm;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -11,11 +19,62 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 class OpenStackImageDeleteMultipleForm extends ImageDeleteMultipleForm {
 
   /**
-   * {@inheritdoc}
+   * The OpenStack Service Factory.
+   *
+   * @var \Drupal\openstack\Service\OpenStackServiceFactoryInterface
+   */
+  protected $openStackServiceFactory;
+
+  /**
+   * OpenStackImageDeleteMultipleForm constructor.
+   *
+   * @param \Drupal\openstack\Service\OpenStackServiceFactoryInterface $openstack_service_factory
+   *   Object for interfacing with OpenStack Service.
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The current user.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $temp_store_factory
+   *   The tempstore factory.
+   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
+   *   The messenger service.
+   * @param \Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface $cloud_config_plugin_manager
+   *   The cloud service provider plugin manager (CloudConfigPluginManager).
+   * @param \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service
+   *   The AWS Cloud EC2 Service.
+   */
+  public function __construct(OpenStackServiceFactoryInterface $openstack_service_factory,
+                              AccountInterface $current_user,
+                              EntityTypeManagerInterface $entity_type_manager,
+                              PrivateTempStoreFactory $temp_store_factory,
+                              MessengerInterface $messenger,
+                              CloudConfigPluginManagerInterface $cloud_config_plugin_manager,
+                              Ec2ServiceInterface $ec2_service) {
+    parent::__construct(
+      $current_user,
+      $entity_type_manager,
+      $temp_store_factory,
+      $messenger,
+      $cloud_config_plugin_manager,
+      $ec2_service
+    );
+
+    $this->openStackServiceFactory = $openstack_service_factory;
+  }
+
+  /**
+   * Dependency Injection.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   Instance of ContainerInterface.
+   *
+   * @return OpenStackImageDeleteMultipleForm
+   *   return created object.
    */
   public static function create(ContainerInterface $container) {
 
     return new static(
+      $container->get('openstack.factory'),
       $container->get('current_user'),
       $container->get('entity_type.manager'),
       $container->get('tempstore.private'),
@@ -26,4 +85,19 @@ class OpenStackImageDeleteMultipleForm extends ImageDeleteMultipleForm {
 
   }
 
+  /**
+   * Process a Cloud Resource.
+   *
+   * @param \Drupal\cloud\Entity\CloudContentEntityBase $entity
+   *   An entity object.
+   *
+   * @return bool
+   *   Succeeded or failed.
+   */
+  public function processCloudResource(CloudContentEntityBase $entity) {
+    // Switch OpenStack EC2 or Rest service based on $entity->getCloudContext().
+    $this->ec2Service = $this->openStackServiceFactory->get($entity->getCloudContext());
+    return parent::processCloudResource($entity);
+  }
+
 }
diff --git a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageEditForm.php b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageEditForm.php
index 182f2bce3e19d8081145d86e07e963935f580f93..adf73324e5558bb3717069c5b7efec90c79a1a2b 100644
--- a/modules/cloud_service_providers/openstack/src/Form/OpenStackImageEditForm.php
+++ b/modules/cloud_service_providers/openstack/src/Form/OpenStackImageEditForm.php
@@ -2,9 +2,25 @@
 
 namespace Drupal\openstack\Form;
 
+use Drupal\openstack\Service\Rest\OpenStackService as OpenStackRestService;
 use Drupal\aws_cloud\Form\Ec2\ImageEditForm;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface;
+use Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface;
+use Drupal\cloud\Service\EntityLinkRendererInterface;
+use Drupal\Component\Datetime\TimeInterface;
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Entity\EntityRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Entity\EntityTypeManager;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Messenger\Messenger;
+use Drupal\Core\Plugin\CachedDiscoveryClearerInterface;
+use Drupal\Core\Render\Renderer;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\openstack\Service\OpenStackServiceFactoryInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Form controller for the CloudScripting entity edit forms.
@@ -14,10 +30,94 @@ use Drupal\Core\Form\FormStateInterface;
 class OpenStackImageEditForm extends ImageEditForm {
 
   /**
-   * {@inheritdoc}
+   * The OpenStack Service Factory.
+   *
+   * @var \Drupal\openstack\Service\OpenStackServiceFactoryInterface
+   */
+  protected $openStackServiceFactory;
+
+  /**
+   * OpenStackImageEditForm constructor.
+   *
+   * @param \Drupal\openstack\Service\OpenStackServiceFactoryInterface $openstack_service_factory
+   *   Object for interfacing with OpenStack Service.
+   * @param \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service
+   *   The AWS Cloud or OpenStack EC2 Service.
+   * @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
+   *   The entity repository service.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle service.
+   * @param \Drupal\Component\Datetime\TimeInterface $time
+   *   The time service.
+   * @param \Drupal\Core\Messenger\Messenger $messenger
+   *   The Messenger Service.
+   * @param \Drupal\cloud\Service\EntityLinkRendererInterface $entity_link_renderer
+   *   The entity link render service.
+   * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
+   *   The Entity Type Manager.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cacheRender
+   *   A cache backend interface instance.
+   * @param \Drupal\Core\Plugin\CachedDiscoveryClearerInterface $plugin_cache_clearer
+   *   A plugin cache clear instance.
+   * @param \Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface $cloud_config_plugin_manager
+   *   The cloud service provider plugin manager (CloudConfigPluginManager).
+   * @param \Drupal\Core\Session\AccountInterface $current_user
+   *   The current user.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The route match.
+   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
+   *   The date formatter.
+   * @param \Drupal\Core\Render\Renderer $renderer
+   *   The general renderer.
+   */
+  public function __construct(OpenStackServiceFactoryInterface $openstack_service_factory,
+                              Ec2ServiceInterface $ec2_service,
+                              EntityRepositoryInterface $entity_repository,
+                              EntityTypeBundleInfoInterface $entity_type_bundle_info,
+                              TimeInterface $time,
+                              Messenger $messenger,
+                              EntityLinkRendererInterface $entity_link_renderer,
+                              EntityTypeManager $entity_type_manager,
+                              CacheBackendInterface $cacheRender,
+                              CachedDiscoveryClearerInterface $plugin_cache_clearer,
+                              CloudConfigPluginManagerInterface $cloud_config_plugin_manager,
+                              AccountInterface $current_user,
+                              RouteMatchInterface $route_match,
+                              DateFormatterInterface $date_formatter,
+                              Renderer $renderer) {
+
+    parent::__construct(
+      $ec2_service,
+      $entity_repository,
+      $entity_type_bundle_info,
+      $time,
+      $messenger,
+      $entity_link_renderer,
+      $entity_type_manager,
+      $cacheRender,
+      $plugin_cache_clearer,
+      $cloud_config_plugin_manager,
+      $current_user,
+      $route_match,
+      $date_formatter,
+      $renderer
+    );
+
+    $this->openStackServiceFactory = $openstack_service_factory;
+  }
+
+  /**
+   * Dependency Injection.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   Instance of ContainerInterface.
+   *
+   * @return OpenStackImageEditForm
+   *   return created object.
    */
   public static function create(ContainerInterface $container) {
     return new static(
+      $container->get('openstack.factory'),
       $container->get('openstack.ec2'),
       $container->get('entity.repository'),
       $container->get('entity_type.bundle.info'),
@@ -49,9 +149,33 @@ class OpenStackImageEditForm extends ImageEditForm {
    *   Array of form object.
    */
   public function buildForm(array $form, FormStateInterface $form_state, $cloud_context = '') {
+
+    // Switch OpenStack EC2 or Rest service based on $cloud_context.
+    $this->ec2Service = $this->openStackServiceFactory->get($cloud_context);
     /** @var \Drupal\openstack\Entity\OpenStackImage $entity */
     $form = parent::buildForm($form, $form_state, $cloud_context);
 
+    // Custom buildForm logic for OpenStack REST API.
+    if ($this->ec2Service instanceof OpenStackRestService) {
+      $form['image']['description']['#access'] = FALSE;
+
+      $form['image']['launch_permission']['visibility_title'] = [
+        '#type'          => 'markup',
+        '#markup'        => '<b>Visibility: </b>',
+        '#prefix'        => '<div class="container-inline">',
+      ];
+
+      $form['image']['launch_permission']['visibility'] = [
+        '#type' => 'radios',
+        '#default_value' => $this->entity->getVisibility(),
+        '#options' => [
+          '0' => $this->t('Private'),
+          '1' => $this->t('Public'),
+        ],
+        '#suffix' => '</div>',
+      ];
+    }
+
     // OpenStack compute doesn't use the launch permissions of AWS.
     unset(
       $form['launch_permission'],
@@ -62,4 +186,31 @@ class OpenStackImageEditForm extends ImageEditForm {
     return $form;
   }
 
+  /**
+   * Submit handler.
+   *
+   * @param array $form
+   *   Array of form object.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   */
+  public function save(array $form, FormStateInterface $form_state) {
+
+    $entity = $this->entity;
+    // Switch OpenStack EC2 or Rest service based on $entity->getCloudContext().
+    $this->ec2Service = $this->openStackServiceFactory->get($entity->getCloudContext());
+    parent::save($form, $form_state);
+
+    $visibility = !empty($entity->getVisibility()) ? 'public' : 'private';
+
+    // Update Image of OpenStack REST API.
+    if ($this->ec2Service instanceof OpenStackRestService) {
+      $result = $this->ec2Service->updateImage([
+        'ImageId' => $entity->getImageId(),
+        'Name' => $entity->getName(),
+        'Visibility' => $visibility,
+      ]);
+    }
+  }
+
 }
diff --git a/modules/cloud_service_providers/openstack/src/Service/Ec2/OpenStackService.php b/modules/cloud_service_providers/openstack/src/Service/Ec2/OpenStackService.php
index c04164845ec37668e5de5872a15acf154076093b..59118ec16e2b8d93eb7d33ac4a958ca8fb3b7be0 100644
--- a/modules/cloud_service_providers/openstack/src/Service/Ec2/OpenStackService.php
+++ b/modules/cloud_service_providers/openstack/src/Service/Ec2/OpenStackService.php
@@ -442,7 +442,7 @@ class OpenStackService extends Ec2Service implements OpenStackServiceInterface {
   public function updateImageEntities(array $params = [], $clear = TRUE, $entity_type = '', $cloud_context = '') {
     $updated = FALSE;
 
-    // Load all entities by cloud_context.
+    // Load all entities by $this->cloudContext.
     $image_entities = $this->entityTypeManager->getStorage($entity_type)->loadByProperties(
       ['cloud_context' => $this->cloudContext]
     );
diff --git a/modules/cloud_service_providers/openstack/src/Service/OpenStackServiceInterface.php b/modules/cloud_service_providers/openstack/src/Service/OpenStackServiceInterface.php
index 05246a78eb9b994c253527be8cd880a41d7825f2..118995d88b723e125cc065f72781dad76f1c67ae 100644
--- a/modules/cloud_service_providers/openstack/src/Service/OpenStackServiceInterface.php
+++ b/modules/cloud_service_providers/openstack/src/Service/OpenStackServiceInterface.php
@@ -37,6 +37,39 @@ interface OpenStackServiceInterface {
    */
   public function describeInstances(array $params = []);
 
+  /**
+   * Get Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image list API response.
+   */
+  public function describeImages(array $params = []);
+
+  /**
+   * Create Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image create API response.
+   */
+  public function createImage(array $params = []);
+
+  /**
+   * Delete Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image delete API response.
+   */
+  public function deregisterImage(array $params = []);
+
   /**
    * Call the API for updated entities and store them as Instance entities.
    *
@@ -67,6 +100,62 @@ interface OpenStackServiceInterface {
    */
   public function updateInstances(array $params = [], $clear = TRUE);
 
+  /**
+   * Update the OpenStackImages.
+   *
+   * @param array $params
+   *   Optional parameters array.
+   * @param bool $clear
+   *   TRUE to clear stale security groups.
+   *
+   * @return bool
+   *   indicates success so failure.
+   */
+  public function updateImages(array $params = [], $clear = TRUE);
+
+  /**
+   * Call the API for updated entities and store them as Image entities.
+   *
+   * @param array $params
+   *   Optional parameters array.
+   * @param bool $clear
+   *   TRUE to clear stale security groups.
+   * @param string $entity_type
+   *   Entity type string.
+   * @param string $cloud_context
+   *   Cloud context string.
+   *
+   * @return bool
+   *   indicates success so failure.
+   */
+  public function updateImageEntities(array $params = [], $clear = TRUE, $entity_type = '', $cloud_context = '');
+
+  /**
+   * Get Tag name.
+   *
+   * @param array $openstack_obj
+   *   The openstack object.
+   * @param string $default_value
+   *   The default value.
+   *
+   * @return string
+   *   Return name of corresponding resource.
+   */
+  public function getTagName(array $openstack_obj, $default_value);
+
+  /**
+   * Get UID tag value.
+   *
+   * @param array $tags_array
+   *   The tags array of API.
+   * @param string $entity_type_id
+   *   The entity type id.
+   *
+   * @return int
+   *   Return user id.
+   */
+  public function getUidTagValue(array $tags_array, $entity_type_id);
+
   /**
    * Method to clear all entities out of the system.
    */
diff --git a/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php b/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php
index 418353bf467a9d73091c7b6922f8381b071fe7ae..afbb59da66f4f8ded4451cb92d0f52848284465f 100644
--- a/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php
+++ b/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php
@@ -4,6 +4,7 @@ namespace Drupal\openstack\Service\Rest;
 
 use Drupal\openstack\Service\OpenStackBatchOperations;
 use Drupal\openstack\Service\OpenStackServiceInterface;
+use Drupal\aws_cloud\Entity\Ec2\AwsCloudEntityInterface;
 use Drupal\cloud\Entity\CloudConfigInterface;
 use Drupal\cloud\Plugin\cloud\config\CloudConfigPluginManagerInterface;
 use Drupal\cloud\Service\CloudServiceBase;
@@ -122,7 +123,9 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
     $this->loadCredentials();
     $auth_token = $this->generateAuthToken();
     $params['headers']['X-Auth-Token'] = $auth_token;
-    $params['headers']['Content-Type'] = 'application/json';
+
+    $params['headers']['Content-Type'] = !empty($credentials['Content-Type'])
+      ? $credentials['Content-Type'] : 'application/json';
 
     return $this->request($http_method, $endpoint, $params);
   }
@@ -259,6 +262,154 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
     return $results;
   }
 
+  /**
+   * Get Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image list API response.
+   */
+  public function describeImages(array $params = []) {
+
+    $credentials = [
+      'http_method' => 'get',
+      'endpoint' => '/image/v2/images',
+      'params' => $params,
+    ];
+
+    $response = $this->getClient($credentials);
+
+    $results = [];
+
+    foreach ($response['body']['images'] as $key => $value) {
+      $results['Images'][$key]['Architecture'] = NULL;
+      $results['Images'][$key]['CreationDate'] = $value['created_at'];
+      $results['Images'][$key]['ImageId'] = $value['id'];
+      $results['Images'][$key]['ImageLocation'] = NULL;
+      $results['Images'][$key]['ImageType'] = $value['disk_format'];
+      $results['Images'][$key]['Public'] = $value['visibility'] == 'public' ? 1 : 0;
+      $results['Images'][$key]['OwnerId'] = $value['owner'];
+      $results['Images'][$key]['State'] = $value['status'] == 'active' ? 'available' : 'pending';
+      $results['Images'][$key]['Name'] = $value['name'];
+      $results['Images'][$key]['RootDeviceType'] = $value['container_format'];
+    }
+
+    return $results;
+  }
+
+  /**
+   * Create Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image create API response.
+   */
+  public function createImage(array $params = []) {
+
+    $body = [
+      'container_format' => 'bare',
+      'disk_format' => 'qcow2',
+      'name' => $params['Name'],
+      'visibility' => $params['Visibility'] == 0 ? 'private' : 'public',
+    ];
+
+    $credentials = [
+      'http_method' => 'post',
+      'endpoint' => "/image/v2/images",
+      'params' => $body,
+    ];
+
+    $response = $this->getClient($credentials);
+
+    $results = [];
+
+    $results['ImageId'] = $response['body']['id'];
+    $results['name'] = $response['body']['name'];
+    $results['disk_format'] = $response['body']['disk_format'];
+    $results['container_format'] = $response['body']['container_format'];
+    $results['visibility'] = $response['body']['visibility'];
+    $results['created_at'] = $response['body']['created_at'];
+    $results['updated_at'] = $response['body']['updated_at'];
+    $results['tags'] = $response['body']['tags'];
+    $results['status'] = $response['body']['status'];
+
+    return $results;
+  }
+
+  /**
+   * Update Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image update API response.
+   */
+  public function updateImage(array $params = []) {
+    $body = [
+      [
+        'op' => 'replace',
+        'path' => '/name',
+        'value' => $params['Name'],
+      ],
+      [
+        'op' => 'replace',
+        'path' => '/visibility',
+        'value' => $params['Visibility'],
+      ],
+    ];
+
+    $credentials = [
+      'http_method' => 'patch',
+      'endpoint' => "/image/v2/images/{$params['ImageId']}",
+      'params' => $body,
+    ];
+
+    $credentials['Content-Type'] = 'application/openstack-images-v2.1-json-patch';
+
+    $response = $this->getClient($credentials);
+
+    $results = [];
+
+    $results['ImageId'] = $response['body']['id'];
+    $results['name'] = $response['body']['name'];
+    $results['disk_format'] = $response['body']['disk_format'];
+    $results['container_format'] = $response['body']['container_format'];
+    $results['visibility'] = $response['body']['visibility'];
+    $results['created_at'] = $response['body']['created_at'];
+    $results['updated_at'] = $response['body']['updated_at'];
+    $results['tags'] = $response['body']['tags'];
+    $results['status'] = $response['body']['status'];
+
+    return $results;
+  }
+
+  /**
+   * Delete Image List.
+   *
+   * @param array $params
+   *   Parameters to pass to the API.
+   *
+   * @return array
+   *   The Image delete API response.
+   */
+  public function deregisterImage(array $params = []) {
+    $credentials = [
+      'http_method' => 'DELETE',
+      'endpoint' => "/image/v2/images/{$params['ImageId']}",
+    ];
+
+    $response = $this->getClient($credentials);
+
+    if ($response['status_code'] === 204) {
+      return TRUE;
+    }
+  }
+
   /**
    * Get Flavor Detail of specific flavor Id.
    *
@@ -410,6 +561,90 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
     return $updated;
   }
 
+  /**
+   * Update the OpenStackImages.
+   *
+   * @param array $params
+   *   Optional parameters array.
+   * @param bool $clear
+   *   TRUE to clear stale security groups.
+   *
+   * @return bool
+   *   indicates success so failure.
+   */
+  public function updateImages(array $params = [], $clear = TRUE) {
+    $entity_type = 'openstack_image';
+    $lock_name = $this->getLockKey($entity_type);
+    if (!$this->lock->acquire($lock_name)) {
+      return FALSE;
+    }
+
+    $updated = $this->updateImageEntities($params, $clear, $entity_type, $this->cloudContext);
+
+    $this->lock->release($lock_name);
+    return $updated;
+  }
+
+  /**
+   * Call the API for updated entities and store them as Image entities.
+   *
+   * @param array $params
+   *   Optional parameters array.
+   * @param bool $clear
+   *   TRUE to clear stale security groups.
+   * @param string $entity_type
+   *   Entity type string.
+   * @param string $cloud_context
+   *   Cloud context string.
+   *
+   * @return bool
+   *   indicates success so failure.
+   */
+  public function updateImageEntities(array $params = [], $clear = TRUE, $entity_type = '', $cloud_context = '') {
+    $updated = FALSE;
+
+    // Load all entities by $this->cloudContext.
+    $image_entities = $this->entityTypeManager->getStorage($entity_type)->loadByProperties(
+      ['cloud_context' => $this->cloudContext]
+    );
+
+    $result = $this->describeImages($params);
+
+    if (isset($result)) {
+
+      $stale = [];
+      // Make it easier to lookup the images by setting up
+      // the array with the image_id.
+      foreach ($image_entities ?: [] as $image) {
+        $stale[$image->getImageId()] = $image;
+      }
+
+      /** @var \Drupal\Core\Batch\BatchBuilder $batch_builder */
+      $batch_builder = $this->initBatch('Image Update');
+
+      foreach ($result['Images'] ?: [] as $image) {
+        // Keep track of images that do not exist anymore
+        // delete them after saving the rest of the images.
+        if (isset($stale[$image['ImageId']])) {
+          unset($stale[$image['ImageId']]);
+        }
+
+        $batch_builder->addOperation([
+          OpenStackBatchOperations::class,
+          'updateImage',
+        ], [$cloud_context, $image]);
+      }
+
+      $batch_builder->addOperation([
+        OpenStackBatchOperations::class,
+        'finished',
+      ], [$entity_type, $stale, $clear]);
+      $this->runBatch($batch_builder);
+      $updated = TRUE;
+    }
+    return $updated;
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -448,7 +683,7 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
 
     try {
       $response = $this->httpClient->$http_method(
-        $this->credentials['authUrl'] . $endpoint,
+        rtrim($this->credentials['authUrl'], '/') . $endpoint,
         $params
       );
 
@@ -613,7 +848,15 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
   }
 
   /**
-   * {@inheritdoc}
+   * Get Tag name.
+   *
+   * @param array $openstack_obj
+   *   The openstack object.
+   * @param string $default_value
+   *   The default value.
+   *
+   * @return string
+   *   Return name of corresponding resource.
    */
   public function getTagName(array $openstack_obj, $default_value) {
     $name = $default_value;
@@ -640,6 +883,7 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
   public function clearAllEntities() {
     $timestamp = $this->getTimestamp();
     $this->clearEntities('openstack_instance', $timestamp);
+    $this->clearEntities('openstack_image', $timestamp);
   }
 
   /**
@@ -649,6 +893,7 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
     $update_resources_queue = $this->queueFactory->get('openstack_update_resources_queue');
     $method_names = [
       'updateInstances',
+      'updateImages',
     ];
     foreach ($method_names as $method_name) {
       $update_resources_queue->createItem([
@@ -658,4 +903,29 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter
     }
   }
 
+  /**
+   * Get UID tag value.
+   *
+   * @param array $tags_array
+   *   The tags array of API.
+   * @param string $entity_type_id
+   *   The entity type id.
+   *
+   * @return int
+   *   Return user id.
+   */
+  public function getUidTagValue(array $tags_array, $entity_type_id) {
+    $key = $entity_type_id . '_' . AwsCloudEntityInterface::TAG_CREATED_BY_UID;
+    $uid = 0;
+    if (!empty($tags_array['Tags'])) {
+      foreach ($tags_array['Tags'] ?: [] as $tag) {
+        if ($tag['Key'] === $key) {
+          $uid = $tag['Value'];
+          break;
+        }
+      }
+    }
+    return $uid;
+  }
+
 }
