diff --git a/.env b/.env
index edf282359e6405bb1d509f8052185c6e8904b1de..a1ab798461bb0044c7a03dada696539ce140ef19 100644
--- a/.env
+++ b/.env
@@ -1,22 +1,9 @@
-# Reference documentation https://docs.docker.com/compose/environment-variables/
-# Focus default variables as production, to allow direct download and run in production
-# Required external variables that must be defined externally are those that have no value
-
-DEVSVC_BASE_PATH=development-services/
-
-#### Production related ####
-
-DOCKER_REGISTRY_PREFIX=optima-piacere-docker-dev.artifact.tecnalia.com
-PROJECT_NAME=
-COMPOSE_PROJECT_VERSION=y1
-
-TZ=Madrid
+ADMIN_USER=piacere
 ADMIN_PASSWORD=piacerePassword
-HTTPS_PORT=8443
-SERVER_HOST=192.168.56.1.nip.io
-
-# https://docs.docker.com/compose/reference/envvars/#compose_file#compose_project_name
-# these are docker-compose related environment variables
-COMPOSE_PROJECT_NAME=piacere-production
-COMPOSE_FILE=docker-compose-iec.yaml:docker-compose-jhipster-registry.yaml:docker-compose-traefik-selfsigned.yaml:docker-compose-expose.yaml:docker-compose-redirect-http.yaml
-
+HTTPS_PORT=443
+SERVER_HOST=ci.piacere.digital.tecnalia.dev
+COMPOSE_PROJECT_NAME=piacere-iec-production
+IMAGE_IEC_MYSQL=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-mysql:y3
+IMAGE_IEC_BACKEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-backend:y3
+IMAGE_IEC_FRONTEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-frontend:y3
+COMPOSE_FILE=docker-compose.yaml:docker-compose-jhipster-network-external.yaml:docker-compose-traefik-network-external.yaml:release/docker-compose.yaml
diff --git a/.env.build b/.env.build
deleted file mode 100755
index 6e12ddc518f3bf0103296f8a2d44e02a5b77bb04..0000000000000000000000000000000000000000
--- a/.env.build
+++ /dev/null
@@ -1,26 +0,0 @@
-# Reference documentation https://docs.docker.com/compose/environment-variables/
-# Focus default variables as production, to allow direct download and run in production
-# Required external variables that must be defined externally are those that have no value
-
-DEVSVC_BASE_PATH=development-services/
-
-#### Production related ####
-
-DOCKER_REGISTRY_PREFIX=optima-piacere-docker-dev.artifact.tecnalia.com
-PROJECT_NAME=
-COMPOSE_PROJECT_VERSION=y1
-
-TZ=Madrid
-ADMIN_PASSWORD=piacerePassword
-HTTPS_PORT=8443
-SERVER_HOST=192.168.56.1.nip.io
-
-# https://docs.docker.com/compose/reference/envvars/#compose_file#compose_project_name
-# these are docker-compose related environment variables
-COMPOSE_PROJECT_NAME=piacere-production
-
-#### Build related ####
-DOCKER_BUILDKIT=1
-COMPOSE_DOCKER_CLI_BUILD=1
-COMPOSE_FILE=docker-compose-iec.yaml:build/docker-compose-iec.yaml:docker-compose-traefik-selfsigned.yaml:docker-compose-jhipster-registry.yaml
-EXTRA_CA_URL=https://git.code.tecnalia.com/smartdatalab/ca/-/raw/master/ca.crt.pem
diff --git a/.env.gen b/.env.gen
new file mode 100644
index 0000000000000000000000000000000000000000..8fd0ecdf7216e42d9125adca83e6bfa59d493850
--- /dev/null
+++ b/.env.gen
@@ -0,0 +1,87 @@
+# Reference documentation https://docs.docker.com/compose/environment-variables/
+# Focus default variables as production, to allow direct download and run in production
+# Required external variables that must be defined externally are those that have no value
+
+#### Environments managed
+# this is the default environment if needed uncomment and adjust
+# some conventions on environment prefixes
+# - _ENV_LOCAL_ .env.local purpouse is to cache build and start the setup locally using cache images exposing dev ports (i.e 3306, 5432, 8086, ...) for debug and development purposes. It is the default behaviour (_ENV_LOCAL_:build-cache:.env.local)
+# - _ENV_CACHE_ .env.cache purpouse is to generate images tagged for build cache from that use BUILDKIT_INLINE_CACHE 1 (_ENV_CACHE_:build-cache:.env.cache)
+# - _ENV_RELEASE_ .env.release purpouse is to generate images (that do not use BUILDKIT_INLINE_CACHE 1) tagged for the clients/pilots usage (_ENV_RELEASE_:build-release:.env.release)
+# - _ENV_DEPLOY_ .env purpose is to generate non building docker-compose that uses the release to deploy on generic client (_ENV_DEPLOY_:release:.env)
+# - _ENV_TEST_ .env.test the purpouse is to test from the cache images the correct behaviour without exposing ports ()
+# types of building
+# - build-cache: it focuses in the generation of images with BUILDKIT_INLINE_CACHE 1 for its usage in the cache-from for subsequent build, for each compose-file in compose-file build it finds build/cache the same name to add it to the build, it will use cache from.
+# - build-release: it focuses in the generation of images for distribution it avoid using BUILDKIT_INLINE_CACHE 1 to reduce the size, it will use cache from.
+# - cache: it runs using cache images
+# - release: it runs using release images
+# default enviroment 
+# _ENVIRONMENTS=_ENV_LOCAL_:build-cache:.env.local
+# to add more enviroments use split with ";"
+_ENVIRONMENTS=_ENV_LOCAL_:build-cache:.env.local;_ENV_RELEASE_:build-release:.env.release;_ENV_DEPLOY_:release:.env;_ENV_PIACERE_:release:.env.piacere
+
+#### Common image related ####
+DOCKER_REGISTRY_CACHE_PREFIX=cache.euve.digital.tecnalia.dev:5000
+DOCKER_REGISTRY_CACHE_VERSION=latest
+
+#### Common Build related ####
+# DOCKER_BUILDKIT and COMPOSE_DOCKER_CLI_BUILD do not have effect here, we leave them as documentation
+# DOCKER_BUILDKIT=1
+# COMPOSE_DOCKER_CLI_BUILD=1
+
+### Common Traefik related ###
+TRAEFIK_NETWORK_NAME=traefik_network
+TRAEFIK_HTTPS_ENTRYPOINT_NAME=websecure
+TRAEFIK_HTTP_ENTRYPOINT_NAME=web
+
+#### Common Production related ####
+ADMIN_USER=piacere
+ADMIN_PASSWORD=piacerePassword
+HTTPS_PORT=443
+SERVER_HOST=ci.piacere.digital.tecnalia.dev
+
+#### Platform Specific ####
+TZ=Madrid
+
+#### Platform Specific path ####
+EXTRA_CA_URL=https://git.code.tecnalia.com/smartdatalab/ca/-/raw/master/ca.crt.pem
+
+#### Common docker-compose related ####
+# https://docs.docker.com/compose/reference/envvars/#compose_file#compose_project_name
+# these are docker-compose related environment variables
+COMPOSE_PROJECT_NAME=piacere-iec-production
+# _ENV_LOCAL_COMPOSE_FILE_BASE= # These are oriented for local vagrant usually it contains local traefik configuration, dev services, etc
+# _ENV_RELEASE_COMPOSE_FILE_BASE= # These are oriented for tagging relevant images for upload to official release repositories
+# _ENV_DEPLOY_COMPOSE_FILE_BASE= # These are oriented for final deployment it contains production traefik configuration, etc
+# _ENV_TEST_COMPOSE_FILE_BASE= # These are oriented for testing
+# COMPOSE_FILE_BASE= # (MANDATORY) These are those main services of the project, that will apply to all the scenarios
+
+COMPOSE_FILE_BASE=docker-compose.yaml
+COMPOSE_FILE_BASE_JHIPSTER_NETWORK=docker-compose-jhipster-network-external.yaml
+
+COMPOSE_FILE=
+# COMPOSE_FILE Is generated automatically
+
+COMPOSE_FILE_BASE_NETWORK=docker-compose-traefik-network-external.yaml
+
+IEC_CONFIG_PATH=
+IEC_BASE_PATH=
+
+IMAGE_IEC_MYSQL=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-mysql:y3
+IMAGE_IEC_BACKEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-backend:y3
+IMAGE_IEC_FRONTEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-frontend:y3
+IMAGE_IEC_MYSQL_CACHE=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-mysql:y3
+IMAGE_IEC_BACKEND_CACHE=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-backend:y3
+IMAGE_IEC_FRONTEND_CACHE=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-frontend:y3
+
+_ENV_LOCAL_SERVER_HOST=192.168.56.1.nip.io
+_ENV_LOCAL_COMPOSE_FILE_BASE_EXPOSE_DEV=docker-compose-dev-expose.yaml
+_ENV_LOCAL_COMPOSE_FILE_BASE_LOCAL_JHIPSTER_REGISTRY_VOLUMES=docker-compose-jhipster-registry-volumes.yaml
+_ENV_LOCAL_COMPOSE_FILE_BASE_LOCAL_JHIPSTER_REGISTRY=git/jhipster-registry/docker-compose.yaml
+_ENV_LOCAL_COMPOSE_FILE_BASE_LOCAL_JHIPSTER_REGISTRY_DEV=git/jhipster-registry/docker-compose-dev.yaml
+_ENV_LOCAL_JHIPSTER_REGISTRY_CONFIG_PATH=git/jhipster-registry/
+
+_ENV_PIACERE_COMPOSE_FILE_BASE_PIACERE_BUILD=piacere-build/docker-compose.yaml
+_ENV_PIACERE_COMPOSE_FILE_BASE_PIACERE_RELEASE=release/docker-compose.yaml
+_ENV_PIACERE_COMPOSE_FILE_BASE_ARTIFACTORY=docker-compose-artifactory.yaml
+_ENV_PIACERE_COMPOSE_FILE_BASE_TRAEFIK_NETWORK=docker-compose-traefik-network-internal.yaml
diff --git a/.env.int b/.env.int
deleted file mode 100755
index 7f1a1dc7fd51ed0720702ba4653e515a1343fcb5..0000000000000000000000000000000000000000
--- a/.env.int
+++ /dev/null
@@ -1,31 +0,0 @@
-# Reference documentation https://docs.docker.com/compose/environment-variables/
-# Focus default variables as production, to allow direct download and run in production
-# Required external variables that must be defined externally are those that have no value
-
-DEVSVC_BASE_PATH=development-services/
-
-#### Production related ####
-
-DOCKER_REGISTRY_PREFIX=optima-piacere-docker-dev.artifact.tecnalia.com
-PROJECT_NAME=
-COMPOSE_PROJECT_VERSION=y1
-
-TZ=Madrid
-ADMIN_PASSWORD=piacerePassword
-HTTPS_PORT=8443
-SERVER_HOST=192.168.56.1.nip.io
-
-# https://docs.docker.com/compose/reference/envvars/#compose_file#compose_project_name
-# these are docker-compose related environment variables
-COMPOSE_PROJECT_NAME=piacere-production
-
-#### Build related ####
-DOCKER_BUILDKIT=1
-COMPOSE_DOCKER_CLI_BUILD=1
-EXTRA_CA_URL=https://git.code.tecnalia.com/smartdatalab/ca/-/raw/master/ca.crt.pem
-
-#### Development related ####
-# CERTIFICATE_SIGNING_KEY_PASSPHRASE=
-
-COMPOSE_FILE=docker-compose-iec.yaml:docker-compose-iec-dev-expose.yaml:docker-compose-jhipster-registry.yaml:docker-compose-dev.yaml:development-services/docker-compose-traefik-tecnalia-selfsigned.yaml:docker-compose-expose.yaml:docker-compose-redirect-http.yaml:build/docker-compose-iec.yaml:development-services/build/docker-compose-traefik-tecnalia-selfsigned.yaml:development-services/docker-compose.yaml:development-services/docker-compose-expose.yaml:development-services/docker-compose-redirect-http.yaml:development-services/build/docker-compose.yaml
-
diff --git a/.env.local b/.env.local
new file mode 100644
index 0000000000000000000000000000000000000000..28f9c5bb69759d0a3863411f0f0474ae220baf66
--- /dev/null
+++ b/.env.local
@@ -0,0 +1,12 @@
+DOCKER_REGISTRY_CACHE_PREFIX=cache.euve.digital.tecnalia.dev:5000
+DOCKER_REGISTRY_CACHE_VERSION=latest
+ADMIN_USER=piacere
+ADMIN_PASSWORD=piacerePassword
+HTTPS_PORT=443
+SERVER_HOST=192.168.56.1.nip.io
+EXTRA_CA_URL=https://git.code.tecnalia.com/smartdatalab/ca/-/raw/master/ca.crt.pem
+COMPOSE_PROJECT_NAME=piacere-iec-production
+IEC_CONFIG_PATH=
+IEC_BASE_PATH=
+JHIPSTER_REGISTRY_CONFIG_PATH=git/jhipster-registry/
+COMPOSE_FILE=docker-compose.yaml:docker-compose-jhipster-network-external.yaml:docker-compose-traefik-network-external.yaml:docker-compose-dev-expose.yaml:docker-compose-jhipster-registry-volumes.yaml:git/jhipster-registry/docker-compose.yaml:git/jhipster-registry/docker-compose-dev.yaml:build/docker-compose.yaml:build/inline-cache/docker-compose.yaml:build/image/docker-compose.yaml
diff --git a/.env.piacere b/.env.piacere
new file mode 100644
index 0000000000000000000000000000000000000000..1542c1f548f20c888606623b9bf01be866875016
--- /dev/null
+++ b/.env.piacere
@@ -0,0 +1,14 @@
+TRAEFIK_NETWORK_NAME=traefik_network
+ADMIN_USER=piacere
+ADMIN_PASSWORD=piacerePassword
+HTTPS_PORT=443
+SERVER_HOST=ci.piacere.digital.tecnalia.dev
+COMPOSE_PROJECT_NAME=piacere-iec-production
+IEC_BASE_PATH=
+IMAGE_IEC_MYSQL=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-mysql:y3
+IMAGE_IEC_BACKEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-backend:y3
+IMAGE_IEC_FRONTEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-frontend:y3
+IMAGE_IEC_MYSQL_CACHE=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-mysql:y3
+IMAGE_IEC_BACKEND_CACHE=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-backend:y3
+IMAGE_IEC_FRONTEND_CACHE=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-frontend:y3
+COMPOSE_FILE=docker-compose.yaml:docker-compose-jhipster-network-external.yaml:docker-compose-traefik-network-external.yaml:piacere-build/docker-compose.yaml:release/docker-compose.yaml:docker-compose-artifactory.yaml:docker-compose-traefik-network-internal.yaml
diff --git a/.env.release b/.env.release
new file mode 100644
index 0000000000000000000000000000000000000000..a0c543a84079b59dea9ce820ea6424024d661fac
--- /dev/null
+++ b/.env.release
@@ -0,0 +1,13 @@
+DOCKER_REGISTRY_CACHE_PREFIX=cache.euve.digital.tecnalia.dev:5000
+DOCKER_REGISTRY_CACHE_VERSION=latest
+ADMIN_USER=piacere
+ADMIN_PASSWORD=piacerePassword
+HTTPS_PORT=443
+SERVER_HOST=ci.piacere.digital.tecnalia.dev
+EXTRA_CA_URL=https://git.code.tecnalia.com/smartdatalab/ca/-/raw/master/ca.crt.pem
+COMPOSE_PROJECT_NAME=piacere-iec-production
+IEC_BASE_PATH=
+IMAGE_IEC_MYSQL=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-mysql:y3
+IMAGE_IEC_BACKEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-backend:y3
+IMAGE_IEC_FRONTEND=optima-piacere-docker-dev.artifact.tecnalia.com/wp5/iec-frontend:y3
+COMPOSE_FILE=docker-compose.yaml:docker-compose-jhipster-network-external.yaml:docker-compose-traefik-network-external.yaml:build/docker-compose.yaml:release/docker-compose.yaml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ea76e458be08233a2ca4ac608f22d3c6a1af7675..9937bc2e2293e4995924209cf2b1418c326c51e4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,79 +1,121 @@
-stages:
-  - build
-  - deploy
-  - stop
+include:
+  - project: piacere/private/t23-ci-setup
+    ref: main
+    file:
+      - gitlab-ci-scripts/utils.gitlab-ci.yml
+
+      # Image tag variables generation job -------------
+      # Stage: variable-generation ---------------------
+      - gitlab-ci-scripts/generate-variables.gitlab-ci.yml
+      
+      # Downstream t23-ci-setup pipeline trigger job ---
+      # Stage: integration-tests-publish-deploy --------
+      - gitlab-ci-scripts/trigger-downstream.gitlab-ci.yml
 
 variables:
-  GIT_SUBMODULE_STRATEGY: normal
+  #------------------------
+  # Component image tag data
+  # ------------------------
+  COMPONENT_WP: wp3
+  IEC_MYSQL_IMAGE_NAME: iec-mysql
+  IEC_BACKEND_IMAGE_NAME: iec-backend
+  IEC_FRONTEND_IMAGE_NAME: iec-frontend
 
-.common_variables:
-  variables:
-    TZ: Madrid
-    SERVER_HOST: piacere.esilab.org
-    SMTP_USER_EMAIL: piacere@esilab.org
-    PROJECT_NAME: piacere-iec
+  # ------------------------------------------
+  # Space-separated component image abbreviation list
+  # used to generate image tags and related variables.
+  # It is also passed to the downstream integration tests,
+  # publication and deployment pipeline.
+  # ------------------------------------------
+  IMAGE_NAMES: "$IEC_MYSQL_IMAGE_NAME $IEC_BACKEND_IMAGE_NAME $IEC_FRONTEND_IMAGE_NAME"
 
-.master:
-  extends:
-    - .common_variables
-  variables:
-    # these variables take precedence over .env
-    # CERTIFICATE_SIGNING_KEY_PASSPHRASE defined in variables at settings/ci_cd
-    HTTPS_PORT: 8444
-    COMPOSE_FILE: "docker-compose.yaml:docker-compose-expose.yaml:docker-compose-dev.yaml"
-    COMPOSE_PROJECT_NAME: piacere-iec-master
-    COMPOSE_PROJECT_VERSION: master
-    ADD_DEFAULT_CA: "true"
-  only:
-    - master
-  tags:
-    - piacere-iec
-    - docker
-    - docker-compose
-    - master
+# The quality stage does not apply here,
+# since the base images come from Docker Hub.
+# There are no unit tests either.
 
-.build:
-  script:
-    - echo "build images"
-    - docker-compose build --parallel 
+stages:
+  - variable-generation
+#  - quality
+  - build
+  - security
+#  - unit-tests
+  - integration-tests-publish-deploy
 
-.deploy:
-  script:
-    - echo "Deploy to the environment"
-    - docker-compose up -d --remove-orphans
+# Build jobs ----------------------
 
-.stop:
+.build-docker-compose:
+  # image: docker/compose:1.29.2 # this is too old
+  image: docker:23.0.1
+  stage: build
+  services:
+    # - docker:20.10.21-dind # not sure if this is the latest
+    - docker:dind
   variables:
-    GIT_STRATEGY: none
+    GIT_DEPTH: 1
+    GIT_SUBMODULE_STRATEGY: recursive
+    GIT_SUBMODULE_DEPTH: 1
+    DOCKER_BUILDKIT: 1
+    COMPOSE_DOCKER_CLI_BUILD: 1
+    DOCKER_COMPOSE_PATH: "."
+    DOCKER_COMPOSE_ENV_FILE_CACHE: ".env.piacere"
+    DOCKER_COMPOSE_ENV_FILE: ".env.piacere"
+  before_script:
+    - !reference [.artifactory-login]
   script:
-    - echo "Stops the environment"
-    - docker-compose down --remove-orphans
-
-build_master:
-  stage: build
-  extends:
-    - .master
-    - .build
+    - apk add docker-compose
+    - cd $DOCKER_COMPOSE_PATH
+    - docker-compose --env-file $DOCKER_COMPOSE_ENV_FILE_CACHE --project-directory ./ pull || true
+    - docker-compose --env-file $DOCKER_COMPOSE_ENV_FILE_CACHE --project-directory ./ config
+    - docker-compose --env-file $DOCKER_COMPOSE_ENV_FILE --project-directory ./ build
+    - docker-compose --env-file $DOCKER_COMPOSE_ENV_FILE --project-directory ./ push
+    - docker-compose --env-file $DOCKER_COMPOSE_ENV_FILE --project-directory ./ config | grep image
+  tags:
+    - docker
 
-deploy_master:
-  stage: deploy
+build-temp-docker-compose:
   extends:
-    - .master
-    - .deploy
-  environment:
-    name: master
-    url: https://$SERVER_HOST:8444
-    on_stop: stop_master
-
-stop_master:
+    - .build-docker-compose
   variables:
-    COMPOSE_FILE: "docker-compose.yaml:docker-compose-expose.yaml:docker-compose-dev.yaml"
-  stage: stop
+    IMAGE_IEC_MYSQL: "$TMP_IMAGE_IEC_MYSQL"
+    IMAGE_IEC_BACKEND: "$TMP_IMAGE_IEC_BACKEND"
+    IMAGE_IEC_FRONTEND: "$TMP_IMAGE_IEC_FRONTEND"
+
+build-release-docker-compose:
   extends:
-    - .master
-    - .stop
-  environment:
-    name: master
-    action: stop
+    - .build-docker-compose
   when: manual
 
+# Security jobs ------------------------
+
+# Even though the images come from Docker Hub, we may still
+# perform the trivy vulnerability tests.
+
+# security-trivy-iec-mysql:
+#   stage: security
+#   variables:
+#     TMP_IMAGE: "$TMP_IMAGE_IEC_MYSQL"
+#   trigger: !reference [.trigger-security-trivy]
+#   needs:
+#     - job: build-temp-docker-compose
+#     - job: generate-variables
+#       artifacts: true
+
+# security-trivy-iec-backend:
+#   stage: security
+#   variables:
+#     TMP_IMAGE: "$TMP_IMAGE_IEC_BACKEND"
+#   trigger: !reference [.trigger-security-trivy]
+#   needs:
+#     - job: build-temp-docker-compose
+#     - job: generate-variables
+#       artifacts: true
+
+# security-trivy-iec-frontend:
+#   stage: security
+#   variables:
+#     TMP_IMAGE: "$TMP_IMAGE_IEC_FRONTEND"
+#   trigger: !reference [.trigger-security-trivy]
+#   needs:
+#     - job: build-temp-docker-compose
+#     - job: generate-variables
+#       artifacts: true
diff --git a/.gitmodules b/.gitmodules
index f4475b66ee152601059f0bd22f43325cfac522de..aa0366cad9bc01c1ca8d7071bf7c829f6773be3f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
-[submodule "development-services"]
-	path = development-services
-	url = ../../../../smartdatalab/libraries/docker-compose/development-services.git
+[submodule "git/jhipster-registry"]
+	path = git/jhipster-registry
+	url = ../../../../smartdatalab/libraries/docker-compose/jhipster-registry-deploy.git
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index df30cd7e2481469858b348352732807a1e351060..0000000000000000000000000000000000000000
--- a/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2023 PIACERE / public / The Platform / IOP - IaC Optimized Platform 
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/build/docker-compose-iec.yaml b/build/docker-compose-iec.yaml
deleted file mode 100755
index a605e6dcd283925d033ec506c645a9ec70dadd3b..0000000000000000000000000000000000000000
--- a/build/docker-compose-iec.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-version: '3.8'
-
-services:
-     
-  iec-mysql:
-    build:
-      context: ${IEC_BUILD_RELATIVE_FOLDER}git/iec-mysql
-      dockerfile: Dockerfile
-
-  iec-backend:
-    build:
-      context: ${IEC_BUILD_RELATIVE_FOLDER}git/iec-backend
-      dockerfile: Dockerfile
-      args:
-        BUILDKIT_INLINE_CACHE: 1
-        EXTRA_CA_URL: ${EXTRA_CA_URL:?err}
-
-  iec-frontend:
-    build:
-      context: ${IEC_BUILD_RELATIVE_FOLDER}git/iec-frontend
-      dockerfile: Dockerfile
-      args:
-        BUILDKIT_INLINE_CACHE: 1
-        EXTRA_CA_URL: ${EXTRA_CA_URL:?err}
diff --git a/build/docker-compose.yaml b/build/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..39c9b162beb1b9b2bd1d2565f791e7e8b76829d8
--- /dev/null
+++ b/build/docker-compose.yaml
@@ -0,0 +1,25 @@
+services:
+  iec-mysql:
+    build:
+      context: ${IEC_BASE_PATH}git/iec-mysql
+      dockerfile: Dockerfile
+      cache_from:
+        - ${DOCKER_REGISTRY_CACHE_PREFIX}/piacere/iec-mysql:${DOCKER_REGISTRY_CACHE_VERSION:?err} 
+
+  iec-backend:
+    build:
+      context: ${IEC_BASE_PATH}git/iec-backend
+      dockerfile: Dockerfile
+      args:
+        EXTRA_CA_URL: ${EXTRA_CA_URL:?err}
+      cache_from:
+        - ${DOCKER_REGISTRY_CACHE_PREFIX}/piacere/iec-backend:${DOCKER_REGISTRY_CACHE_VERSION:?err} 
+
+  iec-frontend:
+    build:
+      context: ${IEC_BASE_PATH}git/iec-frontend
+      dockerfile: Dockerfile
+      args:
+        EXTRA_CA_URL: ${EXTRA_CA_URL:?err}
+      cache_from:
+        - ${DOCKER_REGISTRY_CACHE_PREFIX}/piacere/iec-frontend:${DOCKER_REGISTRY_CACHE_VERSION:?err} 
diff --git a/build/image/docker-compose.yaml b/build/image/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..206ed7976253901fceb9cf22b74c3a585e36af81
--- /dev/null
+++ b/build/image/docker-compose.yaml
@@ -0,0 +1,9 @@
+services:
+  iec-mysql:
+    image: ${DOCKER_REGISTRY_CACHE_PREFIX}/piacere/iec-mysql:${DOCKER_REGISTRY_CACHE_VERSION:?err}  
+
+  iec-backend:
+    image: ${DOCKER_REGISTRY_CACHE_PREFIX}/piacere/iec-backend:${DOCKER_REGISTRY_CACHE_VERSION:?err}
+
+  iec-frontend:
+    image: ${DOCKER_REGISTRY_CACHE_PREFIX}/piacere/iec-frontend:${DOCKER_REGISTRY_CACHE_VERSION:?err}  
diff --git a/build/inline-cache/docker-compose.yaml b/build/inline-cache/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..956fffde0d4c37ada3813fd864647538f068ea33
--- /dev/null
+++ b/build/inline-cache/docker-compose.yaml
@@ -0,0 +1,15 @@
+services:
+  iec-mysql:
+    build:
+      args:
+        BUILDKIT_INLINE_CACHE: 1 # For multistage docker
+
+  iec-backend:
+    build:
+      args:
+        BUILDKIT_INLINE_CACHE: 1 # For multistage docker
+
+  iec-frontend:
+    build:
+      args:
+        BUILDKIT_INLINE_CACHE: 1 # For multistage docker
diff --git a/central-config/iec/application.yml b/data/jhipster-registry/central-config/iec/application.yml
old mode 100755
new mode 100644
similarity index 100%
rename from central-config/iec/application.yml
rename to data/jhipster-registry/central-config/iec/application.yml
diff --git a/central-config/iec/iecBackend.yml b/data/jhipster-registry/central-config/iec/iecBackend.yml
old mode 100755
new mode 100644
similarity index 100%
rename from central-config/iec/iecBackend.yml
rename to data/jhipster-registry/central-config/iec/iecBackend.yml
diff --git a/central-config/iec/iecFrontend.yml b/data/jhipster-registry/central-config/iec/iecFrontend.yml
old mode 100755
new mode 100644
similarity index 100%
rename from central-config/iec/iecFrontend.yml
rename to data/jhipster-registry/central-config/iec/iecFrontend.yml
diff --git a/development-services b/development-services
deleted file mode 160000
index 355ef897f9b68ae57d381e611bd106d7fc68b38c..0000000000000000000000000000000000000000
--- a/development-services
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 355ef897f9b68ae57d381e611bd106d7fc68b38c
diff --git a/doc/scenarios/.gitkeep b/doc/scenarios/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/doc/scenarios/KR-9-IEC.feature b/doc/scenarios/KR-9-IEC.feature
new file mode 100644
index 0000000000000000000000000000000000000000..3cde68ff1dc1b1d1f5dde5c263f5cf1e126bd144
--- /dev/null
+++ b/doc/scenarios/KR-9-IEC.feature
@@ -0,0 +1,20 @@
+Feature: PIACERE Design Time
+
+Scenario: IOP working
+Given the IOP need the Catalogue data to calculate optimizations
+	When the IOP invokes the IEC
+	Then the IEC returns the available elements in json format
+
+Feature: PIACERE Run Time
+
+Scenario: A project is being deployed
+Given the deployment is successcul
+	Then the PRC sends to the IEC the info about the deployed elements
+	And the IEC stores the information, including which service is deployed (type, id...)
+	And the IEC (periodically) connects to monitoring 
+	And gets information about the deployed services
+	
+Scenario: A project is being undeployed
+Given the undeployment is successcul
+	Then the PRC sends to the IEC the info about the deployed elements
+	And the IEC stores the information, including which service is undeployed (type, id...)
diff --git a/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue-SequenceDiagram.Y2.png b/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue-SequenceDiagram.Y2.png
new file mode 100644
index 0000000000000000000000000000000000000000..26cc2b3755d37a7acccf523d142a53d6b735e6e3
Binary files /dev/null and b/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue-SequenceDiagram.Y2.png differ
diff --git a/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue.puml b/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue.puml
index 40edc9570c22aff6659b9b26e46c8fc663d3f8e9..dcda1b08c4b1ba6234acc387300ed5bf424009d9 100755
--- a/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue.puml
+++ b/doc/sequence-diagrams/53-InfrastructuralElementsCatalogue.puml
@@ -1,32 +1,37 @@
 @startuml
 participant "GUI/IDE eclipse" as DESIDE
-participant "Infrastructural\nElements\nCatalogue" as DBINFRACAT #99FF99
+participant "Infrastructural\nElements\nCatalogue" as IECDB #99FF99
 participant "IaC Optimizer Platform (IOP)" as IAIOP
 participant "Runtime Controller (PRC)" as RTPRC
-participant "IaC Execution Manager (IEM)" as RTIEM
 participant PerformanceMonitoring as IAMON
 participant SecurityMonitoring as SECMON
 
-group Element endorsement (static information)
-DESIDE->DBINFRACAT: Include element information (12)
-DBINFRACAT->DESIDE: Confirmation
+
+== DESIGN TIME == 
+group Catalogue update
+DESIDE -> IECDB:  Element endorsement (26)
+note left: New \n element
+note right: Include element  \n (static information)
 end
+
+== RUN TIME == 
 group IOP interaction
-IAIOP->DBINFRACAT: Information request\n about available elements\n & dynamic info if it exists (35)
-DBINFRACAT->IAIOP: Information provision\n about available elements\n & dynamic info if it exists
-end
-group Information about instances (dynamic information I)
-RTIEM ->RTPRC: Deployment response 
-RTPRC ->DBINFRACAT: Infrastructural element deployed and related instance info (37)
-' 17 should be removed IEC is not going to call Runtime controller, and we do not expect any data stream between IEC and PRC
-end
-group Information about monitoring (dynamic information II) to support IOP
-IAMON -> DBINFRACAT: Monitoring Information, ie average availability last year (32)
-SECMON -> DBINFRACAT: Monitoring Information, ie average security last year (33)
+IECDB <- IAIOP: Request (24)
+return: Information about \n available elements \n & dynamic info
 end
 
-group Information about element tore down (dynamic information III)
-RTPRC -> DBINFRACAT: Instance tore down (37)
+group Information about instances and monitoring (dynamic information)
+IECDB <- RTPRC: Infrastructural element deployed and related instance info (21)
+note right: New \n deployment
+
+    loop while monitoring
+    IECDB <- IAMON: Monitoring Information, ie average availability last year (20)
+    note right: (dynamic \n information)
+    IECDB <- SECMON: Monitoring Information, ie average security last year (19)
+    end
+
+RTPRC -> IECDB: Instance tore down (23)
+note right: Undeploy
 end
 
 'note over InfrastruturalElementsCatalogue:Is the IOP always called by RuntimeController?
diff --git a/docker-compose-artifactory.yaml b/docker-compose-artifactory.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6786dc9adde4e61d182c29cd940a80087e7e8fa8
--- /dev/null
+++ b/docker-compose-artifactory.yaml
@@ -0,0 +1,14 @@
+services:
+  iec-mysql:
+    build:
+      labels:
+        com.jfrog.artifactory.retention.maxCount: 6
+  iec-backend:
+    build:
+      labels:
+        com.jfrog.artifactory.retention.maxCount: 6
+  iec-frontend:
+    build:
+      labels:
+        com.jfrog.artifactory.retention.maxCount: 6
+
diff --git a/docker-compose-iec-dev-expose.yaml b/docker-compose-dev-expose.yaml
old mode 100755
new mode 100644
similarity index 52%
rename from docker-compose-iec-dev-expose.yaml
rename to docker-compose-dev-expose.yaml
index e3ca2be5017e98a8fc19d21c9078e3facf7b0300..5ce4bc4552130ed44dd8c821adc28fbf3461a6c1
--- a/docker-compose-iec-dev-expose.yaml
+++ b/docker-compose-dev-expose.yaml
@@ -1,4 +1,3 @@
-version: '3.8'
 services:
     jhipster-registry:
         ports: 
@@ -7,3 +6,11 @@ services:
     iec-mysql:
         ports: 
             - 3306:3306
+
+    iec-frontend:
+        ports: 
+            - 8080:8080
+
+    iec-backend:
+        ports: 
+            - 8081:8081
diff --git a/docker-compose-expose.yaml b/docker-compose-expose.yaml
deleted file mode 100644
index 377e9d27747fe70c73b08375494075f7acc75b86..0000000000000000000000000000000000000000
--- a/docker-compose-expose.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-version: '3.8'
-
-services:
-  traefik:
-    ports:
-      - ${HTTPS_PORT:?err}:${HTTPS_PORT:?err}
diff --git a/docker-compose-jhipster-network-external.yaml b/docker-compose-jhipster-network-external.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..98d5833c2a6c6ee88a199e38cc6d0bc9e17e5583
--- /dev/null
+++ b/docker-compose-jhipster-network-external.yaml
@@ -0,0 +1,4 @@
+networks:
+  jhipster_network:
+    name: jhipster_network
+    external: true
diff --git a/docker-compose-jhipster-registry-volumes.yaml b/docker-compose-jhipster-registry-volumes.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..30989c7d9fee05dd66947509d4df78f8c6361d6e
--- /dev/null
+++ b/docker-compose-jhipster-registry-volumes.yaml
@@ -0,0 +1,5 @@
+services:
+  jhipster-registry:
+    volumes:
+      - ./${JHIPSTER_REGISTRY_CONFIG_PATH}data/jhipster-registry/central-config/jhipster-registry:/central-config/jhipster-registry
+      - ./${IEC_CONFIG_PATH}data/jhipster-registry/central-config/iec:/central-config/iec
diff --git a/docker-compose-redirect-http.yaml b/docker-compose-redirect-http.yaml
deleted file mode 100755
index bd4a9c780027cfb1dbbcf7d987ce60c3cb8e8135..0000000000000000000000000000000000000000
--- a/docker-compose-redirect-http.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-version: "3.8"
-
-services:
-  traefik:
-    labels:
-      # global redirect to https
-      - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
-      - "traefik.http.routers.http-catchall.entrypoints=web"
-      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
-      - "traefik.http.routers.http-catchall.service=api@internal"
-      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
-      - "traefik.http.middlewares.redirect-to-https.redirectscheme.port=${HTTPS_PORT:?err}"
-    ports:
-      - 80:80
diff --git a/docker-compose-traefik-aliases.yaml b/docker-compose-traefik-aliases.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..67f8df028620be6ff652fa8087225d0f85e54101
--- /dev/null
+++ b/docker-compose-traefik-aliases.yaml
@@ -0,0 +1,6 @@
+services:
+  traefik:
+    networks:
+      traefik_network:
+        aliases:
+          - iec.${SERVER_HOST}
diff --git a/docker-compose-traefik-network-external.yaml b/docker-compose-traefik-network-external.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..95623b367d1e14b377a8b17e3e598362edeeb8d9
--- /dev/null
+++ b/docker-compose-traefik-network-external.yaml
@@ -0,0 +1,4 @@
+networks:
+  traefik_network:
+    name: traefik_network
+    external: true
diff --git a/docker-compose-traefik-network-internal.yaml b/docker-compose-traefik-network-internal.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..97d6f4ffb9e74e433fdbd84ecebc2561ab0c45b5
--- /dev/null
+++ b/docker-compose-traefik-network-internal.yaml
@@ -0,0 +1,3 @@
+networks:
+  traefik_network:
+    name: ${TRAEFIK_NETWORK_NAME:?err}
diff --git a/docker-compose-traefik-selfsigned.yaml b/docker-compose-traefik-selfsigned.yaml
deleted file mode 100755
index 19dabf54f326ac5b78c8f394a0d271705eeb285f..0000000000000000000000000000000000000000
--- a/docker-compose-traefik-selfsigned.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-version: "3.8"
-
-services:
-  ## Common structure
-  traefik:
-    image: traefik:v2.5.2
-    restart: always
-    hostname: ${SERVER_HOST}
-    command: 
-      --api=true
-      --api.insecure=true
-      --serverstransport.insecureskipverify=true
-      --ping=true
-      --providers.docker=true
-      --providers.docker.constraints="Label(`com.docker.compose.project`, `${COMPOSE_PROJECT_NAME}`)"
-      --providers.docker.exposedbydefault=false
-      --entrypoints.web.address=:80
-      --entrypoints.websecure.address=:${HTTPS_PORT:?err}
-      --entrypoints.websecure.http.tls=true
-      # --log.level=DEBUG
-    volumes:
-    - /var/run/docker.sock:/var/run/docker.sock
-    networks:
-      default:
-        aliases:
-          - ${SERVER_HOST:?err}
-  
-networks:
-  default:
-          
\ No newline at end of file
diff --git a/docker-compose-iec.yaml b/docker-compose.yaml
old mode 100755
new mode 100644
similarity index 70%
rename from docker-compose-iec.yaml
rename to docker-compose.yaml
index a40996e0cd1a8fb73dda1c9f1817adc1a771628b..41dbaa8c01d147775d01acf108774a4dfae0d00b
--- a/docker-compose-iec.yaml
+++ b/docker-compose.yaml
@@ -1,23 +1,14 @@
-version: '3.8'
-
 services:
-  traefik:
-    networks:
-      default:
-        aliases:
-          - iec.${SERVER_HOST}
 
   iec-mysql:
-    image: ${DOCKER_REGISTRY_PREFIX}${PROJECT_NAME}/wp5/iec-mysql:${COMPOSE_PROJECT_VERSION:?err}  
     restart: always
     volumes:
       - iec-mysql_data:/var/lib/mysql
+    networks:
+      default:
 
   iec-backend:
-    image: ${DOCKER_REGISTRY_PREFIX}${PROJECT_NAME}/wp5/iec-backend:${COMPOSE_PROJECT_VERSION:?err}
     restart: always
-    depends_on:
-      - jhipster-registry
     environment:
       # SPRING_PROFILES_ACTIVE: prod,api-docs,no-liquibase
       GLOBAL_PASSWORD: ${ADMIN_PASSWORD}
@@ -25,26 +16,27 @@ services:
       # SPRING_CLOUD_CONFIG_URI: https://admin:${ADMIN_PASSWORD}@jhipster-registry.${SERVER_HOST}:${HTTPS_PORT}/config
       # SPRING_R2DBC_URL: r2dbc:mysql://iec-mysql:3306/iecBackend?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true
       # SPRING_LIQUIBASE_URL: jdbc:mysql://iec-mysql:3306/iecBackend?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true
+    networks:
+      default:
+      jhipster_network:
 
   iec-frontend:
-    image: ${DOCKER_REGISTRY_PREFIX}${PROJECT_NAME}/wp5/iec-frontend:${COMPOSE_PROJECT_VERSION:?err}  
     restart: always
-    depends_on:
-      - jhipster-registry
     environment:
       GLOBAL_PASSWORD: ${ADMIN_PASSWORD}
       JHIPSTER_CORS_ALLOWEDORIGINS: "https://iec.${SERVER_HOST:?err}:${HTTPS_PORT}"
+    networks:
+      default:
+      jhipster_network:
+      traefik_network:
     labels:
       - "traefik.enable=true"
+      - "traefik.docker.network=traefik_network"
       - "traefik.http.routers.iec-frontend.entrypoints=websecure"
       - "traefik.http.routers.iec-frontend.rule=Host(`iec.${SERVER_HOST:?err}`)"
 
-networks:
-  # https://github.com/docker/compose/issues/4336
-  default:
-    driver: bridge
-    ipam:
-      driver: default
-      
 volumes:
   iec-mysql_data:
+
+networks:
+  default:
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/config/DatabaseConfiguration.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/config/DatabaseConfiguration.java
index 8d7e8c97d1a5659e5d00df0e3b22c36efd3d0243..16634d2a08e502966d011833ca3db2137cdb3963 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/config/DatabaseConfiguration.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/config/DatabaseConfiguration.java
@@ -1,13 +1,9 @@
 package com.piacere.iec.backend.config;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
-import tech.jhipster.config.JHipsterConstants;
 
 @Configuration
 @EnableJpaRepositories("com.piacere.iec.backend.repository")
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/config/SecurityConfiguration.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/config/SecurityConfiguration.java
index c57adb7e50875f00fc962051a6681ee4dd3b4773..c2ed40cf6e0c1dc892035b90df32c3b46e2d51de 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/config/SecurityConfiguration.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/config/SecurityConfiguration.java
@@ -1,18 +1,18 @@
 package com.piacere.iec.backend.config;
 
-import com.piacere.iec.backend.security.*;
-import com.piacere.iec.backend.security.jwt.*;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Import;
-import org.springframework.http.HttpMethod;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter;
 import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport;
+
+import com.piacere.iec.backend.security.AuthoritiesConstants;
+import com.piacere.iec.backend.security.jwt.JWTConfigurer;
+import com.piacere.iec.backend.security.jwt.TokenProvider;
+
 import tech.jhipster.config.JHipsterProperties;
 
 @EnableWebSecurity
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/config/WebConfigurer.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/config/WebConfigurer.java
index 76797693a598bb4ca30dc96de6f65705d9d54ac0..9e3bdfa9113ac7ee39af598843b4499ab5757ce4 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/config/WebConfigurer.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/config/WebConfigurer.java
@@ -1,19 +1,19 @@
 package com.piacere.iec.backend.config;
 
-import javax.servlet.*;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.boot.web.server.*;
 import org.springframework.boot.web.servlet.ServletContextInitializer;
-import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.env.Environment;
-import org.springframework.core.env.Profiles;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.cors.CorsConfiguration;
 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 import org.springframework.web.filter.CorsFilter;
+
 import tech.jhipster.config.JHipsterProperties;
 
 /**
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/ExistingResource.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/ExistingResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..d0bab74ec4237f792fb00d803a0ddf383d7e3cbe
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/ExistingResource.java
@@ -0,0 +1,240 @@
+package com.piacere.iec.backend.domain;
+
+import java.io.Serializable;
+import java.time.Instant;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * A ExistingResource.
+ */
+@Entity
+@Table(name = "existing_resource")
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class ExistingResource implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    // @ApiModelProperty(notes = "Resource ID in Catalogue", example = "1") 
+    private Long id;
+
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "data_name", length = 70, nullable = false)
+    private String dataName;
+    
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "data_type", length = 70, nullable = false)
+    private String dataType;
+
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "name", length = 70, nullable = false)
+    private String name;
+
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "datacenter_id", length = 70, nullable = false)
+    private String datacenterId;
+
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "user", length = 70, nullable = false)
+    private String user;
+
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "provider", length = 70, nullable = false)
+    private String provider;
+
+    @NotNull
+    @Column(name = "created_date", nullable = false)
+    private Instant createdDate;
+
+    @Column(name = "last_modified_date")
+    private Instant lastModifiedDate;
+
+    @Column(name = "deleted_date")
+    private Instant deletedDate;
+
+
+    // jhipster-needle-entity-add-field - JHipster will add fields here
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public ExistingResource id(Long id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getDataName() {
+		return dataName;
+	}
+
+    public ExistingResource dataName(String dataName) {
+        this.dataName = dataName;
+        return this;
+    }
+    
+	public void setDataName(String dataName) {
+		this.dataName = dataName;
+	}
+
+	public String getDataType() {
+        return this.dataType;
+    }
+
+    public ExistingResource dataType(String dataType) {
+        this.dataType = dataType;
+        return this;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public ExistingResource name(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDatacenterId() {
+        return this.datacenterId;
+    }
+
+    public ExistingResource datacenterId(String datacenterId) {
+        this.datacenterId = datacenterId;
+        return this;
+    }
+
+    public void setDatacenterId(String datacenterId) {
+        this.datacenterId = datacenterId;
+    }
+
+    public String getUser() {
+		return user;
+	}
+
+    public ExistingResource user(String user) {
+        this.user = user;
+        return this;
+    }
+    
+	public void setUser(String user) {
+		this.user = user;
+	}
+
+	public String getProvider() {
+        return this.provider;
+    }
+
+    public ExistingResource provider(String provider) {
+        this.provider = provider;
+        return this;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
+
+    public Instant getCreatedDate() {
+        return this.createdDate;
+    }
+
+    public ExistingResource createdDate(Instant createdDate) {
+        this.createdDate = createdDate;
+        return this;
+    }
+
+    public void setCreatedDate(Instant createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public Instant getLastModifiedDate() {
+        return this.lastModifiedDate;
+    }
+
+    public ExistingResource lastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+        return this;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
+    public Instant getDeletedDate() {
+        return this.deletedDate;
+    }
+
+    public ExistingResource deletedDate(Instant deletedDate) {
+        this.deletedDate = deletedDate;
+        return this;
+    }
+
+    public void setDeletedDate(Instant deletedDate) {
+        this.deletedDate = deletedDate;
+    }
+
+       // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof ExistingResource)) {
+            return false;
+        }
+        return id != null && id.equals(((ExistingResource) o).id);
+    }
+
+    @Override
+    public int hashCode() {
+        // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
+        return getClass().hashCode();
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "ExistingResource{" +
+            "id=" + getId() +
+            ", dataName='" + getDataName() + "'" +
+            ", dataType='" + getDataType() + "'" +
+            ", name='" + getName() + "'" +
+            ", datacenterId='" + getDatacenterId() + "'" +
+            ", user='" + getUser() + "'" +
+            ", provider='" + getProvider() + "'" +
+            ", createdDate='" + getCreatedDate() + "'" +
+            ", lastModifiedDate='" + getLastModifiedDate() + "'" +
+            ", deletedDate='" + getDeletedDate() + "'" +
+            "}";
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/Image.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/Image.java
new file mode 100644
index 0000000000000000000000000000000000000000..f3b16ac96f73b311f36572bec0fa24cf8d24208b
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/Image.java
@@ -0,0 +1,213 @@
+package com.piacere.iec.backend.domain;
+
+import java.io.Serializable;
+import java.time.Instant;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * An Image.
+ */
+@Entity
+@Table(name = "image")
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Image implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @NotNull
+    @Size(max = 10)
+    @Column(name = "image_type", length = 10, nullable = false)
+    private String imageType;
+    
+    @Size(max = 100)
+    @Column(name = "image_name", length = 100, nullable = true)
+    private String imageName;
+
+    @Size(max = 255)
+    @Column(name = "image_url", length = 255, nullable = true)
+    private String imageUrl;
+    
+    @Column(name = "image_description", nullable = true)
+    private String imageDescription;
+    
+    @NotNull
+    @Size(max = 70)
+    @Column(name = "image_provider", length = 70, nullable = false)
+    private String imageProvider;
+
+    @NotNull
+    @Column(name = "created_date", nullable = false)
+    private Instant createdDate;
+
+    @Column(name = "last_modified_date")
+    private Instant lastModifiedDate;
+
+    @Column(name = "deleted_date")
+    private Instant deletedDate;
+    
+    
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Image id(Long id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getImageType() {
+		return imageType;
+	}
+
+    public Image imageType(String imageType) {
+        this.imageType = imageType;
+        return this;
+    }
+    
+	public void setImageType(String imageType) {
+		this.imageType = imageType;
+	}
+
+	public String getImageName() {
+        return this.imageName;
+    }
+
+    public Image imageName(String imageName) {
+        this.imageName = imageName;
+        return this;
+    }
+
+    public void setImageName(String imageName) {
+        this.imageName = imageName;
+    }
+
+    public String getImageUrl() {
+        return this.imageUrl;
+    }
+
+    public Image imageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+        return this;
+    }
+
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public String getImageDescription() {
+        return this.imageDescription;
+    }
+
+    public Image imageDescription(String imageDescription) {
+        this.imageDescription = imageDescription;
+        return this;
+    }
+
+    public void setImageDescription(String imageDescription) {
+        this.imageDescription = imageDescription;
+    }
+    
+    public String getImageProvider() {
+        return this.imageProvider;
+    }
+
+    public Image imageProvider(String imageProvider) {
+        this.imageProvider = imageProvider;
+        return this;
+    }
+
+    public void setImageProvider(String imageProvider) {
+        this.imageProvider = imageProvider;
+    }
+
+    public Instant getCreatedDate() {
+        return this.createdDate;
+    }
+
+    public Image createdDate(Instant createdDate) {
+        this.createdDate = createdDate;
+        return this;
+    }
+
+    public void setCreatedDate(Instant createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public Instant getLastModifiedDate() {
+        return this.lastModifiedDate;
+    }
+
+    public Image lastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+        return this;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
+    public Instant getDeletedDate() {
+        return this.deletedDate;
+    }
+
+    public Image deletedDate(Instant deletedDate) {
+        this.deletedDate = deletedDate;
+        return this;
+    }
+
+    public void setDeletedDate(Instant deletedDate) {
+        this.deletedDate = deletedDate;
+    }
+    
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof Image)) {
+            return false;
+        }
+        return id != null && id.equals(((Image) o).id);
+    }
+
+    @Override
+    public int hashCode() {
+        return getClass().hashCode();
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "Image{" +
+            "id=" + getId() +
+            ", imageType='" + getImageType() + "'" +
+            ", imageName='" + getImageName() + "'" +
+            ", imageUrl='" + getImageUrl() + "'" +
+            ", imageDescription='" + getImageDescription() + "'" +
+            ", imageProvider='" + getImageProvider() + "'" +
+            ", createdDate='" + getCreatedDate() + "'" +
+            ", lastModifiedDate='" + getLastModifiedDate() + "'" +
+            ", deletedDate='" + getDeletedDate() + "'" +
+            "}";
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/enumeration/ImageType.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/enumeration/ImageType.java
new file mode 100644
index 0000000000000000000000000000000000000000..a53ded40727fd462f22cd61a1222904ec309ab74
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/domain/enumeration/ImageType.java
@@ -0,0 +1,35 @@
+package com.piacere.iec.backend.domain.enumeration;
+
+/**
+ * Enumeration for Image types.
+ * @author Tecnalia
+ * @version 1.0
+ */
+public enum ImageType {
+	IMAGE_DOCKER("Docker"),
+	IMAGE_VM("VM");
+	
+	
+	/** The value. */
+	private String value;
+	
+	
+	
+	/**
+     * Constructs an Image.
+     * @param value The value.
+     */
+	private ImageType(final String value) {
+		this.value = value;
+	}
+	
+	
+	
+	/**
+     * Gets the value.
+     * @return String
+     */
+	public String getValue() {
+		return value;
+	}
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/repository/ExistingResourceRepository.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/repository/ExistingResourceRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..b2940473ea4085b748d60cf26b145234dd36f749
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/repository/ExistingResourceRepository.java
@@ -0,0 +1,17 @@
+package com.piacere.iec.backend.repository;
+
+import java.util.Optional;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import com.piacere.iec.backend.domain.ExistingResource;
+
+/**
+ * Spring Data SQL repository for the ExistingResource entity.
+ */
+@SuppressWarnings("unused")
+@Repository
+public interface ExistingResourceRepository extends JpaRepository<ExistingResource, Long>, JpaSpecificationExecutor<ExistingResource> {
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/repository/ImageRepository.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/repository/ImageRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..056aa6c2c805574b76042265f178947764ad6534
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/repository/ImageRepository.java
@@ -0,0 +1,15 @@
+package com.piacere.iec.backend.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import com.piacere.iec.backend.domain.Image;
+
+/**
+ * Spring Data SQL repository for the Image entity.
+ */
+@SuppressWarnings("unused")
+@Repository
+public interface ImageRepository extends JpaRepository<Image, Long>, JpaSpecificationExecutor<Image> {
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ExistingResourceQueryService.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ExistingResourceQueryService.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8f447388ddfe3b2f5a0bb45cdb6bca7e1c37d8c
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ExistingResourceQueryService.java
@@ -0,0 +1,122 @@
+package com.piacere.iec.backend.service;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+// for static metamodels
+import com.piacere.iec.backend.domain.ExistingResource;
+import com.piacere.iec.backend.domain.ExistingResource_;
+import com.piacere.iec.backend.repository.ExistingResourceRepository;
+import com.piacere.iec.backend.service.criteria.ExistingResourceCriteria;
+import com.piacere.iec.backend.service.dto.ExistingResourceDTO;
+import com.piacere.iec.backend.service.mapper.ExistingResourceMapper;
+
+import tech.jhipster.service.QueryService;
+
+/**
+ * Service for executing complex queries for {@link ExistingResource} entities in the database.
+ * The main input is a {@link ExistingResourceCriteria} which gets converted to {@link Specification},
+ * in a way that all the filters must apply.
+ * It returns a {@link List} of {@link ExistingResourceDTO} or a {@link Page} of {@link ExistingResourceDTO} which fulfills the criteria.
+ */
+@Service
+@Transactional(readOnly = true)
+public class ExistingResourceQueryService extends QueryService<ExistingResource> {
+
+    private final Logger log = LoggerFactory.getLogger(ExistingResourceQueryService.class);
+
+    private final ExistingResourceRepository existingResourceRepository;
+
+    private final ExistingResourceMapper existingResourceMapper;
+
+    public ExistingResourceQueryService(ExistingResourceRepository existingResourceRepository, ExistingResourceMapper existingResourceMapper) {
+        this.existingResourceRepository = existingResourceRepository;
+        this.existingResourceMapper = existingResourceMapper;
+    }
+
+    /**
+     * Return a {@link List} of {@link ExistingResourceDTO} which matches the criteria from the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the matching entities.
+     */
+    @Transactional(readOnly = true)
+    public List<ExistingResourceDTO> findByCriteria(ExistingResourceCriteria criteria) {
+        log.debug("find by criteria : {}", criteria);
+        final Specification<ExistingResource> specification = createSpecification(criteria);
+        return existingResourceMapper.toDto(existingResourceRepository.findAll(specification));
+    }
+
+    /**
+     * Return a {@link Page} of {@link ExistingResourceDTO} which matches the criteria from the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @param page The page, which should be returned.
+     * @return the matching entities.
+     */
+    @Transactional(readOnly = true)
+    public Page<ExistingResourceDTO> findByCriteria(ExistingResourceCriteria criteria, Pageable page) {
+        log.debug("find by criteria : {}, page: {}", criteria, page);
+        final Specification<ExistingResource> specification = createSpecification(criteria);
+        return existingResourceRepository.findAll(specification, page).map(existingResourceMapper::toDto);
+    }
+
+    /**
+     * Return the number of matching entities in the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the number of matching entities.
+     */
+    @Transactional(readOnly = true)
+    public long countByCriteria(ExistingResourceCriteria criteria) {
+        log.debug("count by criteria : {}", criteria);
+        final Specification<ExistingResource> specification = createSpecification(criteria);
+        return existingResourceRepository.count(specification);
+    }
+
+    /**
+     * Function to convert {@link ExistingResourceCriteria} to a {@link Specification}
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the matching {@link Specification} of the entity.
+     */
+    protected Specification<ExistingResource> createSpecification(ExistingResourceCriteria criteria) {
+        Specification<ExistingResource> specification = Specification.where(null);
+        if (criteria != null) {
+            if (criteria.getId() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getId(), ExistingResource_.id));
+            }
+            if (criteria.getDataName() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getDataName(), ExistingResource_.dataName));
+            }
+            if (criteria.getDataType() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getDataType(), ExistingResource_.dataType));
+            }
+            if (criteria.getName() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getName(), ExistingResource_.name));
+            }
+            if (criteria.getDatacenterId() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getDatacenterId(), ExistingResource_.datacenterId));
+            }
+            if (criteria.getUser() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getUser(), ExistingResource_.user));
+            }
+            if (criteria.getProvider() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getProvider(), ExistingResource_.provider));
+            }
+            if (criteria.getCreatedDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getCreatedDate(), ExistingResource_.createdDate));
+            }
+            if (criteria.getLastModifiedDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getLastModifiedDate(), ExistingResource_.lastModifiedDate));
+            }
+            if (criteria.getDeletedDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getDeletedDate(), ExistingResource_.deletedDate));
+            }
+        }
+        return specification;
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ExistingResourceService.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ExistingResourceService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d12cc6e8cfba3c4948d97ae36f1f088517aaccf2
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ExistingResourceService.java
@@ -0,0 +1,52 @@
+package com.piacere.iec.backend.service;
+
+import java.util.Optional;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import com.piacere.iec.backend.service.dto.ExistingResourceDTO;
+
+/**
+ * Service Interface for managing {@link com.piacere.iec.backend.domain.ExistingResource}.
+ */
+public interface ExistingResourceService {
+    /**
+     * Save a existingResource.
+     *
+     * @param ExistingResourceDTO the entity to save.
+     * @return the persisted entity.
+     */
+    ExistingResourceDTO save(ExistingResourceDTO existingResourceDTO);
+
+    /**
+     * Partially updates a existingResource.
+     *
+     * @param existingResourceDTO the entity to update partially.
+     * @return the persisted entity.
+     */
+    Optional<ExistingResourceDTO> partialUpdate(ExistingResourceDTO existingResourceDTO);
+
+    /**
+     * Get all the existingResources.
+     *
+     * @param pageable the pagination information.
+     * @return the list of entities.
+     */
+    Page<ExistingResourceDTO> findAll(Pageable pageable);
+
+    /**
+     * Get the "id" existingResource.
+     *
+     * @param id the id of the entity.
+     * @return the entity.
+     */
+    Optional<ExistingResourceDTO> findOne(Long id);
+
+    /**
+     * Delete the "id" existingResource.
+     *
+     * @param id the id of the entity.
+     */
+    void delete(Long id);
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ImageQueryService.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ImageQueryService.java
new file mode 100644
index 0000000000000000000000000000000000000000..490e2ecfb2bd0eaba8accd2e71a6d91731c696b2
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ImageQueryService.java
@@ -0,0 +1,118 @@
+package com.piacere.iec.backend.service;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.piacere.iec.backend.domain.Image;
+import com.piacere.iec.backend.domain.Image_;
+import com.piacere.iec.backend.repository.ImageRepository;
+import com.piacere.iec.backend.service.criteria.ImageCriteria;
+import com.piacere.iec.backend.service.dto.ImageDTO;
+import com.piacere.iec.backend.service.mapper.ImageMapper;
+
+import tech.jhipster.service.QueryService;
+
+/**
+ * Service for executing complex queries for {@link Image} entities in the database.
+ * The main input is a {@link ImageCriteria} which gets converted to {@link Specification},
+ * in a way that all the filters must apply.
+ * It returns a {@link List} of {@link ImageDTO} or a {@link Page} of {@link ImageDTO} which fulfills the criteria.
+ */
+@Service
+@Transactional(readOnly = true)
+public class ImageQueryService extends QueryService<Image> {
+
+    private final Logger log = LoggerFactory.getLogger(ImageQueryService.class);
+
+    private final ImageRepository imageRepository;
+
+    private final ImageMapper imageMapper;
+
+    public ImageQueryService(ImageRepository imageRepository, ImageMapper imageMapper) {
+        this.imageRepository = imageRepository;
+        this.imageMapper = imageMapper;
+    }
+
+    /**
+     * Return a {@link List} of {@link ImageDTO} which matches the criteria from the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the matching entities.
+     */
+    @Transactional(readOnly = true)
+    public List<ImageDTO> findByCriteria(ImageCriteria criteria) {
+        log.debug("find by criteria : {}", criteria);
+        final Specification<Image> specification = createSpecification(criteria);
+        return imageMapper.toDto(imageRepository.findAll(specification));
+    }
+
+    /**
+     * Return a {@link Page} of {@link ImageDTO} which matches the criteria from the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @param page The page, which should be returned.
+     * @return the matching entities.
+     */
+    @Transactional(readOnly = true)
+    public Page<ImageDTO> findByCriteria(ImageCriteria criteria, Pageable page) {
+        log.debug("find by criteria : {}, page: {}", criteria, page);
+        final Specification<Image> specification = createSpecification(criteria);
+        return imageRepository.findAll(specification, page).map(imageMapper::toDto);
+    }
+
+    /**
+     * Return the number of matching entities in the database.
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the number of matching entities.
+     */
+    @Transactional(readOnly = true)
+    public long countByCriteria(ImageCriteria criteria) {
+        log.debug("count by criteria : {}", criteria);
+        final Specification<Image> specification = createSpecification(criteria);
+        return imageRepository.count(specification);
+    }
+
+    /**
+     * Function to convert {@link ImageCriteria} to a {@link Specification}
+     * @param criteria The object which holds all the filters, which the entities should match.
+     * @return the matching {@link Specification} of the entity.
+     */
+    protected Specification<Image> createSpecification(ImageCriteria criteria) {
+        Specification<Image> specification = Specification.where(null);
+        if (criteria != null) {
+            if (criteria.getId() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getId(), Image_.id));
+            }
+            if (criteria.getImageType() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getImageType(), Image_.imageType));
+            }
+            if (criteria.getImageName() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getImageName(), Image_.imageName));
+            }
+            if (criteria.getImageUrl() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getImageUrl(), Image_.imageUrl));
+            }
+            if (criteria.getImageDescription() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getImageDescription(), Image_.imageDescription));
+            }
+            if (criteria.getImageProvider() != null) {
+                specification = specification.and(buildStringSpecification(criteria.getImageProvider(), Image_.imageProvider));
+            }
+            if (criteria.getCreatedDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getCreatedDate(), Image_.createdDate));
+            }
+            if (criteria.getLastModifiedDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getLastModifiedDate(), Image_.lastModifiedDate));
+            }
+            if (criteria.getDeletedDate() != null) {
+                specification = specification.and(buildRangeSpecification(criteria.getDeletedDate(), Image_.deletedDate));
+            }
+        }
+        return specification;
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ImageService.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ImageService.java
new file mode 100644
index 0000000000000000000000000000000000000000..83e620acf0e3227e5ab5c41a402075c62cc63ecc
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/ImageService.java
@@ -0,0 +1,52 @@
+package com.piacere.iec.backend.service;
+
+import java.util.Optional;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+import com.piacere.iec.backend.service.dto.ImageDTO;
+
+/**
+ * Service Interface for managing {@link com.piacere.iec.backend.domain.Image}.
+ */
+public interface ImageService {
+    /**
+     * Save an image.
+     *
+     * @param ImageDTO the entity to save.
+     * @return the persisted entity.
+     */
+	ImageDTO save(ImageDTO imageDTO);
+
+    /**
+     * Partially updates an image.
+     *
+     * @param imageDTO the entity to update partially.
+     * @return the persisted entity.
+     */
+    Optional<ImageDTO> partialUpdate(ImageDTO imageDTO);
+
+    /**
+     * Get all the images.
+     *
+     * @param pageable the pagination information.
+     * @return the list of entities.
+     */
+    Page<ImageDTO> findAll(Pageable pageable);
+
+    /**
+     * Get the "id" image.
+     *
+     * @param id the id of the entity.
+     * @return the entity.
+     */
+    Optional<ImageDTO> findOne(Long id);
+
+    /**
+     * Delete the "id" image.
+     *
+     * @param id the id of the entity.
+     */
+    void delete(Long id);
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/criteria/ExistingResourceCriteria.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/criteria/ExistingResourceCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..30cc519da6672062d20cac310f6c58431b489442
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/criteria/ExistingResourceCriteria.java
@@ -0,0 +1,259 @@
+package com.piacere.iec.backend.service.criteria;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import tech.jhipster.service.Criteria;
+import tech.jhipster.service.filter.Filter;
+import tech.jhipster.service.filter.InstantFilter;
+import tech.jhipster.service.filter.LongFilter;
+import tech.jhipster.service.filter.StringFilter;
+
+/**
+ * Criteria class for the {@link com.piacere.iec.backend.domain.ExistingResource} entity. This class is used
+ * in {@link com.piacere.iec.backend.web.rest.ExistingResourceResource} to receive all the possible filtering options from
+ * the Http GET request parameters.
+ * For example the following could be a valid request:
+ * {@code /existing-resources?id.greaterThan=5&attr1.contains=something&attr2.specified=false}
+ * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use
+ * fix type specific filters.
+ */
+public class ExistingResourceCriteria implements Serializable, Criteria {
+
+    private static final long serialVersionUID = 1L;
+
+    private LongFilter id;
+
+    private StringFilter dataName;
+
+    private StringFilter dataType;
+
+    private StringFilter name;
+
+    private StringFilter datacenterId;
+
+    private StringFilter user;
+
+    private StringFilter provider;
+
+    private InstantFilter createdDate;
+
+    private InstantFilter lastModifiedDate;
+
+    private InstantFilter deletedDate;
+
+    public ExistingResourceCriteria() {}
+
+    public ExistingResourceCriteria(ExistingResourceCriteria other) {
+        this.id = other.id == null ? null : other.id.copy();
+        this.dataName = other.dataName == null ? null : other.dataName.copy();
+        this.dataType = other.dataType == null ? null : other.dataType.copy();
+        this.name = other.name == null ? null : other.name.copy();
+        this.datacenterId = other.datacenterId == null ? null : other.datacenterId.copy();
+        this.user = other.user == null ? null : other.user.copy();
+        this.provider = other.provider == null ? null : other.provider.copy();
+        this.createdDate = other.createdDate == null ? null : other.createdDate.copy();
+        this.lastModifiedDate = other.lastModifiedDate == null ? null : other.lastModifiedDate.copy();
+        this.deletedDate = other.deletedDate == null ? null : other.deletedDate.copy();
+    }
+
+    @Override
+    public ExistingResourceCriteria copy() {
+        return new ExistingResourceCriteria(this);
+    }
+
+    public LongFilter getId() {
+        return id;
+    }
+
+    public LongFilter id() {
+        if (id == null) {
+            id = new LongFilter();
+        }
+        return id;
+    }
+
+    public void setId(LongFilter id) {
+        this.id = id;
+    }
+
+    public StringFilter getDataName() {
+        return dataName;
+    }
+
+    public StringFilter dataName() {
+        if (dataName == null) {
+            dataName = new StringFilter();
+        }
+        return dataName;
+    }
+
+    public void setDataName(StringFilter dataName) {
+        this.dataName = dataName;
+    }
+
+    public StringFilter getDataType() {
+        return dataType;
+    }
+
+    public StringFilter dataType() {
+        if (dataType == null) {
+            dataType = new StringFilter();
+        }
+        return dataType;
+    }
+
+    public void setDataType(StringFilter dataType) {
+        this.dataType = dataType;
+    }
+
+    public StringFilter getName() {
+        return name;
+    }
+
+    public StringFilter name() {
+        if (name == null) {
+            name = new StringFilter();
+        }
+        return name;
+    }
+
+    public void setName(StringFilter name) {
+        this.name = name;
+    }
+
+    public StringFilter getDatacenterId() {
+        return datacenterId;
+    }
+
+    public StringFilter datacenterId() {
+        if (datacenterId == null) {
+            datacenterId = new StringFilter();
+        }
+        return datacenterId;
+    }
+
+    public void setDatacenterId(StringFilter datacenterId) {
+        this.datacenterId = datacenterId;
+    }
+
+    public StringFilter getUser() {
+        return user;
+    }
+
+    public StringFilter user() {
+        if (user == null) {
+            user = new StringFilter();
+        }
+        return user;
+    }
+
+    public void setUser(StringFilter user) {
+        this.user = user;
+    }
+
+    public StringFilter getProvider() {
+        return provider;
+    }
+
+    public StringFilter provider() {
+        if (provider == null) {
+            provider = new StringFilter();
+        }
+        return provider;
+    }
+
+    public void setProvider(StringFilter provider) {
+        this.provider = provider;
+    }
+
+    public InstantFilter getCreatedDate() {
+        return createdDate;
+    }
+
+    public InstantFilter createdDate() {
+        if (createdDate == null) {
+            createdDate = new InstantFilter();
+        }
+        return createdDate;
+    }
+
+    public void setCreatedDate(InstantFilter createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public InstantFilter getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public InstantFilter lastModifiedDate() {
+        if (lastModifiedDate == null) {
+            lastModifiedDate = new InstantFilter();
+        }
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(InstantFilter lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
+    public InstantFilter getDeletedDate() {
+        return deletedDate;
+    }
+
+    public InstantFilter deletedDate() {
+        if (deletedDate == null) {
+            deletedDate = new InstantFilter();
+        }
+        return deletedDate;
+    }
+
+    public void setDeletedDate(InstantFilter deletedDate) {
+        this.deletedDate = deletedDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        final ExistingResourceCriteria that = (ExistingResourceCriteria) o;
+        return (
+            Objects.equals(id, that.id) &&
+            Objects.equals(dataName, that.dataName) &&
+            Objects.equals(dataType, that.dataType) &&
+            Objects.equals(name, that.name) &&
+            Objects.equals(datacenterId, that.datacenterId) &&
+            Objects.equals(user, that.user) &&
+            Objects.equals(provider, that.provider) &&
+            Objects.equals(createdDate, that.createdDate) &&
+            Objects.equals(lastModifiedDate, that.lastModifiedDate) &&
+            Objects.equals(deletedDate, that.deletedDate)
+        );
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, dataName, dataType, name, datacenterId, user, provider, createdDate, lastModifiedDate, deletedDate);
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "ExistingResourceCriteria{" +
+            (id != null ? "id=" + id + ", " : "") +
+            (dataName != null ? "dataName=" + dataName + ", " : "") +
+            (dataType != null ? "dataType=" + dataType + ", " : "") +
+            (name != null ? "name=" + name + ", " : "") +
+            (datacenterId != null ? "datacenterId=" + datacenterId + ", " : "") +
+            (user != null ? "user=" + user + ", " : "") +
+            (provider != null ? "provider=" + provider + ", " : "") +
+            (createdDate != null ? "createdDate=" + createdDate + ", " : "") +
+            (lastModifiedDate != null ? "lastModifiedDate=" + lastModifiedDate + ", " : "") +
+            (deletedDate != null ? "deletedDate=" + deletedDate + ", " : "") +
+            "}";
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/criteria/ImageCriteria.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/criteria/ImageCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..f40789b28106e3de988eccc3122e5e47af4d3385
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/criteria/ImageCriteria.java
@@ -0,0 +1,239 @@
+package com.piacere.iec.backend.service.criteria;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import tech.jhipster.service.Criteria;
+import tech.jhipster.service.filter.Filter;
+import tech.jhipster.service.filter.InstantFilter;
+import tech.jhipster.service.filter.LongFilter;
+import tech.jhipster.service.filter.StringFilter;
+
+/**
+ * Criteria class for the {@link com.piacere.iec.backend.domain.Image} entity. This class is used
+ * in {@link com.piacere.iec.backend.web.rest.ImageResource} to receive all the possible filtering options from
+ * the Http GET request parameters.
+ * For example the following could be a valid request:
+ * {@code /images?id.greaterThan=5&attr1.contains=something&attr2.specified=false}
+ * As Spring is unable to properly convert the types, unless specific {@link Filter} class are used, we need to use
+ * fix type specific filters.
+ */
+public class ImageCriteria implements Serializable, Criteria {
+
+    private static final long serialVersionUID = 1L;
+
+    private LongFilter id;
+
+    private StringFilter imageType;
+
+    private StringFilter imageName;
+
+    private StringFilter imageUrl;
+
+    private StringFilter imageDescription;
+
+    private StringFilter imageProvider;
+
+    private InstantFilter createdDate;
+
+    private InstantFilter lastModifiedDate;
+
+    private InstantFilter deletedDate;
+
+    public ImageCriteria() {}
+
+    public ImageCriteria(ImageCriteria other) {
+        this.id = other.id == null ? null : other.id.copy();
+        this.imageType = other.imageType == null ? null : other.imageType.copy();
+        this.imageName = other.imageName == null ? null : other.imageName.copy();
+        this.imageUrl = other.imageUrl == null ? null : other.imageUrl.copy();
+        this.imageDescription = other.imageDescription == null ? null : other.imageDescription.copy();
+        this.imageProvider = other.imageProvider == null ? null : other.imageProvider.copy();
+        this.createdDate = other.createdDate == null ? null : other.createdDate.copy();
+        this.lastModifiedDate = other.lastModifiedDate == null ? null : other.lastModifiedDate.copy();
+        this.deletedDate = other.deletedDate == null ? null : other.deletedDate.copy();
+    }
+
+    @Override
+    public ImageCriteria copy() {
+        return new ImageCriteria(this);
+    }
+
+    public LongFilter getId() {
+        return id;
+    }
+
+    public LongFilter id() {
+        if (id == null) {
+            id = new LongFilter();
+        }
+        return id;
+    }
+
+    public void setId(LongFilter id) {
+        this.id = id;
+    }
+
+    public StringFilter getImageType() {
+        return imageType;
+    }
+
+    public StringFilter imageType() {
+        if (imageType == null) {
+        	imageType = new StringFilter();
+        }
+        return imageType;
+    }
+
+    public void setImageType(StringFilter imageType) {
+        this.imageType = imageType;
+    }
+
+    public StringFilter getImageName() {
+        return imageName;
+    }
+
+    public StringFilter imageName() {
+        if (imageName == null) {
+        	imageName = new StringFilter();
+        }
+        return imageName;
+    }
+
+    public void setImageName(StringFilter imageName) {
+        this.imageName = imageName;
+    }
+
+    public StringFilter getImageUrl() {
+        return imageUrl;
+    }
+
+    public StringFilter imageUrl() {
+        if (imageUrl == null) {
+        	imageUrl = new StringFilter();
+        }
+        return imageUrl;
+    }
+
+    public void setImageUrl(StringFilter imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public StringFilter getImageDescription() {
+        return imageDescription;
+    }
+
+    public StringFilter imageDescription() {
+        if (imageDescription == null) {
+        	imageDescription = new StringFilter();
+        }
+        return imageDescription;
+    }
+
+    public void setImageDescription(StringFilter imageDescription) {
+        this.imageDescription = imageDescription;
+    }
+
+    public StringFilter getImageProvider() {
+        return imageProvider;
+    }
+
+    public StringFilter imageProvider() {
+        if (imageProvider == null) {
+        	imageProvider = new StringFilter();
+        }
+        return imageProvider;
+    }
+
+    public void setImageProvider(StringFilter imageProvider) {
+        this.imageProvider = imageProvider;
+    }
+
+    public InstantFilter getCreatedDate() {
+        return createdDate;
+    }
+
+    public InstantFilter createdDate() {
+        if (createdDate == null) {
+            createdDate = new InstantFilter();
+        }
+        return createdDate;
+    }
+
+    public void setCreatedDate(InstantFilter createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public InstantFilter getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public InstantFilter lastModifiedDate() {
+        if (lastModifiedDate == null) {
+            lastModifiedDate = new InstantFilter();
+        }
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(InstantFilter lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
+    public InstantFilter getDeletedDate() {
+        return deletedDate;
+    }
+
+    public InstantFilter deletedDate() {
+        if (deletedDate == null) {
+            deletedDate = new InstantFilter();
+        }
+        return deletedDate;
+    }
+
+    public void setDeletedDate(InstantFilter deletedDate) {
+        this.deletedDate = deletedDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        final ImageCriteria that = (ImageCriteria) o;
+        return (
+            Objects.equals(id, that.id) &&
+            Objects.equals(imageType, that.imageType) &&
+            Objects.equals(imageName, that.imageName) &&
+            Objects.equals(imageUrl, that.imageUrl) &&
+            Objects.equals(imageDescription, that.imageDescription) &&
+            Objects.equals(imageProvider, that.imageProvider) &&
+            Objects.equals(createdDate, that.createdDate) &&
+            Objects.equals(lastModifiedDate, that.lastModifiedDate) &&
+            Objects.equals(deletedDate, that.deletedDate)
+        );
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, imageType, imageName, imageUrl, imageDescription, imageProvider, createdDate, lastModifiedDate, deletedDate);
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "ImageCriteria{" +
+            (id != null ? "id=" + id + ", " : "") +
+            (imageType != null ? "imageType=" + imageType + ", " : "") +
+            (imageName != null ? "imageName=" + imageName + ", " : "") +
+            (imageUrl != null ? "imageUrl=" + imageUrl + ", " : "") +
+            (imageDescription != null ? "imageDescription=" + imageDescription + ", " : "") +
+            (imageProvider != null ? "imageProvider=" + imageProvider + ", " : "") +
+            (createdDate != null ? "createdDate=" + createdDate + ", " : "") +
+            (lastModifiedDate != null ? "lastModifiedDate=" + lastModifiedDate + ", " : "") +
+            (deletedDate != null ? "deletedDate=" + deletedDate + ", " : "") +
+            "}";
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ExistingResourceDTO.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ExistingResourceDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc59b5052ab8b757489160cfc5c1a19d589d92c4
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ExistingResourceDTO.java
@@ -0,0 +1,177 @@
+package com.piacere.iec.backend.service.dto;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.Objects;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * A DTO for the {@link com.piacere.iec.backend.domain.ExistingResourceDTO} entity.
+ */
+public class ExistingResourceDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+
+    @NotNull
+    @Size(max = 70)
+    private String dataName;
+    
+    @NotNull
+    @Size(max = 70)
+    private String dataType;
+
+    @NotNull
+    @Size(max = 70)
+    private String name;
+
+    @NotNull
+    @Size(max = 70)
+    private String datacenterId;
+
+    @NotNull
+    @Size(max = 70)
+    private String user;
+
+    @NotNull
+    @Size(max = 70)
+    private String provider;
+
+    @NotNull
+    @JsonIgnore
+    private Instant createdDate;
+
+    @JsonIgnore
+    private Instant lastModifiedDate;
+    
+    @JsonIgnore
+    private Instant deletedDate;
+    
+    public ExistingResourceDTO() {
+		super();
+	}
+
+    
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getDataName() {
+		return dataName;
+	}
+
+	public void setDataName(String dataName) {
+		this.dataName = dataName;
+	}
+
+	public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDatacenterId() {
+        return datacenterId;
+    }
+
+    public void setDatacenterId(String datacenterId) {
+        this.datacenterId = datacenterId;
+    }
+
+    public String getUser() {
+		return user;
+	}
+
+	public void setUser(String user) {
+		this.user = user;
+	}
+
+    public String getProvider() {
+		return provider;
+	}
+
+	public void setProvider(String provider) {
+		this.provider = provider;
+	}
+
+    public Instant getCreatedDate() {
+        return createdDate;
+    }
+
+    public void setCreatedDate(Instant createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public Instant getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
+    public Instant getDeletedDate() {
+        return deletedDate;
+    }
+
+    public void setDeletedDate(Instant deletedDate) {
+        this.deletedDate = deletedDate;
+  	}
+
+	@Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof ExistingResourceDTO)) {
+            return false;
+        }
+
+        ExistingResourceDTO existingResourceDTO = (ExistingResourceDTO) o;
+        if (this.id == null) {
+            return false;
+        }
+        return Objects.equals(this.id, existingResourceDTO.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(this.id);
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "ExistingResourceDTO{" +
+            "id=" + getId() +
+            ", dataName='" + getDataName() + "'" +            
+            ", dataType='" + getDataType() + "'" +
+            ", name='" + getName() + "'" +
+            ", datacenterId='" + getDatacenterId() + "'" +
+            ", user='" + getUser() + "'" +
+            ", provider='" + getProvider() + "'" +
+            ", createdDate='" + getCreatedDate() + "'" +
+            ", lastModifiedDate='" + getLastModifiedDate() + "'" +
+            ", deletedDate='" + getDeletedDate() + "'" +
+            "}";
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ImageDTO.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ImageDTO.java
new file mode 100644
index 0000000000000000000000000000000000000000..84b77d4855ab4a54c9b8142f6fa67b8c3db3466b
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ImageDTO.java
@@ -0,0 +1,160 @@
+package com.piacere.iec.backend.service.dto;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.Objects;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * A DTO for the {@link com.piacere.iec.backend.domain.ImageDTO} entity.
+ */
+public class ImageDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+
+    @NotNull
+    @Size(max = 10)
+    private String imageType;
+    
+    @Size(max = 70)
+    private String imageName;
+
+    @Size(max = 255)
+    private String imageUrl;
+
+    private String imageDescription;
+
+    @NotNull
+    @Size(max = 70)
+    private String imageProvider;
+
+    @NotNull
+    @JsonIgnore
+    private Instant createdDate;
+
+    @JsonIgnore
+    private Instant lastModifiedDate;
+    
+    @JsonIgnore
+    private Instant deletedDate;
+    
+    public ImageDTO() {
+		super();
+	}
+
+    
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getImageType() {
+		return imageType;
+	}
+
+	public void setImageType(String imageType) {
+		this.imageType = imageType;
+	}
+
+	public String getImageName() {
+        return imageName;
+    }
+
+    public void setImageName(String imageName) {
+        this.imageName = imageName;
+    }
+
+    public String getImageUrl() {
+        return imageUrl;
+    }
+
+    public void setImageUrl(String imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    public String getImageDescription() {
+        return imageDescription;
+    }
+
+    public void setImageDescription(String imageDescription) {
+        this.imageDescription = imageDescription;
+    }
+
+    public String getImageProvider() {
+		return imageProvider;
+	}
+
+	public void setImageProvider(String imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+
+    public Instant getCreatedDate() {
+        return createdDate;
+    }
+
+    public void setCreatedDate(Instant createdDate) {
+        this.createdDate = createdDate;
+    }
+
+    public Instant getLastModifiedDate() {
+        return lastModifiedDate;
+    }
+
+    public void setLastModifiedDate(Instant lastModifiedDate) {
+        this.lastModifiedDate = lastModifiedDate;
+    }
+
+    public Instant getDeletedDate() {
+        return deletedDate;
+    }
+
+    public void setDeletedDate(Instant deletedDate) {
+        this.deletedDate = deletedDate;
+  	}
+
+	@Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof ImageDTO)) {
+            return false;
+        }
+
+        ImageDTO imageDTO = (ImageDTO) o;
+        if (this.id == null) {
+            return false;
+        }
+        return Objects.equals(this.id, imageDTO.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(this.id);
+    }
+
+    // prettier-ignore
+    @Override
+    public String toString() {
+        return "imageDTO{" +
+            "id=" + getId() +
+            ", imageType='" + getImageType() + "'" +            
+            ", imageName='" + getImageName() + "'" +
+            ", imageUrl='" + getImageUrl() + "'" +
+            ", imageDescription='" + getImageDescription() + "'" +
+            ", imageProvider='" + getImageProvider() + "'" +
+            ", createdDate='" + getCreatedDate() + "'" +
+            ", lastModifiedDate='" + getLastModifiedDate() + "'" +
+            ", deletedDate='" + getDeletedDate() + "'" +
+            "}";
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ServiceAttributeValueDTO.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ServiceAttributeValueDTO.java
index de9dd5f40e39bc0c8bf6581693820640fa5acbc7..95afeeb83356ececdf8a3198505aab3067d9a9c1 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ServiceAttributeValueDTO.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/dto/ServiceAttributeValueDTO.java
@@ -12,7 +12,9 @@ import javax.validation.constraints.Size;
  */
 public class ServiceAttributeValueDTO implements Serializable {
 
-    private Long id;
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
 
     @Size(max = 50)
     private String serviceAttributeValue;
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/impl/ExistingResourceServiceImpl.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/impl/ExistingResourceServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..33e4e22c068c42b2a7bdfc34d67805b1e16b83a9
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/impl/ExistingResourceServiceImpl.java
@@ -0,0 +1,80 @@
+package com.piacere.iec.backend.service.impl;
+
+import java.util.Optional;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.piacere.iec.backend.domain.ExistingResource;
+import com.piacere.iec.backend.repository.ExistingResourceRepository;
+import com.piacere.iec.backend.service.ExistingResourceService;
+import com.piacere.iec.backend.service.dto.ExistingResourceDTO;
+import com.piacere.iec.backend.service.mapper.ExistingResourceMapper;
+
+/**
+ * Service Implementation for managing {@link ExistingResource}.
+ */
+@Service
+@Transactional
+public class ExistingResourceServiceImpl implements ExistingResourceService {
+
+    private final Logger log = LoggerFactory.getLogger(ExistingResourceServiceImpl.class);
+
+    private final ExistingResourceRepository existingResourceRepository;
+    private final ExistingResourceMapper existingResourceMapper;
+
+    public ExistingResourceServiceImpl(
+            ExistingResourceRepository existingResourceRepository,
+    		ExistingResourceMapper existingResourceMapper) {
+        this.existingResourceRepository = existingResourceRepository;
+        this.existingResourceMapper = existingResourceMapper;
+    }
+
+    @Override
+    public ExistingResourceDTO save(ExistingResourceDTO existingResourceDTO) {
+        log.debug("Request to save ExistingResource : {}", existingResourceDTO);
+        ExistingResource existingResource = existingResourceMapper.toEntity(existingResourceDTO);
+        existingResource = existingResourceRepository.save(existingResource);
+        return existingResourceMapper.toDto(existingResource);
+    }
+
+    @Override
+    public Optional<ExistingResourceDTO> partialUpdate(ExistingResourceDTO existingResourceDTO) {
+        log.debug("Request to partially update ExistingResource : {}", existingResourceDTO);
+
+        return existingResourceRepository
+            .findById(existingResourceDTO.getId())
+            .map(
+                existingExistingResource -> {
+                    existingResourceMapper.partialUpdate(existingExistingResource, existingResourceDTO);
+                    return existingExistingResource;
+                }
+            )
+            .map(existingResourceRepository::save)
+            .map(existingResourceMapper::toDto);
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public Page<ExistingResourceDTO> findAll(Pageable pageable) {
+        log.debug("Request to get all ExistingResources");
+        return existingResourceRepository.findAll(pageable).map(existingResourceMapper::toDto);
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public Optional<ExistingResourceDTO> findOne(Long id) {
+        log.debug("Request to get ExistingResources : {}", id);
+        return existingResourceRepository.findById(id).map(existingResourceMapper::toDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        log.debug("Request to delete ExistingResource : {}", id);
+        existingResourceRepository.deleteById(id);
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/impl/ImageServiceImpl.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/impl/ImageServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a9a10686580e3405f6be112a0be8db1e0cbb7303
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/impl/ImageServiceImpl.java
@@ -0,0 +1,80 @@
+package com.piacere.iec.backend.service.impl;
+
+import java.util.Optional;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.piacere.iec.backend.domain.Image;
+import com.piacere.iec.backend.repository.ImageRepository;
+import com.piacere.iec.backend.service.ImageService;
+import com.piacere.iec.backend.service.dto.ImageDTO;
+import com.piacere.iec.backend.service.mapper.ImageMapper;
+
+/**
+ * Service Implementation for managing {@link Image}.
+ */
+@Service
+@Transactional
+public class ImageServiceImpl implements ImageService {
+
+    private final Logger log = LoggerFactory.getLogger(ImageServiceImpl.class);
+
+    private final ImageRepository imageRepository;
+    private final ImageMapper imageMapper;
+
+    public ImageServiceImpl(
+    		ImageRepository imageRepository,
+    		ImageMapper imageMapper) {
+        this.imageRepository = imageRepository;
+        this.imageMapper = imageMapper;
+    }
+
+    @Override
+    public ImageDTO save(ImageDTO imageDTO) {
+        log.debug("Request to save Image : {}", imageDTO);
+        Image image = imageMapper.toEntity(imageDTO);
+        image = imageRepository.save(image);
+        return imageMapper.toDto(image);
+    }
+
+    @Override
+    public Optional<ImageDTO> partialUpdate(ImageDTO imageDTO) {
+        log.debug("Request to partially update Image : {}", imageDTO);
+
+        return imageRepository
+            .findById(imageDTO.getId())
+            .map(
+                existingImage -> {
+                    imageMapper.partialUpdate(existingImage, imageDTO);
+                    return existingImage;
+                }
+            )
+            .map(imageRepository::save)
+            .map(imageMapper::toDto);
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public Page<ImageDTO> findAll(Pageable pageable) {
+        log.debug("Request to get all Images");
+        return imageRepository.findAll(pageable).map(imageMapper::toDto);
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    public Optional<ImageDTO> findOne(Long id) {
+        log.debug("Request to get Images : {}", id);
+        return imageRepository.findById(id).map(imageMapper::toDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        log.debug("Request to delete Image : {}", id);
+        imageRepository.deleteById(id);
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/mapper/ExistingResourceMapper.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/mapper/ExistingResourceMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..23152140b940040dc45f8124477a1938921f40ca
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/mapper/ExistingResourceMapper.java
@@ -0,0 +1,18 @@
+package com.piacere.iec.backend.service.mapper;
+
+import com.piacere.iec.backend.domain.*;
+import com.piacere.iec.backend.service.dto.ExistingResourceDTO;
+import org.mapstruct.*;
+
+/**
+ * Mapper for the entity {@link ExistingResource} and its DTO {@link ExistingResourceDTO}.
+ */
+@Mapper(componentModel = "spring", uses = { RootServiceMapper.class })
+public interface ExistingResourceMapper extends EntityMapper<ExistingResourceDTO, ExistingResource> {
+    ExistingResourceDTO toDto(ExistingResource s);
+
+    @Named("id")
+    @BeanMapping(ignoreByDefault = true)
+    @Mapping(target = "id", source = "id")
+    ExistingResourceDTO toDtoId(ExistingResource existingResource);
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/service/mapper/ImageMapper.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/mapper/ImageMapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..adc364c24ec9a10048ec84f22bcd880a5aae1f3a
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/service/mapper/ImageMapper.java
@@ -0,0 +1,22 @@
+package com.piacere.iec.backend.service.mapper;
+
+import org.mapstruct.BeanMapping;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+
+import com.piacere.iec.backend.domain.Image;
+import com.piacere.iec.backend.service.dto.ImageDTO;
+
+/**
+ * Mapper for the entity {@link Image} and its DTO {@link ImageDTO}.
+ */
+@Mapper(componentModel = "spring", uses = { RootServiceMapper.class })
+public interface ImageMapper extends EntityMapper<ImageDTO, Image> {
+	ImageDTO toDto(Image s);
+
+    @Named("id")
+    @BeanMapping(ignoreByDefault = true)
+    @Mapping(target = "id", source = "id")
+    ImageDTO toDtoId(Image image);
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/util/CollectionUtil.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/util/CollectionUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..d36fce8b61f82f4ca116903b64bb5e80a03f3a49
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/util/CollectionUtil.java
@@ -0,0 +1,64 @@
+package com.piacere.iec.backend.util;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Utilities to manage collections.
+ * @author Tecnalia
+ * @version 1.0
+ */
+public final class CollectionUtil {
+
+	/**
+	 * Checks if an array is null or empty.
+	 * @param sourceArray The source array.
+	 * @return boolean
+	 */
+	public static boolean isNullOrEmpty(final Object[] sourceArray) {
+		return sourceArray == null || sourceArray.length == 0;
+	}
+	
+	
+	/**
+	 * Checks if a List is null or empty.
+	 * @param sourceList The source list.
+	 * @return boolean
+	 */
+	public static boolean isNullOrEmpty(final List<?> sourceList) {
+		return sourceList == null || sourceList.isEmpty();
+	}
+	
+	
+	/**
+	 * Checks if a Map is null or empty.
+	 * @param sourceMap The source map.
+	 * @return boolean
+	 */
+	public static boolean isNullOrEmpty(final Map<?, ?> sourceMap) {
+		return sourceMap == null || sourceMap.isEmpty();
+	}
+	
+	
+	/**
+	 * Checks if a Set is null or empty.
+	 * @param sourceSet The source set.
+	 * @return boolean
+	 */
+	public static boolean isNullOrEmpty(final Set<?> sourceSet) {
+		return sourceSet == null || sourceSet.isEmpty();
+	}
+	
+	
+	/**
+	 * Checks if a Collection is null or empty.
+	 * @param sourceSet The source set.
+	 * @return boolean
+	 */
+	public static boolean isNullOrEmpty(final Collection<?> sourceCollection) {
+		return sourceCollection == null || sourceCollection.isEmpty();
+	}
+}
\ No newline at end of file
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ExistingResourceResource.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ExistingResourceResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..40f508432ef5aac0be6f9d1a18eca4af913b6820
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ExistingResourceResource.java
@@ -0,0 +1,180 @@
+package com.piacere.iec.backend.web.rest;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.validation.constraints.NotNull;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import com.piacere.iec.backend.repository.ExistingResourceRepository;
+import com.piacere.iec.backend.service.ExistingResourceQueryService;
+import com.piacere.iec.backend.service.ExistingResourceService;
+import com.piacere.iec.backend.service.criteria.ExistingResourceCriteria;
+import com.piacere.iec.backend.service.dto.ExistingResourceDTO;
+import com.piacere.iec.backend.web.rest.errors.BadRequestAlertException;
+
+import tech.jhipster.web.util.HeaderUtil;
+import tech.jhipster.web.util.PaginationUtil;
+import tech.jhipster.web.util.ResponseUtil;
+
+/**
+ * REST controller for managing {@link com.piacere.iec.backend.domain.ExistingResource}.
+ */
+@RestController
+@RequestMapping("/api")
+public class ExistingResourceResource {
+
+    private final Logger log = LoggerFactory.getLogger(ExistingResourceResource.class);
+
+    private static final String ENTITY_NAME = "existingResource";
+
+    @Value("${jhipster.clientApp.name}")
+    private String applicationName;
+
+    private final ExistingResourceService existingResourceService;
+
+    private final ExistingResourceRepository existingResourceRepository;
+
+    private final ExistingResourceQueryService existingResourceQueryService;
+
+    public ExistingResourceResource(
+        ExistingResourceService existingResourceService,
+        ExistingResourceRepository existingResourceRepository,
+        ExistingResourceQueryService existingResourceQueryService
+    ) {
+        this.existingResourceService = existingResourceService;
+        this.existingResourceRepository = existingResourceRepository;
+        this.existingResourceQueryService = existingResourceQueryService;
+    }
+
+    /**
+     * {@code POST  /existing-resources} : Create a new existingResource.
+     *
+     * @param existingResourceDTO the existingResourceDTO to create.
+     * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new existingResourceDTO, or with status {@code 400 (Bad Request)} if the existingResource has already an ID.
+     * @throws URISyntaxException if the Location URI syntax is incorrect.
+     */
+    @PostMapping("/existing-resources")
+    public ResponseEntity<ExistingResourceDTO> createExistingResource(@RequestBody ExistingResourceDTO existingResourceDTO) throws URISyntaxException {
+        log.debug("REST request to save ExistingResource : {}", existingResourceDTO);
+        existingResourceDTO.setId(null);
+        existingResourceDTO.setCreatedDate(Instant.now());
+        ExistingResourceDTO result = existingResourceService.save(existingResourceDTO);
+        return ResponseEntity
+            .created(new URI("/api/existing-resources/" + result.getId()))
+            .headers(HeaderUtil.createEntityCreationAlert(applicationName, false, ENTITY_NAME, result.getId().toString()))
+            .body(result);
+    }
+
+    /**
+     * {@code PUT  /existing-resources/:id} : Updates an existing existingResource.
+     *
+     * @param id the id of the existingResourceDTO to save.
+     * @param existingResourceDTO the existingResourceDTO to update.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated existingResourceDTO,
+     * or with status {@code 400 (Bad Request)} if the existingResourceDTO is not valid,
+     * or with status {@code 500 (Internal Server Error)} if the existingResourceDTO couldn't be updated.
+     * @throws URISyntaxException if the Location URI syntax is incorrect.
+     */
+    @PutMapping(value = "/existing-resources/{id}")
+    public ResponseEntity<ExistingResourceDTO> updateExistingResource(
+        @PathVariable(value = "id", required = false) final Long id,
+        @NotNull @RequestBody ExistingResourceDTO existingResourceDTO
+    ) throws URISyntaxException {
+        log.debug("REST request to update ExistingResource : {}, {}", id, existingResourceDTO);
+        if (existingResourceDTO.getId() == null) {
+            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
+        }
+        if (!Objects.equals(id, existingResourceDTO.getId())) {
+            throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
+        }
+
+        if (!existingResourceRepository.existsById(id)) {
+            throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
+        }
+
+        existingResourceDTO.setLastModifiedDate(Instant.now());
+        Optional<ExistingResourceDTO> result = existingResourceService.partialUpdate(existingResourceDTO);
+
+        return ResponseUtil.wrapOrNotFound(
+            result,
+            HeaderUtil.createEntityUpdateAlert(applicationName, false, ENTITY_NAME, existingResourceDTO.getId().toString())
+        );
+    }
+
+    /**
+     * {@code GET  /existing-resources} : get all the existingResources.
+     *
+     * @param pageable the pagination information.
+     * @param criteria the criteria which the requested entities should match.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of existingResources in body.
+     */
+    @GetMapping("/existing-resources")
+    public ResponseEntity<List<ExistingResourceDTO>> getAllExistingResources(ExistingResourceCriteria criteria, Pageable pageable) {
+        log.debug("REST request to get ExistingResources by criteria: {}", criteria);
+        Page<ExistingResourceDTO> page = existingResourceQueryService.findByCriteria(criteria, pageable);
+        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
+        return ResponseEntity.ok().headers(headers).body(page.getContent());
+    }
+
+    /**
+     * {@code GET  /existing-resources/count} : count all the existingResources.
+     *
+     * @param criteria the criteria which the requested entities should match.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body.
+     */
+    @GetMapping("/existing-resources/count")
+    public ResponseEntity<Long> countExistingResources(ExistingResourceCriteria criteria) {
+        log.debug("REST request to count ExistingResources by criteria: {}", criteria);
+        return ResponseEntity.ok().body(existingResourceQueryService.countByCriteria(criteria));
+    }
+
+    /**
+     * {@code GET  /existing-resources/:id} : get the "id" existingResource.
+     *
+     * @param id the id of the existingResourceDTO to retrieve.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the existingResourceDTO, or with status {@code 404 (Not Found)}.
+     */
+    @GetMapping("/existing-resources/{id}")
+    public ResponseEntity<ExistingResourceDTO> getExistingResource(@PathVariable Long id) {
+        log.debug("REST request to get existingResource : {}", id);
+        Optional<ExistingResourceDTO> existingResourceDTO = existingResourceService.findOne(id);
+        return ResponseUtil.wrapOrNotFound(existingResourceDTO);
+    }
+
+    /**
+     * {@code DELETE  /existing-resources/:id} : delete the "id" existingResource.
+     *
+     * @param id the id of the existingResources to delete.
+     * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
+     */
+    @DeleteMapping("/existing-resources/{id}")
+    public ResponseEntity<Void> deleteExistingResource(@PathVariable Long id) {
+        log.debug("REST request to delete ExistingResource : {}", id);
+        existingResourceService.delete(id);
+        return ResponseEntity
+            .noContent()
+            .headers(HeaderUtil.createEntityDeletionAlert(applicationName, false, ENTITY_NAME, id.toString()))
+            .build();
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ImageResource.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ImageResource.java
new file mode 100644
index 0000000000000000000000000000000000000000..75c5335daf1daa63b3a8919603a8c4f21346fb27
--- /dev/null
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ImageResource.java
@@ -0,0 +1,183 @@
+package com.piacere.iec.backend.web.rest;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.time.Instant;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.validation.constraints.NotNull;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import com.piacere.iec.backend.repository.ImageRepository;
+import com.piacere.iec.backend.service.ImageQueryService;
+import com.piacere.iec.backend.service.ImageService;
+import com.piacere.iec.backend.service.criteria.ImageCriteria;
+import com.piacere.iec.backend.service.dto.ImageDTO;
+import com.piacere.iec.backend.web.rest.errors.BadRequestAlertException;
+
+import tech.jhipster.web.util.HeaderUtil;
+import tech.jhipster.web.util.PaginationUtil;
+import tech.jhipster.web.util.ResponseUtil;
+
+/**
+ * REST controller for managing {@link com.piacere.iec.backend.domain.Image}.
+ */
+@RestController
+@RequestMapping("/api")
+public class ImageResource {
+
+    private final Logger log = LoggerFactory.getLogger(ImageResource.class);
+
+    private static final String ENTITY_NAME = "image";
+
+    @Value("${jhipster.clientApp.name}")
+    private String applicationName;
+
+    private final ImageService imageService;
+
+    private final ImageRepository imageRepository;
+
+    private final ImageQueryService imageQueryService;
+
+    public ImageResource(
+    		ImageService imageService,
+    		ImageRepository imageRepository,
+    		ImageQueryService imageQueryService
+    ) {
+        this.imageService = imageService;
+        this.imageRepository = imageRepository;
+        this.imageQueryService = imageQueryService;
+    }
+
+    /**
+     * {@code POST  /images} : Create a new image.
+     *
+     * @param imageDTO the imageDTO to create.
+     * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new imageDTO, or with status {@code 400 (Bad Request)} if the image has already an ID.
+     * @throws URISyntaxException if the Location URI syntax is incorrect.
+     */
+    @PostMapping("/images")
+    public ResponseEntity<ImageDTO> createImage(@RequestBody ImageDTO imageDTO) throws URISyntaxException {
+        log.debug("REST request to save Image : {}", imageDTO);
+        imageDTO.setId(null);
+        imageDTO.setCreatedDate(Instant.now());
+        ImageDTO result = imageService.save(imageDTO);
+        return ResponseEntity
+            .created(new URI("/api/images/" + result.getId()))
+            .headers(HeaderUtil.createEntityCreationAlert(applicationName, false, ENTITY_NAME, result.getId().toString()))
+            .body(result);
+    }
+
+    /**
+     * {@code PUT  /images/:id} : Updates an existing image.
+     *
+     * @param id the id of the imageDTO to save.
+     * @param imageDTO the imageDTO to update.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated imageDTO,
+     * or with status {@code 400 (Bad Request)} if the imageDTO is not valid,
+     * or with status {@code 500 (Internal Server Error)} if the imageDTO couldn't be updated.
+     * @throws URISyntaxException if the Location URI syntax is incorrect.
+     */
+    @PutMapping(value = "/images/{id}")
+    public ResponseEntity<ImageDTO> updateImage(
+        @PathVariable(value = "id", required = false) final Long id,
+        @NotNull @RequestBody ImageDTO imageDTO
+    ) throws URISyntaxException {
+        log.debug("REST request to update ImageDTO : {}, {}", id, imageDTO);
+        /*
+        if (imageDTO.getId() == null) {
+            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
+        }
+        if (!Objects.equals(id, imageDTO.getId())) {
+            throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
+        }
+        */
+
+        if (!imageRepository.existsById(id)) {
+            throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
+        }
+
+        imageDTO.setId(id);
+        imageDTO.setLastModifiedDate(Instant.now());
+        Optional<ImageDTO> result = imageService.partialUpdate(imageDTO);
+
+        return ResponseUtil.wrapOrNotFound(
+            result,
+            HeaderUtil.createEntityUpdateAlert(applicationName, false, ENTITY_NAME, imageDTO.getId().toString())
+        );
+    }
+
+    /**
+     * {@code GET  /images} : get all the images.
+     *
+     * @param pageable the pagination information.
+     * @param criteria the criteria which the requested entities should match.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of images in body.
+     */
+    @GetMapping("/images")
+    public ResponseEntity<List<ImageDTO>> getAllImages(ImageCriteria criteria, Pageable pageable) {
+        log.debug("REST request to get Images by criteria: {}", criteria);
+        Page<ImageDTO> page = imageQueryService.findByCriteria(criteria, pageable);
+        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
+        return ResponseEntity.ok().headers(headers).body(page.getContent());
+    }
+
+    /**
+     * {@code GET  /images/count} : count all the images.
+     *
+     * @param criteria the criteria which the requested entities should match.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and the count in body.
+     */
+    @GetMapping("/images/count")
+    public ResponseEntity<Long> countImages(ImageCriteria criteria) {
+        log.debug("REST request to count Images by criteria: {}", criteria);
+        return ResponseEntity.ok().body(imageQueryService.countByCriteria(criteria));
+    }
+
+    /**
+     * {@code GET  /images/:id} : get the "id" image.
+     *
+     * @param id the id of the imageDTO to retrieve.
+     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the imageDTO, or with status {@code 404 (Not Found)}.
+     */
+    @GetMapping("/images/{id}")
+    public ResponseEntity<ImageDTO> getImage(@PathVariable Long id) {
+        log.debug("REST request to get image : {}", id);
+        Optional<ImageDTO> imageDTO = imageService.findOne(id);
+        return ResponseUtil.wrapOrNotFound(imageDTO);
+    }
+
+    /**
+     * {@code DELETE  /images/:id} : delete the "id" image.
+     *
+     * @param id the id of the images to delete.
+     * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
+     */
+    @DeleteMapping("/images/{id}")
+    public ResponseEntity<Void> deleteImage(@PathVariable Long id) {
+        log.debug("REST request to delete Image : {}", id);
+        imageService.delete(id);
+        return ResponseEntity
+            .noContent()
+            .headers(HeaderUtil.createEntityDeletionAlert(applicationName, false, ENTITY_NAME, id.toString()))
+            .build();
+    }
+}
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/InstanceResource.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/InstanceResource.java
index 9b5fe8c583f2f1ab0403a229ecb8a5686353f831..bb5d4d83f39024314184436297100843e37580c9 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/InstanceResource.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/InstanceResource.java
@@ -136,7 +136,7 @@ public class InstanceResource {
      * or with status {@code 500 (Internal Server Error)} if the instanceDTO couldn't be updated.
      * @throws URISyntaxException if the Location URI syntax is incorrect.
      */
-    @PatchMapping(value = "/instances/{id}", consumes = "application/merge-patch+json")
+    @PatchMapping(value = "/instances/{id}", consumes = "application/json")
     public ResponseEntity<InstanceDTO> partialUpdateInstance(
         @PathVariable(value = "id", required = false) final Long id,
         @NotNull @RequestBody InstanceDTO instanceDTO
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/RootServiceResource.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/RootServiceResource.java
index 42e15a28c28f1c19708ab7d1de4d52002bfa237c..466da1e1747c46de14cb2b5be9a79b4463f34984 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/RootServiceResource.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/RootServiceResource.java
@@ -6,6 +6,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
@@ -31,11 +32,15 @@ import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 import com.piacere.iec.backend.domain.vo.ServiceDevOpsInfoVO;
 import com.piacere.iec.backend.domain.vo.ServiceDevOpsQueryInfoVO;
 import com.piacere.iec.backend.repository.RootServiceRepository;
+import com.piacere.iec.backend.service.DefinitionQueryService;
 import com.piacere.iec.backend.service.RootServiceQueryService;
 import com.piacere.iec.backend.service.RootServiceService;
 import com.piacere.iec.backend.service.criteria.RootServiceCriteria;
+import com.piacere.iec.backend.service.dto.DefinitionDTO;
 import com.piacere.iec.backend.service.dto.RootServiceCatalogueDTO;
 import com.piacere.iec.backend.service.dto.RootServiceDTO;
+import com.piacere.iec.backend.service.dto.ServiceAttributeValueCatalogueDTO;
+import com.piacere.iec.backend.util.CollectionUtil;
 import com.piacere.iec.backend.web.rest.errors.BadRequestAlertException;
 
 import tech.jhipster.web.util.HeaderUtil;
@@ -61,15 +66,19 @@ public class RootServiceResource {
     private final RootServiceRepository rootServiceRepository;
 
     private final RootServiceQueryService rootServiceQueryService;
+    
+    private final DefinitionQueryService definitionQueryService;
 
     public RootServiceResource(
         RootServiceService rootServiceService,
         RootServiceRepository rootServiceRepository,
-        RootServiceQueryService rootServiceQueryService
+        RootServiceQueryService rootServiceQueryService,
+        DefinitionQueryService definitionQueryService
     ) {
         this.rootServiceService = rootServiceService;
         this.rootServiceRepository = rootServiceRepository;
         this.rootServiceQueryService = rootServiceQueryService;
+        this.definitionQueryService = definitionQueryService;
     }
 
     /**
@@ -82,9 +91,7 @@ public class RootServiceResource {
     @PostMapping("/root-services")
     public ResponseEntity<RootServiceDTO> createRootService(@Valid @RequestBody RootServiceDTO rootServiceDTO) throws URISyntaxException {
         log.debug("REST request to save RootService : {}", rootServiceDTO);
-        if (rootServiceDTO.getId() != null) {
-            throw new BadRequestAlertException("A new rootService cannot already have an ID", ENTITY_NAME, "idexists");
-        }
+        rootServiceDTO.setId(null);
         RootServiceDTO result = rootServiceService.save(rootServiceDTO);
         return ResponseEntity
             .created(new URI("/api/root-services/" + result.getId()))
@@ -137,7 +144,7 @@ public class RootServiceResource {
      * or with status {@code 500 (Internal Server Error)} if the rootServiceDTO couldn't be updated.
      * @throws URISyntaxException if the Location URI syntax is incorrect.
      */
-    @PatchMapping(value = "/root-services/{id}", consumes = "application/merge-patch+json")
+    @PatchMapping(value = "/root-services/{id}", consumes = "application/json")
     public ResponseEntity<RootServiceDTO> partialUpdateRootService(
         @PathVariable(value = "id", required = false) final Long id,
         @NotNull @RequestBody RootServiceDTO rootServiceDTO
@@ -262,8 +269,26 @@ public class RootServiceResource {
     @GetMapping("/root-services/catalogue")
     public ResponseEntity<List<RootServiceCatalogueDTO>> getAllRootServicesCatalogue(RootServiceCriteria criteria) {
         log.debug("REST request to get RootServices by criteria: {}", criteria);
-        List<RootServiceCatalogueDTO> list = rootServiceQueryService.findByCatalogueCriteria(criteria);
+        final List<DefinitionDTO> definitions = definitionQueryService.findByCriteria(null);
+        final List<RootServiceCatalogueDTO> services = rootServiceQueryService.findByCatalogueCriteria(criteria);
+        if (!CollectionUtil.isNullOrEmpty(services) && !CollectionUtil.isNullOrEmpty(definitions)) {
+        	// Replace the "code"::Definition in ServiceAttributeValue using "value"::Definition
+        	for (RootServiceCatalogueDTO service : services) {
+        		final Set<ServiceAttributeValueCatalogueDTO> attributeValues = service.getServiceAttributeValues();
+        		if (!CollectionUtil.isNullOrEmpty(attributeValues)) {
+        			for (ServiceAttributeValueCatalogueDTO value : attributeValues) {
+        				for (DefinitionDTO definition : definitions) {
+        					if (value.getServiceAttributeValue().equals(definition.getCode())) {
+        						value.setServiceAttributeValue(definition.getValue());
+                				break;
+        					}
+        				}
+        			}
+        		}
+        	}
+        }
+        
         //HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page);
-        return ResponseEntity.ok().body(list);
+        return ResponseEntity.ok().body(services);
     }
 }
diff --git a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ServiceClassResource.java b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ServiceClassResource.java
index 16cf07d5b2b92d92141d4712459e477b2ac65e98..bf40ba264d26a1cd37f9c79ff6425d4b8e6ecc21 100644
--- a/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ServiceClassResource.java
+++ b/git/iec-backend/src/main/java/com/piacere/iec/backend/web/rest/ServiceClassResource.java
@@ -16,7 +16,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 
-import com.piacere.iec.backend.repository.ServiceClassRepository;
 import com.piacere.iec.backend.service.ServiceClassQueryService;
 import com.piacere.iec.backend.service.ServiceClassService;
 import com.piacere.iec.backend.service.criteria.ServiceClassCriteria;
@@ -34,118 +33,21 @@ public class ServiceClassResource {
 
     private final Logger log = LoggerFactory.getLogger(ServiceClassResource.class);
 
-    private static final String ENTITY_NAME = "serviceClass";
-
     @Value("${jhipster.clientApp.name}")
     private String applicationName;
 
     private final ServiceClassService serviceClassService;
 
-    private final ServiceClassRepository serviceClassRepository;
-
     private final ServiceClassQueryService serviceClassQueryService;
 
     public ServiceClassResource(
         ServiceClassService serviceClassService,
-        ServiceClassRepository serviceClassRepository,
         ServiceClassQueryService serviceClassQueryService
     ) {
         this.serviceClassService = serviceClassService;
-        this.serviceClassRepository = serviceClassRepository;
         this.serviceClassQueryService = serviceClassQueryService;
     }
 
-//    /**
-//     * {@code POST  /service-classes} : Create a new serviceClass.
-//     *
-//     * @param serviceClassDTO the serviceClassDTO to create.
-//     * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new serviceClassDTO, or with status {@code 400 (Bad Request)} if the serviceClass has already an ID.
-//     * @throws URISyntaxException if the Location URI syntax is incorrect.
-//     */
-//    @PostMapping("/service-classes")
-//    public ResponseEntity<ServiceClassDTO> createServiceClass(@Valid @RequestBody ServiceClassDTO serviceClassDTO)
-//        throws URISyntaxException {
-//        log.debug("REST request to save ServiceClass : {}", serviceClassDTO);
-//        if (serviceClassDTO.getId() != null) {
-//            throw new BadRequestAlertException("A new serviceClass cannot already have an ID", ENTITY_NAME, "idexists");
-//        }
-//        ServiceClassDTO result = serviceClassService.save(serviceClassDTO);
-//        return ResponseEntity
-//            .created(new URI("/api/service-classes/" + result.getId()))
-//            .headers(HeaderUtil.createEntityCreationAlert(applicationName, false, ENTITY_NAME, result.getId().toString()))
-//            .body(result);
-//    }
-
-//    /**
-//     * {@code PUT  /service-classes/:id} : Updates an existing serviceClass.
-//     *
-//     * @param id the id of the serviceClassDTO to save.
-//     * @param serviceClassDTO the serviceClassDTO to update.
-//     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated serviceClassDTO,
-//     * or with status {@code 400 (Bad Request)} if the serviceClassDTO is not valid,
-//     * or with status {@code 500 (Internal Server Error)} if the serviceClassDTO couldn't be updated.
-//     * @throws URISyntaxException if the Location URI syntax is incorrect.
-//     */
-//    @PutMapping("/service-classes/{id}")
-//    public ResponseEntity<ServiceClassDTO> updateServiceClass(
-//        @PathVariable(value = "id", required = false) final Long id,
-//        @Valid @RequestBody ServiceClassDTO serviceClassDTO
-//    ) throws URISyntaxException {
-//        log.debug("REST request to update ServiceClass : {}, {}", id, serviceClassDTO);
-//        if (serviceClassDTO.getId() == null) {
-//            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
-//        }
-//        if (!Objects.equals(id, serviceClassDTO.getId())) {
-//            throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
-//        }
-//
-//        if (!serviceClassRepository.existsById(id)) {
-//            throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
-//        }
-//
-//        ServiceClassDTO result = serviceClassService.save(serviceClassDTO);
-//        return ResponseEntity
-//            .ok()
-//            .headers(HeaderUtil.createEntityUpdateAlert(applicationName, false, ENTITY_NAME, serviceClassDTO.getId().toString()))
-//            .body(result);
-//    }
-
-//    /**
-//     * {@code PATCH  /service-classes/:id} : Partial updates given fields of an existing serviceClass, field will ignore if it is null
-//     *
-//     * @param id the id of the serviceClassDTO to save.
-//     * @param serviceClassDTO the serviceClassDTO to update.
-//     * @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated serviceClassDTO,
-//     * or with status {@code 400 (Bad Request)} if the serviceClassDTO is not valid,
-//     * or with status {@code 404 (Not Found)} if the serviceClassDTO is not found,
-//     * or with status {@code 500 (Internal Server Error)} if the serviceClassDTO couldn't be updated.
-//     * @throws URISyntaxException if the Location URI syntax is incorrect.
-//     */
-//    @PatchMapping(value = "/service-classes/{id}", consumes = "application/merge-patch+json")
-//    public ResponseEntity<ServiceClassDTO> partialUpdateServiceClass(
-//        @PathVariable(value = "id", required = false) final Long id,
-//        @NotNull @RequestBody ServiceClassDTO serviceClassDTO
-//    ) throws URISyntaxException {
-//        log.debug("REST request to partial update ServiceClass partially : {}, {}", id, serviceClassDTO);
-//        if (serviceClassDTO.getId() == null) {
-//            throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull");
-//        }
-//        if (!Objects.equals(id, serviceClassDTO.getId())) {
-//            throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid");
-//        }
-//
-//        if (!serviceClassRepository.existsById(id)) {
-//            throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound");
-//        }
-//
-//        Optional<ServiceClassDTO> result = serviceClassService.partialUpdate(serviceClassDTO);
-//
-//        return ResponseUtil.wrapOrNotFound(
-//            result,
-//            HeaderUtil.createEntityUpdateAlert(applicationName, false, ENTITY_NAME, serviceClassDTO.getId().toString())
-//        );
-//    }
-
     /**
      * {@code GET  /service-classes} : get all the serviceClasses.
      *
@@ -185,20 +87,4 @@ public class ServiceClassResource {
         Optional<ServiceClassDTO> serviceClassDTO = serviceClassService.findOne(id);
         return ResponseUtil.wrapOrNotFound(serviceClassDTO);
     }
-
-//    /**
-//     * {@code DELETE  /service-classes/:id} : delete the "id" serviceClass.
-//     *
-//     * @param id the id of the serviceClassDTO to delete.
-//     * @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}.
-//     */
-//    @DeleteMapping("/service-classes/{id}")
-//    public ResponseEntity<Void> deleteServiceClass(@PathVariable Long id) {
-//        log.debug("REST request to delete ServiceClass : {}", id);
-//        serviceClassService.delete(id);
-//        return ResponseEntity
-//            .noContent()
-//            .headers(HeaderUtil.createEntityDeletionAlert(applicationName, false, ENTITY_NAME, id.toString()))
-//            .build();
-//    }
 }
diff --git a/git/iec-backend/src/main/resources/config/application.yml b/git/iec-backend/src/main/resources/config/application.yml
index 1ba9561a1518d9bf4f9dac87bd36a23924206e88..5a90af293fe6c1d8848fa9bd4ad65bd7bcc2b64f 100644
--- a/git/iec-backend/src/main/resources/config/application.yml
+++ b/git/iec-backend/src/main/resources/config/application.yml
@@ -206,7 +206,7 @@ jhipster:
   mail:
     from: iecBackend@localhost
   api-docs:
-    default-include-pattern: ${server.servlet.context-path:}(/api/root-services/catalogue|/api/instances/toredown/.*|/api/instances/saveInfo|/api/instance-incidences/saveInfo)
+    default-include-pattern: ${server.servlet.context-path:}(/api/root-services/catalogue|/api/instances/.*)|(/api/existing-resources|/api/existing-resources/.*)|(/api/service-classes|/api/service-classes/.*)|(/api/images|/api/images/.*)
     management-include-pattern: ${server.servlet.context-path:}/management/.*
     title: Infrastructural Elements Catalogue API
     description: Infrastructural Elements Catalogue API documentation
diff --git a/git/iec-backend/src/main/resources/config/liquibase/changelog/20230215090119_added_entity_ExistingResource.xml b/git/iec-backend/src/main/resources/config/liquibase/changelog/20230215090119_added_entity_ExistingResource.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f91fa849735ce3cbe394db08abd6e3a065abe7de
--- /dev/null
+++ b/git/iec-backend/src/main/resources/config/liquibase/changelog/20230215090119_added_entity_ExistingResource.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+    <!--
+        Added the entity ExistingResource.
+    -->
+    <changeSet id="20230215090119-1" author="jhipster">
+        <createTable tableName="existing_resource">
+            <column name="id" type="bigint" autoIncrement="true">
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+            <column name="data_name" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="data_type" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="name" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="datacenter_id" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="user" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="provider" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="created_date" type="${datetimeType}">
+                <constraints nullable="false" />
+            </column>
+            <column name="last_modified_date" type="${datetimeType}">
+                <constraints nullable="true" />
+            </column>
+            <column name="deleted_date" type="${datetimeType}">
+                <constraints nullable="true" />
+            </column>
+            <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here -->
+        </createTable>
+        <dropDefaultValue tableName="existing_resource" columnName="created_date" columnDataType="${datetimeType}"/>
+        <dropDefaultValue tableName="existing_resource" columnName="last_modified_date" columnDataType="${datetimeType}"/>
+        <dropDefaultValue tableName="existing_resource" columnName="deleted_date" columnDataType="${datetimeType}"/>
+    </changeSet>
+
+    <!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
+
+    <!--
+        Load sample data generated with Faker.js
+        - This data can be easily edited using a CSV editor (or even MS Excel) and
+          is located in the 'src/main/resources/config/liquibase/fake-data' directory
+        - By default this data is applied when running with the JHipster 'dev' profile.
+          This can be customized by adding or removing 'faker' in the 'spring.liquibase.contexts'
+          Spring Boot configuration key.
+    -->
+    <!-- <changeSet id="20210706090119-1-data" author="jhipster" context="faker">
+        <loadData
+                  file="config/liquibase/fake-data/root_service.csv"
+                  separator=";"
+                  tableName="root_service">
+            <column name="id" type="numeric"/>
+            <column name="service_name" type="string"/>
+            <column name="first_contract" type="blob"/>
+            <column name="first_contract_content_type" type="string"/>
+            <column name="second_contract" type="blob"/>
+            <column name="second_contract_content_type" type="string"/>
+            <column name="third_contract" type="blob"/>
+            <column name="third_contract_content_type" type="string"/>
+            <column name="created_date" type="${datetimeType}"/>
+            <column name="last_modified_date" type="${datetimeType}"/>
+            <column name="deleted_date" type="${datetimeType}"/>
+            
+        </loadData>
+    </changeSet>  -->
+</databaseChangeLog>
diff --git a/git/iec-backend/src/main/resources/config/liquibase/changelog/20230403121800_added_entity_Image.xml b/git/iec-backend/src/main/resources/config/liquibase/changelog/20230403121800_added_entity_Image.xml
new file mode 100644
index 0000000000000000000000000000000000000000..352e5033eb9c4bad3f21bea51e3d140e0f325716
--- /dev/null
+++ b/git/iec-backend/src/main/resources/config/liquibase/changelog/20230403121800_added_entity_Image.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<databaseChangeLog
+    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
+
+    <!--
+        Added the entity Image.
+    -->
+    <changeSet id="20230403121800-1" author="jhipster">
+        <createTable tableName="image">
+            <column name="id" type="bigint" autoIncrement="true">
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+            <column name="image_type" type="varchar(10)">
+                <constraints nullable="false" />
+            </column>
+            <column name="image_name" type="varchar(100)">
+                <constraints nullable="true" />
+            </column>
+            <column name="imageUrl" type="varchar(255)">
+                <constraints nullable="true" />
+            </column>
+            <column name="image_description" type="text">
+                <constraints nullable="true" />
+            </column>
+            <column name="image_provider" type="varchar(70)">
+                <constraints nullable="false" />
+            </column>
+            <column name="created_date" type="${datetimeType}">
+                <constraints nullable="false" />
+            </column>
+            <column name="last_modified_date" type="${datetimeType}">
+                <constraints nullable="true" />
+            </column>
+            <column name="deleted_date" type="${datetimeType}">
+                <constraints nullable="true" />
+            </column>
+            <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here -->
+        </createTable>
+        <dropDefaultValue tableName="image" columnName="created_date" columnDataType="${datetimeType}"/>
+        <dropDefaultValue tableName="image" columnName="last_modified_date" columnDataType="${datetimeType}"/>
+        <dropDefaultValue tableName="image" columnName="deleted_date" columnDataType="${datetimeType}"/>
+    </changeSet>
+
+    <!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here -->
+
+    <!--
+        Load sample data generated with Faker.js
+        - This data can be easily edited using a CSV editor (or even MS Excel) and
+          is located in the 'src/main/resources/config/liquibase/fake-data' directory
+        - By default this data is applied when running with the JHipster 'dev' profile.
+          This can be customized by adding or removing 'faker' in the 'spring.liquibase.contexts'
+          Spring Boot configuration key.
+    -->
+    <!-- <changeSet id="20210706090119-1-data" author="jhipster" context="faker">
+        <loadData
+                  file="config/liquibase/fake-data/root_service.csv"
+                  separator=";"
+                  tableName="root_service">
+            <column name="id" type="numeric"/>
+            <column name="service_name" type="string"/>
+            <column name="first_contract" type="blob"/>
+            <column name="first_contract_content_type" type="string"/>
+            <column name="second_contract" type="blob"/>
+            <column name="second_contract_content_type" type="string"/>
+            <column name="third_contract" type="blob"/>
+            <column name="third_contract_content_type" type="string"/>
+            <column name="created_date" type="${datetimeType}"/>
+            <column name="last_modified_date" type="${datetimeType}"/>
+            <column name="deleted_date" type="${datetimeType}"/>
+            
+        </loadData>
+    </changeSet>  -->
+</databaseChangeLog>
diff --git a/git/iec-backend/src/main/resources/config/liquibase/master.xml b/git/iec-backend/src/main/resources/config/liquibase/master.xml
index 35b42cf9fe1a052982862be3696147ed3cf2107d..c6bf7aaafc5fec2b0258fbe1d6fd5a92c3259255 100644
--- a/git/iec-backend/src/main/resources/config/liquibase/master.xml
+++ b/git/iec-backend/src/main/resources/config/liquibase/master.xml
@@ -31,6 +31,9 @@
     <include file="config/liquibase/changelog/20210706090130_added_entity_constraints_Instance.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210706090131_added_entity_constraints_InstanceIncidence.xml" relativeToChangelogFile="false"/>
     <include file="config/liquibase/changelog/20210706090132_added_entity_constraints_ServiceAttributeType.xml" relativeToChangelogFile="false"/>
+
+    <include file="config/liquibase/changelog/20230215090119_added_entity_ExistingResource.xml" relativeToChangelogFile="false"/>
+    <include file="config/liquibase/changelog/20230403121800_added_entity_Image.xml" relativeToChangelogFile="false"/>
 	<!--     
     20210706090119_added_entity_constraints_RootService.xml
     20210706090120_added_entity_constraints_ServiceClassAttribute.xml
diff --git a/git/iec-frontend/iec-frontend.png b/git/iec-frontend/iec-frontend.png
index 2136351438c6fbd2f3dbd72654848fe80295720a..9ed7e777e9d94ddc08bb83415825ab36747806e9 100644
Binary files a/git/iec-frontend/iec-frontend.png and b/git/iec-frontend/iec-frontend.png differ
diff --git a/git/iec-frontend/src/main/webapp/app/app.constants.ts b/git/iec-frontend/src/main/webapp/app/app.constants.ts
index 88dae208398d530604ce4260200947a74d3adb7d..3a02474b4a54466d3807a27624d6865289927f99 100644
--- a/git/iec-frontend/src/main/webapp/app/app.constants.ts
+++ b/git/iec-frontend/src/main/webapp/app/app.constants.ts
@@ -6,3 +6,6 @@ export const VERSION = process.env.VERSION;
 export const DEBUG_INFO_ENABLED = Boolean(process.env.DEBUG_INFO_ENABLED);
 export const SERVER_API_URL = process.env.SERVER_API_URL ?? '';
 export const BUILD_TIMESTAMP = process.env.BUILD_TIMESTAMP;
+
+export const IMAGE_DOCKER = 'Docker';
+export const IMAGE_VM = 'VM';
diff --git a/git/iec-frontend/src/main/webapp/app/entities/entity-routing.module.ts b/git/iec-frontend/src/main/webapp/app/entities/entity-routing.module.ts
index 21637bac6c15b808ebb7821ef913d294fe57e24c..7a7bae5c1df991a74f906c9b44c90b8bce0aaf9d 100644
--- a/git/iec-frontend/src/main/webapp/app/entities/entity-routing.module.ts
+++ b/git/iec-frontend/src/main/webapp/app/entities/entity-routing.module.ts
@@ -18,6 +18,16 @@ import { RouterModule } from '@angular/router';
         path: 'instance',
         data: { pageTitle: 'iecFrontendApp.iecBackendInstance.home.title' },
         loadChildren: () => import('./iecBackend/instance/instance.module').then(m => m.IecBackendInstanceModule),
+      },
+      {
+        path: 'image',
+        data: { pageTitle: 'iecFrontendApp.iecBackendImage.home.title' },
+        loadChildren: () => import('./iecBackend/image/image.module').then(m => m.IecBackendImageModule),
+      },
+      {
+        path: 'existing-resource',
+        data: { pageTitle: 'iecFrontendApp.iecBackendExistingResource.home.title' },
+        loadChildren: () => import('./iecBackend/existing-resource/existing-resource.module').then(m => m.IecBackendExistingResourceModule),
       }
       /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */
     ]),
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.html b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..34b108ee4bcc68af79c93dcd1ca731a9553d2d41
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.html
@@ -0,0 +1,29 @@
+<form *ngIf="existingResource" name="deleteForm" (ngSubmit)="confirmDelete(existingResource.id!)">
+  <div class="modal-header">
+    <h4 class="modal-title" data-cy="existingResourceDeleteDialogHeading" jhiTranslate="entity.delete.title">Confirm delete operation</h4>
+
+    <button type="button" class="close" data-dismiss="modal" aria-hidden="true" (click)="cancel()">&times;</button>
+  </div>
+
+  <div class="modal-body">
+    <jhi-alert-error></jhi-alert-error>
+
+    <p
+      id="jhi-delete-existingResource-heading"
+      jhiTranslate="iecFrontendApp.iecBackendExistingResource.delete.question"
+      [translateValues]="{ id: existingResource.id }"
+    >
+      Are you sure you want to delete this Existing Resource?
+    </p>
+  </div>
+
+  <div class="modal-footer">
+    <button type="button" class="btn btn-secondary" data-dismiss="modal" (click)="cancel()">
+      <fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
+    </button>
+
+    <button id="jhi-confirm-delete-existingResource" data-cy="entityConfirmDeleteButton" type="submit" class="btn btn-danger">
+      <fa-icon icon="times"></fa-icon>&nbsp;<span jhiTranslate="entity.action.delete">Delete</span>
+    </button>
+  </div>
+</form>
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4a2b1bd3a6426abd9aae0cf06e9b8e3c2b042204
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.spec.ts
@@ -0,0 +1,64 @@
+jest.mock('@ng-bootstrap/ng-bootstrap');
+
+import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { of } from 'rxjs';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { ExistingResourceService } from '../service/existing-resource.service';
+
+import { ExistingResourceDeleteDialogComponent } from './existing-resource-delete-dialog.component';
+
+describe('Component Tests', () => {
+  describe('ExistingResource Management Delete Component', () => {
+    let comp: ExistingResourceDeleteDialogComponent;
+    let fixture: ComponentFixture<ExistingResourceDeleteDialogComponent>;
+    let service: ExistingResourceService;
+    let mockActiveModal: NgbActiveModal;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        declarations: [ExistingResourceDeleteDialogComponent],
+        providers: [NgbActiveModal],
+      })
+        .overrideTemplate(ExistingResourceDeleteDialogComponent, '')
+        .compileComponents();
+      fixture = TestBed.createComponent(ExistingResourceDeleteDialogComponent);
+      comp = fixture.componentInstance;
+      service = TestBed.inject(ExistingResourceService);
+      mockActiveModal = TestBed.inject(NgbActiveModal);
+    });
+
+    describe('confirmDelete', () => {
+      it('Should call delete service on confirmDelete', inject(
+        [],
+        fakeAsync(() => {
+          // GIVEN
+          spyOn(service, 'delete').and.returnValue(of({}));
+
+          // WHEN
+          comp.confirmDelete(123);
+          tick();
+
+          // THEN
+          expect(service.delete).toHaveBeenCalledWith(123);
+          expect(mockActiveModal.close).toHaveBeenCalledWith('deleted');
+        })
+      ));
+
+      it('Should not call delete service on clear', () => {
+        // GIVEN
+        spyOn(service, 'delete');
+
+        // WHEN
+        comp.cancel();
+
+        // THEN
+        expect(service.delete).not.toHaveBeenCalled();
+        expect(mockActiveModal.close).not.toHaveBeenCalled();
+        expect(mockActiveModal.dismiss).toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1f6119986fdef7b68a9fb85c04f2ca3cbea1e792
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/delete/existing-resource-delete-dialog.component.ts
@@ -0,0 +1,24 @@
+import { Component } from '@angular/core';
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { IExistingResource } from '../existing-resource.model';
+import { ExistingResourceService } from '../service/existing-resource.service';
+
+@Component({
+  templateUrl: './existing-resource-delete-dialog.component.html',
+})
+export class ExistingResourceDeleteDialogComponent {
+  existingResource?: IExistingResource;
+
+  constructor(protected existingResourceService: ExistingResourceService, public activeModal: NgbActiveModal) {}
+
+  cancel(): void {
+    this.activeModal.dismiss();
+  }
+
+  confirmDelete(id: number): void {
+    this.existingResourceService.delete(id).subscribe(() => {
+      this.activeModal.close('deleted');
+    });
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.html b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..0b69a3ffeb05c75980e74d3d1219c9f22e6e1150
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.html
@@ -0,0 +1,29 @@
+<div class="row justify-content-center">
+  <div class="col-6">
+    <div class="card">
+      <h5 class="card-header text-white bg-primary p-4 font-weight-bold">{{existingResource?.dataName}}</h5>
+      <div class="card-body">
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendExistingResource.dataType">Data type</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ existingResource?.dataType }}</span><br>
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendExistingResource.name">Name</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ existingResource?.name }}</span><br>
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendExistingResource.datacenterId">Datacenter Id</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ existingResource?.datacenterId }}</span><br>
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendExistingResource.user">User</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ existingResource?.user }}</span><br>
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendExistingResource.provider">Provider</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ existingResource?.provider }}</span>
+      </div>
+  	  <div class="card-footer">
+    	<button type="submit" (click)="previousState()" class="btn btn-info float-right" data-cy="entityDetailsBackButton">
+      	<fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.back">Back</span>
+    	</button>
+  	  </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fd4b91795846655a8b1a7514e19ad799b48816a5
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.spec.ts
@@ -0,0 +1,38 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ActivatedRoute } from '@angular/router';
+import { of } from 'rxjs';
+
+import { ExistingResourceDetailComponent } from './existing-resource-detail.component';
+
+describe('Component Tests', () => {
+  describe('Existing Resource Management Detail Component', () => {
+    let comp: ExistingResourceDetailComponent;
+    let fixture: ComponentFixture<ExistingResourceDetailComponent>;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        declarations: [ExistingResourceDetailComponent],
+        providers: [
+          {
+            provide: ActivatedRoute,
+            useValue: { data: of({ image: { id: 123 } }) },
+          },
+        ],
+      })
+        .overrideTemplate(ExistingResourceDetailComponent, '')
+        .compileComponents();
+      fixture = TestBed.createComponent(ExistingResourceDetailComponent);
+      comp = fixture.componentInstance;
+    });
+
+    describe('OnInit', () => {
+      it('Should load existing resource on init', () => {
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(comp.existingResource).toEqual(jasmine.objectContaining({ id: 123 }));
+      });
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c26fb681533a15d0ee13bd4d2d812a7386c8b78f
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/detail/existing-resource-detail.component.ts
@@ -0,0 +1,24 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+import { IExistingResource } from '../existing-resource.model';
+
+@Component({
+  selector: 'jhi-existing-resource-detail',
+  templateUrl: './existing-resource-detail.component.html',
+})
+export class ExistingResourceDetailComponent implements OnInit {
+  existingResource: IExistingResource | null = null;
+
+  constructor(protected activatedRoute: ActivatedRoute) {}
+
+  ngOnInit(): void {
+    this.activatedRoute.data.subscribe(({ existingResource }) => {
+      this.existingResource = existingResource;
+    });
+  }
+
+  previousState(): void {
+    window.history.back();
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/existing-resource.model.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/existing-resource.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..496cb0edcbe2c204104216efb3a07eed089de5cb
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/existing-resource.model.ts
@@ -0,0 +1,33 @@
+import * as dayjs from 'dayjs';
+
+export interface IExistingResource {
+  id?: number;
+  dataName?: string;
+  dataType?: string;
+  name?: string;
+  datacenterId?: string;
+  user?: string;
+  provider?: string;
+  createdDate?: dayjs.Dayjs;
+  lastModifiedDate?: dayjs.Dayjs | null;
+  deletedDate?: dayjs.Dayjs | null;
+}
+
+export class ExistingResource implements IExistingResource {
+  constructor(
+    public id?: number,
+    public dataName?: string,
+    public dataType?: string,
+    public name?: string,
+    public datacenterId?: string,
+    public user?: string,
+    public provider?: string,
+    public createdDate?: dayjs.Dayjs,
+    public lastModifiedDate?: dayjs.Dayjs | null,
+    public deletedDate?: dayjs.Dayjs | null,
+  ) {}
+}
+
+export function getExistingResourceIdentifier(existingResource: IExistingResource): number | undefined {
+  return existingResource.id;
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/existing-resource.module.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/existing-resource.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..89fc61ce1338a94716f502c68d663113ac8c9136
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/existing-resource.module.ts
@@ -0,0 +1,15 @@
+import { NgModule } from '@angular/core';
+
+import { SharedModule } from 'app/shared/shared.module';
+import { ExistingResourceComponent } from './list/existing-resource.component';
+import { ExistingResourceDetailComponent } from './detail/existing-resource-detail.component';
+import { ExistingResourceUpdateComponent } from './update/existing-resource-update.component';
+import { ExistingResourceDeleteDialogComponent } from './delete/existing-resource-delete-dialog.component';
+import { ExistingResourceRoutingModule } from './route/existing-resource-routing.module';
+
+@NgModule({
+  imports: [SharedModule, ExistingResourceRoutingModule],
+  declarations: [ExistingResourceComponent, ExistingResourceDetailComponent, ExistingResourceUpdateComponent, ExistingResourceDeleteDialogComponent],
+  entryComponents: [ExistingResourceDeleteDialogComponent]
+})
+export class IecBackendExistingResourceModule {}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.html b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..5252493cf4d367e152681f71cbb2fc913abff9d9
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.html
@@ -0,0 +1,119 @@
+<div>
+  <nav class="navbar navbar-dark bg-primary">
+    <span class="navbar-brand mb-0 h1" jhiTranslate="iecFrontendApp.iecBackendExistingResource.home.title">Existing Resources</span>
+  </nav>
+  
+  <h2 id="page-heading" data-cy="ExistingResourceHeading">
+    <div class="d-flex justify-content-end mt-2">
+      <button class="btn btn-info mr-2" (click)="loadPage()" [disabled]="isLoading">
+        <fa-icon icon="sync" [spin]="isLoading"></fa-icon>
+        <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.home.refreshListLabel">Refresh List</span>
+      </button>
+      
+       <button
+        id="jh-create-entity"
+        data-cy="entityCreateButton"
+        class="btn btn-primary jh-create-entity create-root-service"
+        [routerLink]="['/existing-resource/new']"
+      >
+        <fa-icon icon="plus"></fa-icon>
+        <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.home.createLabel"> Create a new Existing Resource</span>
+      </button>
+    </div>
+  </h2>
+
+  <jhi-alert-error></jhi-alert-error>
+
+  <jhi-alert></jhi-alert>
+
+  <div class="alert alert-warning" id="no-result" *ngIf="existingResources?.length === 0">
+    <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.home.notFound">No Existing Resources found</span>
+  </div>
+
+  <div class="table-responsive" id="entities" *ngIf="existingResources && existingResources.length > 0">
+    <table class="table table-striped" aria-describedby="page-heading">
+      <thead>
+        <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="loadPage.bind(this)">
+          <th scope="col" jhiSortBy="dataName">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.dataName">Data name</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="dataType">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.dataType">Data type</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="name">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.name">Name</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="datacenterId">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.datacenterId">Datacenter Id</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="user">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.user">User</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="provider">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.provider">Provider</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col">
+            <span jhiTranslate="iecFrontendApp.iecBackendExistingResource.status">Status</span>
+          </th>
+          <th scope="col"></th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr *ngFor="let existingResource of existingResources; trackBy: trackId" data-cy="entityTable">
+          <td>{{ existingResource.dataName }}</td>
+          <td>{{ existingResource.dataType }}</td>
+          <td>{{ existingResource.name }}</td>
+          <td>{{ existingResource.datacenterId }}</td>
+          <td>{{ existingResource.user }}</td>
+          <td>{{ existingResource.provider }}</td>
+          <td>
+            <span class="badge badge-success" jhiTranslate="iecFrontendApp.iecBackendExistingResource.active" *ngIf="existingResource.deletedDate == null">Active</span>
+            <span class="badge badge-danger" jhiTranslate="iecFrontendApp.iecBackendExistingResource.inactive" *ngIf="existingResource.deletedDate != null">Inactive</span>
+          </td>
+          <td class="text-right">
+            <div class="btn-group">
+              <button
+                type="submit"
+                [routerLink]="['/existing-resource', existingResource.id, 'view']"
+                class="btn btn-info btn-sm"
+                data-cy="entityDetailsButton"
+              >
+                <fa-icon icon="eye"></fa-icon>
+                <span class="d-none d-md-inline" jhiTranslate="entity.action.view">View</span>
+              </button>
+              
+              <button type="submit" (click)="delete(existingResource)" class="btn btn-danger btn-sm" data-cy="entityDeleteButton">
+                <fa-icon icon="times"></fa-icon>
+                <span class="d-none d-md-inline" jhiTranslate="entity.action.delete">Delete</span>
+              </button>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+
+  <div *ngIf="existingResources && existingResources.length > 0">
+    <div class="row justify-content-center">
+      <jhi-item-count [params]="{ page: page, totalItems: totalItems, itemsPerPage: itemsPerPage }"></jhi-item-count>
+    </div>
+
+    <div class="row justify-content-center">
+      <ngb-pagination
+        [collectionSize]="totalItems"
+        [(page)]="ngbPaginationPage"
+        [pageSize]="itemsPerPage"
+        [maxSize]="5"
+        [rotate]="true"
+        [boundaryLinks]="true"
+        (pageChange)="loadPage($event)"
+      ></ngb-pagination>
+    </div>
+  </div>
+</div>
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..19921ad83accd2fd65f52ce21b68116ea6380f80
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.spec.ts
@@ -0,0 +1,100 @@
+jest.mock('@angular/router');
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ActivatedRoute, Router } from '@angular/router';
+import { of } from 'rxjs';
+
+import { ExistingResourceService } from '../service/existing-resource.service';
+
+import { ExistingResourceComponent } from './existing-resource.component';
+
+describe('Component Tests', () => {
+  describe('ExistingResource Management Component', () => {
+    let comp: ExistingResourceComponent;
+    let fixture: ComponentFixture<ExistingResourceComponent>;
+    let service: ExistingResourceService;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        declarations: [ExistingResourceComponent],
+        providers: [
+          Router,
+          {
+            provide: ActivatedRoute,
+            useValue: {
+              data: of({
+                defaultSort: 'id,asc',
+              }),
+              queryParamMap: of(
+                jest.requireActual('@angular/router').convertToParamMap({
+                  page: '1',
+                  size: '1',
+                  sort: 'id,desc',
+                })
+              ),
+            },
+          },
+        ],
+      })
+        .overrideTemplate(ExistingResourceComponent, '')
+        .compileComponents();
+
+      fixture = TestBed.createComponent(ExistingResourceComponent);
+      comp = fixture.componentInstance;
+      service = TestBed.inject(ExistingResourceService);
+
+      const headers = new HttpHeaders().append('link', 'link;link');
+      spyOn(service, 'query').and.returnValue(
+        of(
+          new HttpResponse({
+            body: [{ id: 123 }],
+            headers,
+          })
+        )
+      );
+    });
+
+    it('Should call load all on init', () => {
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(service.query).toHaveBeenCalled();
+      expect(comp.existingResources?.[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+    });
+
+    it('should load a page', () => {
+      // WHEN
+      comp.loadPage(1);
+
+      // THEN
+      expect(service.query).toHaveBeenCalled();
+      expect(comp.existingResources?.[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+    });
+
+    it('should calculate the sort attribute for an id', () => {
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(service.query).toHaveBeenCalledWith(expect.objectContaining({ sort: ['id,desc'] }));
+    });
+
+    it('should calculate the sort attribute for a non-id attribute', () => {
+      // INIT
+      comp.ngOnInit();
+
+      // GIVEN
+      comp.predicate = 'name';
+
+      // WHEN
+      comp.loadPage(1);
+
+      // THEN
+      expect(service.query).toHaveBeenLastCalledWith(expect.objectContaining({ sort: ['name,desc', 'id'] }));
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f3a38b635d8b8193400a63eb189218db4d83351e
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/list/existing-resource.component.ts
@@ -0,0 +1,117 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { ActivatedRoute, Router } from '@angular/router';
+import { combineLatest } from 'rxjs';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { IExistingResource } from '../existing-resource.model';
+
+import { ITEMS_PER_PAGE } from 'app/config/pagination.constants';
+import { ExistingResourceService } from '../service/existing-resource.service';
+import { ExistingResourceDeleteDialogComponent } from '../delete/existing-resource-delete-dialog.component';
+
+@Component({
+  selector: 'jhi-existing-resource',
+  templateUrl: './existing-resource.component.html',
+})
+export class ExistingResourceComponent implements OnInit {
+  existingResources?: IExistingResource[];
+  isLoading = false;
+  totalItems = 0;
+  itemsPerPage = ITEMS_PER_PAGE;
+  page?: number;
+  predicate!: string;
+  ascending!: boolean;
+  ngbPaginationPage = 1;
+
+  constructor(
+    protected existingResourceService: ExistingResourceService,
+    protected activatedRoute: ActivatedRoute,
+    protected router: Router,
+    protected modalService: NgbModal
+  ) {}
+
+  loadPage(page?: number, dontNavigate?: boolean): void {
+    this.isLoading = true;
+    const pageToLoad: number = page ?? this.page ?? 1;
+
+    this.existingResourceService
+      .query({
+        page: pageToLoad - 1,
+        size: this.itemsPerPage,
+        sort: this.sort(),
+      })
+      .subscribe(
+        (res: HttpResponse<IExistingResource[]>) => {
+          this.isLoading = false;
+          this.onSuccess(res.body, res.headers, pageToLoad, !dontNavigate);
+        },
+        () => {
+          this.isLoading = false;
+          this.onError();
+        }
+      );
+  }
+
+  ngOnInit(): void {
+    this.handleNavigation();
+  }
+
+  trackId(index: number, item: IExistingResource): number {
+    return item.id!;
+  }
+  
+  delete(existingResource: IExistingResource): void {
+    const modalRef = this.modalService.open(ExistingResourceDeleteDialogComponent, { size: 'lg', backdrop: 'static' });
+    modalRef.componentInstance.existingResource = existingResource;
+    // unsubscribe not needed because closed completes on modal close
+    modalRef.closed.subscribe(reason => {
+      if (reason === 'deleted') {
+        this.loadPage();
+      }
+    });
+  }
+
+  protected sort(): string[] {
+    const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')];
+    if (this.predicate !== 'id') {
+      result.push('id');
+    }
+    return result;
+  }
+
+  protected handleNavigation(): void {
+    combineLatest([this.activatedRoute.data, this.activatedRoute.queryParamMap]).subscribe(([data, params]) => {
+      const page = params.get('page');
+      const pageNumber = page !== null ? +page : 1;
+      const sort = (params.get('sort') ?? data['defaultSort']).split(',');
+      const predicate = sort[0];
+      const ascending = sort[1] === 'asc';
+      if (pageNumber !== this.page || predicate !== this.predicate || ascending !== this.ascending) {
+        this.predicate = predicate;
+        this.ascending = ascending;
+        this.loadPage(pageNumber, true);
+      }
+    });
+  }
+
+  protected onSuccess(data: IExistingResource[] | null, headers: HttpHeaders, page: number, navigate: boolean): void {
+    this.totalItems = Number(headers.get('X-Total-Count'));
+    this.page = page;
+    if (navigate) {
+      this.router.navigate(['/existing-resource'], {
+        queryParams: {
+          page: this.page,
+          size: this.itemsPerPage,
+          sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc'),
+        },
+      });
+    }
+    this.existingResources = data ?? [];
+    this.ngbPaginationPage = this.page;
+  }
+
+  protected onError(): void {
+    this.ngbPaginationPage = this.page ?? 1;
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing-resolve.service.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing-resolve.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..24bb547bcb04f2b207e8f3056194e3397e59c6d9
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing-resolve.service.spec.ts
@@ -0,0 +1,82 @@
+jest.mock('@angular/router');
+
+import { TestBed } from '@angular/core/testing';
+import { HttpResponse } from '@angular/common/http';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ActivatedRouteSnapshot, Router } from '@angular/router';
+import { of } from 'rxjs';
+
+import { IExistingResource, ExistingResource } from '../existing-resource.model';
+import { ExistingResourceService } from '../service/existing-resource.service';
+
+import { ExistingResourceRoutingResolveService } from './existing-resource-routing-resolve.service';
+
+describe('Service Tests', () => {
+  describe('Existing Resource routing resolve service', () => {
+    let mockRouter: Router;
+    let mockActivatedRouteSnapshot: ActivatedRouteSnapshot;
+    let routingResolveService: ExistingResourceRoutingResolveService;
+    let service: ExistingResourceService;
+    let resultExistingResource: IExistingResource | undefined;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        providers: [Router, ActivatedRouteSnapshot],
+      });
+      mockRouter = TestBed.inject(Router);
+      mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot);
+      routingResolveService = TestBed.inject(ExistingResourceRoutingResolveService);
+      service = TestBed.inject(ExistingResourceService);
+      resultExistingResource = undefined;
+    });
+
+    describe('resolve', () => {
+      it('should return IExistingResource returned by find', () => {
+        // GIVEN
+        service.find = jest.fn(id => of(new HttpResponse({ body: { id } })));
+        mockActivatedRouteSnapshot.params = { id: 123 };
+
+        // WHEN
+        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
+          resultExistingResource = result;
+        });
+
+        // THEN
+        expect(service.find).toBeCalledWith(123);
+        expect(resultExistingResource).toEqual({ id: 123 });
+      });
+
+      it('should return new IExistingResource if id is not provided', () => {
+        // GIVEN
+        service.find = jest.fn();
+        mockActivatedRouteSnapshot.params = {};
+
+        // WHEN
+        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
+          resultExistingResource = result;
+        });
+
+        // THEN
+        expect(service.find).not.toBeCalled();
+        expect(resultExistingResource).toEqual(new Image());
+      });
+
+      it('should route to 404 page if data not found in server', () => {
+        // GIVEN
+        spyOn(service, 'find').and.returnValue(of(new HttpResponse({ body: null })));
+        mockActivatedRouteSnapshot.params = { id: 123 };
+
+        // WHEN
+        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
+          resultExistingResource = result;
+        });
+
+        // THEN
+        expect(service.find).toBeCalledWith(123);
+        expect(resultExistingResource).toEqual(undefined);
+        expect(mockRouter.navigate).toHaveBeenCalledWith(['404']);
+      });
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing-resolve.service.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing-resolve.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..71213cb474c06daef1acc42995f857f9225f6c96
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing-resolve.service.ts
@@ -0,0 +1,30 @@
+import { Injectable } from '@angular/core';
+import { HttpResponse } from '@angular/common/http';
+import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router';
+import { Observable, of, EMPTY } from 'rxjs';
+import { mergeMap } from 'rxjs/operators';
+
+import { IExistingResource, ExistingResource } from '../existing-resource.model';
+import { ExistingResourceService } from '../service/existing-resource.service';
+
+@Injectable({ providedIn: 'root' })
+export class ExistingResourceRoutingResolveService implements Resolve<IExistingResource> {
+  constructor(protected service: ExistingResourceService, protected router: Router) {}
+
+  resolve(route: ActivatedRouteSnapshot): Observable<IExistingResource> | Observable<never> {
+    const id = route.params['id'];
+    if (id) {
+      return this.service.find(id).pipe(
+        mergeMap((existingResource: HttpResponse<ExistingResource>) => {
+          if (existingResource.body) {
+            return of(existingResource.body);
+          } else {
+            this.router.navigate(['404']);
+            return EMPTY;
+          }
+        })
+      );
+    }
+    return of(new ExistingResource());
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing.module.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..27b81ceed50bdc559b423889c7057eeaacc5af0b
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/route/existing-resource-routing.module.ts
@@ -0,0 +1,41 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { UserRouteAccessService } from 'app/core/auth/user-route-access.service';
+import { ExistingResourceComponent } from '../list/existing-resource.component';
+import { ExistingResourceDetailComponent } from '../detail/existing-resource-detail.component';
+import { ExistingResourceUpdateComponent } from '../update/existing-resource-update.component';
+import { ExistingResourceRoutingResolveService } from './existing-resource-routing-resolve.service';
+
+const existingResourceRoute: Routes = [
+  {
+    path: '',
+    component: ExistingResourceComponent,
+    data: {
+      defaultSort: 'id,asc',
+    },
+    canActivate: [UserRouteAccessService],
+  },
+  {
+    path: ':id/view',
+    component: ExistingResourceDetailComponent,
+    resolve: {
+      existingResource: ExistingResourceRoutingResolveService,
+    },
+    canActivate: [UserRouteAccessService],
+  },
+  {
+    path: 'new',
+    component: ExistingResourceUpdateComponent,
+    resolve: {
+      existingResource: ExistingResourceRoutingResolveService,
+    },
+    canActivate: [UserRouteAccessService],
+  }
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(existingResourceRoute)],
+  exports: [RouterModule],
+})
+export class ExistingResourceRoutingModule {}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/service/existing-resource.service.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/service/existing-resource.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dadbfcab4ba9b87f3020685f8f2ffbd88dcbb93e
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/service/existing-resource.service.spec.ts
@@ -0,0 +1,203 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import * as dayjs from 'dayjs';
+
+import { DATE_TIME_FORMAT } from 'app/config/input.constants';
+import { IExistingResource, ExistingResource } from '../existing-resource.model';
+
+import { ExistingResourceService } from './existing-resource.service';
+
+describe('Existing Resource Tests', () => {
+  describe('Existing Resource Service', () => {
+    let service: ExistingResourceService;
+    let httpMock: HttpTestingController;
+    let elemDefault: IExistingResource;
+    let expectedResult: IExistingResource | IExistingResource[] | boolean | null;
+    let currentDate: dayjs.Dayjs;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+      });
+      expectedResult = null;
+      service = TestBed.inject(ExistingResourceService);
+      httpMock = TestBed.inject(HttpTestingController);
+      currentDate = dayjs();
+
+      elemDefault = {
+        id: 0,
+        dataName: 'AAAAAAA',
+        createdDate: currentDate,
+        lastModifiedDate: currentDate,
+        deletedDate: currentDate,
+      };
+    });
+
+    describe('Existing Resource methods', () => {
+      it('should find an element', () => {
+        const returnedFromService = Object.assign(
+          {
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        service.find(123).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(elemDefault);
+      });
+
+      it('should create an Existing Resource', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 0,
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            createdDate: currentDate,
+            lastModifiedDate: currentDate,
+            deletedDate: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.create(new ExistingResource()).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'POST' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(expected);
+      });
+
+      it('should update an Existing Resource', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 1,
+            dataName: 'BBBBBB',
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            createdDate: currentDate,
+            lastModifiedDate: currentDate,
+            deletedDate: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.update(expected).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'PUT' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(expected);
+      });
+
+      it('should return a list of Existing Resources', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 1,
+            dataName: 'BBBBBB',
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            createdDate: currentDate,
+            lastModifiedDate: currentDate,
+            deletedDate: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.query().subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush([returnedFromService]);
+        httpMock.verify();
+        expect(expectedResult).toContainEqual(expected);
+      });
+
+      it('should delete an Existing Resource', () => {
+        service.delete(123).subscribe(resp => (expectedResult = resp.ok));
+
+        const req = httpMock.expectOne({ method: 'DELETE' });
+        req.flush({ status: 200 });
+        expect(expectedResult);
+      });
+
+      describe('addExistingResourceToCollectionIfMissing', () => {
+        it('should add an Existing Resource to an empty array', () => {
+          const image: IExistingResource = { id: 123 };
+          expectedResult = service.addExistingResourceToCollectionIfMissing([], image);
+          expect(expectedResult).toHaveLength(1);
+          expect(expectedResult).toContain(image);
+        });
+
+        it('should not add an Existing Resource to an array that contains it', () => {
+          const existingResource: IExistingResource = { id: 123 };
+          const existingResourceCollection: IExistingResource[] = [
+            {
+              ...existingResource,
+            },
+            { id: 456 },
+          ];
+          expectedResult = service.addExistingResourceToCollectionIfMissing(existingResourceCollection, existingResource);
+          expect(expectedResult).toHaveLength(2);
+        });
+
+        it("should add an Existing Resource to an array that doesn't contain it", () => {
+          const existingResource: IExistingResource = { id: 123 };
+          const existingResourceCollection: IExistingResource[] = [{ id: 456 }];
+          expectedResult = service.addExistingResourceToCollectionIfMissing(existingResourceCollection, existingResource);
+          expect(expectedResult).toHaveLength(2);
+          expect(expectedResult).toContain(existingResource);
+        });
+
+        it('should add only unique Existing Resource to an array', () => {
+          const existingResourceArray: IExistingResource[] = [{ id: 123 }, { id: 456 }, { id: 27673 }];
+          const existingResourceCollection: IExistingResource[] = [{ id: 123 }];
+          expectedResult = service.addExistingResourceToCollectionIfMissing(existingResourceCollection, ...existingResourceArray);
+          expect(expectedResult).toHaveLength(3);
+        });
+
+        it('should accept varargs', () => {
+          const existingResource: IExistingResource = { id: 123 };
+          const existingResource2: IExistingResource = { id: 456 };
+          expectedResult = service.addExistingResourceToCollectionIfMissing([], existingResource, existingResource2);
+          expect(expectedResult).toHaveLength(2);
+          expect(expectedResult).toContain(existingResource);
+          expect(expectedResult).toContain(existingResource2);
+        });
+
+        it('should accept null and undefined values', () => {
+          const existingResource: IExistingResource = { id: 123 };
+          expectedResult = service.addExistingResourceToCollectionIfMissing([], null, existingResource, undefined);
+          expect(expectedResult).toHaveLength(1);
+          expect(expectedResult).toContain(existingResource);
+        });
+      });
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/service/existing-resource.service.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/service/existing-resource.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cfeb9c262f7b609b84a55cfbe29d95e6830200f7
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/service/existing-resource.service.ts
@@ -0,0 +1,101 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpResponse } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import * as dayjs from 'dayjs';
+
+import { isPresent } from 'app/core/util/operators';
+import { ApplicationConfigService } from 'app/core/config/application-config.service';
+import { createRequestOption } from 'app/core/request/request-util';
+import { IExistingResource, getExistingResourceIdentifier } from '../existing-resource.model';
+
+export type EntityResponseType = HttpResponse<IExistingResource>;
+export type EntityArrayResponseType = HttpResponse<IExistingResource[]>;
+
+@Injectable({ providedIn: 'root' })
+export class ExistingResourceService {
+  public resourceUrl = this.applicationConfigService.getEndpointFor('api/existing-resources', 'iecbackend');
+
+  constructor(protected http: HttpClient, private applicationConfigService: ApplicationConfigService) {}
+
+  create(existingResource: IExistingResource): Observable<EntityResponseType> {
+    const copy = this.convertDateFromClient(existingResource);
+    return this.http
+      .post<IExistingResource>(this.resourceUrl, copy, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+  
+  update(existingResource: IExistingResource): Observable<EntityResponseType> {
+    const copy = this.convertDateFromClient(existingResource);
+    return this.http
+      .put<IExistingResource>(`${this.resourceUrl}/${getExistingResourceIdentifier(existingResource) as number}`, copy, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+
+  find(id: number): Observable<EntityResponseType> {
+    return this.http
+      .get<IExistingResource>(`${this.resourceUrl}/${id}`, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+
+  query(req?: any): Observable<EntityArrayResponseType> {
+    const options = createRequestOption(req);
+    return this.http
+      .get<IExistingResource[]>(this.resourceUrl, { params: options, observe: 'response' })
+      .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res)));
+  }
+  
+  delete(id: number): Observable<HttpResponse<{}>> {
+    return this.http.delete(`${this.resourceUrl}/${id}`, { observe: 'response' });
+  }
+
+  addExistingResourceToCollectionIfMissing(
+    existingResourceCollection: IExistingResource[],
+    ...existingResourcesToCheck: (IExistingResource | null | undefined)[]
+  ): IExistingResource[] {
+    const existingResources: IExistingResource[] = existingResourcesToCheck.filter(isPresent);
+    if (existingResources.length > 0) {
+      const existingResourceCollectionIdentifiers = existingResourceCollection.map(
+        existingResourceItem => getExistingResourceIdentifier(existingResourceItem)!
+      );
+      const existingResourcesToAdd = existingResources.filter(existingResourceItem => {
+        const existingResourceIdentifier = getExistingResourceIdentifier(existingResourceItem);
+        if (existingResourceIdentifier == null || existingResourceCollectionIdentifiers.includes(existingResourceIdentifier)) {
+          return false;
+        }
+        existingResourceCollectionIdentifiers.push(existingResourceIdentifier);
+        return true;
+      });
+      return [...existingResourcesToAdd, ...existingResourceCollection];
+    }
+    return existingResourceCollection;
+  }
+
+  protected convertDateFromClient(existingResource: IExistingResource): IExistingResource {
+    return Object.assign({}, existingResource, {
+      createdDate: existingResource.createdDate?.isValid() ? existingResource.createdDate.toJSON() : undefined,
+      lastModifiedDate: existingResource.lastModifiedDate?.isValid() ? existingResource.lastModifiedDate.toJSON() : undefined,
+      deletedDate: existingResource.deletedDate?.isValid() ? existingResource.deletedDate.toJSON() : undefined,
+    });
+  }
+
+  protected convertDateFromServer(res: EntityResponseType): EntityResponseType {
+    if (res.body) {
+      res.body.createdDate = res.body.createdDate ? dayjs(res.body.createdDate) : undefined;
+      res.body.lastModifiedDate = res.body.lastModifiedDate ? dayjs(res.body.lastModifiedDate) : undefined;
+      res.body.deletedDate = res.body.deletedDate ? dayjs(res.body.deletedDate) : undefined;
+    }
+    return res;
+  }
+
+  protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType {
+    if (res.body) {
+      res.body.forEach((existingResource: IExistingResource) => {
+        existingResource.createdDate = existingResource.createdDate ? dayjs(existingResource.createdDate) : undefined;
+        existingResource.lastModifiedDate = existingResource.lastModifiedDate ? dayjs(existingResource.lastModifiedDate) : undefined;
+        existingResource.deletedDate = existingResource.deletedDate ? dayjs(existingResource.deletedDate) : undefined;
+      });
+    }
+    return res;
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.html b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..967d1ec76024fffe3b50b91945d4db91035c725c
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.html
@@ -0,0 +1,113 @@
+<div class="row justify-content-center">
+  <div class="col-8">
+    <form name="editForm" role="form" novalidate (ngSubmit)="save()" [formGroup]="editForm">
+      <h2 id="jhi-instance-heading" data-cy="ExistingResourceCreateUpdateHeading" jhiTranslate="iecFrontendApp.iecBackendExistingResource.home.createOrEditLabel">
+        Create or edit an Existing Resource
+      </h2>
+
+      <div>
+        <jhi-alert-error></jhi-alert-error>
+
+        <div class="form-group" [hidden]="true">
+          <label class="form-control-label" jhiTranslate="global.field.id" for="field_id">ID</label>
+          <input type="number" class="form-control" name="id" id="field_id" data-cy="id" formControlName="id" [readonly]="true" />
+        </div>
+
+        <div class="form-group">
+          <label class="form-control-label" jhiTranslate="iecFrontendApp.iecBackendExistingResource.dataName" for="field_dataName">Data name</label>
+          <input type="text" class="form-control" name="dataName" id="field_dataName" data-cy="dataName" formControlName="dataName" />
+          <div *ngIf="editForm.get('dataName')!.invalid && (editForm.get('dataName')!.dirty || editForm.get('dataName')!.touched)">
+            <small class="form-text text-danger" *ngIf="editForm.get('dataName')?.errors?.required" jhiTranslate="entity.validation.required">
+              This field is required.
+            </small>
+            <small class="form-text text-danger" *ngIf="editForm.get('dataName')?.errors?.maxlength" jhiTranslate="entity.validation.maxlength" [translateValues]="{ max: 70 }">
+              This field cannot be longer than 70 characters.
+            </small>
+          </div>
+        </div>
+
+        <div class="form-group">
+          <label class="form-control-label" jhiTranslate="iecFrontendApp.iecBackendExistingResource.dataType" for="field_dataType">Data type</label>
+          <input type="text" class="form-control" name="dataType" id="field_dataType" data-cy="dataType" formControlName="dataType" />
+          <div *ngIf="editForm.get('dataType')!.invalid && (editForm.get('dataType')!.dirty || editForm.get('dataType')!.touched)">
+            <small class="form-text text-danger" *ngIf="editForm.get('dataType')?.errors?.required" jhiTranslate="entity.validation.required">
+              This field is required.
+            </small>
+            <small class="form-text text-danger" *ngIf="editForm.get('dataType')?.errors?.maxlength" jhiTranslate="entity.validation.maxlength" [translateValues]="{ max: 70 }">
+              This field cannot be longer than 70 characters.
+            </small>
+          </div>
+        </div>
+
+        <div class="form-group">
+          <label class="form-control-label" jhiTranslate="iecFrontendApp.iecBackendExistingResource.name" for="field_name">Name</label>
+          <input type="text" class="form-control" name="name" id="field_name" data-cy="name" formControlName="name" />
+          <div *ngIf="editForm.get('name')!.invalid && (editForm.get('name')!.dirty || editForm.get('name')!.touched)">
+            <small class="form-text text-danger" *ngIf="editForm.get('name')?.errors?.required" jhiTranslate="entity.validation.required">
+              This field is required.
+            </small>
+            <small class="form-text text-danger" *ngIf="editForm.get('name')?.errors?.maxlength" jhiTranslate="entity.validation.maxlength" [translateValues]="{ max: 70 }">
+              This field cannot be longer than 70 characters.
+            </small>
+          </div>
+        </div>
+
+        <div class="form-group">
+          <label class="form-control-label" jhiTranslate="iecFrontendApp.iecBackendExistingResource.datacenterId" for="field_datacenterId">Datacenter id</label>
+          <input type="text" class="form-control" name="datacenterId" id="field_datacenterId" data-cy="datacenterId" formControlName="datacenterId" />
+          <div *ngIf="editForm.get('datacenterId')!.invalid && (editForm.get('datacenterId')!.dirty || editForm.get('datacenterId')!.touched)">
+            <small class="form-text text-danger" *ngIf="editForm.get('datacenterId')?.errors?.required" jhiTranslate="entity.validation.required">
+              This field is required.
+            </small>
+            <small class="form-text text-danger" *ngIf="editForm.get('datacenterId')?.errors?.maxlength" jhiTranslate="entity.validation.maxlength" [translateValues]="{ max: 70 }">
+              This field cannot be longer than 70 characters.
+            </small>
+          </div>
+        </div>
+        
+        <div class="form-group">
+          <label class="form-control-label" jhiTranslate="iecFrontendApp.iecBackendExistingResource.user" for="field_user">User</label>
+          <input type="text" class="form-control" name="user" id="field_user" data-cy="user" formControlName="user" />
+          <div *ngIf="editForm.get('user')!.invalid && (editForm.get('user')!.dirty || editForm.get('user')!.touched)">
+            <small class="form-text text-danger" *ngIf="editForm.get('user')?.errors?.required" jhiTranslate="entity.validation.required">
+              This field is required.
+            </small>
+            <small class="form-text text-danger" *ngIf="editForm.get('user')?.errors?.maxlength" jhiTranslate="entity.validation.maxlength" [translateValues]="{ max: 70 }">
+              This field cannot be longer than 70 characters.
+            </small>
+          </div>
+        </div>
+        
+        <div class="form-group">
+          <label class="form-control-label" jhiTranslate="iecFrontendApp.iecBackendExistingResource.provider" for="field_provider">Provider</label>
+          <input type="text" class="form-control" name="provider" id="field_provider" data-cy="provider" formControlName="provider" />
+          <div *ngIf="editForm.get('provider')!.invalid && (editForm.get('provider')!.dirty || editForm.get('provider')!.touched)">
+            <small class="form-text text-danger" *ngIf="editForm.get('provider')?.errors?.required" jhiTranslate="entity.validation.required">
+              This field is required.
+            </small>
+            <small class="form-text text-danger" *ngIf="editForm.get('provider')?.errors?.maxlength" jhiTranslate="entity.validation.maxlength" [translateValues]="{ max: 70 }">
+              This field cannot be longer than 70 characters.
+            </small>
+          </div>
+        </div>
+        <input type="hidden" id="field_createdDate" data-cy="createdDate" name="createdDate" formControlName="createdDate"/>
+        <input type="hidden" id="field_lastModifiedDate" data-cy="lastModifiedDate" name="lastModifiedDate" formControlName="lastModifiedDate"/>
+        <input type="hidden" id="field_deletedDate" data-cy="deletedDate" name="deletedDate" formControlName="deletedDate"/>
+      </div>
+      
+      <div class="form-group">
+      {{editForm.invalid}}
+      </div>
+
+      <div>
+        <button type="button" id="cancel-save" class="btn btn-secondary" (click)="previousState()">
+          <fa-icon icon="ban"></fa-icon>&nbsp;<span jhiTranslate="entity.action.cancel">Cancel</span>
+        </button>
+
+        <button type="submit" id="save-entity" data-cy="entityCreateSaveButton" [disabled]="editForm.invalid || isSaving" class="btn btn-primary">
+          <fa-icon icon="save"></fa-icon>&nbsp;<span jhiTranslate="entity.action.save">Save</span>
+        </button>
+      </div>
+    </form>
+  </div>
+</div>
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1167a907eb7e5488eba3dea24dca5c605d3fadf0
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.spec.ts
@@ -0,0 +1,120 @@
+jest.mock('@angular/router');
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { HttpResponse } from '@angular/common/http';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { FormBuilder } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { of, Subject } from 'rxjs';
+
+import { ExistingResourceService } from '../service/existing-resource.service';
+import { IExistingResource, ExistingResource } from '../existing-resource.model';
+
+import { ExistingResourceUpdateComponent } from './existing-resource-update.component';
+
+describe('Component Tests', () => {
+  describe('Existing Resource Management Update Component', () => {
+    let comp: ExistingResourceUpdateComponent;
+    let fixture: ComponentFixture<ExistingResourceUpdateComponent>;
+    let activatedRoute: ActivatedRoute;
+    let existingResourceService: ExistingResourceService;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        declarations: [ExistingResourceUpdateComponent],
+        providers: [FormBuilder, ActivatedRoute],
+      })
+        .overrideTemplate(ExistingResourceUpdateComponent, '')
+        .compileComponents();
+
+      fixture = TestBed.createComponent(ExistingResourceUpdateComponent);
+      activatedRoute = TestBed.inject(ActivatedRoute);
+      existingResourceService = TestBed.inject(ExistingResourceService);
+
+      comp = fixture.componentInstance;
+    });
+
+    describe('ngOnInit', () => {
+      it('Should call RootService query and add missing value', () => {
+        const existingResource: IExistingResource = { id: 456 };
+
+        activatedRoute.data = of({ existingResource });
+        comp.ngOnInit();
+      });
+
+      it('Should update editForm', () => {
+        const existingResource: IExistingResource = { id: 456 };
+
+        activatedRoute.data = of({ existingResource });
+        comp.ngOnInit();
+
+        expect(comp.editForm.value).toEqual(expect.objectContaining(existingResource));
+      });
+    });
+
+    describe('save', () => {
+      it('Should call update service on save for existing entity', () => {
+        // GIVEN
+        const saveSubject = new Subject();
+        const existingResource = { id: 123 };
+        spyOn(existingResourceService, 'update').and.returnValue(saveSubject);
+        spyOn(comp, 'previousState');
+        activatedRoute.data = of({ existingResource });
+        comp.ngOnInit();
+
+        // WHEN
+        comp.save();
+        expect(comp.isSaving).toEqual(true);
+        saveSubject.next(new HttpResponse({ body: existingResource }));
+        saveSubject.complete();
+
+        // THEN
+        expect(comp.previousState).toHaveBeenCalled();
+        expect(existingResourceService.update).toHaveBeenCalledWith(existingResource);
+        expect(comp.isSaving).toEqual(false);
+      });
+
+      it('Should call create service on save for new entity', () => {
+        // GIVEN
+        const saveSubject = new Subject();
+        const existingResource = new ExistingResource();
+        spyOn(existingResourceService, 'create').and.returnValue(saveSubject);
+        spyOn(comp, 'previousState');
+        activatedRoute.data = of({ existingResource });
+        comp.ngOnInit();
+
+        // WHEN
+        comp.save();
+        expect(comp.isSaving).toEqual(true);
+        saveSubject.next(new HttpResponse({ body: existingResource }));
+        saveSubject.complete();
+
+        // THEN
+        expect(existingResourceService.create).toHaveBeenCalledWith(existingResource);
+        expect(comp.isSaving).toEqual(false);
+        expect(comp.previousState).toHaveBeenCalled();
+      });
+
+      it('Should set isSaving to false on error', () => {
+        // GIVEN
+        const saveSubject = new Subject();
+        const existingResource = { id: 123 };
+        spyOn(existingResourceService, 'update').and.returnValue(saveSubject);
+        spyOn(comp, 'previousState');
+        activatedRoute.data = of({ existingResource });
+        comp.ngOnInit();
+
+        // WHEN
+        comp.save();
+        expect(comp.isSaving).toEqual(true);
+        saveSubject.error('This is an error!');
+
+        // THEN
+        expect(existingResourceService.update).toHaveBeenCalledWith(existingResource);
+        expect(comp.isSaving).toEqual(false);
+        expect(comp.previousState).not.toHaveBeenCalled();
+      });
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..de1959163fb354837ef69e8fae452f339e7be67d
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/existing-resource/update/existing-resource-update.component.ts
@@ -0,0 +1,121 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpResponse } from '@angular/common/http';
+import { FormBuilder, Validators } from '@angular/forms';
+import { ActivatedRoute } from '@angular/router';
+import { Observable } from 'rxjs';
+import { finalize } from 'rxjs/operators';
+
+import * as dayjs from 'dayjs';
+import { DATE_TIME_FORMAT } from 'app/config/input.constants';
+
+import { IExistingResource, ExistingResource } from '../existing-resource.model';
+import { ExistingResourceService } from '../service/existing-resource.service';
+
+@Component({
+  selector: 'jhi-existing-resource-update',
+  templateUrl: './existing-resource-update.component.html',
+})
+export class ExistingResourceUpdateComponent implements OnInit {
+  isSaving = false;
+
+  editForm = this.fb.group({
+    id: [],
+    dataName: [null, [Validators.required, Validators.maxLength(70)]],
+    dataType: [null, [Validators.required, Validators.maxLength(70)]],
+    name: [null, [Validators.required, Validators.maxLength(70)]],
+    datacenterId: [null, [Validators.required, Validators.maxLength(70)]],
+    user: [null, [Validators.required, Validators.maxLength(70)]],
+    provider: [null, [Validators.required, Validators.maxLength(70)]],
+    createdDate: [null, [Validators.required]],
+    lastModifiedDate: [],
+    deletedDate: []
+  });
+
+  constructor(
+    protected existingResourceService: ExistingResourceService,
+    protected activatedRoute: ActivatedRoute,
+    protected fb: FormBuilder
+  ) {}
+
+  ngOnInit(): void {
+    this.activatedRoute.data.subscribe(({ existingResource }) => {
+      const today = dayjs();
+      if (existingResource.id === undefined) {
+        existingResource.createdDate = today;
+      } else {
+        existingResource.lastModifiedDate = today;
+      }
+      this.updateForm(existingResource);
+    });
+  }
+
+  previousState(): void {
+    window.history.back();
+  }
+
+  save(): void {
+    this.isSaving = true;
+    const existingResource = this.createFromForm();
+    if (existingResource.id !== undefined) {
+      this.subscribeToSaveResponse(this.existingResourceService.update(existingResource));
+    } else {
+      this.subscribeToSaveResponse(this.existingResourceService.create(existingResource));
+    }
+  }
+
+  protected subscribeToSaveResponse(result: Observable<HttpResponse<IExistingResource>>): void {
+    result.pipe(finalize(() => this.onSaveFinalize())).subscribe(
+      () => this.onSaveSuccess(),
+      () => this.onSaveError()
+    );
+  }
+
+  protected onSaveSuccess(): void {
+    this.previousState();
+  }
+
+  protected onSaveError(): void {
+    // Api for inheritance.
+  }
+
+  protected onSaveFinalize(): void {
+    this.isSaving = false;
+  }
+
+  protected updateForm(existingResource: IExistingResource): void {
+    this.editForm.patchValue({
+      id: existingResource!.id,
+      dataName: existingResource.dataName,
+      dataType: existingResource.dataType,
+      name: existingResource.name,
+      datacenterId: existingResource.datacenterId,
+      user: existingResource.user,
+      provider: existingResource.provider,
+      createdDate: existingResource.createdDate ? existingResource.createdDate.format(DATE_TIME_FORMAT) : null,
+      lastModifiedDate: existingResource.lastModifiedDate ? existingResource.lastModifiedDate.format(DATE_TIME_FORMAT) : null,
+      deletedDate: existingResource.deletedDate ? existingResource.deletedDate.format(DATE_TIME_FORMAT) : null
+    });
+  }
+
+  protected createFromForm(): IExistingResource {
+    return {
+      ...new ExistingResource(),
+      id: this.editForm.get(['id'])!.value,
+      dataName: this.editForm.get(['dataName'])!.value,
+      dataType: this.editForm.get(['dataType'])!.value,
+      name: this.editForm.get(['name'])!.value,
+      datacenterId: this.editForm.get(['datacenterId'])!.value,
+      user: this.editForm.get(['user'])!.value,
+      provider: this.editForm.get(['provider'])!.value,
+      createdDate: this.editForm.get(['createdDate'])!.value
+        ? dayjs(this.editForm.get(['createdDate'])!.value, DATE_TIME_FORMAT)
+        : undefined,
+      lastModifiedDate: this.editForm.get(['lastModifiedDate'])!.value
+        ? dayjs(this.editForm.get(['lastModifiedDate'])!.value, DATE_TIME_FORMAT)
+        : undefined,
+      deletedDate: this.editForm.get(['deletedDate'])!.value
+        ? dayjs(this.editForm.get(['deletedDate'])!.value, DATE_TIME_FORMAT)
+        : undefined
+    };
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.html b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..f6118f2a2f5617220bfb9b56548c04b67369f0fc
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.html
@@ -0,0 +1,24 @@
+<div class="row justify-content-center">
+  <div class="col-6">
+    <div class="card">
+      <h5 class="card-header text-white bg-primary p-4 font-weight-bold" *ngIf="image?.imageType == imageVM">{{image?.imageName}}</h5>
+      <h5 class="card-header text-white bg-primary p-4 font-weight-bold" *ngIf="image?.imageType == imageDocker">{{image?.imageUrl}}</h5>
+      <div class="card-body">
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendImage.imageType">Type</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ image?.imageType }}</span><br>
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendImage.imageDescription">Description</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ image?.imageDescription }}</span><br>
+        <span class="text-primary font-weight-bold" jhiTranslate="iecFrontendApp.iecBackendImage.imageProvider">Provider</span>
+        <span>&nbsp;&nbsp;</span>
+        <span>{{ image?.imageProvider }}</span>
+      </div>
+  	  <div class="card-footer">
+    	<button type="submit" (click)="previousState()" class="btn btn-info float-right" data-cy="entityDetailsBackButton">
+      	<fa-icon icon="arrow-left"></fa-icon>&nbsp;<span jhiTranslate="entity.action.back">Back</span>
+    	</button>
+  	  </div>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1def98e3f4e6ccf93f65d7ffe40279e105c41bae
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.spec.ts
@@ -0,0 +1,38 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ActivatedRoute } from '@angular/router';
+import { of } from 'rxjs';
+
+import { ImageDetailComponent } from './image-detail.component';
+
+describe('Component Tests', () => {
+  describe('Image Management Detail Component', () => {
+    let comp: ImageDetailComponent;
+    let fixture: ComponentFixture<ImageDetailComponent>;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        declarations: [ImageDetailComponent],
+        providers: [
+          {
+            provide: ActivatedRoute,
+            useValue: { data: of({ image: { id: 123 } }) },
+          },
+        ],
+      })
+        .overrideTemplate(ImageDetailComponent, '')
+        .compileComponents();
+      fixture = TestBed.createComponent(ImageDetailComponent);
+      comp = fixture.componentInstance;
+    });
+
+    describe('OnInit', () => {
+      it('Should load image on init', () => {
+        // WHEN
+        comp.ngOnInit();
+
+        // THEN
+        expect(comp.image).toEqual(jasmine.objectContaining({ id: 123 }));
+      });
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3e0ca8b378d88bfe2e5725ed4b56ff07ffaa7cc7
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/detail/image-detail.component.ts
@@ -0,0 +1,31 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+import { IImage } from '../image.model';
+
+import { IMAGE_DOCKER, IMAGE_VM } from '../../../../app.constants';
+
+@Component({
+  selector: 'jhi-image-detail',
+  templateUrl: './image-detail.component.html',
+})
+export class ImageDetailComponent implements OnInit {
+  image: IImage | null = null;
+  imageDocker: string;
+  imageVM: string;
+
+  constructor(protected activatedRoute: ActivatedRoute) {
+	this.imageDocker = IMAGE_DOCKER;
+	this.imageVM = IMAGE_VM;
+  }
+
+  ngOnInit(): void {
+    this.activatedRoute.data.subscribe(({ image }) => {
+      this.image = image;
+    });
+  }
+
+  previousState(): void {
+    window.history.back();
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/image.model.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/image.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..765fcba03c35f738bc4bbd2b4ccb14a600683618
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/image.model.ts
@@ -0,0 +1,31 @@
+import * as dayjs from 'dayjs';
+
+export interface IImage {
+  id?: number;
+  imageType?: string;
+  imageName?: string;
+  imageUrl?: string;
+  imageDescription?: string;
+  imageProvider?: string;
+  createdDate?: dayjs.Dayjs;
+  lastModifiedDate?: dayjs.Dayjs | null;
+  deletedDate?: dayjs.Dayjs | null;
+}
+
+export class Image implements IImage {
+  constructor(
+    public id?: number,
+    public imageType?: string,
+    public imageName?: string,
+    public imageUrl?: string,
+    public imageDescription?: string,
+    public imageProvider?: string,
+    public createdDate?: dayjs.Dayjs,
+    public lastModifiedDate?: dayjs.Dayjs | null,
+    public deletedDate?: dayjs.Dayjs | null,
+  ) {}
+}
+
+export function getImageIdentifier(image: IImage): number | undefined {
+  return image.id;
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/image.module.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/image.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1759a8cd099f00553838c8ef7467c20141a1d0b1
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/image.module.ts
@@ -0,0 +1,12 @@
+import { NgModule } from '@angular/core';
+
+import { SharedModule } from 'app/shared/shared.module';
+import { ImageComponent } from './list/image.component';
+import { ImageDetailComponent } from './detail/image-detail.component';
+import { ImageRoutingModule } from './route/image-routing.module';
+
+@NgModule({
+  imports: [SharedModule, ImageRoutingModule],
+  declarations: [ImageComponent, ImageDetailComponent],
+})
+export class IecBackendImageModule {}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.html b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..0bc437daf2088eff8726306cce059592bedf0192
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.html
@@ -0,0 +1,94 @@
+<div>
+  <nav class="navbar navbar-dark bg-primary">
+    <span class="navbar-brand mb-0 h1" jhiTranslate="iecFrontendApp.iecBackendImage.home.title">Images</span>
+  </nav>
+  
+  <h2 id="page-heading" data-cy="ImageHeading">
+    <div class="d-flex justify-content-end mt-2">
+      <button class="btn btn-info mr-2" (click)="loadPage()" [disabled]="isLoading">
+        <fa-icon icon="sync" [spin]="isLoading"></fa-icon>
+        <span jhiTranslate="iecFrontendApp.iecBackendImage.home.refreshListLabel">Refresh List</span>
+      </button>
+    </div>
+  </h2>
+
+  <jhi-alert-error></jhi-alert-error>
+
+  <jhi-alert></jhi-alert>
+
+  <div class="alert alert-warning" id="no-result" *ngIf="images?.length === 0">
+    <span jhiTranslate="iecFrontendApp.iecBackendImage.home.notFound">No Images found</span>
+  </div>
+
+  <div class="table-responsive" id="entities" *ngIf="images && images.length > 0">
+    <table class="table table-striped" aria-describedby="page-heading">
+      <thead>
+        <tr jhiSort [(predicate)]="predicate" [(ascending)]="ascending" [callback]="loadPage.bind(this)">
+          <th scope="col" jhiSortBy="imageType">
+            <span jhiTranslate="iecFrontendApp.iecBackendImage.imageType">Type</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="imageName">
+            <span jhiTranslate="iecFrontendApp.iecBackendImage.imageName">Name</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="imageUrl">
+            <span jhiTranslate="iecFrontendApp.iecBackendImage.imageUrl">URL</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col" jhiSortBy="imageProvider">
+            <span jhiTranslate="iecFrontendApp.iecBackendImage.imageProvider">Provider</span>
+            <fa-icon icon="sort"></fa-icon>
+          </th>
+          <th scope="col">
+            <span jhiTranslate="iecFrontendApp.iecBackendImage.status">Status</span>
+          </th>
+          <th scope="col"></th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr *ngFor="let image of images; trackBy: trackId" data-cy="entityTable">
+          <td>{{ image.imageType }}</td>
+          <td>{{ image.imageName }}</td>
+          <td>{{ image.imageUrl }}</td>
+          <td>{{ image.imageProvider }}</td>
+          <td>
+            <span class="badge badge-success" jhiTranslate="iecFrontendApp.iecBackendImage.active" *ngIf="image.deletedDate == null">Active</span>
+            <span class="badge badge-danger" jhiTranslate="iecFrontendApp.iecBackendImage.inactive" *ngIf="image.deletedDate != null">Inactive</span>
+          </td>
+          <td class="text-right">
+            <div class="btn-group">
+              <button
+                type="submit"
+                [routerLink]="['/image', image.id, 'view']"
+                class="btn btn-info btn-sm"
+                data-cy="entityDetailsButton"
+              >
+                <fa-icon icon="eye"></fa-icon>
+                <span class="d-none d-md-inline" jhiTranslate="entity.action.view">View</span>
+              </button>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+
+  <div *ngIf="images && images.length > 0">
+    <div class="row justify-content-center">
+      <jhi-item-count [params]="{ page: page, totalItems: totalItems, itemsPerPage: itemsPerPage }"></jhi-item-count>
+    </div>
+
+    <div class="row justify-content-center">
+      <ngb-pagination
+        [collectionSize]="totalItems"
+        [(page)]="ngbPaginationPage"
+        [pageSize]="itemsPerPage"
+        [maxSize]="5"
+        [rotate]="true"
+        [boundaryLinks]="true"
+        (pageChange)="loadPage($event)"
+      ></ngb-pagination>
+    </div>
+  </div>
+</div>
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6065edf146542dd37c9535aaa0b97e5a27a2e104
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.spec.ts
@@ -0,0 +1,100 @@
+jest.mock('@angular/router');
+
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ActivatedRoute, Router } from '@angular/router';
+import { of } from 'rxjs';
+
+import { ImageService } from '../service/image.service';
+
+import { ImageComponent } from './image.component';
+
+describe('Component Tests', () => {
+  describe('Image Management Component', () => {
+    let comp: ImageComponent;
+    let fixture: ComponentFixture<ImageComponent>;
+    let service: ImageService;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        declarations: [ImageComponent],
+        providers: [
+          Router,
+          {
+            provide: ActivatedRoute,
+            useValue: {
+              data: of({
+                defaultSort: 'id,asc',
+              }),
+              queryParamMap: of(
+                jest.requireActual('@angular/router').convertToParamMap({
+                  page: '1',
+                  size: '1',
+                  sort: 'id,desc',
+                })
+              ),
+            },
+          },
+        ],
+      })
+        .overrideTemplate(ImageComponent, '')
+        .compileComponents();
+
+      fixture = TestBed.createComponent(ImageComponent);
+      comp = fixture.componentInstance;
+      service = TestBed.inject(ImageService);
+
+      const headers = new HttpHeaders().append('link', 'link;link');
+      spyOn(service, 'query').and.returnValue(
+        of(
+          new HttpResponse({
+            body: [{ id: 123 }],
+            headers,
+          })
+        )
+      );
+    });
+
+    it('Should call load all on init', () => {
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(service.query).toHaveBeenCalled();
+      expect(comp.images?.[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+    });
+
+    it('should load a page', () => {
+      // WHEN
+      comp.loadPage(1);
+
+      // THEN
+      expect(service.query).toHaveBeenCalled();
+      expect(comp.images?.[0]).toEqual(jasmine.objectContaining({ id: 123 }));
+    });
+
+    it('should calculate the sort attribute for an id', () => {
+      // WHEN
+      comp.ngOnInit();
+
+      // THEN
+      expect(service.query).toHaveBeenCalledWith(expect.objectContaining({ sort: ['id,desc'] }));
+    });
+
+    it('should calculate the sort attribute for a non-id attribute', () => {
+      // INIT
+      comp.ngOnInit();
+
+      // GIVEN
+      comp.predicate = 'name';
+
+      // WHEN
+      comp.loadPage(1);
+
+      // THEN
+      expect(service.query).toHaveBeenLastCalledWith(expect.objectContaining({ sort: ['name,desc', 'id'] }));
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..34825e7f8ca4e5de9365b079967a44ddbfe51b70
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/list/image.component.ts
@@ -0,0 +1,105 @@
+import { Component, OnInit } from '@angular/core';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { ActivatedRoute, Router } from '@angular/router';
+import { combineLatest } from 'rxjs';
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
+
+import { IImage } from '../image.model';
+
+import { ITEMS_PER_PAGE } from 'app/config/pagination.constants';
+import { ImageService } from '../service/image.service';
+
+@Component({
+  selector: 'jhi-image',
+  templateUrl: './image.component.html',
+})
+export class ImageComponent implements OnInit {
+  images?: IImage[];
+  isLoading = false;
+  totalItems = 0;
+  itemsPerPage = ITEMS_PER_PAGE;
+  page?: number;
+  predicate!: string;
+  ascending!: boolean;
+  ngbPaginationPage = 1;
+
+  constructor(
+    protected imageService: ImageService,
+    protected activatedRoute: ActivatedRoute,
+    protected router: Router,
+    protected modalService: NgbModal
+  ) {}
+
+  loadPage(page?: number, dontNavigate?: boolean): void {
+    this.isLoading = true;
+    const pageToLoad: number = page ?? this.page ?? 1;
+
+    this.imageService
+      .query({
+        page: pageToLoad - 1,
+        size: this.itemsPerPage,
+        sort: this.sort(),
+      })
+      .subscribe(
+        (res: HttpResponse<IImage[]>) => {
+          this.isLoading = false;
+          this.onSuccess(res.body, res.headers, pageToLoad, !dontNavigate);
+        },
+        () => {
+          this.isLoading = false;
+          this.onError();
+        }
+      );
+  }
+
+  ngOnInit(): void {
+    this.handleNavigation();
+  }
+
+  trackId(index: number, item: IImage): number {
+    return item.id!;
+  }
+
+  protected sort(): string[] {
+    const result = [this.predicate + ',' + (this.ascending ? 'asc' : 'desc')];
+    if (this.predicate !== 'id') {
+      result.push('id');
+    }
+    return result;
+  }
+
+  protected handleNavigation(): void {
+    combineLatest([this.activatedRoute.data, this.activatedRoute.queryParamMap]).subscribe(([data, params]) => {
+      const page = params.get('page');
+      const pageNumber = page !== null ? +page : 1;
+      const sort = (params.get('sort') ?? data['defaultSort']).split(',');
+      const predicate = sort[0];
+      const ascending = sort[1] === 'asc';
+      if (pageNumber !== this.page || predicate !== this.predicate || ascending !== this.ascending) {
+        this.predicate = predicate;
+        this.ascending = ascending;
+        this.loadPage(pageNumber, true);
+      }
+    });
+  }
+
+  protected onSuccess(data: IImage[] | null, headers: HttpHeaders, page: number, navigate: boolean): void {
+    this.totalItems = Number(headers.get('X-Total-Count'));
+    this.page = page;
+    if (navigate) {
+      this.router.navigate(['/image'], {
+        queryParams: {
+          page: this.page,
+          size: this.itemsPerPage,
+          sort: this.predicate + ',' + (this.ascending ? 'asc' : 'desc'),
+        },
+      });
+    }
+    this.images = data ?? [];
+    this.ngbPaginationPage = this.page;
+  }
+
+  protected onError(): void {
+    this.ngbPaginationPage = this.page ?? 1;
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing-resolve.service.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing-resolve.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b6451497df89ed7a10dc7b9fe4636f52acedab15
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing-resolve.service.spec.ts
@@ -0,0 +1,82 @@
+jest.mock('@angular/router');
+
+import { TestBed } from '@angular/core/testing';
+import { HttpResponse } from '@angular/common/http';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
+import { ActivatedRouteSnapshot, Router } from '@angular/router';
+import { of } from 'rxjs';
+
+import { IImage, Image } from '../image.model';
+import { ImageService } from '../service/image.service';
+
+import { ImageRoutingResolveService } from './image-routing-resolve.service';
+
+describe('Service Tests', () => {
+  describe('Image routing resolve service', () => {
+    let mockRouter: Router;
+    let mockActivatedRouteSnapshot: ActivatedRouteSnapshot;
+    let routingResolveService: ImageRoutingResolveService;
+    let service: ImageService;
+    let resultImage: IImage | undefined;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+        providers: [Router, ActivatedRouteSnapshot],
+      });
+      mockRouter = TestBed.inject(Router);
+      mockActivatedRouteSnapshot = TestBed.inject(ActivatedRouteSnapshot);
+      routingResolveService = TestBed.inject(ImageRoutingResolveService);
+      service = TestBed.inject(ImageService);
+      resultImage = undefined;
+    });
+
+    describe('resolve', () => {
+      it('should return IImage returned by find', () => {
+        // GIVEN
+        service.find = jest.fn(id => of(new HttpResponse({ body: { id } })));
+        mockActivatedRouteSnapshot.params = { id: 123 };
+
+        // WHEN
+        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
+          resultImage = result;
+        });
+
+        // THEN
+        expect(service.find).toBeCalledWith(123);
+        expect(resultImage).toEqual({ id: 123 });
+      });
+
+      it('should return new IImage if id is not provided', () => {
+        // GIVEN
+        service.find = jest.fn();
+        mockActivatedRouteSnapshot.params = {};
+
+        // WHEN
+        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
+          resultImage = result;
+        });
+
+        // THEN
+        expect(service.find).not.toBeCalled();
+        expect(resultImage).toEqual(new Image());
+      });
+
+      it('should route to 404 page if data not found in server', () => {
+        // GIVEN
+        spyOn(service, 'find').and.returnValue(of(new HttpResponse({ body: null })));
+        mockActivatedRouteSnapshot.params = { id: 123 };
+
+        // WHEN
+        routingResolveService.resolve(mockActivatedRouteSnapshot).subscribe(result => {
+          resultImage = result;
+        });
+
+        // THEN
+        expect(service.find).toBeCalledWith(123);
+        expect(resultImage).toEqual(undefined);
+        expect(mockRouter.navigate).toHaveBeenCalledWith(['404']);
+      });
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing-resolve.service.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing-resolve.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..02bceffca2df150a037cdc8dac8d919ca1f68642
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing-resolve.service.ts
@@ -0,0 +1,30 @@
+import { Injectable } from '@angular/core';
+import { HttpResponse } from '@angular/common/http';
+import { Resolve, ActivatedRouteSnapshot, Router } from '@angular/router';
+import { Observable, of, EMPTY } from 'rxjs';
+import { mergeMap } from 'rxjs/operators';
+
+import { IImage, Image } from '../image.model';
+import { ImageService } from '../service/image.service';
+
+@Injectable({ providedIn: 'root' })
+export class ImageRoutingResolveService implements Resolve<IImage> {
+  constructor(protected service: ImageService, protected router: Router) {}
+
+  resolve(route: ActivatedRouteSnapshot): Observable<IImage> | Observable<never> {
+    const id = route.params['id'];
+    if (id) {
+      return this.service.find(id).pipe(
+        mergeMap((image: HttpResponse<Image>) => {
+          if (image.body) {
+            return of(image.body);
+          } else {
+            this.router.navigate(['404']);
+            return EMPTY;
+          }
+        })
+      );
+    }
+    return of(new Image());
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing.module.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing.module.ts
new file mode 100644
index 0000000000000000000000000000000000000000..76fd5092fc3a5312038714c778ca3cf3f7f1fad8
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/route/image-routing.module.ts
@@ -0,0 +1,32 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { UserRouteAccessService } from 'app/core/auth/user-route-access.service';
+import { ImageComponent } from '../list/image.component';
+import { ImageDetailComponent } from '../detail/image-detail.component';
+import { ImageRoutingResolveService } from './image-routing-resolve.service';
+
+const imageRoute: Routes = [
+  {
+    path: '',
+    component: ImageComponent,
+    data: {
+      defaultSort: 'id,asc',
+    },
+    canActivate: [UserRouteAccessService],
+  },
+  {
+    path: ':id/view',
+    component: ImageDetailComponent,
+    resolve: {
+      image: ImageRoutingResolveService,
+    },
+    canActivate: [UserRouteAccessService],
+  },
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(imageRoute)],
+  exports: [RouterModule],
+})
+export class ImageRoutingModule {}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/service/image.service.spec.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/service/image.service.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..afb6a0fe35270f5c542c20c991cc36ef28f0ced3
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/service/image.service.spec.ts
@@ -0,0 +1,203 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import * as dayjs from 'dayjs';
+
+import { DATE_TIME_FORMAT } from 'app/config/input.constants';
+import { IImage, Image } from '../image.model';
+
+import { ImageService } from './image.service';
+
+describe('Image Tests', () => {
+  describe('Image Service', () => {
+    let service: ImageService;
+    let httpMock: HttpTestingController;
+    let elemDefault: IImage;
+    let expectedResult: IImage | IImage[] | boolean | null;
+    let currentDate: dayjs.Dayjs;
+
+    beforeEach(() => {
+      TestBed.configureTestingModule({
+        imports: [HttpClientTestingModule],
+      });
+      expectedResult = null;
+      service = TestBed.inject(ImageService);
+      httpMock = TestBed.inject(HttpTestingController);
+      currentDate = dayjs();
+
+      elemDefault = {
+        id: 0,
+        imageName: 'AAAAAAA',
+        createdDate: currentDate,
+        lastModifiedDate: currentDate,
+        deletedDate: currentDate,
+      };
+    });
+
+    describe('Image methods', () => {
+      it('should find an element', () => {
+        const returnedFromService = Object.assign(
+          {
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        service.find(123).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(elemDefault);
+      });
+
+      it('should create an Image', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 0,
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            createdDate: currentDate,
+            lastModifiedDate: currentDate,
+            deletedDate: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.create(new Image()).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'POST' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(expected);
+      });
+
+      it('should update an Image', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 1,
+            imageName: 'BBBBBB',
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            createdDate: currentDate,
+            lastModifiedDate: currentDate,
+            deletedDate: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.update(expected).subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'PUT' });
+        req.flush(returnedFromService);
+        expect(expectedResult).toMatchObject(expected);
+      });
+
+      it('should return a list of Images', () => {
+        const returnedFromService = Object.assign(
+          {
+            id: 1,
+            imageName: 'BBBBBB',
+            createdDate: currentDate.format(DATE_TIME_FORMAT),
+            lastModifiedDate: currentDate.format(DATE_TIME_FORMAT),
+            deletedDate: currentDate.format(DATE_TIME_FORMAT),
+          },
+          elemDefault
+        );
+
+        const expected = Object.assign(
+          {
+            createdDate: currentDate,
+            lastModifiedDate: currentDate,
+            deletedDate: currentDate,
+          },
+          returnedFromService
+        );
+
+        service.query().subscribe(resp => (expectedResult = resp.body));
+
+        const req = httpMock.expectOne({ method: 'GET' });
+        req.flush([returnedFromService]);
+        httpMock.verify();
+        expect(expectedResult).toContainEqual(expected);
+      });
+
+      it('should delete an Image', () => {
+        service.delete(123).subscribe(resp => (expectedResult = resp.ok));
+
+        const req = httpMock.expectOne({ method: 'DELETE' });
+        req.flush({ status: 200 });
+        expect(expectedResult);
+      });
+
+      describe('addImageToCollectionIfMissing', () => {
+        it('should add an Image to an empty array', () => {
+          const image: IImage = { id: 123 };
+          expectedResult = service.addImageToCollectionIfMissing([], image);
+          expect(expectedResult).toHaveLength(1);
+          expect(expectedResult).toContain(image);
+        });
+
+        it('should not add an Image to an array that contains it', () => {
+          const image: IImage = { id: 123 };
+          const imageCollection: IImage[] = [
+            {
+              ...image,
+            },
+            { id: 456 },
+          ];
+          expectedResult = service.addImageToCollectionIfMissing(imageCollection, image);
+          expect(expectedResult).toHaveLength(2);
+        });
+
+        it("should add an Image to an array that doesn't contain it", () => {
+          const image: IImage = { id: 123 };
+          const imageCollection: IImage[] = [{ id: 456 }];
+          expectedResult = service.addImageToCollectionIfMissing(imageCollection, image);
+          expect(expectedResult).toHaveLength(2);
+          expect(expectedResult).toContain(image);
+        });
+
+        it('should add only unique Image to an array', () => {
+          const imageArray: IImage[] = [{ id: 123 }, { id: 456 }, { id: 27673 }];
+          const imageCollection: IImage[] = [{ id: 123 }];
+          expectedResult = service.addImageToCollectionIfMissing(imageCollection, ...imageArray);
+          expect(expectedResult).toHaveLength(3);
+        });
+
+        it('should accept varargs', () => {
+          const image: IImage = { id: 123 };
+          const image2: IImage = { id: 456 };
+          expectedResult = service.addImageToCollectionIfMissing([], image, image2);
+          expect(expectedResult).toHaveLength(2);
+          expect(expectedResult).toContain(image);
+          expect(expectedResult).toContain(image2);
+        });
+
+        it('should accept null and undefined values', () => {
+          const image: IImage = { id: 123 };
+          expectedResult = service.addImageToCollectionIfMissing([], null, image, undefined);
+          expect(expectedResult).toHaveLength(1);
+          expect(expectedResult).toContain(image);
+        });
+      });
+    });
+
+    afterEach(() => {
+      httpMock.verify();
+    });
+  });
+});
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/service/image.service.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/service/image.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e38b63ebd6f6d0afe7c5f84e8ada32c4f66723bd
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/image/service/image.service.ts
@@ -0,0 +1,83 @@
+import { Injectable } from '@angular/core';
+import { HttpClient, HttpResponse } from '@angular/common/http';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import * as dayjs from 'dayjs';
+
+import { isPresent } from 'app/core/util/operators';
+import { ApplicationConfigService } from 'app/core/config/application-config.service';
+import { createRequestOption } from 'app/core/request/request-util';
+import { IImage, getImageIdentifier } from '../image.model';
+
+export type EntityResponseType = HttpResponse<IImage>;
+export type EntityArrayResponseType = HttpResponse<IImage[]>;
+
+@Injectable({ providedIn: 'root' })
+export class ImageService {
+  public resourceUrl = this.applicationConfigService.getEndpointFor('api/images', 'iecbackend');
+
+  constructor(protected http: HttpClient, private applicationConfigService: ApplicationConfigService) {}
+
+  find(id: number): Observable<EntityResponseType> {
+    return this.http
+      .get<IImage>(`${this.resourceUrl}/${id}`, { observe: 'response' })
+      .pipe(map((res: EntityResponseType) => this.convertDateFromServer(res)));
+  }
+
+  query(req?: any): Observable<EntityArrayResponseType> {
+    const options = createRequestOption(req);
+    return this.http
+      .get<IImage[]>(this.resourceUrl, { params: options, observe: 'response' })
+      .pipe(map((res: EntityArrayResponseType) => this.convertDateArrayFromServer(res)));
+  }
+
+  addImageToCollectionIfMissing(
+    imageCollection: IImage[],
+    ...imagesToCheck: (IImage | null | undefined)[]
+  ): IImage[] {
+    const images: IImage[] = imagesToCheck.filter(isPresent);
+    if (images.length > 0) {
+      const imageCollectionIdentifiers = imageCollection.map(
+        imageItem => getImageIdentifier(imageItem)!
+      );
+      const imagesToAdd = images.filter(imageItem => {
+        const imageIdentifier = getImageIdentifier(imageItem);
+        if (imageIdentifier == null || imageCollectionIdentifiers.includes(imageIdentifier)) {
+          return false;
+        }
+        imageCollectionIdentifiers.push(imageIdentifier);
+        return true;
+      });
+      return [...imagesToAdd, ...imageCollection];
+    }
+    return imageCollection;
+  }
+
+  protected convertDateFromClient(image: IImage): IImage {
+    return Object.assign({}, image, {
+      createdDate: image.createdDate?.isValid() ? image.createdDate.toJSON() : undefined,
+      lastModifiedDate: image.lastModifiedDate?.isValid() ? image.lastModifiedDate.toJSON() : undefined,
+      deletedDate: image.deletedDate?.isValid() ? image.deletedDate.toJSON() : undefined,
+    });
+  }
+
+  protected convertDateFromServer(res: EntityResponseType): EntityResponseType {
+    if (res.body) {
+      res.body.createdDate = res.body.createdDate ? dayjs(res.body.createdDate) : undefined;
+      res.body.lastModifiedDate = res.body.lastModifiedDate ? dayjs(res.body.lastModifiedDate) : undefined;
+      res.body.deletedDate = res.body.deletedDate ? dayjs(res.body.deletedDate) : undefined;
+    }
+    return res;
+  }
+
+  protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType {
+    if (res.body) {
+      res.body.forEach((image: IImage) => {
+        image.createdDate = image.createdDate ? dayjs(image.createdDate) : undefined;
+        image.lastModifiedDate = image.lastModifiedDate ? dayjs(image.lastModifiedDate) : undefined;
+        image.deletedDate = image.deletedDate ? dayjs(image.deletedDate) : undefined;
+      });
+    }
+    return res;
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/root-service/detail/root-service-detail.component.ts b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/root-service/detail/root-service-detail.component.ts
index ba069dd254208b63fa8fef66351ed2e85fec5a9c..9f51339b9a6ae5a7481521704ee0fe95db19b950 100644
--- a/git/iec-frontend/src/main/webapp/app/entities/iecBackend/root-service/detail/root-service-detail.component.ts
+++ b/git/iec-frontend/src/main/webapp/app/entities/iecBackend/root-service/detail/root-service-detail.component.ts
@@ -16,6 +16,17 @@ export class RootServiceDetailComponent implements OnInit {
   ngOnInit(): void {
     this.activatedRoute.data.subscribe(({ rootService }) => {
       this.rootService = rootService;
+      const VALUES = this.rootService!.serviceAttributeValues!;
+      for (let i = 0;i < VALUES!.length;i++) {
+		if (VALUES![i].serviceAttributeType!.definitions != null) {
+			for (let j = 0;j < VALUES![i].serviceAttributeType!.definitions!.length;j++) {
+				if (VALUES![i].serviceAttributeValue === VALUES![i].serviceAttributeType!.definitions![j].code) {
+					VALUES![i].serviceAttributeValue = VALUES![i].serviceAttributeType!.definitions![j].value;
+					break;
+				}
+			}
+		}
+	  }
     });
   }
 
diff --git a/git/iec-frontend/src/main/webapp/app/layouts/navbar/navbar.component.html b/git/iec-frontend/src/main/webapp/app/layouts/navbar/navbar.component.html
index eb69021d98c77799cd6ca01f039ff5296f58cabb..514a200dabbfc6d92e6acdf99570d20e80708408 100644
--- a/git/iec-frontend/src/main/webapp/app/layouts/navbar/navbar.component.html
+++ b/git/iec-frontend/src/main/webapp/app/layouts/navbar/navbar.component.html
@@ -51,6 +51,22 @@
           </span>
         </a>
       </li>
+      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
+        <a class="nav-link" routerLink="image" (click)="collapseNavbar()">
+          <span>
+            <fa-icon icon="asterisk"></fa-icon>
+            <span jhiTranslate="global.menu.entities.iecBackendImages">Images</span>
+          </span>
+        </a>
+      </li>
+      <li class="nav-item" routerLinkActive="active" [routerLinkActiveOptions]="{ exact: true }">
+        <a class="nav-link" routerLink="existing-resource" (click)="collapseNavbar()">
+          <span>
+            <fa-icon icon="asterisk"></fa-icon>
+            <span jhiTranslate="global.menu.entities.iecBackendExistingResources">Existing Resources</span>
+          </span>
+        </a>
+      </li>
 
       <!-- jhipster-needle-add-element-to-menu - JHipster will add new menu items here 
       <li
diff --git a/git/iec-frontend/src/main/webapp/i18n/en/global.json b/git/iec-frontend/src/main/webapp/i18n/en/global.json
index afb93816bc8cd070ec3b75410c8bada162640a1e..0c6db75fb373c78a5bd24f05626ec4703587b083 100644
--- a/git/iec-frontend/src/main/webapp/i18n/en/global.json
+++ b/git/iec-frontend/src/main/webapp/i18n/en/global.json
@@ -13,6 +13,8 @@
         "iecBackendServiceAttributeType": "Service Attribute Type",
         "iecBackendServiceAttributeValue": "Service Attribute Value",
         "iecBackendInstance": "Instances",
+        "iecBackendImages": "Images",
+        "iecBackendExistingResources": "Existing Resources",
         "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)"
       },
       "account": {
diff --git a/git/iec-frontend/src/main/webapp/i18n/en/iecBackendExistingResource.json b/git/iec-frontend/src/main/webapp/i18n/en/iecBackendExistingResource.json
new file mode 100644
index 0000000000000000000000000000000000000000..27d8232c24e30e7f4a66566c82b847ec1f6cb805
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/i18n/en/iecBackendExistingResource.json
@@ -0,0 +1,39 @@
+{
+  "iecFrontendApp": {
+    "iecBackendExistingResource": {
+      "home": {
+        "title": "Existing Resources",
+        "refreshListLabel": "Refresh list",
+        "createLabel": "Create a new Existing Resource",
+        "createOrEditLabel": "Create or edit an Existing Resource",
+        "notFound": "No Existing Resource found"
+      },
+      "delete": {
+        "question": "Are you sure you want to delete Existing Resource {{ id }}?"
+      },
+      "detail": {
+        "title": "Existing Resource"
+      },
+      "id": "ID",
+      "dataName": "Data name",
+      "dataType": "Data type",
+      "name": "Name",
+      "datacenterId": "Datacenter Id",
+      "user": "User",
+      "provider": "Provider",
+      "createdDate": "Created Date",
+      "lastModifiedDate": "Last Modified Date",
+      "deletedDate": "Deleted Date",
+      "status": "Status",
+      "active": "Active",
+      "inactive": "Inactive"
+    }
+  },
+  "iecBackendApp": {
+    "iecBackendExistingResource": {
+      "created": "A new Existing Resource is created with identifier {{ param }}",
+      "updated": "An Existing Resource is updated with identifier {{ param }}",
+      "deleted": "An Existing Resource is deleted with identifier {{ param }}"
+    }
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/i18n/en/iecBackendImage.json b/git/iec-frontend/src/main/webapp/i18n/en/iecBackendImage.json
new file mode 100644
index 0000000000000000000000000000000000000000..51f6d40c26d5cbfba333fd0ef9225d53e4706d9f
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/i18n/en/iecBackendImage.json
@@ -0,0 +1,38 @@
+{
+  "iecFrontendApp": {
+    "iecBackendImage": {
+      "home": {
+        "title": "Images",
+        "refreshListLabel": "Refresh list",
+        "createLabel": "Create a new Image",
+        "createOrEditLabel": "Create or edit an Image",
+        "notFound": "No Image found"
+      },
+      "delete": {
+        "question": "Are you sure you want to delete Image {{ id }}?"
+      },
+      "detail": {
+        "title": "Image"
+      },
+      "id": "ID",
+      "imageType": "Type",
+      "imageName": "Name",
+      "imageUrl": "URL",
+      "imageDescription": "Description",
+      "imageProvider": "Provider",
+      "createdDate": "Created Date",
+      "lastModifiedDate": "Last Modified Date",
+      "deletedDate": "Deleted Date",
+      "status": "Status",
+      "active": "Active",
+      "inactive": "Inactive"
+    }
+  },
+  "iecBackendApp": {
+    "iecBackendImage": {
+      "created": "A new Image is created with identifier {{ param }}",
+      "updated": "An Image is updated with identifier {{ param }}",
+      "deleted": "An Image is deleted with identifier {{ param }}"
+    }
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/i18n/es/global.json b/git/iec-frontend/src/main/webapp/i18n/es/global.json
index d6573d66e2c7bcd5bee94d3fcd6b5fdb4f9d1ae0..fa19e450e29613d7973e9aeadb98f3da5ceeb87f 100644
--- a/git/iec-frontend/src/main/webapp/i18n/es/global.json
+++ b/git/iec-frontend/src/main/webapp/i18n/es/global.json
@@ -13,6 +13,8 @@
         "iecBackendServiceAttributeType": "Service Attribute Type",
         "iecBackendServiceAttributeValue": "Service Attribute Value",
         "iecBackendInstance": "Instancias",
+        "iecBackendImages": "Imágenes",
+        "iecBackendExistingResources": "Recursos Existentes",
         "jhipster-needle-menu-add-entry": "JHipster will add additional entities here (do not translate!)"
       },
       "account": {
diff --git a/git/iec-frontend/src/main/webapp/i18n/es/iecBackendExistingResource.json b/git/iec-frontend/src/main/webapp/i18n/es/iecBackendExistingResource.json
new file mode 100644
index 0000000000000000000000000000000000000000..c57ba7e7abd6b0bbaa77fa7d1f76e52a755ac6a9
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/i18n/es/iecBackendExistingResource.json
@@ -0,0 +1,39 @@
+{
+  "iecFrontendApp": {
+    "iecBackendExistingResource": {
+      "home": {
+        "title": "Recursos Existentes",
+        "refreshListLabel": "Refrescar lista",
+        "createLabel": "Crear nuevo Recurso Existente",
+        "createOrEditLabel": "Crear o editar Recurso Existente",
+        "notFound": "Ningun Recurso Existente encontrado"
+      },
+      "delete": {
+        "question": "¿Seguro que quiere eliminar el Recurso Existente {{ id }}?"
+      },
+      "detail": {
+        "title": "Recurso Existente"
+      },
+      "id": "ID",
+      "dataName": "Nombre de dato",
+      "dataType": "Tipo de dato",
+      "name": "Nombre",
+      "datacenterId": "Id del Datacenter",
+      "user": "Usuario",
+      "provider": "Proveedor",
+      "createdDate": "Fecha de creación",
+      "lastModifiedDate": "Fecha última modificación",
+      "deletedDate": "Fecha eliminación",
+      "status": "Estado",
+      "active": "Activo",
+      "inactive": "Inactivo"
+    }
+  },
+  "iecBackendApp": {
+    "iecBackendExistingResource": {
+      "created": "Un nuevo Recurso Existente ha sido creado con el identificador {{ param }}",
+      "updated": "Un Recurso Existente ha sido actualizado con el identificador {{ param }}",
+      "deleted": "Un Recurso Existente ha sido eliminado con el identificador {{ param }}"
+    }
+  }
+}
diff --git a/git/iec-frontend/src/main/webapp/i18n/es/iecBackendImage.json b/git/iec-frontend/src/main/webapp/i18n/es/iecBackendImage.json
new file mode 100644
index 0000000000000000000000000000000000000000..db3950d10b025f8f817bfd0c4b8de28059c6a075
--- /dev/null
+++ b/git/iec-frontend/src/main/webapp/i18n/es/iecBackendImage.json
@@ -0,0 +1,38 @@
+{
+  "iecFrontendApp": {
+    "iecBackendImage": {
+      "home": {
+        "title": "Imágenes",
+        "refreshListLabel": "Refrescar lista",
+        "createLabel": "Crear nueva Imagen",
+        "createOrEditLabel": "Crear o editar Imagen",
+        "notFound": "Ninguna Imagen encontrada"
+      },
+      "delete": {
+        "question": "¿Seguro que quiere eliminar la Imagen {{ id }}?"
+      },
+      "detail": {
+        "title": "Imagen"
+      },
+      "id": "ID",
+      "imageType": "Tipo",
+      "imageName": "Nombre",
+      "imageUrl": "URL",
+      "imageDescription": "Descripción",
+      "imageProvider": "Proveedor",
+      "createdDate": "Fecha de creación",
+      "lastModifiedDate": "Fecha última modificación",
+      "deletedDate": "Fecha eliminación",
+      "status": "Estado",
+      "active": "Activa",
+      "inactive": "Inactiva"
+    }
+  },
+  "iecBackendApp": {
+    "iecBackendImage": {
+      "created": "Una nueva Imagen ha sido creada con el identificador {{ param }}",
+      "updated": "Una Imagen ha sido actualizada con el identificador {{ param }}",
+      "deleted": "Una Imagen ha sido eliminada con el identificador {{ param }}"
+    }
+  }
+}
diff --git a/git/iec-mysql/startupscripts/02_createTables.sql b/git/iec-mysql/startupscripts/02_createTables.sql
index 878af67d355b6e3832f19cbc12c28d76aa58438c..defbd80a5d28516d3f6ee1b736171a0223265cb7 100644
--- a/git/iec-mysql/startupscripts/02_createTables.sql
+++ b/git/iec-mysql/startupscripts/02_createTables.sql
@@ -170,8 +170,54 @@ CREATE TABLE `service_class_attribute` (
 LOCK TABLES `service_class_attribute` WRITE;
 /*!40000 ALTER TABLE `service_class_attribute` DISABLE KEYS */;
 /*!40000 ALTER TABLE `service_class_attribute` ENABLE KEYS */;
+UNLOCK TABLES;
 
+DROP TABLE IF EXISTS `existing_resource`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `existing_resource` (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `data_name` varchar(70) NOT NULL,
+  `data_type` varchar(70) NOT NULL,
+  `name` varchar(70) NOT NULL,
+  `datacenter_id` varchar(70) NOT NULL,
+  `user` varchar(70) NOT NULL,
+  `provider` varchar(70) NOT NULL,
+  `created_date` datetime(6) NOT NULL,
+  `last_modified_date` datetime(6),
+  `deleted_date` datetime(6),
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+LOCK TABLES `existing_resource` WRITE;
+/*!40000 ALTER TABLE `existing_resource` DISABLE KEYS */;
+/*!40000 ALTER TABLE `existing_resource` ENABLE KEYS */;
 UNLOCK TABLES;
+
+DROP TABLE IF EXISTS `image`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!50503 SET character_set_client = utf8mb4 */;
+CREATE TABLE `image` (
+  `id` bigint NOT NULL AUTO_INCREMENT,
+  `image_type` varchar(10) NOT NULL,
+  `image_name` varchar(100),
+  `image_url` varchar(255),
+  `image_description` text,
+  `image_provider` varchar(70) NOT NULL,
+  `created_date` datetime(6) NOT NULL,
+  `last_modified_date` datetime(6),
+  `deleted_date` datetime(6),
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+LOCK TABLES `image` WRITE;
+/*!40000 ALTER TABLE `image` DISABLE KEYS */;
+/*!40000 ALTER TABLE `image` ENABLE KEYS */;
+UNLOCK TABLES;
+
+
 ALTER TABLE `instance_incidence`
     ADD CONSTRAINT `fk_instance_incidence__instance_id` 
     FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`);
diff --git a/git/iec-mysql/startupscripts/03_initialData.sql b/git/iec-mysql/startupscripts/03_initialData.sql
index 41938e4affbd74557efaf544ee5edda07e18e5be..f69df04416d7440cdebd28912b4160ba055456ca 100644
--- a/git/iec-mysql/startupscripts/03_initialData.sql
+++ b/git/iec-mysql/startupscripts/03_initialData.sql
@@ -66,6 +66,19 @@ INSERT INTO iecbackend.root_service (service_name,first_contract,first_contract_
 /*51*/('m1.medium',NULL,'',NULL,'',NULL,'3','2020-04-01 17:46:19','2020-04-01 17:46:19',NULL,3),
 /*52*/('m1.large',NULL,'',NULL,'',NULL,'3','2020-04-01 17:46:19','2020-04-01 17:46:19',NULL,3),
 /*53*/('m1.xlarge',NULL,'',NULL,'',NULL,'3','2020-04-01 17:46:19','2020-04-01 17:46:19',NULL,3);
+INSERT INTO iecbackend.root_service (service_name,first_contract,first_contract_content_type,second_contract,second_contract_content_type,third_contract,third_contract_content_type,created_date,last_modified_date,deleted_date,service_class_id) VALUES	 
+/*54*/('Nano',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*55*/('Micro',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*56*/('Small',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*57*/('Medium',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*58*/('Large',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*59*/('2Large',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*60*/('XLarge',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*61*/('X2Large',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*62*/('X3Large',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3),
+/*64*/('X4Large',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3);
+INSERT INTO iecbackend.root_service (service_name,first_contract,first_contract_content_type,second_contract,second_contract_content_type,third_contract,third_contract_content_type,created_date,last_modified_date,deleted_date,service_class_id) VALUES	 
+/*64*/('ionos Example1',NULL,'',NULL,'',NULL,'3','2023-05-18 17:46:19','2023-05-18 17:46:19',NULL,3);
 	 
 -- --------------------------------------------------
 -- Service attribute types:
@@ -819,6 +832,7 @@ INSERT INTO iecbackend.service_attribute_value (service_attribute_value,unit_val
 	 ('100','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21,47),
 	 ('','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24,47),
 	 ('186','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25,47),
+
 	 ('00NA','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,1,48),
 	 ('USNA','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2,48),
 	 ('AMAZ','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3,48),
@@ -836,7 +850,7 @@ INSERT INTO iecbackend.service_attribute_value (service_attribute_value,unit_val
 	 ('200','dollar','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25,48);
 
 -- --------------------------------------------------
--- OpenStack flavours	 
+-- OpenStack flavours	 (5)
 -- --------------------------------------------------
 INSERT INTO iecbackend.service_attribute_value (service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id,root_service_id) VALUES
 	 ('00EU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,1,49),
@@ -913,6 +927,177 @@ INSERT INTO iecbackend.service_attribute_value (service_attribute_value,unit_val
 	 ('2','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21,53),
 	 ('','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24,53),
 	 ('160','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25,53);	 
+
+-- --------------------------------------------------
+-- VMware templates
+-- --------------------------------------------------
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (54, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (54, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (54, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (54, '1','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (54, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (54, '0.5','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (54, '10','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (54, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (54, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (54, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (54, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (54, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (54, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (54, '10','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (55, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (55, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (55, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (55, '1','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (55, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (55, '1','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (55, '20','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (55, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (55, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (55, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (55, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (55, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (55, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (55, '20','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (56, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (56, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (56, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (56, '1','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (56, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (56, '2','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (56, '40','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (56, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (56, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (56, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (56, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (56, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (56, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (56, '40','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (57, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (57, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (57, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (57, '2','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (57, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (57, '4','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (57, '40','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (57, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (57, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (57, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (57, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (57, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (57, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (57, '80','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (58, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (58, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (58, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (58, '2','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (58, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (58, '8','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (58, '80','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (58, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (58, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (58, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (58, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (58, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (58, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (58, '100','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (59, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (59, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (59, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (59, '4','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (59, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (59, '8','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (59, '80','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (59, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (59, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (59, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (59, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (59, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (59, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (59, '150','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (60, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (60, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (60, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (60, '4','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (60, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (60, '16','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (60, '160','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (60, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (60, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (60, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (60, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (60, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (60, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (60, '175','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (61, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (61, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (61, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (61, '8','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (61, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (61, '16','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (61, '160','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (61, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (61, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (61, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (61, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (61, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (61, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (61, '200','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (62, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (62, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (62, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (62, '8','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (62, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (62, '32','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (62, '320','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (62, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (62, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (62, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (62, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (62, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (62, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (62, '225','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (63, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (63, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (63, 'VSPH','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (63, '8','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (63, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (63, '64','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (63, '320','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (63, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (63, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (63, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (63, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (63, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (63, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (63, '250','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+INSERT INTO iecbackend.service_attribute_value (root_service_id, service_attribute_value,unit_value,check_list_value,created_date,last_modified_date,deleted_date,service_attribute_type_id) VALUES
+	 (64, '00EU','','','2023-05-19 17:46:20','2023-05-19 17:46:20',NULL,1),
+	 (64, 'SPEU','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,2),
+	 (64, 'IONO','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,3),
+	 (64, '1','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,4),
+	 (64, '1500','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,5),
+	 (64, '1','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,6),
+	 (64, '5','GB','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,7),
+	 (64, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,8),
+	 (64, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,9),
+	 (64, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,10),
+	 (64, '98','percentage','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,20),
+	 (64, '10','millisecond','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,21),
+	 (64, '','','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,24),
+	 (64, '10','euro','','2020-04-01 17:46:20','2020-04-01 17:46:20',NULL,25);	 
+
+
 -- --------------------------------------------------
 -- Service class:
 -- 		1: Database
@@ -925,7 +1110,7 @@ INSERT INTO iecbackend.service_class (service_class_name,created_date,last_modif
 	 ('Virtual Machine','2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
 	 
 -- --------------------------------------------------
--- Service class attributes  (service_class_id, attribute_type_id)
+-- Service_class vs attributes  (service_class_id, attribute_type_id)
 --								Db/St/Vm		11-22/16-23/1-10
 -- --------------------------------------------------
 INSERT INTO iecbackend.service_class_attribute (weight,is_mandatory,created_date,last_modified_date,deleted_date,service_class_id,service_attribute_type_id) VALUES
@@ -962,6 +1147,10 @@ INSERT INTO iecbackend.service_class_attribute (weight,is_mandatory,created_date
 	 (14,0,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL,3,25);
 	 
 	 
+-- --------------------------------------------------
+-- Definition  (code,value,ismainattribute,ischeckoption,service_attribute_type_id,---)
+--				00AS, Asia,				  ,             , 1-24					  ,
+-- --------------------------------------------------
 INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,service_attribute_type_id,created_date,last_modified_date,deleted_date) VALUES
 -- 1: Region
 -- 2: Zone
@@ -992,12 +1181,16 @@ INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,serv
 
 INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,service_attribute_type_id,created_date,last_modified_date,deleted_date) VALUES
 -- 3: Provider
-	 ('AIME','AIMES',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('AMAZ','Amazon',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('ARSY','Arsys',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('AZUR','Azure',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('GOOG','Google',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('OPEN','OpenStack',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('AIME','aimes',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('AMAZ','aws',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('ARSY','arsys',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('AZUR','azure',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('GOOG','google',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('OPEN','openstack',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('VSPH','vsphere',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('CLSI','cloudsigma',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('IONO	','ionoscloud',1,0,3,'2023-05-17 19:46:19','2023-05-17 19:46:19',NULL),
+
 -- 8: Optimized
 	 ('GEPU','General purpose',1,0,8,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('COOP','Compute optimized',1,0,8,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
@@ -1005,9 +1198,18 @@ INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,serv
 	 ('MEOP','Memory optimized',1,0,8,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('SGOP','Storage optimized',1,0,8,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('HPCO','High performance compute',1,0,8,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('IPV4','IPv4',1,0,9,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('00RE','Relational',1,0,11,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
+-- 9: Public IP
+	 ('IPV4','IPv4',1,0,9,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
+
+-- 10:Underpinning Technology
+
 INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,service_attribute_type_id,created_date,last_modified_date,deleted_date) VALUES
+-- 11: Database Type
+	 ('00RE','Relational',1,0,11,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+	 ('00NR','Non-relational',1,0,11,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
+
+INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,service_attribute_type_id,created_date,last_modified_date,deleted_date) VALUES
+-- 12: Database Technology
 	 ('AURE','Amazon Aurora',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('ARRE','Amazon RDS',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('MARE','MariaDB',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
@@ -1015,22 +1217,41 @@ INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,serv
 	 ('MYRE','MySQL',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('ORRE','Oracle',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('PORE','PostgreSQL',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('00NR','Non-relational',1,0,11,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('AMNR','Amazon DynamoDB',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('CANR','Apache Cassandra',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
 INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,service_attribute_type_id,created_date,last_modified_date,deleted_date) VALUES
 	 ('MONR','MongoDB',1,0,12,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+
+-- 	13: Data Transfer IN
+-- 	14: Data Transfer OUT
+-- 	15: Database Storage Capacity
+
+-- 	16: Storage Type
 	 ('BACK','Backup',1,0,16,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('GENE','General',1,0,16,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+
+-- 	17: Storage Subtype
 	 ('FILE','Files',1,0,17,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('OBJT','Objects',1,0,17,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('QUEU','Queues',1,0,17,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('BLOK','Block',1,0,17,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+
+-- 	18: Capacity
+
+-- 	19: Data Redundancy
 	 ('GEOS','Geo-redundant storage (GRS)',1,0,19,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('LOCS','Locally redundant storage (LRS)',1,0,19,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('REAS','Read-access geo-redundant storage (RA-GRS)',1,0,19,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
 INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,service_attribute_type_id,created_date,last_modified_date,deleted_date) VALUES
 	 ('ZONS','Zone-redundant storage (ZRS)',1,0,19,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
+
+-- 	20: Availability
+-- STORAGE ---
+-- 	21: Response time: VM Performance
+-- 	22: Transaction Unit (DTU): DB Performance
+-- 	23: Request - Response time: Storage Performance
+
+-- 	24: Legal
 	 ('LEG1','tier1',1,0,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('LEG2','tier2',1,0,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('LEG3','tier3',1,0,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
@@ -1038,10 +1259,11 @@ INSERT INTO iecbackend.definition (code,value,ismainattribute,ischeckoption,serv
 	 ('CRT2','BSI C5 (Germany)',0,1,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('CRT3','PCI - DSS',0,1,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
 	 ('CRT4','EU - Wide Certification Scheme (TBD)',0,1,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('CRT5','Other',0,1,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL),
-	 ('CLSI','CloudSigma',1,0,3,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
+	 ('CRT5','Other',0,1,24,'2020-04-01 19:46:19','2020-04-01 19:46:19',NULL);
 
-INSERT INTO `instance` (`id`,`created_date`,`deleted_date`,`email`,`instance_ip_url`,`deployment_id`,`instance_name`,`last_modified_date`,`service_id`) VALUES
+-- 	25: Cost
+
+INSERT INTO instance (`id`,`created_date`,`deleted_date`,`email`,`instance_ip_url`,`deployment_id`,`instance_name`,`last_modified_date`,`service_id`) VALUES
 	 (1, '2021-07-05 00:00:00',NULL,'testmail@tecnalia.com','168.0.1.10','deployment01','instanceTest',NULL,1);
 
 INSERT INTO `instance_incidence` (`id`, `detail`, `real_metric_value`, `instance_id`, `created_date`, `last_modified_date`, `deleted_date`) VALUES
@@ -1049,21 +1271,20 @@ INSERT INTO `instance_incidence` (`id`, `detail`, `real_metric_value`, `instance
 	(2, 'NFR Violation', NULL, 1, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
 	(3, 'Error in Region', NULL, 1, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL);
 	/*,
-	(4, 'NFR Violation', NULL, 9, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(5, 'NFR Violation', NULL, 6, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(6, 'NFR Violation', NULL, 7, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(7, 'NFR Violation', NULL, 6, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
 	(8, 'NFR Violation', NULL, 6, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(9, 'NFR Violation', NULL, 12, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(10,'NFR Violation', NULL, 15, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(11, 'NFR Violation', NULL, 19, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(12, 'NFR Violation', NULL, 20, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(13, 'Error in Region', NULL, 8, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(14, 'Error in Region', NULL, 7, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(15, 'Error in Region', NULL, 6, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(16, 'Error in Region', NULL, 5, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
-	(17, 'Error in Region', NULL, 4, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL),
 	(18, 'Error in Region', NULL, 3, '2020-04-01 19:46:19', '2020-04-01 19:46:19', NULL);*/
 
+INSERT INTO `existing_resource` (`data_name`, `data_type`, `name`, `datacenter_id`, `user`, `provider`, `created_date`, `last_modified_date`, `deleted_date`) VALUES 
+('vsphere_datacenter', 'dc', 'MB', '', 'User A', 'Provider A', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL),
+('vsphere_compute_cluster', 'compute_cluster', 'MB-PIAC-NIC-1', '${data.vsphere_datacenter.dc.id}', 'User X', 'Provider X', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL),
+('vsphere_datastore', 'datastore', 'VNX01-0200-NIC-TA-PIAC-DRO-VMW-P', '${data.vsphere_datacenter.dc.id}', 'User X', 'Provider Y', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL),
+('vsphere_resource_pool', 'pool', 'PIAC', '${data.vsphere_datacenter.dc.id}', 'User Y', 'Provider X', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL),
+('vsphere_virtual_machine', 'template', 'Centos7_PIAC', '${data.vsphere_datacenter.dc.id}', 'User Y', 'Provider Y', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL),
+('vsphere_network', 'network', 'DRO-MB-P-BG001-2098', '${data.vsphere_datacenter.dc.id}', 'User B', 'Provider B', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL);
+
+INSERT INTO `image` (`image_type`, `image_name`, `image_url`, `image_description`, `image_provider`, `created_date`, `last_modified_date`, `deleted_date`) VALUES 
+('Docker', NULL, 'docker.hub.io/Ericsson/tia:1.0', NULL, 'Provider A', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL),
+('VM', 'Ubuntu_6.4.2', NULL, 'VM file for Ubuntu 6.4.2', 'Provider B', '2023-02-16 11:46:19', '2023-02-16 11:46:19', NULL);
+
 SET FOREIGN_KEY_CHECKS=1;
 COMMIT;
\ No newline at end of file
diff --git a/git/jhipster-registry/.env b/git/jhipster-registry/.env
new file mode 100644
index 0000000000000000000000000000000000000000..46e9247d5dbf8f20b86efcb375aeeb14c50bc455
--- /dev/null
+++ b/git/jhipster-registry/.env
@@ -0,0 +1,7 @@
+ADMIN_USER=admin
+ADMIN_PASSWORD=jhipsterPassword
+HTTPS_PORT=443
+SERVER_HOST=piacere.digital.tecnalia.dev
+COMPOSE_PROJECT_NAME=jhipster-production
+JHIPSTER_REGISTRY_CONFIG_PATH=
+COMPOSE_FILE=docker-compose.yaml:docker-compose-volumes.yaml:docker-compose-dev.yaml:docker-compose-traefik-network-external.yaml
diff --git a/git/jhipster-registry/.env.gen b/git/jhipster-registry/.env.gen
new file mode 100644
index 0000000000000000000000000000000000000000..f5c6a8281e1f124e5f97d37cf195a51555acb25c
--- /dev/null
+++ b/git/jhipster-registry/.env.gen
@@ -0,0 +1,44 @@
+# Reference documentation https://docs.docker.com/compose/environment-variables/
+# Focus default variables as production, to allow direct download and run in production
+# Required external variables that must be defined externally are those that have no value
+
+#### Common image related ####
+DOCKER_REGISTRY_CACHE_PREFIX=cache.euve.digital.tecnalia.dev:5000
+DOCKER_REGISTRY_CACHE_VERSION=latest
+
+#### Common Build related ####
+# DOCKER_BUILDKIT and COMPOSE_DOCKER_CLI_BUILD do not have effect here, we leave them as documentation
+DOCKER_BUILDKIT=1
+COMPOSE_DOCKER_CLI_BUILD=1
+
+#### Common Production related ####
+ADMIN_USER=admin
+ADMIN_PASSWORD=jhipsterPassword
+HTTPS_PORT=443
+# server host is configured during the sync based on _ENV_RELEASE_ and _ENV_DEPLOY
+# SERVER_HOST=
+_ENV_DEPLOY_SERVER_HOST=piacere.digital.tecnalia.dev
+_ENV_LOCAL_SERVER_HOST=192.168.56.1.nip.io
+
+#### Platform Specific ####
+TZ=Madrid
+
+#### Common docker-compose related ####
+# https://docs.docker.com/compose/reference/envvars/#compose_file#compose_project_name
+# these are docker-compose related environment variables
+COMPOSE_PROJECT_NAME=jhipster-production
+# _ENV_LOCAL_COMPOSE_FILE_BASE= # These are oriented for local vagrant usually it contains local traefik configuration, dev services, etc
+# _ENV_RELEASE_COMPOSE_FILE_BASE= # These are oriented for tagging relevant images for upload to official release repositories
+# _ENV_DEPLOY_COMPOSE_FILE_BASE= # These are oriented for final deployment it contains production traefik configuration, etc
+# _ENV_TEST_COMPOSE_FILE_BASE= # These are oriented for testing
+# COMPOSE_FILE_BASE= # (MANDATORY) These are those main services of the project, that will apply to all the scenarios
+
+COMPOSE_FILE_BASE=docker-compose.yaml:docker-compose-volumes.yaml
+
+COMPOSE_FILE= 
+# COMPOSE_FILE Is generated automatically
+
+COMPOSE_FILE_BASE_LOCAL=docker-compose-dev.yaml
+COMPOSE_FILE_BASE_NETWORK=docker-compose-traefik-network-external.yaml
+
+JHIPSTER_REGISTRY_CONFIG_PATH=
diff --git a/git/jhipster-registry/.env.local b/git/jhipster-registry/.env.local
new file mode 100644
index 0000000000000000000000000000000000000000..de41d03d5cf15a562600b79676e978a2fa3ebfe3
--- /dev/null
+++ b/git/jhipster-registry/.env.local
@@ -0,0 +1,35 @@
+# Reference documentation https://docs.docker.com/compose/environment-variables/
+# Focus default variables as production, to allow direct download and run in production
+# Required external variables that must be defined externally are those that have no value
+
+#### Common image related ####
+
+#### Common Build related ####
+# DOCKER_BUILDKIT and COMPOSE_DOCKER_CLI_BUILD do not have effect here, we leave them as documentation
+
+#### Common Production related ####
+ADMIN_USER=admin
+ADMIN_PASSWORD=jhipsterPassword
+HTTPS_PORT=443
+# server host is configured during the sync based on _ENV_RELEASE_ and _ENV_DEPLOY
+# SERVER_HOST=
+SERVER_HOST=192.168.56.1.nip.io
+
+#### Platform Specific ####
+
+#### Common docker-compose related ####
+# https://docs.docker.com/compose/reference/envvars/#compose_file#compose_project_name
+# these are docker-compose related environment variables
+COMPOSE_PROJECT_NAME=jhipster-production
+# _ENV_LOCAL_COMPOSE_FILE_BASE= # These are oriented for local vagrant usually it contains local traefik configuration, dev services, etc
+# _ENV_RELEASE_COMPOSE_FILE_BASE= # These are oriented for tagging relevant images for upload to official release repositories
+# _ENV_DEPLOY_COMPOSE_FILE_BASE= # These are oriented for final deployment it contains production traefik configuration, etc
+# _ENV_TEST_COMPOSE_FILE_BASE= # These are oriented for testing
+# COMPOSE_FILE_BASE= # (MANDATORY) These are those main services of the project, that will apply to all the scenarios
+
+
+# COMPOSE_FILE Is generated automatically
+
+
+JHIPSTER_REGISTRY_CONFIG_PATH=
+COMPOSE_FILE=docker-compose.yaml:docker-compose-volumes.yaml:docker-compose-dev.yaml:docker-compose-traefik-network-external.yaml
diff --git a/git/jhipster-registry/.gitmodules b/git/jhipster-registry/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/git/jhipster-registry/README.md b/git/jhipster-registry/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6abb59c3fdaf1b68cefe7cba45d81821145e8d71
--- /dev/null
+++ b/git/jhipster-registry/README.md
@@ -0,0 +1,31 @@
+# development-services
+
+This docker-compose file generalizes some services that we use in tecnalia to monitor and debug containers in integration servers.
+* traefik dashboard
+* traefik api
+* portainer
+* keycloak to provide sso access to services
+
+In future
+* monitoring with telegraf
+* monitoring db and render with infuxdb and grafana (this requires resources)
+
+## Use
+This docker compose is not planned to be used alone but as a resource in another docker compose projects by extending DOCKER_FILE variable.
+
+```bash
+export DOCKER_FILE=[...];path/docker-compose-tecnalia-selfsigned.yaml;path/docker-compose-dev.yaml  
+```
+
+## Resources
+Besides the docker-composes we also provide some additional resources:
+* traefik examples using the official or our customized traefik
+
+## How to access
+the entrypoints for the services will be in subdomains, asuming a base domain such as 192.168.56.1.nip.io:
+* https://traefik.192.168.56.1.nip.io:8443/ to access traefik dashboard 
+* https://traefik.192.168.56.1.nip.io:8443/api/http/routers to access traefik api 
+* https://portainer.192.168.56.1.nip.io:8443/ to access portainer 
+* https://auth.192.168.56.1.nip.io:8443/ to access keycloak 
+* ...
+
diff --git a/central-config/jhipster/application.yml b/git/jhipster-registry/data/jhipster-registry/central-config/jhipster-registry/application.yml
old mode 100755
new mode 100644
similarity index 100%
rename from central-config/jhipster/application.yml
rename to git/jhipster-registry/data/jhipster-registry/central-config/jhipster-registry/application.yml
diff --git a/central-config/jhipster/registry.yml b/git/jhipster-registry/data/jhipster-registry/central-config/jhipster-registry/jhipster-registry.yml
old mode 100755
new mode 100644
similarity index 93%
rename from central-config/jhipster/registry.yml
rename to git/jhipster-registry/data/jhipster-registry/central-config/jhipster-registry/jhipster-registry.yml
index 795640ee259d12c90d955239e2adb7c89c4a0836..3ba07ce41f0184400806715090ef9f40b4749070
--- a/central-config/jhipster/registry.yml
+++ b/git/jhipster-registry/data/jhipster-registry/central-config/jhipster-registry/jhipster-registry.yml
@@ -6,4 +6,4 @@ jhipster:
     allowed-headers: "*"
     exposed-headers: "Authorization,Link,X-Total-Count"
     allow-credentials: "true"
-    max-age: 1800    
+    max-age: 1800
diff --git a/git/jhipster-registry/docker-compose-dev-expose.yaml b/git/jhipster-registry/docker-compose-dev-expose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1f2a4a3e2002d47460b349c3ba4ffc7de8d4a951
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-dev-expose.yaml
@@ -0,0 +1,4 @@
+services:
+  portainer:
+    ports:
+      - 8086:8086
diff --git a/docker-compose-dev.yaml b/git/jhipster-registry/docker-compose-dev.yaml
old mode 100755
new mode 100644
similarity index 71%
rename from docker-compose-dev.yaml
rename to git/jhipster-registry/docker-compose-dev.yaml
index 80b771b3684c2a5431a60b0832ab79e07c3aab7a..4a73f393da291fe9a3a9d92ab0336fcf2326d093
--- a/docker-compose-dev.yaml
+++ b/git/jhipster-registry/docker-compose-dev.yaml
@@ -1,14 +1,10 @@
-version: '3.8'
-
 services:
-  traefik:
-    networks:
-      default:
-        aliases:
-          - jhipster-registry.${SERVER_HOST}
 
   jhipster-registry:
+    networks:
+      traefik_network:
     labels:
       - "traefik.enable=true"
+      - "traefik.docker.network=traefik_network"
       - "traefik.http.routers.jhipster-registry.entrypoints=websecure"
       - "traefik.http.routers.jhipster-registry.rule=Host(`jhipster-registry.${SERVER_HOST:?err}`)"
diff --git a/git/jhipster-registry/docker-compose-heathcheck-kill.yaml b/git/jhipster-registry/docker-compose-heathcheck-kill.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3f35e2c4b08670b3ede5fc65ade59a0e0d30f3aa
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-heathcheck-kill.yaml
@@ -0,0 +1,10 @@
+# for some reason after a reboot the jhipster frezees and requires to be reboot
+# this is not an elegant way to manage the issue 
+services:
+  jhipster-registry:
+    healthcheck:
+      test: curl -f --retry 6 --max-time 5 --retry-delay 10 --retry-max-time 60 "http://sh-gateway:8080/management/health" || bash -c 'kill -s 15 -1 && (sleep 10; kill -s 9 -1)'
+      interval: 5m #5m
+      timeout: 2s #2m
+      retries: 1
+      start_period: 45s #45s
diff --git a/git/jhipster-registry/docker-compose-oidc.yaml b/git/jhipster-registry/docker-compose-oidc.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5a9bc7fa2ce393947561b42619497a3758948bc9
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-oidc.yaml
@@ -0,0 +1,8 @@
+services:
+  
+  jhipster-registry:
+    environment:
+      SPRING_PROFILES_ACTIVE: prod,oauth2
+      SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_OIDC_ISSUER_URI: ${KEYCLOAK_URL}/auth/realms/jhipster
+      SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_OIDC_CLIENT_ID: jhipster-registry
+      SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_OIDC_CLIENT_SECRET: jhipster-registry
diff --git a/git/jhipster-registry/docker-compose-tecnalia-ca.yaml b/git/jhipster-registry/docker-compose-tecnalia-ca.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7fe22c95ba652df0043f20f9fa91cb80299f4f06
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-tecnalia-ca.yaml
@@ -0,0 +1,7 @@
+services:
+
+  jhipster-registry:
+    command:
+      - /bin/sh
+      - -c
+      - ( [ -f /ca.pem ] || ( curl -s ${EXTRA_CA_URL:?err} --output /ca.pem && openssl x509 -in /ca.pem -text && keytool -import -noprompt -trustcacerts -alias ca -file /ca.pem -cacerts -storepass changeit ) ) && echo \"The JHipster Registry will start in $${JHIPSTER_SLEEP}s...\" && sleep $${JHIPSTER_SLEEP} && java $${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /jhipster-registry.jar
diff --git a/git/jhipster-registry/docker-compose-traefik-aliases.yaml b/git/jhipster-registry/docker-compose-traefik-aliases.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d16c4b42a8a3a0ef62abcd1d42d721eb8abc3cec
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-traefik-aliases.yaml
@@ -0,0 +1,6 @@
+services:
+  traefik:
+    networks:
+      traefik_network:
+        aliases:
+          - jhipster-registry.${SERVER_HOST}
diff --git a/git/jhipster-registry/docker-compose-traefik-network-external.yaml b/git/jhipster-registry/docker-compose-traefik-network-external.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..95623b367d1e14b377a8b17e3e598362edeeb8d9
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-traefik-network-external.yaml
@@ -0,0 +1,4 @@
+networks:
+  traefik_network:
+    name: traefik_network
+    external: true
diff --git a/git/jhipster-registry/docker-compose-volumes.yaml b/git/jhipster-registry/docker-compose-volumes.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..d804916b25ac49cffa471592151bb52d43b15d97
--- /dev/null
+++ b/git/jhipster-registry/docker-compose-volumes.yaml
@@ -0,0 +1,4 @@
+services:
+  jhipster-registry:
+    volumes:
+      - ./${JHIPSTER_REGISTRY_CONFIG_PATH}data/jhipster-registry/central-config/jhipster-registry:/central-config/jhipster-registry
diff --git a/docker-compose-jhipster-registry.yaml b/git/jhipster-registry/docker-compose.yaml
old mode 100755
new mode 100644
similarity index 75%
rename from docker-compose-jhipster-registry.yaml
rename to git/jhipster-registry/docker-compose.yaml
index 7a61bd331029702854e5ffbce8df35c4962b6e31..8ca99df92b71bddc13549e5bea5a507fed172d01
--- a/docker-compose-jhipster-registry.yaml
+++ b/git/jhipster-registry/docker-compose.yaml
@@ -1,19 +1,20 @@
-version: '3.8'
-
 services:
-
   jhipster-registry:
-    image: jhipster/jhipster-registry:v6.7.1
+    image: jhipster/jhipster-registry:v6.8.0
     restart: always
     environment:
       SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE: native
       #  usually LOCATION use to point to file:./central-config, but, looking forward to the possibility to use a unique jhipster-registry for all the project we use the label feature that allow us to contain multiple configurations organized in folders iec, sh, iop
       SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_LOCATIONS: file:./central-config/{label}
       #  if we migrate to a single jhipster-registry for all project we will need create a new folder global to hold the jhipster-registry configuration and assing global as LABEL 
-      SPRING_CLOUD_CONFIG_LABEL: jhipster
-      SPRING_CLOUD_CONFIG_NAME: registry
+      SPRING_CLOUD_CONFIG_LABEL: jhipster-registry
+      SPRING_CLOUD_CONFIG_NAME: jhipster-registry
       GLOBAL_PASSWORD: ${ADMIN_PASSWORD}
       JHIPSTER_CORS_ALLOWEDORIGINS: "https://jhipster-registry.${SERVER_HOST:?err}:${HTTPS_PORT}"
-    volumes:
-      - ./central-config/jhipster:/central-config/jhipster
-      - ./central-config/iec:/central-config/iec
+    networks:
+      jhipster_network:
+
+networks:
+  jhipster_network:
+    name: jhipster_network
+    external: false
diff --git a/piacere-build/docker-compose.yaml b/piacere-build/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ddc1c0bd2d4e002a79ba8fbfa318c751832eabed
--- /dev/null
+++ b/piacere-build/docker-compose.yaml
@@ -0,0 +1,34 @@
+services:
+  iec-mysql:
+    build:
+      context: ${IEC_BASE_PATH}git/iec-mysql
+      dockerfile: Dockerfile
+      cache_from:
+        - ${IMAGE_IEC_MYSQL_CACHE:?err}
+      args:
+        BUILDKIT_INLINE_CACHE: 1 # For multistage docker
+
+      # https://github.com/jfrog/artifactory-user-plugins/tree/master/cleanup/cleanDockerImages
+
+  iec-backend:
+    build:
+      context: ${IEC_BASE_PATH}git/iec-backend
+      dockerfile: Dockerfile
+      cache_from:
+        - ${IMAGE_IEC_BACKEND_CACHE:?err}
+      args:
+        BUILDKIT_INLINE_CACHE: 1 # For multistage docker
+
+      # https://github.com/jfrog/artifactory-user-plugins/tree/master/cleanup/cleanDockerImages
+
+  iec-frontend:
+    build:
+      context: ${IEC_BASE_PATH}git/iec-frontend
+      dockerfile: Dockerfile
+      cache_from:
+        - ${IMAGE_IEC_FRONTEND_CACHE:?err}
+      args:
+        BUILDKIT_INLINE_CACHE: 1 # For multistage docker
+
+      # https://github.com/jfrog/artifactory-user-plugins/tree/master/cleanup/cleanDockerImages
+
diff --git a/release/docker-compose.yaml b/release/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3af1f85eb7b10c95a383814acbba1f3fee6c7081
--- /dev/null
+++ b/release/docker-compose.yaml
@@ -0,0 +1,9 @@
+services:
+  iec-mysql:
+    image: ${IMAGE_IEC_MYSQL:?err}
+
+  iec-backend:
+    image: ${IMAGE_IEC_BACKEND:?err}
+
+  iec-frontend:
+    image: ${IMAGE_IEC_FRONTEND:?err}