diff --git a/Makefile b/Makefile
index 382557394f744424c57f3202b71dd57829da0cb1..c5de83686eb54dcec1eedbc2aaede390639a7aa8 100644
--- a/Makefile
+++ b/Makefile
@@ -51,3 +51,9 @@ self-certs:
 cross:
 	go build -o ${OUTPUT}
 	sha256sum ${OUTPUT} > ${OUTPUT}.sha256
+
+# Note 1: Make sure to install openapi-generator it is not installed automatically yet. https://github.com/OpenAPITools/openapi-generator#1---installation
+# Note 2: Some unwanted files get removed during the code generation. MAybe adjust the files to delete in the future, if necessary.
+etsi-rest-client:
+	openapi-generator generate -i api/openapiv2/ekms_etsi14.swagger.json -g go -o api/go/rest/etsi --package-name etsi14 -v --git-host code.fbi.h-da.de --git-repo-id ekms/api/go/rest/etsi --git-user-id danet
+	rm api/go/rest/etsi/git_push.sh api/go/rest/etsi/go.mod api/go/rest/etsi/go.sum
\ No newline at end of file
diff --git a/api/go/rest/etsi/.gitignore b/api/go/rest/etsi/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..daf913b1b347aae6de6f48d599bc89ef8c8693d6
--- /dev/null
+++ b/api/go/rest/etsi/.gitignore
@@ -0,0 +1,24 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
diff --git a/api/go/rest/etsi/.openapi-generator-ignore b/api/go/rest/etsi/.openapi-generator-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..7484ee590a3894506cf063799b885428f95a71be
--- /dev/null
+++ b/api/go/rest/etsi/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/api/go/rest/etsi/.openapi-generator/FILES b/api/go/rest/etsi/.openapi-generator/FILES
new file mode 100644
index 0000000000000000000000000000000000000000..cffd10cc1d8e2be6fddba7508bbd94686576d675
--- /dev/null
+++ b/api/go/rest/etsi/.openapi-generator/FILES
@@ -0,0 +1,45 @@
+.gitignore
+.travis.yml
+README.md
+api/openapi.yaml
+api_etsi14_service.go
+client.go
+configuration.go
+docs/DanetetsiStatus.md
+docs/ETSI14ServiceAPI.md
+docs/ETSI14ServiceGetKeyRequest.md
+docs/ETSI14ServiceGetKeyWithIDsRequest.md
+docs/EtsiError.md
+docs/EtsiExtensionMandatory.md
+docs/EtsiExtensionOptional.md
+docs/EtsiGetKeyResponse.md
+docs/EtsiGetKeyWithIDsResponse.md
+docs/EtsiGetStatusResponse.md
+docs/EtsiKey.md
+docs/EtsiKeyContainer.md
+docs/EtsiKeyID.md
+docs/EtsiKeyRequest.md
+docs/EtsiListOfDetails.md
+docs/GooglerpcStatus.md
+docs/ProtobufAny.md
+git_push.sh
+go.mod
+go.sum
+model_danetetsi_status.go
+model_etsi14_service_get_key_request.go
+model_etsi14_service_get_key_with_ids_request.go
+model_etsi_error.go
+model_etsi_extension_mandatory.go
+model_etsi_extension_optional.go
+model_etsi_get_key_response.go
+model_etsi_get_key_with_ids_response.go
+model_etsi_get_status_response.go
+model_etsi_key.go
+model_etsi_key_container.go
+model_etsi_key_id.go
+model_etsi_key_request.go
+model_etsi_list_of_details.go
+model_googlerpc_status.go
+model_protobuf_any.go
+response.go
+utils.go
diff --git a/api/go/rest/etsi/.openapi-generator/VERSION b/api/go/rest/etsi/.openapi-generator/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..73a86b1970a7911cbe31f05c7fc666d530a9f163
--- /dev/null
+++ b/api/go/rest/etsi/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.0.1
\ No newline at end of file
diff --git a/api/go/rest/etsi/.travis.yml b/api/go/rest/etsi/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f5cb2ce9a5aad73c57eed886e845d2e79c2899d1
--- /dev/null
+++ b/api/go/rest/etsi/.travis.yml
@@ -0,0 +1,8 @@
+language: go
+
+install:
+  - go get -d -v .
+
+script:
+  - go build -v ./
+
diff --git a/api/go/rest/etsi/README.md b/api/go/rest/etsi/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7300e913d3873a009fd0cb53d819f381c30f73e6
--- /dev/null
+++ b/api/go/rest/etsi/README.md
@@ -0,0 +1,129 @@
+# Go API client for etsi14
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+## Overview
+This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project.  By using the [OpenAPI-spec](https://www.openapis.org/) from a remote server, you can easily generate an API client.
+
+- API version: 0.1
+- Package version: 1.0.0
+- Build package: org.openapitools.codegen.languages.GoClientCodegen
+
+## Installation
+
+Install the following dependencies:
+
+```shell
+go get github.com/stretchr/testify/assert
+go get golang.org/x/net/context
+```
+
+Put the package under your project folder and add the following in import:
+
+```golang
+import etsi14 "code.fbi.h-da.de/danet/ekms/api/go/rest/etsi"
+```
+
+To use a proxy, set the environment variable `HTTP_PROXY`:
+
+```golang
+os.Setenv("HTTP_PROXY", "http://proxy_name:proxy_port")
+```
+
+## Configuration of Server URL
+
+Default configuration comes with `Servers` field that contains server objects as defined in the OpenAPI specification.
+
+### Select Server Configuration
+
+For using other server than the one defined on index 0 set context value `sw.ContextServerIndex` of type `int`.
+
+```golang
+ctx := context.WithValue(context.Background(), etsi14.ContextServerIndex, 1)
+```
+
+### Templated Server URL
+
+Templated server URL is formatted using default variables from configuration or from context value `sw.ContextServerVariables` of type `map[string]string`.
+
+```golang
+ctx := context.WithValue(context.Background(), etsi14.ContextServerVariables, map[string]string{
+	"basePath": "v2",
+})
+```
+
+Note, enum values are always validated and all unused variables are silently ignored.
+
+### URLs Configuration per Operation
+
+Each operation can use different server URL defined using `OperationServers` map in the `Configuration`.
+An operation is uniquely identified by `"{classname}Service.{nickname}"` string.
+Similar rules for overriding default operation server index and variables applies by using `sw.ContextOperationServerIndices` and `sw.ContextOperationServerVariables` context maps.
+
+```golang
+ctx := context.WithValue(context.Background(), etsi14.ContextOperationServerIndices, map[string]int{
+	"{classname}Service.{nickname}": 2,
+})
+ctx = context.WithValue(context.Background(), etsi14.ContextOperationServerVariables, map[string]map[string]string{
+	"{classname}Service.{nickname}": {
+		"port": "8443",
+	},
+})
+```
+
+## Documentation for API Endpoints
+
+All URIs are relative to *http://localhost*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*ETSI14ServiceAPI* | [**ETSI14ServiceGetKey**](docs/ETSI14ServiceAPI.md#etsi14servicegetkey) | **Post** /{KMEHostname}/api/v1/keys/{slaveSAEID}/enc_keys | Returns Key container data from the KME to the calling master SAE.  Key container data contains one or more keys. The calling master SAE may supply  Key request data to specify the requirement on Key container data. The slave SAE  specified by the slave_SAE_ID parameter may subsequently request matching keys  from a remote KME using key_ID identifiers from the returned Key container.
+*ETSI14ServiceAPI* | [**ETSI14ServiceGetKeyWithIDs**](docs/ETSI14ServiceAPI.md#etsi14servicegetkeywithids) | **Post** /{KMEHostname}/api/v1/keys/{masterSAEID}/dec_keys | Returns Key container from the KME to the calling slave SAE.  Key container contains keys matching those previously delivered to a remote master SAE based on the Key IDs supplied from the remote master SAE in response to its call to Get key. The KME shall reject the request with a 401 HTTP status code if the SAE ID of the requestor  was not an SAE ID supplied to the \"Get key\" method each time it was called resulting in the return of any of the Key IDs being requested.
+*ETSI14ServiceAPI* | [**ETSI14ServiceGetStatus**](docs/ETSI14ServiceAPI.md#etsi14servicegetstatus) | **Get** /{KMEHostname}/api/v1/keys/{slaveSAEID}/status | Returns Status from a KME to the calling SAE.  Status contains information on keys available to be requested  by a master SAE for a specified slave SAE.
+
+
+## Documentation For Models
+
+ - [DanetetsiStatus](docs/DanetetsiStatus.md)
+ - [ETSI14ServiceGetKeyRequest](docs/ETSI14ServiceGetKeyRequest.md)
+ - [ETSI14ServiceGetKeyWithIDsRequest](docs/ETSI14ServiceGetKeyWithIDsRequest.md)
+ - [EtsiError](docs/EtsiError.md)
+ - [EtsiExtensionMandatory](docs/EtsiExtensionMandatory.md)
+ - [EtsiExtensionOptional](docs/EtsiExtensionOptional.md)
+ - [EtsiGetKeyResponse](docs/EtsiGetKeyResponse.md)
+ - [EtsiGetKeyWithIDsResponse](docs/EtsiGetKeyWithIDsResponse.md)
+ - [EtsiGetStatusResponse](docs/EtsiGetStatusResponse.md)
+ - [EtsiKey](docs/EtsiKey.md)
+ - [EtsiKeyContainer](docs/EtsiKeyContainer.md)
+ - [EtsiKeyID](docs/EtsiKeyID.md)
+ - [EtsiKeyRequest](docs/EtsiKeyRequest.md)
+ - [EtsiListOfDetails](docs/EtsiListOfDetails.md)
+ - [GooglerpcStatus](docs/GooglerpcStatus.md)
+ - [ProtobufAny](docs/ProtobufAny.md)
+
+
+## Documentation For Authorization
+
+Endpoints do not require authorization.
+
+
+## Documentation for Utility Methods
+
+Due to the fact that model structure members are all pointers, this package contains
+a number of utility functions to easily obtain pointers to values of basic types.
+Each of these functions takes a value of the given basic type and returns a pointer to it:
+
+* `PtrBool`
+* `PtrInt`
+* `PtrInt32`
+* `PtrInt64`
+* `PtrFloat`
+* `PtrFloat32`
+* `PtrFloat64`
+* `PtrString`
+* `PtrTime`
+
+## Author
+
+
+
diff --git a/api/go/rest/etsi/api/openapi.yaml b/api/go/rest/etsi/api/openapi.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c5c7e1529f26a7dc4747d8f0a3e938186bcb7371
--- /dev/null
+++ b/api/go/rest/etsi/api/openapi.yaml
@@ -0,0 +1,546 @@
+openapi: 3.0.1
+info:
+  contact:
+    name: danet research group
+  description: Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+  license:
+    name: BSD 3-Clause License
+  title: danet ETSI14 Interface
+  version: "0.1"
+servers:
+- url: /
+tags:
+- name: ETSI14Service
+paths:
+  /{KMEHostname}/api/v1/keys/{masterSAEID}/dec_keys:
+    post:
+      operationId: ETSI14Service_GetKeyWithIDs
+      parameters:
+      - in: path
+        name: KMEHostname
+        required: true
+        schema:
+          type: string
+      - in: path
+        name: masterSAEID
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ETSI14Service_GetKeyWithIDs_request'
+        required: true
+      responses:
+        "200":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/etsiGetKeyWithIDsResponse'
+          description: A successful response.
+        default:
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/googlerpcStatus'
+          description: An unexpected error response.
+      summary: "Returns Key container from the KME to the calling slave SAE. \nKey\
+        \ container contains keys matching those previously delivered to a remote\
+        \ master SAE\nbased on the Key IDs supplied from the remote master SAE in\
+        \ response to its call to Get key.\nThe KME shall reject the request with\
+        \ a 401 HTTP status code if the SAE ID of the requestor \nwas not an SAE ID\
+        \ supplied to the \"Get key\" method each time it was called resulting in\
+        \ the\nreturn of any of the Key IDs being requested."
+      tags:
+      - ETSI14Service
+      x-codegen-request-body-name: body
+  /{KMEHostname}/api/v1/keys/{slaveSAEID}/enc_keys:
+    post:
+      operationId: ETSI14Service_GetKey
+      parameters:
+      - in: path
+        name: KMEHostname
+        required: true
+        schema:
+          type: string
+      - in: path
+        name: slaveSAEID
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/ETSI14Service_GetKey_request'
+        required: true
+      responses:
+        "200":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/etsiGetKeyResponse'
+          description: A successful response.
+        default:
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/googlerpcStatus'
+          description: An unexpected error response.
+      summary: "Returns Key container data from the KME to the calling master SAE.\
+        \ \nKey container data contains one or more keys. The calling master SAE may\
+        \ supply \nKey request data to specify the requirement on Key container data.\
+        \ The slave SAE \nspecified by the slave_SAE_ID parameter may subsequently\
+        \ request matching keys \nfrom a remote KME using key_ID identifiers from\
+        \ the returned Key container."
+      tags:
+      - ETSI14Service
+      x-codegen-request-body-name: body
+  /{KMEHostname}/api/v1/keys/{slaveSAEID}/status:
+    get:
+      operationId: ETSI14Service_GetStatus
+      parameters:
+      - in: path
+        name: KMEHostname
+        required: true
+        schema:
+          type: string
+      - in: path
+        name: slaveSAEID
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/etsiGetStatusResponse'
+          description: A successful response.
+        default:
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/googlerpcStatus'
+          description: An unexpected error response.
+      summary: "Returns Status from a KME to the calling SAE. \nStatus contains information\
+        \ on keys available to be requested \nby a master SAE for a specified slave\
+        \ SAE."
+      tags:
+      - ETSI14Service
+components:
+  schemas:
+    danetetsiStatus:
+      example:
+        maxKeyCount: maxKeyCount
+        maxKeySize: maxKeySize
+        storedKeyCount: storedKeyCount
+        maxSAEIDCount: maxSAEIDCount
+        keySize: keySize
+        masterSAEID: masterSAEID
+        maxKeyPerRequest: maxKeyPerRequest
+        sourceKMEID: sourceKMEID
+        minKeySize: minKeySize
+        slaveSAEID: slaveSAEID
+        targetKMEID: targetKMEID
+      properties:
+        sourceKMEID:
+          type: string
+        targetKMEID:
+          type: string
+        masterSAEID:
+          type: string
+        slaveSAEID:
+          type: string
+        keySize:
+          format: int64
+          type: string
+        storedKeyCount:
+          format: int64
+          type: string
+        maxKeyCount:
+          format: int64
+          type: string
+        maxKeyPerRequest:
+          format: int64
+          type: string
+        maxKeySize:
+          format: int64
+          type: string
+        minKeySize:
+          format: int64
+          type: string
+        maxSAEIDCount:
+          format: int64
+          type: string
+      type: object
+    etsiError:
+      example:
+        details:
+          key:
+            details:
+            - details
+            - details
+        message: message
+      properties:
+        message:
+          title: ErrorCode code = 1;
+          type: string
+        details:
+          additionalProperties:
+            $ref: '#/components/schemas/etsiListOfDetails'
+          title: "maybe map<string, string> is enough here?!"
+          type: object
+      title: FIGURE THIS ERROR STUFF OUT
+      type: object
+    etsiExtensionMandatory:
+      description: "Array of extension parameters specified as name/value pairs that\
+        \ KME shall \nhandle or return an error. Parameter values may be of any type,\
+        \ including objects."
+      properties:
+        extensionMandatory:
+          additionalProperties:
+            $ref: '#/components/schemas/protobufAny'
+          type: object
+      type: object
+    etsiExtensionOptional:
+      description: "Array of extension parameters specified as name/value pairs that\
+        \ KME may ignore. \nParameter values may be of any type, including objects."
+      properties:
+        extensionOptional:
+          additionalProperties:
+            $ref: '#/components/schemas/protobufAny'
+          type: object
+      type: object
+    etsiGetKeyResponse:
+      example:
+        keyContainer:
+          keyContainerExtension:
+            '@type': '@type'
+          key:
+          - keyExtension:
+              '@type': '@type'
+            keyIDExtension: "{}"
+            keyID: keyID
+            key: key
+          - keyExtension:
+              '@type': '@type'
+            keyIDExtension: "{}"
+            keyID: keyID
+            key: key
+        error:
+          details:
+            key:
+              details:
+              - details
+              - details
+          message: message
+        timestamp: timestamp
+      properties:
+        timestamp:
+          format: int64
+          type: string
+        keyContainer:
+          $ref: '#/components/schemas/etsiKeyContainer'
+        error:
+          $ref: '#/components/schemas/etsiError'
+      type: object
+    etsiGetKeyWithIDsResponse:
+      example:
+        keyContainer:
+          keyContainerExtension:
+            '@type': '@type'
+          key:
+          - keyExtension:
+              '@type': '@type'
+            keyIDExtension: "{}"
+            keyID: keyID
+            key: key
+          - keyExtension:
+              '@type': '@type'
+            keyIDExtension: "{}"
+            keyID: keyID
+            key: key
+        error:
+          details:
+            key:
+              details:
+              - details
+              - details
+          message: message
+        timestamp: timestamp
+      properties:
+        timestamp:
+          format: int64
+          type: string
+        keyContainer:
+          $ref: '#/components/schemas/etsiKeyContainer'
+        error:
+          $ref: '#/components/schemas/etsiError'
+      type: object
+    etsiGetStatusResponse:
+      example:
+        error:
+          details:
+            key:
+              details:
+              - details
+              - details
+          message: message
+        timestamp: timestamp
+        status:
+          maxKeyCount: maxKeyCount
+          maxKeySize: maxKeySize
+          storedKeyCount: storedKeyCount
+          maxSAEIDCount: maxSAEIDCount
+          keySize: keySize
+          masterSAEID: masterSAEID
+          maxKeyPerRequest: maxKeyPerRequest
+          sourceKMEID: sourceKMEID
+          minKeySize: minKeySize
+          slaveSAEID: slaveSAEID
+          targetKMEID: targetKMEID
+      properties:
+        timestamp:
+          format: int64
+          type: string
+        status:
+          $ref: '#/components/schemas/danetetsiStatus'
+        error:
+          $ref: '#/components/schemas/etsiError'
+      type: object
+    etsiKey:
+      example:
+        keyExtension:
+          '@type': '@type'
+        keyIDExtension: "{}"
+        keyID: keyID
+        key: key
+      properties:
+        keyID:
+          type: string
+        keyIDExtension:
+          description: optional for future use.
+          type: object
+        key:
+          type: string
+        keyExtension:
+          $ref: '#/components/schemas/protobufAny'
+      type: object
+    etsiKeyContainer:
+      example:
+        keyContainerExtension:
+          '@type': '@type'
+        key:
+        - keyExtension:
+            '@type': '@type'
+          keyIDExtension: "{}"
+          keyID: keyID
+          key: key
+        - keyExtension:
+            '@type': '@type'
+          keyIDExtension: "{}"
+          keyID: keyID
+          key: key
+      properties:
+        key:
+          items:
+            $ref: '#/components/schemas/etsiKey'
+          type: array
+        keyContainerExtension:
+          $ref: '#/components/schemas/protobufAny'
+      type: object
+    etsiKeyID:
+      properties:
+        keyID:
+          type: string
+        keyIDExtension:
+          $ref: '#/components/schemas/protobufAny'
+      type: object
+    etsiKeyIDExtension:
+      description: optional for future use.
+      type: object
+    etsiKeyRequest:
+      properties:
+        number:
+          format: int64
+          type: string
+        size:
+          format: int64
+          type: string
+        additionalSlaveSAEIDs:
+          items:
+            type: string
+          type: array
+        extensionMandatory:
+          items:
+            $ref: '#/components/schemas/etsiExtensionMandatory'
+          type: array
+        extensionOptional:
+          items:
+            $ref: '#/components/schemas/etsiExtensionOptional'
+          type: array
+      type: object
+    etsiListOfDetails:
+      example:
+        details:
+        - details
+        - details
+      properties:
+        details:
+          items:
+            type: string
+          type: array
+      title: Maybe not neccessary
+      type: object
+    googlerpcStatus:
+      properties:
+        code:
+          format: int32
+          type: integer
+        message:
+          type: string
+        details:
+          items:
+            $ref: '#/components/schemas/protobufAny'
+          type: array
+      type: object
+    protobufAny:
+      additionalProperties:
+        type: object
+      description: |-
+        `Any` contains an arbitrary serialized protocol buffer message along with a
+        URL that describes the type of the serialized message.
+
+        Protobuf library provides support to pack/unpack Any values in the form
+        of utility functions or additional generated methods of the Any type.
+
+        Example 1: Pack and unpack a message in C++.
+
+            Foo foo = ...;
+            Any any;
+            any.PackFrom(foo);
+            ...
+            if (any.UnpackTo(&foo)) {
+              ...
+            }
+
+        Example 2: Pack and unpack a message in Java.
+
+            Foo foo = ...;
+            Any any = Any.pack(foo);
+            ...
+            if (any.is(Foo.class)) {
+              foo = any.unpack(Foo.class);
+            }
+            // or ...
+            if (any.isSameTypeAs(Foo.getDefaultInstance())) {
+              foo = any.unpack(Foo.getDefaultInstance());
+            }
+
+        Example 3: Pack and unpack a message in Python.
+
+            foo = Foo(...)
+            any = Any()
+            any.Pack(foo)
+            ...
+            if any.Is(Foo.DESCRIPTOR):
+              any.Unpack(foo)
+              ...
+
+        Example 4: Pack and unpack a message in Go
+
+             foo := &pb.Foo{...}
+             any, err := anypb.New(foo)
+             if err != nil {
+               ...
+             }
+             ...
+             foo := &pb.Foo{}
+             if err := any.UnmarshalTo(foo); err != nil {
+               ...
+             }
+
+        The pack methods provided by protobuf library will by default use
+        'type.googleapis.com/full.type.name' as the type URL and the unpack
+        methods only use the fully qualified type name after the last '/'
+        in the type URL, for example "foo.bar.com/x/y.z" will yield type
+        name "y.z".
+
+        JSON
+
+        The JSON representation of an `Any` value uses the regular
+        representation of the deserialized, embedded message, with an
+        additional field `@type` which contains the type URL. Example:
+
+            package google.profile;
+            message Person {
+              string first_name = 1;
+              string last_name = 2;
+            }
+
+            {
+              "@type": "type.googleapis.com/google.profile.Person",
+              "firstName": <string>,
+              "lastName": <string>
+            }
+
+        If the embedded message type is well-known and has a custom JSON
+        representation, that representation will be embedded adding a field
+        `value` which holds the custom JSON in addition to the `@type`
+        field. Example (for message [google.protobuf.Duration][]):
+
+            {
+              "@type": "type.googleapis.com/google.protobuf.Duration",
+              "value": "1.212s"
+            }
+      example:
+        '@type': '@type'
+      properties:
+        '@type':
+          description: |-
+            A URL/resource name that uniquely identifies the type of the serialized
+            protocol buffer message. This string must contain at least
+            one "/" character. The last segment of the URL's path must represent
+            the fully qualified name of the type (as in
+            `path/google.protobuf.Duration`). The name should be in a canonical form
+            (e.g., leading "." is not accepted).
+
+            In practice, teams usually precompile into the binary all types that they
+            expect it to use in the context of Any. However, for URLs which use the
+            scheme `http`, `https`, or no scheme, one can optionally set up a type
+            server that maps type URLs to message definitions as follows:
+
+            * If no scheme is provided, `https` is assumed.
+            * An HTTP GET on the URL must yield a [google.protobuf.Type][]
+              value in binary format, or produce an error.
+            * Applications are allowed to cache lookup results based on the
+              URL, or have them precompiled into a binary to avoid any
+              lookup. Therefore, binary compatibility needs to be preserved
+              on changes to types. (Use versioned type names to manage
+              breaking changes.)
+
+            Note: this functionality is not currently available in the official
+            protobuf release, and it is not used for type URLs beginning with
+            type.googleapis.com.
+
+            Schemes other than `http`, `https` (or the empty scheme) might be
+            used with implementation specific semantics.
+          type: string
+      type: object
+    ETSI14Service_GetKeyWithIDs_request:
+      properties:
+        slaveSAEID:
+          type: string
+        keyID:
+          items:
+            $ref: '#/components/schemas/etsiKeyID'
+          type: array
+      type: object
+    ETSI14Service_GetKey_request:
+      properties:
+        keyRequest:
+          $ref: '#/components/schemas/etsiKeyRequest'
+      type: object
+x-original-swagger-version: "2.0"
diff --git a/api/go/rest/etsi/api_etsi14_service.go b/api/go/rest/etsi/api_etsi14_service.go
new file mode 100644
index 0000000000000000000000000000000000000000..22c36c8c4610175a48c04d6ec8e95186ecf63a84
--- /dev/null
+++ b/api/go/rest/etsi/api_etsi14_service.go
@@ -0,0 +1,385 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"bytes"
+	"context"
+	"io"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+
+// ETSI14ServiceAPIService ETSI14ServiceAPI service
+type ETSI14ServiceAPIService service
+
+type ApiETSI14ServiceGetKeyRequest struct {
+	ctx context.Context
+	ApiService *ETSI14ServiceAPIService
+	kMEHostname string
+	slaveSAEID string
+	body *ETSI14ServiceGetKeyRequest
+}
+
+func (r ApiETSI14ServiceGetKeyRequest) Body(body ETSI14ServiceGetKeyRequest) ApiETSI14ServiceGetKeyRequest {
+	r.body = &body
+	return r
+}
+
+func (r ApiETSI14ServiceGetKeyRequest) Execute() (*EtsiGetKeyResponse, *http.Response, error) {
+	return r.ApiService.ETSI14ServiceGetKeyExecute(r)
+}
+
+/*
+ETSI14ServiceGetKey Returns Key container data from the KME to the calling master SAE.  Key container data contains one or more keys. The calling master SAE may supply  Key request data to specify the requirement on Key container data. The slave SAE  specified by the slave_SAE_ID parameter may subsequently request matching keys  from a remote KME using key_ID identifiers from the returned Key container.
+
+ @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ @param kMEHostname
+ @param slaveSAEID
+ @return ApiETSI14ServiceGetKeyRequest
+*/
+func (a *ETSI14ServiceAPIService) ETSI14ServiceGetKey(ctx context.Context, kMEHostname string, slaveSAEID string) ApiETSI14ServiceGetKeyRequest {
+	return ApiETSI14ServiceGetKeyRequest{
+		ApiService: a,
+		ctx: ctx,
+		kMEHostname: kMEHostname,
+		slaveSAEID: slaveSAEID,
+	}
+}
+
+// Execute executes the request
+//  @return EtsiGetKeyResponse
+func (a *ETSI14ServiceAPIService) ETSI14ServiceGetKeyExecute(r ApiETSI14ServiceGetKeyRequest) (*EtsiGetKeyResponse, *http.Response, error) {
+	var (
+		localVarHTTPMethod   = http.MethodPost
+		localVarPostBody     interface{}
+		formFiles            []formFile
+		localVarReturnValue  *EtsiGetKeyResponse
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ETSI14ServiceAPIService.ETSI14ServiceGetKey")
+	if err != nil {
+		return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/{KMEHostname}/api/v1/keys/{slaveSAEID}/enc_keys"
+	localVarPath = strings.Replace(localVarPath, "{"+"KMEHostname"+"}", url.PathEscape(parameterValueToString(r.kMEHostname, "kMEHostname")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"slaveSAEID"+"}", url.PathEscape(parameterValueToString(r.slaveSAEID, "slaveSAEID")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+	if r.body == nil {
+		return localVarReturnValue, nil, reportError("body is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.body
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := io.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+			var v GooglerpcStatus
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+					newErr.error = formatErrorMessage(localVarHTTPResponse.Status, &v)
+					newErr.model = v
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiETSI14ServiceGetKeyWithIDsRequest struct {
+	ctx context.Context
+	ApiService *ETSI14ServiceAPIService
+	kMEHostname string
+	masterSAEID string
+	body *ETSI14ServiceGetKeyWithIDsRequest
+}
+
+func (r ApiETSI14ServiceGetKeyWithIDsRequest) Body(body ETSI14ServiceGetKeyWithIDsRequest) ApiETSI14ServiceGetKeyWithIDsRequest {
+	r.body = &body
+	return r
+}
+
+func (r ApiETSI14ServiceGetKeyWithIDsRequest) Execute() (*EtsiGetKeyWithIDsResponse, *http.Response, error) {
+	return r.ApiService.ETSI14ServiceGetKeyWithIDsExecute(r)
+}
+
+/*
+ETSI14ServiceGetKeyWithIDs Returns Key container from the KME to the calling slave SAE.  Key container contains keys matching those previously delivered to a remote master SAE based on the Key IDs supplied from the remote master SAE in response to its call to Get key. The KME shall reject the request with a 401 HTTP status code if the SAE ID of the requestor  was not an SAE ID supplied to the \"Get key\" method each time it was called resulting in the return of any of the Key IDs being requested.
+
+ @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ @param kMEHostname
+ @param masterSAEID
+ @return ApiETSI14ServiceGetKeyWithIDsRequest
+*/
+func (a *ETSI14ServiceAPIService) ETSI14ServiceGetKeyWithIDs(ctx context.Context, kMEHostname string, masterSAEID string) ApiETSI14ServiceGetKeyWithIDsRequest {
+	return ApiETSI14ServiceGetKeyWithIDsRequest{
+		ApiService: a,
+		ctx: ctx,
+		kMEHostname: kMEHostname,
+		masterSAEID: masterSAEID,
+	}
+}
+
+// Execute executes the request
+//  @return EtsiGetKeyWithIDsResponse
+func (a *ETSI14ServiceAPIService) ETSI14ServiceGetKeyWithIDsExecute(r ApiETSI14ServiceGetKeyWithIDsRequest) (*EtsiGetKeyWithIDsResponse, *http.Response, error) {
+	var (
+		localVarHTTPMethod   = http.MethodPost
+		localVarPostBody     interface{}
+		formFiles            []formFile
+		localVarReturnValue  *EtsiGetKeyWithIDsResponse
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ETSI14ServiceAPIService.ETSI14ServiceGetKeyWithIDs")
+	if err != nil {
+		return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/{KMEHostname}/api/v1/keys/{masterSAEID}/dec_keys"
+	localVarPath = strings.Replace(localVarPath, "{"+"KMEHostname"+"}", url.PathEscape(parameterValueToString(r.kMEHostname, "kMEHostname")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"masterSAEID"+"}", url.PathEscape(parameterValueToString(r.masterSAEID, "masterSAEID")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+	if r.body == nil {
+		return localVarReturnValue, nil, reportError("body is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.body
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := io.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+			var v GooglerpcStatus
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+					newErr.error = formatErrorMessage(localVarHTTPResponse.Status, &v)
+					newErr.model = v
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiETSI14ServiceGetStatusRequest struct {
+	ctx context.Context
+	ApiService *ETSI14ServiceAPIService
+	kMEHostname string
+	slaveSAEID string
+}
+
+func (r ApiETSI14ServiceGetStatusRequest) Execute() (*EtsiGetStatusResponse, *http.Response, error) {
+	return r.ApiService.ETSI14ServiceGetStatusExecute(r)
+}
+
+/*
+ETSI14ServiceGetStatus Returns Status from a KME to the calling SAE.  Status contains information on keys available to be requested  by a master SAE for a specified slave SAE.
+
+ @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ @param kMEHostname
+ @param slaveSAEID
+ @return ApiETSI14ServiceGetStatusRequest
+*/
+func (a *ETSI14ServiceAPIService) ETSI14ServiceGetStatus(ctx context.Context, kMEHostname string, slaveSAEID string) ApiETSI14ServiceGetStatusRequest {
+	return ApiETSI14ServiceGetStatusRequest{
+		ApiService: a,
+		ctx: ctx,
+		kMEHostname: kMEHostname,
+		slaveSAEID: slaveSAEID,
+	}
+}
+
+// Execute executes the request
+//  @return EtsiGetStatusResponse
+func (a *ETSI14ServiceAPIService) ETSI14ServiceGetStatusExecute(r ApiETSI14ServiceGetStatusRequest) (*EtsiGetStatusResponse, *http.Response, error) {
+	var (
+		localVarHTTPMethod   = http.MethodGet
+		localVarPostBody     interface{}
+		formFiles            []formFile
+		localVarReturnValue  *EtsiGetStatusResponse
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ETSI14ServiceAPIService.ETSI14ServiceGetStatus")
+	if err != nil {
+		return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/{KMEHostname}/api/v1/keys/{slaveSAEID}/status"
+	localVarPath = strings.Replace(localVarPath, "{"+"KMEHostname"+"}", url.PathEscape(parameterValueToString(r.kMEHostname, "kMEHostname")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"slaveSAEID"+"}", url.PathEscape(parameterValueToString(r.slaveSAEID, "slaveSAEID")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := io.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = io.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+			var v GooglerpcStatus
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+					newErr.error = formatErrorMessage(localVarHTTPResponse.Status, &v)
+					newErr.model = v
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := &GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
diff --git a/api/go/rest/etsi/client.go b/api/go/rest/etsi/client.go
new file mode 100644
index 0000000000000000000000000000000000000000..78040e6657202994332140713633bc671811dfbf
--- /dev/null
+++ b/api/go/rest/etsi/client.go
@@ -0,0 +1,662 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"encoding/xml"
+	"errors"
+	"fmt"
+	"io"
+	"log"
+	"mime/multipart"
+	"net/http"
+	"net/http/httputil"
+	"net/url"
+	"os"
+	"path/filepath"
+	"reflect"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+	"unicode/utf8"
+
+)
+
+var (
+	jsonCheck = regexp.MustCompile(`(?i:(?:application|text)/(?:vnd\.[^;]+\+)?json)`)
+	xmlCheck  = regexp.MustCompile(`(?i:(?:application|text)/xml)`)
+	queryParamSplit = regexp.MustCompile(`(^|&)([^&]+)`)
+	queryDescape    = strings.NewReplacer( "%5B", "[", "%5D", "]" )
+)
+
+// APIClient manages communication with the danet ETSI14 Interface API v0.1
+// In most cases there should be only one, shared, APIClient.
+type APIClient struct {
+	cfg    *Configuration
+	common service // Reuse a single struct instead of allocating one for each service on the heap.
+
+	// API Services
+
+	ETSI14ServiceAPI *ETSI14ServiceAPIService
+}
+
+type service struct {
+	client *APIClient
+}
+
+// NewAPIClient creates a new API client. Requires a userAgent string describing your application.
+// optionally a custom http.Client to allow for advanced features such as caching.
+func NewAPIClient(cfg *Configuration) *APIClient {
+	if cfg.HTTPClient == nil {
+		cfg.HTTPClient = http.DefaultClient
+	}
+
+	c := &APIClient{}
+	c.cfg = cfg
+	c.common.client = c
+
+	// API Services
+	c.ETSI14ServiceAPI = (*ETSI14ServiceAPIService)(&c.common)
+
+	return c
+}
+
+func atoi(in string) (int, error) {
+	return strconv.Atoi(in)
+}
+
+// selectHeaderContentType select a content type from the available list.
+func selectHeaderContentType(contentTypes []string) string {
+	if len(contentTypes) == 0 {
+		return ""
+	}
+	if contains(contentTypes, "application/json") {
+		return "application/json"
+	}
+	return contentTypes[0] // use the first content type specified in 'consumes'
+}
+
+// selectHeaderAccept join all accept types and return
+func selectHeaderAccept(accepts []string) string {
+	if len(accepts) == 0 {
+		return ""
+	}
+
+	if contains(accepts, "application/json") {
+		return "application/json"
+	}
+
+	return strings.Join(accepts, ",")
+}
+
+// contains is a case insensitive match, finding needle in a haystack
+func contains(haystack []string, needle string) bool {
+	for _, a := range haystack {
+		if strings.EqualFold(a, needle) {
+			return true
+		}
+	}
+	return false
+}
+
+// Verify optional parameters are of the correct type.
+func typeCheckParameter(obj interface{}, expected string, name string) error {
+	// Make sure there is an object.
+	if obj == nil {
+		return nil
+	}
+
+	// Check the type is as expected.
+	if reflect.TypeOf(obj).String() != expected {
+		return fmt.Errorf("expected %s to be of type %s but received %s", name, expected, reflect.TypeOf(obj).String())
+	}
+	return nil
+}
+
+func parameterValueToString( obj interface{}, key string ) string {
+	if reflect.TypeOf(obj).Kind() != reflect.Ptr {
+		return fmt.Sprintf("%v", obj)
+	}
+	var param,ok = obj.(MappedNullable)
+	if !ok {
+		return ""
+	}
+	dataMap,err := param.ToMap()
+	if err != nil {
+		return ""
+	}
+	return fmt.Sprintf("%v", dataMap[key])
+}
+
+// parameterAddToHeaderOrQuery adds the provided object to the request header or url query
+// supporting deep object syntax
+func parameterAddToHeaderOrQuery(headerOrQueryParams interface{}, keyPrefix string, obj interface{}, collectionType string) {
+	var v = reflect.ValueOf(obj)
+	var value = ""
+	if v == reflect.ValueOf(nil) {
+		value = "null"
+	} else {
+		switch v.Kind() {
+			case reflect.Invalid:
+				value = "invalid"
+
+			case reflect.Struct:
+				if t,ok := obj.(MappedNullable); ok {
+					dataMap,err := t.ToMap()
+					if err != nil {
+						return
+					}
+					parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, dataMap, collectionType)
+					return
+				}
+				if t, ok := obj.(time.Time); ok {
+					parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, t.Format(time.RFC3339), collectionType)
+					return
+				}
+				value = v.Type().String() + " value"
+			case reflect.Slice:
+				var indValue = reflect.ValueOf(obj)
+				if indValue == reflect.ValueOf(nil) {
+					return
+				}
+				var lenIndValue = indValue.Len()
+				for i:=0;i<lenIndValue;i++ {
+					var arrayValue = indValue.Index(i)
+					parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, arrayValue.Interface(), collectionType)
+				}
+				return
+
+			case reflect.Map:
+				var indValue = reflect.ValueOf(obj)
+				if indValue == reflect.ValueOf(nil) {
+					return
+				}
+				iter := indValue.MapRange()
+				for iter.Next() {
+					k,v := iter.Key(), iter.Value()
+					parameterAddToHeaderOrQuery(headerOrQueryParams, fmt.Sprintf("%s[%s]", keyPrefix, k.String()), v.Interface(), collectionType)
+				}
+				return
+
+			case reflect.Interface:
+				fallthrough
+			case reflect.Ptr:
+				parameterAddToHeaderOrQuery(headerOrQueryParams, keyPrefix, v.Elem().Interface(), collectionType)
+				return
+
+			case reflect.Int, reflect.Int8, reflect.Int16,
+				reflect.Int32, reflect.Int64:
+				value = strconv.FormatInt(v.Int(), 10)
+			case reflect.Uint, reflect.Uint8, reflect.Uint16,
+				reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+				value = strconv.FormatUint(v.Uint(), 10)
+			case reflect.Float32, reflect.Float64:
+				value = strconv.FormatFloat(v.Float(), 'g', -1, 32)
+			case reflect.Bool:
+				value = strconv.FormatBool(v.Bool())
+			case reflect.String:
+				value = v.String()
+			default:
+				value = v.Type().String() + " value"
+		}
+	}
+
+	switch valuesMap := headerOrQueryParams.(type) {
+		case url.Values:
+			if collectionType == "csv" && valuesMap.Get(keyPrefix) != "" {
+				valuesMap.Set(keyPrefix, valuesMap.Get(keyPrefix) + "," + value)
+			} else {
+				valuesMap.Add(keyPrefix, value)
+			}
+			break
+		case map[string]string:
+			valuesMap[keyPrefix] = value
+			break
+	}
+}
+
+// helper for converting interface{} parameters to json strings
+func parameterToJson(obj interface{}) (string, error) {
+	jsonBuf, err := json.Marshal(obj)
+	if err != nil {
+		return "", err
+	}
+	return string(jsonBuf), err
+}
+
+// callAPI do the request.
+func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
+	if c.cfg.Debug {
+		dump, err := httputil.DumpRequestOut(request, true)
+		if err != nil {
+			return nil, err
+		}
+		log.Printf("\n%s\n", string(dump))
+	}
+
+	resp, err := c.cfg.HTTPClient.Do(request)
+	if err != nil {
+		return resp, err
+	}
+
+	if c.cfg.Debug {
+		dump, err := httputil.DumpResponse(resp, true)
+		if err != nil {
+			return resp, err
+		}
+		log.Printf("\n%s\n", string(dump))
+	}
+	return resp, err
+}
+
+// Allow modification of underlying config for alternate implementations and testing
+// Caution: modifying the configuration while live can cause data races and potentially unwanted behavior
+func (c *APIClient) GetConfig() *Configuration {
+	return c.cfg
+}
+
+type formFile struct {
+		fileBytes []byte
+		fileName string
+		formFileName string
+}
+
+// prepareRequest build the request
+func (c *APIClient) prepareRequest(
+	ctx context.Context,
+	path string, method string,
+	postBody interface{},
+	headerParams map[string]string,
+	queryParams url.Values,
+	formParams url.Values,
+	formFiles []formFile) (localVarRequest *http.Request, err error) {
+
+	var body *bytes.Buffer
+
+	// Detect postBody type and post.
+	if postBody != nil {
+		contentType := headerParams["Content-Type"]
+		if contentType == "" {
+			contentType = detectContentType(postBody)
+			headerParams["Content-Type"] = contentType
+		}
+
+		body, err = setBody(postBody, contentType)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	// add form parameters and file if available.
+	if strings.HasPrefix(headerParams["Content-Type"], "multipart/form-data") && len(formParams) > 0 || (len(formFiles) > 0) {
+		if body != nil {
+			return nil, errors.New("Cannot specify postBody and multipart form at the same time.")
+		}
+		body = &bytes.Buffer{}
+		w := multipart.NewWriter(body)
+
+		for k, v := range formParams {
+			for _, iv := range v {
+				if strings.HasPrefix(k, "@") { // file
+					err = addFile(w, k[1:], iv)
+					if err != nil {
+						return nil, err
+					}
+				} else { // form value
+					w.WriteField(k, iv)
+				}
+			}
+		}
+		for _, formFile := range formFiles {
+			if len(formFile.fileBytes) > 0 && formFile.fileName != "" {
+				w.Boundary()
+				part, err := w.CreateFormFile(formFile.formFileName, filepath.Base(formFile.fileName))
+				if err != nil {
+						return nil, err
+				}
+				_, err = part.Write(formFile.fileBytes)
+				if err != nil {
+						return nil, err
+				}
+			}
+		}
+
+		// Set the Boundary in the Content-Type
+		headerParams["Content-Type"] = w.FormDataContentType()
+
+		// Set Content-Length
+		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
+		w.Close()
+	}
+
+	if strings.HasPrefix(headerParams["Content-Type"], "application/x-www-form-urlencoded") && len(formParams) > 0 {
+		if body != nil {
+			return nil, errors.New("Cannot specify postBody and x-www-form-urlencoded form at the same time.")
+		}
+		body = &bytes.Buffer{}
+		body.WriteString(formParams.Encode())
+		// Set Content-Length
+		headerParams["Content-Length"] = fmt.Sprintf("%d", body.Len())
+	}
+
+	// Setup path and query parameters
+	url, err := url.Parse(path)
+	if err != nil {
+		return nil, err
+	}
+
+	// Override request host, if applicable
+	if c.cfg.Host != "" {
+		url.Host = c.cfg.Host
+	}
+
+	// Override request scheme, if applicable
+	if c.cfg.Scheme != "" {
+		url.Scheme = c.cfg.Scheme
+	}
+
+	// Adding Query Param
+	query := url.Query()
+	for k, v := range queryParams {
+		for _, iv := range v {
+			query.Add(k, iv)
+		}
+	}
+
+	// Encode the parameters.
+	url.RawQuery = queryParamSplit.ReplaceAllStringFunc(query.Encode(), func(s string) string {
+		pieces := strings.Split(s, "=")
+		pieces[0] = queryDescape.Replace(pieces[0])
+		return strings.Join(pieces, "=")
+	})
+
+	// Generate a new request
+	if body != nil {
+		localVarRequest, err = http.NewRequest(method, url.String(), body)
+	} else {
+		localVarRequest, err = http.NewRequest(method, url.String(), nil)
+	}
+	if err != nil {
+		return nil, err
+	}
+
+	// add header parameters, if any
+	if len(headerParams) > 0 {
+		headers := http.Header{}
+		for h, v := range headerParams {
+			headers[h] = []string{v}
+		}
+		localVarRequest.Header = headers
+	}
+
+	// Add the user agent to the request.
+	localVarRequest.Header.Add("User-Agent", c.cfg.UserAgent)
+
+	if ctx != nil {
+		// add context to the request
+		localVarRequest = localVarRequest.WithContext(ctx)
+
+		// Walk through any authentication.
+
+	}
+
+	for header, value := range c.cfg.DefaultHeader {
+		localVarRequest.Header.Add(header, value)
+	}
+	return localVarRequest, nil
+}
+
+func (c *APIClient) decode(v interface{}, b []byte, contentType string) (err error) {
+	if len(b) == 0 {
+		return nil
+	}
+	if s, ok := v.(*string); ok {
+		*s = string(b)
+		return nil
+	}
+	if f, ok := v.(*os.File); ok {
+		f, err = os.CreateTemp("", "HttpClientFile")
+		if err != nil {
+			return
+		}
+		_, err = f.Write(b)
+		if err != nil {
+			return
+		}
+		_, err = f.Seek(0, io.SeekStart)
+		err = os.Remove(f.Name())
+		return
+	}
+	if f, ok := v.(**os.File); ok {
+		*f, err = os.CreateTemp("", "HttpClientFile")
+		if err != nil {
+			return
+		}
+		_, err = (*f).Write(b)
+		if err != nil {
+			return
+		}
+		_, err = (*f).Seek(0, io.SeekStart)
+		err = os.Remove((*f).Name())
+		return
+	}
+	if xmlCheck.MatchString(contentType) {
+		if err = xml.Unmarshal(b, v); err != nil {
+			return err
+		}
+		return nil
+	}
+	if jsonCheck.MatchString(contentType) {
+		if actualObj, ok := v.(interface{ GetActualInstance() interface{} }); ok { // oneOf, anyOf schemas
+			if unmarshalObj, ok := actualObj.(interface{ UnmarshalJSON([]byte) error }); ok { // make sure it has UnmarshalJSON defined
+				if err = unmarshalObj.UnmarshalJSON(b); err != nil {
+					return err
+				}
+			} else {
+				return errors.New("Unknown type with GetActualInstance but no unmarshalObj.UnmarshalJSON defined")
+			}
+		} else if err = json.Unmarshal(b, v); err != nil { // simple model
+			return err
+		}
+		return nil
+	}
+	return errors.New("undefined response type")
+}
+
+// Add a file to the multipart request
+func addFile(w *multipart.Writer, fieldName, path string) error {
+	file, err := os.Open(filepath.Clean(path))
+	if err != nil {
+		return err
+	}
+	err = file.Close()
+	if err != nil {
+		return err
+	}
+
+	part, err := w.CreateFormFile(fieldName, filepath.Base(path))
+	if err != nil {
+		return err
+	}
+	_, err = io.Copy(part, file)
+
+	return err
+}
+
+// Prevent trying to import "fmt"
+func reportError(format string, a ...interface{}) error {
+	return fmt.Errorf(format, a...)
+}
+
+// A wrapper for strict JSON decoding
+func newStrictDecoder(data []byte) *json.Decoder {
+	dec := json.NewDecoder(bytes.NewBuffer(data))
+	dec.DisallowUnknownFields()
+	return dec
+}
+
+// Set request body from an interface{}
+func setBody(body interface{}, contentType string) (bodyBuf *bytes.Buffer, err error) {
+	if bodyBuf == nil {
+		bodyBuf = &bytes.Buffer{}
+	}
+
+	if reader, ok := body.(io.Reader); ok {
+		_, err = bodyBuf.ReadFrom(reader)
+	} else if fp, ok := body.(*os.File); ok {
+		_, err = bodyBuf.ReadFrom(fp)
+	} else if b, ok := body.([]byte); ok {
+		_, err = bodyBuf.Write(b)
+	} else if s, ok := body.(string); ok {
+		_, err = bodyBuf.WriteString(s)
+	} else if s, ok := body.(*string); ok {
+		_, err = bodyBuf.WriteString(*s)
+	} else if jsonCheck.MatchString(contentType) {
+		err = json.NewEncoder(bodyBuf).Encode(body)
+	} else if xmlCheck.MatchString(contentType) {
+		var bs []byte
+		bs, err = xml.Marshal(body)
+		if err == nil {
+			bodyBuf.Write(bs)
+		}
+	}
+
+	if err != nil {
+		return nil, err
+	}
+
+	if bodyBuf.Len() == 0 {
+		err = fmt.Errorf("invalid body type %s\n", contentType)
+		return nil, err
+	}
+	return bodyBuf, nil
+}
+
+// detectContentType method is used to figure out `Request.Body` content type for request header
+func detectContentType(body interface{}) string {
+	contentType := "text/plain; charset=utf-8"
+	kind := reflect.TypeOf(body).Kind()
+
+	switch kind {
+	case reflect.Struct, reflect.Map, reflect.Ptr:
+		contentType = "application/json; charset=utf-8"
+	case reflect.String:
+		contentType = "text/plain; charset=utf-8"
+	default:
+		if b, ok := body.([]byte); ok {
+			contentType = http.DetectContentType(b)
+		} else if kind == reflect.Slice {
+			contentType = "application/json; charset=utf-8"
+		}
+	}
+
+	return contentType
+}
+
+// Ripped from https://github.com/gregjones/httpcache/blob/master/httpcache.go
+type cacheControl map[string]string
+
+func parseCacheControl(headers http.Header) cacheControl {
+	cc := cacheControl{}
+	ccHeader := headers.Get("Cache-Control")
+	for _, part := range strings.Split(ccHeader, ",") {
+		part = strings.Trim(part, " ")
+		if part == "" {
+			continue
+		}
+		if strings.ContainsRune(part, '=') {
+			keyval := strings.Split(part, "=")
+			cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",")
+		} else {
+			cc[part] = ""
+		}
+	}
+	return cc
+}
+
+// CacheExpires helper function to determine remaining time before repeating a request.
+func CacheExpires(r *http.Response) time.Time {
+	// Figure out when the cache expires.
+	var expires time.Time
+	now, err := time.Parse(time.RFC1123, r.Header.Get("date"))
+	if err != nil {
+		return time.Now()
+	}
+	respCacheControl := parseCacheControl(r.Header)
+
+	if maxAge, ok := respCacheControl["max-age"]; ok {
+		lifetime, err := time.ParseDuration(maxAge + "s")
+		if err != nil {
+			expires = now
+		} else {
+			expires = now.Add(lifetime)
+		}
+	} else {
+		expiresHeader := r.Header.Get("Expires")
+		if expiresHeader != "" {
+			expires, err = time.Parse(time.RFC1123, expiresHeader)
+			if err != nil {
+				expires = now
+			}
+		}
+	}
+	return expires
+}
+
+func strlen(s string) int {
+	return utf8.RuneCountInString(s)
+}
+
+// GenericOpenAPIError Provides access to the body, error and model on returned errors.
+type GenericOpenAPIError struct {
+	body  []byte
+	error string
+	model interface{}
+}
+
+// Error returns non-empty string if there was an error.
+func (e GenericOpenAPIError) Error() string {
+	return e.error
+}
+
+// Body returns the raw bytes of the response
+func (e GenericOpenAPIError) Body() []byte {
+	return e.body
+}
+
+// Model returns the unpacked model of the error
+func (e GenericOpenAPIError) Model() interface{} {
+	return e.model
+}
+
+// format error message using title and detail when model implements rfc7807
+func formatErrorMessage(status string, v interface{}) string {
+	str := ""
+	metaValue := reflect.ValueOf(v).Elem()
+
+	if metaValue.Kind() == reflect.Struct {
+		field := metaValue.FieldByName("Title")
+		if field != (reflect.Value{}) {
+			str = fmt.Sprintf("%s", field.Interface())
+		}
+
+		field = metaValue.FieldByName("Detail")
+		if field != (reflect.Value{}) {
+			str = fmt.Sprintf("%s (%s)", str, field.Interface())
+		}
+	}
+
+	return strings.TrimSpace(fmt.Sprintf("%s %s", status, str))
+}
diff --git a/api/go/rest/etsi/configuration.go b/api/go/rest/etsi/configuration.go
new file mode 100644
index 0000000000000000000000000000000000000000..7f5674afb2197da11a31fa1cbffc06896bf1003e
--- /dev/null
+++ b/api/go/rest/etsi/configuration.go
@@ -0,0 +1,215 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"strings"
+)
+
+// contextKeys are used to identify the type of value in the context.
+// Since these are string, it is possible to get a short description of the
+// context key for logging and debugging using key.String().
+
+type contextKey string
+
+func (c contextKey) String() string {
+	return "auth " + string(c)
+}
+
+var (
+	// ContextServerIndex uses a server configuration from the index.
+	ContextServerIndex = contextKey("serverIndex")
+
+	// ContextOperationServerIndices uses a server configuration from the index mapping.
+	ContextOperationServerIndices = contextKey("serverOperationIndices")
+
+	// ContextServerVariables overrides a server configuration variables.
+	ContextServerVariables = contextKey("serverVariables")
+
+	// ContextOperationServerVariables overrides a server configuration variables using operation specific values.
+	ContextOperationServerVariables = contextKey("serverOperationVariables")
+)
+
+// BasicAuth provides basic http authentication to a request passed via context using ContextBasicAuth
+type BasicAuth struct {
+	UserName string `json:"userName,omitempty"`
+	Password string `json:"password,omitempty"`
+}
+
+// APIKey provides API key based authentication to a request passed via context using ContextAPIKey
+type APIKey struct {
+	Key    string
+	Prefix string
+}
+
+// ServerVariable stores the information about a server variable
+type ServerVariable struct {
+	Description  string
+	DefaultValue string
+	EnumValues   []string
+}
+
+// ServerConfiguration stores the information about a server
+type ServerConfiguration struct {
+	URL string
+	Description string
+	Variables map[string]ServerVariable
+}
+
+// ServerConfigurations stores multiple ServerConfiguration items
+type ServerConfigurations []ServerConfiguration
+
+// Configuration stores the configuration of the API client
+type Configuration struct {
+	Host             string            `json:"host,omitempty"`
+	Scheme           string            `json:"scheme,omitempty"`
+	DefaultHeader    map[string]string `json:"defaultHeader,omitempty"`
+	UserAgent        string            `json:"userAgent,omitempty"`
+	Debug            bool              `json:"debug,omitempty"`
+	Servers          ServerConfigurations
+	OperationServers map[string]ServerConfigurations
+	HTTPClient       *http.Client
+}
+
+// NewConfiguration returns a new Configuration object
+func NewConfiguration() *Configuration {
+	cfg := &Configuration{
+		DefaultHeader:    make(map[string]string),
+		UserAgent:        "OpenAPI-Generator/1.0.0/go",
+		Debug:            false,
+		Servers:          ServerConfigurations{
+			{
+				URL: "",
+				Description: "No description provided",
+			},
+		},
+		OperationServers: map[string]ServerConfigurations{
+		},
+	}
+	return cfg
+}
+
+// AddDefaultHeader adds a new HTTP header to the default header in the request
+func (c *Configuration) AddDefaultHeader(key string, value string) {
+	c.DefaultHeader[key] = value
+}
+
+// URL formats template on a index using given variables
+func (sc ServerConfigurations) URL(index int, variables map[string]string) (string, error) {
+	if index < 0 || len(sc) <= index {
+		return "", fmt.Errorf("index %v out of range %v", index, len(sc)-1)
+	}
+	server := sc[index]
+	url := server.URL
+
+	// go through variables and replace placeholders
+	for name, variable := range server.Variables {
+		if value, ok := variables[name]; ok {
+			found := bool(len(variable.EnumValues) == 0)
+			for _, enumValue := range variable.EnumValues {
+				if value == enumValue {
+					found = true
+				}
+			}
+			if !found {
+				return "", fmt.Errorf("the variable %s in the server URL has invalid value %v. Must be %v", name, value, variable.EnumValues)
+			}
+			url = strings.Replace(url, "{"+name+"}", value, -1)
+		} else {
+			url = strings.Replace(url, "{"+name+"}", variable.DefaultValue, -1)
+		}
+	}
+	return url, nil
+}
+
+// ServerURL returns URL based on server settings
+func (c *Configuration) ServerURL(index int, variables map[string]string) (string, error) {
+	return c.Servers.URL(index, variables)
+}
+
+func getServerIndex(ctx context.Context) (int, error) {
+	si := ctx.Value(ContextServerIndex)
+	if si != nil {
+		if index, ok := si.(int); ok {
+			return index, nil
+		}
+		return 0, reportError("Invalid type %T should be int", si)
+	}
+	return 0, nil
+}
+
+func getServerOperationIndex(ctx context.Context, endpoint string) (int, error) {
+	osi := ctx.Value(ContextOperationServerIndices)
+	if osi != nil {
+		if operationIndices, ok := osi.(map[string]int); !ok {
+			return 0, reportError("Invalid type %T should be map[string]int", osi)
+		} else {
+			index, ok := operationIndices[endpoint]
+			if ok {
+				return index, nil
+			}
+		}
+	}
+	return getServerIndex(ctx)
+}
+
+func getServerVariables(ctx context.Context) (map[string]string, error) {
+	sv := ctx.Value(ContextServerVariables)
+	if sv != nil {
+		if variables, ok := sv.(map[string]string); ok {
+			return variables, nil
+		}
+		return nil, reportError("ctx value of ContextServerVariables has invalid type %T should be map[string]string", sv)
+	}
+	return nil, nil
+}
+
+func getServerOperationVariables(ctx context.Context, endpoint string) (map[string]string, error) {
+	osv := ctx.Value(ContextOperationServerVariables)
+	if osv != nil {
+		if operationVariables, ok := osv.(map[string]map[string]string); !ok {
+			return nil, reportError("ctx value of ContextOperationServerVariables has invalid type %T should be map[string]map[string]string", osv)
+		} else {
+			variables, ok := operationVariables[endpoint]
+			if ok {
+				return variables, nil
+			}
+		}
+	}
+	return getServerVariables(ctx)
+}
+
+// ServerURLWithContext returns a new server URL given an endpoint
+func (c *Configuration) ServerURLWithContext(ctx context.Context, endpoint string) (string, error) {
+	sc, ok := c.OperationServers[endpoint]
+	if !ok {
+		sc = c.Servers
+	}
+
+	if ctx == nil {
+		return sc.URL(0, nil)
+	}
+
+	index, err := getServerOperationIndex(ctx, endpoint)
+	if err != nil {
+		return "", err
+	}
+
+	variables, err := getServerOperationVariables(ctx, endpoint)
+	if err != nil {
+		return "", err
+	}
+
+	return sc.URL(index, variables)
+}
diff --git a/api/go/rest/etsi/docs/DanetetsiStatus.md b/api/go/rest/etsi/docs/DanetetsiStatus.md
new file mode 100644
index 0000000000000000000000000000000000000000..4bdf93096aac3a9dca8a3862a9fd9a841a1d20d8
--- /dev/null
+++ b/api/go/rest/etsi/docs/DanetetsiStatus.md
@@ -0,0 +1,316 @@
+# DanetetsiStatus
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SourceKMEID** | Pointer to **string** |  | [optional] 
+**TargetKMEID** | Pointer to **string** |  | [optional] 
+**MasterSAEID** | Pointer to **string** |  | [optional] 
+**SlaveSAEID** | Pointer to **string** |  | [optional] 
+**KeySize** | Pointer to **string** |  | [optional] 
+**StoredKeyCount** | Pointer to **string** |  | [optional] 
+**MaxKeyCount** | Pointer to **string** |  | [optional] 
+**MaxKeyPerRequest** | Pointer to **string** |  | [optional] 
+**MaxKeySize** | Pointer to **string** |  | [optional] 
+**MinKeySize** | Pointer to **string** |  | [optional] 
+**MaxSAEIDCount** | Pointer to **string** |  | [optional] 
+
+## Methods
+
+### NewDanetetsiStatus
+
+`func NewDanetetsiStatus() *DanetetsiStatus`
+
+NewDanetetsiStatus instantiates a new DanetetsiStatus object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewDanetetsiStatusWithDefaults
+
+`func NewDanetetsiStatusWithDefaults() *DanetetsiStatus`
+
+NewDanetetsiStatusWithDefaults instantiates a new DanetetsiStatus object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetSourceKMEID
+
+`func (o *DanetetsiStatus) GetSourceKMEID() string`
+
+GetSourceKMEID returns the SourceKMEID field if non-nil, zero value otherwise.
+
+### GetSourceKMEIDOk
+
+`func (o *DanetetsiStatus) GetSourceKMEIDOk() (*string, bool)`
+
+GetSourceKMEIDOk returns a tuple with the SourceKMEID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetSourceKMEID
+
+`func (o *DanetetsiStatus) SetSourceKMEID(v string)`
+
+SetSourceKMEID sets SourceKMEID field to given value.
+
+### HasSourceKMEID
+
+`func (o *DanetetsiStatus) HasSourceKMEID() bool`
+
+HasSourceKMEID returns a boolean if a field has been set.
+
+### GetTargetKMEID
+
+`func (o *DanetetsiStatus) GetTargetKMEID() string`
+
+GetTargetKMEID returns the TargetKMEID field if non-nil, zero value otherwise.
+
+### GetTargetKMEIDOk
+
+`func (o *DanetetsiStatus) GetTargetKMEIDOk() (*string, bool)`
+
+GetTargetKMEIDOk returns a tuple with the TargetKMEID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetTargetKMEID
+
+`func (o *DanetetsiStatus) SetTargetKMEID(v string)`
+
+SetTargetKMEID sets TargetKMEID field to given value.
+
+### HasTargetKMEID
+
+`func (o *DanetetsiStatus) HasTargetKMEID() bool`
+
+HasTargetKMEID returns a boolean if a field has been set.
+
+### GetMasterSAEID
+
+`func (o *DanetetsiStatus) GetMasterSAEID() string`
+
+GetMasterSAEID returns the MasterSAEID field if non-nil, zero value otherwise.
+
+### GetMasterSAEIDOk
+
+`func (o *DanetetsiStatus) GetMasterSAEIDOk() (*string, bool)`
+
+GetMasterSAEIDOk returns a tuple with the MasterSAEID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMasterSAEID
+
+`func (o *DanetetsiStatus) SetMasterSAEID(v string)`
+
+SetMasterSAEID sets MasterSAEID field to given value.
+
+### HasMasterSAEID
+
+`func (o *DanetetsiStatus) HasMasterSAEID() bool`
+
+HasMasterSAEID returns a boolean if a field has been set.
+
+### GetSlaveSAEID
+
+`func (o *DanetetsiStatus) GetSlaveSAEID() string`
+
+GetSlaveSAEID returns the SlaveSAEID field if non-nil, zero value otherwise.
+
+### GetSlaveSAEIDOk
+
+`func (o *DanetetsiStatus) GetSlaveSAEIDOk() (*string, bool)`
+
+GetSlaveSAEIDOk returns a tuple with the SlaveSAEID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetSlaveSAEID
+
+`func (o *DanetetsiStatus) SetSlaveSAEID(v string)`
+
+SetSlaveSAEID sets SlaveSAEID field to given value.
+
+### HasSlaveSAEID
+
+`func (o *DanetetsiStatus) HasSlaveSAEID() bool`
+
+HasSlaveSAEID returns a boolean if a field has been set.
+
+### GetKeySize
+
+`func (o *DanetetsiStatus) GetKeySize() string`
+
+GetKeySize returns the KeySize field if non-nil, zero value otherwise.
+
+### GetKeySizeOk
+
+`func (o *DanetetsiStatus) GetKeySizeOk() (*string, bool)`
+
+GetKeySizeOk returns a tuple with the KeySize field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeySize
+
+`func (o *DanetetsiStatus) SetKeySize(v string)`
+
+SetKeySize sets KeySize field to given value.
+
+### HasKeySize
+
+`func (o *DanetetsiStatus) HasKeySize() bool`
+
+HasKeySize returns a boolean if a field has been set.
+
+### GetStoredKeyCount
+
+`func (o *DanetetsiStatus) GetStoredKeyCount() string`
+
+GetStoredKeyCount returns the StoredKeyCount field if non-nil, zero value otherwise.
+
+### GetStoredKeyCountOk
+
+`func (o *DanetetsiStatus) GetStoredKeyCountOk() (*string, bool)`
+
+GetStoredKeyCountOk returns a tuple with the StoredKeyCount field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetStoredKeyCount
+
+`func (o *DanetetsiStatus) SetStoredKeyCount(v string)`
+
+SetStoredKeyCount sets StoredKeyCount field to given value.
+
+### HasStoredKeyCount
+
+`func (o *DanetetsiStatus) HasStoredKeyCount() bool`
+
+HasStoredKeyCount returns a boolean if a field has been set.
+
+### GetMaxKeyCount
+
+`func (o *DanetetsiStatus) GetMaxKeyCount() string`
+
+GetMaxKeyCount returns the MaxKeyCount field if non-nil, zero value otherwise.
+
+### GetMaxKeyCountOk
+
+`func (o *DanetetsiStatus) GetMaxKeyCountOk() (*string, bool)`
+
+GetMaxKeyCountOk returns a tuple with the MaxKeyCount field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMaxKeyCount
+
+`func (o *DanetetsiStatus) SetMaxKeyCount(v string)`
+
+SetMaxKeyCount sets MaxKeyCount field to given value.
+
+### HasMaxKeyCount
+
+`func (o *DanetetsiStatus) HasMaxKeyCount() bool`
+
+HasMaxKeyCount returns a boolean if a field has been set.
+
+### GetMaxKeyPerRequest
+
+`func (o *DanetetsiStatus) GetMaxKeyPerRequest() string`
+
+GetMaxKeyPerRequest returns the MaxKeyPerRequest field if non-nil, zero value otherwise.
+
+### GetMaxKeyPerRequestOk
+
+`func (o *DanetetsiStatus) GetMaxKeyPerRequestOk() (*string, bool)`
+
+GetMaxKeyPerRequestOk returns a tuple with the MaxKeyPerRequest field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMaxKeyPerRequest
+
+`func (o *DanetetsiStatus) SetMaxKeyPerRequest(v string)`
+
+SetMaxKeyPerRequest sets MaxKeyPerRequest field to given value.
+
+### HasMaxKeyPerRequest
+
+`func (o *DanetetsiStatus) HasMaxKeyPerRequest() bool`
+
+HasMaxKeyPerRequest returns a boolean if a field has been set.
+
+### GetMaxKeySize
+
+`func (o *DanetetsiStatus) GetMaxKeySize() string`
+
+GetMaxKeySize returns the MaxKeySize field if non-nil, zero value otherwise.
+
+### GetMaxKeySizeOk
+
+`func (o *DanetetsiStatus) GetMaxKeySizeOk() (*string, bool)`
+
+GetMaxKeySizeOk returns a tuple with the MaxKeySize field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMaxKeySize
+
+`func (o *DanetetsiStatus) SetMaxKeySize(v string)`
+
+SetMaxKeySize sets MaxKeySize field to given value.
+
+### HasMaxKeySize
+
+`func (o *DanetetsiStatus) HasMaxKeySize() bool`
+
+HasMaxKeySize returns a boolean if a field has been set.
+
+### GetMinKeySize
+
+`func (o *DanetetsiStatus) GetMinKeySize() string`
+
+GetMinKeySize returns the MinKeySize field if non-nil, zero value otherwise.
+
+### GetMinKeySizeOk
+
+`func (o *DanetetsiStatus) GetMinKeySizeOk() (*string, bool)`
+
+GetMinKeySizeOk returns a tuple with the MinKeySize field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMinKeySize
+
+`func (o *DanetetsiStatus) SetMinKeySize(v string)`
+
+SetMinKeySize sets MinKeySize field to given value.
+
+### HasMinKeySize
+
+`func (o *DanetetsiStatus) HasMinKeySize() bool`
+
+HasMinKeySize returns a boolean if a field has been set.
+
+### GetMaxSAEIDCount
+
+`func (o *DanetetsiStatus) GetMaxSAEIDCount() string`
+
+GetMaxSAEIDCount returns the MaxSAEIDCount field if non-nil, zero value otherwise.
+
+### GetMaxSAEIDCountOk
+
+`func (o *DanetetsiStatus) GetMaxSAEIDCountOk() (*string, bool)`
+
+GetMaxSAEIDCountOk returns a tuple with the MaxSAEIDCount field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMaxSAEIDCount
+
+`func (o *DanetetsiStatus) SetMaxSAEIDCount(v string)`
+
+SetMaxSAEIDCount sets MaxSAEIDCount field to given value.
+
+### HasMaxSAEIDCount
+
+`func (o *DanetetsiStatus) HasMaxSAEIDCount() bool`
+
+HasMaxSAEIDCount returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/ETSI14ServiceAPI.md b/api/go/rest/etsi/docs/ETSI14ServiceAPI.md
new file mode 100644
index 0000000000000000000000000000000000000000..5d5e9e16911d6c4ad9bd75087603f1863a2977de
--- /dev/null
+++ b/api/go/rest/etsi/docs/ETSI14ServiceAPI.md
@@ -0,0 +1,228 @@
+# \ETSI14ServiceAPI
+
+All URIs are relative to *http://localhost*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**ETSI14ServiceGetKey**](ETSI14ServiceAPI.md#ETSI14ServiceGetKey) | **Post** /{KMEHostname}/api/v1/keys/{slaveSAEID}/enc_keys | Returns Key container data from the KME to the calling master SAE.  Key container data contains one or more keys. The calling master SAE may supply  Key request data to specify the requirement on Key container data. The slave SAE  specified by the slave_SAE_ID parameter may subsequently request matching keys  from a remote KME using key_ID identifiers from the returned Key container.
+[**ETSI14ServiceGetKeyWithIDs**](ETSI14ServiceAPI.md#ETSI14ServiceGetKeyWithIDs) | **Post** /{KMEHostname}/api/v1/keys/{masterSAEID}/dec_keys | Returns Key container from the KME to the calling slave SAE.  Key container contains keys matching those previously delivered to a remote master SAE based on the Key IDs supplied from the remote master SAE in response to its call to Get key. The KME shall reject the request with a 401 HTTP status code if the SAE ID of the requestor  was not an SAE ID supplied to the \&quot;Get key\&quot; method each time it was called resulting in the return of any of the Key IDs being requested.
+[**ETSI14ServiceGetStatus**](ETSI14ServiceAPI.md#ETSI14ServiceGetStatus) | **Get** /{KMEHostname}/api/v1/keys/{slaveSAEID}/status | Returns Status from a KME to the calling SAE.  Status contains information on keys available to be requested  by a master SAE for a specified slave SAE.
+
+
+
+## ETSI14ServiceGetKey
+
+> EtsiGetKeyResponse ETSI14ServiceGetKey(ctx, kMEHostname, slaveSAEID).Body(body).Execute()
+
+Returns Key container data from the KME to the calling master SAE.  Key container data contains one or more keys. The calling master SAE may supply  Key request data to specify the requirement on Key container data. The slave SAE  specified by the slave_SAE_ID parameter may subsequently request matching keys  from a remote KME using key_ID identifiers from the returned Key container.
+
+### Example
+
+```go
+package main
+
+import (
+    "context"
+    "fmt"
+    "os"
+    openapiclient "code.fbi.h-da.de/danet/ekms/api/go/rest/etsi"
+)
+
+func main() {
+    kMEHostname := "kMEHostname_example" // string | 
+    slaveSAEID := "slaveSAEID_example" // string | 
+    body := *openapiclient.NewETSI14ServiceGetKeyRequest() // ETSI14ServiceGetKeyRequest | 
+
+    configuration := openapiclient.NewConfiguration()
+    apiClient := openapiclient.NewAPIClient(configuration)
+    resp, r, err := apiClient.ETSI14ServiceAPI.ETSI14ServiceGetKey(context.Background(), kMEHostname, slaveSAEID).Body(body).Execute()
+    if err != nil {
+        fmt.Fprintf(os.Stderr, "Error when calling `ETSI14ServiceAPI.ETSI14ServiceGetKey``: %v\n", err)
+        fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
+    }
+    // response from `ETSI14ServiceGetKey`: EtsiGetKeyResponse
+    fmt.Fprintf(os.Stdout, "Response from `ETSI14ServiceAPI.ETSI14ServiceGetKey`: %v\n", resp)
+}
+```
+
+### Path Parameters
+
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+**kMEHostname** | **string** |  | 
+**slaveSAEID** | **string** |  | 
+
+### Other Parameters
+
+Other parameters are passed through a pointer to a apiETSI14ServiceGetKeyRequest struct via the builder pattern
+
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+
+
+ **body** | [**ETSI14ServiceGetKeyRequest**](ETSI14ServiceGetKeyRequest.md) |  | 
+
+### Return type
+
+[**EtsiGetKeyResponse**](EtsiGetKeyResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints)
+[[Back to Model list]](../README.md#documentation-for-models)
+[[Back to README]](../README.md)
+
+
+## ETSI14ServiceGetKeyWithIDs
+
+> EtsiGetKeyWithIDsResponse ETSI14ServiceGetKeyWithIDs(ctx, kMEHostname, masterSAEID).Body(body).Execute()
+
+Returns Key container from the KME to the calling slave SAE.  Key container contains keys matching those previously delivered to a remote master SAE based on the Key IDs supplied from the remote master SAE in response to its call to Get key. The KME shall reject the request with a 401 HTTP status code if the SAE ID of the requestor  was not an SAE ID supplied to the \"Get key\" method each time it was called resulting in the return of any of the Key IDs being requested.
+
+### Example
+
+```go
+package main
+
+import (
+    "context"
+    "fmt"
+    "os"
+    openapiclient "code.fbi.h-da.de/danet/ekms/api/go/rest/etsi"
+)
+
+func main() {
+    kMEHostname := "kMEHostname_example" // string | 
+    masterSAEID := "masterSAEID_example" // string | 
+    body := *openapiclient.NewETSI14ServiceGetKeyWithIDsRequest() // ETSI14ServiceGetKeyWithIDsRequest | 
+
+    configuration := openapiclient.NewConfiguration()
+    apiClient := openapiclient.NewAPIClient(configuration)
+    resp, r, err := apiClient.ETSI14ServiceAPI.ETSI14ServiceGetKeyWithIDs(context.Background(), kMEHostname, masterSAEID).Body(body).Execute()
+    if err != nil {
+        fmt.Fprintf(os.Stderr, "Error when calling `ETSI14ServiceAPI.ETSI14ServiceGetKeyWithIDs``: %v\n", err)
+        fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
+    }
+    // response from `ETSI14ServiceGetKeyWithIDs`: EtsiGetKeyWithIDsResponse
+    fmt.Fprintf(os.Stdout, "Response from `ETSI14ServiceAPI.ETSI14ServiceGetKeyWithIDs`: %v\n", resp)
+}
+```
+
+### Path Parameters
+
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+**kMEHostname** | **string** |  | 
+**masterSAEID** | **string** |  | 
+
+### Other Parameters
+
+Other parameters are passed through a pointer to a apiETSI14ServiceGetKeyWithIDsRequest struct via the builder pattern
+
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+
+
+ **body** | [**ETSI14ServiceGetKeyWithIDsRequest**](ETSI14ServiceGetKeyWithIDsRequest.md) |  | 
+
+### Return type
+
+[**EtsiGetKeyWithIDsResponse**](EtsiGetKeyWithIDsResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: application/json
+- **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints)
+[[Back to Model list]](../README.md#documentation-for-models)
+[[Back to README]](../README.md)
+
+
+## ETSI14ServiceGetStatus
+
+> EtsiGetStatusResponse ETSI14ServiceGetStatus(ctx, kMEHostname, slaveSAEID).Execute()
+
+Returns Status from a KME to the calling SAE.  Status contains information on keys available to be requested  by a master SAE for a specified slave SAE.
+
+### Example
+
+```go
+package main
+
+import (
+    "context"
+    "fmt"
+    "os"
+    openapiclient "code.fbi.h-da.de/danet/ekms/api/go/rest/etsi"
+)
+
+func main() {
+    kMEHostname := "kMEHostname_example" // string | 
+    slaveSAEID := "slaveSAEID_example" // string | 
+
+    configuration := openapiclient.NewConfiguration()
+    apiClient := openapiclient.NewAPIClient(configuration)
+    resp, r, err := apiClient.ETSI14ServiceAPI.ETSI14ServiceGetStatus(context.Background(), kMEHostname, slaveSAEID).Execute()
+    if err != nil {
+        fmt.Fprintf(os.Stderr, "Error when calling `ETSI14ServiceAPI.ETSI14ServiceGetStatus``: %v\n", err)
+        fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
+    }
+    // response from `ETSI14ServiceGetStatus`: EtsiGetStatusResponse
+    fmt.Fprintf(os.Stdout, "Response from `ETSI14ServiceAPI.ETSI14ServiceGetStatus`: %v\n", resp)
+}
+```
+
+### Path Parameters
+
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+**ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+**kMEHostname** | **string** |  | 
+**slaveSAEID** | **string** |  | 
+
+### Other Parameters
+
+Other parameters are passed through a pointer to a apiETSI14ServiceGetStatusRequest struct via the builder pattern
+
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+
+
+
+### Return type
+
+[**EtsiGetStatusResponse**](EtsiGetStatusResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints)
+[[Back to Model list]](../README.md#documentation-for-models)
+[[Back to README]](../README.md)
+
diff --git a/api/go/rest/etsi/docs/ETSI14ServiceGetKeyRequest.md b/api/go/rest/etsi/docs/ETSI14ServiceGetKeyRequest.md
new file mode 100644
index 0000000000000000000000000000000000000000..4da2a873f6da69fe446f897486e05bc448747531
--- /dev/null
+++ b/api/go/rest/etsi/docs/ETSI14ServiceGetKeyRequest.md
@@ -0,0 +1,56 @@
+# ETSI14ServiceGetKeyRequest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**KeyRequest** | Pointer to [**EtsiKeyRequest**](EtsiKeyRequest.md) |  | [optional] 
+
+## Methods
+
+### NewETSI14ServiceGetKeyRequest
+
+`func NewETSI14ServiceGetKeyRequest() *ETSI14ServiceGetKeyRequest`
+
+NewETSI14ServiceGetKeyRequest instantiates a new ETSI14ServiceGetKeyRequest object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewETSI14ServiceGetKeyRequestWithDefaults
+
+`func NewETSI14ServiceGetKeyRequestWithDefaults() *ETSI14ServiceGetKeyRequest`
+
+NewETSI14ServiceGetKeyRequestWithDefaults instantiates a new ETSI14ServiceGetKeyRequest object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetKeyRequest
+
+`func (o *ETSI14ServiceGetKeyRequest) GetKeyRequest() EtsiKeyRequest`
+
+GetKeyRequest returns the KeyRequest field if non-nil, zero value otherwise.
+
+### GetKeyRequestOk
+
+`func (o *ETSI14ServiceGetKeyRequest) GetKeyRequestOk() (*EtsiKeyRequest, bool)`
+
+GetKeyRequestOk returns a tuple with the KeyRequest field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyRequest
+
+`func (o *ETSI14ServiceGetKeyRequest) SetKeyRequest(v EtsiKeyRequest)`
+
+SetKeyRequest sets KeyRequest field to given value.
+
+### HasKeyRequest
+
+`func (o *ETSI14ServiceGetKeyRequest) HasKeyRequest() bool`
+
+HasKeyRequest returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/ETSI14ServiceGetKeyWithIDsRequest.md b/api/go/rest/etsi/docs/ETSI14ServiceGetKeyWithIDsRequest.md
new file mode 100644
index 0000000000000000000000000000000000000000..a539c504f99ee7a8c60a7f2ff109f0ad9e475b3a
--- /dev/null
+++ b/api/go/rest/etsi/docs/ETSI14ServiceGetKeyWithIDsRequest.md
@@ -0,0 +1,82 @@
+# ETSI14ServiceGetKeyWithIDsRequest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SlaveSAEID** | Pointer to **string** |  | [optional] 
+**KeyID** | Pointer to [**[]EtsiKeyID**](EtsiKeyID.md) |  | [optional] 
+
+## Methods
+
+### NewETSI14ServiceGetKeyWithIDsRequest
+
+`func NewETSI14ServiceGetKeyWithIDsRequest() *ETSI14ServiceGetKeyWithIDsRequest`
+
+NewETSI14ServiceGetKeyWithIDsRequest instantiates a new ETSI14ServiceGetKeyWithIDsRequest object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewETSI14ServiceGetKeyWithIDsRequestWithDefaults
+
+`func NewETSI14ServiceGetKeyWithIDsRequestWithDefaults() *ETSI14ServiceGetKeyWithIDsRequest`
+
+NewETSI14ServiceGetKeyWithIDsRequestWithDefaults instantiates a new ETSI14ServiceGetKeyWithIDsRequest object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetSlaveSAEID
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) GetSlaveSAEID() string`
+
+GetSlaveSAEID returns the SlaveSAEID field if non-nil, zero value otherwise.
+
+### GetSlaveSAEIDOk
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) GetSlaveSAEIDOk() (*string, bool)`
+
+GetSlaveSAEIDOk returns a tuple with the SlaveSAEID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetSlaveSAEID
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) SetSlaveSAEID(v string)`
+
+SetSlaveSAEID sets SlaveSAEID field to given value.
+
+### HasSlaveSAEID
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) HasSlaveSAEID() bool`
+
+HasSlaveSAEID returns a boolean if a field has been set.
+
+### GetKeyID
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) GetKeyID() []EtsiKeyID`
+
+GetKeyID returns the KeyID field if non-nil, zero value otherwise.
+
+### GetKeyIDOk
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) GetKeyIDOk() (*[]EtsiKeyID, bool)`
+
+GetKeyIDOk returns a tuple with the KeyID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyID
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) SetKeyID(v []EtsiKeyID)`
+
+SetKeyID sets KeyID field to given value.
+
+### HasKeyID
+
+`func (o *ETSI14ServiceGetKeyWithIDsRequest) HasKeyID() bool`
+
+HasKeyID returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiError.md b/api/go/rest/etsi/docs/EtsiError.md
new file mode 100644
index 0000000000000000000000000000000000000000..33a6986da32a30f0ece7e17bc4710821750b742b
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiError.md
@@ -0,0 +1,82 @@
+# EtsiError
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Message** | Pointer to **string** |  | [optional] 
+**Details** | Pointer to [**map[string]EtsiListOfDetails**](EtsiListOfDetails.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiError
+
+`func NewEtsiError() *EtsiError`
+
+NewEtsiError instantiates a new EtsiError object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiErrorWithDefaults
+
+`func NewEtsiErrorWithDefaults() *EtsiError`
+
+NewEtsiErrorWithDefaults instantiates a new EtsiError object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetMessage
+
+`func (o *EtsiError) GetMessage() string`
+
+GetMessage returns the Message field if non-nil, zero value otherwise.
+
+### GetMessageOk
+
+`func (o *EtsiError) GetMessageOk() (*string, bool)`
+
+GetMessageOk returns a tuple with the Message field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMessage
+
+`func (o *EtsiError) SetMessage(v string)`
+
+SetMessage sets Message field to given value.
+
+### HasMessage
+
+`func (o *EtsiError) HasMessage() bool`
+
+HasMessage returns a boolean if a field has been set.
+
+### GetDetails
+
+`func (o *EtsiError) GetDetails() map[string]EtsiListOfDetails`
+
+GetDetails returns the Details field if non-nil, zero value otherwise.
+
+### GetDetailsOk
+
+`func (o *EtsiError) GetDetailsOk() (*map[string]EtsiListOfDetails, bool)`
+
+GetDetailsOk returns a tuple with the Details field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetDetails
+
+`func (o *EtsiError) SetDetails(v map[string]EtsiListOfDetails)`
+
+SetDetails sets Details field to given value.
+
+### HasDetails
+
+`func (o *EtsiError) HasDetails() bool`
+
+HasDetails returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiExtensionMandatory.md b/api/go/rest/etsi/docs/EtsiExtensionMandatory.md
new file mode 100644
index 0000000000000000000000000000000000000000..38c59b31687006218329cb05c65aa6ada2989eda
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiExtensionMandatory.md
@@ -0,0 +1,56 @@
+# EtsiExtensionMandatory
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**ExtensionMandatory** | Pointer to [**map[string]ProtobufAny**](ProtobufAny.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiExtensionMandatory
+
+`func NewEtsiExtensionMandatory() *EtsiExtensionMandatory`
+
+NewEtsiExtensionMandatory instantiates a new EtsiExtensionMandatory object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiExtensionMandatoryWithDefaults
+
+`func NewEtsiExtensionMandatoryWithDefaults() *EtsiExtensionMandatory`
+
+NewEtsiExtensionMandatoryWithDefaults instantiates a new EtsiExtensionMandatory object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetExtensionMandatory
+
+`func (o *EtsiExtensionMandatory) GetExtensionMandatory() map[string]ProtobufAny`
+
+GetExtensionMandatory returns the ExtensionMandatory field if non-nil, zero value otherwise.
+
+### GetExtensionMandatoryOk
+
+`func (o *EtsiExtensionMandatory) GetExtensionMandatoryOk() (*map[string]ProtobufAny, bool)`
+
+GetExtensionMandatoryOk returns a tuple with the ExtensionMandatory field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetExtensionMandatory
+
+`func (o *EtsiExtensionMandatory) SetExtensionMandatory(v map[string]ProtobufAny)`
+
+SetExtensionMandatory sets ExtensionMandatory field to given value.
+
+### HasExtensionMandatory
+
+`func (o *EtsiExtensionMandatory) HasExtensionMandatory() bool`
+
+HasExtensionMandatory returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiExtensionOptional.md b/api/go/rest/etsi/docs/EtsiExtensionOptional.md
new file mode 100644
index 0000000000000000000000000000000000000000..1eb4ad6f48f46f69ae501617bfdd7f5b4bfa4a23
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiExtensionOptional.md
@@ -0,0 +1,56 @@
+# EtsiExtensionOptional
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**ExtensionOptional** | Pointer to [**map[string]ProtobufAny**](ProtobufAny.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiExtensionOptional
+
+`func NewEtsiExtensionOptional() *EtsiExtensionOptional`
+
+NewEtsiExtensionOptional instantiates a new EtsiExtensionOptional object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiExtensionOptionalWithDefaults
+
+`func NewEtsiExtensionOptionalWithDefaults() *EtsiExtensionOptional`
+
+NewEtsiExtensionOptionalWithDefaults instantiates a new EtsiExtensionOptional object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetExtensionOptional
+
+`func (o *EtsiExtensionOptional) GetExtensionOptional() map[string]ProtobufAny`
+
+GetExtensionOptional returns the ExtensionOptional field if non-nil, zero value otherwise.
+
+### GetExtensionOptionalOk
+
+`func (o *EtsiExtensionOptional) GetExtensionOptionalOk() (*map[string]ProtobufAny, bool)`
+
+GetExtensionOptionalOk returns a tuple with the ExtensionOptional field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetExtensionOptional
+
+`func (o *EtsiExtensionOptional) SetExtensionOptional(v map[string]ProtobufAny)`
+
+SetExtensionOptional sets ExtensionOptional field to given value.
+
+### HasExtensionOptional
+
+`func (o *EtsiExtensionOptional) HasExtensionOptional() bool`
+
+HasExtensionOptional returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiGetKeyResponse.md b/api/go/rest/etsi/docs/EtsiGetKeyResponse.md
new file mode 100644
index 0000000000000000000000000000000000000000..81874008ce3d7090ab2dbae7a2d882c323c4852a
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiGetKeyResponse.md
@@ -0,0 +1,108 @@
+# EtsiGetKeyResponse
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Timestamp** | Pointer to **string** |  | [optional] 
+**KeyContainer** | Pointer to [**EtsiKeyContainer**](EtsiKeyContainer.md) |  | [optional] 
+**Error** | Pointer to [**EtsiError**](EtsiError.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiGetKeyResponse
+
+`func NewEtsiGetKeyResponse() *EtsiGetKeyResponse`
+
+NewEtsiGetKeyResponse instantiates a new EtsiGetKeyResponse object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiGetKeyResponseWithDefaults
+
+`func NewEtsiGetKeyResponseWithDefaults() *EtsiGetKeyResponse`
+
+NewEtsiGetKeyResponseWithDefaults instantiates a new EtsiGetKeyResponse object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetTimestamp
+
+`func (o *EtsiGetKeyResponse) GetTimestamp() string`
+
+GetTimestamp returns the Timestamp field if non-nil, zero value otherwise.
+
+### GetTimestampOk
+
+`func (o *EtsiGetKeyResponse) GetTimestampOk() (*string, bool)`
+
+GetTimestampOk returns a tuple with the Timestamp field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetTimestamp
+
+`func (o *EtsiGetKeyResponse) SetTimestamp(v string)`
+
+SetTimestamp sets Timestamp field to given value.
+
+### HasTimestamp
+
+`func (o *EtsiGetKeyResponse) HasTimestamp() bool`
+
+HasTimestamp returns a boolean if a field has been set.
+
+### GetKeyContainer
+
+`func (o *EtsiGetKeyResponse) GetKeyContainer() EtsiKeyContainer`
+
+GetKeyContainer returns the KeyContainer field if non-nil, zero value otherwise.
+
+### GetKeyContainerOk
+
+`func (o *EtsiGetKeyResponse) GetKeyContainerOk() (*EtsiKeyContainer, bool)`
+
+GetKeyContainerOk returns a tuple with the KeyContainer field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyContainer
+
+`func (o *EtsiGetKeyResponse) SetKeyContainer(v EtsiKeyContainer)`
+
+SetKeyContainer sets KeyContainer field to given value.
+
+### HasKeyContainer
+
+`func (o *EtsiGetKeyResponse) HasKeyContainer() bool`
+
+HasKeyContainer returns a boolean if a field has been set.
+
+### GetError
+
+`func (o *EtsiGetKeyResponse) GetError() EtsiError`
+
+GetError returns the Error field if non-nil, zero value otherwise.
+
+### GetErrorOk
+
+`func (o *EtsiGetKeyResponse) GetErrorOk() (*EtsiError, bool)`
+
+GetErrorOk returns a tuple with the Error field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetError
+
+`func (o *EtsiGetKeyResponse) SetError(v EtsiError)`
+
+SetError sets Error field to given value.
+
+### HasError
+
+`func (o *EtsiGetKeyResponse) HasError() bool`
+
+HasError returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiGetKeyWithIDsResponse.md b/api/go/rest/etsi/docs/EtsiGetKeyWithIDsResponse.md
new file mode 100644
index 0000000000000000000000000000000000000000..1e8bd047e38b4f25e562ebd6011ccaf997f0f890
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiGetKeyWithIDsResponse.md
@@ -0,0 +1,108 @@
+# EtsiGetKeyWithIDsResponse
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Timestamp** | Pointer to **string** |  | [optional] 
+**KeyContainer** | Pointer to [**EtsiKeyContainer**](EtsiKeyContainer.md) |  | [optional] 
+**Error** | Pointer to [**EtsiError**](EtsiError.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiGetKeyWithIDsResponse
+
+`func NewEtsiGetKeyWithIDsResponse() *EtsiGetKeyWithIDsResponse`
+
+NewEtsiGetKeyWithIDsResponse instantiates a new EtsiGetKeyWithIDsResponse object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiGetKeyWithIDsResponseWithDefaults
+
+`func NewEtsiGetKeyWithIDsResponseWithDefaults() *EtsiGetKeyWithIDsResponse`
+
+NewEtsiGetKeyWithIDsResponseWithDefaults instantiates a new EtsiGetKeyWithIDsResponse object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetTimestamp
+
+`func (o *EtsiGetKeyWithIDsResponse) GetTimestamp() string`
+
+GetTimestamp returns the Timestamp field if non-nil, zero value otherwise.
+
+### GetTimestampOk
+
+`func (o *EtsiGetKeyWithIDsResponse) GetTimestampOk() (*string, bool)`
+
+GetTimestampOk returns a tuple with the Timestamp field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetTimestamp
+
+`func (o *EtsiGetKeyWithIDsResponse) SetTimestamp(v string)`
+
+SetTimestamp sets Timestamp field to given value.
+
+### HasTimestamp
+
+`func (o *EtsiGetKeyWithIDsResponse) HasTimestamp() bool`
+
+HasTimestamp returns a boolean if a field has been set.
+
+### GetKeyContainer
+
+`func (o *EtsiGetKeyWithIDsResponse) GetKeyContainer() EtsiKeyContainer`
+
+GetKeyContainer returns the KeyContainer field if non-nil, zero value otherwise.
+
+### GetKeyContainerOk
+
+`func (o *EtsiGetKeyWithIDsResponse) GetKeyContainerOk() (*EtsiKeyContainer, bool)`
+
+GetKeyContainerOk returns a tuple with the KeyContainer field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyContainer
+
+`func (o *EtsiGetKeyWithIDsResponse) SetKeyContainer(v EtsiKeyContainer)`
+
+SetKeyContainer sets KeyContainer field to given value.
+
+### HasKeyContainer
+
+`func (o *EtsiGetKeyWithIDsResponse) HasKeyContainer() bool`
+
+HasKeyContainer returns a boolean if a field has been set.
+
+### GetError
+
+`func (o *EtsiGetKeyWithIDsResponse) GetError() EtsiError`
+
+GetError returns the Error field if non-nil, zero value otherwise.
+
+### GetErrorOk
+
+`func (o *EtsiGetKeyWithIDsResponse) GetErrorOk() (*EtsiError, bool)`
+
+GetErrorOk returns a tuple with the Error field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetError
+
+`func (o *EtsiGetKeyWithIDsResponse) SetError(v EtsiError)`
+
+SetError sets Error field to given value.
+
+### HasError
+
+`func (o *EtsiGetKeyWithIDsResponse) HasError() bool`
+
+HasError returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiGetStatusResponse.md b/api/go/rest/etsi/docs/EtsiGetStatusResponse.md
new file mode 100644
index 0000000000000000000000000000000000000000..98a371db7c5a56378741b27ad60ad9da158bc476
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiGetStatusResponse.md
@@ -0,0 +1,108 @@
+# EtsiGetStatusResponse
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Timestamp** | Pointer to **string** |  | [optional] 
+**Status** | Pointer to [**DanetetsiStatus**](DanetetsiStatus.md) |  | [optional] 
+**Error** | Pointer to [**EtsiError**](EtsiError.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiGetStatusResponse
+
+`func NewEtsiGetStatusResponse() *EtsiGetStatusResponse`
+
+NewEtsiGetStatusResponse instantiates a new EtsiGetStatusResponse object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiGetStatusResponseWithDefaults
+
+`func NewEtsiGetStatusResponseWithDefaults() *EtsiGetStatusResponse`
+
+NewEtsiGetStatusResponseWithDefaults instantiates a new EtsiGetStatusResponse object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetTimestamp
+
+`func (o *EtsiGetStatusResponse) GetTimestamp() string`
+
+GetTimestamp returns the Timestamp field if non-nil, zero value otherwise.
+
+### GetTimestampOk
+
+`func (o *EtsiGetStatusResponse) GetTimestampOk() (*string, bool)`
+
+GetTimestampOk returns a tuple with the Timestamp field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetTimestamp
+
+`func (o *EtsiGetStatusResponse) SetTimestamp(v string)`
+
+SetTimestamp sets Timestamp field to given value.
+
+### HasTimestamp
+
+`func (o *EtsiGetStatusResponse) HasTimestamp() bool`
+
+HasTimestamp returns a boolean if a field has been set.
+
+### GetStatus
+
+`func (o *EtsiGetStatusResponse) GetStatus() DanetetsiStatus`
+
+GetStatus returns the Status field if non-nil, zero value otherwise.
+
+### GetStatusOk
+
+`func (o *EtsiGetStatusResponse) GetStatusOk() (*DanetetsiStatus, bool)`
+
+GetStatusOk returns a tuple with the Status field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetStatus
+
+`func (o *EtsiGetStatusResponse) SetStatus(v DanetetsiStatus)`
+
+SetStatus sets Status field to given value.
+
+### HasStatus
+
+`func (o *EtsiGetStatusResponse) HasStatus() bool`
+
+HasStatus returns a boolean if a field has been set.
+
+### GetError
+
+`func (o *EtsiGetStatusResponse) GetError() EtsiError`
+
+GetError returns the Error field if non-nil, zero value otherwise.
+
+### GetErrorOk
+
+`func (o *EtsiGetStatusResponse) GetErrorOk() (*EtsiError, bool)`
+
+GetErrorOk returns a tuple with the Error field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetError
+
+`func (o *EtsiGetStatusResponse) SetError(v EtsiError)`
+
+SetError sets Error field to given value.
+
+### HasError
+
+`func (o *EtsiGetStatusResponse) HasError() bool`
+
+HasError returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiKey.md b/api/go/rest/etsi/docs/EtsiKey.md
new file mode 100644
index 0000000000000000000000000000000000000000..696511105df103655d882e06d2b8fb4e3ac8d2bd
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiKey.md
@@ -0,0 +1,134 @@
+# EtsiKey
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**KeyID** | Pointer to **string** |  | [optional] 
+**KeyIDExtension** | Pointer to **map[string]interface{}** | optional for future use. | [optional] 
+**Key** | Pointer to **string** |  | [optional] 
+**KeyExtension** | Pointer to [**ProtobufAny**](ProtobufAny.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiKey
+
+`func NewEtsiKey() *EtsiKey`
+
+NewEtsiKey instantiates a new EtsiKey object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiKeyWithDefaults
+
+`func NewEtsiKeyWithDefaults() *EtsiKey`
+
+NewEtsiKeyWithDefaults instantiates a new EtsiKey object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetKeyID
+
+`func (o *EtsiKey) GetKeyID() string`
+
+GetKeyID returns the KeyID field if non-nil, zero value otherwise.
+
+### GetKeyIDOk
+
+`func (o *EtsiKey) GetKeyIDOk() (*string, bool)`
+
+GetKeyIDOk returns a tuple with the KeyID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyID
+
+`func (o *EtsiKey) SetKeyID(v string)`
+
+SetKeyID sets KeyID field to given value.
+
+### HasKeyID
+
+`func (o *EtsiKey) HasKeyID() bool`
+
+HasKeyID returns a boolean if a field has been set.
+
+### GetKeyIDExtension
+
+`func (o *EtsiKey) GetKeyIDExtension() map[string]interface{}`
+
+GetKeyIDExtension returns the KeyIDExtension field if non-nil, zero value otherwise.
+
+### GetKeyIDExtensionOk
+
+`func (o *EtsiKey) GetKeyIDExtensionOk() (*map[string]interface{}, bool)`
+
+GetKeyIDExtensionOk returns a tuple with the KeyIDExtension field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyIDExtension
+
+`func (o *EtsiKey) SetKeyIDExtension(v map[string]interface{})`
+
+SetKeyIDExtension sets KeyIDExtension field to given value.
+
+### HasKeyIDExtension
+
+`func (o *EtsiKey) HasKeyIDExtension() bool`
+
+HasKeyIDExtension returns a boolean if a field has been set.
+
+### GetKey
+
+`func (o *EtsiKey) GetKey() string`
+
+GetKey returns the Key field if non-nil, zero value otherwise.
+
+### GetKeyOk
+
+`func (o *EtsiKey) GetKeyOk() (*string, bool)`
+
+GetKeyOk returns a tuple with the Key field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKey
+
+`func (o *EtsiKey) SetKey(v string)`
+
+SetKey sets Key field to given value.
+
+### HasKey
+
+`func (o *EtsiKey) HasKey() bool`
+
+HasKey returns a boolean if a field has been set.
+
+### GetKeyExtension
+
+`func (o *EtsiKey) GetKeyExtension() ProtobufAny`
+
+GetKeyExtension returns the KeyExtension field if non-nil, zero value otherwise.
+
+### GetKeyExtensionOk
+
+`func (o *EtsiKey) GetKeyExtensionOk() (*ProtobufAny, bool)`
+
+GetKeyExtensionOk returns a tuple with the KeyExtension field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyExtension
+
+`func (o *EtsiKey) SetKeyExtension(v ProtobufAny)`
+
+SetKeyExtension sets KeyExtension field to given value.
+
+### HasKeyExtension
+
+`func (o *EtsiKey) HasKeyExtension() bool`
+
+HasKeyExtension returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiKeyContainer.md b/api/go/rest/etsi/docs/EtsiKeyContainer.md
new file mode 100644
index 0000000000000000000000000000000000000000..bfdcecc7f8f608eb528a6b12fc5b137315f81acf
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiKeyContainer.md
@@ -0,0 +1,82 @@
+# EtsiKeyContainer
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Key** | Pointer to [**[]EtsiKey**](EtsiKey.md) |  | [optional] 
+**KeyContainerExtension** | Pointer to [**ProtobufAny**](ProtobufAny.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiKeyContainer
+
+`func NewEtsiKeyContainer() *EtsiKeyContainer`
+
+NewEtsiKeyContainer instantiates a new EtsiKeyContainer object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiKeyContainerWithDefaults
+
+`func NewEtsiKeyContainerWithDefaults() *EtsiKeyContainer`
+
+NewEtsiKeyContainerWithDefaults instantiates a new EtsiKeyContainer object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetKey
+
+`func (o *EtsiKeyContainer) GetKey() []EtsiKey`
+
+GetKey returns the Key field if non-nil, zero value otherwise.
+
+### GetKeyOk
+
+`func (o *EtsiKeyContainer) GetKeyOk() (*[]EtsiKey, bool)`
+
+GetKeyOk returns a tuple with the Key field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKey
+
+`func (o *EtsiKeyContainer) SetKey(v []EtsiKey)`
+
+SetKey sets Key field to given value.
+
+### HasKey
+
+`func (o *EtsiKeyContainer) HasKey() bool`
+
+HasKey returns a boolean if a field has been set.
+
+### GetKeyContainerExtension
+
+`func (o *EtsiKeyContainer) GetKeyContainerExtension() ProtobufAny`
+
+GetKeyContainerExtension returns the KeyContainerExtension field if non-nil, zero value otherwise.
+
+### GetKeyContainerExtensionOk
+
+`func (o *EtsiKeyContainer) GetKeyContainerExtensionOk() (*ProtobufAny, bool)`
+
+GetKeyContainerExtensionOk returns a tuple with the KeyContainerExtension field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyContainerExtension
+
+`func (o *EtsiKeyContainer) SetKeyContainerExtension(v ProtobufAny)`
+
+SetKeyContainerExtension sets KeyContainerExtension field to given value.
+
+### HasKeyContainerExtension
+
+`func (o *EtsiKeyContainer) HasKeyContainerExtension() bool`
+
+HasKeyContainerExtension returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiKeyID.md b/api/go/rest/etsi/docs/EtsiKeyID.md
new file mode 100644
index 0000000000000000000000000000000000000000..4dd0e2492317b49b3c6990720757355c8396b635
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiKeyID.md
@@ -0,0 +1,82 @@
+# EtsiKeyID
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**KeyID** | Pointer to **string** |  | [optional] 
+**KeyIDExtension** | Pointer to [**ProtobufAny**](ProtobufAny.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiKeyID
+
+`func NewEtsiKeyID() *EtsiKeyID`
+
+NewEtsiKeyID instantiates a new EtsiKeyID object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiKeyIDWithDefaults
+
+`func NewEtsiKeyIDWithDefaults() *EtsiKeyID`
+
+NewEtsiKeyIDWithDefaults instantiates a new EtsiKeyID object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetKeyID
+
+`func (o *EtsiKeyID) GetKeyID() string`
+
+GetKeyID returns the KeyID field if non-nil, zero value otherwise.
+
+### GetKeyIDOk
+
+`func (o *EtsiKeyID) GetKeyIDOk() (*string, bool)`
+
+GetKeyIDOk returns a tuple with the KeyID field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyID
+
+`func (o *EtsiKeyID) SetKeyID(v string)`
+
+SetKeyID sets KeyID field to given value.
+
+### HasKeyID
+
+`func (o *EtsiKeyID) HasKeyID() bool`
+
+HasKeyID returns a boolean if a field has been set.
+
+### GetKeyIDExtension
+
+`func (o *EtsiKeyID) GetKeyIDExtension() ProtobufAny`
+
+GetKeyIDExtension returns the KeyIDExtension field if non-nil, zero value otherwise.
+
+### GetKeyIDExtensionOk
+
+`func (o *EtsiKeyID) GetKeyIDExtensionOk() (*ProtobufAny, bool)`
+
+GetKeyIDExtensionOk returns a tuple with the KeyIDExtension field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetKeyIDExtension
+
+`func (o *EtsiKeyID) SetKeyIDExtension(v ProtobufAny)`
+
+SetKeyIDExtension sets KeyIDExtension field to given value.
+
+### HasKeyIDExtension
+
+`func (o *EtsiKeyID) HasKeyIDExtension() bool`
+
+HasKeyIDExtension returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiKeyRequest.md b/api/go/rest/etsi/docs/EtsiKeyRequest.md
new file mode 100644
index 0000000000000000000000000000000000000000..461d0d023f188367d57782ee28a358a2372b9edd
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiKeyRequest.md
@@ -0,0 +1,160 @@
+# EtsiKeyRequest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Number** | Pointer to **string** |  | [optional] 
+**Size** | Pointer to **string** |  | [optional] 
+**AdditionalSlaveSAEIDs** | Pointer to **[]string** |  | [optional] 
+**ExtensionMandatory** | Pointer to [**[]EtsiExtensionMandatory**](EtsiExtensionMandatory.md) |  | [optional] 
+**ExtensionOptional** | Pointer to [**[]EtsiExtensionOptional**](EtsiExtensionOptional.md) |  | [optional] 
+
+## Methods
+
+### NewEtsiKeyRequest
+
+`func NewEtsiKeyRequest() *EtsiKeyRequest`
+
+NewEtsiKeyRequest instantiates a new EtsiKeyRequest object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiKeyRequestWithDefaults
+
+`func NewEtsiKeyRequestWithDefaults() *EtsiKeyRequest`
+
+NewEtsiKeyRequestWithDefaults instantiates a new EtsiKeyRequest object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetNumber
+
+`func (o *EtsiKeyRequest) GetNumber() string`
+
+GetNumber returns the Number field if non-nil, zero value otherwise.
+
+### GetNumberOk
+
+`func (o *EtsiKeyRequest) GetNumberOk() (*string, bool)`
+
+GetNumberOk returns a tuple with the Number field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetNumber
+
+`func (o *EtsiKeyRequest) SetNumber(v string)`
+
+SetNumber sets Number field to given value.
+
+### HasNumber
+
+`func (o *EtsiKeyRequest) HasNumber() bool`
+
+HasNumber returns a boolean if a field has been set.
+
+### GetSize
+
+`func (o *EtsiKeyRequest) GetSize() string`
+
+GetSize returns the Size field if non-nil, zero value otherwise.
+
+### GetSizeOk
+
+`func (o *EtsiKeyRequest) GetSizeOk() (*string, bool)`
+
+GetSizeOk returns a tuple with the Size field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetSize
+
+`func (o *EtsiKeyRequest) SetSize(v string)`
+
+SetSize sets Size field to given value.
+
+### HasSize
+
+`func (o *EtsiKeyRequest) HasSize() bool`
+
+HasSize returns a boolean if a field has been set.
+
+### GetAdditionalSlaveSAEIDs
+
+`func (o *EtsiKeyRequest) GetAdditionalSlaveSAEIDs() []string`
+
+GetAdditionalSlaveSAEIDs returns the AdditionalSlaveSAEIDs field if non-nil, zero value otherwise.
+
+### GetAdditionalSlaveSAEIDsOk
+
+`func (o *EtsiKeyRequest) GetAdditionalSlaveSAEIDsOk() (*[]string, bool)`
+
+GetAdditionalSlaveSAEIDsOk returns a tuple with the AdditionalSlaveSAEIDs field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetAdditionalSlaveSAEIDs
+
+`func (o *EtsiKeyRequest) SetAdditionalSlaveSAEIDs(v []string)`
+
+SetAdditionalSlaveSAEIDs sets AdditionalSlaveSAEIDs field to given value.
+
+### HasAdditionalSlaveSAEIDs
+
+`func (o *EtsiKeyRequest) HasAdditionalSlaveSAEIDs() bool`
+
+HasAdditionalSlaveSAEIDs returns a boolean if a field has been set.
+
+### GetExtensionMandatory
+
+`func (o *EtsiKeyRequest) GetExtensionMandatory() []EtsiExtensionMandatory`
+
+GetExtensionMandatory returns the ExtensionMandatory field if non-nil, zero value otherwise.
+
+### GetExtensionMandatoryOk
+
+`func (o *EtsiKeyRequest) GetExtensionMandatoryOk() (*[]EtsiExtensionMandatory, bool)`
+
+GetExtensionMandatoryOk returns a tuple with the ExtensionMandatory field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetExtensionMandatory
+
+`func (o *EtsiKeyRequest) SetExtensionMandatory(v []EtsiExtensionMandatory)`
+
+SetExtensionMandatory sets ExtensionMandatory field to given value.
+
+### HasExtensionMandatory
+
+`func (o *EtsiKeyRequest) HasExtensionMandatory() bool`
+
+HasExtensionMandatory returns a boolean if a field has been set.
+
+### GetExtensionOptional
+
+`func (o *EtsiKeyRequest) GetExtensionOptional() []EtsiExtensionOptional`
+
+GetExtensionOptional returns the ExtensionOptional field if non-nil, zero value otherwise.
+
+### GetExtensionOptionalOk
+
+`func (o *EtsiKeyRequest) GetExtensionOptionalOk() (*[]EtsiExtensionOptional, bool)`
+
+GetExtensionOptionalOk returns a tuple with the ExtensionOptional field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetExtensionOptional
+
+`func (o *EtsiKeyRequest) SetExtensionOptional(v []EtsiExtensionOptional)`
+
+SetExtensionOptional sets ExtensionOptional field to given value.
+
+### HasExtensionOptional
+
+`func (o *EtsiKeyRequest) HasExtensionOptional() bool`
+
+HasExtensionOptional returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/EtsiListOfDetails.md b/api/go/rest/etsi/docs/EtsiListOfDetails.md
new file mode 100644
index 0000000000000000000000000000000000000000..b99cb26387b66c7da420ed2a5cc30e229e020c5f
--- /dev/null
+++ b/api/go/rest/etsi/docs/EtsiListOfDetails.md
@@ -0,0 +1,56 @@
+# EtsiListOfDetails
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Details** | Pointer to **[]string** |  | [optional] 
+
+## Methods
+
+### NewEtsiListOfDetails
+
+`func NewEtsiListOfDetails() *EtsiListOfDetails`
+
+NewEtsiListOfDetails instantiates a new EtsiListOfDetails object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewEtsiListOfDetailsWithDefaults
+
+`func NewEtsiListOfDetailsWithDefaults() *EtsiListOfDetails`
+
+NewEtsiListOfDetailsWithDefaults instantiates a new EtsiListOfDetails object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetDetails
+
+`func (o *EtsiListOfDetails) GetDetails() []string`
+
+GetDetails returns the Details field if non-nil, zero value otherwise.
+
+### GetDetailsOk
+
+`func (o *EtsiListOfDetails) GetDetailsOk() (*[]string, bool)`
+
+GetDetailsOk returns a tuple with the Details field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetDetails
+
+`func (o *EtsiListOfDetails) SetDetails(v []string)`
+
+SetDetails sets Details field to given value.
+
+### HasDetails
+
+`func (o *EtsiListOfDetails) HasDetails() bool`
+
+HasDetails returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/GooglerpcStatus.md b/api/go/rest/etsi/docs/GooglerpcStatus.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ff146fc7f8a667b227ab20a4644f2f36ebd8158
--- /dev/null
+++ b/api/go/rest/etsi/docs/GooglerpcStatus.md
@@ -0,0 +1,108 @@
+# GooglerpcStatus
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Code** | Pointer to **int32** |  | [optional] 
+**Message** | Pointer to **string** |  | [optional] 
+**Details** | Pointer to [**[]ProtobufAny**](ProtobufAny.md) |  | [optional] 
+
+## Methods
+
+### NewGooglerpcStatus
+
+`func NewGooglerpcStatus() *GooglerpcStatus`
+
+NewGooglerpcStatus instantiates a new GooglerpcStatus object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewGooglerpcStatusWithDefaults
+
+`func NewGooglerpcStatusWithDefaults() *GooglerpcStatus`
+
+NewGooglerpcStatusWithDefaults instantiates a new GooglerpcStatus object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetCode
+
+`func (o *GooglerpcStatus) GetCode() int32`
+
+GetCode returns the Code field if non-nil, zero value otherwise.
+
+### GetCodeOk
+
+`func (o *GooglerpcStatus) GetCodeOk() (*int32, bool)`
+
+GetCodeOk returns a tuple with the Code field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetCode
+
+`func (o *GooglerpcStatus) SetCode(v int32)`
+
+SetCode sets Code field to given value.
+
+### HasCode
+
+`func (o *GooglerpcStatus) HasCode() bool`
+
+HasCode returns a boolean if a field has been set.
+
+### GetMessage
+
+`func (o *GooglerpcStatus) GetMessage() string`
+
+GetMessage returns the Message field if non-nil, zero value otherwise.
+
+### GetMessageOk
+
+`func (o *GooglerpcStatus) GetMessageOk() (*string, bool)`
+
+GetMessageOk returns a tuple with the Message field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetMessage
+
+`func (o *GooglerpcStatus) SetMessage(v string)`
+
+SetMessage sets Message field to given value.
+
+### HasMessage
+
+`func (o *GooglerpcStatus) HasMessage() bool`
+
+HasMessage returns a boolean if a field has been set.
+
+### GetDetails
+
+`func (o *GooglerpcStatus) GetDetails() []ProtobufAny`
+
+GetDetails returns the Details field if non-nil, zero value otherwise.
+
+### GetDetailsOk
+
+`func (o *GooglerpcStatus) GetDetailsOk() (*[]ProtobufAny, bool)`
+
+GetDetailsOk returns a tuple with the Details field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetDetails
+
+`func (o *GooglerpcStatus) SetDetails(v []ProtobufAny)`
+
+SetDetails sets Details field to given value.
+
+### HasDetails
+
+`func (o *GooglerpcStatus) HasDetails() bool`
+
+HasDetails returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/docs/ProtobufAny.md b/api/go/rest/etsi/docs/ProtobufAny.md
new file mode 100644
index 0000000000000000000000000000000000000000..9f725023ff02bea19197f5b8ab4bca38ac6c4657
--- /dev/null
+++ b/api/go/rest/etsi/docs/ProtobufAny.md
@@ -0,0 +1,56 @@
+# ProtobufAny
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Type** | Pointer to **string** | A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one \&quot;/\&quot; character. The last segment of the URL&#39;s path must represent the fully qualified name of the type (as in &#x60;path/google.protobuf.Duration&#x60;). The name should be in a canonical form (e.g., leading \&quot;.\&quot; is not accepted).  In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme &#x60;http&#x60;, &#x60;https&#x60;, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows:  * If no scheme is provided, &#x60;https&#x60; is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][]   value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the   URL, or have them precompiled into a binary to avoid any   lookup. Therefore, binary compatibility needs to be preserved   on changes to types. (Use versioned type names to manage   breaking changes.)  Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com.  Schemes other than &#x60;http&#x60;, &#x60;https&#x60; (or the empty scheme) might be used with implementation specific semantics. | [optional] 
+
+## Methods
+
+### NewProtobufAny
+
+`func NewProtobufAny() *ProtobufAny`
+
+NewProtobufAny instantiates a new ProtobufAny object
+This constructor will assign default values to properties that have it defined,
+and makes sure properties required by API are set, but the set of arguments
+will change when the set of required properties is changed
+
+### NewProtobufAnyWithDefaults
+
+`func NewProtobufAnyWithDefaults() *ProtobufAny`
+
+NewProtobufAnyWithDefaults instantiates a new ProtobufAny object
+This constructor will only assign default values to properties that have it defined,
+but it doesn't guarantee that properties required by API are set
+
+### GetType
+
+`func (o *ProtobufAny) GetType() string`
+
+GetType returns the Type field if non-nil, zero value otherwise.
+
+### GetTypeOk
+
+`func (o *ProtobufAny) GetTypeOk() (*string, bool)`
+
+GetTypeOk returns a tuple with the Type field if it's non-nil, zero value otherwise
+and a boolean to check if the value has been set.
+
+### SetType
+
+`func (o *ProtobufAny) SetType(v string)`
+
+SetType sets Type field to given value.
+
+### HasType
+
+`func (o *ProtobufAny) HasType() bool`
+
+HasType returns a boolean if a field has been set.
+
+
+[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/api/go/rest/etsi/model_danetetsi_status.go b/api/go/rest/etsi/model_danetetsi_status.go
new file mode 100644
index 0000000000000000000000000000000000000000..0eeab02ef7e7141f6e186ed75bac27ce710b0f4f
--- /dev/null
+++ b/api/go/rest/etsi/model_danetetsi_status.go
@@ -0,0 +1,486 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the DanetetsiStatus type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &DanetetsiStatus{}
+
+// DanetetsiStatus struct for DanetetsiStatus
+type DanetetsiStatus struct {
+	SourceKMEID *string `json:"sourceKMEID,omitempty"`
+	TargetKMEID *string `json:"targetKMEID,omitempty"`
+	MasterSAEID *string `json:"masterSAEID,omitempty"`
+	SlaveSAEID *string `json:"slaveSAEID,omitempty"`
+	KeySize *string `json:"keySize,omitempty"`
+	StoredKeyCount *string `json:"storedKeyCount,omitempty"`
+	MaxKeyCount *string `json:"maxKeyCount,omitempty"`
+	MaxKeyPerRequest *string `json:"maxKeyPerRequest,omitempty"`
+	MaxKeySize *string `json:"maxKeySize,omitempty"`
+	MinKeySize *string `json:"minKeySize,omitempty"`
+	MaxSAEIDCount *string `json:"maxSAEIDCount,omitempty"`
+}
+
+// NewDanetetsiStatus instantiates a new DanetetsiStatus object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewDanetetsiStatus() *DanetetsiStatus {
+	this := DanetetsiStatus{}
+	return &this
+}
+
+// NewDanetetsiStatusWithDefaults instantiates a new DanetetsiStatus object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewDanetetsiStatusWithDefaults() *DanetetsiStatus {
+	this := DanetetsiStatus{}
+	return &this
+}
+
+// GetSourceKMEID returns the SourceKMEID field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetSourceKMEID() string {
+	if o == nil || IsNil(o.SourceKMEID) {
+		var ret string
+		return ret
+	}
+	return *o.SourceKMEID
+}
+
+// GetSourceKMEIDOk returns a tuple with the SourceKMEID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetSourceKMEIDOk() (*string, bool) {
+	if o == nil || IsNil(o.SourceKMEID) {
+		return nil, false
+	}
+	return o.SourceKMEID, true
+}
+
+// HasSourceKMEID returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasSourceKMEID() bool {
+	if o != nil && !IsNil(o.SourceKMEID) {
+		return true
+	}
+
+	return false
+}
+
+// SetSourceKMEID gets a reference to the given string and assigns it to the SourceKMEID field.
+func (o *DanetetsiStatus) SetSourceKMEID(v string) {
+	o.SourceKMEID = &v
+}
+
+// GetTargetKMEID returns the TargetKMEID field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetTargetKMEID() string {
+	if o == nil || IsNil(o.TargetKMEID) {
+		var ret string
+		return ret
+	}
+	return *o.TargetKMEID
+}
+
+// GetTargetKMEIDOk returns a tuple with the TargetKMEID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetTargetKMEIDOk() (*string, bool) {
+	if o == nil || IsNil(o.TargetKMEID) {
+		return nil, false
+	}
+	return o.TargetKMEID, true
+}
+
+// HasTargetKMEID returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasTargetKMEID() bool {
+	if o != nil && !IsNil(o.TargetKMEID) {
+		return true
+	}
+
+	return false
+}
+
+// SetTargetKMEID gets a reference to the given string and assigns it to the TargetKMEID field.
+func (o *DanetetsiStatus) SetTargetKMEID(v string) {
+	o.TargetKMEID = &v
+}
+
+// GetMasterSAEID returns the MasterSAEID field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetMasterSAEID() string {
+	if o == nil || IsNil(o.MasterSAEID) {
+		var ret string
+		return ret
+	}
+	return *o.MasterSAEID
+}
+
+// GetMasterSAEIDOk returns a tuple with the MasterSAEID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetMasterSAEIDOk() (*string, bool) {
+	if o == nil || IsNil(o.MasterSAEID) {
+		return nil, false
+	}
+	return o.MasterSAEID, true
+}
+
+// HasMasterSAEID returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasMasterSAEID() bool {
+	if o != nil && !IsNil(o.MasterSAEID) {
+		return true
+	}
+
+	return false
+}
+
+// SetMasterSAEID gets a reference to the given string and assigns it to the MasterSAEID field.
+func (o *DanetetsiStatus) SetMasterSAEID(v string) {
+	o.MasterSAEID = &v
+}
+
+// GetSlaveSAEID returns the SlaveSAEID field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetSlaveSAEID() string {
+	if o == nil || IsNil(o.SlaveSAEID) {
+		var ret string
+		return ret
+	}
+	return *o.SlaveSAEID
+}
+
+// GetSlaveSAEIDOk returns a tuple with the SlaveSAEID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetSlaveSAEIDOk() (*string, bool) {
+	if o == nil || IsNil(o.SlaveSAEID) {
+		return nil, false
+	}
+	return o.SlaveSAEID, true
+}
+
+// HasSlaveSAEID returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasSlaveSAEID() bool {
+	if o != nil && !IsNil(o.SlaveSAEID) {
+		return true
+	}
+
+	return false
+}
+
+// SetSlaveSAEID gets a reference to the given string and assigns it to the SlaveSAEID field.
+func (o *DanetetsiStatus) SetSlaveSAEID(v string) {
+	o.SlaveSAEID = &v
+}
+
+// GetKeySize returns the KeySize field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetKeySize() string {
+	if o == nil || IsNil(o.KeySize) {
+		var ret string
+		return ret
+	}
+	return *o.KeySize
+}
+
+// GetKeySizeOk returns a tuple with the KeySize field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetKeySizeOk() (*string, bool) {
+	if o == nil || IsNil(o.KeySize) {
+		return nil, false
+	}
+	return o.KeySize, true
+}
+
+// HasKeySize returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasKeySize() bool {
+	if o != nil && !IsNil(o.KeySize) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeySize gets a reference to the given string and assigns it to the KeySize field.
+func (o *DanetetsiStatus) SetKeySize(v string) {
+	o.KeySize = &v
+}
+
+// GetStoredKeyCount returns the StoredKeyCount field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetStoredKeyCount() string {
+	if o == nil || IsNil(o.StoredKeyCount) {
+		var ret string
+		return ret
+	}
+	return *o.StoredKeyCount
+}
+
+// GetStoredKeyCountOk returns a tuple with the StoredKeyCount field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetStoredKeyCountOk() (*string, bool) {
+	if o == nil || IsNil(o.StoredKeyCount) {
+		return nil, false
+	}
+	return o.StoredKeyCount, true
+}
+
+// HasStoredKeyCount returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasStoredKeyCount() bool {
+	if o != nil && !IsNil(o.StoredKeyCount) {
+		return true
+	}
+
+	return false
+}
+
+// SetStoredKeyCount gets a reference to the given string and assigns it to the StoredKeyCount field.
+func (o *DanetetsiStatus) SetStoredKeyCount(v string) {
+	o.StoredKeyCount = &v
+}
+
+// GetMaxKeyCount returns the MaxKeyCount field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetMaxKeyCount() string {
+	if o == nil || IsNil(o.MaxKeyCount) {
+		var ret string
+		return ret
+	}
+	return *o.MaxKeyCount
+}
+
+// GetMaxKeyCountOk returns a tuple with the MaxKeyCount field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetMaxKeyCountOk() (*string, bool) {
+	if o == nil || IsNil(o.MaxKeyCount) {
+		return nil, false
+	}
+	return o.MaxKeyCount, true
+}
+
+// HasMaxKeyCount returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasMaxKeyCount() bool {
+	if o != nil && !IsNil(o.MaxKeyCount) {
+		return true
+	}
+
+	return false
+}
+
+// SetMaxKeyCount gets a reference to the given string and assigns it to the MaxKeyCount field.
+func (o *DanetetsiStatus) SetMaxKeyCount(v string) {
+	o.MaxKeyCount = &v
+}
+
+// GetMaxKeyPerRequest returns the MaxKeyPerRequest field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetMaxKeyPerRequest() string {
+	if o == nil || IsNil(o.MaxKeyPerRequest) {
+		var ret string
+		return ret
+	}
+	return *o.MaxKeyPerRequest
+}
+
+// GetMaxKeyPerRequestOk returns a tuple with the MaxKeyPerRequest field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetMaxKeyPerRequestOk() (*string, bool) {
+	if o == nil || IsNil(o.MaxKeyPerRequest) {
+		return nil, false
+	}
+	return o.MaxKeyPerRequest, true
+}
+
+// HasMaxKeyPerRequest returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasMaxKeyPerRequest() bool {
+	if o != nil && !IsNil(o.MaxKeyPerRequest) {
+		return true
+	}
+
+	return false
+}
+
+// SetMaxKeyPerRequest gets a reference to the given string and assigns it to the MaxKeyPerRequest field.
+func (o *DanetetsiStatus) SetMaxKeyPerRequest(v string) {
+	o.MaxKeyPerRequest = &v
+}
+
+// GetMaxKeySize returns the MaxKeySize field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetMaxKeySize() string {
+	if o == nil || IsNil(o.MaxKeySize) {
+		var ret string
+		return ret
+	}
+	return *o.MaxKeySize
+}
+
+// GetMaxKeySizeOk returns a tuple with the MaxKeySize field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetMaxKeySizeOk() (*string, bool) {
+	if o == nil || IsNil(o.MaxKeySize) {
+		return nil, false
+	}
+	return o.MaxKeySize, true
+}
+
+// HasMaxKeySize returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasMaxKeySize() bool {
+	if o != nil && !IsNil(o.MaxKeySize) {
+		return true
+	}
+
+	return false
+}
+
+// SetMaxKeySize gets a reference to the given string and assigns it to the MaxKeySize field.
+func (o *DanetetsiStatus) SetMaxKeySize(v string) {
+	o.MaxKeySize = &v
+}
+
+// GetMinKeySize returns the MinKeySize field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetMinKeySize() string {
+	if o == nil || IsNil(o.MinKeySize) {
+		var ret string
+		return ret
+	}
+	return *o.MinKeySize
+}
+
+// GetMinKeySizeOk returns a tuple with the MinKeySize field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetMinKeySizeOk() (*string, bool) {
+	if o == nil || IsNil(o.MinKeySize) {
+		return nil, false
+	}
+	return o.MinKeySize, true
+}
+
+// HasMinKeySize returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasMinKeySize() bool {
+	if o != nil && !IsNil(o.MinKeySize) {
+		return true
+	}
+
+	return false
+}
+
+// SetMinKeySize gets a reference to the given string and assigns it to the MinKeySize field.
+func (o *DanetetsiStatus) SetMinKeySize(v string) {
+	o.MinKeySize = &v
+}
+
+// GetMaxSAEIDCount returns the MaxSAEIDCount field value if set, zero value otherwise.
+func (o *DanetetsiStatus) GetMaxSAEIDCount() string {
+	if o == nil || IsNil(o.MaxSAEIDCount) {
+		var ret string
+		return ret
+	}
+	return *o.MaxSAEIDCount
+}
+
+// GetMaxSAEIDCountOk returns a tuple with the MaxSAEIDCount field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *DanetetsiStatus) GetMaxSAEIDCountOk() (*string, bool) {
+	if o == nil || IsNil(o.MaxSAEIDCount) {
+		return nil, false
+	}
+	return o.MaxSAEIDCount, true
+}
+
+// HasMaxSAEIDCount returns a boolean if a field has been set.
+func (o *DanetetsiStatus) HasMaxSAEIDCount() bool {
+	if o != nil && !IsNil(o.MaxSAEIDCount) {
+		return true
+	}
+
+	return false
+}
+
+// SetMaxSAEIDCount gets a reference to the given string and assigns it to the MaxSAEIDCount field.
+func (o *DanetetsiStatus) SetMaxSAEIDCount(v string) {
+	o.MaxSAEIDCount = &v
+}
+
+func (o DanetetsiStatus) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o DanetetsiStatus) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.SourceKMEID) {
+		toSerialize["sourceKMEID"] = o.SourceKMEID
+	}
+	if !IsNil(o.TargetKMEID) {
+		toSerialize["targetKMEID"] = o.TargetKMEID
+	}
+	if !IsNil(o.MasterSAEID) {
+		toSerialize["masterSAEID"] = o.MasterSAEID
+	}
+	if !IsNil(o.SlaveSAEID) {
+		toSerialize["slaveSAEID"] = o.SlaveSAEID
+	}
+	if !IsNil(o.KeySize) {
+		toSerialize["keySize"] = o.KeySize
+	}
+	if !IsNil(o.StoredKeyCount) {
+		toSerialize["storedKeyCount"] = o.StoredKeyCount
+	}
+	if !IsNil(o.MaxKeyCount) {
+		toSerialize["maxKeyCount"] = o.MaxKeyCount
+	}
+	if !IsNil(o.MaxKeyPerRequest) {
+		toSerialize["maxKeyPerRequest"] = o.MaxKeyPerRequest
+	}
+	if !IsNil(o.MaxKeySize) {
+		toSerialize["maxKeySize"] = o.MaxKeySize
+	}
+	if !IsNil(o.MinKeySize) {
+		toSerialize["minKeySize"] = o.MinKeySize
+	}
+	if !IsNil(o.MaxSAEIDCount) {
+		toSerialize["maxSAEIDCount"] = o.MaxSAEIDCount
+	}
+	return toSerialize, nil
+}
+
+type NullableDanetetsiStatus struct {
+	value *DanetetsiStatus
+	isSet bool
+}
+
+func (v NullableDanetetsiStatus) Get() *DanetetsiStatus {
+	return v.value
+}
+
+func (v *NullableDanetetsiStatus) Set(val *DanetetsiStatus) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableDanetetsiStatus) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableDanetetsiStatus) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableDanetetsiStatus(val *DanetetsiStatus) *NullableDanetetsiStatus {
+	return &NullableDanetetsiStatus{value: val, isSet: true}
+}
+
+func (v NullableDanetetsiStatus) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableDanetetsiStatus) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi14_service_get_key_request.go b/api/go/rest/etsi/model_etsi14_service_get_key_request.go
new file mode 100644
index 0000000000000000000000000000000000000000..92f6a84b34b3eb7d3419c58cfb235851bd7be5af
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi14_service_get_key_request.go
@@ -0,0 +1,126 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the ETSI14ServiceGetKeyRequest type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &ETSI14ServiceGetKeyRequest{}
+
+// ETSI14ServiceGetKeyRequest struct for ETSI14ServiceGetKeyRequest
+type ETSI14ServiceGetKeyRequest struct {
+	KeyRequest *EtsiKeyRequest `json:"keyRequest,omitempty"`
+}
+
+// NewETSI14ServiceGetKeyRequest instantiates a new ETSI14ServiceGetKeyRequest object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewETSI14ServiceGetKeyRequest() *ETSI14ServiceGetKeyRequest {
+	this := ETSI14ServiceGetKeyRequest{}
+	return &this
+}
+
+// NewETSI14ServiceGetKeyRequestWithDefaults instantiates a new ETSI14ServiceGetKeyRequest object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewETSI14ServiceGetKeyRequestWithDefaults() *ETSI14ServiceGetKeyRequest {
+	this := ETSI14ServiceGetKeyRequest{}
+	return &this
+}
+
+// GetKeyRequest returns the KeyRequest field value if set, zero value otherwise.
+func (o *ETSI14ServiceGetKeyRequest) GetKeyRequest() EtsiKeyRequest {
+	if o == nil || IsNil(o.KeyRequest) {
+		var ret EtsiKeyRequest
+		return ret
+	}
+	return *o.KeyRequest
+}
+
+// GetKeyRequestOk returns a tuple with the KeyRequest field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ETSI14ServiceGetKeyRequest) GetKeyRequestOk() (*EtsiKeyRequest, bool) {
+	if o == nil || IsNil(o.KeyRequest) {
+		return nil, false
+	}
+	return o.KeyRequest, true
+}
+
+// HasKeyRequest returns a boolean if a field has been set.
+func (o *ETSI14ServiceGetKeyRequest) HasKeyRequest() bool {
+	if o != nil && !IsNil(o.KeyRequest) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyRequest gets a reference to the given EtsiKeyRequest and assigns it to the KeyRequest field.
+func (o *ETSI14ServiceGetKeyRequest) SetKeyRequest(v EtsiKeyRequest) {
+	o.KeyRequest = &v
+}
+
+func (o ETSI14ServiceGetKeyRequest) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o ETSI14ServiceGetKeyRequest) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.KeyRequest) {
+		toSerialize["keyRequest"] = o.KeyRequest
+	}
+	return toSerialize, nil
+}
+
+type NullableETSI14ServiceGetKeyRequest struct {
+	value *ETSI14ServiceGetKeyRequest
+	isSet bool
+}
+
+func (v NullableETSI14ServiceGetKeyRequest) Get() *ETSI14ServiceGetKeyRequest {
+	return v.value
+}
+
+func (v *NullableETSI14ServiceGetKeyRequest) Set(val *ETSI14ServiceGetKeyRequest) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableETSI14ServiceGetKeyRequest) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableETSI14ServiceGetKeyRequest) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableETSI14ServiceGetKeyRequest(val *ETSI14ServiceGetKeyRequest) *NullableETSI14ServiceGetKeyRequest {
+	return &NullableETSI14ServiceGetKeyRequest{value: val, isSet: true}
+}
+
+func (v NullableETSI14ServiceGetKeyRequest) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableETSI14ServiceGetKeyRequest) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi14_service_get_key_with_ids_request.go b/api/go/rest/etsi/model_etsi14_service_get_key_with_ids_request.go
new file mode 100644
index 0000000000000000000000000000000000000000..2a4f29e02617338f860bc80107e15050e4cdfaab
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi14_service_get_key_with_ids_request.go
@@ -0,0 +1,162 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the ETSI14ServiceGetKeyWithIDsRequest type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &ETSI14ServiceGetKeyWithIDsRequest{}
+
+// ETSI14ServiceGetKeyWithIDsRequest struct for ETSI14ServiceGetKeyWithIDsRequest
+type ETSI14ServiceGetKeyWithIDsRequest struct {
+	SlaveSAEID *string `json:"slaveSAEID,omitempty"`
+	KeyID []EtsiKeyID `json:"keyID,omitempty"`
+}
+
+// NewETSI14ServiceGetKeyWithIDsRequest instantiates a new ETSI14ServiceGetKeyWithIDsRequest object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewETSI14ServiceGetKeyWithIDsRequest() *ETSI14ServiceGetKeyWithIDsRequest {
+	this := ETSI14ServiceGetKeyWithIDsRequest{}
+	return &this
+}
+
+// NewETSI14ServiceGetKeyWithIDsRequestWithDefaults instantiates a new ETSI14ServiceGetKeyWithIDsRequest object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewETSI14ServiceGetKeyWithIDsRequestWithDefaults() *ETSI14ServiceGetKeyWithIDsRequest {
+	this := ETSI14ServiceGetKeyWithIDsRequest{}
+	return &this
+}
+
+// GetSlaveSAEID returns the SlaveSAEID field value if set, zero value otherwise.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) GetSlaveSAEID() string {
+	if o == nil || IsNil(o.SlaveSAEID) {
+		var ret string
+		return ret
+	}
+	return *o.SlaveSAEID
+}
+
+// GetSlaveSAEIDOk returns a tuple with the SlaveSAEID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) GetSlaveSAEIDOk() (*string, bool) {
+	if o == nil || IsNil(o.SlaveSAEID) {
+		return nil, false
+	}
+	return o.SlaveSAEID, true
+}
+
+// HasSlaveSAEID returns a boolean if a field has been set.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) HasSlaveSAEID() bool {
+	if o != nil && !IsNil(o.SlaveSAEID) {
+		return true
+	}
+
+	return false
+}
+
+// SetSlaveSAEID gets a reference to the given string and assigns it to the SlaveSAEID field.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) SetSlaveSAEID(v string) {
+	o.SlaveSAEID = &v
+}
+
+// GetKeyID returns the KeyID field value if set, zero value otherwise.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) GetKeyID() []EtsiKeyID {
+	if o == nil || IsNil(o.KeyID) {
+		var ret []EtsiKeyID
+		return ret
+	}
+	return o.KeyID
+}
+
+// GetKeyIDOk returns a tuple with the KeyID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) GetKeyIDOk() ([]EtsiKeyID, bool) {
+	if o == nil || IsNil(o.KeyID) {
+		return nil, false
+	}
+	return o.KeyID, true
+}
+
+// HasKeyID returns a boolean if a field has been set.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) HasKeyID() bool {
+	if o != nil && !IsNil(o.KeyID) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyID gets a reference to the given []EtsiKeyID and assigns it to the KeyID field.
+func (o *ETSI14ServiceGetKeyWithIDsRequest) SetKeyID(v []EtsiKeyID) {
+	o.KeyID = v
+}
+
+func (o ETSI14ServiceGetKeyWithIDsRequest) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o ETSI14ServiceGetKeyWithIDsRequest) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.SlaveSAEID) {
+		toSerialize["slaveSAEID"] = o.SlaveSAEID
+	}
+	if !IsNil(o.KeyID) {
+		toSerialize["keyID"] = o.KeyID
+	}
+	return toSerialize, nil
+}
+
+type NullableETSI14ServiceGetKeyWithIDsRequest struct {
+	value *ETSI14ServiceGetKeyWithIDsRequest
+	isSet bool
+}
+
+func (v NullableETSI14ServiceGetKeyWithIDsRequest) Get() *ETSI14ServiceGetKeyWithIDsRequest {
+	return v.value
+}
+
+func (v *NullableETSI14ServiceGetKeyWithIDsRequest) Set(val *ETSI14ServiceGetKeyWithIDsRequest) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableETSI14ServiceGetKeyWithIDsRequest) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableETSI14ServiceGetKeyWithIDsRequest) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableETSI14ServiceGetKeyWithIDsRequest(val *ETSI14ServiceGetKeyWithIDsRequest) *NullableETSI14ServiceGetKeyWithIDsRequest {
+	return &NullableETSI14ServiceGetKeyWithIDsRequest{value: val, isSet: true}
+}
+
+func (v NullableETSI14ServiceGetKeyWithIDsRequest) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableETSI14ServiceGetKeyWithIDsRequest) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_error.go b/api/go/rest/etsi/model_etsi_error.go
new file mode 100644
index 0000000000000000000000000000000000000000..fba75125a7d016d6590a163af8daa52a1a5caa23
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_error.go
@@ -0,0 +1,162 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiError type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiError{}
+
+// EtsiError struct for EtsiError
+type EtsiError struct {
+	Message *string `json:"message,omitempty"`
+	Details *map[string]EtsiListOfDetails `json:"details,omitempty"`
+}
+
+// NewEtsiError instantiates a new EtsiError object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiError() *EtsiError {
+	this := EtsiError{}
+	return &this
+}
+
+// NewEtsiErrorWithDefaults instantiates a new EtsiError object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiErrorWithDefaults() *EtsiError {
+	this := EtsiError{}
+	return &this
+}
+
+// GetMessage returns the Message field value if set, zero value otherwise.
+func (o *EtsiError) GetMessage() string {
+	if o == nil || IsNil(o.Message) {
+		var ret string
+		return ret
+	}
+	return *o.Message
+}
+
+// GetMessageOk returns a tuple with the Message field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiError) GetMessageOk() (*string, bool) {
+	if o == nil || IsNil(o.Message) {
+		return nil, false
+	}
+	return o.Message, true
+}
+
+// HasMessage returns a boolean if a field has been set.
+func (o *EtsiError) HasMessage() bool {
+	if o != nil && !IsNil(o.Message) {
+		return true
+	}
+
+	return false
+}
+
+// SetMessage gets a reference to the given string and assigns it to the Message field.
+func (o *EtsiError) SetMessage(v string) {
+	o.Message = &v
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *EtsiError) GetDetails() map[string]EtsiListOfDetails {
+	if o == nil || IsNil(o.Details) {
+		var ret map[string]EtsiListOfDetails
+		return ret
+	}
+	return *o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiError) GetDetailsOk() (*map[string]EtsiListOfDetails, bool) {
+	if o == nil || IsNil(o.Details) {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *EtsiError) HasDetails() bool {
+	if o != nil && !IsNil(o.Details) {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given map[string]EtsiListOfDetails and assigns it to the Details field.
+func (o *EtsiError) SetDetails(v map[string]EtsiListOfDetails) {
+	o.Details = &v
+}
+
+func (o EtsiError) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiError) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Message) {
+		toSerialize["message"] = o.Message
+	}
+	if !IsNil(o.Details) {
+		toSerialize["details"] = o.Details
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiError struct {
+	value *EtsiError
+	isSet bool
+}
+
+func (v NullableEtsiError) Get() *EtsiError {
+	return v.value
+}
+
+func (v *NullableEtsiError) Set(val *EtsiError) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiError) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiError) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiError(val *EtsiError) *NullableEtsiError {
+	return &NullableEtsiError{value: val, isSet: true}
+}
+
+func (v NullableEtsiError) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiError) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_extension_mandatory.go b/api/go/rest/etsi/model_etsi_extension_mandatory.go
new file mode 100644
index 0000000000000000000000000000000000000000..4963b82b3a6dcad49ee9bdd63315894226f77af7
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_extension_mandatory.go
@@ -0,0 +1,126 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiExtensionMandatory type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiExtensionMandatory{}
+
+// EtsiExtensionMandatory Array of extension parameters specified as name/value pairs that KME shall  handle or return an error. Parameter values may be of any type, including objects.
+type EtsiExtensionMandatory struct {
+	ExtensionMandatory *map[string]ProtobufAny `json:"extensionMandatory,omitempty"`
+}
+
+// NewEtsiExtensionMandatory instantiates a new EtsiExtensionMandatory object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiExtensionMandatory() *EtsiExtensionMandatory {
+	this := EtsiExtensionMandatory{}
+	return &this
+}
+
+// NewEtsiExtensionMandatoryWithDefaults instantiates a new EtsiExtensionMandatory object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiExtensionMandatoryWithDefaults() *EtsiExtensionMandatory {
+	this := EtsiExtensionMandatory{}
+	return &this
+}
+
+// GetExtensionMandatory returns the ExtensionMandatory field value if set, zero value otherwise.
+func (o *EtsiExtensionMandatory) GetExtensionMandatory() map[string]ProtobufAny {
+	if o == nil || IsNil(o.ExtensionMandatory) {
+		var ret map[string]ProtobufAny
+		return ret
+	}
+	return *o.ExtensionMandatory
+}
+
+// GetExtensionMandatoryOk returns a tuple with the ExtensionMandatory field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiExtensionMandatory) GetExtensionMandatoryOk() (*map[string]ProtobufAny, bool) {
+	if o == nil || IsNil(o.ExtensionMandatory) {
+		return nil, false
+	}
+	return o.ExtensionMandatory, true
+}
+
+// HasExtensionMandatory returns a boolean if a field has been set.
+func (o *EtsiExtensionMandatory) HasExtensionMandatory() bool {
+	if o != nil && !IsNil(o.ExtensionMandatory) {
+		return true
+	}
+
+	return false
+}
+
+// SetExtensionMandatory gets a reference to the given map[string]ProtobufAny and assigns it to the ExtensionMandatory field.
+func (o *EtsiExtensionMandatory) SetExtensionMandatory(v map[string]ProtobufAny) {
+	o.ExtensionMandatory = &v
+}
+
+func (o EtsiExtensionMandatory) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiExtensionMandatory) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.ExtensionMandatory) {
+		toSerialize["extensionMandatory"] = o.ExtensionMandatory
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiExtensionMandatory struct {
+	value *EtsiExtensionMandatory
+	isSet bool
+}
+
+func (v NullableEtsiExtensionMandatory) Get() *EtsiExtensionMandatory {
+	return v.value
+}
+
+func (v *NullableEtsiExtensionMandatory) Set(val *EtsiExtensionMandatory) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiExtensionMandatory) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiExtensionMandatory) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiExtensionMandatory(val *EtsiExtensionMandatory) *NullableEtsiExtensionMandatory {
+	return &NullableEtsiExtensionMandatory{value: val, isSet: true}
+}
+
+func (v NullableEtsiExtensionMandatory) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiExtensionMandatory) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_extension_optional.go b/api/go/rest/etsi/model_etsi_extension_optional.go
new file mode 100644
index 0000000000000000000000000000000000000000..dec31e172c30948fd2b709a1f85258d1ecdf5d32
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_extension_optional.go
@@ -0,0 +1,126 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiExtensionOptional type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiExtensionOptional{}
+
+// EtsiExtensionOptional Array of extension parameters specified as name/value pairs that KME may ignore.  Parameter values may be of any type, including objects.
+type EtsiExtensionOptional struct {
+	ExtensionOptional *map[string]ProtobufAny `json:"extensionOptional,omitempty"`
+}
+
+// NewEtsiExtensionOptional instantiates a new EtsiExtensionOptional object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiExtensionOptional() *EtsiExtensionOptional {
+	this := EtsiExtensionOptional{}
+	return &this
+}
+
+// NewEtsiExtensionOptionalWithDefaults instantiates a new EtsiExtensionOptional object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiExtensionOptionalWithDefaults() *EtsiExtensionOptional {
+	this := EtsiExtensionOptional{}
+	return &this
+}
+
+// GetExtensionOptional returns the ExtensionOptional field value if set, zero value otherwise.
+func (o *EtsiExtensionOptional) GetExtensionOptional() map[string]ProtobufAny {
+	if o == nil || IsNil(o.ExtensionOptional) {
+		var ret map[string]ProtobufAny
+		return ret
+	}
+	return *o.ExtensionOptional
+}
+
+// GetExtensionOptionalOk returns a tuple with the ExtensionOptional field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiExtensionOptional) GetExtensionOptionalOk() (*map[string]ProtobufAny, bool) {
+	if o == nil || IsNil(o.ExtensionOptional) {
+		return nil, false
+	}
+	return o.ExtensionOptional, true
+}
+
+// HasExtensionOptional returns a boolean if a field has been set.
+func (o *EtsiExtensionOptional) HasExtensionOptional() bool {
+	if o != nil && !IsNil(o.ExtensionOptional) {
+		return true
+	}
+
+	return false
+}
+
+// SetExtensionOptional gets a reference to the given map[string]ProtobufAny and assigns it to the ExtensionOptional field.
+func (o *EtsiExtensionOptional) SetExtensionOptional(v map[string]ProtobufAny) {
+	o.ExtensionOptional = &v
+}
+
+func (o EtsiExtensionOptional) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiExtensionOptional) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.ExtensionOptional) {
+		toSerialize["extensionOptional"] = o.ExtensionOptional
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiExtensionOptional struct {
+	value *EtsiExtensionOptional
+	isSet bool
+}
+
+func (v NullableEtsiExtensionOptional) Get() *EtsiExtensionOptional {
+	return v.value
+}
+
+func (v *NullableEtsiExtensionOptional) Set(val *EtsiExtensionOptional) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiExtensionOptional) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiExtensionOptional) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiExtensionOptional(val *EtsiExtensionOptional) *NullableEtsiExtensionOptional {
+	return &NullableEtsiExtensionOptional{value: val, isSet: true}
+}
+
+func (v NullableEtsiExtensionOptional) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiExtensionOptional) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_get_key_response.go b/api/go/rest/etsi/model_etsi_get_key_response.go
new file mode 100644
index 0000000000000000000000000000000000000000..c25fbaa807eca71c8006bc318099a1ed0ef8eda6
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_get_key_response.go
@@ -0,0 +1,198 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiGetKeyResponse type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiGetKeyResponse{}
+
+// EtsiGetKeyResponse struct for EtsiGetKeyResponse
+type EtsiGetKeyResponse struct {
+	Timestamp *string `json:"timestamp,omitempty"`
+	KeyContainer *EtsiKeyContainer `json:"keyContainer,omitempty"`
+	Error *EtsiError `json:"error,omitempty"`
+}
+
+// NewEtsiGetKeyResponse instantiates a new EtsiGetKeyResponse object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiGetKeyResponse() *EtsiGetKeyResponse {
+	this := EtsiGetKeyResponse{}
+	return &this
+}
+
+// NewEtsiGetKeyResponseWithDefaults instantiates a new EtsiGetKeyResponse object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiGetKeyResponseWithDefaults() *EtsiGetKeyResponse {
+	this := EtsiGetKeyResponse{}
+	return &this
+}
+
+// GetTimestamp returns the Timestamp field value if set, zero value otherwise.
+func (o *EtsiGetKeyResponse) GetTimestamp() string {
+	if o == nil || IsNil(o.Timestamp) {
+		var ret string
+		return ret
+	}
+	return *o.Timestamp
+}
+
+// GetTimestampOk returns a tuple with the Timestamp field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetKeyResponse) GetTimestampOk() (*string, bool) {
+	if o == nil || IsNil(o.Timestamp) {
+		return nil, false
+	}
+	return o.Timestamp, true
+}
+
+// HasTimestamp returns a boolean if a field has been set.
+func (o *EtsiGetKeyResponse) HasTimestamp() bool {
+	if o != nil && !IsNil(o.Timestamp) {
+		return true
+	}
+
+	return false
+}
+
+// SetTimestamp gets a reference to the given string and assigns it to the Timestamp field.
+func (o *EtsiGetKeyResponse) SetTimestamp(v string) {
+	o.Timestamp = &v
+}
+
+// GetKeyContainer returns the KeyContainer field value if set, zero value otherwise.
+func (o *EtsiGetKeyResponse) GetKeyContainer() EtsiKeyContainer {
+	if o == nil || IsNil(o.KeyContainer) {
+		var ret EtsiKeyContainer
+		return ret
+	}
+	return *o.KeyContainer
+}
+
+// GetKeyContainerOk returns a tuple with the KeyContainer field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetKeyResponse) GetKeyContainerOk() (*EtsiKeyContainer, bool) {
+	if o == nil || IsNil(o.KeyContainer) {
+		return nil, false
+	}
+	return o.KeyContainer, true
+}
+
+// HasKeyContainer returns a boolean if a field has been set.
+func (o *EtsiGetKeyResponse) HasKeyContainer() bool {
+	if o != nil && !IsNil(o.KeyContainer) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyContainer gets a reference to the given EtsiKeyContainer and assigns it to the KeyContainer field.
+func (o *EtsiGetKeyResponse) SetKeyContainer(v EtsiKeyContainer) {
+	o.KeyContainer = &v
+}
+
+// GetError returns the Error field value if set, zero value otherwise.
+func (o *EtsiGetKeyResponse) GetError() EtsiError {
+	if o == nil || IsNil(o.Error) {
+		var ret EtsiError
+		return ret
+	}
+	return *o.Error
+}
+
+// GetErrorOk returns a tuple with the Error field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetKeyResponse) GetErrorOk() (*EtsiError, bool) {
+	if o == nil || IsNil(o.Error) {
+		return nil, false
+	}
+	return o.Error, true
+}
+
+// HasError returns a boolean if a field has been set.
+func (o *EtsiGetKeyResponse) HasError() bool {
+	if o != nil && !IsNil(o.Error) {
+		return true
+	}
+
+	return false
+}
+
+// SetError gets a reference to the given EtsiError and assigns it to the Error field.
+func (o *EtsiGetKeyResponse) SetError(v EtsiError) {
+	o.Error = &v
+}
+
+func (o EtsiGetKeyResponse) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiGetKeyResponse) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Timestamp) {
+		toSerialize["timestamp"] = o.Timestamp
+	}
+	if !IsNil(o.KeyContainer) {
+		toSerialize["keyContainer"] = o.KeyContainer
+	}
+	if !IsNil(o.Error) {
+		toSerialize["error"] = o.Error
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiGetKeyResponse struct {
+	value *EtsiGetKeyResponse
+	isSet bool
+}
+
+func (v NullableEtsiGetKeyResponse) Get() *EtsiGetKeyResponse {
+	return v.value
+}
+
+func (v *NullableEtsiGetKeyResponse) Set(val *EtsiGetKeyResponse) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiGetKeyResponse) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiGetKeyResponse) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiGetKeyResponse(val *EtsiGetKeyResponse) *NullableEtsiGetKeyResponse {
+	return &NullableEtsiGetKeyResponse{value: val, isSet: true}
+}
+
+func (v NullableEtsiGetKeyResponse) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiGetKeyResponse) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_get_key_with_ids_response.go b/api/go/rest/etsi/model_etsi_get_key_with_ids_response.go
new file mode 100644
index 0000000000000000000000000000000000000000..0f93f6de72cf46d8c775a8c666928614792a1316
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_get_key_with_ids_response.go
@@ -0,0 +1,198 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiGetKeyWithIDsResponse type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiGetKeyWithIDsResponse{}
+
+// EtsiGetKeyWithIDsResponse struct for EtsiGetKeyWithIDsResponse
+type EtsiGetKeyWithIDsResponse struct {
+	Timestamp *string `json:"timestamp,omitempty"`
+	KeyContainer *EtsiKeyContainer `json:"keyContainer,omitempty"`
+	Error *EtsiError `json:"error,omitempty"`
+}
+
+// NewEtsiGetKeyWithIDsResponse instantiates a new EtsiGetKeyWithIDsResponse object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiGetKeyWithIDsResponse() *EtsiGetKeyWithIDsResponse {
+	this := EtsiGetKeyWithIDsResponse{}
+	return &this
+}
+
+// NewEtsiGetKeyWithIDsResponseWithDefaults instantiates a new EtsiGetKeyWithIDsResponse object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiGetKeyWithIDsResponseWithDefaults() *EtsiGetKeyWithIDsResponse {
+	this := EtsiGetKeyWithIDsResponse{}
+	return &this
+}
+
+// GetTimestamp returns the Timestamp field value if set, zero value otherwise.
+func (o *EtsiGetKeyWithIDsResponse) GetTimestamp() string {
+	if o == nil || IsNil(o.Timestamp) {
+		var ret string
+		return ret
+	}
+	return *o.Timestamp
+}
+
+// GetTimestampOk returns a tuple with the Timestamp field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetKeyWithIDsResponse) GetTimestampOk() (*string, bool) {
+	if o == nil || IsNil(o.Timestamp) {
+		return nil, false
+	}
+	return o.Timestamp, true
+}
+
+// HasTimestamp returns a boolean if a field has been set.
+func (o *EtsiGetKeyWithIDsResponse) HasTimestamp() bool {
+	if o != nil && !IsNil(o.Timestamp) {
+		return true
+	}
+
+	return false
+}
+
+// SetTimestamp gets a reference to the given string and assigns it to the Timestamp field.
+func (o *EtsiGetKeyWithIDsResponse) SetTimestamp(v string) {
+	o.Timestamp = &v
+}
+
+// GetKeyContainer returns the KeyContainer field value if set, zero value otherwise.
+func (o *EtsiGetKeyWithIDsResponse) GetKeyContainer() EtsiKeyContainer {
+	if o == nil || IsNil(o.KeyContainer) {
+		var ret EtsiKeyContainer
+		return ret
+	}
+	return *o.KeyContainer
+}
+
+// GetKeyContainerOk returns a tuple with the KeyContainer field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetKeyWithIDsResponse) GetKeyContainerOk() (*EtsiKeyContainer, bool) {
+	if o == nil || IsNil(o.KeyContainer) {
+		return nil, false
+	}
+	return o.KeyContainer, true
+}
+
+// HasKeyContainer returns a boolean if a field has been set.
+func (o *EtsiGetKeyWithIDsResponse) HasKeyContainer() bool {
+	if o != nil && !IsNil(o.KeyContainer) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyContainer gets a reference to the given EtsiKeyContainer and assigns it to the KeyContainer field.
+func (o *EtsiGetKeyWithIDsResponse) SetKeyContainer(v EtsiKeyContainer) {
+	o.KeyContainer = &v
+}
+
+// GetError returns the Error field value if set, zero value otherwise.
+func (o *EtsiGetKeyWithIDsResponse) GetError() EtsiError {
+	if o == nil || IsNil(o.Error) {
+		var ret EtsiError
+		return ret
+	}
+	return *o.Error
+}
+
+// GetErrorOk returns a tuple with the Error field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetKeyWithIDsResponse) GetErrorOk() (*EtsiError, bool) {
+	if o == nil || IsNil(o.Error) {
+		return nil, false
+	}
+	return o.Error, true
+}
+
+// HasError returns a boolean if a field has been set.
+func (o *EtsiGetKeyWithIDsResponse) HasError() bool {
+	if o != nil && !IsNil(o.Error) {
+		return true
+	}
+
+	return false
+}
+
+// SetError gets a reference to the given EtsiError and assigns it to the Error field.
+func (o *EtsiGetKeyWithIDsResponse) SetError(v EtsiError) {
+	o.Error = &v
+}
+
+func (o EtsiGetKeyWithIDsResponse) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiGetKeyWithIDsResponse) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Timestamp) {
+		toSerialize["timestamp"] = o.Timestamp
+	}
+	if !IsNil(o.KeyContainer) {
+		toSerialize["keyContainer"] = o.KeyContainer
+	}
+	if !IsNil(o.Error) {
+		toSerialize["error"] = o.Error
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiGetKeyWithIDsResponse struct {
+	value *EtsiGetKeyWithIDsResponse
+	isSet bool
+}
+
+func (v NullableEtsiGetKeyWithIDsResponse) Get() *EtsiGetKeyWithIDsResponse {
+	return v.value
+}
+
+func (v *NullableEtsiGetKeyWithIDsResponse) Set(val *EtsiGetKeyWithIDsResponse) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiGetKeyWithIDsResponse) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiGetKeyWithIDsResponse) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiGetKeyWithIDsResponse(val *EtsiGetKeyWithIDsResponse) *NullableEtsiGetKeyWithIDsResponse {
+	return &NullableEtsiGetKeyWithIDsResponse{value: val, isSet: true}
+}
+
+func (v NullableEtsiGetKeyWithIDsResponse) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiGetKeyWithIDsResponse) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_get_status_response.go b/api/go/rest/etsi/model_etsi_get_status_response.go
new file mode 100644
index 0000000000000000000000000000000000000000..0c7546bcc16d67135753305694f781e76a9e050e
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_get_status_response.go
@@ -0,0 +1,198 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiGetStatusResponse type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiGetStatusResponse{}
+
+// EtsiGetStatusResponse struct for EtsiGetStatusResponse
+type EtsiGetStatusResponse struct {
+	Timestamp *string `json:"timestamp,omitempty"`
+	Status *DanetetsiStatus `json:"status,omitempty"`
+	Error *EtsiError `json:"error,omitempty"`
+}
+
+// NewEtsiGetStatusResponse instantiates a new EtsiGetStatusResponse object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiGetStatusResponse() *EtsiGetStatusResponse {
+	this := EtsiGetStatusResponse{}
+	return &this
+}
+
+// NewEtsiGetStatusResponseWithDefaults instantiates a new EtsiGetStatusResponse object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiGetStatusResponseWithDefaults() *EtsiGetStatusResponse {
+	this := EtsiGetStatusResponse{}
+	return &this
+}
+
+// GetTimestamp returns the Timestamp field value if set, zero value otherwise.
+func (o *EtsiGetStatusResponse) GetTimestamp() string {
+	if o == nil || IsNil(o.Timestamp) {
+		var ret string
+		return ret
+	}
+	return *o.Timestamp
+}
+
+// GetTimestampOk returns a tuple with the Timestamp field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetStatusResponse) GetTimestampOk() (*string, bool) {
+	if o == nil || IsNil(o.Timestamp) {
+		return nil, false
+	}
+	return o.Timestamp, true
+}
+
+// HasTimestamp returns a boolean if a field has been set.
+func (o *EtsiGetStatusResponse) HasTimestamp() bool {
+	if o != nil && !IsNil(o.Timestamp) {
+		return true
+	}
+
+	return false
+}
+
+// SetTimestamp gets a reference to the given string and assigns it to the Timestamp field.
+func (o *EtsiGetStatusResponse) SetTimestamp(v string) {
+	o.Timestamp = &v
+}
+
+// GetStatus returns the Status field value if set, zero value otherwise.
+func (o *EtsiGetStatusResponse) GetStatus() DanetetsiStatus {
+	if o == nil || IsNil(o.Status) {
+		var ret DanetetsiStatus
+		return ret
+	}
+	return *o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetStatusResponse) GetStatusOk() (*DanetetsiStatus, bool) {
+	if o == nil || IsNil(o.Status) {
+		return nil, false
+	}
+	return o.Status, true
+}
+
+// HasStatus returns a boolean if a field has been set.
+func (o *EtsiGetStatusResponse) HasStatus() bool {
+	if o != nil && !IsNil(o.Status) {
+		return true
+	}
+
+	return false
+}
+
+// SetStatus gets a reference to the given DanetetsiStatus and assigns it to the Status field.
+func (o *EtsiGetStatusResponse) SetStatus(v DanetetsiStatus) {
+	o.Status = &v
+}
+
+// GetError returns the Error field value if set, zero value otherwise.
+func (o *EtsiGetStatusResponse) GetError() EtsiError {
+	if o == nil || IsNil(o.Error) {
+		var ret EtsiError
+		return ret
+	}
+	return *o.Error
+}
+
+// GetErrorOk returns a tuple with the Error field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiGetStatusResponse) GetErrorOk() (*EtsiError, bool) {
+	if o == nil || IsNil(o.Error) {
+		return nil, false
+	}
+	return o.Error, true
+}
+
+// HasError returns a boolean if a field has been set.
+func (o *EtsiGetStatusResponse) HasError() bool {
+	if o != nil && !IsNil(o.Error) {
+		return true
+	}
+
+	return false
+}
+
+// SetError gets a reference to the given EtsiError and assigns it to the Error field.
+func (o *EtsiGetStatusResponse) SetError(v EtsiError) {
+	o.Error = &v
+}
+
+func (o EtsiGetStatusResponse) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiGetStatusResponse) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Timestamp) {
+		toSerialize["timestamp"] = o.Timestamp
+	}
+	if !IsNil(o.Status) {
+		toSerialize["status"] = o.Status
+	}
+	if !IsNil(o.Error) {
+		toSerialize["error"] = o.Error
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiGetStatusResponse struct {
+	value *EtsiGetStatusResponse
+	isSet bool
+}
+
+func (v NullableEtsiGetStatusResponse) Get() *EtsiGetStatusResponse {
+	return v.value
+}
+
+func (v *NullableEtsiGetStatusResponse) Set(val *EtsiGetStatusResponse) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiGetStatusResponse) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiGetStatusResponse) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiGetStatusResponse(val *EtsiGetStatusResponse) *NullableEtsiGetStatusResponse {
+	return &NullableEtsiGetStatusResponse{value: val, isSet: true}
+}
+
+func (v NullableEtsiGetStatusResponse) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiGetStatusResponse) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_key.go b/api/go/rest/etsi/model_etsi_key.go
new file mode 100644
index 0000000000000000000000000000000000000000..3a851fd77afbcb7158f00932cd3d3016d0fda992
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_key.go
@@ -0,0 +1,235 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiKey type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiKey{}
+
+// EtsiKey struct for EtsiKey
+type EtsiKey struct {
+	KeyID *string `json:"keyID,omitempty"`
+	// optional for future use.
+	KeyIDExtension map[string]interface{} `json:"keyIDExtension,omitempty"`
+	Key *string `json:"key,omitempty"`
+	KeyExtension *ProtobufAny `json:"keyExtension,omitempty"`
+}
+
+// NewEtsiKey instantiates a new EtsiKey object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiKey() *EtsiKey {
+	this := EtsiKey{}
+	return &this
+}
+
+// NewEtsiKeyWithDefaults instantiates a new EtsiKey object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiKeyWithDefaults() *EtsiKey {
+	this := EtsiKey{}
+	return &this
+}
+
+// GetKeyID returns the KeyID field value if set, zero value otherwise.
+func (o *EtsiKey) GetKeyID() string {
+	if o == nil || IsNil(o.KeyID) {
+		var ret string
+		return ret
+	}
+	return *o.KeyID
+}
+
+// GetKeyIDOk returns a tuple with the KeyID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKey) GetKeyIDOk() (*string, bool) {
+	if o == nil || IsNil(o.KeyID) {
+		return nil, false
+	}
+	return o.KeyID, true
+}
+
+// HasKeyID returns a boolean if a field has been set.
+func (o *EtsiKey) HasKeyID() bool {
+	if o != nil && !IsNil(o.KeyID) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyID gets a reference to the given string and assigns it to the KeyID field.
+func (o *EtsiKey) SetKeyID(v string) {
+	o.KeyID = &v
+}
+
+// GetKeyIDExtension returns the KeyIDExtension field value if set, zero value otherwise.
+func (o *EtsiKey) GetKeyIDExtension() map[string]interface{} {
+	if o == nil || IsNil(o.KeyIDExtension) {
+		var ret map[string]interface{}
+		return ret
+	}
+	return o.KeyIDExtension
+}
+
+// GetKeyIDExtensionOk returns a tuple with the KeyIDExtension field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKey) GetKeyIDExtensionOk() (map[string]interface{}, bool) {
+	if o == nil || IsNil(o.KeyIDExtension) {
+		return map[string]interface{}{}, false
+	}
+	return o.KeyIDExtension, true
+}
+
+// HasKeyIDExtension returns a boolean if a field has been set.
+func (o *EtsiKey) HasKeyIDExtension() bool {
+	if o != nil && !IsNil(o.KeyIDExtension) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyIDExtension gets a reference to the given map[string]interface{} and assigns it to the KeyIDExtension field.
+func (o *EtsiKey) SetKeyIDExtension(v map[string]interface{}) {
+	o.KeyIDExtension = v
+}
+
+// GetKey returns the Key field value if set, zero value otherwise.
+func (o *EtsiKey) GetKey() string {
+	if o == nil || IsNil(o.Key) {
+		var ret string
+		return ret
+	}
+	return *o.Key
+}
+
+// GetKeyOk returns a tuple with the Key field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKey) GetKeyOk() (*string, bool) {
+	if o == nil || IsNil(o.Key) {
+		return nil, false
+	}
+	return o.Key, true
+}
+
+// HasKey returns a boolean if a field has been set.
+func (o *EtsiKey) HasKey() bool {
+	if o != nil && !IsNil(o.Key) {
+		return true
+	}
+
+	return false
+}
+
+// SetKey gets a reference to the given string and assigns it to the Key field.
+func (o *EtsiKey) SetKey(v string) {
+	o.Key = &v
+}
+
+// GetKeyExtension returns the KeyExtension field value if set, zero value otherwise.
+func (o *EtsiKey) GetKeyExtension() ProtobufAny {
+	if o == nil || IsNil(o.KeyExtension) {
+		var ret ProtobufAny
+		return ret
+	}
+	return *o.KeyExtension
+}
+
+// GetKeyExtensionOk returns a tuple with the KeyExtension field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKey) GetKeyExtensionOk() (*ProtobufAny, bool) {
+	if o == nil || IsNil(o.KeyExtension) {
+		return nil, false
+	}
+	return o.KeyExtension, true
+}
+
+// HasKeyExtension returns a boolean if a field has been set.
+func (o *EtsiKey) HasKeyExtension() bool {
+	if o != nil && !IsNil(o.KeyExtension) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyExtension gets a reference to the given ProtobufAny and assigns it to the KeyExtension field.
+func (o *EtsiKey) SetKeyExtension(v ProtobufAny) {
+	o.KeyExtension = &v
+}
+
+func (o EtsiKey) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiKey) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.KeyID) {
+		toSerialize["keyID"] = o.KeyID
+	}
+	if !IsNil(o.KeyIDExtension) {
+		toSerialize["keyIDExtension"] = o.KeyIDExtension
+	}
+	if !IsNil(o.Key) {
+		toSerialize["key"] = o.Key
+	}
+	if !IsNil(o.KeyExtension) {
+		toSerialize["keyExtension"] = o.KeyExtension
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiKey struct {
+	value *EtsiKey
+	isSet bool
+}
+
+func (v NullableEtsiKey) Get() *EtsiKey {
+	return v.value
+}
+
+func (v *NullableEtsiKey) Set(val *EtsiKey) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiKey) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiKey) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiKey(val *EtsiKey) *NullableEtsiKey {
+	return &NullableEtsiKey{value: val, isSet: true}
+}
+
+func (v NullableEtsiKey) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiKey) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_key_container.go b/api/go/rest/etsi/model_etsi_key_container.go
new file mode 100644
index 0000000000000000000000000000000000000000..38a072b0951594ffc1cee3f64a85ee47fc72382f
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_key_container.go
@@ -0,0 +1,162 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiKeyContainer type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiKeyContainer{}
+
+// EtsiKeyContainer struct for EtsiKeyContainer
+type EtsiKeyContainer struct {
+	Key []EtsiKey `json:"key,omitempty"`
+	KeyContainerExtension *ProtobufAny `json:"keyContainerExtension,omitempty"`
+}
+
+// NewEtsiKeyContainer instantiates a new EtsiKeyContainer object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiKeyContainer() *EtsiKeyContainer {
+	this := EtsiKeyContainer{}
+	return &this
+}
+
+// NewEtsiKeyContainerWithDefaults instantiates a new EtsiKeyContainer object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiKeyContainerWithDefaults() *EtsiKeyContainer {
+	this := EtsiKeyContainer{}
+	return &this
+}
+
+// GetKey returns the Key field value if set, zero value otherwise.
+func (o *EtsiKeyContainer) GetKey() []EtsiKey {
+	if o == nil || IsNil(o.Key) {
+		var ret []EtsiKey
+		return ret
+	}
+	return o.Key
+}
+
+// GetKeyOk returns a tuple with the Key field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyContainer) GetKeyOk() ([]EtsiKey, bool) {
+	if o == nil || IsNil(o.Key) {
+		return nil, false
+	}
+	return o.Key, true
+}
+
+// HasKey returns a boolean if a field has been set.
+func (o *EtsiKeyContainer) HasKey() bool {
+	if o != nil && !IsNil(o.Key) {
+		return true
+	}
+
+	return false
+}
+
+// SetKey gets a reference to the given []EtsiKey and assigns it to the Key field.
+func (o *EtsiKeyContainer) SetKey(v []EtsiKey) {
+	o.Key = v
+}
+
+// GetKeyContainerExtension returns the KeyContainerExtension field value if set, zero value otherwise.
+func (o *EtsiKeyContainer) GetKeyContainerExtension() ProtobufAny {
+	if o == nil || IsNil(o.KeyContainerExtension) {
+		var ret ProtobufAny
+		return ret
+	}
+	return *o.KeyContainerExtension
+}
+
+// GetKeyContainerExtensionOk returns a tuple with the KeyContainerExtension field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyContainer) GetKeyContainerExtensionOk() (*ProtobufAny, bool) {
+	if o == nil || IsNil(o.KeyContainerExtension) {
+		return nil, false
+	}
+	return o.KeyContainerExtension, true
+}
+
+// HasKeyContainerExtension returns a boolean if a field has been set.
+func (o *EtsiKeyContainer) HasKeyContainerExtension() bool {
+	if o != nil && !IsNil(o.KeyContainerExtension) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyContainerExtension gets a reference to the given ProtobufAny and assigns it to the KeyContainerExtension field.
+func (o *EtsiKeyContainer) SetKeyContainerExtension(v ProtobufAny) {
+	o.KeyContainerExtension = &v
+}
+
+func (o EtsiKeyContainer) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiKeyContainer) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Key) {
+		toSerialize["key"] = o.Key
+	}
+	if !IsNil(o.KeyContainerExtension) {
+		toSerialize["keyContainerExtension"] = o.KeyContainerExtension
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiKeyContainer struct {
+	value *EtsiKeyContainer
+	isSet bool
+}
+
+func (v NullableEtsiKeyContainer) Get() *EtsiKeyContainer {
+	return v.value
+}
+
+func (v *NullableEtsiKeyContainer) Set(val *EtsiKeyContainer) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiKeyContainer) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiKeyContainer) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiKeyContainer(val *EtsiKeyContainer) *NullableEtsiKeyContainer {
+	return &NullableEtsiKeyContainer{value: val, isSet: true}
+}
+
+func (v NullableEtsiKeyContainer) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiKeyContainer) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_key_id.go b/api/go/rest/etsi/model_etsi_key_id.go
new file mode 100644
index 0000000000000000000000000000000000000000..5994424c557c9fe2980815c1e6a31f159a785992
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_key_id.go
@@ -0,0 +1,162 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiKeyID type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiKeyID{}
+
+// EtsiKeyID struct for EtsiKeyID
+type EtsiKeyID struct {
+	KeyID *string `json:"keyID,omitempty"`
+	KeyIDExtension *ProtobufAny `json:"keyIDExtension,omitempty"`
+}
+
+// NewEtsiKeyID instantiates a new EtsiKeyID object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiKeyID() *EtsiKeyID {
+	this := EtsiKeyID{}
+	return &this
+}
+
+// NewEtsiKeyIDWithDefaults instantiates a new EtsiKeyID object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiKeyIDWithDefaults() *EtsiKeyID {
+	this := EtsiKeyID{}
+	return &this
+}
+
+// GetKeyID returns the KeyID field value if set, zero value otherwise.
+func (o *EtsiKeyID) GetKeyID() string {
+	if o == nil || IsNil(o.KeyID) {
+		var ret string
+		return ret
+	}
+	return *o.KeyID
+}
+
+// GetKeyIDOk returns a tuple with the KeyID field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyID) GetKeyIDOk() (*string, bool) {
+	if o == nil || IsNil(o.KeyID) {
+		return nil, false
+	}
+	return o.KeyID, true
+}
+
+// HasKeyID returns a boolean if a field has been set.
+func (o *EtsiKeyID) HasKeyID() bool {
+	if o != nil && !IsNil(o.KeyID) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyID gets a reference to the given string and assigns it to the KeyID field.
+func (o *EtsiKeyID) SetKeyID(v string) {
+	o.KeyID = &v
+}
+
+// GetKeyIDExtension returns the KeyIDExtension field value if set, zero value otherwise.
+func (o *EtsiKeyID) GetKeyIDExtension() ProtobufAny {
+	if o == nil || IsNil(o.KeyIDExtension) {
+		var ret ProtobufAny
+		return ret
+	}
+	return *o.KeyIDExtension
+}
+
+// GetKeyIDExtensionOk returns a tuple with the KeyIDExtension field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyID) GetKeyIDExtensionOk() (*ProtobufAny, bool) {
+	if o == nil || IsNil(o.KeyIDExtension) {
+		return nil, false
+	}
+	return o.KeyIDExtension, true
+}
+
+// HasKeyIDExtension returns a boolean if a field has been set.
+func (o *EtsiKeyID) HasKeyIDExtension() bool {
+	if o != nil && !IsNil(o.KeyIDExtension) {
+		return true
+	}
+
+	return false
+}
+
+// SetKeyIDExtension gets a reference to the given ProtobufAny and assigns it to the KeyIDExtension field.
+func (o *EtsiKeyID) SetKeyIDExtension(v ProtobufAny) {
+	o.KeyIDExtension = &v
+}
+
+func (o EtsiKeyID) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiKeyID) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.KeyID) {
+		toSerialize["keyID"] = o.KeyID
+	}
+	if !IsNil(o.KeyIDExtension) {
+		toSerialize["keyIDExtension"] = o.KeyIDExtension
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiKeyID struct {
+	value *EtsiKeyID
+	isSet bool
+}
+
+func (v NullableEtsiKeyID) Get() *EtsiKeyID {
+	return v.value
+}
+
+func (v *NullableEtsiKeyID) Set(val *EtsiKeyID) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiKeyID) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiKeyID) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiKeyID(val *EtsiKeyID) *NullableEtsiKeyID {
+	return &NullableEtsiKeyID{value: val, isSet: true}
+}
+
+func (v NullableEtsiKeyID) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiKeyID) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_key_request.go b/api/go/rest/etsi/model_etsi_key_request.go
new file mode 100644
index 0000000000000000000000000000000000000000..701700ec328d9a5199a984ff89bd3805258110cb
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_key_request.go
@@ -0,0 +1,270 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiKeyRequest type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiKeyRequest{}
+
+// EtsiKeyRequest struct for EtsiKeyRequest
+type EtsiKeyRequest struct {
+	Number *string `json:"number,omitempty"`
+	Size *string `json:"size,omitempty"`
+	AdditionalSlaveSAEIDs []string `json:"additionalSlaveSAEIDs,omitempty"`
+	ExtensionMandatory []EtsiExtensionMandatory `json:"extensionMandatory,omitempty"`
+	ExtensionOptional []EtsiExtensionOptional `json:"extensionOptional,omitempty"`
+}
+
+// NewEtsiKeyRequest instantiates a new EtsiKeyRequest object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiKeyRequest() *EtsiKeyRequest {
+	this := EtsiKeyRequest{}
+	return &this
+}
+
+// NewEtsiKeyRequestWithDefaults instantiates a new EtsiKeyRequest object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiKeyRequestWithDefaults() *EtsiKeyRequest {
+	this := EtsiKeyRequest{}
+	return &this
+}
+
+// GetNumber returns the Number field value if set, zero value otherwise.
+func (o *EtsiKeyRequest) GetNumber() string {
+	if o == nil || IsNil(o.Number) {
+		var ret string
+		return ret
+	}
+	return *o.Number
+}
+
+// GetNumberOk returns a tuple with the Number field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyRequest) GetNumberOk() (*string, bool) {
+	if o == nil || IsNil(o.Number) {
+		return nil, false
+	}
+	return o.Number, true
+}
+
+// HasNumber returns a boolean if a field has been set.
+func (o *EtsiKeyRequest) HasNumber() bool {
+	if o != nil && !IsNil(o.Number) {
+		return true
+	}
+
+	return false
+}
+
+// SetNumber gets a reference to the given string and assigns it to the Number field.
+func (o *EtsiKeyRequest) SetNumber(v string) {
+	o.Number = &v
+}
+
+// GetSize returns the Size field value if set, zero value otherwise.
+func (o *EtsiKeyRequest) GetSize() string {
+	if o == nil || IsNil(o.Size) {
+		var ret string
+		return ret
+	}
+	return *o.Size
+}
+
+// GetSizeOk returns a tuple with the Size field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyRequest) GetSizeOk() (*string, bool) {
+	if o == nil || IsNil(o.Size) {
+		return nil, false
+	}
+	return o.Size, true
+}
+
+// HasSize returns a boolean if a field has been set.
+func (o *EtsiKeyRequest) HasSize() bool {
+	if o != nil && !IsNil(o.Size) {
+		return true
+	}
+
+	return false
+}
+
+// SetSize gets a reference to the given string and assigns it to the Size field.
+func (o *EtsiKeyRequest) SetSize(v string) {
+	o.Size = &v
+}
+
+// GetAdditionalSlaveSAEIDs returns the AdditionalSlaveSAEIDs field value if set, zero value otherwise.
+func (o *EtsiKeyRequest) GetAdditionalSlaveSAEIDs() []string {
+	if o == nil || IsNil(o.AdditionalSlaveSAEIDs) {
+		var ret []string
+		return ret
+	}
+	return o.AdditionalSlaveSAEIDs
+}
+
+// GetAdditionalSlaveSAEIDsOk returns a tuple with the AdditionalSlaveSAEIDs field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyRequest) GetAdditionalSlaveSAEIDsOk() ([]string, bool) {
+	if o == nil || IsNil(o.AdditionalSlaveSAEIDs) {
+		return nil, false
+	}
+	return o.AdditionalSlaveSAEIDs, true
+}
+
+// HasAdditionalSlaveSAEIDs returns a boolean if a field has been set.
+func (o *EtsiKeyRequest) HasAdditionalSlaveSAEIDs() bool {
+	if o != nil && !IsNil(o.AdditionalSlaveSAEIDs) {
+		return true
+	}
+
+	return false
+}
+
+// SetAdditionalSlaveSAEIDs gets a reference to the given []string and assigns it to the AdditionalSlaveSAEIDs field.
+func (o *EtsiKeyRequest) SetAdditionalSlaveSAEIDs(v []string) {
+	o.AdditionalSlaveSAEIDs = v
+}
+
+// GetExtensionMandatory returns the ExtensionMandatory field value if set, zero value otherwise.
+func (o *EtsiKeyRequest) GetExtensionMandatory() []EtsiExtensionMandatory {
+	if o == nil || IsNil(o.ExtensionMandatory) {
+		var ret []EtsiExtensionMandatory
+		return ret
+	}
+	return o.ExtensionMandatory
+}
+
+// GetExtensionMandatoryOk returns a tuple with the ExtensionMandatory field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyRequest) GetExtensionMandatoryOk() ([]EtsiExtensionMandatory, bool) {
+	if o == nil || IsNil(o.ExtensionMandatory) {
+		return nil, false
+	}
+	return o.ExtensionMandatory, true
+}
+
+// HasExtensionMandatory returns a boolean if a field has been set.
+func (o *EtsiKeyRequest) HasExtensionMandatory() bool {
+	if o != nil && !IsNil(o.ExtensionMandatory) {
+		return true
+	}
+
+	return false
+}
+
+// SetExtensionMandatory gets a reference to the given []EtsiExtensionMandatory and assigns it to the ExtensionMandatory field.
+func (o *EtsiKeyRequest) SetExtensionMandatory(v []EtsiExtensionMandatory) {
+	o.ExtensionMandatory = v
+}
+
+// GetExtensionOptional returns the ExtensionOptional field value if set, zero value otherwise.
+func (o *EtsiKeyRequest) GetExtensionOptional() []EtsiExtensionOptional {
+	if o == nil || IsNil(o.ExtensionOptional) {
+		var ret []EtsiExtensionOptional
+		return ret
+	}
+	return o.ExtensionOptional
+}
+
+// GetExtensionOptionalOk returns a tuple with the ExtensionOptional field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiKeyRequest) GetExtensionOptionalOk() ([]EtsiExtensionOptional, bool) {
+	if o == nil || IsNil(o.ExtensionOptional) {
+		return nil, false
+	}
+	return o.ExtensionOptional, true
+}
+
+// HasExtensionOptional returns a boolean if a field has been set.
+func (o *EtsiKeyRequest) HasExtensionOptional() bool {
+	if o != nil && !IsNil(o.ExtensionOptional) {
+		return true
+	}
+
+	return false
+}
+
+// SetExtensionOptional gets a reference to the given []EtsiExtensionOptional and assigns it to the ExtensionOptional field.
+func (o *EtsiKeyRequest) SetExtensionOptional(v []EtsiExtensionOptional) {
+	o.ExtensionOptional = v
+}
+
+func (o EtsiKeyRequest) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiKeyRequest) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Number) {
+		toSerialize["number"] = o.Number
+	}
+	if !IsNil(o.Size) {
+		toSerialize["size"] = o.Size
+	}
+	if !IsNil(o.AdditionalSlaveSAEIDs) {
+		toSerialize["additionalSlaveSAEIDs"] = o.AdditionalSlaveSAEIDs
+	}
+	if !IsNil(o.ExtensionMandatory) {
+		toSerialize["extensionMandatory"] = o.ExtensionMandatory
+	}
+	if !IsNil(o.ExtensionOptional) {
+		toSerialize["extensionOptional"] = o.ExtensionOptional
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiKeyRequest struct {
+	value *EtsiKeyRequest
+	isSet bool
+}
+
+func (v NullableEtsiKeyRequest) Get() *EtsiKeyRequest {
+	return v.value
+}
+
+func (v *NullableEtsiKeyRequest) Set(val *EtsiKeyRequest) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiKeyRequest) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiKeyRequest) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiKeyRequest(val *EtsiKeyRequest) *NullableEtsiKeyRequest {
+	return &NullableEtsiKeyRequest{value: val, isSet: true}
+}
+
+func (v NullableEtsiKeyRequest) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiKeyRequest) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_etsi_list_of_details.go b/api/go/rest/etsi/model_etsi_list_of_details.go
new file mode 100644
index 0000000000000000000000000000000000000000..bb0d0c8edfd408c5d7e0340a161afff94717a886
--- /dev/null
+++ b/api/go/rest/etsi/model_etsi_list_of_details.go
@@ -0,0 +1,126 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the EtsiListOfDetails type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &EtsiListOfDetails{}
+
+// EtsiListOfDetails struct for EtsiListOfDetails
+type EtsiListOfDetails struct {
+	Details []string `json:"details,omitempty"`
+}
+
+// NewEtsiListOfDetails instantiates a new EtsiListOfDetails object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEtsiListOfDetails() *EtsiListOfDetails {
+	this := EtsiListOfDetails{}
+	return &this
+}
+
+// NewEtsiListOfDetailsWithDefaults instantiates a new EtsiListOfDetails object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEtsiListOfDetailsWithDefaults() *EtsiListOfDetails {
+	this := EtsiListOfDetails{}
+	return &this
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *EtsiListOfDetails) GetDetails() []string {
+	if o == nil || IsNil(o.Details) {
+		var ret []string
+		return ret
+	}
+	return o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EtsiListOfDetails) GetDetailsOk() ([]string, bool) {
+	if o == nil || IsNil(o.Details) {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *EtsiListOfDetails) HasDetails() bool {
+	if o != nil && !IsNil(o.Details) {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given []string and assigns it to the Details field.
+func (o *EtsiListOfDetails) SetDetails(v []string) {
+	o.Details = v
+}
+
+func (o EtsiListOfDetails) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o EtsiListOfDetails) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Details) {
+		toSerialize["details"] = o.Details
+	}
+	return toSerialize, nil
+}
+
+type NullableEtsiListOfDetails struct {
+	value *EtsiListOfDetails
+	isSet bool
+}
+
+func (v NullableEtsiListOfDetails) Get() *EtsiListOfDetails {
+	return v.value
+}
+
+func (v *NullableEtsiListOfDetails) Set(val *EtsiListOfDetails) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEtsiListOfDetails) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEtsiListOfDetails) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEtsiListOfDetails(val *EtsiListOfDetails) *NullableEtsiListOfDetails {
+	return &NullableEtsiListOfDetails{value: val, isSet: true}
+}
+
+func (v NullableEtsiListOfDetails) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEtsiListOfDetails) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_googlerpc_status.go b/api/go/rest/etsi/model_googlerpc_status.go
new file mode 100644
index 0000000000000000000000000000000000000000..b183f2efb7fd6d8e8a6c34ffbab184fdeba47dd5
--- /dev/null
+++ b/api/go/rest/etsi/model_googlerpc_status.go
@@ -0,0 +1,198 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the GooglerpcStatus type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &GooglerpcStatus{}
+
+// GooglerpcStatus struct for GooglerpcStatus
+type GooglerpcStatus struct {
+	Code *int32 `json:"code,omitempty"`
+	Message *string `json:"message,omitempty"`
+	Details []ProtobufAny `json:"details,omitempty"`
+}
+
+// NewGooglerpcStatus instantiates a new GooglerpcStatus object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewGooglerpcStatus() *GooglerpcStatus {
+	this := GooglerpcStatus{}
+	return &this
+}
+
+// NewGooglerpcStatusWithDefaults instantiates a new GooglerpcStatus object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewGooglerpcStatusWithDefaults() *GooglerpcStatus {
+	this := GooglerpcStatus{}
+	return &this
+}
+
+// GetCode returns the Code field value if set, zero value otherwise.
+func (o *GooglerpcStatus) GetCode() int32 {
+	if o == nil || IsNil(o.Code) {
+		var ret int32
+		return ret
+	}
+	return *o.Code
+}
+
+// GetCodeOk returns a tuple with the Code field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *GooglerpcStatus) GetCodeOk() (*int32, bool) {
+	if o == nil || IsNil(o.Code) {
+		return nil, false
+	}
+	return o.Code, true
+}
+
+// HasCode returns a boolean if a field has been set.
+func (o *GooglerpcStatus) HasCode() bool {
+	if o != nil && !IsNil(o.Code) {
+		return true
+	}
+
+	return false
+}
+
+// SetCode gets a reference to the given int32 and assigns it to the Code field.
+func (o *GooglerpcStatus) SetCode(v int32) {
+	o.Code = &v
+}
+
+// GetMessage returns the Message field value if set, zero value otherwise.
+func (o *GooglerpcStatus) GetMessage() string {
+	if o == nil || IsNil(o.Message) {
+		var ret string
+		return ret
+	}
+	return *o.Message
+}
+
+// GetMessageOk returns a tuple with the Message field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *GooglerpcStatus) GetMessageOk() (*string, bool) {
+	if o == nil || IsNil(o.Message) {
+		return nil, false
+	}
+	return o.Message, true
+}
+
+// HasMessage returns a boolean if a field has been set.
+func (o *GooglerpcStatus) HasMessage() bool {
+	if o != nil && !IsNil(o.Message) {
+		return true
+	}
+
+	return false
+}
+
+// SetMessage gets a reference to the given string and assigns it to the Message field.
+func (o *GooglerpcStatus) SetMessage(v string) {
+	o.Message = &v
+}
+
+// GetDetails returns the Details field value if set, zero value otherwise.
+func (o *GooglerpcStatus) GetDetails() []ProtobufAny {
+	if o == nil || IsNil(o.Details) {
+		var ret []ProtobufAny
+		return ret
+	}
+	return o.Details
+}
+
+// GetDetailsOk returns a tuple with the Details field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *GooglerpcStatus) GetDetailsOk() ([]ProtobufAny, bool) {
+	if o == nil || IsNil(o.Details) {
+		return nil, false
+	}
+	return o.Details, true
+}
+
+// HasDetails returns a boolean if a field has been set.
+func (o *GooglerpcStatus) HasDetails() bool {
+	if o != nil && !IsNil(o.Details) {
+		return true
+	}
+
+	return false
+}
+
+// SetDetails gets a reference to the given []ProtobufAny and assigns it to the Details field.
+func (o *GooglerpcStatus) SetDetails(v []ProtobufAny) {
+	o.Details = v
+}
+
+func (o GooglerpcStatus) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o GooglerpcStatus) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Code) {
+		toSerialize["code"] = o.Code
+	}
+	if !IsNil(o.Message) {
+		toSerialize["message"] = o.Message
+	}
+	if !IsNil(o.Details) {
+		toSerialize["details"] = o.Details
+	}
+	return toSerialize, nil
+}
+
+type NullableGooglerpcStatus struct {
+	value *GooglerpcStatus
+	isSet bool
+}
+
+func (v NullableGooglerpcStatus) Get() *GooglerpcStatus {
+	return v.value
+}
+
+func (v *NullableGooglerpcStatus) Set(val *GooglerpcStatus) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableGooglerpcStatus) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableGooglerpcStatus) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableGooglerpcStatus(val *GooglerpcStatus) *NullableGooglerpcStatus {
+	return &NullableGooglerpcStatus{value: val, isSet: true}
+}
+
+func (v NullableGooglerpcStatus) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableGooglerpcStatus) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/model_protobuf_any.go b/api/go/rest/etsi/model_protobuf_any.go
new file mode 100644
index 0000000000000000000000000000000000000000..b906db82dfd4ea2afc6b51bd5c30f317cdc6697d
--- /dev/null
+++ b/api/go/rest/etsi/model_protobuf_any.go
@@ -0,0 +1,156 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+)
+
+// checks if the ProtobufAny type satisfies the MappedNullable interface at compile time
+var _ MappedNullable = &ProtobufAny{}
+
+// ProtobufAny `Any` contains an arbitrary serialized protocol buffer message along with a URL that describes the type of the serialized message.  Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type.  Example 1: Pack and unpack a message in C++.      Foo foo = ...;     Any any;     any.PackFrom(foo);     ...     if (any.UnpackTo(&foo)) {       ...     }  Example 2: Pack and unpack a message in Java.      Foo foo = ...;     Any any = Any.pack(foo);     ...     if (any.is(Foo.class)) {       foo = any.unpack(Foo.class);     }     // or ...     if (any.isSameTypeAs(Foo.getDefaultInstance())) {       foo = any.unpack(Foo.getDefaultInstance());     }  Example 3: Pack and unpack a message in Python.      foo = Foo(...)     any = Any()     any.Pack(foo)     ...     if any.Is(Foo.DESCRIPTOR):       any.Unpack(foo)       ...  Example 4: Pack and unpack a message in Go       foo := &pb.Foo{...}      any, err := anypb.New(foo)      if err != nil {        ...      }      ...      foo := &pb.Foo{}      if err := any.UnmarshalTo(foo); err != nil {        ...      }  The pack methods provided by protobuf library will by default use 'type.googleapis.com/full.type.name' as the type URL and the unpack methods only use the fully qualified type name after the last '/' in the type URL, for example \"foo.bar.com/x/y.z\" will yield type name \"y.z\".  JSON  The JSON representation of an `Any` value uses the regular representation of the deserialized, embedded message, with an additional field `@type` which contains the type URL. Example:      package google.profile;     message Person {       string first_name = 1;       string last_name = 2;     }      {       \"@type\": \"type.googleapis.com/google.profile.Person\",       \"firstName\": <string>,       \"lastName\": <string>     }  If the embedded message type is well-known and has a custom JSON representation, that representation will be embedded adding a field `value` which holds the custom JSON in addition to the `@type` field. Example (for message [google.protobuf.Duration][]):      {       \"@type\": \"type.googleapis.com/google.protobuf.Duration\",       \"value\": \"1.212s\"     }
+type ProtobufAny struct {
+	// A URL/resource name that uniquely identifies the type of the serialized protocol buffer message. This string must contain at least one \"/\" character. The last segment of the URL's path must represent the fully qualified name of the type (as in `path/google.protobuf.Duration`). The name should be in a canonical form (e.g., leading \".\" is not accepted).  In practice, teams usually precompile into the binary all types that they expect it to use in the context of Any. However, for URLs which use the scheme `http`, `https`, or no scheme, one can optionally set up a type server that maps type URLs to message definitions as follows:  * If no scheme is provided, `https` is assumed. * An HTTP GET on the URL must yield a [google.protobuf.Type][]   value in binary format, or produce an error. * Applications are allowed to cache lookup results based on the   URL, or have them precompiled into a binary to avoid any   lookup. Therefore, binary compatibility needs to be preserved   on changes to types. (Use versioned type names to manage   breaking changes.)  Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com.  Schemes other than `http`, `https` (or the empty scheme) might be used with implementation specific semantics.
+	Type *string `json:"@type,omitempty"`
+	AdditionalProperties map[string]interface{}
+}
+
+type _ProtobufAny ProtobufAny
+
+// NewProtobufAny instantiates a new ProtobufAny object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewProtobufAny() *ProtobufAny {
+	this := ProtobufAny{}
+	return &this
+}
+
+// NewProtobufAnyWithDefaults instantiates a new ProtobufAny object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewProtobufAnyWithDefaults() *ProtobufAny {
+	this := ProtobufAny{}
+	return &this
+}
+
+// GetType returns the Type field value if set, zero value otherwise.
+func (o *ProtobufAny) GetType() string {
+	if o == nil || IsNil(o.Type) {
+		var ret string
+		return ret
+	}
+	return *o.Type
+}
+
+// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ProtobufAny) GetTypeOk() (*string, bool) {
+	if o == nil || IsNil(o.Type) {
+		return nil, false
+	}
+	return o.Type, true
+}
+
+// HasType returns a boolean if a field has been set.
+func (o *ProtobufAny) HasType() bool {
+	if o != nil && !IsNil(o.Type) {
+		return true
+	}
+
+	return false
+}
+
+// SetType gets a reference to the given string and assigns it to the Type field.
+func (o *ProtobufAny) SetType(v string) {
+	o.Type = &v
+}
+
+func (o ProtobufAny) MarshalJSON() ([]byte, error) {
+	toSerialize,err := o.ToMap()
+	if err != nil {
+		return []byte{}, err
+	}
+	return json.Marshal(toSerialize)
+}
+
+func (o ProtobufAny) ToMap() (map[string]interface{}, error) {
+	toSerialize := map[string]interface{}{}
+	if !IsNil(o.Type) {
+		toSerialize["@type"] = o.Type
+	}
+
+	for key, value := range o.AdditionalProperties {
+		toSerialize[key] = value
+	}
+
+	return toSerialize, nil
+}
+
+func (o *ProtobufAny) UnmarshalJSON(bytes []byte) (err error) {
+	varProtobufAny := _ProtobufAny{}
+
+	err = json.Unmarshal(bytes, &varProtobufAny)
+
+	if err != nil {
+		return err
+	}
+
+	*o = ProtobufAny(varProtobufAny)
+
+	additionalProperties := make(map[string]interface{})
+
+	if err = json.Unmarshal(bytes, &additionalProperties); err == nil {
+		delete(additionalProperties, "@type")
+		o.AdditionalProperties = additionalProperties
+	}
+
+	return err
+}
+
+type NullableProtobufAny struct {
+	value *ProtobufAny
+	isSet bool
+}
+
+func (v NullableProtobufAny) Get() *ProtobufAny {
+	return v.value
+}
+
+func (v *NullableProtobufAny) Set(val *ProtobufAny) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableProtobufAny) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableProtobufAny) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableProtobufAny(val *ProtobufAny) *NullableProtobufAny {
+	return &NullableProtobufAny{value: val, isSet: true}
+}
+
+func (v NullableProtobufAny) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableProtobufAny) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/api/go/rest/etsi/response.go b/api/go/rest/etsi/response.go
new file mode 100644
index 0000000000000000000000000000000000000000..f34eda7be9e6dfae6cedb8cf4571190bded144c2
--- /dev/null
+++ b/api/go/rest/etsi/response.go
@@ -0,0 +1,47 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"net/http"
+)
+
+// APIResponse stores the API response returned by the server.
+type APIResponse struct {
+	*http.Response `json:"-"`
+	Message        string `json:"message,omitempty"`
+	// Operation is the name of the OpenAPI operation.
+	Operation string `json:"operation,omitempty"`
+	// RequestURL is the request URL. This value is always available, even if the
+	// embedded *http.Response is nil.
+	RequestURL string `json:"url,omitempty"`
+	// Method is the HTTP method used for the request.  This value is always
+	// available, even if the embedded *http.Response is nil.
+	Method string `json:"method,omitempty"`
+	// Payload holds the contents of the response body (which may be nil or empty).
+	// This is provided here as the raw response.Body() reader will have already
+	// been drained.
+	Payload []byte `json:"-"`
+}
+
+// NewAPIResponse returns a new APIResponse object.
+func NewAPIResponse(r *http.Response) *APIResponse {
+
+	response := &APIResponse{Response: r}
+	return response
+}
+
+// NewAPIResponseWithError returns a new APIResponse object with the provided error message.
+func NewAPIResponseWithError(errorMessage string) *APIResponse {
+
+	response := &APIResponse{Message: errorMessage}
+	return response
+}
diff --git a/api/go/rest/etsi/test/api_etsi14_service_test.go b/api/go/rest/etsi/test/api_etsi14_service_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..89f630b0ced9b39a038caebf5c67de3377980481
--- /dev/null
+++ b/api/go/rest/etsi/test/api_etsi14_service_test.go
@@ -0,0 +1,71 @@
+/*
+danet ETSI14 Interface
+
+Testing ETSI14ServiceAPIService
+
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech);
+
+package etsi14
+
+import (
+	"context"
+	"testing"
+
+	openapiclient "code.fbi.h-da.de/danet/ekms/api/go/rest/etsi"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func Test_etsi14_ETSI14ServiceAPIService(t *testing.T) {
+
+	configuration := openapiclient.NewConfiguration()
+	apiClient := openapiclient.NewAPIClient(configuration)
+
+	t.Run("Test ETSI14ServiceAPIService ETSI14ServiceGetKey", func(t *testing.T) {
+
+		t.Skip("skip test") // remove to run test
+
+		var kMEHostname string
+		var slaveSAEID string
+
+		resp, httpRes, err := apiClient.ETSI14ServiceAPI.ETSI14ServiceGetKey(context.Background(), kMEHostname, slaveSAEID).Execute()
+
+		require.Nil(t, err)
+		require.NotNil(t, resp)
+		assert.Equal(t, 200, httpRes.StatusCode)
+
+	})
+
+	t.Run("Test ETSI14ServiceAPIService ETSI14ServiceGetKeyWithIDs", func(t *testing.T) {
+
+		t.Skip("skip test") // remove to run test
+
+		var kMEHostname string
+		var masterSAEID string
+
+		resp, httpRes, err := apiClient.ETSI14ServiceAPI.ETSI14ServiceGetKeyWithIDs(context.Background(), kMEHostname, masterSAEID).Execute()
+
+		require.Nil(t, err)
+		require.NotNil(t, resp)
+		assert.Equal(t, 200, httpRes.StatusCode)
+
+	})
+
+	t.Run("Test ETSI14ServiceAPIService ETSI14ServiceGetStatus", func(t *testing.T) {
+
+		t.Skip("skip test") // remove to run test
+
+		var kMEHostname string
+		var slaveSAEID string
+
+		resp, httpRes, err := apiClient.ETSI14ServiceAPI.ETSI14ServiceGetStatus(context.Background(), kMEHostname, slaveSAEID).Execute()
+
+		require.Nil(t, err)
+		require.NotNil(t, resp)
+		assert.Equal(t, 200, httpRes.StatusCode)
+
+	})
+
+}
diff --git a/api/go/rest/etsi/utils.go b/api/go/rest/etsi/utils.go
new file mode 100644
index 0000000000000000000000000000000000000000..a0fa9cf181f07309022b6fc1cfcc3b02d4b27f71
--- /dev/null
+++ b/api/go/rest/etsi/utils.go
@@ -0,0 +1,347 @@
+/*
+danet ETSI14 Interface
+
+Protocol Buffer specifications and Go code for the ETSI14 KMS Interface
+
+API version: 0.1
+*/
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package etsi14
+
+import (
+	"encoding/json"
+	"reflect"
+	"time"
+)
+
+// PtrBool is a helper routine that returns a pointer to given boolean value.
+func PtrBool(v bool) *bool { return &v }
+
+// PtrInt is a helper routine that returns a pointer to given integer value.
+func PtrInt(v int) *int { return &v }
+
+// PtrInt32 is a helper routine that returns a pointer to given integer value.
+func PtrInt32(v int32) *int32 { return &v }
+
+// PtrInt64 is a helper routine that returns a pointer to given integer value.
+func PtrInt64(v int64) *int64 { return &v }
+
+// PtrFloat32 is a helper routine that returns a pointer to given float value.
+func PtrFloat32(v float32) *float32 { return &v }
+
+// PtrFloat64 is a helper routine that returns a pointer to given float value.
+func PtrFloat64(v float64) *float64 { return &v }
+
+// PtrString is a helper routine that returns a pointer to given string value.
+func PtrString(v string) *string { return &v }
+
+// PtrTime is helper routine that returns a pointer to given Time value.
+func PtrTime(v time.Time) *time.Time { return &v }
+
+type NullableBool struct {
+	value *bool
+	isSet bool
+}
+
+func (v NullableBool) Get() *bool {
+	return v.value
+}
+
+func (v *NullableBool) Set(val *bool) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableBool) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableBool) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableBool(val *bool) *NullableBool {
+	return &NullableBool{value: val, isSet: true}
+}
+
+func (v NullableBool) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableBool) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableInt struct {
+	value *int
+	isSet bool
+}
+
+func (v NullableInt) Get() *int {
+	return v.value
+}
+
+func (v *NullableInt) Set(val *int) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableInt) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableInt) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableInt(val *int) *NullableInt {
+	return &NullableInt{value: val, isSet: true}
+}
+
+func (v NullableInt) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableInt) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableInt32 struct {
+	value *int32
+	isSet bool
+}
+
+func (v NullableInt32) Get() *int32 {
+	return v.value
+}
+
+func (v *NullableInt32) Set(val *int32) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableInt32) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableInt32) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableInt32(val *int32) *NullableInt32 {
+	return &NullableInt32{value: val, isSet: true}
+}
+
+func (v NullableInt32) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableInt32) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableInt64 struct {
+	value *int64
+	isSet bool
+}
+
+func (v NullableInt64) Get() *int64 {
+	return v.value
+}
+
+func (v *NullableInt64) Set(val *int64) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableInt64) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableInt64) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableInt64(val *int64) *NullableInt64 {
+	return &NullableInt64{value: val, isSet: true}
+}
+
+func (v NullableInt64) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableInt64) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableFloat32 struct {
+	value *float32
+	isSet bool
+}
+
+func (v NullableFloat32) Get() *float32 {
+	return v.value
+}
+
+func (v *NullableFloat32) Set(val *float32) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableFloat32) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableFloat32) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableFloat32(val *float32) *NullableFloat32 {
+	return &NullableFloat32{value: val, isSet: true}
+}
+
+func (v NullableFloat32) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableFloat32) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableFloat64 struct {
+	value *float64
+	isSet bool
+}
+
+func (v NullableFloat64) Get() *float64 {
+	return v.value
+}
+
+func (v *NullableFloat64) Set(val *float64) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableFloat64) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableFloat64) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableFloat64(val *float64) *NullableFloat64 {
+	return &NullableFloat64{value: val, isSet: true}
+}
+
+func (v NullableFloat64) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableFloat64) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableString struct {
+	value *string
+	isSet bool
+}
+
+func (v NullableString) Get() *string {
+	return v.value
+}
+
+func (v *NullableString) Set(val *string) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableString) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableString) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableString(val *string) *NullableString {
+	return &NullableString{value: val, isSet: true}
+}
+
+func (v NullableString) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableString) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+type NullableTime struct {
+	value *time.Time
+	isSet bool
+}
+
+func (v NullableTime) Get() *time.Time {
+	return v.value
+}
+
+func (v *NullableTime) Set(val *time.Time) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableTime) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableTime) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableTime(val *time.Time) *NullableTime {
+	return &NullableTime{value: val, isSet: true}
+}
+
+func (v NullableTime) MarshalJSON() ([]byte, error) {
+	return v.value.MarshalJSON()
+}
+
+func (v *NullableTime) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+// IsNil checks if an input is nil
+func IsNil(i interface{}) bool {
+	if i == nil {
+		return true
+	}
+	switch reflect.TypeOf(i).Kind() {
+	case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Interface, reflect.Slice:
+		return reflect.ValueOf(i).IsNil()
+	case reflect.Array:
+		return reflect.ValueOf(i).IsZero()
+	}
+	return false
+}
+
+type MappedNullable interface {
+	ToMap() (map[string]interface{}, error)
+}
diff --git a/go.mod b/go.mod
index 2fb787c9a338fec9db4225df1a67f635c85417d2..54f5f19a7356a82ef8ea68d45491111668916424 100644
--- a/go.mod
+++ b/go.mod
@@ -15,6 +15,7 @@ require (
 	github.com/sirupsen/logrus v1.9.3
 	github.com/spf13/cobra v1.7.0
 	github.com/spf13/viper v1.17.0
+	github.com/stretchr/testify v1.8.4
 	golang.org/x/sys v0.13.0
 	google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb
 	google.golang.org/grpc v1.58.2
@@ -23,6 +24,7 @@ require (
 )
 
 require (
+	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/golang/glog v1.1.2 // indirect
@@ -34,6 +36,7 @@ require (
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/sagikazarmark/locafero v0.3.0 // indirect
 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
 	github.com/sourcegraph/conc v0.3.0 // indirect