Merge "Add docker-compose for nonrtric-gateway"
diff --git a/enrichment-coordinator-service/api/ecs-api.json b/enrichment-coordinator-service/api/ecs-api.json
index 37416ac..c99873b 100644
--- a/enrichment-coordinator-service/api/ecs-api.json
+++ b/enrichment-coordinator-service/api/ecs-api.json
@@ -1,591 +1,8 @@
 {
-    "basePath": "/",
-    "paths": {
-        "/producer_simulator/ei_job": {"post": {
-            "summary": "Callback for EI job creation",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "jobCreatedCallbackUsingPOST",
-            "responses": {
-                "200": {"description": "OK"},
-                "201": {"description": "Created"},
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "parameters": [{
-                "schema": {"$ref": "#/definitions/producer_ei_job_request"},
-                "in": "body",
-                "name": "request",
-                "description": "request",
-                "required": true
-            }],
-            "tags": ["Data Producer Job Control (example producer)"],
-            "consumes": ["application/json"]
-        }},
-        "/A1-EI/v1/eitypes/{eiTypeId}": {"get": {
-            "summary": "Individual EI type",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getEiTypeUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {"$ref": "#/definitions/EiTypeObject"},
-                    "description": "EI type"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {
-                    "schema": {"$ref": "#/definitions/ProblemDetails"},
-                    "description": "Enrichment Information type is not found"
-                }
-            },
-            "parameters": [{
-                "in": "path",
-                "name": "eiTypeId",
-                "description": "eiTypeId",
-                "type": "string",
-                "required": true
-            }],
-            "tags": ["A1-EI (enrichment information)"]
-        }},
-        "/consumer_simulator/eijobs/{eiJobId}/status": {"post": {
-            "summary": "Callback for EI job status",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "jobStatusCallbackUsingPOST",
-            "responses": {
-                "200": {"description": "OK"},
-                "201": {"description": "Created"},
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "parameters": [
-                {
-                    "in": "path",
-                    "name": "eiJobId",
-                    "description": "eiJobId",
-                    "type": "string",
-                    "required": true
-                },
-                {
-                    "schema": {"$ref": "#/definitions/EiJobStatusObject"},
-                    "in": "body",
-                    "name": "status",
-                    "description": "status",
-                    "required": true
-                }
-            ],
-            "tags": ["A1-EI (enrichment information) callbacks"],
-            "consumes": ["application/json"]
-        }},
-        "/ei-producer/v1/eitypes": {"get": {
-            "summary": "EI type identifiers",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getEiTypeIdentifiersUsingGET_1",
-            "responses": {
-                "200": {
-                    "schema": {
-                        "type": "array",
-                        "items": {"type": "string"}
-                    },
-                    "description": "EI type identifiers"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "tags": ["Data Producer Registry API"]
-        }},
-        "/A1-EI/v1/eitypes": {"get": {
-            "summary": "EI type identifiers",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getEiTypeIdentifiersUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {
-                        "type": "array",
-                        "items": {"type": "string"}
-                    },
-                    "description": "EI type identifiers"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "tags": ["A1-EI (enrichment information)"]
-        }},
-        "/ei-producer/v1/eiproducers/{eiProducerId}/status": {"get": {
-            "summary": "EI producer status",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getEiProducerStatusUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {"$ref": "#/definitions/producer_status"},
-                    "description": "EI producer status"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {
-                    "schema": {"$ref": "#/definitions/ProblemDetails"},
-                    "description": "Enrichment Information producer is not found"
-                }
-            },
-            "parameters": [{
-                "in": "path",
-                "name": "eiProducerId",
-                "description": "eiProducerId",
-                "type": "string",
-                "required": true
-            }],
-            "tags": ["Data Producer Registry API"]
-        }},
-        "/producer_simulator/ei_job/{eiJobId}": {"delete": {
-            "summary": "Callback for EI job deletion",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "jobDeletedCallbackUsingDELETE",
-            "responses": {
-                "200": {"description": "OK"},
-                "401": {"description": "Unauthorized"},
-                "204": {"description": "No Content"},
-                "403": {"description": "Forbidden"}
-            },
-            "parameters": [{
-                "in": "path",
-                "name": "eiJobId",
-                "description": "eiJobId",
-                "type": "string",
-                "required": true
-            }],
-            "tags": ["Data Producer Job Control (example producer)"]
-        }},
-        "/ei-producer/v1/eiproducers": {"get": {
-            "summary": "EI producer identifiers",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getEiProducerIdentifiersUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {
-                        "type": "array",
-                        "items": {"type": "string"}
-                    },
-                    "description": "EI producer identifiers"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "parameters": [{
-                "in": "query",
-                "allowEmptyValue": false,
-                "name": "ei_type_id",
-                "description": "If given, only the producers for the EI Data type is returned.",
-                "type": "string",
-                "required": false
-            }],
-            "tags": ["Data Producer Registry API"]
-        }},
-        "/ei-producer/v1/eitypes/{eiTypeId}": {
-            "get": {
-                "summary": "Individual EI type",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "getEiTypeUsingGET_1",
-                "responses": {
-                    "200": {
-                        "schema": {"$ref": "#/definitions/producer_ei_type_info"},
-                        "description": "EI type"
-                    },
-                    "401": {"description": "Unauthorized"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Enrichment Information type is not found"
-                    }
-                },
-                "parameters": [{
-                    "in": "path",
-                    "name": "eiTypeId",
-                    "description": "eiTypeId",
-                    "type": "string",
-                    "required": true
-                }],
-                "tags": ["Data Producer Registry API"]
-            },
-            "delete": {
-                "summary": "Individual EI type",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "deleteEiTypeUsingDELETE",
-                "responses": {
-                    "200": {"description": "Not used"},
-                    "401": {"description": "Unauthorized"},
-                    "204": {"description": "Producer deleted"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Enrichment Information type is not found"
-                    },
-                    "406": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "The Enrichment Information type has one or several active producers"
-                    }
-                },
-                "parameters": [{
-                    "in": "path",
-                    "name": "eiTypeId",
-                    "description": "eiTypeId",
-                    "type": "string",
-                    "required": true
-                }],
-                "tags": ["Data Producer Registry API"]
-            },
-            "put": {
-                "summary": "Individual EI type",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "putEiTypeUsingPUT",
-                "responses": {
-                    "200": {"description": "Type updated"},
-                    "201": {"description": "Type created"},
-                    "400": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Bad request"
-                    },
-                    "401": {"description": "Unauthorized"},
-                    "403": {"description": "Forbidden"},
-                    "404": {"description": "Not Found"}
-                },
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "eiTypeId",
-                        "description": "eiTypeId",
-                        "type": "string",
-                        "required": true
-                    },
-                    {
-                        "schema": {"$ref": "#/definitions/producer_ei_type_info"},
-                        "in": "body",
-                        "name": "registrationInfo",
-                        "description": "registrationInfo",
-                        "required": true
-                    }
-                ],
-                "tags": ["Data Producer Registry API"],
-                "consumes": ["application/json"]
-            }
-        },
-        "/status": {"get": {
-            "summary": "Returns status and statistics of this service",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getStatusUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {"$ref": "#/definitions/status_info"},
-                    "description": "Service is living"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "tags": ["Service status"]
-        }},
-        "/A1-EI/v1/eijobs/{eiJobId}": {
-            "get": {
-                "summary": "Individual EI job",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "getIndividualEiJobUsingGET",
-                "responses": {
-                    "200": {
-                        "schema": {"$ref": "#/definitions/EiJobObject"},
-                        "description": "EI job"
-                    },
-                    "401": {"description": "Unauthorized"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Enrichment Information job is not found"
-                    }
-                },
-                "parameters": [{
-                    "in": "path",
-                    "name": "eiJobId",
-                    "description": "eiJobId",
-                    "type": "string",
-                    "required": true
-                }],
-                "tags": ["A1-EI (enrichment information)"]
-            },
-            "delete": {
-                "summary": "Individual EI job",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "deleteIndividualEiJobUsingDELETE",
-                "responses": {
-                    "200": {"description": "Not used"},
-                    "401": {"description": "Unauthorized"},
-                    "204": {"description": "Job deleted"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Enrichment Information job is not found"
-                    }
-                },
-                "parameters": [{
-                    "in": "path",
-                    "name": "eiJobId",
-                    "description": "eiJobId",
-                    "type": "string",
-                    "required": true
-                }],
-                "tags": ["A1-EI (enrichment information)"]
-            },
-            "put": {
-                "summary": "Individual EI job",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "putIndividualEiJobUsingPUT",
-                "responses": {
-                    "200": {"description": "Job updated"},
-                    "201": {"description": "Job created"},
-                    "401": {"description": "Unauthorized"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Enrichment Information type is not found"
-                    }
-                },
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "eiJobId",
-                        "description": "eiJobId",
-                        "type": "string",
-                        "required": true
-                    },
-                    {
-                        "schema": {"$ref": "#/definitions/EiJobObject"},
-                        "in": "body",
-                        "name": "eiJobObject",
-                        "description": "eiJobObject",
-                        "required": true
-                    }
-                ],
-                "tags": ["A1-EI (enrichment information)"],
-                "consumes": ["application/json"]
-            }
-        },
-        "/ei-producer/v1/eiproducers/{eiProducerId}": {
-            "get": {
-                "summary": "Individual EI producer",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "getEiProducerUsingGET",
-                "responses": {
-                    "200": {
-                        "schema": {"$ref": "#/definitions/producer_registration_info"},
-                        "description": "EI producer"
-                    },
-                    "401": {"description": "Unauthorized"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Enrichment Information producer is not found"
-                    }
-                },
-                "parameters": [{
-                    "in": "path",
-                    "name": "eiProducerId",
-                    "description": "eiProducerId",
-                    "type": "string",
-                    "required": true
-                }],
-                "tags": ["Data Producer Registry API"]
-            },
-            "delete": {
-                "summary": "Individual EI producer",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "deleteEiProducerUsingDELETE",
-                "responses": {
-                    "200": {"description": "Not used"},
-                    "401": {"description": "Unauthorized"},
-                    "204": {"description": "Producer deleted"},
-                    "403": {"description": "Forbidden"},
-                    "404": {
-                        "schema": {"$ref": "#/definitions/ProblemDetails"},
-                        "description": "Producer is not found"
-                    }
-                },
-                "parameters": [{
-                    "in": "path",
-                    "name": "eiProducerId",
-                    "description": "eiProducerId",
-                    "type": "string",
-                    "required": true
-                }],
-                "tags": ["Data Producer Registry API"]
-            },
-            "put": {
-                "summary": "Individual EI producer",
-                "deprecated": false,
-                "produces": ["application/json"],
-                "operationId": "putEiProducerUsingPUT",
-                "responses": {
-                    "200": {"description": "Producer updated"},
-                    "201": {"description": "Producer created"},
-                    "401": {"description": "Unauthorized"},
-                    "403": {"description": "Forbidden"},
-                    "404": {"description": "Not Found"}
-                },
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "eiProducerId",
-                        "description": "eiProducerId",
-                        "type": "string",
-                        "required": true
-                    },
-                    {
-                        "schema": {"$ref": "#/definitions/producer_registration_info"},
-                        "in": "body",
-                        "name": "registrationInfo",
-                        "description": "registrationInfo",
-                        "required": true
-                    }
-                ],
-                "tags": ["Data Producer Registry API"],
-                "consumes": ["application/json"]
-            }
-        },
-        "/producer_simulator/health_check": {"get": {
-            "summary": "Producer supervision",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "producerSupervisionUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {"type": "string"},
-                    "description": "OK"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {"description": "Not Found"}
-            },
-            "tags": ["Data Producer Job Control (example producer)"]
-        }},
-        "/ei-producer/v1/eiproducers/{eiProducerId}/eijobs": {"get": {
-            "summary": "EI job definitions",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "description": "EI job definitions for one EI producer",
-            "operationId": "getEiProducerJobsUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {
-                        "type": "array",
-                        "items": {"$ref": "#/definitions/producer_ei_job_request"}
-                    },
-                    "description": "EI producer"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {
-                    "schema": {"$ref": "#/definitions/ProblemDetails"},
-                    "description": "Enrichment Information producer is not found"
-                }
-            },
-            "parameters": [{
-                "in": "path",
-                "name": "eiProducerId",
-                "description": "eiProducerId",
-                "type": "string",
-                "required": true
-            }],
-            "tags": ["Data Producer Registry API"]
-        }},
-        "/A1-EI/v1/eijobs": {"get": {
-            "summary": "EI job identifiers",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "description": "query for EI job identifiers",
-            "operationId": "getEiJobIdsUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {
-                        "type": "array",
-                        "items": {"type": "string"}
-                    },
-                    "description": "EI job identifiers"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {
-                    "schema": {"$ref": "#/definitions/ProblemDetails"},
-                    "description": "Enrichment Information type is not found"
-                }
-            },
-            "parameters": [
-                {
-                    "in": "query",
-                    "allowEmptyValue": false,
-                    "name": "eiTypeId",
-                    "description": "selects EI jobs of matching EI type",
-                    "type": "string",
-                    "required": false
-                },
-                {
-                    "in": "query",
-                    "allowEmptyValue": false,
-                    "name": "owner",
-                    "description": "selects EI jobs for one EI job owner",
-                    "type": "string",
-                    "required": false
-                }
-            ],
-            "tags": ["A1-EI (enrichment information)"]
-        }},
-        "/A1-EI/v1/eijobs/{eiJobId}/status": {"get": {
-            "summary": "EI job status",
-            "deprecated": false,
-            "produces": ["application/json"],
-            "operationId": "getEiJobStatusUsingGET",
-            "responses": {
-                "200": {
-                    "schema": {"$ref": "#/definitions/EiJobStatusObject"},
-                    "description": "EI job status"
-                },
-                "401": {"description": "Unauthorized"},
-                "403": {"description": "Forbidden"},
-                "404": {
-                    "schema": {"$ref": "#/definitions/ProblemDetails"},
-                    "description": "Enrichment Information job is not found"
-                }
-            },
-            "parameters": [{
-                "in": "path",
-                "name": "eiJobId",
-                "description": "eiJobId",
-                "type": "string",
-                "required": true
-            }],
-            "tags": ["A1-EI (enrichment information)"]
-        }}
-    },
-    "definitions": {
+    "components": {"schemas": {
         "producer_ei_job_request": {
             "description": "The body of the EI producer callbacks for EI job creation and deletion",
             "type": "object",
-            "title": "producer_ei_job_request",
             "required": ["ei_job_identity"],
             "properties": {
                 "owner": {
@@ -616,28 +33,32 @@
         },
         "EiTypeObject": {
             "description": "Information for an EI type",
-            "type": "object",
-            "title": "EiTypeObject"
+            "type": "object"
         },
         "status_info": {
             "type": "object",
-            "title": "status_info",
+            "required": [
+                "no_of_jobs",
+                "no_of_producers",
+                "no_of_types",
+                "status"
+            ],
             "properties": {
                 "no_of_producers": {
                     "format": "int32",
                     "description": "Number of EI producers",
                     "type": "integer"
                 },
-                "no_of_jobs": {
-                    "format": "int32",
-                    "description": "Number of EI jobs",
-                    "type": "integer"
-                },
                 "no_of_types": {
                     "format": "int32",
                     "description": "Number of EI types",
                     "type": "integer"
                 },
+                "no_of_jobs": {
+                    "format": "int32",
+                    "description": "Number of EI jobs",
+                    "type": "integer"
+                },
                 "status": {
                     "description": "status text",
                     "type": "string"
@@ -647,7 +68,6 @@
         "producer_ei_type_info": {
             "description": "Information for an EI type",
             "type": "object",
-            "title": "producer_ei_type_info",
             "required": ["ei_job_data_schema"],
             "properties": {"ei_job_data_schema": {
                 "description": "Json schema for the job data",
@@ -657,7 +77,6 @@
         "producer_registration_info": {
             "description": "Information for an EI producer",
             "type": "object",
-            "title": "producer_registration_info",
             "required": [
                 "ei_job_callback_url",
                 "ei_producer_supervision_callback_url",
@@ -667,7 +86,10 @@
                 "supported_ei_types": {
                     "description": "Supported EI type IDs",
                     "type": "array",
-                    "items": {"type": "string"}
+                    "items": {
+                        "description": "Supported EI type IDs",
+                        "type": "string"
+                    }
                 },
                 "ei_producer_supervision_callback_url": {
                     "description": "callback for producer supervision",
@@ -682,10 +104,9 @@
         "producer_status": {
             "description": "Status for an EI Producer",
             "type": "object",
-            "title": "producer_status",
             "required": ["operational_state"],
             "properties": {"operational_state": {
-                "description": "Operational state, values:\nENABLED: TBD\nDISABLED: TBD.",
+                "description": "Represents the operational states",
                 "type": "string",
                 "enum": [
                     "ENABLED",
@@ -696,7 +117,6 @@
         "ProblemDetails": {
             "description": "A problem detail to carry details in a HTTP response according to RFC 7807",
             "type": "object",
-            "title": "ProblemDetails",
             "properties": {
                 "detail": {
                     "description": "A human-readable explanation specific to this occurrence of the problem.",
@@ -711,13 +131,16 @@
                 }
             }
         },
+        "Void": {
+            "description": "Void/empty ",
+            "type": "object"
+        },
         "EiJobStatusObject": {
             "description": "Status for an EI job",
             "type": "object",
-            "title": "EiJobStatusObject",
             "required": ["eiJobStatus"],
             "properties": {"eiJobStatus": {
-                "description": "values:\nENABLED: the A1-EI producer is able to deliver EI result for the EI job\nDISABLED: the A1-EI producer is unable to deliver EI result for the EI job",
+                "description": "Allowed values for EI job status",
                 "type": "string",
                 "enum": [
                     "ENABLED",
@@ -728,7 +151,6 @@
         "EiJobObject": {
             "description": "Information for an Enrichment Information Job",
             "type": "object",
-            "title": "EiJobObject",
             "required": [
                 "eiTypeId",
                 "jobDefinition",
@@ -748,7 +170,7 @@
                     "description": "Identity of the owner of the job",
                     "type": "string"
                 },
-                "jobStatusNotificationUri": {
+                "statusNotificationUri": {
                     "description": "The target of EI job status notifications",
                     "type": "string"
                 },
@@ -758,33 +180,505 @@
                 }
             }
         }
+    }},
+    "openapi": "3.0.1",
+    "paths": {
+        "/producer_simulator/ei_job": {"post": {
+            "summary": "Callback for EI job creation/modification",
+            "requestBody": {
+                "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_ei_job_request"}}},
+                "required": true
+            },
+            "description": "The call is invoked to activate or to modify a data subscription. The endpoint is provided by the EI producer.",
+            "operationId": "jobCreatedCallback",
+            "responses": {"200": {
+                "description": "OK",
+                "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+            }},
+            "tags": ["Data producer (callbacks)"]
+        }},
+        "/A1-EI/v1/eitypes/{eiTypeId}": {"get": {
+            "summary": "Individual EI type",
+            "operationId": "getEiType_1",
+            "responses": {
+                "200": {
+                    "description": "EI type",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiTypeObject"}}}
+                },
+                "404": {
+                    "description": "Enrichment Information type is not found",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                }
+            },
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "path",
+                "name": "eiTypeId",
+                "required": true
+            }],
+            "tags": ["A1-EI (registration)"]
+        }},
+        "/ei-producer/v1/eitypes": {"get": {
+            "summary": "EI type identifiers",
+            "operationId": "getEiTypeIdentifiers",
+            "responses": {"200": {
+                "description": "EI type identifiers",
+                "content": {"application/json": {"schema": {
+                    "type": "array",
+                    "items": {"type": "string"}
+                }}}
+            }},
+            "tags": ["Data producer (registration)"]
+        }},
+        "/A1-EI/v1/eitypes": {"get": {
+            "summary": "EI type identifiers",
+            "operationId": "getEiTypeIdentifiers_1",
+            "responses": {"200": {
+                "description": "EI type identifiers",
+                "content": {"application/json": {"schema": {
+                    "type": "array",
+                    "items": {"type": "string"}
+                }}}
+            }},
+            "tags": ["A1-EI (registration)"]
+        }},
+        "/ei-producer/v1/eiproducers/{eiProducerId}/status": {"get": {
+            "summary": "EI producer status",
+            "operationId": "getEiProducerStatus",
+            "responses": {
+                "200": {
+                    "description": "EI producer status",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_status"}}}
+                },
+                "404": {
+                    "description": "Enrichment Information producer is not found",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                }
+            },
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "path",
+                "name": "eiProducerId",
+                "required": true
+            }],
+            "tags": ["Data producer (registration)"]
+        }},
+        "/producer_simulator/ei_job/{eiJobId}": {"delete": {
+            "summary": "Callback for EI job deletion",
+            "description": "The call is invoked to terminate a data subscription. The endpoint is provided by the EI producer.",
+            "operationId": "jobDeletedCallback",
+            "responses": {"200": {
+                "description": "OK",
+                "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+            }},
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "path",
+                "name": "eiJobId",
+                "required": true
+            }],
+            "tags": ["Data producer (callbacks)"]
+        }},
+        "/ei-producer/v1/eitypes/{eiTypeId}": {
+            "get": {
+                "summary": "Individual EI type",
+                "operationId": "getEiType",
+                "responses": {
+                    "200": {
+                        "description": "EI type",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_ei_type_info"}}}
+                    },
+                    "404": {
+                        "description": "Enrichment Information type is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiTypeId",
+                    "required": true
+                }],
+                "tags": ["Data producer (registration)"]
+            },
+            "delete": {
+                "summary": "Individual EI type",
+                "operationId": "deleteEiType",
+                "responses": {
+                    "200": {
+                        "description": "Not used",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "204": {
+                        "description": "Producer deleted",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "404": {
+                        "description": "Enrichment Information type is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    },
+                    "406": {
+                        "description": "The Enrichment Information type has one or several active producers",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiTypeId",
+                    "required": true
+                }],
+                "tags": ["Data producer (registration)"]
+            },
+            "put": {
+                "summary": "Individual EI type",
+                "requestBody": {
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_ei_type_info"}}},
+                    "required": true
+                },
+                "operationId": "putEiType",
+                "responses": {
+                    "200": {
+                        "description": "Type updated",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "201": {
+                        "description": "Type created",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "400": {
+                        "description": "Bad request",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiTypeId",
+                    "required": true
+                }],
+                "tags": ["Data producer (registration)"]
+            }
+        },
+        "/status": {"get": {
+            "summary": "Returns status and statistics of this service",
+            "operationId": "getStatus",
+            "responses": {"200": {
+                "description": "Service is living",
+                "content": {"application/json": {"schema": {"$ref": "#/components/schemas/status_info"}}}
+            }},
+            "tags": ["EI Service status"]
+        }},
+        "/ei-producer/v1/eiproducers": {"get": {
+            "summary": "EI producer identifiers",
+            "operationId": "getEiProducerIdentifiers",
+            "responses": {"200": {
+                "description": "EI producer identifiers",
+                "content": {"application/json": {"schema": {
+                    "type": "array",
+                    "items": {"type": "string"}
+                }}}
+            }},
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "query",
+                "name": "ei_type_id",
+                "description": "If given, only the producers for the EI Data type is returned.",
+                "required": false
+            }],
+            "tags": ["Data producer (registration)"]
+        }},
+        "/A1-EI/v1/eijobs/{eiJobId}": {
+            "get": {
+                "summary": "Individual EI job",
+                "operationId": "getIndividualEiJob",
+                "responses": {
+                    "200": {
+                        "description": "EI job",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobObject"}}}
+                    },
+                    "404": {
+                        "description": "Enrichment Information job is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiJobId",
+                    "required": true
+                }],
+                "tags": ["A1-EI (registration)"]
+            },
+            "delete": {
+                "summary": "Individual EI job",
+                "operationId": "deleteIndividualEiJob",
+                "responses": {
+                    "200": {
+                        "description": "Not used",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "204": {
+                        "description": "Job deleted",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "404": {
+                        "description": "Enrichment Information job is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiJobId",
+                    "required": true
+                }],
+                "tags": ["A1-EI (registration)"]
+            },
+            "put": {
+                "summary": "Individual EI job",
+                "requestBody": {
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobObject"}}},
+                    "required": true
+                },
+                "operationId": "putIndividualEiJob",
+                "responses": {
+                    "200": {
+                        "description": "Job updated",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "201": {
+                        "description": "Job created",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "404": {
+                        "description": "Enrichment Information type is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiJobId",
+                    "required": true
+                }],
+                "tags": ["A1-EI (registration)"]
+            }
+        },
+        "/ei-producer/v1/eiproducers/{eiProducerId}": {
+            "get": {
+                "summary": "Individual EI producer",
+                "operationId": "getEiProducer",
+                "responses": {
+                    "200": {
+                        "description": "EI producer",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_registration_info"}}}
+                    },
+                    "404": {
+                        "description": "Enrichment Information producer is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiProducerId",
+                    "required": true
+                }],
+                "tags": ["Data producer (registration)"]
+            },
+            "delete": {
+                "summary": "Individual EI producer",
+                "operationId": "deleteEiProducer",
+                "responses": {
+                    "200": {
+                        "description": "Not used",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "204": {
+                        "description": "Producer deleted",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "404": {
+                        "description": "Producer is not found",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiProducerId",
+                    "required": true
+                }],
+                "tags": ["Data producer (registration)"]
+            },
+            "put": {
+                "summary": "Individual EI producer",
+                "requestBody": {
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_registration_info"}}},
+                    "required": true
+                },
+                "operationId": "putEiProducer",
+                "responses": {
+                    "200": {
+                        "description": "Producer updated",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    },
+                    "201": {
+                        "description": "Producer created",
+                        "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+                    }
+                },
+                "parameters": [{
+                    "schema": {"type": "string"},
+                    "in": "path",
+                    "name": "eiProducerId",
+                    "required": true
+                }],
+                "tags": ["Data producer (registration)"]
+            }
+        },
+        "/producer_simulator/health_check": {"get": {
+            "summary": "Producer supervision",
+            "description": "The endpoint is provided by the EI producer and is used for supervision of the producer.",
+            "operationId": "producerSupervision",
+            "responses": {"200": {
+                "description": "The producer is OK",
+                "content": {"application/json": {"schema": {"type": "string"}}}
+            }},
+            "tags": ["Data producer (callbacks)"]
+        }},
+        "/ei-producer/v1/eiproducers/{eiProducerId}/eijobs": {"get": {
+            "summary": "EI job definitions",
+            "description": "EI job definitions for one EI producer",
+            "operationId": "getEiProducerJobs",
+            "responses": {
+                "200": {
+                    "description": "EI producer",
+                    "content": {"application/json": {"schema": {
+                        "type": "array",
+                        "items": {"$ref": "#/components/schemas/producer_ei_job_request"}
+                    }}}
+                },
+                "404": {
+                    "description": "Enrichment Information producer is not found",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                }
+            },
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "path",
+                "name": "eiProducerId",
+                "required": true
+            }],
+            "tags": ["Data producer (registration)"]
+        }},
+        "/A1-EI/v1/eijobs": {"get": {
+            "summary": "EI job identifiers",
+            "description": "query for EI job identifiers",
+            "operationId": "getEiJobIds",
+            "responses": {
+                "200": {
+                    "description": "EI job identifiers",
+                    "content": {"application/json": {"schema": {
+                        "type": "array",
+                        "items": {"type": "string"}
+                    }}}
+                },
+                "404": {
+                    "description": "Enrichment Information type is not found",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                }
+            },
+            "parameters": [
+                {
+                    "schema": {"type": "string"},
+                    "in": "query",
+                    "name": "eiTypeId",
+                    "description": "selects EI jobs of matching EI type",
+                    "required": false
+                },
+                {
+                    "schema": {"type": "string"},
+                    "in": "query",
+                    "name": "owner",
+                    "description": "selects EI jobs for one EI job owner",
+                    "required": false
+                }
+            ],
+            "tags": ["A1-EI (registration)"]
+        }},
+        "/A1-EI/v1/eijobs/{eiJobId}/status": {"get": {
+            "summary": "EI job status",
+            "operationId": "getEiJobStatus",
+            "responses": {
+                "200": {
+                    "description": "EI job status",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobStatusObject"}}}
+                },
+                "404": {
+                    "description": "Enrichment Information job is not found",
+                    "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+                }
+            },
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "path",
+                "name": "eiJobId",
+                "required": true
+            }],
+            "tags": ["A1-EI (registration)"]
+        }},
+        "/example_dataconsumer/eijobs/{eiJobId}/status": {"post": {
+            "summary": "Callback for changed EI job status",
+            "requestBody": {
+                "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobStatusObject"}}},
+                "required": true
+            },
+            "description": "The primitive is implemented by the data consumer and is invoked when a EI job status has been changed.",
+            "operationId": "jobStatusCallback",
+            "responses": {"200": {
+                "description": "OK",
+                "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+            }},
+            "parameters": [{
+                "schema": {"type": "string"},
+                "in": "path",
+                "name": "eiJobId",
+                "required": true
+            }],
+            "tags": ["A1-EI (callbacks)"]
+        }}
     },
-    "swagger": "2.0",
     "info": {
-        "description": "This page lists all the rest apis for the service.",
-        "title": "Enrichment Data service",
+        "license": {
+            "name": "Copyright (C) 2020 Nordix Foundation. Licensed under the Apache License.",
+            "url": "http://www.apache.org/licenses/LICENSE-2.0"
+        },
+        "description": "<h1>API documentation<\/h1><h2>General<\/h2><p>  The service is mainly a broker between data producers and data consumers. A data producer has the ability to producer one or several type of data (EI type). One type of data can be produced by zero to many producers. <br /><br />A data consumer can have several active data subscriptions (EI job). One EI job consists of the the type of data to produce and additional parameters for filtering of the data. These parameters are different for different data types.<\/p><h2>APIs provided by the service<\/h2><h4>A1-EI<\/h4><p>  This API is between Near-RT RIC, which is a data consumer and the Non-RT RIC. <\/p><h4>Data producer API<\/h4><p>  This API is between data producers and this service. It is divivided into two parts, where one is provided by this service (registration) and one part is provided by the data producer.<\/p><h4>EI Service status<\/h4><p>  This API provides a means to monitor the service.<\/p>",
+        "title": "Enrichment Information Service",
         "version": "1.0"
     },
     "tags": [
         {
-            "name": "A1-EI (enrichment information)",
-            "description": "Consumer Controller"
+            "name": "A1-EI (registration)",
+            "description": "Data consumer EI job registration"
         },
         {
-            "name": "A1-EI (enrichment information) callbacks",
-            "description": "Consumer Simulator Controller"
+            "name": "A1-EI (callbacks)",
+            "description": "Data consumer EI job status callbacks"
         },
         {
-            "name": "Data Producer Job Control (example producer)",
-            "description": "Producer Simulator Controller"
+            "name": "Data producer (callbacks)",
+            "description": "API implemented by data producers"
         },
         {
-            "name": "Data Producer Registry API",
-            "description": "Producer Controller"
+            "name": "Data producer (registration)",
+            "description": "API for data producers"
         },
         {
-            "name": "Service status",
-            "description": "Status Controller"
+            "name": "EI Service status",
+            "description": "API for monitoring of the service"
         }
     ]
 }
\ No newline at end of file
diff --git a/enrichment-coordinator-service/api/ecs-api.yaml b/enrichment-coordinator-service/api/ecs-api.yaml
index d1aa187..3b705cf 100644
--- a/enrichment-coordinator-service/api/ecs-api.yaml
+++ b/enrichment-coordinator-service/api/ecs-api.yaml
@@ -1,30 +1,45 @@
 openapi: 3.0.1
 info:
-  title: Enrichment Data service
-  description: This page lists all the rest apis for the service.
+  title: Enrichment Information Service
+  description: <h1>API documentation</h1><h2>General</h2><p>  The service is mainly
+    a broker between data producers and data consumers. A data producer has the ability
+    to producer one or several type of data (EI type). One type of data can be produced
+    by zero to many producers. <br /><br />A data consumer can have several active
+    data subscriptions (EI job). One EI job consists of the the type of data to produce
+    and additional parameters for filtering of the data. These parameters are different
+    for different data types.</p><h2>APIs provided by the service</h2><h4>A1-EI</h4><p>  This
+    API is between Near-RT RIC, which is a data consumer and the Non-RT RIC. </p><h4>Data
+    producer API</h4><p>  This API is between data producers and this service. It
+    is divivided into two parts, where one is provided by this service (registration)
+    and one part is provided by the data producer.</p><h4>EI Service status</h4><p>  This
+    API provides a means to monitor the service.</p>
+  license:
+    name: Copyright (C) 2020 Nordix Foundation. Licensed under the Apache License.
+    url: http://www.apache.org/licenses/LICENSE-2.0
   version: "1.0"
 servers:
 - url: /
 tags:
-- name: A1-EI (enrichment information)
-  description: Consumer Controller
-- name: A1-EI (enrichment information) callbacks
-  description: Consumer Simulator Controller
-- name: Data Producer Job Control (example producer)
-  description: Producer Simulator Controller
-- name: Data Producer Registry API
-  description: Producer Controller
-- name: Service status
-  description: Status Controller
+- name: A1-EI (registration)
+  description: Data consumer EI job registration
+- name: A1-EI (callbacks)
+  description: Data consumer EI job status callbacks
+- name: Data producer (callbacks)
+  description: API implemented by data producers
+- name: Data producer (registration)
+  description: API for data producers
+- name: EI Service status
+  description: API for monitoring of the service
 paths:
   /producer_simulator/ei_job:
     post:
       tags:
-      - Data Producer Job Control (example producer)
-      summary: Callback for EI job creation
-      operationId: jobCreatedCallbackUsingPOST
+      - Data producer (callbacks)
+      summary: Callback for EI job creation/modification
+      description: The call is invoked to activate or to modify a data subscription.
+        The endpoint is provided by the EI producer.
+      operationId: jobCreatedCallback
       requestBody:
-        description: request
         content:
           application/json:
             schema:
@@ -33,31 +48,22 @@
       responses:
         200:
           description: OK
-          content: {}
-        201:
-          description: Created
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
   /A1-EI/v1/eitypes/{eiTypeId}:
     get:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: Individual EI type
-      operationId: getEiTypeUsingGET
+      operationId: getEiType_1
       parameters:
       - name: eiTypeId
         in: path
-        description: eiTypeId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -67,62 +73,18 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/EiTypeObject'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information type is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
-  /consumer_simulator/eijobs/{eiJobId}/status:
-    post:
-      tags:
-      - A1-EI (enrichment information) callbacks
-      summary: Callback for EI job status
-      operationId: jobStatusCallbackUsingPOST
-      parameters:
-      - name: eiJobId
-        in: path
-        description: eiJobId
-        required: true
-        schema:
-          type: string
-      requestBody:
-        description: status
-        content:
-          application/json:
-            schema:
-              $ref: '#/components/schemas/EiJobStatusObject'
-        required: true
-      responses:
-        200:
-          description: OK
-          content: {}
-        201:
-          description: Created
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
   /ei-producer/v1/eitypes:
     get:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: EI type identifiers
-      operationId: getEiTypeIdentifiersUsingGET_1
+      operationId: getEiTypeIdentifiers
       responses:
         200:
           description: EI type identifiers
@@ -132,22 +94,12 @@
                 type: array
                 items:
                   type: string
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
   /A1-EI/v1/eitypes:
     get:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: EI type identifiers
-      operationId: getEiTypeIdentifiersUsingGET
+      operationId: getEiTypeIdentifiers_1
       responses:
         200:
           description: EI type identifiers
@@ -157,27 +109,18 @@
                 type: array
                 items:
                   type: string
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
   /ei-producer/v1/eiproducers/{eiProducerId}/status:
     get:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: EI producer status
-      operationId: getEiProducerStatusUsingGET
+      operationId: getEiProducerStatus
       parameters:
       - name: eiProducerId
         in: path
-        description: eiProducerId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -187,89 +130,47 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/producer_status'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information producer is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
   /producer_simulator/ei_job/{eiJobId}:
     delete:
       tags:
-      - Data Producer Job Control (example producer)
+      - Data producer (callbacks)
       summary: Callback for EI job deletion
-      operationId: jobDeletedCallbackUsingDELETE
+      description: The call is invoked to terminate a data subscription. The endpoint
+        is provided by the EI producer.
+      operationId: jobDeletedCallback
       parameters:
       - name: eiJobId
         in: path
-        description: eiJobId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
         200:
           description: OK
-          content: {}
-        204:
-          description: No Content
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-      deprecated: false
-  /ei-producer/v1/eiproducers:
-    get:
-      tags:
-      - Data Producer Registry API
-      summary: EI producer identifiers
-      operationId: getEiProducerIdentifiersUsingGET
-      parameters:
-      - name: ei_type_id
-        in: query
-        description: If given, only the producers for the EI Data type is returned.
-        allowEmptyValue: false
-        schema:
-          type: string
-      responses:
-        200:
-          description: EI producer identifiers
           content:
             application/json:
               schema:
-                type: array
-                items:
-                  type: string
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
+                $ref: '#/components/schemas/Void'
   /ei-producer/v1/eitypes/{eiTypeId}:
     get:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: Individual EI type
-      operationId: getEiTypeUsingGET_1
+      operationId: getEiType
       parameters:
       - name: eiTypeId
         in: path
-        description: eiTypeId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -279,33 +180,26 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/producer_ei_type_info'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information type is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
     put:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: Individual EI type
-      operationId: putEiTypeUsingPUT
+      operationId: putEiType
       parameters:
       - name: eiTypeId
         in: path
-        description: eiTypeId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       requestBody:
-        description: registrationInfo
         content:
           application/json:
             schema:
@@ -314,51 +208,48 @@
       responses:
         200:
           description: Type updated
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         201:
           description: Type created
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         400:
           description: Bad request
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
     delete:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: Individual EI type
-      operationId: deleteEiTypeUsingDELETE
+      operationId: deleteEiType
       parameters:
       - name: eiTypeId
         in: path
-        description: eiTypeId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
         200:
           description: Not used
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         204:
           description: Producer deleted
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         404:
           description: Enrichment Information type is not found
           content:
@@ -371,13 +262,12 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
   /status:
     get:
       tags:
-      - Service status
+      - EI Service status
       summary: Returns status and statistics of this service
-      operationId: getStatusUsingGET
+      operationId: getStatus
       responses:
         200:
           description: Service is living
@@ -385,27 +275,42 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/status_info'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
+  /ei-producer/v1/eiproducers:
+    get:
+      tags:
+      - Data producer (registration)
+      summary: EI producer identifiers
+      operationId: getEiProducerIdentifiers
+      parameters:
+      - name: ei_type_id
+        in: query
+        description: If given, only the producers for the EI Data type is returned.
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: string
+      responses:
+        200:
+          description: EI producer identifiers
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  type: string
   /A1-EI/v1/eijobs/{eiJobId}:
     get:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: Individual EI job
-      operationId: getIndividualEiJobUsingGET
+      operationId: getIndividualEiJob
       parameters:
       - name: eiJobId
         in: path
-        description: eiJobId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -415,33 +320,26 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/EiJobObject'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information job is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
     put:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: Individual EI job
-      operationId: putIndividualEiJobUsingPUT
+      operationId: putIndividualEiJob
       parameters:
       - name: eiJobId
         in: path
-        description: eiJobId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       requestBody:
-        description: eiJobObject
         content:
           application/json:
             schema:
@@ -450,66 +348,66 @@
       responses:
         200:
           description: Job updated
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         201:
           description: Job created
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         404:
           description: Enrichment Information type is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
     delete:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: Individual EI job
-      operationId: deleteIndividualEiJobUsingDELETE
+      operationId: deleteIndividualEiJob
       parameters:
       - name: eiJobId
         in: path
-        description: eiJobId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
         200:
           description: Not used
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         204:
           description: Job deleted
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         404:
           description: Enrichment Information job is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
   /ei-producer/v1/eiproducers/{eiProducerId}:
     get:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: Individual EI producer
-      operationId: getEiProducerUsingGET
+      operationId: getEiProducer
       parameters:
       - name: eiProducerId
         in: path
-        description: eiProducerId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -519,33 +417,26 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/producer_registration_info'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information producer is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
     put:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: Individual EI producer
-      operationId: putEiProducerUsingPUT
+      operationId: putEiProducer
       parameters:
       - name: eiProducerId
         in: path
-        description: eiProducerId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       requestBody:
-        description: registrationInfo
         content:
           application/json:
             schema:
@@ -554,87 +445,76 @@
       responses:
         200:
           description: Producer updated
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         201:
           description: Producer created
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
     delete:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: Individual EI producer
-      operationId: deleteEiProducerUsingDELETE
+      operationId: deleteEiProducer
       parameters:
       - name: eiProducerId
         in: path
-        description: eiProducerId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
         200:
           description: Not used
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         204:
           description: Producer deleted
-          content: {}
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
         404:
           description: Producer is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
   /producer_simulator/health_check:
     get:
       tags:
-      - Data Producer Job Control (example producer)
+      - Data producer (callbacks)
       summary: Producer supervision
-      operationId: producerSupervisionUsingGET
+      description: The endpoint is provided by the EI producer and is used for supervision
+        of the producer.
+      operationId: producerSupervision
       responses:
         200:
-          description: OK
+          description: The producer is OK
           content:
             application/json:
               schema:
                 type: string
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
-        404:
-          description: Not Found
-          content: {}
-      deprecated: false
   /ei-producer/v1/eiproducers/{eiProducerId}/eijobs:
     get:
       tags:
-      - Data Producer Registry API
+      - Data producer (registration)
       summary: EI job definitions
       description: EI job definitions for one EI producer
-      operationId: getEiProducerJobsUsingGET
+      operationId: getEiProducerJobs
       parameters:
       - name: eiProducerId
         in: path
-        description: eiProducerId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -646,37 +526,34 @@
                 type: array
                 items:
                   $ref: '#/components/schemas/producer_ei_job_request'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information producer is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
   /A1-EI/v1/eijobs:
     get:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: EI job identifiers
       description: query for EI job identifiers
-      operationId: getEiJobIdsUsingGET
+      operationId: getEiJobIds
       parameters:
       - name: eiTypeId
         in: query
         description: selects EI jobs of matching EI type
-        allowEmptyValue: false
+        required: false
+        style: form
+        explode: true
         schema:
           type: string
       - name: owner
         in: query
         description: selects EI jobs for one EI job owner
-        allowEmptyValue: false
+        required: false
+        style: form
+        explode: true
         schema:
           type: string
       responses:
@@ -688,30 +565,24 @@
                 type: array
                 items:
                   type: string
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information type is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
   /A1-EI/v1/eijobs/{eiJobId}/status:
     get:
       tags:
-      - A1-EI (enrichment information)
+      - A1-EI (registration)
       summary: EI job status
-      operationId: getEiJobStatusUsingGET
+      operationId: getEiJobStatus
       parameters:
       - name: eiJobId
         in: path
-        description: eiJobId
         required: true
+        style: simple
+        explode: false
         schema:
           type: string
       responses:
@@ -721,23 +592,44 @@
             application/json:
               schema:
                 $ref: '#/components/schemas/EiJobStatusObject'
-        401:
-          description: Unauthorized
-          content: {}
-        403:
-          description: Forbidden
-          content: {}
         404:
           description: Enrichment Information job is not found
           content:
             application/json:
               schema:
                 $ref: '#/components/schemas/ProblemDetails'
-      deprecated: false
+  /example_dataconsumer/eijobs/{eiJobId}/status:
+    post:
+      tags:
+      - A1-EI (callbacks)
+      summary: Callback for changed EI job status
+      description: The primitive is implemented by the data consumer and is invoked
+        when a EI job status has been changed.
+      operationId: jobStatusCallback
+      parameters:
+      - name: eiJobId
+        in: path
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/EiJobStatusObject'
+        required: true
+      responses:
+        200:
+          description: OK
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Void'
 components:
   schemas:
     producer_ei_job_request:
-      title: producer_ei_job_request
       required:
       - ei_job_identity
       type: object
@@ -753,7 +645,6 @@
           description: The time when the job was last updated or created (ISO-8601)
         ei_job_data:
           type: object
-          properties: {}
           description: Json for the job data
         target_uri:
           type: string
@@ -763,41 +654,41 @@
           description: Type idenitity for the job
       description: The body of the EI producer callbacks for EI job creation and deletion
     EiTypeObject:
-      title: EiTypeObject
       type: object
       description: Information for an EI type
     status_info:
-      title: status_info
+      required:
+      - no_of_jobs
+      - no_of_producers
+      - no_of_types
+      - status
       type: object
       properties:
         no_of_producers:
           type: integer
           description: Number of EI producers
           format: int32
-        no_of_jobs:
-          type: integer
-          description: Number of EI jobs
-          format: int32
         no_of_types:
           type: integer
           description: Number of EI types
           format: int32
+        no_of_jobs:
+          type: integer
+          description: Number of EI jobs
+          format: int32
         status:
           type: string
           description: status text
     producer_ei_type_info:
-      title: producer_ei_type_info
       required:
       - ei_job_data_schema
       type: object
       properties:
         ei_job_data_schema:
           type: object
-          properties: {}
           description: Json schema for the job data
       description: Information for an EI type
     producer_registration_info:
-      title: producer_registration_info
       required:
       - ei_job_callback_url
       - ei_producer_supervision_callback_url
@@ -809,6 +700,7 @@
           description: Supported EI type IDs
           items:
             type: string
+            description: Supported EI type IDs
         ei_producer_supervision_callback_url:
           type: string
           description: callback for producer supervision
@@ -817,23 +709,18 @@
           description: callback for EI job
       description: Information for an EI producer
     producer_status:
-      title: producer_status
       required:
       - operational_state
       type: object
       properties:
         operational_state:
           type: string
-          description: |-
-            Operational state, values:
-            ENABLED: TBD
-            DISABLED: TBD.
+          description: Represents the operational states
           enum:
           - ENABLED
           - DISABLED
       description: Status for an EI Producer
     ProblemDetails:
-      title: ProblemDetails
       type: object
       properties:
         detail:
@@ -849,24 +736,22 @@
           example: 404
       description: A problem detail to carry details in a HTTP response according
         to RFC 7807
+    Void:
+      type: object
+      description: 'Void/empty '
     EiJobStatusObject:
-      title: EiJobStatusObject
       required:
       - eiJobStatus
       type: object
       properties:
         eiJobStatus:
           type: string
-          description: |-
-            values:
-            ENABLED: the A1-EI producer is able to deliver EI result for the EI job
-            DISABLED: the A1-EI producer is unable to deliver EI result for the EI job
+          description: Allowed values for EI job status
           enum:
           - ENABLED
           - DISABLED
       description: Status for an EI job
     EiJobObject:
-      title: EiJobObject
       required:
       - eiTypeId
       - jobDefinition
@@ -883,11 +768,10 @@
         jobOwner:
           type: string
           description: Identity of the owner of the job
-        jobStatusNotificationUri:
+        statusNotificationUri:
           type: string
           description: The target of EI job status notifications
         jobDefinition:
           type: object
-          properties: {}
           description: EI type specific job data
       description: Information for an Enrichment Information Job
diff --git a/enrichment-coordinator-service/pom.xml b/enrichment-coordinator-service/pom.xml
index 2a65315..e7f2bd6 100644
--- a/enrichment-coordinator-service/pom.xml
+++ b/enrichment-coordinator-service/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.3.4.RELEASE</version>
+        <version>2.4.2</version>
         <relativePath />
     </parent>
     <groupId>org.o-ran-sc.nonrtric</groupId>
@@ -47,10 +47,10 @@
     </repositories>
     <properties>
         <java.version>11</java.version>
-        <springfox.version>2.9.2</springfox.version>
+        <springfox.version>3.0.0</springfox.version>
         <immutable.version>2.8.2</immutable.version>
         <sdk.version>1.1.6</sdk.version>
-        <swagger.version>2.0.0</swagger.version>
+        <swagger.version>2.1.6</swagger.version>
         <json.version>20190722</json.version>
         <commons-net.version>3.6</commons-net.version>
         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
@@ -66,6 +66,11 @@
     </properties>
     <dependencies>
         <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-ui</artifactId>
+            <version>1.5.2</version>
+        </dependency>
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
@@ -375,4 +380,4 @@
         <system>JIRA</system>
         <url>https://jira.o-ran-sc.org/</url>
     </issueManagement>
-</project>
+</project>
\ No newline at end of file
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java
index 6fa38aa..944cbf0 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java
@@ -20,74 +20,51 @@
 
 package org.oransc.enrichment;
 
-import com.fasterxml.classmate.TypeResolver;
-import com.google.common.base.Predicates;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.info.License;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
-
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
+import org.oransc.enrichment.controllers.StatusController;
+import org.oransc.enrichment.controllers.consumer.ConsumerConsts;
+import org.oransc.enrichment.controllers.producer.ProducerConsts;
 
 /**
- * Swagger configuration class that uses swagger2 documentation type and scans
+ * Swagger configuration class that uses swagger documentation type and scans
  * all the controllers. To access the swagger gui go to
  * http://ip:port/swagger-ui.html
  */
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig extends WebMvcConfigurationSupport {
+
+@OpenAPIDefinition( //
+    tags = {@Tag(name = ConsumerConsts.CONSUMER_API_NAME, description = ConsumerConsts.CONSUMER_API_DESCRIPTION),
+        @Tag(
+            name = ConsumerConsts.CONSUMER_API_CALLBACKS_NAME,
+            description = ConsumerConsts.CONSUMER_API_CALLBACKS_DESCRIPTION),
+        @Tag(
+            name = ProducerConsts.PRODUCER_API_CALLBACKS_NAME,
+            description = ProducerConsts.PRODUCER_API_CALLBACKS_DESCRIPTION),
+        @Tag(name = ProducerConsts.PRODUCER_API_NAME, description = ProducerConsts.PRODUCER_API_DESCRIPTION), //
+        @Tag(name = StatusController.API_NAME, description = StatusController.API_DESCRIPTION)}, //
+    info = @Info(
+        title = "Enrichment Information Service", //
+        version = "1.0", //
+        description = SwaggerConfig.DESCRIPTION, //
+        license = @License(
+            name = "Copyright (C) 2020 Nordix Foundation. Licensed under the Apache License.",
+            url = "http://www.apache.org/licenses/LICENSE-2.0")))
+public class SwaggerConfig {
+    private SwaggerConfig() {
+    }
 
     static final String API_TITLE = "Enrichment Data service";
-    static final String DESCRIPTION = "This page lists all the rest apis for the service.";
-    static final String VERSION = "1.0";
-    @SuppressWarnings("squid:S1075") // Refactor your code to get this URI from a customizable parameter.
-    static final String RESOURCES_PATH = "classpath:/META-INF/resources/";
-    static final String WEBJARS_PATH = RESOURCES_PATH + "webjars/";
-    static final String SWAGGER_UI = "swagger-ui.html";
-    static final String WEBJARS = "/webjars/**";
 
-    /**
-     * Gets the API info.
-     *
-     * @return the API info.
-     */
-    @Bean
-    public Docket api(TypeResolver resolver) {
-        return new Docket(DocumentationType.SWAGGER_2) //
-            .apiInfo(apiInfo()) //
-            .select() //
-            .apis(RequestHandlerSelectors.any()) //
-            .paths(PathSelectors.any()) //
-            .paths(Predicates.not(PathSelectors.regex("/error"))) // this endpoint is not implemented, but was
-                                                                  // visible for Swagger
-            .paths(Predicates.not(PathSelectors.regex("/actuator.*"))) // this endpoint is implemented by spring
-                                                                       // framework, exclude for now
-            .build();
-    }
-
-    private static ApiInfo apiInfo() {
-        return new ApiInfoBuilder() //
-            .title(API_TITLE) //
-            .description(DESCRIPTION) //
-            .version(VERSION) //
-            .build();
-    }
-
-    @Override
-    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
-        registry.addResourceHandler(SWAGGER_UI) //
-            .addResourceLocations(RESOURCES_PATH);
-
-        registry.addResourceHandler(WEBJARS) //
-            .addResourceLocations(WEBJARS_PATH);
-    }
+    static final String DESCRIPTION = "<h1>API documentation</h1>" + "<h2>General</h2>" + "<p>"
+        + "  The service is mainly a broker between data producers and data consumers. A data producer has the ability to producer one or several type of data (EI type). One type of data can be produced by zero to many producers. <br /><br />A data consumer can have several active data subscriptions (EI job). One EI job consists of the the type of data to produce and additional parameters for filtering of the data. These parameters are different for different data types."
+        + "</p>" + "<h2>APIs provided by the service</h2>" + "<h4>A1-EI</h4>" + "<p>"
+        + "  This API is between Near-RT RIC, which is a data consumer and the Non-RT RIC. " + "</p>"
+        + "<h4>Data producer API</h4>" + "<p>"
+        + "  This API is between data producers and this service. It is divivided into two parts, where one is provided by this service (registration) and one part is provided by the data producer."
+        + "</p>" + "<h4>EI Service status</h4>" + "<p>" + "  This API provides a means to monitor the service."
+        + "</p>";
 
 }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java
index f0f6c4b..85927c7 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java
@@ -42,9 +42,7 @@
 
 import reactor.core.publisher.Mono;
 import reactor.netty.http.client.HttpClient;
-import reactor.netty.resources.ConnectionProvider;
-import reactor.netty.tcp.ProxyProvider.Proxy;
-import reactor.netty.tcp.TcpClient;
+import reactor.netty.transport.ProxyProvider;
 
 /**
  * Generic reactive REST client.
@@ -200,32 +198,34 @@
             && !httpProxyConfig.httpProxyHost().isEmpty();
     }
 
-    private TcpClient createTcpClient() {
-        TcpClient client = TcpClient.create(ConnectionProvider.newConnection()) //
+    private HttpClient buildHttpClient() {
+        HttpClient httpClient = HttpClient.create() //
             .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) //
             .doOnConnected(connection -> {
                 connection.addHandlerLast(new ReadTimeoutHandler(30));
                 connection.addHandlerLast(new WriteTimeoutHandler(30));
             });
+
         if (this.sslContext != null) {
-            client = client.secure(c -> c.sslContext(sslContext));
+            httpClient = httpClient.secure(ssl -> {
+                ssl.sslContext(sslContext);
+            });
         }
+
         if (isHttpProxyConfigured()) {
-            client = client.proxy(proxy -> proxy.type(Proxy.HTTP).host(httpProxyConfig.httpProxyHost())
-                .port(httpProxyConfig.httpProxyPort()));
+            httpClient = httpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
+                .host(httpProxyConfig.httpProxyHost()).port(httpProxyConfig.httpProxyPort()));
         }
-        return client;
+        return httpClient;
     }
 
-    private WebClient createWebClient(String baseUrl, TcpClient tcpClient) {
-        HttpClient httpClient = HttpClient.from(tcpClient);
-
-        ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
+    private WebClient buildWebClient(String baseUrl) {
+        final HttpClient httpClient = buildHttpClient();
         ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder() //
             .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1)) //
             .build();
         return WebClient.builder() //
-            .clientConnector(connector) //
+            .clientConnector(new ReactorClientHttpConnector(httpClient)) //
             .baseUrl(baseUrl) //
             .exchangeStrategies(exchangeStrategies) //
             .build();
@@ -233,15 +233,9 @@
 
     private Mono<WebClient> getWebClient() {
         if (this.webClient == null) {
-            try {
-                TcpClient tcpClient = createTcpClient();
-                this.webClient = createWebClient(this.baseUrl, tcpClient);
-            } catch (Exception e) {
-                logger.error("Could not create WebClient {}", e.getMessage());
-                return Mono.error(e);
-            }
+            this.webClient = buildWebClient(baseUrl);
         }
-        return Mono.just(this.webClient);
+        return Mono.just(buildWebClient(baseUrl));
     }
 
 }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java
index 921b807..d423e19 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java
@@ -24,8 +24,7 @@
 import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.oransc.enrichment.exceptions.ServiceException;
 import org.springframework.http.HttpHeaders;
@@ -38,8 +37,8 @@
     private static Gson gson = new GsonBuilder().create();
 
     // Returned as body for all failed REST calls
-    @ApiModel(
-        value = "ProblemDetails",
+    @Schema(
+        name = "ProblemDetails",
         description = "A problem detail to carry details in a HTTP response according to RFC 7807")
     public static class ErrorInfo {
         @SerializedName("type")
@@ -62,22 +61,22 @@
             this.status = status;
         }
 
-        @ApiModelProperty(
+        @Schema(
             example = "404",
-            value = "The HTTP status code generated by the origin server for this occurrence of the problem.")
+            description = "The HTTP status code generated by the origin server for this occurrence of the problem.")
         public Integer getStatus() {
             return status;
         }
 
-        @ApiModelProperty(
+        @Schema(
             example = "EI job type not found",
-            value = "A human-readable explanation specific to this occurrence of the problem.")
+            description = "A human-readable explanation specific to this occurrence of the problem.")
         public String getDetail() {
             return this.detail;
         }
     }
 
-    @ApiModelProperty(value = "message")
+    @Schema(name = "message")
     public final String message;
 
     ErrorResponse(String message) {
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java
index 42ab7cb..e823a93 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java
@@ -23,12 +23,12 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 import org.immutables.gson.Gson;
 import org.oransc.enrichment.repository.EiJobs;
@@ -43,9 +43,12 @@
 import reactor.core.publisher.Mono;
 
 @RestController("StatusController")
-@Api(tags = "Service status")
+@Tag(name = StatusController.API_NAME)
 public class StatusController {
 
+    public static final String API_NAME = "EI Service status";
+    public static final String API_DESCRIPTION = "API for monitoring of the service";
+
     @Autowired
     private EiJobs eiJobs;
 
@@ -56,24 +59,24 @@
     private EiProducers eiProducers;
 
     @Gson.TypeAdapters
-    @ApiModel(value = "status_info")
+    @Schema(name = "status_info")
     public static class StatusInfo {
-        @ApiModelProperty(value = "status text")
+        @Schema(name = "status", description = "status text")
         @SerializedName("status")
         @JsonProperty(value = "status", required = true)
         public final String status;
 
-        @ApiModelProperty(value = "Number of EI producers")
+        @Schema(name = "no_of_producers", description = "Number of EI producers")
         @SerializedName("no_of_producers")
         @JsonProperty(value = "no_of_producers", required = true)
         public final int noOfProducers;
 
-        @ApiModelProperty(value = "Number of EI types")
+        @Schema(name = "no_of_types", description = "Number of EI types")
         @SerializedName("no_of_types")
         @JsonProperty(value = "no_of_types", required = true)
         public final int noOfTypes;
 
-        @ApiModelProperty(value = "Number of EI jobs")
+        @Schema(name = "no_of_jobs", description = "Number of EI jobs")
         @SerializedName("no_of_jobs")
         @JsonProperty(value = "no_of_jobs", required = true)
         public final int noOfJobs;
@@ -87,10 +90,13 @@
     }
 
     @GetMapping(path = "/status", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Returns status and statistics of this service")
+    @Operation(summary = "Returns status and statistics of this service")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "Service is living", response = StatusInfo.class) //
+            @ApiResponse(
+                responseCode = "200",
+                description = "Service is living", //
+                content = @Content(schema = @Schema(implementation = StatusInfo.class))) //
         })
     public Mono<ResponseEntity<Object>> getStatus() {
         StatusInfo info = new StatusInfo("hunky dory", this.eiProducers, this.eiTypes, this.eiJobs);
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java
index b28da8d..b7c2673 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java
@@ -20,12 +20,12 @@
 
 package org.oransc.enrichment.controllers;
 
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "Void", description = "Void/empty")
+@Schema(name = "Void", description = "Void/empty ")
 public class VoidResponse {
     private VoidResponse() {
     }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java
index 8603142..48aad13 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java
@@ -22,8 +22,13 @@
 
 public class ConsumerConsts {
 
+    public static final String CONSUMER_API_NAME = "A1-EI (registration)";
+    public static final String CONSUMER_API_DESCRIPTION = "Data consumer EI job registration";
+
+    public static final String CONSUMER_API_CALLBACKS_NAME = "A1-EI (callbacks)";
+    public static final String CONSUMER_API_CALLBACKS_DESCRIPTION = "Data consumer EI job status callbacks";
+
     public static final String API_ROOT = "/A1-EI/v1";
-    public static final String CONSUMER_API_NAME = "A1-EI (enrichment information)";
     public static final String OWNER_PARAM = "owner";
     public static final String OWNER_PARAM_DESCRIPTION = "selects EI jobs for one EI job owner";
 
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java
index 8267b6a..ec83f65 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java
@@ -24,18 +24,19 @@
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.everit.json.schema.Schema;
-import org.everit.json.schema.loader.SchemaLoader;
 import org.json.JSONObject;
 import org.oransc.enrichment.configuration.ApplicationConfig;
 import org.oransc.enrichment.controllers.ErrorResponse;
@@ -64,8 +65,8 @@
 import reactor.core.publisher.Mono;
 
 @SuppressWarnings("java:S3457") // No need to call "toString()" method as formatting and string ..
-@RestController("ConsumerController")
-@Api(tags = {ConsumerConsts.CONSUMER_API_NAME})
+@RestController("A1-EI")
+@Tag(name = ConsumerConsts.CONSUMER_API_NAME)
 @RequestMapping(path = ConsumerConsts.API_ROOT, produces = MediaType.APPLICATION_JSON_VALUE)
 public class ConsumerController {
 
@@ -89,14 +90,13 @@
     private static Gson gson = new GsonBuilder().create();
 
     @GetMapping(path = "/eitypes", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI type identifiers", notes = "")
+    @Operation(summary = "EI type identifiers", description = "")
     @ApiResponses(
         value = { //
             @ApiResponse(
-                code = 200,
-                message = "EI type identifiers",
-                response = String.class,
-                responseContainer = "List"), //
+                responseCode = "200",
+                description = "EI type identifiers", //
+                content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))), //
         })
     public ResponseEntity<Object> getEiTypeIdentifiers( //
     ) {
@@ -109,14 +109,18 @@
     }
 
     @GetMapping(path = "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI type", notes = "")
+    @Operation(summary = "Individual EI type", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "EI type", response = ConsumerEiTypeInfo.class), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information type is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI type", //
+                content = @Content(schema = @Schema(implementation = ConsumerEiTypeInfo.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information type is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> getEiType( //
         @PathVariable("eiTypeId") String eiTypeId) {
         try {
@@ -129,28 +133,28 @@
     }
 
     @GetMapping(path = "/eijobs", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI job identifiers", notes = "query for EI job identifiers")
+    @Operation(summary = "EI job identifiers", description = "query for EI job identifiers")
     @ApiResponses(
         value = { //
             @ApiResponse(
-                code = 200,
-                message = "EI job identifiers",
-                response = String.class,
-                responseContainer = "List"), //
+                responseCode = "200",
+                description = "EI job identifiers", //
+                content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))),
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information type is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "404",
+                description = "Enrichment Information type is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> getEiJobIds( //
-        @ApiParam(
+        @Parameter(
             name = ConsumerConsts.EI_TYPE_ID_PARAM,
             required = false, //
-            value = ConsumerConsts.EI_TYPE_ID_PARAM_DESCRIPTION) //
+            description = ConsumerConsts.EI_TYPE_ID_PARAM_DESCRIPTION) //
         @RequestParam(name = ConsumerConsts.EI_TYPE_ID_PARAM, required = false) String eiTypeId,
-        @ApiParam(
+        @Parameter(
             name = ConsumerConsts.OWNER_PARAM,
             required = false, //
-            value = ConsumerConsts.OWNER_PARAM_DESCRIPTION) //
+            description = ConsumerConsts.OWNER_PARAM_DESCRIPTION) //
         @RequestParam(name = ConsumerConsts.OWNER_PARAM, required = false) String owner) {
         try {
             List<String> result = new ArrayList<>();
@@ -173,15 +177,19 @@
         }
     }
 
-    @GetMapping(path = "/eijobs/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI job", notes = "")
+    @GetMapping(path = "/eijobs/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE) //
+    @Operation(summary = "Individual EI job", description = "") //
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "EI job", response = ConsumerEiJobInfo.class), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information job is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI job", //
+                content = @Content(schema = @Schema(implementation = ConsumerEiJobInfo.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information job is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> getIndividualEiJob( //
         @PathVariable("eiJobId") String eiJobId) {
         try {
@@ -193,14 +201,18 @@
     }
 
     @GetMapping(path = "/eijobs/{eiJobId}/status", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI job status", notes = "")
+    @Operation(summary = "EI job status", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "EI job status", response = ConsumerEiJobStatus.class), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information job is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI job status", //
+                content = @Content(schema = @Schema(implementation = ConsumerEiJobStatus.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information job is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> getEiJobStatus( //
         @PathVariable("eiJobId") String eiJobId) {
         try {
@@ -219,15 +231,22 @@
     }
 
     @DeleteMapping(path = "/eijobs/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI job", notes = "")
+    @Operation(summary = "Individual EI job", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "Not used", response = VoidResponse.class),
-            @ApiResponse(code = 204, message = "Job deleted", response = VoidResponse.class),
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information job is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "Not used", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))),
+            @ApiResponse(
+                responseCode = "204",
+                description = "Job deleted", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information job is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> deleteIndividualEiJob( //
         @PathVariable("eiJobId") String eiJobId) {
         try {
@@ -243,15 +262,22 @@
         path = "/eijobs/{eiJobId}", //
         produces = MediaType.APPLICATION_JSON_VALUE, //
         consumes = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI job", notes = "")
+    @Operation(summary = "Individual EI job", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 201, message = "Job created", response = VoidResponse.class), //
-            @ApiResponse(code = 200, message = "Job updated", response = VoidResponse.class), // ,
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information type is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "201",
+                description = "Job created", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "200",
+                description = "Job updated", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information type is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public Mono<ResponseEntity<Object>> putIndividualEiJob( //
         @PathVariable("eiJobId") String eiJobId, //
         @RequestBody ConsumerEiJobInfo eiJobObject) {
@@ -275,7 +301,7 @@
     private Mono<EiJob> validatePutEiJob(String eiJobId, ConsumerEiJobInfo eiJobInfo) {
         try {
             EiType eiType = this.eiTypes.getType(eiJobInfo.eiTypeId);
-            validateJsonObjectAgainstSchema(eiType.getJobDataSchema(), eiJobInfo.jobData);
+            validateJsonObjectAgainstSchema(eiType.getJobDataSchema(), eiJobInfo.jobDefinition);
             EiJob existingEiJob = this.eiJobs.get(eiJobId);
 
             if (existingEiJob != null && !existingEiJob.getTypeId().equals(eiJobInfo.eiTypeId)) {
@@ -294,7 +320,7 @@
 
                 String schemaAsString = mapper.writeValueAsString(schemaObj);
                 JSONObject schemaJSON = new JSONObject(schemaAsString);
-                Schema schema = SchemaLoader.load(schemaJSON);
+                org.everit.json.schema.Schema schema = org.everit.json.schema.loader.SchemaLoader.load(schemaJSON);
 
                 String objectAsString = mapper.writeValueAsString(object);
                 JSONObject json = new JSONObject(objectAsString);
@@ -310,8 +336,8 @@
             .id(id) //
             .typeId(type.getId()) //
             .owner(info.owner) //
-            .jobData(info.jobData) //
-            .targetUrl(info.targetUri) //
+            .jobData(info.jobDefinition) //
+            .targetUrl(info.jobResultUri) //
             .jobStatusUrl(info.statusNotificationUri == null ? "" : info.statusNotificationUri) //
             .build();
     }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java
index d88091f..0b750f5 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java
@@ -23,36 +23,35 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "EiJobObject", description = "Information for an Enrichment Information Job")
+@Schema(name = "EiJobObject", description = "Information for an Enrichment Information Job")
 public class ConsumerEiJobInfo {
 
-    @ApiModelProperty(value = "EI type Idenitifier of the EI job", required = true)
+    @Schema(name = "eiTypeId", description = "EI type Idenitifier of the EI job", required = true)
     @SerializedName("eiTypeId")
     @JsonProperty(value = "eiTypeId", required = true)
     public String eiTypeId;
 
-    @ApiModelProperty(value = "Identity of the owner of the job", required = true)
+    @Schema(name = "jobOwner", description = "Identity of the owner of the job", required = true)
     @SerializedName("jobOwner")
     @JsonProperty(value = "jobOwner", required = true)
     public String owner;
 
-    @ApiModelProperty(value = "EI type specific job data", required = true)
+    @Schema(name = "jobDefinition", description = "EI type specific job data", required = true)
     @SerializedName("jobDefinition")
     @JsonProperty(value = "jobDefinition", required = true)
-    public Object jobData;
+    public Object jobDefinition;
 
-    @ApiModelProperty(value = "The target URI of the EI data", required = true)
+    @Schema(name = "jobResultUri", description = "The target URI of the EI data", required = true)
     @SerializedName("jobResultUri")
     @JsonProperty(value = "jobResultUri", required = true)
-    public String targetUri;
+    public String jobResultUri;
 
-    @ApiModelProperty(value = "The target of EI job status notifications", required = false)
+    @Schema(name = "statusNotificationUri", description = "The target of EI job status notifications", required = false)
     @SerializedName("jobStatusNotificationUri")
     @JsonProperty(value = "jobStatusNotificationUri", required = false)
     public String statusNotificationUri;
@@ -63,9 +62,9 @@
     public ConsumerEiJobInfo(String eiTypeId, Object jobData, String owner, String targetUri,
         String statusNotificationUri) {
         this.eiTypeId = eiTypeId;
-        this.jobData = jobData;
+        this.jobDefinition = jobData;
         this.owner = owner;
-        this.targetUri = targetUri;
+        this.jobResultUri = targetUri;
         this.statusNotificationUri = statusNotificationUri;
     }
 }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java
index 60752ec..87a69bb 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java
@@ -23,17 +23,16 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "EiJobStatusObject", description = "Status for an EI job")
+@Schema(name = "EiJobStatusObject", description = "Status for an EI job")
 public class ConsumerEiJobStatus {
 
     @Gson.TypeAdapters
-    @ApiModel(value = "EiJobStatusValues", description = "Allowed values for EI job status")
+    @Schema(name = "EiJobStatusValues", description = "Allowed values for EI job status")
     public enum EiJobStatusValues {
         ENABLED, DISABLED
     }
@@ -42,7 +41,7 @@
         + "ENABLED: the A1-EI producer is able to deliver EI result for the EI job\n" //
         + "DISABLED: the A1-EI producer is unable to deliver EI result for the EI job";
 
-    @ApiModelProperty(value = OPERATIONAL_STATE_DESCRIPTION, name = "eiJobStatus", required = true)
+    @Schema(name = "eiJobStatus", description = OPERATIONAL_STATE_DESCRIPTION, required = true)
     @SerializedName("eiJobStatus")
     @JsonProperty(value = "eiJobStatus", required = true)
     public EiJobStatusValues state;
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java
index b5d664b..c63d6f7 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java
@@ -20,12 +20,12 @@
 
 package org.oransc.enrichment.controllers.consumer;
 
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "EiTypeObject", description = "Information for an EI type")
+@Schema(name = "EiTypeObject", description = "Information for an EI type")
 public class ConsumerEiTypeInfo {
 
 }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java
index 7c46117..3d37267 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java
@@ -23,7 +23,11 @@
 public class ProducerConsts {
 
     public static final String API_ROOT = "/ei-producer/v1";
-    public static final String PRODUCER_API_NAME = "Data Producer Registry API";
+    public static final String PRODUCER_API_NAME = "Data producer (registration)";
+    public static final String PRODUCER_API_DESCRIPTION = "API for data producers";
+
+    public static final String PRODUCER_API_CALLBACKS_NAME = "Data producer (callbacks)";
+    public static final String PRODUCER_API_CALLBACKS_DESCRIPTION = "API implemented by data producers";
 
     private ProducerConsts() {
     }
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java
index 7e905da..fb2253d 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java
@@ -23,11 +23,14 @@
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -56,8 +59,8 @@
 import org.springframework.web.bind.annotation.RestController;
 
 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
-@RestController("ProducerController")
-@Api(tags = {ProducerConsts.PRODUCER_API_NAME})
+@RestController("Producer registry")
+@Tag(name = ProducerConsts.PRODUCER_API_NAME)
 public class ProducerController {
 
     private static Gson gson = new GsonBuilder().create();
@@ -71,15 +74,14 @@
     @Autowired
     private EiProducers eiProducers;
 
-    @GetMapping(path = ProducerConsts.API_ROOT + "/eitypes", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI type identifiers", notes = "")
+    @GetMapping(path = ProducerConsts.API_ROOT + "/eitypes", produces = MediaType.APPLICATION_JSON_VALUE) //
+    @Operation(summary = "EI type identifiers", description = "") //
     @ApiResponses(
         value = { //
             @ApiResponse(
-                code = 200,
-                message = "EI type identifiers",
-                response = String.class,
-                responseContainer = "List"), //
+                responseCode = "200",
+                description = "EI type identifiers", //
+                content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))) //
         })
     public ResponseEntity<Object> getEiTypeIdentifiers( //
     ) {
@@ -92,14 +94,17 @@
     }
 
     @GetMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI type", notes = "")
+    @Operation(summary = "Individual EI type", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "EI type", response = ProducerEiTypeInfo.class), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information type is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI type", //
+                content = @Content(schema = @Schema(implementation = ProducerEiTypeInfo.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information type is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class)))})
     public ResponseEntity<Object> getEiType( //
         @PathVariable("eiTypeId") String eiTypeId) {
         try {
@@ -114,13 +119,22 @@
     @PutMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE)
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "Type updated", response = VoidResponse.class), //
-            @ApiResponse(code = 201, message = "Type created", response = VoidResponse.class), //
-            @ApiResponse(code = 400, message = "Bad request", response = ErrorResponse.ErrorInfo.class)})
-
-    @ApiOperation(value = "Individual EI type", notes = "")
+            @ApiResponse(
+                responseCode = "200",
+                description = "Type updated", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "201",
+                description = "Type created", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "400",
+                description = "Bad request", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class)))})
+    @Operation(summary = "Individual EI type", description = "")
     public ResponseEntity<Object> putEiType( //
-        @PathVariable("eiTypeId") String eiTypeId, @RequestBody ProducerEiTypeInfo registrationInfo) {
+        @PathVariable("eiTypeId") String eiTypeId, //
+        @RequestBody ProducerEiTypeInfo registrationInfo) {
 
         EiType previousDefinition = this.eiTypes.get(eiTypeId);
         if (registrationInfo.jobDataSchema == null) {
@@ -130,20 +144,27 @@
         return new ResponseEntity<>(previousDefinition == null ? HttpStatus.CREATED : HttpStatus.OK);
     }
 
-    @DeleteMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI type", notes = "")
+    @DeleteMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE) //
+    @Operation(summary = "Individual EI type", description = "") //
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "Not used", response = VoidResponse.class),
-            @ApiResponse(code = 204, message = "Producer deleted", response = VoidResponse.class),
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information type is not found",
-                response = ErrorResponse.ErrorInfo.class),
+                responseCode = "200",
+                description = "Not used", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
             @ApiResponse(
-                code = 406,
-                message = "The Enrichment Information type has one or several active producers",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "204",
+                description = "Producer deleted", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information type is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))), //
+            @ApiResponse(
+                responseCode = "406",
+                description = "The Enrichment Information type has one or several active producers", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> deleteEiType( //
         @PathVariable("eiTypeId") String eiTypeId) {
 
@@ -160,20 +181,19 @@
     }
 
     @GetMapping(path = ProducerConsts.API_ROOT + "/eiproducers", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI producer identifiers", notes = "")
+    @Operation(summary = "EI producer identifiers", description = "")
     @ApiResponses(
         value = { //
             @ApiResponse(
-                code = 200,
-                message = "EI producer identifiers",
-                response = String.class,
-                responseContainer = "List"), //
+                responseCode = "200",
+                description = "EI producer identifiers", //
+                content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))) //
         })
     public ResponseEntity<Object> getEiProducerIdentifiers( //
-        @ApiParam(
+        @Parameter(
             name = "ei_type_id",
             required = false,
-            value = "If given, only the producers for the EI Data type is returned.") //
+            description = "If given, only the producers for the EI Data type is returned.") //
         @RequestParam(name = "ei_type_id", required = false) String typeId //
     ) {
         List<String> result = new ArrayList<>();
@@ -188,14 +208,18 @@
     @GetMapping(
         path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}",
         produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI producer", notes = "")
+    @Operation(summary = "Individual EI producer", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "EI producer", response = ProducerRegistrationInfo.class), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information producer is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI producer", //
+                content = @Content(schema = @Schema(implementation = ProducerRegistrationInfo.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information producer is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class)))//
+        })
     public ResponseEntity<Object> getEiProducer( //
         @PathVariable("eiProducerId") String eiProducerId) {
         try {
@@ -210,18 +234,18 @@
     @GetMapping(
         path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}/eijobs",
         produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI job definitions", notes = "EI job definitions for one EI producer")
+    @Operation(summary = "EI job definitions", description = "EI job definitions for one EI producer")
     @ApiResponses(
         value = { //
             @ApiResponse(
-                code = 200,
-                message = "EI producer",
-                response = ProducerJobInfo.class,
-                responseContainer = "List"), //
+                responseCode = "404",
+                description = "Enrichment Information producer is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information producer is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI producer", //
+                content = @Content(array = @ArraySchema(schema = @Schema(implementation = ProducerJobInfo.class)))), //
+        })
     public ResponseEntity<Object> getEiProducerJobs( //
         @PathVariable("eiProducerId") String eiProducerId) {
         try {
@@ -242,15 +266,19 @@
 
     @GetMapping(
         path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}/status",
-        produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "EI producer status")
+        produces = MediaType.APPLICATION_JSON_VALUE) //
+    @Operation(summary = "EI producer status") //
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "EI producer status", response = ProducerStatusInfo.class), //
             @ApiResponse(
-                code = 404,
-                message = "Enrichment Information producer is not found",
-                response = ErrorResponse.ErrorInfo.class)})
+                responseCode = "200",
+                description = "EI producer status", //
+                content = @Content(schema = @Schema(implementation = ProducerStatusInfo.class))), //
+            @ApiResponse(
+                responseCode = "404",
+                description = "Enrichment Information producer is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> getEiProducerStatus( //
         @PathVariable("eiProducerId") String eiProducerId) {
         try {
@@ -271,12 +299,18 @@
     @PutMapping(
         path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}", //
         produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI producer", notes = "")
+    @Operation(summary = "Individual EI producer", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 201, message = "Producer created", response = VoidResponse.class), //
-            @ApiResponse(code = 200, message = "Producer updated", response = VoidResponse.class)} //
-    )
+            @ApiResponse(
+                responseCode = "201",
+                description = "Producer created", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))), //
+            @ApiResponse(
+                responseCode = "200",
+                description = "Producer updated", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))) //
+        })
     public ResponseEntity<Object> putEiProducer( //
         @PathVariable("eiProducerId") String eiProducerId, //
         @RequestBody ProducerRegistrationInfo registrationInfo) {
@@ -292,12 +326,22 @@
     @DeleteMapping(
         path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}",
         produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Individual EI producer", notes = "")
+    @Operation(summary = "Individual EI producer", description = "")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "Not used", response = VoidResponse.class),
-            @ApiResponse(code = 204, message = "Producer deleted", response = VoidResponse.class),
-            @ApiResponse(code = 404, message = "Producer is not found", response = ErrorResponse.ErrorInfo.class)})
+            @ApiResponse(
+                responseCode = "200",
+                description = "Not used", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))),
+            @ApiResponse(
+                responseCode = "204",
+                description = "Producer deleted", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))),
+            @ApiResponse(
+                responseCode = "404",
+                description = "Producer is not found", //
+                content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) //
+        })
     public ResponseEntity<Object> deleteEiProducer(@PathVariable("eiProducerId") String eiProducerId) {
         try {
             final EiProducer producer = this.eiProducers.getProducer(eiProducerId);
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java
index d2b89ef..e587ce3 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java
@@ -23,16 +23,15 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "producer_ei_type_info", description = "Information for an EI type")
+@Schema(name = "producer_ei_type_info", description = "Information for an EI type")
 public class ProducerEiTypeInfo {
 
-    @ApiModelProperty(value = "Json schema for the job data", required = true)
+    @Schema(name = "ei_job_data_schema", description = "Json schema for the job data", required = true)
     @SerializedName("ei_job_data_schema")
     @JsonProperty(value = "ei_job_data_schema", required = true)
     public Object jobDataSchema;
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java
index bc3dba2..d7dd717 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java
@@ -23,44 +23,43 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 import org.oransc.enrichment.repository.EiJob;
 
 @Gson.TypeAdapters
-@ApiModel(
-    value = "producer_ei_job_request",
+@Schema(
+    name = "producer_ei_job_request",
     description = "The body of the EI producer callbacks for EI job creation and deletion")
 public class ProducerJobInfo {
 
-    @ApiModelProperty(value = "Idenitity of the EI job", required = true)
+    @Schema(name = "ei_job_identity", description = "Idenitity of the EI job", required = true)
     @SerializedName("ei_job_identity")
     @JsonProperty("ei_job_identity")
     public String id;
 
-    @ApiModelProperty(value = "Type idenitity for the job")
+    @Schema(name = "ei_type_identity", description = "Type idenitity for the job")
     @SerializedName("ei_type_identity")
     @JsonProperty("ei_type_identity")
     public String typeId;
 
-    @ApiModelProperty(value = "Json for the job data")
+    @Schema(name = "ei_job_data", description = "Json for the job data")
     @SerializedName("ei_job_data")
     @JsonProperty("ei_job_data")
     public Object jobData;
 
-    @ApiModelProperty(value = "URI for the target of the EI")
+    @Schema(name = "target_uri", description = "URI for the target of the EI")
     @SerializedName("target_uri")
     @JsonProperty("target_uri")
     public String targetUri;
 
-    @ApiModelProperty(value = "The owner of the job")
+    @Schema(name = "owner", description = "The owner of the job")
     @SerializedName("owner")
     @JsonProperty("owner")
     public String owner;
 
-    @ApiModelProperty(value = "The time when the job was last updated or created (ISO-8601)")
+    @Schema(name = "last_updated", description = "The time when the job was last updated or created (ISO-8601)")
     @SerializedName("last_updated")
     @JsonProperty("last_updated")
     public String lastUpdated;
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java
index 94ae4a6..b270c85 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java
@@ -23,51 +23,30 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import java.util.Collection;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "producer_registration_info", description = "Information for an EI producer")
+@Schema(name = "producer_registration_info", description = "Information for an EI producer")
 public class ProducerRegistrationInfo {
 
-    @Gson.TypeAdapters
-    @ApiModel(value = "producer_ei_type_registration_info", description = "Information for an EI type")
-    public static class ProducerEiTypeRegistrationInfo {
-
-        @ApiModelProperty(value = "EI type identity", required = true)
-        @SerializedName("ei_type_identity")
-        @JsonProperty(value = "ei_type_identity", required = true)
-        public String eiTypeId;
-
-        @ApiModelProperty(value = "Json schema for the job data")
-        @SerializedName("ei_job_data_schema")
-        @JsonProperty("ei_job_data_schema")
-        public Object jobDataSchema;
-
-        public ProducerEiTypeRegistrationInfo(Object jobDataSchema, String eiTypeId) {
-            this.jobDataSchema = jobDataSchema;
-            this.eiTypeId = eiTypeId;
-        }
-
-        public ProducerEiTypeRegistrationInfo() {
-        }
-    }
-
-    @ApiModelProperty(value = "Supported EI type IDs", required = true)
+    @Schema(name = "supported_ei_types", description = "Supported EI type IDs", required = true)
     @SerializedName("supported_ei_types")
     @JsonProperty(value = "supported_ei_types", required = true)
     public Collection<String> supportedTypeIds;
 
-    @ApiModelProperty(value = "callback for EI job", required = true)
+    @Schema(name = "ei_job_callback_url", description = "callback for EI job", required = true)
     @SerializedName("ei_job_callback_url")
     @JsonProperty(value = "ei_job_callback_url", required = true)
     public String jobCallbackUrl;
 
-    @ApiModelProperty(value = "callback for producer supervision", required = true)
+    @Schema(
+        name = "ei_producer_supervision_callback_url",
+        description = "callback for producer supervision",
+        required = true)
     @SerializedName("ei_producer_supervision_callback_url")
     @JsonProperty(value = "ei_producer_supervision_callback_url", required = true)
     public String producerSupervisionCallbackUrl;
diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java
index 8f2e0d0..fc19bca 100644
--- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java
+++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java
@@ -23,17 +23,16 @@
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.gson.annotations.SerializedName;
 
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 
 import org.immutables.gson.Gson;
 
 @Gson.TypeAdapters
-@ApiModel(value = "producer_status", description = "Status for an EI Producer")
+@Schema(name = "producer_status", description = "Status for an EI Producer")
 public class ProducerStatusInfo {
 
     @Gson.TypeAdapters
-    @ApiModel(value = "producer_operational_state", description = "Represents the operational states")
+    @Schema(name = "producer_operational_state", description = "Represents the operational states")
     public enum OperationalState {
         ENABLED, DISABLED
     }
@@ -42,7 +41,7 @@
         + "ENABLED: TBD\n" //
         + "DISABLED: TBD.";
 
-    @ApiModelProperty(value = OPERATIONAL_STATE_DESCRIPTION, name = "operational_state", required = true)
+    @Schema(name = "operational_state", description = OPERATIONAL_STATE_DESCRIPTION, required = true)
     @SerializedName("operational_state")
     @JsonProperty(value = "operational_state", required = true)
     public final OperationalState opState;
diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java
index a863c10..29e9aad 100644
--- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java
+++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java
@@ -59,7 +59,6 @@
 import org.oransc.enrichment.controllers.producer.ProducerEiTypeInfo;
 import org.oransc.enrichment.controllers.producer.ProducerJobInfo;
 import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo;
-import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo.ProducerEiTypeRegistrationInfo;
 import org.oransc.enrichment.controllers.producer.ProducerStatusInfo;
 import org.oransc.enrichment.exceptions.ServiceException;
 import org.oransc.enrichment.repository.EiJob;
@@ -163,15 +162,14 @@
     }
 
     @Test
-    void createApiDoc() throws FileNotFoundException {
-        String url = "/v2/api-docs";
+    void generateApiDoc() throws FileNotFoundException {
+        String url = "/v3/api-docs";
         ResponseEntity<String> resp = restClient().getForEntity(url).block();
         assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
 
         JSONObject jsonObj = new JSONObject(resp.getBody());
-        jsonObj.remove("host");
-        assertThat(jsonObj.getJSONObject("definitions").remove("Mono«ResponseEntity«object»»")).isNotNull();
-        assertThat(jsonObj.getJSONObject("definitions").remove("Void")).isNotNull();
+        assertThat(jsonObj.remove("servers")).isNotNull();
+
         String indented = jsonObj.toString(4);
         try (PrintStream out = new PrintStream(new FileOutputStream("api/ecs-api.json"))) {
             out.print(indented);
@@ -731,9 +729,9 @@
         assertThat(statusInfo.opState).isEqualTo(expectedOperationalState);
     }
 
-    ProducerEiTypeRegistrationInfo producerEiTypeRegistrationInfo(String typeId)
+    ProducerEiTypeInfo producerEiTypeRegistrationInfo(String typeId)
         throws JsonMappingException, JsonProcessingException {
-        return new ProducerEiTypeRegistrationInfo(jsonSchemaObject(), typeId);
+        return new ProducerEiTypeInfo(jsonSchemaObject());
     }
 
     ProducerRegistrationInfo producerEiRegistratioInfoRejecting(String typeId)
@@ -801,6 +799,7 @@
         throws JsonMappingException, JsonProcessingException, ServiceException {
         String url = ProducerConsts.API_ROOT + "/eitypes/" + eiTypeId;
         String body = gson.toJson(producerEiTypeRegistrationInfo(eiTypeId));
+
         ResponseEntity<String> resp = restClient().putForEntity(url, body).block();
         this.eiTypes.getType(eiTypeId);
         return resp.getStatusCode();
diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java
index e8bb659..660277f 100644
--- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java
+++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java
@@ -20,10 +20,12 @@
 
 package org.oransc.enrichment.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
@@ -33,6 +35,7 @@
 import lombok.Getter;
 
 import org.oransc.enrichment.controllers.VoidResponse;
+import org.oransc.enrichment.controllers.consumer.ConsumerConsts;
 import org.oransc.enrichment.controllers.consumer.ConsumerEiJobStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,7 +48,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController("ConsumerSimulatorController")
-@Api(tags = {"A1-EI (enrichment information) callbacks"})
+@Tag(name = ConsumerConsts.CONSUMER_API_CALLBACKS_NAME)
 public class ConsumerSimulatorController {
 
     private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -63,15 +66,20 @@
     private TestResults testResults = new TestResults();
 
     public static String getJobStatusUrl(String eiJobId) {
-        return "/consumer_simulator/eijobs/" + eiJobId + "/status";
+        return "/example_dataconsumer/eijobs/" + eiJobId + "/status";
     }
 
-    @PostMapping(path = "/consumer_simulator/eijobs/{eiJobId}/status", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Callback for EI job status", notes = "")
+    @PostMapping(path = "/example_dataconsumer/eijobs/{eiJobId}/status", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Operation(
+        summary = "Callback for changed EI job status",
+        description = "The primitive is implemented by the data consumer and is invoked when a EI job status has been changed.")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)} //
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "OK", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))) //
+        })
     public ResponseEntity<Object> jobStatusCallback( //
         @PathVariable("eiJobId") String eiJobId, //
         @RequestBody ConsumerEiJobStatus status) {
diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java
index 726cef7..8f99e50 100644
--- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java
+++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java
@@ -20,10 +20,12 @@
 
 package org.oransc.enrichment.controller;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
@@ -34,6 +36,7 @@
 
 import org.oransc.enrichment.controllers.ErrorResponse;
 import org.oransc.enrichment.controllers.VoidResponse;
+import org.oransc.enrichment.controllers.producer.ProducerConsts;
 import org.oransc.enrichment.controllers.producer.ProducerJobInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,7 +51,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController("ProducerSimulatorController")
-@Api(tags = {"Data Producer Job Control (example producer)"})
+@Tag(name = ProducerConsts.PRODUCER_API_CALLBACKS_NAME)
 public class ProducerSimulatorController {
 
     private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -83,11 +86,16 @@
     private TestResults testResults = new TestResults();
 
     @PostMapping(path = JOB_URL, produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Callback for EI job creation", notes = "")
+    @Operation(
+        summary = "Callback for EI job creation/modification",
+        description = "The call is invoked to activate or to modify a data subscription. The endpoint is provided by the EI producer.")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}//
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "OK", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))) //
+        })
     public ResponseEntity<Object> jobCreatedCallback( //
         @RequestBody ProducerJobInfo request) {
         try {
@@ -104,11 +112,16 @@
     }
 
     @DeleteMapping(path = "/producer_simulator/ei_job/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Callback for EI job deletion", notes = "")
+    @Operation(
+        summary = "Callback for EI job deletion",
+        description = "The call is invoked to terminate a data subscription. The endpoint is provided by the EI producer.")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}//
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "OK", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))) //
+        })
     public ResponseEntity<Object> jobDeletedCallback( //
         @PathVariable("eiJobId") String eiJobId) {
         try {
@@ -121,11 +134,14 @@
     }
 
     @PostMapping(path = JOB_ERROR_URL, produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Callback for EI job creation, returns error", notes = "", hidden = true)
+    @Operation(summary = "Callback for EI job creation, returns error", description = "", hidden = true)
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}//
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "OK", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))) //
+        })
     public ResponseEntity<Object> jobCreatedCallbackReturnError( //
         @RequestBody ProducerJobInfo request) {
         logger.info("Job created (returning error) callback {}", request.id);
@@ -134,35 +150,46 @@
     }
 
     @DeleteMapping(path = JOB_ERROR_URL + "/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Callback for EI job deletion, returns error", notes = "", hidden = true)
+    @Operation(summary = "Callback for EI job deletion, returns error", description = "", hidden = true)
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}//
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "OK", //
+                content = @Content(schema = @Schema(implementation = VoidResponse.class))) //
+        })
     public ResponseEntity<Object> jobDeletedCallbackReturnError( //
-        @RequestBody ProducerJobInfo request) {
-        logger.info("Job created (returning error) callback {}", request.id);
+        @PathVariable("eiJobId") String eiJobId) {
+        logger.info("Job created (returning error) callback {}", eiJobId);
         this.testResults.noOfRejectedDelete += 1;
         return ErrorResponse.create("Producer returns error on delete job", HttpStatus.NOT_FOUND);
     }
 
     @GetMapping(path = SUPERVISION_URL, produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Producer supervision", notes = "")
+    @Operation(
+        summary = "Producer supervision",
+        description = "The endpoint is provided by the EI producer and is used for supervision of the producer.")
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = String.class)}//
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "The producer is OK", //
+                content = @Content(schema = @Schema(implementation = String.class))) //
+        })
     public ResponseEntity<Object> producerSupervision() {
         logger.info("Producer supervision");
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
     @GetMapping(path = SUPERVISION_ERROR_URL, produces = MediaType.APPLICATION_JSON_VALUE)
-    @ApiOperation(value = "Producer supervision error", notes = "", hidden = true)
+    @Operation(summary = "Producer supervision error", description = "", hidden = true)
     @ApiResponses(
         value = { //
-            @ApiResponse(code = 200, message = "OK", response = String.class)}//
-    )
+            @ApiResponse(
+                responseCode = "200",
+                description = "OK", //
+                content = @Content(schema = @Schema(implementation = String.class))) //
+        })
     public ResponseEntity<Object> producerSupervisionError() {
         logger.info("Producer supervision error");
         return new ResponseEntity<>(HttpStatus.NOT_FOUND);