diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..68bc17f9ff2104a9d7b6777058bb4c343ca72609
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,160 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/#use-with-ide
+.pdm.toml
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
diff --git a/Pipfile b/Pipfile
new file mode 100644
index 0000000000000000000000000000000000000000..c398581f91f3c61d4cff6aceb5718439b7e497ad
--- /dev/null
+++ b/Pipfile
@@ -0,0 +1,13 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+pymongo = "==3.12.0"
+inject = "==4.3.1"
+
+[dev-packages]
+
+[requires]
+python_version = "3.8"
diff --git a/README.md b/README.md
index 0d0f84f2305bebe5d3428e1094833bcf01d37c19..304c31df2a30431cff0da3509de49ff4e77fd102 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,104 @@
-# invoker-cli
+# CAPIF_Invoker_GUI
 
+This is the implementation of a CAPIF Invoker 
 
+* This repo is intended to be used as a test method for CAPIF services and services published on CAPIF.
 
-## Getting started
+## Prerequisites
+Before executing the following code it is necessary to have raised an instance of [CAPIF](https://github.com/Telefonica/CAPIF_Future_Network_Lab.git).
+To run Capif Invoker you must ensure to have docker and a docker compose version 2.10 or higher.
 
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+## Set Up
+This repo is designed to be executed from docker, to create the images and raise the instance it is only necessary to execute the following command:
+```
+./run.sh
 
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
+```
 
-## Add your files
+- Before executing the run.sh command, note that it supports one parameter, this parameter is the CAPIF hostname, by default this field is 'capifcore'. Modify it if necessary or add the hostname when executing the run.sh command
 
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
+    ```
+    ./run.sh <other_hostname>
 
-```
-cd existing_repo
-git remote add origin https://labs.etsi.org/rep/ocf/example-clients/invoker-cli.git
-git branch -M main
-git push -uf origin main
-```
+    ```
 
-## Integrate with your tools
+- It is important to have the following environment variables in the docker-compose file:
+    ```
+      - CAPIF_HOSTNAME=${CAPIF_HOSTNAME}
+      - CAPIF_PORT=8080
+      - REGISTER_HOSTNAME=register
+      - REGISTER_PORT=8084
+      - CAPIF_PORT_HTTPS=443
+      - CAPIF_CALLBACK_URL=host.docker.internal
+      - CAPIF_CALLBACK_PORT=8086
 
-- [ ] [Set up project integrations](https://labs.etsi.org/rep/ocf/example-clients/invoker-cli/-/settings/integrations)
+    ```
+    These environment variables refer to the registration services. By default, these are the ports and names that the CAPIF script uses when launching the different services. If during the deployment of CAPIF you modify these parameters, you must modify them so that they correspond to the new ones.
 
-## Collaborate with your team
+Now it is only necessary to enter inside the container by executing this command
 
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
 
-## Test and Deploy
 
-Use the built-in continuous integration in GitLab.
+```
+./terminal_to_py_aef.sh
 
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+```
 
-***
+Once inside the container you can run the provider command GUI by running
 
-# Editing this README
+```
+./python main.py
 
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
+```
 
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+## Interacting with the GUI
+The provider is prepared to make the necessary previous provisions automatically, but if the user is already register, you can remove the user using the command:
+```
+remove_user
+```
 
-## Name
-Choose a self-explaining name for your project.
+and register a new user with
+```
+register_user
+```
 
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+The different .json files that must be saved in CAPIF are also added. To make the necessary provisions you just have to execute the following commands within the GUI
 
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+```
+register_invoker
 
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+```
 
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+```
+discover_service
 
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+```
 
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+```
+register_security_context <api_name>
 
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
+```
 
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
+```
+get_security_auth <api_name>
+```
 
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+### What are we doing?
+- The previous commands are to register an invoker within CAPIF, discover the services that have been published and if there are any published services, create a security context to use those services.
 
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+*If the first command returns a 401, it means that the token to interact the first time with CAPIF has expired, run the following command
 
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
+```
+get_auth
+
+```
+
+## Call Service
+
+```
+call_service <api_name>
+```
 
-## License
-For open source projects, say how it is licensed.
+If the previous process has been executed correctly, the call_service command will call the first endpoint of the service that has been discovered.
 
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+If you want to call another endpoint or modify the parameters that are sent to the service, you must modify the code directly
diff --git a/cleanup_docker_containers.sh b/cleanup_docker_containers.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e5a9433a643695f6f8ccef4df040a7fe2de370ac
--- /dev/null
+++ b/cleanup_docker_containers.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+docker compose down --rmi all --remove-orphans || true
+
+# sudo rm ./invoker_gui/capif_onboarding/*
+
+# sudo rm ./invoker_gui/demo_values.json && sudo rm ./invoker_gui/ca.crt && sudo rm ./invoker_gui/cert_req.csr && sudo rm ./invoker_gui/dummy.crt && sudo rm ./invoker_gui/private.key && sudo rm ./invoker_gui/ca_service.crt
+
+# sudo rm ./invoker_gui/demo_values.json
+# sudo rm ./invoker_gui/ca.crt
+# sudo rm ./invoker_gui/cert_req.csr
+# sudo rm ./invoker_gui/dummy.crt
+# sudo rm ./invoker_gui/private.key
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..73c1a36ed8e901612196cfae1dde7c3ff8fcf7a5
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,29 @@
+version: '3'
+
+services:
+  invoker_gui:
+    image: invoker_gui
+    hostname: dummy
+    container_name: invoker_gui
+    build:
+      context: ./invoker_gui
+    volumes:
+      - ./invoker_gui:/usr/src/app
+    environment:
+      - CAPIF_HOSTNAME=${CAPIF_HOSTNAME}
+      - CAPIF_PORT=8080
+      - REGISTER_HOSTNAME=register
+      - REGISTER_PORT=8084
+      - CAPIF_PORT_HTTPS=443
+      - CAPIF_CALLBACK_URL=host.docker.internal
+      - CAPIF_CALLBACK_PORT=8086
+    extra_hosts:
+      - host.docker.internal:host-gateway
+      - capifcore:host-gateway
+      - one_provider_gui:host-gateway
+      - register:host-gateway
+
+networks:
+  default:
+    external:
+      name: capif-network
\ No newline at end of file
diff --git a/invoker_gui/Dockerfile b/invoker_gui/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..8357bf96b3ffb21ac8b942395a6df5b54b708ccb
--- /dev/null
+++ b/invoker_gui/Dockerfile
@@ -0,0 +1,13 @@
+FROM python:3.8
+ENV PYTHONUNBUFFERED 1
+
+RUN apt-get update && apt-get install -y jq && apt-get clean
+RUN apt-get install -y iputils-ping
+
+RUN mkdir -p /usr/src/app
+WORKDIR /usr/src/app
+ADD requirements.txt /usr/src/app/
+RUN pip install -r requirements.txt
+ADD . /usr/src/app/
+
+CMD ["sh", "prepare.sh"]
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/__init__.py b/invoker_gui/capif_ops/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/invoker_gui/capif_ops/certs/.gitkeep b/invoker_gui/capif_ops/certs/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/invoker_gui/capif_ops/certs/ca.crt b/invoker_gui/capif_ops/certs/ca.crt
new file mode 100644
index 0000000000000000000000000000000000000000..e9f20ce9922423acfd1adbcda3293d122326b39c
--- /dev/null
+++ b/invoker_gui/capif_ops/certs/ca.crt
@@ -0,0 +1,38 @@
+-----BEGIN CERTIFICATE-----
+MIIDIzCCAgugAwIBAgIUPjek50q3tX1UluOOLMIa/cEWJGAwDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAxMFY2FwaWYwHhcNMjQxMDAyMDg0OTIyWhcNMzQwOTMwMDg0
+OTUyWjAQMQ4wDAYDVQQDEwVjYXBpZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMOL7sBvsZ0KjIDQYeJzwrHULL6aD0Jy1eak4Z3DRTl02YitYm9QFK3O
+DOIVCyvxKkzmAHueEt4AP+b3dIjmdRJMVqRfs7Q1ml9u8BE7KmzfLWVTMi87XYyI
+eHgZPpgbikoLdx4bYWV1PfWS9pJ0DIl4JLQGaCzAlafbaHlbt+5hYJSEmE/fQ3E8
+3/P4+LDZcxxGxENwYXWv9Q1ckQreLSvGgzJGfFmhpS7UQU4hST5UDaxfownyx0C6
+b+FetssHpZAA30eB1ZyuVX5Lr87VJVrMF3ccWtOB2W26pMNFNaP2OfuEvAaA0cGV
+mc7LsOfd5gGD+0K1Hucc2GwkE75sDqUCAwEAAaN1MHMwDgYDVR0PAQH/BAQDAgEG
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFBGxHkUXJCvmQJSEN1o9n/w4EwSU
+MB8GA1UdIwQYMBaAFBGxHkUXJCvmQJSEN1o9n/w4EwSUMBAGA1UdEQQJMAeCBWNh
+cGlmMA0GCSqGSIb3DQEBCwUAA4IBAQAuIsKB1ZJvNV/C2BNanRiRA6nUTAzhBlEc
+8+YzWFcb6xSlhu6n/d5tTsuikvu13l0QNBlNfemejvzEQrBzxF37jTxaP3+xGm5C
+9y1Iy5yPWIkO4X8SgKwnS0eFUbR3WgBm3LLE8TNIVGRJAhA6ieynCLb0R5zY+1Lb
+YyeiJHmbxjMxY8zbFHl/aY/ZDtikOFx5/242plHqSwnla49qSOZzWKZqiomIhlvi
+NN5k8bsslDnj0CM61brTiiLFDfems2+uhsXJboRk3q8oPaWblVQbaOz6PrMMFpcZ
+KTjMBi4onAAv5ZBsiDwaLedDTgn9bbRxI/81fBEFie1MEI0n6K1A
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDKDCCAhCgAwIBAgIUAfHCMJ2YjjPHCYqIV8uJiJ+jXJ0wDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAxMFY2FwaWYwHhcNMjQxMDAyMDg0OTIyWhcNMjkxMDAxMDg0
+OTUyWjAnMSUwIwYDVQQDExxjYXBpZiBJbnRlcm1lZGlhdGUgQXV0aG9yaXR5MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzXmNUk0wDajX21rykXinLK3d
+fLoUkITe1T5pAojCqd4v6L+HIlRJ2oPtX3LXIeuwCscap+J0Zyu03/k/BDTns+/n
+VE24BtAD5m6Bvb1sHVxlEbb/BZkUPXLbt0084qW43M8nZ2CGZplPoR34UknVeiyr
+HJTZ+3Z3mRX0Kgr08qi4qoR2WYjaAWLLgFHwTHS6spvjYwY09p0aODi9JAOt+v8J
+nj2HlzaJgPJftmQtJuBX0AfORqPYrMMdGkA2SHbmyKOD3gUU14ILhT/ByJLY1a2G
+TlvSTSpnuWroAj9C1CID5mxE8NQva6HBUn/ER9YwXhvj9ofAej92UUS34Zg3uwID
+AQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUUj6zBAAeMN5yEqU5me0UWu8Yc9gwHwYDVR0jBBgwFoAUEbEeRRckK+ZAlIQ3
+Wj2f/DgTBJQwDQYJKoZIhvcNAQELBQADggEBABgCBS8eH371bTm/b9rB/WGHMSPW
+htEbWh8/4Wud4CAONlDA3jfjCEMskyNP4+mJFtn+qDmR3jx/4JEt3OXN+B/8iDsU
+tNYD8YjX8GF/1yi3gXBjfbZM00bkNmhw8TZ+moayDpZATlZCY1xSgQYa2W0CWX8u
+7+U5gjvh+RoOdhQGwqnV1B2TSiO0R6nreiDZFGSES0vBkYz1ZdOkSeTCeY6G+THO
++BreEfryf3RCdodKqWI5yCsF7UrAquZt+JHGKJVz7d6NfHnqrVYxhQ4TZffoy0i1
+pnqCPFD124FHJjQjZjtF9lvrTQm4fsN1SsULikNQxajXM/KzYMRCP5Qh/n4=
+-----END CERTIFICATE-----
diff --git a/invoker_gui/capif_ops/certs/dummy.crt b/invoker_gui/capif_ops/certs/dummy.crt
new file mode 100644
index 0000000000000000000000000000000000000000..70241799492fae854cc7fb109efa0a36469eba71
--- /dev/null
+++ b/invoker_gui/capif_ops/certs/dummy.crt
@@ -0,0 +1,59 @@
+-----BEGIN CERTIFICATE-----
+MIIDgjCCAmqgAwIBAgIUSO2+0JoJJQqle5aAfLYumaU0YWwwDQYJKoZIhvcNAQEL
+BQAwJzElMCMGA1UEAxMcY2FwaWYgSW50ZXJtZWRpYXRlIEF1dGhvcml0eTAeFw0y
+NDEwMDIwOTEwMDdaFw0yNTAzMzAxMzEwMzdaMCwxKjAoBgNVBAMTIUlOVjY5YzE1
+NjZiYTE4MGYxMGZmODRhZDA0M2IyODM3MTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL6GKsvG+eIYUGod+4+zHcvhJ6XXCAQrSrqM0xXmmRCcugfLHgyR
+mcxMTXKd2xT0xjzyiphnrbfxOyDTsI+WSYRuYhNs1YZSyRKs8GRf6mOJVyUWTn06
+iSuaNTwSQB+i3HDDdfasbk8TwtDrHi6SZclL5gCxaOS1YzDgycUlAq2dbzAqe+Ni
+HTcfY3R3Qlrj1xaf0qcxQy/iGA33lIzasrb5lKRniorvSZOFrW+mLY8BYB92Ggjj
+GG03GTXhXDhNNX62CcAFH3qs5mbV5TlbxgoDDU7WKkpQuNcS4QtevpIJByYWyLvK
+nUppBds9ThpU1WY+QP1ylX9ehZfels5TuUUCAwEAAaOBoDCBnTAOBgNVHQ8BAf8E
+BAMCA6gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTi
+tM1HXEs9ShXyYhimzs++XcAMWDAfBgNVHSMEGDAWgBRSPrMEAB4w3nISpTmZ7RRa
+7xhz2DAsBgNVHREEJTAjgiFJTlY2OWMxNTY2YmExODBmMTBmZjg0YWQwNDNiMjgz
+NzEwDQYJKoZIhvcNAQELBQADggEBAFWa/SJL1BWcjRBwhXE8u4TYgoZ33ing8ZML
+NmGsESVBaZS92SpFvDgOn5tjdY4jc9bzrtq02d3yn8PNOGsbFRGGgdOC9XHyHZXB
+fw0sytUu1GwEYv7v0EFb1Aega1cv+BniJfJrWdrV8h97xRjx8unA+3d15UfN87wK
+OZtqMZ7Xdm8nLNNl1vUopvStp0txsn4nbHXe0+nqOMQ66x1cipEI5LEUFVG/FT2e
+XH2QwthAHMHu2w540m+W9+2irScJFKwpCDGRU6FmLsJ8yXwSGndbOpu53iKFbKk9
+i03ZLJRIbgSK9TNH7y3B6zTIAlJvGyp3WzfTeQ/JIqcLMkKIlGU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDKDCCAhCgAwIBAgIUAfHCMJ2YjjPHCYqIV8uJiJ+jXJ0wDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAxMFY2FwaWYwHhcNMjQxMDAyMDg0OTIyWhcNMjkxMDAxMDg0
+OTUyWjAnMSUwIwYDVQQDExxjYXBpZiBJbnRlcm1lZGlhdGUgQXV0aG9yaXR5MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzXmNUk0wDajX21rykXinLK3d
+fLoUkITe1T5pAojCqd4v6L+HIlRJ2oPtX3LXIeuwCscap+J0Zyu03/k/BDTns+/n
+VE24BtAD5m6Bvb1sHVxlEbb/BZkUPXLbt0084qW43M8nZ2CGZplPoR34UknVeiyr
+HJTZ+3Z3mRX0Kgr08qi4qoR2WYjaAWLLgFHwTHS6spvjYwY09p0aODi9JAOt+v8J
+nj2HlzaJgPJftmQtJuBX0AfORqPYrMMdGkA2SHbmyKOD3gUU14ILhT/ByJLY1a2G
+TlvSTSpnuWroAj9C1CID5mxE8NQva6HBUn/ER9YwXhvj9ofAej92UUS34Zg3uwID
+AQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUUj6zBAAeMN5yEqU5me0UWu8Yc9gwHwYDVR0jBBgwFoAUEbEeRRckK+ZAlIQ3
+Wj2f/DgTBJQwDQYJKoZIhvcNAQELBQADggEBABgCBS8eH371bTm/b9rB/WGHMSPW
+htEbWh8/4Wud4CAONlDA3jfjCEMskyNP4+mJFtn+qDmR3jx/4JEt3OXN+B/8iDsU
+tNYD8YjX8GF/1yi3gXBjfbZM00bkNmhw8TZ+moayDpZATlZCY1xSgQYa2W0CWX8u
+7+U5gjvh+RoOdhQGwqnV1B2TSiO0R6nreiDZFGSES0vBkYz1ZdOkSeTCeY6G+THO
++BreEfryf3RCdodKqWI5yCsF7UrAquZt+JHGKJVz7d6NfHnqrVYxhQ4TZffoy0i1
+pnqCPFD124FHJjQjZjtF9lvrTQm4fsN1SsULikNQxajXM/KzYMRCP5Qh/n4=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIzCCAgugAwIBAgIUPjek50q3tX1UluOOLMIa/cEWJGAwDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAxMFY2FwaWYwHhcNMjQxMDAyMDg0OTIyWhcNMzQwOTMwMDg0
+OTUyWjAQMQ4wDAYDVQQDEwVjYXBpZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMOL7sBvsZ0KjIDQYeJzwrHULL6aD0Jy1eak4Z3DRTl02YitYm9QFK3O
+DOIVCyvxKkzmAHueEt4AP+b3dIjmdRJMVqRfs7Q1ml9u8BE7KmzfLWVTMi87XYyI
+eHgZPpgbikoLdx4bYWV1PfWS9pJ0DIl4JLQGaCzAlafbaHlbt+5hYJSEmE/fQ3E8
+3/P4+LDZcxxGxENwYXWv9Q1ckQreLSvGgzJGfFmhpS7UQU4hST5UDaxfownyx0C6
+b+FetssHpZAA30eB1ZyuVX5Lr87VJVrMF3ccWtOB2W26pMNFNaP2OfuEvAaA0cGV
+mc7LsOfd5gGD+0K1Hucc2GwkE75sDqUCAwEAAaN1MHMwDgYDVR0PAQH/BAQDAgEG
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFBGxHkUXJCvmQJSEN1o9n/w4EwSU
+MB8GA1UdIwQYMBaAFBGxHkUXJCvmQJSEN1o9n/w4EwSUMBAGA1UdEQQJMAeCBWNh
+cGlmMA0GCSqGSIb3DQEBCwUAA4IBAQAuIsKB1ZJvNV/C2BNanRiRA6nUTAzhBlEc
+8+YzWFcb6xSlhu6n/d5tTsuikvu13l0QNBlNfemejvzEQrBzxF37jTxaP3+xGm5C
+9y1Iy5yPWIkO4X8SgKwnS0eFUbR3WgBm3LLE8TNIVGRJAhA6ieynCLb0R5zY+1Lb
+YyeiJHmbxjMxY8zbFHl/aY/ZDtikOFx5/242plHqSwnla49qSOZzWKZqiomIhlvi
+NN5k8bsslDnj0CM61brTiiLFDfems2+uhsXJboRk3q8oPaWblVQbaOz6PrMMFpcZ
+KTjMBi4onAAv5ZBsiDwaLedDTgn9bbRxI/81fBEFie1MEI0n6K1A
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/certs/invoker_private_key.key b/invoker_gui/capif_ops/certs/invoker_private_key.key
new file mode 100644
index 0000000000000000000000000000000000000000..df5bd5eb86087927f7b6b025e12ccc76decf0abf
--- /dev/null
+++ b/invoker_gui/capif_ops/certs/invoker_private_key.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC+hirLxvniGFBq
+HfuPsx3L4Sel1wgEK0q6jNMV5pkQnLoHyx4MkZnMTE1yndsU9MY88oqYZ6238Tsg
+07CPlkmEbmITbNWGUskSrPBkX+pjiVclFk59OokrmjU8EkAfotxww3X2rG5PE8LQ
+6x4ukmXJS+YAsWjktWMw4MnFJQKtnW8wKnvjYh03H2N0d0Ja49cWn9KnMUMv4hgN
+95SM2rK2+ZSkZ4qK70mTha1vpi2PAWAfdhoI4xhtNxk14Vw4TTV+tgnABR96rOZm
+1eU5W8YKAw1O1ipKULjXEuELXr6SCQcmFsi7yp1KaQXbPU4aVNVmPkD9cpV/XoWX
+3pbOU7lFAgMBAAECggEABt+HtTS/KIMoiX995wP27/c2KzMr8JyQNFUmu0xHmtQQ
+mP3gnmL1Sau6AofD0sh2y1WTnuZkm7Vp5OgGH1P0YIDr7Ff5hwA/DTusa26TYdZf
+TLD2kWl2b9p/D6T357xEGBRREd5MF3G2zjshKlxxLBcfG8jKqC+L/cQqO0C3zUQH
+27FitAX3CDhl563Yl99Pl1DN6zcfiWbBtDMTxCppgRq7QJRlXyXjCOfo2O+lEm2i
+k6pe/ePWL/3d1gebfxIpZuT1lfBUNhcEsJevNriUOdWMD21hNILY14deRoEaM2Nx
+vbqopJE9+0/jAiPnl+eYAt+Xy8C/OHFEwJBEqhWLwQKBgQD9pF+/oCjuVmlrkTra
+4OlU0DjhB6osXIt2FbyVk0RtWgaUINWVqaFEGiHZOTZT4jCWgZYkDOw4yk2vTIXQ
+zN+ska9bOq88XnNTyoaQoAwQCFI+7obDcNnXD81vRsQRgAd5NN/eGutRIIsMG6kH
++cmAnRPp3dAYdQh6Xxi5rgGqhQKBgQDAS5Uz0Ch5mQKd3zPSFMZLhqZ6g3OgLO9g
+cCx9gBrlILhiVoKBQoMIEXmC9yzn0x/G53vJBRsA5ZQ+UCzYoXgmMiaLjrztDb6l
+JDbhWHKAY/qcMP+cyNZ7TiNGvZs46hbfGygYmH44NQi9BxSIajVP6rGXGz6oVOo0
+D7SmU2DvwQKBgB75KqQY58arELaNBpXh7zxnLPr116cRKgqifuP5FtsPqkv+cnaT
+P1k0o7uGDAdUUMCgVHhUh6grtC7a9mBYFFxbcgF++hUyJ30s9x/EG5T9nyWGNTi6
+mC92A406JAlLDB6WAVx7Bw9iHPi+i/aoXx3wkJT3fEjwSbe/0yIhiJyNAoGAFysE
+FvIFbmEZB5xUygLmwUK/3BLqY2oGjT/2nEhK9UAz9uUlZB13XAl+8mCFcIjnUzeg
+ml+bGUiPy9ItFQyfRTrVmgrgiE8XoR3z3sKhSQbCsv7UTTeFX+XSKju97+WES+0h
+r5Tv4CXDn8KynpztP2uvad1Gd1GDxjH+OevhygECgYANRocYck2qZq/u9+3urdx0
+xGHXBlbAJ2mOhb1XX9+HR76LRU1F9q0OnK+EWHY3XRZUOOic7NHzZAMe3fsSnCl8
+OEQ9TxHTMGFTAJ+LqdQUpOcokpZiseWzXzMscwPO4zQpIeEx7rJreYMLeAkE+wlu
+ImGJp1LJBqDgfFK1JohpOA==
+-----END PRIVATE KEY-----
diff --git a/invoker_gui/capif_ops/certs/superadmin.crt b/invoker_gui/capif_ops/certs/superadmin.crt
new file mode 100644
index 0000000000000000000000000000000000000000..2d8c2b1d65497f48ea7e9bb4092f893d150d9021
--- /dev/null
+++ b/invoker_gui/capif_ops/certs/superadmin.crt
@@ -0,0 +1,58 @@
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIUJgbQJL+DRCXTYsTJMn2lregCl6owDQYJKoZIhvcNAQEL
+BQAwJzElMCMGA1UEAxMcY2FwaWYgSW50ZXJtZWRpYXRlIEF1dGhvcml0eTAeFw0y
+NDA0MTAwOTMyMTFaFw0yNDEwMDYxMzMyNDFaMBUxEzARBgNVBAMTCnN1cGVyYWRt
+aW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgpx6j3WAE4sQkkmpl
+GHMy5Cx/CnxfMGVKRl95vOw5KjlSXPFReimCbPo92QFf5ZKunTrT+1IOUmkGfotF
+FrLbdB3TJvPg43aZ4oaMb+UrBF7tx9/Q4YIUcwsfttfyVwc0E+4Ms808CE6oAdi0
+6FR5U4h6O0DXLTQJHVbYnOF2om4cRtgz1L4T/C42s3th76ZGJkOqbtt1Dp2hy0O5
+1RQr+BeqGzha9c7sxiMSDwDltZTFlycgN5YkHL4c6TIZnIJm4P5p4zp6rt+KhTml
+6IbECz7W6J8cjngIJpvRb3zDjhVleS9AJnmYj10mq8LexxTW5ATjxL6FAXgk7G5/
+S7WpAgMBAAGjgYkwgYYwDgYDVR0PAQH/BAQDAgOoMB0GA1UdJQQWMBQGCCsGAQUF
+BwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUdXL2ZyQlZattMFZJ4WwdcPvizdkwHwYD
+VR0jBBgwFoAUB+CRarsbw5C7E2U6o0NCxf4phm4wFQYDVR0RBA4wDIIKc3VwZXJh
+ZG1pbjANBgkqhkiG9w0BAQsFAAOCAQEAm6SiMFMinbfozIfXL5TKQLQafl/8OQWL
+UNAAjp7TfBKQDzE3wRtVkJm4NWd/1gMtZASqaKZgdpDaxD9sAiKhV9Lc0vglxKJq
+b2FNjk2y0p1P0KBKVWi8tgQCDDR37AjuJVnNz5mm6+PHyTiURwgzOOYPwP5Wkh4I
+zI1P5K8aktmvO2bc5UeWSjM35z2NHG3ui/H+04qGsbWtS6F9buwrJRfTvNFSmBH4
+2PULvpXXzAruVDEZrANbfE2PHGo1qItxNVxTy8WLDpLgfstY8EjPCYgQFY4FlOkN
+PJFbprN6AOhxu659WkzVpt9ML9ZXWyZjGKoaAqTpSKxY0zt5HrFVAQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDKDCCAhCgAwIBAgIUQm8t7RmNnQTHYdeOtWQf0hFCr4owDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAxMFY2FwaWYwHhcNMjQwNDA4MTI0MjEwWhcNMjkwNDA3MTI0
+MjQwWjAnMSUwIwYDVQQDExxjYXBpZiBJbnRlcm1lZGlhdGUgQXV0aG9yaXR5MIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuqGomx0IO5w/uEw3i7uL0rSy
+U3JDd0OjbOJWRoomNd3d0pMWlJvyCFHXKeRLuwx7z59InJV3iNtjAww6wQ6FnwYo
+lnX5jOm5eLvJKM98PHncX4hNZ+Ieb72qJMZA9+CoNd/+BeV30XmEhGsCYZZnfiKG
+1jLltMOZmYhegsDaC45g2FVzrFqqk+tCP67GWwBbQhNDCSeWH8IOGAnmpbn0acqz
+X0PO26FzB64kDbCJ5VNn9UxFoTEsZlqgz4Ac73smtZgYraRcjEZmX8TGYTQGXxFA
+5InAJ7oFPXjJm6y43kkxRo549tFGK+5zHXn8vZAtpi3cCqZvAfsAQc3ax/+a/wID
+AQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUB+CRarsbw5C7E2U6o0NCxf4phm4wHwYDVR0jBBgwFoAUOqQdf7hYjpeMju0M
+Pbt2m2Sm1SEwDQYJKoZIhvcNAQELBQADggEBAFJuQRvw4Vu30I2IvXZU5bzmegmZ
+nAF3M3u5OpaS3CMaHqZI5JUTSMWfAx15LFPsae19qL83bTAbhi9YWFmFARBYaH3w
+er3IqV6F4zt7stM6J6pURF/LAXGF29Ncg1dqSFSVcRBd8UD7RL7+U8uIy0af7rkr
+NfYepkGVW1d3nQyCePenWju+TTZ/Zl2OMvtI+mkqvP1OnWn6/cqQBzl54P2gFNIh
+2TrrSHc/OqpCVWVVBkTXMDjAnJmUSa8UPZp/Bp65JLzNVod5vj6fcMvtIF0lwKd5
+YuPi6zFvf0I7oNWLhFrj06jcGDMSn5OxDfzV8HOnbINmOh/lIJam2lUNTbQ=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDIzCCAgugAwIBAgIUW/OZo3KH8p1vrMxBrG5ttozZ9BUwDQYJKoZIhvcNAQEL
+BQAwEDEOMAwGA1UEAxMFY2FwaWYwHhcNMjQwNDA4MTI0MjEwWhcNMzQwNDA2MTI0
+MjQwWjAQMQ4wDAYDVQQDEwVjYXBpZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANPEQ1mE4bE45k+zrRJT/spKSSE8LtM4E0DsNcj6+iZEWgZxAdHlwpMK
+mMKq4zxNAWahHrLkOHcbekS5Dca8P0uTjOFAavaJSwma+SAbq40ED5YBlFfflprr
+k0Fg7EHiuhOUwjRdbVdWgUsrSgYzbwZjCPZD2Jz6V0gP25rk+wBZqJnH4FT6hIHy
+12FtDItGuQql+g6bj7czWxLLOl6aBXAdwnMJlnJZriqtyi+WTMxZxRLo+nNgThd5
+yHpiuMPEoEs6cxLaKZWvXM4Zhzv1zSQYi7T8et0qWM6dHD6DpRnWq+637+N5X+zu
+6ssLyuyoGYyMjEvxf5wgENmi71ZPzbECAwEAAaN1MHMwDgYDVR0PAQH/BAQDAgEG
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFDqkHX+4WI6XjI7tDD27dptkptUh
+MB8GA1UdIwQYMBaAFDqkHX+4WI6XjI7tDD27dptkptUhMBAGA1UdEQQJMAeCBWNh
+cGlmMA0GCSqGSIb3DQEBCwUAA4IBAQASYhxjRoZukCV5uWCoIvuokOqG9KSfh1oq
+CeQbZ+XXa6vyUskGXyg5gzYNJ9W4GNkDWIll6qdf0mCke4jXO1AgA+BxCJWLxUrc
+f4WjLi8TnBxtoVvJlkV67wvoSF+Rt5hihf/pwMOWQ3usnmaco2qd9KIn0Jd3D6zw
+qxDE2U9VeQDpJU0EpNVBw9pnIyMY3Mw3jzdNBoXi79+CirhbWDoBLmXZHM2/frmL
+TXrXmULtk6sn/evpLpVJgKxWgjyVLx4XipColXPJq1Dk2fGU+sOL2Z9n+dtPtkla
+h+3fRM4GNpg6QoIEk8NL967uJOGHcvP07yvMaM9FKwFb+RJgopmA
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/certs/superadmin.key b/invoker_gui/capif_ops/certs/superadmin.key
new file mode 100644
index 0000000000000000000000000000000000000000..294b1f38b77a7ed5bdfe98728ba959baf134114b
--- /dev/null
+++ b/invoker_gui/capif_ops/certs/superadmin.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCgpx6j3WAE4sQk
+kmplGHMy5Cx/CnxfMGVKRl95vOw5KjlSXPFReimCbPo92QFf5ZKunTrT+1IOUmkG
+fotFFrLbdB3TJvPg43aZ4oaMb+UrBF7tx9/Q4YIUcwsfttfyVwc0E+4Ms808CE6o
+Adi06FR5U4h6O0DXLTQJHVbYnOF2om4cRtgz1L4T/C42s3th76ZGJkOqbtt1Dp2h
+y0O51RQr+BeqGzha9c7sxiMSDwDltZTFlycgN5YkHL4c6TIZnIJm4P5p4zp6rt+K
+hTml6IbECz7W6J8cjngIJpvRb3zDjhVleS9AJnmYj10mq8LexxTW5ATjxL6FAXgk
+7G5/S7WpAgMBAAECggEALljoWwfzupUdVxuyfCX4nhb7y07gIKoanrn8s2dQkxFe
+ZieQKxxeO1VrQEqJvfvCPIP5w8w+mQknaYs6bJ0mzm8KZ69WLmwQ/EZA4OUrLSTe
+qiS+qklUuMeTzvt2A2EeH+UcCSgaLpaK8qdNuKtKK5JwziqoAyv0VijTtDxWQ14V
+9dTBzT0kdPPVq3w9Df0kY1/p1h6URCgMP5SBmfN37q/pzNxkFRT3pKCKgzGTlGQ8
+Z50yWKyQe4vQZ9zvTAhFpfQH5RfEtXZW+yfllI/gxEK6B09SUmXHdkbGN/KJvuRu
+TY7oCy2nLP1svAha7Le+rEFJsZansMH2ndFBgIxkrQKBgQDNmnkr4xHtRsKnw9dS
+hJiD+bkYY7rV0gi0YfseCN250tif2a0t3wK5OutTYoOvavPhhBjViZ9cVgZdgRnT
+vxL/4nE+zQDeY7MRtO7KcHLEuDICf+4cymkUrPI0W+qpdVkzX3nZEmefecw9SP4h
+5LSvMNa104Gkwc29OkH3r7ZrowKBgQDICAPrTay1gPotRSnz8ocZ17U50VHWq5by
+GIzuswX6R69/35582Yz04R7HrHS1qX/DbLD448YK+3udxeM6we8hrS6+xYydJWqi
+2g62o7I1nxo8tHCtYbqrBcOtYhehOpkrtUF8FuTodryaGTZULV2eqlg9WtzQ5f2s
+bo9yk1TuQwKBgQCpPj3+RVVNZxD2vjvxvho5kQevLvDt742gxoLKj2vM+eW9d5aZ
+itiYFwr9Qbu6WyTT/0PeCwI2JM3qjEnxRnjiT8j+dAwCBDm0Gqbx1yxyCFmKOzqL
+Uoa7MT3SodMBmQpLQo1vhTntSXo4/GvNBJFDIMWtOKSgNbQgzuLcezSDVwKBgAWu
+5J2c2VlWzsTWgDikHV6ImGeKIO8edO1v8SEfCP5xZvUVH2WgsLaMZtl5dt9qb2zX
++7c2kXviZUK4SppyxB6K0xcsebBFTeBOnbhmsjt/x7kNz129txYA1expKw6zoYJy
+Zefmpp5MMVOXf8moeE53vIYRvNBamHh7s6unr/QNAoGAeepYYJTTfQTCA5U255aS
+dh9Co4uXV8PEMfalCgYCvr8OV99nb8VBkRAkCvUVx4UmT8jmg0gz5Yw4uFUWYssx
+stnfDnJciQ+gJrZuCTu3iMvZ0sYVK8/kieXrvlAM6UeNw+YkJaZGXl0YL4+nDrst
+zCTkixXQn2Rz18WIaqnzFo8=
+-----END PRIVATE KEY-----
diff --git a/invoker_gui/capif_ops/config_files/capif_registration.json b/invoker_gui/capif_ops/config_files/capif_registration.json
new file mode 100644
index 0000000000000000000000000000000000000000..498f2844f3b1090f489960a6469bdf6d5fa6064f
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/capif_registration.json
@@ -0,0 +1,17 @@
+{
+  "folder_to_store_certificates": "/usr/src/app/capif_onboarding",
+  "capif_host": "capifcore",
+  "capif_http_port": "8080",
+  "capif_https_port": "443",
+  "capif_netapp_username": "test_netapp_23",
+  "capif_netapp_password": "test_netapp_password",
+  "capif_callback_url": "http://192.168.1.11:5000",
+  "description": ",test_app_description",
+  "csr_common_name": "test_app_common_name",
+  "csr_organizational_unit": "test_app_ou",
+  "csr_organization": "test_app_o",
+  "crs_locality": "Madrid",
+  "csr_state_or_province_name": "Madrid",
+  "csr_country_name": "ES",
+  "csr_email_address": "test@example.com"
+}
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/credentials.properties b/invoker_gui/capif_ops/config_files/credentials.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f52418fc9ca7cdbdb6fa4a7b47fa5c394cd3bbdf
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/credentials.properties
@@ -0,0 +1,16 @@
+[credentials]
+invoker_username = ocf_user
+invoker_password = user_pass
+invoker_description = invoker 
+invoker_email = ocf@gg.com
+invoker_enterprise = ETSI 
+invoker_country = Spain
+invoker_purpose = Use OCF
+invoker_phone = +123456789
+invoker_web = https://ocf.etsi.org/
+capif_callback_ip = host.docker.internal
+capif_callback_port = 8086
+nef_ip = host.docker.internal
+nef_port = 8888
+nef_callback_ip = host.docker.internal
+nef_callback_port = 8085
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/demo_values.json b/invoker_gui/capif_ops/config_files/demo_values.json
new file mode 100644
index 0000000000000000000000000000000000000000..f8583aa29bc6f47c779b7719c9f86183165164a9
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/demo_values.json
@@ -0,0 +1 @@
+{"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzMwNDUxNjEwfQ.iSDPI_mcJctnHvOnoiAmK5mh-0-EjiNjy8TRqVKxCus", "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzI3ODYwMjEwfQ.p6GZrbQW5Mh8q4js2XwS1wBtQl9uN6V1BXxU6Pygd-c", "capif_access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTcyNzg1OTYxNiwianRpIjoiNmY0NmQwZGItZDYyZS00MmRjLTg3NGYtNTlkYmI5NDEwN2E0IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6Im9jZl91c2VyIGRmNjhjYmVjLWFlZGEtNWJmZi05OTQ4LTA2N2Q5NDFiZDI0ZCIsIm5iZiI6MTcyNzg1OTYxNiwiY3NyZiI6IjgyNmE0NThmLWUxNTMtNDQ0OS1hYTNhLWE1NmI5OGY2MjFkZCIsImV4cCI6MTcyNzg2MDUxNn0.GM9Yh7dwChKfyw27fhllX98W_RAE7Dh0Oiv5km5B0CLDgl9TkdXD2tRRSJdarxdiY062btFE8gG6jd9SiW9NoO6ONjfo0da934hhrp1RzzbPH0g41jlmbp-ntr5Ozf5wQktjMpa__JkA1TOITNxxj1RuMnP6R_OeegrwIE7ibkOlew1tIyihV8-aoigN2zkEGXciP9pr2hORfCpk_8zSexwUHdU0rsznzDJh3P9UDFaAVhXfS0Nr4xgSzCxX0LGtsVqehqSAefJRHohDWu4rXQPi0Ux2hs9oth5Oam8eLZQD6rDyg_OGQsNNtRPEKkSUm288gdCldnYYSHt47ulNug", "ccf_api_onboarding_url": "api-provider-management/v1/registrations", "ccf_discover_url": "service-apis/v1/allServiceAPIs?api-invoker-id=", "ccf_onboarding_url": "api-invoker-management/v1/onboardedInvokers", "ccf_publish_url": "published-apis/v1/<apfId>/service-apis", "ccf_security_url": "capif-security/v1/trustedInvokers/<apiInvokerId>", "api_id_0": "aa12a489891bb841c64c1d625de0ec", "api_name_0": "demo_api_OCF", "aef_id_0": "AEF3b01bd7e8cc4a392996a2a5ff0eec9", "demo_ipv4_addr_0": "one_provider_gui", "demo_port_0": 8088, "demo_url_0": "/hello", "num_apis": 1, "netapp_service_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTcyNzg2MDM0MSwianRpIjoiY2Y5ZDljMjUtM2Y3Yi00MDM4LWFjMjgtZTA3OTE4M2FiMjBiIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6IklOVjY5YzE1NjZiYTE4MGYxMGZmODRhZDA0M2IyODM3MSIsIm5iZiI6MTcyNzg2MDM0MSwiY3NyZiI6IjNiMTY1OTYzLTVlZGMtNDMyZi1iM2MyLTJmOTZjNTU1ZWI0YyIsImV4cCI6MTcyNzg2MDk0MSwiaXNzIjoiSU5WNjljMTU2NmJhMTgwZjEwZmY4NGFkMDQzYjI4MzcxIiwic2NvcGUiOiIzZ3BwI0FFRjNiMDFiZDdlOGNjNGEzOTI5OTZhMmE1ZmYwZWVjOTpkZW1vX2FwaV9PQ0YiLCJyZXNfb3duZXJfaWQiOm51bGx9.lPDi8PMauEF4-wzXUv0r7NFLIqXLQFy79KS1yPUiRbMkzerF9ivziE5h9lu93MmNMu7mRYIlZF9jAGWD37paFEFSzw69J81JsYOr8_GVIr44_r4YYmS2W8XYULoBV3vplCmTiPncdsUJyH9Xwg9Q-BgHHiDjkWbBOMbOzkwfIEfO2YLuTFNmKwjA-QLz0A-d5Nr7OIyPJ97xLx-K16m70lm7TNDElZE5nTmJKtWAZsPaZINIISUhQbbkhaYKbXLCPJ69xQUjexzrjfTiiUvOdMOE2arAHisMsSY2KdUjeqjiGZXb0h0tbfTzeMAqp1RQVwEfH1ELOywh_tfn86rISA"}
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/events_values.json b/invoker_gui/capif_ops/config_files/events_values.json
new file mode 100644
index 0000000000000000000000000000000000000000..d300afc95763d6a358de63764624a30bb81140f3
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/events_values.json
@@ -0,0 +1,30 @@
+{
+    "events": ["SERVICE_API_AVAILABLE",
+      "SERVICE_API_UNAVAILABLE",
+      "SERVICE_API_UPDATE",
+      "API_INVOKER_AUTHORIZATION_REVOKED"],
+    "notificationDestination": "http://10.95.47.147:2223",
+    "supportedFeatures": "fffffff",
+    "securityInfo": [
+      {
+        "authenticationInfo": "authenticationInfo",
+        "authorizationInfo": "authorizationInfo",
+        "interfaceDetails": {
+          "ipv4Addr": "10.95.47.147",
+          "securityMethods": ["PSK"],
+          "port": 2223
+        },
+        "prefSecurityMethods": ["PSK", "PKI", "OAUTH"]
+      },
+      {
+        "authenticationInfo": "authenticationInfo",
+        "authorizationInfo": "authorizationInfo",
+        "prefSecurityMethods": ["PSK", "PKI", "OAUTH"]
+      }
+    ],
+    "websockNotifConfig": {
+      "requestWebsocketUri": true,
+      "websocketUri": "websocketUri"
+    },
+    "requestTestNotification": true
+  }
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/invoker_details.json b/invoker_gui/capif_ops/config_files/invoker_details.json
new file mode 100644
index 0000000000000000000000000000000000000000..d94aa7fe5ac73c53d7b55664f0b9e36a4a1c8c24
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/invoker_details.json
@@ -0,0 +1,13 @@
+{
+  "notificationDestination" : "http://X:Y/netapp_callback",
+  "supportedFeatures" : "fffffff",
+  "apiInvokerInformation" : "dummy",
+  "websockNotifConfig" : {
+    "requestWebsocketUri" : true,
+    "websocketUri" : "websocketUri"
+  },
+  "onboardingInformation" : {
+    "apiInvokerPublicKey" : ""
+  },
+  "requestTestNotification" : true
+}
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/security_info.json b/invoker_gui/capif_ops/config_files/security_info.json
new file mode 100644
index 0000000000000000000000000000000000000000..b25e8e484d9719ca650947318d4e812ff0282a19
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/security_info.json
@@ -0,0 +1,10 @@
+{
+  "securityInfo": [],
+  "notificationDestination": "https://mynotificationdest.com",
+  "requestTestNotification": true,
+  "websockNotifConfig": {
+    "websocketUri": "string",
+    "requestWebsocketUri": true
+  },
+  "supportedFeatures": "fff"
+}
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/service_request_body.json b/invoker_gui/capif_ops/config_files/service_request_body.json
new file mode 100644
index 0000000000000000000000000000000000000000..66cb198c3827faecde212e2b2027351ff8f22187
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/service_request_body.json
@@ -0,0 +1,3 @@
+{
+  "name": "OCF_USER"
+ }
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/config_files/token_request.json b/invoker_gui/capif_ops/config_files/token_request.json
new file mode 100644
index 0000000000000000000000000000000000000000..5408b745186bf0d0bd3f92a43229eef846c989c1
--- /dev/null
+++ b/invoker_gui/capif_ops/config_files/token_request.json
@@ -0,0 +1,6 @@
+{
+    "grant_type": "client_credentials",
+    "client_id": "",
+    "client_secret": "string",
+    "scope": ""
+}
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_admin_login.py b/invoker_gui/capif_ops/invoker_admin_login.py
new file mode 100644
index 0000000000000000000000000000000000000000..38f59d2c9af221f515acefa0d45e330ddcd82ed6
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_admin_login.py
@@ -0,0 +1,70 @@
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+import warnings
+from urllib3.exceptions import InsecureRequestWarning
+
+class LoginAdmin():
+
+    warnings.filterwarnings("ignore", category=InsecureRequestWarning)
+
+    def __login_admin__(self, register_ip, register_port, user, passw, log_level):
+
+        url = "https://{}:{}/login".format(register_ip,register_port)
+
+        print(colored("\nLogin admin", "yellow"))
+        if log_level == "debug":
+            print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+            print(colored(f"Request: to {url}","yellow"))
+            print(colored(f"Request admin credentials: {user}/{passw}", "yellow"))
+            print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+        try:
+            response = requests.request("POST", url, verify=False, auth=(user, passw))
+
+            response.raise_for_status()
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+            response_payload = json.loads(response.text)
+            return response_payload['refresh_token'], response_payload['access_token']
+        except requests.exceptions.HTTPError as err:
+                raise Exception(err.response.status_code)
+    
+
+
+    def execute_login_admin(self, admin_username, admin_pass, log_level):
+
+        register_ip = os.getenv('REGISTER_HOSTNAME')
+        register_port = os.getenv('REGISTER_PORT')
+
+        if os.path.exists("capif_ops/config_files/demo_values.json"):
+
+            with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+                demo_values = json.load(demo_file)
+        else:
+            demo_values = {}
+
+        try:
+            refresh_token, access_token = self.__login_admin__(register_ip, register_port, admin_username, admin_pass, log_level)
+            demo_values['refresh_token'] = refresh_token
+            demo_values['access_token']= access_token
+
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+            print(colored(f"\nAccess token: {access_token} received.\n","green"))
+
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored(f"\nUnauthorized credentials.\n", "red"))
+            else:
+                print(colored(f"\n{e}.\n", "red"))
+
+        return True
diff --git a/invoker_gui/capif_ops/invoker_delete.py b/invoker_gui/capif_ops/invoker_delete.py
new file mode 100644
index 0000000000000000000000000000000000000000..2a32d81e27e43ef2da083c8818c33b9808c7fcb4
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_delete.py
@@ -0,0 +1,69 @@
+from dis import dis
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+
+
+class RemoveInvoker():
+
+
+    def __offboard_netapp_to_capif(self, capif_ip,  invoker_id, log_level):
+
+        print(colored("\nRemoving netapp from CAPIF","yellow"))
+        url = 'https://{}/api-invoker-management/v1/onboardedInvokers/{}'.format(capif_ip, invoker_id)
+
+        headers = {
+            'Content-Type': 'application/json'
+        }
+
+        try:
+
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+
+            response = requests.request("DELETE", url, headers=headers, cert=(
+                'capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify='capif_ops/certs/ca.crt')
+            response.raise_for_status()
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("Success onboard invoker","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+
+        except requests.exceptions.HTTPError as err:
+            raise Exception(err.response.text, err.response.status_code)
+
+
+
+    def execute_remove_invoker(self, log_level):
+
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        try:
+
+            self.__offboard_netapp_to_capif(capif_ip, demo_values["invokerID"], log_level)
+
+            print(colored(f"\nInvoker {demo_values['invokerID']} removed.\n", "green"))
+            demo_values.pop("invokerID")
+            demo_values.pop("pub_key")
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 403:
+                print(colored("\nInvoker already registered.\n", "red"))
+            else:
+                print(colored(f"\n{e}\n", "red"))
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_discover_service.py b/invoker_gui/capif_ops/invoker_discover_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..17f367ad87e0301d35f7ac0ef3435eba3db1a648
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_discover_service.py
@@ -0,0 +1,97 @@
+from dis import dis
+import requests
+import json
+import configparser
+import redis
+import os
+from termcolor import colored
+
+
+class DiscoverService():
+
+    def __discover_service_apis(self, capif_ip, api_invoker_id, jwt_token, ccf_url, log_level):
+
+        url = "https://{}/{}{}".format(capif_ip, ccf_url, api_invoker_id)
+
+        payload = {}
+        files = {}
+        headers = {
+            'Content-Type': 'application/json'
+        }
+
+        try:
+
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''", "yellow"))
+                print(colored(f"Request: to {url}", "yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+
+            response = requests.request("GET", url, cert=(
+                'capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify='capif_ops/certs/ca.crt')
+            response.raise_for_status()
+            response_payload = json.loads(response.text)
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''", "green"))
+                print(colored(f"Response to: {response.url}", "green"))
+                print(colored(f"Response Headers: {response.headers}", "green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}", "green"))
+                print(
+                    colored(f"Response Status code: {response.status_code}", "green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''", "green"))
+
+            return response_payload
+        except requests.exceptions.HTTPError as err:
+            print(err.response.text)
+            message = json.loads(err.response.text)
+            status = err.response.status_code
+            raise Exception(message, status)
+
+    def execute_discover_service(self, log_level):
+
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+
+        try:
+            if 'invokerID' in demo_values:
+                invokerID = demo_values['invokerID']
+                capif_access_token = demo_values['capif_access_token']
+                ccf_discover_url = demo_values['ccf_discover_url']
+                discovered_apis = self.__discover_service_apis(
+                    capif_ip, invokerID, capif_access_token, ccf_discover_url, log_level)
+                #print(colored(json.dumps(discovered_apis, indent=2), "yellow"))
+
+                count = 0
+                api_list = discovered_apis["serviceAPIDescriptions"]
+                print(colored("\nDiscovered APIs:", "yellow"))
+                for api in api_list:
+                    getAEF_profiles = api["aefProfiles"][0]
+                    getAEF_interfaces = getAEF_profiles["interfaceDescriptions"][0]
+                    getAEF_versions = getAEF_profiles["versions"][0]
+                    getAEF_resources = getAEF_versions["resources"][0]
+                    demo_values[f'api_id_{count}'] = api["apiId"]
+                    demo_values[f'api_name_{count}'] = api["apiName"]
+                    demo_values[f'aef_id_{count}'] = getAEF_profiles["aefId"]
+                    demo_values[f'demo_ipv4_addr_{count}'] = getAEF_interfaces["ipv4Addr"]
+                    demo_values[f'demo_port_{count}'] = getAEF_interfaces["port"]
+                    demo_values[f'demo_url_{count}'] = getAEF_resources['uri']
+                    count += 1
+                    print(colored(f"{api['apiName']}", "green"))
+                demo_values['num_apis']=count
+                print(colored("\n", "yellow"))
+                #print(colored("Discovered APIs", "yellow"))
+                with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                    json.dump(demo_values, outfile)
+
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored("\nAPI Invoker is not authorized\n", "red"))
+            elif status_code == 403:
+                print(colored("\nAPI Invoker does not exist. API Invoker id not found\n", "red"))
+            else:
+                print(colored(f"\n{e}\n", "red"))
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_get_auth.py b/invoker_gui/capif_ops/invoker_get_auth.py
new file mode 100644
index 0000000000000000000000000000000000000000..ea6baa7e5bb903609080962b3742144dce80eab6
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_get_auth.py
@@ -0,0 +1,77 @@
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+
+class PreviousAuth():
+
+    def __get_capif_auth(self, register_ip, register_port, username, password, log_level):
+
+            #url = "https://register:8084/getauth".format(capif_port)
+            url = "https://{}:{}/getauth".format(register_ip, register_port)
+
+            try:
+                print(colored("\nGetting authorization token", "yellow"))
+                if log_level == "debug":
+                    print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                    print(colored(f"Request: to {url}","yellow"))
+                    print(colored(f"Request user: {username}/{password}", "yellow"))
+                    print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                response = requests.request("GET", url, verify=False, auth=(username, password))
+
+                response.raise_for_status()
+                response_payload = json.loads(response.text)
+                if log_level == "debug":
+                    print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                    print(colored(f"Response to: {response.url}","green"))
+                    print(colored(f"Response Headers: {response.headers}","green"))
+                    print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                    print(colored(f"Response Status code: {response.status_code}","green"))
+                    print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+                return response_payload
+
+            except requests.exceptions.HTTPError as err:
+                raise Exception(err.response.text, err.response.status_code)
+
+
+    def execute_get_auth(self, log_level):
+
+        config = configparser.ConfigParser()
+        config.read('capif_ops/config_files/credentials.properties')
+
+        username = config.get("credentials", "invoker_username")
+        password = config.get("credentials", "invoker_password")
+
+        register_ip = os.getenv('REGISTER_HOSTNAME')
+        register_port = os.getenv('REGISTER_PORT')
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        #First we need register exposer in CAPIF
+        try:
+            response = self.__get_capif_auth(register_ip, register_port, username, password, log_level)
+            demo_values['capif_access_token'] = response["access_token"]
+            demo_values['ccf_api_onboarding_url'] = response["ccf_api_onboarding_url"]
+            demo_values['ccf_discover_url'] = response["ccf_discover_url"]
+            demo_values['ccf_onboarding_url'] = response["ccf_onboarding_url"]
+            demo_values['ccf_publish_url'] = response["ccf_publish_url"]
+            demo_values['ccf_security_url'] = response["ccf_security_url"]
+            ca_root = response["ca_root"]
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+            certification_file = open('capif_ops/certs/ca.crt', 'w')
+            certification_file.write(ca_root)
+
+            print(colored("\nCertificate ca_root, token and URLs received\n","green"))
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 409:
+                print(colored("\nUser already registed. Continue with token request\n", "red"))
+                print("User already registed. Continue with token request\n")
+            else:
+                print(colored(f"\n{e}.\n", "red"))
+
+        return True
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_get_security_auth.py b/invoker_gui/capif_ops/invoker_get_security_auth.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd5148a2ceaf1419434d02ff7db6feab5c0250b4
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_get_security_auth.py
@@ -0,0 +1,116 @@
+from dis import dis
+from email import charset
+import requests
+import json
+import configparser
+import redis
+import os
+import re
+from termcolor import colored
+
+
+class InvokerGetSecurityAuth():
+
+    def __get_security_token(self, capif_ip, api_invoker_id, jwt_token, ccf_url, demo_values, index, log_level):
+
+        print(colored("\nRequesting the security token","yellow"))
+        url = "https://{}/capif-security/v1/securities/{}/token".format(capif_ip, api_invoker_id)
+
+        with open('capif_ops/config_files/token_request.json', "rb") as f:
+            payload = json.load(f)
+
+        payload["client_id"] = api_invoker_id
+        scope = "3gpp#"
+        for i in index:
+            aef_id = demo_values[f"aef_id_{i}"]
+            api_name = demo_values[f"api_name_{i}"]
+            pos = scope.find(aef_id)
+            if pos != -1:
+                if scope.find(f"{api_name},") == -1 or scope.find(f"{api_name};") == -1 or scope.find(f"{api_name}\n") == -1:
+                    scope = scope.replace(f"{aef_id}:", f"{aef_id}:{api_name},", 1)
+            else:
+                if scope.find(':') != -1:
+                    scope = scope + f";{aef_id}:{api_name}"
+                else:
+                    scope = scope+ f"{aef_id}:{api_name}"
+
+        payload["scope"] = scope
+
+        headers = {
+            'Content-Type': 'application/x-www-form-urlencoded',
+        }
+
+        
+        payload_dict = json.dumps(payload, indent=2)
+
+        #print(colored(f"Request Body: {payload_dict}", "yellow"))
+
+        try:
+
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"Request Body: {json.dumps(payload, indent=2)}", "yellow"))
+                print(colored(f"''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+
+            response = requests.post(url, headers=headers, data=payload, cert=('capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify='capif_ops/certs/ca.crt')
+            response.raise_for_status()
+            response_payload = json.loads(response.text)
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+
+            return response_payload
+        except requests.exceptions.HTTPError as err:
+            print(err.response.text)
+            message = json.loads(err.response.text)
+            status = err.response.status_code
+            raise Exception(message, status)
+
+    def execute_get_security_auth(self, names, log_level):
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        config = configparser.ConfigParser()
+        config.read('credentials.properties')
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+        invokerID = demo_values['invokerID']
+        capif_access_token = demo_values['capif_access_token']
+        ccf_discover_url = demo_values['ccf_discover_url']
+        index = []
+        for name in names:
+            count=-1
+            for clave, valor in demo_values.items():
+                if valor == name:
+                    index.append(int(re.match(r'api_name_(\d+)', clave).group(1)))
+                    count= 1
+            if count == -1:
+                print(colored(f"API {name} not found","red"))
+        if len(index)<1:
+            return
+        try:
+            token = self.__get_security_token(capif_ip, invokerID, capif_access_token, ccf_discover_url, demo_values, index, log_level)
+            #print(colored(json.dumps(token, indent=2),"yellow"))
+            demo_values["netapp_service_token"] = token["access_token"]
+            list_apis = "\nSecurity Token obtained for the APIs: {}\n".format(", ".join(map(str, names)))
+
+            print(colored(list_apis,"green"))
+
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored("\nAPI Invoker is not authorized\n", "red"))
+            elif status_code == 403:
+                print(colored("\nAPI Invoker does not exist. API Invoker id not found\n", "red"))
+            else:
+                print(colored(f"\n{e}\n", "red"))
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_previous_register.py b/invoker_gui/capif_ops/invoker_previous_register.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae9b2c4fdfdb3a03aa06bbe6cbae52dd363a28b5
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_previous_register.py
@@ -0,0 +1,103 @@
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+import warnings
+from urllib3.exceptions import InsecureRequestWarning
+
+
+class PreviousRegister():
+
+    warnings.filterwarnings("ignore", category=InsecureRequestWarning)
+
+    def __register_invoker_to_capif(self, register_ip, register_port, username, password, description, email, enterprise, country, purpose, phone_number, website, access_token, log_level):
+
+            url = "https://{}:{}/createUser".format(register_ip,register_port)
+
+            payload = dict()
+            payload['username'] = username
+            payload['password'] = password
+            payload['enterprise'] = enterprise
+            payload['description'] = description
+            payload['email'] = email
+            payload['country'] = country
+            payload['purpose'] = purpose
+            payload['phone_number'] = phone_number
+            payload['website'] = website
+
+            headers = {
+                'Authorization': 'Bearer {}'.format(access_token),
+                'Content-Type': 'application/json'
+            }
+
+            print(colored("\nRegistering user", "yellow"))
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"Request Body: {payload}", "yellow"))
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+
+            try:
+                response = requests.request("POST", url, headers=headers, data=json.dumps(payload), verify=False)
+                response.raise_for_status()
+                if log_level == "debug":
+                    print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                    print(colored(f"Response to: {response.url}","green"))
+                    print(colored(f"Response Headers: {response.headers}","green"))
+                    print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                    print(colored(f"Response Status code: {response.status_code}","green"))
+                    print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+                response_payload = json.loads(response.text)
+
+                return response_payload['uuid']
+            except requests.exceptions.HTTPError as err:
+                raise Exception(err.response.status_code)
+
+    def execute_previous_register_invoker(self, log_level):
+
+        config = configparser.ConfigParser()
+        config.read('capif_ops/config_files/credentials.properties')
+
+        username = config.get("credentials", "invoker_username")
+        password = config.get("credentials", "invoker_password")
+        description = config.get("credentials", "invoker_description")
+        email = config.get("credentials", "invoker_email")
+        enterprise = config.get("credentials", "invoker_enterprise")
+        country = config.get("credentials", "invoker_country")
+        purpose = config.get("credentials", "invoker_purpose")
+        phone_number = config.get("credentials", "invoker_phone")
+        website = config.get("credentials", "invoker_web")
+
+        register_ip = os.getenv('REGISTER_HOSTNAME')
+        register_port = os.getenv('REGISTER_PORT')
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+        
+        if "access_token" not in demo_values:
+            print(colored("\nYou need the admin access token to create an user. Use login_admin command to receive the token.\n", "red"))
+            return True
+
+        #First we need register invoker in CAPIF
+        try:
+            uuid = self.__register_invoker_to_capif(register_ip, register_port, username, password, description, email, enterprise, country, purpose, phone_number, website, demo_values["access_token"], log_level)
+            demo_values['user_uuid'] = uuid
+            #print(colored(f"NetAppID: {netappID}\n","yellow"))
+            #print("provider ID: {}".format(providerID))
+
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+            
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored("\nAccess token expired.\n", "red"))
+            elif status_code == 409:
+                print(colored("\nThe user is already registered\n", "red"))
+            else:
+                print(colored(f"\n{e}.\n", "red"))
+
+        return True
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_refresh_admin_token.py b/invoker_gui/capif_ops/invoker_refresh_admin_token.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c2a61d04817bb52fbbe251fc830360e106e9d46
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_refresh_admin_token.py
@@ -0,0 +1,69 @@
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+import warnings
+from urllib3.exceptions import InsecureRequestWarning
+
+class refreshAdmin():
+
+    warnings.filterwarnings("ignore", category=InsecureRequestWarning)
+
+    def __refresh_admin_token__(self, register_ip, register_port, refresh_token, log_level):
+
+        url = "https://{}:{}/refresh".format(register_ip,register_port)
+
+        headers =  {
+            'Authorization': 'Bearer {}'.format(refresh_token),
+        }
+
+        print(colored("\nRefreshing admin tokens", "yellow"))
+        if log_level == "debug":
+            print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+            print(colored(f"Request: to {url}","yellow"))
+            print(colored(f"Request Headers: {headers}", "yellow"))
+            print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+        try:
+            response = requests.request("POST", url, headers=headers, verify=False)
+            response.raise_for_status()
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+            response_payload = json.loads(response.text)
+            return response_payload['access_token']
+        except requests.exceptions.HTTPError as err:
+                raise Exception(err.response.status_code)
+    
+
+
+    def execute_refresh_admin(self, log_level=None):
+
+        register_ip = os.getenv('REGISTER_HOSTNAME')
+        register_port = os.getenv('REGISTER_PORT')
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        try:
+            if "refresh_token" not in demo_values:
+                print(colored(f"\nYou need to log in as an administrator to receive the refresh token.\n", "red"))
+                return True
+
+            access_token = self.__refresh_admin_token__(register_ip, register_port, demo_values["refresh_token"], log_level)
+            demo_values['access_token']= access_token
+
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+            print(colored(f"\nAccess token: {access_token} received.\n","green"))
+
+        except Exception as e:
+            status_code = e.args[0]
+            print(colored(f"\n{e}.\n", "red"))
+
+        return True
diff --git a/invoker_gui/capif_ops/invoker_register_events.py b/invoker_gui/capif_ops/invoker_register_events.py
new file mode 100644
index 0000000000000000000000000000000000000000..f7d4a45495b133940bdc5807dedbd2ea0e9a9971
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_register_events.py
@@ -0,0 +1,75 @@
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+
+
+class AddEvents():
+
+    def __add_events_to_capif(self, capif_ip, apf_id, log_level):
+
+        print(colored("\nSubscribing to events", "yellow"))
+
+        url = 'https://{}/capif-events/v1/{}/subscriptions'.format(capif_ip, apf_id)
+        payload = open('capif_ops/config_files/events_values.json', 'rb')
+        payload_dict = json.load(payload)
+
+        headers = {
+            'Content-Type': 'application/json'
+        }
+
+        payload = json.dumps(payload_dict, indent=2)
+
+        try:
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"Request Body: {payload}", "yellow"))
+                print(colored(f"''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+
+            response = requests.request("POST", url, headers=headers, data=json.dumps(payload_dict), cert=('capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify=False)
+            response.raise_for_status()
+            response_payload = json.loads(response.text)
+
+
+            if log_level == "debug":
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("Success, events subscribed ","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+
+            header = response.headers.get("Location")
+
+            return header.split('/')[len(header.split('/'))-1]
+        except requests.exceptions.HTTPError as err:
+            message = json.loads(err.response.text)
+            status = err.response.status_code
+            raise Exception(message, status)
+
+
+    def execute_add_events(self, log_level):
+
+        config = configparser.ConfigParser()
+        config.read('capif_ops/config_files/credentials.properties')
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+
+
+        #Add the event in CAPIF
+        try:
+            subscription_id = self.__add_events_to_capif(capif_ip, demo_values['invokerID'], log_level)
+            demo_values['subscription_id']= subscription_id
+            print(colored("\nEvents subscription id: {}\n".format(subscription_id),"green"))
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+        except Exception as e:
+            print(colored(f"\n{e}\n", "red"))
+        return True
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_register_to_capif.py b/invoker_gui/capif_ops/invoker_register_to_capif.py
new file mode 100644
index 0000000000000000000000000000000000000000..8e221d4bd0331fbb9cfee6f1f6196bc06029f64e
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_register_to_capif.py
@@ -0,0 +1,137 @@
+from dis import dis
+import requests
+import json
+import configparser
+import redis
+import os
+from termcolor import colored
+
+
+from OpenSSL.SSL import FILETYPE_PEM
+from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, load_publickey, PKey, TYPE_RSA, X509Req, dump_publickey)
+
+
+class RegisterInvoker():
+    def __create_csr(self,  name):
+
+        # create public/private key
+        key = PKey()
+        key.generate_key(TYPE_RSA, 2048)
+
+        # Generate CSR
+        req = X509Req()
+        #req.get_subject().CN = name
+        req.get_subject().O = 'Telefonica I+D'
+        req.get_subject().OU = 'Innovation'
+        req.get_subject().L = 'Madrid'
+        req.get_subject().ST = 'Madrid'
+        req.get_subject().C = 'ES'
+        req.get_subject().emailAddress = 'inno@tid.es'
+        req.set_pubkey(key)
+        req.sign(key, 'sha256')
+
+        csr_request = dump_certificate_request(FILETYPE_PEM, req)
+
+        private_key = dump_privatekey(FILETYPE_PEM, key)
+
+        return csr_request, private_key
+
+
+
+
+    def __onboard_netapp_to_capif(self, capif_ip, capif_callback_ip, capif_callback_port, jwt_token, ccf_url, name, log_level):
+
+        print(colored("\nOnboarding netapp to CAPIF","yellow"))
+        url = 'https://{}/{}'.format(capif_ip, ccf_url)
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        csr_request, private_key = self.__create_csr("invoker")
+
+        if 'pub_key' not in demo_values:
+            private_key_file = open("capif_ops/certs/invoker_private_key.key", 'wb+')
+            private_key_file.write(bytes(private_key))
+
+        json_file = open('capif_ops/config_files/invoker_details.json', 'rb')
+        payload_dict = json.load(json_file)
+        if 'pub_key' not in demo_values:
+            payload_dict['onboardingInformation']['apiInvokerPublicKey'] = csr_request.decode("utf-8")
+        else:
+            payload_dict['onboardingInformation']['apiInvokerPublicKey'] = demo_values['pub_key']
+        payload_dict['notificationDestination'] = payload_dict['notificationDestination'].replace("X", capif_callback_ip)
+        payload_dict['notificationDestination'] = payload_dict['notificationDestination'].replace("Y", capif_callback_port)
+        payload_dict['apiInvokerInformation'] = name
+        payload = json.dumps(payload_dict, indent=2)
+
+        #print(colored(f"Request Body: {payload}", "yellow"))
+
+        headers = {
+            'Authorization': 'Bearer {}'.format(jwt_token),
+            'Content-Type': 'application/json'
+        }
+
+        try:
+
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"Request Body: {payload}", "yellow"))
+                print(colored(f"''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+
+            response = requests.request("POST", url, headers=headers, data=payload, verify='capif_ops/certs/ca.crt')
+            response.raise_for_status()
+            response_payload = json.loads(response.text)
+            certification_file = open('capif_ops/certs/dummy.crt', 'wb')
+            certification_file.write(bytes(response_payload['onboardingInformation']['apiInvokerCertificate'], 'utf-8'))
+            certification_file.close()
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("Success onboard invoker","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+            return response_payload['apiInvokerId'],  payload_dict['onboardingInformation']['apiInvokerPublicKey']
+        except requests.exceptions.HTTPError as err:
+            raise Exception(err.response.text, err.response.status_code)
+
+
+
+
+
+    def execute_register_invoker(self, name, log_level):
+
+        config = configparser.ConfigParser()
+        config.read('capif_ops/config_files/credentials.properties')
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+
+        capif_callback_ip = config.get("credentials", "capif_callback_ip")
+        capif_callback_port = config.get("credentials", "capif_callback_port")
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        try:
+            if 'ccf_onboarding_url' in demo_values and "capif_access_token" in demo_values and "invokerID" not in demo_values:
+                capif_access_token = demo_values['capif_access_token']
+                ccf_onboarding_url = demo_values['ccf_onboarding_url']
+                invokerID, pub_key = self.__onboard_netapp_to_capif(capif_ip, capif_callback_ip, capif_callback_port, capif_access_token, ccf_onboarding_url, name, log_level)
+                demo_values['invokerID'] = invokerID
+                demo_values['pub_key'] = pub_key
+                print(colored("\nApiInvokerID: {}\n".format(invokerID), "green"))
+                with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                    json.dump(demo_values, outfile)
+            else:
+                print(colored("\nInvoker already registered1.\n", "red"))
+
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 403:
+                print(colored("\nAPI Invoker already registered.\n", "red"))
+            else:
+                print(colored(f"\n{e}\n", "red"))
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_remove_security_context.py b/invoker_gui/capif_ops/invoker_remove_security_context.py
new file mode 100644
index 0000000000000000000000000000000000000000..944fdef89b261365e75f05b2df435756e72e97a2
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_remove_security_context.py
@@ -0,0 +1,81 @@
+from dis import dis
+from email import charset
+import requests
+import json
+import configparser
+import redis
+import os
+from termcolor import colored
+
+
+class InvokerRemoveSecurityContext():
+
+    def __remove_security_service(self, capif_ip, api_invoker_id, jwt_token, ccf_url, demo_values, log_level):
+
+
+        url = "https://{}/capif-security/v1/trustedInvokers/{}".format(capif_ip, api_invoker_id)
+
+        headers = {
+            'Content-Type': 'application/json'
+        }
+
+        try:
+
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"''''''''''REQUEST'''''''''''''''''", "yellow"))
+
+            response = requests.delete(url, cert=('capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify='capif_ops/certs/ca.crt')
+            response.raise_for_status()
+
+            if log_level == "debug":
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {response.json()}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+
+            return 
+        except requests.exceptions.HTTPError as err:
+            print(err.response.text)
+            message = json.loads(err.response.text)
+            status = err.response.status_code
+            raise Exception(message, status)
+
+    def execute_remove_security_context(self, log_level):
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        config = configparser.ConfigParser()
+        config.read('credentials.properties')
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+        invokerID = ""
+        capif_access_token = ""
+        ccf_discover_url = ""
+
+        try:
+
+            invokerID = demo_values['invokerID']
+            capif_access_token = demo_values['capif_access_token']
+            ccf_discover_url = demo_values['ccf_discover_url']
+            security_information = self.__remove_security_service(capif_ip, invokerID, capif_access_token, ccf_discover_url, demo_values,log_level)
+            print(colored(json.dumps(security_information, indent=2),"yellow"))
+            print(colored("Register Security context","yellow"))
+
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print("API Invoker is not authorized")
+            elif status_code == 403:
+                print("API Invoker does not exist. API Invoker id not found")
+            else:
+                print(e)
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_remove_user.py b/invoker_gui/capif_ops/invoker_remove_user.py
new file mode 100644
index 0000000000000000000000000000000000000000..4b523f0d7877bd7bdd96bef9e91985bd586ac99e
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_remove_user.py
@@ -0,0 +1,88 @@
+import requests
+import json
+import configparser
+import os
+from termcolor import colored
+import warnings
+from urllib3.exceptions import InsecureRequestWarning
+
+class RemoveUser():
+    
+    def __delete_user(self, register_ip, register_port, uuid, access_token, log_level):
+
+        url = "https://{}:{}/deleteUser/{}".format(register_ip, register_port, uuid)
+
+        headers = {
+                'Authorization': 'Bearer {}'.format(access_token),
+            }
+
+        try:
+            print(colored("\nRemoving User\n", "yellow"))
+            if log_level == "debug":
+                if log_level == "debug":
+                    print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                    print(colored(f"Request: to {url}","yellow"))
+                    print(colored(f"User uuid: {uuid}", "yellow"))
+                    print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+
+            response = requests.request("DELETE", url, headers=headers, verify=False)
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+
+            #response.raise_for_status()
+            #response_payload = json.loads(response.text)
+            print(colored("User Removed\n","green"))
+
+        except requests.exceptions.HTTPError as err:
+            raise Exception(err.response.text, err.response.status_code)
+
+    def execute_remove_user(self, log_level):
+
+        config = configparser.ConfigParser()
+        config.read('capif_ops/config_files/credentials.properties')
+
+        register_ip = os.getenv('REGISTER_HOSTNAME')
+        register_port = os.getenv('REGISTER_PORT')
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as archivo:
+            content = archivo.read()
+        
+        if "user_uuid" not in content:
+            print(colored("\nUser uuid not found.\n", "red"))
+            return True
+        if "access_token" not in content:
+            print(colored("\nYou need the admin access token to remove an user. Use login_admin command to receive the token.\n", "red"))
+            return True
+        
+        try:
+            self.__delete_user(register_ip, register_port, content["user_uuid"], content["access_token"], log_level)
+            
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored("\nAccess token expired.\n", "red"))
+            else:
+                print(colored(f"\n{e}.\n", "red"))
+
+
+        with open('capif_ops/config_files/demo_values.json', 'w') as archivo:
+            archivo.write('{}')
+
+        if os.path.exists("capif_ops/certs/dummy.crt"):
+            os.remove("capif_ops/certs/dummy.crt")
+        if os.path.exists("capif_ops/certs/invoker_private_key.key"):
+            os.remove("capif_ops/certs/invoker_private_key.key")
+        if os.path.exists("capif_ops/certs/ca.crt"):
+            os.remove("capif_ops/certs/ca.crt")
+
+        #First we need register exposer in CAPIF
+
+        
+
+
+        return True
diff --git a/invoker_gui/capif_ops/invoker_secutiry_context.py b/invoker_gui/capif_ops/invoker_secutiry_context.py
new file mode 100644
index 0000000000000000000000000000000000000000..a8363c67e4342823b376e825ab329b88c11b801e
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_secutiry_context.py
@@ -0,0 +1,116 @@
+from dis import dis
+from email import charset
+import requests
+import json
+import configparser
+import redis
+import os
+import re
+from termcolor import colored
+
+
+class InvokerSecurityContext():
+
+    def __register_security_service(self, capif_ip, api_invoker_id, jwt_token, ccf_url, demo_values, index, log_level):
+
+        print(colored("\nRequesting security context","yellow"))
+
+        url = "https://{}/capif-security/v1/trustedInvokers/{}".format(capif_ip, api_invoker_id)
+
+        with open('capif_ops/config_files/security_info.json', "rb") as f:
+            payload = json.load(f)
+
+        for count in index:
+            profile = {
+                "prefSecurityMethods": [
+                    "Oauth"
+                ],
+                "authenticationInfo": "string",
+                "authorizationInfo": "string"
+            }
+            profile["aefId"] = demo_values[f"aef_id_{count}"]
+            profile["apiId"] = demo_values[f"api_id_{count}"]
+            payload["securityInfo"].append(profile)
+
+        headers = {
+            'Content-Type': 'application/json'
+        }
+
+        # payload_dict = json.dumps(payload, indent=2)
+
+        # print(colored(f"Request Body: {payload_dict}", "yellow"))
+
+        try:
+
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"Request Body: {json.dumps(payload, indent=2)}", "yellow"))
+                print(colored("''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+
+            response = requests.put(url, json=payload, cert=('capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify='capif_ops/certs/ca.crt')
+            response.raise_for_status()
+            response_payload = response.json()
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''","green"))
+
+            return response_payload
+        except requests.exceptions.HTTPError as err:
+            print(err.response.text)
+            message = json.loads(err.response.text)
+            status = err.response.status_code
+            raise Exception(message, status)
+
+    def execute_register_security_context(self, names, log_level):
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        config = configparser.ConfigParser()
+        config.read('credentials.properties')
+
+        capif_ip = os.getenv('CAPIF_HOSTNAME')
+        invokerID = ""
+        capif_access_token = ""
+        ccf_discover_url = ""
+
+        try:
+
+            invokerID = demo_values['invokerID']
+            capif_access_token = demo_values['capif_access_token']
+
+            index = []
+            for name in names:
+                count=-1
+                for clave, valor in demo_values.items():
+                    if valor == name:
+                        index.append(int(re.match(r'api_name_(\d+)', clave).group(1)))
+                        count= 1
+                if count == -1:
+                    print(colored(f"API {name} not found","red"))
+            if len(index)<1:
+                return
+            ccf_discover_url = demo_values['ccf_discover_url']
+            security_information = self.__register_security_service(capif_ip, invokerID, capif_access_token, ccf_discover_url, demo_values, index, log_level)
+            #print(colored(json.dumps(security_information, indent=2),"yellow"))
+            print(colored("\nRegistered Security Context for the apis\n","green"))
+
+            with open('capif_ops/config_files/demo_values.json', 'w') as outfile:
+                json.dump(demo_values, outfile)
+
+
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored("\nInvoker is not authorized\n", "red"))
+            elif status_code == 403:
+                print(colored("\nAPI Invoker does not exist. API Invoker id not found\n", "red"))
+            else:
+                print(colored(f"\n{e}\n", "red"))
\ No newline at end of file
diff --git a/invoker_gui/capif_ops/invoker_to_service.py b/invoker_gui/capif_ops/invoker_to_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..a065bd95d3121b09bccb983bcf2f86ff34f090ff
--- /dev/null
+++ b/invoker_gui/capif_ops/invoker_to_service.py
@@ -0,0 +1,105 @@
+from dis import dis
+import requests
+import json
+import configparser
+import redis
+import os
+import argparse
+import re
+from termcolor import colored
+
+# Get environment variables
+
+
+class InvokerToService():
+    def __demo_to_aef(self, demo_ip, demo_port, method, demo_url, jwt_token, payload_dict, route, log_level):
+
+        url = "http://{}:{}{}".format(demo_ip, demo_port, demo_url)
+        #url = "http://python_aef:8086/hello"
+
+        payload = json.dumps(route, indent=2)
+
+        files = {}
+        headers = {
+            'Content-Type': 'application/json',
+            'Authorization': 'Bearer '+jwt_token
+        }
+
+        #print(colored(f"Request Body: {payload}", "yellow"))
+
+        try:
+            if log_level == "debug":
+                print(colored("''''''''''REQUEST'''''''''''''''''","yellow"))
+                print(colored(f"Request: to {url}","yellow"))
+                print(colored(f"Request Headers: {headers}", "yellow"))
+                print(colored(f"Request Body: {payload}", "yellow"))
+                print(colored("''''''''''REQUEST'''''''''''''''''\n", "yellow"))
+            response = requests.request(method.upper(), url, headers=headers, data=payload, files=files, cert=('capif_ops/certs/dummy.crt', 'capif_ops/certs/invoker_private_key.key'), verify=False)
+            response.raise_for_status()
+            response_payload = json.loads(response.text)
+
+
+            if log_level == "debug":
+                print(colored("\n''''''''''RESPONSE'''''''''''''''''","green"))
+                print(colored(f"Response to: {response.url}","green"))
+                print(colored(f"Response Headers: {response.headers}","green"))
+                print(colored(f"Response: {json.dumps(response.json(), indent=2)}","green"))
+                print(colored(f"Response Status code: {response.status_code}","green"))
+                print(colored("Success to invoke service","green"))
+                print(colored("''''''''''RESPONSE'''''''''''''''''\n","green"))
+            return response_payload
+        except requests.exceptions.HTTPError as err:
+            if err.response.status_code == 404:
+                print(colored("\nUrl not found", "red"))
+            if err.response.status_code == 405:
+                print(colored("\nMethod Not Allowed", "red"))
+            message = json.loads(err.response.text)
+            status = err.response.status_code
+            raise Exception(message, status)
+
+
+    def execute_invoker_to_service(self, api_name, method, endpoint, json_route, log_level):
+
+        # parser = argparse.ArgumentParser()
+        # parser.add_argument('--name', metavar= "name", type=str, default="Evolve5G", help="Name to send to the aef service")
+        # args = parser.parse_args()
+        input_name = "prueba"
+
+        with open('capif_ops/config_files/demo_values.json', 'r') as demo_file:
+            demo_values = json.load(demo_file)
+
+        try:
+            payload = open(json_route, 'rb')
+            payload_dict = json.load(payload)
+
+            if 'netapp_service_token' in demo_values:
+
+                print(colored("\nCalling API","yellow"))
+
+                count=-1
+                for clave, valor in demo_values.items():
+                    if valor == api_name:
+
+                        count=int(re.match(r'api_name_(\d+)', clave).group(1))
+                        break 
+                if count == -1:
+                    print(colored("\nAPI not found\n","red"))
+                    return
+                jwt_token = demo_values['netapp_service_token']
+                invokerID = demo_values['invokerID']
+                demo_ip = demo_values[f"demo_ipv4_addr_{count}"]
+                demo_port = demo_values[f"demo_port_{count}"]
+                result = self.__demo_to_aef(demo_ip, demo_port, method, endpoint, jwt_token, input_name, payload_dict, log_level)
+                if log_level != "debug":
+                    print(colored(f"\nResponse: {json.dumps(result, indent=2)}", "green"))
+                    print(colored("\nSuccess!!\n","green"))
+        except Exception as e:
+            status_code = e.args[0]
+            if status_code == 401:
+                print(colored("\nAPI Invoker is not authorized\n", "red"))
+            elif status_code == 403:
+                print(colored("\nAPI Invoker does not exist. API Invoker id not found\n", "red"))
+            elif status_code == "Expecting value: line 1 column 1 (char 0)":
+                print()
+            else:
+                print(colored(f"\n{e}\n", "red"))
\ No newline at end of file
diff --git a/invoker_gui/event_destination.py b/invoker_gui/event_destination.py
new file mode 100644
index 0000000000000000000000000000000000000000..c32d288365692fc8ca52fe60885a621ed8b5e981
--- /dev/null
+++ b/invoker_gui/event_destination.py
@@ -0,0 +1,23 @@
+from flask import Flask, request, jsonify
+import json
+from termcolor import colored
+
+app = Flask(__name__)
+
+@app.route('/', methods=['POST'])
+def recibir_solicitud():
+    try:
+        response = request.get_json()
+
+        #print(json.dumps(response, indent=2))
+        print(colored("\n''''''''''EVENT'''''''''''''''''","green"))
+        print(colored(f"{json.dumps(response, indent=2)}","green"))
+        print(colored("''''''''''EVENT'''''''''''''''''\n","green"))
+        print(colored(f"Response message: ","green"))
+        return jsonify({"\nmessage": "received"})
+
+    except Exception as e:
+        return jsonify({"error": str(e)})
+
+if __name__ == '__main__':
+    app.run(host='0.0.0.0', port=2223)
\ No newline at end of file
diff --git a/invoker_gui/main.py b/invoker_gui/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..f4a49115d19915efb3c191a8a06bf046465e6c03
--- /dev/null
+++ b/invoker_gui/main.py
@@ -0,0 +1,171 @@
+
+from cmd import Cmd
+from capif_ops.invoker_previous_register import PreviousRegister
+from capif_ops.invoker_register_to_capif import RegisterInvoker
+from capif_ops.invoker_discover_service import  DiscoverService
+from capif_ops.invoker_secutiry_context import InvokerSecurityContext
+from capif_ops.invoker_get_security_auth import InvokerGetSecurityAuth
+from capif_ops.invoker_delete import RemoveInvoker
+from capif_ops.invoker_get_auth import PreviousAuth
+from capif_ops.invoker_remove_security_context import InvokerRemoveSecurityContext
+from capif_ops.invoker_to_service import InvokerToService
+from capif_ops.invoker_remove_user import RemoveUser
+from capif_ops.invoker_register_events import AddEvents
+from capif_ops.invoker_admin_login import LoginAdmin
+from capif_ops.invoker_refresh_admin_token import refreshAdmin
+import subprocess
+import shlex
+from art import *
+from termcolor import colored
+
+prev_register = PreviousRegister()
+regiter_capif = RegisterInvoker()
+discover_service = DiscoverService()
+register_security_context = InvokerSecurityContext()
+security_context_auth = InvokerGetSecurityAuth()
+remove_invoker = RemoveInvoker()
+invoker_auth = PreviousAuth()
+remove_security_service = InvokerRemoveSecurityContext()
+invoker_service = InvokerToService()
+remove_user = RemoveUser()
+register_events = AddEvents()
+admin_login = LoginAdmin()
+refresh_admin = refreshAdmin()
+
+
+
+class CAPIFProvider(Cmd):
+
+  def __init__(self):
+        Cmd.__init__(self)
+        self.prompt = "> "
+        self.intro = tprint("Welcome  to  Invoker  Console")
+
+  def emptyline(self):
+        """Do nothing on empty input line"""
+        pass
+
+  # def preloop(self):
+  #   state = prev_register.execute_previous_register_invoker("")
+  #   self.previous_register_state = state
+
+  def precmd(self, line):
+
+    #line = line.lower()
+    args = shlex.split(line)
+
+
+    if len(args) >= 1 and args[0] in ["goodbye"]:
+        print("The first argument is username")
+        return ""
+
+    elif len(args) >= 1 and args[0] not in ["->", "wall", "follows", "exit", "help"]:
+        pass
+
+    return line
+  
+  def do_login_admin(self, input):
+    'Login with admin credentials to obtain the admin tokens'
+    args = input.split()
+    if len(args) < 2:
+      print(colored("\nLogin admin needs the username and password of the administrator.\n", "red"))
+    else:
+      arg1 = args[0]
+      arg2 = args[1]
+      arg3 = args[2] if len(args) > 2 else None
+      admin_login.execute_login_admin(arg1, arg2, arg3)
+
+  def do_refresh_admin(self, input):
+    'Refresh the admin access token'
+    refresh_admin.execute_refresh_admin(input)
+  
+  def do_register_user(self, input):
+    'Register an user from the registry service'
+    prev_register.execute_previous_register_invoker(input)
+
+  def do_register_invoker(self, input):
+    'Register invoker to CAPIF'
+    args = input.split()
+    if len(args) < 1:
+      print(colored("\nRegister invoker need a name\n", "red"))
+    else:
+      arg1 = args[0]
+      arg2 = args[1] if len(args) > 1 else None
+      regiter_capif.execute_register_invoker(arg1, arg2)
+
+  def do_register_events(self, input):
+    'Register events for invoker'
+    register_events.execute_add_events(input)
+
+  def do_discover_service(self, input):
+    'Discover all services published in CAPIF'
+    discover_service.execute_discover_service(input)
+
+  def do_register_security_context(self, input):
+    'Create security context to use services'
+    args = input.split()
+    if len(args) < 1:
+      print(colored("\nRegister security context needs the name of an api\n", "red"))
+    else:
+      if args[-1] != "debug":
+         arg1 = args
+         arg2 = None
+      else:
+         arg1 = args[:-1]
+         arg2 = args[-1]
+      register_security_context.execute_register_security_context(arg1, arg2)
+
+
+  def do_get_security_auth(self, input):
+    "If you select Oauth as security method use this command to obtain jwt token to access service"
+    args = input.split()
+    if len(args) < 1:
+      print(colored("\nGet security auth needs the name of an api\n", "red"))
+    else:
+      if args[-1] != "debug":
+         arg1 = args
+         arg2 = None
+      else:
+         arg1 = args[:-1]
+         arg2 = args[-1]
+      security_context_auth.execute_get_security_auth(arg1, arg2)
+
+  def do_get_auth(self, input):
+    'Get jwt token to register invoker in CAPIF (Optional, only if token expires)'
+    invoker_auth.execute_get_auth(input)
+
+  def do_remove_security_context(self, input):
+    print("Not implemented yet")
+    #remove_security_service.execute_remove_security_context(input)
+
+  def do_remove_invoker(self, input):
+    "Remove invoker from CAPIF"
+    remove_invoker.execute_remove_invoker(input)
+
+  def do_call_service(self, input):
+    "Test invocation os service API"
+    args = input.split()
+    if len(args) < 4:
+      print(colored("\nCall service needs the name of an api and the route of json file\n", "red"))
+    else:
+      api_name = args[0]
+      method = args[1]
+      endpoint = args[2]
+      json_route = args[3]
+      flag = args[4] if len(args) > 4 else None
+      invoker_service.execute_invoker_to_service(api_name, method, endpoint, json_route, flag)
+  
+  def do_remove_user(self, input):
+    'Delete a user from the registry service'
+    remove_user.execute_remove_user(input)
+
+  def do_exit(self, input):
+    print('\nExiting...')
+    return True
+
+
+if __name__ == '__main__':
+    try:
+        CAPIFProvider().cmdloop()
+    except KeyboardInterrupt:
+        print('\nExiting...')
\ No newline at end of file
diff --git a/invoker_gui/prepare.sh b/invoker_gui/prepare.sh
new file mode 100644
index 0000000000000000000000000000000000000000..5ee2820edc5164bd0668ed289e042143f4509549
--- /dev/null
+++ b/invoker_gui/prepare.sh
@@ -0,0 +1 @@
+tail -f /dev/null
\ No newline at end of file
diff --git a/invoker_gui/requirements.txt b/invoker_gui/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3ecb842b62af92e4318f760735650d630c83a6b8
--- /dev/null
+++ b/invoker_gui/requirements.txt
@@ -0,0 +1,9 @@
+requests 
+urllib3
+chardet
+configparser
+redis
+pyopenssl
+pyjwt
+art
+termcolor
\ No newline at end of file
diff --git a/run.sh b/run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e2ea61a8037424ca02f74c67d68104012e937c8e
--- /dev/null
+++ b/run.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+HOSTNAME=capifcore
+if [ "$#" -eq 1 ]; then
+    HOSTNAME=$1
+fi
+echo Nginx hostname will be $HOSTNAME
+
+docker network create demo-network
+CAPIF_HOSTNAME=$HOSTNAME docker compose up --detach --remove-orphans --build
diff --git a/terminal_to_py_netapp.sh b/terminal_to_py_netapp.sh
new file mode 100755
index 0000000000000000000000000000000000000000..bc3849c4d8aad3520af0891f28dde172ef6c8be5
--- /dev/null
+++ b/terminal_to_py_netapp.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+docker exec -it $(docker ps -q -f "name=invoker_gui") bash
\ No newline at end of file