diff --git a/charts/meep-app-enablement/values-template.yaml b/charts/meep-app-enablement/values-template.yaml
index f279333aca2c3e698c135fe9075067fa34de18e1..3ab14ee01d51ab8a9db9c3a1a871c7f1175d0c9f 100644
--- a/charts/meep-app-enablement/values-template.yaml
+++ b/charts/meep-app-enablement/values-template.yaml
@@ -49,12 +49,19 @@ ingress:
         - /{{.SandboxName}}/{{.MepName}}/service-apis
         - /{{.SandboxName}}/{{.MepName}}/published-apis
         - /{{.SandboxName}}/{{.MepName}}/capif-events
+        - /{{.SandboxName}}/{{.MepName}}/eecs-serviceprovisioning
+        - /{{.SandboxName}}/{{.MepName}}/eees-eecregistration
+        - /{{.SandboxName}}/{{.MepName}}/eees-easdiscovery
+        
         {{- else }}
         - /{{.SandboxName}}/mec_app_support
         - /{{.SandboxName}}/mec_service_mgmt
         - /{{.SandboxName}}/service-apis
         - /{{.SandboxName}}/published-apis
         - /{{.SandboxName}}/capif-events
+        - /{{.SandboxName}}/eecs-serviceprovisioning
+        - /{{.SandboxName}}/eees-eecregistration
+        - /{{.SandboxName}}/eees-easdiscovery
         {{- end }}
   annotations:
     kubernetes.io/ingress.class: nginx
@@ -66,6 +73,9 @@ ingress:
       rewrite ^/{{ .SandboxName }}/{{.MepName}}/service-apis(/|$)(.*)$ /service-apis/$2 break;
       rewrite ^/{{ .SandboxName }}/{{.MepName}}/published-apis(/|$)(.*)$ /published-apis/$2 break;
       rewrite ^/{{ .SandboxName }}/{{.MepName}}/capif-events(/|$)(.*)$ /capif-events/$2 break;
+      rewrite ^/{{ .SandboxName }}/{{.MepName}}/eecs-serviceprovisioning(/|$)(.*)$ /eecs-serviceprovisioning/$2 break;
+      rewrite ^/{{ .SandboxName }}/{{.MepName}}/eees-eecregistration(/|$)(.*)$ /eees-eecregistration/$2 break;
+      rewrite ^/{{ .SandboxName }}/{{.MepName}}/eees-easdiscovery(/|$)(.*)$ /eees-easdiscovery/$2 break;
     {{- else }}
     nginx.ingress.kubernetes.io/configuration-snippet: |
       rewrite ^/{{ .SandboxName }}/mec_app_support(/|$)(.*)$ /mec_app_support/$2 break;
@@ -73,6 +83,9 @@ ingress:
       rewrite ^/{{ .SandboxName }}/service-apis(/|$)(.*)$ /service-apis/$2 break;
       rewrite ^/{{ .SandboxName }}/published-apis(/|$)(.*)$ /published-apis/$2 break;
       rewrite ^/{{ .SandboxName }}/capif-events(/|$)(.*)$ /capif-events/$2 break;
+      rewrite ^/{{ .SandboxName }}/eecs-serviceprovisioning(/|$)(.*)$ /eecs-serviceprovisioning/$2 break;
+      rewrite ^/{{ .SandboxName }}/eees-eecregistration(/|$)(.*)$ /eees-eecregistration/$2 break;
+      rewrite ^/{{ .SandboxName }}/eees-easdiscovery(/|$)(.*)$ /eees-easdiscovery/$2 break;
     {{- end }}
     {{- if .AuthEnabled }}
     nginx.ingress.kubernetes.io/auth-url: https://$http_host/auth/v1/authenticate?svc=meep-app-enablement&sbox={{.SandboxName}}&mep={{.MepName}}
diff --git a/examples/demo6/python/notebook/CAPIF_And_ETSI_MEC_Tutorial.ipynb b/examples/demo6/python/notebook/CAPIF_And_ETSI_MEC_Tutorial.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..2448f8d6b08e0075fcd05279dc0105aec9854def
--- /dev/null
+++ b/examples/demo6/python/notebook/CAPIF_And_ETSI_MEC_Tutorial.ipynb
@@ -0,0 +1,2194 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "44TomlvPCGTe"
+   },
+   "source": [
+    "# Using ETSI MEC profile of CAPIF  in CAPIF application\n",
+    "\n",
+    "## Introduction\n",
+    "\n",
+    "3GPP CAPIF (Common API Framework) is a standardized API management framework designed to enable a unified northbound API approach across 3GPP network functions (see 3GPP TS 23.222 version 18.6.0 Release 18/ETSI TS 123 222 V18.6.0 (2024-06) and 3GPP TS 29.222 version 18.6.0 Release 18/ETSI TS 129 222 V18.6.0 (2022-06)).\n",
+    "\n",
+    "This tutorial introduces the step by step procedure to create a basic CAPIF application to exploit the ETSI MEC CAPIF profile as described in ETSI GS MEC 011 (V3.2.1) Clause 9. The cartoon below illustrate the \n",
+    "\n",
+    "![image](images/capif.png)\n",
+    "\n",
+    "**Note:** It uses the ETSI MEC Sandbox simulator.\n",
+    "\n",
+    "<div class=\"alert alert-block alert-danger\">\n",
+    "    <b>Note:</b> These source code examples are simplified and ignore return codes and error checks to a large extent. We do this to highlight how to use the MEC Sandbox API and the different MEC satndards and reduce unrelated code.\n",
+    "A real-world application will of course properly check every return value and exit correctly at the first serious error.\n",
+    "</div>\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "4DpxwmiomELg"
+   },
+   "source": [
+    "## The basics of developing a CAPIF application\n",
+    "\n",
+    "\n",
+    "<div class=\"alert alert-warning\" role=\"alert\">\n",
+    "    <b>Note:</b> The sub-paragraph 'Putting everything together' is a specific paragraph where all the newly features introduced in the main paragraph are put together to create an executable block of code. It is possible to skip this block of code by removing the comment character (#) on first line of this block of code.\n",
+    "</div>\n",
+    "\n",
+    "Before going to create our CAPIF application skeleton, the following steps shall be done:\n",
+    "\n",
+    "1) Apply the python imports"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "1gjo-NM6hD1k"
+   },
+   "outputs": [],
+   "source": [
+    "from __future__ import division # Import floating-point division (1/4=0.25) instead of Euclidian division (1/4=0)\n",
+    "\n",
+    "import os\n",
+    "import sys\n",
+    "import re\n",
+    "import logging\n",
+    "import threading\n",
+    "import time\n",
+    "import json\n",
+    "import uuid\n",
+    "import base64\n",
+    "\n",
+    "import pprint\n",
+    "\n",
+    "import requests\n",
+    "\n",
+    "from http import HTTPStatus\n",
+    "from http.server import BaseHTTPRequestHandler, HTTPServer\n",
+    "\n",
+    "try:\n",
+    "    import urllib3\n",
+    "except ImportError:\n",
+    "    raise ImportError('Swagger python client requires urllib3.')\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "j9wDIe9IEUQz"
+   },
+   "source": [
+    "The following imports are required to support the security aspects such as certificates management, signatures..."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "xb4ReBZZEVLB"
+   },
+   "outputs": [],
+   "source": [
+    "!pip3 install pyOpenSSL==25.0.0\n",
+    "\n",
+    "try:\n",
+    "    from OpenSSL.SSL import FILETYPE_PEM\n",
+    "    from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, load_publickey, PKey, TYPE_RSA, X509Req, dump_publickey)\n",
+    "except ImportError:\n",
+    "    raise ImportError('OpenSSL package not found.')\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "DrPJzD14nLas"
+   },
+   "source": [
+    "2) Initialize of the global constants (cell 3)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "rNibZWiBitPE"
+   },
+   "outputs": [],
+   "source": [
+    "REGISTER_HOSTNAME     = 'lab-oai.etsi.org'                    # capif-prev.mobilesandbox.cloud\n",
+    "REGISTER_PORT         = 31120                                 # 31120\n",
+    "REGISTER_USER         = 'admin'                               # Basic AUTH for registration\n",
+    "REGISTER_PASSWORD     = 'password123'                         # Basic AUTH for registration\n",
+    "\n",
+    "CAPIF_HOSTNAME        = 'lab-oai.etsi.org'                    # capif-prev.mobilesandbox.cloud\n",
+    "CAPIF_PORT            = 443\n",
+    "\n",
+    "USER_PASSWORD         = 'password123'\n",
+    "\n",
+    "TRY_MEC_URL           = 'try-mec.etsi.org'                     # MEC Sandbox URL\n",
+    "TRY_MEC_SESSION_ID    = 'sbxgs9x587'                           # MEC Sandbox identifier\n",
+    "TRY_MEC_PLTF          = 'mep1'                                 # MEC Platform identifier (depending of the network scenario loaded)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "MOa9g-NMnpod"
+   },
+   "source": [
+    "3) Setup the logger instance and the HTTP REST API (cell 4)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "-cuxWhfantSw"
+   },
+   "outputs": [],
+   "source": [
+    "# Initialize the logger\n",
+    "logger = logging.getLogger(__name__)\n",
+    "logger.setLevel(logging.DEBUG)\n",
+    "logging.basicConfig(filename='/tmp/' + time.strftime('%Y%m%d-%H%M%S') + '.log')\n",
+    "l = logging.StreamHandler()\n",
+    "l.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))\n",
+    "logger.addHandler(l)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "D67Aq0vujB0q"
+   },
+   "source": [
+    "4) Setup the global variables (cell 5)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "7RC7UY-0oACq"
+   },
+   "outputs": [],
+   "source": [
+    "# Initialize the global variables\n",
+    "ca_root                = \"\" # The CAPIF root certificate\n",
+    "ccf_api_onboarding_url = \"\" #\n",
+    "ccf_publish_url        = \"\" # The CAPIF publish API endpoint\n",
+    "ccf_discover_url       = \"\" # The CAPIF discovery endpoint\n",
+    "ccf_security_url       = \"\" # The CAPIF security endpoint\n",
+    "ccf_onboarding_url     = \"\" # The CAPIF onboarding endpoint\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "2YvSVMClhPJT"
+   },
+   "source": [
+    "To enable the Automatic Debugger Calling, uncomment the code bellow."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "OQjYWHgnYM4G"
+   },
+   "outputs": [],
+   "source": [
+    "#!pip3 install ipdb\n",
+    "#import ipdb\n",
+    "#%pdb on\n",
+    "# Use the command ipdb.set_trace() to set a breakpoint"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "1fMmXWk9jLDX"
+   },
+   "source": [
+    "## Create our first CAPIF application\n",
+    "\n",
+    "The first step to develop a MEC application is to create the application skeleton which contains the minimum steps below:\n",
+    "\n",
+    "- Login to instanciate a MEC Sandbox\n",
+    "- Logout to delete a existing MEC Sandbox"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "rtAVXZayoQRx"
+   },
+   "source": [
+    "#### Login\n",
+    "\n",
+    "The login operation is required by ETSI TS 123 222 V18.6.0 (2024-06) Clause 4.5 Operations, Administration and Maintenance but is out of the scope of ETSI TS 129 222 V18.6.0 (2022-06)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "Ad8g1no-pH7i"
+   },
+   "outputs": [],
+   "source": [
+    "def process_login() -> tuple:\n",
+    "    \"\"\"\n",
+    "    Logs in to the CAPIF server.\n",
+    "    :return A dictionary containing the login response, or None if login fails\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> process_login')\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/login'\n",
+    "        logger.debug('process_login: url=' + url)\n",
+    "        auth_string = f\"{REGISTER_USER}:{REGISTER_PASSWORD}\"\n",
+    "        encoded_auth = base64.b64encode(auth_string.encode('utf-8')).decode('utf-8')\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': f'Basic {encoded_auth}'}\n",
+    "        logger.debug('process_login (step1): headers: ' + str(headers))\n",
+    "        response = requests.post(url, headers=headers, verify=False)\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        logger.debug('process_login (step2): result: ' + str(response.json()))\n",
+    "        if response.status_code != 200:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return None, None\n",
+    "        tokens = json.loads(response.text)\n",
+    "        return tokens['refresh_token'], tokens['access_token']\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"Login failed: {e}\")\n",
+    "\n",
+    "    return None, None\n",
+    "    # End of function process_login"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "8Cw5MBc-st1e"
+   },
+   "source": [
+    "### Logout\n",
+    "\n",
+    "The logout operation is required by ETSI TS 123 222 V18.6.0 (2024-06) Clause 4.5 Operations, Administration and Maintenance but is out of the scope of ETSI TS 129 222 V18.6.0 (2022-06)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "XmyLOuFasuvU"
+   },
+   "outputs": [],
+   "source": [
+    "def process_logout():\n",
+    "    \"\"\"\n",
+    "    Logs out from the CAPIF server\n",
+    "    Nothing to do\n",
+    "    \"\"\"\n",
+    "    pass\n",
+    "    # End of function process_logout"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "mCKT-ntspnsM"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "Now, it is time now to create the our first iteration of our CAPIF/MEC application. Here the logic is:\n",
+    "*   Login\n",
+    "*   Print obtained tokens\n",
+    "*   Logout\n",
+    "*   Check that logout is effective"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "XYC8PnDUpvui"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the first sprint of our CAPIF application:\n",
+    "        - Login\n",
+    "        - Print obtained tokens\n",
+    "        - Logout\n",
+    "        - Check that logout is effective\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Login\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        return\n",
+    "\n",
+    "    # Print obtained tokens\n",
+    "    logger.debug(\"Login successful: admin_token=\" + admin_token)\n",
+    "\n",
+    "    # Logout\n",
+    "    process_logout()\n",
+    "\n",
+    "    # Check that logout is effective\n",
+    "    logger.debug('To check that logout is effective')\n",
+    "\n",
+    "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    # End of function process_main\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "rTcvGY5T1pZJ"
+   },
+   "source": [
+    "## Create the API Provider\n",
+    "\n",
+    "The next step is to create a new user associated to our CAPIF application to obtain a user UUID. It will be used to genereate ceertificates to be used during TLS mutual authentication and API onboarding and offboarding for instance.\n",
+    "\n",
+    "**Note:** It is required by ETSI TS 123 222 V18.6.0 (2024-06) Clause 4.5 Operations, Administration and Maintenance but is out of the scope of ETSI TS 129 222 V18.6.0 (2022-06).\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "ysxZ8sIiLLgw"
+   },
+   "source": [
+    "### Creating a new user\n",
+    "\n",
+    "The cell below provides an implementation for this user creation.\n",
+    "\n",
+    "**Note:** To improve this code, the user profile shlould be fully parametrized."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "Jq-9_sLI8WgW"
+   },
+   "outputs": [],
+   "source": [
+    "def create_user(p_admin_token: str) -> tuple:\n",
+    "    \"\"\"\n",
+    "    Creates a new user.\n",
+    "    :return: The user UUID on success, None otherwise\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> create_user')\n",
+    "\n",
+    "    try:\n",
+    "        user_name = str(uuid.uuid1())\n",
+    "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/createUser'\n",
+    "        logger.debug('create_user: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_admin_token}\n",
+    "        logger.debug('create_user (step1): headers: ' + str(headers))\n",
+    "        data = {\n",
+    "            'username': user_name,\n",
+    "            'password': USER_PASSWORD,\n",
+    "            'enterprise': 'ETSI',\n",
+    "            'country': 'France',\n",
+    "            'email': 'ocf@etsi.org',\n",
+    "            'purpose': 'Tutorial on MEC/OpenCAPIF',\n",
+    "            'phone_number': \"+330405060708\",\n",
+    "            'company_web': 'www.etsi.org',\n",
+    "            'description': 'A step by step procedure to create a basic CAPIF application to exploit the ETSI MEC CAPIF profile'\n",
+    "        }\n",
+    "        response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)\n",
+    "        logger.debug('create_user (step2): response=' + str(response))\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        if response.status_code != 201:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return ()\n",
+    "        tokens = json.loads(response.text)\n",
+    "        return (user_name, tokens['uuid'])\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"Error creating user: {e}\")\n",
+    "\n",
+    "    return ()\n",
+    "    # End of function create_user"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Ut3CLrRUFT5o"
+   },
+   "source": [
+    "### Deleting an existing User\n",
+    "\n",
+    "Before to terminate our CAPIF application, we have to clean up the resources. So, a function to delete a created user is required."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "WRIdwNMNFrdC"
+   },
+   "outputs": [],
+   "source": [
+    "def delete_user(p_user_uuid: str, p_admin_token: str) -> int:\n",
+    "    \"\"\"\n",
+    "    Deletes a user.\n",
+    "    :param p_user_uuid: The user UUID\n",
+    "    :return: 0 on success, -1 otherwise\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> delete_user')\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/deleteUser/' + p_user_uuid\n",
+    "        logger.debug('delete_user: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_admin_token}\n",
+    "        response = requests.delete(url, headers=headers, verify=False)\n",
+    "        logger.debug('delete_user: response=' + str(response))\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        return 0\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"Error creating user: {e}\")\n",
+    "\n",
+    "    return -1\n",
+    "    # End of function delete_user"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "IAh9tN25-82V"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "It is time now to create the our second iteration of our CAPIF/MEC application.\n",
+    "\n",
+    "The sequence is the following:\n",
+    "*   Login\n",
+    "*   Print obtained tokens\n",
+    "*   Create a new user\n",
+    "*   Print the user UUID\n",
+    "*   Delete the newly created user\n",
+    "*   Logout\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "1M_x2I1B_Crp"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the second sprint of our CAPIF/MEC application:\n",
+    "        - Login\n",
+    "        - Print obtained tokens\n",
+    "        - Create a new user\n",
+    "        - Print the user UUID\n",
+    "        - Delete the newly created user\n",
+    "        - Logout\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Login\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        return\n",
+    "\n",
+    "    # Print obtained tokens\n",
+    "    logger.debug(\"Login successful: admin_token=\" + admin_token)\n",
+    "\n",
+    "    # Create a new user\n",
+    "    user_name, user_uuid = create_user(admin_token)\n",
+    "    if len(user_uuid) == 0:\n",
+    "        return\n",
+    "\n",
+    "    # Print User UUID\n",
+    "    logger.debug(\"User successfully created: user_uuid=\" + user_uuid)\n",
+    "\n",
+    "    time.sleep(5) # Sleep for 5 seconds\n",
+    "\n",
+    "    # Delete the newly created user\n",
+    "    delete_user(user_uuid, admin_token)\n",
+    "\n",
+    "    # Logout\n",
+    "    process_logout()\n",
+    "\n",
+    "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    # End of function process_main\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "f896qBJOjMuz"
+   },
+   "source": [
+    "## Getting security materials\n",
+    "\n",
+    "The purpose is to retrieves peer certificates for the TLS mutual authentication purpose and the JWT token to onboarding and offboarding APIs.\n",
+    "The following information is retrived:\n",
+    "- The root certificate\n",
+    "- An access token which will be used for onboarding and offboarding APIs\n",
+    "- The URLs for the different CAPIF endpoints:\n",
+    " * API onbording endpoint\n",
+    " * API discovery endpoint\n",
+    " * API publish endpoint\n",
+    " * Security endpoint\n",
+    "\n",
+    "This operation needs the user name and the user password used in previous [chapter](#create_the_invoker_/_provider).\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "lC2JAah7LWLp"
+   },
+   "source": [
+    "### Getting certificates"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "1glmqNSRK1cH"
+   },
+   "outputs": [],
+   "source": [
+    "def get_auth(p_user_name: str, p_user_password: str) -> dict:\n",
+    "    \"\"\"\n",
+    "    Gets the authentication information.\n",
+    "    :param The user name\n",
+    "    :param The user password\n",
+    "    :return A dictionary containing the authentication information on success, or an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> get_auth')\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/getauth'\n",
+    "        logger.debug('get_auth: url=' + url)\n",
+    "        auth_string = f\"{p_user_name}:{p_user_password}\"\n",
+    "        encoded_auth = base64.b64encode(auth_string.encode('utf-8')).decode('utf-8')\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': f'Basic {encoded_auth}'}\n",
+    "        logger.debug('get_auth (step1): headers: ' + str(headers))\n",
+    "        response = requests.get(url, headers=headers, verify=False)\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        logger.debug('get_auth (step2): result: ' + str(response.json()))\n",
+    "        if response.status_code != 200:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return dict()\n",
+    "        auth = json.loads(response.text)\n",
+    "        return auth\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"get_auth failed: {e}\")\n",
+    "\n",
+    "    return dict()\n",
+    "    # End of function get_auth"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "BUw-VS1WLb7i"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "\n",
+    "Now, it is time now to create the our third iteration of our MEC application. Here the logic is:\n",
+    "\n",
+    "- Login\n",
+    "- Create the user\n",
+    "- Get the information to use CAPIF (security materials & URLs)\n",
+    "- Print the information to use CAPI\n",
+    "- Delete the user\n",
+    "- Logout\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "J002Vuz2OIKl"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the first sprint of our skeleton of our CAPIF application:\n",
+    "        - Login\n",
+    "        - Print obtained tokens\n",
+    "        - Create a new user\n",
+    "        - Get the information to use CAPIF (security materials & URLs)\n",
+    "        - Print the information to use CAPI\n",
+    "        - Delete the newly created user\n",
+    "        - Logout\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root, ccf_api_onboarding_url, ccf_publish_url, ccf_discover_url, ccf_security_url, ccf_onboarding_url\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Login\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        return\n",
+    "\n",
+    "    # Create a new user\n",
+    "    user_name, user_uuid = create_user(admin_token)\n",
+    "    if len(user_uuid) == 0:\n",
+    "        return\n",
+    "\n",
+    "    auth = get_auth(user_name, USER_PASSWORD)\n",
+    "    if len(auth) == 0:\n",
+    "        return\n",
+    "\n",
+    "    # Print the authentication information\n",
+    "    logger.debug(\"Authentication information=\" + str(auth))\n",
+    "    access_token = auth['access_token']\n",
+    "    ca_root = auth['ca_root']\n",
+    "    ccf_api_onboarding_url = auth['ccf_api_onboarding_url']\n",
+    "    ccf_discover_url = auth['ccf_discover_url']\n",
+    "    ccf_onboarding_url = auth['ccf_onboarding_url']\n",
+    "    ccf_publish_url = auth['ccf_publish_url']\n",
+    "    ccf_security_url = auth['ccf_security_url']\n",
+    "\n",
+    "    time.sleep(5) # Sleep for 5 seconds\n",
+    "\n",
+    "    # Delete the newly created user\n",
+    "    delete_user(user_uuid, admin_token)\n",
+    "\n",
+    "    # Logout\n",
+    "    process_logout()\n",
+    "\n",
+    "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    # End of function process_main\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "oNhnnDhjjOd7"
+   },
+   "source": [
+    "## Onboarding and offboarding APIs\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "K6i4ktfM1xFQ"
+   },
+   "source": [
+    "### Generate certificates\n",
+    "\n",
+    "Until now, all HTTPS exchanges were done with the the 'verify' attribute of the HTTP reques set to False. It means that the TLS mutual authentication was disabled.\n",
+    "\n",
+    "Fo the process of onboarding and offboarding APIs, the TLS mutual authentication is required. We already got the peer certificate to verify peer but we need to generate our own certificate to be verified by the CAPIF server. This is the purpose of the following functions to generate the public/private keys and generate a CSR and request certificates for each of the three functions AMF, AEF and APF.\n",
+    "\n",
+    "**Refer to:** ETSI TS 129 222 V18.6.0 (2022-06) Clauses 5.11 CAPIF_API_Provider_Management and 8.9 CAPIF_API_Provider_Management_API\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "gEIS3iAH2D4t"
+   },
+   "outputs": [],
+   "source": [
+    "def generate_csr(p_cn: str, p_org: str, p_country: str) -> tuple:\n",
+    "    \"\"\"\n",
+    "    To generate the CSR and generate the dumps\n",
+    "    :param p_cn: The common name\n",
+    "    :param p_org: The organization\n",
+    "    :param p_country: The country\n",
+    "    :return: The CSR and the private keys on success, None otherwise\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> generate_csr')\n",
+    "\n",
+    "    # Generate the public/private key\n",
+    "    key = PKey()\n",
+    "    key.generate_key(TYPE_RSA, 2048)\n",
+    "\n",
+    "    # Generate the CSR\n",
+    "    req = X509Req()\n",
+    "    req.get_subject().CN = p_cn\n",
+    "    req.get_subject().O = p_org\n",
+    "    req.get_subject().C = p_country\n",
+    "    req.set_pubkey(key)\n",
+    "    req.sign(key, 'sha256')\n",
+    "\n",
+    "    # Generate the dumps\n",
+    "    csr_request = dump_certificate_request(FILETYPE_PEM, req)\n",
+    "    private_key = dump_privatekey(FILETYPE_PEM, key)\n",
+    "    logger.debug('generate_csr: PrivKey: ' + str(private_key))\n",
+    "\n",
+    "    return (csr_request, private_key)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "F2-W0a5S3snI"
+   },
+   "source": [
+    "**Note:** The function above can be improved using parameter for the SHA, and the signature/encryption algorithm."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "1HyqrdUz-uzn"
+   },
+   "source": [
+    "### Onboard the API provider\n",
+    "\n",
+    "The purpose here is to get certificates from CAPIF in order to export our APIs for the different functions:\n",
+    "- AMF: API Management Function\n",
+    "- AEF: API Exposing Function\n",
+    "- APF: API Publishing Function"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "6cCn1vKLGe0k"
+   },
+   "outputs": [],
+   "source": [
+    "def onboard_provider(p_name: str, p_access_token: str) -> dict:\n",
+    "    \"\"\"\n",
+    "    To onboard the provider.\n",
+    "    :param p_name: The name of the provider\n",
+    "    :return: A dictionary containing security material for each CAPIF endpoint on success, or an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ccf_api_onboarding_url, access_token\n",
+    "\n",
+    "    logger.debug('>>> onboard_provider')\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_api_onboarding_url\n",
+    "        logger.debug('onboard_provider: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_access_token}\n",
+    "        logger.debug('onboard_provider (step1): headers: ' + str(headers))\n",
+    "        # Build the list of certificate request for the three endpoints\n",
+    "        l = []\n",
+    "        amf_csr_request, amf_private_key = generate_csr(\"AMF\", \"ETSI\", \"Fr\")\n",
+    "        amf_entry = {\n",
+    "            'regInfo': {\n",
+    "                'apiProvPubKey': amf_csr_request.decode(\"utf-8\")\n",
+    "            },\n",
+    "            'apiProvFuncRole': 'AMF'\n",
+    "        }\n",
+    "        l.append(amf_entry)\n",
+    "        aef_csr_request, aef_private_key = generate_csr(\"AEF\", \"ETSI\", \"Fr\")\n",
+    "        aef_entry = {\n",
+    "            'regInfo': {\n",
+    "                'apiProvPubKey': aef_csr_request.decode(\"utf-8\")\n",
+    "            },\n",
+    "            'apiProvFuncRole': 'AEF'\n",
+    "        }\n",
+    "        l.append(aef_entry)\n",
+    "        apf_csr_request, apf_private_key = generate_csr(\"APF\", \"ETSI\", \"Fr\")\n",
+    "        apf_entry = {\n",
+    "            'regInfo': {\n",
+    "                'apiProvPubKey': apf_csr_request.decode(\"utf-8\")\n",
+    "            },\n",
+    "            'apiProvFuncRole': 'APF'\n",
+    "        }\n",
+    "        l.append(apf_entry)\n",
+    "        # Build the request body\n",
+    "        data = {\n",
+    "            'apiProvFuncs': l,\n",
+    "            'apiProvDomInfo': p_name,\n",
+    "            'suppFeat': 'fff',\n",
+    "            'failReason': 'string',\n",
+    "            'regSec': p_access_token\n",
+    "        }\n",
+    "        logger.debug('onboard_provider (step2): body: ' + str(data))\n",
+    "        response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        logger.debug('onboard_provider (step3): result: ' + str(response.json()))\n",
+    "        if response.status_code != 201:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return dict()\n",
+    "        res = json.loads(response.text)\n",
+    "        # Add an entry for CSRs and private keys for future usage\n",
+    "        res['csr'] = {\n",
+    "            'amf': [amf_csr_request, amf_private_key],\n",
+    "            'aef': [aef_csr_request, aef_private_key],\n",
+    "            'apf': [apf_csr_request, apf_private_key]\n",
+    "        }\n",
+    "        return res\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"onboard_provider failed: {e}\")\n",
+    "\n",
+    "    return dict()\n",
+    "    # End of function onboard_provider"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "yP6ZytijFxKG"
+   },
+   "source": [
+    "### Offboard the API provider\n",
+    "\n",
+    "The purpose is to offboard the API provider from the CAPIF server. Here, the certificate and the private key of the AMF endpoint are required (TLS mutual authentication)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "rbpNr26tF2gr"
+   },
+   "outputs": [],
+   "source": [
+    "def offboard_provider(p_api_provider_id: str, p_bundle: tuple) -> list:\n",
+    "    \"\"\"\n",
+    "    To offboard the API provider.\n",
+    "    :param p_api_provider_id: The identifier of the API provider\n",
+    "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+    "    :return: A list containing the files created for the TLS mutual authentication operations on success, or an empty list otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ccf_api_onboarding_url, ca_root\n",
+    "\n",
+    "    logger.debug('>>> offboard_provider')\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_api_onboarding_url + '/' + p_api_provider_id\n",
+    "        logger.debug('offboard_provider: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json'}\n",
+    "        logger.debug('offboard_provider (step1): headers: ' + str(headers))\n",
+    "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+    "        if len(bundle) != 3:\n",
+    "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+    "            return []\n",
+    "        logger.debug('offboard_provider (step2): bundle: ' + str(bundle))\n",
+    "        response = requests.delete(url, headers=headers, cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+    "        logger.debug('offboard_provider (step3): response=' + str(response))\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        if response.status_code != 204:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return []\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"offboard_provider failed: {e}\")\n",
+    "        return []\n",
+    "\n",
+    "    return bundle\n",
+    "    # End of function offboard_provider\n",
+    "\n",
+    "def store_certificate_2_files(p_certificate, p_private_key, p_ca_root) -> list:\n",
+    "    \"\"\"\n",
+    "    Save certificate and key into files\n",
+    "    :param p_certificate:\n",
+    "    :param p_private_key:\n",
+    "    :param p_ca_root:\n",
+    "    :return: A list of file paths on success, an empty list otherwise\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> store_certificate_2_files')\n",
+    "    try:\n",
+    "        with open(\"p_crt.crt\", \"w\") as f:\n",
+    "            f.write(p_certificate)\n",
+    "        with open(\"p_key.key\", \"w\") as f:\n",
+    "            f.write(p_private_key.decode('utf-8'))\n",
+    "        with open(\"ca_root.pem\", \"w\") as f:\n",
+    "            f.write(p_ca_root)\n",
+    "        return [\"p_crt.crt\", \"p_key.key\", \"ca_root.pem\"]\n",
+    "    except Exception as e:\n",
+    "        logger.error(f\"An error occurred: {e}\")\n",
+    "\n",
+    "    return []\n",
+    "    # End of function store_certificate_2_files\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "wmvJSK8I13XD"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "\n",
+    "Now, it is time now to create the our third iteration of our CAPIF/MEC application. Here the logic is:\n",
+    "\n",
+    "- Login\n",
+    "- Create the user\n",
+    "- Get the information to use CAPIF (security materials & URLs)\n",
+    "- Onboard the provider\n",
+    "- Print certificates for each function\n",
+    "- Delete the user\n",
+    "- Logout\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "EDcPUuNEM26H"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the third sprint of our CAPIF/MEC application:\n",
+    "        - Login\n",
+    "        - Print obtained tokens\n",
+    "        - Create a new user\n",
+    "        - Get the information to use CAPIF (security materials & URLs)\n",
+    "        - Onboard the provider\n",
+    "        - Print certificates for each function\n",
+    "        - Delete the newly created user\n",
+    "        - Logout\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root, ccf_api_onboarding_url, ccf_publish_url, ccf_discover_url, ccf_security_url, ccf_onboarding_url\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Login\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        return\n",
+    "\n",
+    "    # Create a new user\n",
+    "    user_name, user_uuid = create_user(admin_token)\n",
+    "    if len(user_uuid) == 0:\n",
+    "        return\n",
+    "\n",
+    "    auth = get_auth(user_name, USER_PASSWORD)\n",
+    "    if len(auth) == 0:\n",
+    "        return\n",
+    "\n",
+    "    # Set the CAPIF access information\n",
+    "    access_token = auth['access_token']\n",
+    "    ca_root = auth['ca_root']\n",
+    "    ccf_api_onboarding_url = auth['ccf_api_onboarding_url']\n",
+    "    ccf_discover_url = auth['ccf_discover_url']\n",
+    "    ccf_onboarding_url = auth['ccf_onboarding_url']\n",
+    "    ccf_publish_url = auth['ccf_publish_url']\n",
+    "    ccf_security_url = auth['ccf_security_url']\n",
+    "    logger.debug(\"ccf_api_onboarding_url:\" + ccf_api_onboarding_url)\n",
+    "    logger.debug(\"ccf_discover_url:\" + ccf_discover_url)\n",
+    "    logger.debug(\"ccf_publish_url:\" + ccf_publish_url)\n",
+    "    logger.debug(\"ccf_security_url:\" + ccf_security_url)\n",
+    "\n",
+    "    # Onboard the provider\n",
+    "    prov = onboard_provider(\"MECSandbox_to_CAPIF_Provider\", access_token)\n",
+    "    if len(prov) == 0:\n",
+    "        return\n",
+    "\n",
+    "    # Print certificates for each function\n",
+    "    logger.debug(\"API Provider Id:\" + prov['apiProvDomId'])\n",
+    "    logger.debug(\"AMF: \" + prov['apiProvFuncs'][0]['regInfo']['apiProvCert'])\n",
+    "    logger.debug(\"AEF: \" + prov['apiProvFuncs'][1]['regInfo']['apiProvCert'])\n",
+    "    logger.debug(\"APF: \" + prov['apiProvFuncs'][2]['regInfo']['apiProvCert'])\n",
+    "    logger.debug(\"csr: \" + str(prov['csr']))\n",
+    "\n",
+    "    time.sleep(5) # Sleep for 5 seconds\n",
+    "\n",
+    "    # Offboard the API profider\n",
+    "    certs_bundle = (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]) # Use AMF certificate and AMF private key\n",
+    "    file_bundle = offboard_provider(prov['apiProvDomId'], certs_bundle)\n",
+    "    if len(file_bundle) == 0:\n",
+    "        for file in file_bundle:\n",
+    "            os.remove(file)\n",
+    "\n",
+    "    # Delete the newly created user\n",
+    "    delete_user(user_uuid, admin_token)\n",
+    "\n",
+    "    # Logout\n",
+    "    process_logout()\n",
+    "\n",
+    "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    # End of function process_main\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "0wHI1ooMbCy3"
+   },
+   "source": [
+    "## Using ETSI MEC profile for CAPIF\n",
+    "\n",
+    "The purpose is to export the MEC Profile for CAPIF API into our CAPIF application. To achieve it, we need to fulfill the following requirements:\n",
+    "1. Create an instance of a MEC Sandbox using the '4g-5g-macri-v2x' network scenario\n",
+    "2. Set TRY_MEC_URL, TRY_MEC_SESSION_ID, TRY_MEC_PLTF constants accordingly\n",
+    "3. Build the ServiceAPIDescription as described in ETSI TS 129 222 V18.6.0 (2022-06) Table 8.2.4.2.2-1: Definition of type ServiceAPIDescription. This is the role of the function below"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "S7InJDD1_g-v"
+   },
+   "outputs": [],
+   "source": [
+    "def build_publish_api_from_mec_services(p_aefId: str) -> dict:\n",
+    "    \"\"\"\n",
+    "    This function builds the Publish API request body data structure which will be used todo the request for publish API\n",
+    "    :param p_aefId: The AEF ID\n",
+    "    :return The request body data structure on success, an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, TRY_MEC_URL, TRY_MEC_SESSION_ID, TRY_MEC_PLTF\n",
+    "\n",
+    "    logger.debug('>>> build_publish_api_from_mec_services: p_aefId=' + p_aefId)\n",
+    "\n",
+    "    # Sanity checks\n",
+    "    if len(p_aefId) == 0:\n",
+    "        logger.error('build_publish_api_from_mec_services: p_aefId is empty')\n",
+    "        return dict()\n",
+    "\n",
+    "    # Build the service-apis data structure\n",
+    "    publish_api_req_body = {\n",
+    "        \"apiName\": \"MEC Profile for CAPIF\",\n",
+    "        \"aefProfiles\": [\n",
+    "            {\n",
+    "            \"aefId\": p_aefId,\n",
+    "            \"versions\": [\n",
+    "                {\n",
+    "                \"apiVersion\": \"v1\",\n",
+    "                \"expiry\": \"2025-11-30T10:32:02.004Z\",\n",
+    "                \"resources\": [\n",
+    "                    {\n",
+    "                        \"resourceName\": \"MEC Profile of CAPIF\",\n",
+    "                        \"commType\": \"REQUEST_RESPONSE\",\n",
+    "                        \"uri\": f\"/{TRY_MEC_SESSION_ID}/{TRY_MEC_PLTF}/service-apis/v1/allServiceAPIs\",\n",
+    "                        \"custOpName\": \"string\",\n",
+    "                        \"operations\": [\n",
+    "                            \"GET\"\n",
+    "                        ],\n",
+    "                        \"description\": \"Endpoint to access MEC services\"\n",
+    "                    }\n",
+    "                ],\n",
+    "                \"custOperations\": [\n",
+    "                    {\n",
+    "                        \"commType\": \"REQUEST_RESPONSE\",\n",
+    "                        \"custOpName\": \"string\",\n",
+    "                        \"operations\": [\n",
+    "                            \"GET\"\n",
+    "                        ],\n",
+    "                        \"description\": \"string\"\n",
+    "                    }\n",
+    "                ]\n",
+    "                }\n",
+    "            ],\n",
+    "            \"protocol\": \"HTTP_1_1\",\n",
+    "            \"dataFormat\": \"JSON\",\n",
+    "            \"securityMethods\": [\"OAUTH\"],\n",
+    "            \"interfaceDescriptions\": [\n",
+    "                {\n",
+    "                \"ipv4Addr\": TRY_MEC_URL,\n",
+    "                \"securityMethods\": [\"OAUTH\"]\n",
+    "                }\n",
+    "            ]\n",
+    "            }\n",
+    "        ],\n",
+    "        \"description\": \"MEC Profile of CAPIF\",\n",
+    "        \"supportedFeatures\": \"fffff\",\n",
+    "        \"shareableInfo\": {\n",
+    "            \"isShareable\": True,\n",
+    "            \"capifProvDoms\": [\n",
+    "                \"string\"\n",
+    "            ]\n",
+    "        },\n",
+    "        \"serviceAPICategory\": \"string\",\n",
+    "        \"apiSuppFeats\": \"fffff\",\n",
+    "        \"pubApiPath\": {\n",
+    "            \"ccfIds\": [\n",
+    "                \"string\"\n",
+    "            ]\n",
+    "        },\n",
+    "        \"ccfId\": \"string\",\n",
+    "        \"apiStatus\":{\n",
+    "            \"aefIds\": [\n",
+    "                p_aefId\n",
+    "            ]\n",
+    "        }\n",
+    "    }\n",
+    "\n",
+    "    logger.debug('<<< build_publish_api_from_mec_services: ' + str(publish_api_req_body))\n",
+    "    return publish_api_req_body\n",
+    "    # End of build_publish_api_from_mec_services function"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "PRAie110_r8P"
+   },
+   "source": [
+    "Having built the ServiceAPIDescription data structure, the next step is to implement the CAPIF publish API.\n",
+    "\n",
+    "To proceed, we need to enable the TLS mutual authentication using the security material obtained during the onboarding APIs operation ([Onboarding APIs](#onboarding_apis)), i.e. the AEF certificate and the AEF private key ([Generate certificates](#Generate_certificates)).\n",
+    "\n",
+    "\n",
+    "**Refer to:** ETSI TS 129 222 V18.6.0 (2022-06) Clauses 5.3 CAPIF_Publish_Service_API and 8.2 CAPIF_Publish_Service_API\n",
+    "\n",
+    "Before to proceed with the steps above, let's create 2 helper functions to simpily the implemantation of the CAPIF publish API. These helper functions cover the following operations:\n",
+    "- Onboarding operations\n",
+    "- Offboarding operations"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "IreHiSXs2U65"
+   },
+   "source": [
+    "#### Onboarding operations\n",
+    "\n",
+    "The Onboarding operations include th following steps:\n",
+    "- login\n",
+    "- create a new user\n",
+    "- Get the information to use CAPIF (security materials & URLs)\n",
+    "- onboard the provider\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "nu-tEA6n2TpI"
+   },
+   "outputs": [],
+   "source": [
+    "def onboarding_provider() -> dict:\n",
+    "    \"\"\"\n",
+    "    To onboard the provider using CAPIF endpoint. It includes:\n",
+    "    - login\n",
+    "    - create a new user\n",
+    "    - Get the information to use CAPIF (security materials & URLs)\n",
+    "    - onboard the provider\n",
+    "    :return: A dictionary containing security material and additional context information on success, or an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root, ccf_api_onboarding_url, ccf_publish_url, ccf_discover_url, ccf_security_url, ccf_onboarding_url\n",
+    "\n",
+    "    # Login\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        return dict()\n",
+    "\n",
+    "    # Create a new user\n",
+    "    user_name, user_uuid = create_user(admin_token)\n",
+    "    if len(user_uuid) == 0:\n",
+    "        return dict()\n",
+    "\n",
+    "    auth = get_auth(user_name, USER_PASSWORD)\n",
+    "    if len(auth) == 0:\n",
+    "        return dict()\n",
+    "\n",
+    "    # Set the CAPIF access information\n",
+    "    access_token = auth['access_token']\n",
+    "    ca_root = auth['ca_root']\n",
+    "    ccf_api_onboarding_url = auth['ccf_api_onboarding_url']\n",
+    "    ccf_discover_url = auth['ccf_discover_url']\n",
+    "    ccf_onboarding_url = auth['ccf_onboarding_url']\n",
+    "    ccf_publish_url = auth['ccf_publish_url']\n",
+    "    ccf_security_url = auth['ccf_security_url']\n",
+    "\n",
+    "    # Onboard the provider\n",
+    "    prov = onboard_provider(\"MECSandbox_to_CAPIF_Provider\", access_token)\n",
+    "    if len(prov) == 0:\n",
+    "        return dict()\n",
+    "\n",
+    "    # Add context data\n",
+    "    prov['refresh_token'] = refresh_token\n",
+    "    prov['admin_token'] = admin_token\n",
+    "    prov['user_uuid'] = user_uuid\n",
+    "    prov['access_token'] = access_token\n",
+    "\n",
+    "    return prov\n",
+    "    # End of onboarding_provider function"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "e940bUcf2deu"
+   },
+   "source": [
+    "#### Offboarding operations\n",
+    "\n",
+    "The Offboarding operations include th following steps:\n",
+    "- Offboard the API provide\n",
+    "- Delete the user\n",
+    "- Logout\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "hEnFLfPI2hms"
+   },
+   "outputs": [],
+   "source": [
+    "def offboarding_provider(p_user_uuid: str, p_api_provider_id: str, p_bundle: tuple, p_admin_token: str) -> int:\n",
+    "    \"\"\"\n",
+    "    To offboard the provider. It includes:\n",
+    "    - Offboard the API provider\n",
+    "    - Delete the user\n",
+    "    - Logout\n",
+    "    :return: 0 on success, or -1 otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ccf_api_onboarding_url, access_token\n",
+    "\n",
+    "    logger.debug('>>> offboarding_provider: ' + p_user_uuid)\n",
+    "\n",
+    "    # Offboard the API profider\n",
+    "    file_bundle = offboard_provider(p_api_provider_id, p_bundle)\n",
+    "    if len(file_bundle) == 0: # Remove cert files if any\n",
+    "        for file in file_bundle:\n",
+    "            os.remove(file)\n",
+    "\n",
+    "    # Delete the newly created user\n",
+    "    delete_user(p_user_uuid, p_admin_token)\n",
+    "\n",
+    "    # Logout\n",
+    "    process_logout()\n",
+    "\n",
+    "    return 0\n",
+    "    # End of offboarding_provider function"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "9TSYztWMcaOA"
+   },
+   "source": [
+    "#### Publish CAPIF API function\n",
+    "\n",
+    "As mentionned above , the prupose of this function is to publish an API, using the TLS mutual authentication. To do so, we need the APF certificate (public keys) and its private key for the signature and the encription processes, and the CA certificate for the verification of the peer certifcate.\n",
+    "\n",
+    "**Note**: The http.request function required taht the cerficates and the keys are stored on files, not in memory. So, when our CAPIF applicate terminates, these files shall be removed (freeing resource step). This is the reason the publish_capif_api() function return a tuple containing the files created for the TLS mutual authentication operation.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "z_Cwazjl_xGJ"
+   },
+   "outputs": [],
+   "source": [
+    "def publish_capif_api(p_apfId: str, p_body: dict, p_bundle: tuple) -> list:\n",
+    "    \"\"\"\n",
+    "    This function is to publish an API on CAPIF server\n",
+    "    :param p_apfId: The APF identifier\n",
+    "    :param p_body: The request body\n",
+    "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+    "    :return: A list containing the files created for the TLS mutual authentication operations on success, or an empty list otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ccf_publish_url, ca_root\n",
+    "\n",
+    "    logger.debug('>>> publish_capif_api')\n",
+    "\n",
+    "    # Sanity checks\n",
+    "    if len(p_bundle) != 2:\n",
+    "        logger.error('publish_capif_api: p_bundle is malformed')\n",
+    "        return []\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_publish_url.replace('<apfId>', p_apfId)\n",
+    "        logger.debug('publish_capif_api: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json'}\n",
+    "        logger.debug('publish_capif_api (step1): headers: ' + str(headers))\n",
+    "        logger.debug('publish_capif_api (step2): body: ' + str(p_body))\n",
+    "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+    "        if len(bundle) != 3:\n",
+    "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+    "            return []\n",
+    "        logger.debug('publish_capif_api (step3): bundle: ' + str(bundle))\n",
+    "        response = requests.post(url, headers=headers, data=json.dumps(p_body), cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        logger.debug('publish_capif_api (step4): result: ' + str(response.json()))\n",
+    "        if response.status_code != 201:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return []\n",
+    "        res = json.loads(response.text)\n",
+    "        logger.debug('publish_capif_api (step5): res: ' + str(res))\n",
+    "        api_id = res['apiId']\n",
+    "        return bundle\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"publish_capif_api failed: {e}\")\n",
+    "\n",
+    "    return []\n",
+    "    # End of function publish_capif_api\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "-TzvBVLM1fIc"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "CRtfJ6cm3V6b"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the fourth sprint of our CAPIF/MEC application:\n",
+    "    - Onboarding operations\n",
+    "    - Offboarding operations\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    prov = onboarding_provider()\n",
+    "    if len(prov) == 0:\n",
+    "        return\n",
+    "    user_uuid = prov['user_uuid']\n",
+    "\n",
+    "    # Build the publish_api body request\n",
+    "    aefId = prov['apiProvFuncs'][1]['apiProvFuncId']\n",
+    "    apfId = prov['apiProvFuncs'][2]['apiProvFuncId']\n",
+    "    publish_api_req_body = build_publish_api_from_mec_services(aefId)\n",
+    "    if len(publish_api_req_body) == 0:\n",
+    "        offboarding_provider(user_uuid, prov['apiProvDomId'], (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]), prov['admin_token']) # Use AMF certificate and AMF private key\n",
+    "        return\n",
+    "    logger.debug(\"publish_api_req_body: \" + str(publish_api_req_body))\n",
+    "    certs_bundle = (prov['apiProvFuncs'][2]['regInfo']['apiProvCert'], prov['csr']['apf'][1]) # Use APF certificate and APF private key\n",
+    "\n",
+    "    # Publish the APIs\n",
+    "    #ipdb.set_trace()\n",
+    "    files_bundle = publish_capif_api(apfId, publish_api_req_body, certs_bundle)\n",
+    "    if len(files_bundle) == 0:\n",
+    "        for file in files_bundle:\n",
+    "            os.remove(file)\n",
+    "        offboarding_provider(user_uuid, prov['apiProvDomId'], (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]), prov['admin_token']) # Use AMF certificate and AMF private key\n",
+    "        return\n",
+    "\n",
+    "    # Terminate the application\n",
+    "    offboarding_provider(\n",
+    "                         user_uuid,\n",
+    "                         prov['apiProvDomId'],\n",
+    "                         (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]),  # Use AMF certificate and AMF private key\n",
+    "                         prov['admin_token']\n",
+    "                         )\n",
+    "\n",
+    "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    # End of function process_main\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "aABBc4Hizy88"
+   },
+   "source": [
+    "## Build an helper function to publish the ETSI MEC profile for CAPIF API\n",
+    "\n",
+    "To simply the API invoker process, let's create two helpers functions:\n",
+    "- One to publish the ETSI MEC profile for CAPIF API\n",
+    "- One to remove the previously published API"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "r-gZe6mQ4yHH"
+   },
+   "source": [
+    "### Helper to publish API"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "ozCMG8jh0UMd"
+   },
+   "outputs": [],
+   "source": [
+    "def publish_api() -> tuple:\n",
+    "    \"\"\"\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> publish_api')\n",
+    "\n",
+    "    prov = onboarding_provider()\n",
+    "    if len(prov) == 0:\n",
+    "        return ()\n",
+    "    amf_cert_bundle = (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]) # Use AMF certificate and AMF private key\n",
+    "\n",
+    "    # Build the publish_api body request\n",
+    "    aefId = prov['apiProvFuncs'][1]['apiProvFuncId']\n",
+    "    apfId = prov['apiProvFuncs'][2]['apiProvFuncId']\n",
+    "    apiId = prov['apiProvDomId']\n",
+    "    publish_api_req_body = build_publish_api_from_mec_services(aefId)\n",
+    "    if len(publish_api_req_body) == 0:\n",
+    "        offboarding_provider(prov['user_uuid'], apiId, amf_cert_bundle, prov['admin_token'])\n",
+    "        return ()\n",
+    "    logger.debug(\"publish_api_req_body: \" + str(publish_api_req_body))\n",
+    "    certs_bundle = (prov['apiProvFuncs'][2]['regInfo']['apiProvCert'], prov['csr']['apf'][1]) # Use APF certificate and APF private key\n",
+    "\n",
+    "    # Publish the APIs\n",
+    "    files_bundle = publish_capif_api(apfId, publish_api_req_body, certs_bundle)\n",
+    "    if len(files_bundle) == 0:\n",
+    "        for file in files_bundle:\n",
+    "            os.remove(file)\n",
+    "        offboarding_provider(prov['user_uuid'], apiId, amf_cert_bundle, prov['admin_token']) # Use AMF certificate and AMF private key\n",
+    "        return ()\n",
+    "\n",
+    "    logger.debug('publish_api: ' + str((apiId, amf_cert_bundle)))\n",
+    "    return (apiId, amf_cert_bundle, prov['user_uuid'], prov['admin_token'])\n",
+    "    # End of function publish_api\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "lrnfAlrZ1-TB"
+   },
+   "source": [
+    "### Helper to remove published API"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "Ql9dC3P41_nO"
+   },
+   "outputs": [],
+   "source": [
+    "def remove_publish_api(p_user_uuid: str, p_api_id: str, p_bundle: tuple, p_admin_token: str):\n",
+    "    \"\"\"\n",
+    "    To remove published API.\n",
+    "    :param p_user_uuid: The user identifier\n",
+    "    :param p_api_id: The API identifier\n",
+    "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> remove_publish_api ')\n",
+    "\n",
+    "    # Terminate the application\n",
+    "    offboarding_provider(p_user_uuid, p_api_id, p_bundle, p_admin_token)\n",
+    "\n",
+    "    return\n",
+    "    # End of function reove_publish_api\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "UNN73-Zg4WZ-"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "\n",
+    "Let's test these two helpers functions before to go ahead"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "bVYS13iV4-s8"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    To test both helpers functions:\n",
+    "    - publish_api\n",
+    "    - remove_publish_api\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Publish the MEC profile for CAPIF API\n",
+    "    res = publish_api()\n",
+    "    if len(res) == 0:\n",
+    "        return\n",
+    "\n",
+    "    api_id, bundle, user_uuid, admin_token = res\n",
+    "\n",
+    "    time.sleep(5) # Sleep for 5 seconds\n",
+    "\n",
+    "    # Remove the MEC profile for CAPIF API\n",
+    "    remove_publish_api(user_uuid, api_id, bundle, admin_token)\n",
+    "\n",
+    "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    # End of function process_main\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "9W2SvVdx6fxk"
+   },
+   "source": [
+    "## Using the published API: The CAPIF Invoker side\n",
+    "\n",
+    "Now that we are able to publish an API on the CAPIF server, the next step is to use it in order to invoke some MEC Services API. To achieve this goal, we have to implement the CAPI Invoker, following these steps:\n",
+    "- Onboard an API invoker\n",
+    "- Discover the published APIs\n",
+    "- Get a MEC Service API (this step requires that a MEC Sandox platform is already running)\n",
+    "- Offboard an API invoker"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "YasCvixW7E4o"
+   },
+   "source": [
+    "### Onboard an API invoker\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "f11_uMS67I9J"
+   },
+   "outputs": [],
+   "source": [
+    "def onboard_invoker(p_name: str, p_access_token: str) -> dict:\n",
+    "    \"\"\"\n",
+    "    To onboard the API invoker.\n",
+    "    :param p_name: The name of the invoker\n",
+    "    :return: A dictionary containing security material for each CAPIF endpoint on success, or an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ccf_api_onboarding_url, ccf_onboarding_url\n",
+    "\n",
+    "    logger.debug('>>> onboard_invoker: ' + p_name)\n",
+    "    logger.debug('>>> onboard_invoker: ' + p_access_token)\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_onboarding_url\n",
+    "        logger.debug('onboard_invoker: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_access_token}\n",
+    "        logger.debug('onboard_invoker (step1): headers: ' + str(headers))\n",
+    "        # Request body for onboarding the invoker\n",
+    "        invoker_csr_request, invoker_private_key = generate_csr(\"API Invoker\", \"ETSI\", \"Fr\")\n",
+    "        data = {\n",
+    "            \"notificationDestination\" : \"http://host.docker.internal:8086/netapp_callback\",\n",
+    "            \"supportedFeatures\" : \"fffffff\",\n",
+    "            \"apiInvokerInformation\" : \"dummy\",\n",
+    "            \"websockNotifConfig\" : {\n",
+    "                \"requestWebsocketUri\" : True,\n",
+    "                \"websocketUri\" : \"websocketUri\"\n",
+    "            },\n",
+    "            \"onboardingInformation\" : {\n",
+    "                \"apiInvokerPublicKey\" : invoker_csr_request.decode(\"utf-8\"),\n",
+    "            },\n",
+    "            \"requestTestNotification\" : True\n",
+    "            }\n",
+    "        logger.debug('onboard_invoker (step2): body: ' + str(data))\n",
+    "        response = requests.post(url, headers=headers, data=json.dumps(data), verify=\"ca_root.pem\")\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        logger.debug('onboard_invoker (step3): result: ' + str(response.json()))\n",
+    "        if response.status_code != 201:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return dict()\n",
+    "        res = json.loads(response.text)\n",
+    "        # Add an entry for CSRs and private keys for future usage\n",
+    "        res['csr'] = [invoker_csr_request, invoker_private_key]\n",
+    "        return res\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"onboard_invoker failed: {e}\")\n",
+    "\n",
+    "    return dict()\n",
+    "    # End of function onboard_invoker"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "kQmJW-d99cGo"
+   },
+   "source": [
+    "### Offboard an API invoker"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "KRC_xkGO9hEY"
+   },
+   "outputs": [],
+   "source": [
+    "def offboard_invoker(p_invoker_id: str, p_bundle: tuple) -> list:\n",
+    "    \"\"\"\n",
+    "    To offboard the API invoker.\n",
+    "    :param p_invoker_id: The API invoker identifier\n",
+    "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+    "    :return: 0 on success, -1 otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ccf_onboarding_url, ca_root\n",
+    "\n",
+    "    logger.debug('>>> offboard_invoker: ' + p_invoker_id)\n",
+    "\n",
+    "    try:\n",
+    "        # Delete the newly created user\n",
+    "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_onboarding_url + '/' + p_invoker_id\n",
+    "        logger.debug('offboard_invoker: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json'}\n",
+    "        logger.debug('offboard_invoker (step1): headers: ' + str(headers))\n",
+    "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+    "        if len(bundle) != 3:\n",
+    "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+    "            return []\n",
+    "        logger.debug('offboard_invoker (step2): bundle: ' + str(bundle))\n",
+    "        response = requests.delete(url, headers=headers, cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+    "        logger.debug('offboard_invoker (step3): response=' + str(response))\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        if response.status_code != 204:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return []\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"offboard_invoker failed: {e}\")\n",
+    "        return []\n",
+    "\n",
+    "    return bundle\n",
+    "    # End of function offboard_invoker"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "-h0zz7ocxtyv"
+   },
+   "source": [
+    "### Discover published APIs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "ofUuploUxuhn"
+   },
+   "outputs": [],
+   "source": [
+    "def discover(p_invoker_id: str, p_bundle: tuple, p_access_token: str) -> dict:\n",
+    "    \"\"\"\n",
+    "    To discover the APIs published by capif core.\n",
+    "    :param p_invoker_id: The API invoker identifier\n",
+    "    :return: A dictionary containing the APIs published by capif core on success, or an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root, ccf_discover_url\n",
+    "\n",
+    "    logger.debug('>>> Discover APIs published by capif core')\n",
+    "\n",
+    "    try:\n",
+    "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_discover_url + p_invoker_id\n",
+    "        logger.debug('Discover: url=' + url)\n",
+    "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_access_token}\n",
+    "        logger.debug('Discover (step1): headers: ' + str(headers))\n",
+    "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+    "        if len(bundle) != 3:\n",
+    "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+    "            return dict()\n",
+    "        logger.debug('Discover (step2): bundle: ' + str(bundle))\n",
+    "        response = requests.get(url, headers=headers, cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+    "        logger.debug('Discover (step3): response=' + str(response))\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        logger.debug('Discover : result: ' + str(response.json()))\n",
+    "        if response.status_code != 200:\n",
+    "            logger.error(f\"Discovery failed: {response.status_code} - {response.text}\")\n",
+    "            return dict()\n",
+    "        res = json.loads(response.text)\n",
+    "        return res\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"Discovery failed: {e}\")\n",
+    "\n",
+    "    return dict()\n",
+    "    # End of function discover\n",
+    "\n",
+    "def extract_ipv4_and_uri(p_response_data: json.loads) -> dict:\n",
+    "    # Extract ipv4Addr using a list comprehension\n",
+    "    ipv4_addrs = [\n",
+    "        desc.get(\"ipv4Addr\")\n",
+    "        for profile in p_response_data.get(\"serviceAPIDescriptions\", [])\n",
+    "        for aef in profile.get(\"aefProfiles\", [])\n",
+    "        for desc in aef.get(\"interfaceDescriptions\", [])\n",
+    "    ]\n",
+    "\n",
+    "    # Extract uri using a list comprehension\n",
+    "    uris = [\n",
+    "        resource.get(\"uri\")\n",
+    "        for profile in p_response_data.get(\"serviceAPIDescriptions\", [])\n",
+    "        for aef in profile.get(\"aefProfiles\", [])\n",
+    "        for version in aef.get(\"versions\", [])\n",
+    "        for resource in version.get(\"resources\", [])\n",
+    "    ]\n",
+    "\n",
+    "    return {\"ipv4Addr\": ipv4_addrs, \"uri\": uris}\n",
+    "    # End of function extract_ipv4_and_uri"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "RElS9XFZ9hvQ"
+   },
+   "source": [
+    "### Putting everything together"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "QPZPYJZM9mNr"
+   },
+   "outputs": [],
+   "source": [
+    "%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the fiveth sprint of our CAPIF/MEC application:\n",
+    "    - Publish the MEC profile for CAPIF API\n",
+    "    - Create a new user for the invoker\n",
+    "    - Get certificates\n",
+    "    - Onboad the API invoker\n",
+    "    - Do the discovery\n",
+    "    - Offboard the API invoker\n",
+    "    - Delete the\n",
+    "    - Logout the invoker user\n",
+    "    - Remove the MEC profile for CAPIF API\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root, ccf_api_onboarding_url, ccf_discover_url, ccf_onboarding_url, ccf_publish_url, ccf_security_url\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Publish the MEC profile for CAPIF API\n",
+    "    res = publish_api()\n",
+    "    if len(res) == 0:\n",
+    "        return\n",
+    "    api_id, bundle, prov_user_uuid, prov_admin_token = res\n",
+    "\n",
+    "    # Login for the new user for the invoker\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Create a new user for the invoker\n",
+    "    res = create_user(admin_token)\n",
+    "    if len(res) == 0:\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "    user_name, user_uuid = res\n",
+    "\n",
+    "    # Get certificates\n",
+    "    auth = get_auth(user_name, USER_PASSWORD)\n",
+    "    if len(auth) == 0:\n",
+    "        delete_user(user_name, admin_token)\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Sanity checks\n",
+    "    if auth['ca_root'] != ca_root:\n",
+    "        raise Exception('CA root mismatch')\n",
+    "    if  auth['ccf_api_onboarding_url'] != ccf_api_onboarding_url:\n",
+    "        raise Exception('CCF API onboarding URL mismatch')\n",
+    "    if auth['ccf_discover_url'] != ccf_discover_url:\n",
+    "        raise Exception('CCF discover URL mismatch')\n",
+    "    if auth['ccf_onboarding_url'] != ccf_onboarding_url:\n",
+    "        raise Exception('CCF onboarding URL mismatch')\n",
+    "    if auth['ccf_publish_url'] != ccf_publish_url:\n",
+    "        raise Exception('CCF publish URL mismatch')\n",
+    "    if auth['ccf_security_url'] != ccf_security_url:\n",
+    "        raise Exception('CCF security URL mismatch')\n",
+    "    access_token = auth['access_token']\n",
+    "\n",
+    "    # Onboad the API invoker\n",
+    "    res = onboard_invoker('API Invoker', access_token)\n",
+    "    if len(res) == 0:\n",
+    "        delete_user(user_uuid, admin_token)\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Do the discovery\n",
+    "    invoker_id = res['apiInvokerId']\n",
+    "    certs_bundle = (res['onboardingInformation']['apiInvokerCertificate'], res['csr'][1])\n",
+    "    mec_api = discover(invoker_id, certs_bundle, access_token)\n",
+    "    if len(mec_api) == 0:\n",
+    "        files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+    "        if len(files_bundle) == 0:\n",
+    "            for file in files_bundle:\n",
+    "                os.remove(file)\n",
+    "        delete_user(user_uuid, admin_token)\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Extract the URL to access to the MEC Sandbox platform\n",
+    "    addrs = extract_ipv4_and_uri(mec_api)\n",
+    "    logger.debug('addrs: ' + str(addrs))\n",
+    "\n",
+    "    time.sleep(5) # Sleep for 5 seconds\n",
+    "\n",
+    "    # Offboard the API invoker\n",
+    "    files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+    "    if len(files_bundle) == 0:\n",
+    "        for file in files_bundle:\n",
+    "            os.remove(file)\n",
+    "\n",
+    "    # Delete the invoker user\n",
+    "    delete_user(user_uuid, admin_token)\n",
+    "\n",
+    "    # Logout the invoker user\n",
+    "    process_logout()\n",
+    "\n",
+    "    # Remove the MEC profile for CAPIF API\n",
+    "    remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "  process_main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "6tJWDz4woyz1"
+   },
+   "source": [
+    "## Discoverig MEC services\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Uy-XNKA9pN5h"
+   },
+   "source": [
+    "### Invoking the MEC profile for CAPIF\n",
+    "\n",
+    "After discovering the published API, we have the information (see content of addrs data structure in previous execution) to do a request to an existing MEC Sandbox platform to get the list of the MEC services exposed (see TRY_MEC_SESSION_ID)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "ZL8Gyo0Ao2_u"
+   },
+   "outputs": [],
+   "source": [
+    "def discovering_mec_services(p_url: str) -> dict:\n",
+    "    \"\"\"\n",
+    "    To discover MEC services API\n",
+    "    :param p_url: The URL to access to the MEC Sandbox platform\n",
+    "    :return: A dictionary containing the MEC services on success, or an empty dictionary otherwise\n",
+    "    \"\"\"\n",
+    "    global logger\n",
+    "\n",
+    "    logger.debug('>>> discovering_mec_services: ' + p_url)\n",
+    "\n",
+    "    try:\n",
+    "        headers = {'Content-Type': 'application/json', 'accept': 'application/json',}\n",
+    "        logger.debug('discovering_mec_services (step1): headers: ' + str(headers))\n",
+    "        response = requests.get(p_url, headers=headers)\n",
+    "        logger.debug('discovering_mec_services (step2): result: ' + str(response.json()))\n",
+    "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+    "        if response.status_code != 200:\n",
+    "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+    "            return dict()\n",
+    "        res = json.loads(response.text)\n",
+    "        return res\n",
+    "    except requests.exceptions.RequestException as e:\n",
+    "        logger.error(f\"discovering_mec_services failed: {e}\")\n",
+    "\n",
+    "    return dict()\n",
+    "    # End of function discovering_mec_services"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "Wa_8khiGpTAa"
+   },
+   "source": [
+    "### Putting everything together\n",
+    "\n",
+    "Here is the last and complete version of our CAPIF application achieving the main objective of this tutorial: __Retrieve the MEC services exposed by an existing MEC Sandbox platform.__\n",
+    "\n",
+    "The process involves following steps:\n",
+    "- Create new User (API Provider)\n",
+    "- Onboard API Provider\n",
+    "- Publish MEC APIs on CCF\n",
+    "- Create new User (API Invoker)\n",
+    "- Onboard API Invoker\n",
+    "- Discovery of APIs by API Invoker\n",
+    "- Request Discovered API (Get MEC Services)\n",
+    "- Offboard API Invoker/API Provider\n",
+    "- Delete Users"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "id": "aTllbmoUpXKx",
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "#%%script echo skipping\n",
+    "# Comment the line above to execute this cell\n",
+    "def process_main():\n",
+    "    \"\"\"\n",
+    "    This is the fiveth sprint of our CAPIF/MEC application:\n",
+    "    - Publish the MEC profile for CAPIF API\n",
+    "    - Create a new user for the invoker\n",
+    "    - Get certificates\n",
+    "    - Onboad the API invoker\n",
+    "    - Do the discovery\n",
+    "    - Offboard the API invoker\n",
+    "    - Delete the\n",
+    "    - Logout the invoker user\n",
+    "    - Remove the MEC profile for CAPIF API\n",
+    "    \"\"\"\n",
+    "    global logger, ca_root, ccf_api_onboarding_url, ccf_discover_url, ccf_onboarding_url, ccf_publish_url, ccf_security_url\n",
+    "\n",
+    "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+    "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+    "\n",
+    "    # Publish the MEC profile for CAPIF API\n",
+    "    res = publish_api()\n",
+    "    if len(res) == 0:\n",
+    "        return\n",
+    "    api_id, bundle, prov_user_uuid, prov_admin_token = res\n",
+    "\n",
+    "    # Login for the new user for the invoker\n",
+    "    refresh_token, admin_token = process_login()\n",
+    "    if refresh_token is None:\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Create a new user for the invoker\n",
+    "    res = create_user(admin_token)\n",
+    "    if len(res) == 0:\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "    user_name, user_uuid = res\n",
+    "\n",
+    "    # Get certificates\n",
+    "    auth = get_auth(user_name, USER_PASSWORD)\n",
+    "    if len(auth) == 0:\n",
+    "        delete_user(user_name, admin_token)\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Sanity checks\n",
+    "    if auth['ca_root'] != ca_root:\n",
+    "        raise Exception('CA root mismatch')\n",
+    "    if  auth['ccf_api_onboarding_url'] != ccf_api_onboarding_url:\n",
+    "        raise Exception('CCF API onboarding URL mismatch')\n",
+    "    if auth['ccf_discover_url'] != ccf_discover_url:\n",
+    "        raise Exception('CCF discover URL mismatch')\n",
+    "    if auth['ccf_onboarding_url'] != ccf_onboarding_url:\n",
+    "        raise Exception('CCF onboarding URL mismatch')\n",
+    "    if auth['ccf_publish_url'] != ccf_publish_url:\n",
+    "        raise Exception('CCF publish URL mismatch')\n",
+    "    if auth['ccf_security_url'] != ccf_security_url:\n",
+    "        raise Exception('CCF security URL mismatch')\n",
+    "    access_token = auth['access_token']\n",
+    "\n",
+    "    # Onboad the API invoker\n",
+    "    res = onboard_invoker('API Invoker', access_token)\n",
+    "    if len(res) == 0:\n",
+    "        delete_user(user_uuid, admin_token)\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Do the discovery\n",
+    "    invoker_id = res['apiInvokerId']\n",
+    "    certs_bundle = (res['onboardingInformation']['apiInvokerCertificate'], res['csr'][1])\n",
+    "    mec_api = discover(invoker_id, certs_bundle, access_token)\n",
+    "    if len(mec_api) == 0:\n",
+    "        files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+    "        if len(files_bundle) == 0:\n",
+    "            for file in files_bundle:\n",
+    "                os.remove(file)\n",
+    "        delete_user(user_uuid, admin_token)\n",
+    "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "        return\n",
+    "\n",
+    "    # Extract the URL to access to the MEC Sandbox platform\n",
+    "    addrs = extract_ipv4_and_uri(mec_api)\n",
+    "    logger.debug('addrs: ' + str(addrs))\n",
+    "\n",
+    "    # Discovering MEC services\n",
+    "    url = ''\n",
+    "    if 'ports' in addrs:\n",
+    "        url = 'https://' + addrs['ipv4Addr'][0] + ':' + addrs['ports'][0]\n",
+    "    else:\n",
+    "        url = 'https://' + addrs['ipv4Addr'][0]\n",
+    "    url += addrs['uri'][0]\n",
+    "    mec_services = discovering_mec_services(url)\n",
+    "    if len(mec_services) != 0:\n",
+    "        logger.debug('===> The list of the MEC services exposed by ' + addrs['ipv4Addr'][0] + ' is: ' + str(mec_services))\n",
+    "\n",
+    "    # Offboard the API invoker\n",
+    "    files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+    "    if len(files_bundle) == 0:\n",
+    "        for file in files_bundle:\n",
+    "            os.remove(file)\n",
+    "\n",
+    "    # Delete the invoker user\n",
+    "    delete_user(user_uuid, admin_token)\n",
+    "\n",
+    "    # Logout the invoker user\n",
+    "    process_logout()\n",
+    "\n",
+    "    # Remove the MEC profile for CAPIF API\n",
+    "    remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+    "\n",
+    "if __name__ == '__main__':\n",
+    "    process_main()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "cfy6D8wYt5GA"
+   },
+   "source": [
+    "### What to do next\n",
+    "\n",
+    "here is a list of several additional tasks yo can do to refine our CAPIF application:\n",
+    "1. Simply the code of the process_main() function above\n",
+    "2. Find the endpoint of the MEC Location API service (MEC 013) and send a request to get the list of zones available\n",
+    "3. Create your own CAPIF application"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "id": "m_BbV7KdpX24"
+   },
+   "source": [
+    "## Conlusion: what do we learn?\n",
+    "\n",
+    "The main objective of this tutorial is to demonstrate how to use the MEC profile for CAPIF (as described in MEC 011 v3.x.x Clause 9) in a CAPIF application. Along this tutrial, we learned how to develop a basic CAPIF application, including both API provider and API invoker. We learned also how to use a published API to send REQUEST to a MEC Sandbox platform instance.\n",
+    "\n",
+    "\n",
+    "**That's all Folks**\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "colab": {
+   "private_outputs": true,
+   "provenance": [],
+   "toc_visible": true
+  },
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.11.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/examples/demo6/python/notebook/MEC application.ipynb b/examples/demo6/python/notebook/MEC application.ipynb
index c19b9722f5bc37c45481f6e24ad1f8a84b977626..6d3e3877c57bdf2dcc5cd7f1ecd1f7a6a0449b15 100644
--- a/examples/demo6/python/notebook/MEC application.ipynb	
+++ b/examples/demo6/python/notebook/MEC application.ipynb	
@@ -5,7 +5,7 @@
    "metadata": {},
    "source": [
     "# How to develop a MEC application using the MEC Sandbox HTTP REST API\n",
-    "This tutorial introduces the step by step procedure to create a basic MEC appcation following ETSI MEC standards.\n",
+    "This tutorial introduces the step by step procedure to create a basic MEC application following ETSI MEC standards.\n",
     "It uses the ETSI MEC Sandbox simulator.\n",
     "\n",
     "<div class=\"alert alert-block alert-danger\">\n",
@@ -334,8 +334,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
-    "# Uncomment the ;line above to skip execution of this cell\n",
+    "%%script echo skipping\n",
+    "# Uncomment the line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
     "    This is the skeleton of our MEC application:\n",
@@ -441,7 +441,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -621,7 +621,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -841,7 +841,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -1233,7 +1233,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -1502,7 +1502,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -1663,7 +1663,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -1749,13 +1749,13 @@
     "        logger.info('do_GET: ' + ctype)\n",
     "\n",
     "        message = ''\n",
-    "        if self.path == '/statistic/v1/quantity':\n",
+    "        if self.path == '/sandbox/v1/statistic/v1/quantity':\n",
     "            logger.info('do_GET: Computing statistic quantities for application MEC service')\n",
     "            # TODO Add logit to our MEC service\n",
     "            message = '{\"time\":20180124,\"avg\": 0.0,\"max\": 0.0,\"min\": 0.0,\"stddev\": 0.0 }'\n",
     "        else:\n",
-    "             # Send message back to client\n",
-    "            message = bytes(str(self.headers) + \"\\n\" +self.requestline +\"\\n\", 'utf8')\n",
+    "             # Send error message\n",
+    "            message = '{\"title\":\"Unknown URI\",\"type\":\"do_GET.parser\",\"status\":404 }'\n",
     "        logger.info('do_GET: message: ' + message)\n",
     "           \n",
     "        # Send response status code\n",
@@ -1767,7 +1767,7 @@
     "        self.end_headers()\n",
     "\n",
     "        # Write content as utf-8 data\n",
-    "        self.wfile.write(message)\n",
+    "        self.wfile.write(message.encode('utf8'))\n",
     "        return\n",
     "        # End of function do_GET\n",
     "\n",
@@ -1929,7 +1929,7 @@
    },
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -2077,7 +2077,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -2545,7 +2545,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -2614,7 +2614,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -3485,7 +3485,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
@@ -4511,7 +4511,7 @@
     "    data = json.loads(result.data)\n",
     "    logger.info('data: %s', str(data))\n",
     "    logger.info('=============> Execute the command: curl --request GET %s/statistic/v1/quantity --header \"Accept: application/json\" --data \\'{\"time\":20180124,\"data1\":\"[1516752000,11590.6,11616.9,11590.4,11616.9,0.25202387,1516752060,11622.4,11651.7,11622.4,11644.6,1.03977764]\"}\\'', CALLBACK_URI)\n",
-    "    time.sleep(45)\n",
+    "    time.sleep(60)\n",
     "\n",
     "    # Stop notification server\n",
     "    stop_notification_server(httpd)\n",
@@ -4667,7 +4667,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%script echo skipping\n",
+    "%%script echo skipping\n",
     "# Uncomment the ;line above to skip execution of this cell\n",
     "def process_main():\n",
     "    \"\"\"\n",
diff --git a/examples/demo6/python/notebook/images/capif.png b/examples/demo6/python/notebook/images/capif.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bf3593483ff14719e71b01332633845b057710b
Binary files /dev/null and b/examples/demo6/python/notebook/images/capif.png differ
diff --git a/go-apps/meep-ams/api/swagger.yaml b/go-apps/meep-ams/api/swagger.yaml
index dc17eb3c60484b5ce592c2029144b0e31c95d2fb..ab52abf35035f05cd8ff5cce7048073aa1f8fee3 100644
--- a/go-apps/meep-ams/api/swagger.yaml
+++ b/go-apps/meep-ams/api/swagger.yaml
@@ -1,9 +1,9 @@
 openapi: 3.0.0
 info:
   title: AdvantEDGE Application Mobility API
-  version: '2.2.1'
+  version: '3.1.1'
   description: Application Mobility Service is AdvantEDGE's implementation of [ETSI
-    MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf)
+    MEC ISG MEC021 Application Mobility API](https://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/03.01.01_60/gs_mec021v030101p.pdf)
     <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt)
     <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams)
     <p>**Type & Usage**<br>Edge Service used by edge applications that want to get
@@ -16,8 +16,8 @@ info:
     name: InterDigital AdvantEDGE Support
     email: AdvantEDGE@InterDigital.com
 externalDocs:
-  description: ETSI GS MEC 021 Application Mobility Service API, v2.2.1
-  url: https://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_mec021v020201p.pdf
+  description: ETSI GS MEC 021 Application Mobility Service API, v3.1.1
+  url: https://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/03.01.01_60/gs_mec021v030101p.pdf
 servers:
 - url: https://localhost/sandboxname/amsi/v1
   variables: {}
@@ -40,30 +40,30 @@ paths:
         explode: true
         schema:
           type: string
-      - name: all_fields
+      - name: All_fields
         in: query
         description: Include all complex attributes in the response.
         style: form
         explode: true
         schema:
           type: string
-      - name: fields
+      - name: Fields
         in: query
         description: Complex attributes to be included into the response. See clause 6.18 in ETSI GS MEC 009
         style: form
         explode: true
         schema:
           type: string
-      - name: exclude_fields
+      - name: Exclude_fields
         in: query
         description: Complex attributes to be excluded from the response.See clause 6.18 in ETSI GS MEC 009
         style: form
         explode: true
         schema:
           type: string
-      - name: exclude_default
+      - name: Exclude_default
         in: query
-        description: Indicates to exclude the following complex attributes from the response  See clause 6.18 in ETSI GS MEC 011 for details.
+        description: Indicates to exclude the following complex attributes from the response  See clause 6.18 in ETSI GS MEC 009 for details.
         style: form
         explode: true
         schema:
@@ -133,35 +133,35 @@ paths:
       parameters:
       - name: filter
         in: query
-        description: Attribute-based filtering parameters according to ETSI GS MEC 011
+        description: Attribute-based filtering parameters, according to ETSI GS MEC 009, use the format (op,attr,value)
         style: form
         explode: true
         schema:
           type: string
-      - name: all_fields
+      - name: All_fields
         in: query
-        description: Include all complex attributes in the response.
+        description: Include all complex attributes in the response. e.g., All_Fields.
         style: form
         explode: true
         schema:
           type: string
-      - name: fields
+      - name: Fields
         in: query
-        description: Complex attributes to be included into the response. See clause 6.18 in ETSI GS MEC 011
+        description: Complex attributes to be included in the response (see Clause 6.18 in ETSI GS MEC 009), e.g., att or att/subatt.
         style: form
         explode: true
         schema:
           type: string
-      - name: exclude_fields
+      - name: Exclude_fields
         in: query
-        description: Complex attributes to be excluded from the response.See clause 6.18 in ETSI GS MEC 011
+        description: Complex attributes to be excluded in the response (see Clause 6.18 in ETSI GS MEC 009), e.g., att or att/subatt.
         style: form
         explode: true
         schema:
           type: string
-      - name: exclude_default
+      - name: Exclude_default
         in: query
-        description: Indicates to exclude the following complex attributes from the response  See clause 6.18 in ETSI GS MEC 011 for details.
+        description: Indicates to exclude the following complex attributes from the response  See clause 6.18 in ETSI GS MEC 009 for details.
         style: form
         explode: true
         schema:
diff --git a/go-apps/meep-ams/server/ams.go b/go-apps/meep-ams/server/ams.go
index e6e04c7dd1c58803ba6f9c4d67c85b63ca9437e9..0123bd8b849021fee8b44d0e4623daf7afcb6b74 100644
--- a/go-apps/meep-ams/server/ams.go
+++ b/go-apps/meep-ams/server/ams.go
@@ -28,6 +28,7 @@ import (
 	"net/http"
 	"net/url"
 	"os"
+	"regexp"
 	"sort"
 	"strconv"
 	"strings"
@@ -148,6 +149,19 @@ func notImplemented(w http.ResponseWriter, r *http.Request) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
+type RegisterationInfoList struct {
+	Registrations []RegistrationInfo
+	Filters       *FilterParameters
+}
+
+type FilterParameters struct {
+	filter          string
+	all_fields      string
+	fields          string
+	exclude_fields  string
+	exclude_default string
+}
+
 // Init - App Mobility Service initialization
 func Init() (err error) {
 
@@ -1205,8 +1219,10 @@ func subscriptionLinkListSubscriptionsGet(w http.ResponseWriter, r *http.Request
 	u, _ := url.Parse(r.URL.String())
 	q := u.Query()
 	validQueryParams := []string{"subscriptionType"}
-	if !validateQueryParams(q, validQueryParams) {
-		w.WriteHeader(http.StatusBadRequest)
+	err := validateQueryParams(q, validQueryParams)
+	if err != nil {
+
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
 		return
 	}
 
@@ -1473,20 +1489,51 @@ func appMobilityServiceByIdDELETE(w http.ResponseWriter, r *http.Request) {
 }
 
 func appMobilityServiceGET(w http.ResponseWriter, r *http.Request) {
+
 	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
 
+	// Validate query parameters
+	u, _ := url.Parse(r.URL.String())
+	q := u.Query()
+	validParams := []string{"filter", "All_fields", "Fields", "Exclude_fields", "Exclude_default"}
+	err := validateQueryParams(q, validParams)
+	if err != nil {
+		print("Query Parameter error")
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	// Parse query parameters
+	urlFilter := q.Get("filter")
+	urlAllFields := q.Get("All_fields")
+	urlfields := q.Get("Fields")
+	urlExcludeFields := q.Get("Exclude_fields")
+	urlExcludeDefault := q.Get("Exclude_default")
+	regInfoList := &RegisterationInfoList{
+		Filters: &FilterParameters{
+			filter:          urlFilter,
+			all_fields:      urlAllFields,
+			fields:          urlfields,
+			exclude_fields:  urlExcludeFields,
+			exclude_default: urlExcludeDefault,
+		},
+		Registrations: make([]RegistrationInfo, 0),
+	}
+
 	// Get all AMS Registration Info
-	regInfoList := make([]RegistrationInfo, 0)
+	//regInfoList := make([]RegistrationInfo, 0)
 	key := baseKey + "svc:*:info"
-	err := rc.ForEachJSONEntry(key, populateRegInfoList, &regInfoList)
+
+	err = rc.ForEachJSONEntry(key, populateRegInfoList, regInfoList)
+
 	if err != nil {
 		log.Error(err.Error())
 		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
 
-	// Send response
-	jsonResponse, err := json.Marshal(regInfoList)
+	// Prepare & send response
+	jsonResponse, err := json.Marshal(regInfoList.Registrations)
 	if err != nil {
 		log.Error(err.Error())
 		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
@@ -1498,9 +1545,9 @@ func appMobilityServiceGET(w http.ResponseWriter, r *http.Request) {
 }
 
 func populateRegInfoList(key string, jsonEntry string, response interface{}) error {
-	regInfoList := response.(*[]RegistrationInfo)
-	if regInfoList == nil {
-		return errors.New("Response not defined")
+	data := response.(*RegisterationInfoList)
+	if data == nil {
+		return errors.New("response not defined")
 	}
 
 	// Retrieve registration info from DB
@@ -1509,7 +1556,202 @@ func populateRegInfoList(key string, jsonEntry string, response interface{}) err
 	if err != nil {
 		return err
 	}
-	*regInfoList = append(*regInfoList, regInfo)
+
+	// Filter services
+	if data.Filters != nil {
+
+		// Filter Paramter
+		if data.Filters.filter != "" {
+			filterField := data.Filters.filter
+			// Split filterField into operator, attribute, and value
+			operator, attribute, value, _ := parseFilter(filterField)
+
+			// Apply filters based on attribute
+			switch attribute {
+			case "appMobilityServiceId":
+				if !applyStringFilter(operator, regInfo.AppMobilityServiceId, value) {
+					return nil
+				}
+
+			case "serviceConsumerId/appInstanceId":
+				if !applyStringFilter(operator, regInfo.ServiceConsumerId.AppInstanceId, value) {
+					return nil
+				}
+
+			case "serviceConsumerId/mepId":
+				if !applyStringFilter(operator, regInfo.ServiceConsumerId.MepId, value) {
+					return nil
+				}
+
+			case "deviceInformation/associateId":
+				matched := false
+				for _, deviceInfo := range regInfo.DeviceInformation {
+					if applyStringFilter(operator, deviceInfo.AssociateId.Value, value) {
+						matched = true
+						break
+					}
+				}
+				if !matched {
+					return nil
+				}
+
+			case "deviceInformation/appMobilityServiceLevel":
+				matched := false
+				for _, deviceInfo := range regInfo.DeviceInformation {
+					if applyStringFilter(operator, string(*deviceInfo.AppMobilityServiceLevel), value) {
+						matched = true
+						break
+					}
+				}
+				if !matched {
+					return nil
+				}
+
+			case "deviceInformation/contextTransferState":
+				matched := false
+				for _, deviceInfo := range regInfo.DeviceInformation {
+					if applyEnumFilter(operator, string(*deviceInfo.ContextTransferState), value) {
+						matched = true
+						break
+					}
+				}
+				if !matched {
+					return nil
+				}
+
+			case "expiryTime":
+				expiryTime, err := strconv.ParseUint(value, 10, 32)
+				if err != nil {
+					return nil
+				}
+				if !applyNumericFilter(operator, uint32(regInfo.ExpiryTime), uint32(expiryTime)) {
+					return nil
+				}
+
+			default:
+				return nil
+			}
+
+		}
+
+		// Handle Fields Parameter (Include ALL fields)
+		if data.Filters.all_fields != "" && data.Filters.all_fields != "All_fields" {
+			return nil
+		}
+
+		// Handle Fields Parameter
+		if data.Filters.fields != "" {
+			fields := strings.Split(data.Filters.fields, ",")
+			filteredRegInfo := RegistrationInfo{}
+
+			for _, field := range fields {
+				switch field {
+				case "appMobilityServiceId":
+					filteredRegInfo.AppMobilityServiceId = regInfo.AppMobilityServiceId
+
+				case "serviceConsumerId/appInstanceId":
+					// if filteredRegInfo.ServiceConsumerId == nil {
+					// 	filteredRegInfo.ServiceConsumerId = &RegistrationInfoServiceConsumerId{}
+					// }
+					if regInfo.ServiceConsumerId.AppInstanceId != "" {
+						filteredRegInfo.ServiceConsumerId.AppInstanceId = regInfo.ServiceConsumerId.AppInstanceId
+					}
+
+				case "serviceConsumerId/mepId":
+					// if filteredRegInfo.ServiceConsumerId == nil {
+					// 	filteredRegInfo.ServiceConsumerId = &RegistrationInfoServiceConsumerId{}
+					// }
+					if regInfo.ServiceConsumerId.MepId != "" {
+						filteredRegInfo.ServiceConsumerId.MepId = regInfo.ServiceConsumerId.MepId
+					}
+
+				case "deviceInformation/associateId":
+					for _, deviceInfo := range regInfo.DeviceInformation {
+						if deviceInfo.AssociateId.Value != "" {
+							filteredDeviceInfo := RegistrationInfoDeviceInformation{
+								AssociateId: deviceInfo.AssociateId,
+							}
+							filteredRegInfo.DeviceInformation = append(filteredRegInfo.DeviceInformation, filteredDeviceInfo)
+						}
+					}
+
+				case "deviceInformation/appMobilityServiceLevel":
+					for _, deviceInfo := range regInfo.DeviceInformation {
+						if *deviceInfo.AppMobilityServiceLevel != "" {
+							filteredDeviceInfo := RegistrationInfoDeviceInformation{
+								AppMobilityServiceLevel: deviceInfo.AppMobilityServiceLevel,
+							}
+							filteredRegInfo.DeviceInformation = append(filteredRegInfo.DeviceInformation, filteredDeviceInfo)
+						}
+					}
+
+				case "deviceInformation/contextTransferState":
+					for _, deviceInfo := range regInfo.DeviceInformation {
+						if *deviceInfo.ContextTransferState != "" {
+							filteredDeviceInfo := RegistrationInfoDeviceInformation{
+								ContextTransferState: deviceInfo.ContextTransferState,
+							}
+							filteredRegInfo.DeviceInformation = append(filteredRegInfo.DeviceInformation, filteredDeviceInfo)
+						}
+					}
+
+				case "expiryTime":
+					//Logic
+					if string(regInfo.ExpiryTime) != "" {
+						filteredRegInfo.ExpiryTime = regInfo.ExpiryTime
+					}
+
+				}
+				// Replace regInfo with the filtered version
+
+			}
+			regInfo = filteredRegInfo
+		}
+
+		// Handle Exclude Fields Parameter (Exclude specified fields)
+		if data.Filters.exclude_fields != "" {
+			excludeFields := strings.Split(data.Filters.exclude_fields, ",")
+			filteredRegInfo := regInfo
+
+			// Exclude the listed fields
+			for _, field := range excludeFields {
+				switch field {
+				case "appMobilityServiceId":
+					filteredRegInfo.AppMobilityServiceId = "" // Exclude this field
+				case "serviceConsumerId/appInstanceId":
+					if filteredRegInfo.ServiceConsumerId != nil {
+						filteredRegInfo.ServiceConsumerId.AppInstanceId = "" // Exclude this field
+					}
+				case "serviceConsumerId/mepId":
+					if filteredRegInfo.ServiceConsumerId != nil {
+						filteredRegInfo.ServiceConsumerId.MepId = "" // Exclude this field
+					}
+				case "deviceInformation/associateId":
+					for i := range filteredRegInfo.DeviceInformation {
+						filteredRegInfo.DeviceInformation[i].AssociateId = nil // Exclude this field
+					}
+				case "deviceInformation/appMobilityServiceLevel":
+					for i := range filteredRegInfo.DeviceInformation {
+						filteredRegInfo.DeviceInformation[i].AppMobilityServiceLevel = nil // Exclude this field
+					}
+				case "deviceInformation/contextTransferState":
+					for i := range filteredRegInfo.DeviceInformation {
+						filteredRegInfo.DeviceInformation[i].ContextTransferState = nil // Exclude this field
+					}
+				case "expiryTime":
+					filteredRegInfo.ExpiryTime = 0 // Exclude this field
+				}
+			}
+
+			// Replace regInfo with the filtered version based on exclude_fields parameter
+			regInfo = filteredRegInfo
+		}
+
+		// Handle Exclude Fields default Parameter (Exclude specified fields)
+
+	}
+	// Returning Data
+	data.Registrations = append(data.Registrations, regInfo)
 	return nil
 }
 
@@ -2324,21 +2566,22 @@ func delTrackedDevInfo(svcId string, address string) error {
 	return nil
 }
 
-func validateQueryParams(params url.Values, validParamList []string) bool {
+func validateQueryParams(params url.Values, validParams []string) error {
 	for param := range params {
 		found := false
-		for _, validParam := range validParamList {
+		for _, validParam := range validParams {
 			if param == validParam {
 				found = true
 				break
 			}
 		}
 		if !found {
-			log.Error("Invalid query param: ", param)
-			return false
+			err := errors.New("Invalid query param: " + param)
+			log.Error(err.Error())
+			return err
 		}
 	}
-	return true
+	return nil
 }
 
 func validateQueryParamValue(val string, validValues []string) bool {
@@ -2370,3 +2613,92 @@ func errHandlerProblemDetails(w http.ResponseWriter, error string, code int) {
 	w.WriteHeader(code)
 	fmt.Fprint(w, jsonResponse)
 }
+
+func parseFilter(filterField string) (string, string, string, error) {
+	// Regular expression to match the filter format
+	re := regexp.MustCompile(`^(eq|neq|gt|lt|gte|lte|in|nin|cont|ncont),([a-zA-Z0-9/]+),([^,]+)(?:,([^,]+))?$`)
+
+	// Trim any surrounding parentheses
+	filterField = strings.Trim(filterField, "()")
+
+	// Match the filterField against the regular expression
+	matches := re.FindStringSubmatch(filterField)
+	if len(matches) < 3 {
+		return "", "", "", nil
+	}
+
+	// Extract the operator, attribute, and value(s)
+	operator := matches[1]
+	attribute := matches[2]
+	value := matches[3]
+
+	// If there's a second value (for operators like "in" or "nin"), handle it
+	if len(matches) > 4 && matches[4] != "" {
+		value += "," + matches[4]
+	}
+
+	return operator, attribute, value, nil
+}
+
+// Helper functions for applying filters
+func applyStringFilter(operator, fieldValue, filterValue string) bool {
+	switch operator {
+	case "eq":
+		return fieldValue == filterValue
+	case "neq":
+		return fieldValue != filterValue
+	case "cont":
+		return strings.Contains(fieldValue, filterValue)
+	case "ncont":
+		return !strings.Contains(fieldValue, filterValue)
+	case "in":
+		values := strings.Split(filterValue, ",")
+		for _, v := range values {
+			if fieldValue == v {
+				return true
+			}
+		}
+		return false
+	case "nin":
+		values := strings.Split(filterValue, ",")
+		for _, v := range values {
+			if fieldValue == v {
+				return false
+			}
+		}
+		return true
+	case "gt":
+		return fieldValue > filterValue
+	case "gte":
+		return fieldValue >= filterValue
+	case "lt":
+		return fieldValue < filterValue
+	case "lte":
+		return fieldValue <= filterValue
+	default:
+		return false
+	}
+}
+
+func applyEnumFilter(operator, fieldValue, filterValue string) bool {
+	return applyStringFilter(operator, fieldValue, filterValue)
+}
+
+func applyNumericFilter(operator string, fieldValue, filterValue uint32) bool {
+	switch operator {
+	// case "eq":
+	// 	return fieldValue == filterValue
+	// case "neq":
+	// 	return fieldValue != filterValue
+	case "gt":
+		return fieldValue > filterValue
+	case "gte":
+		return fieldValue >= filterValue
+	case "lt":
+		return fieldValue < filterValue
+	case "lte":
+		return fieldValue <= filterValue
+	default:
+		return false
+	}
+}
diff --git a/go-apps/meep-ams/server/api_amsi.go b/go-apps/meep-ams/server/api_amsi.go
index 6031d67cdbd0ab28e3ebdb0f7c0e6dd5060607eb..e4ba29eadde13094677f4657517a029317fdbc1b 100644
--- a/go-apps/meep-ams/server/api_amsi.go
+++ b/go-apps/meep-ams/server/api_amsi.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/api_unsupported.go b/go-apps/meep-ams/server/api_unsupported.go
index 8ec5a84cb53e78601050f6fe88481068b347d283..e506857b2bfcc86e7e9a6ea32130412784ee5831 100644
--- a/go-apps/meep-ams/server/api_unsupported.go
+++ b/go-apps/meep-ams/server/api_unsupported.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/backup.go b/go-apps/meep-ams/server/backup.go
new file mode 100644
index 0000000000000000000000000000000000000000..abb4e431abd516750a5a1e5e2b77073c236b8f9e
--- /dev/null
+++ b/go-apps/meep-ams/server/backup.go
@@ -0,0 +1 @@
+package server
diff --git a/go-apps/meep-ams/server/logger.go b/go-apps/meep-ams/server/logger.go
index c5a73ff34585b3633b998ea4ed61d87d2c2dc77f..38c32dbca6e29efd5023ffd8d3a0060ce01657e5 100644
--- a/go-apps/meep-ams/server/logger.go
+++ b/go-apps/meep-ams/server/logger.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_adjacent_app_info_notification.go b/go-apps/meep-ams/server/model_adjacent_app_info_notification.go
index 0a48637f42fadb48aec3a1920ea37cd70df2fc27..7bacaf62d1e42297fb101b0226b8a1f82640be2d 100644
--- a/go-apps/meep-ams/server/model_adjacent_app_info_notification.go
+++ b/go-apps/meep-ams/server/model_adjacent_app_info_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_adjacent_app_info_notification_adjacent_app_info.go b/go-apps/meep-ams/server/model_adjacent_app_info_notification_adjacent_app_info.go
index ce78d8249074738d4fe0fb61a8be6521c2b826a5..26325a4e86ef13639cf78f5da4d606d436f35179 100644
--- a/go-apps/meep-ams/server/model_adjacent_app_info_notification_adjacent_app_info.go
+++ b/go-apps/meep-ams/server/model_adjacent_app_info_notification_adjacent_app_info.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_adjacent_app_info_subscription.go b/go-apps/meep-ams/server/model_adjacent_app_info_subscription.go
index 81b575be63d1d765be548db30d79d62807ddb3ee..b97798845e518502f63c73c8823c2ef4a020e72a 100644
--- a/go-apps/meep-ams/server/model_adjacent_app_info_subscription.go
+++ b/go-apps/meep-ams/server/model_adjacent_app_info_subscription.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_adjacent_app_info_subscription_filter_criteria.go b/go-apps/meep-ams/server/model_adjacent_app_info_subscription_filter_criteria.go
index 71c90e00d6d612936b755a307309e960ad301e2c..ee4a1abc4abead1e8dd896f50c8e1df537f9f2ba 100644
--- a/go-apps/meep-ams/server/model_adjacent_app_info_subscription_filter_criteria.go
+++ b/go-apps/meep-ams/server/model_adjacent_app_info_subscription_filter_criteria.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_adjacent_app_info_subscription_links.go b/go-apps/meep-ams/server/model_adjacent_app_info_subscription_links.go
index 123c35744c574b011152c630630bbe8f3f7fdc48..7a1f493822382fa47a6d08de752fc6af838072c8 100644
--- a/go-apps/meep-ams/server/model_adjacent_app_info_subscription_links.go
+++ b/go-apps/meep-ams/server/model_adjacent_app_info_subscription_links.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_adjacent_app_instance_info.go b/go-apps/meep-ams/server/model_adjacent_app_instance_info.go
index 607c4702aa253fbfee4b9acb7036542f9741c3ca..ec7a4ad9a73872b5c77686f0fa00a067e558aa79 100644
--- a/go-apps/meep-ams/server/model_adjacent_app_instance_info.go
+++ b/go-apps/meep-ams/server/model_adjacent_app_instance_info.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_app_mobility_service_level.go b/go-apps/meep-ams/server/model_app_mobility_service_level.go
index 3bdf477dc680218855b5a1018d4a2402c3acd6fa..a59b7a2752f71ba48348aefee6b5b3174ecaccee 100644
--- a/go-apps/meep-ams/server/model_app_mobility_service_level.go
+++ b/go-apps/meep-ams/server/model_app_mobility_service_level.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_app_termination_notification.go b/go-apps/meep-ams/server/model_app_termination_notification.go
index 9f3da662570cc5e86948da8b4a27297394e4f1f5..96b5afc526a7d1b07b8af3da462851f948f22aa6 100644
--- a/go-apps/meep-ams/server/model_app_termination_notification.go
+++ b/go-apps/meep-ams/server/model_app_termination_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_app_termination_notification__links.go b/go-apps/meep-ams/server/model_app_termination_notification__links.go
index 7287931a395448d8b64f8de6fa6b8cdb32828642..3dbe215e0cf725031a30d51cdf4b2725ffddaf43 100644
--- a/go-apps/meep-ams/server/model_app_termination_notification__links.go
+++ b/go-apps/meep-ams/server/model_app_termination_notification__links.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_associate_id.go b/go-apps/meep-ams/server/model_associate_id.go
index 89d553ef685fc6b3fdbe4be04aac0f171677ded5..12b49c57715ed2d03d169c3674115aa317920a93 100644
--- a/go-apps/meep-ams/server/model_associate_id.go
+++ b/go-apps/meep-ams/server/model_associate_id.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_associate_id_type.go b/go-apps/meep-ams/server/model_associate_id_type.go
index 329ad9bb5015c19311a92aa0e43a4ef6f88c7093..92700ce4db5eac9ba4daf5f6625aa863a20636d8 100644
--- a/go-apps/meep-ams/server/model_associate_id_type.go
+++ b/go-apps/meep-ams/server/model_associate_id_type.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_communication_interface.go b/go-apps/meep-ams/server/model_communication_interface.go
index 028c8e13893460d313be0018040b827db5be6679..e842c2627683a142d768c728673340212647b08d 100644
--- a/go-apps/meep-ams/server/model_communication_interface.go
+++ b/go-apps/meep-ams/server/model_communication_interface.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_communication_interface_ip_addresses.go b/go-apps/meep-ams/server/model_communication_interface_ip_addresses.go
index 38e94df10c8dcda3407687a3a43ef952aa97c5f6..fe0959c21565ff57c0d7fc9c4f6995e40b835778 100644
--- a/go-apps/meep-ams/server/model_communication_interface_ip_addresses.go
+++ b/go-apps/meep-ams/server/model_communication_interface_ip_addresses.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_context_transfer_state.go b/go-apps/meep-ams/server/model_context_transfer_state.go
index 2d80ed20a0a8a5176fe02ef2e3529b5f70760ddf..7bc47d626a88dc0e5e858bb6230b2ba324723d4f 100644
--- a/go-apps/meep-ams/server/model_context_transfer_state.go
+++ b/go-apps/meep-ams/server/model_context_transfer_state.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_expiry_notification.go b/go-apps/meep-ams/server/model_expiry_notification.go
index 11cb2d4a86914eb6510a528fd8d20dc01f8deef4..ced3ec82b91337ed7d9975003d34d4ebf268d365 100644
--- a/go-apps/meep-ams/server/model_expiry_notification.go
+++ b/go-apps/meep-ams/server/model_expiry_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_inline_notification.go b/go-apps/meep-ams/server/model_inline_notification.go
index efa3570bb1864cb1d3c44bc2d99b8aea479c54f4..eb6cadfb607127c8393af3e23b150e251e292793 100644
--- a/go-apps/meep-ams/server/model_inline_notification.go
+++ b/go-apps/meep-ams/server/model_inline_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_inline_subscription.go b/go-apps/meep-ams/server/model_inline_subscription.go
index 95d96d07f07088eeaf520c547dc9457f5f7877d7..83b523c25db15d45b4c190ae665c1c1447047f7b 100644
--- a/go-apps/meep-ams/server/model_inline_subscription.go
+++ b/go-apps/meep-ams/server/model_inline_subscription.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_link.go b/go-apps/meep-ams/server/model_link.go
index e864c198967f781616ded5df3974196dbd84b381..14af44fd7675d9f9b2a89e5066a6a9ab718e97a3 100644
--- a/go-apps/meep-ams/server/model_link.go
+++ b/go-apps/meep-ams/server/model_link.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_link_type.go b/go-apps/meep-ams/server/model_link_type.go
index d812ac8162a435750086634a79dde3a2e7011f17..a0e9f5a6fb7361b39d90f75d333e9d27b269e544 100644
--- a/go-apps/meep-ams/server/model_link_type.go
+++ b/go-apps/meep-ams/server/model_link_type.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mec_host_information.go b/go-apps/meep-ams/server/model_mec_host_information.go
index e9326dc340f6751292933fa064b5865539096dd0..a87ff97bbaf486e8fc057c14a24a94a13885dc9d 100644
--- a/go-apps/meep-ams/server/model_mec_host_information.go
+++ b/go-apps/meep-ams/server/model_mec_host_information.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mobility_procedure_notification.go b/go-apps/meep-ams/server/model_mobility_procedure_notification.go
index ff90a8a11d8f9e6c44c939049e4570e4886800b1..2585774754635ab65225c5af5c6a8cccfc27827b 100644
--- a/go-apps/meep-ams/server/model_mobility_procedure_notification.go
+++ b/go-apps/meep-ams/server/model_mobility_procedure_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mobility_procedure_notification_target_app_info.go b/go-apps/meep-ams/server/model_mobility_procedure_notification_target_app_info.go
index 7515c2eef24548c6fda03e8f1d7b41aef3b13931..7b19b4b10061bc2cdf8ef83b464f8a56c8ad7c7b 100644
--- a/go-apps/meep-ams/server/model_mobility_procedure_notification_target_app_info.go
+++ b/go-apps/meep-ams/server/model_mobility_procedure_notification_target_app_info.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mobility_procedure_subscription.go b/go-apps/meep-ams/server/model_mobility_procedure_subscription.go
index ec7828ded1d0658f58e135a45aa8f0a633cca709..5492d708b622a1e0d2662a9999b11bce7e81adc1 100644
--- a/go-apps/meep-ams/server/model_mobility_procedure_subscription.go
+++ b/go-apps/meep-ams/server/model_mobility_procedure_subscription.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mobility_procedure_subscription_filter_criteria.go b/go-apps/meep-ams/server/model_mobility_procedure_subscription_filter_criteria.go
index a24757e3e4279d7e62b94db7eafeea12d2436e89..3bf738c1960dd435ac4d11ea6c6d558438358285 100644
--- a/go-apps/meep-ams/server/model_mobility_procedure_subscription_filter_criteria.go
+++ b/go-apps/meep-ams/server/model_mobility_procedure_subscription_filter_criteria.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mobility_procedure_subscription_links.go b/go-apps/meep-ams/server/model_mobility_procedure_subscription_links.go
index 8cce93b4ec71ae1b261389d60e805ca62dc4b657..8d54fc712783b8cb58e34c6addcc71e681c33ab9 100644
--- a/go-apps/meep-ams/server/model_mobility_procedure_subscription_links.go
+++ b/go-apps/meep-ams/server/model_mobility_procedure_subscription_links.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_mobility_status.go b/go-apps/meep-ams/server/model_mobility_status.go
index f787024027dfe86a5d38aab76834864c2dc4bf0d..9da7212f1bc7e2d0ff9cb0e1221d63a7044a45e1 100644
--- a/go-apps/meep-ams/server/model_mobility_status.go
+++ b/go-apps/meep-ams/server/model_mobility_status.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_one_of_inline_notification.go b/go-apps/meep-ams/server/model_one_of_inline_notification.go
index c8b870189ea01954db5e44092b83c4e5db285c3a..98744a2c5026f4501811a313e8f2b7938aa31997 100644
--- a/go-apps/meep-ams/server/model_one_of_inline_notification.go
+++ b/go-apps/meep-ams/server/model_one_of_inline_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_one_of_inline_subscription.go b/go-apps/meep-ams/server/model_one_of_inline_subscription.go
index a2486df2bc7c12622405d5aa032f13565dc3b21c..ac4925f2b3ecd29386562ba86863166db5fdcf16 100644
--- a/go-apps/meep-ams/server/model_one_of_inline_subscription.go
+++ b/go-apps/meep-ams/server/model_one_of_inline_subscription.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_operation_action_type.go b/go-apps/meep-ams/server/model_operation_action_type.go
index 4b1880c2c05287e4bbef58be6988dc4a8884ec7a..c95c033ab5d9779269aa2e8ee844f2566ce08647 100644
--- a/go-apps/meep-ams/server/model_operation_action_type.go
+++ b/go-apps/meep-ams/server/model_operation_action_type.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_problem_details.go b/go-apps/meep-ams/server/model_problem_details.go
index 10ca515580cfa485c604fb02f7d1582b3501007d..f451c100a672d10df3a96baae7ae9ec3570b37c4 100644
--- a/go-apps/meep-ams/server/model_problem_details.go
+++ b/go-apps/meep-ams/server/model_problem_details.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_registration_info.go b/go-apps/meep-ams/server/model_registration_info.go
index a172f9256712e13a9686030523b1636614678709..fda8ed3f07934e5ecdbfb67d744bba53206b55ea 100644
--- a/go-apps/meep-ams/server/model_registration_info.go
+++ b/go-apps/meep-ams/server/model_registration_info.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_registration_info_device_information.go b/go-apps/meep-ams/server/model_registration_info_device_information.go
index 2bd5c0183d9466aeb344737c78349caba4efa244..3507a2aebb90dc3ec84c921d1ad6692d2b2c8c5e 100644
--- a/go-apps/meep-ams/server/model_registration_info_device_information.go
+++ b/go-apps/meep-ams/server/model_registration_info_device_information.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_registration_info_service_consumer_id.go b/go-apps/meep-ams/server/model_registration_info_service_consumer_id.go
index 2924164ef462e7cf1a32630b147ce26dd9c720ad..eb485a72d7968ff88b712cab54499b4477af56ea 100644
--- a/go-apps/meep-ams/server/model_registration_info_service_consumer_id.go
+++ b/go-apps/meep-ams/server/model_registration_info_service_consumer_id.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_subscription_link_list.go b/go-apps/meep-ams/server/model_subscription_link_list.go
index 30c277c09d7b760f26b7e0922ee87dc930a1ebf6..01851689829eebe942bb0d99fc2709cc9010ed65 100644
--- a/go-apps/meep-ams/server/model_subscription_link_list.go
+++ b/go-apps/meep-ams/server/model_subscription_link_list.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_subscription_link_list_links.go b/go-apps/meep-ams/server/model_subscription_link_list_links.go
index 576ae04c883d24d5611721831c6d1edc9e69d6ae..666a5bfe25b5a83a61029812b6920c129607d17e 100644
--- a/go-apps/meep-ams/server/model_subscription_link_list_links.go
+++ b/go-apps/meep-ams/server/model_subscription_link_list_links.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_subscription_link_list_subscription.go b/go-apps/meep-ams/server/model_subscription_link_list_subscription.go
index bd29fc4fb2befa4c1f4c01f7645bd487d416824a..89b80580e86067ec7a10e7073fae9889f28743e4 100644
--- a/go-apps/meep-ams/server/model_subscription_link_list_subscription.go
+++ b/go-apps/meep-ams/server/model_subscription_link_list_subscription.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_subscription_type.go b/go-apps/meep-ams/server/model_subscription_type.go
index aa34777c8a03fcbeda55c3e20601b6f07ec749d5..c0c996e1a8d4427348b8941e41bec752264a72fb 100644
--- a/go-apps/meep-ams/server/model_subscription_type.go
+++ b/go-apps/meep-ams/server/model_subscription_type.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_test_notification.go b/go-apps/meep-ams/server/model_test_notification.go
index 55749ad09edf786b71b66a168bc184c877e182b4..3c59623289e4a5c1e093e9ed384327b4122a34b5 100644
--- a/go-apps/meep-ams/server/model_test_notification.go
+++ b/go-apps/meep-ams/server/model_test_notification.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_test_notification__links.go b/go-apps/meep-ams/server/model_test_notification__links.go
index cef23f442439c22644c5ee030587e8349511ae53..852dab9964ac50dcbbc38721362ab76f6a7fe295 100644
--- a/go-apps/meep-ams/server/model_test_notification__links.go
+++ b/go-apps/meep-ams/server/model_test_notification__links.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_time_stamp.go b/go-apps/meep-ams/server/model_time_stamp.go
index 46e31b7ebcf97522e529f9331b577fb1759f4c09..a3a6e5f923e51dd94df6541128ff3112fb8cffcc 100644
--- a/go-apps/meep-ams/server/model_time_stamp.go
+++ b/go-apps/meep-ams/server/model_time_stamp.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/model_websock_notif_config.go b/go-apps/meep-ams/server/model_websock_notif_config.go
index 403bb1015c2f3b278cab1557874a8512421f0502..b5b30991d908214c8694617a5f2e54d85e1e917c 100644
--- a/go-apps/meep-ams/server/model_websock_notif_config.go
+++ b/go-apps/meep-ams/server/model_websock_notif_config.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-ams/server/routers.go b/go-apps/meep-ams/server/routers.go
index ce1eb3d9e3d6352cf522279b90701a56877f8e3f..e99757f7be5e0b2089e9a07601d1313296de6bc0 100644
--- a/go-apps/meep-ams/server/routers.go
+++ b/go-apps/meep-ams/server/routers.go
@@ -17,7 +17,7 @@
  *
  * Application Mobility Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC021 Application Mobility API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/021/02.02.01_60/gs_MEC021v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-ams](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-ams) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about application mobility in the network <p>**Note**<br>AdvantEDGE supports a selected subset of Application Mobility API endpoints (see below).
  *
- * API version: 2.2.1
+ * API version: 3.1.1
  * Contact: AdvantEDGE@InterDigital.com
  * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
  */
diff --git a/go-apps/meep-app-enablement/api/app-support/swagger.yaml b/go-apps/meep-app-enablement/api/app-support/swagger.yaml
index fb7bb25dd0d093ab345959e2a8a5e9bc7940332a..a359f5ed5510426771027e1d7916c47dcf9dfdbb 100644
--- a/go-apps/meep-app-enablement/api/app-support/swagger.yaml
+++ b/go-apps/meep-app-enablement/api/app-support/swagger.yaml
@@ -23,6 +23,7 @@ servers:
 tags:
   - name: mec_app_support
   - name: unsupported
+  - name: Service Provisioning, EEC Registration, and ECS Discovery
   - name: callbacks
 paths:
   /applications/{appInstanceId}/traffic_rules:
@@ -1067,9 +1068,9 @@ paths:
         - mec_app_support
       summary: Register the MEC application instance to the MEC platform
       description: >-
-        The POST method may be used by the MEC application instance to request its registration to the MEC platform. 
+        The POST method may be used by the MEC application instance to request its registration to the MEC platform.
       operationId: ApplicationsRegistrations_POST
-      parameters: [] 
+      parameters: []
       requestBody:
         description: >-
           The message content in the request contains the profile of the MEC application instance, calling the MEC platform to register the MEC application instance.
@@ -1077,7 +1078,96 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/AppInfo'
-        required: false
+            example:
+              appName: "appName"
+              appProvider: "appProvider1"
+              appCategory:
+                href: "/example/catalogue1"
+                id: "id12345"
+                name: "RNI"
+                version: "version1"
+              appDId: "TODO"
+              appInstanceId: "ID1"
+              endpoint:
+                uris:
+                  - "mecAppSuptApi/example"
+              appServiceRequired:
+                - requestedPermissions: "string"
+                  serCategory:
+                    href: "/example/catalogue1"
+                    id: "id12345"
+                    name: "RNI"
+                    version: "version1"
+                  serName: "string"
+                  serTransportDependencies:
+                    - labels:
+                        - "string"
+                      serializers:
+                        - "JSON"
+                      transport:
+                        protocol: "string"
+                        security:
+                          oAuth2Info:
+                            grantTypes:
+                              - "OAUTH2_CLIENT_CREDENTIALS"
+                            tokenEndpoint: "/mecSerMgmtApi/security/TokenEndPoint"
+                        type: "REST_HTTP"
+                        version: "string"
+                  version: "string"
+              appServiceOptional:
+                - requestedPermissions: "string"
+                  serCategory:
+                    href: "/example/catalogue1"
+                    id: "id12345"
+                    name: "RNI"
+                    version: "version1"
+                  serName: "string"
+                  serTransportDependencies:
+                    - labels:
+                        - "string"
+                      serializers:
+                        - "JSON"
+                      transport:
+                        protocol: "string"
+                        security:
+                          oAuth2Info:
+                            grantTypes:
+                              - "OAUTH2_CLIENT_CREDENTIALS"
+                            tokenEndpoint: "/mecSerMgmtApi/security/TokenEndPoint"
+                        type: "REST_HTTP"
+                        version: "string"
+                  version: "string"
+              appFeatureRequired:
+                - featureName: "string"
+                  version: "string"
+              appFeatureOptional:
+                - featureName: "string"
+                  version: "string"
+              isInsByMec: false
+              appProfile:
+                easId: "appName"
+                endPt:
+                  uris:
+                    - "string"
+                acIds:
+                  - "string"
+                provId: "appProvider1"
+                type: "string"
+                scheds:
+                  - "string"
+                svcArea: "string"
+                svcKpi: "string"
+                permLvl:
+                  - "string"
+                easFeats:
+                  - "string"
+                svcContSupp:
+                  - "string"
+                appLocs:
+                  - "string"
+                avlRep: 1577836800
+                status: "string"
+        required: true
       responses:
         '201':
           description: >-
@@ -1097,7 +1187,6 @@ paths:
         '400':
           description: >-
             Bad Request. It is used to indicate that incorrect parameters were passed to the request.
-          headers: {}
           content:
             application/problem+json:
               schema:
@@ -1109,7 +1198,6 @@ paths:
         '401':
           description: >-
             Unauthorized. It is used when the client did not submit the appropriate credentials.
-          headers: {}
           content:
             application/problem+json:
               schema:
@@ -1121,15 +1209,13 @@ paths:
         '403':
           description: >-
             Forbidden. The operation is not allowed given the current status of the resource.
-          headers: {}
           content:
             application/problem+json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
         '404':
           description: >-
-            Not Found. It is used when a client provided a URI that cannot be mapped  to a valid resource URI.
-          headers: {}
+            Not Found. It is used when a client provided a URI that cannot be mapped to a valid resource URI.
           content:
             application/problem+json:
               schema:
@@ -1138,8 +1224,7 @@ paths:
               schema:
                 type: object
                 description: Empty schema
-      deprecated: false
-    parameters: []
+      deprecated: false  
   /registrations/{appInstanceId}:
     get:
       tags:
@@ -1222,6 +1307,95 @@ paths:
           application/json:
             schema:
               $ref: '#/components/schemas/AppInfo'
+            example:
+              appName: "appName"
+              appProvider: "appProvider1"
+              appCategory:
+                href: "/example/catalogue1"
+                id: "id12345"
+                name: "RNI"
+                version: "version1"
+              appDId: "TODO"
+              appInstanceId: "ID1"
+              endpoint:
+                uris:
+                  - "mecAppSuptApi/example"
+              appServiceRequired:
+                - requestedPermissions: "string"
+                  serCategory:
+                    href: "/example/catalogue1"
+                    id: "id12345"
+                    name: "RNI"
+                    version: "version1"
+                  serName: "string"
+                  serTransportDependencies:
+                    - labels:
+                        - "string"
+                      serializers:
+                        - "JSON"
+                      transport:
+                        protocol: "string"
+                        security:
+                          oAuth2Info:
+                            grantTypes:
+                              - "OAUTH2_CLIENT_CREDENTIALS"
+                            tokenEndpoint: "/mecSerMgmtApi/security/TokenEndPoint"
+                        type: "REST_HTTP"
+                        version: "string"
+                  version: "string"
+              appServiceOptional:
+                - requestedPermissions: "string"
+                  serCategory:
+                    href: "/example/catalogue1"
+                    id: "id12345"
+                    name: "RNI"
+                    version: "version1"
+                  serName: "string"
+                  serTransportDependencies:
+                    - labels:
+                        - "string"
+                      serializers:
+                        - "JSON"
+                      transport:
+                        protocol: "string"
+                        security:
+                          oAuth2Info:
+                            grantTypes:
+                              - "OAUTH2_CLIENT_CREDENTIALS"
+                            tokenEndpoint: "/mecSerMgmtApi/security/TokenEndPoint"
+                        type: "REST_HTTP"
+                        version: "string"
+                  version: "string"
+              appFeatureRequired:
+                - featureName: "string"
+                  version: "string"
+              appFeatureOptional:
+                - featureName: "string"
+                  version: "string"
+              isInsByMec: false
+              appProfile:
+                easId: "appName"
+                endPt:
+                  uris:
+                    - "string"
+                acIds:
+                  - "string"
+                provId: "appProvider1"
+                type: "string"
+                scheds:
+                  - "string"
+                svcArea: "string"
+                svcKpi: "string"
+                permLvl:
+                  - "string"
+                easFeats:
+                  - "string"
+                svcContSupp:
+                  - "string"
+                appLocs:
+                  - "string"
+                avlRep: 1577836800
+                status: "string"
         required: true
       responses:
         '204':
@@ -1340,6 +1514,490 @@ paths:
                 description: Empty schema
       deprecated: false
     parameters: []
+
+  /request:
+    post:
+      summary: Request service provisioning information.
+      operationId: RequestServProv
+      tags:
+        - Service Provisioning, EEC Registration, and ECS Discovery
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                eecId:
+                  type: string
+                  example: "string"
+                ueId:
+                  type: string
+                  example: "string"
+                acProfs:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      acId:
+                        type: string
+                        example: "string"
+                      acType:
+                        type: string
+                        example: "string"
+                eecSvcContSupp:
+                  type: array
+                  items:
+                    type: string
+                    enum:
+                      - EEC_INITIATED
+                      - EEC_EXECUTED_VIA_SOURCE_EES
+                  example: ["EEC_INITIATED", "EEC_EXECUTED_VIA_SOURCE_EES"]
+                locInf:
+                  type: object
+                  properties:
+                    geographicArea:
+                      type: object
+                      properties:
+                        point:
+                          type: object
+                          properties:
+                            point:
+                              type: object
+                              properties:
+                                lon:
+                                  type: number
+                                  format: float
+                                  example: 7.4200
+                                lat:
+                                  type: number
+                                  format: float
+                                  example: 43.7356
+                            shape:
+                              type: string
+                              example: "POINT"
+              required:
+                - eecId
+      responses:
+        '200':
+          description: >
+            OK (The requested service provisioning information was returned successfully).
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ECSServProvResp'
+        "204":
+          description: Successful response sent when there is no need to provide a
+            new liveness interval value to the service Instance.
+          content: {}
+        "400":
+          description: "It is used to indicate that incorrect parameters were passed\
+            \ to the request. In the returned ProblemDetails structure, the \"detail\"\
+            \ attribute should convey more information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: The operation is not allowed given the current status of the
+            resource. More information shall be provided in the "detail" attribute
+            of the "ProblemDetails" structure.
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "It is used when a client provided a URI that cannot be mapped\
+            \ to a valid resource URI. In the returned ProblemDetails structure, the\
+            \ \"detail\" attribute should convey more information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "409":
+          description: The operation is not allowed due to a conflict with the state
+            of the resource. The MEC platform shall respond with this code if the
+            service instance is in "INACTIVE" state. More information shall be provided
+            in the "detail" attribute of the "ProblemDetails" structure.
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "412":
+          description: "It is used when a condition has failed during conditional\
+            \ requests, e.g. when using ETags to avoid write conflicts. In the returned\
+            \ ProblemDetails structure, the \"detail\" attribute should convey more\
+            \ information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    servers:
+    - url: https://localhost/sandboxname/eecs-serviceprovisioning/v1
+
+  /registration:
+    post:
+      operationId: CreateEECReg
+      tags:
+        - Service Provisioning, EEC Registration, and ECS Discovery
+      description: Create a new EEC registration at the EES.
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                eecId:
+                  type: string
+                  example: "string"
+                ueId:
+                  type: string
+                  example: "ue-67890"
+                acProfs:
+                  type: array
+                  items:
+                    type: object
+                    properties:
+                      acId:
+                        type: string
+                        example: "string"
+                      acType:
+                        type: string
+                        example: "string"
+                expTime:
+                  type: string
+                  format: date-time
+                  example: "2025-01-31T15:04:05Z"
+                eecSvcContSupp:
+                  type: array
+                  items:
+                    type: string
+                    enum:
+                      - EEC_INITIATED
+                      - SOURCE_EAS_DECIDED
+                  example: ["EEC_INITIATED", "SOURCE_EAS_DECIDED"]
+                eecCntxId:
+                  type: string
+                  example: "string"
+                srcEesId:
+                  type: string
+                  example: "mep1"
+                endPt:
+                  type: object
+                  properties:
+                    uri:
+                      type: string
+                      example: "http://172.30.225.7/sbx2cmq8bn/mep1"
+                ueMobilityReq:
+                  type: boolean
+                  example: true
+                easSelReqInd:
+                  type: boolean
+                  example: false
+                ueType:
+                  type: string
+                  example: "NORMAL_UE"
+              required:
+                - eecId
+      responses:
+        '201':
+          description: Created (EEC information is registered successfully at EES).
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  RegistrationID:
+                    type: string
+                    description: Identifier of the EEC registration.
+                  ExpirationTime:
+                    type: string
+                    format: date-time
+                    description: Expiration time of the registration.
+                  EECContextID:
+                    type: string
+                    description: Identifier of the EEC context information available at the EES.
+                  EECContextRelocationStatus:
+                    type: boolean
+                    description: Indicates whether the EEC context retrieval from the source EES was successful.
+                  DiscoveredEASList:
+                    type: array
+                    items:
+                      $ref: '#/components/schemas/EASProfile'
+        "204":
+          description: Successful response sent when there is no need to provide a
+            new liveness interval value to the service Instance.
+          content: {}
+        "400":
+          description: "It is used to indicate that incorrect parameters were passed\
+            \ to the request. In the returned ProblemDetails structure, the \"detail\"\
+            \ attribute should convey more information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: The operation is not allowed given the current status of the
+            resource. More information shall be provided in the "detail" attribute
+            of the "ProblemDetails" structure.
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "It is used when a client provided a URI that cannot be mapped\
+            \ to a valid resource URI. In the returned ProblemDetails structure, the\
+            \ \"detail\" attribute should convey more information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "409":
+          description: The operation is not allowed due to a conflict with the state
+            of the resource. The MEC platform shall respond with this code if the
+            service instance is in "INACTIVE" state. More information shall be provided
+            in the "detail" attribute of the "ProblemDetails" structure.
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "412":
+          description: "It is used when a condition has failed during conditional\
+            \ requests, e.g. when using ETags to avoid write conflicts. In the returned\
+            \ ProblemDetails structure, the \"detail\" attribute should convey more\
+            \ information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    servers:
+    - url: https://localhost/sandboxname/eees-eecregistration/v1
+
+  /registrations/{registrationId}:
+    get:
+      summary: Retrieve EEC Registration Details
+      operationId: getRegistrationDetails
+      tags:
+        - Service Provisioning, EEC Registration, and ECS Discovery
+      parameters:
+        - name: registrationId
+          in: path
+          description: Identifies an individual EEC registration.
+          required: true
+          schema:
+            type: string
+      responses:
+        '200':
+          description: Successful retrieval of EEC registration details.
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  RegistrationID:
+                    type: string
+                    description: Identifier of the EEC registration.
+                  ExpirationTime:
+                    type: string
+                    format: date-time
+                    description: Expiration time of the registration.
+                  EECContextID:
+                    type: string
+                    description: Identifier of the EEC context information available at the EES.
+                  EECContextRelocationStatus:
+                    type: boolean
+                    description: Indicates whether the EEC context retrieval from the source EES was successful.
+                  DiscoveredEASList:
+                    type: array
+                    items:
+                      $ref: '#/components/schemas/EASProfile'
+        '404':
+          description: EEC registration not found.
+        '400':
+          description: Invalid registration ID supplied.
+        '500':
+          description: Internal server error.
+    put:
+      summary: EEC Registration Update Request via PUT
+      operationId: updateRegistrationPut
+      tags:
+        - Service Provisioning, EEC Registration, and ECS Discovery
+      parameters:
+        - name: registrationId
+          in: path
+          description: Identifies an individual EEC registration.
+          required: true
+          schema:
+            type: string
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                acProfs:
+                  type: array
+                  items:
+                    $ref: '#/components/schemas/ACProfile'
+                  description: Profiles of ACs for which the EEC provides edge enabling services.
+                expTime:
+                  $ref: '#/components/schemas/DateTime'
+                ueMobilityReq:
+                  type: boolean
+                  description: >
+                    Set to true to indicate that UE Mobility support is required.
+                    Set to false to indicate that UE mobility support is not required.
+                    The default value when omitted is false.
+      responses:
+        "200":
+          description: Successful registration update response via PUT
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  expirationTime:
+                    type: string
+                    format: date-time
+                    description: Expiration time of the registration.
+                  unfulfilledACInfo:
+                    type: array
+                    description: List of unfulfilled AC information.
+                    items:
+                      type: object
+                      properties:
+                        acid:
+                          type: string
+                          description: Application Identifier.
+                        reason:
+                          type: string
+                          description: Reason indicating the cause (e.g., EAS not available).
+        "204":
+          description: Successful response sent when there is no need to provide a
+            new liveness interval value to the service Instance.
+          content: {}
+        "400":
+          description: "It is used to indicate that incorrect parameters were passed\
+            \ to the request. In the returned ProblemDetails structure, the \"detail\"\
+            \ attribute should convey more information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: The operation is not allowed given the current status of the
+            resource. More information shall be provided in the "detail" attribute
+            of the "ProblemDetails" structure.
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "It is used when a client provided a URI that cannot be mapped\
+            \ to a valid resource URI. In the returned ProblemDetails structure, the\
+            \ \"detail\" attribute should convey more information about the error."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+
+    delete:
+      operationId: DeleteIndEECReg
+      tags:
+        - Service Provisioning, EEC Registration, and ECS Discovery
+      description: Remove an existing EEC registration at EES.
+      parameters:
+        - name: registrationId
+          in: path
+          description: Identifies an individual EEC registration.
+          required: true
+          schema:
+            type: string
+      responses:
+        '204':
+          description: >
+            No Content (An individual EEC registration resource deleted successfully).
+    servers:
+    - url: https://localhost/sandboxname/eees-eecregistration/v1
+
+  /eas-profiles/request-discovery:
+    post:
+      description: >
+        Provides EAS information requested by the service consumer (i.e. EEC, EAS or EES).
+      operationId: GetEASDiscInfo
+      tags:
+        - Service Provisioning, EEC Registration, and ECS Discovery
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              type: object
+              properties:
+                requestorId:
+                  type: object
+                  properties:
+                    eesId:
+                      type: string
+                      example: "string"
+                    easId:
+                      type: string
+                      example: "string"
+                    eecId:
+                      type: string
+                      example: "string"
+                  oneOf:
+                    - required: ["eesId"]
+                    - required: ["easId"]
+                    - required: ["eecId"]
+                ueId:
+                  type: string
+                  example: "string"
+                easDiscoveryFilter:
+                  type: object
+                  properties:
+                    acChars:
+                      type: array
+                      items:
+                        type: object
+                        properties:
+                          acProf:
+                            type: object
+                            properties:
+                              acId:
+                                type: string
+                                example: "string"
+                              acType:
+                                type: string
+                                example: "string"
+                eecSvcContinuity:
+                  type: array
+                  items:
+                    type: string
+                  example: ["EEC_INITIATED", "string"]
+                locInf:
+                  type: object
+                  description: "Location information. Define properties as required."
+                  example: {}
+                predictExpTime:
+                  type: string
+                  format: date-time
+                  example: "2025-02-04T09:49:01.348Z"
+              required:
+                - requestorId
+      responses:
+        '200':
+          description: >
+            OK (The requested EAS discovery information was returned successfully).
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/EasDiscoveryResp'
+
+    servers:
+    - url: https://localhost/sandboxname/eees-easdiscovery/v1
   /timing/timing_caps:
     get:
       tags:
@@ -1446,6 +2104,685 @@ paths:
     parameters: []
 components:
   schemas:
+    EasDiscoveryResp:
+      description: EAS discovery response.
+      type: object
+      properties:
+        discoveredEas:
+          type: array
+          items:
+            $ref: '#/components/schemas/DiscoveredEas'
+          description: List of EAS discovery information.
+      required:
+        - discoveredEas
+    DiscoveredEas:
+      description: Represents an EAS discovery information.
+      type: object
+      properties:
+        eas:
+          $ref: '#/components/schemas/EASProfile'
+        eesEndPt:
+          $ref: '#/components/schemas/EndPoint'
+        lifeTime:
+          $ref: '#/components/schemas/DateTime'
+      required:
+        - eas
+    EasDiscoveryReq:
+      description: EAS discovery request information.
+      type: object
+      properties:
+        requestorId:
+          $ref: '#/components/schemas/RequestorId'
+        ueId:
+          $ref: '#/components/schemas/Gpsi'
+        easDiscoveryFilter:
+          $ref: '#/components/schemas/EasDiscoveryFilter'
+        eecSvcContinuity:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACRScenario'
+          description: >
+            Indicates if the EEC supports service continuity or not, also indicates which ACR
+            scenarios are supported by the EEC.
+        eesSvcContinuity:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACRScenario'
+          description: >
+            Indicates if the EES supports service continuity or not, also indicates which ACR
+            scenarios are supported by the EES.
+        easSvcContinuity:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACRScenario'
+          description: >
+            Indicates if the EAS supports service continuity or not, also indicates which ACR
+            scenarios are supported by the EAS.
+        locInf:
+          $ref: '#/components/schemas/LocationInfo'
+        easSelSupInd:
+          type: boolean
+          description: >
+            Indicates if the EEC requires the EAS selection support from the EES (e.g., for
+            constrained device). The default value false indicates the EAS selection is not
+            required from the EES.
+        suppFeat:
+          $ref: '#/components/schemas/SupportedFeatures'
+        easIntTrigSup:
+          type: boolean
+          description: >
+            Indicates to the EES whether the EAS instantiation triggering should be performed for
+            the current request. The default value false indicates the EAS instantiation triggering
+            should not be performed. The true value indicate the EAS instantiation triggering should
+            be performed.
+        predictExpTime:
+          $ref: '#/components/schemas/DateTime'
+      required:
+        - requestorId
+
+    EasDiscoveryFilter:
+      description: Represents the EAS characteristics.
+      type: object
+      properties:
+        acChars:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACCharacteristics'
+          minItems: 1
+          description: AC description for which an EAS is needed.
+    ACCharacteristics:
+      description: Represents EAS dynamic information changes filter.
+      type: object
+      properties:
+        acProf:
+          $ref: '#/components/schemas/ACProfile'
+      required:
+        - acProf
+    RequestorId:
+      description: Represents identifier of the requestor.
+      type: object
+      properties:
+        eesId:
+          type: string
+          description: The identifier of the EES (e.g. S-EES).
+        easId:
+          type: string
+          description: The application identifier of the EAS (e.g. S-EAS), e.g. FQDN, URI.
+        eecId:
+          type: string
+          description: The identifier of the EEC.
+      oneOf:
+        - required: [eesId]
+        - required: [easId]
+        - required: [eecId]
+
+    EASProfile:
+      type: object
+      required:
+        - easId
+        - endPt
+        - acIds
+        - scheds
+        - permLvl
+        - easFeats
+        - svcContSupp
+        - appLocs
+      properties:
+        easId:
+          description: The identifier of the EAS
+          type: string
+          example:
+             appName
+        endPt:
+          $ref: '#/components/schemas/EndPoint'
+        acIds:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: Identities of the Application Clients that can be served by the EAS
+        provId:
+          type: string
+          description: Identifier of the ASP that provides the EAS.
+          example:
+             appProvider1
+        type:
+          description: The category or type of EAS.
+          type: string
+        scheds:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: The availability schedule of the EAS.
+        svcArea:
+          type: string
+          description: >-
+            The list of geographical and topological areas that the EAS serves. ACs in the UE that are outside the area will not be served.
+        svcKpi:
+          type: string
+          description: Service characteristics provided by the EAS.
+        permLvl:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: level of service permissions supported by the EAS.
+        easFeats:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: Service features supported by the EAS.
+        svcContSupp:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: The ACR scenarios supported by the EAS for service continuity.
+        appLocs:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: >-
+            List of DNAI(s) and the N6 traffic information associated with the EAS.
+        avlRep:
+          type: integer
+          description: >-
+            The period indicating to the EES, how often the EES needs to check the EAS's availability after a successful registration.
+          example:
+             1577836800
+        status:
+          type: string
+          description: 'EAS status information. '
+
+    EECRegistration:
+      description: Describes the parameters to perform EEC Registration related operations.
+      type: object
+      properties:
+        eecId:
+          type: string
+          description: Represents a unique identifier of the EEC.
+        ueId:
+          $ref: '#/components/schemas/Gpsi'
+        acProfs:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACProfile'
+          description: Profiles of ACs for which the EEC provides edge enabling services.
+        expTime:
+          $ref: '#/components/schemas/DateTime'
+        eecSvcContSupp:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACRScenario'
+          description: Profiles of ACs for which the EEC provides edge enabling services.
+        eecCntxId:
+          type: string
+          description: Identifier of the EEC context obtained from a previous registration.
+        srcEesId:
+          type: string
+          description: Identifier of the EES that provided EEC context ID.
+        endPt:
+          $ref: '#/components/schemas/EndPoint'
+        ueMobilityReq:
+          type: boolean
+          description: >
+            Set to true to indicate that UE Mobility support is required.
+            Set to false to indicate that UE mobility support is not required.
+            The default value when omitted is false.
+        easSelReqInd:
+          type: boolean
+          description: >
+            Set to true to indicate the EES support for EAS selection.
+            Set to false to indicate the EES shall not select the EAS.
+            The default value when omitted is false.
+        ueType:
+          $ref: '#/components/schemas/DeviceType'
+      required:
+        - eecId
+    DeviceType:
+      anyOf:
+      - type: string
+        enum:
+          - CONSTRAINED_UE
+          - NORMAL_UE
+      - type: string
+        description: >
+          This string provides forward-compatibility with future
+          extensions to the enumeration and is not used to encode
+          content defined in the present version of this API.
+      description: >
+        Represents the UE type.
+        Possible values are:
+        - CONSTRAINED_UE: Indicates UE is constrained with resources like power, processor etc.
+        - NORMAL_UE: Indicates UE is not constrained with resources.
+    ECSServProvReq:
+      description: ECS service provisioning request information.
+      type: object
+      properties:
+        eecId:
+          type: string
+          description: Represents a unique identifier of the EEC.
+        ueId:
+          $ref: '#/components/schemas/Gpsi'
+        acProfs:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACProfile'
+          description: Information about services the EEC wants to connect to.
+        appInfo:
+          type: array
+          items:
+            $ref: '#/components/schemas/ApplicationInfo'
+          minItems: 1
+          description: Information about the list of services the EEC wants to connect.
+        eecSvcContSupp:
+          type: array
+          items:
+            $ref: '#/components/schemas/ACRScenario'
+          description: >
+            Indicates if the EEC supports service continuity or not, also indicates which
+            ACR scenarios are supported by the EEC.
+        locInf:
+          $ref: '#/components/schemas/LocationInfo'
+        ecspIds:
+          type: array
+          items:
+            type: string
+          minItems: 1
+          description: Indicates to the ECS which EES providers are preferred by the EEC.
+        suppFeat:
+          $ref: '#/components/schemas/SupportedFeatures'
+      required:
+        - eecId
+
+    ECSServProvResp:
+      description: ECS service provisioning response information.
+      type: object
+      properties:
+        ednCnfgInfo:
+          type: array
+          items:
+            $ref: '#/components/schemas/EDNConfigInfo'
+          minItems: 1
+          description: List of EDN configuration information.
+      required:
+        - ednCnfgInfo
+
+    SupportedFeatures:
+      type: string
+      pattern: '^[A-Fa-f0-9]*$'
+      description: >
+        A string used to indicate the features supported by an API that is used as defined in clause 
+        6.6 in 3GPP TS 29.500. The string shall contain a bitmask indicating supported features in 
+        hexadecimal representation Each character in the string shall take a value of "0" to "9", 
+        "a" to "f" or "A" to "F" and shall represent the support of 4 features as described in 
+        table 5.2.2-3. The most significant character representing the highest-numbered features
+        shall  appear first in the string, and the character representing features 1 to 4
+        shall appear last  in the string. The list of features and their numbering (starting with 1)
+        are defined  separately for each API. If the string contains a lower number of characters
+        than there are  defined features for an API, all features that would be represented by
+        characters that are not  present in the string are not supported. 
+
+    LocationInfo:
+      description: Represents the user location information.
+      type: object
+      properties:
+        geographicArea:
+          $ref: '#/components/schemas/GeographicArea'
+
+    GeographicArea:
+      description: Geographic area specified by different shape.
+      anyOf:
+        - $ref: '#/components/schemas/Point'
+    Point:
+      description: Ellipsoid Point.
+      allOf:
+        - $ref: '#/components/schemas/GADShape'
+        - type: object
+          required:
+            - point
+          properties:
+            point:
+              $ref: '#/components/schemas/GeographicalCoordinates'
+    GeographicalCoordinates:
+      description: Geographical coordinates.
+      type: object
+      required:
+        - lon
+        - lat
+      properties:
+        lon:
+          type: number
+          format: double
+          minimum: -180
+          maximum: 180
+        lat:
+          type: number
+          format: double
+          minimum: -90
+          maximum: 90
+    GADShape:
+      description: Common base type for GAD shapes.
+      type: object
+      required:
+        - shape
+      properties:
+        shape:
+          $ref: '#/components/schemas/SupportedGADShapes'
+      discriminator:
+        propertyName: shape
+        mapping:
+          POINT: '#/components/schemas/Point'
+          POINT_UNCERTAINTY_CIRCLE: '#/components/schemas/PointUncertaintyCircle'
+          POINT_UNCERTAINTY_ELLIPSE: '#/components/schemas/PointUncertaintyEllipse'
+          POLYGON: '#/components/schemas/Polygon'
+          POINT_ALTITUDE: '#/components/schemas/PointAltitude'
+          POINT_ALTITUDE_UNCERTAINTY: '#/components/schemas/PointAltitudeUncertainty'
+          ELLIPSOID_ARC: '#/components/schemas/EllipsoidArc'
+          LOCAL_2D_POINT_UNCERTAINTY_ELLIPSE: '#/components/schemas/Local2dPointUncertaintyEllipse'
+          LOCAL_3D_POINT_UNCERTAINTY_ELLIPSOID: '#/components/schemas/Local3dPointUncertaintyEllipsoid'
+    SupportedGADShapes:
+      description: Indicates supported GAD shapes.
+      anyOf:
+        - type: string
+          enum:
+            - POINT
+            - POINT_UNCERTAINTY_CIRCLE
+            - POINT_UNCERTAINTY_ELLIPSE
+            - POLYGON
+            - POINT_ALTITUDE
+            - POINT_ALTITUDE_UNCERTAINTY
+            - ELLIPSOID_ARC
+            - LOCAL_2D_POINT_UNCERTAINTY_ELLIPSE
+            - LOCAL_3D_POINT_UNCERTAINTY_ELLIPSOID
+            - DISTANCE_DIRECTION
+            - RELATIVE_2D_LOCATION_UNCERTAINTY_ELLIPSE
+            - RELATIVE_3D_LOCATION_UNCERTAINTY_ELLIPSOID
+        - type: string
+
+    Gpsi:
+      type: string
+      pattern: '^(msisdn-[0-9]{5,15}|extid-[^@]+@[^@]+|.+)$'
+      description: >
+        String identifying a Gpsi shall contain either an External Id or an MSISDN. 
+        It shall be formatted as follows -External Identifier= "extid-'extid', where 'extid' 
+        shall be formatted according to clause 19.7.2 of 3GPP TS 23.003 that describes an 
+        External Identifier.  
+
+
+    ACProfile:
+      description: AC information indicating required services and service characteristics.
+      type: object
+      properties:
+        acId:
+          type: string
+          description: Identity of the AC.
+        acType:
+          type: string
+          description: The category or type of AC.
+        prefEcsps:
+          type: array
+          items:
+            type: string
+          description: Indicates to the ECS which ECSPs are preferred for the AC.
+        simInactTime:
+          $ref: '#/components/schemas/DurationSec'
+        eass:
+          type: array
+          items:
+            $ref: '#/components/schemas/EasDetail'
+          minItems: 1
+          description: List of EAS information.
+        # easBundleInfos:
+        #   type: array
+        #   items:
+        #     $ref: 'TS29558_Eees_EASRegistration.yaml#/components/schemas/EASBundleInfo'
+        #   minItems: 1
+        #   description: >
+        #     List of EAS bundles to which the EAS (identified via the "easId" attribute) belongs.
+      required:
+        - acId
+
+    EasDetail:
+      description: EAS details.
+      type: object
+      properties:
+        easId:
+          type: string
+          description: Application identifier of the EAS.
+      required:
+        - easId
+
+    DurationSec:
+      type: integer
+      minimum: 0
+      description: Unsigned integer identifying a period of time in units of seconds.
+
+
+    ApplicationInfo:
+      description: Represents the services the EEC wants to connect.
+      type: object
+      properties:
+        acProf:
+            $ref: '#/components/schemas/ACProfile'
+        appGroupProfile:
+            $ref: '#/components/schemas/AppGroupProfile'
+      required:
+        - acProf
+    
+    ACRScenario:
+      anyOf:
+      - type: string
+        enum:
+          - EEC_INITIATED
+          - EEC_EXECUTED_VIA_SOURCE_EES
+          - EEC_EXECUTED_VIA_TARGET_EES
+          - SOURCE_EAS_DECIDED
+          - SOURCE_EES_EXECUTED
+          - EEL_MANAGED_ACR
+      - type: string
+        description: >
+          This string provides forward-compatibility with future
+          extensions to the enumeration but is not used to encode
+          content defined in the present version of this API.
+      description: |
+        Represents the ACR scenarios supported by EES.  
+        Possible values are:
+        - EEC_INITIATED: Represents the EEC initiated ACR scenario.
+        - EEC_EXECUTED_VIA_SOURCE_EES: Represents the EEC ACR scenario executed via the S-EES.
+        - EEC_EXECUTED_VIA_TARGET_EES: Represents the EEC ACR scenario executed via the T-EES.
+        - SOURCE_EAS_DECIDED: Represents the EEC ACR scenario where the S-EAS decides to perform
+          ACR.
+        - SOURCE_EES_EXECUTED: Represents the EEC ACR scenario where S-EES executes the ACR.
+        - EEL_MANAGED_ACR: Represents the EEC ACR scenario where the ACR is managed by the
+          Edge Enabler Layer.
+    AppGroupProfile:
+      description: Represents the application group profile for common EAS.
+      type: object
+      properties:
+        appGrpId:
+          type: string
+          description: Represents the application group that uniquely identifies
+            the group of UEs using the same application.
+        easId:
+          type: string
+          description: Represents the application identifier of the EAS.
+      required:
+        - appGrpId
+        - easId
+
+    EDNConfigInfo:
+      description: Represents the EDN configuration information.
+      type: object
+      properties:
+        ednConInfo:
+          $ref: '#/components/schemas/EDNConInfo'
+        eess:
+          type: array
+          items:
+            $ref: '#/components/schemas/EESInfo'
+          minItems: 1
+          description: Contains the list of EESs of the EDN.
+        lifeTime:
+          $ref: '#/components/schemas/DateTime'
+      required:
+        - ednConInfo
+        - eess
+
+
+    EDNConInfo:
+      description: Represents an EDN connection information.
+      type: object
+      properties:
+        dnn:
+          $ref: '#/components/schemas/Dnn'
+        # snssai:
+        #   $ref: 'TS29571_CommonData.yaml#/components/schemas/Snssai'
+        # ednTopoSrvArea:
+        #   $ref: 'TS29122_CommonData.yaml#/components/schemas/LocationArea5G'
+
+    Dnn:
+      type: string
+      description: >
+        String representing a Data Network as defined in clause 9A of 3GPP TS 23.003; 
+        it shall contain either a DNN Network Identifier, or a full DNN with both the Network 
+        Identifier and Operator Identifier, as specified in 3GPP TS 23.003 clause 9.1.1 and 9.1.2.
+        It shall be coded as string in which the labels are separated by dots 
+        (e.g. "Label1.Label2.Label3").
+
+    DateTime:
+      format: date-time
+      type: string
+      description: string with format "date-time" as defined in OpenAPI.                       
+
+
+    EESInfo:
+      description: Represents EES information.
+      type: object
+      properties:
+        eesId:
+          type: string
+          description: Identity of the EES.
+        endPt:
+          $ref: '#/components/schemas/EndPoint'
+        easIds:
+          type: array
+          items:
+            type: string
+          description: >
+            Application identities of the Edge Application Servers registered
+            with the EES.
+        eecRegConf:
+          type: boolean
+          description: >
+            Indicates whether the EEC is required to register on the EES to use edge services
+            or not.
+      required:
+        - eesId
+        - eecRegConf
+    Fqdn:
+      description: Fully Qualified Domain Name
+      type: string
+      pattern: '^([0-9A-Za-z]([-0-9A-Za-z]{0,61}[0-9A-Za-z])?\.)+[A-Za-z]{2,63}\.?$'
+      minLength: 4
+      maxLength: 253
+
+    Ipv6Addr:
+      type: string
+      description: >
+        string identifying a Ipv6 address formatted according to clause 4 in IETF RFC 5952.
+        The mixed Ipv4 Ipv6 notation according to clause 5 of IETF RFC 5952 shall not be used.
+    Uri:
+      type: string
+      description: string providing an URI formatted according to IETF RFC 3986. 
+    Ipv4Addr:
+      type: string
+      description: >
+        string identifying a Ipv4 address formatted in the "dotted decimal" notation as defined in
+        IETF RFC 1166.
+    EndPoint:
+      type: object
+      description: The end point information to reach EAS.
+      properties:
+        fqdn:
+          $ref: '#/components/schemas/Fqdn'
+        ipv4Addrs:
+          type: array
+          items:
+            $ref: '#/components/schemas/Ipv4Addr'
+          minItems: 1
+          description: IPv4 addresses of the edge server.
+        ipv6Addrs:
+          type: array
+          items:
+            $ref: '#/components/schemas/Ipv6Addr'
+          minItems: 1
+          description: IPv6 addresses of the edge server.
+        uri:
+          $ref: '#/components/schemas/Uri'
+      oneOf:
+        - required: [uri]
+        - required: [fqdn]
+        - required: [ipv4Addrs]
+        - required: [ipv6Addrs]
+      
+    InvalidParam:
+      description: >
+        Represents the description of invalid parameters, for a request rejected due to invalid
+        parameters.
+      type: object
+      properties:
+        param:
+          type: string
+          description: Attribute's name encoded as a JSON Pointer, or header's name.
+        reason:
+          type: string
+          description: A human-readable reason, e.g. "must be a positive integer".
+      required:
+        - param
+
+    # EASBundleDetail:
+    #   description: Represents details of EAS Bundle.
+    #   type: object
+    #   properties:
+    #     easId:
+    #       type: string
+    #       description: >
+    #         Application identity of the Edge Application Servers registered with the EES.
+    #     easBundleInfos:
+    #       type: array
+    #       items:
+    #         $ref: 'TS29558_Eees_EASRegistration.yaml#/components/schemas/EASBundleInfo'
+    #       minItems: 1
+    #       description: List of EAS bundles to which the EAS belongs.
+    #   required:
+    #     - easId
+    #     - easBundleInfos
+    EesAuthMethod:
+      anyOf:
+      - type: string
+        enum:
+          - TLS_CLIENT_SERVER_CERTIFICATE
+          - TLS_WITH_AKMA
+          - TLS_WITH_GBA
+          - SERVER_SIDE_CERTIFICATE_BASED
+      - type: string
+        description: >
+          This string provides forward-compatibility with future
+          extensions to the enumeration and is not used to encode
+          content defined in the present version of this API.
+      description: |
+        Represents the Authentication methods supported by EES.  
+        Possible values are:
+        - TLS_CLIENT_SERVER_CERTIFICATE: Represents TLS with client server certificate
+          authentication.
+        - TLS_WITH_AKMA: Represents TLS with AKMA authentication.
+        - TLS_WITH_GBA: Represents TLS with GBA authentication.
+        - SERVER_SIDE_CERTIFICATE_BASED: Represents server side certification only.
+
     AppReadyConfirmation:
       title: AppReadyConfirmation
       required:
diff --git a/go-apps/meep-app-enablement/server/app-support/api_mec_app_support.go b/go-apps/meep-app-enablement/server/app-support/api_mec_app_support.go
index 1480ebf7bbe74fbbdfda29ec27b0b2272720953c..ee3afe97181a986c67a77893d42a6fff0d1a87e0 100644
--- a/go-apps/meep-app-enablement/server/app-support/api_mec_app_support.go
+++ b/go-apps/meep-app-enablement/server/app-support/api_mec_app_support.go
@@ -59,6 +59,29 @@ func TimingCurrentTimeGET(w http.ResponseWriter, r *http.Request) {
 	timingCurrentTimeGET(w, r)
 }
 
+func GetEASDiscInfo(w http.ResponseWriter, r *http.Request) {
+	getEASDiscInfo(w, r)
+}
+
+func RequestServProv(w http.ResponseWriter, r *http.Request) {
+	requestServProv(w, r)
+}
+
+func DeleteIndEECReg(w http.ResponseWriter, r *http.Request) {
+	deleteIndEECReg(w, r)
+}
+
+func CreateEECReg(w http.ResponseWriter, r *http.Request) {
+	createEECReg(w, r)
+}
+
+func UpdateRegistrationPut(w http.ResponseWriter, r *http.Request) {
+	updateRegistrationPut(w, r)
+}
+func GetRegistration(w http.ResponseWriter, r *http.Request) {
+	getRegistration(w, r)
+}
+
 func AppRegistrationPOST(w http.ResponseWriter, r *http.Request) {
 	appRegistrationPOST(w, r)
 }
diff --git a/go-apps/meep-app-enablement/server/app-support/app-support.go b/go-apps/meep-app-enablement/server/app-support/app-support.go
index e4f2ca46dab4a6b022b2e830efc536c35ee433de..6b047a5bf8a1d8eb82fd6d320e8b5fb4a9b203cb 100644
--- a/go-apps/meep-app-enablement/server/app-support/app-support.go
+++ b/go-apps/meep-app-enablement/server/app-support/app-support.go
@@ -24,6 +24,7 @@ import (
 	"net/url"
 	"reflect"
 	"strconv"
+	"strings"
 	"sync"
 	"time"
 
@@ -34,6 +35,7 @@ import (
 	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
 	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
 	subs "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-subscriptions"
+	"github.com/google/uuid"
 
 	"github.com/gorilla/mux"
 )
@@ -127,7 +129,12 @@ func Init(sandbox string, mep string, host *url.URL, msgQueue *mq.MsgQueue, redi
 		return err
 	}
 	log.Info("Connected to Application Store")
-
+	// Populate ECS Configuration
+	err = setupECSConfiguration()
+	if err != nil {
+		log.Error("Failed to set up ECS configuration: ", err)
+		return err
+	}
 	// Create Subscription Manager
 	subMgrCfg := &subs.SubscriptionMgrCfg{
 		Module:         moduleName,
@@ -647,6 +654,739 @@ func timingCurrentTimeGET(w http.ResponseWriter, r *http.Request) {
 	fmt.Fprint(w, string(jsonResponse))
 }
 
+// setupECSConfiguration stores the mandatory ECS configuration in Redis.
+// It uses the hostUrl as the ECS address and returns an error if any step fails.
+func setupECSConfiguration() error {
+	// Create a map containing the mandatory ECS configuration
+	ecsConfig := map[string]interface{}{
+		"ECSAddress": hostUrl.String(), // Use the MEC Sandbox URL as the ECS Address
+	}
+
+	// Convert the ECS configuration to JSON
+	ecsConfigJson, err := json.Marshal(ecsConfig)
+	if err != nil {
+		log.Error("setupECSConfiguration: failed to marshal ECS configuration", "error", err.Error())
+		return fmt.Errorf("failed to marshal ECS configuration: %v", err)
+	}
+
+	// Convert JSON bytes to a string for storage
+	ecsConfigJsonStr := string(ecsConfigJson)
+
+	// Define the Redis key and store the JSON configuration in Redis
+	ecsKey := baseKey + "ecs:config"
+	err = rc.JSONSetEntry(ecsKey, ".", ecsConfigJsonStr)
+	if err != nil {
+		log.Error("setupECSConfiguration: failed to set ECS configuration in Redis", "error", err.Error())
+		return fmt.Errorf("failed to set ECS configuration in Redis: %v", err)
+	}
+
+	log.Info("setupECSConfiguration: ECS configuration stored successfully in Redis", "key", ecsKey)
+	return nil
+}
+
+// getECSConfig retrieves the ECS configuration from Redis and returns it as a map.
+// An error is returned if the configuration is missing or cannot be unmarshaled.
+func getECSConfig() (map[string]interface{}, error) {
+	// Define the Redis key for the ECS configuration
+	ecsKey := baseKey + "ecs:config"
+	ecsConfigJson, err := rc.JSONGetEntry(ecsKey, ".")
+	if err != nil {
+		log.Error("getECSConfig: failed to get ECS configuration from Redis", "error", err.Error())
+		return nil, fmt.Errorf("failed to get ECS configuration: %v", err)
+	}
+
+	// Unmarshal the JSON configuration into a map
+	var ecsConfig map[string]interface{}
+	err = json.Unmarshal([]byte(ecsConfigJson), &ecsConfig)
+	if err != nil {
+		log.Error("getECSConfig: failed to unmarshal ECS configuration", "error", err.Error())
+		return nil, fmt.Errorf("failed to unmarshal ECS configuration: %v", err)
+	}
+
+	log.Info("getECSConfig: successfully retrieved ECS configuration from Redis", "key", ecsKey)
+	return ecsConfig, nil
+}
+
+// getRegistration retrieves the EEC registration details for a given RegistrationId.
+// It extracts the registrationId from the request URL, looks up the corresponding entry in Redis,
+// and sends a JSON response with the registration information.
+func getRegistration(w http.ResponseWriter, r *http.Request) {
+	log.Info("getRegistration: Get EEC Registration by RegistrationId")
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Extract the registrationId from the URL variables
+	vars := mux.Vars(r)
+	registrationId := vars["registrationId"]
+	keyName := baseKey + "app:" + registrationId
+
+	// Retrieve the registration information from Redis
+	eecPrevReg, err := rc.JSONGetEntry(keyName, ".")
+	if err != nil {
+		errMsg := "getRegistration: eecRegistration not found for the provided RegistrationId"
+		log.Error(errMsg, "registrationId", registrationId, "error", err.Error())
+		errHandlerProblemDetails(w, errMsg, http.StatusNotFound)
+		return
+	}
+	if eecPrevReg == "" {
+		log.Error("getRegistration: RegistrationId not found in Redis", "registrationId", registrationId)
+		errHandlerProblemDetails(w, "Registration not found", http.StatusNotFound)
+		return
+	}
+
+	// Convert the previously stored registration information to JSON format for the response
+	sInfoJson := convertEecPrevRegReqInfoToJson(eecPrevReg)
+	jsonResponse, err := json.Marshal(sInfoJson)
+	if err != nil {
+		log.Error("getRegistration: failed to marshal the response", "error", err.Error())
+		errHandlerProblemDetails(w, "Internal server error", http.StatusInternalServerError)
+		return
+	}
+
+	// Send the JSON response with a 200 OK status
+	w.WriteHeader(http.StatusOK)
+	w.Write(jsonResponse)
+	log.Info("getRegistration: successfully retrieved registration", "registrationId", registrationId)
+}
+
+// updateRegistrationPut updates an existing EEC registration based on the RegistrationId provided in the URL.
+// It decodes the update request, validates AcId fields, and updates the stored registration data in Redis.
+func updateRegistrationPut(w http.ResponseWriter, r *http.Request) {
+	log.Info("updateRegistrationPut: Update EEC Registration by RegistrationId")
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Extract registrationId from URL
+	vars := mux.Vars(r)
+	registrationId := vars["registrationId"]
+
+	// Decode the update request body into ecsRegUpdateReq
+	var ecsRegUpdateReq RegistrationsRegistrationIdBody
+	decoder := json.NewDecoder(r.Body)
+	if err := decoder.Decode(&ecsRegUpdateReq); err != nil {
+		log.Error("updateRegistrationPut: failed to decode the request body", "error", err.Error())
+		errHandlerProblemDetails(w, "Invalid request format", http.StatusBadRequest)
+		return
+	}
+
+	keyName := baseKey + "app:" + registrationId
+
+	// Retrieve the current registration entry from Redis
+	eecPrevReg, err := rc.JSONGetEntry(keyName, ".")
+	if err != nil {
+		errMsg := "updateRegistrationPut: eecRegistration not found for the provided RegistrationId"
+		log.Error(errMsg, "registrationId", registrationId, "error", err.Error())
+		errHandlerProblemDetails(w, errMsg, http.StatusNotFound)
+		return
+	}
+	if eecPrevReg == "" {
+		log.Error("updateRegistrationPut: RegistrationId not found in Redis", "registrationId", registrationId)
+		errHandlerProblemDetails(w, "Registration not found", http.StatusNotFound)
+		return
+	}
+
+	// Convert the current registration info to a modifiable JSON structure
+	sInfoJson := convertEecPrevRegReqInfoToJson(eecPrevReg)
+
+	// Helper function to check if an AcId is valid
+	isValidAcId := func(acId string) bool {
+		return acId != "" && acId != "string"
+	}
+
+	// Validate that at least one valid AcId is provided in the update request
+	hasAcId := false
+	for _, acProf := range ecsRegUpdateReq.AcProfs {
+		if isValidAcId(acProf.AcId) {
+			hasAcId = true
+			break
+		}
+	}
+
+	// Process and validate each valid AcId in the update request
+	if hasAcId {
+		for _, acProf := range ecsRegUpdateReq.AcProfs {
+			if isValidAcId(acProf.AcId) {
+				appId := acProf.AcId
+				log.Debug("updateRegistrationPut: processing AcId", "appId", appId)
+				appInfo, err := getAppInfo(appId)
+				if err != nil {
+					log.Error("updateRegistrationPut: getAppInfo failed", "appId", appId, "error", err.Error())
+					errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+					return
+				}
+
+				code, problemDetails, err := validateAppInfo(appInfo)
+				if err != nil {
+					log.Error("updateRegistrationPut: validateAppInfo error", "appId", appId, "error", err.Error())
+					if problemDetails != "" {
+						w.WriteHeader(code)
+						fmt.Fprint(w, problemDetails)
+					} else {
+						errHandlerProblemDetails(w, err.Error(), code)
+					}
+					return
+				}
+			}
+		}
+	}
+
+	// Update the registration JSON with new AcProfs, ExpTime, and UeMobilityReq values
+	sInfoJson.AcProfs = ecsRegUpdateReq.AcProfs
+	sInfoJson.ExpTime = ecsRegUpdateReq.ExpTime
+	sInfoJson.UeMobilityReq = ecsRegUpdateReq.UeMobilityReq
+
+	// Convert the updated registration structure back to JSON for storage
+	sInfoJson_ := convertEecRegReqInfoToJson(sInfoJson)
+	err = rc.JSONSetEntry(keyName, ".", sInfoJson_)
+	if err != nil {
+		log.Error("updateRegistrationPut: failed to set JSON entry in Redis DB", "registrationId", registrationId, "error", err.Error())
+		errHandlerProblemDetails(w, "Failed to set JSON entry in Redis DB", http.StatusInternalServerError)
+		return
+	}
+
+	// Prepare and send a response indicating a successful update
+	response := InlineResponse201{
+		ExpirationTime: time.Now(),
+	}
+	jsonResponse, err := json.Marshal(response)
+	if err != nil {
+		log.Error("updateRegistrationPut: failed to marshal the response", "error", err.Error())
+		errHandlerProblemDetails(w, "Internal server error", http.StatusInternalServerError)
+		return
+	}
+
+	w.WriteHeader(http.StatusOK)
+	w.Write(jsonResponse)
+	log.Info("updateRegistrationPut: registration updated successfully", "registrationId", registrationId)
+}
+
+// createEECReg creates a new EEC registration.
+// It validates the incoming request, verifies that the request is stored in Redis,
+// validates AcId fields, and finally stores the new registration while returning the registration details.
+func createEECReg(w http.ResponseWriter, r *http.Request) {
+	log.Info("createEECReg: Request to create EEC Registration")
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	// Check if the request body is provided
+	if r.Body == nil {
+		err := errors.New("createEECReg: request body is missing")
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	// Decode the request body into an EecRegistration structure
+	var ecsRegReq EecRegistration
+	decoder := json.NewDecoder(r.Body)
+	if err := decoder.Decode(&ecsRegReq); err != nil {
+		log.Error("createEECReg: failed to decode the request body", "error", err.Error())
+		errHandlerProblemDetails(w, "Invalid request format", http.StatusBadRequest)
+		return
+	}
+
+	// Validate that a unique EecId is provided
+	if ecsRegReq.EecId == "" || ecsRegReq.EecId == "string" {
+		log.Error("createEECReg: invalid request - unique EecId missing or default value provided")
+		errHandlerProblemDetails(w, "Please enter the unique EecId", http.StatusBadRequest)
+		return
+	}
+
+	// Verify that the registration request is already stored in Redis
+	key := baseKey + "app:" + ecsRegReq.EecId
+	sInfoJson1, err := rc.JSONGetEntry(key, ".")
+	if err != nil {
+		log.Error("createEECReg: failed to get JSON entry from Redis DB", "error", err.Error())
+		errHandlerProblemDetails(w, "Failed to get JSON entry from Redis DB", http.StatusInternalServerError)
+		return
+	}
+	if sInfoJson1 == "" {
+		log.Error("createEECReg: registration request is not stored in Redis", "EecId", ecsRegReq.EecId)
+		errHandlerProblemDetails(w, "Request is not stored in Redis DB", http.StatusInternalServerError)
+		return
+	}
+
+	// Helper function to check if an AcId is valid
+	isValidAcId := func(acId string) bool {
+		return acId != "" && acId != "string"
+	}
+
+	// Ensure that at least one valid AcId is provided in the registration request
+	hasAcId := false
+	for _, acProf := range ecsRegReq.AcProfs {
+		if isValidAcId(acProf.AcId) {
+			hasAcId = true
+			break
+		}
+	}
+
+	// Validate each valid AcId by retrieving and validating associated application info
+	if hasAcId {
+		for _, acProf := range ecsRegReq.AcProfs {
+			if isValidAcId(acProf.AcId) {
+				appId := acProf.AcId
+				log.Debug("createEECReg: processing AcId", "appId", appId)
+				appInfo, err := getAppInfo(appId)
+				if err != nil {
+					log.Error("createEECReg: getAppInfo failed", "appId", appId, "error", err.Error())
+					errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+					return
+				}
+
+				code, problemDetails, err := validateAppInfo(appInfo)
+				if err != nil {
+					log.Error("createEECReg: validateAppInfo error", "appId", appId, "error", err.Error())
+					if problemDetails != "" {
+						w.WriteHeader(code)
+						fmt.Fprint(w, problemDetails)
+					} else {
+						errHandlerProblemDetails(w, err.Error(), code)
+					}
+					return
+				}
+			}
+		}
+	}
+
+	// Dynamically retrieve platform details to verify the registration endpoint and MEC platform ID
+	ednConfig, err := getDynamicPlatformDetails(basePath)
+	if err != nil {
+		log.Error("createEECReg: failed to get EDN config information", "error", err.Error())
+		errHandlerProblemDetails(w, "Failed to get the EDN config information", http.StatusBadRequest)
+		return
+	}
+
+	// Validate that the registration endpoint and source EES ID match the expected EDN config values
+	if ecsRegReq.EndPt == nil || ecsRegReq.EndPt.Uri != ednConfig.Eess[0].EndPt.Uri {
+		log.Error("createEECReg: endpoint mismatch - EEC registration endpoint does not match EDN config endpoint",
+			"provided", ecsRegReq.EndPt, "expected", ednConfig.Eess[0].EndPt)
+		errHandlerProblemDetails(w, "Endpoint mismatch: EEC registration endpoint does not match EDN config endpoint", http.StatusBadRequest)
+		return
+	}
+	if ecsRegReq.EndPt == nil || ecsRegReq.SrcEesId != ednConfig.Eess[0].EesId {
+		log.Error("createEECReg: endpoint mismatch - SrcEesId does not match EDN config MEC Platform ID",
+			"provided", ecsRegReq.SrcEesId, "expected", ednConfig.Eess[0].EesId)
+		errHandlerProblemDetails(w, "Endpoint mismatch: SrcEesId does not match EDN config MEC Platform ID", http.StatusBadRequest)
+		return
+	}
+
+	// Generate a new unique registrationId for the new registration
+	registrationId := uuid.New().String()
+	sInfoJson := convertEecRegReqInfoToJson(&ecsRegReq)
+	key = baseKey + "app:" + registrationId
+	err = rc.JSONSetEntry(key, ".", sInfoJson)
+	if err != nil {
+		log.Error("createEECReg: failed to set JSON entry in Redis DB", "registrationId", registrationId, "error", err.Error())
+		errHandlerProblemDetails(w, "Failed to set JSON entry in Redis DB", http.StatusInternalServerError)
+		return
+	}
+
+	// Prepare the response with registration details
+	response := InlineResponse201{
+		RegistrationID:             registrationId,
+		ExpirationTime:             time.Now(),
+		EECContextID:               "example-context-id", // Replace with actual context ID if available
+		EECContextRelocationStatus: true,
+		DiscoveredEASList:          []EasProfile{}, // Populate with actual EasProfile values if needed
+	}
+
+	jsonResponse, err := json.Marshal(response)
+	if err != nil {
+		log.Error("createEECReg: failed to marshal the response", "error", err.Error())
+		errHandlerProblemDetails(w, "Internal server error", http.StatusInternalServerError)
+		return
+	}
+
+	// Send the successful creation response
+	w.WriteHeader(http.StatusOK)
+	w.Write(jsonResponse)
+	log.Info("createEECReg: registration created successfully", "registrationId", registrationId)
+}
+
+// deleteIndEECReg deletes an individual EEC registration identified by RegistrationId.
+// It removes the corresponding entry from Redis and returns a 204 No Content response on success.
+func deleteIndEECReg(w http.ResponseWriter, r *http.Request) {
+	log.Info("deleteIndEECReg: Delete EEC Registration by RegistrationId")
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Extract registrationId from URL
+	vars := mux.Vars(r)
+	registrationId := vars["registrationId"]
+	keyName := baseKey + "app:" + registrationId
+
+	// Check if the registration exists in Redis
+	_, err := rc.JSONGetEntry(keyName, ".")
+	if err != nil {
+		errMsg := "deleteIndEECReg: eecRegistration not found for the provided RegistrationId"
+		log.Error(errMsg, "registrationId", registrationId, "error", err.Error())
+		errHandlerProblemDetails(w, errMsg, http.StatusNotFound)
+		return
+	}
+
+	// Delete the registration entry from Redis
+	err = rc.JSONDelEntry(keyName, ".")
+	if err != nil {
+		log.Error("deleteIndEECReg: failed to delete JSON entry from Redis DB", "registrationId", registrationId, "error", err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+
+	log.Info("deleteIndEECReg: registration deleted successfully", "registrationId", registrationId)
+	// Send a 204 No Content response on successful deletion
+	w.WriteHeader(http.StatusNoContent)
+}
+
+// requestServProv handles requests for service provisioning. It validates the request payload,
+// ensures proper synchronization, checks required fields, and finally stores the request in Redis
+// before sending the platform configuration as a response.
+func requestServProv(w http.ResponseWriter, r *http.Request) {
+	log.Info("requestServProv: Received request to provide service")
+
+	// Set response header to JSON
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Ensure thread safety when accessing shared resources
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	// Check if the request body is present
+	if r.Body == nil {
+		err := errors.New("requestServProv: request body is missing")
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	// Decode the incoming JSON request into an EcsServProvReq structure
+	var ecsServReq EcsServProvReq
+	decoder := json.NewDecoder(r.Body)
+	if err := decoder.Decode(&ecsServReq); err != nil {
+		log.Error("requestServProv: failed to decode request body", "error", err.Error())
+		errHandlerProblemDetails(w, "Invalid request format", http.StatusBadRequest)
+		return
+	}
+
+	// Validate that the EecId is provided and is not a placeholder value
+	if ecsServReq.EecId == "" || ecsServReq.EecId == "string" {
+		log.Error("requestServProv: invalid request - unique EecId missing or default value provided")
+		errHandlerProblemDetails(w, "Please enter the unique EecId", http.StatusBadRequest)
+		return
+	}
+
+	// Helper function to check if a provided AcId is valid (i.e. non-empty and not the default "string")
+	isValidAcId := func(acId string) bool {
+		return acId != "" && acId != "string"
+	}
+
+	// Verify that either a valid AcId is provided within AcProfs or LocationInfo is present.
+	hasAcId := false
+	for _, acProf := range ecsServReq.AcProfs {
+		if isValidAcId(acProf.AcId) {
+			hasAcId = true
+			break
+		}
+	}
+	if !hasAcId && ecsServReq.LocInf == nil {
+		log.Error("requestServProv: invalid request - both AcId and LocationInfo are missing")
+		errHandlerProblemDetails(w, "Either a valid AcId or LocationInfo must be provided", http.StatusBadRequest)
+		return
+	}
+
+	// Process each valid AcId in the AcProfs slice
+	if hasAcId {
+		for _, acProf := range ecsServReq.AcProfs {
+			if isValidAcId(acProf.AcId) {
+				appId := acProf.AcId
+				log.Debug("requestServProv: processing AcId", "appId", appId)
+				// Retrieve application info for the given appId
+				appInfo, err := getAppInfo(appId)
+				if err != nil {
+					log.Error("requestServProv: getAppInfo failed", "appId", appId, "error", err.Error())
+					errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+					return
+				}
+
+				// Validate the retrieved appInfo; if invalid, send an appropriate response.
+				code, problemDetails, err := validateAppInfo(appInfo)
+				if err != nil {
+					log.Error("requestServProv: validateAppInfo error", "appId", appId, "error", err.Error())
+					if problemDetails != "" {
+						w.WriteHeader(code)
+						fmt.Fprint(w, problemDetails)
+					} else {
+						errHandlerProblemDetails(w, err.Error(), code)
+					}
+					return
+				}
+			}
+		}
+	}
+
+	// Process LocationInfo if provided
+	if ecsServReq.LocInf != nil {
+		lat := ecsServReq.LocInf.GeographicArea.Point.Point.Lat
+		lon := ecsServReq.LocInf.GeographicArea.Point.Point.Lon
+		log.Info("requestServProv: received coordinates", "latitude", lat, "longitude", lon)
+
+		// Validate the geographic coordinates to ensure they are within acceptable boundaries.
+		if !isValidCoordinates(lat, lon) {
+			log.Error("requestServProv: invalid location - MEC platform not found for provided coordinates",
+				"latitude", lat, "longitude", lon)
+			errHandlerProblemDetails(w, "MEC platform not found for this location", http.StatusNotFound)
+			return
+		}
+	}
+
+	// Convert the ECS service provisioning request info into JSON format for storage.
+	sInfoJson := convertEcsServProvReqInfoToJson(&ecsServReq)
+	key := baseKey + "app:" + ecsServReq.EecId
+
+	// Store the request in Redis DB.
+	if err := rc.JSONSetEntry(key, ".", sInfoJson); err != nil {
+		log.Error("requestServProv: failed to set JSON entry in Redis DB", "error", err.Error())
+		errHandlerProblemDetails(w, "Failed to set JSON entry in Redis DB", http.StatusInternalServerError)
+		return
+	}
+
+	// Verify that the entry was successfully stored by retrieving it.
+	sInfoJson1, err := rc.JSONGetEntry(key, ".")
+	if err != nil {
+		log.Error("requestServProv: failed to get JSON entry from Redis DB", "error", err.Error())
+		errHandlerProblemDetails(w, "Failed to get JSON entry from Redis DB", http.StatusInternalServerError)
+		return
+	}
+	if sInfoJson1 == "" {
+		log.Error("requestServProv: request not stored in Redis DB", "key", key)
+		errHandlerProblemDetails(w, "Request is not stored in Redis DB", http.StatusInternalServerError)
+		return
+	}
+
+	// Dynamically retrieve platform configuration details using the basePath.
+	ednConfig, err := getDynamicPlatformDetails(basePath)
+	if err != nil {
+		log.Error("requestServProv: failed to get dynamic platform details", "error", err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	// Marshal the platform configuration to JSON for the response.
+	jsonResponse, err := json.Marshal(ednConfig)
+	if err != nil {
+		log.Error("requestServProv: failed to marshal response", "error", err.Error())
+		errHandlerProblemDetails(w, "Internal server error", http.StatusInternalServerError)
+		return
+	}
+
+	// Send the successful response with HTTP 200 OK.
+	w.WriteHeader(http.StatusOK)
+	w.Write(jsonResponse)
+	log.Info("requestServProv: successfully processed service provisioning request", "EecId", ecsServReq.EecId)
+}
+
+// getDynamicPlatformDetails extracts platform configuration details dynamically based on the provided basePath.
+// It returns an EdnConfigInfo structure containing the list of EES (Edge Services) configurations or an error if any occurs.
+func getDynamicPlatformDetails(basePath string) (*EdnConfigInfo, error) {
+	platformDetails, err := getPlatformDetailsFromBasePath(basePath)
+	if err != nil {
+		log.Error("getDynamicPlatformDetails: error retrieving platform details from basePath", "error", err)
+		return nil, err
+	}
+
+	// Build EES information from the retrieved platform details.
+	eesInfo := EesInfo{
+		EesId: platformDetails.EesId,
+		EndPt: platformDetails.EndPt,
+	}
+
+	return &EdnConfigInfo{
+		Eess: []EesInfo{eesInfo},
+	}, nil
+}
+
+// isValidCoordinates checks whether the given latitude and longitude fall within the expected geographic boundaries,
+// allowing a small tolerance for minor discrepancies.
+func isValidCoordinates(lat, lon float64) bool {
+	const tolerance = 0.0001
+	return lat >= (43.7244-tolerance) && lat <= (43.7515+tolerance) &&
+		lon >= (7.4090-tolerance) && lon <= (7.4390+tolerance)
+}
+
+// getPlatformDetailsFromBasePath parses the basePath to extract the platform identifier and constructs the corresponding URL.
+// It returns an EesInfo structure containing the platform's EES identifier and endpoint or an error if the parsing fails.
+func getPlatformDetailsFromBasePath(basePath string) (*EesInfo, error) {
+	// Locate the "/mep" segment in the path. This marks the beginning of the platform-specific portion.
+	mepIndex := strings.Index(basePath, "/mep")
+	if mepIndex == -1 {
+		err := errors.New("getPlatformDetailsFromBasePath: invalid base path, '/mep' not found")
+		log.Error(err.Error())
+		return nil, err
+	}
+
+	// The namespace is the part of the basePath before "/mep".
+	namespace := basePath[:mepIndex]
+	// Extract the platform-specific segment after "/mep".
+	platformPart := basePath[mepIndex+1:]
+	nextSlashIndex := strings.Index(platformPart, "/")
+	var platformIdentifier string
+	if nextSlashIndex != -1 {
+		platformIdentifier = platformPart[:nextSlashIndex]
+	} else {
+		platformIdentifier = platformPart
+	}
+
+	// Construct the full URL for the MEC platform by combining hostUrl with the namespace and platform identifier.
+	mecPlatformUrl := strings.TrimSuffix(hostUrl.String(), "/") + "/" +
+		strings.TrimPrefix(namespace, "/") + "/" + platformIdentifier
+
+	log.Debug("getPlatformDetailsFromBasePath: constructed MEC platform URL", "url", mecPlatformUrl)
+
+	return &EesInfo{
+		EesId: platformIdentifier,
+		EndPt: &EndPoint{
+			Uri: mecPlatformUrl,
+		},
+	}, nil
+}
+
+// getEASDiscInfo handles HTTP requests to retrieve EAS (Edge Application Service) discovery information.
+// It validates the request, retrieves application configuration from the datastore, and returns a JSON response.
+func getEASDiscInfo(w http.ResponseWriter, r *http.Request) {
+	log.Debug("getEASDiscInfo: request received", "method", r.Method, "url", r.URL)
+
+	// Set the response content type to JSON.
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Decode the incoming JSON request into an EasDiscoveryReq structure.
+	var discReq EasDiscoveryReq
+	if err := json.NewDecoder(r.Body).Decode(&discReq); err != nil {
+		log.Error("getEASDiscInfo: error decoding request body", "error", err)
+		errHandlerProblemDetails(w, "Invalid request body.", http.StatusBadRequest)
+		return
+	}
+	log.Info("getEASDiscInfo: decoded request info", "discReq", discReq)
+
+	// Immediately reject requests that include an unsupported EasId.
+	if discReq.RequestorId.EasId != "" {
+		log.Error("getEASDiscInfo: unsupported EasId provided", "EasId", discReq.RequestorId.EasId)
+		errHandlerProblemDetails(w, "EasId is not supported in this implementation", http.StatusBadRequest)
+		return
+	}
+
+	// Validate that exactly one of EecId or EesId is provided in the request.
+	idCount := 0
+	if discReq.RequestorId.EecId != "" {
+		idCount++
+	}
+	if discReq.RequestorId.EesId != "" {
+		idCount++
+	}
+	if idCount != 1 {
+		log.Error("getEASDiscInfo: request validation failed - exactly one identifier required", "EecId", discReq.RequestorId.EecId, "EesId", discReq.RequestorId.EesId)
+		errHandlerProblemDetails(w, "Exactly one of eecId or eesId must be provided", http.StatusBadRequest)
+		return
+	}
+
+	// Process EecId if provided.
+	if discReq.RequestorId.EecId != "" {
+		key := baseKey + "app:" + discReq.RequestorId.EecId
+		sInfoJson1, err := rc.JSONGetEntry(key, ".")
+		if err != nil {
+			log.Error("getEASDiscInfo: invalid EecId", "EecId", discReq.RequestorId.EecId, "error", err)
+			errHandlerProblemDetails(w, "Invalid EecId", http.StatusBadRequest)
+			return
+		}
+		if sInfoJson1 == "" {
+			log.Error("getEASDiscInfo: no data found for provided EecId", "EecId", discReq.RequestorId.EecId)
+			errHandlerProblemDetails(w, "No data found for EecId", http.StatusNotFound)
+			return
+		}
+	} else {
+		// Validate the provided EesId against the dynamically generated platform configuration.
+		ednConfig, err := getDynamicPlatformDetails(basePath)
+		if err != nil {
+			log.Error("getEASDiscInfo: error retrieving dynamic platform details", "error", err)
+			errHandlerProblemDetails(w, "Platform configuration error: "+err.Error(), http.StatusInternalServerError)
+			return
+		}
+
+		if len(ednConfig.Eess) == 0 || ednConfig.Eess[0].EesId == "" {
+			log.Error("getEASDiscInfo: missing EES configuration in server settings")
+			errHandlerProblemDetails(w, "Server configuration error", http.StatusInternalServerError)
+			return
+		}
+
+		expectedEesId := ednConfig.Eess[0].EesId
+		if discReq.RequestorId.EesId != expectedEesId {
+			log.Error("getEASDiscInfo: provided EesId does not match expected configuration", "providedEesId", discReq.RequestorId.EesId, "expectedEesId", expectedEesId)
+			errHandlerProblemDetails(w, "Invalid EesId", http.StatusBadRequest)
+			return
+		}
+	}
+
+	// Retrieve the appInstanceId from the first AcCharacteristics entry if present.
+	var appInstanceId string
+	if discReq.EasDiscoveryFilter != nil && len(discReq.EasDiscoveryFilter.AcChars) > 0 {
+		acChar := discReq.EasDiscoveryFilter.AcChars[0]
+		if acChar.AcProf != nil {
+			appInstanceId = acChar.AcProf.AcId
+		}
+	}
+
+	// Ensure that appInstanceId is present in the request.
+	if appInstanceId == "" {
+		err := errors.New("getEASDiscInfo: acId not found in the request")
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	// Construct the datastore key for retrieving app information.
+	keyName := baseKey + "appInfo:" + appInstanceId
+	log.Info("getEASDiscInfo: retrieving app information", "keyName", keyName)
+	jsonAppInfo, err := rc.JSONGetEntry(keyName, ".")
+	if err != nil {
+		errMsg := "appInfo not found for the provided appInstanceId"
+		log.Error("getEASDiscInfo:", errMsg, "appInstanceId", appInstanceId, "error", err)
+		errHandlerProblemDetails(w, errMsg, http.StatusNotFound)
+		return
+	}
+
+	// Unmarshal the retrieved JSON data into the AppInfo structure.
+	var appInfo AppInfo
+	if err := json.Unmarshal([]byte(jsonAppInfo), &appInfo); err != nil {
+		log.Error("getEASDiscInfo: error unmarshaling appInfo", "error", err)
+		errHandlerProblemDetails(w, "Internal server error.", http.StatusInternalServerError)
+		return
+	}
+
+	// Map the AppInfo data to the EASProfile response format.
+	easProfile := EasProfile{
+		EasId:   appInfo.AppName,
+		EndPt:   appInfo.Endpoint,
+		ProvId:  appInfo.AppProvider,
+		Type_:   appInfo.AppCategory,
+		Scheds:  appInfo.Scheds,
+		SvcArea: appInfo.SvcArea,
+		SvcKpi:  appInfo.SvcKpi,
+		PermLvl: appInfo.PermLvl,
+		AcIds:   []string{appInfo.AppInstanceId},
+	}
+
+	// Build the full discovery response with the mapped EAS profile.
+	resp := EasDiscoveryResp{
+		DiscoveredEas: []DiscoveredEas{
+			{
+				Eas: &easProfile,
+			},
+		},
+	}
+
+	// Convert the response to JSON and send it with an HTTP 200 OK status.
+	jsonResponse := convertEasDiscoveryRespToJson(&resp)
+	w.WriteHeader(http.StatusOK)
+	log.Info("getEASDiscInfo: successfully processed request", "appInstanceId", appInstanceId)
+	fmt.Fprint(w, jsonResponse)
+}
+
 /*
 * appRegistrationPOST handles the registration of applications.
 * It decodes the request body into an AppInfo struct, validates mandatory parameters, retrieves app instance information, validates the app info, and stores it in Redis.
@@ -686,34 +1426,35 @@ func appRegistrationPOST(w http.ResponseWriter, r *http.Request) {
 		errHandlerProblemDetails(w, "Endpoint is required when IsInsByMec is FALSE.", http.StatusBadRequest)
 		return
 	}
+	if appInfo.IsInsByMec {
+		// Process appProfile if provided
+		if appInfo.AppProfile != nil {
+			// Validate appProvider and other fields mapped to EASProfile
+			if appInfo.AppProvider != appInfo.AppProfile.ProvId {
+				log.Error("Mismatch between appProvider in AppInfo and provId in appProfile")
+				errHandlerProblemDetails(w, "appProvider and provId must match.", http.StatusBadRequest)
+				return
+			}
 
-	// Process appProfile if provided
-	if appInfo.AppProfile != nil {
-		// Validate appProvider and other fields mapped to EASProfile
-		if appInfo.AppProvider != appInfo.AppProfile.ProvId {
-			log.Error("Mismatch between appProvider in AppInfo and provId in appProfile")
-			errHandlerProblemDetails(w, "appProvider and provId must match.", http.StatusBadRequest)
-			return
-		}
-
-		if !reflect.DeepEqual(getEndpointUris(appInfo.Endpoint), getProfileEndpointUris(appInfo.AppProfile.EndPt)) {
-			log.Error("Mismatch between endpoint in AppInfo and endPt in appProfile")
-			errHandlerProblemDetails(w, "Endpoint and endPt must match.", http.StatusBadRequest)
-			return
-		}
+			if !reflect.DeepEqual(getEndpointUris(appInfo.Endpoint), getProfileEndpointUris(appInfo.AppProfile.EndPt)) {
+				log.Error("Mismatch between endpoint in AppInfo and endPt in appProfile")
+				errHandlerProblemDetails(w, "Endpoint and endPt must match.", http.StatusBadRequest)
+				return
+			}
 
-		if appInfo.AppProfile.EasId == "" {
-			log.Error("Missing mandatory parameter: easId")
-			errHandlerProblemDetails(w, "Mandatory attribute easId is missing.", http.StatusBadRequest)
-			return
-		}
+			if appInfo.AppProfile.EasId == "" {
+				log.Error("Missing mandatory parameter: easId")
+				errHandlerProblemDetails(w, "Mandatory attribute easId is missing.", http.StatusBadRequest)
+				return
+			}
 
-		if appInfo.AppName != appInfo.AppProfile.EasId {
-			log.Error("Mismatch between AppName in AppInfo and EasId in appProfile")
-			errHandlerProblemDetails(w, "AppName and EasId must match.", http.StatusBadRequest)
-			return
+			if appInfo.AppName != appInfo.AppProfile.EasId {
+				log.Error("Mismatch between AppName in AppInfo and EasId in appProfile")
+				errHandlerProblemDetails(w, "AppName and EasId must match.", http.StatusBadRequest)
+				return
+			}
+			// Additional checks for attributes such as scheds, svcArea, etc., as required.
 		}
-		// Additional checks for attributes such as scheds, svcArea, etc., as required.
 	}
 
 	// Retrieve App instance information
diff --git a/go-apps/meep-app-enablement/server/app-support/convert.go b/go-apps/meep-app-enablement/server/app-support/convert.go
index c352c580c3cb16e714dca61bf9b7d0bc9867fe3a..072da21a4ecde40d1f8b34d0c68507690fdc384a 100644
--- a/go-apps/meep-app-enablement/server/app-support/convert.go
+++ b/go-apps/meep-app-enablement/server/app-support/convert.go
@@ -77,3 +77,42 @@ func convertAppInfoToJson(obj *AppInfo) string {
 
 	return string(jsonInfo)
 }
+
+func convertEcsServProvReqInfoToJson(obj *EcsServProvReq) string {
+	jsonInfo, err := json.Marshal(*obj)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
+
+func convertEecRegReqInfoToJson(obj *EecRegistration) string {
+	jsonInfo, err := json.Marshal(*obj)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
+
+func convertEecPrevRegReqInfoToJson(jsonInfo string) *EecRegistration {
+	var obj EecRegistration
+	err := json.Unmarshal([]byte(jsonInfo), &obj)
+	if err != nil {
+		log.Error(err.Error())
+		return nil
+	}
+	return &obj
+}
+
+func convertEasDiscoveryRespToJson(obj *EasDiscoveryResp) string {
+
+	jsonInfo, err := json.Marshal(*obj)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+
+	return string(jsonInfo)
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_ac_characteristics.go b/go-apps/meep-app-enablement/server/app-support/model_ac_characteristics.go
new file mode 100644
index 0000000000000000000000000000000000000000..27d4b86dc528c6fcb73c3aef1a7f1f0047b4082c
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_ac_characteristics.go
@@ -0,0 +1,15 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents EAS dynamic information changes filter.
+type AcCharacteristics struct {
+	AcProf *AcProfile `json:"acProf"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_ac_profile.go b/go-apps/meep-app-enablement/server/app-support/model_ac_profile.go
new file mode 100644
index 0000000000000000000000000000000000000000..6a960070ea247d4645a534235c744b21aaf24584
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_ac_profile.go
@@ -0,0 +1,24 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// AC information indicating required services and service characteristics.
+type AcProfile struct {
+	// Identity of the AC.
+	AcId string `json:"acId"`
+	// The category or type of AC.
+	AcType string `json:"acType,omitempty"`
+	// Indicates to the ECS which ECSPs are preferred for the AC.
+	PrefEcsps []string `json:"prefEcsps,omitempty"`
+
+	SimInactTime int32 `json:"simInactTime,omitempty"`
+	// List of EAS information.
+	Eass []EasDetail `json:"eass,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_acr_scenario.go b/go-apps/meep-app-enablement/server/app-support/model_acr_scenario.go
new file mode 100644
index 0000000000000000000000000000000000000000..c6a8bb65fc1a5d6bdcdefb46a97cdc1424d4d7c6
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_acr_scenario.go
@@ -0,0 +1,23 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents the ACR scenarios supported by EES.   Possible values are: - EEC_INITIATED: Represents the EEC initiated ACR scenario. - EEC_EXECUTED_VIA_SOURCE_EES: Represents the EEC ACR scenario executed via the S-EES. - EEC_EXECUTED_VIA_TARGET_EES: Represents the EEC ACR scenario executed via the T-EES. - SOURCE_EAS_DECIDED: Represents the EEC ACR scenario where the S-EAS decides to perform   ACR. - SOURCE_EES_EXECUTED: Represents the EEC ACR scenario where S-EES executes the ACR. - EEL_MANAGED_ACR: Represents the EEC ACR scenario where the ACR is managed by the   Edge Enabler Layer.
+type AcrScenario string
+
+// Enum values for ACRScenarioEnum.
+const (
+	EEC_INITIATED               AcrScenario = "EEC_INITIATED"
+	EEC_EXECUTED_VIA_SOURCE_EES AcrScenario = "EEC_EXECUTED_VIA_SOURCE_EES"
+	EEC_EXECUTED_VIA_TARGET_EES AcrScenario = "EEC_EXECUTED_VIA_TARGET_EES"
+	SOURCE_EAS_DECIDED          AcrScenario = "SOURCE_EAS_DECIDED"
+	SOURCE_EES_EXECUTED         AcrScenario = "SOURCE_EES_EXECUTED"
+	EEL_MANAGED_ACR             AcrScenario = "EEL_MANAGED_ACR"
+)
diff --git a/go-apps/meep-app-enablement/server/app-support/model_app_group_profile.go b/go-apps/meep-app-enablement/server/app-support/model_app_group_profile.go
new file mode 100644
index 0000000000000000000000000000000000000000..2a4efd0e6947cf6bd4b5851dddd488db69130ff8
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_app_group_profile.go
@@ -0,0 +1,18 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents the application group profile for common EAS.
+type AppGroupProfile struct {
+	// Represents the application group that uniquely identifies the group of UEs using the same application.
+	AppGrpId string `json:"appGrpId"`
+	// Represents the application identifier of the EAS.
+	EasId string `json:"easId"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_app_info.go b/go-apps/meep-app-enablement/server/app-support/model_app_info.go
index 836049ee3078989924b44d1a36c3e28d83a2b30e..958aa082ced964cce2ca771b34941eece62a300b 100644
--- a/go-apps/meep-app-enablement/server/app-support/model_app_info.go
+++ b/go-apps/meep-app-enablement/server/app-support/model_app_info.go
@@ -46,7 +46,11 @@ type AppInfo struct {
 	// Describes features a MEC application may use if available. FeatureDependency is defined in ETSI GS MEC 010-2 [4]. It shall not be provided if an AppD is available.
 	AppFeatureOptional []FeatureDependency `json:"appFeatureOptional,omitempty"`
 	// Indicate whether the application instance is instantiated by the MEC Management. Default to FALSE if absent.
-	IsInsByMec bool `json:"isInsByMec,omitempty"`
-
+	IsInsByMec bool        `json:"isInsByMec,omitempty"`
+	Scheds     []string    `json:"scheds"`
+	SvcArea    string      `json:"svcArea,omitempty"`
 	AppProfile *AppProfile `json:"appProfile,omitempty"`
+	// Service characteristics provided by the EAS.
+	SvcKpi  string   `json:"svcKpi,omitempty"`
+	PermLvl []string `json:"permLvl"`
 }
diff --git a/go-apps/meep-app-enablement/server/app-support/model_application_info.go b/go-apps/meep-app-enablement/server/app-support/model_application_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..1962b4b725e5cd57eb470fd9652f8e9b943320ef
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_application_info.go
@@ -0,0 +1,17 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents the services the EEC wants to connect.
+type ApplicationInfo struct {
+	AcProf *AcProfile `json:"acProf"`
+
+	AppGroupProfile *AppGroupProfile `json:"appGroupProfile,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_device_type.go b/go-apps/meep-app-enablement/server/app-support/model_device_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..24a47c7712a44bdb0a7f6a347484441a18399952
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_device_type.go
@@ -0,0 +1,18 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents the UE type. Possible values are: - CONSTRAINED_UE: Indicates UE is constrained with resources like power, processor etc. - NORMAL_UE: Indicates UE is not constrained with resources.
+type DeviceType string
+
+const (
+	ConstrainedUE = "CONSTRAINED_UE"
+	NormalUE      = "NORMAL_UE"
+)
diff --git a/go-apps/meep-app-enablement/server/app-support/model_discovered_eas.go b/go-apps/meep-app-enablement/server/app-support/model_discovered_eas.go
new file mode 100644
index 0000000000000000000000000000000000000000..97141c3661f7bd71c6207499428c9b356cdc4ca3
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_discovered_eas.go
@@ -0,0 +1,23 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"time"
+)
+
+// Represents an EAS discovery information.
+type DiscoveredEas struct {
+	Eas *EasProfile `json:"eas"`
+
+	EesEndPt *EndPoint `json:"eesEndPt,omitempty"`
+
+	LifeTime *time.Time `json:"lifeTime,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_eas_detail.go b/go-apps/meep-app-enablement/server/app-support/model_eas_detail.go
new file mode 100644
index 0000000000000000000000000000000000000000..f93b04308455c47e4c107364641440e48fe6400c
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_eas_detail.go
@@ -0,0 +1,16 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// EAS details.
+type EasDetail struct {
+	// Application identifier of the EAS.
+	EasId string `json:"easId"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_filter.go b/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_filter.go
new file mode 100644
index 0000000000000000000000000000000000000000..6c27737cfa0a335406a0a3b30a41c23add87efc9
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_filter.go
@@ -0,0 +1,16 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents the EAS characteristics.
+type EasDiscoveryFilter struct {
+	// AC description for which an EAS is needed.
+	AcChars []AcCharacteristics `json:"acChars,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_req.go b/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_req.go
new file mode 100644
index 0000000000000000000000000000000000000000..4d6af9722d60a0ae0afd989632450921a9e47e15
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_req.go
@@ -0,0 +1,39 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"time"
+)
+
+// EAS discovery request information.
+type EasDiscoveryReq struct {
+	RequestorId *RequestorId `json:"requestorId"`
+
+	UeId string `json:"ueId,omitempty"`
+
+	EasDiscoveryFilter *EasDiscoveryFilter `json:"easDiscoveryFilter,omitempty"`
+	// Indicates if the EEC supports service continuity or not, also indicates which ACR scenarios are supported by the EEC.
+	EecSvcContinuity []AcrScenario `json:"eecSvcContinuity,omitempty"`
+	// Indicates if the EES supports service continuity or not, also indicates which ACR scenarios are supported by the EES.
+	EesSvcContinuity []AcrScenario `json:"eesSvcContinuity,omitempty"`
+	// Indicates if the EAS supports service continuity or not, also indicates which ACR scenarios are supported by the EAS.
+	EasSvcContinuity []AcrScenario `json:"easSvcContinuity,omitempty"`
+
+	LocInf *LocationInfo `json:"locInf,omitempty"`
+	// Indicates if the EEC requires the EAS selection support from the EES (e.g., for constrained device). The default value false indicates the EAS selection is not required from the EES.
+	EasSelSupInd bool `json:"easSelSupInd,omitempty"`
+
+	SuppFeat string `json:"suppFeat,omitempty"`
+	// Indicates to the EES whether the EAS instantiation triggering should be performed for the current request. The default value false indicates the EAS instantiation triggering should not be performed. The true value indicate the EAS instantiation triggering should be performed.
+	EasIntTrigSup bool `json:"easIntTrigSup,omitempty"`
+
+	PredictExpTime *time.Time `json:"predictExpTime,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_resp.go b/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_resp.go
new file mode 100644
index 0000000000000000000000000000000000000000..6c6a76a8806cab50e976b06f8a460e6a0e30674d
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_eas_discovery_resp.go
@@ -0,0 +1,16 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// EAS discovery response.
+type EasDiscoveryResp struct {
+	// List of EAS discovery information.
+	DiscoveredEas []DiscoveredEas `json:"discoveredEas"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_eas_profile.go b/go-apps/meep-app-enablement/server/app-support/model_eas_profile.go
new file mode 100644
index 0000000000000000000000000000000000000000..c26789af56b6f371bd27c976235707b0c4c9ba06
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_eas_profile.go
@@ -0,0 +1,41 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type EasProfile struct {
+	// The identifier of the EAS
+	EasId string `json:"easId"`
+
+	EndPt *OneOfAppInfoEndpoint `json:"endPt"`
+	// Identities of the Application Clients that can be served by the EAS
+	AcIds []string `json:"acIds"`
+	// Identifier of the ASP that provides the EAS.
+	ProvId string `json:"provId,omitempty"`
+	// The category or type of EAS.
+	Type_ *CategoryRef `json:"type,omitempty"`
+	// The availability schedule of the EAS.
+	Scheds []string `json:"scheds"`
+	// The list of geographical and topological areas that the EAS serves. ACs in the UE that are outside the area will not be served.
+	SvcArea string `json:"svcArea,omitempty"`
+	// Service characteristics provided by the EAS.
+	SvcKpi string `json:"svcKpi,omitempty"`
+	// level of service permissions supported by the EAS.
+	PermLvl []string `json:"permLvl"`
+	// Service features supported by the EAS.
+	EasFeats []string `json:"easFeats"`
+	// The ACR scenarios supported by the EAS for service continuity.
+	SvcContSupp []string `json:"svcContSupp"`
+	// List of DNAI(s) and the N6 traffic information associated with the EAS.
+	AppLocs []string `json:"appLocs"`
+	// The period indicating to the EES, how often the EES needs to check the EAS's availability after a successful registration.
+	AvlRep int32 `json:"avlRep,omitempty"`
+	// EAS status information.
+	Status string `json:"status,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_ecs_serv_prov_req.go b/go-apps/meep-app-enablement/server/app-support/model_ecs_serv_prov_req.go
new file mode 100644
index 0000000000000000000000000000000000000000..8afeff3ada39a00f25575a46ed5a3c53a9b4350a
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_ecs_serv_prov_req.go
@@ -0,0 +1,30 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// ECS service provisioning request information.
+type EcsServProvReq struct {
+	// Represents a unique identifier of the EEC.
+	EecId string `json:"eecId"`
+
+	UeId string `json:"ueId,omitempty"`
+	// Information about services the EEC wants to connect to.
+	AcProfs []AcProfile `json:"acProfs,omitempty"`
+	// Information about the list of services the EEC wants to connect.
+	AppInfo []ApplicationInfo `json:"appInfo,omitempty"`
+	// Indicates if the EEC supports service continuity or not, also indicates which ACR scenarios are supported by the EEC.
+	EecSvcContSupp []AcrScenario `json:"eecSvcContSupp,omitempty"`
+
+	LocInf *LocationInfo `json:"locInf,omitempty"`
+	// Indicates to the ECS which EES providers are preferred by the EEC.
+	EcspIds []string `json:"ecspIds,omitempty"`
+
+	SuppFeat string `json:"suppFeat,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_edn_con_info.go b/go-apps/meep-app-enablement/server/app-support/model_edn_con_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..8abe61ed016ec67536cdd82e08955b9b2912ac74
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_edn_con_info.go
@@ -0,0 +1,15 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents an EDN connection information.
+type EdnConInfo struct {
+	Dnn string `json:"dnn,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_edn_config_info.go b/go-apps/meep-app-enablement/server/app-support/model_edn_config_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..8f10cf3114bb93ef2bb0394988ee7d07efecabfb
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_edn_config_info.go
@@ -0,0 +1,23 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"time"
+)
+
+// Represents the EDN configuration information.
+type EdnConfigInfo struct {
+	EdnConInfo *EdnConInfo `json:"ednConInfo"`
+	// Contains the list of EESs of the EDN.
+	Eess []EesInfo `json:"eess"`
+
+	LifeTime *time.Time `json:"lifeTime,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_eec_registration.go b/go-apps/meep-app-enablement/server/app-support/model_eec_registration.go
new file mode 100644
index 0000000000000000000000000000000000000000..8b610d3cac9842961d420ef246d66afcf162f03f
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_eec_registration.go
@@ -0,0 +1,40 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"time"
+)
+
+// Describes the parameters to perform EEC Registration related operations.
+type EecRegistration struct {
+	// Represents a unique identifier of the EEC.
+	EecId string `json:"eecId"`
+
+	UeId string `json:"ueId,omitempty"`
+	// Profiles of ACs for which the EEC provides edge enabling services.
+	AcProfs []AcProfile `json:"acProfs,omitempty"`
+
+	ExpTime *time.Time `json:"expTime,omitempty"`
+	// Profiles of ACs for which the EEC provides edge enabling services.
+	EecSvcContSupp []AcrScenario `json:"eecSvcContSupp,omitempty"`
+	// Identifier of the EEC context obtained from a previous registration.
+	EecCntxId string `json:"eecCntxId,omitempty"`
+	// Identifier of the EES that provided EEC context ID.
+	SrcEesId string `json:"srcEesId,omitempty"`
+
+	EndPt *EndPoint `json:"endPt,omitempty"`
+	// Set to true to indicate that UE Mobility support is required. Set to false to indicate that UE mobility support is not required. The default value when omitted is false.
+	UeMobilityReq bool `json:"ueMobilityReq,omitempty"`
+	// Set to true to indicate the EES support for EAS selection. Set to false to indicate the EES shall not select the EAS. The default value when omitted is false.
+	EasSelReqInd bool `json:"easSelReqInd,omitempty"`
+
+	UeType *DeviceType `json:"ueType,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_ees_info.go b/go-apps/meep-app-enablement/server/app-support/model_ees_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..1fadd0541d791d1a383d58af07b283df656a9b09
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_ees_info.go
@@ -0,0 +1,22 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents EES information.
+type EesInfo struct {
+	// Identity of the EES.
+	EesId string `json:"eesId"`
+
+	EndPt *EndPoint `json:"endPt,omitempty"`
+	// Application identities of the Edge Application Servers registered with the EES.
+	EasIds []string `json:"easIds,omitempty"`
+	// Indicates whether the EEC is required to register on the EES to use edge services or not.
+	EecRegConf bool `json:"eecRegConf"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_end_point.go b/go-apps/meep-app-enablement/server/app-support/model_end_point.go
new file mode 100644
index 0000000000000000000000000000000000000000..c871e1f9e0f209d34d3caf387994f6f807831dbc
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_end_point.go
@@ -0,0 +1,21 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// The end point information to reach EAS.
+type EndPoint struct {
+	Fqdn string `json:"fqdn,omitempty"`
+	// IPv4 addresses of the edge server.
+	Ipv4Addrs []string `json:"ipv4Addrs,omitempty"`
+	// IPv6 addresses of the edge server.
+	Ipv6Addrs []string `json:"ipv6Addrs,omitempty"`
+
+	Uri string `json:"uri,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_geographic_area.go b/go-apps/meep-app-enablement/server/app-support/model_geographic_area.go
new file mode 100644
index 0000000000000000000000000000000000000000..1ca1b111be06b25e39eb4cc8f95f21a8437918e4
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_geographic_area.go
@@ -0,0 +1,15 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Geographic area specified by different shape.
+type GeographicArea struct {
+	Point *Point `json:"point,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_geographical_coordinates.go b/go-apps/meep-app-enablement/server/app-support/model_geographical_coordinates.go
new file mode 100644
index 0000000000000000000000000000000000000000..2916c05e1cfef85706dd8af1b172c033400e9c75
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_geographical_coordinates.go
@@ -0,0 +1,17 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Geographical coordinates.
+type GeographicalCoordinates struct {
+	Lon float64 `json:"lon"`
+
+	Lat float64 `json:"lat"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_inline_response_201.go b/go-apps/meep-app-enablement/server/app-support/model_inline_response_201.go
new file mode 100644
index 0000000000000000000000000000000000000000..c8beccfa2209cceeb237ace88003810a1ef7c901
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_inline_response_201.go
@@ -0,0 +1,27 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"time"
+)
+
+type InlineResponse201 struct {
+	// Identifier of the EEC registration.
+	RegistrationID string `json:"RegistrationID,omitempty"`
+	// Expiration time of the registration.
+	ExpirationTime time.Time `json:"ExpirationTime,omitempty"`
+	// Identifier of the EEC context information available at the EES.
+	EECContextID string `json:"EECContextID,omitempty"`
+	// Indicates whether the EEC context retrieval from the source EES was successful.
+	EECContextRelocationStatus bool `json:"EECContextRelocationStatus,omitempty"`
+
+	DiscoveredEASList []EasProfile `json:"DiscoveredEASList,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_location_info.go b/go-apps/meep-app-enablement/server/app-support/model_location_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..43b39d40a96402ca29daa10d3786b4deae4ac636
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_location_info.go
@@ -0,0 +1,15 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents the user location information.
+type LocationInfo struct {
+	GeographicArea *GeographicArea `json:"geographicArea,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_point.go b/go-apps/meep-app-enablement/server/app-support/model_point.go
new file mode 100644
index 0000000000000000000000000000000000000000..8883debf93f39f21703f8947e472e55f6ca599fb
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_point.go
@@ -0,0 +1,17 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Ellipsoid Point.
+type Point struct {
+	Point *GeographicalCoordinates `json:"point"`
+
+	Shape *SupportedGadShapes `json:"shape"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_registrations_registration_id_body.go b/go-apps/meep-app-enablement/server/app-support/model_registrations_registration_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..b19f20de67f9399f89f82622d2174a950dfe0cbd
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_registrations_registration_id_body.go
@@ -0,0 +1,23 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"time"
+)
+
+type RegistrationsRegistrationIdBody struct {
+	// Profiles of ACs for which the EEC provides edge enabling services.
+	AcProfs []AcProfile `json:"acProfs,omitempty"`
+
+	ExpTime *time.Time `json:"expTime,omitempty"`
+	// Set to true to indicate that UE Mobility support is required. Set to false to indicate that UE mobility support is not required. The default value when omitted is false.
+	UeMobilityReq bool `json:"ueMobilityReq,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_requestor_id.go b/go-apps/meep-app-enablement/server/app-support/model_requestor_id.go
new file mode 100644
index 0000000000000000000000000000000000000000..e20f925d2836e7a2ccf5707cb93f024ecff8d27c
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_requestor_id.go
@@ -0,0 +1,20 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Represents identifier of the requestor.
+type RequestorId struct {
+	// The identifier of the EES (e.g. S-EES).
+	EesId string `json:"eesId,omitempty"`
+	// The application identifier of the EAS (e.g. S-EAS), e.g. FQDN, URI.
+	EasId string `json:"easId,omitempty"`
+	// The identifier of the EEC.
+	EecId string `json:"eecId,omitempty"`
+}
diff --git a/go-apps/meep-app-enablement/server/app-support/model_supported_gad_shapes.go b/go-apps/meep-app-enablement/server/app-support/model_supported_gad_shapes.go
new file mode 100644
index 0000000000000000000000000000000000000000..109dc363032054bd62c86f2cdcf6b365c69fec41
--- /dev/null
+++ b/go-apps/meep-app-enablement/server/app-support/model_supported_gad_shapes.go
@@ -0,0 +1,29 @@
+/*
+ * MEC Service Management API
+ *
+ * The ETSI MEC ISG MEC011 MEC Service Management API described using OpenAPI
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Indicates supported GAD shapes.
+type SupportedGadShapes string
+
+// Enum values for SupportedGADShapes.
+const (
+	POINT                                      SupportedGadShapes = "POINT"
+	POINT_UNCERTAINTY_CIRCLE                   SupportedGadShapes = "POINT_UNCERTAINTY_CIRCLE"
+	POINT_UNCERTAINTY_ELLIPSE                  SupportedGadShapes = "POINT_UNCERTAINTY_ELLIPSE"
+	POLYGON                                    SupportedGadShapes = "POLYGON"
+	POINT_ALTITUDE                             SupportedGadShapes = "POINT_ALTITUDE"
+	POINT_ALTITUDE_UNCERTAINTY                 SupportedGadShapes = "POINT_ALTITUDE_UNCERTAINTY"
+	ELLIPSOID_ARC                              SupportedGadShapes = "ELLIPSOID_ARC"
+	LOCAL_2D_POINT_UNCERTAINTY_ELLIPSE         SupportedGadShapes = "LOCAL_2D_POINT_UNCERTAINTY_ELLIPSE"
+	LOCAL_3D_POINT_UNCERTAINTY_ELLIPSOID       SupportedGadShapes = "LOCAL_3D_POINT_UNCERTAINTY_ELLIPSOID"
+	DISTANCE_DIRECTION                         SupportedGadShapes = "DISTANCE_DIRECTION"
+	RELATIVE_2D_LOCATION_UNCERTAINTY_ELLIPSE   SupportedGadShapes = "RELATIVE_2D_LOCATION_UNCERTAINTY_ELLIPSE"
+	RELATIVE_3D_LOCATION_UNCERTAINTY_ELLIPSOID SupportedGadShapes = "RELATIVE_3D_LOCATION_UNCERTAINTY_ELLIPSOID"
+)
diff --git a/go-apps/meep-app-enablement/server/routers.go b/go-apps/meep-app-enablement/server/routers.go
index 1ad8f96b930446f4da7f46b1126c995e0ab2596b..8a59112dc81ef6b4b521bc1ed39ad3deb3dab4ef 100644
--- a/go-apps/meep-app-enablement/server/routers.go
+++ b/go-apps/meep-app-enablement/server/routers.go
@@ -182,6 +182,13 @@ var routes = Routes{
 		appSupport.TimingCapsGET,
 	},
 
+	Route{
+		"GetEASDiscInfo",
+		strings.ToUpper("Post"),
+		"/eees-easdiscovery/v1/eas-profiles/request-discovery",
+		appSupport.GetEASDiscInfo,
+	},
+
 	Route{
 		"TimingCurrentTimeGET",
 		strings.ToUpper("Get"),
@@ -322,6 +329,41 @@ var routes = Routes{
 		svcMgmt.TransportsGET,
 	},
 
+	Route{
+		"RequestServProv",
+		strings.ToUpper("Post"),
+		"/eecs-serviceprovisioning/v1/request",
+		appSupport.RequestServProv,
+	},
+
+	Route{
+		"DeleteEECReg",
+		strings.ToUpper("Delete"),
+		"/eees-eecregistration/v1/registration/{registrationId}",
+		appSupport.DeleteIndEECReg,
+	},
+
+	Route{
+		"UpdateRegistrationPut",
+		strings.ToUpper("Put"),
+		"/eees-eecregistration/v1/registration/{registrationId}",
+		appSupport.UpdateRegistrationPut,
+	},
+
+	Route{
+		"GetRegistration",
+		strings.ToUpper("Get"),
+		"/eees-eecregistration/v1/registration/{registrationId}",
+		appSupport.GetRegistration,
+	},
+
+	Route{
+		"CreateEECReg",
+		strings.ToUpper("Post"),
+		"/eees-eecregistration/v1/registration",
+		appSupport.CreateEECReg,
+	},
+
 	Route{
 		"Index",
 		"GET",