diff --git a/README.md b/README.md
index cda2d468c6ba86c06e184596940ac26e6701511a..dc9b11163b75a52363b85b6cc4681deedcf55514 100644
--- a/README.md
+++ b/README.md
@@ -64,7 +64,7 @@ Network Apps can be developed by third-party service providers, network operator
 
 Next image illustrates how CAPIF works and where the SDK provides means to integrate with it:
 
-![CAPIF-illustration](./doc/images/flows_capif_illustration.jpg)
+![CAPIF-illustration](./doc/images/flows-capif_illustration.jpg)
 
 For that purpose Network Apps play 2 different roles when interacting with CAPIF:
 - **Invoker**: a Network App acting as an Invoker is responsible for consuming APIs exposed by other services. This role represents an external application or service that  calls the 3GPP northbound APIs to utilize the network’s functionalities.
@@ -97,6 +97,10 @@ OpenCAPIF SDK brings a set of functions to integrate with the 5G Core's function
 | /{apfId}/service-apis (GET)            | [get_all_services()](./doc/sdk_full_documentation.md#get-all-services)                                          | Retrieves a list of all available service APIs for a specific `apfId`            |
 | /aef-security/v1/check-authentication (POST)            | [check_authentication()](./doc/sdk_full_documentation.md#check_authentication)                                          | This custom operation allows the API invoker to confirm the `supported_features` from the API exposing function(AEF)            |
 | /api-invocation-logs/v1/{aefId}/logs (POST)             | [create_logs( aefId, api_invoker_id)](./doc/sdk_full_documentation.md#create_logs) | This operation allows to the Provider to notice to the CCF about the query of an invoker for an especific `aefId`
+| /capif-events/v1/{subscriberId}/subscriptions (POST)             | [create_subscription(name, id)](./doc/sdk_full_documentation.md#create_subscription) | This operation allows to the Invoker/AEF/APF/AMF to ask to the CCF about notifications related to certain functionalities.
+| /capif-events/v1/{subscriberId}/subscriptions/{subscriptionId} (DELETE)             | [delete_subscription(name, id)](./doc/sdk_full_documentation.md#delete_subscription) | This operation allows to the Invoker/AEF/APF/AMF to withdraw the petition to receive notifications related to certain functionalities.
+| /capif-events/v1/{subscriberId}/subscriptions/{subscriptionId} (PUT)             | [update_subscription(name, id)](./doc/sdk_full_documentation.md#update_subscription) | This operation allows to the Invoker/AEF/APF/AMF to modify to the petition to receive notifications related to certain functionalities. **ONLY AVAILABLE IN OPENCAPIF RELEASE 2**
+| /capif-events/v1/{subscriberId}/subscriptions/{subscriptionId} (PATCH)             | [patch_subscription(name, id)](./doc/sdk_full_documentation.md#patch_subscription) | This operation allows to the Invoker/AEF/APF/AMF to modify to the petition to receive notifications related to certain functionalities. **ONLY AVAILABLE IN OPENCAPIF RELEASE 2**
 
 NOTE: Above mentioned CAPIF APIs are defined in these 3GPP references:
 - [CAPIF Invoker API specification](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_API_Invoker_Management_API.yaml)
@@ -106,7 +110,7 @@ NOTE: Above mentioned CAPIF APIs are defined in these 3GPP references:
 - [CAPIF Security API specification](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Security_API.yaml)
 - [AEF Security API specification](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_AEF_Security_API.yaml)
 - [CAPIF Logging API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Logging_API_Invocation_API.yaml)
-
+- [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml)
 NOTE: In the [3GPP Technical Specification (TS) 29.222 V18.5.0 Common API Framework for 3GPP Northbound APIs](https://www.etsi.org/deliver/etsi_ts/129200_129299/129222/18.05.00_60/ts_129222v180500p.pdf) the `service` concept is understood as equal as the `API` concept.
 
 
@@ -132,7 +136,7 @@ Here is a visual look on the variables of the CAPIF sdk referenced in:
 - [Important information for Invoker Consumer](#important-information-for-invoker-consumer) 
 - [Important information for Provider Consumer](#important-information-for-provider-consumers)
 
-![sdk_data_schema](./doc/images/flows_data_schema.png)
+![sdk_data_schema](./doc/images/flows-data_schema.png)
 
 # Network App developer path
 
@@ -144,7 +148,7 @@ Here is a good explanation about how a usual flow of a Network App should work:
 
 A Network App development running as a Provider would typically follow this process step by step, making use of the SDK:
 
-![PROVIDER_PATH](./doc/images/flows_provider_path.jpg)
+![PROVIDER_PATH](./doc/images/flows-provider_path.jpg)
 
 Now, it is described in 4 simple steps how a Provider can be developed in just some code lines, below snippet. It describes the usual flow a Provider would follow to publish an API service.
 
@@ -228,7 +232,7 @@ The `provider_capif_ids` variable stores the `provider_capif_ids.json` content i
 
 A Network App development running as an Invoker would typically follow this process step by step, making use of the SDK: 
 
-![INVOKER_PATH](./doc/images/flows_invoker_path.jpg)
+![INVOKER_PATH](./doc/images/flows-invoker_path.jpg)
 
 Now, it is described in some simple steps how an Invoker can be developed in just some code lines. Find below the code snippet. It describes the usual flow an Invoker would follow to consume APIs from CAPIF.
 
@@ -317,7 +321,6 @@ There are some features which **are not currently available at latest OpenCAPIF
 
   - [CAPIF Access control policy management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Access_Control_Policy_API.yaml)
   - [CAPIF Auditing API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Auditing_API.yaml)
-  - [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml)
   - [CAPIF Routing info API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Routing_Info_API.yaml)
   - [CAPIF Security API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Security_API.yaml)
     - /trustedInvokers/{apiInvokerId}/delete (POST)
diff --git a/config/capif_sdk_config.json b/config/capif_sdk_config.json
index f76613236f6d5319187c3be9b169a79127ae7846..4fc7f767c9a4149816d43377d56363328d9c148b 100644
--- a/config/capif_sdk_config.json
+++ b/config/capif_sdk_config.json
@@ -9,10 +9,10 @@
   "invoker": {
     "invoker_folder": "",
     "capif_callback_url": "",
-    "supported_features":"",
-    "check_authentication_data":{
-      "ip":"",
-      "port":""
+    "supported_features": "",
+    "check_authentication_data": {
+      "ip": "",
+      "port": ""
     },
     "cert_generation": {
       "csr_common_name": "",
@@ -37,21 +37,21 @@
       "api-supported-features": "",
       "ue-ip-addr": "",
       "service-kpis": ""
+    },
+    "events": {
+      "description": [""],
+      "eventFilters": [
+        {
+          "apiIds": [""],
+          "apiInvokerIds": [""],
+          "aefIds": [""]
+        }
+      ]
     }
   },
   "provider": {
     "provider_folder": "",
     "supported_features": "",
-    "apfs": "",
-    "aefs": "",
-    "publish_req": {
-      "service_api_id": "",
-      "publisher_apf_id": "",
-      "publisher_aefs_ids": [
-        "",
-        ""
-      ]
-    },
     "cert_generation": {
       "csr_common_name": "",
       "csr_organizational_unit": "",
@@ -61,8 +61,30 @@
       "csr_country_name": "",
       "csr_email_address": ""
     },
+    "apfs": "",
+    "aefs": "",
+    "publish_req": {
+      "service_api_id": "",
+      "publisher_apf_id": "",
+      "publisher_aefs_ids": ["", ""]
+    },
     "api_description_path": "",
-    "log":{            
+    "events": {
+      "description": [""],
+      "eventFilters": [
+        {
+          "apiIds": [""],
+          "apiInvokerIds": [""],
+          "aefIds": [""]
+        }
+      ],
+      "notificationDestination": "",
+      "websockNotifConfig": {
+        "websocketUri": "",
+        "requestWebsocketUri": false
+      }
+    },
+    "log": {
       "apiName": "",
       "apiVersion": "",
       "resourceName": "",
@@ -71,5 +93,5 @@
       "operation": "",
       "result": ""
     }
-   }
+  }
 }
diff --git a/doc/images/capif_provider_details_example.png b/doc/images/capif_provider_details_example.png
deleted file mode 100644
index a22b797c2bd2328a0b0e63bdedad98e6b46e94ff..0000000000000000000000000000000000000000
Binary files a/doc/images/capif_provider_details_example.png and /dev/null differ
diff --git a/doc/images/flows_capif_illustration.jpg b/doc/images/flows-capif_illustration.jpg
similarity index 100%
rename from doc/images/flows_capif_illustration.jpg
rename to doc/images/flows-capif_illustration.jpg
diff --git a/doc/images/flows_data_schema.png b/doc/images/flows-data_schema.png
similarity index 100%
rename from doc/images/flows_data_schema.png
rename to doc/images/flows-data_schema.png
diff --git a/doc/images/flows-event_subscription.jpg b/doc/images/flows-event_subscription.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e2315231bc3d0385c78146ba118d26e4d38426fd
Binary files /dev/null and b/doc/images/flows-event_subscription.jpg differ
diff --git a/doc/images/flows-invoker_check_authentication.jpg b/doc/images/flows-invoker_check_authentication.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..589a305a3c7a3909b32b1be60cc105000d0dc3d5
Binary files /dev/null and b/doc/images/flows-invoker_check_authentication.jpg differ
diff --git a/doc/images/flows-invoker_discover.jpg b/doc/images/flows-invoker_discover.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e51f04600fe2bd25686fb627c5084873b8c81fed
Binary files /dev/null and b/doc/images/flows-invoker_discover.jpg differ
diff --git a/doc/images/flows-invoker_get_tokens.jpg b/doc/images/flows-invoker_get_tokens.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..103966840ac019aed2cda9a4535a6b225e9bba37
Binary files /dev/null and b/doc/images/flows-invoker_get_tokens.jpg differ
diff --git a/doc/images/flows-invoker_onboard.jpg b/doc/images/flows-invoker_onboard.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a80a5ebdda7b539ddbbfedb5718feb064324bc74
Binary files /dev/null and b/doc/images/flows-invoker_onboard.jpg differ
diff --git a/doc/images/flows-invoker_path.jpg b/doc/images/flows-invoker_path.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6879f18f3ee43da6d9537d326e7885a2560e15c9
Binary files /dev/null and b/doc/images/flows-invoker_path.jpg differ
diff --git a/doc/images/flows-invoker_update_offboard.jpg b/doc/images/flows-invoker_update_offboard.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b1aef970f23cb65f82f24940dcaa16d2aa8533a2
Binary files /dev/null and b/doc/images/flows-invoker_update_offboard.jpg differ
diff --git a/doc/images/flows-provider_logs.jpg b/doc/images/flows-provider_logs.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f200d091af66958a0c5c6924cf4e28c64227c310
Binary files /dev/null and b/doc/images/flows-provider_logs.jpg differ
diff --git a/doc/images/flows-provider_onboard.jpg b/doc/images/flows-provider_onboard.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..85c4662ba81fbbcaadbe5a66080a906a5d24819c
Binary files /dev/null and b/doc/images/flows-provider_onboard.jpg differ
diff --git a/doc/images/flows-provider_path.jpg b/doc/images/flows-provider_path.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..253b828ff2954e1bcee57e54c3e45571132554de
Binary files /dev/null and b/doc/images/flows-provider_path.jpg differ
diff --git a/doc/images/flows-provider_publish_functions.jpg b/doc/images/flows-provider_publish_functions.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8104ee61855cd0a911cf47bff4af2c7b7e321b3a
Binary files /dev/null and b/doc/images/flows-provider_publish_functions.jpg differ
diff --git a/doc/images/flows-provider_update_offboard.jpg b/doc/images/flows-provider_update_offboard.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4c8c4a3f9b16d5795e17f4cb29aaf0c367c18de3
Binary files /dev/null and b/doc/images/flows-provider_update_offboard.jpg differ
diff --git a/doc/images/flows_sdk_with_register.jpg b/doc/images/flows-sdk_with_register.jpg
similarity index 100%
rename from doc/images/flows_sdk_with_register.jpg
rename to doc/images/flows-sdk_with_register.jpg
diff --git a/doc/images/flows-updated_opencapif .jpg b/doc/images/flows-updated_opencapif .jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6e2ac44952889f949e79a62fca210d798ecfa57e
Binary files /dev/null and b/doc/images/flows-updated_opencapif .jpg differ
diff --git a/doc/images/flows_invoker_check_authentication.jpg b/doc/images/flows_invoker_check_authentication.jpg
deleted file mode 100644
index 29a348a902dd47f492e6bb2a29102b107cb2a003..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_invoker_check_authentication.jpg and /dev/null differ
diff --git a/doc/images/flows_invoker_discover.jpg b/doc/images/flows_invoker_discover.jpg
deleted file mode 100644
index 8d74e9b3c716136fde6d5ab7ee9a0af4302ff148..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_invoker_discover.jpg and /dev/null differ
diff --git a/doc/images/flows_invoker_get_tokens.jpg b/doc/images/flows_invoker_get_tokens.jpg
deleted file mode 100644
index 744496ced00b34ab994e7f04c0021d1075119ecb..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_invoker_get_tokens.jpg and /dev/null differ
diff --git a/doc/images/flows_invoker_onboard.jpg b/doc/images/flows_invoker_onboard.jpg
deleted file mode 100644
index ba7f69e258d420cd0cdb61b351f2ced7c554c3fb..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_invoker_onboard.jpg and /dev/null differ
diff --git a/doc/images/flows_invoker_path.jpg b/doc/images/flows_invoker_path.jpg
deleted file mode 100644
index 2cba9d6a1f7db7967501e5aec2845d223c979d55..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_invoker_path.jpg and /dev/null differ
diff --git a/doc/images/flows_invoker_update_offboard.jpg b/doc/images/flows_invoker_update_offboard.jpg
deleted file mode 100644
index 7944c6bd51a18fb028fd7b074a2058a09cfc9860..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_invoker_update_offboard.jpg and /dev/null differ
diff --git a/doc/images/flows_provider_onboard.jpg b/doc/images/flows_provider_onboard.jpg
deleted file mode 100644
index b352ea3de7944f4ca573b6c091fa26993fa33739..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_provider_onboard.jpg and /dev/null differ
diff --git a/doc/images/flows_provider_path.jpg b/doc/images/flows_provider_path.jpg
deleted file mode 100644
index f80c48277993e7b9073c2d8c0892054bdd921e38..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_provider_path.jpg and /dev/null differ
diff --git a/doc/images/flows_provider_publish_functions.jpg b/doc/images/flows_provider_publish_functions.jpg
deleted file mode 100644
index 38dec6ee58618f3e540c340f4e1eefd3a492e116..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_provider_publish_functions.jpg and /dev/null differ
diff --git a/doc/images/flows_provider_update_offboard.jpg b/doc/images/flows_provider_update_offboard.jpg
deleted file mode 100644
index 09ad5c7e1633eda2df037d15eb0b3979213355eb..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_provider_update_offboard.jpg and /dev/null differ
diff --git a/doc/images/flows_updated_opencapif.jpg b/doc/images/flows_updated_opencapif.jpg
deleted file mode 100644
index eb7c724cabe315da35c08f5025f2f4a1bf5daedd..0000000000000000000000000000000000000000
Binary files a/doc/images/flows_updated_opencapif.jpg and /dev/null differ
diff --git a/doc/images/publish_req_example.png b/doc/images/publish_req_example.png
deleted file mode 100644
index ace48252f76e40edebbfe82717a010009d87851a..0000000000000000000000000000000000000000
Binary files a/doc/images/publish_req_example.png and /dev/null differ
diff --git a/doc/sdk_configuration.md b/doc/sdk_configuration.md
index f5ee0cc0656ad5f396572d1a525affb33377fc40..738d5948a2644b07e941e021c61a1d437b831be2 100644
--- a/doc/sdk_configuration.md
+++ b/doc/sdk_configuration.md
@@ -32,7 +32,7 @@ When configuring the SDK as a **Network App Invoker**, the following fields must
 - `invoker_folder`
 - `capif_callback_url`
 - `supported_features`
-- `cert_generation` (fields such as `csr_common_name`, `csr_country_name`, etc.)
+- `cert_generation` (fields such as `csr_common_name`, `csr_country_name`, etc.) For csr_country_name it is important to fulfill the field with [THIS format](https://www.ssl.com/country-codes/)
 
 **Optional:**
 - `discover_filter`: useful to enable the discovery of specific APIs. Some fields under [`discover_filter`](#configuration-of-discover_filter) structure required to be configured when using discovery filters. Check devoted section below,
diff --git a/doc/sdk_full_documentation.md b/doc/sdk_full_documentation.md
index 32d9f43021fa51a29162ef78f31c7667b7a0a34e..d309f3d440e7383a67edc2ae4e78172bc21de444 100644
--- a/doc/sdk_full_documentation.md
+++ b/doc/sdk_full_documentation.md
@@ -15,7 +15,7 @@ Before using the SDK, the following steps should be completed:
 
 ## Available SDK Usage Modes
 
-![GENERAL CAPIF USAGE FLOW](./images/flows_updated_opencapif.jpg)
+![GENERAL CAPIF USAGE FLOW](./images/flows-updated_opencapif.jpg)
 
 The repository provides two modes for utilizing the OpenCAPIF SDK:
 
@@ -77,7 +77,7 @@ OpenCAPIF SDK references:
 
 The SDK simplifies the onboarding process, allowing providers to register multiple APFs and AEFs. All APFs, AEFs, and AMF certificates are created and stored in `provider_service_ids.json`.
 
-![Provider_onboard](./images/flows_provider_onboard.jpg)
+![Provider_onboard](./images/flows-provider_onboard.jpg)
 
 ### Service Publishing
 
@@ -148,7 +148,7 @@ Retrieve information about all previously published services in `service_receive
 **Required SDK input**:
 - publisher_apf_id
 
-![Provider_publish](./images/flows_provider_publish_functions.jpg)
+![Provider_publish](./images/flows-provider_publish_functions.jpg)
 
 ### Update and Offboard Provider
 
@@ -161,7 +161,7 @@ OpenCAPIF SDK references:
 
 The provider must be onboarded before using these features.
 
-![Provider_update-offboard](./images/flows_provider_update_offboard.jpg)
+![Provider_update-offboard](./images/flows-provider_update_offboard.jpg)
 
 ### Create logs
 
@@ -177,6 +177,80 @@ For leveraging this feature the Provider must have onboarded and published an AP
 - api_invoker_id (Within the function)
 - log (Within [SDK configuration](./sdk_configuration.md) or object)
 
+![Provider_logs](./images/flows-provider_logs.jpg)
+
+### Create subscription
+
+OpenCAPIF SDK references:
+- **Function**: `create_subscription(name, id)`
+
+The provider ask to the CCF about notifications related to services such as SERVICE_API_AVAILABLE or API_INVOKER_UPDATED.
+
+This services are specificated in [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml) explained in [SDK configuration](./sdk_configuration.md#events_configuration)
+
+For leveraging this feature the Provider must have onboarded previously.
+
+**Required SDK input**:
+
+- aefId//apfId//amfId (Within the function)
+- name: An arbitrary name we want to set in order to store it.
+- events (Within [SDK configuration](./sdk_configuration.md#events_configuration) or object)
+
+### Delete subscription
+
+OpenCAPIF SDK references:
+- **Function**: `delete_subscription(name, id)`
+
+The provider ask to the CCF to withdraw the subscription to the notifications asked previously
+
+For leveraging this feature the Provider must have onboarded and created a subscription previously.
+
+**Required SDK input**:
+
+- aefId//apfId//amfId (Within the function)
+- name: The name of your subscription.
+
+### Update subscription
+
+OpenCAPIF SDK references:
+- **Function**: `update_subscription(name, id)`
+
+The provider ask to the CCF about updating the subscription for receiving different services such as SERVICE_API_AVAILABLE or API_INVOKER_UPDATED, changing the URL for receiving the notifications...
+
+This services are specificated in [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml) explained in [SDK configuration](./sdk_configuration.md#events_configuration)
+
+For leveraging this feature the Provider must have onboarded and created a subscription previously.
+
+![Events_feature](./images/flows-event_subscription.jpg)
+
+**ONLY AVAILABLE IN CAPIF RELEASE 2**
+
+**Required SDK input**:
+
+- aefId//apfId//amfId (Within the function)
+- name: The name of your subscription.
+- events (Within [SDK configuration](./sdk_configuration.md#events_configuration) or object)
+
+### Patch subscription
+
+OpenCAPIF SDK references:
+- **Function**: `update_subscription(name, id)`
+
+The provider ask to the CCF about updating the subscription for receiving different services such as SERVICE_API_AVAILABLE or API_INVOKER_UPDATED.
+
+This services are specificated in [CAPIF Events API management](https://github.com/jdegre/5GC_APIs/blob/Rel-18/TS29222_CAPIF_Events_API.yaml) explained in [SDK configuration](./sdk_configuration.md#events_configuration)
+
+For leveraging this feature the Provider must have onboarded and created a subscription previously.
+
+**ONLY AVAILABLE IN CAPIF RELEASE 2**
+
+**Required SDK input**:
+
+- aefId//apfId//amfId (Within the function)
+- name: The name of your subscription.
+- events (Within [SDK configuration](./sdk_configuration.md#events_configuration) or object)
+
+
 ## Invoker Network App
 
 The OpenCAPIF SDK enables efficient implementation of invoker functionality for Network App. This section details the SDK features related to CAPIF invokers.
@@ -202,7 +276,7 @@ OpenCAPIF SDK references:
 
 The SDK streamlines the invoker onboarding process, storing the `api_invoker_id` in the `capif_api_security_context_details.json`.
 
-![Invoker_onboard](./images/flows_invoker_onboard.jpg)
+![Invoker_onboard](./images/flows-invoker_onboard.jpg)
 
 ### Service Discovery
 
@@ -216,7 +290,7 @@ The [discover_filter](./sdk_configuration.md) can be used to retrieve access to
 
 Use the [discover_filter](./sdk_configuration.md) to retrieve access to target APIs. Ensure you are [onboarded as an invoker](#invoker-onboarding) before using this feature.
 
-![Invoker_discover](./images/flows_invoker_discover.jpg)
+![Invoker_discover](./images/flows-invoker_discover.jpg)
 
 ### Obtain JWT Tokens
 
@@ -226,7 +300,7 @@ OpenCAPIF SDK references:
 
 The SDK facilitates JWT token creation for secure access to target APIs. This process stores JWT access token in `capif_api_security_context_details.json`.
 
-![Invoker_get_token](./images/flows_invoker_get_tokens.jpg)
+![Invoker_get_token](./images/flows-invoker_get_tokens.jpg)
 
 ### Check authentication
 
@@ -240,7 +314,7 @@ It is mandatory to have obtained the [JWT token](#obtain-jwt-tokens) previously.
 **Required SDK inputs**:
 - check_authentication_data
 
-![Invoker_check_authentication](./images/flows_invoker_check_authentication.jpg)
+![Invoker_check_authentication](./images/flows-invoker_check_authentication.jpg)
 
 ### Update and Offboard Invoker
 
@@ -250,7 +324,7 @@ OpenCAPIF SDK references:
 
 Onboarding is required before utilizing these functions.
 
-![Invoker_update-offboard](./images/flows_invoker_update_offboard.jpg)
+![Invoker_update-offboard](./images/flows-invoker_update_offboard.jpg)
 
 ## Other Features
 
@@ -281,4 +355,4 @@ OpenCAPIF SDK reference:
 
 Simplifies the logout process for admin users and removes a CAPIF user.
 
-![Register picture](./images/flows_sdk_with_register.jpg)
+![Register picture](./images/flows-sdk_with_register.jpg)
diff --git a/opencapif_sdk/__init__.py b/opencapif_sdk/__init__.py
index b977cb1451bf04b91f3b305bfd736519ca01c76a..4137e12c3451336a680699d82a8795c3bcfe9f68 100644
--- a/opencapif_sdk/__init__.py
+++ b/opencapif_sdk/__init__.py
@@ -3,5 +3,6 @@ from opencapif_sdk.capif_provider_connector import capif_provider_connector
 from opencapif_sdk.service_discoverer import service_discoverer
 from opencapif_sdk.api_schema_translator import api_schema_translator
 from opencapif_sdk.capif_logging_feature import capif_logging_feature
+from opencapif_sdk.capif_event_feature import capif_invoker_event_feature, capif_provider_event_feature
 
-__all__ = ["capif_invoker_connector", "service_discoverer", "capif_provider_connector", "api_schema_translator", "capif_logging_feature"]
\ No newline at end of file
+__all__ = ["capif_invoker_connector", "service_discoverer", "capif_provider_connector", "api_schema_translator", "capif_logging_feature", "capif_invoker_event_feature", "capif_provider_event_feature"]
\ No newline at end of file
diff --git a/opencapif_sdk/capif_event_feature.py b/opencapif_sdk/capif_event_feature.py
new file mode 100644
index 0000000000000000000000000000000000000000..32d0bf35938c3570f701774b646438da7b73c5a6
--- /dev/null
+++ b/opencapif_sdk/capif_event_feature.py
@@ -0,0 +1,435 @@
+from opencapif_sdk import capif_invoker_connector,capif_provider_connector
+import os
+import logging
+import shutil
+from requests.auth import HTTPBasicAuth
+import urllib3
+from OpenSSL.SSL import FILETYPE_PEM
+from OpenSSL.crypto import (
+    dump_certificate_request,
+    dump_privatekey,
+    PKey,
+    TYPE_RSA,
+    X509Req
+)
+import requests
+import json
+import warnings
+from requests.exceptions import RequestsDependencyWarning
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+warnings.filterwarnings("ignore", category=RequestsDependencyWarning)
+# noqa: E501
+# Basic configuration of the logger functionality
+
+log_path = 'logs/sdk_logs.log'
+
+log_dir = os.path.dirname(log_path)
+
+if not os.path.exists(log_dir):
+    os.makedirs(log_dir)
+
+logging.basicConfig(
+    level=logging.NOTSET,  # Minimum severity level to log
+    # Log message format
+    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+    handlers=[
+        logging.FileHandler(log_path),  # Log to a file
+        logging.StreamHandler()  # Also display in the console
+    ]
+)
+
+
+class capif_invoker_event_feature(capif_invoker_connector):
+
+    def create_subscription(self, name):
+
+        invoker_capif_details = self.invoker_capif_details
+
+        subscriberId = invoker_capif_details["api_invoker_id"]
+
+        path = self.capif_https_url + f"capif-events/v1/{subscriberId}/subscriptions"
+
+        payload = {
+            "events": self.events_description,
+            "eventFilters": self.events_filter,
+            "eventReq": {},  # TO IMPROVE !!!
+            "notificationDestination": f"{self.capif_callback_url}",
+            "requestTestNotification": True,
+            "websockNotifConfig": {
+                "websocketUri": f"{self.capif_callback_url}",
+                "requestWebsocketUri": True
+            },
+            "supportedFeatures": f"{self.supported_features}"
+        }
+        
+        try:
+            response = requests.post(
+                url=path,
+                json=payload,
+                headers={"Content-Type": "application/json"},
+                cert=(self.signed_key_crt_path, self.private_key_path),
+                verify=os.path.join(self.invoker_folder, "ca.crt")
+            )
+            response.raise_for_status()
+            location_header = response.headers.get("Location")
+
+            if location_header:
+                # Extrae el identificador de la URL en el encabezado 'Location'
+                identifier = location_header.rstrip('/').split('/')[-1]
+                self.logger.info(f"Subscriptionid obtained: {identifier}")
+            else:
+                self.logger.error("The Location header is not available in the response")
+
+            path = os.path.join(self.invoker_folder, "capif_subscriptions_id.json")
+
+            # Load or initialize the subscription dictionary
+            # Load or initialize the subscription dictionary
+            if os.path.exists(path):
+                subscription = self._load_config_file(path)
+                if not isinstance(subscription, dict):
+                    raise TypeError(f"Expected 'subscription' to be a dict, but got {type(subscription).__name__}")
+            else:
+                subscription = {}
+
+            if not isinstance(subscriberId, (str, int)):
+                raise TypeError(f"Expected 'subscriberId' to be a string or integer, but got {type(subscriberId).__name__}")
+
+            # Convert events_description to a string if it isn't already
+            if not isinstance(name, str):
+                name = str(name)
+
+            if str(subscriberId) not in subscription:
+                # If the subscriberId is not in the subscription, create an empty dictionary for it
+                subscription[str(subscriberId)] = {}
+            # Update the subscription structure
+            subscription[str(subscriberId)][name] = identifier
+
+            # Save the updated dictionary back to the file
+            self._create_or_update_file("capif_subscriptions_id", "json", subscription, "w")
+
+        except Exception as e:
+            self.logger.error("Unexpected error: %s", e)
+            return None, {"error": f"Unexpected error: {e}"}
+
+    def delete_subscription(self, name):
+        invoker_capif_details = self.invoker_capif_details
+
+        subscriberId = invoker_capif_details["api_invoker_id"]
+
+        path = os.path.join(self.invoker_folder, "capif_subscriptions_id.json")
+
+        if os.path.exists(path):
+            subscription = self._load_config_file(path)
+            if not isinstance(subscription, dict):
+                raise TypeError(f"Expected 'subscription' to be a dict, but got {type(subscription).__name__}")
+
+            if subscriberId in subscription and name in subscription[subscriberId]:
+                identifier = subscription[subscriberId][name]
+
+                # Attempt to delete the subscription from CAPIF
+                delete_path = self.capif_https_url + f"capif-events/v1/{subscriberId}/subscriptions/{identifier}"
+
+                try:
+                    response = requests.delete(
+                        url=delete_path,
+                        headers={"Content-Type": "application/json"},
+                        cert=(self.signed_key_crt_path, self.private_key_path),
+                        verify=os.path.join(self.invoker_folder, "ca.crt")
+                    )
+                    response.raise_for_status()
+
+                    # Remove the service entry from the subscription dictionary
+                    del subscription[subscriberId][name]
+
+                    # If no more services exist for the subscriber, remove the subscriber entry
+                    if not subscription[subscriberId]:
+                        del subscription[subscriberId]
+
+                    # Save the updated dictionary back to the file
+                    self._create_or_update_file("capif_subscriptions_id", "json", subscription, "w")
+
+                    self.logger.info(f"Successfully deleted subscription for service '{name}'")
+
+                except Exception as e:
+                    self.logger.error("Unexpected error: %s", e)
+                    return None, {"error": f"Unexpected error: {e}"}
+
+            else:
+                self.logger.warning(f"Service '{name}' not found for subscriber '{subscriberId}'")
+                return None, {"error": f"Service '{name}' not found for subscriber '{subscriberId}'"}
+        else:
+            self.logger.error("Subscription file not found at path: %s", path)
+            return None, {"error": "Subscription file not found"}
+
+    def update_subcription(self, name):
+        invoker_capif_details = self.invoker_capif_details
+
+        subscriberId = invoker_capif_details["api_invoker_id"]
+
+        path = os.path.join(self.invoker_folder, "capif_subscriptions_id.json")
+
+        payload = {
+            "events": self.events_description,
+            "eventFilters": self.events_filter,
+            "eventReq": {},  # TO IMPROVE !!!
+            "notificationDestination": f"{self.capif_callback_url}",
+            "requestTestNotification": True,
+            "websockNotifConfig": {
+                "websocketUri": f"{self.capif_callback_url}",
+                "requestWebsocketUri": True
+            },
+            "supportedFeatures": f"{self.supported_features}"
+        }
+        if os.path.exists(path):
+            subscription = self._load_config_file(path)
+            if not isinstance(subscription, dict):
+                raise TypeError(f"Expected 'subscription' to be a dict, but got {type(subscription).__name__}")
+
+            if subscriberId in subscription and name in subscription[subscriberId]:
+                identifier = subscription[subscriberId][name]
+
+                # Attempt to delete the subscription from CAPIF
+                put_path = self.capif_https_url + f"capif-events/v1/{subscriberId}/subscriptions/{identifier}"
+
+                try:
+                    response = requests.put(
+                        url=put_path,
+                        json=payload,
+                        headers={"Content-Type": "application/json"},
+                        cert=(self.signed_key_crt_path, self.private_key_path),
+                        verify=os.path.join(self.invoker_folder, "ca.crt")
+                    )
+                    response.raise_for_status()
+
+                    self.logger.info(f"Successfully updated subscription for service '{name}'")
+
+                except Exception as e:
+                    self.logger.error("Unexpected error: %s", e)
+                    return None, {"error": f"Unexpected error: {e}"}
+
+            else:
+                self.logger.warning(f"Service '{name}' not found for subscriber '{subscriberId}'")
+                return None, {"error": f"Service '{name}' not found for subscriber '{subscriberId}'"}
+        else:
+            self.logger.error("Subscription file not found at path: %s", path)
+            return None, {"error": "Subscription file not found"}
+
+    def patch_subcription(self, name):
+        self.update_subcription(self, name)
+
+
+class capif_provider_event_feature(capif_provider_connector):
+    
+    def create_subscription(self, name, id):
+
+        subscriberId = id
+
+        path = self.capif_https_url + f"capif-events/v1/{subscriberId}/subscriptions"
+        
+        list_of_ids = self._load_provider_api_details()
+        
+        number = self._find_key_by_value(list_of_ids, id)
+
+        payload = {
+            "events": self.events_description,
+            "eventFilters": self.events_filter,
+            "eventReq": {},  # TO IMPROVE !!!
+            "notificationDestination": f"{self.notification_destination}",
+            "requestTestNotification": True,
+            "websockNotifConfig": self.websock_notif_config,
+            "supportedFeatures": f"{self.supported_features}"
+        }
+        
+        number_low = number.lower()
+        
+        cert = (
+            os.path.join(self.provider_folder, f"{number_low}.crt"),
+            os.path.join(self.provider_folder, f"{number}_private_key.key"),
+        )
+        
+        try:
+            response = requests.post(
+                url=path,
+                json=payload,
+                headers={"Content-Type": "application/json"},
+                cert=cert,
+                verify=os.path.join(self.provider_folder, "ca.crt")
+            )
+            response.raise_for_status()
+            
+            location_header = response.headers.get("Location")
+
+            if location_header:
+                # Extrae el identificador de la URL en el encabezado 'Location'
+                identifier = location_header.rstrip('/').split('/')[-1]
+                self.logger.info(f"Subscriptionid obtained: {identifier}")
+            else:
+                self.logger.error("The Location header is not available in the response")
+
+            path = os.path.join(self.provider_folder, "capif_subscriptions_id.json")
+
+            # Load or initialize the subscription dictionary
+            # Load or initialize the subscription dictionary
+            if os.path.exists(path):
+                subscription = self._load_config_file(path)
+                if not isinstance(subscription, dict):
+                    raise TypeError(f"Expected 'subscription' to be a dict, but got {type(subscription).__name__}")
+            else:
+                subscription = {}
+
+            if not isinstance(subscriberId, (str, int)):
+                raise TypeError(f"Expected 'subscriberId' to be a string or integer, but got {type(subscriberId).__name__}")
+
+            # Convert events_description to a string if it isn't already
+            if not isinstance(name, str):
+                name = str(name)
+
+            if str(subscriberId) not in subscription:
+                # If the subscriberId is not in the subscription, create an empty dictionary for it
+                subscription[str(subscriberId)] = {}
+            # Update the subscription structure
+            subscription[str(subscriberId)][name] = identifier
+
+            # Save the updated dictionary back to the file
+            self._create_or_update_file("capif_subscriptions_id", "json", subscription, "w")
+
+        except Exception as e:
+            self.logger.error("Unexpected error: %s", e)
+            return None, {"error": f"Unexpected error: {e}"}
+    
+    def delete_subscription(self, name, id):
+        subscriberId = id
+
+        path = os.path.join(self.provider_folder, "capif_subscriptions_id.json")
+
+        if os.path.exists(path):
+            subscription = self._load_config_file(path)
+            if not isinstance(subscription, dict):
+                raise TypeError(f"Expected 'subscription' to be a dict, but got {type(subscription).__name__}")
+
+            if subscriberId in subscription and name in subscription[subscriberId]:
+                identifier = subscription[subscriberId][name]
+
+                # Attempt to delete the subscription from CAPIF
+                delete_path = self.capif_https_url + f"capif-events/v1/{subscriberId}/subscriptions/{identifier}"
+                
+                list_of_ids = self._load_provider_api_details()
+
+                number = self._find_key_by_value(list_of_ids, id)
+                
+                number_low = number.lower()
+        
+                cert = (
+                    os.path.join(self.provider_folder, f"{number_low}.crt"),
+                    os.path.join(self.provider_folder, f"{number}_private_key.key"),
+                )
+
+                try:
+                    response = requests.delete(
+                        url=delete_path,
+                        headers={"Content-Type": "application/json"},
+                        cert=cert,
+                        verify=os.path.join(self.provider_folder, "ca.crt")
+                    )
+                    response.raise_for_status()
+
+                    # Remove the service entry from the subscription dictionary
+                    del subscription[subscriberId][name]
+
+                    # If no more services exist for the subscriber, remove the subscriber entry
+                    if not subscription[subscriberId]:
+                        del subscription[subscriberId]
+
+                    # Save the updated dictionary back to the file
+                    self._create_or_update_file("capif_subscriptions_id", "json", subscription, "w")
+
+                    self.logger.info(f"Successfully deleted subscription for service '{name}'")
+
+                except Exception as e:
+                    self.logger.error("Unexpected error: %s", e)
+                    return None, {"error": f"Unexpected error: {e}"}
+
+            else:
+                self.logger.warning(f"Service '{name}' not found for subscriber '{subscriberId}'")
+                return None, {"error": f"Service '{name}' not found for subscriber '{subscriberId}'"}
+        else:
+            self.logger.error("Subscription file not found at path: %s", path)
+            return None, {"error": "Subscription file not found"}
+        
+    def update_subcription(self, name, id):
+        
+        subscriberId = id
+        
+        path = os.path.join(self.provider_folder, "capif_subscriptions_id.json")
+        
+        list_of_ids = self._load_provider_api_details()
+        
+        number = self._find_key_by_value(list_of_ids, id)
+
+        payload = {
+            "events": self.events_description,
+            "eventFilters": self.events_filter,
+            "eventReq": {},  # TO IMPROVE !!!
+            "notificationDestination": f"{self.notification_destination}",
+            "requestTestNotification": True,
+            "websockNotifConfig": self.websock_notif_config,
+            "supportedFeatures": f"{self.supported_features}"
+        }
+        
+        if os.path.exists(path):
+            subscription = self._load_config_file(path)
+            if not isinstance(subscription, dict):
+                raise TypeError(f"Expected 'subscription' to be a dict, but got {type(subscription).__name__}")
+
+            if subscriberId in subscription and name in subscription[subscriberId]:
+                identifier = subscription[subscriberId][name]
+
+                # Attempt to delete the subscription from CAPIF
+                put_path = self.capif_https_url + f"capif-events/v1/{subscriberId}/subscriptions/{identifier}"
+                
+                list_of_ids = self._load_provider_api_details()
+
+                number = self._find_key_by_value(list_of_ids, id)
+                
+                number_low = number.lower()
+        
+                cert = (
+                    os.path.join(self.provider_folder, f"{number_low}.crt"),
+                    os.path.join(self.provider_folder, f"{number}_private_key.key"),
+                )
+
+                try:
+                    response = requests.put(
+                        url=put_path,
+                        json=payload,
+                        headers={"Content-Type": "application/json"},
+                        cert=cert,
+                        verify=os.path.join(self.provider_folder, "ca.crt")
+                    )
+                    response.raise_for_status()
+
+                    # Remove the service entry from the subscription dictionary
+                    del subscription[subscriberId][name]
+
+                    # If no more services exist for the subscriber, remove the subscriber entry
+                    if not subscription[subscriberId]:
+                        del subscription[subscriberId]
+
+                    # Save the updated dictionary back to the file
+                    self._create_or_update_file("capif_subscriptions_id", "json", subscription, "w")
+
+                    self.logger.info(f"Successfully updated subscription for service '{name}'")
+
+                except Exception as e:
+                    self.logger.error("Unexpected error: %s", e)
+                    return None, {"error": f"Unexpected error: {e}"}
+
+            else:
+                self.logger.warning(f"Service '{name}' not found for subscriber '{subscriberId}'")
+                return None, {"error": f"Service '{name}' not found for subscriber '{subscriberId}'"}
+        else:
+            self.logger.error("Subscription file not found at path: %s", path)
+            return None, {"error": "Subscription file not found"}
+
+    def patch_subcription(self, name, id):
+        self.update_subcription(self, name, id)
\ No newline at end of file
diff --git a/opencapif_sdk/capif_invoker_connector.py b/opencapif_sdk/capif_invoker_connector.py
index 6a159f11f6b7fa7fe48f0dfacef32e7ccb2ac973..e04ccb1ac4f9b75ba09c3e7b8bfcac0b13ea3638 100644
--- a/opencapif_sdk/capif_invoker_connector.py
+++ b/opencapif_sdk/capif_invoker_connector.py
@@ -46,7 +46,7 @@ class capif_invoker_connector:
 
         config_file = os.path.abspath(config_file)
         # Load configuration from file if necessary
-        config = self.__load_config_file(config_file)
+        config = self._load_config_file(config_file)
 
         debug_mode = os.getenv('DEBUG_MODE', config.get('debug_mode', 'False')).strip().lower()
         if debug_mode == "false":
@@ -99,6 +99,11 @@ class capif_invoker_connector:
         csr_country_name = os.getenv('INVOKER_CSR_COUNTRY_NAME', csr_config.get('csr_country_name', '')).strip()
         csr_email_address = os.getenv('INVOKER_CSR_EMAIL_ADDRESS', csr_config.get('csr_email_address', '')).strip()
 
+        # Events configuration
+        events_config = invoker_config.get('events', {})
+        self.events_description = os.getenv('INVOKER_EVENTS_DESCRIPTION', events_config.get('description', ''))
+        self.events_filter = os.getenv('INVOKER_EVENTS_FILTERS', events_config.get('eventFilters', ''))
+
         # Define the invoker folder path and create it if it doesn't exist
         self.invoker_folder = os.path.join(invoker_general_folder, capif_username)
         os.makedirs(self.invoker_folder, exist_ok=True)
@@ -137,10 +142,22 @@ class capif_invoker_connector:
         )
         if os.path.exists(path):
             self.invoker_capif_details = self.__load_invoker_api_details()
+        
+        self.signed_key_crt_path = os.path.join(
+                self.invoker_folder,
+                self.capif_username + ".crt"
+            )
+        
+        self.private_key_path = os.path.join(
+                self.invoker_folder,
+                "private.key"
+            )
+        
+        self.pathca = os.path.join(self.invoker_folder, "ca.crt")
 
         self.logger.info("capif_invoker_connector initialized with the JSON parameters")
 
-    def __load_config_file(self, config_file: str):
+    def _load_config_file(self, config_file: str):
         """Loads the configuration file."""
         try:
             with open(config_file, 'r') as file:
@@ -194,25 +211,11 @@ class capif_invoker_connector:
                 + invoker_capif_details["api_invoker_id"]
             )
 
-            signed_key_crt_path = os.path.join(
-                self.invoker_folder,
-                invoker_capif_details["user_name"] + ".crt"
-            )
-
-            private_key_path = os.path.join(
-                self.invoker_folder,
-                "private.key"
-            )
-
-            path = os.path.join(
-                self.invoker_folder,
-                "ca.crt"
-            )
             response = requests.request(
                 "DELETE",
                 url,
-                cert=(signed_key_crt_path, private_key_path),
-                verify=path,
+                cert=(self.signed_key_crt_path, self.private_key_path),
+                verify=self.pathca,
             )
             response.raise_for_status()
             self.logger.info("Invoker offboarded successfully")
@@ -237,7 +240,6 @@ class capif_invoker_connector:
         self.logger.info(
             "Creating private and public keys for the Invoker cert")
         try:
-            private_key_path = os.path.join(self.invoker_folder, "private.key")
 
             csr_file_path = os.path.join(self.invoker_folder, "cert_req.csr")
 
@@ -258,7 +260,7 @@ class capif_invoker_connector:
             with open(csr_file_path, "wb+") as f:
                 f.write(dump_certificate_request(FILETYPE_PEM, req))
                 public_key = dump_certificate_request(FILETYPE_PEM, req)
-            with open(private_key_path, "wb+") as f:
+            with open(self.private_key_path, "wb+") as f:
                 f.write(dump_privatekey(FILETYPE_PEM, key))
 
             self.logger.info("Keys created successfully")
@@ -305,7 +307,7 @@ class capif_invoker_connector:
 
             response.raise_for_status()
             response_payload = json.loads(response.text)
-            ca_root_file_path = os.path.join(self.invoker_folder, "ca.crt")
+            ca_root_file_path = self.pathca
             ca_root_file = open(ca_root_file_path, "wb+")
             ca_root_file.write(bytes(response_payload["ca_root"], "utf-8"))
             self.logger.info(
@@ -339,13 +341,12 @@ class capif_invoker_connector:
                 "Authorization": "Bearer {}".format(capif_access_token),
                 "Content-Type": "application/json",
             }
-            pathca = os.path.join(self.invoker_folder, "ca.crt")
             response = requests.request(
                 "POST",
                 url,
                 headers=headers,
                 data=payload,
-                verify=pathca,
+                verify=self.pathca,
             )
             response.raise_for_status()
             response_payload = json.loads(response.text)
@@ -443,23 +444,14 @@ class capif_invoker_connector:
                 "Authorization": "Bearer {}".format(capif_access_token),
                 "Content-Type": "application/json",
             }
-            signed_key_crt_path = os.path.join(
-                self.invoker_folder,
-                self.capif_username + ".crt"
-            )
 
-            private_key_path = os.path.join(
-                self.invoker_folder,
-                "private.key"
-            )
-            pathca = os.path.join(self.invoker_folder, "ca.crt")
             response = requests.request(
                 "PUT",
                 url,
                 headers=headers,
                 data=payload,
-                cert=(signed_key_crt_path, private_key_path),
-                verify=pathca,
+                cert=(self.signed_key_crt_path, self.private_key_path),
+                verify=self.pathca,
             )
 
             response.raise_for_status()
@@ -471,6 +463,50 @@ class capif_invoker_connector:
             self.logger.error(
                 f"Error during updating Invoker to CAPIF: {e} - Response: {response.text}")
             raise
+    
+    def _create_or_update_file(self, file_name, file_type, content, mode="w"):
+        """
+        Create or update a file with the specified content.
+
+        :param file_name: Name of the file (without extension).
+        :param file_type: File type or extension (e.g., "txt", "json", "html").
+        :param content: Content to write into the file. Can be a string, dictionary, or list.
+        :param mode: Write mode ('w' to overwrite, 'a' to append). Default is 'w'.
+        """
+        # Validate the mode
+        if mode not in ["w", "a"]:
+            raise ValueError("Mode must be 'w' (overwrite) or 'a' (append).")
+
+        # Construct the full file name
+        full_file_name = f"{file_name}.{file_type}"
+        full_path = os.path.join(self.invoker_folder, full_file_name)
+
+        # Ensure the content is properly formatted
+        if isinstance(content, (dict, list)):
+            if file_type == "json":
+                try:
+                    # Serialize content to JSON
+                    content = json.dumps(content, indent=4)
+                except TypeError as e:
+                    raise ValueError(f"Failed to serialize content to JSON: {e}")
+            else:
+                raise TypeError("Content must be a string when the file type is not JSON.")
+        elif not isinstance(content, str):
+            raise TypeError("Content must be a string, dictionary, or list.")
+
+        try:
+            # Open the file in the specified mode
+            with open(full_path, mode, encoding="utf-8") as file:
+                file.write(content)
+            
+            # Log success based on the mode
+            if mode == "w":
+                self.logger.info(f"File '{full_file_name}' created or overwritten successfully.")
+            elif mode == "a":
+                self.logger.info(f"Content appended to file '{full_file_name}' successfully.")
+        except Exception as e:
+            self.logger.error(f"Error handling the file '{full_file_name}': {e}")
+            raise
 
     
 
diff --git a/opencapif_sdk/capif_provider_connector.py b/opencapif_sdk/capif_provider_connector.py
index 1ea9bc227691095c333e3100d036bf62f18d99d1..062b6a119c45ab1b9b313405c572d384d9392f12 100644
--- a/opencapif_sdk/capif_provider_connector.py
+++ b/opencapif_sdk/capif_provider_connector.py
@@ -151,13 +151,13 @@ class capif_provider_connector:
 
             self.provider_capif_ids = {}
             
-            path_prov_funcs=os.path.join(self.provider_folder,"provider_capif_ids.json")
+            path_prov_funcs = os.path.join(self.provider_folder, "provider_capif_ids.json")
             if os.path.exists(path_prov_funcs):
-                self.provider_capif_ids=self.__load_provider_api_details()
+                self.provider_capif_ids = self._load_provider_api_details()
             
-            path_published=os.path.join(self.provider_folder,"provider_service_ids.json")
+            path_published = os.path.join(self.provider_folder, "provider_service_ids.json")
             if os.path.exists(path_published):
-                self.provider_service_ids=self.__load_config_file(path_published)
+                self.provider_service_ids = self.__load_config_file(path_published)
 
             # Construct the CAPIF HTTPS URL
             if len(self.capif_https_port) == 0 or int(self.capif_https_port) == 443:
@@ -170,7 +170,12 @@ class capif_provider_connector:
                 self.capif_register_url = f"https://{capif_register_host.strip()}:8084/"
             else:
                 self.capif_register_url = f"https://{capif_register_host.strip()}:{capif_register_port.strip()}/"
-
+            
+            events_config = provider_config.get('events', {})
+            self.events_description = os.getenv('PROVIDER_EVENTS_DESCRIPTION', events_config.get('description', ''))
+            self.events_filter = os.getenv('PROVIDER_EVENTS_FILTERS', events_config.get('eventFilters', ''))
+            self.notification_destination = os.getenv('PROVIDER_EVENTS_FILTERS', events_config.get('notificationDestination', ''))
+            self.websock_notif_config = os.getenv('PROVIDER_EVENTS_FILTERS', events_config.get('websockNotifConfig', ''))
             # Log initialization success message
             self.logger.info("capif_provider_connector initialized with the capif_sdk_config.json parameters")
 
@@ -427,7 +432,7 @@ class capif_provider_connector:
         self.logger.info(
             f"Loading provider details from {provider_details_path}")
 
-        provider_details = self.__load_provider_api_details()
+        provider_details = self._load_provider_api_details()
 
         publish_url = provider_details["publish_url"]
 
@@ -604,7 +609,7 @@ class capif_provider_connector:
         self.logger.info(
             f"Loading provider details from {provider_details_path}")
 
-        provider_details = self.__load_provider_api_details()
+        provider_details = self._load_provider_api_details()
         publish_url = provider_details["publish_url"]
 
         # Load provider details
@@ -722,7 +727,7 @@ class capif_provider_connector:
         self.logger.info(
             f"Loading provider details from {provider_details_path}")
 
-        provider_details = self.__load_provider_api_details()
+        provider_details = self._load_provider_api_details()
         publish_url = provider_details["publish_url"]
 
         chosenAPFsandAEFs = self.publish_req
@@ -796,7 +801,7 @@ class capif_provider_connector:
         self.logger.info(
             f"Loading provider details from {provider_details_path}")
 
-        provider_details = self.__load_provider_api_details()
+        provider_details = self._load_provider_api_details()
         publish_url = provider_details["publish_url"]
 
         chosenAPFsandAEFs = self.publish_req
@@ -872,7 +877,7 @@ class capif_provider_connector:
         self.logger.info(
             f"Loading provider details from {provider_details_path}")
 
-        provider_details = self.__load_provider_api_details()
+        provider_details = self._load_provider_api_details()
         publish_url = provider_details["publish_url"]
 
         chosenAPFsandAEFs = self.publish_req
@@ -1071,7 +1076,7 @@ class capif_provider_connector:
             self.logger.info("Offboarding the provider")
 
             # Load CAPIF API details
-            capif_api_details = self.__load_provider_api_details()
+            capif_api_details = self._load_provider_api_details()
             url = f"{self.capif_https_url}api-provider-management/v1/registrations/{capif_api_details['capif_registration_id']}"
 
             # Define certificate paths
@@ -1120,7 +1125,7 @@ class capif_provider_connector:
             self.logger.error(f"Error during removing folder contents: {e}")
             raise
 
-    def __load_provider_api_details(self) -> dict:
+    def _load_provider_api_details(self) -> dict:
         """
         Loads NEF API details from the CAPIF provider details JSON file.
 
@@ -1163,7 +1168,7 @@ class capif_provider_connector:
         )
 
     def certs_modifications(self):
-        api_details = self.__load_provider_api_details()
+        api_details = self._load_provider_api_details()
 
         apf_count = 0
         aef_count = 0
@@ -1253,7 +1258,7 @@ class capif_provider_connector:
     def update_onboard(self, capif_onboarding_url, access_token):
         self.logger.info(
             "Onboarding Provider to CAPIF and waiting signed certificate by giving our public keys to CAPIF")
-        api_details = self.__load_provider_api_details()
+        api_details = self._load_provider_api_details()
         capif_id = "/" + api_details["capif_registration_id"]
 
         url = f"{self.capif_https_url}{capif_onboarding_url}{capif_id}"
@@ -1346,3 +1351,70 @@ class capif_provider_connector:
             self.logger.error(
                 f"Onboarding failed: {e} - Response: {response.text}")
             raise
+    
+    def _create_or_update_file(self, file_name, file_type, content, mode="w"):
+        """
+        Create or update a file with the specified content.
+
+        :param file_name: Name of the file (without extension).
+        :param file_type: File type or extension (e.g., "txt", "json", "html").
+        :param content: Content to write into the file. Can be a string, dictionary, or list.
+        :param mode: Write mode ('w' to overwrite, 'a' to append). Default is 'w'.
+        """
+        # Validate the mode
+        if mode not in ["w", "a"]:
+            raise ValueError("Mode must be 'w' (overwrite) or 'a' (append).")
+
+        # Construct the full file name
+        full_file_name = f"{file_name}.{file_type}"
+        full_path = os.path.join(self.provider_folder, full_file_name)
+
+        # Ensure the content is properly formatted
+        if isinstance(content, (dict, list)):
+            if file_type == "json":
+                try:
+                    # Serialize content to JSON
+                    content = json.dumps(content, indent=4)
+                except TypeError as e:
+                    raise ValueError(f"Failed to serialize content to JSON: {e}")
+            else:
+                raise TypeError("Content must be a string when the file type is not JSON.")
+        elif not isinstance(content, str):
+            raise TypeError("Content must be a string, dictionary, or list.")
+
+        try:
+            # Open the file in the specified mode
+            with open(full_path, mode, encoding="utf-8") as file:
+                file.write(content)
+            
+            # Log success based on the mode
+            if mode == "w":
+                self.logger.info(f"File '{full_file_name}' created or overwritten successfully.")
+            elif mode == "a":
+                self.logger.info(f"Content appended to file '{full_file_name}' successfully.")
+        except Exception as e:
+            self.logger.error(f"Error handling the file '{full_file_name}': {e}")
+            raise
+    
+    def _find_key_by_value(self, data, target_value):
+        """
+        Given a dictionary and a value, return the key corresponding to that value.
+
+        :param data: Dictionary to search.
+        :param target_value: Value to find the corresponding key for.
+        :return: Key corresponding to the target value, or None if not found.
+        """
+        for key, value in data.items():
+            if value == target_value:
+                return key
+        return None
+    
+    def _load_config_file(self, config_file: str):
+        """Loads the configuration file."""
+        try:
+            with open(config_file, 'r') as file:
+                return json.load(file)
+        except FileNotFoundError:
+            self.logger.warning(
+                f"Configuration file {config_file} not found. Using defaults or environment variables.")
+            return {}
\ No newline at end of file
diff --git a/scripts/invoker_capif_event_subcription.py b/scripts/invoker_capif_event_subcription.py
new file mode 100644
index 0000000000000000000000000000000000000000..a8a95d45dbfcf8eae9c69329cd40438893bcf03f
--- /dev/null
+++ b/scripts/invoker_capif_event_subcription.py
@@ -0,0 +1,30 @@
+import utilities
+from opencapif_sdk import capif_invoker_connector, capif_invoker_event_feature
+
+
+def showcase_capif_connector():
+    """
+        This method showcases how one can use the CAPIFConnector class.
+    """
+    # invoker = capif_invoker_connector(config_file=utilities.get_config_file())
+
+    # invoker.onboard_invoker()
+
+    events = capif_invoker_event_feature(config_file=utilities.get_config_file())
+
+    events.create_subscription(name="Servicio_2")
+    
+    events.create_subscription(name="Servicio_3")
+
+    # events.update_subcription(name="Servicio_2")
+
+    events.delete_subscription(name="Servicio_2")
+    
+    events.delete_subscription(name="Servicio_3")
+
+    print("COMPLETED")
+
+
+if __name__ == "__main__":
+    # Register invoker to CAPIF. This should happen exactly once
+    showcase_capif_connector()
diff --git a/scripts/provider_capif_event_feature.py b/scripts/provider_capif_event_feature.py
new file mode 100644
index 0000000000000000000000000000000000000000..5665369e7a67abf270bfeb97554bf8a4c5324376
--- /dev/null
+++ b/scripts/provider_capif_event_feature.py
@@ -0,0 +1,32 @@
+import utilities
+from opencapif_sdk import capif_provider_connector, capif_provider_event_feature
+
+
+def showcase_capif_connector():
+    """
+        This method showcases how one can use the CAPIFConnector class.
+    """
+    provider = capif_provider_connector(config_file=utilities.get_config_file())
+    
+    # provider.onboard_provider()
+    
+    id = provider.provider_capif_ids['AEF-1']
+
+    events = capif_provider_event_feature(config_file=utilities.get_config_file())
+
+    events.create_subscription(name="Servicio_2", id=id)
+    
+    events.create_subscription(name="Servicio_3", id=id)
+
+    # events.update_subcription(name="Servicio_2", id=id) 
+
+    events.delete_subscription(name="Servicio_2", id=id)
+    
+    events.delete_subscription(name="Servicio_3", id=id)
+
+    print("COMPLETED")
+
+
+if __name__ == "__main__":
+    # Register invoker to CAPIF. This should happen exactly once
+    showcase_capif_connector()
diff --git a/scripts/utilities.py b/scripts/utilities.py
index 238f969ea14f4fefe6ce480a856f4c94046c5c1d..0b4855f7c45b122119cfaceba01094038ff2e33f 100755
--- a/scripts/utilities.py
+++ b/scripts/utilities.py
@@ -1,7 +1,7 @@
 
 
 def get_config_file() -> str:
-    return "../config/capif_sdk_config.json"
+    return "../test/capif_sdk_config_sample_test.json"
 
 
 def get_register_file() -> str:
diff --git a/test/capif_sdk_config_sample_test.json b/test/capif_sdk_config_sample_test.json
index 7096619f0a2c99cf3b9d746298a1eb42506f48be..598a11cbca8733e85285321bd6087ba544e92b7c 100644
--- a/test/capif_sdk_config_sample_test.json
+++ b/test/capif_sdk_config_sample_test.json
@@ -1,27 +1,27 @@
 {
-  "capif_host": "",
-  "register_host": "",
-  "capif_https_port": "",
-  "capif_register_port": "",
-  "capif_username": "",
-  "capif_password": "",
-  "debug_mode": "",
+  "capif_host": "capif-prev.mobilesandbox.cloud",
+  "register_host": "registercapif-prev.mobilesandbox.cloud",
+  "capif_https_port": "36212",
+  "capif_register_port": "36211",
+  "capif_username": "echeva_0",
+  "capif_password": "echevapass",
+  "debug_mode": "True",
   "invoker": {
-    "invoker_folder": "",
-    "capif_callback_url": "",
-    "supported_features":"",
-    "check_authentication_data":{
-      "ip":"",
-      "port":""
+    "invoker_folder": "/Users/IDB0128/Documents/OpenCapif/test_invoker_certificate_folder",
+    "capif_callback_url": "http://localhost:5000",
+    "supported_features": "fffffff",
+    "check_authentication_data": {
+      "ip": "",
+      "port": ""
     },
     "cert_generation": {
-      "csr_common_name": "",
-      "csr_organizational_unit": "",
-      "csr_organization": "",
-      "csr_locality": "",
-      "csr_state_or_province_name": "",
-      "csr_country_name": "",
-      "csr_email_address": ""
+      "csr_common_name": "Echeva",
+      "csr_organizational_unit": "discovery",
+      "csr_organization": "telefonica",
+      "csr_locality": "madrid",
+      "csr_state_or_province_name": "madrid",
+      "csr_country_name": "ES",
+      "csr_email_address": "adios@gmail.com"
     },
     "discover_filter": {
       "api-name": "",
@@ -37,30 +37,61 @@
       "api-supported-features": "",
       "ue-ip-addr": "",
       "service-kpis": ""
+    },
+    "events": {
+      "description": ["SERVICE_API_AVAILABLE"],
+      "eventFilters": [
+        {
+          "apiIds": [""],
+          "apiInvokerIds": [""],
+          "aefIds": [""]
+        }
+      ]
     }
   },
   "provider": {
-    "provider_folder": "",
-    "supported_features": "",
-    "apfs": "",
-    "aefs": "",
+    "provider_folder": "/Users/IDB0128/Documents/OpenCapif/test_provider_certificate_folder",
+    "supported_features": "fffffff",
+    "cert_generation": {
+      "csr_common_name": "provider",
+      "csr_organizational_unit": "discovery",
+      "csr_organization": "telefonica",
+      "csr_locality": "madrid",
+      "csr_state_or_province_name": "madrid",
+      "csr_country_name": "ES",
+      "csr_email_address": "hola@gmail.com"
+    },
+    "apfs": "2",
+    "aefs": "3",
     "publish_req": {
       "service_api_id": "",
       "publisher_apf_id": "",
-      "publisher_aefs_ids": [
-        "",
-        ""
-      ]
+      "publisher_aefs_ids": ["", ""]
     },
-    "cert_generation": {
-      "csr_common_name": "",
-      "csr_organizational_unit": "",
-      "csr_organization": "",
-      "csr_locality": "",
-      "csr_state_or_province_name": "",
-      "csr_country_name": "",
-      "csr_email_address": ""
+    "api_description_path": "",
+    "events": {
+      "description": ["SERVICE_API_AVAILABLE"],
+      "eventFilters": [
+        {
+          "apiIds": [""],
+          "apiInvokerIds": [""],
+          "aefIds": [""]
+        }
+      ],
+      "notificationDestination" : "http://localhost:5000",
+      "websockNotifConfig": {
+        "websocketUri" : "http://localhost:5000",
+        "requestWebsocketUri": true
+      }
     },
-    "api_description_path": ""
-   }
+    "log": {
+      "apiName": "Testtrece",
+      "apiVersion": "v1",
+      "resourceName": "MONITORING_SUBSCRIPTIONS",
+      "uri": "/{scsAsId}/subscriptions",
+      "protocol": "HTTP_2",
+      "operation": "GET",
+      "result": "200"
+    }
+  }
 }
diff --git a/test/test.py b/test/test.py
index 9ca0b1fa78d24825e7ef4f449a10fe7c68ca63f4..a4ec863c28f783e964817bce1eb7af71c138e9d7 100644
--- a/test/test.py
+++ b/test/test.py
@@ -2,7 +2,7 @@
 import json
 # flake8: noqa
 
-from opencapif_sdk import capif_invoker_connector, capif_provider_connector, service_discoverer,capif_logging_feature
+from opencapif_sdk import capif_invoker_connector, capif_provider_connector, service_discoverer, capif_logging_feature, capif_invoker_event_feature, capif_provider_event_feature
 
 
 capif_sdk_config_path = "./capif_sdk_config_sample_test.json"
@@ -92,6 +92,16 @@ if __name__ == "__main__":
         # Update configuration file
         capif_provider_connector.publish_req['publisher_apf_id'] = APF1
         capif_provider_connector.publish_req['publisher_aefs_ids'] = [AEF1, AEF2]
+        
+        event_provider = capif_provider_event_feature(config_file=capif_sdk_config_path)
+        
+        event_provider.create_subscription(name="Ejemplo1",id=AEF2)
+        
+        event_provider.create_subscription(name="Ejemplo2",id=APF1)
+        
+        event_provider.delete_subscription(name="Ejemplo1",id=AEF2)
+        
+        event_provider.delete_subscription(name="Ejemplo2",id=APF1)
 
         capif_provider_connector.publish_services()
 
@@ -120,7 +130,7 @@ if __name__ == "__main__":
 
         discoverer = service_discoverer(config_file=capif_sdk_config_path)
         
-        discoverer.discover_filter["api-name"]= "safe-6g-resilience-function"
+        discoverer.discover_filter["api-name"]= "Testtrece"
 
         discoverer.discover()
 
@@ -136,6 +146,16 @@ if __name__ == "__main__":
         
         logger.create_logs(aefId=AEF1,api_invoker_id=invoker_id)
         
+        event_invoker = capif_invoker_event_feature(config_file=capif_sdk_config_path)
+        
+        event_invoker.create_subscription(name="Ejemplo3")
+        
+        event_invoker.create_subscription(name="Ejemplo4")
+        
+        event_invoker.delete_subscription(name="Ejemplo3")
+        
+        event_invoker.delete_subscription(name="Ejemplo4")
+        
         capif_invoker_connector.update_invoker()
         
         print("INVOKER UPDATE SERVICE COMPLETED")