diff --git a/README.md b/README.md
index ee0612daf556eb709e928ad37c3029f9db74109c..2f18c63af973559faa98387b73c023b557ade723 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
 
 :zap: **New! Runtime [Sequence](https://interdigitalinc.github.io/AdvantEDGE/docs/usage/gui/exec-view/#sequence-diagram) and [Data Flow](https://interdigitalinc.github.io/AdvantEDGE/docs/usage/gui/exec-view/#data-flow-diagram) diagrams :chart_with_upwards_trend:**
 
-:zap: **Service API upgrade to version 3.2.1 for [ETSI MEC011](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#edge-platform-application-enablement-service), [ETSI MEC012](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#radio-network-information-service), [ETSI MEC013](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#location-service), [ETSI MEC021](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#application-mobility-service), [ETSI MEC030](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#v2x-information-service), [ETSI MEC033](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#iot-api) and [ETSI MEC040](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#mec-federation-service) :arrow_up:**
+:zap: **Service API upgrade to version 3.2.1 for [ETSI MEC011](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#edge-platform-application-enablement-service), [ETSI MEC012](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#radio-network-information-service), [ETSI MEC013](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#location-service), [ETSI MEC021](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#application-mobility-service), [ETSI MEC030](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#v2x-information-service) :arrow_up:**
 
 :zap: **[Runtime Setup](https://interdigitalinc.github.io/AdvantEDGE/docs/setup/env-runtime/) updates to support k8s versions up to 1.26 :arrow_up:**
 
@@ -22,9 +22,17 @@
 
 **_What's New in v1.10.0!_**
 
-:zap: **New MEC Federation service: [ETSI MEC040 - MEC Federation Service API](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#mec-federation-service)**
+:zap: **New edge native service: [ETSI MEC Profile for CAPIF](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#edge-platform-application-enablement-service)**
 
-:zap: **New command line api: **
+:zap: **New edge native service: [ETSI MEC040 - MEC Federation API](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#mec-federation-service)**
+
+:zap: **Service API upgrade to MEC Phase 3 for [ETSI MEC011](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#edge-platform-application-enablement-service), [ETSI MEC012](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#radio-network-information-service), [ETSI MEC013](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#location-service), [ETSI MEC021](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#application-mobility-service), [ETSI MEC030](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#v2x-information-service), [ETSI MEC033](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#iot-api), [ETSI MEC040](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#mec-federation-service) and [ETSI MEC046](https://interdigitalinc.github.io/AdvantEDGE/docs/overview/edge-services/#mec-sensors-sharing) :arrow_up:**
+
+:zap: **New command line api to develop MEC application/service without GUI**
+
+:zap: **General maintenance :hammer_and_wrench:**
+
+:zap: **Don't hesitate to reach out to us by initiating a [GitHub Discussion](https://github.com/InterDigitalInc/AdvantEDGE/discussions) :octocat:**
 
 ------
 
diff --git a/charts/meep-iot/.helmignore b/charts/meep-iot/.helmignore
new file mode 100644
index 0000000000000000000000000000000000000000..f0c13194444163d1cba5c67d9e79231a62bc8f44
--- /dev/null
+++ b/charts/meep-iot/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/charts/meep-iot/Chart.yaml b/charts/meep-iot/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e148b97873c06df05318097fe7d66491198b6379
--- /dev/null
+++ b/charts/meep-iot/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: '1.0.0'
+description: MEEP IOT Information Service Helm chart for Kubernetes
+name: meep-iot
+version: 1.0.0
diff --git a/charts/meep-iot/templates/_helpers.tpl b/charts/meep-iot/templates/_helpers.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..43ab1ed99065087e95e63b8f03dfa562994ec2fd
--- /dev/null
+++ b/charts/meep-iot/templates/_helpers.tpl
@@ -0,0 +1,32 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "meep-iot.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "meep-iot.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "meep-iot.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
diff --git a/charts/meep-iot/templates/clusterrolebinding.yaml b/charts/meep-iot/templates/clusterrolebinding.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..09442d4ff4a8be864d6ba024e53ff5d0d855312a
--- /dev/null
+++ b/charts/meep-iot/templates/clusterrolebinding.yaml
@@ -0,0 +1,12 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: "{{ .Release.Namespace }}:{{ template "meep-iot.fullname" . }}"
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: cluster-admin
+subjects:
+- kind: ServiceAccount
+  name: {{ template "meep-iot.fullname" . }}
+  namespace: {{ .Release.Namespace }}
diff --git a/charts/meep-iot/templates/codecov-pv.yaml b/charts/meep-iot/templates/codecov-pv.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4935d8a105d30b290f1440abaaf327217a925f5a
--- /dev/null
+++ b/charts/meep-iot/templates/codecov-pv.yaml
@@ -0,0 +1,35 @@
+{{- if .Values.codecov.enabled}}
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: meep-iot-codecov-pv
+spec:
+  storageClassName: meep-iot-codecov-sc
+  capacity:
+    storage: 100Mi
+  accessModes:
+    - ReadWriteOnce
+  persistentVolumeReclaimPolicy: Retain
+  hostPath:
+    path: {{ .Values.codecov.location }}
+
+---
+kind: StorageClass
+apiVersion: storage.k8s.io/v1
+metadata:
+  name: meep-iot-codecov-sc
+proiotioner: kubernetes.io/no-proiotioner
+volumeBindingMode: WaitForFirstConsumer
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: meep-iot-codecov-pvc
+spec:
+  storageClassName: meep-iot-codecov-sc
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 100Mi
+{{- end}}
diff --git a/charts/meep-iot/templates/deployment.yaml b/charts/meep-iot/templates/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e4246fe2a801921e9e55f757e19b542185c08657
--- /dev/null
+++ b/charts/meep-iot/templates/deployment.yaml
@@ -0,0 +1,61 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ template "meep-iot.fullname" . }}
+  labels:
+    app: {{ template "meep-iot.name" . }}
+    chart: {{ template "meep-iot.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+    meepOrigin: {{ .Values.meepOrigin }}
+spec:
+  replicas: {{ .Values.deployment.replicas }}
+  selector:
+    matchLabels:
+      app: {{ template "meep-iot.name" . }}
+      release: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ template "meep-iot.name" . }}
+        release: {{ .Release.Name }}
+        meepOrigin: {{ .Values.meepOrigin }}
+    spec:
+      serviceAccountName: {{ .Values.serviceAccount }}
+      {{- if .Values.codecov.enabled}}
+      volumes:
+        - name: codecov-storage
+          persistentVolumeClaim:
+            claimName: meep-iot-codecov-pvc
+      {{- end}}
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - containerPort: {{ .Values.deployment.port }}
+              protocol: {{ .Values.deployment.protocol }}
+          env:
+            {{- range $key, $value := .Values.image.env }}
+            - name: {{ $key }}
+              value: {{ $value | quote }}
+            {{- end }}
+          {{- if .Values.codecov.enabled}}
+          volumeMounts:
+          - name: codecov-storage
+            mountPath: /codecov
+          {{- end}}
+      terminationGracePeriodSeconds: 5
+      initContainers:
+        {{- range $value := .Values.deployment.dependencies.system }}
+        - name: init-system-{{ $value }}
+          image: busybox:1.28
+          imagePullPolicy: IfNotPresent
+          command: ['sh', '-c', 'until nslookup {{ $value }}.kube-system ; do echo waiting for {{ $value }}; sleep 0.25; done;']
+        {{- end}}
+        {{- range $value := .Values.deployment.dependencies.namespace }}
+        - name: init-{{ $value }}
+          image: busybox:1.28
+          imagePullPolicy: IfNotPresent
+          command: ['sh', '-c', 'until nslookup {{ $value }} ; do echo waiting for {{ $value }}; sleep 0.25; done;']
+        {{- end}}
diff --git a/charts/meep-iot/templates/ingress.yaml b/charts/meep-iot/templates/ingress.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3ff653f5cff88b88f68f583a97ec1fb8f23bbc6a
--- /dev/null
+++ b/charts/meep-iot/templates/ingress.yaml
@@ -0,0 +1,42 @@
+{{- if .Values.ingress.enabled -}}
+{{- $serviceName := .Values.service.name -}}
+{{- $servicePort := .Values.service.port -}}
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: {{ $serviceName }}
+  labels:
+    app: {{ template "meep-iot.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+{{- if .Values.ingress.labels }}
+{{ toYaml .Values.ingress.labels | indent 4 }}
+{{- end }}
+  annotations:
+    {{- range $key, $value := .Values.ingress.annotations }}
+      {{ $key }}: {{ $value | quote }}
+    {{- end }}
+spec:
+  rules:
+    {{- range .Values.ingress.hosts }}
+    - http:
+        paths:
+          {{- range $path := .paths }}
+          - path: {{ $path }}
+            pathType: ImplementationSpecific
+            backend:
+              service:
+                name: {{ $serviceName }}
+                port:
+                  number: {{ $servicePort }}
+          {{- end -}}
+      {{- if .name }}
+      host: {{ .name }}
+      {{- end }}
+    {{- end -}}
+  {{- if .Values.ingress.tls }}
+  tls:
+{{ toYaml .Values.ingress.tls | indent 4 }}
+  {{- end -}}
+{{- end -}}
diff --git a/charts/meep-iot/templates/monitor.yaml b/charts/meep-iot/templates/monitor.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a3e169d64dc3aa91895de3b3190634579752af93
--- /dev/null
+++ b/charts/meep-iot/templates/monitor.yaml
@@ -0,0 +1,33 @@
+{{- if .Values.prometheus.monitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "meep-iot.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "meep-iot.name" . }}
+    chart: {{ template "meep-iot.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+    meepOrigin: {{ .Values.meepOrigin }}
+  {{- if .Values.prometheus.monitor.additionalLabels }}
+{{ toYaml .Values.prometheus.monitor.additionalLabels | indent 4 }}
+  {{- end }}
+spec:
+  selector:
+    matchLabels:
+      app: {{ template "meep-iot.name" . }}
+      release: {{ .Release.Name }}
+  endpoints:
+    - port: metrics
+      {{- if .Values.prometheus.monitor.interval }}
+      interval: {{ .Values.prometheus.monitor.interval }}
+      {{- end }}
+      {{- if .Values.prometheus.monitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.prometheus.monitor.scrapeTimeout }}
+      {{- end }}
+{{- if .Values.prometheus.monitor.relabelings }}
+      relabelings:
+{{ toYaml .Values.prometheus.monitor.relabelings | indent 6 }}
+{{- end }}
+{{- end }}
diff --git a/charts/meep-iot/templates/service.yaml b/charts/meep-iot/templates/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cfa9f30931e9b7bd9dcfe5dd1fbb278568943b58
--- /dev/null
+++ b/charts/meep-iot/templates/service.yaml
@@ -0,0 +1,28 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Values.service.name }}
+  labels:
+    app: {{ template "meep-iot.name" . }}
+    chart: {{ template "meep-iot.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+    meepOrigin: {{ .Values.meepOrigin }}
+spec:
+  type: {{ .Values.service.type }}
+  selector:
+    app: {{ template "meep-iot.name" . }}
+    release: {{ .Release.Name }}
+  ports:
+    - name: iot
+      port: {{ .Values.service.port }}
+      targetPort: {{ .Values.deployment.port }}
+      {{- if .Values.service.nodePort }}
+      nodePort: {{ .Values.service.nodePort }}
+      {{- end }}
+    {{- if .Values.prometheus.monitor.enabled}}
+    - name: metrics
+      port: {{ .Values.prometheus.monitor.port }}
+      targetPort: {{ .Values.prometheus.monitor.port }}
+      protocol: TCP
+    {{- end}}
diff --git a/charts/meep-iot/templates/serviceaccount.yaml b/charts/meep-iot/templates/serviceaccount.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0ab6a7917520f63d359701019ed0a13fe84a6788
--- /dev/null
+++ b/charts/meep-iot/templates/serviceaccount.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "meep-iot.fullname" . }}
diff --git a/charts/meep-iot/values-template.yaml b/charts/meep-iot/values-template.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5d0a231ed3f59ad92b3b38d25d7102825d295b8c
--- /dev/null
+++ b/charts/meep-iot/values-template.yaml
@@ -0,0 +1,85 @@
+# Default values for meep-iot.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+deployment:
+  replicas: 1
+  port: 80
+  protocol: TCP
+  dependencies:
+    system:
+      {{- if not .IsMepService }}
+      - kube-dns
+      {{- end }}
+    namespace:
+
+image:
+  repository: meep-docker-registry:30001/meep-iot
+  tag: latest
+  pullPolicy: Always
+  env:
+    MEEP_INSTANCE_ID: {{.InstanceId}}
+    MEEP_SANDBOX_NAME: {{.SandboxName}}
+    MEEP_SVC_PATH: /iots/v1
+    MEEP_HOST_URL: {{.HostUrl}}
+    {{- if .IsMepService }}
+    MEEP_MEP_NAME: {{.MepName}}
+    {{- end }}
+    {{- if eq .AppEnablement "local" }}
+    MEEP_APP_ENABLEMENT: {{.MepName}}-meep-app-enablement
+    {{- else if eq .AppEnablement "global" }}
+    MEEP_APP_ENABLEMENT: meep-app-enablement
+    {{- end }}
+    {{- range .Env}}
+    {{.}}
+    {{- end}}
+
+service:
+  {{- if .IsMepService }}
+  name: {{.MepName}}-meep-iot
+  {{- else }}
+  name: meep-iot
+  {{- end }}
+  type: ClusterIP
+  port: 80
+
+ingress:
+  enabled: true
+  hosts:
+    - name: ''
+      paths:
+        {{- if .IsMepService }}
+        - /{{.SandboxName}}/{{.MepName}}/iots
+        {{- else }}
+        - /{{.SandboxName}}/iots
+        {{- end }}
+  annotations:
+    kubernetes.io/ingress.class: nginx
+    nginx.ingress.kubernetes.io/force-ssl-redirect: {{ .HttpsOnly }}
+    {{- if .IsMepService }}
+    nginx.ingress.kubernetes.io/configuration-snippet: |
+      rewrite ^/{{.SandboxName}}/{{.MepName}}/iots(/|$)(.*)$ /iots/$2 break;
+    {{- else }}
+    nginx.ingress.kubernetes.io/configuration-snippet: |
+      rewrite ^/{{.SandboxName}}/iots(/|$)(.*)$ /iots/$2 break;
+    {{- end }}
+    {{- if .AuthEnabled }}
+    nginx.ingress.kubernetes.io/auth-url: https://$http_host/auth/v1/authenticate?svc=meep-iot&sbox={{.SandboxName}}&mep={{.MepName}}
+    {{- end }}
+  labels: {}
+  tls:
+
+prometheus:
+  monitor:
+    enabled: true
+    port: 9000
+    interval: 10s
+    additionalLabels: {}
+    relabelings: []
+    scrapeTimeout: 5s
+
+codecov:
+  enabled: false
+  location: "<WORKDIR>/codecov/meep-iot"
+
+meepOrigin: core
diff --git a/charts/meep-sss/.helmignore b/charts/meep-sss/.helmignore
new file mode 100644
index 0000000000000000000000000000000000000000..f0c13194444163d1cba5c67d9e79231a62bc8f44
--- /dev/null
+++ b/charts/meep-sss/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/charts/meep-sss/Chart.yaml b/charts/meep-sss/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..96a8c44cda4e0c104c0db0b6b2f8d4b88da2377b
--- /dev/null
+++ b/charts/meep-sss/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0.0"
+description: MEEP Device Application Interface Service Helm chart for Kubernetes
+name: meep-sss
+version: 1.0.0
diff --git a/charts/meep-sss/templates/_helpers.tpl b/charts/meep-sss/templates/_helpers.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..ff0697846a8a48f83a9a0b16f0fc00809fa7a0ab
--- /dev/null
+++ b/charts/meep-sss/templates/_helpers.tpl
@@ -0,0 +1,32 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "meep-sss.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "meep-sss.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "meep-sss.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
diff --git a/charts/meep-sss/templates/clusterrolebinding.yaml b/charts/meep-sss/templates/clusterrolebinding.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a5525c020d143e91ab01e026b892b2e41acaa4e2
--- /dev/null
+++ b/charts/meep-sss/templates/clusterrolebinding.yaml
@@ -0,0 +1,13 @@
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: "{{ .Release.Namespace }}:{{ template "meep-sss.fullname" . }}"
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: ClusterRole
+  name: cluster-admin
+subjects:
+- kind: ServiceAccount
+  name: {{ template "meep-sss.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  
\ No newline at end of file
diff --git a/charts/meep-sss/templates/codecov-pv.yaml b/charts/meep-sss/templates/codecov-pv.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a983fe2babf6e431491cdbad09c97b6b7e57c57a
--- /dev/null
+++ b/charts/meep-sss/templates/codecov-pv.yaml
@@ -0,0 +1,35 @@
+{{- if .Values.codecov.enabled}}
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+  name: meep-sss-codecov-pv
+spec:
+  storageClassName: meep-sss-codecov-sc
+  capacity:
+    storage: 100Mi
+  accessModes:
+    - ReadWriteOnce
+  persistentVolumeReclaimPolicy: Retain
+  hostPath:
+    path: {{ .Values.codecov.location }}
+
+---
+kind: StorageClass
+apiVersion: storage.k8s.io/v1
+metadata:
+  name: meep-sss-codecov-sc
+provisioner: kubernetes.io/no-provisioner
+volumeBindingMode: WaitForFirstConsumer
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+  name: meep-sss-codecov-pvc
+spec:
+  storageClassName: meep-sss-codecov-sc
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 100Mi
+{{- end}}
diff --git a/charts/meep-sss/templates/deployment.yaml b/charts/meep-sss/templates/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..da7ba495734e9e8e4940d65ff99242b1b0a13b94
--- /dev/null
+++ b/charts/meep-sss/templates/deployment.yaml
@@ -0,0 +1,63 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ template "meep-sss.fullname" . }}
+  labels:
+    app: {{ template "meep-sss.name" . }}
+    chart: {{ template "meep-sss.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+    meepOrigin: {{ .Values.meepOrigin }}
+spec:
+  replicas: {{ .Values.deployment.replicas }}
+  selector:
+    matchLabels:
+      app: {{ template "meep-sss.name" . }}
+      release: {{ .Release.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ template "meep-sss.name" . }}
+        release: {{ .Release.Name }}
+        meepOrigin: {{ .Values.meepOrigin }}
+    spec:
+      serviceAccountName: {{ .Values.serviceAccount }}
+      volumes:
+      {{- if .Values.codecov.enabled}}
+        - name: codecov-storage
+          persistentVolumeClaim:
+            claimName: meep-sss-codecov-pvc
+      {{- end}}
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - containerPort: {{ .Values.deployment.port }}
+              protocol: {{ .Values.deployment.protocol }}
+            - containerPort: 31122
+              protocol: TCP
+          env:
+            {{- range $key, $value := .Values.image.env }}
+            - name: {{ $key }}
+              value: {{ $value | quote }}
+            {{- end }}
+          volumeMounts:
+          {{- if .Values.codecov.enabled}}
+          - name: codecov-storage
+            mountPath: /codecov
+          {{- end}}
+      terminationGracePeriodSeconds: 5
+      initContainers:
+        {{- range $value := .Values.deployment.dependencies.system }}
+        - name: init-system-{{ $value }}
+          image: busybox:1.28
+          imagePullPolicy: IfNotPresent
+          command: ['sh', '-c', 'until nslookup {{ $value }}.kube-system ; do echo waiting for {{ $value }}; sleep 0.25; done;']
+        {{- end}}
+        {{- range $value := .Values.deployment.dependencies.namespace }}
+        - name: init-{{ $value }}
+          image: busybox:1.28
+          imagePullPolicy: IfNotPresent
+          command: ['sh', '-c', 'until nslookup {{ $value }} ; do echo waiting for {{ $value }}; sleep 0.25; done;']
+        {{- end}}
diff --git a/charts/meep-sss/templates/ingress.yaml b/charts/meep-sss/templates/ingress.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..580a422f4905a24e0eeb8d7db599f9ff2439fde9
--- /dev/null
+++ b/charts/meep-sss/templates/ingress.yaml
@@ -0,0 +1,42 @@
+{{- if .Values.ingress.enabled -}}
+{{- $serviceName := .Values.service.name -}}
+{{- $servicePort := .Values.service.port -}}
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: {{ $serviceName }}
+  labels:
+    app: {{ template "meep-sss.name" . }}
+    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+{{- if .Values.ingress.labels }}
+{{ toYaml .Values.ingress.labels | indent 4 }}
+{{- end }}
+  annotations:
+    {{- range $key, $value := .Values.ingress.annotations }}
+      {{ $key }}: {{ $value | quote }}
+    {{- end }}
+spec:
+  rules:
+    {{- range .Values.ingress.hosts }}
+    - http:
+        paths:
+          {{- range $path := .paths }}
+          - path: {{ $path.path }}
+            pathType: ImplementationSpecific
+            backend:
+              service:
+                name: {{ $serviceName }}
+                port:
+                  number: {{ $servicePort }}
+          {{- end -}}
+      {{- if .name }}
+      host: {{ .name }}
+      {{- end }}
+    {{- end -}}
+  {{- if .Values.ingress.tls }}
+  tls:
+{{ toYaml .Values.ingress.tls | indent 4 }}
+  {{- end -}}
+{{- end -}}
diff --git a/charts/meep-sss/templates/monitor.yaml b/charts/meep-sss/templates/monitor.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fdfec7d1f81e0513752486c1252e7863bc51bf4f
--- /dev/null
+++ b/charts/meep-sss/templates/monitor.yaml
@@ -0,0 +1,33 @@
+{{- if .Values.prometheus.monitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template "meep-sss.fullname" . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app: {{ template "meep-sss.name" . }}
+    chart: {{ template "meep-sss.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+    meepOrigin: {{ .Values.meepOrigin }}
+  {{- if .Values.prometheus.monitor.additionalLabels }}
+{{ toYaml .Values.prometheus.monitor.additionalLabels | indent 4 }}
+  {{- end }}
+spec:
+  selector:
+    matchLabels:
+      app: {{ template "meep-sss.name" . }}
+      release: {{ .Release.Name }}
+  endpoints:
+    - port: metrics
+      {{- if .Values.prometheus.monitor.interval }}
+      interval: {{ .Values.prometheus.monitor.interval }}
+      {{- end }}
+      {{- if .Values.prometheus.monitor.scrapeTimeout }}
+      scrapeTimeout: {{ .Values.prometheus.monitor.scrapeTimeout }}
+      {{- end }}
+{{- if .Values.prometheus.monitor.relabelings }}
+      relabelings:
+{{ toYaml .Values.prometheus.monitor.relabelings | indent 6 }}
+{{- end }}
+{{- end }}
diff --git a/charts/meep-sss/templates/service.yaml b/charts/meep-sss/templates/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ddfd90a9870ee5f865cc2e9789b66ebe81e54062
--- /dev/null
+++ b/charts/meep-sss/templates/service.yaml
@@ -0,0 +1,32 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Values.service.name }}
+  labels:
+    app: {{ template "meep-sss.name" . }}
+    chart: {{ template "meep-sss.chart" . }}
+    release: {{ .Release.Name }}
+    heritage: {{ .Release.Service }}
+    meepOrigin: {{ .Values.meepOrigin }}
+spec:
+  type: {{ .Values.service.type }}
+  selector:
+    app: {{ template "meep-sss.name" . }}
+    release: {{ .Release.Name }}
+  ports:
+    - name: sss
+      port: {{ .Values.service.port }}
+      targetPort: {{ .Values.deployment.port }}
+      {{- if .Values.service.nodePort }}
+      nodePort: {{ .Values.service.nodePort }}
+      {{- end }}
+    - name: onem2m
+      port: 31122
+      targetPort: 31122
+    {{- if .Values.prometheus.monitor.enabled}}
+    - name: metrics
+      port: {{ .Values.prometheus.monitor.port }}
+      targetPort: {{ .Values.prometheus.monitor.port }}
+      protocol: TCP
+    {{- end}}
+
diff --git a/charts/meep-sss/templates/serviceaccount.yaml b/charts/meep-sss/templates/serviceaccount.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f8274b8a89917e921940e8852656af56ba8df692
--- /dev/null
+++ b/charts/meep-sss/templates/serviceaccount.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ template "meep-sss.fullname" . }}
diff --git a/charts/meep-sss/values-template.yaml b/charts/meep-sss/values-template.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..08082698d5e060b882b052e28cca9c964e731bfb
--- /dev/null
+++ b/charts/meep-sss/values-template.yaml
@@ -0,0 +1,96 @@
+# Default values for meep-sss.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+deployment:
+  replicas: 1
+  port: 80
+  protocol: TCP
+  dependencies:
+    system:
+      {{- if not .IsMepService }}
+      - kube-dns
+      {{- end }}
+    namespace:
+
+image:
+  repository: meep-docker-registry:30001/meep-sss
+  tag: latest
+  pullPolicy: Always
+  env:
+    MEEP_INSTANCE_ID: {{.InstanceId}}
+    MEEP_SANDBOX_NAME: {{.SandboxName}}
+    MEEP_SVC_PATH: /sens/v1
+    MEEP_HOST_URL: {{.HostUrl}}
+    {{- if .IsMepService }}
+    MEEP_MEP_NAME: {{.MepName}}
+    {{- end }}
+    {{- if eq .AppEnablement "local" }}
+    MEEP_APP_ENABLEMENT: {{.MepName}}-meep-app-enablement
+    {{- else if eq .AppEnablement "global" }}
+    MEEP_APP_ENABLEMENT: meep-app-enablement
+    {{- end }}
+    {{- range .Env}}
+    {{.}}
+    {{- end}}
+
+service:
+  {{- if .IsMepService }}
+  name: {{.MepName}}-meep-sss
+  {{- else }}
+  name: meep-sss
+  {{- end }}
+  type: ClusterIP
+  port: 80
+
+ingress:
+  enabled: true
+  hosts:
+    - name: ''
+      paths:
+        {{- if .IsMepService }}
+        - path: /{{.SandboxName}}/{{.MepName}}/sens
+          port: 80
+        - path: /{{.SandboxName}}/{{.MepName}}/onem2m
+          port: 31122
+        {{- else }}
+        - path: /{{.SandboxName}}/sens
+          port: 80
+        - path: /{{.SandboxName}}/onem2m
+          port: 31122
+        {{- end }}
+  annotations:
+    kubernetes.io/ingress.class: nginx
+    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
+    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
+    nginx.ingress.kubernetes.io/force-ssl-redirect: {{ .HttpsOnly }}
+    {{- if .IsMepService }}
+    nginx.ingress.kubernetes.io/configuration-snippet: |
+      rewrite ^/{{.SandboxName}}/{{.MepName}}/sens(/|$)(.*)$ /sens/$2 break;
+      rewrite ^/{{.SandboxName}}/{{.MepName}}/onem2m(/|$)(.*)$ /$2 break;
+    {{- else }}
+    nginx.ingress.kubernetes.io/configuration-snippet: |
+      rewrite ^/{{.SandboxName}}/sens(/|$)(.*)$ /sens/$2 break;
+      rewrite ^/{{.SandboxName}}/onem2m(/|$)(.*)$ /$2 break;
+    {{- end }}
+    {{- if .AuthEnabled }}
+    nginx.ingress.kubernetes.io/auth-url: https://$http_host/auth/v1/authenticate?svc=meep-sss&sbox={{.SandboxName}}&mep={{.MepName}}
+    {{- end }}
+  labels: {}
+  tls:
+
+prometheus:
+  monitor:
+    enabled: true
+    port: 9000
+    interval: 10s
+    additionalLabels: {}
+    relabelings: []
+    scrapeTimeout: 5s
+    
+codecov:
+  enabled: false
+  location: "<WORKDIR>/codecov/meep-sss"
+
+
+meepOrigin: core
diff --git a/docs/api-iot/Addresses.md b/docs/api-iot/Addresses.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ea47be3b641d731492a560a536ac47da04558e0
--- /dev/null
+++ b/docs/api-iot/Addresses.md
@@ -0,0 +1,10 @@
+# Addresses
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Host** | **string** | Host portion of the address. | [default to null]
+**Port** | **int32** | Port portion of the address. | [default to null]
+
+[[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/docs/api-iot/DeviceInfo.md b/docs/api-iot/DeviceInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..58d4bea5a4fcabea494a2cb19d1ed0f4048399f2
--- /dev/null
+++ b/docs/api-iot/DeviceInfo.md
@@ -0,0 +1,25 @@
+# DeviceInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DeviceAuthenticationInfo** | **string** | Information needed for secondary authentication of the IoT device to the data network - see ETSI TS 129 561 [i.4] and ETSI TS 129 061 [i.5] for 5G and LTE procedures, respectively. This attribute is implementation dependent and should be logically linked to the identifiers of the IoT device listed hereafter. | [default to null]
+**DeviceMetadata** | [**[]KeyValuePair**](KeyValuePair.md) | Additional information about the IoT device. This attribute is implementation dependent and may be expressed as an array of keyvalue pairs.  | [optional] [default to null]
+**Gpsi** | **string** | GPSI of the IoT device if 5G-enabled (see note 1). | [optional] [default to null]
+**Pei** | **string** | PEI of the IoT device if 5G-enabled (see note 1). | [optional] [default to null]
+**Supi** | **string** | SUPI of the IoT device if 5G-enabled (see note 1). | [optional] [default to null]
+**Msisdn** | **string** | MSISDN of the IoT device if LTE-enabled (see note 1). | [optional] [default to null]
+**Imei** | **string** | IMEI of the IoT device if LTE-enabled (see note 1). | [optional] [default to null]
+**Imsi** | **string** | IMSI of the IoT device if LTE-enabled (see note 1). | [optional] [default to null]
+**Iccid** | **string** | ICCID of the IoT device (see note 1). | [optional] [default to null]
+**DeviceId** | **string** | Human-readable identifier of the IoT device. | [default to null]
+**RequestedMecTrafficRule** | [**[]TrafficRuleDescriptor**](TrafficRuleDescriptor.md) | MEC traffic rules the IoT device is requested to be associated to (see note 2). The data type definition is as per ETSI GS MEC 010-2 [i.6]. | [optional] [default to null]
+**RequestedIotPlatformId** | **string** | IoT platform to which the IoT device is requested to be associated to (see note 2). | [optional] [default to null]
+**RequestedUserTransportId** | **string** | User transport to which the IoT device is requested to be associated to (see note 2). | [optional] [default to null]
+**DeviceSpecificMessageFormats** | [***DeviceSpecificMessageFormats**](DeviceSpecificMessageFormats.md) |  | [optional] [default to null]
+**DownlinkInfo** | [***DownlinkInfo**](DownlinkInfo.md) |  | [optional] [default to null]
+**ClientCertificate** | **string** | Client-side SSL/TLS certificate to be used by the MEC IoTS to interact with the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device. | [optional] [default to null]
+**Enabled** | **bool** | Indication whether the IoT device has a valid associated traffic rule (TRUE) or not (FALSE). See note 3. | [default to null]
+
+[[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/docs/api-iot/DeviceSpecificMessageFormats.md b/docs/api-iot/DeviceSpecificMessageFormats.md
new file mode 100644
index 0000000000000000000000000000000000000000..0869c5cb340204d6d1fa70ef89af5bb0c2bd1de9
--- /dev/null
+++ b/docs/api-iot/DeviceSpecificMessageFormats.md
@@ -0,0 +1,10 @@
+# DeviceSpecificMessageFormats
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**EventMsgFormat** | [***EventMsg**](EventMsg.md) |  | [optional] [default to null]
+**UplinkMsgFormat** | [***UplinkMsg**](UplinkMsg.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/DownlinkInfo.md b/docs/api-iot/DownlinkInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..ba3d84cf2027f40553d755cf7db72df55f5f02ac
--- /dev/null
+++ b/docs/api-iot/DownlinkInfo.md
@@ -0,0 +1,10 @@
+# DownlinkInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DownlinkTopic** | **string** | Topic associated to the IoT device. This topic should be used by an end IoT application to send downlink data to the IoT device. | [optional] [default to null]
+**DevicePort** | **int32** | UDP port to be used by the MEC IoTS for the outgoing downlink packets towards the IoT device. In case a default value is used, this attribute is optional. | [optional] [default to null]
+
+[[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/docs/api-iot/EndPointInfo.md b/docs/api-iot/EndPointInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..9c6821ec76242fbf621b7a23f5e57ff1a0be6cf9
--- /dev/null
+++ b/docs/api-iot/EndPointInfo.md
@@ -0,0 +1,12 @@
+# EndPointInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Uris** | **[]string** | Entry point information of the service as string, formatted according to URI syntax (see IETF RFC 3986 [8]). Shall be used for REST APIs. See note. | [optional] [default to null]
+**Fqdn** | **[]string** | Fully Qualified Domain Name of the service. See note. | [optional] [default to null]
+**Addresses** | [**[]Addresses**](Addresses.md) |  | [optional] [default to null]
+**Alternative** | **string** | Entry point information of the service in a format defined by an implementation, or in an external specification. See note. | [optional] [default to null]
+
+[[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/docs/api-iot/EventMsg.md b/docs/api-iot/EventMsg.md
new file mode 100644
index 0000000000000000000000000000000000000000..c5af0adb4cac45b4ad4ae257c71d4e25f83fa63c
--- /dev/null
+++ b/docs/api-iot/EventMsg.md
@@ -0,0 +1,18 @@
+# EventMsg
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**EventTopic** | **string** | Topic where the message containing application-specific information should be published.  | [default to null]
+**SelectedSerializer** | [***SerializerType**](SerializerType.md) |  | [default to null]
+**IncludeDeviceAddr** | **bool** | Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceMetadata** | **bool** | Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludePei** | **bool** | Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeSupi** | **bool** | Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImei** | **bool** | Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImsi** | **bool** | Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeIccid** | **bool** | Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceId** | **bool** | Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+
+[[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/docs/api-iot/ImplSpecificInfo.md b/docs/api-iot/ImplSpecificInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..80c29e783782c08ed12c835712f8e95d51511e0d
--- /dev/null
+++ b/docs/api-iot/ImplSpecificInfo.md
@@ -0,0 +1,11 @@
+# ImplSpecificInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**EventTopics** | **[]string** | Topics used to publish events related to the established session between the IoT device(s) and the end IoT application(s) on the user transport. | [optional] [default to null]
+**UplinkTopics** | **[]string** | Topics used to publish data generated by the IoT device(s) on the user transport, in order to be consumed by the end IoT application(s). | [optional] [default to null]
+**DownlinkTopics** | **[]string** | Topics used to publish data generated by the IoT applications(s) on the user transport, in order to be consumed by the end IoT device(s). | [optional] [default to null]
+
+[[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/docs/api-iot/InlineResponse200.md b/docs/api-iot/InlineResponse200.md
new file mode 100644
index 0000000000000000000000000000000000000000..09b79cb8416034f0564b3459c5294fffc71a585a
--- /dev/null
+++ b/docs/api-iot/InlineResponse200.md
@@ -0,0 +1,9 @@
+# InlineResponse200
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Items** | [***DeviceInfo**](DeviceInfo.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/InlineResponse2001.md b/docs/api-iot/InlineResponse2001.md
new file mode 100644
index 0000000000000000000000000000000000000000..cacfbb80487867c65da1c653668bb468ce286d36
--- /dev/null
+++ b/docs/api-iot/InlineResponse2001.md
@@ -0,0 +1,9 @@
+# InlineResponse2001
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IotPlatformInfo** | [***IotPlatformInfo**](IotPlatformInfo.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/InterfaceDescriptor.md b/docs/api-iot/InterfaceDescriptor.md
new file mode 100644
index 0000000000000000000000000000000000000000..6be8d4353e414ab89f0d904a2a0cba1517458172
--- /dev/null
+++ b/docs/api-iot/InterfaceDescriptor.md
@@ -0,0 +1,13 @@
+# InterfaceDescriptor
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**InterfaceType** | **string** | Type of interface: TUNNEL, MAC, IP, etc. | [default to null]
+**TunnelInfo** | [***TunnelInfo**](TunnelInfo.md) |  | [optional] [default to null]
+**SrcMACAddress** | **string** | If the interface type is MAC, the source address identifies the MAC address of the interface. | [optional] [default to null]
+**DstMACAddress** | **string** | If the interface type is MAC, the destination address identifies the MAC address of the destination. Only used for dstInterface. | [optional] [default to null]
+**DstIPAddress** | **string** | If the interface type is IP, the destination address identifies the IP address of the destination. Only used for dstInterface. | [optional] [default to null]
+
+[[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/docs/api-iot/IotPlatformInfo.md b/docs/api-iot/IotPlatformInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..d96c7a45ccb0d3add34e21aaab469605d97bd177
--- /dev/null
+++ b/docs/api-iot/IotPlatformInfo.md
@@ -0,0 +1,12 @@
+# IotPlatformInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IotPlatformId** | **string** | Identifier of the IoT platform. | [default to null]
+**UserTransportInfo** | [**[]MbTransportInfo**](MBTransportInfo.md) | Information about the user transport(s)  provided by the IoT platform. | [default to null]
+**CustomServicesTransportInfo** | [**[]TransportInfo**](TransportInfo.md) | Transport enabling access to vendor-specific services provided by the IoT platform. The data type definition is as per ETSI GS MEC 011 [i.2]. | [optional] [default to null]
+**Enabled** | **bool** | Indication whether the IoT platform is capable of providing user transports and vendor-specific services (TRUE) or not (FALSE). | [default to null]
+
+[[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/docs/api-iot/KeyValuePair.md b/docs/api-iot/KeyValuePair.md
new file mode 100644
index 0000000000000000000000000000000000000000..45ef9c0e85767dc613e04364bf3adfc577c57014
--- /dev/null
+++ b/docs/api-iot/KeyValuePair.md
@@ -0,0 +1,10 @@
+# KeyValuePair
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Key** | **string** |  | [optional] [default to null]
+**Value** | **string** |  | [optional] [default to null]
+
+[[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/docs/api-iot/MbTransportInfo.md b/docs/api-iot/MbTransportInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..6a68795f954541145bf1838304977b550a7cd68b
--- /dev/null
+++ b/docs/api-iot/MbTransportInfo.md
@@ -0,0 +1,17 @@
+# MbTransportInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Id** | **string** | The identifier of this transport as per ETSI GS MEC 011 [i.2]. | [default to null]
+**Name** | **string** | The name of this transport as per ETSI GS MEC 011 [i.2]. | [default to null]
+**Description** | **string** | Human-readable description of this transport as per ETSI GS MEC 011 [i.2]. | [optional] [default to null]
+**Type_** | [***TransportType**](TransportType.md) |  | [default to null]
+**Protocol** | **string** | The name of the protocol used. Being the transport of MB_TOPIC_BASED type, this attribute should be typically set to \&quot;MQTT\&quot; or \&quot;AMQP.\&quot; | [default to null]
+**Version** | **string** | The version of the protocol used as per ETSI GS MEC 011 [i.2]. | [default to null]
+**Endpoint** | [***EndPointInfo**](EndPointInfo.md) |  | [default to null]
+**Security** | [***SecurityInfo**](SecurityInfo.md) |  | [default to null]
+**ImplSpecificInfo** | [***ImplSpecificInfo**](ImplSpecificInfo.md) |  | [default to null]
+
+[[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/docs/api-iot/OAuth2Info.md b/docs/api-iot/OAuth2Info.md
new file mode 100644
index 0000000000000000000000000000000000000000..2036501367684811b6b51823f52c3b4b64a26fcb
--- /dev/null
+++ b/docs/api-iot/OAuth2Info.md
@@ -0,0 +1,10 @@
+# OAuth2Info
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**GrantTypes** | **[]string** | List of supported OAuth 2.0 grant types. Each entry shall be one of the following permitted values: - OAUTH2_AUTHORIZATION_CODE: Authorization code grant type - OAUTH2_IMPLICIT_GRANT: Implicit grant type - OAUTH2_RESOURCE_OWNER: Resource owner password credentials grant type - OAUTH2_CLIENT_CREDENTIALS: Client credentials grant type Only the value \&quot;OAUTH2_CLIENT_CREDENTIALS\&quot; is supported in the present document.  | [default to null]
+**TokenEndpoint** | **string** | The token endpoint. Shall be present unless the grant type is OAUTH2_IMPLICIT_GRANT. | [optional] [default to null]
+
+[[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/docs/api-iot/ProblemDetails.md b/docs/api-iot/ProblemDetails.md
new file mode 100644
index 0000000000000000000000000000000000000000..f2596ffa3944f557c5f98c6a7ff38b6430c3dd58
--- /dev/null
+++ b/docs/api-iot/ProblemDetails.md
@@ -0,0 +1,13 @@
+# ProblemDetails
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Type_** | **string** | A URI reference according to IETF RFC 3986 that identifies the problem type | [optional] [default to null]
+**Title** | **string** | A short, human-readable summary of the problem type | [optional] [default to null]
+**Status** | **int32** | The HTTP status code for this occurrence of the problem | [optional] [default to null]
+**Detail** | **string** | A human-readable explanation specific to this occurrence of the problem | [optional] [default to null]
+**Instance** | **string** | A URI reference that identifies the specific occurrence of the problem | [optional] [default to null]
+
+[[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/docs/api-iot/RegDevApi.md b/docs/api-iot/RegDevApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..6927235585df40767313da72af2385176f36bafb
--- /dev/null
+++ b/docs/api-iot/RegDevApi.md
@@ -0,0 +1,160 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sandboxname/amsi/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**RegistereddevicesByIdDELETE**](RegDevApi.md#RegistereddevicesByIdDELETE) | **Delete** /registered_devices/{registeredDeviceId} | Deregister a device - see clause 5.2.6.
+[**RegistereddevicesByIdGET**](RegDevApi.md#RegistereddevicesByIdGET) | **Get** /registered_devices/{registeredDeviceId} | Retrieve information about a device - see clause 5.2.4.
+[**RegistereddevicesByIdPUT**](RegDevApi.md#RegistereddevicesByIdPUT) | **Put** /registered_devices/{registeredDeviceId} | Update information about a  device including its association to a valid traffic rule - see clauses 5.2.5 and 5.4.3.
+[**RegistereddevicesGET**](RegDevApi.md#RegistereddevicesGET) | **Get** /registered_devices | Retrieve information about all devices with a valid traffic rule association - see clause 5.2.2.
+[**RegistereddevicesPOST**](RegDevApi.md#RegistereddevicesPOST) | **Post** /registered_devices | Register a new device - see clause 5.2.3.
+
+# **RegistereddevicesByIdDELETE**
+> RegistereddevicesByIdDELETE(ctx, registeredDeviceId)
+Deregister a device - see clause 5.2.6.
+
+The DELETE method may be used by a service consumer to deregister a device. This method is typically used in the \"device deregistration\" procedure as described in clause 5.2.6.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredDeviceId** | **string**| The unique identifier of the registered device. | 
+
+### Return type
+
+ (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/problem+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)
+
+# **RegistereddevicesByIdGET**
+> RegisteredDevicesBody RegistereddevicesByIdGET(ctx, registeredDeviceId)
+Retrieve information about a device - see clause 5.2.4.
+
+The GET method may be used by a service consumer to retrieve information about a device. This method is typically used in the \"device registration query\" procedure as described in clause 5.2.4.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredDeviceId** | **string**| The unique identifier of the registered device. | 
+
+### Return type
+
+[**RegisteredDevicesBody**](registered_devices_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegistereddevicesByIdPUT**
+> RegisteredDevicesRegisteredDeviceIdBody RegistereddevicesByIdPUT(ctx, body, registeredDeviceId)
+Update information about a  device including its association to a valid traffic rule - see clauses 5.2.5 and 5.4.3.
+
+The PUT method may be used by a service consumer to update a device registration including its association to a valid traffic rule. This method is typically used in the \"device registration update\" procedure as described in clause 5.2.5 and in the \"user transport assignment\" procedure as described in clause 5.4.3.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredDevicesRegisteredDeviceIdBody**](RegisteredDevicesRegisteredDeviceIdBody.md)| One or more updated attributes that are allowed to be changed are included in the DeviceInfo data structure in the payload body of the request. . | 
+  **registeredDeviceId** | **string**| The unique identifier of the registered device. | 
+
+### Return type
+
+[**RegisteredDevicesRegisteredDeviceIdBody**](registered_devices_registeredDeviceId_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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)
+
+# **RegistereddevicesGET**
+> InlineResponse200 RegistereddevicesGET(ctx, optional)
+Retrieve information about all devices with a valid traffic rule association - see clause 5.2.2.
+
+The GET method may be used by a service consumer to retrieve information about all devices with a valid traffic rule association. This method is typically used in the \"registered devices query\" procedure as described in clause 5.2.2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***RegDevApiRegistereddevicesGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a RegDevApiRegistereddevicesGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **filter** | **optional.String**| Attribute-based filtering parameters according to ETSI GS MEC 009 [i.1]. The API producer shall support receiving the following filtering parameters as part of the URI query string: \&quot;(eq,enabled,TRUE)\&quot;.  | 
+ **fields** | [**optional.Interface of []string**](string.md)| The list may contain one or more of the following attributes from the DeviceInfo data type: - deviceMetadata - gpsi - msisdn - deviceId - requestedMecTrafficRule - requestedIotPlatformId - requestedUserTransportId  | 
+
+### Return type
+
+[**InlineResponse200**](inline_response_200.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegistereddevicesPOST**
+> RegisteredDevicesBody RegistereddevicesPOST(ctx, body)
+Register a new device - see clause 5.2.3.
+
+The POST method may be used by a service consumer to register a new device. This method is typically used in the \"device registration\" procedure as described in clause 5.2.3.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredDevicesBody**](RegisteredDevicesBody.md)| Payload body in the request contains the information associated to the IoT device to be registered. | 
+
+### Return type
+
+[**RegisteredDevicesBody**](registered_devices_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/api-iot/RegIotPlatApi.md b/docs/api-iot/RegIotPlatApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..3041d85f50b2c75458a2e2b7eb598263178aa413
--- /dev/null
+++ b/docs/api-iot/RegIotPlatApi.md
@@ -0,0 +1,167 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sandboxname/amsi/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**RegisterediotplatformsByIdDELETE**](RegIotPlatApi.md#RegisterediotplatformsByIdDELETE) | **Delete** /registered_iot_platforms/{registeredIotPlatformId} | Deregister a IoT platform - see clause 5.3.6.
+[**RegisterediotplatformsByIdGET**](RegIotPlatApi.md#RegisterediotplatformsByIdGET) | **Get** /registered_iot_platforms/{registeredIotPlatformId} | Discover native services and obtain information about user transports provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+[**RegisterediotplatformsByIdPUT**](RegIotPlatApi.md#RegisterediotplatformsByIdPUT) | **Put** /registered_iot_platforms/{registeredIotPlatformId} | Update information about a IoT platform - see clause 5.3.5.
+[**RegisterediotplatformsGET**](RegIotPlatApi.md#RegisterediotplatformsGET) | **Get** /registered_iot_platforms | Retrieve information about all IoT platforms - see clause 5.3.2.
+[**RegisterediotplatformsPOST**](RegIotPlatApi.md#RegisterediotplatformsPOST) | **Post** /registered_iot_platforms | Register a IoT platform - see clause 5.3.4.
+
+# **RegisterediotplatformsByIdDELETE**
+> RegisterediotplatformsByIdDELETE(ctx, registeredIotPlatformId)
+Deregister a IoT platform - see clause 5.3.6.
+
+The DELETE method may be used by a service consumer to deregister a IoT platform. This method is typically used in the \"IoT platform deregistration\" procedure as described in clause 5.3.6.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredIotPlatformId** | **string**| The unique identifier of the registered IoT platform. | 
+
+### Return type
+
+ (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/problem+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)
+
+# **RegisterediotplatformsByIdGET**
+> InlineResponse2001 RegisterediotplatformsByIdGET(ctx, registeredIotPlatformId, optional)
+Discover native services and obtain information about user transports provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+
+The GET method may be used by a service consumer to obtain information about a IoT platform. This method is typically used in the \"IoT platform information request\" procedure as described in clause 5.3.3 and in the \"user transport query\" procedure as described in clause 5.4.2. 
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredIotPlatformId** | **string**| The unique identifier of the registered IoT platform. | 
+ **optional** | ***RegIotPlatApiRegisterediotplatformsByIdGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a RegIotPlatApiRegisterediotplatformsByIdGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+
+ **fields** | [**optional.Interface of []string**](string.md)| The list may contain one or more of the following attributes from the IotPlatformInfo data type: - userTransportInfo - customServiceTransportInfo  | 
+
+### Return type
+
+[**InlineResponse2001**](inline_response_200_1.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegisterediotplatformsByIdPUT**
+> RegisteredIotPlatformsRegisteredIotPlatformIdBody RegisterediotplatformsByIdPUT(ctx, body, registeredIotPlatformId)
+Update information about a IoT platform - see clause 5.3.5.
+
+The PUT method may be used by a service consumer to update a IoT platform registration. This method is typically used in the \"IoT platform update\" procedure as described in clause 5.3.5.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredIotPlatformsRegisteredIotPlatformIdBody**](RegisteredIotPlatformsRegisteredIotPlatformIdBody.md)| One or more updated attributes that are allowed to be changed are included in the IotPlatformInfo data structure in the payload body of the request. . | 
+  **registeredIotPlatformId** | **string**| The unique identifier of the registered IoT platform. | 
+
+### Return type
+
+[**RegisteredIotPlatformsRegisteredIotPlatformIdBody**](registered_iot_platforms_registeredIotPlatformId_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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)
+
+# **RegisterediotplatformsGET**
+> []IotPlatformInfo RegisterediotplatformsGET(ctx, optional)
+Retrieve information about all IoT platforms - see clause 5.3.2.
+
+The GET method may be used by an authorized service consumer to retrieve the information of all currently registered IoT platforms. This method is typically used in the \"registered IoT platforms query\" procedure as described in clause 5.3.2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***RegIotPlatApiRegisterediotplatformsGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a RegIotPlatApiRegisterediotplatformsGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **fields** | [**optional.Interface of []string**](string.md)| The list shall contain the following attributes from the IotPlatformInfo data type: - iotPlatformId - enabled  | 
+
+### Return type
+
+[**[]IotPlatformInfo**](IotPlatformInfo.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegisterediotplatformsPOST**
+> RegisteredIotPlatformsBody RegisterediotplatformsPOST(ctx, body)
+Register a IoT platform - see clause 5.3.4.
+
+The POST method may be used by a service consumer to register a new IoT platform. This method is typically used in the \"IoT platform registration\" procedure as described in clause 5.3.4.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredIotPlatformsBody**](RegisteredIotPlatformsBody.md)| Payload body in the request contains the information associated to the IoT platform to be registered. | 
+
+### Return type
+
+[**RegisteredIotPlatformsBody**](registered_iot_platforms_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/api-iot/RegisteredDevicesBody.md b/docs/api-iot/RegisteredDevicesBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..71941e93c2da461f6a7166fdf892e7241dac59b1
--- /dev/null
+++ b/docs/api-iot/RegisteredDevicesBody.md
@@ -0,0 +1,9 @@
+# RegisteredDevicesBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DeviceInfo** | [***DeviceInfo**](DeviceInfo.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/RegisteredDevicesRegisteredDeviceIdBody.md b/docs/api-iot/RegisteredDevicesRegisteredDeviceIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..b12c05bbba03477ee220a3101e44540de80255d4
--- /dev/null
+++ b/docs/api-iot/RegisteredDevicesRegisteredDeviceIdBody.md
@@ -0,0 +1,9 @@
+# RegisteredDevicesRegisteredDeviceIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DeviceInfo** | [***DeviceInfo**](DeviceInfo.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/RegisteredIotPlatformsBody.md b/docs/api-iot/RegisteredIotPlatformsBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..a1c2c0aa18f7839ab30475ca7e21210738025c76
--- /dev/null
+++ b/docs/api-iot/RegisteredIotPlatformsBody.md
@@ -0,0 +1,9 @@
+# RegisteredIotPlatformsBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IoTPlatformInfo** | [***IotPlatformInfo**](IotPlatformInfo.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md b/docs/api-iot/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..0c63b652609d88bdc3908e256ca1ac16037d4464
--- /dev/null
+++ b/docs/api-iot/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md
@@ -0,0 +1,9 @@
+# RegisteredIotPlatformsRegisteredIotPlatformIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IotPlatformInfo** | [***IotPlatformInfo**](IotPlatformInfo.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/SecurityInfo.md b/docs/api-iot/SecurityInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..40559b94e7342cf62667b91ff104bb69886fab15
--- /dev/null
+++ b/docs/api-iot/SecurityInfo.md
@@ -0,0 +1,10 @@
+# SecurityInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**OAuth2Info** | [***OAuth2Info**](OAuth2Info.md) |  | [optional] [default to null]
+**Extensions** | **string** | Extensions for alternative transport mechanisms. These extensions depend on the actual transport and are out of scope of the present document. For instance, such extensions may be used to signal the necessary parameters for the client to use TLS-based authorization defined for alternative transports (see ETSI GS MEC 009 [5] for more information).  | [optional] [default to null]
+
+[[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/docs/api-iot/SerializerType.md b/docs/api-iot/SerializerType.md
new file mode 100644
index 0000000000000000000000000000000000000000..210b392935244c534261a0ea886a64ca67431069
--- /dev/null
+++ b/docs/api-iot/SerializerType.md
@@ -0,0 +1,8 @@
+# SerializerType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[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/docs/api-iot/TrafficFilter.md b/docs/api-iot/TrafficFilter.md
new file mode 100644
index 0000000000000000000000000000000000000000..12438dd2ff1d4674fd60d64dd12f6aaa46c06065
--- /dev/null
+++ b/docs/api-iot/TrafficFilter.md
@@ -0,0 +1,23 @@
+# TrafficFilter
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SrcAddress** | **[]string** | An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes. | [optional] [default to null]
+**DstAddress** | **[]string** | An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes. | [optional] [default to null]
+**SrcPort** | **[]string** | A port or a range of ports. | [optional] [default to null]
+**DstPort** | **[]string** | A port or a range of ports. | [optional] [default to null]
+**Protocol** | **[]string** | Specify the protocol of the traffic filter. | [optional] [default to null]
+**Tag** | **[]string** | Used for tag based traffic rule. | [optional] [default to null]
+**Uri** | **[]string** | An URI label, in application layer, i.e. in HTTP message, is used to filter the traffic. | [optional] [default to null]
+**PacketLabel** | **[]string** | A customized packet label in network layer, as defined by the owner of the MEC platform, is used to filter the traffic. | [optional] [default to null]
+**SrcTunnelAddress** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**TgtTunnelAddress** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**SrcTunnelPort** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**DstTunnelPort** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**QCI** | **int32** | Used to match all packets that have the same QCI. | [optional] [default to null]
+**DSCP** | **int32** | Used to match all IPv4 packets that have the same DSCP. | [optional] [default to null]
+**TC** | **int32** | Used to match all IPv6 packets that have the same TC. | [optional] [default to null]
+
+[[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/docs/api-iot/TrafficRuleDescriptor.md b/docs/api-iot/TrafficRuleDescriptor.md
new file mode 100644
index 0000000000000000000000000000000000000000..149fa1216faed5688c8e68d05e72ee974ad63531
--- /dev/null
+++ b/docs/api-iot/TrafficRuleDescriptor.md
@@ -0,0 +1,14 @@
+# TrafficRuleDescriptor
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**TrafficRuleId** | **string** | Identifies the traffic rule. | [default to null]
+**FilterType** | **string** | Definition of filter type: per FLOW or PACKET  If it is per FLOW, the filter matches upstream (e.g. UE-&gt;EPC) packets and downstream (e.g. EPC-&gt;UE) packets are handled by the same context.  | [default to null]
+**Priority** | **int32** | Priority of this traffic rule within the range 0 to 255. If traffic rule conflicts, the one with higher priority take precedence. See note 1. | [default to null]
+**TrafficFilter** | [**[]TrafficFilter**](TrafficFilter.md) | The filter used to identify specific flow/packets that need to be handled by the MEC host. | [default to null]
+**Action** | **string** | Identifies the action of the MEC host data plane, when a packet matches the trafficFilter, the example actions include: DROP, FORWARD_DECAPSULATED, FORWARD_ENCAPSULATED, PASSTHROUGH, DUPLICATE_DECAPSULATED, DUPLICATE_ENCAPSULATED  | [default to null]
+**DstInterface** | [***InterfaceDescriptor**](InterfaceDescriptor.md) |  | [optional] [default to null]
+
+[[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/docs/api-iot/TransportInfo.md b/docs/api-iot/TransportInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..df89530928f7e66de6d6387ac8c39a1e2cdfd3f1
--- /dev/null
+++ b/docs/api-iot/TransportInfo.md
@@ -0,0 +1,17 @@
+# TransportInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Id** | **string** | The identifier of this transport. | [default to null]
+**Name** | **string** | The name of this transport. | [default to null]
+**Description** | **string** | Human-readable description of this transport. | [optional] [default to null]
+**Type_** | [***TransportType**](TransportType.md) |  | [default to null]
+**Protocol** | **string** | The name of the protocol used. Shall be set to \&quot;HTTP\&quot; for a REST API. | [default to null]
+**Version** | **string** | The version of the protocol used. | [default to null]
+**Endpoint** | [***EndPointInfo**](EndPointInfo.md) |  | [default to null]
+**Security** | [***SecurityInfo**](SecurityInfo.md) |  | [default to null]
+**ImplSpecificInfo** | **string** | Additional implementation specific details of the transport. | [optional] [default to null]
+
+[[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/docs/api-iot/TransportType.md b/docs/api-iot/TransportType.md
new file mode 100644
index 0000000000000000000000000000000000000000..46cc250c00bccbe02d268207efd77e07b56be0bf
--- /dev/null
+++ b/docs/api-iot/TransportType.md
@@ -0,0 +1,8 @@
+# TransportType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[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/docs/api-iot/TunnelInfo.md b/docs/api-iot/TunnelInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..e10e407945f89f1676ceb1140845e4e50e55652b
--- /dev/null
+++ b/docs/api-iot/TunnelInfo.md
@@ -0,0 +1,12 @@
+# TunnelInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**TunnelType** | **string** | Type of tunnel: GTP-U, GRE, etc. | [default to null]
+**TunnelDstAddress** | **string** | Destination address of the tunnel. | [default to null]
+**TunnelSrcAddress** | **string** | Source address of the tunnel. | [default to null]
+**TunnelSpecificData** | **string** | Parameters specific to the tunnel. | [optional] [default to null]
+
+[[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/docs/api-iot/UplinkMsg.md b/docs/api-iot/UplinkMsg.md
new file mode 100644
index 0000000000000000000000000000000000000000..e9b87571debb98fefdcadadeb4b12f622d23315d
--- /dev/null
+++ b/docs/api-iot/UplinkMsg.md
@@ -0,0 +1,19 @@
+# UplinkMsg
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**UplinkTopic** | **string** | Topic where the message containing the data generated by the IoT device(s) should be published, in order to be consumed by the end IoT application(s). | [default to null]
+**SelectedSerializer** | [***SerializerType**](SerializerType.md) |  | [default to null]
+**IncludeDevicePort** | **bool** | Indication whether to include the UDP port of the remote IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceAddr** | **bool** | Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceMetadata** | **bool** | Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludePei** | **bool** | Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeSupi** | **bool** | Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImei** | **bool** | Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImsi** | **bool** | Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeIccid** | **bool** | Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceId** | **bool** | Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+
+[[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/docs/meep-sss/AreaInfo.md b/docs/meep-sss/AreaInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..6b104fc9cde71df6068437590f37b0a7581dfa7c
--- /dev/null
+++ b/docs/meep-sss/AreaInfo.md
@@ -0,0 +1,11 @@
+# AreaInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Shape** | [***ShapeType**](ShapeType.md) |  | [default to null]
+**Points** | [**[]Point**](Point.md) | Shall include one point if the shape is CIRCLE. Shall include 3-15 points if the shape is POLYGON | [default to null]
+**Radius** | **int32** | Shall be present if the shape is CIRCLE | [optional] [default to null]
+
+[[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/docs/meep-sss/LinkType.md b/docs/meep-sss/LinkType.md
new file mode 100644
index 0000000000000000000000000000000000000000..5d8170f4aa61d5c57074f8228ee99479a91526cd
--- /dev/null
+++ b/docs/meep-sss/LinkType.md
@@ -0,0 +1,9 @@
+# LinkType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Href** | **string** | The URI referring to the subscription. | [default to null]
+
+[[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/docs/meep-sss/ManagementnApi.md b/docs/meep-sss/ManagementnApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..538b5f148fe13cc8d42e05a2e32ebd2a408974d2
--- /dev/null
+++ b/docs/meep-sss/ManagementnApi.md
@@ -0,0 +1,36 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorMgmtPUT**](ManagementnApi.md#SensorMgmtPUT) | **Put** /sensor_management | The PUT method is used to update the value of the characteristics that can be set on a sensor or on a group of sensors
+
+# **SensorMgmtPUT**
+> []SensorCharacteristic SensorMgmtPUT(ctx, body)
+The PUT method is used to update the value of the characteristics that can be set on a sensor or on a group of sensors
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.12.3.2-1 and 7.12.3.2-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**[]SensorCharacteristic**](SensorCharacteristic.md)| The list of sensor characteristics to be updated, with the new values to set, is included as entity body of the request | 
+
+### Return type
+
+[**[]SensorCharacteristic**](SensorCharacteristic.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/Point.md b/docs/meep-sss/Point.md
new file mode 100644
index 0000000000000000000000000000000000000000..65e28c65ce182b0ffc86cf274df30a1e764d9b40
--- /dev/null
+++ b/docs/meep-sss/Point.md
@@ -0,0 +1,10 @@
+# Point
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Latitude** | **float64** | Location latitude, expressed in the range -90° to +90° | [default to null]
+**Longitude** | **float64** | Location longitude, expressed in the range -180° to +180°. | [default to null]
+
+[[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/docs/meep-sss/ProblemDetails.md b/docs/meep-sss/ProblemDetails.md
new file mode 100644
index 0000000000000000000000000000000000000000..f2596ffa3944f557c5f98c6a7ff38b6430c3dd58
--- /dev/null
+++ b/docs/meep-sss/ProblemDetails.md
@@ -0,0 +1,13 @@
+# ProblemDetails
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Type_** | **string** | A URI reference according to IETF RFC 3986 that identifies the problem type | [optional] [default to null]
+**Title** | **string** | A short, human-readable summary of the problem type | [optional] [default to null]
+**Status** | **int32** | The HTTP status code for this occurrence of the problem | [optional] [default to null]
+**Detail** | **string** | A human-readable explanation specific to this occurrence of the problem | [optional] [default to null]
+**Instance** | **string** | A URI reference that identifies the specific occurrence of the problem | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorCharacteristic.md b/docs/meep-sss/SensorCharacteristic.md
new file mode 100644
index 0000000000000000000000000000000000000000..b231da16d9d39600f1d4aa2afca959e13865287d
--- /dev/null
+++ b/docs/meep-sss/SensorCharacteristic.md
@@ -0,0 +1,11 @@
+# SensorCharacteristic
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**CharacteristicName** | **string** | The name of the characteristic | [default to null]
+**CharacteristicValue** | **string** | The value of the characteristic. | [default to null]
+**CharacteristicUnitOfMeasure** | **string** | The unit of measure of the characteristic (see saref:UnitOfMeasure in ETSI TS 103 264 [4], clause 4.3.8). | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorData.md b/docs/meep-sss/SensorData.md
new file mode 100644
index 0000000000000000000000000000000000000000..7cfcbc76d1cf991eb5b90abadc76dd4af3d868b9
--- /dev/null
+++ b/docs/meep-sss/SensorData.md
@@ -0,0 +1,13 @@
+# SensorData
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorIdentifier** | **string** | Unique identifier of the sensor | [default to null]
+**Data** | **string** | The status of the sensor | [default to null]
+**DataFormat** | **string** | String explaining the error of the sensor | [default to null]
+**DataUnitOfMeasure** | **string** | String explaining the error of the sensor | [default to null]
+**DataTimestamp** | [***TimeStamp**](TimeStamp.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorDataLookupApi.md b/docs/meep-sss/SensorDataLookupApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..f594779f63e9e3e7138f1cfa066c91ca4a93469a
--- /dev/null
+++ b/docs/meep-sss/SensorDataLookupApi.md
@@ -0,0 +1,36 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorDataLookupGET**](SensorDataLookupApi.md#SensorDataLookupGET) | **Get** /queries/status_data | The GET method is used to query the last sensor data from specific sensors
+
+# **SensorDataLookupGET**
+> []SensorData SensorDataLookupGET(ctx, sensorIdentifier)
+The GET method is used to query the last sensor data from specific sensors
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.9.3.1-1 and 7.9.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **sensorIdentifier** | [**[]string**](string.md)| It uniquely identifies the created individual application mobility service | 
+
+### Return type
+
+[**[]SensorData**](SensorData.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorDataSubscription.md b/docs/meep-sss/SensorDataSubscription.md
new file mode 100644
index 0000000000000000000000000000000000000000..63d67bf76ebd44874c6f95c3a4b7b03aaff026ff
--- /dev/null
+++ b/docs/meep-sss/SensorDataSubscription.md
@@ -0,0 +1,14 @@
+# SensorDataSubscription
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SubscriptionType** | [***SubscriptionType**](SubscriptionType.md) |  | [default to null]
+**CallbackReference** | **string** | URI exposed by the client on which to receive notifications via HTTP | [optional] [default to null]
+**RequestTestNotification** | **bool** | Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI, | [optional] [default to null]
+**WebsockNotifConfig** | [***WebsockNotifConfig**](WebsockNotifConfig.md) |  | [optional] [default to null]
+**Links** | [***SubscriptionLinks**](SubscriptionLinks.md) |  | [optional] [default to null]
+**ExpiryDeadline** | [***TimeStamp**](TimeStamp.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorDataSubscriptionApi.md b/docs/meep-sss/SensorDataSubscriptionApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..2f3fca78f1d996be2ce856783eb87ca2227c6f13
--- /dev/null
+++ b/docs/meep-sss/SensorDataSubscriptionApi.md
@@ -0,0 +1,153 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorDataIndividualSubscriptionGET**](SensorDataSubscriptionApi.md#SensorDataIndividualSubscriptionGET) | **Get** /queries/status_data/{subscriptionId} | The GET method is used to retrieve information about this subscription
+[**SensorDataSubscriptionDELETE**](SensorDataSubscriptionApi.md#SensorDataSubscriptionDELETE) | **Delete** /queries/status_data/{subscriptionId} | The DELETE method is used to cancel the existing subscription
+[**SensorDataSubscriptionGET**](SensorDataSubscriptionApi.md#SensorDataSubscriptionGET) | **Get** /subscriptions/sensor_data | The GET method is used to request information about the subscriptions related to sensor data for this requestor
+[**SensorDataSubscriptionPOST**](SensorDataSubscriptionApi.md#SensorDataSubscriptionPOST) | **Post** /subscriptions/sensor_data | The POST method is used to create a new subscription to sensor status notifications
+[**SensorDataSubscriptionPUT**](SensorDataSubscriptionApi.md#SensorDataSubscriptionPUT) | **Put** /queries/status_data/{subscriptionId} | The PUT method is used to update the existing subscription
+
+# **SensorDataIndividualSubscriptionGET**
+> []SensorDataSubscription SensorDataIndividualSubscriptionGET(ctx, subscriptionId)
+The GET method is used to retrieve information about this subscription
+
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.11.3.1-1 and 7.11.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **subscriptionId** | **string**| Unique identifiers of a subscription | 
+
+### Return type
+
+[**[]SensorDataSubscription**](SensorDataSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDataSubscriptionDELETE**
+> []SubscriptionLinkList SensorDataSubscriptionDELETE(ctx, subscriptionId)
+The DELETE method is used to cancel the existing subscription
+
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.11.3.5-1 and 7.11.3.5-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **subscriptionId** | **string**| It uniquely identifies a subscription | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDataSubscriptionGET**
+> []SubscriptionLinkList SensorDataSubscriptionGET(ctx, sensorIdentifier)
+The GET method is used to request information about the subscriptions related to sensor data for this requestor
+
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.10.3.1-1 and 7.10.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **sensorIdentifier** | [**[]string**](string.md)| Unique identifiers of the sensors | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDataSubscriptionPOST**
+> []SensorStatusSubscription SensorDataSubscriptionPOST(ctx, body)
+The POST method is used to create a new subscription to sensor status notifications
+
+This method shall support the request and response data structures, and response codes, as specified in Table 7.7.3.4-1
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**SubscriptionsSensorDataBody**](SubscriptionsSensorDataBody.md)| The entity body in the request contains data type of the specific sensor status subscription that is to be created | 
+
+### Return type
+
+[**[]SensorStatusSubscription**](SensorStatusSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDataSubscriptionPUT**
+> []SensorDataSubscription SensorDataSubscriptionPUT(ctx, body, subscriptionId)
+The PUT method is used to update the existing subscription
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.11.3.2-1 and 7.11.3.2-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**StatusDataSubscriptionIdBody**](StatusDataSubscriptionIdBody.md)| New SensorDataSubscription is included as entity body of the request | 
+  **subscriptionId** | **string**| Unique identifiers of a subscription | 
+
+### Return type
+
+[**[]SensorDataSubscription**](SensorDataSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorDiscoveryEventSubscription.md b/docs/meep-sss/SensorDiscoveryEventSubscription.md
new file mode 100644
index 0000000000000000000000000000000000000000..15cd2caf31c0efe2f2a6ae52db7eb27c779ed13a
--- /dev/null
+++ b/docs/meep-sss/SensorDiscoveryEventSubscription.md
@@ -0,0 +1,16 @@
+# SensorDiscoveryEventSubscription
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SubscriptionType** | [***SubscriptionType**](SubscriptionType.md) |  | [default to null]
+**CallbackReference** | **string** | URI exposed by the client on which to receive notifications via HTTP | [optional] [default to null]
+**RequestTestNotification** | **bool** | Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI, | [optional] [default to null]
+**WebsockNotifConfig** | [***WebsockNotifConfig**](WebsockNotifConfig.md) |  | [optional] [default to null]
+**Links** | [***SubscriptionLinks**](SubscriptionLinks.md) |  | [optional] [default to null]
+**SensorInfoList** | **[]string** | Object containing the characteristics of the sensor(s) to be selected for the subscription | [optional] [default to null]
+**GeographicalArea** | [**[]AreaInfo**](AreaInfo.md) | The parameters describing the area to subscribe | [optional] [default to null]
+**ExpiryDeadline** | [***TimeStamp**](TimeStamp.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorDiscoveryInfo.md b/docs/meep-sss/SensorDiscoveryInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..539f302fa6789bbbe61cbcb6ddf88eac9aaa37ca
--- /dev/null
+++ b/docs/meep-sss/SensorDiscoveryInfo.md
@@ -0,0 +1,13 @@
+# SensorDiscoveryInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorIdentifier** | **string** | Unique identifier of the sensor | [default to null]
+**SensorType** | **string** | Type of the Sensor | [default to null]
+**SensorPropertyList** | **[]string** | It indicates the list of properties that the sensor can sense | [default to null]
+**SensorCharacteristicList** | [**[]SensorCharacteristic**](SensorCharacteristic.md) | The sensor&#x27; characteristics | [optional] [default to null]
+**SensorPosition** | [***Point**](Point.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorDiscoveryLookupApi.md b/docs/meep-sss/SensorDiscoveryLookupApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..c1210feee592accb2bf0e94ef40543fb8900baf2
--- /dev/null
+++ b/docs/meep-sss/SensorDiscoveryLookupApi.md
@@ -0,0 +1,42 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorDiscoveryLookupGET**](SensorDiscoveryLookupApi.md#SensorDiscoveryLookupGET) | **Get** /queries/sensor_discovery | The GET method is used to query the available sensors
+
+# **SensorDiscoveryLookupGET**
+> []SensorDiscoveryInfo SensorDiscoveryLookupGET(ctx, optional)
+The GET method is used to query the available sensors
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.3.3.1-1 and 7.3.3.1-2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***SensorDiscoveryLookupApiSensorDiscoveryLookupGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a SensorDiscoveryLookupApiSensorDiscoveryLookupGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **sensorInfo** | [**optional.Interface of SensorInfo**](.md)| Object containing the characteristics of the sensor(s) to be selected for the query | 
+
+### Return type
+
+[**[]SensorDiscoveryInfo**](SensorDiscoveryInfo.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorDiscoverySubscriptionApi.md b/docs/meep-sss/SensorDiscoverySubscriptionApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..dce85a43c5dcae010f648fe0cfd812793d833227
--- /dev/null
+++ b/docs/meep-sss/SensorDiscoverySubscriptionApi.md
@@ -0,0 +1,159 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorDiscoveryIndividualSubscriptionGET**](SensorDiscoverySubscriptionApi.md#SensorDiscoveryIndividualSubscriptionGET) | **Get** /subscriptions/sensor_discovery/{subscriptionId} | The GET method is used to request information about the subscriptions related to sensor status for this requestor
+[**SensorDiscoverySubscriptionDELETE**](SensorDiscoverySubscriptionApi.md#SensorDiscoverySubscriptionDELETE) | **Delete** /subscriptions/sensor_discovery/{subscriptionId} | The DELETE method is used to cancel the existing subscription. Cancellation can be made by deleting the resource that represents existing sensor discovery subscription
+[**SensorDiscoverySubscriptionGET**](SensorDiscoverySubscriptionApi.md#SensorDiscoverySubscriptionGET) | **Get** /subscriptions/sensor_discovery | The GET method is used to request information about the subscriptions related to sensor discovery for this requestor
+[**SensorDiscoverySubscriptionPOST**](SensorDiscoverySubscriptionApi.md#SensorDiscoverySubscriptionPOST) | **Post** /subscriptions/sensor_discovery | The POST method is used to create a new subscription to sensor discovery notifications
+[**SensorDiscoverySubscriptionPUT**](SensorDiscoverySubscriptionApi.md#SensorDiscoverySubscriptionPUT) | **Put** /subscriptions/sensor_discovery/{subscriptionId} | The POST method is used to create a new subscription to sensor discovery notifications
+
+# **SensorDiscoveryIndividualSubscriptionGET**
+> []SubscriptionLinkList SensorDiscoveryIndividualSubscriptionGET(ctx, subscriptionId)
+The GET method is used to request information about the subscriptions related to sensor status for this requestor
+
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.7.3.1-1 and 7.7.3.1-2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **subscriptionId** | **string**| Unique identifiers of the subscription | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDiscoverySubscriptionDELETE**
+> []SubscriptionLinkList SensorDiscoverySubscriptionDELETE(ctx, subscriptionId)
+The DELETE method is used to cancel the existing subscription. Cancellation can be made by deleting the resource that represents existing sensor discovery subscription
+
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.5.3.5-1 and 7.5.3.5-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **subscriptionId** | **string**| It uniquely identifies the created individual application mobility service | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDiscoverySubscriptionGET**
+> []SubscriptionLinkList SensorDiscoverySubscriptionGET(ctx, optional)
+The GET method is used to request information about the subscriptions related to sensor discovery for this requestor
+
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.4.3.1-1 and 7.4.3.1-2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***SensorDiscoverySubscriptionApiSensorDiscoverySubscriptionGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a SensorDiscoverySubscriptionApiSensorDiscoverySubscriptionGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **subscriptionId** | **optional.String**| Object containing the characteristics of the sensor(s) to be selected for the query | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDiscoverySubscriptionPOST**
+> []SensorDiscoveryEventSubscription SensorDiscoverySubscriptionPOST(ctx, body)
+The POST method is used to create a new subscription to sensor discovery notifications
+
+This method shall support the request and response data structures, and response codes, as specified in Table 7.4.3.4-1
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**SubscriptionsSensorDiscoveryBody**](SubscriptionsSensorDiscoveryBody.md)| This type represents a subscription to notifications from the Sensor-sharing Service regarding events related to changes in sensor information | 
+
+### Return type
+
+[**[]SensorDiscoveryEventSubscription**](SensorDiscoveryEventSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorDiscoverySubscriptionPUT**
+> []SubscriptionLinkList SensorDiscoverySubscriptionPUT(ctx, body, subscriptionId)
+The POST method is used to create a new subscription to sensor discovery notifications
+
+This method shall support the request and response data structures, and response codes, as specified in Table 7.4.3.4-1
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**SensorDiscoverySubscriptionIdBody**](SensorDiscoverySubscriptionIdBody.md)| New SensorDiscoveryEventSubscription is included as entity body of the request | 
+  **subscriptionId** | **string**| It uniquely identifies the created individual application mobility service | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorDiscoverySubscriptionIdBody.md b/docs/meep-sss/SensorDiscoverySubscriptionIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..1b09c55730f6352b9e06f20881beed7014c3035e
--- /dev/null
+++ b/docs/meep-sss/SensorDiscoverySubscriptionIdBody.md
@@ -0,0 +1,9 @@
+# SensorDiscoverySubscriptionIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorDiscoveryEventSubscription** | [***SensorDiscoveryEventSubscription**](SensorDiscoveryEventSubscription.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorInfo.md b/docs/meep-sss/SensorInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..9b656e067381466dbbe3b3ea758c7a3532009320
--- /dev/null
+++ b/docs/meep-sss/SensorInfo.md
@@ -0,0 +1,12 @@
+# SensorInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Type_** | **string** | Type of the sensor | [default to null]
+**SensorPropertyList** | **[]string** | It indicates the list of properties that the sensor can sense (see saref:Property in ETSI TS 103 264 [4], clause 4.3.8). | [default to null]
+**SensorCharacteristicList** | [**[]SensorCharacteristic**](SensorCharacteristic.md) | The sensor&#x27; characteristics to be matched | [optional] [default to null]
+**GeographicalArea** | [**[]AreaInfo**](AreaInfo.md) | The parameters describing the area | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorManagementApi.md b/docs/meep-sss/SensorManagementApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..fe1d140027bd4748465d050b9ea29aa935e326eb
--- /dev/null
+++ b/docs/meep-sss/SensorManagementApi.md
@@ -0,0 +1,36 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorMgmtGET**](SensorManagementApi.md#SensorMgmtGET) | **Get** /sensor_management | The GET method is used to receive the sensor characteristics that can be modified on specific sensors
+
+# **SensorMgmtGET**
+> []SensorCharacteristic SensorMgmtGET(ctx, sensorIdentifier)
+The GET method is used to receive the sensor characteristics that can be modified on specific sensors
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.12.3.1-1 and 7.12.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **sensorIdentifier** | [**[]string**](string.md)| It uniquely identifies the created individual application mobility service | 
+
+### Return type
+
+[**[]SensorCharacteristic**](SensorCharacteristic.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorStatusInfo.md b/docs/meep-sss/SensorStatusInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..2367033288ee8930f0a5d82b9759df4930bd4a3b
--- /dev/null
+++ b/docs/meep-sss/SensorStatusInfo.md
@@ -0,0 +1,11 @@
+# SensorStatusInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorIdentifier** | **string** | Unique identifier of the sensor | [default to null]
+**SensorStatusType** | **string** | The status of the sensor | [default to null]
+**ErrorInformation** | **string** | String explaining the error of the sensor | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorStatusLookupApi.md b/docs/meep-sss/SensorStatusLookupApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..454436a7b607529ae0a0caa10ed2578d7a67d4b0
--- /dev/null
+++ b/docs/meep-sss/SensorStatusLookupApi.md
@@ -0,0 +1,36 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorStatusLookupGET**](SensorStatusLookupApi.md#SensorStatusLookupGET) | **Get** /queries/sensor_status | The GET method is used to query the available status
+
+# **SensorStatusLookupGET**
+> []SensorStatusInfo SensorStatusLookupGET(ctx, sensorIdentifier)
+The GET method is used to query the available status
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.6.3.1-1 and 7.6.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **sensorIdentifier** | [**[]string**](string.md)| It uniquely identifies the created individual application mobility service | 
+
+### Return type
+
+[**[]SensorStatusInfo**](SensorStatusInfo.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorStatusSubscription.md b/docs/meep-sss/SensorStatusSubscription.md
new file mode 100644
index 0000000000000000000000000000000000000000..1434682e7434cc3cb994ace54f4fb9848b4c8091
--- /dev/null
+++ b/docs/meep-sss/SensorStatusSubscription.md
@@ -0,0 +1,14 @@
+# SensorStatusSubscription
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SubscriptionType** | [***SubscriptionType**](SubscriptionType.md) |  | [default to null]
+**CallbackReference** | **string** | URI exposed by the client on which to receive notifications via HTTP | [optional] [default to null]
+**RequestTestNotification** | **bool** | Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI, | [optional] [default to null]
+**WebsockNotifConfig** | [***WebsockNotifConfig**](WebsockNotifConfig.md) |  | [optional] [default to null]
+**Links** | [***SubscriptionLinks**](SubscriptionLinks.md) |  | [optional] [default to null]
+**ExpiryDeadline** | [***TimeStamp**](TimeStamp.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SensorStatusSubscriptionApi.md b/docs/meep-sss/SensorStatusSubscriptionApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..86c8ea73df43d43abfc4bb5f82b708c270b0e62f
--- /dev/null
+++ b/docs/meep-sss/SensorStatusSubscriptionApi.md
@@ -0,0 +1,130 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorStatusIndividualSubscriptionGET**](SensorStatusSubscriptionApi.md#SensorStatusIndividualSubscriptionGET) | **Get** /subscriptions/sensor_status/{subscriptionId} | The GET method is used to retrieve information about this subscription
+[**SensorStatusIndividualSubscriptionGET**](SensorStatusSubscriptionApi.md#SensorStatusIndividualSubscriptionGET) | **Get** /subscriptions/sensor_status | The GET method is used to request information about the subscriptions related to sensor status for this requestor
+[**SensorStatusSubscriptionDELETE**](SensorStatusSubscriptionApi.md#SensorStatusSubscriptionDELETE) | **Delete** /subscriptions/sensor_status/{subscriptionId} | The DELETE method is used to cancel the existing subscription
+[**SensorStatusSubscriptionPUT**](SensorStatusSubscriptionApi.md#SensorStatusSubscriptionPUT) | **Put** /subscriptions/sensor_status/{subscriptionId} | The PUT method is used to update the existing subscription
+
+# **SensorStatusIndividualSubscriptionGET**
+> []SensorStatusSubscription SensorStatusIndividualSubscriptionGET(ctx, subscriptionId)
+The GET method is used to retrieve information about this subscription
+
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.8.3.1-1 and 7.8.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **subscriptionId** | **string**| Unique identifiers of the subscription | 
+
+### Return type
+
+[**[]SensorStatusSubscription**](SensorStatusSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorStatusIndividualSubscriptionGET**
+> []SubscriptionLinkList SensorStatusIndividualSubscriptionGET(ctx, optional)
+The GET method is used to request information about the subscriptions related to sensor status for this requestor
+
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.7.3.1-1 and 7.7.3.1-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***SensorStatusSubscriptionApiSensorStatusIndividualSubscriptionGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a SensorStatusSubscriptionApiSensorStatusIndividualSubscriptionGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **sensorIdentifier** | [**optional.Interface of []string**](string.md)| Unique identifiers of the sensors | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorStatusSubscriptionDELETE**
+> []SubscriptionLinkList SensorStatusSubscriptionDELETE(ctx, subscriptionId)
+The DELETE method is used to cancel the existing subscription
+
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.8.3.5-1 and 7.8.3.5-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **subscriptionId** | **string**| It uniquely identifies a subscription | 
+
+### Return type
+
+[**[]SubscriptionLinkList**](SubscriptionLinkList.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **SensorStatusSubscriptionPUT**
+> []SensorStatusSubscription SensorStatusSubscriptionPUT(ctx, body, subscriptionId)
+The PUT method is used to update the existing subscription
+
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.8.3.2-1 and 7.8.3.2-2
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**SensorStatusSubscriptionIdBody**](SensorStatusSubscriptionIdBody.md)| New SensorStatusSubscription is included as entity body of the request | 
+  **subscriptionId** | **string**| It uniquely identifies the created individual application mobility service | 
+
+### Return type
+
+[**[]SensorStatusSubscription**](SensorStatusSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SensorStatusSubscriptionIdBody.md b/docs/meep-sss/SensorStatusSubscriptionIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..2591085b0e95c06cd0af1f795dac6a879fe6a7e4
--- /dev/null
+++ b/docs/meep-sss/SensorStatusSubscriptionIdBody.md
@@ -0,0 +1,9 @@
+# SensorStatusSubscriptionIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorStatusSubscription** | [***SensorStatusSubscription**](SensorStatusSubscription.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/ShapeType.md b/docs/meep-sss/ShapeType.md
new file mode 100644
index 0000000000000000000000000000000000000000..ade18455d1662c984836363df519a62b8508b3a9
--- /dev/null
+++ b/docs/meep-sss/ShapeType.md
@@ -0,0 +1,8 @@
+# ShapeType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[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/docs/meep-sss/StatusDataSubscriptionIdBody.md b/docs/meep-sss/StatusDataSubscriptionIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..70a2b2e720cbd4db57155dfac153e1731ec911dc
--- /dev/null
+++ b/docs/meep-sss/StatusDataSubscriptionIdBody.md
@@ -0,0 +1,9 @@
+# StatusDataSubscriptionIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorStatusSubscription** | [***SensorDataSubscription**](SensorDataSubscription.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/StatusStatusSubscriptionApi.md b/docs/meep-sss/StatusStatusSubscriptionApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..a910cb89f955c7b027eae8be84ce502b29ed580d
--- /dev/null
+++ b/docs/meep-sss/StatusStatusSubscriptionApi.md
@@ -0,0 +1,36 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**SensorStatusSubscriptionPOST**](StatusStatusSubscriptionApi.md#SensorStatusSubscriptionPOST) | **Post** /subscriptions/sensor_status | The POST method is used to create a new subscription to sensor status notifications
+
+# **SensorStatusSubscriptionPOST**
+> []SensorStatusSubscription SensorStatusSubscriptionPOST(ctx, body)
+The POST method is used to create a new subscription to sensor status notifications
+
+This method shall support the request and response data structures, and response codes, as specified in Table 7.7.3.4-1
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**SubscriptionsSensorStatusBody**](SubscriptionsSensorStatusBody.md)| The entity body in the request contains data type of the specific sensor status subscription that is to be created | 
+
+### Return type
+
+[**[]SensorStatusSubscription**](SensorStatusSubscription.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/docs/meep-sss/SubscriptionLinkList.md b/docs/meep-sss/SubscriptionLinkList.md
new file mode 100644
index 0000000000000000000000000000000000000000..ac82d3b67810dae8dccbded1b701759451ee67e2
--- /dev/null
+++ b/docs/meep-sss/SubscriptionLinkList.md
@@ -0,0 +1,9 @@
+# SubscriptionLinkList
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Links** | [***SubscriptionLinkListLinks**](SubscriptionLinkList.links.md) |  | [default to null]
+
+[[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/docs/meep-sss/SubscriptionLinkListLinks.md b/docs/meep-sss/SubscriptionLinkListLinks.md
new file mode 100644
index 0000000000000000000000000000000000000000..409c916f773be1d68706ab8b30511dfea463af36
--- /dev/null
+++ b/docs/meep-sss/SubscriptionLinkListLinks.md
@@ -0,0 +1,10 @@
+# SubscriptionLinkListLinks
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Self** | [***LinkType**](LinkType.md) |  | [default to null]
+**Subscriptions** | [**[]SubscriptionLinkListSubscription**](SubscriptionLinkList.subscription.md) | The MEC application&#x27;s subscriptions | [optional] [default to null]
+
+[[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/docs/meep-sss/SubscriptionLinkListSubscription.md b/docs/meep-sss/SubscriptionLinkListSubscription.md
new file mode 100644
index 0000000000000000000000000000000000000000..5bebb63a2738d740860fdf7147344abac206797d
--- /dev/null
+++ b/docs/meep-sss/SubscriptionLinkListSubscription.md
@@ -0,0 +1,10 @@
+# SubscriptionLinkListSubscription
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Href** | **string** | The URI referring to the subscription | [default to null]
+**SubscriptionType** | **string** | Type of the subscription | [default to null]
+
+[[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/docs/meep-sss/SubscriptionLinks.md b/docs/meep-sss/SubscriptionLinks.md
new file mode 100644
index 0000000000000000000000000000000000000000..21443c4cc3012fc1446a66597f2f590b2e61c674
--- /dev/null
+++ b/docs/meep-sss/SubscriptionLinks.md
@@ -0,0 +1,9 @@
+# SubscriptionLinks
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Self** | [***LinkType**](LinkType.md) |  | [default to null]
+
+[[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/docs/meep-sss/SubscriptionType.md b/docs/meep-sss/SubscriptionType.md
new file mode 100644
index 0000000000000000000000000000000000000000..029e22468e90994f7ace4c1a93e8bc49f82ee3f1
--- /dev/null
+++ b/docs/meep-sss/SubscriptionType.md
@@ -0,0 +1,8 @@
+# SubscriptionType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[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/docs/meep-sss/SubscriptionsSensorDataBody.md b/docs/meep-sss/SubscriptionsSensorDataBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..a90ef2497e1b7d1eab46d784fbea6f1ae3cfb6f9
--- /dev/null
+++ b/docs/meep-sss/SubscriptionsSensorDataBody.md
@@ -0,0 +1,9 @@
+# SubscriptionsSensorDataBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorDataSubscription** | [***SensorDataSubscription**](SensorDataSubscription.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SubscriptionsSensorDiscoveryBody.md b/docs/meep-sss/SubscriptionsSensorDiscoveryBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..07a1b88f0fd8fcebf667fee5deea7d9ca5fd7ce9
--- /dev/null
+++ b/docs/meep-sss/SubscriptionsSensorDiscoveryBody.md
@@ -0,0 +1,9 @@
+# SubscriptionsSensorDiscoveryBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorDiscoveryEventSubscription** | [***SensorDiscoveryEventSubscription**](SensorDiscoveryEventSubscription.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/SubscriptionsSensorStatusBody.md b/docs/meep-sss/SubscriptionsSensorStatusBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..78f1cda964e7e2009a4ab5499df31c11b6163e89
--- /dev/null
+++ b/docs/meep-sss/SubscriptionsSensorStatusBody.md
@@ -0,0 +1,9 @@
+# SubscriptionsSensorStatusBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SensorStatusSubscription** | [***SensorStatusSubscription**](SensorStatusSubscription.md) |  | [optional] [default to null]
+
+[[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/docs/meep-sss/TimeStamp.md b/docs/meep-sss/TimeStamp.md
new file mode 100644
index 0000000000000000000000000000000000000000..b13c4a15da44f69db47d4be34ac57feaf7f35f32
--- /dev/null
+++ b/docs/meep-sss/TimeStamp.md
@@ -0,0 +1,10 @@
+# TimeStamp
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Seconds** | **int32** | &#x27;The seconds part of the Time. Time is defined as Unix-time since January 1, 1970, 00:00:00 UTC.&#x27; | [default to null]
+**NanoSeconds** | **int32** | &#x27;The nanoseconds part of the Time. Time is defined as Unix-time since January 1, 1970, 00:00:00 UTC.&#x27; | [default to null]
+
+[[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/docs/meep-sss/WebsockNotifConfig.md b/docs/meep-sss/WebsockNotifConfig.md
new file mode 100644
index 0000000000000000000000000000000000000000..6b8ae7ddacdf3a8f404cedb6c02c82402648e7cb
--- /dev/null
+++ b/docs/meep-sss/WebsockNotifConfig.md
@@ -0,0 +1,10 @@
+# WebsockNotifConfig
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**WebsocketUri** | **string** | Set by AMS to indicate to the service consumer the Websocket URI to be used for delivering notifications. | [optional] [default to null]
+**RequestWebsocketUri** | **bool** | Set to true by the service consumer to indicate that Websocket delivery is requested. | [optional] [default to null]
+
+[[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/docs/meepctl/meepctl_build.md b/docs/meepctl/meepctl_build.md
index 66d7062ed96d70d839e8a0d0859cdcd60c6ad066..63b6ac3806ac047d9dded2f97e405534af2904c0 100644
--- a/docs/meepctl/meepctl_build.md
+++ b/docs/meepctl/meepctl_build.md
@@ -40,6 +40,8 @@ Valid Targets:
   * meep-tc-sidecar
   * meep-virt-engine
   * meep-vis
+  * meep-iot
+  * meep-sss
   * meep-wais
   * meep-webhook
 ```
diff --git a/docs/meepctl/meepctl_dockerize.md b/docs/meepctl/meepctl_dockerize.md
index e93e16a19e4e86cbb4457ec4047fe99fcd24185b..47c701ed9724bee8bf0c5c140c7b9d7e89a1d540 100644
--- a/docs/meepctl/meepctl_dockerize.md
+++ b/docs/meepctl/meepctl_dockerize.md
@@ -42,6 +42,8 @@ Valid Targets:
   * meep-tc-sidecar
   * meep-virt-engine
   * meep-vis
+  * meep-iot
+  * meep-sss
   * meep-wais
   * meep-webhook
 ```
diff --git a/docs/meepctl/meepctl_lint.md b/docs/meepctl/meepctl_lint.md
index 5c7bb83498f714a3da09900b38f9ffb625d490e5..6c64141f5ad9b5dd3f80b0a013bd9dbe3e331423 100644
--- a/docs/meepctl/meepctl_lint.md
+++ b/docs/meepctl/meepctl_lint.md
@@ -63,6 +63,10 @@ Valid Targets:
   * meep-virt-engine
   * meep-vis
   * meep-vis-traffic-mgr
+  * meep-iot
+  * meep-sss
+  * meep-iot-mgr
+  * meep-sss-mgr
   * meep-wais
   * meep-watchdog
   * meep-webhook
diff --git a/etsi-mec-sandbox.code-workspace b/etsi-mec-sandbox.code-workspace
index ce6903f3cd0d645f72abae794275ed61f1a5539f..75d6051794fc49348259713b0e99321b5afaa131 100644
--- a/etsi-mec-sandbox.code-workspace
+++ b/etsi-mec-sandbox.code-workspace
@@ -5,6 +5,12 @@
 		},
 		{
 			"path": "../etsi-mec-sandbox-frontend"
+		},
+		{
+			"path": "../tmp/tools"
+		},
+		{
+			"path": "../mec-sandbox-scenarios"
 		}
 	],
 	"extensions": {
diff --git a/examples/demo6/golang/app_instance.yaml b/examples/demo6/golang/app_instance.yaml
index d71965f945ee17e9dfbf4700ce299bb69fd94281..79036f8c125c18c0964422ed7efe7fe524989b41 100644
--- a/examples/demo6/golang/app_instance.yaml
+++ b/examples/demo6/golang/app_instance.yaml
@@ -3,7 +3,7 @@
 # Set where mec application is running either on MEC Sandbox or AdvantEDGE. Expected fields: sandbox | advantedge
 mode: 'sandbox'
 # Set MEC plateform address 
-sandbox: 'mec-platform2.etsi.org'
+sandbox: 'try-mec.etsi.org'
 # Set if sandbox url uses https. Expected fields: true | false 
 https: true 
 # Set the mec platform name demo-6 will run on. Example field: mep1
diff --git a/examples/demo6/golang/main.go b/examples/demo6/golang/main.go
index e7d5c72811fe2b7474b27db50eb9c777f96ff109..5f1af3b19d1a33ed0f25532d63f01f091062a254 100644
--- a/examples/demo6/golang/main.go
+++ b/examples/demo6/golang/main.go
@@ -264,7 +264,7 @@ type UeContext struct {
 var (
 	dir                       string
 	fileName                  string
-	provider                  string = "Jupyter2024" //"github"
+	provider                  string = "github" //"Jupyter2024"
 	run                       bool   = true
 	done                      chan bool
 	cfg                       *client.Configuration = nil
diff --git a/examples/demo6/python/README.md b/examples/demo6/python/README.md
index 8eebdd712c1ba5b566a73a6bff7f6d58c1d08440..13a1c2b9ca5236e915257829e3c086ce32d1627a 100644
--- a/examples/demo6/python/README.md
+++ b/examples/demo6/python/README.md
@@ -1,3 +1,4 @@
+
 docker pull quay.io/jupyter/base-notebook:latest
 
 cd ~/etsi-mec-sandbox/examples/demo6/python/ && docker run --rm -it -d --expose 31111 -p 31111:31111 -p 9999:8888 -v"$PWD:/home/jovyan/work" quay.io/jupyter/base-notebook:latest
diff --git a/examples/demo7/Dockerfile b/examples/demo7/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..a5a306ab06bc7f6eca06cfef48880664a8742b30
--- /dev/null
+++ b/examples/demo7/Dockerfile
@@ -0,0 +1,22 @@
+# Copyright (c) 2022  The AdvantEDGE Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM ubuntu:22.04
+
+COPY ./fsmsggen /fsmsggen
+COPY ./entrypoint.sh /entrypoint.sh
+
+RUN apt-get update && apt-get install -y curl libjson-c-dev libgps-dev libpcap-dev libssl-dev && chmod +x /entrypoint.sh && chmod +x /fsmsggen
+
+ENTRYPOINT ["/entrypoint.sh"]
diff --git a/examples/demo7/README.md b/examples/demo7/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5fdf3ed024568413b5add6c375063abcfa61da27
--- /dev/null
+++ b/examples/demo7/README.md
@@ -0,0 +1,4 @@
+# Demo7
+Demo7 showcases the V2X capabilities of the platform.
+It is a C-V2X OBU simulator taht can be used as MEC application
+
diff --git a/examples/demo7/dockerize.sh b/examples/demo7/dockerize.sh
new file mode 100755
index 0000000000000000000000000000000000000000..23af55866260067711539ca4761c0d84b8abc3b3
--- /dev/null
+++ b/examples/demo7/dockerize.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# Get full path to script directory
+SCRIPT=$(readlink -f "$0")
+BASEDIR=$(dirname "$SCRIPT")
+
+echo ""
+echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+echo ">>> Dockerizing fsmsggen"
+echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+echo ""
+
+# Dockerize demo 
+docker build --no-cache --rm -t meep-docker-registry:30001/fsmsggen .
+docker push meep-docker-registry:30001/fsmsggen
+
+
+echo ""
+echo ">>> fsmsggen dockerize completed"
+
+
+
+
diff --git a/examples/demo7/entrypoint.sh b/examples/demo7/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6e6495e9fdeac1bc446e4e8c8e26aacc4254bc64
--- /dev/null
+++ b/examples/demo7/entrypoint.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Here are some examples of env. variable values:
+#   COMM: [--iface eth0|--mode 2]
+#
+#   GOBAL: --verbose --srcaddr 00:01:02:03:04:05 --no-sec true
+#
+#   SEC_MODE: --no-sec true
+#
+#   BEACON: --no-sec-beacon true
+#
+#   CAM: --cam-station-type passengerCar --cam-station-id 12345 --cam-no-sec
+#
+#   DENM 
+#
+#   VERBOSE: --verbose
+
+# E.g. yann@yann-linux:~/frameworks/fsmsggen$ sudo ./build/x86_64-linux-gnu-d/fsmsggen --iface wlo1 --verbose --srcaddr 00:01:02:03:04:05 --no-sec true --cam-station-type passengerCar --cam-station-id 12345 --cam-no-sec --out ./out.pcap
+
+
+set -e
+set +vx
+
+echo "Starting '/fsmsggen ${COMM} ${GOBAL} ${SEC_MODE} ${COMM_MODE} ${BEACON} ${CAM} ${DENM} ${VERBOSE}'"
+/fsmsggen ${COMM} ${GOBAL} ${SEC_MODE} ${BEACON} ${CAM} ${DENM} ${VERBOSE}
\ No newline at end of file
diff --git a/examples/demo7/fsmsggen b/examples/demo7/fsmsggen
new file mode 100644
index 0000000000000000000000000000000000000000..c93135604ba829e024062ee35114fe0496126e36
Binary files /dev/null and b/examples/demo7/fsmsggen differ
diff --git a/examples/demo8/CAPIF_And_ETSI_MEC_Tutorial.ipynb b/examples/demo8/CAPIF_And_ETSI_MEC_Tutorial.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..b1349992751731795778f45847f664b78b4525bc
--- /dev/null
+++ b/examples/demo8/CAPIF_And_ETSI_MEC_Tutorial.ipynb
@@ -0,0 +1,2158 @@
+{
+  "nbformat": 4,
+  "nbformat_minor": 0,
+  "metadata": {
+    "colab": {
+      "private_outputs": true,
+      "provenance": [],
+      "toc_visible": true
+    },
+    "kernelspec": {
+      "name": "python3",
+      "display_name": "Python 3"
+    },
+    "language_info": {
+      "name": "python"
+    }
+  },
+  "cells": [
+    {
+      "cell_type": "markdown",
+      "source": [
+        "# Using ETSI MEC profile of CAPIF  in CAPIF application\n",
+        "\n",
+        "## Introduction\n",
+        "\n",
+        "3GPP CAPIF (Common API Framework) is a standardized API management framework designed to enable a unified northbound API approach across 3GPP network functions (see 3GPP TS 23.222 version 18.6.0 Release 18/ETSI TS 123 222 V18.6.0 (2024-06) and 3GPP TS 29.222 version 18.6.0 Release 18/ETSI TS 129 222 V18.6.0 (2022-06)).\n",
+        "\n",
+        "This tutorial introduces the step by step procedure to create a basic CAPIF application to exploit the ETSI MEC CAPIF profile as described in ETSI GS MEC 011 (V3.2.1) Clause 9.\n",
+        "It uses the ETSI MEC Sandbox simulator.\n",
+        "\n",
+        "<div class=\"alert alert-block alert-danger\">\n",
+        "    <b>Note:</b> These source code examples are simplified and ignore return codes and error checks to a large extent. We do this to highlight how to use the MEC Sandbox API and the different MEC satndards and reduce unrelated code.\n",
+        "A real-world application will of course properly check every return value and exit correctly at the first serious error.\n",
+        "</div>\n"
+      ],
+      "metadata": {
+        "id": "44TomlvPCGTe"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## The basics of developing a MEC application\n",
+        "\n",
+        "\n",
+        "<div class=\"alert alert-warning\" role=\"alert\">\n",
+        "    <b>Note:</b> The sub-paragraph 'Putting everything together' is a specific paragraph where all the newly features introduced in the main paragraph are put together to create an executable block of code. It is possible to skip this block of code by removing the comment character (#) on first line of this block of code.\n",
+        "</div>\n",
+        "\n",
+        "Before going to create our CAPIF application skeleton, the following steps shall be done:\n",
+        "\n",
+        "1) Apply the python imports"
+      ],
+      "metadata": {
+        "id": "4DpxwmiomELg"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "from __future__ import division # Import floating-point division (1/4=0.25) instead of Euclidian division (1/4=0)\n",
+        "\n",
+        "import os\n",
+        "import sys\n",
+        "import re\n",
+        "import logging\n",
+        "import threading\n",
+        "import time\n",
+        "import json\n",
+        "import uuid\n",
+        "import base64\n",
+        "\n",
+        "import pprint\n",
+        "\n",
+        "import requests\n",
+        "\n",
+        "from http import HTTPStatus\n",
+        "from http.server import BaseHTTPRequestHandler, HTTPServer\n",
+        "\n",
+        "try:\n",
+        "    import urllib3\n",
+        "except ImportError:\n",
+        "    raise ImportError('Swagger python client requires urllib3.')\n"
+      ],
+      "metadata": {
+        "id": "1gjo-NM6hD1k"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "The following imports are required to support the security aspects such as certificates management, signatures..."
+      ],
+      "metadata": {
+        "id": "j9wDIe9IEUQz"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "from OpenSSL.SSL import FILETYPE_PEM\n",
+        "from OpenSSL.crypto import (dump_certificate_request, dump_privatekey, load_publickey, PKey, TYPE_RSA, X509Req, dump_publickey)\n"
+      ],
+      "metadata": {
+        "id": "xb4ReBZZEVLB"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "2) Initialize of the global constants (cell 3)"
+      ],
+      "metadata": {
+        "id": "DrPJzD14nLas"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "REGISTER_HOSTNAME     = 'lab-oai.etsi.org'                    # capif-prev.mobilesandbox.cloud\n",
+        "REGISTER_PORT         = 31120                                 # 36212\n",
+        "REGISTER_USER         = 'admin'                               # Basic AUTH for registration\n",
+        "REGISTER_PASSWORD     = 'password123'                         # Basic AUTH for registration\n",
+        "\n",
+        "CAPIF_HOSTNAME        = 'lab-oai.etsi.org'\n",
+        "CAPIF_PORT            = 443\n",
+        "\n",
+        "USER_PASSWORD         = 'password123'\n",
+        "\n",
+        "TRY_MEC_URL           = 'try-mec.etsi.org'                     # MEC Sandbox URL\n",
+        "TRY_MEC_SESSION_ID    = 'sbxgs9x587'                           # MEC Sandbox identifier\n",
+        "TRY_MEC_PLTF          = 'mep1'                                 # MEC Platform identifier (depending of the network scenario loaded)\n",
+        "MEC_APP_INST_ID       = 'f1e4d448-e277-496b-bf63-98391cfd20fb' # A MEC application identifier\n"
+      ],
+      "metadata": {
+        "id": "rNibZWiBitPE"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "3) Setup the logger instance and the HTTP REST API (cell 4)"
+      ],
+      "metadata": {
+        "id": "MOa9g-NMnpod"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "# Initialize the logger\n",
+        "logger = logging.getLogger(__name__)\n",
+        "logger.setLevel(logging.DEBUG)\n",
+        "logging.basicConfig(filename='/tmp/' + time.strftime('%Y%m%d-%H%M%S') + '.log')\n",
+        "l = logging.StreamHandler()\n",
+        "l.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))\n",
+        "logger.addHandler(l)\n"
+      ],
+      "metadata": {
+        "id": "-cuxWhfantSw"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "4) Setup the global variables (cell 5)"
+      ],
+      "metadata": {
+        "id": "D67Aq0vujB0q"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "# Initialize the global variables\n",
+        "ca_root                = \"\" # The CAPIF root certificate\n",
+        "ccf_api_onboarding_url = \"\" #\n",
+        "ccf_publish_url        = \"\" # The CAPIF publish API endpoint\n",
+        "ccf_discover_url       = \"\" # The CAPIF discovery endpoint\n",
+        "ccf_security_url       = \"\" # The CAPIF security endpoint\n",
+        "ccf_onboarding_url     = \"\" # The CAPIF onboarding endpoint\n"
+      ],
+      "metadata": {
+        "id": "7RC7UY-0oACq"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "To enable the Automatic Debugger Calling, uncomment the code bellow."
+      ],
+      "metadata": {
+        "id": "2YvSVMClhPJT"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "#!pip install ipdb\n",
+        "#import ipdb\n",
+        "#%pdb on\n",
+        "# Use the command ipdb.set_trace() to set a breakpoint"
+      ],
+      "metadata": {
+        "id": "OQjYWHgnYM4G"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Create our first CAPIF application\n",
+        "\n",
+        "The first step to develop a MEC application is to create the application skeleton which contains the minimum steps below:\n",
+        "\n",
+        "- Login to instanciate a MEC Sandbox\n",
+        "- Logout to delete a existing MEC Sandbox"
+      ],
+      "metadata": {
+        "id": "1fMmXWk9jLDX"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "#### Login\n",
+        "\n",
+        "The login operation is required by ETSI TS 123 222 V18.6.0 (2024-06) Clause 4.5 Operations, Administration and Maintenance but is out of the scope of ETSI TS 129 222 V18.6.0 (2022-06)."
+      ],
+      "metadata": {
+        "id": "rtAVXZayoQRx"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def process_login() -> tuple:\n",
+        "    \"\"\"\n",
+        "    Logs in to the CAPIF server.\n",
+        "    :return A dictionary containing the login response, or None if login fails\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> process_login')\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/login'\n",
+        "        logger.debug('process_login: url=' + url)\n",
+        "        auth_string = f\"{REGISTER_USER}:{REGISTER_PASSWORD}\"\n",
+        "        encoded_auth = base64.b64encode(auth_string.encode('utf-8')).decode('utf-8')\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': f'Basic {encoded_auth}'}\n",
+        "        logger.debug('process_login (step1): headers: ' + str(headers))\n",
+        "        response = requests.post(url, headers=headers, verify=False)\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        logger.debug('process_login (step2): result: ' + str(response.json()))\n",
+        "        if response.status_code != 200:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return None, None\n",
+        "        tokens = json.loads(response.text)\n",
+        "        return tokens['refresh_token'], tokens['access_token']\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"Login failed: {e}\")\n",
+        "\n",
+        "    return None, None\n",
+        "    # End of function process_login"
+      ],
+      "metadata": {
+        "id": "Ad8g1no-pH7i"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Logout\n",
+        "\n",
+        "The logout operation is required by ETSI TS 123 222 V18.6.0 (2024-06) Clause 4.5 Operations, Administration and Maintenance but is out of the scope of ETSI TS 129 222 V18.6.0 (2022-06)."
+      ],
+      "metadata": {
+        "id": "8Cw5MBc-st1e"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def process_logout():\n",
+        "    \"\"\"\n",
+        "    Logs out from the CAPIF server\n",
+        "    Nothing to do\n",
+        "    \"\"\"\n",
+        "    pass\n",
+        "    # End of function process_logout"
+      ],
+      "metadata": {
+        "id": "XmyLOuFasuvU"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "Now, it is time now to create the our first iteration of our CAPIF/MEC application. Here the logic is:\n",
+        "*   Login\n",
+        "*   Print obtained tokens\n",
+        "*   Logout\n",
+        "*   Check that logout is effective"
+      ],
+      "metadata": {
+        "id": "mCKT-ntspnsM"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the first sprint of our CAPIF application:\n",
+        "        - Login\n",
+        "        - Print obtained tokens\n",
+        "        - Logout\n",
+        "        - Check that logout is effective\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Login\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        return\n",
+        "\n",
+        "    # Print obtained tokens\n",
+        "    logger.debug(\"Login successful: admin_token=\" + admin_token)\n",
+        "\n",
+        "    # Logout\n",
+        "    process_logout()\n",
+        "\n",
+        "    # Check that logout is effective\n",
+        "    logger.debug('To check that logout is effective')\n",
+        "\n",
+        "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    # End of function process_main\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "    process_main()\n"
+      ],
+      "metadata": {
+        "id": "XYC8PnDUpvui"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Create the API Provider\n",
+        "\n",
+        "The next step is to create a new user associated to our CAPIF application to obtain a user UUID. It will be used to genereate ceertificates to be used during TLS mutual authentication and API onboarding and offboarding for instance.\n",
+        "\n",
+        "**Note:** It is required by ETSI TS 123 222 V18.6.0 (2024-06) Clause 4.5 Operations, Administration and Maintenance but is out of the scope of ETSI TS 129 222 V18.6.0 (2022-06).\n"
+      ],
+      "metadata": {
+        "id": "rTcvGY5T1pZJ"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Creating a new user\n",
+        "\n",
+        "The cell below provides an implementation for this user creation.\n",
+        "\n",
+        "**Note:** To improve this code, the user profile shlould be fully parametrized."
+      ],
+      "metadata": {
+        "id": "ysxZ8sIiLLgw"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def create_user(p_admin_token: str) -> tuple:\n",
+        "    \"\"\"\n",
+        "    Creates a new user.\n",
+        "    :return: The user UUID on success, None otherwise\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> create_user')\n",
+        "\n",
+        "    try:\n",
+        "        user_name = str(uuid.uuid1())\n",
+        "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/createUser'\n",
+        "        logger.debug('create_user: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_admin_token}\n",
+        "        logger.debug('create_user (step1): headers: ' + str(headers))\n",
+        "        data = {\n",
+        "            'username': user_name,\n",
+        "            'password': USER_PASSWORD,\n",
+        "            'enterprise': 'ETSI',\n",
+        "            'country': 'France',\n",
+        "            'email': 'ocf@etsi.org',\n",
+        "            'purpose': 'Tutorial on MEC/OpenCAPIF',\n",
+        "            'phone_number': \"+330405060708\",\n",
+        "            'company_web': 'www.etsi.org',\n",
+        "            'description': 'A step by step procedure to create a basic CAPIF application to exploit the ETSI MEC CAPIF profile'\n",
+        "        }\n",
+        "        response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)\n",
+        "        logger.debug('create_user (step2): response=' + str(response))\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        if response.status_code != 201:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return ()\n",
+        "        tokens = json.loads(response.text)\n",
+        "        return (user_name, tokens['uuid'])\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"Error creating user: {e}\")\n",
+        "\n",
+        "    return ()\n",
+        "    # End of function create_user"
+      ],
+      "metadata": {
+        "id": "Jq-9_sLI8WgW"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Deleting an existing User\n",
+        "\n",
+        "Before to terminate our CAPIF application, we have to clean up the resources. So, a function to delete a created user is required."
+      ],
+      "metadata": {
+        "id": "Ut3CLrRUFT5o"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def delete_user(p_user_uuid: str, p_admin_token: str) -> int:\n",
+        "    \"\"\"\n",
+        "    Deletes a user.\n",
+        "    :param p_user_uuid: The user UUID\n",
+        "    :return: 0 on success, -1 otherwise\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> delete_user')\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/deleteUser/' + p_user_uuid\n",
+        "        logger.debug('delete_user: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_admin_token}\n",
+        "        response = requests.delete(url, headers=headers, verify=False)\n",
+        "        logger.debug('delete_user: response=' + str(response))\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        return 0\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"Error creating user: {e}\")\n",
+        "\n",
+        "    return -1\n",
+        "    # End of function delete_user"
+      ],
+      "metadata": {
+        "id": "WRIdwNMNFrdC"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "It is time now to create the our second iteration of our CAPIF/MEC application.\n",
+        "\n",
+        "The sequence is the following:\n",
+        "*   Login\n",
+        "*   Print obtained tokens\n",
+        "*   Create a new user\n",
+        "*   Print the user UUID\n",
+        "*   Delete the newly created user\n",
+        "*   Logout\n"
+      ],
+      "metadata": {
+        "id": "IAh9tN25-82V"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the second sprint of our CAPIF/MEC application:\n",
+        "        - Login\n",
+        "        - Print obtained tokens\n",
+        "        - Create a new user\n",
+        "        - Print the user UUID\n",
+        "        - Delete the newly created user\n",
+        "        - Logout\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Login\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        return\n",
+        "\n",
+        "    # Print obtained tokens\n",
+        "    logger.debug(\"Login successful: admin_token=\" + admin_token)\n",
+        "\n",
+        "    # Create a new user\n",
+        "    user_name, user_uuid = create_user(admin_token)\n",
+        "    if len(user_uuid) == 0:\n",
+        "        return\n",
+        "\n",
+        "    # Print User UUID\n",
+        "    logger.debug(\"User successfully created: user_uuid=\" + user_uuid)\n",
+        "\n",
+        "    time.sleep(5) # Sleep for 5 seconds\n",
+        "\n",
+        "    # Delete the newly created user\n",
+        "    delete_user(user_uuid, admin_token)\n",
+        "\n",
+        "    # Logout\n",
+        "    process_logout()\n",
+        "\n",
+        "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    # End of function process_main\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "    process_main()\n"
+      ],
+      "metadata": {
+        "id": "1M_x2I1B_Crp"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Getting security materials\n",
+        "\n",
+        "The purpose is to retrieves peer certificates for the TLS mutual authentication purpose and the JWT token to onboarding and offboarding APIs.\n",
+        "The following information is retrived:\n",
+        "- The root certificate\n",
+        "- An access token which will be used for onboarding and offboarding APIs\n",
+        "- The URLs for the different CAPIF endpoints:\n",
+        " * API onbording endpoint\n",
+        " * API discovery endpoint\n",
+        " * API publish endpoint\n",
+        " * Security endpoint\n",
+        "\n",
+        "This operation needs the user name and the user password used in previous [chapter](#create_the_invoker_/_provider).\n"
+      ],
+      "metadata": {
+        "id": "f896qBJOjMuz"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Getting certificates"
+      ],
+      "metadata": {
+        "id": "lC2JAah7LWLp"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def get_auth(p_user_name: str, p_user_password: str) -> dict:\n",
+        "    \"\"\"\n",
+        "    Gets the authentication information.\n",
+        "    :param The user name\n",
+        "    :param The user password\n",
+        "    :return A dictionary containing the authentication information on success, or an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> get_auth')\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + REGISTER_HOSTNAME + ':' + str(REGISTER_PORT) + '/getauth'\n",
+        "        logger.debug('get_auth: url=' + url)\n",
+        "        auth_string = f\"{p_user_name}:{p_user_password}\"\n",
+        "        encoded_auth = base64.b64encode(auth_string.encode('utf-8')).decode('utf-8')\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': f'Basic {encoded_auth}'}\n",
+        "        logger.debug('get_auth (step1): headers: ' + str(headers))\n",
+        "        response = requests.get(url, headers=headers, verify=False)\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        logger.debug('get_auth (step2): result: ' + str(response.json()))\n",
+        "        if response.status_code != 200:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return dict()\n",
+        "        auth = json.loads(response.text)\n",
+        "        return auth\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"get_auth failed: {e}\")\n",
+        "\n",
+        "    return dict()\n",
+        "    # End of function get_auth"
+      ],
+      "metadata": {
+        "id": "1glmqNSRK1cH"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "\n",
+        "Now, it is time now to create the our third iteration of our MEC application. Here the logic is:\n",
+        "\n",
+        "- Login\n",
+        "- Create the user\n",
+        "- Get the information to use CAPIF (security materials & URLs)\n",
+        "- Print the information to use CAPI\n",
+        "- Delete the user\n",
+        "- Logout\n"
+      ],
+      "metadata": {
+        "id": "BUw-VS1WLb7i"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the ;line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the first sprint of our skeleton of our CAPIF application:\n",
+        "        - Login\n",
+        "        - Print obtained tokens\n",
+        "        - Create a new user\n",
+        "        - Get the information to use CAPIF (security materials & URLs)\n",
+        "        - Print the information to use CAPI\n",
+        "        - Delete the newly created user\n",
+        "        - Logout\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root, ccf_api_onboarding_url, ccf_publish_url, ccf_discover_url, ccf_security_url, ccf_onboarding_url\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Login\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        return\n",
+        "\n",
+        "    # Create a new user\n",
+        "    user_name, user_uuid = create_user(admin_token)\n",
+        "    if len(user_uuid) == 0:\n",
+        "        return\n",
+        "\n",
+        "    auth = get_auth(user_name, USER_PASSWORD)\n",
+        "    if len(auth) == 0:\n",
+        "        return\n",
+        "\n",
+        "    # Print the authentication information\n",
+        "    logger.debug(\"Authentication information=\" + str(auth))\n",
+        "    access_token = auth['access_token']\n",
+        "    ca_root = auth['ca_root']\n",
+        "    ccf_api_onboarding_url = auth['ccf_api_onboarding_url']\n",
+        "    ccf_discover_url = auth['ccf_discover_url']\n",
+        "    ccf_onboarding_url = auth['ccf_onboarding_url']\n",
+        "    ccf_publish_url = auth['ccf_publish_url']\n",
+        "    ccf_security_url = auth['ccf_security_url']\n",
+        "\n",
+        "    time.sleep(5) # Sleep for 5 seconds\n",
+        "\n",
+        "    # Delete the newly created user\n",
+        "    delete_user(user_uuid, admin_token)\n",
+        "\n",
+        "    # Logout\n",
+        "    process_logout()\n",
+        "\n",
+        "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    # End of function process_main\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "    process_main()\n"
+      ],
+      "metadata": {
+        "id": "J002Vuz2OIKl"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Onboarding and offboarding APIs\n"
+      ],
+      "metadata": {
+        "id": "oNhnnDhjjOd7"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Generate certificates\n",
+        "\n",
+        "Until now, all HTTPS exchanges were done with the the 'verify' attribute of the HTTP reques set to False. It means that the TLS mutual authentication was disabled.\n",
+        "\n",
+        "Fo the process of onboarding and offboarding APIs, the TLS mutual authentication is required. We already got the peer certificate to verify peer but we need to generate our own certificate to be verified by the CAPIF server. This is the purpose of the following functions to generate the public/private keys and generate a CSR and request certificates for each of the three functions AMF, AEF and APF.\n",
+        "\n",
+        "**Refer to:** ETSI TS 129 222 V18.6.0 (2022-06) Clauses 5.11 CAPIF_API_Provider_Management and 8.9 CAPIF_API_Provider_Management_API\n"
+      ],
+      "metadata": {
+        "id": "K6i4ktfM1xFQ"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def generate_csr(p_cn: str, p_org: str, p_country: str) -> tuple:\n",
+        "    \"\"\"\n",
+        "    To generate the CSR and generate the dumps\n",
+        "    :param p_cn: The common name\n",
+        "    :param p_org: The organization\n",
+        "    :param p_country: The country\n",
+        "    :return: The CSR and the private keys on success, None otherwise\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> generate_csr')\n",
+        "\n",
+        "    # Generate the public/private key\n",
+        "    key = PKey()\n",
+        "    key.generate_key(TYPE_RSA, 2048)\n",
+        "\n",
+        "    # Generate the CSR\n",
+        "    req = X509Req()\n",
+        "    req.get_subject().CN = p_cn\n",
+        "    req.get_subject().O = p_org\n",
+        "    req.get_subject().C = p_country\n",
+        "    req.set_pubkey(key)\n",
+        "    req.sign(key, 'sha256')\n",
+        "\n",
+        "    # Generate the dumps\n",
+        "    csr_request = dump_certificate_request(FILETYPE_PEM, req)\n",
+        "    private_key = dump_privatekey(FILETYPE_PEM, key)\n",
+        "    logger.debug('generate_csr: PrivKey: ' + str(private_key))\n",
+        "\n",
+        "    return (csr_request, private_key)\n"
+      ],
+      "metadata": {
+        "id": "gEIS3iAH2D4t"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "**Note:** The function above can be improved using parameter for the SHA, and the signature/encryption algorithm."
+      ],
+      "metadata": {
+        "id": "F2-W0a5S3snI"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Onboard the API provider\n",
+        "\n",
+        "The purpose here is to get certificates from CAPIF in order to export our APIs for the different functions:\n",
+        "- AMF: API Management Function\n",
+        "- AEF: API Exposing Function\n",
+        "- APF: API Publishing Function"
+      ],
+      "metadata": {
+        "id": "1HyqrdUz-uzn"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def onboard_provider(p_name: str, p_access_token: str) -> dict:\n",
+        "    \"\"\"\n",
+        "    To onboard the provider.\n",
+        "    :param p_name: The name of the provider\n",
+        "    :return: A dictionary containing security material for each CAPIF endpoint on success, or an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ccf_api_onboarding_url, access_token\n",
+        "\n",
+        "    logger.debug('>>> onboard_provider')\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_api_onboarding_url\n",
+        "        logger.debug('onboard_provider: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_access_token}\n",
+        "        logger.debug('onboard_provider (step1): headers: ' + str(headers))\n",
+        "        # Build the list of certificate request for the three endpoints\n",
+        "        l = []\n",
+        "        amf_csr_request, amf_private_key = generate_csr(\"AMF\", \"ETSI\", \"Fr\")\n",
+        "        amf_entry = {\n",
+        "            'regInfo': {\n",
+        "                'apiProvPubKey': amf_csr_request.decode(\"utf-8\")\n",
+        "            },\n",
+        "            'apiProvFuncRole': 'AMF'\n",
+        "        }\n",
+        "        l.append(amf_entry)\n",
+        "        aef_csr_request, aef_private_key = generate_csr(\"AEF\", \"ETSI\", \"Fr\")\n",
+        "        aef_entry = {\n",
+        "            'regInfo': {\n",
+        "                'apiProvPubKey': aef_csr_request.decode(\"utf-8\")\n",
+        "            },\n",
+        "            'apiProvFuncRole': 'AEF'\n",
+        "        }\n",
+        "        l.append(aef_entry)\n",
+        "        apf_csr_request, apf_private_key = generate_csr(\"APF\", \"ETSI\", \"Fr\")\n",
+        "        apf_entry = {\n",
+        "            'regInfo': {\n",
+        "                'apiProvPubKey': apf_csr_request.decode(\"utf-8\")\n",
+        "            },\n",
+        "            'apiProvFuncRole': 'APF'\n",
+        "        }\n",
+        "        l.append(apf_entry)\n",
+        "        # Build the request body\n",
+        "        data = {\n",
+        "            'apiProvFuncs': l,\n",
+        "            'apiProvDomInfo': p_name,\n",
+        "            'suppFeat': 'fff',\n",
+        "            'failReason': 'string',\n",
+        "            'regSec': p_access_token\n",
+        "        }\n",
+        "        logger.debug('onboard_provider (step2): body: ' + str(data))\n",
+        "        response = requests.post(url, headers=headers, data=json.dumps(data), verify=False)\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        logger.debug('onboard_provider (step3): result: ' + str(response.json()))\n",
+        "        if response.status_code != 201:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return dict()\n",
+        "        res = json.loads(response.text)\n",
+        "        # Add an entry for CSRs and private keys for future usage\n",
+        "        res['csr'] = {\n",
+        "            'amf': [amf_csr_request, amf_private_key],\n",
+        "            'aef': [aef_csr_request, aef_private_key],\n",
+        "            'apf': [apf_csr_request, apf_private_key]\n",
+        "        }\n",
+        "        return res\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"onboard_provider failed: {e}\")\n",
+        "\n",
+        "    return dict()\n",
+        "    # End of function onboard_provider"
+      ],
+      "metadata": {
+        "id": "6cCn1vKLGe0k"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Offboard the API provider\n",
+        "\n",
+        "The purpose is to offboard the API provider from the CAPIF server. Here, the certificate and the private key of the AMF endpoint are required (TLS mutual authentication)."
+      ],
+      "metadata": {
+        "id": "yP6ZytijFxKG"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def offboard_provider(p_api_provider_id: str, p_bundle: tuple) -> list:\n",
+        "    \"\"\"\n",
+        "    To offboard the API provider.\n",
+        "    :param p_api_provider_id: The identifier of the API provider\n",
+        "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+        "    :return: A list containing the files created for the TLS mutual authentication operations on success, or an empty list otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ccf_api_onboarding_url, ca_root\n",
+        "\n",
+        "    logger.debug('>>> offboard_provider')\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_api_onboarding_url + '/' + p_api_provider_id\n",
+        "        logger.debug('offboard_provider: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json'}\n",
+        "        logger.debug('offboard_provider (step1): headers: ' + str(headers))\n",
+        "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+        "        if len(bundle) != 3:\n",
+        "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+        "            return []\n",
+        "        logger.debug('offboard_provider (step2): bundle: ' + str(bundle))\n",
+        "        response = requests.delete(url, headers=headers, cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+        "        logger.debug('offboard_provider (step3): response=' + str(response))\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        if response.status_code != 204:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return []\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"offboard_provider failed: {e}\")\n",
+        "        return []\n",
+        "\n",
+        "    return bundle\n",
+        "    # End of function offboard_provider\n",
+        "\n",
+        "def store_certificate_2_files(p_certificate, p_private_key, p_ca_root) -> list:\n",
+        "    \"\"\"\n",
+        "    Save certificate and key into files\n",
+        "    :param p_certificate:\n",
+        "    :param p_private_key:\n",
+        "    :param p_ca_root:\n",
+        "    :return: A list of file paths on success, an empty list otherwise\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> store_certificate_2_files')\n",
+        "    try:\n",
+        "        with open(\"p_crt.crt\", \"w\") as f:\n",
+        "            f.write(p_certificate)\n",
+        "        with open(\"p_key.key\", \"w\") as f:\n",
+        "            f.write(p_private_key.decode('utf-8'))\n",
+        "        with open(\"ca_root.pem\", \"w\") as f:\n",
+        "            f.write(p_ca_root)\n",
+        "        return [\"p_crt.crt\", \"p_key.key\", \"ca_root.pem\"]\n",
+        "    except Exception as e:\n",
+        "        logger.error(f\"An error occurred: {e}\")\n",
+        "\n",
+        "    return []\n",
+        "    # End of function store_certificate_2_files\n"
+      ],
+      "metadata": {
+        "id": "rbpNr26tF2gr"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "\n",
+        "Now, it is time now to create the our third iteration of our CAPIF/MEC application. Here the logic is:\n",
+        "\n",
+        "- Login\n",
+        "- Create the user\n",
+        "- Get the information to use CAPIF (security materials & URLs)\n",
+        "- Onboard the provider\n",
+        "- Print certificates for each function\n",
+        "- Delete the user\n",
+        "- Logout\n"
+      ],
+      "metadata": {
+        "id": "wmvJSK8I13XD"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the third sprint of our CAPIF/MEC application:\n",
+        "        - Login\n",
+        "        - Print obtained tokens\n",
+        "        - Create a new user\n",
+        "        - Get the information to use CAPIF (security materials & URLs)\n",
+        "        - Onboard the provider\n",
+        "        - Print certificates for each function\n",
+        "        - Delete the newly created user\n",
+        "        - Logout\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root, ccf_api_onboarding_url, ccf_publish_url, ccf_discover_url, ccf_security_url, ccf_onboarding_url\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Login\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        return\n",
+        "\n",
+        "    # Create a new user\n",
+        "    user_name, user_uuid = create_user(admin_token)\n",
+        "    if len(user_uuid) == 0:\n",
+        "        return\n",
+        "\n",
+        "    auth = get_auth(user_name, USER_PASSWORD)\n",
+        "    if len(auth) == 0:\n",
+        "        return\n",
+        "\n",
+        "    # Set the CAPIF access information\n",
+        "    access_token = auth['access_token']\n",
+        "    ca_root = auth['ca_root']\n",
+        "    ccf_api_onboarding_url = auth['ccf_api_onboarding_url']\n",
+        "    ccf_discover_url = auth['ccf_discover_url']\n",
+        "    ccf_onboarding_url = auth['ccf_onboarding_url']\n",
+        "    ccf_publish_url = auth['ccf_publish_url']\n",
+        "    ccf_security_url = auth['ccf_security_url']\n",
+        "    logger.debug(\"ccf_api_onboarding_url:\" + ccf_api_onboarding_url)\n",
+        "    logger.debug(\"ccf_discover_url:\" + ccf_discover_url)\n",
+        "    logger.debug(\"ccf_publish_url:\" + ccf_publish_url)\n",
+        "    logger.debug(\"ccf_security_url:\" + ccf_security_url)\n",
+        "\n",
+        "    # Onboard the provider\n",
+        "    prov = onboard_provider(\"MECSandbox_to_CAPIF_Provider\", access_token)\n",
+        "    if len(prov) == 0:\n",
+        "        return\n",
+        "\n",
+        "    # Print certificates for each function\n",
+        "    logger.debug(\"API Provider Id:\" + prov['apiProvDomId'])\n",
+        "    logger.debug(\"AMF: \" + prov['apiProvFuncs'][0]['regInfo']['apiProvCert'])\n",
+        "    logger.debug(\"AEF: \" + prov['apiProvFuncs'][1]['regInfo']['apiProvCert'])\n",
+        "    logger.debug(\"APF: \" + prov['apiProvFuncs'][2]['regInfo']['apiProvCert'])\n",
+        "    logger.debug(\"csr: \" + str(prov['csr']))\n",
+        "\n",
+        "    time.sleep(5) # Sleep for 5 seconds\n",
+        "\n",
+        "    # Offboard the API profider\n",
+        "    certs_bundle = (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]) # Use AMF certificate and AMF private key\n",
+        "    file_bundle = offboard_provider(prov['apiProvDomId'], certs_bundle)\n",
+        "    if len(file_bundle) == 0:\n",
+        "        for file in file_bundle:\n",
+        "            os.remove(file)\n",
+        "\n",
+        "    # Delete the newly created user\n",
+        "    delete_user(user_uuid, admin_token)\n",
+        "\n",
+        "    # Logout\n",
+        "    process_logout()\n",
+        "\n",
+        "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    # End of function process_main\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "    process_main()\n"
+      ],
+      "metadata": {
+        "id": "EDcPUuNEM26H"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Using ETSI MEC profile for CAPIF\n",
+        "\n",
+        "The purpose is to export the MEC Profile for CAPIF API into our CAPIF application. To achieve it, we need to fulfill the following requirements:\n",
+        "1. Create an instance of a MEC Sandbox using the '4g-5g-macri-v2x' network scenario\n",
+        "2. Set TRY_MEC_URL, TRY_MEC_SESSION_ID, TRY_MEC_PLTF, MEC_APP_INST_ID constant accordingly\n",
+        "3. Build the ServiceAPIDescription as described in ETSI TS 129 222 V18.6.0 (2022-06) Table 8.2.4.2.2-1: Definition of type ServiceAPIDescription. This is the role of the function below"
+      ],
+      "metadata": {
+        "id": "0wHI1ooMbCy3"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def build_publish_api_from_mec_services(p_aefId: str) -> dict:\n",
+        "    \"\"\"\n",
+        "    This function builds the Publish API request body data structure which will be used todo the request for publish API\n",
+        "    :param p_aefId: The AEF ID\n",
+        "    :return The request body data structure on success, an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, TRY_MEC_URL, TRY_MEC_SESSION_ID, TRY_MEC_PLTF\n",
+        "\n",
+        "    logger.debug('>>> build_publish_api_from_mec_services: p_aefId=' + p_aefId)\n",
+        "\n",
+        "    # Sanity checks\n",
+        "    if len(p_aefId) == 0:\n",
+        "        logger.error('build_publish_api_from_mec_services: p_aefId is empty')\n",
+        "        return dict()\n",
+        "\n",
+        "    # Build the service-apis data structure\n",
+        "    publish_api_req_body = {\n",
+        "        \"apiName\": \"MEC Profile for CAPIF\",\n",
+        "        \"aefProfiles\": [\n",
+        "            {\n",
+        "            \"aefId\": p_aefId,\n",
+        "            \"versions\": [\n",
+        "                {\n",
+        "                \"apiVersion\": \"v1\",\n",
+        "                \"expiry\": \"2025-11-30T10:32:02.004Z\",\n",
+        "                \"resources\": [\n",
+        "                    {\n",
+        "                        \"resourceName\": \"MEC Profile of CAPIF\",\n",
+        "                        \"commType\": \"REQUEST_RESPONSE\",\n",
+        "                        \"uri\": f\"/{TRY_MEC_SESSION_ID}/{TRY_MEC_PLTF}/service-apis/v1/allServiceAPIs\",\n",
+        "                        \"custOpName\": \"string\",\n",
+        "                        \"operations\": [\n",
+        "                            \"GET\"\n",
+        "                        ],\n",
+        "                        \"description\": \"Endpoint to access MEC services\"\n",
+        "                    }\n",
+        "                ],\n",
+        "                \"custOperations\": [\n",
+        "                    {\n",
+        "                        \"commType\": \"REQUEST_RESPONSE\",\n",
+        "                        \"custOpName\": \"string\",\n",
+        "                        \"operations\": [\n",
+        "                            \"GET\"\n",
+        "                        ],\n",
+        "                        \"description\": \"string\"\n",
+        "                    }\n",
+        "                ]\n",
+        "                }\n",
+        "            ],\n",
+        "            \"protocol\": \"HTTP_1_1\",\n",
+        "            \"dataFormat\": \"JSON\",\n",
+        "            \"securityMethods\": [\"OAUTH\"],\n",
+        "            \"interfaceDescriptions\": [\n",
+        "                {\n",
+        "                \"ipv4Addr\": TRY_MEC_URL,\n",
+        "                \"securityMethods\": [\"OAUTH\"]\n",
+        "                }\n",
+        "            ]\n",
+        "            }\n",
+        "        ],\n",
+        "        \"description\": \"MEC Profile of CAPIF\",\n",
+        "        \"supportedFeatures\": \"fffff\",\n",
+        "        \"shareableInfo\": {\n",
+        "            \"isShareable\": True,\n",
+        "            \"capifProvDoms\": [\n",
+        "                \"string\"\n",
+        "            ]\n",
+        "        },\n",
+        "        \"serviceAPICategory\": \"string\",\n",
+        "        \"apiSuppFeats\": \"fffff\",\n",
+        "        \"pubApiPath\": {\n",
+        "            \"ccfIds\": [\n",
+        "                \"string\"\n",
+        "            ]\n",
+        "        },\n",
+        "        \"ccfId\": \"string\",\n",
+        "        \"apiStatus\":{\n",
+        "            \"aefIds\": [\n",
+        "                p_aefId\n",
+        "            ]\n",
+        "        }\n",
+        "    }\n",
+        "\n",
+        "    logger.debug('<<< build_publish_api_from_mec_services: ' + str(publish_api_req_body))\n",
+        "    return publish_api_req_body\n",
+        "    # End of build_publish_api_from_mec_services function"
+      ],
+      "metadata": {
+        "id": "S7InJDD1_g-v"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "Having built the ServiceAPIDescription data structure, the next step is to implement the CAPIF publish API.\n",
+        "\n",
+        "To proceed, we need to enable the TLS mutual authentication using the security material obtained during the onboarding APIs operation ([Onboarding APIs](#onboarding_apis)), i.e. the AEF certificate and the AEF private key ([Generate certificates](#Generate_certificates)).\n",
+        "\n",
+        "\n",
+        "**Refer to:** ETSI TS 129 222 V18.6.0 (2022-06) Clauses 5.3 CAPIF_Publish_Service_API and 8.2 CAPIF_Publish_Service_API\n",
+        "\n",
+        "Before to proceed with the steps above, let's create 2 helper functions to simpily the implemantation of the CAPIF publish API. These helper functions cover the following operations:\n",
+        "- Onboarding operations\n",
+        "- Offboarding operations"
+      ],
+      "metadata": {
+        "id": "PRAie110_r8P"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "#### Onboarding operations\n",
+        "\n",
+        "The Onboarding operations include th following steps:\n",
+        "- login\n",
+        "- create a new user\n",
+        "- Get the information to use CAPIF (security materials & URLs)\n",
+        "- onboard the provider\n"
+      ],
+      "metadata": {
+        "id": "IreHiSXs2U65"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def onboarding_provider() -> dict:\n",
+        "    \"\"\"\n",
+        "    To onboard the provider using CAPIF endpoint. It includes:\n",
+        "    - login\n",
+        "    - create a new user\n",
+        "    - Get the information to use CAPIF (security materials & URLs)\n",
+        "    - onboard the provider\n",
+        "    :return: A dictionary containing security material and additional context information on success, or an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root, ccf_api_onboarding_url, ccf_publish_url, ccf_discover_url, ccf_security_url, ccf_onboarding_url\n",
+        "\n",
+        "    # Login\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        return dict()\n",
+        "\n",
+        "    # Create a new user\n",
+        "    user_name, user_uuid = create_user(admin_token)\n",
+        "    if len(user_uuid) == 0:\n",
+        "        return dict()\n",
+        "\n",
+        "    auth = get_auth(user_name, USER_PASSWORD)\n",
+        "    if len(auth) == 0:\n",
+        "        return dict()\n",
+        "\n",
+        "    # Set the CAPIF access information\n",
+        "    access_token = auth['access_token']\n",
+        "    ca_root = auth['ca_root']\n",
+        "    ccf_api_onboarding_url = auth['ccf_api_onboarding_url']\n",
+        "    ccf_discover_url = auth['ccf_discover_url']\n",
+        "    ccf_onboarding_url = auth['ccf_onboarding_url']\n",
+        "    ccf_publish_url = auth['ccf_publish_url']\n",
+        "    ccf_security_url = auth['ccf_security_url']\n",
+        "\n",
+        "    # Onboard the provider\n",
+        "    prov = onboard_provider(\"MECSandbox_to_CAPIF_Provider\", access_token)\n",
+        "    if len(prov) == 0:\n",
+        "        return dict()\n",
+        "\n",
+        "    # Add context data\n",
+        "    prov['refresh_token'] = refresh_token\n",
+        "    prov['admin_token'] = admin_token\n",
+        "    prov['user_uuid'] = user_uuid\n",
+        "    prov['access_token'] = access_token\n",
+        "\n",
+        "    return prov\n",
+        "    # End of onboarding_provider function"
+      ],
+      "metadata": {
+        "id": "nu-tEA6n2TpI"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "#### Offboarding operations\n",
+        "\n",
+        "The Offboarding operations include th following steps:\n",
+        "- Offboard the API provide\n",
+        "- Delete the user\n",
+        "- Logout\n"
+      ],
+      "metadata": {
+        "id": "e940bUcf2deu"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def offboarding_provider(p_user_uuid: str, p_api_provider_id: str, p_bundle: tuple, p_admin_token: str) -> int:\n",
+        "    \"\"\"\n",
+        "    To offboard the provider. It includes:\n",
+        "    - Offboard the API provider\n",
+        "    - Delete the user\n",
+        "    - Logout\n",
+        "    :return: 0 on success, or -1 otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ccf_api_onboarding_url, access_token\n",
+        "\n",
+        "    logger.debug('>>> offboarding_provider: ' + p_user_uuid)\n",
+        "\n",
+        "    # Offboard the API profider\n",
+        "    file_bundle = offboard_provider(p_api_provider_id, p_bundle)\n",
+        "    if len(file_bundle) == 0: # Remove cert files if any\n",
+        "        for file in file_bundle:\n",
+        "            os.remove(file)\n",
+        "\n",
+        "    # Delete the newly created user\n",
+        "    delete_user(p_user_uuid, p_admin_token)\n",
+        "\n",
+        "    # Logout\n",
+        "    process_logout()\n",
+        "\n",
+        "    return 0\n",
+        "    # End of offboarding_provider function"
+      ],
+      "metadata": {
+        "id": "hEnFLfPI2hms"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "#### Publish CAPIF API function\n",
+        "\n",
+        "As mentionned above , the prupose of this function is to publish an API, using the TLS mutual authentication. To do so, we need the APF certificate (public keys) and its private key for the signature and the encription processes, and the CA certificate for the verification of the peer certifcate.\n",
+        "\n",
+        "**Note**: The http.request function required taht the cerficates and the keys are stored on files, not in memory. So, when our CAPIF applicate terminates, these files shall be removed (freeing resource step). This is the reason the publish_capif_api() function return a tuple containing the files created for the TLS mutual authentication operation.\n"
+      ],
+      "metadata": {
+        "id": "9TSYztWMcaOA"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def publish_capif_api(p_apfId: str, p_body: dict, p_bundle: tuple) -> list:\n",
+        "    \"\"\"\n",
+        "    This function is to publish an API on CAPIF server\n",
+        "    :param p_apfId: The APF identifier\n",
+        "    :param p_body: The request body\n",
+        "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+        "    :return: A list containing the files created for the TLS mutual authentication operations on success, or an empty list otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ccf_publish_url, ca_root\n",
+        "\n",
+        "    logger.debug('>>> publish_capif_api')\n",
+        "\n",
+        "    # Sanity checks\n",
+        "    if len(p_bundle) != 2:\n",
+        "        logger.error('publish_capif_api: p_bundle is malformed')\n",
+        "        return []\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_publish_url.replace('<apfId>', p_apfId)\n",
+        "        logger.debug('publish_capif_api: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json'}\n",
+        "        logger.debug('publish_capif_api (step1): headers: ' + str(headers))\n",
+        "        logger.debug('publish_capif_api (step2): body: ' + str(p_body))\n",
+        "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+        "        if len(bundle) != 3:\n",
+        "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+        "            return []\n",
+        "        logger.debug('publish_capif_api (step3): bundle: ' + str(bundle))\n",
+        "        response = requests.post(url, headers=headers, data=json.dumps(p_body), cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        logger.debug('publish_capif_api (step4): result: ' + str(response.json()))\n",
+        "        if response.status_code != 201:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return []\n",
+        "        res = json.loads(response.text)\n",
+        "        logger.debug('publish_capif_api (step5): res: ' + str(res))\n",
+        "        api_id = res['apiId']\n",
+        "        return bundle\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"publish_capif_api failed: {e}\")\n",
+        "\n",
+        "    return []\n",
+        "    # End of function publish_capif_api\n"
+      ],
+      "metadata": {
+        "id": "z_Cwazjl_xGJ"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "\n"
+      ],
+      "metadata": {
+        "id": "-TzvBVLM1fIc"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the fourth sprint of our CAPIF/MEC application:\n",
+        "    - Onboarding operations\n",
+        "    - Offboarding operations\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    prov = onboarding_provider()\n",
+        "    if len(prov) == 0:\n",
+        "        return\n",
+        "    user_uuid = prov['user_uuid']\n",
+        "\n",
+        "    # Build the publish_api body request\n",
+        "    aefId = prov['apiProvFuncs'][1]['apiProvFuncId']\n",
+        "    apfId = prov['apiProvFuncs'][2]['apiProvFuncId']\n",
+        "    publish_api_req_body = build_publish_api_from_mec_services(aefId)\n",
+        "    if len(publish_api_req_body) == 0:\n",
+        "        offboarding_provider(user_uuid, prov['apiProvDomId'], (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]), prov['admin_token']) # Use AMF certificate and AMF private key\n",
+        "        return\n",
+        "    logger.debug(\"publish_api_req_body: \" + str(publish_api_req_body))\n",
+        "    certs_bundle = (prov['apiProvFuncs'][2]['regInfo']['apiProvCert'], prov['csr']['apf'][1]) # Use APF certificate and APF private key\n",
+        "\n",
+        "    # Publish the APIs\n",
+        "    #ipdb.set_trace()\n",
+        "    files_bundle = publish_capif_api(apfId, publish_api_req_body, certs_bundle)\n",
+        "    if len(files_bundle) == 0:\n",
+        "        for file in files_bundle:\n",
+        "            os.remove(file)\n",
+        "        offboarding_provider(user_uuid, prov['apiProvDomId'], (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]), prov['admin_token']) # Use AMF certificate and AMF private key\n",
+        "        return\n",
+        "\n",
+        "    # Terminate the application\n",
+        "    offboarding_provider(\n",
+        "                         user_uuid,\n",
+        "                         prov['apiProvDomId'],\n",
+        "                         (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]),  # Use AMF certificate and AMF private key\n",
+        "                         prov['admin_token']\n",
+        "                         )\n",
+        "\n",
+        "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    # End of function process_main\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "    process_main()\n"
+      ],
+      "metadata": {
+        "id": "CRtfJ6cm3V6b"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Build an helper function to publish the ETSI MEC profile for CAPIF API\n",
+        "\n",
+        "To simply the API invoker process, let's create two helpers functions:\n",
+        "- One to publish the ETSI MEC profile for CAPIF API\n",
+        "- One to remove the previously published API"
+      ],
+      "metadata": {
+        "id": "aABBc4Hizy88"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Helper to publish API"
+      ],
+      "metadata": {
+        "id": "r-gZe6mQ4yHH"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def publish_api() -> tuple:\n",
+        "    \"\"\"\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> publish_api')\n",
+        "\n",
+        "    prov = onboarding_provider()\n",
+        "    if len(prov) == 0:\n",
+        "        return ()\n",
+        "    amf_cert_bundle = (prov['apiProvFuncs'][0]['regInfo']['apiProvCert'], prov['csr']['amf'][1]) # Use AMF certificate and AMF private key\n",
+        "\n",
+        "    # Build the publish_api body request\n",
+        "    aefId = prov['apiProvFuncs'][1]['apiProvFuncId']\n",
+        "    apfId = prov['apiProvFuncs'][2]['apiProvFuncId']\n",
+        "    apiId = prov['apiProvDomId']\n",
+        "    publish_api_req_body = build_publish_api_from_mec_services(aefId)\n",
+        "    if len(publish_api_req_body) == 0:\n",
+        "        offboarding_provider(prov['user_uuid'], apiId, amf_cert_bundle, prov['admin_token'])\n",
+        "        return ()\n",
+        "    logger.debug(\"publish_api_req_body: \" + str(publish_api_req_body))\n",
+        "    certs_bundle = (prov['apiProvFuncs'][2]['regInfo']['apiProvCert'], prov['csr']['apf'][1]) # Use APF certificate and APF private key\n",
+        "\n",
+        "    # Publish the APIs\n",
+        "    files_bundle = publish_capif_api(apfId, publish_api_req_body, certs_bundle)\n",
+        "    if len(files_bundle) == 0:\n",
+        "        for file in files_bundle:\n",
+        "            os.remove(file)\n",
+        "        offboarding_provider(prov['user_uuid'], apiId, amf_cert_bundle, prov['admin_token']) # Use AMF certificate and AMF private key\n",
+        "        return ()\n",
+        "\n",
+        "    logger.debug('publish_api: ' + str((apiId, amf_cert_bundle)))\n",
+        "    return (apiId, amf_cert_bundle, prov['user_uuid'], prov['admin_token'])\n",
+        "    # End of function publish_api\n"
+      ],
+      "metadata": {
+        "id": "ozCMG8jh0UMd"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Helper to remove published API"
+      ],
+      "metadata": {
+        "id": "lrnfAlrZ1-TB"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def remove_publish_api(p_user_uuid: str, p_api_id: str, p_bundle: tuple, p_admin_token: str):\n",
+        "    \"\"\"\n",
+        "    To remove published API.\n",
+        "    :param p_user_uuid: The user identifier\n",
+        "    :param p_api_id: The API identifier\n",
+        "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> remove_publish_api ')\n",
+        "\n",
+        "    # Terminate the application\n",
+        "    offboarding_provider(p_user_uuid, p_api_id, p_bundle, p_admin_token)\n",
+        "\n",
+        "    return\n",
+        "    # End of function reove_publish_api\n"
+      ],
+      "metadata": {
+        "id": "Ql9dC3P41_nO"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "\n",
+        "Let's test these two helpers functions before to go ahead"
+      ],
+      "metadata": {
+        "id": "UNN73-Zg4WZ-"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    To test both helpers functions:\n",
+        "    - publish_api\n",
+        "    - remove_publish_api\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Publish the MEC profile for CAPIF API\n",
+        "    res = publish_api()\n",
+        "    if len(res) == 0:\n",
+        "        return\n",
+        "\n",
+        "    api_id, bundle, user_uuid, admin_token = res\n",
+        "\n",
+        "    time.sleep(5) # Sleep for 5 seconds\n",
+        "\n",
+        "    # Remove the MEC profile for CAPIF API\n",
+        "    remove_publish_api(user_uuid, api_id, bundle, admin_token)\n",
+        "\n",
+        "    logger.debug('Stopped at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    # End of function process_main\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "    process_main()\n"
+      ],
+      "metadata": {
+        "id": "bVYS13iV4-s8"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Using the published API: The CAPIF Invoker side\n",
+        "\n",
+        "Now that we are able to publish an API on the CAPIF server, the next step is to use it in order to invoke some MEC Services API. To achieve this goal, we have to implement the CAPI Invoker, following these steps:\n",
+        "- Onboard an API invoker\n",
+        "- Discover the published APIs\n",
+        "- Get a MEC Service API (this step requires that a MEC Sandox platform is already running)\n",
+        "- Offboard an API invoker"
+      ],
+      "metadata": {
+        "id": "9W2SvVdx6fxk"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Onboard an API invoker\n"
+      ],
+      "metadata": {
+        "id": "YasCvixW7E4o"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def onboard_invoker(p_name: str, p_access_token: str) -> dict:\n",
+        "    \"\"\"\n",
+        "    To onboard the API invoker.\n",
+        "    :param p_name: The name of the invoker\n",
+        "    :return: A dictionary containing security material for each CAPIF endpoint on success, or an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ccf_api_onboarding_url, ccf_onboarding_url\n",
+        "\n",
+        "    logger.debug('>>> onboard_invoker: ' + p_name)\n",
+        "    logger.debug('>>> onboard_invoker: ' + p_access_token)\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_onboarding_url\n",
+        "        logger.debug('onboard_invoker: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_access_token}\n",
+        "        logger.debug('onboard_invoker (step1): headers: ' + str(headers))\n",
+        "        # Request body for onboarding the invoker\n",
+        "        invoker_csr_request, invoker_private_key = generate_csr(\"API Invoker\", \"ETSI\", \"Fr\")\n",
+        "        data = {\n",
+        "            \"notificationDestination\" : \"http://host.docker.internal:8086/netapp_callback\",\n",
+        "            \"supportedFeatures\" : \"fffffff\",\n",
+        "            \"apiInvokerInformation\" : \"dummy\",\n",
+        "            \"websockNotifConfig\" : {\n",
+        "                \"requestWebsocketUri\" : True,\n",
+        "                \"websocketUri\" : \"websocketUri\"\n",
+        "            },\n",
+        "            \"onboardingInformation\" : {\n",
+        "                \"apiInvokerPublicKey\" : invoker_csr_request.decode(\"utf-8\"),\n",
+        "            },\n",
+        "            \"requestTestNotification\" : True\n",
+        "            }\n",
+        "        logger.debug('onboard_invoker (step2): body: ' + str(data))\n",
+        "        response = requests.post(url, headers=headers, data=json.dumps(data), verify=\"ca_root.pem\")\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        logger.debug('onboard_invoker (step3): result: ' + str(response.json()))\n",
+        "        if response.status_code != 201:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return dict()\n",
+        "        res = json.loads(response.text)\n",
+        "        # Add an entry for CSRs and private keys for future usage\n",
+        "        res['csr'] = [invoker_csr_request, invoker_private_key]\n",
+        "        return res\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"onboard_invoker failed: {e}\")\n",
+        "\n",
+        "    return dict()\n",
+        "    # End of function onboard_invoker"
+      ],
+      "metadata": {
+        "id": "f11_uMS67I9J"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Offboard an API invoker"
+      ],
+      "metadata": {
+        "id": "kQmJW-d99cGo"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def offboard_invoker(p_invoker_id: str, p_bundle: tuple) -> list:\n",
+        "    \"\"\"\n",
+        "    To offboard the API invoker.\n",
+        "    :param p_invoker_id: The API invoker identifier\n",
+        "    :param p_bundle: The bundle of certificates and keys for the TLS mutual authentication operations\n",
+        "    :return: 0 on success, -1 otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ccf_onboarding_url, ca_root\n",
+        "\n",
+        "    logger.debug('>>> offboard_invoker: ' + p_invoker_id)\n",
+        "\n",
+        "    try:\n",
+        "        # Delete the newly created user\n",
+        "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_onboarding_url + '/' + p_invoker_id\n",
+        "        logger.debug('offboard_invoker: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json'}\n",
+        "        logger.debug('offboard_invoker (step1): headers: ' + str(headers))\n",
+        "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+        "        if len(bundle) != 3:\n",
+        "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+        "            return []\n",
+        "        logger.debug('offboard_invoker (step2): bundle: ' + str(bundle))\n",
+        "        response = requests.delete(url, headers=headers, cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+        "        logger.debug('offboard_invoker (step3): response=' + str(response))\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        if response.status_code != 204:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return []\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"offboard_invoker failed: {e}\")\n",
+        "        return []\n",
+        "\n",
+        "    return bundle\n",
+        "    # End of function offboard_invoker"
+      ],
+      "metadata": {
+        "id": "KRC_xkGO9hEY"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Discover published APIs"
+      ],
+      "metadata": {
+        "id": "-h0zz7ocxtyv"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def discover(p_invoker_id: str, p_bundle: tuple, p_access_token: str) -> dict:\n",
+        "    \"\"\"\n",
+        "    To discover the APIs published by capif core.\n",
+        "    :param p_invoker_id: The API invoker identifier\n",
+        "    :return: A dictionary containing the APIs published by capif core on success, or an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root, ccf_discover_url\n",
+        "\n",
+        "    logger.debug('>>> Discover APIs published by capif core')\n",
+        "\n",
+        "    try:\n",
+        "        url = 'https://' + CAPIF_HOSTNAME + ':' + str(CAPIF_PORT) + '/' + ccf_discover_url + p_invoker_id\n",
+        "        logger.debug('Discover: url=' + url)\n",
+        "        headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + p_access_token}\n",
+        "        logger.debug('Discover (step1): headers: ' + str(headers))\n",
+        "        bundle = store_certificate_2_files(p_bundle[0], p_bundle[1], ca_root) # Use CA certificate for verif\n",
+        "        if len(bundle) != 3:\n",
+        "            logger.error(f\"Error converting in-memory bundle into files\")\n",
+        "            return dict()\n",
+        "        logger.debug('Discover (step2): bundle: ' + str(bundle))\n",
+        "        response = requests.get(url, headers=headers, cert=(bundle[0], bundle[1]), verify=bundle[2])\n",
+        "        logger.debug('Discover (step3): response=' + str(response))\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        logger.debug('Discover : result: ' + str(response.json()))\n",
+        "        if response.status_code != 200:\n",
+        "            logger.error(f\"Discovery failed: {response.status_code} - {response.text}\")\n",
+        "            return dict()\n",
+        "        res = json.loads(response.text)\n",
+        "        return res\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"Discovery failed: {e}\")\n",
+        "\n",
+        "    return dict()\n",
+        "    # End of function discover\n",
+        "\n",
+        "def extract_ipv4_and_uri(p_response_data: json.loads) -> dict:\n",
+        "    # Extract ipv4Addr using a list comprehension\n",
+        "    ipv4_addrs = [\n",
+        "        desc.get(\"ipv4Addr\")\n",
+        "        for profile in p_response_data.get(\"serviceAPIDescriptions\", [])\n",
+        "        for aef in profile.get(\"aefProfiles\", [])\n",
+        "        for desc in aef.get(\"interfaceDescriptions\", [])\n",
+        "    ]\n",
+        "\n",
+        "    # Extract uri using a list comprehension\n",
+        "    uris = [\n",
+        "        resource.get(\"uri\")\n",
+        "        for profile in p_response_data.get(\"serviceAPIDescriptions\", [])\n",
+        "        for aef in profile.get(\"aefProfiles\", [])\n",
+        "        for version in aef.get(\"versions\", [])\n",
+        "        for resource in version.get(\"resources\", [])\n",
+        "    ]\n",
+        "\n",
+        "    return {\"ipv4Addr\": ipv4_addrs, \"uri\": uris}\n",
+        "    # End of function extract_ipv4_and_uri"
+      ],
+      "metadata": {
+        "id": "ofUuploUxuhn"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together"
+      ],
+      "metadata": {
+        "id": "RElS9XFZ9hvQ"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the fiveth sprint of our CAPIF/MEC application:\n",
+        "    - Publish the MEC profile for CAPIF API\n",
+        "    - Create a new user for the invoker\n",
+        "    - Get certificates\n",
+        "    - Onboad the API invoker\n",
+        "    - Do the discovery\n",
+        "    - Offboard the API invoker\n",
+        "    - Delete the\n",
+        "    - Logout the invoker user\n",
+        "    - Remove the MEC profile for CAPIF API\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root, ccf_api_onboarding_url, ccf_discover_url, ccf_onboarding_url, ccf_publish_url, ccf_security_url\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Publish the MEC profile for CAPIF API\n",
+        "    res = publish_api()\n",
+        "    if len(res) == 0:\n",
+        "        return\n",
+        "    api_id, bundle, prov_user_uuid, prov_admin_token = res\n",
+        "\n",
+        "    # Login for the new user for the invoker\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Create a new user for the invoker\n",
+        "    res = create_user(admin_token)\n",
+        "    if len(res) == 0:\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "    user_name, user_uuid = res\n",
+        "\n",
+        "    # Get certificates\n",
+        "    auth = get_auth(user_name, USER_PASSWORD)\n",
+        "    if len(auth) == 0:\n",
+        "        delete_user(user_name, admin_token)\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Sanity checks\n",
+        "    if auth['ca_root'] != ca_root:\n",
+        "        raise Exception('CA root mismatch')\n",
+        "    if  auth['ccf_api_onboarding_url'] != ccf_api_onboarding_url:\n",
+        "        raise Exception('CCF API onboarding URL mismatch')\n",
+        "    if auth['ccf_discover_url'] != ccf_discover_url:\n",
+        "        raise Exception('CCF discover URL mismatch')\n",
+        "    if auth['ccf_onboarding_url'] != ccf_onboarding_url:\n",
+        "        raise Exception('CCF onboarding URL mismatch')\n",
+        "    if auth['ccf_publish_url'] != ccf_publish_url:\n",
+        "        raise Exception('CCF publish URL mismatch')\n",
+        "    if auth['ccf_security_url'] != ccf_security_url:\n",
+        "        raise Exception('CCF security URL mismatch')\n",
+        "    access_token = auth['access_token']\n",
+        "\n",
+        "    # Onboad the API invoker\n",
+        "    res = onboard_invoker('API Invoker', access_token)\n",
+        "    if len(res) == 0:\n",
+        "        delete_user(user_uuid, admin_token)\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Do the discovery\n",
+        "    invoker_id = res['apiInvokerId']\n",
+        "    certs_bundle = (res['onboardingInformation']['apiInvokerCertificate'], res['csr'][1])\n",
+        "    mec_api = discover(invoker_id, certs_bundle, access_token)\n",
+        "    if len(mec_api) == 0:\n",
+        "        files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+        "        if len(files_bundle) == 0:\n",
+        "            for file in files_bundle:\n",
+        "                os.remove(file)\n",
+        "        delete_user(user_uuid, admin_token)\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Extract the URL to access to the MEC Sandbox platform\n",
+        "    addrs = extract_ipv4_and_uri(mec_api)\n",
+        "    logger.debug('addrs: ' + str(addrs))\n",
+        "\n",
+        "    time.sleep(5) # Sleep for 5 seconds\n",
+        "\n",
+        "    # Offboard the API invoker\n",
+        "    files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+        "    if len(files_bundle) == 0:\n",
+        "        for file in files_bundle:\n",
+        "            os.remove(file)\n",
+        "\n",
+        "    # Delete the invoker user\n",
+        "    delete_user(user_uuid, admin_token)\n",
+        "\n",
+        "    # Logout the invoker user\n",
+        "    process_logout()\n",
+        "\n",
+        "    # Remove the MEC profile for CAPIF API\n",
+        "    remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "  process_main()"
+      ],
+      "metadata": {
+        "id": "QPZPYJZM9mNr"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Discoverig MEC services\n"
+      ],
+      "metadata": {
+        "id": "6tJWDz4woyz1"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Invoking the MEC profile for CAPIF\n",
+        "\n",
+        "AFter discovering the published API, we have the information (see content of addrs data structure in previous execution) to do a request to an existing MEC Sandbox platform to get the list of the MEC services exposed (see TRY_MEC_SESSION_ID)."
+      ],
+      "metadata": {
+        "id": "Uy-XNKA9pN5h"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "def discovering_mec_services(p_url: str) -> dict:\n",
+        "    \"\"\"\n",
+        "    To discover MEC services API\n",
+        "    :param p_url: The URL to access to the MEC Sandbox platform\n",
+        "    :return: A dictionary containing the MEC services on success, or an empty dictionary otherwise\n",
+        "    \"\"\"\n",
+        "    global logger\n",
+        "\n",
+        "    logger.debug('>>> discovering_mec_services: ' + p_url)\n",
+        "\n",
+        "    try:\n",
+        "        headers = {'Content-Type': 'application/json', 'accept': 'application/json',}\n",
+        "        logger.debug('discovering_mec_services (step1): headers: ' + str(headers))\n",
+        "        response = requests.get(p_url, headers=headers)\n",
+        "        logger.debug('discovering_mec_services (step2): result: ' + str(response.json()))\n",
+        "        response.raise_for_status()  # Raise an exception for bad status codes\n",
+        "        if response.status_code != 200:\n",
+        "            logger.error(f\"Error creating user: {response.status_code} - {response.text}\")\n",
+        "            return dict()\n",
+        "        res = json.loads(response.text)\n",
+        "        return res\n",
+        "    except requests.exceptions.RequestException as e:\n",
+        "        logger.error(f\"discovering_mec_services failed: {e}\")\n",
+        "\n",
+        "    return dict()\n",
+        "    # End of function discovering_mec_services"
+      ],
+      "metadata": {
+        "id": "ZL8Gyo0Ao2_u"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### Putting everything together\n",
+        "\n",
+        "Here is the last and complete version of our CAPIF application achieving the main objective of this tutorial: retrieve the MEC services exposed by an existing MEC Sandbox platform."
+      ],
+      "metadata": {
+        "id": "Wa_8khiGpTAa"
+      }
+    },
+    {
+      "cell_type": "code",
+      "source": [
+        "#%%script echo skipping\n",
+        "# Uncomment the line above to skip execution of this cell\n",
+        "def process_main():\n",
+        "    \"\"\"\n",
+        "    This is the fiveth sprint of our CAPIF/MEC application:\n",
+        "    - Publish the MEC profile for CAPIF API\n",
+        "    - Create a new user for the invoker\n",
+        "    - Get certificates\n",
+        "    - Onboad the API invoker\n",
+        "    - Do the discovery\n",
+        "    - Offboard the API invoker\n",
+        "    - Delete the\n",
+        "    - Logout the invoker user\n",
+        "    - Remove the MEC profile for CAPIF API\n",
+        "    \"\"\"\n",
+        "    global logger, ca_root, ccf_api_onboarding_url, ccf_discover_url, ccf_onboarding_url, ccf_publish_url, ccf_security_url\n",
+        "\n",
+        "    logger.debug('Starting at ' + time.strftime('%Y%m%d-%H%M%S'))\n",
+        "    logger.debug('\\t pwd= ' + os.getcwd())\n",
+        "\n",
+        "    # Publish the MEC profile for CAPIF API\n",
+        "    res = publish_api()\n",
+        "    if len(res) == 0:\n",
+        "        return\n",
+        "    api_id, bundle, prov_user_uuid, prov_admin_token = res\n",
+        "\n",
+        "    # Login for the new user for the invoker\n",
+        "    refresh_token, admin_token = process_login()\n",
+        "    if refresh_token is None:\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Create a new user for the invoker\n",
+        "    res = create_user(admin_token)\n",
+        "    if len(res) == 0:\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "    user_name, user_uuid = res\n",
+        "\n",
+        "    # Get certificates\n",
+        "    auth = get_auth(user_name, USER_PASSWORD)\n",
+        "    if len(auth) == 0:\n",
+        "        delete_user(user_name, admin_token)\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Sanity checks\n",
+        "    if auth['ca_root'] != ca_root:\n",
+        "        raise Exception('CA root mismatch')\n",
+        "    if  auth['ccf_api_onboarding_url'] != ccf_api_onboarding_url:\n",
+        "        raise Exception('CCF API onboarding URL mismatch')\n",
+        "    if auth['ccf_discover_url'] != ccf_discover_url:\n",
+        "        raise Exception('CCF discover URL mismatch')\n",
+        "    if auth['ccf_onboarding_url'] != ccf_onboarding_url:\n",
+        "        raise Exception('CCF onboarding URL mismatch')\n",
+        "    if auth['ccf_publish_url'] != ccf_publish_url:\n",
+        "        raise Exception('CCF publish URL mismatch')\n",
+        "    if auth['ccf_security_url'] != ccf_security_url:\n",
+        "        raise Exception('CCF security URL mismatch')\n",
+        "    access_token = auth['access_token']\n",
+        "\n",
+        "    # Onboad the API invoker\n",
+        "    res = onboard_invoker('API Invoker', access_token)\n",
+        "    if len(res) == 0:\n",
+        "        delete_user(user_uuid, admin_token)\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Do the discovery\n",
+        "    invoker_id = res['apiInvokerId']\n",
+        "    certs_bundle = (res['onboardingInformation']['apiInvokerCertificate'], res['csr'][1])\n",
+        "    mec_api = discover(invoker_id, certs_bundle, access_token)\n",
+        "    if len(mec_api) == 0:\n",
+        "        files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+        "        if len(files_bundle) == 0:\n",
+        "            for file in files_bundle:\n",
+        "                os.remove(file)\n",
+        "        delete_user(user_uuid, admin_token)\n",
+        "        remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "        return\n",
+        "\n",
+        "    # Extract the URL to access to the MEC Sandbox platform\n",
+        "    addrs = extract_ipv4_and_uri(mec_api)\n",
+        "    logger.debug('addrs: ' + str(addrs))\n",
+        "\n",
+        "    # Discovering MEC services\n",
+        "    url = ''\n",
+        "    if 'ports' in addrs:\n",
+        "        url = 'https://' + addrs['ipv4Addr'][0] + ':' + addrs['ports'][0]\n",
+        "    else:\n",
+        "        url = 'https://' + addrs['ipv4Addr'][0]\n",
+        "    url += addrs['uri'][0]\n",
+        "    mec_services = discovering_mec_services(url)\n",
+        "    if len(mec_services) != 0:\n",
+        "        logger.debug('===> The list of the MEC services exposed by ' + addrs['ipv4Addr'][0] + ' is: ' + str(mec_services))\n",
+        "\n",
+        "    # Offboard the API invoker\n",
+        "    files_bundle = offboard_invoker(invoker_id, certs_bundle)\n",
+        "    if len(files_bundle) == 0:\n",
+        "        for file in files_bundle:\n",
+        "            os.remove(file)\n",
+        "\n",
+        "    # Delete the invoker user\n",
+        "    delete_user(user_uuid, admin_token)\n",
+        "\n",
+        "    # Logout the invoker user\n",
+        "    process_logout()\n",
+        "\n",
+        "    # Remove the MEC profile for CAPIF API\n",
+        "    remove_publish_api(prov_user_uuid, api_id, bundle, prov_admin_token)\n",
+        "\n",
+        "if __name__ == '__main__':\n",
+        "  process_main()"
+      ],
+      "metadata": {
+        "id": "aTllbmoUpXKx"
+      },
+      "execution_count": null,
+      "outputs": []
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "### What to do next\n",
+        "\n",
+        "here is a list of several additional tasks yo can do to refine our CAPIF application:\n",
+        "1. Simply the code of the process_main() function above\n",
+        "2. Find the endpoint of the MEC Location API service (MEC 013) and send a request to get the list of zones available\n",
+        "3. Create your own CAPIF application"
+      ],
+      "metadata": {
+        "id": "cfy6D8wYt5GA"
+      }
+    },
+    {
+      "cell_type": "markdown",
+      "source": [
+        "## Conlusion: what do we learn?\n",
+        "\n",
+        "The main objective of this tutorial is to demonstrate how to use the MEC profile for CAPIF (as described in MEC 011 v3.x.x Clause 9) in a CAPIF application. Along this tutrial, we learned how to develop a basic CAPIF application, including both API provider and API invoker. We learned also how to use a published API to send REQUEST to a MEC Sandbox platform instance.\n",
+        "\n",
+        "\n",
+        "**That's all Folks**\n",
+        "\n"
+      ],
+      "metadata": {
+        "id": "m_BbV7KdpX24"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/examples/demo8/README.md b/examples/demo8/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..988ac0f669ceaf62b00a6abc56145e9e7a93fff3
--- /dev/null
+++ b/examples/demo8/README.md
@@ -0,0 +1,3 @@
+The main objective of this tutorial is to demonstrate how to use the MEC profile for CAPIF (as described in MEC 011 v3.x.x Clause 9) in a CAPIF application. 
+Along this tutrial, we learned how to develop a basic CAPIF application, including both API provider and API invoker. 
+We learned also how to use a published API to send REQUEST to a MEC Sandbox platform instance.
diff --git a/go-apps/meep-app-enablement/server/capif-mgmt/service-mgmt.go b/go-apps/meep-app-enablement/server/capif-mgmt/service-mgmt.go
index b0a32f5be4c0e8b73cd46a093b88333ee285c1dc..dbdf4213bf8f7f1826b0409523b37939979d333a 100644
--- a/go-apps/meep-app-enablement/server/capif-mgmt/service-mgmt.go
+++ b/go-apps/meep-app-enablement/server/capif-mgmt/service-mgmt.go
@@ -1107,7 +1107,7 @@ func applicationsSubscriptionsPUT(w http.ResponseWriter, r *http.Request) {
 	fmt.Fprint(w, jsonSub)
 }
 
-var HrefUrl string 
+var HrefUrl string
 
 func applicationsSubscriptionsPOST(w http.ResponseWriter, r *http.Request) {
 	log.Info("applicationsSubscriptionsPOST")
diff --git a/go-apps/meep-app-enablement/server/mae_test.go b/go-apps/meep-app-enablement/server/mae_test.go
index 724bf80a157d8a51ba60bccaed61f2779bb85b9b..9f0a85af295b27582d538a7dc0752e1c7614c827 100644
--- a/go-apps/meep-app-enablement/server/mae_test.go
+++ b/go-apps/meep-app-enablement/server/mae_test.go
@@ -7917,19 +7917,19 @@ func TestAppServicesPATCH(t *testing.T) {
 		},
 	}
 
-	type ApiResponse struct {
-		ApiName     string `json:"apiName"`
-		ApiId       string `json:"apiId"`
-		AefProfiles []struct {
-			AefId                 string   `json:"aefId"`
-			Versions              []string `json:"versions"`
-			InterfaceDescriptions struct {
-				Uris []string `json:"uris"`
-			} `json:"interfaceDescriptions"`
-			VendorSpecificTransportInfo map[string]interface{} `json:"vendorSpecific-urn:etsi:mec:capifext:transport-info"`
-		} `json:"aefProfiles"`
-		VendorSpecificServiceInfo map[string]interface{} `json:"vendorSpecific-urn:etsi:mec:capifext:service-info"`
-	}
+	// type ApiResponse struct {
+	// 	ApiName     string `json:"apiName"`
+	// 	ApiId       string `json:"apiId"`
+	// 	AefProfiles []struct {
+	// 		AefId                 string   `json:"aefId"`
+	// 		Versions              []string `json:"versions"`
+	// 		InterfaceDescriptions struct {
+	// 			Uris []string `json:"uris"`
+	// 		} `json:"interfaceDescriptions"`
+	// 		VendorSpecificTransportInfo map[string]interface{} `json:"vendorSpecific-urn:etsi:mec:capifext:transport-info"`
+	// 	} `json:"aefProfiles"`
+	// 	VendorSpecificServiceInfo map[string]interface{} `json:"vendorSpecific-urn:etsi:mec:capifext:service-info"`
+	// }
 
 	// Marshalling the request body to JSON format
 	body, err := json.Marshal(requestBody)
@@ -8196,4 +8196,4 @@ func TestIndividualAppServicesDELETE(t *testing.T) {
 		t.Fatalf(err.Error())
 	}
 	fmt.Println("sendRequest done in TestIndividualAppServicesDELETE")
-}
\ No newline at end of file
+}
diff --git a/go-apps/meep-auth-svc/Dockerfile b/go-apps/meep-auth-svc/Dockerfile
index 46ae3ce94d48a5f04310a286b2e70ccd167a9570..2915c7a8199814fbea5eff0cd45bbd020a339873 100644
--- a/go-apps/meep-auth-svc/Dockerfile
+++ b/go-apps/meep-auth-svc/Dockerfile
@@ -23,6 +23,8 @@ RUN chmod +x /entrypoint.sh
 RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates
 
-RUN update-ca-certificates
+ RUN dpkg --configure -a
+
+ RUN update-ca-certificates
 
 ENTRYPOINT ["/entrypoint.sh"]
\ No newline at end of file
diff --git a/go-apps/meep-dai/Dockerfile b/go-apps/meep-dai/Dockerfile
index 5aeebd31c26dfb8f08edf51a4abc5aa0aca1e7e4..294296d573e36be0205853dfe8332bba9f3dc2af 100644
--- a/go-apps/meep-dai/Dockerfile
+++ b/go-apps/meep-dai/Dockerfile
@@ -32,6 +32,8 @@ RUN apt-get update \
 #    && sudo chmod -R 777 /mnt/nfs/ \
 #    && mount -t nfs $HOSTNAME:/mnt/nfs/mec_sandbox /mnt/nfs/mec_sandbox
 
+RUN dpkg --configure -a
+
 EXPOSE 31120-31129/tcp
 
 ENTRYPOINT ["/entrypoint.sh"]
diff --git a/go-apps/meep-federation/Dockerfile b/go-apps/meep-federation/Dockerfile
index 3c23332a4d7ead00365baa375fb499af2b556b7d..5db45a03e92c5c1b933b1cc434293cce54abcb41 100644
--- a/go-apps/meep-federation/Dockerfile
+++ b/go-apps/meep-federation/Dockerfile
@@ -23,6 +23,8 @@ RUN chmod +x /entrypoint.sh
 RUN apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates
 
+RUN dpkg --configure -a
+
 RUN update-ca-certificates
 
 ENTRYPOINT ["/entrypoint.sh"]
diff --git a/go-apps/meep-iot/.swagger-codegen-ignore b/go-apps/meep-iot/.swagger-codegen-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..c5fa491b4c557bf997d5dd21797de782545dc9e5
--- /dev/null
+++ b/go-apps/meep-iot/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# 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 Swagger Codgen 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/go-apps/meep-iot/.swagger-codegen/VERSION b/go-apps/meep-iot/.swagger-codegen/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..0667b5ffc7ae803493efb90a1f4ee6224b1f6a17
--- /dev/null
+++ b/go-apps/meep-iot/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.29
\ No newline at end of file
diff --git a/go-apps/meep-iot/Dockerfile b/go-apps/meep-iot/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..e7c8f06e520a19fa43d83e59ba7d6985b99707d8
--- /dev/null
+++ b/go-apps/meep-iot/Dockerfile
@@ -0,0 +1,23 @@
+# Copyright (c) 2025  The AdvantEDGE Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM debian:11.7-slim
+COPY ./meep-iot /meep-iot
+COPY ./api /api
+COPY ./user-api /user-api
+COPY ./data /
+
+RUN chmod +x /entrypoint.sh
+
+ENTRYPOINT ["/entrypoint.sh"]
diff --git a/go-apps/meep-iot/api/swagger.yaml b/go-apps/meep-iot/api/swagger.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..14640b74bed7dd9cde653d5fd752a22dadeac288
--- /dev/null
+++ b/go-apps/meep-iot/api/swagger.yaml
@@ -0,0 +1,2858 @@
+openapi: 3.0.0
+info:
+  title: ETSI GS MEC 033 IoT API
+  description: ETSI GS MEC 033 IoT API described using OpenAPI.
+  contact:
+    name: ETSI Forge
+    url: https://forge.etsi.org/rep/mec/gs021-amsi-api
+    email: cti_support@etsi.org
+  license:
+    name: BSD-3-Clause
+    url: https://forge.etsi.org/legal-matters
+  version: 3.1.1
+externalDocs:
+  description: "ETSI GS MEC 033 IoT API, v3.3.1"
+  url: https://www.etsi.org/deliver/etsi_gs/MEC/001_099/033/03.01.01_60/gs_mec033v030101p.pdf
+servers:
+- url: https://localhost/sandboxname/iots/v1
+tags:
+- name: reg-dev
+  description: registered_devices
+- name: reg-iot-plat
+  description: registered_iot_platforms
+paths:
+  /registered_devices:
+    get:
+      tags:
+      - reg-dev
+      summary: Retrieve information about all devices with a valid traffic rule association
+        - see clause 5.2.2.
+      description: The GET method may be used by a service consumer to retrieve information
+        about all devices with a valid traffic rule association. This method is typically
+        used in the "registered devices query" procedure as described in clause 5.2.2.
+      operationId: registereddevicesGET
+      parameters:
+      - name: filter
+        in: query
+        description: "Attribute-based filtering parameters according to ETSI GS MEC\
+          \ 009 [i.1]. The API producer shall support receiving the following filtering\
+          \ parameters as part of the URI query string: \"(eq,enabled,TRUE)\".\n"
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: string
+      - name: fields
+        in: query
+        description: |
+          The list may contain one or more of the following attributes from the DeviceInfo data type:
+          - deviceMetadata
+          - gpsi
+          - msisdn
+          - deviceId
+          - requestedMecTrafficRule
+          - requestedIotPlatformId
+          - requestedUserTransportId
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of registered\
+            \ devices is returned. The response body shall contain a list of resources\
+            \ that match the attribute filter."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/inline_response_200'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - reg-dev
+      summary: Register a new device - see clause 5.2.3.
+      description: The POST method may be used by a service consumer to register a
+        new device. This method is typically used in the "device registration" procedure
+        as described in clause 5.2.3.
+      operationId: registereddevicesPOST
+      requestBody:
+        description: Payload body in the request contains the information associated
+          to the IoT device to be registered.
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_devices_body'
+        required: true
+      responses:
+        "201":
+          description: "Upon success, the HTTP response shall include a \"Location\"\
+            \ HTTP header that contains the resource URI of the registered device."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_devices_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /registered_devices/{registeredDeviceId}:
+    get:
+      tags:
+      - reg-dev
+      summary: Retrieve information about a device - see clause 5.2.4.
+      description: The GET method may be used by a service consumer to retrieve information
+        about a device. This method is typically used in the "device registration
+        query" procedure as described in clause 5.2.4.
+      operationId: registereddevicesByIdGET
+      parameters:
+      - name: registeredDeviceId
+        in: path
+        description: The unique identifier of the registered device.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing information about\
+            \ the registered device is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_devices_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - reg-dev
+      summary: Update information about a  device including its association to a valid
+        traffic rule - see clauses 5.2.5 and 5.4.3.
+      description: The PUT method may be used by a service consumer to update a device
+        registration including its association to a valid traffic rule. This method
+        is typically used in the "device registration update" procedure as described
+        in clause 5.2.5 and in the "user transport assignment" procedure as described
+        in clause 5.4.3.
+      operationId: registereddevicesByIdPUT
+      parameters:
+      - name: registeredDeviceId
+        in: path
+        description: The unique identifier of the registered device.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: One or more updated attributes that are allowed to be changed
+          are included in the DeviceInfo data structure in the payload body of the
+          request. .
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_devices_registeredDeviceId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated DeviceInfo is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_devices_registeredDeviceId_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "412":
+          description: "Precondition failed: used when a condition has failed during\
+            \ conditional requests, e.g. when using ETags to avoid write conflicts\
+            \ when using PUT"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - reg-dev
+      summary: Deregister a device - see clause 5.2.6.
+      description: The DELETE method may be used by a service consumer to deregister
+        a device. This method is typically used in the "device deregistration" procedure
+        as described in clause 5.2.6.
+      operationId: registereddevicesByIdDELETE
+      parameters:
+      - name: registeredDeviceId
+        in: path
+        description: The unique identifier of the registered device.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: No Content
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /registered_iot_platforms:
+    get:
+      tags:
+      - reg-iot-plat
+      summary: Retrieve information about all IoT platforms - see clause 5.3.2.
+      description: The GET method may be used by an authorized service consumer to
+        retrieve the information of all currently registered IoT platforms. This method
+        is typically used in the "registered IoT platforms query" procedure as described
+        in clause 5.3.2.
+      operationId: registerediotplatformsGET
+      parameters:
+      - name: fields
+        in: query
+        description: |
+          The list shall contain the following attributes from the IotPlatformInfo data type:
+          - iotPlatformId
+          - enabled
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of registered\
+            \ IoT platforms is returned."
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/IotPlatformInfo'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - reg-iot-plat
+      summary: Register a IoT platform - see clause 5.3.4.
+      description: The POST method may be used by a service consumer to register a
+        new IoT platform. This method is typically used in the "IoT platform registration"
+        procedure as described in clause 5.3.4.
+      operationId: registerediotplatformsPOST
+      requestBody:
+        description: Payload body in the request contains the information associated
+          to the IoT platform to be registered.
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_iot_platforms_body'
+        required: true
+      responses:
+        "201":
+          description: "Upon success, the HTTP response shall include a \"Location\"\
+            \ HTTP header that contains the resource URI of the registered IoT platform."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_iot_platforms_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /registered_iot_platforms/{registeredIotPlatformId}:
+    get:
+      tags:
+      - reg-iot-plat
+      summary: Discover native services and obtain information about user transports
+        provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+      description: 'The GET method may be used by a service consumer to obtain information
+        about a IoT platform. This method is typically used in the "IoT platform information
+        request" procedure as described in clause 5.3.3 and in the "user transport
+        query" procedure as described in clause 5.4.2. '
+      operationId: registerediotplatformsByIdGET
+      parameters:
+      - name: registeredIotPlatformId
+        in: path
+        description: The unique identifier of the registered IoT platform.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      - name: fields
+        in: query
+        description: |
+          The list may contain one or more of the following attributes from the IotPlatformInfo data type:
+          - userTransportInfo
+          - customServiceTransportInfo
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing information about\
+            \ the registered IoT platform is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/inline_response_200_1'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - reg-iot-plat
+      summary: Update information about a IoT platform - see clause 5.3.5.
+      description: The PUT method may be used by a service consumer to update a IoT
+        platform registration. This method is typically used in the "IoT platform
+        update" procedure as described in clause 5.3.5.
+      operationId: registerediotplatformsByIdPUT
+      parameters:
+      - name: registeredIotPlatformId
+        in: path
+        description: The unique identifier of the registered IoT platform.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: One or more updated attributes that are allowed to be changed
+          are included in the IotPlatformInfo data structure in the payload body of
+          the request. .
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_iot_platforms_registeredIotPlatformId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated IotPlatformInfo is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_iot_platforms_registeredIotPlatformId_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "412":
+          description: "Precondition failed: used when a condition has failed during\
+            \ conditional requests, e.g. when using ETags to avoid write conflicts\
+            \ when using PUT"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - reg-iot-plat
+      summary: Deregister a IoT platform - see clause 5.3.6.
+      description: The DELETE method may be used by a service consumer to deregister
+        a IoT platform. This method is typically used in the "IoT platform deregistration"
+        procedure as described in clause 5.3.6.
+      operationId: registerediotplatformsByIdDELETE
+      parameters:
+      - name: registeredIotPlatformId
+        in: path
+        description: The unique identifier of the registered IoT platform.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: No Content
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+components:
+  schemas:
+    ProblemDetails:
+      type: object
+      properties:
+        type:
+          type: string
+          description: A URI reference according to IETF RFC 3986 that identifies
+            the problem type
+          format: uri
+        title:
+          type: string
+          description: "A short, human-readable summary of the problem type"
+        status:
+          type: integer
+          description: The HTTP status code for this occurrence of the problem
+          format: uint32
+        detail:
+          type: string
+          description: A human-readable explanation specific to this occurrence of
+            the problem
+        instance:
+          type: string
+          description: A URI reference that identifies the specific occurrence of
+            the problem
+          format: uri
+    DeviceInfo:
+      title: DeviceInfo
+      required:
+      - deviceAuthenticationInfo
+      - deviceId
+      - enabled
+      type: object
+      properties:
+        deviceAuthenticationInfo:
+          type: string
+          description: "Information needed for secondary authentication of the IoT\
+            \ device to the data network - see ETSI TS 129 561 [i.4] and ETSI TS 129\
+            \ 061 [i.5] for 5G and LTE procedures, respectively. This attribute is\
+            \ implementation dependent and should be logically linked to the identifiers\
+            \ of the IoT device listed hereafter."
+        deviceMetadata:
+          type: array
+          description: 'Additional information about the IoT device. This attribute
+            is implementation dependent and may be expressed as an array of keyvalue
+            pairs. '
+          items:
+            $ref: '#/components/schemas/KeyValuePair'
+        gpsi:
+          type: string
+          description: GPSI of the IoT device if 5G-enabled (see note 1).
+        pei:
+          type: string
+          description: PEI of the IoT device if 5G-enabled (see note 1).
+        supi:
+          type: string
+          description: SUPI of the IoT device if 5G-enabled (see note 1).
+        msisdn:
+          type: string
+          description: MSISDN of the IoT device if LTE-enabled (see note 1).
+        imei:
+          type: string
+          description: IMEI of the IoT device if LTE-enabled (see note 1).
+        imsi:
+          type: string
+          description: IMSI of the IoT device if LTE-enabled (see note 1).
+        iccid:
+          type: string
+          description: ICCID of the IoT device (see note 1).
+        deviceId:
+          type: string
+          description: Human-readable identifier of the IoT device.
+        requestedMecTrafficRule:
+          type: array
+          description: "MEC traffic rules the IoT device is requested to be associated\
+            \ to (see note 2). The data type definition is as per ETSI GS\_MEC 010-2\
+            \ [i.6]."
+          items:
+            $ref: '#/components/schemas/TrafficRuleDescriptor'
+        requestedIotPlatformId:
+          type: string
+          description: IoT platform to which the IoT device is requested to be associated
+            to (see note 2).
+        requestedUserTransportId:
+          type: string
+          description: User transport to which the IoT device is requested to be associated
+            to (see note 2).
+        deviceSpecificMessageFormats:
+          $ref: '#/components/schemas/DeviceSpecificMessageFormats'
+        downlinkInfo:
+          $ref: '#/components/schemas/DownlinkInfo'
+        clientCertificate:
+          type: string
+          description: Client-side SSL/TLS certificate to be used by the MEC IoTS
+            to interact with the user transport provided by the associated IoT platform
+            in case the MEC IoTS acts on behalf of the IoT device.
+        enabled:
+          type: boolean
+          description: Indication whether the IoT device has a valid associated traffic
+            rule (TRUE) or not (FALSE). See note 3.
+      description: "NOTE 1: At least one attribute among gpsi, pei, supi, msisdn,\
+        \ imei, imsi, and iccid should be provided. Sufficient security\n        measures\
+        \ shall be put in place when any attribute among PEI, SUPI, IMEI, and IMSI\
+        \ is disclosed over the API.\nNOTE 2: Until a valid traffic rule is not provided,\
+        \ the device will not be able to use the IoTS. A valid traffic rule is provided\n\
+        \        by one of the following options:\n        • the requestedMecTrafficRule\
+        \ attribute;\n        • the requestedIotPlatformId attribute when the IoT\
+        \ platform offers only one user transport;\n        • the combination of requestedIotPlatformId\
+        \ and requestedUserTransportId.\nNOTE 3: Enabled is a pseudo-attribute which\
+        \ needs to be maintained by the IoTS based on the presence or not of a valid\n\
+        \        traffic rule associated to the device. It cannot be set directly\
+        \ by the service consumer. \n"
+      example:
+        deviceSpecificMessageFormats:
+          eventMsgFormat:
+            includeDeviceMetadata: true
+            includeIccid: true
+            includeDeviceAddr: true
+            includeImei: true
+            includeImsi: true
+            includeSupi: true
+            selectedSerializer: JSON
+            eventTopic: eventTopic
+            includeDeviceId: true
+            includePei: true
+          uplinkMsgFormat:
+            includeDeviceMetadata: true
+            includeIccid: true
+            includeDeviceAddr: true
+            includeImei: true
+            uplinkTopic: uplinkTopic
+            includeImsi: true
+            includeSupi: true
+            selectedSerializer: null
+            includeDevicePort: true
+            includeDeviceId: true
+            includePei: true
+        clientCertificate: clientCertificate
+        downlinkInfo:
+          downlinkTopic: downlinkTopic
+          devicePort: 5
+        imsi: imsi
+        supi: supi
+        deviceId: deviceId
+        requestedMecTrafficRule:
+        - action: SEE_DESCRIPTION
+          trafficRuleId: trafficRuleId
+          dstInterface:
+            interfaceType: TUNNEL
+            dstIPAddress: dstIPAddress
+            srcMACAddress: srcMACAddress
+            dstMACAddress: dstMACAddress
+            tunnelInfo:
+              tunnelSrcAddress: tunnelSrcAddress
+              tunnelType: GTP-U
+              tunnelSpecificData: tunnelSpecificData
+              tunnelDstAddress: tunnelDstAddress
+          filterType: per FLOW
+          priority: 0
+          trafficFilter:
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+        - action: SEE_DESCRIPTION
+          trafficRuleId: trafficRuleId
+          dstInterface:
+            interfaceType: TUNNEL
+            dstIPAddress: dstIPAddress
+            srcMACAddress: srcMACAddress
+            dstMACAddress: dstMACAddress
+            tunnelInfo:
+              tunnelSrcAddress: tunnelSrcAddress
+              tunnelType: GTP-U
+              tunnelSpecificData: tunnelSpecificData
+              tunnelDstAddress: tunnelDstAddress
+          filterType: per FLOW
+          priority: 0
+          trafficFilter:
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+        enabled: true
+        gpsi: gpsi
+        requestedUserTransportId: requestedUserTransportId
+        iccid: iccid
+        pei: pei
+        requestedIotPlatformId: requestedIotPlatformId
+        deviceMetadata:
+        - value: value
+          key: key
+        - value: value
+          key: key
+        deviceAuthenticationInfo: deviceAuthenticationInfo
+        imei: imei
+        msisdn: msisdn
+    IotPlatformInfo:
+      title: IotPlatformInfo
+      required:
+      - enabled
+      - iotPlatformId
+      - userTransportInfo
+      type: object
+      properties:
+        iotPlatformId:
+          type: string
+          description: Identifier of the IoT platform.
+        userTransportInfo:
+          minItems: 1
+          type: array
+          description: Information about the user transport(s)  provided by the IoT
+            platform.
+          items:
+            $ref: '#/components/schemas/MBTransportInfo'
+        customServicesTransportInfo:
+          minItems: 0
+          type: array
+          description: "Transport enabling access to vendor-specific services provided\
+            \ by the IoT platform. The data type definition is as per ETSI GS MEC\
+            \ 011 [i.2]."
+          items:
+            $ref: '#/components/schemas/TransportInfo'
+        enabled:
+          type: boolean
+          description: Indication whether the IoT platform is capable of providing
+            user transports and vendor-specific services (TRUE) or not (FALSE).
+      example:
+        iotPlatformId: iotPlatformId
+        customServicesTransportInfo:
+        - implSpecificInfo: implSpecificInfo
+          protocol: protocol
+          endpoint: null
+          security: null
+          name: name
+          description: description
+          id: id
+          type: null
+          version: version
+        - implSpecificInfo: implSpecificInfo
+          protocol: protocol
+          endpoint: null
+          security: null
+          name: name
+          description: description
+          id: id
+          type: null
+          version: version
+        userTransportInfo:
+        - implSpecificInfo:
+            uplinkTopics:
+            - uplinkTopics
+            - uplinkTopics
+            downlinkTopics:
+            - downlinkTopics
+            - downlinkTopics
+            eventTopics:
+            - eventTopics
+            - eventTopics
+          protocol: protocol
+          endpoint:
+            uris:
+            - uris
+            - uris
+            addresses:
+            - port: 0
+              host: host
+            - port: 0
+              host: host
+            fqdn:
+            - fqdn
+            - fqdn
+            alternative: alternative
+          security:
+            extensions: extensions
+            oAuth2Info:
+              tokenEndpoint: http://example.com/aeiou
+              grantTypes:
+              - OAUTH2_AUTHORIZATION_CODE
+              - OAUTH2_AUTHORIZATION_CODE
+          name: name
+          description: description
+          id: id
+          type: REST_HTTP
+          version: version
+        - implSpecificInfo:
+            uplinkTopics:
+            - uplinkTopics
+            - uplinkTopics
+            downlinkTopics:
+            - downlinkTopics
+            - downlinkTopics
+            eventTopics:
+            - eventTopics
+            - eventTopics
+          protocol: protocol
+          endpoint:
+            uris:
+            - uris
+            - uris
+            addresses:
+            - port: 0
+              host: host
+            - port: 0
+              host: host
+            fqdn:
+            - fqdn
+            - fqdn
+            alternative: alternative
+          security:
+            extensions: extensions
+            oAuth2Info:
+              tokenEndpoint: http://example.com/aeiou
+              grantTypes:
+              - OAUTH2_AUTHORIZATION_CODE
+              - OAUTH2_AUTHORIZATION_CODE
+          name: name
+          description: description
+          id: id
+          type: REST_HTTP
+          version: version
+        enabled: true
+    MBTransportInfo:
+      title: MBTransportInfo
+      required:
+      - endpoint
+      - id
+      - implSpecificInfo
+      - name
+      - protocol
+      - security
+      - type
+      - version
+      type: object
+      properties:
+        id:
+          type: string
+          description: "The identifier of this transport as per ETSI GS\_MEC\_011\
+            \ [i.2]."
+        name:
+          type: string
+          description: "The name of this transport as per ETSI GS\_MEC\_011\_[i.2]."
+        description:
+          type: string
+          description: "Human-readable description of this transport as per ETSI GS\_\
+            MEC 011 [i.2]."
+        type:
+          $ref: '#/components/schemas/TransportType'
+        protocol:
+          type: string
+          description: "The name of the protocol used. Being the transport of MB_TOPIC_BASED\
+            \ type, this attribute should be typically set to \"MQTT\" or \"AMQP.\""
+        version:
+          type: string
+          description: "The version of the protocol used as per ETSI GS\_MEC\_011\_\
+            [i.2]."
+        endpoint:
+          $ref: '#/components/schemas/EndPointInfo'
+        security:
+          $ref: '#/components/schemas/SecurityInfo'
+        implSpecificInfo:
+          $ref: '#/components/schemas/ImplSpecificInfo'
+      example:
+        implSpecificInfo:
+          uplinkTopics:
+          - uplinkTopics
+          - uplinkTopics
+          downlinkTopics:
+          - downlinkTopics
+          - downlinkTopics
+          eventTopics:
+          - eventTopics
+          - eventTopics
+        protocol: protocol
+        endpoint:
+          uris:
+          - uris
+          - uris
+          addresses:
+          - port: 0
+            host: host
+          - port: 0
+            host: host
+          fqdn:
+          - fqdn
+          - fqdn
+          alternative: alternative
+        security:
+          extensions: extensions
+          oAuth2Info:
+            tokenEndpoint: http://example.com/aeiou
+            grantTypes:
+            - OAUTH2_AUTHORIZATION_CODE
+            - OAUTH2_AUTHORIZATION_CODE
+        name: name
+        description: description
+        id: id
+        type: REST_HTTP
+        version: version
+    EventMsg:
+      title: EventMsg
+      required:
+      - eventTopic
+      - selectedSerializer
+      type: object
+      properties:
+        eventTopic:
+          type: string
+          description: 'Topic where the message containing application-specific information
+            should be published. '
+        selectedSerializer:
+          $ref: '#/components/schemas/SerializerType'
+        includeDeviceAddr:
+          type: boolean
+          description: Indication whether to include the IP address of the IoT device
+            (TRUE) or not (FALSE).
+        includeDeviceMetadata:
+          type: boolean
+          description: Indication whether to include the metadata about the IoT device
+            (TRUE) or not (FALSE).
+        includePei:
+          type: boolean
+          description: Indication whether to include the PEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeSupi:
+          type: boolean
+          description: Indication whether to include the SUPI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImei:
+          type: boolean
+          description: Indication whether to include the IMEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImsi:
+          type: boolean
+          description: Indication whether to include the IMSI of the IoT device (TRUE)
+            or not (FALSE).
+        includeIccid:
+          type: boolean
+          description: Indication whether to include the ICCID of the IoT device (TRUE)
+            or not (FALSE).
+        includeDeviceId:
+          type: boolean
+          description: Indication whether to include the human-readable identified
+            of the IoT device (TRUE) or not (FALSE).
+      example:
+        includeDeviceMetadata: true
+        includeIccid: true
+        includeDeviceAddr: true
+        includeImei: true
+        includeImsi: true
+        includeSupi: true
+        selectedSerializer: JSON
+        eventTopic: eventTopic
+        includeDeviceId: true
+        includePei: true
+    UplinkMsg:
+      title: UplinkMsg
+      required:
+      - selectedSerializer
+      - uplinkTopic
+      type: object
+      properties:
+        uplinkTopic:
+          type: string
+          description: "Topic where the message containing the data generated by the\
+            \ IoT device(s) should be published, in order to be consumed by the end\
+            \ IoT application(s)."
+        selectedSerializer:
+          $ref: '#/components/schemas/SerializerType'
+        includeDevicePort:
+          type: boolean
+          description: Indication whether to include the UDP port of the remote IoT
+            device (TRUE) or not (FALSE).
+        includeDeviceAddr:
+          type: boolean
+          description: Indication whether to include the IP address of the IoT device
+            (TRUE) or not (FALSE).
+        includeDeviceMetadata:
+          type: boolean
+          description: Indication whether to include the metadata about the IoT device
+            (TRUE) or not (FALSE).
+        includePei:
+          type: boolean
+          description: Indication whether to include the PEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeSupi:
+          type: boolean
+          description: Indication whether to include the SUPI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImei:
+          type: boolean
+          description: Indication whether to include the IMEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImsi:
+          type: boolean
+          description: Indication whether to include the IMSI of the IoT device (TRUE)
+            or not (FALSE).
+        includeIccid:
+          type: boolean
+          description: Indication whether to include the ICCID of the IoT device (TRUE)
+            or not (FALSE).
+        includeDeviceId:
+          type: boolean
+          description: Indication whether to include the human-readable identified
+            of the IoT device (TRUE) or not (FALSE).
+      example:
+        includeDeviceMetadata: true
+        includeIccid: true
+        includeDeviceAddr: true
+        includeImei: true
+        uplinkTopic: uplinkTopic
+        includeImsi: true
+        includeSupi: true
+        selectedSerializer: null
+        includeDevicePort: true
+        includeDeviceId: true
+        includePei: true
+    DeviceSpecificMessageFormats:
+      type: object
+      properties:
+        eventMsgFormat:
+          $ref: '#/components/schemas/EventMsg'
+        uplinkMsgFormat:
+          $ref: '#/components/schemas/UplinkMsg'
+      description: Format of the messages to be published by the MEC IoTS on the user
+        transport provided by the associated IoT platform in case the MEC IoTS acts
+        on behalf of the IoT device.
+      example:
+        eventMsgFormat:
+          includeDeviceMetadata: true
+          includeIccid: true
+          includeDeviceAddr: true
+          includeImei: true
+          includeImsi: true
+          includeSupi: true
+          selectedSerializer: JSON
+          eventTopic: eventTopic
+          includeDeviceId: true
+          includePei: true
+        uplinkMsgFormat:
+          includeDeviceMetadata: true
+          includeIccid: true
+          includeDeviceAddr: true
+          includeImei: true
+          uplinkTopic: uplinkTopic
+          includeImsi: true
+          includeSupi: true
+          selectedSerializer: null
+          includeDevicePort: true
+          includeDeviceId: true
+          includePei: true
+    DownlinkInfo:
+      type: object
+      properties:
+        downlinkTopic:
+          type: string
+          description: Topic associated to the IoT device. This topic should be used
+            by an end IoT application to send downlink data to the IoT device.
+        devicePort:
+          type: integer
+          description: "UDP port to be used by the MEC IoTS for the outgoing downlink\
+            \ packets towards the IoT device. In case a default value is used, this\
+            \ attribute is optional."
+      description: Downlink communication configuration of the user transport provided
+        by the associated IoT platform in case the MEC IoTS acts on behalf of the
+        IoT device.
+      example:
+        downlinkTopic: downlinkTopic
+        devicePort: 5
+    ImplSpecificInfo:
+      type: object
+      properties:
+        eventTopics:
+          minItems: 0
+          type: array
+          description: Topics used to publish events related to the established session
+            between the IoT device(s) and the end IoT application(s) on the user transport.
+          items:
+            type: string
+        uplinkTopics:
+          type: array
+          description: "Topics used to publish data generated by the IoT device(s)\
+            \ on the user transport, in order to be consumed by the end IoT application(s)."
+          items:
+            type: string
+        downlinkTopics:
+          type: array
+          description: "Topics used to publish data generated by the IoT applications(s)\
+            \ on the user transport, in order to be consumed by the end IoT device(s)."
+          items:
+            type: string
+      description: Additional implementation specific details of the transport.
+      example:
+        uplinkTopics:
+        - uplinkTopics
+        - uplinkTopics
+        downlinkTopics:
+        - downlinkTopics
+        - downlinkTopics
+        eventTopics:
+        - eventTopics
+        - eventTopics
+    SerializerType:
+      type: string
+      description: The enumeration SerializerType represents types of serializers.
+      enum:
+      - JSON
+      - XML
+      - PROTOBUF3
+    TransportInfo:
+      title: TransportInfo
+      required:
+      - endpoint
+      - id
+      - name
+      - protocol
+      - security
+      - type
+      - version
+      type: object
+      properties:
+        id:
+          type: string
+          description: The identifier of this transport.
+        name:
+          type: string
+          description: The name of this transport.
+        description:
+          type: string
+          description: Human-readable description of this transport.
+        type:
+          $ref: '#/components/schemas/TransportType'
+        protocol:
+          type: string
+          description: The name of the protocol used. Shall be set to "HTTP" for a
+            REST API.
+        version:
+          type: string
+          description: The version of the protocol used.
+        endpoint:
+          $ref: '#/components/schemas/EndPointInfo'
+        security:
+          $ref: '#/components/schemas/SecurityInfo'
+        implSpecificInfo:
+          type: string
+          description: Additional implementation specific details of the transport.
+      example:
+        implSpecificInfo: implSpecificInfo
+        protocol: protocol
+        endpoint: null
+        security: null
+        name: name
+        description: description
+        id: id
+        type: null
+        version: version
+    TransportType:
+      type: string
+      description: Enumeration representing types of transports.
+      enum:
+      - REST_HTTP
+      - MB_TOPIC_BASED
+      - MB_ROUTING
+      - MB_PUBSUB
+      - RPC
+      - RPC_STREAMING
+      - WEBSOCKET
+    EndPointInfo:
+      title: EndPointInfo
+      type: object
+      properties:
+        uris:
+          type: array
+          description: "Entry point information of the service as string, formatted\
+            \ according to URI syntax (see IETF RFC 3986 [8]). Shall be used for REST\
+            \ APIs. See note."
+          items:
+            type: string
+        fqdn:
+          type: array
+          description: Fully Qualified Domain Name of the service. See note.
+          items:
+            type: string
+        addresses:
+          type: array
+          items:
+            $ref: '#/components/schemas/Addresses'
+        alternative:
+          type: string
+          description: "Entry point information of the service in a format defined\
+            \ by an implementation, or in an external specification. See\_note."
+      description: "NOTE: Exactly one of \"uris\", \"fqdn\", \"addresses\" or \"alternative\"\
+        \ shall be present. \n"
+      example:
+        uris:
+        - uris
+        - uris
+        addresses:
+        - port: 0
+          host: host
+        - port: 0
+          host: host
+        fqdn:
+        - fqdn
+        - fqdn
+        alternative: alternative
+    SecurityInfo:
+      type: object
+      properties:
+        oAuth2Info:
+          $ref: '#/components/schemas/OAuth2Info'
+        extensions:
+          type: string
+          description: "Extensions for alternative transport mechanisms. These extensions\
+            \ depend on the actual transport and are out of scope of the present document.\
+            \ For instance, such extensions may be used to signal the necessary parameters\
+            \ for the client to use TLS-based authorization defined for alternative\
+            \ transports (see ETSI GS MEC 009 [5] for more information).\n"
+      example:
+        extensions: extensions
+        oAuth2Info:
+          tokenEndpoint: http://example.com/aeiou
+          grantTypes:
+          - OAUTH2_AUTHORIZATION_CODE
+          - OAUTH2_AUTHORIZATION_CODE
+    Addresses:
+      required:
+      - host
+      - port
+      type: object
+      properties:
+        host:
+          type: string
+          description: Host portion of the address.
+        port:
+          type: integer
+          description: Port portion of the address.
+      description: Entry point information of the service as one or more pairs of
+        IP address and port. See note.
+      example:
+        port: 0
+        host: host
+    OAuth2Info:
+      required:
+      - grantTypes
+      type: object
+      properties:
+        grantTypes:
+          type: array
+          description: "List of supported OAuth 2.0 grant types.\nEach entry shall\
+            \ be one of the following permitted values:\n- OAUTH2_AUTHORIZATION_CODE:\
+            \ Authorization code grant type\n- OAUTH2_IMPLICIT_GRANT: Implicit grant\
+            \ type\n- OAUTH2_RESOURCE_OWNER: Resource owner password credentials grant\
+            \ type\n- OAUTH2_CLIENT_CREDENTIALS: Client credentials grant type\nOnly\
+            \ the value \"OAUTH2_CLIENT_CREDENTIALS\" is supported in the present\
+            \ document.\n"
+          items:
+            type: string
+            enum:
+            - OAUTH2_AUTHORIZATION_CODE
+            - OAUTH2_IMPLICIT_GRANT
+            - OAUTH2_RESOURCE_OWNER
+            - OAUTH2_CLIENT_CREDENTIALS
+        tokenEndpoint:
+          type: string
+          description: The token endpoint. Shall be present unless the grant type
+            is OAUTH2_IMPLICIT_GRANT.
+          format: uri
+      description: "Parameters related to use of OAuth 2.0. Shall be present in case\
+        \ OAuth 2.0 (see IETF RFC 6749 [13]) is supported to secure the provision\
+        \ of the service over the transport."
+      example:
+        tokenEndpoint: http://example.com/aeiou
+        grantTypes:
+        - OAUTH2_AUTHORIZATION_CODE
+        - OAUTH2_AUTHORIZATION_CODE
+    TrafficRuleDescriptor:
+      title: TrafficRuleDescriptor
+      required:
+      - action
+      - filterType
+      - priority
+      - trafficFilter
+      - trafficRuleId
+      type: object
+      properties:
+        trafficRuleId:
+          type: string
+          description: Identifies the traffic rule.
+        filterType:
+          type: string
+          description: "Definition of filter type: per FLOW or PACKET\n\nIf it is\
+            \ per FLOW, the filter matches upstream (e.g. UE->EPC) packets and downstream\
+            \ (e.g. EPC->UE) packets are handled by the same context.\n"
+          enum:
+          - per FLOW
+          - per PACKET
+        priority:
+          type: integer
+          description: "Priority of this traffic rule within the range 0 to 255. If\
+            \ traffic rule conflicts, the one with higher priority take precedence.\
+            \ See note\_1."
+        trafficFilter:
+          type: array
+          description: The filter used to identify specific flow/packets that need
+            to be handled by the MEC host.
+          items:
+            $ref: '#/components/schemas/TrafficFilter'
+        action:
+          type: string
+          description: "Identifies the action of the MEC host data plane, when a packet\
+            \ matches the trafficFilter, the example actions include:\nDROP,\nFORWARD_DECAPSULATED,\n\
+            FORWARD_ENCAPSULATED,\nPASSTHROUGH,\nDUPLICATE_DECAPSULATED,\nDUPLICATE_ENCAPSULATED "
+          enum:
+          - SEE_DESCRIPTION
+        dstInterface:
+          $ref: '#/components/schemas/InterfaceDescriptor'
+      description: "NOTE 1: Value indicates the priority in descending order, i.e.\
+        \ with 0 as the highest priority and 255 as the lowest\n        priority.\n\
+        NOTE 2: Some applications (like inline/tap) require two interfaces. The first\
+        \ interface in the case of inline/tap is on the\n        client (e.g. UE)\
+        \ side and the second on the core network (e.g. EPC) side. \n"
+      example:
+        action: SEE_DESCRIPTION
+        trafficRuleId: trafficRuleId
+        dstInterface:
+          interfaceType: TUNNEL
+          dstIPAddress: dstIPAddress
+          srcMACAddress: srcMACAddress
+          dstMACAddress: dstMACAddress
+          tunnelInfo:
+            tunnelSrcAddress: tunnelSrcAddress
+            tunnelType: GTP-U
+            tunnelSpecificData: tunnelSpecificData
+            tunnelDstAddress: tunnelDstAddress
+        filterType: per FLOW
+        priority: 0
+        trafficFilter:
+        - srcTunnelPort:
+          - srcTunnelPort
+          - srcTunnelPort
+          dstAddress:
+          - dstAddress
+          - dstAddress
+          srcAddress:
+          - srcAddress
+          - srcAddress
+          srcPort:
+          - srcPort
+          - srcPort
+          uri:
+          - uri
+          - uri
+          tC: 5
+          protocol:
+          - protocol
+          - protocol
+          dstTunnelPort:
+          - dstTunnelPort
+          - dstTunnelPort
+          dSCP: 1
+          dstPort:
+          - dstPort
+          - dstPort
+          packetLabel:
+          - packetLabel
+          - packetLabel
+          qCI: 6
+          srcTunnelAddress:
+          - srcTunnelAddress
+          - srcTunnelAddress
+          tag:
+          - tag
+          - tag
+          tgtTunnelAddress:
+          - tgtTunnelAddress
+          - tgtTunnelAddress
+        - srcTunnelPort:
+          - srcTunnelPort
+          - srcTunnelPort
+          dstAddress:
+          - dstAddress
+          - dstAddress
+          srcAddress:
+          - srcAddress
+          - srcAddress
+          srcPort:
+          - srcPort
+          - srcPort
+          uri:
+          - uri
+          - uri
+          tC: 5
+          protocol:
+          - protocol
+          - protocol
+          dstTunnelPort:
+          - dstTunnelPort
+          - dstTunnelPort
+          dSCP: 1
+          dstPort:
+          - dstPort
+          - dstPort
+          packetLabel:
+          - packetLabel
+          - packetLabel
+          qCI: 6
+          srcTunnelAddress:
+          - srcTunnelAddress
+          - srcTunnelAddress
+          tag:
+          - tag
+          - tag
+          tgtTunnelAddress:
+          - tgtTunnelAddress
+          - tgtTunnelAddress
+    TrafficFilter:
+      title: TrafficFilter
+      type: object
+      properties:
+        srcAddress:
+          type: array
+          description: "An IP address or a range of IP addresses.\nFor IPv4, the IP\
+            \ address could be an IP address plus mask, or an individual IP address,\
+            \ or a range of IP addresses.\nFor IPv6, the IP address could be an IP\
+            \ prefix, or a range of IP prefixes."
+          items:
+            type: string
+        dstAddress:
+          type: array
+          description: "An IP address or a range of IP addresses.\nFor IPv4, the IP\
+            \ address could be an IP address plus mask, or an individual IP address,\
+            \ or a range of IP addresses.\nFor IPv6, the IP address could be an IP\
+            \ prefix, or a range of IP prefixes."
+          items:
+            type: string
+        srcPort:
+          type: array
+          description: A port or a range of ports.
+          items:
+            type: string
+        dstPort:
+          type: array
+          description: A port or a range of ports.
+          items:
+            type: string
+        protocol:
+          type: array
+          description: Specify the protocol of the traffic filter.
+          items:
+            type: string
+        tag:
+          type: array
+          description: Used for tag based traffic rule.
+          items:
+            type: string
+        uri:
+          type: array
+          description: "An URI label, in application layer, i.e. in HTTP message,\
+            \ is used to filter the traffic."
+          items:
+            type: string
+        packetLabel:
+          type: array
+          description: "A customized packet label in network layer, as defined by\
+            \ the owner of the MEC platform, is used to filter the traffic."
+          items:
+            type: string
+        srcTunnelAddress:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        tgtTunnelAddress:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        srcTunnelPort:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        dstTunnelPort:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        qCI:
+          type: integer
+          description: Used to match all packets that have the same QCI.
+        dSCP:
+          type: integer
+          description: Used to match all IPv4 packets that have the same DSCP.
+        tC:
+          type: integer
+          description: Used to match all IPv6 packets that have the same TC.
+      example:
+        srcTunnelPort:
+        - srcTunnelPort
+        - srcTunnelPort
+        dstAddress:
+        - dstAddress
+        - dstAddress
+        srcAddress:
+        - srcAddress
+        - srcAddress
+        srcPort:
+        - srcPort
+        - srcPort
+        uri:
+        - uri
+        - uri
+        tC: 5
+        protocol:
+        - protocol
+        - protocol
+        dstTunnelPort:
+        - dstTunnelPort
+        - dstTunnelPort
+        dSCP: 1
+        dstPort:
+        - dstPort
+        - dstPort
+        packetLabel:
+        - packetLabel
+        - packetLabel
+        qCI: 6
+        srcTunnelAddress:
+        - srcTunnelAddress
+        - srcTunnelAddress
+        tag:
+        - tag
+        - tag
+        tgtTunnelAddress:
+        - tgtTunnelAddress
+        - tgtTunnelAddress
+    InterfaceDescriptor:
+      title: InterfaceDescriptor
+      required:
+      - interfaceType
+      type: object
+      properties:
+        interfaceType:
+          type: string
+          description: "Type of interface: TUNNEL, MAC, IP, etc."
+          enum:
+          - TUNNEL
+          - MAC
+          - IP
+        tunnelInfo:
+          $ref: '#/components/schemas/TunnelInfo'
+        srcMACAddress:
+          type: string
+          description: "If the interface type is MAC, the source address identifies\
+            \ the MAC address of the interface."
+        dstMACAddress:
+          type: string
+          description: "If the interface type is MAC, the destination address identifies\
+            \ the MAC address of the destination. Only used for dstInterface."
+        dstIPAddress:
+          type: string
+          description: "If the interface type is IP, the destination address identifies\
+            \ the IP address of the destination. Only used for dstInterface."
+      example:
+        interfaceType: TUNNEL
+        dstIPAddress: dstIPAddress
+        srcMACAddress: srcMACAddress
+        dstMACAddress: dstMACAddress
+        tunnelInfo:
+          tunnelSrcAddress: tunnelSrcAddress
+          tunnelType: GTP-U
+          tunnelSpecificData: tunnelSpecificData
+          tunnelDstAddress: tunnelDstAddress
+    TunnelInfo:
+      title: TunnelInfo
+      required:
+      - tunnelDstAddress
+      - tunnelSrcAddress
+      - tunnelType
+      type: object
+      properties:
+        tunnelType:
+          type: string
+          description: "Type of tunnel: GTP-U, GRE, etc."
+          enum:
+          - GTP-U
+          - GRE
+        tunnelDstAddress:
+          type: string
+          description: Destination address of the tunnel.
+        tunnelSrcAddress:
+          type: string
+          description: Source address of the tunnel.
+        tunnelSpecificData:
+          type: string
+          description: Parameters specific to the tunnel.
+      example:
+        tunnelSrcAddress: tunnelSrcAddress
+        tunnelType: GTP-U
+        tunnelSpecificData: tunnelSpecificData
+        tunnelDstAddress: tunnelDstAddress
+    KeyValuePair:
+      type: object
+      properties:
+        key:
+          type: string
+        value:
+          type: string
+      description: Key-value pairs for device metadata
+      example:
+        value: value
+        key: key
+    inline_response_200:
+      type: object
+      properties:
+        items:
+          $ref: '#/components/schemas/DeviceInfo'
+      example:
+        items:
+          deviceSpecificMessageFormats:
+            eventMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: JSON
+              eventTopic: eventTopic
+              includeDeviceId: true
+              includePei: true
+            uplinkMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              uplinkTopic: uplinkTopic
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: null
+              includeDevicePort: true
+              includeDeviceId: true
+              includePei: true
+          clientCertificate: clientCertificate
+          downlinkInfo:
+            downlinkTopic: downlinkTopic
+            devicePort: 5
+          imsi: imsi
+          supi: supi
+          deviceId: deviceId
+          requestedMecTrafficRule:
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          enabled: true
+          gpsi: gpsi
+          requestedUserTransportId: requestedUserTransportId
+          iccid: iccid
+          pei: pei
+          requestedIotPlatformId: requestedIotPlatformId
+          deviceMetadata:
+          - value: value
+            key: key
+          - value: value
+            key: key
+          deviceAuthenticationInfo: deviceAuthenticationInfo
+          imei: imei
+          msisdn: msisdn
+    registered_devices_body:
+      type: object
+      properties:
+        DeviceInfo:
+          $ref: '#/components/schemas/DeviceInfo'
+      example:
+        DeviceInfo:
+          deviceSpecificMessageFormats:
+            eventMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: JSON
+              eventTopic: eventTopic
+              includeDeviceId: true
+              includePei: true
+            uplinkMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              uplinkTopic: uplinkTopic
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: null
+              includeDevicePort: true
+              includeDeviceId: true
+              includePei: true
+          clientCertificate: clientCertificate
+          downlinkInfo:
+            downlinkTopic: downlinkTopic
+            devicePort: 5
+          imsi: imsi
+          supi: supi
+          deviceId: deviceId
+          requestedMecTrafficRule:
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          enabled: true
+          gpsi: gpsi
+          requestedUserTransportId: requestedUserTransportId
+          iccid: iccid
+          pei: pei
+          requestedIotPlatformId: requestedIotPlatformId
+          deviceMetadata:
+          - value: value
+            key: key
+          - value: value
+            key: key
+          deviceAuthenticationInfo: deviceAuthenticationInfo
+          imei: imei
+          msisdn: msisdn
+    registered_devices_registeredDeviceId_body:
+      type: object
+      properties:
+        DeviceInfo:
+          $ref: '#/components/schemas/DeviceInfo'
+      example:
+        DeviceInfo:
+          deviceSpecificMessageFormats:
+            eventMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: JSON
+              eventTopic: eventTopic
+              includeDeviceId: true
+              includePei: true
+            uplinkMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              uplinkTopic: uplinkTopic
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: null
+              includeDevicePort: true
+              includeDeviceId: true
+              includePei: true
+          clientCertificate: clientCertificate
+          downlinkInfo:
+            downlinkTopic: downlinkTopic
+            devicePort: 5
+          imsi: imsi
+          supi: supi
+          deviceId: deviceId
+          requestedMecTrafficRule:
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          enabled: true
+          gpsi: gpsi
+          requestedUserTransportId: requestedUserTransportId
+          iccid: iccid
+          pei: pei
+          requestedIotPlatformId: requestedIotPlatformId
+          deviceMetadata:
+          - value: value
+            key: key
+          - value: value
+            key: key
+          deviceAuthenticationInfo: deviceAuthenticationInfo
+          imei: imei
+          msisdn: msisdn
+    registered_iot_platforms_body:
+      type: object
+      properties:
+        IoTPlatformInfo:
+          $ref: '#/components/schemas/IotPlatformInfo'
+      example:
+        IoTPlatformInfo:
+          iotPlatformId: iotPlatformId
+          customServicesTransportInfo:
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          userTransportInfo:
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          enabled: true
+    inline_response_200_1:
+      type: object
+      properties:
+        IotPlatformInfo:
+          $ref: '#/components/schemas/IotPlatformInfo'
+      example:
+        IotPlatformInfo:
+          iotPlatformId: iotPlatformId
+          customServicesTransportInfo:
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          userTransportInfo:
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          enabled: true
+    registered_iot_platforms_registeredIotPlatformId_body:
+      type: object
+      properties:
+        IotPlatformInfo:
+          $ref: '#/components/schemas/IotPlatformInfo'
+      example:
+        IotPlatformInfo:
+          iotPlatformId: iotPlatformId
+          customServicesTransportInfo:
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          userTransportInfo:
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          enabled: true
+  responses:
+    "200":
+      description: OK
+    "204":
+      description: No Content
+    "400":
+      description: "Bad Request: used to indicate that incorrect parameters were passed\
+        \ to the request."
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
+    "403":
+      description: "Forbidden: operation is not allowed given the current status of\
+        \ the resource."
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
+    "404":
+      description: "Not Found: used when a client provided a URI that cannot be mapped\
+        \ to a valid resource URI."
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
+    "412":
+      description: "Precondition failed: used when a condition has failed during conditional\
+        \ requests, e.g. when using ETags to avoid write conflicts when using PUT"
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
diff --git a/go-apps/meep-iot/entrypoint.sh b/go-apps/meep-iot/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..04990153483b58425e42ae01cf33c50b75545aad
--- /dev/null
+++ b/go-apps/meep-iot/entrypoint.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+set -e
+
+echo "MEEP_HOST_URL: ${MEEP_HOST_URL}"
+echo "MEEP_SANDBOX_NAME: ${MEEP_SANDBOX_NAME}"
+echo "MEEP_MEP_NAME: ${MEEP_MEP_NAME}"
+echo "MEEP_CODECOV: ${MEEP_CODECOV}"
+if [[ ! -z "${MEEP_MEP_NAME}" ]]; then
+    svcPath="${MEEP_SANDBOX_NAME}/${MEEP_MEP_NAME}"
+else
+    svcPath="${MEEP_SANDBOX_NAME}"
+fi
+
+# Update API yaml basepaths to enable "Try-it-out" feature
+# OAS2: Set relative path to sandbox name + endpoint path (origin will be derived from browser URL)
+# OAS3: Set full path to provided Host URL + sandbox name + endpoint path
+setBasepath() {
+    # OAS3
+    hostName=$(echo "${MEEP_HOST_URL}" | sed -E 's/^\s*.*:\/\///g')
+    echo "Replacing [localhost] with ${hostName} to url in: '$1'"
+    sed -i "s,localhost,${hostName},g" "$1";
+
+    # OAS2 and OAS3
+    echo "Replacing [sandboxname] with ${svcPath} to basepath or url in: '$1'"
+    sed -i "s,sandboxname,${svcPath},g" "$1";
+}
+
+# Set basepath for API files
+for file in /api/*; do
+    if [[ ! -e "$file" ]]; then continue; fi
+    setBasepath "$file"
+done
+
+# Set basepath for user-supplied API files
+for file in /user-api/*; do
+    if [[ ! -e "$file" ]]; then continue; fi
+    setBasepath "$file"
+done
+
+# Start service
+currenttime=`date "+%Y%m%d-%H%M%S"`
+filepath="/codecov/codecov-meep-iot-"
+filename=$filepath$currenttime".out"
+if [ "$MEEP_CODECOV" = 'true' ]; then
+  exec /meep-iot -test.coverprofile=$filename __DEVEL--code-cov
+else
+  exec /meep-iot
+fi
diff --git a/go-apps/meep-iot/go.mod b/go-apps/meep-iot/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..4f6a07d164719d26c5e57c2c58a7f9f1b0c5fec9
--- /dev/null
+++ b/go-apps/meep-iot/go.mod
@@ -0,0 +1,45 @@
+module github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-iot
+
+go 1.12
+
+require (
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-gis-engine-client v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-iot-mgr v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-subscriptions v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr v0.0.0
+	github.com/gorilla/handlers v1.5.1
+	github.com/gorilla/mux v1.8.1
+	github.com/prometheus/client_golang v1.9.0
+)
+
+replace (
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client => ../../go-packages/meep-app-support-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr => ../../go-packages/meep-data-key-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model => ../../go-packages/meep-data-model
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-gis-engine-client => ../../go-packages/meep-gis-engine-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger => ../../go-packages/meep-http-logger
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-iot-mgr => ../../go-packages/meep-iot-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics => ../../go-packages/meep-metrics
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model => ../../go-packages/meep-model
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq => ../../go-packages/meep-mq
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../go-packages/meep-redis
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client => ../../go-packages/meep-sandbox-ctrl-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client => ../../go-packages/meep-service-mgmt-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr => ../../go-packages/meep-sss-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-subscriptions => ../../go-packages/meep-subscriptions
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr => ../../go-packages/meep-swagger-api-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-websocket => ../../go-packages/meep-websocket
+)
diff --git a/go-apps/meep-iot/go.sum b/go-apps/meep-iot/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..d2eacd2e5c2eaef6bcf0775f09b7b004b9fb2d35
--- /dev/null
+++ b/go-apps/meep-iot/go.sum
@@ -0,0 +1,505 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/InterDigitalInc/AdvantEDGE v1.9.2 h1:CAcF+bn5m0Va2mHFL2lE4awU/kjuF6CjC05phiz8vnk=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52 h1:trnwuu/Q8T59kgRjXcSDBODnyZP9wes+bnLn0lx4PgM=
+github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52/go.mod h1:DdR6ymcLl8+sN/XOVNjnYO1NDYfgHskGjreZUDuQCTY=
+github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345/go.mod h1:OK4EvWJ441LQqGzed5NGB6vKBAE34n3z7iayPcEwr30=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
+github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72/go.mod h1:o+JdB7VetTHjLhU0N57x18B9voDBQe0paApdEAEoEfw=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
+github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
+github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4=
+github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
+github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
+github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
+github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU=
+github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
+github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
+github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3 h1:lBNvYUFo7d4fHs8BXUmoTzbdUo4usq6PlP5qn894sGA=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3/go.mod h1:jo59Sv6xirZtbxbaZbCtrQd1CSufmcxJZIC8hm2tepw=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM=
+github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
diff --git a/go-apps/meep-iot/main.go b/go-apps/meep-iot/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..5114ba103670fbe80ada7f2ae962c955dfbf4a87
--- /dev/null
+++ b/go-apps/meep-iot/main.go
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	"net/http"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+
+	server "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-iot/server"
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	"github.com/prometheus/client_golang/prometheus/promhttp"
+
+	"github.com/gorilla/handlers"
+)
+
+func init() {
+	// Log as JSON instead of the default ASCII formatter.
+	log.MeepJSONLogInit("meep-iot")
+}
+
+func main() {
+	log.Info(os.Args)
+
+	log.Info("Starting IOT Service")
+
+	run := true
+	go func() {
+		sigchan := make(chan os.Signal, 10)
+		signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
+		<-sigchan
+		log.Info("Program killed !")
+		// do last actions and wait for all write operations to end
+		run = false
+	}()
+
+	go func() {
+		// Initialize IOT
+		err := server.Init()
+		if err != nil {
+			log.Error("Failed to initialize IOT Service")
+			run = false
+			return
+		}
+
+		// Start IOT Event Handler thread
+		err = server.Run()
+		if err != nil {
+			log.Error("Failed to start IOT Service")
+			run = false
+			return
+		}
+
+		// Start IOT REST API Server
+		router := server.NewRouter()
+		methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST", "PUT"})
+		header := handlers.AllowedHeaders([]string{"content-type"})
+		log.Fatal(http.ListenAndServe(":80", handlers.CORS(methods, header)(router)))
+		run = false
+	}()
+
+	go func() {
+		// Initialize Metrics Endpoint
+		http.Handle("/metrics", promhttp.Handler())
+		log.Fatal(http.ListenAndServe(":9000", nil))
+		run = false
+	}()
+
+	count := 0
+	for {
+		if !run {
+			_ = server.Stop()
+			log.Info("Ran for ", count, " seconds")
+			break
+		}
+		time.Sleep(time.Second)
+		count++
+	}
+
+}
diff --git a/go-apps/meep-iot/main_test.go b/go-apps/meep-iot/main_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..d22beaff7ae32edd7ed2d8ada7495eb071b16d97
--- /dev/null
+++ b/go-apps/meep-iot/main_test.go
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	"os"
+	"strings"
+	"testing"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+// Build:
+//  $ go test -covermode=count -coverpkg=./... -c -o <name-of-your-app>
+// Run:
+//  $ ./<name-of-your-app> -test.coverprofile=cover.out __DEVEL--code-cov  <your-app-args>
+
+// TestMain is a hack that allows us to figure out what the coverage is during
+// integration tests. I would not recommend that you use a binary built using
+// this hack outside of a test suite.
+func TestMain(t *testing.T) {
+	var (
+		args []string
+		run  bool
+	)
+
+	log.Info(os.Args)
+	for _, arg := range os.Args {
+		switch {
+		case arg == "__DEVEL--code-cov":
+			run = true
+		case strings.HasPrefix(arg, "-test"):
+		case strings.HasPrefix(arg, "__DEVEL"):
+		default:
+			args = append(args, arg)
+		}
+	}
+	os.Args = args
+	log.Info(os.Args)
+
+	if run {
+		main()
+	}
+}
diff --git a/go-apps/meep-iot/sbi/iot-sbi.go b/go-apps/meep-iot/sbi/iot-sbi.go
new file mode 100644
index 0000000000000000000000000000000000000000..253f899a014901c9bd1e0491163325cf1731594f
--- /dev/null
+++ b/go-apps/meep-iot/sbi/iot-sbi.go
@@ -0,0 +1,594 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sbi
+
+import (
+	"sync"
+
+	tm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-iot-mgr"
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
+	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
+	sam "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr"
+)
+
+const moduleName string = "meep-iot-sbi"
+
+// var redisAddr string = "meep-redis-master.default.svc.cluster.local:6379"
+// var influxAddr string = "http://meep-influxdb.default.svc.cluster.local:8086"
+
+type SbiCfg struct {
+	ModuleName     string
+	SandboxName    string
+	IotBroker      string
+	IotTopic       string
+	MepName        string
+	RedisAddr      string
+	InfluxAddr     string
+	Locality       []string
+	IotNotify      func(string, string)
+	ScenarioNameCb func(string)
+	CleanUpCb      func()
+}
+
+type IotSbi struct {
+	moduleName           string
+	sandboxName          string
+	mepName              string
+	scenarioName         string
+	localityEnabled      bool
+	locality             map[string]bool
+	mqLocal              *mq.MsgQueue
+	handlerId            int
+	apiMgr               *sam.SwaggerApiMgr
+	activeModel          *mod.Model
+	iotMgr               *tm.IotMgr
+	updateScenarioNameCB func(string)
+	cleanUpCB            func()
+	mutex                sync.Mutex
+}
+
+var sbi *IotSbi
+
+type IotPlatformInfo struct {
+	IotPlatformId               string
+	UserTransportInfo           []MbTransportInfo
+	CustomServicesTransportInfo []TransportInfo
+	Enabled                     bool
+}
+
+type MbTransportInfo struct {
+	Id               string
+	Name             string
+	Description      string
+	Type_            *string
+	Protocol         string
+	Version          string
+	Endpoint         *EndPointInfo
+	Security         *SecurityInfo
+	ImplSpecificInfo *ImplSpecificInfo
+}
+
+type TransportInfo struct {
+	Id               string
+	Name             string
+	Description      string
+	Type_            *string
+	Protocol         string
+	Version          string
+	Endpoint         *EndPointInfo
+	Security         *SecurityInfo
+	ImplSpecificInfo string
+}
+
+type EndPointInfo struct {
+	Uris        []string
+	Fqdn        []string
+	Addresses   []Addresses
+	Alternative string
+}
+
+type Addresses struct {
+	Host string
+	Port int32
+}
+
+type SecurityInfo struct {
+	OAuth2Info *OAuth2Info
+	Extensions string
+}
+
+type OAuth2Info struct {
+	GrantTypes    []string
+	TokenEndpoint string
+}
+
+type ImplSpecificInfo struct {
+	EventTopics    []string
+	UplinkTopics   []string
+	DownlinkTopics []string
+}
+
+type TrafficRuleDescriptor struct {
+	TrafficRuleId string
+	FilterType    string
+	Priority      int32
+	TrafficFilter []TrafficFilter
+	Action        string
+	DstInterface  *InterfaceDescriptor
+}
+
+type InterfaceDescriptor struct {
+	InterfaceType string
+	//TunnelInfo *TunnelInfo FSCOM Not supported
+	SrcMACAddress string
+	DstMACAddress string
+	DstIPAddress  string
+}
+
+type TrafficFilter struct {
+	SrcAddress       []string
+	DstAddress       []string
+	SrcPort          []string
+	DstPort          []string
+	Protocol         []string
+	Tag              []string
+	Uri              []string
+	PacketLabel      []string
+	SrcTunnelAddress []string
+	TgtTunnelAddress []string
+	SrcTunnelPort    []string
+	DstTunnelPort    []string
+	QCI              int32
+	TC               int32
+}
+
+type KeyValuePair struct {
+	Key   string
+	Value string
+}
+
+type DeviceInfo struct {
+	DeviceAuthenticationInfo string
+	DeviceMetadata           []KeyValuePair
+	Gpsi                     string
+	Pei                      string
+	Supi                     string
+	Msisdn                   string
+	Imei                     string
+	Imsi                     string
+	Iccid                    string
+	DeviceId                 string
+	RequestedMecTrafficRule  []TrafficRuleDescriptor
+	RequestedIotPlatformId   string
+	RequestedUserTransportId string
+	//DeviceSpecificMessageFormats *DeviceSpecificMessageFormats
+	//DownlinkInfo *DownlinkInfo
+	ClientCertificate string
+	Enabled           bool
+}
+
+// Init - IOT Service SBI initialization
+func Init(cfg SbiCfg) (err error) {
+
+	// Create new SBI instance
+	if sbi != nil {
+		sbi = nil
+	}
+	sbi = new(IotSbi)
+	sbi.moduleName = cfg.ModuleName
+	sbi.sandboxName = cfg.SandboxName
+	sbi.mepName = cfg.MepName
+	sbi.scenarioName = ""
+	sbi.updateScenarioNameCB = cfg.ScenarioNameCb
+	sbi.cleanUpCB = cfg.CleanUpCb
+
+	// Fill locality map
+	if len(cfg.Locality) > 0 {
+		sbi.locality = make(map[string]bool)
+		for _, locality := range cfg.Locality {
+			sbi.locality[locality] = true
+		}
+		sbi.localityEnabled = true
+	} else {
+		sbi.localityEnabled = false
+	}
+
+	// Create message queue
+	sbi.mqLocal, err = mq.NewMsgQueue(mq.GetLocalName(sbi.sandboxName), moduleName, sbi.sandboxName, cfg.RedisAddr)
+	if err != nil {
+		log.Error("Failed to create Message Queue with error: ", err)
+		return err
+	}
+	log.Info("Message Queue created")
+
+	// Create Swagger API Manager
+	sbi.apiMgr, err = sam.NewSwaggerApiMgr(sbi.moduleName, sbi.sandboxName, sbi.mepName, sbi.mqLocal)
+	if err != nil {
+		log.Error("Failed to create Swagger API Manager. Error: ", err)
+		return err
+	}
+	log.Info("Swagger API Manager created")
+
+	// Create new active scenario model
+	modelCfg := mod.ModelCfg{
+		Name:      "activeScenario",
+		Namespace: sbi.sandboxName,
+		Module:    moduleName,
+		UpdateCb:  nil,
+		DbAddr:    cfg.RedisAddr,
+	}
+	sbi.activeModel, err = mod.NewModel(modelCfg)
+	if err != nil {
+		log.Error("Failed to create model: ", err.Error())
+		return err
+	}
+
+	// Connect to IOT Manager
+	sbi.iotMgr, err = tm.NewIotMgr(sbi.moduleName, sbi.sandboxName)
+	if err != nil {
+		log.Error("Failed connection to IOT Manager: ", err)
+		return err
+	}
+	log.Info("Connected to IOT Manager")
+
+	// Initialize service
+	processActiveScenarioUpdate()
+
+	return nil
+}
+
+// Run - MEEP IOT execution
+func Run() (err error) {
+
+	// Start Swagger API Manager (provider)
+	err = sbi.apiMgr.Start(true, false)
+	if err != nil {
+		log.Error("Failed to start Swagger API Manager with error: ", err.Error())
+		return err
+	}
+	log.Info("Swagger API Manager started")
+
+	// Add module Swagger APIs
+	err = sbi.apiMgr.AddApis()
+	if err != nil {
+		log.Error("Failed to add Swagger APIs with error: ", err.Error())
+		return err
+	}
+	log.Info("Swagger APIs successfully added")
+
+	// Register Message Queue handler
+	handler := mq.MsgHandler{Handler: msgHandler, UserData: nil}
+	sbi.handlerId, err = sbi.mqLocal.RegisterHandler(handler)
+	if err != nil {
+		log.Error("Failed to register message queue handler: ", err.Error())
+		return err
+	}
+
+	return nil
+}
+
+func Stop() (err error) {
+	if sbi == nil {
+		return
+	}
+
+	if sbi.mqLocal != nil {
+		sbi.mqLocal.UnregisterHandler(sbi.handlerId)
+	}
+
+	if sbi.apiMgr != nil {
+		// Remove APIs
+		err = sbi.apiMgr.RemoveApis()
+		if err != nil {
+			log.Error("Failed to remove APIs with err: ", err.Error())
+			return err
+		}
+	}
+
+	// Delete IOT Manager
+	if sbi.iotMgr != nil {
+		err = sbi.iotMgr.DeleteIotMgr()
+		if err != nil {
+			log.Error(err.Error())
+			return err
+		}
+	}
+
+	return nil
+}
+
+// Message Queue handler
+func msgHandler(msg *mq.Msg, userData interface{}) {
+	switch msg.Message {
+	case mq.MsgScenarioActivate:
+		log.Debug("RX MSG: ", mq.PrintMsg(msg))
+		processActiveScenarioUpdate()
+	case mq.MsgScenarioUpdate:
+		log.Debug("RX MSG: ", mq.PrintMsg(msg))
+		processActiveScenarioUpdate()
+	case mq.MsgScenarioTerminate:
+		log.Debug("RX MSG: ", mq.PrintMsg(msg))
+		processActiveScenarioTerminate()
+	default:
+		log.Trace("Ignoring unsupported message: ", mq.PrintMsg(msg))
+	}
+}
+
+func processActiveScenarioTerminate() {
+	log.Debug("processActiveScenarioTerminate")
+
+	// Sync with active scenario store
+	sbi.activeModel.UpdateScenario()
+
+	// Update scenario name
+	sbi.scenarioName = ""
+
+	sbi.cleanUpCB()
+}
+
+func processActiveScenarioUpdate() {
+	sbi.mutex.Lock()
+	defer sbi.mutex.Unlock()
+
+	log.Debug("processActiveScenarioUpdate")
+	sbi.activeModel.UpdateScenario()
+
+	// Process new scenario
+	var scenarioName = sbi.activeModel.GetScenarioName()
+	if scenarioName != sbi.scenarioName {
+		log.Info("processActiveScenarioUpdate: Entering in then")
+		// Update scenario name
+		sbi.scenarioName = scenarioName
+		sbi.updateScenarioNameCB(sbi.scenarioName)
+
+		// err := initializeIotMessageDistribution()
+		// if err != nil {
+		// 	log.Error("Failed to initialize V2X message distribution: ", err)
+		// 	return
+		// }
+	}
+}
+
+func RegisterIotPlatformInfo(iotPlatformInfo IotPlatformInfo) (responseData IotPlatformInfo, err error) {
+	log.Info(">>> RegisterIotPlatformInfo: ", iotPlatformInfo)
+
+	// Populate the list of the devices for this IoT platform
+	pltf := convertIotPlatformInfoToIotMgr(iotPlatformInfo)
+	err = sbi.iotMgr.RegisterIotPlatformInfo(pltf)
+	if err != nil {
+		return iotPlatformInfo, err
+	}
+
+	log.Info("<<< RegisterIotPlatformInfo: ", iotPlatformInfo)
+	return iotPlatformInfo, nil
+}
+
+func DeregisterIotPlatformInfo(iotPlatformId string) (err error) {
+	log.Info(">>> DeregisterIotPlatformInfo: ", iotPlatformId)
+
+	err = sbi.iotMgr.DeregisterIotPlatformInfo(iotPlatformId)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func GetDevices() (devices []DeviceInfo, err error) {
+	log.Info(">>> sbi.GetDevices")
+
+	dev, err := sbi.iotMgr.GetDevices()
+	if err != nil {
+		return nil, err
+	}
+	//log.Info("sbi.GetDevices: dev: ", dev)
+
+	devices, err = convertDeviceInfosFromIotMgr(dev)
+	if err != nil {
+		return nil, err
+	}
+	//log.Info("sbi.GetDevices: devices: ", devices)
+
+	return devices, nil
+}
+
+func GetDevice(deviceId string) (device DeviceInfo, err error) {
+	log.Info(">>> sbi.GetDevice: ", deviceId)
+
+	d, err := sbi.iotMgr.GetDevice(deviceId)
+	if err != nil {
+		return device, err
+	}
+	device = convertDeviceInfoFromIotMgr(d)
+
+	return device, nil
+}
+
+func CreateDevice(device DeviceInfo) (deviceResp DeviceInfo, err error) {
+	log.Info(">>> sbi.CreateDevice: ", device)
+
+	d := convertDeviceInfoToIotMgr(device)
+	dev, err := sbi.iotMgr.CreateDevice(d)
+	if err != nil {
+		return deviceResp, err
+	}
+	deviceResp = convertDeviceInfoFromIotMgr(dev)
+
+	return deviceResp, nil
+}
+
+func DeleteDevice(deviceId string) (err error) {
+	log.Info(">>> sbi.DeleteDevice: ", deviceId)
+
+	err = sbi.iotMgr.DeleteDevice(deviceId)
+
+	return err
+}
+
+func convertIotPlatformInfoToIotMgr(val IotPlatformInfo) (item tm.IotPlatformInfo) {
+	item.IotPlatformId = val.IotPlatformId
+	item.Enabled = val.Enabled
+	for _, userTransportInfo := range val.UserTransportInfo {
+		v := tm.MbTransportInfo{
+			Id:          userTransportInfo.Id,
+			Name:        userTransportInfo.Name,
+			Description: userTransportInfo.Description,
+			Protocol:    userTransportInfo.Protocol,
+			Version:     userTransportInfo.Version,
+		}
+		if userTransportInfo.Type_ != nil {
+			s := string(*userTransportInfo.Type_)
+			v.Type_ = &s
+		}
+		if userTransportInfo.Endpoint != nil {
+			e := tm.EndPointInfo{
+				Uris:        userTransportInfo.Endpoint.Uris,
+				Fqdn:        userTransportInfo.Endpoint.Fqdn,
+				Alternative: userTransportInfo.Endpoint.Alternative,
+			}
+			if len(userTransportInfo.Endpoint.Addresses) != 0 {
+				for _, a := range userTransportInfo.Endpoint.Addresses {
+					e.Addresses = append(e.Addresses, tm.Addresses{Host: a.Host, Port: a.Port})
+				}
+			}
+			v.Endpoint = &e
+		}
+		if userTransportInfo.Security != nil {
+			e := tm.SecurityInfo{}
+			if userTransportInfo.Security.OAuth2Info != nil {
+				e.OAuth2Info = &tm.OAuth2Info{
+					GrantTypes:    userTransportInfo.Security.OAuth2Info.GrantTypes,
+					TokenEndpoint: userTransportInfo.Security.OAuth2Info.TokenEndpoint,
+				}
+			}
+			e.Extensions = userTransportInfo.Security.Extensions
+		}
+		if userTransportInfo.ImplSpecificInfo != nil {
+			v.ImplSpecificInfo = &tm.ImplSpecificInfo{
+				EventTopics:    userTransportInfo.ImplSpecificInfo.EventTopics,
+				UplinkTopics:   userTransportInfo.ImplSpecificInfo.UplinkTopics,
+				DownlinkTopics: userTransportInfo.ImplSpecificInfo.DownlinkTopics,
+			}
+		}
+		item.UserTransportInfo = append(item.UserTransportInfo, v)
+	}
+	if val.CustomServicesTransportInfo != nil && len(val.CustomServicesTransportInfo) != 0 {
+		item.CustomServicesTransportInfo = make([]tm.TransportInfo, 0)
+		for _, customServicesTransportInfo := range val.CustomServicesTransportInfo {
+			v := tm.TransportInfo{
+				Id:          customServicesTransportInfo.Id,
+				Name:        customServicesTransportInfo.Name,
+				Description: customServicesTransportInfo.Description,
+				Protocol:    customServicesTransportInfo.Protocol,
+				Version:     customServicesTransportInfo.Version,
+			}
+			if customServicesTransportInfo.Type_ != nil {
+				s := string(*customServicesTransportInfo.Type_)
+				v.Type_ = &s
+			}
+			if customServicesTransportInfo.Endpoint != nil {
+				e := tm.EndPointInfo{
+					Uris:        customServicesTransportInfo.Endpoint.Uris,
+					Fqdn:        customServicesTransportInfo.Endpoint.Fqdn,
+					Alternative: customServicesTransportInfo.Endpoint.Alternative,
+				}
+				if len(customServicesTransportInfo.Endpoint.Addresses) != 0 {
+					for _, a := range customServicesTransportInfo.Endpoint.Addresses {
+						e.Addresses = append(e.Addresses, tm.Addresses{Host: a.Host, Port: a.Port})
+					}
+				}
+				v.Endpoint = &e
+			}
+			item.CustomServicesTransportInfo = append(item.CustomServicesTransportInfo, v)
+		}
+	}
+
+	return item
+}
+
+func convertDeviceInfoFromIotMgr(dev tm.DeviceInfo) (device DeviceInfo) {
+	//log.Debug(">>> convertDeviceInfoFromIotMgr")
+
+	device = DeviceInfo{
+		DeviceAuthenticationInfo: dev.DeviceAuthenticationInfo,
+		Gpsi:                     dev.Gpsi,
+		Pei:                      dev.Pei,
+		Supi:                     dev.Supi,
+		Msisdn:                   dev.Msisdn,
+		Imei:                     dev.Imei,
+		Imsi:                     dev.Imsi,
+		Iccid:                    dev.Iccid,
+		DeviceId:                 dev.DeviceId,
+		RequestedIotPlatformId:   dev.RequestedIotPlatformId,
+		RequestedUserTransportId: dev.RequestedUserTransportId,
+		ClientCertificate:        dev.ClientCertificate,
+		Enabled:                  dev.Enabled,
+	}
+	if len(dev.DeviceMetadata) != 0 {
+		device.DeviceMetadata = make([]KeyValuePair, len(dev.DeviceMetadata))
+		for i, k := range dev.DeviceMetadata {
+			device.DeviceMetadata[i] = KeyValuePair{Key: k.Key, Value: k.Value}
+		} // End of 'for' statement
+	}
+	// FIXME FSCOM Add missing fileds (pointers & arrays)
+	//log.Debug("convertDeviceInfoFromIotMgr: device: ", device)
+
+	return device
+}
+
+func convertDeviceInfosFromIotMgr(devicesList []tm.DeviceInfo) (devices []DeviceInfo, err error) {
+	//log.Debug(">>> convertDeviceInfosFromIotMgr")
+
+	devices = make([]DeviceInfo, len(devicesList))
+	for idx, item := range devicesList { // FIXME FSCOM Add Filter
+		devices[idx] = convertDeviceInfoFromIotMgr(item)
+	} // End of 'for' statement
+	//log.Debug("convertDeviceInfosFromIotMgr: devices: ", devices)
+
+	return devices, nil
+}
+
+func convertDeviceInfoToIotMgr(dev DeviceInfo) (device tm.DeviceInfo) {
+	//log.Debug(">>> convertDeviceInfoToIotMgr")
+
+	device = tm.DeviceInfo{
+		DeviceAuthenticationInfo: dev.DeviceAuthenticationInfo,
+		Gpsi:                     dev.Gpsi,
+		Pei:                      dev.Pei,
+		Supi:                     dev.Supi,
+		Msisdn:                   dev.Msisdn,
+		Imei:                     dev.Imei,
+		Imsi:                     dev.Imsi,
+		Iccid:                    dev.Iccid,
+		DeviceId:                 dev.DeviceId,
+		RequestedIotPlatformId:   dev.RequestedIotPlatformId,
+		RequestedUserTransportId: dev.RequestedUserTransportId,
+		ClientCertificate:        dev.ClientCertificate,
+		Enabled:                  dev.Enabled,
+	}
+	if len(dev.DeviceMetadata) != 0 {
+		device.DeviceMetadata = make([]tm.KeyValuePair, len(dev.DeviceMetadata))
+		for i, k := range dev.DeviceMetadata {
+			device.DeviceMetadata[i] = tm.KeyValuePair{Key: k.Key, Value: k.Value}
+		} // End of 'for' statement
+	}
+	// FIXME FSCOM Add missing fileds (pointers & arrays)
+	//log.Debug("convertDeviceInfoToIotMgr: device: ", device)
+
+	return device
+}
diff --git a/go-apps/meep-iot/server/README.md b/go-apps/meep-iot/server/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..4d8c6c8948cce43f69dd022acba0b5725075cb71
--- /dev/null
+++ b/go-apps/meep-iot/server/README.md
@@ -0,0 +1,26 @@
+# Go API Server for swagger
+
+ETSI GS MEC 033 IoT API described using OpenAPI.
+
+## Overview
+This server was generated by the [swagger-codegen]
+(https://github.com/swagger-api/swagger-codegen) project.  
+By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.  
+-
+
+To see how to make this your own, look here:
+
+[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md)
+
+- API version: 3.1.1
+- Build date: 2024-07-25T09:23:34.815Z[Etc/UTC]
+For more information, please visit [https://forge.etsi.org/rep/mec/gs021-amsi-api](https://forge.etsi.org/rep/mec/gs021-amsi-api)
+
+
+### Running the server
+To run the server, follow these simple steps:
+
+```
+go run main.go
+```
+
diff --git a/go-apps/meep-iot/server/api_reg_dev.go b/go-apps/meep-iot/server/api_reg_dev.go
new file mode 100644
index 0000000000000000000000000000000000000000..599ca9f6185331dde56076312bc87c7a7d8beaee
--- /dev/null
+++ b/go-apps/meep-iot/server/api_reg_dev.go
@@ -0,0 +1,34 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func RegistereddevicesByIdDELETE(w http.ResponseWriter, r *http.Request) {
+	registereddevicesByIdDELETE(w, r)
+}
+
+func RegistereddevicesByIdGET(w http.ResponseWriter, r *http.Request) {
+	registereddevicesByIdGET(w, r)
+}
+
+func RegistereddevicesByIdPUT(w http.ResponseWriter, r *http.Request) {
+	registereddevicesByIdPUT(w, r)
+}
+
+func RegistereddevicesGET(w http.ResponseWriter, r *http.Request) {
+	registereddevicesGET(w, r)
+}
+
+func RegistereddevicesPOST(w http.ResponseWriter, r *http.Request) {
+	registereddevicesPOST(w, r)
+}
diff --git a/go-apps/meep-iot/server/api_reg_iot_plat.go b/go-apps/meep-iot/server/api_reg_iot_plat.go
new file mode 100644
index 0000000000000000000000000000000000000000..22aa38777a73e740079626314b622068aa290aa0
--- /dev/null
+++ b/go-apps/meep-iot/server/api_reg_iot_plat.go
@@ -0,0 +1,38 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func Mec011AppTerminationPOST(w http.ResponseWriter, r *http.Request) {
+	mec011AppTerminationPost(w, r)
+}
+
+func RegisterediotplatformsByIdDELETE(w http.ResponseWriter, r *http.Request) {
+	registerediotplatformsByIdDELETE(w, r)
+}
+
+func RegisterediotplatformsByIdGET(w http.ResponseWriter, r *http.Request) {
+	registerediotplatformsByIdGET(w, r)
+}
+
+func RegisterediotplatformsByIdPUT(w http.ResponseWriter, r *http.Request) {
+	registerediotplatformsByIdPUT(w, r)
+}
+
+func RegisterediotplatformsGET(w http.ResponseWriter, r *http.Request) {
+	registerediotplatformsGET(w, r)
+}
+
+func RegisterediotplatformsPOST(w http.ResponseWriter, r *http.Request) {
+	registerediotplatformsPOST(w, r)
+}
diff --git a/go-apps/meep-iot/server/convert.go b/go-apps/meep-iot/server/convert.go
new file mode 100644
index 0000000000000000000000000000000000000000..b9d95d88d3af8e664bbaef50d03fc9faf2324fca
--- /dev/null
+++ b/go-apps/meep-iot/server/convert.go
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server
+
+import (
+	"encoding/json"
+	//"fmt"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+func convertProblemDetailstoJson(probdetails *ProblemDetails) string {
+	jsonInfo, err := json.Marshal(*probdetails)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
+
+func convertIoTPlatformInfotoJson(ioTPlatformInfo *IotPlatformInfo) string {
+	jsonInfo, err := json.Marshal(*ioTPlatformInfo)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
diff --git a/go-apps/meep-iot/server/logger.go b/go-apps/meep-iot/server/logger.go
new file mode 100644
index 0000000000000000000000000000000000000000..9fb28ab2b19133a0a1b3122cbce6db90cc0b9d59
--- /dev/null
+++ b/go-apps/meep-iot/server/logger.go
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/) <p>[Copyright (c) ETSI 2024](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-iot](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-iot) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+	"time"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+func Logger(inner http.Handler, name string) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		start := time.Now()
+
+		inner.ServeHTTP(w, r)
+
+		log.Debug(
+			r.Method, " ",
+			r.RequestURI, " ",
+			name, " ",
+			time.Since(start),
+		)
+	})
+}
diff --git a/go-apps/meep-iot/server/meep-iot.go b/go-apps/meep-iot/server/meep-iot.go
new file mode 100644
index 0000000000000000000000000000000000000000..aee94cfe55def0901b910fed01ab262d8de7ddac
--- /dev/null
+++ b/go-apps/meep-iot/server/meep-iot.go
@@ -0,0 +1,1291 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"os"
+	"strconv"
+	"strings"
+	"time"
+
+	sbi "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-iot/sbi"
+	asc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client"
+	dkm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr"
+	httpLog "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger"
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
+	scc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client"
+	smc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client"
+	"github.com/gorilla/mux"
+	//uuid "github.com/google/uuid"
+)
+
+const moduleName = "meep-iot"
+const iotBasePath = "iots/v1/"
+const iotKey = "iot"
+
+const serviceName = "IOT Service"
+const serviceCategory = "IOT"
+const defaultMepName = "global"
+const defaultScopeOfLocality = "MEC_SYSTEM"
+const defaultConsumedLocalOnly = true
+const appTerminationPath = "notifications/mec011/appTermination"
+
+var redisAddr string = "meep-redis-master.default.svc.cluster.local:6379"
+var influxAddr string = "http://meep-influxdb.default.svc.cluster.local:8086"
+var sbxCtrlUrl string = "http://meep-sandbox-ctrl"
+
+var currentStoreName = ""
+
+var IOT_DB = 0
+
+var rc *redis.Connector
+var hostUrl *url.URL
+var instanceId string
+var instanceName string
+var sandboxName string
+var mepName string = defaultMepName
+var scopeOfLocality string = defaultScopeOfLocality
+var consumedLocalOnly bool = defaultConsumedLocalOnly
+var locality []string
+var basePath string
+var baseKey string
+
+const serviceAppVersion = "3.1.1"
+
+var serviceAppInstanceId string
+
+var appEnablementUrl string
+var appEnablementEnabled bool
+var sendAppTerminationWhenDone bool = false
+var appTermSubId string
+var appEnablementServiceId string
+var appSupportClient *asc.APIClient
+var svcMgmtClient *smc.APIClient
+var sbxCtrlClient *scc.APIClient
+
+var registrationTicker *time.Ticker
+
+var registeredIotPlatformsMap = map[string]sbi.IotPlatformInfo{} // List of discovered IOT Plateform
+
+var validParams = []string{"deviceMetadata", "gpsi", "msisdn", "deviceId", "requestedMecTrafficRule", "requestedIotPlatformId", "requestedUserTransportId"}
+var visitedFilter = map[string]bool{ // ETSI GS MEC 033 V3.1.1 (2022-12) Clause 7.3.3.1 GET
+	"deviceMetadata":           false,
+	"gpsi":                     false,
+	"msisdn":                   false,
+	"deviceId":                 false,
+	"requestedMecTrafficRule":  false,
+	"requestedIotPlatformId":   false,
+	"requestedUserTransportId": false,
+}
+var visitedOp = map[string]bool{ // ETSI GS MEC 009 V3.3.1 (2024-02) Clause 6.19.2 Resource definition(s) and HTTP methods
+	"eq":    false,
+	"neq":   false,
+	"gt":    false,
+	"lt":    false,
+	"gte":   false,
+	"lte":   false,
+	"in":    false,
+	"nin":   false,
+	"cont":  false,
+	"ncont": false,
+}
+
+func getAppInstanceId() (id string, err error) {
+	var appInfo scc.ApplicationInfo
+	appInfo.Id = instanceId
+	appInfo.Name = serviceCategory
+	appInfo.Type_ = "SYSTEM"
+	appInfo.NodeName = mepName
+	if mepName == defaultMepName {
+		appInfo.Persist = true
+	} else {
+		appInfo.Persist = false
+	}
+	response, _, err := sbxCtrlClient.ApplicationsApi.ApplicationsPOST(context.TODO(), appInfo)
+	if err != nil {
+		log.Error("Failed to get App Instance ID with error: ", err)
+		return "", err
+	}
+	return response.Id, nil
+}
+
+func deregisterService(appInstanceId string, serviceId string) error {
+	_, err := svcMgmtClient.MecServiceMgmtApi.AppServicesServiceIdDELETE(context.TODO(), appInstanceId, serviceId)
+	if err != nil {
+		log.Error("Failed to unregister the service to app enablement registry: ", err)
+		return err
+	}
+	return nil
+}
+
+func registerService(appInstanceId string) error {
+	// Build Service Info
+	state := smc.ACTIVE_ServiceState
+	serializer := smc.JSON_SerializerType
+	transportType := smc.REST_HTTP_TransportType
+	localityType := smc.LocalityType(scopeOfLocality)
+	srvInfo := smc.ServiceInfo{
+		SerName:           instanceName,
+		Version:           serviceAppVersion,
+		State:             &state,
+		Serializer:        &serializer,
+		ScopeOfLocality:   &localityType,
+		ConsumedLocalOnly: consumedLocalOnly,
+		TransportInfo: &smc.TransportInfo{
+			Id:       "sandboxTransport",
+			Name:     "REST",
+			Type_:    &transportType,
+			Protocol: "HTTP",
+			Version:  "2.0",
+			Endpoint: &smc.OneOfTransportInfoEndpoint{},
+		},
+		SerCategory: &smc.CategoryRef{
+			Href:    "catalogueHref",
+			Id:      "iotId",
+			Name:    serviceCategory,
+			Version: "v1",
+		},
+	}
+	srvInfo.TransportInfo.Endpoint.Uris = append(srvInfo.TransportInfo.Endpoint.Uris, hostUrl.String()+basePath)
+
+	appServicesPostResponse, _, err := svcMgmtClient.MecServiceMgmtApi.AppServicesPOST(context.TODO(), srvInfo, appInstanceId)
+	if err != nil {
+		log.Error("Failed to register the service to app enablement registry: ", err)
+		return err
+	}
+	log.Info("Application Enablement Service instance Id: ", appServicesPostResponse.SerInstanceId)
+	appEnablementServiceId = appServicesPostResponse.SerInstanceId
+	return nil
+}
+
+func sendReadyConfirmation(appInstanceId string) error {
+	var appReady asc.AppReadyConfirmation
+	appReady.Indication = "READY"
+	_, err := appSupportClient.MecAppSupportApi.ApplicationsConfirmReadyPOST(context.TODO(), appReady, appInstanceId)
+	if err != nil {
+		log.Error("Failed to send a ready confirm acknowlegement: ", err)
+		return err
+	}
+	return nil
+}
+
+func sendTerminationConfirmation(appInstanceId string) error {
+	var appTermination asc.AppTerminationConfirmation
+	operationAction := asc.TERMINATING_OperationActionType
+	appTermination.OperationAction = &operationAction
+	_, err := appSupportClient.MecAppSupportApi.ApplicationsConfirmTerminationPOST(context.TODO(), appTermination, appInstanceId)
+	if err != nil {
+		log.Error("Failed to send a confirm termination acknowlegement: ", err)
+		return err
+	}
+	return nil
+}
+
+func subscribeAppTermination(appInstanceId string) error {
+	var sub asc.AppTerminationNotificationSubscription
+	sub.SubscriptionType = "AppTerminationNotificationSubscription"
+	sub.AppInstanceId = appInstanceId
+	if mepName == defaultMepName {
+		sub.CallbackReference = "http://" + moduleName + "/" + iotBasePath + appTerminationPath
+	} else {
+		sub.CallbackReference = "http://" + mepName + "-" + moduleName + "/" + iotBasePath + appTerminationPath
+	}
+	subscription, _, err := appSupportClient.MecAppSupportApi.ApplicationsSubscriptionsPOST(context.TODO(), sub, appInstanceId)
+	if err != nil {
+		log.Error("Failed to register to App Support subscription: ", err)
+		return err
+	}
+	appTermSubLink := subscription.Links.Self.Href
+	appTermSubId = appTermSubLink[strings.LastIndex(appTermSubLink, "/")+1:]
+	return nil
+}
+
+func unsubscribeAppTermination(appInstanceId string, subId string) error {
+	//only subscribe to one subscription, so we force number to be one, couldn't be anything else
+	_, err := appSupportClient.MecAppSupportApi.ApplicationsSubscriptionDELETE(context.TODO(), appInstanceId, subId)
+	if err != nil {
+		log.Error("Failed to unregister to App Support subscription: ", err)
+		return err
+	}
+	return nil
+}
+
+func mec011AppTerminationPost(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	var notification AppTerminationNotification
+	decoder := json.NewDecoder(r.Body)
+	err := decoder.Decode(&notification)
+	if err != nil {
+		log.Error(err.Error())
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	if !appEnablementEnabled {
+		//just ignore the message
+		w.WriteHeader(http.StatusNoContent)
+		return
+	}
+
+	go func() {
+		// Wait to allow app termination response to be sent
+		time.Sleep(20 * time.Millisecond)
+
+		// Deregister service
+		_ = deregisterService(serviceAppInstanceId, appEnablementServiceId)
+
+		// Delete subscriptions
+		_ = unsubscribeAppTermination(serviceAppInstanceId, appTermSubId)
+
+		// Confirm App termination if necessary
+		if sendAppTerminationWhenDone {
+			_ = sendTerminationConfirmation(serviceAppInstanceId)
+		}
+	}()
+
+	w.WriteHeader(http.StatusNoContent)
+}
+
+// Init - IOT Service initialization
+func Init() (err error) {
+
+	// Retrieve Instance ID from environment variable if present
+	instanceIdEnv := strings.TrimSpace(os.Getenv("MEEP_INSTANCE_ID"))
+	if instanceIdEnv != "" {
+		instanceId = instanceIdEnv
+	}
+	log.Info("MEEP_INSTANCE_ID: ", instanceId)
+
+	// Retrieve Instance Name from environment variable
+	instanceName = moduleName
+	instanceNameEnv := strings.TrimSpace(os.Getenv("MEEP_POD_NAME"))
+	if instanceNameEnv != "" {
+		instanceName = instanceNameEnv
+	}
+	log.Info("MEEP_POD_NAME: ", instanceName)
+
+	// Retrieve Sandbox name from environment variable
+	sandboxNameEnv := strings.TrimSpace(os.Getenv("MEEP_SANDBOX_NAME"))
+	if sandboxNameEnv != "" {
+		sandboxName = sandboxNameEnv
+	}
+	if sandboxName == "" {
+		err = errors.New("MEEP_SANDBOX_NAME env variable not set")
+		log.Error(err.Error())
+		return err
+	}
+	log.Info("MEEP_SANDBOX_NAME: ", sandboxName)
+
+	// hostUrl is the url of the node serving the resourceURL
+	// Retrieve public url address where service is reachable, if not present, use Host URL environment variable
+	hostUrl, err = url.Parse(strings.TrimSpace(os.Getenv("MEEP_PUBLIC_URL")))
+	if err != nil || hostUrl == nil || hostUrl.String() == "" {
+		hostUrl, err = url.Parse(strings.TrimSpace(os.Getenv("MEEP_HOST_URL")))
+		if err != nil {
+			hostUrl = new(url.URL)
+		}
+	}
+	log.Info("MEEP_HOST_URL: ", hostUrl)
+
+	// Get MEP name
+	mepNameEnv := strings.TrimSpace(os.Getenv("MEEP_MEP_NAME"))
+	if mepNameEnv != "" {
+		mepName = mepNameEnv
+	}
+	log.Info("MEEP_MEP_NAME: ", mepName)
+
+	// Get App Enablement URL
+	appEnablementEnabled = false
+	appEnablementEnv := strings.TrimSpace(os.Getenv("MEEP_APP_ENABLEMENT"))
+	if appEnablementEnv != "" {
+		appEnablementUrl = "http://" + appEnablementEnv
+		appEnablementEnabled = true
+	}
+	log.Info("MEEP_APP_ENABLEMENT: ", appEnablementUrl)
+
+	// Get scope of locality
+	scopeOfLocalityEnv := strings.TrimSpace(os.Getenv("MEEP_SCOPE_OF_LOCALITY"))
+	if scopeOfLocalityEnv != "" {
+		scopeOfLocality = scopeOfLocalityEnv
+	}
+	log.Info("MEEP_SCOPE_OF_LOCALITY: ", scopeOfLocality)
+
+	// Get local consumption
+	consumedLocalOnlyEnv := strings.TrimSpace(os.Getenv("MEEP_CONSUMED_LOCAL_ONLY"))
+	if consumedLocalOnlyEnv != "" {
+		value, err := strconv.ParseBool(consumedLocalOnlyEnv)
+		if err == nil {
+			consumedLocalOnly = value
+		}
+	}
+	log.Info("MEEP_CONSUMED_LOCAL_ONLY: ", consumedLocalOnly)
+
+	// Get locality
+	localityEnv := strings.TrimSpace(os.Getenv("MEEP_LOCALITY"))
+	if localityEnv != "" {
+		locality = strings.Split(localityEnv, ":")
+	}
+	log.Info("MEEP_LOCALITY: ", locality)
+
+	// Set base path
+	if mepName == defaultMepName {
+		basePath = "/" + sandboxName + "/" + iotBasePath
+	} else {
+		basePath = "/" + sandboxName + "/" + mepName + "/" + iotBasePath
+	}
+
+	// Set base storage key
+	baseKey = dkm.GetKeyRoot(sandboxName) + iotKey + ":mep:" + mepName + ":"
+
+	// Connect to Redis DB (IOT_DB)
+	rc, err = redis.NewConnector(redisAddr, IOT_DB)
+	if err != nil {
+		log.Error("Failed connection to Redis DB (IOT_DB). Error: ", err)
+		return err
+	}
+	_ = rc.DBFlush(baseKey)
+	log.Info("Connected to Redis DB, IOT service table")
+
+	// Initialize SBI
+	sbiCfg := sbi.SbiCfg{
+		ModuleName:     moduleName,
+		SandboxName:    sandboxName,
+		RedisAddr:      redisAddr,
+		Locality:       locality,
+		ScenarioNameCb: updateStoreName,
+		CleanUpCb:      cleanUp,
+	}
+	if mepName != defaultMepName {
+		sbiCfg.MepName = mepName
+	}
+	err = sbi.Init(sbiCfg)
+	if err != nil {
+		log.Error("Failed initialize SBI. Error: ", err)
+		return err
+	}
+	log.Info("SBI Initialized")
+
+	// Create App Enablement REST clients
+	if appEnablementEnabled {
+		// Create Sandbox Controller client
+		sbxCtrlClientCfg := scc.NewConfiguration()
+		sbxCtrlClientCfg.BasePath = sbxCtrlUrl + "/sandbox-ctrl/v1"
+		sbxCtrlClient = scc.NewAPIClient(sbxCtrlClientCfg)
+		if sbxCtrlClient == nil {
+			return errors.New("Failed to create Sandbox Controller REST API client")
+		}
+		log.Info("Create Sandbox Controller REST API client")
+
+		// Create App Support client
+		appSupportClientCfg := asc.NewConfiguration()
+		appSupportClientCfg.BasePath = appEnablementUrl + "/mec_app_support/v2"
+		appSupportClient = asc.NewAPIClient(appSupportClientCfg)
+		if appSupportClient == nil {
+			return errors.New("Failed to create App Enablement App Support REST API client")
+		}
+		log.Info("Create App Enablement App Support REST API client")
+
+		// Create App Info client
+		srvMgmtClientCfg := smc.NewConfiguration()
+		srvMgmtClientCfg.BasePath = appEnablementUrl + "/mec_service_mgmt/v1"
+		svcMgmtClient = smc.NewAPIClient(srvMgmtClientCfg)
+		if svcMgmtClient == nil {
+			return errors.New("Failed to create App Enablement Service Management REST API client")
+		}
+		log.Info("Create App Enablement Service Management REST API client")
+	}
+
+	log.Info("IOT successfully initialized")
+	return nil
+}
+
+// Run - Start IOT
+func Run() (err error) {
+	// Start MEC Service registration ticker
+	if appEnablementEnabled {
+		startRegistrationTicker()
+	}
+	return sbi.Run()
+}
+
+// Stop - Stop IOT
+func Stop() (err error) {
+	// Stop MEC Service registration ticker
+	if appEnablementEnabled {
+		stopRegistrationTicker()
+	}
+	return sbi.Stop()
+}
+
+func startRegistrationTicker() {
+	// Make sure ticker is not running
+	if registrationTicker != nil {
+		log.Warn("Registration ticker already running")
+		return
+	}
+
+	// Wait a few seconds to allow App Enablement Service to start.
+	// This is done to avoid the default 20 second TCP socket connect timeout
+	// if the App Enablement Service is not yet running.
+	log.Info("Waiting for App Enablement Service to start")
+	time.Sleep(5 * time.Second)
+
+	// Start registration ticker
+	registrationTicker = time.NewTicker(5 * time.Second)
+	go func() {
+		mecAppReadySent := false
+		registrationSent := false
+		subscriptionSent := false
+		for range registrationTicker.C {
+			// Get Application instance ID
+			if serviceAppInstanceId == "" {
+				// If a sandbox service, request an app instance ID from Sandbox Controller
+				// Otherwise use the scenario-proiotioned instance ID
+				if mepName == defaultMepName {
+					var err error
+					serviceAppInstanceId, err = getAppInstanceId()
+					if err != nil || serviceAppInstanceId == "" {
+						continue
+					}
+				} else {
+					serviceAppInstanceId = instanceId
+				}
+			}
+
+			// Send App Ready message
+			if !mecAppReadySent {
+				err := sendReadyConfirmation(serviceAppInstanceId)
+				if err != nil {
+					log.Error("Failure when sending the MecAppReady message. Error: ", err)
+					continue
+				}
+				mecAppReadySent = true
+			}
+
+			// Register service instance
+			if !registrationSent {
+				err := registerService(serviceAppInstanceId)
+				if err != nil {
+					log.Error("Failed to register to appEnablement DB, keep trying. Error: ", err)
+					continue
+				}
+				registrationSent = true
+			}
+
+			// Register for graceful termination
+			if !subscriptionSent {
+				err := subscribeAppTermination(serviceAppInstanceId)
+				if err != nil {
+					log.Error("Failed to subscribe to graceful termination. Error: ", err)
+					continue
+				}
+				sendAppTerminationWhenDone = true
+				subscriptionSent = true
+			}
+
+			if mecAppReadySent && registrationSent && subscriptionSent {
+
+				// Registration complete
+				log.Info("Successfully registered with App Enablement Service")
+				stopRegistrationTicker()
+				return
+			}
+		}
+	}()
+}
+
+func stopRegistrationTicker() {
+	if registrationTicker != nil {
+		log.Info("Stopping App Enablement registration ticker")
+		registrationTicker.Stop()
+		registrationTicker = nil
+	}
+}
+
+func cleanUp() {
+	log.Info("Terminate all")
+
+	// Flush all service data
+	rc.DBFlush(baseKey)
+
+	// Reset metrics store name
+	updateStoreName("")
+}
+
+func updateStoreName(storeName string) {
+	log.Debug(">>> updateStoreName: ", storeName)
+
+	if currentStoreName != storeName {
+		currentStoreName = storeName
+
+		logComponent := moduleName
+		if mepName != defaultMepName {
+			logComponent = moduleName + "-" + mepName
+		}
+		err := httpLog.ReInit(logComponent, sandboxName, storeName, redisAddr, influxAddr)
+		if err != nil {
+			log.Error("Failed to initialise httpLog: ", err)
+			return
+		}
+	}
+}
+
+/*
+ * errHandlerProblemDetails sends an error message
+ * @param {struct} HTTP write reference
+ * @param {string} error contains the error message
+ * @param {int} code contains the error code
+ */
+func errHandlerProblemDetails(w http.ResponseWriter, error string, code int) {
+	var pb ProblemDetails
+	pb.Detail = error
+	pb.Status = int32(code)
+
+	jsonResponse := convertProblemDetailstoJson(&pb)
+
+	w.WriteHeader(code)
+	fmt.Fprint(w, jsonResponse)
+}
+
+func registerediotplatformsByIdDELETE(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registerediotplatformsByIdDELETE: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	vars := mux.Vars(r)
+	log.Debug("registerediotplatformsByIdDELETE: vars: ", vars)
+
+	iotPlatformIdParamStr := vars["registeredIotPlatformId"]
+	log.Debug("registerediotplatformsByIdDELETE: iotPlatformIdParamStr: ", iotPlatformIdParamStr)
+
+	if _, ok := registeredIotPlatformsMap[iotPlatformIdParamStr]; !ok {
+		err := errors.New("Unknown iotPlatformId: " + iotPlatformIdParamStr)
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+
+	err := sbi.DeregisterIotPlatformInfo(iotPlatformIdParamStr)
+	if err != nil {
+		log.Error("Failed to de-register IotPlatformInfo: ", err)
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	log.Info("De-registration succeed")
+
+	delete(registeredIotPlatformsMap, iotPlatformIdParamStr)
+
+	w.WriteHeader(http.StatusNoContent)
+}
+
+func registerediotplatformsByIdGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registerediotplatformsByIdGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	vars := mux.Vars(r)
+	log.Debug("registerediotplatformsByIdGET: vars: ", vars)
+	iotPlatformIdParamStr := vars["registeredIotPlatformId"]
+	log.Debug("systeminfoByIdGET: registerediotplatformsByIdGET: ", iotPlatformIdParamStr)
+
+	// Validate query parameters
+	u, _ := url.Parse(r.URL.String())
+	q := u.Query()
+	err := validateQueryParams(q, validParams)
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	userTransportInfo := q["userTransportInfo"]
+	log.Debug("systeminfoByIdGET: userTransportInfo: ", userTransportInfo)
+	customServiceTransportInfo := q["customServiceTransportInfo"]
+	log.Debug("systeminfoByIdGET: customServiceTransportInfo: ", customServiceTransportInfo)
+	noFilter := len(userTransportInfo) == 0 && len(customServiceTransportInfo) == 0
+	log.Debug("systeminfoByIdGET: noFilter: ", noFilter)
+
+	val, ok := registeredIotPlatformsMap[iotPlatformIdParamStr]
+	if len(registeredIotPlatformsMap) == 0 || !ok {
+		w.WriteHeader(http.StatusNotFound)
+	} else {
+		var iotPlatformInfo IotPlatformInfo
+		if noFilter {
+			iotPlatformInfo = convertIotPlatformInfoFromSbi(val)
+		} else {
+			// FIXME FSCOM To be done
+			http.Error(w, "Filtering not implemented yet", http.StatusNotImplemented)
+			return
+		}
+		jsonResponse, err := json.Marshal(iotPlatformInfo)
+		if err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		fmt.Fprint(w, string(jsonResponse))
+		w.WriteHeader(http.StatusOK)
+	}
+}
+
+func registerediotplatformsByIdPUT(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registerediotplatformsByIdPUT: ", r)
+
+	// FIXME FSCOM Todo
+	errHandlerProblemDetails(w, "Not implemented yet", http.StatusBadRequest)
+}
+
+func registerediotplatformsGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registerediotplatformsGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Validate query parameters
+	u, _ := url.Parse(r.URL.String())
+	q := u.Query()
+	validParams := []string{"iotPlatformId", "enabled"}
+	err := validateQueryParams(q, validParams)
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	iotPlatformId := q.Get("iotPlatformId")
+	enabled := q.Get("enabled")
+	noFilter := iotPlatformId == "" && enabled == ""
+	log.Debug("registerediotplatformsGET: noFilter: ", noFilter)
+
+	log.Debug("registerediotplatformsGET: len(registeredIotPlatformsMap): ", len(registeredIotPlatformsMap))
+	if len(registeredIotPlatformsMap) == 0 {
+		w.WriteHeader(http.StatusNotFound)
+	} else {
+		l := []sbi.IotPlatformInfo{}
+		for _, val := range registeredIotPlatformsMap {
+			if noFilter {
+				l = append(l, val)
+			} else if iotPlatformId != "" && val.IotPlatformId == iotPlatformId || enabled != "" && strconv.FormatBool(val.Enabled) == enabled {
+				l = append(l, val)
+			} // else skip this item
+		}
+		log.Debug("registerediotplatformsGET: len(l): ", len(l))
+		if len(l) == 0 {
+			w.WriteHeader(http.StatusNotFound)
+			return
+		}
+		var iotPlatformInfos = []IotPlatformInfo{}
+		for _, val := range l {
+			item := convertIotPlatformInfoFromSbi(val)
+			iotPlatformInfos = append(iotPlatformInfos, item)
+		}
+		jsonResponse, err := json.Marshal(iotPlatformInfos)
+		if err != nil {
+			http.Error(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		fmt.Fprint(w, string(jsonResponse))
+		w.WriteHeader(http.StatusOK)
+	}
+}
+
+func registerediotplatformsPOST(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registerediotplatformsPOST: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	var requestData IotPlatformInfo
+	decoder := json.NewDecoder(r.Body)
+	err := decoder.Decode(&requestData)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	log.Debug("registerediotplatformsPOST: requestData: ", requestData)
+
+	// Validating mandatory parameters in request
+	if requestData.IotPlatformId == "" {
+		log.Error("Mandatory iotPlatformId parameter shall be absent")
+		errHandlerProblemDetails(w, "Mandatory attribute iotPlatformId shall be present in the request body.", http.StatusBadRequest)
+		return
+	}
+
+	if len(requestData.UserTransportInfo) == 0 {
+		log.Error("Mandatory UserTransportInfo parameter not present")
+		errHandlerProblemDetails(w, "Mandatory attribute UserTransportInfo is missing in the request body.", http.StatusBadRequest)
+		return
+	} else {
+		for _, v := range requestData.UserTransportInfo {
+			if v.Id == "" {
+				log.Error("Mandatory Id parameter shall be absent")
+				errHandlerProblemDetails(w, "Mandatory attribute Id shall be absent in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.Name == "" {
+				log.Error("Mandatory Name parameter shall be absent")
+				errHandlerProblemDetails(w, "Mandatory attribute Name shall be absent in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.Type_ == nil || *v.Type_ != "MB_TOPIC_BASED" {
+				log.Error("Mandatory Type_ parameter shall be set to MB_TOPIC_BASED")
+				errHandlerProblemDetails(w, "Mandatory attribute Type_ shall be set to MB_TOPIC_BASED in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.Protocol != "MQTT" && v.Protocol != "AMQP" {
+				log.Error("Mandatory Protocol parameter shall be set to MQTT or AMQP")
+				errHandlerProblemDetails(w, "Mandatory attribute Protocol shall be set to MQTT or AMQP in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.Version == "" {
+				log.Error("Mandatory Version parameter shall be present")
+				errHandlerProblemDetails(w, "Mandatory attribute Version shall be present in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.Endpoint == nil {
+				log.Error("Mandatory Endpoint parameter shall be present")
+				errHandlerProblemDetails(w, "Mandatory attribute Endpoint shall be present in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.Security == nil {
+				log.Error("Mandatory Security parameter shall be present")
+				errHandlerProblemDetails(w, "Mandatory attribute Security shall be present in the request body.", http.StatusBadRequest)
+				return
+			}
+			if v.ImplSpecificInfo == nil {
+				log.Error("Mandatory ImplSpecificInfo parameter shall be present")
+				errHandlerProblemDetails(w, "Mandatory attribute ImplSpecificInfo shall be present in the request body.", http.StatusBadRequest)
+				return
+			}
+		}
+	}
+
+	if requestData.CustomServicesTransportInfo == nil || len(requestData.CustomServicesTransportInfo) == 0 {
+		log.Error("No information to register IoT platform")
+		errHandlerProblemDetails(w, "No information to register IoT platform.", http.StatusInternalServerError)
+		return
+	}
+
+	_, ok := registeredIotPlatformsMap[requestData.IotPlatformId]
+	if ok {
+		log.Error("IoT platform already created")
+		errHandlerProblemDetails(w, "IoT platform already created.", http.StatusBadRequest)
+		return
+	}
+
+	// Populate registeredIotPlatformsMap
+	s := convertIotPlatformInfoToSbi(requestData)
+	responseData, err := sbi.RegisterIotPlatformInfo(s)
+	if err != nil {
+		log.Error("Failed to register IotPlatformInfo: ", err)
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	registeredIotPlatformsMap[responseData.IotPlatformId] = responseData
+	log.Debug("registerediotplatformsPOST: new registeredIotPlatformsMap: ", registeredIotPlatformsMap)
+
+	// Prepare & send response
+	c := convertIotPlatformInfoFromSbi(responseData)
+	jsonResponse := convertIoTPlatformInfotoJson(&c)
+	w.WriteHeader(http.StatusCreated)
+	fmt.Fprint(w, jsonResponse)
+}
+
+func registereddevicesByIdDELETE(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registereddevicesByIdDELETE: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	vars := mux.Vars(r)
+	log.Debug("registereddevicesByIdDELETE: vars: ", vars)
+
+	registeredDeviceIdParamStr := vars["registeredDeviceId"]
+	log.Debug("registereddevicesByIdDELETE: registeredDeviceIdParamStr: ", registeredDeviceIdParamStr)
+
+	err := sbi.DeleteDevice(registeredDeviceIdParamStr)
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+
+	w.WriteHeader(http.StatusNoContent)
+}
+
+func registereddevicesByIdGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registereddevicesByIdGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	vars := mux.Vars(r)
+	log.Debug("registereddevicesByIdGET: vars: ", vars)
+
+	registeredDeviceIdParamStr := vars["registeredDeviceId"]
+	log.Debug("registereddevicesByIdGET: registeredDeviceIdParamStr: ", registeredDeviceIdParamStr)
+
+	device, err := sbi.GetDevice(registeredDeviceIdParamStr)
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+	d := convertDeviceInfoFromSbi(device)
+	log.Debug("registereddevicesByIdGET: d=", d)
+
+	// Prepare & send the response
+	jsonResponse, err := json.Marshal(d)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Debug("registereddevicesByIdGET: jsonResponse=", string(jsonResponse))
+	fmt.Fprint(w, string(jsonResponse))
+	w.WriteHeader(http.StatusOK)
+}
+
+func registereddevicesByIdPUT(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registereddevicesByIdPUT: ", r)
+
+	errHandlerProblemDetails(w, "Not implemented yet", http.StatusBadRequest)
+}
+
+func registereddevicesGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registereddevicesGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Validate query parameters
+	u, _ := url.Parse(r.URL.String())
+	q := u.Query()
+	log.Debug("registereddevicesGET: q=", q)
+	validParams := []string{"filter"}
+	err := validateQueryParams(q, validParams)
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	filter, err := validateFilter(q["filter"], validParams)
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+
+	devicesList, err := sbi.GetDevices()
+	if err != nil {
+		log.Error("registereddevicesGET: ", err)
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Debug("registereddevicesGET: devicesList=", devicesList)
+	if len(devicesList) == 0 {
+		w.WriteHeader(http.StatusNotFound)
+		return
+	}
+	var devices []DeviceInfo
+	if len(filter) == 0 {
+		devices, err = convertDeviceInfosFromSbi(devicesList)
+	} else {
+		devices, err = applyFiltering(devicesList, filter)
+	}
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	if len(devices) == 0 {
+		w.WriteHeader(http.StatusNotFound)
+		return
+	}
+
+	// Prepare & send the response
+	jsonResponse, err := json.Marshal(devices)
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Debug("registereddevicesGET: jsonResponse=", string(jsonResponse))
+	fmt.Fprint(w, string(jsonResponse))
+	w.WriteHeader(http.StatusOK)
+}
+func applyFiltering(devicesList []sbi.DeviceInfo, filter []string) (devices []DeviceInfo, err error) {
+	log.Debug(">>> applyFiltering")
+	devices, err = convertDeviceInfosFromSbi_with_filter(devicesList, filter)
+	log.Debug("After applyFiltering: devices: ", devices)
+	return devices, err
+}
+
+func registereddevicesPOST(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> registereddevicesPOST: ", r)
+
+	// Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes
+	var deviceInfo DeviceInfo
+	bodyBytes, _ := ioutil.ReadAll(r.Body)
+	// Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType
+	err := json.Unmarshal(bodyBytes, &deviceInfo)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Info("registereddevicesPOST: ", deviceInfo)
+
+	// Sanity checks
+	if len(deviceInfo.DeviceId) == 0 {
+		err = errors.New("DeviceId field shall be present")
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	if len(deviceInfo.RequestedMecTrafficRule) == 0 {
+		if len(deviceInfo.RequestedIotPlatformId) == 0 && len(deviceInfo.RequestedUserTransportId) == 0 {
+			err = errors.New("Invalid traffic rule provided")
+			errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+			return
+		}
+		// Traffic rule provided by either RequestedIotPlatformId or RequestedUserTransportId
+	} // else Traffic rule provided by RequestedMecTrafficRule
+
+	// Process the request
+	dev := convertDeviceInfoToSbi(deviceInfo)
+	deviceInfoResp, err := sbi.CreateDevice(dev)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Info("registereddevicesPOST: deviceInfoResp: ", deviceInfoResp)
+
+	jsonResponse, err := json.Marshal(deviceInfoResp)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Info("registereddevicesPOST: jsonResponse: ", string(jsonResponse))
+
+	w.WriteHeader(http.StatusCreated)
+	fmt.Fprint(w, string(jsonResponse))
+}
+
+func validateQueryParams(params url.Values, validParams []string) error {
+	for param := range params {
+		found := false
+		for _, validParam := range validParams {
+			if param == validParam {
+				found = true
+				break
+			}
+		}
+		if !found {
+			err := errors.New("Invalid query param: " + param)
+			log.Error(err.Error())
+			return err
+		}
+	}
+	return nil
+}
+
+func validateFilter(filter []string, validParams []string) (f []string, err error) {
+	log.Debug(">>> validateFilter: ", filter)
+
+	for _, val := range filter {
+		log.Debug("validateFilter: Processing ", val)
+		val := strings.Trim(val, "()")
+		f = strings.Split(val, ",")
+		if len(f) != 3 {
+			return nil, errors.New("validateFilter: Invalid filter structure: " + val)
+		}
+		if _, ok := visitedOp[f[0]]; !ok {
+			return nil, errors.New("validateFilter: Invalid filter operator value: " + f[0])
+		}
+		if _, ok := visitedFilter[f[1]]; !ok {
+			return nil, errors.New("validateFilter: Invalid filter field value: " + f[1])
+		}
+	} // End of 'for' statement
+
+	return f, nil
+}
+
+func convertIotPlatformInfoFromSbi(val sbi.IotPlatformInfo) (item IotPlatformInfo) {
+	item.IotPlatformId = val.IotPlatformId
+	item.Enabled = val.Enabled
+
+	for _, userTransportInfo := range val.UserTransportInfo {
+		v := MbTransportInfo{
+			Id:          userTransportInfo.Id,
+			Name:        userTransportInfo.Name,
+			Description: userTransportInfo.Description,
+			Protocol:    userTransportInfo.Protocol,
+			Version:     userTransportInfo.Version,
+		}
+		if userTransportInfo.Type_ != nil {
+			s := TransportType(*userTransportInfo.Type_)
+			v.Type_ = &s
+		}
+		if userTransportInfo.Endpoint != nil {
+			e := EndPointInfo{
+				Uris:        userTransportInfo.Endpoint.Uris,
+				Fqdn:        userTransportInfo.Endpoint.Fqdn,
+				Alternative: userTransportInfo.Endpoint.Alternative,
+			}
+			if len(userTransportInfo.Endpoint.Addresses) != 0 {
+				for _, a := range userTransportInfo.Endpoint.Addresses {
+					e.Addresses = append(e.Addresses, Addresses{Host: a.Host, Port: a.Port})
+				}
+			}
+			v.Endpoint = &e
+		}
+		if userTransportInfo.Security != nil {
+			e := SecurityInfo{}
+			if userTransportInfo.Security.OAuth2Info != nil {
+				e.OAuth2Info = &OAuth2Info{
+					GrantTypes:    userTransportInfo.Security.OAuth2Info.GrantTypes,
+					TokenEndpoint: userTransportInfo.Security.OAuth2Info.TokenEndpoint,
+				}
+			}
+			e.Extensions = userTransportInfo.Security.Extensions
+		}
+		if userTransportInfo.ImplSpecificInfo != nil {
+			v.ImplSpecificInfo = &ImplSpecificInfo{
+				EventTopics:    userTransportInfo.ImplSpecificInfo.EventTopics,
+				UplinkTopics:   userTransportInfo.ImplSpecificInfo.UplinkTopics,
+				DownlinkTopics: userTransportInfo.ImplSpecificInfo.DownlinkTopics,
+			}
+		}
+		item.UserTransportInfo = append(item.UserTransportInfo, v)
+	}
+	if val.CustomServicesTransportInfo != nil && len(val.CustomServicesTransportInfo) != 0 {
+		item.CustomServicesTransportInfo = make([]TransportInfo, 0)
+		for _, customServicesTransportInfo := range val.CustomServicesTransportInfo {
+			v := TransportInfo{
+				Id:          customServicesTransportInfo.Id,
+				Name:        customServicesTransportInfo.Name,
+				Description: customServicesTransportInfo.Description,
+				Protocol:    customServicesTransportInfo.Protocol,
+				Version:     customServicesTransportInfo.Version,
+			}
+			if customServicesTransportInfo.Type_ != nil {
+				s := TransportType(*customServicesTransportInfo.Type_)
+				v.Type_ = &s
+			}
+			if customServicesTransportInfo.Endpoint != nil {
+				e := EndPointInfo{
+					Uris:        customServicesTransportInfo.Endpoint.Uris,
+					Fqdn:        customServicesTransportInfo.Endpoint.Fqdn,
+					Alternative: customServicesTransportInfo.Endpoint.Alternative,
+				}
+				if len(customServicesTransportInfo.Endpoint.Addresses) != 0 {
+					for _, a := range customServicesTransportInfo.Endpoint.Addresses {
+						e.Addresses = append(e.Addresses, Addresses{Host: a.Host, Port: a.Port})
+					}
+				}
+				v.Endpoint = &e
+			}
+			item.CustomServicesTransportInfo = append(item.CustomServicesTransportInfo, v)
+		}
+	}
+
+	return item
+}
+
+func convertIotPlatformInfoToSbi(val IotPlatformInfo) (item sbi.IotPlatformInfo) {
+	item.IotPlatformId = val.IotPlatformId
+	item.Enabled = val.Enabled
+	for _, userTransportInfo := range val.UserTransportInfo {
+		v := sbi.MbTransportInfo{
+			Id:          userTransportInfo.Id,
+			Name:        userTransportInfo.Name,
+			Description: userTransportInfo.Description,
+			Protocol:    userTransportInfo.Protocol,
+			Version:     userTransportInfo.Version,
+		}
+		if userTransportInfo.Type_ != nil {
+			s := string(*userTransportInfo.Type_)
+			v.Type_ = &s
+		}
+		if userTransportInfo.Endpoint != nil {
+			e := sbi.EndPointInfo{
+				Uris:        userTransportInfo.Endpoint.Uris,
+				Fqdn:        userTransportInfo.Endpoint.Fqdn,
+				Alternative: userTransportInfo.Endpoint.Alternative,
+			}
+			if len(userTransportInfo.Endpoint.Addresses) != 0 {
+				for _, a := range userTransportInfo.Endpoint.Addresses {
+					e.Addresses = append(e.Addresses, sbi.Addresses{Host: a.Host, Port: a.Port})
+				}
+			}
+			v.Endpoint = &e
+		}
+		if userTransportInfo.Security != nil {
+			e := sbi.SecurityInfo{}
+			if userTransportInfo.Security.OAuth2Info != nil {
+				e.OAuth2Info = &sbi.OAuth2Info{
+					GrantTypes:    userTransportInfo.Security.OAuth2Info.GrantTypes,
+					TokenEndpoint: userTransportInfo.Security.OAuth2Info.TokenEndpoint,
+				}
+			}
+			e.Extensions = userTransportInfo.Security.Extensions
+		}
+		if userTransportInfo.ImplSpecificInfo != nil {
+			v.ImplSpecificInfo = &sbi.ImplSpecificInfo{
+				EventTopics:    userTransportInfo.ImplSpecificInfo.EventTopics,
+				UplinkTopics:   userTransportInfo.ImplSpecificInfo.UplinkTopics,
+				DownlinkTopics: userTransportInfo.ImplSpecificInfo.DownlinkTopics,
+			}
+		}
+		item.UserTransportInfo = append(item.UserTransportInfo, v)
+	}
+	if val.CustomServicesTransportInfo != nil && len(val.CustomServicesTransportInfo) != 0 {
+		item.CustomServicesTransportInfo = make([]sbi.TransportInfo, 0)
+		for _, customServicesTransportInfo := range val.CustomServicesTransportInfo {
+			v := sbi.TransportInfo{
+				Id:          customServicesTransportInfo.Id,
+				Name:        customServicesTransportInfo.Name,
+				Description: customServicesTransportInfo.Description,
+				Protocol:    customServicesTransportInfo.Protocol,
+				Version:     customServicesTransportInfo.Version,
+			}
+			if customServicesTransportInfo.Type_ != nil {
+				s := string(*customServicesTransportInfo.Type_)
+				v.Type_ = &s
+			}
+			if customServicesTransportInfo.Endpoint != nil {
+				e := sbi.EndPointInfo{
+					Uris:        customServicesTransportInfo.Endpoint.Uris,
+					Fqdn:        customServicesTransportInfo.Endpoint.Fqdn,
+					Alternative: customServicesTransportInfo.Endpoint.Alternative,
+				}
+				if len(customServicesTransportInfo.Endpoint.Addresses) != 0 {
+					for _, a := range customServicesTransportInfo.Endpoint.Addresses {
+						e.Addresses = append(e.Addresses, sbi.Addresses{Host: a.Host, Port: a.Port})
+					}
+				}
+				v.Endpoint = &e
+			}
+			item.CustomServicesTransportInfo = append(item.CustomServicesTransportInfo, v)
+		}
+	}
+
+	return item
+}
+
+func convertDeviceInfoFromSbi(dev sbi.DeviceInfo) (device DeviceInfo) {
+	device = DeviceInfo{
+		DeviceAuthenticationInfo: dev.DeviceAuthenticationInfo,
+		Gpsi:                     dev.Gpsi,
+		Pei:                      dev.Pei,
+		Supi:                     dev.Supi,
+		Msisdn:                   dev.Msisdn,
+		Imei:                     dev.Imei,
+		Imsi:                     dev.Imsi,
+		Iccid:                    dev.Iccid,
+		DeviceId:                 dev.DeviceId,
+		RequestedIotPlatformId:   dev.RequestedIotPlatformId,
+		RequestedUserTransportId: dev.RequestedUserTransportId,
+		ClientCertificate:        dev.ClientCertificate,
+		Enabled:                  dev.Enabled,
+	}
+	if len(dev.DeviceMetadata) != 0 {
+		device.DeviceMetadata = make([]KeyValuePair, len(dev.DeviceMetadata))
+		for i, k := range dev.DeviceMetadata {
+			device.DeviceMetadata[i] = KeyValuePair{Key: k.Key, Value: k.Value}
+		} // End of 'for' statement
+	}
+	// FIXME FSCOM Add missing fileds (pointers & arrays)
+	//log.Debug("convertDeviceInfosFromSbi: devices: ", devices)
+
+	return device
+}
+
+func convertDeviceInfosFromSbi(devicesList []sbi.DeviceInfo) (devices []DeviceInfo, err error) {
+	devices = make([]DeviceInfo, len(devicesList))
+	for idx, item := range devicesList { // FIXME FSCOM Add Filter
+		devices[idx] = convertDeviceInfoFromSbi(item)
+	} // End of 'for' statement
+	//log.Debug("convertDeviceInfosFromSbi: devices: ", devices)
+
+	return devices, nil
+}
+
+func convertDeviceInfosFromSbi_with_filter(devicesList []sbi.DeviceInfo, filter []string) (devices []DeviceInfo, err error) {
+	log.Debug(">>> convertDeviceInfosFromSbi_with_filter: ", filter)
+
+	devices = make([]DeviceInfo, 0)
+	for _, item := range devicesList { // FIXME FSCOM Add Filter
+		process_it := false
+		if filter[0] == "eq" { // E.g. [eq requestedUserTransportId 4ba6bf28-a748-4b35-aba6-d882a70c4337]
+			if filter[1] == "gpsi" {
+				process_it = item.Gpsi == filter[2]
+			} else if filter[1] == "Msisdn" {
+				process_it = item.Gpsi == filter[2]
+			} else if filter[1] == "deviceId" {
+				process_it = item.DeviceId == filter[2]
+			} else if filter[1] == "requestedIotPlatformId" {
+				process_it = item.RequestedIotPlatformId == filter[2]
+			} else if filter[1] == "requestedUserTransportId" {
+				process_it = item.RequestedUserTransportId == filter[2]
+			} // FIXME FSCOM Add support of deviceMetadata & requestedMecTrafficRule
+		} else if filter[0] == "neq" {
+			if filter[1] == "gpsi" {
+				process_it = item.Gpsi != filter[2]
+			} else if filter[1] == "Msisdn" {
+				process_it = item.Gpsi != filter[2]
+			} else if filter[1] == "deviceId" {
+				process_it = item.DeviceId != filter[2]
+			} else if filter[1] == "requestedIotPlatformId" {
+				process_it = item.RequestedIotPlatformId != filter[2]
+			} else if filter[1] == "requestedUserTransportId" {
+				process_it = item.RequestedUserTransportId != filter[2]
+			} // FIXME FSCOM Add support of deviceMetadata & requestedMecTrafficRule
+		}
+		if process_it {
+			devices = append(devices, convertDeviceInfoFromSbi(item))
+		} else {
+			log.Debug("convertDeviceInfosFromSbi_with_filter: skip ", item)
+		}
+	} // End of 'for' statement
+	//log.Debug("convertDeviceInfosFromSbi_with_filter: devices: ", devices)
+
+	return devices, nil
+}
+
+func convertDeviceInfoToSbi(dev DeviceInfo) (device sbi.DeviceInfo) {
+	device = sbi.DeviceInfo{
+		DeviceAuthenticationInfo: dev.DeviceAuthenticationInfo,
+		Gpsi:                     dev.Gpsi,
+		Pei:                      dev.Pei,
+		Supi:                     dev.Supi,
+		Msisdn:                   dev.Msisdn,
+		Imei:                     dev.Imei,
+		Imsi:                     dev.Imsi,
+		Iccid:                    dev.Iccid,
+		DeviceId:                 dev.DeviceId,
+		RequestedIotPlatformId:   dev.RequestedIotPlatformId,
+		RequestedUserTransportId: dev.RequestedUserTransportId,
+		ClientCertificate:        dev.ClientCertificate,
+		Enabled:                  dev.Enabled,
+	}
+	if len(dev.DeviceMetadata) != 0 {
+		device.DeviceMetadata = make([]sbi.KeyValuePair, len(dev.DeviceMetadata))
+		for i, k := range dev.DeviceMetadata {
+			device.DeviceMetadata[i] = sbi.KeyValuePair{Key: k.Key, Value: k.Value}
+		} // End of 'for' statement
+	}
+	// FIXME FSCOM Add missing fileds (pointers & arrays)
+	//log.Debug("convertDeviceInfoToSbi: devices: ", devices)
+
+	return device
+}
diff --git a/go-apps/meep-iot/server/meep-iot_test.go b/go-apps/meep-iot/server/meep-iot_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..cc73e383efd5f450da8556a70b1781f1d33a7acd
--- /dev/null
+++ b/go-apps/meep-iot/server/meep-iot_test.go
@@ -0,0 +1,2021 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on ance "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/http/httptest"
+	"os"
+	"strings"
+	"testing"
+	"time"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	//	met "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics"
+	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
+	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
+
+	"github.com/gorilla/mux"
+)
+
+const testScenario string = `
+{
+    "version":"1.5.3",
+    "name":"test-scenario",
+    "deployment":{
+        "netChar":{
+            "latency":50,
+            "latencyVariation":5,
+            "throughputDl":1000,
+            "throughputUl":1000
+        },
+        "domains":[
+            {
+                "id":"PUBLIC",
+                "name":"PUBLIC",
+                "type":"PUBLIC",
+                "netChar":{
+                    "latency":6,
+                    "latencyVariation":2,
+                    "throughputDl":1000000,
+                    "throughputUl":1000000
+                },
+                "zones":[
+                    {
+                        "id":"PUBLIC-COMMON",
+                        "name":"PUBLIC-COMMON",
+                        "type":"COMMON",
+                        "netChar":{
+                            "latency":5,
+                            "latencyVariation":1,
+                            "throughput":1000000
+                        },
+                        "networkLocations":[
+                            {
+                                "id":"PUBLIC-COMMON-DEFAULT",
+                                "name":"PUBLIC-COMMON-DEFAULT",
+                                "type":"DEFAULT",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":50000,
+                                    "throughputUl":50000,
+                                    "packetLoss":1
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "id":"4da82f2d-1f44-4945-8fe7-00c0431ef8c7",
+                "name":"operator-cell1",
+                "type":"OPERATOR-CELLULAR",
+                "netChar":{
+                    "latency":6,
+                    "latencyVariation":2,
+                    "throughputDl":1000,
+                    "throughputUl":1000
+                },
+                "cellularDomainConfig":{
+                    "mnc":"456",
+                    "mcc":"123",
+                    "defaultCellId":"1234567"
+                },
+                "zones":[
+                    {
+                        "id":"operator-cell1-COMMON",
+                        "name":"operator-cell1-COMMON",
+                        "type":"COMMON",
+                        "netChar":{
+                            "latency":5,
+                            "latencyVariation":1,
+                            "throughput":1000
+                        },
+                        "networkLocations":[
+                            {
+                                "id":"operator-cell1-COMMON-DEFAULT",
+                                "name":"operator-cell1-COMMON-DEFAULT",
+                                "type":"DEFAULT",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                }
+                            }
+                        ]
+                    },
+                    {
+                        "id":"0836975f-a7ea-41ec-b0e0-aff43178194d",
+                        "name":"zone1",
+                        "type":"ZONE",
+                        "netChar":{
+                            "latency":5,
+                            "latencyVariation":1,
+                            "throughput":1000
+                        },
+                        "networkLocations":[
+                            {
+                                "id":"zone1-DEFAULT",
+                                "name":"zone1-DEFAULT",
+                                "type":"DEFAULT",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                },
+                                "physicalLocations":[
+                                    {
+                                        "id":"97b80da7-a74a-4649-bb61-f7fa4fbb2d76",
+                                        "name":"zone1-edge1",
+                                        "type":"EDGE",
+                                        "connected":true,
+                                        "processes":[
+                                            {
+                                                "id":"fcf1269c-a061-448e-aa80-6dd9c2d4c548",
+                                                "name":"zone1-edge1-iperf",
+                                                "type":"EDGE-APP",
+                                                "image":"meep-docker-registry:30001/iperf-server",
+                                                "commandArguments":"-c, export; iperf -s -p $IPERF_SERVICE_PORT",
+                                                "commandExe":"/bin/bash",
+                                                "serviceConfig":{
+                                                    "name":"zone1-edge1-iperf",
+                                                    "meSvcName":"iperf",
+                                                    "ports":[
+                                                        {
+                                                            "protocol":"UDP",
+                                                            "port":80
+                                                        }
+                                                    ]
+                                                },
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            },
+                                            {
+                                                "id":"35697e68-c627-4b8d-9cd7-ad8b8e226aee",
+                                                "name":"zone1-edge1-svc",
+                                                "type":"EDGE-APP",
+                                                "image":"meep-docker-registry:30001/demo-server",
+                                                "environment":"MGM_GROUP_NAME=svc, MGM_APP_ID=zone1-edge1-svc, MGM_APP_PORT=80",
+                                                "serviceConfig":{
+                                                    "name":"zone1-edge1-svc",
+                                                    "meSvcName":"svc",
+                                                    "ports":[
+                                                        {
+                                                            "protocol":"TCP",
+                                                            "port":80
+                                                        }
+                                                    ]
+                                                },
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            }
+                                        ],
+                                        "netChar":{
+                                            "throughputDl":1000,
+                                            "throughputUl":1000
+                                        }
+                                    }
+                                ]
+                            },
+                            {
+                                "id":"7a6f8077-b0b3-403d-b954-3351e21afeb7",
+                                "name":"zone1-poa-cell1",
+                                "type":"POA-4G",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                },
+                                "poa4GConfig":{
+                                    "cellId":"2345678"
+                                },
+								"geoData": {
+									"location": {
+										"type": "Point",
+											"coordinates": [
+												7.423547,
+												43.731724
+									]
+									},
+									"radius": 400,
+									"path": null,
+									"eopMode": null,
+									"velocity": null
+								},
+								"physicalLocations":[
+                                    {
+                                        "id":"32a2ced4-a262-49a8-8503-8489a94386a2",
+                                        "name":"ue1",
+                                        "type":"UE",
+                                        "connected":true,
+                                        "wireless":true,
+                                        "processes":[
+                                            {
+                                                "id":"9bdd6acd-f6e4-44f6-a26c-8fd9abd338a7",
+                                                "name":"ue1-iperf",
+                                                "type":"UE-APP",
+                                                "image":"meep-docker-registry:30001/iperf-client",
+                                                "commandArguments":"-c, export; iperf -u -c $IPERF_SERVICE_HOST -p $IPERF_SERVICE_PORT\n-t 3600 -b 50M;",
+                                                "commandExe":"/bin/bash",
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            }
+                                        ],
+                                        "netChar":{
+                                            "throughputDl":1000,
+                                            "throughputUl":1000
+                                        }
+                                    },
+                                    {
+                                        "id":"b1851da5-c9e1-4bd8-ad23-5925c82ee127",
+                                        "name":"zone1-fog1",
+                                        "type":"FOG",
+                                        "connected":true,
+                                        "processes":[
+                                            {
+                                                "id":"c2f2fb5d-4053-4cee-a0ee-e62bbb7751b6",
+                                                "name":"zone1-fog1-iperf",
+                                                "type":"EDGE-APP",
+                                                "image":"meep-docker-registry:30001/iperf-server",
+                                                "commandArguments":"-c, export; iperf -s -p $IPERF_SERVICE_PORT;",
+                                                "commandExe":"/bin/bash",
+                                                "serviceConfig":{
+                                                    "name":"zone1-fog1-iperf",
+                                                    "meSvcName":"iperf",
+                                                    "ports":[
+                                                        {
+                                                            "protocol":"UDP",
+                                                            "port":80
+                                                        }
+                                                    ]
+                                                },
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            },
+                                            {
+                                                "id":"53b5806b-e213-4c5a-a181-f1c31c24287b",
+                                                "name":"zone1-fog1-svc",
+                                                "type":"EDGE-APP",
+                                                "image":"meep-docker-registry:30001/demo-server",
+                                                "environment":"MGM_GROUP_NAME=svc, MGM_APP_ID=zone1-fog1-svc, MGM_APP_PORT=80",
+                                                "serviceConfig":{
+                                                    "name":"zone1-fog1-svc",
+                                                    "meSvcName":"svc",
+                                                    "ports":[
+                                                        {
+                                                            "protocol":"TCP",
+                                                            "port":80
+                                                        }
+                                                    ]
+                                                },
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            }
+                                        ],
+                                        "netChar":{
+                                            "throughputDl":1000,
+                                            "throughputUl":1000
+                                        }
+                                    }
+                                ]
+                            },
+                            {
+                                "id":"7ff90180-2c1a-4c11-b59a-3608c5d8d874",
+                                "name":"zone1-poa-cell2",
+                                "type":"POA-4G",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                },
+                                "poa4GConfig":{
+                                    "cellId":"3456789"
+                                },
+								"geoData": {
+									"location": {
+									"type": "Point",
+									"coordinates": [
+										7.423547,
+										43.731724
+									]
+									},
+									"radius": 400,
+									"path": null,
+									"eopMode": null,
+									"velocity": null
+								}
+							}
+                        ]
+                    },
+                    {
+                        "id":"d1f06b00-4454-4d35-94a5-b573888e7ea9",
+                        "name":"zone2",
+                        "type":"ZONE",
+                        "netChar":{
+                            "latency":5,
+                            "latencyVariation":1,
+                            "throughput":1000
+                        },
+                        "networkLocations":[
+                            {
+                                "id":"zone2-DEFAULT",
+                                "name":"zone2-DEFAULT",
+                                "type":"DEFAULT",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                },
+                                "physicalLocations":[
+                                    {
+                                        "id":"fb130d18-fd81-43e0-900c-c584e7190302",
+                                        "name":"zone2-edge1",
+                                        "type":"EDGE",
+                                        "connected":true,
+                                        "processes":[
+                                            {
+                                                "id":"5c8276ba-0b78-429d-a0bf-d96f35ba2c77",
+                                                "name":"zone2-edge1-iperf",
+                                                "type":"EDGE-APP",
+                                                "image":"meep-docker-registry:30001/iperf-server",
+                                                "commandArguments":"-c, export; iperf -s -p $IPERF_SERVICE_PORT;",
+                                                "commandExe":"/bin/bash",
+                                                "serviceConfig":{
+                                                    "name":"zone2-edge1-iperf",
+                                                    "meSvcName":"iperf",
+                                                    "ports":[
+                                                        {
+                                                            "protocol":"UDP",
+                                                            "port":80
+                                                        }
+                                                    ]
+                                                },
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            },
+                                            {
+                                                "id":"53fa28f0-80e2-414c-8841-86db9bd37d51",
+                                                "name":"zone2-edge1-svc",
+                                                "type":"EDGE-APP",
+                                                "image":"meep-docker-registry:30001/demo-server",
+                                                "environment":"MGM_GROUP_NAME=svc, MGM_APP_ID=zone2-edge1-svc, MGM_APP_PORT=80",
+                                                "serviceConfig":{
+                                                    "name":"zone2-edge1-svc",
+                                                    "meSvcName":"svc",
+                                                    "ports":[
+                                                        {
+                                                            "protocol":"TCP",
+                                                            "port":80
+                                                        }
+                                                    ]
+                                                },
+                                                "netChar":{
+                                                    "throughputDl":1000,
+                                                    "throughputUl":1000
+                                                }
+                                            }
+                                        ],
+                                        "netChar":{
+                                            "throughputDl":1000,
+                                            "throughputUl":1000
+                                        }
+                                    }
+                                ]
+                            },
+                            {
+                                "id":"c44b8937-58af-44b2-acdb-e4d1c4a1510b",
+                                "name":"zone2-poa1",
+                                "type":"POA",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":20,
+                                    "throughputUl":20
+                                }
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "id":"e29138fb-cf03-4372-8335-fd2665b77a11",
+                "name":"operator1",
+                "type":"OPERATOR",
+                "netChar":{
+                    "latency":6,
+                    "latencyVariation":2,
+                    "throughputDl":1000,
+                    "throughputUl":1000
+                },
+                "zones":[
+                    {
+                        "id":"operator1-COMMON",
+                        "name":"operator1-COMMON",
+                        "type":"COMMON",
+                        "netChar":{
+                            "latency":5,
+                            "latencyVariation":1,
+                            "throughputDl":1000,
+                            "throughputUl":1000
+                        },
+                        "networkLocations":[
+                            {
+                                "id":"operator1-COMMON-DEFAULT",
+                                "name":"operator1-COMMON-DEFAULT",
+                                "type":"DEFAULT",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                }
+                            }
+                        ]
+                    },
+                    {
+                        "id":"7d8bee73-6d5c-4c5a-a3a0-49ebe3cd2c71",
+                        "name":"zone3",
+                        "type":"ZONE",
+                        "netChar":{
+                            "latency":5,
+                            "latencyVariation":1,
+                            "throughputDl":1000,
+                            "throughputUl":1000
+                        },
+                        "networkLocations":[
+                            {
+                                "id":"zone3-DEFAULT",
+                                "name":"zone3-DEFAULT",
+                                "type":"DEFAULT",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                }
+                            },
+                            {
+                                "id":"ecc2a41b-7381-4108-a037-52862c520733",
+                                "name":"poa1",
+                                "type":"POA",
+                                "netChar":{
+                                    "latency":1,
+                                    "latencyVariation":1,
+                                    "throughputDl":1000,
+                                    "throughputUl":1000
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    }
+}
+`
+
+const redisTestAddr = "localhost:30380"
+const influxTestAddr = "http://localhost:30986"
+const testScenarioName = "testScenario"
+
+var m *mod.Model
+var mqLocal *mq.MsgQueue
+
+func TestRegisterediotplatformsPOST(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	var expected_adresses = []Addresses{}
+	expected_adresses = append(expected_adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var expected_endpoint = EndPointInfo{
+		Addresses: expected_adresses,
+	}
+	var expected_userTransportInfo = []MbTransportInfo{}
+	//var mb_transportInfo TransportType
+	mb_transportInfo := MB_TOPIC_BASED
+	var security = SecurityInfo{}
+	var implSpecificInfo = ImplSpecificInfo{}
+	expected_userTransportInfo = append(expected_userTransportInfo, MbTransportInfo{
+		Id:               "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:             "MQTT",
+		Type_:            &mb_transportInfo,
+		Description:      "MQTT",
+		Protocol:         "MQTT",
+		Version:          "2",
+		Endpoint:         &expected_endpoint,
+		Security:         &security,
+		ImplSpecificInfo: &implSpecificInfo,
+	})
+	var expected_adresses_1 = []Addresses{}
+	expected_adresses_1 = append(expected_adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var expected_customServicesTransportInfo = []TransportInfo{}
+	var expected_endPointInfo_1 = EndPointInfo{
+		Addresses: expected_adresses_1,
+	}
+	//var transportInfo TransportType
+	transportInfo := REST_HTTP
+	expected_customServicesTransportInfo = append(expected_customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Type_:       &transportInfo,
+		Description: "ACME oneM2M CSE",
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &expected_endPointInfo_1,
+		Security:    &security,
+	})
+	var expected_iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           expected_userTransportInfo,
+		CustomServicesTransportInfo: expected_customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", expected_iotPlatformInfo)
+	expected_iotPlatformInfo_str, err := json.Marshal(expected_iotPlatformInfo)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("expected_iotPlatformInfo: ", string(expected_iotPlatformInfo_str))
+
+	/******************************
+	 * request body section
+	 ******************************/
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{
+		Id:               "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:             "MQTT",
+		Description:      "MQTT",
+		Type_:            &mb_transportInfo,
+		Protocol:         "MQTT",
+		Version:          "2",
+		Endpoint:         &endpoint,
+		Security:         &security,
+		ImplSpecificInfo: &implSpecificInfo,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Type_:       &transportInfo,
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+		Security:    &security,
+	})
+	var iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	body, err := json.Marshal(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("body: ", string(body))
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodPost, "/registered_iot_platforms", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, RegisterediotplatformsPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp IotPlatformInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if !validate_iot_platform_info(resp, iotPlatformInfo) {
+		t.Errorf("handler returned unexpected body: got %v want %v", rr, expected_iotPlatformInfo_str)
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_registered_iot_platforms(resp.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegisterediotplatformsPOSTFail_1(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+
+	/******************************
+	 * request body section
+	 ******************************/
+	//var mb_transportInfo TransportType
+	mb_transportInfo := MB_TOPIC_BASED
+	//var transportInfo TransportType
+	transportInfo := REST_HTTP
+	//var security = SecurityInfo{} // Missing Security
+	var implSpecificInfo = ImplSpecificInfo{}
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{ // Missing Security
+		Id:               "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:             "MQTT",
+		Description:      "MQTT",
+		Type_:            &mb_transportInfo,
+		Protocol:         "MQTT",
+		Version:          "2",
+		Endpoint:         &endpoint,
+		ImplSpecificInfo: &implSpecificInfo,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Type_:       &transportInfo,
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+	})
+	var iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	body, err := json.Marshal(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("body: ", string(body))
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodPost, "/registered_iot_platforms", bytes.NewBuffer(body), nil, nil, nil, http.StatusBadRequest, RegisterediotplatformsPOST)
+	if err != nil {
+		t.Fatalf("Shall received 400 Bad Request due to Security missing field")
+	}
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	terminateScenario()
+}
+
+func TestRegisterediotplatformsPOSTFail_2(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+
+	/******************************
+	 * request body section
+	 ******************************/
+	//var mb_transportInfo TransportType
+	mb_transportInfo := MB_TOPIC_BASED
+	//var transportInfo TransportType
+	transportInfo := REST_HTTP
+	var security = SecurityInfo{}
+	//var implSpecificInfo = ImplSpecificInfo{} // Missing ImplSpecificInfo
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{ // Missing ImplSpecificInfo
+		Id:          "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:        "MQTT",
+		Description: "MQTT",
+		Type_:       &mb_transportInfo,
+		Protocol:    "MQTT",
+		Version:     "2",
+		Endpoint:    &endpoint,
+		Security:    &security,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Type_:       &transportInfo,
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+		Security:    &security,
+	})
+	var iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	body, err := json.Marshal(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("body: ", string(body))
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodPost, "/registered_iot_platforms", bytes.NewBuffer(body), nil, nil, nil, http.StatusBadRequest, RegisterediotplatformsPOST)
+	if err != nil {
+		t.Fatalf("Shall received 400 Bad Request due to ImplSpecificInfo missing field")
+	}
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	terminateScenario()
+}
+
+func TestRegisterediotplatformsPOSTFail_3(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+
+	/******************************
+	 * request body section
+	 ******************************/
+	//mb_transportInfo := MB_TOPIC_BASED // Missing TransportType
+	transportInfo := REST_HTTP
+	var security = SecurityInfo{}
+	var implSpecificInfo = ImplSpecificInfo{}
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{ // Missing TransportType
+		Id:               "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:             "MQTT",
+		Description:      "MQTT",
+		Protocol:         "MQTT",
+		Version:          "2",
+		Endpoint:         &endpoint,
+		Security:         &security,
+		ImplSpecificInfo: &implSpecificInfo,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Type_:       &transportInfo,
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+		Security:    &security,
+	})
+	var iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	body, err := json.Marshal(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("body: ", string(body))
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodPost, "/registered_iot_platforms", bytes.NewBuffer(body), nil, nil, nil, http.StatusBadRequest, RegisterediotplatformsPOST)
+	if err != nil {
+		t.Fatalf("Shall received 400 Bad Request due to TransportType missing field")
+	}
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	terminateScenario()
+}
+
+func TestRegisterediotplatformsGET(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("expected_iotPlatformInfo: ", expected_iotPlatformInfo)
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/registered_iot_platforms", nil, nil, nil, nil, http.StatusOK, RegisterediotplatformsGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp []IotPlatformInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if len(resp) != 1 {
+		t.Fatalf("Invalid response length")
+	}
+	if !validate_iot_platform_info(resp[0], expected_iotPlatformInfo) {
+		t.Errorf("Response mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_registered_iot_platforms(expected_iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegisterediotplatformsByIdGET(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("expected_iotPlatformInfo: ", expected_iotPlatformInfo)
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	vars := make(map[string]string)
+	vars["registeredIotPlatformId"] = expected_iotPlatformInfo.IotPlatformId
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/registered_iot_platforms", nil, vars, nil, nil, http.StatusOK, RegisterediotplatformsByIdGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp IotPlatformInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if !validate_iot_platform_info(resp, expected_iotPlatformInfo) {
+		t.Errorf("Response mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_registered_iot_platforms(expected_iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegisterediotplatformsDelete(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("expected_iotPlatformInfo: ", expected_iotPlatformInfo)
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	vars := make(map[string]string)
+	vars["registeredIotPlatformId"] = expected_iotPlatformInfo.IotPlatformId
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodDelete, "/registered_iot_platforms", nil, vars, nil, nil, http.StatusNoContent, RegisterediotplatformsByIdDELETE)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	terminateScenario()
+}
+
+func TestRegistereddevicesPOST(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("iotPlatformInfo: ", iotPlatformInfo)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	expected_deviceMetadata := make([]KeyValuePair, 2)
+	expected_deviceMetadata[0] = KeyValuePair{
+		Key:   "Key1",
+		Value: "Value1",
+	}
+	expected_deviceMetadata[1] = KeyValuePair{
+		Key:   "Key2",
+		Value: "Value2",
+	}
+	var expected_device = DeviceInfo{
+		DeviceMetadata:         expected_deviceMetadata,
+		RequestedIotPlatformId: expected_requestedIotPlatformId,
+		DeviceId:               expected_requestedIotPlatformId,
+		Imsi:                   "12345",
+		Enabled:                true,
+	}
+	expected_device_str, err := json.Marshal(expected_device)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("expected_device: ", string(expected_device_str))
+
+	/******************************
+	 * request body section
+	 ******************************/
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	deviceMetadata := make([]KeyValuePair, 2)
+	deviceMetadata[0] = KeyValuePair{
+		Key:   "Key1",
+		Value: "Value1",
+	}
+	deviceMetadata[1] = KeyValuePair{
+		Key:   "Key2",
+		Value: "Value2",
+	}
+	var device = DeviceInfo{
+		DeviceMetadata:         deviceMetadata,
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               requestedIotPlatformId,
+		Imsi:                   "12345",
+		Enabled:                true,
+	}
+	fmt.Println("Create a device: ", device)
+	body, err := json.Marshal(device)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("body: ", string(body))
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodPost, "/registered_devices", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, RegistereddevicesPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp DeviceInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if !validate_device_info(resp, expected_device) {
+		t.Errorf("Response mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_device(expected_device.DeviceId)
+	_ = delete_registered_iot_platforms(iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegistereddevicesDELETE(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("iotPlatformInfo: ", iotPlatformInfo)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	device, err := create_device(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	vars := make(map[string]string)
+	vars["registeredDeviceId"] = device.DeviceId
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodDelete, "/registered_devices", nil, vars, nil, nil, http.StatusNoContent, RegistereddevicesByIdDELETE)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_registered_iot_platforms(iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegistereddevicesGET(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("iotPlatformInfo: ", iotPlatformInfo)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_device, err := create_device(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/registered_devices", nil, nil, nil, nil, http.StatusOK, RegistereddevicesGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp []DeviceInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if len(resp) != 1 {
+		t.Errorf("Response length mismatch")
+	}
+	if !validate_device_info(resp[0], expected_device) {
+		t.Errorf("Response mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_device(expected_device.DeviceId)
+	_ = delete_registered_iot_platforms(iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegistereddevicesGET_withFiltering(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("iotPlatformInfo: ", iotPlatformInfo)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_devices, err := create_set_of_devices(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+
+	// Filter on DeviceId and its complement
+	queryParam := make(map[string]string)
+	queryParam["filter"] = "(eq,deviceId," + expected_devices[1].DeviceId + ")" // Only DeviceId 1
+	rr, err := sendRequest(http.MethodGet, "/registered_devices", nil, nil, queryParam, nil, http.StatusOK, RegistereddevicesGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp []DeviceInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if len(resp) != 1 { // Only DeviceId 1
+		t.Errorf("Response length mismatch")
+	}
+	if !validate_device_info(resp[0], expected_devices[1]) {
+		t.Errorf("Response mismatch")
+	}
+	queryParam["filter"] = "(neq,deviceId," + expected_devices[1].DeviceId + ")" // DeviceId 1 is excluded
+	rr, err = sendRequest(http.MethodGet, "/registered_devices", nil, nil, queryParam, nil, http.StatusOK, RegistereddevicesGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	resp = nil
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if len(resp) != 2 {
+		t.Errorf("Response length mismatch")
+	}
+	if !validate_device_info(resp[0], expected_devices[0]) && !validate_device_info(resp[0], expected_devices[2]) { // DeviceId 1 is excluded
+		t.Errorf("Response mismatch")
+	}
+	if !validate_device_info(resp[1], expected_devices[0]) && !validate_device_info(resp[1], expected_devices[2]) { // DeviceId 1 is excluded
+		t.Errorf("Response mismatch")
+	}
+
+	// Filter on RequestedUserTransportId and its complement
+	queryParam["filter"] = "(eq,requestedUserTransportId," + expected_devices[2].RequestedUserTransportId + ")" // Only DeviceId 2
+	rr, err = sendRequest(http.MethodGet, "/registered_devices", nil, nil, queryParam, nil, http.StatusOK, RegistereddevicesGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	resp = nil
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if len(resp) != 1 { // Only DeviceId 2
+		t.Errorf("Response length mismatch")
+	}
+	if !validate_device_info(resp[0], expected_devices[2]) {
+		t.Errorf("Response mismatch")
+	}
+	queryParam["filter"] = "(neq,requestedUserTransportId," + expected_devices[2].RequestedUserTransportId + ")" // DeviceId 2 is excluded
+	rr, err = sendRequest(http.MethodGet, "/registered_devices", nil, nil, queryParam, nil, http.StatusOK, RegistereddevicesGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	resp = nil
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if len(resp) != 2 {
+		t.Errorf("Response length mismatch")
+	}
+	if !validate_device_info(resp[0], expected_devices[0]) && !validate_device_info(resp[0], expected_devices[1]) { // DeviceId 2 is excluded
+		t.Errorf("Response mismatch")
+	}
+	if !validate_device_info(resp[1], expected_devices[0]) && !validate_device_info(resp[1], expected_devices[1]) { // DeviceId 2 is excluded
+		t.Errorf("Response mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_registered_iot_platforms(iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func TestRegistereddevicesByIdGET(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	iotPlatformInfo, err := create_registered_iot_platforms()
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+	fmt.Println("iotPlatformInfo: ", iotPlatformInfo)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected_device, err := create_device(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf("unexpected error: %v", err)
+	}
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	vars := make(map[string]string)
+	vars["registeredDeviceId"] = expected_device.DeviceId
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/registered_devices", nil, vars, nil, nil, http.StatusOK, RegistereddevicesByIdGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp DeviceInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: resp: ", resp)
+	if !validate_device_info(resp, expected_device) {
+		t.Errorf("Response mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = delete_device(expected_device.DeviceId)
+	_ = delete_registered_iot_platforms(iotPlatformInfo.IotPlatformId)
+	terminateScenario()
+}
+
+func create_registered_iot_platforms() (resp IotPlatformInfo, err error) {
+	mb_transportInfo := MB_TOPIC_BASED
+	var security = SecurityInfo{}
+	var implSpecificInfo = ImplSpecificInfo{}
+	transportInfo := REST_HTTP
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{
+		Id:               "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:             "MQTT",
+		Description:      "MQTT",
+		Type_:            &mb_transportInfo,
+		Protocol:         "MQTT",
+		Version:          "2",
+		Endpoint:         &endpoint,
+		Security:         &security,
+		ImplSpecificInfo: &implSpecificInfo,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Type_:       &transportInfo,
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+		Security:    &security,
+	})
+	var iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	body, err := json.Marshal(iotPlatformInfo)
+	if err != nil {
+		return resp, err
+	}
+	fmt.Println("body: ", string(body))
+
+	rr, err := sendRequest(http.MethodPost, "/registered_iot_platforms", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, RegisterediotplatformsPOST)
+	if err != nil {
+		return resp, err
+	}
+	fmt.Println("Respone: rr: ", rr)
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		return resp, err
+	}
+
+	return resp, nil
+}
+
+func delete_registered_iot_platforms(iotPlatformId string) (err error) {
+	vars := make(map[string]string)
+	vars["registeredIotPlatformId"] = iotPlatformId
+	_, err = sendRequest(http.MethodDelete, "/registered_iot_platforms", nil, vars, nil, nil, http.StatusNoContent, RegisterediotplatformsByIdDELETE)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func validate_iot_platform_info(received IotPlatformInfo, expected IotPlatformInfo) bool {
+	fmt.Println("validate_iot_platform_info: received: ", received)
+	fmt.Println("validate_iot_platform_info: expected: ", expected)
+
+	if received.IotPlatformId != expected.IotPlatformId {
+		fmt.Println("received.IotPlatformId != IotPlatformId")
+		return false
+	}
+
+	if len(received.UserTransportInfo) != len(expected.UserTransportInfo) {
+		fmt.Println("len(received.UserTransportInfo) mismatch")
+		return false
+		// TODO FSCOM } else {
+	}
+
+	if len(received.CustomServicesTransportInfo) != len(expected.CustomServicesTransportInfo) {
+		fmt.Println("len(received.CustomServicesTransportInfo) mismatch")
+		return false
+		// TODO FSCOM } else {
+	}
+
+	if received.Enabled != expected.Enabled {
+		fmt.Println("received.Enabled != Enabled")
+		return false
+	}
+
+	fmt.Println("validate_iot_platform_info: succeed")
+	return true
+}
+
+func create_device(iotPlatformInfo IotPlatformInfo) (device DeviceInfo, err error) {
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	deviceMetadata := make([]KeyValuePair, 2)
+	deviceMetadata[0] = KeyValuePair{
+		Key:   "Key1",
+		Value: "Value1",
+	}
+	deviceMetadata[1] = KeyValuePair{
+		Key:   "Key2",
+		Value: "Value2",
+	}
+	device = DeviceInfo{
+		DeviceMetadata:         deviceMetadata,
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               requestedIotPlatformId,
+		Imsi:                   "12345",
+		Enabled:                true,
+	}
+	body, err := json.Marshal(device)
+	if err != nil {
+		return device, err
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodPost, "/registered_devices", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, RegistereddevicesPOST)
+	if err != nil {
+		return device, err
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp DeviceInfo
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		return device, err
+	}
+
+	return device, nil
+}
+
+func create_set_of_devices(iotPlatformInfo IotPlatformInfo) (devices []DeviceInfo, err error) {
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	deviceMetadata := make([]KeyValuePair, 2)
+	deviceMetadata[0] = KeyValuePair{
+		Key:   "Key1",
+		Value: "Value1",
+	}
+	deviceMetadata[1] = KeyValuePair{
+		Key:   "Key2",
+		Value: "Value2",
+	}
+	devices = make([]DeviceInfo, 3)
+	devices[0] = DeviceInfo{
+		DeviceMetadata:         deviceMetadata,
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               "0",
+		Gpsi:                   "12345",
+		Enabled:                true,
+	}
+	deviceMetadata[0].Key = "Key11"
+	devices[1] = DeviceInfo{
+		DeviceMetadata:         deviceMetadata,
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               "1",
+		Msisdn:                 "345",
+		Enabled:                true,
+	}
+	deviceMetadata[0].Key = "Key12"
+	devices[2] = DeviceInfo{
+		DeviceMetadata:           deviceMetadata,
+		RequestedIotPlatformId:   requestedIotPlatformId,
+		DeviceId:                 "2",
+		RequestedUserTransportId: "987",
+		Imsi:                     "12345",
+		Enabled:                  true,
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	resp_devices := devices // Same format
+	for i, val := range devices {
+		body, err := json.Marshal(val)
+		if err != nil {
+			return nil, err
+		}
+		rr, err := sendRequest(http.MethodPost, "/registered_devices", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, RegistereddevicesPOST)
+		if err != nil {
+			return nil, err
+		}
+		fmt.Println("Respone: rr: ", rr)
+		var resp DeviceInfo
+		err = json.Unmarshal([]byte(rr), &resp)
+		if err != nil {
+			return nil, err
+		}
+		resp_devices[i] = resp
+	} // End of 'for' statement
+
+	return resp_devices, nil
+}
+
+func delete_device(deviceId string) (err error) {
+	vars := make(map[string]string)
+	vars["registeredDeviceId"] = deviceId
+	_, err = sendRequest(http.MethodDelete, "/registered_devices", nil, vars, nil, nil, http.StatusNoContent, RegistereddevicesByIdDELETE)
+	return err
+}
+
+func validate_device_info(expected_device DeviceInfo, received_deviceResp DeviceInfo) bool {
+	fmt.Println(">>> validate_device_info: expected_device: ", expected_device)
+	fmt.Println(">>> validate_device_info: received_deviceResp: ", received_deviceResp)
+
+	if expected_device.DeviceId != received_deviceResp.DeviceId {
+		fmt.Println("received_deviceResp.DeviceId != DeviceId")
+		return false
+	}
+	if expected_device.Enabled != received_deviceResp.Enabled {
+		fmt.Println("received_deviceResp.Enabled != Enabled")
+		return false
+	}
+	if expected_device.DeviceAuthenticationInfo != received_deviceResp.DeviceAuthenticationInfo {
+		fmt.Println("received_deviceResp.DeviceAuthenticationInfo != DeviceAuthenticationInfo")
+		return false
+	}
+	if expected_device.Gpsi != received_deviceResp.Gpsi {
+		fmt.Println("received_deviceResp.Gpsi != Gpsi")
+		return false
+	}
+	if expected_device.Pei != received_deviceResp.Pei {
+		fmt.Println("received_deviceResp.Pei != Pei")
+		return false
+	}
+	if expected_device.Supi != received_deviceResp.Supi {
+		fmt.Println("received_deviceResp.Supi != Supi")
+		return false
+	}
+	if expected_device.Msisdn != received_deviceResp.Msisdn {
+		fmt.Println("received_deviceResp.Msisdn != Msisdn")
+		return false
+	}
+	if expected_device.Imei != received_deviceResp.Imei {
+		fmt.Println("received_deviceResp.Imei != Imei")
+		return false
+	}
+	if expected_device.Imsi != received_deviceResp.Imsi {
+		fmt.Println("received_deviceResp.Imsi != Imsi")
+		return false
+	}
+	if expected_device.Iccid != received_deviceResp.Iccid {
+		fmt.Println("received_deviceResp.Iccid != Iccid")
+		return false
+	}
+	if expected_device.RequestedIotPlatformId != received_deviceResp.RequestedIotPlatformId {
+		fmt.Println("received_deviceResp.RequestedIotPlatformId != RequestedIotPlatformId")
+		return false
+	}
+	if expected_device.RequestedUserTransportId != received_deviceResp.RequestedUserTransportId {
+		fmt.Println("received_deviceResp.RequestedUserTransportId != RequestedUserTransportId")
+		return false
+	}
+	if expected_device.ClientCertificate != received_deviceResp.ClientCertificate {
+		fmt.Println("received_deviceResp.ClientCertificate != ClientCertificate")
+		return false
+	}
+	if len(expected_device.DeviceMetadata) != len(received_deviceResp.DeviceMetadata) {
+		fmt.Println("received_deviceResp.DeviceMetadata != DeviceMetadata")
+		return false
+	} else {
+		for i, val := range expected_device.DeviceMetadata {
+			if val.Key != received_deviceResp.DeviceMetadata[i].Key {
+				fmt.Println("item #", i, ":received_deviceResp.DeviceMetadata.Key != DeviceMetadata.Key")
+				return false
+			}
+			if val.Value != received_deviceResp.DeviceMetadata[i].Value {
+				fmt.Println("item #", i, ":received_deviceResp.DeviceMetadata.Value != DeviceMetadata.Value")
+				return false
+
+			}
+		} // End of 'for' statement
+	}
+	if len(expected_device.RequestedMecTrafficRule) != len(received_deviceResp.RequestedMecTrafficRule) {
+		fmt.Println("received_deviceResp.RequestedMecTrafficRule != RequestedMecTrafficRule")
+		return false
+		// TODO FSCOM } else {
+		// for i, val := range expected_device.RequestedMecTrafficRule {
+		// } // End of 'for' statement
+		// TODO FSCOM To be continued
+		//RequestedMecTrafficRule  []TrafficRuleDescriptor
+	}
+	// TODO FSCOM To be continued
+
+	return true
+}
+
+func initializeVars() {
+	mod.DbAddress = redisTestAddr
+	redisAddr = redisTestAddr
+	influxAddr = influxTestAddr
+	sandboxName = testScenarioName
+	os.Setenv("MEEP_PREDICT_MODEL_SUPPORTED", "true")
+	os.Setenv("MEEP_SANDBOX_NAME", testScenarioName)
+	os.Setenv("MEEP_PUBLIC_URL", "http://localhost")
+}
+
+func initialiseScenario(testScenario string) {
+
+	//clear DB
+	cleanUp()
+
+	cfg := mod.ModelCfg{
+		Name:      testScenarioName,
+		Namespace: sandboxName,
+		Module:    "test-mod",
+		UpdateCb:  nil,
+		DbAddr:    redisAddr,
+	}
+	var err error
+	m, err = mod.NewModel(cfg)
+	if err != nil {
+		log.Error("Failed to create model: ", err)
+		return
+	}
+	fmt.Println("initialiseScenario: model created")
+
+	// Create message queue
+	mqLocal, err = mq.NewMsgQueue(mq.GetLocalName(testScenarioName), "test-mod", testScenarioName, redisAddr)
+	if err != nil {
+		log.Error("Failed to create Message Queue with error: ", err)
+		return
+	}
+	fmt.Println("Message Queue created")
+
+	fmt.Println("Set Model")
+	err = m.SetScenario([]byte(testScenario))
+	if err != nil {
+		log.Error("Failed to set model: ", err)
+		return
+	}
+
+	err = m.Activate()
+	if err != nil {
+		log.Error("Failed to activate scenario with err: ", err.Error())
+		return
+	}
+
+	msg := mqLocal.CreateMsg(mq.MsgScenarioActivate, mq.TargetAll, testScenarioName)
+	err = mqLocal.SendMsg(msg)
+	if err != nil {
+		log.Error("Failed to send message: ", err)
+		return
+	}
+
+	time.Sleep(100 * time.Millisecond)
+
+}
+
+func updateScenario(testUpdate string) {
+
+	switch testUpdate {
+	case "mobility1":
+		// mobility event of ue1 to zone2-poa1
+		elemName := "ue1"
+		destName := "zone2-poa1"
+
+		_, _, err := m.MoveNode(elemName, destName, nil)
+		if err != nil {
+			log.Error("Error sending mobility event")
+		}
+
+		msg := mqLocal.CreateMsg(mq.MsgScenarioUpdate, mq.TargetAll, testScenarioName)
+		err = mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+	case "mobility2":
+		// mobility event of ue1 to zone2-poa1
+		elemName := "ue1"
+		destName := "zone1-poa-cell1"
+
+		_, _, err := m.MoveNode(elemName, destName, nil)
+		if err != nil {
+			log.Error("Error sending mobility event")
+		}
+
+		msg := mqLocal.CreateMsg(mq.MsgScenarioUpdate, mq.TargetAll, testScenarioName)
+		err = mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+	case "mobility3":
+		// mobility event of ue1 to zone1-poa-cell2
+		elemName := "ue1"
+		destName := "zone1-poa-cell2"
+
+		_, _, err := m.MoveNode(elemName, destName, nil)
+		if err != nil {
+			log.Error("Error sending mobility event")
+		}
+
+		msg := mqLocal.CreateMsg(mq.MsgScenarioUpdate, mq.TargetAll, testScenarioName)
+		err = mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+	default:
+	}
+	time.Sleep(100 * time.Millisecond)
+}
+
+func terminateScenario() {
+	if mqLocal != nil {
+		_ = Stop()
+		msg := mqLocal.CreateMsg(mq.MsgScenarioTerminate, mq.TargetAll, testScenarioName)
+		err := mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+		time.Sleep(100 * time.Millisecond)
+	}
+}
+
+func sendRequest(method string, url string, body io.Reader, vars map[string]string, query map[string]string, location *string, code int, f http.HandlerFunc) (string, error) {
+	req, err := http.NewRequest(method, url, body)
+	if err != nil || req == nil {
+		return "", err
+	}
+	if vars != nil {
+		req = mux.SetURLVars(req, vars)
+	}
+	if query != nil {
+		q := req.URL.Query()
+		for k, v := range query {
+			q.Add(k, v)
+		}
+		req.URL.RawQuery = q.Encode()
+	}
+	// We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response.
+	rr := httptest.NewRecorder()
+	handler := http.HandlerFunc(f)
+
+	// Our handlers satisfy http.Handler, so we can call their ServeHTTP method
+	// directly and pass in our Request and ResponseRecorder.
+	handler.ServeHTTP(rr, req)
+
+	time.Sleep(50 * time.Millisecond)
+
+	// Check the status code is what we expect.
+	if status := rr.Code; status != code {
+		s := fmt.Sprintf("Wrong status code - got %v want %v", status, code)
+		return "", errors.New(s)
+	}
+
+	// Set Location header in case of POST
+	if location != nil {
+		s := rr.Header().Get("Location")
+		if rr == nil {
+			s := fmt.Sprintf("Header Location expected")
+			return "", errors.New(s)
+		} else if !strings.Contains(s, *location) {
+			s := fmt.Sprintf("Wrong Header Location - got %s want %s", s, *location)
+			return "", errors.New(s)
+		}
+	}
+
+	return string(rr.Body.String()), nil
+}
diff --git a/go-apps/meep-iot/server/model_addresses.go b/go-apps/meep-iot/server/model_addresses.go
new file mode 100644
index 0000000000000000000000000000000000000000..40cce24c0b770196a2fbd0d8744a69900e8f8de1
--- /dev/null
+++ b/go-apps/meep-iot/server/model_addresses.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Entry point information of the service as one or more pairs of IP address and port. See note.
+type Addresses struct {
+	// Host portion of the address.
+	Host string `json:"host"`
+	// Port portion of the address.
+	Port int32 `json:"port"`
+}
diff --git a/go-apps/meep-iot/server/model_app_termination_notification.go b/go-apps/meep-iot/server/model_app_termination_notification.go
new file mode 100644
index 0000000000000000000000000000000000000000..8b0cf34074f876472e77fca963873956d91d8fd4
--- /dev/null
+++ b/go-apps/meep-iot/server/model_app_termination_notification.go
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2022  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE Radio Network Information API
+ *
+ * Radio Network Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC012 RNI API](https://www.etsi.org/deliver/etsi_gs/MEC/001_099/012/02.02.01_60/gs_MEC012v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-rnis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-rnis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of RNI API endpoints (see below) and a subset of subscription types. <p>Supported subscriptions: <p> - CellChangeSubscription <p> - RabEstSubscription <p> - RabRelSubscription <p> - MeasRepUeSubscription <p> - NrMeasRepUeSubscription
+ *
+ * API version: 2.2.1
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// This type represents the information that the MEC platform notifies the subscribed application instance about  the corresponding application instance termination/stop.
+type AppTerminationNotification struct {
+	// Shall be set to AppTerminationNotification.
+	NotificationType string `json:"notificationType"`
+
+	OperationAction *OperationActionType `json:"operationAction"`
+	// Maximum timeout value in seconds for graceful termination or graceful stop of an application instance.
+	MaxGracefulTimeout int32 `json:"maxGracefulTimeout"`
+
+	Links *AppTerminationNotificationLinks `json:"_links"`
+}
diff --git a/go-apps/meep-iot/server/model_app_termination_notification__links.go b/go-apps/meep-iot/server/model_app_termination_notification__links.go
new file mode 100644
index 0000000000000000000000000000000000000000..95a54b838e47320c1f04695d8f95ae6c92c18c36
--- /dev/null
+++ b/go-apps/meep-iot/server/model_app_termination_notification__links.go
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2022  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE Radio Network Information API
+ *
+ * Radio Network Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC012 RNI API](https://www.etsi.org/deliver/etsi_gs/MEC/001_099/012/02.02.01_60/gs_MEC012v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-rnis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-rnis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of RNI API endpoints (see below) and a subset of subscription types. <p>Supported subscriptions: <p> - CellChangeSubscription <p> - RabEstSubscription <p> - RabRelSubscription <p> - MeasRepUeSubscription <p> - NrMeasRepUeSubscription
+ *
+ * API version: 2.2.1
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Object containing hyperlinks related to the resource.
+type AppTerminationNotificationLinks struct {
+	Subscription *LinkType `json:"subscription"`
+
+	ConfirmTermination *LinkType `json:"confirmTermination,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_device_info.go b/go-apps/meep-iot/server/model_device_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..2bbcaf4e0bd0540c6c0727a4d5669e6698551a19
--- /dev/null
+++ b/go-apps/meep-iot/server/model_device_info.go
@@ -0,0 +1,48 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// NOTE 1: At least one attribute among gpsi, pei, supi, msisdn, imei, imsi, and iccid should be provided. Sufficient security         measures shall be put in place when any attribute among PEI, SUPI, IMEI, and IMSI is disclosed over the API. NOTE 2: Until a valid traffic rule is not provided, the device will not be able to use the IoTS. A valid traffic rule is provided         by one of the following options:         • the requestedMecTrafficRule attribute;         • the requestedIotPlatformId attribute when the IoT platform offers only one user transport;         • the combination of requestedIotPlatformId and requestedUserTransportId. NOTE 3: Enabled is a pseudo-attribute which needs to be maintained by the IoTS based on the presence or not of a valid         traffic rule associated to the device. It cannot be set directly by the service consumer.
+type DeviceInfo struct {
+	// Information needed for secondary authentication of the IoT device to the data network - see ETSI TS 129 561 [i.4] and ETSI TS 129 061 [i.5] for 5G and LTE procedures, respectively. This attribute is implementation dependent and should be logically linked to the identifiers of the IoT device listed hereafter.
+	DeviceAuthenticationInfo string `json:"deviceAuthenticationInfo"`
+	// Additional information about the IoT device. This attribute is implementation dependent and may be expressed as an array of keyvalue pairs.
+	DeviceMetadata []KeyValuePair `json:"deviceMetadata,omitempty"`
+	// GPSI of the IoT device if 5G-enabled (see note 1).
+	Gpsi string `json:"gpsi,omitempty"`
+	// PEI of the IoT device if 5G-enabled (see note 1).
+	Pei string `json:"pei,omitempty"`
+	// SUPI of the IoT device if 5G-enabled (see note 1).
+	Supi string `json:"supi,omitempty"`
+	// MSISDN of the IoT device if LTE-enabled (see note 1).
+	Msisdn string `json:"msisdn,omitempty"`
+	// IMEI of the IoT device if LTE-enabled (see note 1).
+	Imei string `json:"imei,omitempty"`
+	// IMSI of the IoT device if LTE-enabled (see note 1).
+	Imsi string `json:"imsi,omitempty"`
+	// ICCID of the IoT device (see note 1).
+	Iccid string `json:"iccid,omitempty"`
+	// Human-readable identifier of the IoT device.
+	DeviceId string `json:"deviceId"`
+	// MEC traffic rules the IoT device is requested to be associated to (see note 2). The data type definition is as per ETSI GS MEC 010-2 [i.6].
+	RequestedMecTrafficRule []TrafficRuleDescriptor `json:"requestedMecTrafficRule,omitempty"`
+	// IoT platform to which the IoT device is requested to be associated to (see note 2).
+	RequestedIotPlatformId string `json:"requestedIotPlatformId,omitempty"`
+	// User transport to which the IoT device is requested to be associated to (see note 2).
+	RequestedUserTransportId string `json:"requestedUserTransportId,omitempty"`
+
+	DeviceSpecificMessageFormats *DeviceSpecificMessageFormats `json:"deviceSpecificMessageFormats,omitempty"`
+
+	DownlinkInfo *DownlinkInfo `json:"downlinkInfo,omitempty"`
+	// Client-side SSL/TLS certificate to be used by the MEC IoTS to interact with the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device.
+	ClientCertificate string `json:"clientCertificate,omitempty"`
+	// Indication whether the IoT device has a valid associated traffic rule (TRUE) or not (FALSE). See note 3.
+	Enabled bool `json:"enabled"`
+}
diff --git a/go-apps/meep-iot/server/model_device_specific_message_formats.go b/go-apps/meep-iot/server/model_device_specific_message_formats.go
new file mode 100644
index 0000000000000000000000000000000000000000..62747bccebc3b86efc5dbb176ec4d7ace9218aad
--- /dev/null
+++ b/go-apps/meep-iot/server/model_device_specific_message_formats.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Format of the messages to be published by the MEC IoTS on the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device.
+type DeviceSpecificMessageFormats struct {
+	EventMsgFormat *EventMsg `json:"eventMsgFormat,omitempty"`
+
+	UplinkMsgFormat *UplinkMsg `json:"uplinkMsgFormat,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_downlink_info.go b/go-apps/meep-iot/server/model_downlink_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..407efcd146932dd57858b1201f9fa8b44070dd9d
--- /dev/null
+++ b/go-apps/meep-iot/server/model_downlink_info.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Downlink communication configuration of the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device.
+type DownlinkInfo struct {
+	// Topic associated to the IoT device. This topic should be used by an end IoT application to send downlink data to the IoT device.
+	DownlinkTopic string `json:"downlinkTopic,omitempty"`
+	// UDP port to be used by the MEC IoTS for the outgoing downlink packets towards the IoT device. In case a default value is used, this attribute is optional.
+	DevicePort int32 `json:"devicePort,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_end_point_info.go b/go-apps/meep-iot/server/model_end_point_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..049aa5fb19c144893d31713230996922018d5377
--- /dev/null
+++ b/go-apps/meep-iot/server/model_end_point_info.go
@@ -0,0 +1,22 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// NOTE: Exactly one of \"uris\", \"fqdn\", \"addresses\" or \"alternative\" shall be present.
+type EndPointInfo struct {
+	// Entry point information of the service as string, formatted according to URI syntax (see IETF RFC 3986 [8]). Shall be used for REST APIs. See note.
+	Uris []string `json:"uris,omitempty"`
+	// Fully Qualified Domain Name of the service. See note.
+	Fqdn []string `json:"fqdn,omitempty"`
+
+	Addresses []Addresses `json:"addresses,omitempty"`
+	// Entry point information of the service in a format defined by an implementation, or in an external specification. See note.
+	Alternative string `json:"alternative,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_event_msg.go b/go-apps/meep-iot/server/model_event_msg.go
new file mode 100644
index 0000000000000000000000000000000000000000..b7694d6de8bfe2d5821d72eb7e74de27af5970fe
--- /dev/null
+++ b/go-apps/meep-iot/server/model_event_msg.go
@@ -0,0 +1,33 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type EventMsg struct {
+	// Topic where the message containing application-specific information should be published.
+	EventTopic string `json:"eventTopic"`
+
+	SelectedSerializer *SerializerType `json:"selectedSerializer"`
+	// Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceAddr bool `json:"includeDeviceAddr,omitempty"`
+	// Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceMetadata bool `json:"includeDeviceMetadata,omitempty"`
+	// Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE).
+	IncludePei bool `json:"includePei,omitempty"`
+	// Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE).
+	IncludeSupi bool `json:"includeSupi,omitempty"`
+	// Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE).
+	IncludeImei bool `json:"includeImei,omitempty"`
+	// Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE).
+	IncludeImsi bool `json:"includeImsi,omitempty"`
+	// Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE).
+	IncludeIccid bool `json:"includeIccid,omitempty"`
+	// Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceId bool `json:"includeDeviceId,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_impl_specific_info.go b/go-apps/meep-iot/server/model_impl_specific_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..7fb40d7488bb7a65d19fb67db12978e2b75d744a
--- /dev/null
+++ b/go-apps/meep-iot/server/model_impl_specific_info.go
@@ -0,0 +1,20 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Additional implementation specific details of the transport.
+type ImplSpecificInfo struct {
+	// Topics used to publish events related to the established session between the IoT device(s) and the end IoT application(s) on the user transport.
+	EventTopics []string `json:"eventTopics,omitempty"`
+	// Topics used to publish data generated by the IoT device(s) on the user transport, in order to be consumed by the end IoT application(s).
+	UplinkTopics []string `json:"uplinkTopics,omitempty"`
+	// Topics used to publish data generated by the IoT applications(s) on the user transport, in order to be consumed by the end IoT device(s).
+	DownlinkTopics []string `json:"downlinkTopics,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_inline_response_200.go b/go-apps/meep-iot/server/model_inline_response_200.go
new file mode 100644
index 0000000000000000000000000000000000000000..dfe0b48cd75ad41a6b8829580740a6f3ac804b09
--- /dev/null
+++ b/go-apps/meep-iot/server/model_inline_response_200.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type InlineResponse200 struct {
+	Items *DeviceInfo `json:"items,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_inline_response_200_1.go b/go-apps/meep-iot/server/model_inline_response_200_1.go
new file mode 100644
index 0000000000000000000000000000000000000000..629c9e4bab45d0dc57cd6dca6bb850369f64d582
--- /dev/null
+++ b/go-apps/meep-iot/server/model_inline_response_200_1.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type InlineResponse2001 struct {
+	IotPlatformInfo *IotPlatformInfo `json:"IotPlatformInfo,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_interface_descriptor.go b/go-apps/meep-iot/server/model_interface_descriptor.go
new file mode 100644
index 0000000000000000000000000000000000000000..8dec0babf6b9c5f25723dec7f114a25bc5364466
--- /dev/null
+++ b/go-apps/meep-iot/server/model_interface_descriptor.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type InterfaceDescriptor struct {
+	// Type of interface: TUNNEL, MAC, IP, etc.
+	InterfaceType string `json:"interfaceType"`
+
+	TunnelInfo *TunnelInfo `json:"tunnelInfo,omitempty"`
+	// If the interface type is MAC, the source address identifies the MAC address of the interface.
+	SrcMACAddress string `json:"srcMACAddress,omitempty"`
+	// If the interface type is MAC, the destination address identifies the MAC address of the destination. Only used for dstInterface.
+	DstMACAddress string `json:"dstMACAddress,omitempty"`
+	// If the interface type is IP, the destination address identifies the IP address of the destination. Only used for dstInterface.
+	DstIPAddress string `json:"dstIPAddress,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_iot_platform_info.go b/go-apps/meep-iot/server/model_iot_platform_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..3a4fe7b91c9cb773683d9b624ad137807be1aec3
--- /dev/null
+++ b/go-apps/meep-iot/server/model_iot_platform_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type IotPlatformInfo struct {
+	// Identifier of the IoT platform.
+	IotPlatformId string `json:"iotPlatformId"`
+	// Information about the user transport(s)  provided by the IoT platform.
+	UserTransportInfo []MbTransportInfo `json:"userTransportInfo"`
+	// Transport enabling access to vendor-specific services provided by the IoT platform. The data type definition is as per ETSI GS MEC 011 [i.2].
+	CustomServicesTransportInfo []TransportInfo `json:"customServicesTransportInfo,omitempty"`
+	// Indication whether the IoT platform is capable of providing user transports and vendor-specific services (TRUE) or not (FALSE).
+	Enabled bool `json:"enabled"`
+}
diff --git a/go-apps/meep-iot/server/model_key_value_pair.go b/go-apps/meep-iot/server/model_key_value_pair.go
new file mode 100644
index 0000000000000000000000000000000000000000..2fb36fd444c935b72841eae9fbb26ea612b59bdb
--- /dev/null
+++ b/go-apps/meep-iot/server/model_key_value_pair.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Key-value pairs for device metadata
+type KeyValuePair struct {
+	Key string `json:"key,omitempty"`
+
+	Value string `json:"value,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_link_type.go b/go-apps/meep-iot/server/model_link_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..0dd2f7366fa714d18ac7fbce3411f078708b78ab
--- /dev/null
+++ b/go-apps/meep-iot/server/model_link_type.go
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2022  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE Radio Network Information API
+ *
+ * Radio Network Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC012 RNI API](https://www.etsi.org/deliver/etsi_gs/MEC/001_099/012/02.02.01_60/gs_MEC012v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-rnis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-rnis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of RNI API endpoints (see below) and a subset of subscription types. <p>Supported subscriptions: <p> - CellChangeSubscription <p> - RabEstSubscription <p> - RabRelSubscription <p> - MeasRepUeSubscription <p> - NrMeasRepUeSubscription
+ *
+ * API version: 2.2.1
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type LinkType struct {
+	// URI referring to a resource
+	Href string `json:"href"`
+}
diff --git a/go-apps/meep-iot/server/model_mb_transport_info.go b/go-apps/meep-iot/server/model_mb_transport_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..a879d064483c5104b55a00c4adb0e81743fb6f34
--- /dev/null
+++ b/go-apps/meep-iot/server/model_mb_transport_info.go
@@ -0,0 +1,31 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type MbTransportInfo struct {
+	// The identifier of this transport as per ETSI GS MEC 011 [i.2].
+	Id string `json:"id"`
+	// The name of this transport as per ETSI GS MEC 011 [i.2].
+	Name string `json:"name"`
+	// Human-readable description of this transport as per ETSI GS MEC 011 [i.2].
+	Description string `json:"description,omitempty"`
+
+	Type_ *TransportType `json:"type"`
+	// The name of the protocol used. Being the transport of MB_TOPIC_BASED type, this attribute should be typically set to \"MQTT\" or \"AMQP.\"
+	Protocol string `json:"protocol"`
+	// The version of the protocol used as per ETSI GS MEC 011 [i.2].
+	Version string `json:"version"`
+
+	Endpoint *EndPointInfo `json:"endpoint"`
+
+	Security *SecurityInfo `json:"security"`
+
+	ImplSpecificInfo *ImplSpecificInfo `json:"implSpecificInfo"`
+}
diff --git a/go-apps/meep-iot/server/model_o_auth2_info.go b/go-apps/meep-iot/server/model_o_auth2_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..d91f1dcb3b9d3bc42f76e796121d0f794a2870fb
--- /dev/null
+++ b/go-apps/meep-iot/server/model_o_auth2_info.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Parameters related to use of OAuth 2.0. Shall be present in case OAuth 2.0 (see IETF RFC 6749 [13]) is supported to secure the provision of the service over the transport.
+type OAuth2Info struct {
+	// List of supported OAuth 2.0 grant types. Each entry shall be one of the following permitted values: - OAUTH2_AUTHORIZATION_CODE: Authorization code grant type - OAUTH2_IMPLICIT_GRANT: Implicit grant type - OAUTH2_RESOURCE_OWNER: Resource owner password credentials grant type - OAUTH2_CLIENT_CREDENTIALS: Client credentials grant type Only the value \"OAUTH2_CLIENT_CREDENTIALS\" is supported in the present document.
+	GrantTypes []string `json:"grantTypes"`
+	// The token endpoint. Shall be present unless the grant type is OAUTH2_IMPLICIT_GRANT.
+	TokenEndpoint string `json:"tokenEndpoint,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_operation_action_type.go b/go-apps/meep-iot/server/model_operation_action_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..2388a81964975a66806c8dfe0c318d82a7b5415a
--- /dev/null
+++ b/go-apps/meep-iot/server/model_operation_action_type.go
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2022  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE Radio Network Information API
+ *
+ * Radio Network Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC012 RNI API](https://www.etsi.org/deliver/etsi_gs/MEC/001_099/012/02.02.01_60/gs_MEC012v020201p.pdf) <p>[Copyright (c) ETSI 2017](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-rnis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-rnis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of RNI API endpoints (see below) and a subset of subscription types. <p>Supported subscriptions: <p> - CellChangeSubscription <p> - RabEstSubscription <p> - RabRelSubscription <p> - MeasRepUeSubscription <p> - NrMeasRepUeSubscription
+ *
+ * API version: 2.2.1
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// OperationActionType : Operation that is being performed on the MEC application instance.
+type OperationActionType string
+
+// List of OperationActionType
+const (
+	STOPPING_OperationActionType    OperationActionType = "STOPPING"
+	TERMINATING_OperationActionType OperationActionType = "TERMINATING"
+)
diff --git a/go-apps/meep-iot/server/model_problem_details.go b/go-apps/meep-iot/server/model_problem_details.go
new file mode 100644
index 0000000000000000000000000000000000000000..5d82796edd46af38b371fcb7645de7c1ddd6613d
--- /dev/null
+++ b/go-apps/meep-iot/server/model_problem_details.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type ProblemDetails struct {
+	// A URI reference according to IETF RFC 3986 that identifies the problem type
+	Type_ string `json:"type,omitempty"`
+	// A short, human-readable summary of the problem type
+	Title string `json:"title,omitempty"`
+	// The HTTP status code for this occurrence of the problem
+	Status int32 `json:"status,omitempty"`
+	// A human-readable explanation specific to this occurrence of the problem
+	Detail string `json:"detail,omitempty"`
+	// A URI reference that identifies the specific occurrence of the problem
+	Instance string `json:"instance,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_registered_devices_body.go b/go-apps/meep-iot/server/model_registered_devices_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..daa0d9857ead90b2d6703d535bb9d575074804a2
--- /dev/null
+++ b/go-apps/meep-iot/server/model_registered_devices_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type RegisteredDevicesBody struct {
+	DeviceInfo *DeviceInfo `json:"DeviceInfo,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_registered_devices_registered_device_id_body.go b/go-apps/meep-iot/server/model_registered_devices_registered_device_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..e805b3492271f2f937999eb37c3b5f5c6b4a09fb
--- /dev/null
+++ b/go-apps/meep-iot/server/model_registered_devices_registered_device_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type RegisteredDevicesRegisteredDeviceIdBody struct {
+	DeviceInfo *DeviceInfo `json:"DeviceInfo,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_registered_iot_platforms_body.go b/go-apps/meep-iot/server/model_registered_iot_platforms_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..c2c5771ace6bfa8370464c1a15054a05fb586139
--- /dev/null
+++ b/go-apps/meep-iot/server/model_registered_iot_platforms_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type RegisteredIotPlatformsBody struct {
+	IoTPlatformInfo *IotPlatformInfo `json:"IoTPlatformInfo,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_registered_iot_platforms_registered_iot_platform_id_body.go b/go-apps/meep-iot/server/model_registered_iot_platforms_registered_iot_platform_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..2e090150ece3f2220bfbfce9013420652dd23aaf
--- /dev/null
+++ b/go-apps/meep-iot/server/model_registered_iot_platforms_registered_iot_platform_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type RegisteredIotPlatformsRegisteredIotPlatformIdBody struct {
+	IotPlatformInfo *IotPlatformInfo `json:"IotPlatformInfo,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_security_info.go b/go-apps/meep-iot/server/model_security_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..4ebc3b1753cc16002321cc8da92e7dcf1a51843e
--- /dev/null
+++ b/go-apps/meep-iot/server/model_security_info.go
@@ -0,0 +1,16 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SecurityInfo struct {
+	OAuth2Info *OAuth2Info `json:"oAuth2Info,omitempty"`
+	// Extensions for alternative transport mechanisms. These extensions depend on the actual transport and are out of scope of the present document. For instance, such extensions may be used to signal the necessary parameters for the client to use TLS-based authorization defined for alternative transports (see ETSI GS MEC 009 [5] for more information).
+	Extensions string `json:"extensions,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_serializer_type.go b/go-apps/meep-iot/server/model_serializer_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..d83c0672c6e4c6abec3dd9d94d49c953e7d526b9
--- /dev/null
+++ b/go-apps/meep-iot/server/model_serializer_type.go
@@ -0,0 +1,20 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// SerializerType : The enumeration SerializerType represents types of serializers.
+type SerializerType string
+
+// List of SerializerType
+const (
+	JSON      SerializerType = "JSON"
+	XML       SerializerType = "XML"
+	PROTOBUF3 SerializerType = "PROTOBUF3"
+)
diff --git a/go-apps/meep-iot/server/model_traffic_filter.go b/go-apps/meep-iot/server/model_traffic_filter.go
new file mode 100644
index 0000000000000000000000000000000000000000..c7f171dacd8c7ff02719353f7d8be7c27528177a
--- /dev/null
+++ b/go-apps/meep-iot/server/model_traffic_filter.go
@@ -0,0 +1,43 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type TrafficFilter struct {
+	// An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes.
+	SrcAddress []string `json:"srcAddress,omitempty"`
+	// An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes.
+	DstAddress []string `json:"dstAddress,omitempty"`
+	// A port or a range of ports.
+	SrcPort []string `json:"srcPort,omitempty"`
+	// A port or a range of ports.
+	DstPort []string `json:"dstPort,omitempty"`
+	// Specify the protocol of the traffic filter.
+	Protocol []string `json:"protocol,omitempty"`
+	// Used for tag based traffic rule.
+	Tag []string `json:"tag,omitempty"`
+	// An URI label, in application layer, i.e. in HTTP message, is used to filter the traffic.
+	Uri []string `json:"uri,omitempty"`
+	// A customized packet label in network layer, as defined by the owner of the MEC platform, is used to filter the traffic.
+	PacketLabel []string `json:"packetLabel,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	SrcTunnelAddress []string `json:"srcTunnelAddress,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	TgtTunnelAddress []string `json:"tgtTunnelAddress,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	SrcTunnelPort []string `json:"srcTunnelPort,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	DstTunnelPort []string `json:"dstTunnelPort,omitempty"`
+	// Used to match all packets that have the same QCI.
+	QCI int32 `json:"qCI,omitempty"`
+	// Used to match all IPv4 packets that have the same DSCP.
+	DSCP int32 `json:"dSCP,omitempty"`
+	// Used to match all IPv6 packets that have the same TC.
+	TC int32 `json:"tC,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_traffic_rule_descriptor.go b/go-apps/meep-iot/server/model_traffic_rule_descriptor.go
new file mode 100644
index 0000000000000000000000000000000000000000..2865ef57f38636300f9e7c6b790faa8317c79d1f
--- /dev/null
+++ b/go-apps/meep-iot/server/model_traffic_rule_descriptor.go
@@ -0,0 +1,26 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// NOTE 1: Value indicates the priority in descending order, i.e. with 0 as the highest priority and 255 as the lowest         priority. NOTE 2: Some applications (like inline/tap) require two interfaces. The first interface in the case of inline/tap is on the         client (e.g. UE) side and the second on the core network (e.g. EPC) side.
+type TrafficRuleDescriptor struct {
+	// Identifies the traffic rule.
+	TrafficRuleId string `json:"trafficRuleId"`
+	// Definition of filter type: per FLOW or PACKET  If it is per FLOW, the filter matches upstream (e.g. UE->EPC) packets and downstream (e.g. EPC->UE) packets are handled by the same context.
+	FilterType string `json:"filterType"`
+	// Priority of this traffic rule within the range 0 to 255. If traffic rule conflicts, the one with higher priority take precedence. See note 1.
+	Priority int32 `json:"priority"`
+	// The filter used to identify specific flow/packets that need to be handled by the MEC host.
+	TrafficFilter []TrafficFilter `json:"trafficFilter"`
+	// Identifies the action of the MEC host data plane, when a packet matches the trafficFilter, the example actions include: DROP, FORWARD_DECAPSULATED, FORWARD_ENCAPSULATED, PASSTHROUGH, DUPLICATE_DECAPSULATED, DUPLICATE_ENCAPSULATED
+	Action string `json:"action"`
+
+	DstInterface *InterfaceDescriptor `json:"dstInterface,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_transport_info.go b/go-apps/meep-iot/server/model_transport_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..681e22609fe998dc4da25132ab93623fa91c1f96
--- /dev/null
+++ b/go-apps/meep-iot/server/model_transport_info.go
@@ -0,0 +1,31 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type TransportInfo struct {
+	// The identifier of this transport.
+	Id string `json:"id"`
+	// The name of this transport.
+	Name string `json:"name"`
+	// Human-readable description of this transport.
+	Description string `json:"description,omitempty"`
+
+	Type_ *TransportType `json:"type"`
+	// The name of the protocol used. Shall be set to \"HTTP\" for a REST API.
+	Protocol string `json:"protocol"`
+	// The version of the protocol used.
+	Version string `json:"version"`
+
+	Endpoint *EndPointInfo `json:"endpoint"`
+
+	Security *SecurityInfo `json:"security"`
+	// Additional implementation specific details of the transport.
+	ImplSpecificInfo string `json:"implSpecificInfo,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_transport_type.go b/go-apps/meep-iot/server/model_transport_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..6b9ec89f6f8b69b36b69a3527f6742908db43bc9
--- /dev/null
+++ b/go-apps/meep-iot/server/model_transport_type.go
@@ -0,0 +1,24 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// TransportType : Enumeration representing types of transports.
+type TransportType string
+
+// List of TransportType
+const (
+	REST_HTTP      TransportType = "REST_HTTP"
+	MB_TOPIC_BASED TransportType = "MB_TOPIC_BASED"
+	MB_ROUTING     TransportType = "MB_ROUTING"
+	MB_PUBSUB      TransportType = "MB_PUBSUB"
+	RPC            TransportType = "RPC"
+	RPC_STREAMING  TransportType = "RPC_STREAMING"
+	WEBSOCKET      TransportType = "WEBSOCKET"
+)
diff --git a/go-apps/meep-iot/server/model_tunnel_info.go b/go-apps/meep-iot/server/model_tunnel_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..3fda6d8c19e6715197a3692e3692acac23c7a9b7
--- /dev/null
+++ b/go-apps/meep-iot/server/model_tunnel_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type TunnelInfo struct {
+	// Type of tunnel: GTP-U, GRE, etc.
+	TunnelType string `json:"tunnelType"`
+	// Destination address of the tunnel.
+	TunnelDstAddress string `json:"tunnelDstAddress"`
+	// Source address of the tunnel.
+	TunnelSrcAddress string `json:"tunnelSrcAddress"`
+	// Parameters specific to the tunnel.
+	TunnelSpecificData string `json:"tunnelSpecificData,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/model_uplink_msg.go b/go-apps/meep-iot/server/model_uplink_msg.go
new file mode 100644
index 0000000000000000000000000000000000000000..bbe02980f25fc457d682c45eaad97577f98142c9
--- /dev/null
+++ b/go-apps/meep-iot/server/model_uplink_msg.go
@@ -0,0 +1,35 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type UplinkMsg struct {
+	// Topic where the message containing the data generated by the IoT device(s) should be published, in order to be consumed by the end IoT application(s).
+	UplinkTopic string `json:"uplinkTopic"`
+
+	SelectedSerializer *SerializerType `json:"selectedSerializer"`
+	// Indication whether to include the UDP port of the remote IoT device (TRUE) or not (FALSE).
+	IncludeDevicePort bool `json:"includeDevicePort,omitempty"`
+	// Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceAddr bool `json:"includeDeviceAddr,omitempty"`
+	// Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceMetadata bool `json:"includeDeviceMetadata,omitempty"`
+	// Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE).
+	IncludePei bool `json:"includePei,omitempty"`
+	// Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE).
+	IncludeSupi bool `json:"includeSupi,omitempty"`
+	// Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE).
+	IncludeImei bool `json:"includeImei,omitempty"`
+	// Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE).
+	IncludeImsi bool `json:"includeImsi,omitempty"`
+	// Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE).
+	IncludeIccid bool `json:"includeIccid,omitempty"`
+	// Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceId bool `json:"includeDeviceId,omitempty"`
+}
diff --git a/go-apps/meep-iot/server/routers.go b/go-apps/meep-iot/server/routers.go
new file mode 100644
index 0000000000000000000000000000000000000000..d08ea39e9f13ace61b8b88580c3c605d818981f6
--- /dev/null
+++ b/go-apps/meep-iot/server/routers.go
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"fmt"
+	"net/http"
+	"strings"
+
+	httpLog "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger"
+	met "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics"
+
+	"github.com/gorilla/mux"
+)
+
+type HttpRoute struct {
+	Name        string
+	Method      string
+	Pattern     string
+	HandlerFunc http.HandlerFunc
+}
+
+type HttpRoutes []HttpRoute
+
+func NewRouter() *mux.Router {
+	var handler http.Handler
+	router := mux.NewRouter().StrictSlash(true)
+	for _, route := range routes {
+		handler = route.HandlerFunc
+		handler = Logger(handler, route.Name)
+		handler = met.MetricsHandler(handler, sandboxName, serviceName)
+		handler = httpLog.LogRx(handler)
+		router.
+			Methods(route.Method).
+			Path(route.Pattern).
+			Name(route.Name).
+			Handler(handler)
+	}
+
+	// Path prefix router order is important
+	// Service Api files
+	handler = http.StripPrefix("/iots/v1/api/", http.FileServer(http.Dir("./api/")))
+	router.
+		PathPrefix("/iots/v1/api/").
+		Name("Api").
+		Handler(handler)
+	// User supplied service API files
+	handler = http.StripPrefix("/iots/v1/user-api/", http.FileServer(http.Dir("./user-api/")))
+	router.
+		PathPrefix("/iots/v1/user-api/").
+		Name("UserApi").
+		Handler(handler)
+
+	return router
+}
+
+func Index(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintf(w, "Hello World from MEC 033!")
+}
+
+var routes = HttpRoutes{
+	HttpRoute{
+		"Index",
+		"GET",
+		"/iots/v1/",
+		Index,
+	},
+
+	HttpRoute{
+		"RegistereddevicesByIdDELETE",
+		strings.ToUpper("Delete"),
+		"/iots/v1/registered_devices/{registeredDeviceId}",
+		RegistereddevicesByIdDELETE,
+	},
+
+	HttpRoute{
+		"RegistereddevicesByIdGET",
+		strings.ToUpper("Get"),
+		"/iots/v1/registered_devices/{registeredDeviceId}",
+		RegistereddevicesByIdGET,
+	},
+
+	HttpRoute{
+		"RegistereddevicesByIdPUT",
+		strings.ToUpper("Put"),
+		"/iots/v1/registered_devices/{registeredDeviceId}",
+		RegistereddevicesByIdPUT,
+	},
+
+	HttpRoute{
+		"RegistereddevicesGET",
+		strings.ToUpper("Get"),
+		"/iots/v1/registered_devices",
+		RegistereddevicesGET,
+	},
+
+	HttpRoute{
+		"RegistereddevicesPOST",
+		strings.ToUpper("Post"),
+		"/iots/v1/registered_devices",
+		RegistereddevicesPOST,
+	},
+
+	HttpRoute{
+		"RegisterediotplatformsByIdDELETE",
+		strings.ToUpper("Delete"),
+		"/iots/v1/registered_iot_platforms/{registeredIotPlatformId}",
+		RegisterediotplatformsByIdDELETE,
+	},
+
+	HttpRoute{
+		"RegisterediotplatformsByIdGET",
+		strings.ToUpper("Get"),
+		"/iots/v1/registered_iot_platforms/{registeredIotPlatformId}",
+		RegisterediotplatformsByIdGET,
+	},
+
+	HttpRoute{
+		"RegisterediotplatformsByIdPUT",
+		strings.ToUpper("Put"),
+		"/iots/v1/registered_iot_platforms/{registeredIotPlatformId}",
+		RegisterediotplatformsByIdPUT,
+	},
+
+	HttpRoute{
+		"RegisterediotplatformsGET",
+		strings.ToUpper("Get"),
+		"/iots/v1/registered_iot_platforms",
+		RegisterediotplatformsGET,
+	},
+
+	HttpRoute{
+		"RegisterediotplatformsPOST",
+		strings.ToUpper("Post"),
+		"/iots/v1/registered_iot_platforms",
+		RegisterediotplatformsPOST,
+	},
+
+	HttpRoute{
+		"Mec011AppTerminationPOST",
+		strings.ToUpper("Post"),
+		"/iots/v1/notifications/mec011/appTermination",
+		Mec011AppTerminationPOST,
+	},
+}
diff --git a/go-apps/meep-sandbox-api/server/sandbox_api.go b/go-apps/meep-sandbox-api/server/sandbox_api.go
index 0ef826953855dc283a753e3e5485d925ede952ca..1c609eb4d4f03dad2ee2e531e47b502fd7abbdf9 100644
--- a/go-apps/meep-sandbox-api/server/sandbox_api.go
+++ b/go-apps/meep-sandbox-api/server/sandbox_api.go
@@ -552,6 +552,20 @@ func login(w http.ResponseWriter, r *http.Request) {
 			return
 		}
 
+		// Connect to GIS engine
+		gisClientCfg := gis.NewConfiguration()
+		gisClientCfg.BasePath = sandboxApiConnectors.uri.String() + "/" + sandboxName + "/gis/v1"
+		log.Info("gisClientCfg.BasePath: ", gisClientCfg.BasePath)
+		gisClientCfg.HTTPClient = &http.Client{Transport: tr}
+		log.Info("gisClientCfg.HTTPClient: ", gisClientCfg.HTTPClient)
+		sandboxApiConnectors.gisClient[sandboxName] = gis.NewAPIClient(gisClientCfg)
+		if sandboxApiConnectors.gisClient[sandboxName] == nil {
+			log.Error("Failed to create Sandbox GIS REST API client")
+			_ = processLogout(sandboxName, w, r)
+			w.WriteHeader(http.StatusInternalServerError)
+			return
+		}
+
 		metricSessionSuccess.Inc()
 		if isNew {
 			metricSessionActive.Inc()
diff --git a/go-apps/meep-sss/.swagger-codegen-ignore b/go-apps/meep-sss/.swagger-codegen-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..c5fa491b4c557bf997d5dd21797de782545dc9e5
--- /dev/null
+++ b/go-apps/meep-sss/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# 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 Swagger Codgen 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/go-apps/meep-sss/.swagger-codegen/VERSION b/go-apps/meep-sss/.swagger-codegen/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..6187fa53f3d79636a7b3e6f59c36a1f4273d08b5
--- /dev/null
+++ b/go-apps/meep-sss/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.66
\ No newline at end of file
diff --git a/go-apps/meep-sss/Dockerfile b/go-apps/meep-sss/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..55202c3c484ec330161fbef9386eea450b09927d
--- /dev/null
+++ b/go-apps/meep-sss/Dockerfile
@@ -0,0 +1,27 @@
+# Copyright (c) 2025  The AdvantEDGE Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM debian:11.7-slim
+COPY ./meep-sss /meep-sss
+COPY ./api /api
+COPY ./user-api /user-api
+COPY ./data /
+
+RUN chmod +x /entrypoint.sh
+
+RUN dpkg --configure -a
+
+EXPOSE 31122/tcp
+
+ENTRYPOINT ["/entrypoint.sh"]
diff --git a/go-apps/meep-sss/api/swagger.yaml b/go-apps/meep-sss/api/swagger.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ab90949cdd44215806e980964d04ce377a31237f
--- /dev/null
+++ b/go-apps/meep-sss/api/swagger.yaml
@@ -0,0 +1,1581 @@
+openapi: 3.0.0
+info:
+  title: ETSI GS MEC 046 Sensors Sharing Service APIs
+  description: GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+  contact:
+    name: ETSI Forge
+    url: https://forge.etsi.org/rep/mec/gs046-ss-api
+    email: cti_support@etsi.org
+  license:
+    name: BSD-3-Clause
+    url: https://forge.etsi.org/legal-matters
+  version: 3.1.1
+externalDocs:
+  description: "GS MEC 046 Sensors Sharing Service APIs, v3.3.1"
+  url: https://www.etsi.org/deliver/etsi_gs/MEC/001_099/033/03.01.01_60/gs_mec046v030101p.pdf
+servers:
+- url: https://localhost/sandboxname/sens/v1
+tags:
+- name: sensor-discovery-lookup
+  description: The Sensor Discovery Lookup is the procedure for applications acquiring
+    the sensor(s) currently available and the related characteristics
+- name: sensor-discovery-subscription
+  description: The Sensor Discovery Subscription is the procedure for applications
+    to request to receive notifications about sensors when sensor information changes
+- name: sensor-status-lookup
+  description: The Sensor Status Lookup is the procedure for applications acquiring
+    the status (e.g. active or error state) of sensor(s)
+- name: sensor-status-subscription
+  description: The Sensor Status Subscription is the procedure for applications to
+    request to receive notifications about sensors when they change their status
+- name: sensor-data-lookup
+  description: The Sensor Data Lookup is the procedure for applications to acquire
+    the last data collected by the sensor(s)
+- name: sensor-data-subscription
+  description: The Sensor Data Subscription is the procedure for applications to request
+    to receive notifications every time new data are collected from the sensor(s)
+- name: sensor-management
+  description: The Sensor Management is the procedure for a MEC application to configure
+    specific parameter(s) on the sensor(s)
+paths:
+  /queries/sensor_discovery:
+    get:
+      tags:
+      - sensor-discovery-lookup
+      summary: The GET method is used to query the available sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.3.3.1-1\
+        \ and 7.3.3.1-2."
+      operationId: SensorDiscoveryLookupGET
+      parameters:
+      - name: sensorInfo
+        in: query
+        description: Object containing the characteristics of the sensor(s) to be
+          selected for the query
+        required: false
+        style: form
+        explode: true
+        schema:
+          $ref: '#/components/schemas/SensorInfo'
+      responses:
+        "200":
+          description: "Upon success, a response body containing the available sensors\
+            \ is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDiscoveryInfo'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_discovery:
+    get:
+      tags:
+      - sensor-discovery-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor discovery for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.4.3.1-1\
+        \ and 7.4.3.1-2."
+      operationId: SensorDiscoverySubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: query
+        description: Object containing the characteristics of the sensor(s) to be
+          selected for the query
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor discovery subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - sensor-discovery-subscription
+      summary: The POST method is used to create a new subscription to sensor discovery
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.4.3.4-1"
+      operationId: SensorDiscoverySubscriptionPOST
+      requestBody:
+        description: This type represents a subscription to notifications from the
+          Sensor-sharing Service regarding events related to changes in sensor information
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/subscriptions_sensor_discovery_body'
+        required: true
+      responses:
+        "201":
+          description: "Indicates successful resource creation, where the resource\
+            \ URI shall be returned in the HTTP Location header field"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDiscoveryEventSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_discovery/{subscriptionId}:
+    get:
+      tags:
+      - sensor-discovery-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor status for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.7.3.1-1\
+        \ and 7.7.3.1-2."
+      operationId: SensorDiscoveryIndividualSubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of the subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor status subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - sensor-discovery-subscription
+      summary: The POST method is used to create a new subscription to sensor discovery
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.4.3.4-1"
+      operationId: SensorDiscoverySubscriptionPUT
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: New SensorDiscoveryEventSubscription is included as entity body
+          of the request
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/sensor_discovery_subscriptionId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor discovery subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - sensor-discovery-subscription
+      summary: The DELETE method is used to cancel the existing subscription. Cancellation
+        can be made by deleting the resource that represents existing sensor discovery
+        subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.5.3.5-1 and 7.5.3.5-2"
+      operationId: SensorDiscoverySubscriptionDELETE
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: "Upon success, a response 204 No Content without any response\
+            \ body is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /queries/sensor_status:
+    get:
+      tags:
+      - sensor-status-lookup
+      summary: The GET method is used to query the available status
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.6.3.1-1\
+        \ and 7.6.3.1-2"
+      operationId: SensorStatusLookupGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the status information\
+            \ of specific sensors is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusInfo'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_status:
+    get:
+      tags:
+      - sensor-status-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor status for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.7.3.1-1\
+        \ and 7.7.3.1-2"
+      operationId: SensorStatusSubscriptionGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: Unique identifiers of the sensors
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor status subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - status-status-subscription
+      summary: The POST method is used to create a new subscription to sensor status
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.7.3.4-1"
+      operationId: SensorStatusSubscriptionPOST
+      requestBody:
+        description: The entity body in the request contains data type of the specific
+          sensor status subscription that is to be created
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/subscriptions_sensor_status_body'
+        required: true
+      responses:
+        "201":
+          description: "Indicates successful resource creation, where the resource\
+            \ URI shall be returned in the HTTP Location header field."
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_status/{subscriptionId}:
+    get:
+      tags:
+      - sensor-status-subscription
+      summary: The GET method is used to retrieve information about this subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.8.3.1-1 and 7.8.3.1-2"
+      operationId: SensorStatusIndividualSubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of the subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the specific sensor status subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - sensor-status-subscription
+      summary: The PUT method is used to update the existing subscription
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.8.3.2-1\
+        \ and 7.8.3.2-2"
+      operationId: SensorStatusSubscriptionPUT
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: New SensorStatusSubscription is included as entity body of the
+          request
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/sensor_status_subscriptionId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor status subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - sensor-status-subscription
+      summary: The DELETE method is used to cancel the existing subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.8.3.5-1 and 7.8.3.5-2"
+      operationId: SensorStatusSubscriptionDELETE
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: "Upon success, a response 204 No Content without any response\
+            \ body is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /queries/status_data:
+    get:
+      tags:
+      - sensor-data-lookup
+      summary: The GET method is used to query the last sensor data from specific
+        sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.9.3.1-1\
+        \ and 7.9.3.1-2"
+      operationId: SensorDataLookupGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the last sensor data\
+            \ measured by the sensors is returned"
+          content:
+            application/json:
+              schema:
+                minItems: 1
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorData'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_data:
+    get:
+      tags:
+      - sensor-data-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor data for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.10.3.1-1\
+        \ and 7.10.3.1-2"
+      operationId: SensorDataSubscriptionGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: Unique identifiers of the sensors
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor status subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - sensor-data-subscription
+      summary: The POST method is used to create a new subscription to sensor status
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.7.3.4-1"
+      operationId: SensorDataSubscriptionPOST
+      requestBody:
+        description: The entity body in the request contains data type of the specific
+          sensor status subscription that is to be created
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/subscriptions_sensor_data_body'
+        required: true
+      responses:
+        "201":
+          description: "Indicates successful resource creation, where the resource\
+            \ URI shall be returned in the HTTP Location header field."
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /queries/status_data/{subscriptionId}:
+    get:
+      tags:
+      - sensor-data-subscription
+      summary: The GET method is used to retrieve information about this subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.11.3.1-1 and 7.11.3.1-2"
+      operationId: SensorDataIndividualSubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the specific sensor data subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDataSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - sensor-data-subscription
+      summary: The PUT method is used to update the existing subscription
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.11.3.2-1\
+        \ and 7.11.3.2-2"
+      operationId: SensorDataSubscriptionPUT
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: New SensorDataSubscription is included as entity body of the
+          request
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/status_data_subscriptionId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor data subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDataSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - sensor-data-subscription
+      summary: The DELETE method is used to cancel the existing subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.11.3.5-1 and 7.11.3.5-2"
+      operationId: SensorDataSubscriptionDELETE
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: "Upon success, a response 204 No Content without any response\
+            \ body is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /sensor_management:
+    get:
+      tags:
+      - sensor-management
+      summary: The GET method is used to receive the sensor characteristics that can
+        be modified on specific sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.12.3.1-1\
+        \ and 7.12.3.1-2"
+      operationId: SensorMgmtGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the characteristics\
+            \ that can be set on the specific sensors are returned"
+          content:
+            application/json:
+              schema:
+                minItems: 1
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorCharacteristic'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - management
+      summary: The PUT method is used to update the value of the characteristics that
+        can be set on a sensor or on a group of sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.12.3.2-1\
+        \ and 7.12.3.2-2"
+      operationId: SensorMgmtPUT
+      requestBody:
+        description: "The list of sensor characteristics to be updated, with the new\
+          \ values to set, is included as entity body of the request"
+        content:
+          application/json:
+            schema:
+              minItems: 1
+              type: array
+              items:
+                $ref: '#/components/schemas/SensorCharacteristic'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor characteristics is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorCharacteristic'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+components:
+  schemas:
+    SensorStatusInfo:
+      required:
+      - sensorIdentifier
+      - sensorStatusType
+      type: object
+      properties:
+        sensorIdentifier:
+          type: string
+          description: Unique identifier of the sensor
+        sensorStatusType:
+          type: string
+          description: The status of the sensor
+        errorInformation:
+          type: string
+          description: String explaining the error of the sensor
+      example:
+        errorInformation: errorInformation
+        sensorIdentifier: sensorIdentifier
+        sensorStatusType: sensorStatusType
+    SensorData:
+      required:
+      - data
+      - dataFormat
+      - dataUnitOfMeasure
+      - sensorIdentifier
+      type: object
+      properties:
+        sensorIdentifier:
+          type: string
+          description: Unique identifier of the sensor
+        data:
+          type: string
+          description: The status of the sensor
+        dataFormat:
+          type: string
+          description: String explaining the error of the sensor
+        dataUnitOfMeasure:
+          type: string
+          description: String explaining the error of the sensor
+        dataTimestamp:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        dataTimestamp:
+          seconds: 1
+          nanoSeconds: 5
+        data: data
+        dataUnitOfMeasure: dataUnitOfMeasure
+        dataFormat: dataFormat
+        sensorIdentifier: sensorIdentifier
+    SensorInfo:
+      required:
+      - sensorPropertyList
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          description: Type of the sensor
+        sensorPropertyList:
+          type: array
+          description: "It indicates the list of properties that the sensor can sense\
+            \ (see saref:Property in ETSI TS 103 264 [4], clause 4.3.8)."
+          items:
+            minItems: 1
+            type: string
+        sensorCharacteristicList:
+          minItems: 0
+          type: array
+          description: The sensor' characteristics to be matched
+          items:
+            $ref: '#/components/schemas/SensorCharacteristic'
+        geographicalArea:
+          minItems: 0
+          type: array
+          description: The parameters describing the area
+          items:
+            $ref: '#/components/schemas/AreaInfo'
+    SensorDiscoveryInfo:
+      required:
+      - sensorIdentifier
+      - sensorPropertyList
+      - sensorType
+      type: object
+      properties:
+        sensorIdentifier:
+          type: string
+          description: Unique identifier of the sensor
+        sensorType:
+          type: string
+          description: Type of the Sensor
+        sensorPropertyList:
+          minItems: 1
+          type: array
+          description: It indicates the list of properties that the sensor can sense
+          items:
+            type: string
+        sensorCharacteristicList:
+          minItems: 0
+          type: array
+          description: The sensor' characteristics
+          items:
+            $ref: '#/components/schemas/SensorCharacteristic'
+        sensorPosition:
+          $ref: '#/components/schemas/Point'
+      example:
+        sensorPosition:
+          latitude: 0.80082819046101150206595775671303272247314453125
+          longitude: 6.02745618307040320615897144307382404804229736328125
+        sensorPropertyList:
+        - sensorPropertyList
+        - sensorPropertyList
+        sensorType: sensorType
+        sensorCharacteristicList:
+        - characteristicName: characteristicName
+          characteristicUnitOfMeasure: characteristicUnitOfMeasure
+          characteristicValue: characteristicValue
+        - characteristicName: characteristicName
+          characteristicUnitOfMeasure: characteristicUnitOfMeasure
+          characteristicValue: characteristicValue
+        sensorIdentifier: sensorIdentifier
+    SensorDiscoveryEventSubscription:
+      title: SensorDiscoveryEventSubscription
+      required:
+      - subscriptionType
+      type: object
+      properties:
+        subscriptionType:
+          $ref: '#/components/schemas/SubscriptionType'
+        callbackReference:
+          type: string
+          description: URI exposed by the client on which to receive notifications
+            via HTTP
+          format: uri
+        requestTestNotification:
+          type: boolean
+          description: "Set to TRUE by the MEC application to request a test notification\
+            \ via HTTP on the callbackReference URI,"
+        websockNotifConfig:
+          $ref: '#/components/schemas/WebsockNotifConfig'
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinks'
+        sensorInfoList:
+          type: array
+          description: Object containing the characteristics of the sensor(s) to be
+            selected for the subscription
+          items:
+            type: string
+        geographicalArea:
+          type: array
+          description: The parameters describing the area to subscribe
+          items:
+            $ref: '#/components/schemas/AreaInfo'
+        expiryDeadline:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        sensorInfoList:
+        - sensorInfoList
+        - sensorInfoList
+        subscriptionType: SensorDiscoveryEventSubscription
+        _links:
+          self:
+            href: href
+        callbackReference: http://example.com/aeiou
+        expiryDeadline:
+          seconds: 1
+          nanoSeconds: 5
+        websockNotifConfig:
+          requestWebsocketUri: true
+          websocketUri: http://example.com/aeiou
+        requestTestNotification: true
+        geographicalArea:
+        - shape: 0
+          radius: 6
+          points:
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+        - shape: 0
+          radius: 6
+          points:
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+    SensorStatusSubscription:
+      title: SensorStatusSubscription
+      required:
+      - subscriptionType
+      type: object
+      properties:
+        subscriptionType:
+          $ref: '#/components/schemas/SubscriptionType'
+        callbackReference:
+          type: string
+          description: URI exposed by the client on which to receive notifications
+            via HTTP
+          format: uri
+        requestTestNotification:
+          type: boolean
+          description: "Set to TRUE by the MEC application to request a test notification\
+            \ via HTTP on the callbackReference URI,"
+        websockNotifConfig:
+          $ref: '#/components/schemas/WebsockNotifConfig'
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinks'
+        expiryDeadline:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        subscriptionType: SensorDiscoveryEventSubscription
+        _links:
+          self:
+            href: href
+        callbackReference: http://example.com/aeiou
+        expiryDeadline:
+          seconds: 1
+          nanoSeconds: 5
+        websockNotifConfig:
+          requestWebsocketUri: true
+          websocketUri: http://example.com/aeiou
+        requestTestNotification: true
+    SensorDataSubscription:
+      title: SensorDataSubscription
+      required:
+      - subscriptionType
+      type: object
+      properties:
+        subscriptionType:
+          $ref: '#/components/schemas/SubscriptionType'
+        callbackReference:
+          type: string
+          description: URI exposed by the client on which to receive notifications
+            via HTTP
+          format: uri
+        requestTestNotification:
+          type: boolean
+          description: "Set to TRUE by the MEC application to request a test notification\
+            \ via HTTP on the callbackReference URI,"
+        websockNotifConfig:
+          $ref: '#/components/schemas/WebsockNotifConfig'
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinks'
+        expiryDeadline:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        subscriptionType: SensorDiscoveryEventSubscription
+        _links:
+          self:
+            href: href
+        callbackReference: http://example.com/aeiou
+        expiryDeadline:
+          seconds: 1
+          nanoSeconds: 5
+        websockNotifConfig:
+          requestWebsocketUri: true
+          websocketUri: http://example.com/aeiou
+        requestTestNotification: true
+    SubscriptionType:
+      title: SubscriptionType
+      type: string
+      enum:
+      - SensorDiscoveryEventSubscription
+      - SensorStatusSubscription
+      - SensorDataSubscription
+    WebsockNotifConfig:
+      type: object
+      properties:
+        websocketUri:
+          type: string
+          description: Set by AMS to indicate to the service consumer the Websocket
+            URI to be used for delivering notifications.
+          format: uri
+        requestWebsocketUri:
+          type: boolean
+          description: Set to true by the service consumer to indicate that Websocket
+            delivery is requested.
+      example:
+        requestWebsocketUri: true
+        websocketUri: http://example.com/aeiou
+    SensorCharacteristic:
+      required:
+      - characteristicName
+      - characteristicValue
+      type: object
+      properties:
+        characteristicName:
+          type: string
+          description: The name of the characteristic
+        characteristicValue:
+          type: string
+          description: The value of the characteristic.
+        characteristicUnitOfMeasure:
+          type: string
+          description: "The unit of measure of the characteristic (see saref:UnitOfMeasure\
+            \ in ETSI TS 103 264 [4], clause 4.3.8)."
+      description: "This type represents a sensor' characteristic which details the\
+        \ type of sensor and its working functionalities, such as the model of the\
+        \ sensor, the sampling frequency, the operating range, the accuracy"
+      example:
+        characteristicName: characteristicName
+        characteristicUnitOfMeasure: characteristicUnitOfMeasure
+        characteristicValue: characteristicValue
+    Point:
+      required:
+      - latitude
+      - longitude
+      type: object
+      properties:
+        latitude:
+          type: number
+          description: "Location latitude, expressed in the range -90° to +90°"
+        longitude:
+          type: number
+          description: "Location longitude, expressed in the range -180° to +180°."
+      description: This type represents the geographical location of a point
+      example:
+        latitude: 0.80082819046101150206595775671303272247314453125
+        longitude: 6.02745618307040320615897144307382404804229736328125
+    SubscriptionLinks:
+      title: SubscriptionLinks
+      required:
+      - self
+      type: object
+      properties:
+        self:
+          $ref: '#/components/schemas/LinkType'
+      example:
+        self:
+          href: href
+    SubscriptionLinkList.links:
+      title: SubscriptionLinkList.links
+      required:
+      - self
+      type: object
+      properties:
+        self:
+          $ref: '#/components/schemas/LinkType'
+        subscriptions:
+          type: array
+          description: The MEC application's subscriptions
+          items:
+            $ref: '#/components/schemas/SubscriptionLinkList.subscription'
+      description: List of hyperlinks related to the resource.
+      example:
+        subscriptions:
+        - subscriptionType: subscriptionType
+          href: href
+        - subscriptionType: subscriptionType
+          href: href
+        self:
+          href: href
+    SubscriptionLinkList.subscription:
+      title: SubscriptionLinkList.subscription
+      required:
+      - href
+      - subscriptionType
+      type: object
+      properties:
+        href:
+          type: string
+          description: The URI referring to the subscription
+        subscriptionType:
+          type: string
+          description: Type of the subscription
+      example:
+        subscriptionType: subscriptionType
+        href: href
+    SubscriptionLinkList:
+      title: SubscriptionLinkList
+      required:
+      - _links
+      type: object
+      properties:
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinkList.links'
+      example:
+        _links:
+          subscriptions:
+          - subscriptionType: subscriptionType
+            href: href
+          - subscriptionType: subscriptionType
+            href: href
+          self:
+            href: href
+    ProblemDetails:
+      type: object
+      properties:
+        type:
+          type: string
+          description: A URI reference according to IETF RFC 3986 that identifies
+            the problem type
+          format: uri
+        title:
+          type: string
+          description: "A short, human-readable summary of the problem type"
+        status:
+          type: integer
+          description: The HTTP status code for this occurrence of the problem
+          format: uint32
+        detail:
+          type: string
+          description: A human-readable explanation specific to this occurrence of
+            the problem
+        instance:
+          type: string
+          description: A URI reference that identifies the specific occurrence of
+            the problem
+          format: uri
+    LinkType:
+      title: LinkType
+      required:
+      - href
+      type: object
+      properties:
+        href:
+          type: string
+          description: The URI referring to the subscription.
+      description: '''This data type represents a type of link'''
+      example:
+        href: href
+    TimeStamp:
+      title: TimeStamp
+      required:
+      - nanoSeconds
+      - seconds
+      type: object
+      properties:
+        seconds:
+          type: integer
+          description: "'The seconds part of the Time. Time is defined as Unix-time\
+            \ since January 1, 1970, 00:00:00 UTC.'"
+        nanoSeconds:
+          type: integer
+          description: "'The nanoseconds part of the Time. Time is defined as Unix-time\
+            \ since January 1, 1970, 00:00:00 UTC.'"
+      description: "'This data type represents the time stamp as Unix-time since January\
+        \ 1, 1970, 00:00:00 UTC'"
+      example:
+        seconds: 1
+        nanoSeconds: 5
+    ShapeType:
+      title: ShapeType
+      type: integer
+      enum:
+      - null
+      - null
+    AreaInfo:
+      title: AreaInfo
+      required:
+      - points
+      - shape
+      type: object
+      properties:
+        shape:
+          $ref: '#/components/schemas/ShapeType'
+        points:
+          type: array
+          description: Shall include one point if the shape is CIRCLE. Shall include
+            3-15 points if the shape is POLYGON
+          items:
+            $ref: '#/components/schemas/Point'
+        radius:
+          type: integer
+          description: Shall be present if the shape is CIRCLE
+      example:
+        shape: 0
+        radius: 6
+        points:
+        - latitude: 0.80082819046101150206595775671303272247314453125
+          longitude: 6.02745618307040320615897144307382404804229736328125
+        - latitude: 0.80082819046101150206595775671303272247314453125
+          longitude: 6.02745618307040320615897144307382404804229736328125
+    subscriptions_sensor_discovery_body:
+      type: object
+      properties:
+        SensorDiscoveryEventSubscription:
+          $ref: '#/components/schemas/SensorDiscoveryEventSubscription'
+    sensor_discovery_subscriptionId_body:
+      type: object
+      properties:
+        SensorDiscoveryEventSubscription:
+          $ref: '#/components/schemas/SensorDiscoveryEventSubscription'
+    subscriptions_sensor_status_body:
+      type: object
+      properties:
+        SensorStatusSubscription:
+          $ref: '#/components/schemas/SensorStatusSubscription'
+    sensor_status_subscriptionId_body:
+      type: object
+      properties:
+        SensorStatusSubscription:
+          $ref: '#/components/schemas/SensorStatusSubscription'
+    subscriptions_sensor_data_body:
+      type: object
+      properties:
+        SensorDataSubscription:
+          $ref: '#/components/schemas/SensorDataSubscription'
+    status_data_subscriptionId_body:
+      type: object
+      properties:
+        SensorStatusSubscription:
+          $ref: '#/components/schemas/SensorDataSubscription'
diff --git a/go-apps/meep-sss/entrypoint.sh b/go-apps/meep-sss/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f8d612d6d9d89f27dc7f8f03fbcbe7e7cd8bb73a
--- /dev/null
+++ b/go-apps/meep-sss/entrypoint.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+set -e
+
+echo "MEEP_HOST_URL: ${MEEP_HOST_URL}"
+echo "MEEP_SANDBOX_NAME: ${MEEP_SANDBOX_NAME}"
+echo "MEEP_MEP_NAME: ${MEEP_MEP_NAME}"
+echo "MEEP_CODECOV: ${MEEP_CODECOV}"
+if [[ ! -z "${MEEP_MEP_NAME}" ]]; then
+    svcPath="${MEEP_SANDBOX_NAME}/${MEEP_MEP_NAME}"
+else
+    svcPath="${MEEP_SANDBOX_NAME}"
+fi
+
+# Update API yaml basepaths to enable "Try-it-out" feature
+# OAS2: Set relative path to sandbox name + endpoint path (origin will be derived from browser URL)
+# OAS3: Set full path to provided Host URL + sandbox name + endpoint path
+setBasepath() {
+    # OAS3
+    hostName=$(echo "${MEEP_HOST_URL}" | sed -E 's/^\s*.*:\/\///g')
+    echo "Replacing [localhost] with ${hostName} to url in: '$1'"
+    sed -i "s,localhost,${hostName},g" "$1";
+
+    # OAS2 and OAS3
+    echo "Replacing [sandboxname] with ${svcPath} to basepath or url in: '$1'"
+    sed -i "s,sandboxname,${svcPath},g" "$1";
+}
+
+# Set basepath for API files
+for file in /api/*; do
+    if [[ ! -e "$file" ]]; then continue; fi
+    setBasepath "$file"
+done
+
+# Set basepath for user-supplied API files
+for file in /user-api/*; do
+    if [[ ! -e "$file" ]]; then continue; fi
+    setBasepath "$file"
+done
+
+# Start service
+currenttime=`date "+%Y%m%d-%H%M%S"`
+filepath="/codecov/codecov-meep-sss-"
+filename=$filepath$currenttime".out"
+if [ "$MEEP_CODECOV" = 'true' ]; then
+  exec /meep-sss -test.coverprofile=$filename __DEVEL--code-cov
+else
+  exec /meep-sss
+fi
diff --git a/go-apps/meep-sss/go.mod b/go-apps/meep-sss/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..c46ed40ecc81f0c5251b552ca09bac4126b5a3c6
--- /dev/null
+++ b/go-apps/meep-sss/go.mod
@@ -0,0 +1,43 @@
+module github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-sss
+
+go 1.12
+
+require (
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-gis-engine-client v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client v0.0.0
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-subscriptions v0.0.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr v0.0.0
+	github.com/gorilla/handlers v1.5.1
+	github.com/gorilla/mux v1.8.1
+	github.com/prometheus/client_golang v1.9.0
+)
+
+replace (
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client => ../../go-packages/meep-app-support-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr => ../../go-packages/meep-data-key-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model => ../../go-packages/meep-data-model
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-gis-engine-client => ../../go-packages/meep-gis-engine-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger => ../../go-packages/meep-http-logger
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr => ../../go-packages/meep-sss-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics => ../../go-packages/meep-metrics
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model => ../../go-packages/meep-model
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq => ../../go-packages/meep-mq
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../go-packages/meep-redis
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client => ../../go-packages/meep-sandbox-ctrl-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client => ../../go-packages/meep-service-mgmt-client
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-subscriptions => ../../go-packages/meep-subscriptions
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr => ../../go-packages/meep-swagger-api-mgr
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-websocket => ../../go-packages/meep-websocket
+)
diff --git a/go-apps/meep-sss/go.sum b/go-apps/meep-sss/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..d2eacd2e5c2eaef6bcf0775f09b7b004b9fb2d35
--- /dev/null
+++ b/go-apps/meep-sss/go.sum
@@ -0,0 +1,505 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/InterDigitalInc/AdvantEDGE v1.9.2 h1:CAcF+bn5m0Va2mHFL2lE4awU/kjuF6CjC05phiz8vnk=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52 h1:trnwuu/Q8T59kgRjXcSDBODnyZP9wes+bnLn0lx4PgM=
+github.com/RyanCarrier/dijkstra v0.0.0-20190726134004-b51cadb5ae52/go.mod h1:DdR6ymcLl8+sN/XOVNjnYO1NDYfgHskGjreZUDuQCTY=
+github.com/RyanCarrier/dijkstra-1 v0.0.0-20170512020943-0e5801a26345/go.mod h1:OK4EvWJ441LQqGzed5NGB6vKBAE34n3z7iayPcEwr30=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
+github.com/albertorestifo/dijkstra v0.0.0-20160910063646-aba76f725f72/go.mod h1:o+JdB7VetTHjLhU0N57x18B9voDBQe0paApdEAEoEfw=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
+github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
+github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4=
+github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
+github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
+github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
+github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d h1:/WZQPMZNsjZ7IlCpsLGdQBINg5bxKQ1K1sh6awxLtkA=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
+github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237/go.mod h1:UOnLAUmVG5paym8pD3C4B9BQylUDC2vXFJJpT7JrlEA=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU=
+github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
+github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
+github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3 h1:lBNvYUFo7d4fHs8BXUmoTzbdUo4usq6PlP5qn894sGA=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3/go.mod h1:jo59Sv6xirZtbxbaZbCtrQd1CSufmcxJZIC8hm2tepw=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM=
+github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
+golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
diff --git a/go-apps/meep-sss/main.go b/go-apps/meep-sss/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..6a4c028f695a0d2a12ac2eb17a3d7a8852d3dd13
--- /dev/null
+++ b/go-apps/meep-sss/main.go
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	"net/http"
+	"os"
+	"os/signal"
+	"syscall"
+	"time"
+
+	server "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-sss/server"
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	"github.com/prometheus/client_golang/prometheus/promhttp"
+
+	"github.com/gorilla/handlers"
+)
+
+func init() {
+	// Log as JSON instead of the default ASCII formatter.
+	log.MeepJSONLogInit("meep-sss")
+}
+
+func main() {
+	log.Info(os.Args)
+
+	log.Info("Starting SENSORS SHARING Service")
+
+	run := true
+	go func() {
+		sigchan := make(chan os.Signal, 10)
+		signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM)
+		<-sigchan
+		log.Info("Program killed !")
+		// do last actions and wait for all write operations to end
+		run = false
+	}()
+
+	go func() {
+		// Initialize SENSORS SHARING
+		err := server.Init()
+		if err != nil {
+			log.Error("Failed to initialize SENSORS SHARING Service")
+			run = false
+			return
+		}
+
+		// Start SENSORS SHARING Event Handler thread
+		err = server.Run()
+		if err != nil {
+			log.Error("Failed to start SENSORS SHARING Service")
+			run = false
+			return
+		}
+
+		// Start SENSORS SHARING REST API Server
+		router := server.NewRouter()
+		methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST", "PUT"})
+		header := handlers.AllowedHeaders([]string{"content-type"})
+		log.Fatal(http.ListenAndServe(":80", handlers.CORS(methods, header)(router)))
+		run = false
+	}()
+
+	go func() {
+		// Initialize Metrics Endpoint
+		http.Handle("/metrics", promhttp.Handler())
+		log.Fatal(http.ListenAndServe(":9000", nil))
+		run = false
+	}()
+
+	count := 0
+	for {
+		if !run {
+			_ = server.Stop()
+			log.Info("Ran for ", count, " seconds")
+			break
+		}
+		time.Sleep(time.Second)
+		count++
+	}
+
+}
diff --git a/go-apps/meep-sss/main_test.go b/go-apps/meep-sss/main_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..d22beaff7ae32edd7ed2d8ada7495eb071b16d97
--- /dev/null
+++ b/go-apps/meep-sss/main_test.go
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+	"os"
+	"strings"
+	"testing"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+// Build:
+//  $ go test -covermode=count -coverpkg=./... -c -o <name-of-your-app>
+// Run:
+//  $ ./<name-of-your-app> -test.coverprofile=cover.out __DEVEL--code-cov  <your-app-args>
+
+// TestMain is a hack that allows us to figure out what the coverage is during
+// integration tests. I would not recommend that you use a binary built using
+// this hack outside of a test suite.
+func TestMain(t *testing.T) {
+	var (
+		args []string
+		run  bool
+	)
+
+	log.Info(os.Args)
+	for _, arg := range os.Args {
+		switch {
+		case arg == "__DEVEL--code-cov":
+			run = true
+		case strings.HasPrefix(arg, "-test"):
+		case strings.HasPrefix(arg, "__DEVEL"):
+		default:
+			args = append(args, arg)
+		}
+	}
+	os.Args = args
+	log.Info(os.Args)
+
+	if run {
+		main()
+	}
+}
diff --git a/go-apps/meep-sss/sbi/sss-sbi.go b/go-apps/meep-sss/sbi/sss-sbi.go
new file mode 100644
index 0000000000000000000000000000000000000000..28fee729720a7e066762cdad2822d9862d854603
--- /dev/null
+++ b/go-apps/meep-sss/sbi/sss-sbi.go
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sbi
+
+import (
+	"sync"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
+	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
+	tm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr"
+	sam "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-swagger-api-mgr"
+)
+
+const moduleName string = "meep-sss-sbi"
+
+type Point struct {
+	Latitude  float64
+	Longitude float64
+}
+
+type SensorCharacteristic struct {
+	CharacteristicName          string
+	CharacteristicValue         string
+	CharacteristicUnitOfMeasure *string
+}
+
+type SensorDiscoveryInfo struct {
+	SensorIdentifier         string
+	SensorType               string
+	SensorPropertyList       []string
+	SensorCharacteristicList []SensorCharacteristic
+	SensorPosition           *Point
+}
+
+type SensorStatusInfo struct {
+	SensorIdentifier string
+	SensorStatusType string
+	ErrorInformation string
+}
+
+type SbiCfg struct {
+	ModuleName      string
+	SandboxName     string
+	MepName         string
+	RedisAddr       string
+	InfluxAddr      string
+	Locality        []string
+	Protocol        string
+	Host            string
+	Port            int
+	HostId          string
+	Name            string
+	DiscoveryNotify func(map[string]interface{})
+	StatusNotify    func(map[string]interface{})
+	DataNotify      func(map[string]interface{})
+	ScenarioNameCb  func(string)
+	CleanUpCb       func()
+}
+
+type SssSbi struct {
+	moduleName           string
+	sandboxName          string
+	mepName              string
+	scenarioName         string
+	localityEnabled      bool
+	locality             map[string]bool
+	mqLocal              *mq.MsgQueue
+	handlerId            int
+	apiMgr               *sam.SwaggerApiMgr
+	activeModel          *mod.Model
+	sssMgr               *tm.SssMgr
+	protocol             string
+	host                 string
+	port                 int
+	hostId               string
+	name                 string
+	discoveryNotify      func(map[string]interface{})
+	statusNotify         func(map[string]interface{})
+	dataNotify           func(map[string]interface{})
+	updateScenarioNameCB func(string)
+	cleanUpCB            func()
+	mutex                sync.Mutex
+}
+
+var sbi *SssSbi
+
+// Init - SSS Service SBI initialization
+func Init(cfg SbiCfg) (err error) {
+
+	// Create new SBI instance
+	if sbi != nil {
+		sbi = nil
+	}
+	sbi = new(SssSbi)
+	sbi.moduleName = cfg.ModuleName
+	sbi.sandboxName = cfg.SandboxName
+	sbi.mepName = cfg.MepName
+	sbi.scenarioName = ""
+	sbi.updateScenarioNameCB = cfg.ScenarioNameCb
+	sbi.cleanUpCB = cfg.CleanUpCb
+	sbi.protocol = cfg.Protocol
+	sbi.host = cfg.Host
+	sbi.port = cfg.Port
+	sbi.hostId = cfg.HostId
+	sbi.name = cfg.Name
+	sbi.discoveryNotify = cfg.DiscoveryNotify
+	sbi.statusNotify = cfg.StatusNotify
+	sbi.dataNotify = cfg.DataNotify
+
+	// Fill locality map
+	if len(cfg.Locality) > 0 {
+		sbi.locality = make(map[string]bool)
+		for _, locality := range cfg.Locality {
+			sbi.locality[locality] = true
+		}
+		sbi.localityEnabled = true
+	} else {
+		sbi.localityEnabled = false
+	}
+
+	// Create message queue
+	sbi.mqLocal, err = mq.NewMsgQueue(mq.GetLocalName(sbi.sandboxName), moduleName, sbi.sandboxName, cfg.RedisAddr)
+	if err != nil {
+		log.Error("Failed to create Message Queue with error: ", err)
+		return err
+	}
+	log.Info("Message Queue created")
+
+	// Create Swagger API Manager
+	sbi.apiMgr, err = sam.NewSwaggerApiMgr(sbi.moduleName, sbi.sandboxName, sbi.mepName, sbi.mqLocal)
+	if err != nil {
+		log.Error("Failed to create Swagger API Manager. Error: ", err)
+		return err
+	}
+	log.Info("Swagger API Manager created")
+
+	// Create new active scenario model
+	modelCfg := mod.ModelCfg{
+		Name:      "activeScenario",
+		Namespace: sbi.sandboxName,
+		Module:    moduleName,
+		UpdateCb:  nil,
+		DbAddr:    cfg.RedisAddr,
+	}
+	sbi.activeModel, err = mod.NewModel(modelCfg)
+	if err != nil {
+		log.Error("Failed to create model: ", err.Error())
+		return err
+	}
+
+	// Connect to SSS Manager
+	sbi.sssMgr, err = tm.NewSssMgr(sbi.moduleName, sbi.sandboxName, sbi.protocol, sbi.host, sbi.port, sbi.hostId, sbi.name, sbi.discoveryNotify, sbi.statusNotify, sbi.dataNotify)
+	if err != nil {
+		log.Error("Failed connection to SSS Manager: ", err)
+		return err
+	}
+	log.Info("Connected to SSS Manager")
+
+	// Initialize service
+	processActiveScenarioUpdate()
+
+	return nil
+}
+
+// Run - MEEP SSS execution
+func Run() (err error) {
+
+	// Start Swagger API Manager (provider)
+	err = sbi.apiMgr.Start(true, false)
+	if err != nil {
+		log.Error("Failed to start Swagger API Manager with error: ", err.Error())
+		return err
+	}
+	log.Info("Swagger API Manager started")
+
+	// Add module Swagger APIs
+	err = sbi.apiMgr.AddApis()
+	if err != nil {
+		log.Error("Failed to add Swagger APIs with error: ", err.Error())
+		return err
+	}
+	log.Info("Swagger APIs successfully added")
+
+	// Register Message Queue handler
+	handler := mq.MsgHandler{Handler: msgHandler, UserData: nil}
+	sbi.handlerId, err = sbi.mqLocal.RegisterHandler(handler)
+	if err != nil {
+		log.Error("Failed to register message queue handler: ", err.Error())
+		return err
+	}
+
+	return nil
+}
+
+func Stop() (err error) {
+	if sbi == nil {
+		return
+	}
+
+	if sbi.mqLocal != nil {
+		sbi.mqLocal.UnregisterHandler(sbi.handlerId)
+	}
+
+	if sbi.apiMgr != nil {
+		// Remove APIs
+		err = sbi.apiMgr.RemoveApis()
+		if err != nil {
+			log.Error("Failed to remove APIs with err: ", err.Error())
+			return err
+		}
+	}
+
+	// Delete SSS Manager
+	if sbi.sssMgr != nil {
+		err = sbi.sssMgr.DeleteSssMgr()
+		if err != nil {
+			log.Error(err.Error())
+			return err
+		}
+	}
+
+	return nil
+}
+
+// Message Queue handler
+func msgHandler(msg *mq.Msg, userData interface{}) {
+	switch msg.Message {
+	case mq.MsgScenarioActivate:
+		log.Debug("RX MSG: ", mq.PrintMsg(msg))
+		processActiveScenarioUpdate()
+	case mq.MsgScenarioUpdate:
+		log.Debug("RX MSG: ", mq.PrintMsg(msg))
+		processActiveScenarioUpdate()
+	case mq.MsgScenarioTerminate:
+		log.Debug("RX MSG: ", mq.PrintMsg(msg))
+		processActiveScenarioTerminate()
+	default:
+		log.Trace("Ignoring unsupported message: ", mq.PrintMsg(msg))
+	}
+}
+
+func processActiveScenarioTerminate() {
+	log.Debug("processActiveScenarioTerminate")
+
+	// Sync with active scenario store
+	sbi.activeModel.UpdateScenario()
+
+	// Update scenario name
+	sbi.scenarioName = ""
+
+	sbi.cleanUpCB()
+}
+
+func processActiveScenarioUpdate() {
+	sbi.mutex.Lock()
+	defer sbi.mutex.Unlock()
+
+	log.Debug("processActiveScenarioUpdate")
+	sbi.activeModel.UpdateScenario()
+
+	// Process new scenario
+	var scenarioName = sbi.activeModel.GetScenarioName()
+	if scenarioName != sbi.scenarioName {
+		log.Info("processActiveScenarioUpdate: Entering in then")
+		// Update scenario name
+		sbi.scenarioName = scenarioName
+		sbi.updateScenarioNameCB(sbi.scenarioName)
+
+		// err := initializeIotMessageDistribution()
+		// if err != nil {
+		// 	log.Error("Failed to initialize V2X message distribution: ", err)
+		// 	return
+		// }
+	}
+}
+
+func SensorDiscoveryInfoAll() (sensors []SensorDiscoveryInfo, err error) {
+	log.Info("sbi.SensorDiscoveryInfoAll")
+
+	s, err := sbi.sssMgr.SensorDiscoveryInfoAll()
+	if err != nil {
+		return nil, err
+	}
+	//log.Info("sbi.SensorDiscoveryInfoAll: s: ", s)
+
+	sensors = convertSensorDiscoveryInfoListFromSssMgr(s)
+	log.Info("sbi.SensorDiscoveryInfoAll: sensors: ", sensors)
+
+	return sensors, nil
+}
+
+func GetSensorStatus(sensorIdentifier string) (status SensorStatusInfo, err error) {
+	log.Info("sbi.GetSensorStatus")
+
+	s, err := sbi.sssMgr.GetSensor(sensorIdentifier)
+	if err != nil {
+		return status, err
+	}
+	log.Info("sbi.GetSensorStatus: s: ", s)
+
+	sensor := convertSensorDiscoveryInfoFromSssMgr(s)
+	log.Info("sbi.GetSensorStatus: sensors: ", sensor)
+
+	// FIXME FSCOM CHeck status of the sensor???
+	status = SensorStatusInfo{
+		SensorIdentifier: sensor.SensorIdentifier,
+		SensorStatusType: "ONLINE",
+		ErrorInformation: "",
+	}
+
+	return status, nil
+}
+
+func convertSensorDiscoveryInfoListFromSssMgr(s []tm.SensorDiscoveryInfo) (sensors []SensorDiscoveryInfo) {
+	sensors = make([]SensorDiscoveryInfo, len(s))
+	for i, val := range s {
+		sensors[i] = convertSensorDiscoveryInfoFromSssMgr(val)
+	} // End of 'for' statement
+
+	return sensors
+}
+
+func convertSensorDiscoveryInfoFromSssMgr(s tm.SensorDiscoveryInfo) (sensor SensorDiscoveryInfo) {
+	sensor = SensorDiscoveryInfo{
+		SensorIdentifier: s.SensorIdentifier,
+		SensorType:       s.SensorType,
+	}
+	if len(s.SensorPropertyList) != 0 {
+		sensor.SensorPropertyList = make([]string, len(s.SensorPropertyList))
+		copy(sensor.SensorPropertyList, s.SensorPropertyList)
+	}
+	if len(s.SensorCharacteristicList) != 0 {
+		sensor.SensorCharacteristicList = make([]SensorCharacteristic, len(s.SensorCharacteristicList))
+		for i, val := range s.SensorCharacteristicList {
+			sensor.SensorCharacteristicList[i] = SensorCharacteristic{
+				CharacteristicName:          val.CharacteristicName,
+				CharacteristicValue:         val.CharacteristicValue,
+				CharacteristicUnitOfMeasure: val.CharacteristicUnitOfMeasure,
+			}
+		} // End of 'for' statement
+	}
+	if s.SensorPosition != nil {
+		sensor.SensorPosition = &Point{
+			Latitude:  s.SensorPosition.Latitude,
+			Longitude: s.SensorPosition.Longitude,
+		}
+	}
+
+	return sensor
+}
diff --git a/go-apps/meep-sss/server/README.md b/go-apps/meep-sss/server/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8287eccc13b1964ff6e384c321eeeaf455eaad6b
--- /dev/null
+++ b/go-apps/meep-sss/server/README.md
@@ -0,0 +1,26 @@
+# Go API Server for swagger
+
+GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+
+## Overview
+This server was generated by the [swagger-codegen]
+(https://github.com/swagger-api/swagger-codegen) project.  
+By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.  
+-
+
+To see how to make this your own, look here:
+
+[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md)
+
+- API version: 3.1.1
+- Build date: 2025-01-19T15:36:44.282355504Z[GMT]
+For more information, please visit [https://forge.etsi.org/rep/mec/gs046-ss-api](https://forge.etsi.org/rep/mec/gs046-ss-api)
+
+
+### Running the server
+To run the server, follow these simple steps:
+
+```
+go run main.go
+```
+
diff --git a/go-apps/meep-sss/server/api_managementn.go b/go-apps/meep-sss/server/api_managementn.go
new file mode 100644
index 0000000000000000000000000000000000000000..f871c0d2f7db09846d210af018ea8a3f3e056237
--- /dev/null
+++ b/go-apps/meep-sss/server/api_managementn.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorMgmtPUT(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_data_lookup.go b/go-apps/meep-sss/server/api_sensor_data_lookup.go
new file mode 100644
index 0000000000000000000000000000000000000000..191b7a8a65f79479b8fdc54e489f558711f37d1c
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_data_lookup.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorDataLookupGET(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_data_subscription.go b/go-apps/meep-sss/server/api_sensor_data_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..900b4450b0323c96b495b94e8bb71d375c09348c
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_data_subscription.go
@@ -0,0 +1,35 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorDataIndividualSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	sensorDataIndividualSubscriptionGET(w, r)
+}
+
+func SensorDataSubscriptionDELETE(w http.ResponseWriter, r *http.Request) {
+	sensorDataSubscriptionDELETE(w, r)
+}
+
+func SensorDataSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	sensorDataSubscriptionGET(w, r)
+}
+
+func SensorDataSubscriptionPOST(w http.ResponseWriter, r *http.Request) {
+	sensorDataSubscriptionPOST(w, r)
+}
+
+func SensorDataSubscriptionPUT(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_discovery_lookup.go b/go-apps/meep-sss/server/api_sensor_discovery_lookup.go
new file mode 100644
index 0000000000000000000000000000000000000000..f43d966035e995cfccf0aa5be897530c3d4537db
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_discovery_lookup.go
@@ -0,0 +1,22 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorDiscoveryLookupGET(w http.ResponseWriter, r *http.Request) {
+	sensorDiscoveryLookupGET(w, r)
+}
+
+func Mec011AppTerminationPOST(w http.ResponseWriter, r *http.Request) {
+	mec011AppTerminationPost(w, r)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_discovery_subscription.go b/go-apps/meep-sss/server/api_sensor_discovery_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..208f1f98e73f525e02fa7725ec0ce411120fbb05
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_discovery_subscription.go
@@ -0,0 +1,35 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorDiscoveryIndividualSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	sensorDiscoveryIndividualSubscriptionGET(w, r)
+}
+
+func SensorDiscoverySubscriptionDELETE(w http.ResponseWriter, r *http.Request) {
+	sensorDiscoverySubscriptionDELETE(w, r)
+}
+
+func SensorDiscoverySubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	sensorDiscoverySubscriptionGET(w, r)
+}
+
+func SensorDiscoverySubscriptionPOST(w http.ResponseWriter, r *http.Request) {
+	sensorDiscoverySubscriptionPOST(w, r)
+}
+
+func SensorDiscoverySubscriptionPUT(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_management.go b/go-apps/meep-sss/server/api_sensor_management.go
new file mode 100644
index 0000000000000000000000000000000000000000..f3864b8580672556cdc0191c9b9726d47050b092
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_management.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorMgmtGET(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_status_lookup.go b/go-apps/meep-sss/server/api_sensor_status_lookup.go
new file mode 100644
index 0000000000000000000000000000000000000000..3c6d79cc9618637e68e93e4339133f2752d66c10
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_status_lookup.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorStatusLookupGET(w http.ResponseWriter, r *http.Request) {
+	sensorStatusLookupGET(w, r)
+}
diff --git a/go-apps/meep-sss/server/api_sensor_status_subscription.go b/go-apps/meep-sss/server/api_sensor_status_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..fbd66aa3de2acd05e50f891171789b650fab9278
--- /dev/null
+++ b/go-apps/meep-sss/server/api_sensor_status_subscription.go
@@ -0,0 +1,27 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorStatusIndividualSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	sensorStatusIndividualSubscriptionGET(w, r)
+}
+
+func SensorStatusSubscriptionDELETE(w http.ResponseWriter, r *http.Request) {
+	sensorStatusSubscriptionDELETE(w, r)
+}
+
+func SensorStatusSubscriptionPUT(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+	w.WriteHeader(http.StatusOK)
+}
diff --git a/go-apps/meep-sss/server/api_status_status_subscription.go b/go-apps/meep-sss/server/api_status_status_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..f7d79405636c4488904ff5e62bc84fbd0c887ba0
--- /dev/null
+++ b/go-apps/meep-sss/server/api_status_status_subscription.go
@@ -0,0 +1,22 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"net/http"
+)
+
+func SensorStatusSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	sensorStatusSubscriptionGET(w, r)
+}
+
+func SensorStatusSubscriptionPOST(w http.ResponseWriter, r *http.Request) {
+	sensorStatusSubscriptionPOST(w, r)
+}
diff --git a/go-apps/meep-sss/server/convert.go b/go-apps/meep-sss/server/convert.go
new file mode 100644
index 0000000000000000000000000000000000000000..0671a0cc1262fb012aeb122daea7b3b15e838dfb
--- /dev/null
+++ b/go-apps/meep-sss/server/convert.go
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server
+
+import (
+	"encoding/json"
+	//"fmt"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+func convertProblemDetailstoJson(probdetails *ProblemDetails) string {
+	jsonInfo, err := json.Marshal(*probdetails)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
+
+func convertSensorDiscoveryInfoListToJson(sensors []SensorDiscoveryInfo) string {
+	jsonInfo, err := json.Marshal(sensors)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
+
+func convertSensorStatusToJson(status SensorStatusInfo) string {
+	jsonInfo, err := json.Marshal(status)
+	if err != nil {
+		log.Error(err.Error())
+		return ""
+	}
+	return string(jsonInfo)
+}
diff --git a/go-apps/meep-sss/server/logger.go b/go-apps/meep-sss/server/logger.go
new file mode 100644
index 0000000000000000000000000000000000000000..2d1fb72bf379e2307184fa5c56db31edb79158df
--- /dev/null
+++ b/go-apps/meep-sss/server/logger.go
@@ -0,0 +1,32 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"log"
+	"net/http"
+	"time"
+)
+
+func Logger(inner http.Handler, name string) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		start := time.Now()
+
+		inner.ServeHTTP(w, r)
+
+		log.Printf(
+			"%s %s %s %s",
+			r.Method,
+			r.RequestURI,
+			name,
+			time.Since(start),
+		)
+	})
+}
diff --git a/go-apps/meep-sss/server/meep-sss.go b/go-apps/meep-sss/server/meep-sss.go
new file mode 100644
index 0000000000000000000000000000000000000000..d07e22f94a1efdee4ce4562fd1ea6c6d15cb002d
--- /dev/null
+++ b/go-apps/meep-sss/server/meep-sss.go
@@ -0,0 +1,1882 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"os"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+
+	sbi "github.com/InterDigitalInc/AdvantEDGE/go-apps/meep-sss/sbi"
+	asc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-app-support-client"
+	dkm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr"
+	httpLog "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger"
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	met "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics"
+	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
+	scc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sandbox-ctrl-client"
+	smc "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-service-mgmt-client"
+
+	"github.com/gorilla/mux"
+	//uuid "github.com/google/uuid"
+)
+
+const moduleName = "meep-sss"
+const sssBasePath = "sens/v1/"
+const sssKey = "sens"
+
+const serviceName = "SSS Service"
+const serviceCategory = "SSS"
+const defaultMepName = "global"
+const defaultScopeOfLocality = "MEC_SYSTEM"
+const defaultConsumedLocalOnly = true
+const appTerminationPath = "notifications/mec011/appTermination"
+
+var redisAddr string = "meep-redis-master.default.svc.cluster.local:6379"
+var influxAddr string = "http://meep-influxdb.default.svc.cluster.local:8086"
+var sbxCtrlUrl string = "http://meep-sandbox-ctrl"
+
+var currentStoreName = ""
+
+var IOT_DB = 0
+
+var rc *redis.Connector
+var hostUrl *url.URL
+var instanceId string
+var instanceName string
+var sandboxName string
+var mepName string = defaultMepName
+var scopeOfLocality string = defaultScopeOfLocality
+var consumedLocalOnly bool = defaultConsumedLocalOnly
+var locality []string
+var basePath string
+var baseKey string
+
+const serviceAppVersion = "3.1.1"
+
+var serviceAppInstanceId string
+
+var appEnablementUrl string
+var appEnablementEnabled bool
+var sendAppTerminationWhenDone bool = false
+var appTermSubId string
+var appEnablementServiceId string
+var appSupportClient *asc.APIClient
+var svcMgmtClient *smc.APIClient
+var sbxCtrlClient *scc.APIClient
+
+var registrationTicker *time.Ticker
+
+const SENS_DISCOVERY = "SensorDiscoveryEventSubscription"
+const SENS_STATUS = "SensorStatusSubscription"
+const SENS_DATA = "SensorDataSubscription"
+
+const SENS_DISCOVERY_NOTIF = "SensorDiscoveryEventNotification"
+const SENS_SATUS_NOTIF = "SensorStatusNotification"
+const SENS_DATA_NOTIF = "SensorDataNotification"
+
+const TEST_NOTIF = "TestNotification"
+const NOTIFY_EXPIRY = "ExpiryNotification"
+
+var sensorDiscoveryEventSubscriptionMap = map[int]*SensorDiscoveryEventSubscription{}
+var sensorStatusSubscriptionMap = map[int]*SensorStatusSubscription{}
+var sensorDataSubscriptionMap = map[int]*SensorDataSubscription{}
+
+var subscriptionExpiryMap = map[int][]int{}
+
+var mutex sync.Mutex
+var expiryTicker *time.Ticker
+var nextSubscriptionIdAvailable int
+
+var iot_platform_address string = "lab-oai.etsi.org"
+var iot_platform_port int = 31110
+var cse_name string = "laboai-acme-ic-cse"
+var iot_platform_id string = "7feaadbb0400"
+var iot_platform_protocol string = "REST_HTTP"
+
+func getAppInstanceId() (id string, err error) {
+	var appInfo scc.ApplicationInfo
+	appInfo.Id = instanceId
+	appInfo.Name = serviceCategory
+	appInfo.Type_ = "SYSTEM"
+	appInfo.NodeName = mepName
+	if mepName == defaultMepName {
+		appInfo.Persist = true
+	} else {
+		appInfo.Persist = false
+	}
+	response, _, err := sbxCtrlClient.ApplicationsApi.ApplicationsPOST(context.TODO(), appInfo)
+	if err != nil {
+		log.Error("Failed to get App Instance ID with error: ", err)
+		return "", err
+	}
+	return response.Id, nil
+}
+
+func deregisterService(appInstanceId string, serviceId string) error {
+	_, err := svcMgmtClient.MecServiceMgmtApi.AppServicesServiceIdDELETE(context.TODO(), appInstanceId, serviceId)
+	if err != nil {
+		log.Error("Failed to unregister the service to app enablement registry: ", err)
+		return err
+	}
+	return nil
+}
+
+func registerService(appInstanceId string) error {
+	// Build Service Info
+	state := smc.ACTIVE_ServiceState
+	serializer := smc.JSON_SerializerType
+	transportType := smc.REST_HTTP_TransportType
+	localityType := smc.LocalityType(scopeOfLocality)
+	srvInfo := smc.ServiceInfo{
+		SerName:           instanceName,
+		Version:           serviceAppVersion,
+		State:             &state,
+		Serializer:        &serializer,
+		ScopeOfLocality:   &localityType,
+		ConsumedLocalOnly: consumedLocalOnly,
+		TransportInfo: &smc.TransportInfo{
+			Id:       "sandboxTransport",
+			Name:     "REST",
+			Type_:    &transportType,
+			Protocol: "HTTP",
+			Version:  "2.0",
+			Endpoint: &smc.OneOfTransportInfoEndpoint{},
+		},
+		SerCategory: &smc.CategoryRef{
+			Href:    "catalogueHref",
+			Id:      "sssId",
+			Name:    serviceCategory,
+			Version: "v1",
+		},
+	}
+	srvInfo.TransportInfo.Endpoint.Uris = append(srvInfo.TransportInfo.Endpoint.Uris, hostUrl.String()+basePath)
+
+	appServicesPostResponse, _, err := svcMgmtClient.MecServiceMgmtApi.AppServicesPOST(context.TODO(), srvInfo, appInstanceId)
+	if err != nil {
+		log.Error("Failed to register the service to app enablement registry: ", err)
+		return err
+	}
+	log.Info("Application Enablement Service instance Id: ", appServicesPostResponse.SerInstanceId)
+	appEnablementServiceId = appServicesPostResponse.SerInstanceId
+	return nil
+}
+
+func sendReadyConfirmation(appInstanceId string) error {
+	var appReady asc.AppReadyConfirmation
+	appReady.Indication = "READY"
+	_, err := appSupportClient.MecAppSupportApi.ApplicationsConfirmReadyPOST(context.TODO(), appReady, appInstanceId)
+	if err != nil {
+		log.Error("Failed to send a ready confirm acknowlegement: ", err)
+		return err
+	}
+	return nil
+}
+
+func sendTerminationConfirmation(appInstanceId string) error {
+	var appTermination asc.AppTerminationConfirmation
+	operationAction := asc.TERMINATING_OperationActionType
+	appTermination.OperationAction = &operationAction
+	_, err := appSupportClient.MecAppSupportApi.ApplicationsConfirmTerminationPOST(context.TODO(), appTermination, appInstanceId)
+	if err != nil {
+		log.Error("Failed to send a confirm termination acknowlegement: ", err)
+		return err
+	}
+	return nil
+}
+
+func subscribeAppTermination(appInstanceId string) error {
+	var sub asc.AppTerminationNotificationSubscription
+	sub.SubscriptionType = "AppTerminationNotificationSubscription"
+	sub.AppInstanceId = appInstanceId
+	if mepName == defaultMepName {
+		sub.CallbackReference = "http://" + moduleName + "/" + sssBasePath + appTerminationPath
+	} else {
+		sub.CallbackReference = "http://" + mepName + "-" + moduleName + "/" + sssBasePath + appTerminationPath
+	}
+	subscription, _, err := appSupportClient.MecAppSupportApi.ApplicationsSubscriptionsPOST(context.TODO(), sub, appInstanceId)
+	if err != nil {
+		log.Error("Failed to register to App Support subscription: ", err)
+		return err
+	}
+	appTermSubLink := subscription.Links.Self.Href
+	appTermSubId = appTermSubLink[strings.LastIndex(appTermSubLink, "/")+1:]
+	return nil
+}
+
+func unsubscribeAppTermination(appInstanceId string, subId string) error {
+	//only subscribe to one subscription, so we force number to be one, couldn't be anything else
+	_, err := appSupportClient.MecAppSupportApi.ApplicationsSubscriptionDELETE(context.TODO(), appInstanceId, subId)
+	if err != nil {
+		log.Error("Failed to unregister to App Support subscription: ", err)
+		return err
+	}
+	return nil
+}
+
+func mec011AppTerminationPost(w http.ResponseWriter, r *http.Request) {
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	var notification AppTerminationNotification
+	decoder := json.NewDecoder(r.Body)
+	err := decoder.Decode(&notification)
+	if err != nil {
+		log.Error(err.Error())
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	if !appEnablementEnabled {
+		//just ignore the message
+		w.WriteHeader(http.StatusNoContent)
+		return
+	}
+
+	go func() {
+		// Wait to allow app termination response to be sent
+		time.Sleep(20 * time.Millisecond)
+
+		// Deregister service
+		_ = deregisterService(serviceAppInstanceId, appEnablementServiceId)
+
+		// Delete subscriptions
+		_ = unsubscribeAppTermination(serviceAppInstanceId, appTermSubId)
+
+		// Confirm App termination if necessary
+		if sendAppTerminationWhenDone {
+			_ = sendTerminationConfirmation(serviceAppInstanceId)
+		}
+	}()
+
+	w.WriteHeader(http.StatusNoContent)
+}
+
+// Init - SSS Service initialization
+func Init() (err error) {
+
+	// Retrieve Instance ID from environment variable if present
+	instanceIdEnv := strings.TrimSpace(os.Getenv("MEEP_INSTANCE_ID"))
+	if instanceIdEnv != "" {
+		instanceId = instanceIdEnv
+	}
+	log.Info("MEEP_INSTANCE_ID: ", instanceId)
+
+	// Retrieve Instance Name from environment variable
+	instanceName = moduleName
+	instanceNameEnv := strings.TrimSpace(os.Getenv("MEEP_POD_NAME"))
+	if instanceNameEnv != "" {
+		instanceName = instanceNameEnv
+	}
+	log.Info("MEEP_POD_NAME: ", instanceName)
+
+	// Retrieve Sandbox name from environment variable
+	sandboxNameEnv := strings.TrimSpace(os.Getenv("MEEP_SANDBOX_NAME"))
+	if sandboxNameEnv != "" {
+		sandboxName = sandboxNameEnv
+	}
+	if sandboxName == "" {
+		err = errors.New("MEEP_SANDBOX_NAME env variable not set")
+		log.Error(err.Error())
+		return err
+	}
+	log.Info("MEEP_SANDBOX_NAME: ", sandboxName)
+
+	// hostUrl is the url of the node serving the resourceURL
+	// Retrieve public url address where service is reachable, if not present, use Host URL environment variable
+	hostUrl, err = url.Parse(strings.TrimSpace(os.Getenv("MEEP_PUBLIC_URL")))
+	if err != nil || hostUrl == nil || hostUrl.String() == "" {
+		hostUrl, err = url.Parse(strings.TrimSpace(os.Getenv("MEEP_HOST_URL")))
+		if err != nil {
+			hostUrl = new(url.URL)
+		}
+	}
+	log.Info("MEEP_HOST_URL: ", hostUrl)
+
+	// Get MEP name
+	mepNameEnv := strings.TrimSpace(os.Getenv("MEEP_MEP_NAME"))
+	if mepNameEnv != "" {
+		mepName = mepNameEnv
+	}
+	log.Info("MEEP_MEP_NAME: ", mepName)
+
+	// Get App Enablement URL
+	appEnablementEnabled = false
+	appEnablementEnv := strings.TrimSpace(os.Getenv("MEEP_APP_ENABLEMENT"))
+	if appEnablementEnv != "" {
+		appEnablementUrl = "http://" + appEnablementEnv
+		appEnablementEnabled = true
+	}
+	log.Info("MEEP_APP_ENABLEMENT: ", appEnablementUrl)
+
+	// Get scope of locality
+	scopeOfLocalityEnv := strings.TrimSpace(os.Getenv("MEEP_SCOPE_OF_LOCALITY"))
+	if scopeOfLocalityEnv != "" {
+		scopeOfLocality = scopeOfLocalityEnv
+	}
+	log.Info("MEEP_SCOPE_OF_LOCALITY: ", scopeOfLocality)
+
+	// Get local consumption
+	consumedLocalOnlyEnv := strings.TrimSpace(os.Getenv("MEEP_CONSUMED_LOCAL_ONLY"))
+	if consumedLocalOnlyEnv != "" {
+		value, err := strconv.ParseBool(consumedLocalOnlyEnv)
+		if err == nil {
+			consumedLocalOnly = value
+		}
+	}
+	log.Info("MEEP_CONSUMED_LOCAL_ONLY: ", consumedLocalOnly)
+
+	// Get locality
+	localityEnv := strings.TrimSpace(os.Getenv("MEEP_LOCALITY"))
+	if localityEnv != "" {
+		locality = strings.Split(localityEnv, ":")
+	}
+	log.Info("MEEP_LOCALITY: ", locality)
+
+	// Set base path
+	if mepName == defaultMepName {
+		basePath = "/" + sandboxName + "/" + sssBasePath
+	} else {
+		basePath = "/" + sandboxName + "/" + mepName + "/" + sssBasePath
+	}
+
+	// Set base storage key
+	baseKey = dkm.GetKeyRoot(sandboxName) + sssKey + ":mep:" + mepName + ":"
+
+	// Connect to Redis DB (IOT_DB)
+	rc, err = redis.NewConnector(redisAddr, IOT_DB)
+	if err != nil {
+		log.Error("Failed connection to Redis DB (IOT_DB). Error: ", err)
+		return err
+	}
+	_ = rc.DBFlush(baseKey)
+	log.Info("Connected to Redis DB, SSS service table")
+
+	expiryTicker = time.NewTicker(time.Second)
+	go func() {
+		for range expiryTicker.C {
+			checkForExpiredSubscriptions()
+		}
+	}()
+
+	// Initialize SBI
+	sbiCfg := sbi.SbiCfg{
+		ModuleName:      moduleName,
+		SandboxName:     sandboxName,
+		RedisAddr:       redisAddr,
+		Locality:        locality,
+		ScenarioNameCb:  updateStoreName,
+		CleanUpCb:       cleanUp,
+		Protocol:        iot_platform_protocol,
+		Host:            iot_platform_address,
+		Port:            iot_platform_port,
+		Name:            cse_name,
+		HostId:          iot_platform_id,
+		DiscoveryNotify: discoveryNotify,
+		StatusNotify:    statusNotify,
+		DataNotify:      dataNotify,
+	}
+	if mepName != defaultMepName {
+		sbiCfg.MepName = mepName
+	}
+	err = sbi.Init(sbiCfg)
+	if err != nil {
+		log.Error("Failed initialize SBI. Error: ", err)
+		return err
+	}
+	log.Info("SBI Initialized")
+
+	// Create App Enablement REST clients
+	if appEnablementEnabled {
+		// Create Sandbox Controller client
+		sbxCtrlClientCfg := scc.NewConfiguration()
+		sbxCtrlClientCfg.BasePath = sbxCtrlUrl + "/sandbox-ctrl/v1"
+		sbxCtrlClient = scc.NewAPIClient(sbxCtrlClientCfg)
+		if sbxCtrlClient == nil {
+			return errors.New("Failed to create Sandbox Controller REST API client")
+		}
+		log.Info("Create Sandbox Controller REST API client")
+
+		// Create App Support client
+		appSupportClientCfg := asc.NewConfiguration()
+		appSupportClientCfg.BasePath = appEnablementUrl + "/mec_app_support/v2"
+		appSupportClient = asc.NewAPIClient(appSupportClientCfg)
+		if appSupportClient == nil {
+			return errors.New("Failed to create App Enablement App Support REST API client")
+		}
+		log.Info("Create App Enablement App Support REST API client")
+
+		// Create App Info client
+		srvMgmtClientCfg := smc.NewConfiguration()
+		srvMgmtClientCfg.BasePath = appEnablementUrl + "/mec_service_mgmt/v1"
+		svcMgmtClient = smc.NewAPIClient(srvMgmtClientCfg)
+		if svcMgmtClient == nil {
+			return errors.New("Failed to create App Enablement Service Management REST API client")
+		}
+		log.Info("Create App Enablement Service Management REST API client")
+	}
+
+	log.Info("SSS successfully initialized")
+	return nil
+}
+
+// Run - Start SSS
+func Run() (err error) {
+	// Start MEC Service registration ticker
+	if appEnablementEnabled {
+		startRegistrationTicker()
+	}
+	return sbi.Run()
+}
+
+// Stop - Stop SSS
+func Stop() (err error) {
+	// Stop MEC Service registration ticker
+	if appEnablementEnabled {
+		stopRegistrationTicker()
+	}
+	return sbi.Stop()
+}
+
+func startRegistrationTicker() {
+	// Make sure ticker is not running
+	if registrationTicker != nil {
+		log.Warn("Registration ticker already running")
+		return
+	}
+
+	// Wait a few seconds to allow App Enablement Service to start.
+	// This is done to avoid the default 20 second TCP socket connect timeout
+	// if the App Enablement Service is not yet running.
+	log.Info("Waiting for App Enablement Service to start")
+	time.Sleep(5 * time.Second)
+
+	// Start registration ticker
+	registrationTicker = time.NewTicker(time.Duration(5) * time.Second)
+	go func() {
+		mecAppReadySent := false
+		registrationSent := false
+		subscriptionSent := false
+		for range registrationTicker.C {
+			// Get Application instance ID
+			if serviceAppInstanceId == "" {
+				// If a sandbox service, request an app instance ID from Sandbox Controller
+				// Otherwise use the scenario-proiotioned instance ID
+				if mepName == defaultMepName {
+					var err error
+					serviceAppInstanceId, err = getAppInstanceId()
+					if err != nil || serviceAppInstanceId == "" {
+						continue
+					}
+				} else {
+					serviceAppInstanceId = instanceId
+				}
+			}
+
+			// Send App Ready message
+			if !mecAppReadySent {
+				err := sendReadyConfirmation(serviceAppInstanceId)
+				if err != nil {
+					log.Error("Failure when sending the MecAppReady message. Error: ", err)
+					continue
+				}
+				mecAppReadySent = true
+			}
+
+			// Register service instance
+			if !registrationSent {
+				err := registerService(serviceAppInstanceId)
+				if err != nil {
+					log.Error("Failed to register to appEnablement DB, keep trying. Error: ", err)
+					continue
+				}
+				registrationSent = true
+			}
+
+			// Register for graceful termination
+			if !subscriptionSent {
+				err := subscribeAppTermination(serviceAppInstanceId)
+				if err != nil {
+					log.Error("Failed to subscribe to graceful termination. Error: ", err)
+					continue
+				}
+				sendAppTerminationWhenDone = true
+				subscriptionSent = true
+			}
+
+			if mecAppReadySent && registrationSent && subscriptionSent {
+
+				// Registration complete
+				log.Info("Successfully registered with App Enablement Service")
+				stopRegistrationTicker()
+				return
+			}
+		}
+	}()
+}
+
+func stopRegistrationTicker() {
+	if registrationTicker != nil {
+		log.Info("Stopping App Enablement registration ticker")
+		registrationTicker.Stop()
+		registrationTicker = nil
+	}
+}
+
+func cleanUp() {
+	log.Info("Terminate all")
+
+	// Flush all service data
+	rc.DBFlush(baseKey)
+
+	// Reset metrics store name
+	updateStoreName("")
+
+	sensorDiscoveryEventSubscriptionMap = map[int]*SensorDiscoveryEventSubscription{}
+	sensorStatusSubscriptionMap = map[int]*SensorStatusSubscription{}
+	sensorDataSubscriptionMap = map[int]*SensorDataSubscription{}
+}
+
+func updateStoreName(storeName string) {
+	log.Debug(">>> updateStoreName: ", storeName)
+
+	if currentStoreName != storeName {
+		currentStoreName = storeName
+
+		logComponent := moduleName
+		if mepName != defaultMepName {
+			logComponent = moduleName + "-" + mepName
+		}
+		err := httpLog.ReInit(logComponent, sandboxName, storeName, redisAddr, influxAddr)
+		if err != nil {
+			log.Error("Failed to initialise httpLog: ", err)
+			return
+		}
+	}
+}
+
+/*
+ * errHandlerProblemDetails sends an error message
+ * @param {struct} HTTP write reference
+ * @param {string} error contains the error message
+ * @param {int} code contains the error code
+ */
+func errHandlerProblemDetails(w http.ResponseWriter, error string, code int) {
+	var pb ProblemDetails
+	pb.Detail = error
+	pb.Status = int32(code)
+
+	jsonResponse := convertProblemDetailstoJson(&pb)
+
+	w.WriteHeader(code)
+	fmt.Fprint(w, jsonResponse)
+}
+
+func sensorDiscoveryLookupGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorDiscoveryLookupGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Validate query parameters
+	u, _ := url.Parse(r.URL.String())
+	q := u.Query()
+	log.Debug("sensorDiscoveryLookupGET: q: ", q)
+	if len(q) == 0 {
+		err := errors.New("Invalid query parameters")
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	log.Debug("sensorDiscoveryLookupGET: q[type][0]: ", q["type"][0])
+	//log.Debug("sensorDiscoveryLookupGET: q[sensorCharacteristicList][0]: ", q["sensorCharacteristicList"][0])
+	//log.Debug("sensorDiscoveryLookupGET: type(q[sensorCharacteristicList][0]): ", reflect.TypeOf(q["sensorCharacteristicList"][0]))
+	//q: map[geographicalArea:[[object Object]] sensorCharacteristicList:[[object Object]] sensorPropertyList:[string1,string2] type:[string]]","time":"2025-02-04T08:35:35Z"}
+	// /sens/v1/queries/sensor_discovery?type=4&sensorPropertyList=%5B%22con%22%5D&sensorCharacteristicList=%5B%7B%22characteristicName%22%3A%22pi%22%2C%22characteristicUnitOfMeasure%22%3A%22ae_parent%22%7D%5D&geographicalArea=%5B%7B%22shape%22%3A0%2C%22radius%22%3A6%2C%22points%22%3A%5B%7B%22latitude%22%3A0.8008281904610115%2C%22longitude%22%3A6.027456183070403%7D%2C%7B%22latitude%22%3A0.8008281904610115%2C%22longitude%22%3A6.027456183070403%7D%5D%7D%5D' \
+	s, err := sbi.SensorDiscoveryInfoAll()
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	if len(s) == 0 {
+		err := errors.New("No sensor found")
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+	sensors := convertSensorDiscoveryInfoListFromSbi_with_filter(s, q)
+	if len(sensors) == 0 {
+		err := errors.New("No sensor found")
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+
+	// Prepare response and send
+	jsonResponse := convertSensorDiscoveryInfoListToJson(sensors)
+	if jsonResponse == "" {
+		log.Error("Marshalling failure")
+		errHandlerProblemDetails(w, "Marshalling failure", http.StatusInternalServerError)
+		return
+	}
+	log.Info("sensorDiscoveryLookupGET: jsonResponse: ", jsonResponse)
+	fmt.Fprint(w, jsonResponse)
+	w.WriteHeader(http.StatusOK)
+}
+
+func sensorStatusLookupGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorStatusLookupGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Validate query parameters
+	u, _ := url.Parse(r.URL.String())
+	q := u.Query()
+	log.Debug("sensorStatusLookupGET: q: ", q)
+	if _, ok := q["sensorIdentifier"]; !ok {
+		err := errors.New("Invalid query parameters")
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	log.Debug("sensorStatusLookupGET: q[sensorIdentifier][0]: ", q["sensorIdentifier"][0])
+
+	s, err := sbi.GetSensorStatus(q["sensorIdentifier"][0])
+	if err != nil {
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Debug("sensorStatusLookupGET: s: ", s)
+
+	// Prepare response and send
+	jsonResponse := convertSensorStatusToJson(convertSensorStatusInfoFromSbi(s))
+	if jsonResponse == "" {
+		log.Error("Marshalling failure")
+		errHandlerProblemDetails(w, "Marshalling failure", http.StatusInternalServerError)
+		return
+	}
+	log.Info("sensorDiscoveryLookupGET: jsonResponse: ", jsonResponse)
+	fmt.Fprint(w, jsonResponse)
+	w.WriteHeader(http.StatusOK)
+}
+
+func sensorDiscoverySubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorDiscoverySubscriptionGET: ", r)
+
+	subscriptionsGET(SENS_DISCOVERY, w, r)
+}
+
+func sensorStatusSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorStatusSubscriptionPOST: ", r)
+
+	subscriptionsGET(SENS_STATUS, w, r)
+}
+
+func sensorDataSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorDataSubscriptionGET: ", r)
+
+	subscriptionsGET(SENS_DATA, w, r)
+}
+func sensorDiscoverySubscriptionPOST(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorDiscoverySubscriptionPOST: ", r)
+
+	subscriptionsPOST(SENS_DISCOVERY, w, r)
+}
+
+func sensorStatusSubscriptionPOST(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorStatusSubscriptionPOST: ", r)
+
+	subscriptionsPOST(SENS_STATUS, w, r)
+}
+
+func sensorDataSubscriptionPOST(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> sensorDataSubscriptionPOST: ", r)
+
+	subscriptionsPOST(SENS_DATA, w, r)
+}
+
+func sensorDiscoveryIndividualSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	subscriptionsByIdGET(SENS_DISCOVERY, w, r)
+}
+
+func sensorStatusIndividualSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	subscriptionsByIdGET(SENS_STATUS, w, r)
+}
+
+func sensorDataIndividualSubscriptionGET(w http.ResponseWriter, r *http.Request) {
+	subscriptionsByIdGET(SENS_DATA, w, r)
+}
+
+func sensorDiscoverySubscriptionDELETE(w http.ResponseWriter, r *http.Request) {
+	subscriptionDelete(w, r)
+}
+
+func sensorStatusSubscriptionDELETE(w http.ResponseWriter, r *http.Request) {
+	subscriptionDelete(w, r)
+}
+
+func sensorDataSubscriptionDELETE(w http.ResponseWriter, r *http.Request) {
+	subscriptionDelete(w, r)
+}
+
+func subscriptionsPOST(subType string, w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> subscriptionsPOST: ", subType)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	var subscriptionCommon SubscriptionCommon
+	// Read JSON input stream provided in the Request, and stores it in the bodyBytes as bytes
+	bodyBytes, _ := ioutil.ReadAll(r.Body)
+	log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes))
+	// Unmarshal function to converts a JSON-formatted string into a SubscriptionCommon struct and store it in extractSubType
+	err := json.Unmarshal(bodyBytes, &subscriptionCommon)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	log.Info("subscriptionsPost: subscriptionCommon: ", subscriptionCommon)
+
+	// Validating mandatory parameters provided in the request body
+	if subscriptionCommon.SubscriptionType == "" {
+		log.Error("Mandatory SubscriptionType parameter should be present")
+		errHandlerProblemDetails(w, "Mandatory attribute SubscriptionType is missing in the request body.", http.StatusBadRequest)
+		return
+	}
+
+	if subscriptionCommon.SubscriptionType != SENS_DISCOVERY && subscriptionCommon.SubscriptionType != SENS_STATUS && subscriptionCommon.SubscriptionType != SENS_DATA {
+		log.Error("Invalid SubscriptionType")
+		errHandlerProblemDetails(w, "Invalid SubscriptionType", http.StatusBadRequest)
+		return
+	}
+
+	if subscriptionCommon.CallbackReference == "" && subscriptionCommon.WebsockNotifConfig == nil {
+		log.Error("At least one of CallbackReference and WebsockNotifConfig parameters should be present")
+		errHandlerProblemDetails(w, "At least one of CallbackReference and WebsockNotifConfig parameters should be present.", http.StatusBadRequest)
+		return
+	}
+
+	// extract subscription type
+	subscriptionType := subscriptionCommon.SubscriptionType
+
+	// subscriptionId will be generated sequentially
+	newSubsId := nextSubscriptionIdAvailable
+	nextSubscriptionIdAvailable++
+	subsIdStr := strconv.Itoa(newSubsId)
+
+	// create a unique link for every subscription and concatenate subscription to it
+	link := new(SubscriptionLinks)
+	self := new(LinkType)
+	self.Href = hostUrl.String() + basePath + "subscriptions/" + subsIdStr
+	link.Self = self
+
+	// switch statement is based on provided subscriptionType in the request body
+	var jsonResponse string
+	switch subscriptionType {
+	case SENS_DISCOVERY:
+		var sensorDiscoveryEventSubscription SensorDiscoveryEventSubscription
+		jsonResponse, err = processSensorDiscoveryEventSubscription(bodyBytes, link, subsIdStr, &sensorDiscoveryEventSubscription)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		w.Header().Set("Location", sensorDiscoveryEventSubscription.Links.Self.Href)
+
+	case SENS_STATUS:
+		var sensorStatusSubscription SensorStatusSubscription
+		jsonResponse, err = processSensorStatusSubscription(bodyBytes, link, subsIdStr, &sensorStatusSubscription)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		w.Header().Set("Location", sensorStatusSubscription.Links.Self.Href)
+
+	case SENS_DATA:
+		var sensorDataSubscription SensorDataSubscription
+		jsonResponse, err = processSensorDataSubscription(bodyBytes, link, subsIdStr, &sensorDataSubscription)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		w.Header().Set("Location", sensorDataSubscription.Links.Self.Href)
+
+	default:
+		log.Error("Unsupported subscriptionType")
+		return
+	}
+	log.Info("subscriptionsPost: jsonResponse: ", jsonResponse)
+
+	// Prepare & send response
+	w.WriteHeader(http.StatusCreated)
+	fmt.Fprint(w, jsonResponse)
+
+	if subscriptionCommon.RequestTestNotification {
+		links := new(TestNotificationLinks)
+		links.Subscription = self
+		testNotification := TestNotification{
+			Links:            links,
+			NotificationType: TEST_NOTIF,
+		}
+		log.Info("subscriptionsPost: testNotification: ", testNotification)
+		sendTestNotification(subscriptionCommon.CallbackReference, testNotification)
+	}
+}
+
+/*
+ * subscriptionsGET is to retrieve information about all existing subscriptions at /subscriptions endpoint
+ * @param {struct} w HTTP write reference
+ * @param {struct} r contains the HTTP request
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7
+ */
+func subscriptionsGET(subType string, w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> subscriptionsGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// get & validate query param values for sensorIdentifier
+	u, _ := url.Parse(r.URL.String())
+	log.Info("url: ", u.RequestURI())
+	q := u.Query()
+	sensorIdentifier := q.Get("sensorIdentifier")
+	log.Debug("subscriptionsGET: sensorIdentifier: ", sensorIdentifier)
+	sensorIdentifiers := strings.Split(sensorIdentifier, ",")
+	log.Debug("subscriptionsGET: sensorIdentifiers: ", sensorIdentifiers)
+
+	// get the response against particular subscription type
+	response := createSubscriptionLinkList(subType, sensorIdentifiers)
+
+	// prepare & send response
+	jsonResponse, err := json.Marshal(response)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	// success response code
+	w.WriteHeader(http.StatusOK)
+	fmt.Fprint(w, string(jsonResponse))
+}
+
+/*
+ * subscriptionsByIdGET is to retrieve information about all existing subscriptions at /subscriptions endpoint
+ * @param {struct} w HTTP write reference
+ * @param {struct} r contains the HTTP request
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7
+ */
+func subscriptionsByIdGET(subType string, w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> subscriptionsByIdGET: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// get & validate query param values for sensorIdentifier
+	u, _ := url.Parse(r.URL.String())
+	log.Info("url: ", u.RequestURI())
+
+	vars := mux.Vars(r)
+	subsIdStr := vars["subscriptionId"]
+	log.Info("subsIdStr: ", subsIdStr)
+
+	q := u.Query()
+	sensorIdentifier := q.Get("sensorIdentifier")
+	log.Debug("subscriptionsByIdGET: sensorIdentifier: ", sensorIdentifier)
+	sensorIdentifiers := strings.Split(sensorIdentifier, ",")
+	log.Debug("subscriptionsByIdGET: sensorIdentifiers: ", sensorIdentifiers)
+
+	// Find subscription entry in Redis DB
+	keyName := baseKey + "subscriptions:" + subsIdStr
+	log.Info("subscriptionsByIdGET: keyName: ", keyName)
+	subscription, err := rc.JSONGetEntry(keyName, ".")
+	if err != nil {
+		err = errors.New("subscription not found against the provided subscriptionId")
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+	log.Info("subscriptionsByIdGET: subscription: ", subscription)
+
+	var jsonResponse []byte
+	if subType == SENS_DISCOVERY && isSubscriptionIdRegisteredSensorDiscoveryEvent(subsIdStr) {
+		var subResp SensorDiscoveryEventSubscription
+		err = json.Unmarshal([]byte(subscription), &subResp)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		if *subResp.SubscriptionType != SENS_DISCOVERY {
+			err = errors.New("subscriptionType mismatch")
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+			return
+		}
+		// prepare response
+		jsonResponse, err = json.Marshal(&subResp)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+	} else if subType == SENS_STATUS && isSubscriptionIdRegisteredSensorStatus(subsIdStr) {
+		var subResp SensorStatusSubscription
+		err = json.Unmarshal([]byte(subscription), &subResp)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		if *subResp.SubscriptionType != SENS_STATUS {
+			err = errors.New("subscriptionType mismatch")
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+			return
+		}
+		// prepare response
+		jsonResponse, err = json.Marshal(&subResp)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+	} else if subType == SENS_DATA && isSubscriptionIdRegisteredSensorData(subsIdStr) {
+		var subResp SensorDataSubscription
+		err = json.Unmarshal([]byte(subscription), &subResp)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+		if *subResp.SubscriptionType != SENS_DATA {
+			err = errors.New("subscriptionType mismatch")
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+			return
+		}
+		// prepare response
+		jsonResponse, err = json.Marshal(&subResp)
+		if err != nil {
+			log.Error(err.Error())
+			errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+			return
+		}
+	} else {
+		err = errors.New("subscriptionType does not exist")
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusBadRequest)
+		return
+	}
+	log.Info("subscriptionsByIdGET: jsonResponse: ", string(jsonResponse))
+
+	// send response
+	w.WriteHeader(http.StatusOK)
+	fmt.Fprint(w, string(jsonResponse))
+}
+
+func subscriptionDelete(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> subscriptionDelete: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	u, _ := url.Parse(r.URL.String())
+	log.Info("url: ", u.RequestURI())
+
+	vars := mux.Vars(r)
+	subsIdStr := vars["subscriptionId"]
+	log.Info("subsIdStr: ", subsIdStr)
+
+	// Find subscriptionInfo entry in redis DB
+	keyName := baseKey + "subscriptions:" + subsIdStr
+	log.Info("subscriptionDelete: keyName: ", keyName)
+	subscription, err := rc.JSONGetEntry(keyName, ".")
+	if err != nil {
+		err = errors.New("subscription not found against the provided subscriptionId")
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusNotFound)
+		return
+	}
+
+	// Delete subscriptionInfo entry from redis DB
+	err = delSubscription(subsIdStr, subscription, false)
+	if err != nil {
+		log.Error(err.Error())
+		errHandlerProblemDetails(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	// Send response on successful deletion of subscription resource
+	w.WriteHeader(http.StatusNoContent)
+}
+
+/*
+ * processSensorDiscoveryEventSubscription is to create subscription at /subscriptions endpoint
+ * @param {struct} w HTTP write reference
+ * @param {struct} r contains the HTTP request
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7.4.3.4 POST
+ */
+func processSensorDiscoveryEventSubscription(bodyBytes []byte, link *SubscriptionLinks, subsIdStr string, sensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription) (string, error) {
+
+	err := json.Unmarshal(bodyBytes, sensorDiscoveryEventSubscription)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+
+	// Validating mandatory parameters provided in the request body
+	if sensorDiscoveryEventSubscription.SubscriptionType != nil && *sensorDiscoveryEventSubscription.SubscriptionType != SENSOR_DISCOVERY_EVENT_SUBSCRIPTION {
+		err = errors.New("SubscriptionType attribute shall be present in request body")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	if sensorDiscoveryEventSubscription.Links != nil {
+		err = errors.New("Links attribute should not be present in request body")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	// FIXME FSCOM Check filter values
+
+	if sensorDiscoveryEventSubscription.WebsockNotifConfig == nil && sensorDiscoveryEventSubscription.CallbackReference == "" {
+		err = errors.New("Mandatory CallbackReference parameter should be present")
+		log.Error(err.Error())
+		return "", err
+	}
+	if sensorDiscoveryEventSubscription.CallbackReference == "" {
+		err = errors.New("CallbackReference parameter should be present")
+		log.Error(err.Error())
+		return "", err
+	}
+	if sensorDiscoveryEventSubscription.WebsockNotifConfig != nil {
+		err = errors.New("WebsockNotifConfig not supported")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	registerSensorDiscoveryEventSubscription(subsIdStr, nil, sensorDiscoveryEventSubscription)
+
+	sensorDiscoveryEventSubscription.Links = link
+
+	// Store subscription key in redis
+	keyName := baseKey + "subscriptions:" + subsIdStr
+	log.Info("processSensorDiscoveryEventSubscription: keyName: ", keyName)
+	log.Info("processSensorDiscoveryEventSubscription: sensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription)
+	jsonResponse, err := json.Marshal(sensorDiscoveryEventSubscription)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+	jsonResponse_str := string(jsonResponse)
+	err = rc.JSONSetEntry(keyName, ".", jsonResponse_str)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+
+	return jsonResponse_str, nil
+}
+
+/*
+ * registerSensorDiscoveryEventSubscription to register new sensorDiscoveryEventSubscription
+ * @param {string} subsIdStr contains an Id to uniquely subscription
+ * @param {struct} currentSensorDiscoveryEventSubscription contains the existing SensorDiscoveryEventSubscription
+ * @param {struct} sensorDiscoveryEventSubscription contains request body send to /subscriptions endpoint
+ */
+func registerSensorDiscoveryEventSubscription(subId string, currentSensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription, sensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription) {
+	log.Debug(">>> registerSensorDiscoveryEventSubscription: subId: ", subId)
+	log.Debug(">>> registerSensorDiscoveryEventSubscription: currentSensorDiscoveryEventSubscription: ", currentSensorDiscoveryEventSubscription)
+	log.Debug(">>> registerSensorDiscoveryEventSubscription: sensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription)
+
+	subsId, _ := strconv.Atoi(subId)
+	log.Info("registerSensorDiscoveryEventSubscription: subsId: ", subsId)
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	log.Info("registerSensorDiscoveryEventSubscription: Before subscriptionExpiryMap: ", subscriptionExpiryMap)
+	// Replace the current subscription by the new one
+	sensorDiscoveryEventSubscriptionMap[subsId] = sensorDiscoveryEventSubscription
+	if currentSensorDiscoveryEventSubscription != nil {
+		// Update the subscriptionExpiryMap
+		// 1. Find the old one if any
+		if currentSensorDiscoveryEventSubscription.ExpiryDeadline != nil {
+			if *currentSensorDiscoveryEventSubscription.ExpiryDeadline != *sensorDiscoveryEventSubscription.ExpiryDeadline {
+				// 1.1 Remove the existing one
+				intList := subscriptionExpiryMap[int(currentSensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)]
+				// TODO FSCOM Common code with delSubscription, create a function to remove an expiruDeadline from the subscriptionExpiryMap
+				for i, subsIndex := range intList {
+					log.Info("registerSensorDiscoveryEventSubscription: i: ", i)
+					log.Info("registerSensorDiscoveryEventSubscription: subsIndex: ", subsIndex)
+					if subsIndex == subsId {
+						//
+						log.Info("registerSensorDiscoveryEventSubscription: found index, delete entry")
+						// Remove item and update subscriptionExpiryMap
+						subscriptionExpiryMap[int(currentSensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = append(intList[:i], intList[i+1:]...)
+						break
+					}
+				} // End of 'for' statement
+				log.Info("delSubscription: After removal: subscriptionExpiryMap: ", subscriptionExpiryMap)
+
+				// 1.2 And add the new one
+				subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = append(subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)], subsId)
+			}
+		} else {
+			// 2. Add new expiry if any
+			if sensorDiscoveryEventSubscription.ExpiryDeadline != nil {
+				intList := subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)]
+				intList = append(intList, subsId)
+				subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = intList
+			}
+		}
+	} else { // First registration
+		if sensorDiscoveryEventSubscription.ExpiryDeadline != nil {
+			intList := subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)]
+			intList = append(intList, subsId)
+			subscriptionExpiryMap[int(sensorDiscoveryEventSubscription.ExpiryDeadline.Seconds)] = intList
+		}
+	}
+	log.Info("registerSensorDiscoveryEventSubscription: After subscriptionExpiryMap: ", subscriptionExpiryMap)
+	log.Info("New registration: ", subsId, " type: ", SENS_DISCOVERY)
+}
+
+/*
+ * isSubscriptionIdRegisteredSensorDiscoveryEvent to verify if subscription is already registered
+ * @param {string} subsIdStr contains an Id to uniquely subscription
+ * @return {bool} true on success, false otherwise
+ */
+func isSubscriptionIdRegisteredSensorDiscoveryEvent(subsIdStr string) bool {
+	var returnVal bool
+	subsId, _ := strconv.Atoi(subsIdStr)
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	if sensorDiscoveryEventSubscriptionMap[subsId] != nil {
+		returnVal = true
+	} else {
+		returnVal = false
+	}
+	return returnVal
+}
+
+/*
+ * processSensorDiscoveryEventSubscription is to create subscription at /subscriptions endpoint
+ * @param {struct} w HTTP write reference
+ * @param {struct} r contains the HTTP request
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7.7.3.4 POST
+ */
+func processSensorStatusSubscription(bodyBytes []byte, link *SubscriptionLinks, subsIdStr string, sensorStatusSubscription *SensorStatusSubscription) (string, error) {
+
+	err := json.Unmarshal(bodyBytes, sensorStatusSubscription)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+
+	// Validating mandatory parameters provided in the request body
+	if sensorStatusSubscription.SubscriptionType != nil && *sensorStatusSubscription.SubscriptionType != SENSOR_STATUS_SUBSCRIPTION {
+		err = errors.New("SubscriptionType attribute shall be present in request body")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	if sensorStatusSubscription.Links != nil {
+		err = errors.New("Links attribute should not be present in request body")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	// FIXME FSCOM Check filter values
+
+	if sensorStatusSubscription.WebsockNotifConfig == nil && sensorStatusSubscription.CallbackReference == "" {
+		err = errors.New("Mandatory CallbackReference parameter should be present")
+		log.Error(err.Error())
+		return "", err
+	}
+	if sensorStatusSubscription.WebsockNotifConfig != nil {
+		err = errors.New("WebsockNotifConfig not supported")
+		log.Error(err.Error())
+		return "", err
+	}
+	if sensorStatusSubscription.CallbackReference == "" {
+		err = errors.New("CallbackReference parameter should be present")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	registerSensorStatusSubscription(subsIdStr, nil, sensorStatusSubscription)
+
+	sensorStatusSubscription.Links = link
+
+	// Store subscription key in redis
+	keyName := baseKey + "subscriptions:" + subsIdStr
+	log.Info("processSensorStatusSubscription: keyName: ", keyName)
+	log.Info("processSensorStatusSubscription: sensorStatusSubscription: ", sensorStatusSubscription)
+	jsonResponse, err := json.Marshal(sensorStatusSubscription)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+	jsonResponse_str := string(jsonResponse)
+	err = rc.JSONSetEntry(keyName, ".", jsonResponse_str)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+
+	return jsonResponse_str, nil
+}
+
+/*
+ * registerSensorStatusSubscription to register new sensorStatusSubscription
+ * @param {string} subsIdStr contains an Id to uniquely subscription
+ * @param {struct} currentSensorStatusSubscription contains the existing SensorStatusSubscription
+ * @param {struct} sensorStatusSubscription contains request body send to /subscriptions endpoint
+ */
+func registerSensorStatusSubscription(subId string, currentSensorStatusSubscription *SensorStatusSubscription, sensorStatusSubscription *SensorStatusSubscription) {
+	log.Debug(">>> registerSensorStatusSubscription: subId: ", subId)
+	log.Debug(">>> registerSensorStatusSubscription: currentSensorStatusSubscription: ", currentSensorStatusSubscription)
+	log.Debug(">>> registerSensorStatusSubscription: sensorStatusSubscription: ", sensorStatusSubscription)
+
+	subsId, _ := strconv.Atoi(subId)
+	log.Info("registerSensorStatusSubscription: subsId: ", subsId)
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	log.Info("registerSensorStatusSubscription: Before subscriptionExpiryMap: ", subscriptionExpiryMap)
+	// Replace the current subscription by the new one
+	sensorStatusSubscriptionMap[subsId] = sensorStatusSubscription
+	if currentSensorStatusSubscription != nil {
+		// Update the subscriptionExpiryMap
+		// 1. Find the old one if any
+		if currentSensorStatusSubscription.ExpiryDeadline != nil {
+			if *currentSensorStatusSubscription.ExpiryDeadline != *sensorStatusSubscription.ExpiryDeadline {
+				// 1.1 Remove the existing one
+				intList := subscriptionExpiryMap[int(currentSensorStatusSubscription.ExpiryDeadline.Seconds)]
+				// TODO FSCOM Common code with delSubscription, create a function to remove an expiruDeadline from the subscriptionExpiryMap
+				for i, subsIndex := range intList {
+					log.Info("registerSensorStatusSubscription: i: ", i)
+					log.Info("registerSensorStatusSubscription: subsIndex: ", subsIndex)
+					if subsIndex == subsId {
+						//
+						log.Info("registerSensorStatusSubscription: found index, delete entry")
+						// Remove item and update subscriptionExpiryMap
+						subscriptionExpiryMap[int(currentSensorStatusSubscription.ExpiryDeadline.Seconds)] = append(intList[:i], intList[i+1:]...)
+						break
+					}
+				} // End of 'for' statement
+				log.Info("delSubscription: After removal: subscriptionExpiryMap: ", subscriptionExpiryMap)
+
+				// 1.2 And add the new one
+				subscriptionExpiryMap[int(sensorStatusSubscription.ExpiryDeadline.Seconds)] = append(subscriptionExpiryMap[int(sensorStatusSubscription.ExpiryDeadline.Seconds)], subsId)
+			}
+		} else {
+			// 2. Add new expiry if any
+			if sensorStatusSubscription.ExpiryDeadline != nil {
+				intList := subscriptionExpiryMap[int(sensorStatusSubscription.ExpiryDeadline.Seconds)]
+				intList = append(intList, subsId)
+				subscriptionExpiryMap[int(sensorStatusSubscription.ExpiryDeadline.Seconds)] = intList
+			}
+		}
+	} else { // First registration
+		if sensorStatusSubscription.ExpiryDeadline != nil {
+			intList := subscriptionExpiryMap[int(sensorStatusSubscription.ExpiryDeadline.Seconds)]
+			intList = append(intList, subsId)
+			subscriptionExpiryMap[int(sensorStatusSubscription.ExpiryDeadline.Seconds)] = intList
+		}
+	}
+	log.Info("registerSensorStatusSubscription: After subscriptionExpiryMap: ", subscriptionExpiryMap)
+	log.Info("New registration: ", subsId, " type: ", SENS_DISCOVERY)
+}
+
+/*
+ * isSubscriptionIdRegisteredSensorStatus to verify if subscription is already registered
+ * @param {string} subsIdStr contains an Id to uniquely subscription
+ * @return {bool} true on success, false otherwise
+ */
+func isSubscriptionIdRegisteredSensorStatus(subsIdStr string) bool {
+	var returnVal bool
+	subsId, _ := strconv.Atoi(subsIdStr)
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	if sensorStatusSubscriptionMap[subsId] != nil {
+		returnVal = true
+	} else {
+		returnVal = false
+	}
+	return returnVal
+}
+
+/*
+ *  func processSensorDataSubscription(bodyBytes []byte, link *SubscriptionLinks, subsIdStr string, sensorDataSubscription *SensorDataSubscription) (string, error) {
+ is to create subscription at /subscriptions endpoint
+ * @param {struct} w HTTP write reference
+ * @param {struct} r contains the HTTP request
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7.10.3.4 POST
+*/
+func processSensorDataSubscription(bodyBytes []byte, link *SubscriptionLinks, subsIdStr string, sensorDataSubscription *SensorDataSubscription) (string, error) {
+
+	err := json.Unmarshal(bodyBytes, sensorDataSubscription)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+
+	// Validating mandatory parameters provided in the request body
+	if sensorDataSubscription.SubscriptionType != nil && *sensorDataSubscription.SubscriptionType != SENSOR_DATA_SUBSCRIPTION {
+		err = errors.New("SubscriptionType attribute shall be present in request body")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	if sensorDataSubscription.Links != nil {
+		err = errors.New("Links attribute should not be present in request body")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	// FIXME FSCOM Check filter values
+
+	if sensorDataSubscription.WebsockNotifConfig == nil && sensorDataSubscription.CallbackReference == "" {
+		err = errors.New("Mandatory CallbackReference parameter should be present")
+		log.Error(err.Error())
+		return "", err
+	}
+	if sensorDataSubscription.WebsockNotifConfig != nil {
+		err = errors.New("WebsockNotifConfig not supported")
+		log.Error(err.Error())
+		return "", err
+	}
+	if sensorDataSubscription.CallbackReference == "" {
+		err = errors.New("CallbackReference parameter should be present")
+		log.Error(err.Error())
+		return "", err
+	}
+
+	registerSensorDataSubscription(subsIdStr, nil, sensorDataSubscription)
+
+	sensorDataSubscription.Links = link
+
+	// Store subscription key in redis
+	keyName := baseKey + "subscriptions:" + subsIdStr
+	log.Info("processSensorDataSubscription: keyName: ", keyName)
+	log.Info("processSensorDataSubscription: sensorDataSubscription: ", sensorDataSubscription)
+	jsonResponse, err := json.Marshal(sensorDataSubscription)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+	jsonResponse_str := string(jsonResponse)
+	err = rc.JSONSetEntry(keyName, ".", jsonResponse_str)
+	if err != nil {
+		log.Error(err.Error())
+		return "", err
+	}
+
+	return jsonResponse_str, nil
+}
+
+/*
+ * registerSensorDataSubscription to register new sensorDataSubscription
+ * @param {string} subsIdStr contains an Id to uniquely subscription
+ * @param {struct} currentSensorDataSubscription contains the existing SensorDataSubscription
+ * @param {struct} sensorDataSubscription contains request body send to /subscriptions endpoint
+ */
+func registerSensorDataSubscription(subId string, currentSensorDataSubscription *SensorDataSubscription, sensorDataSubscription *SensorDataSubscription) {
+	log.Debug(">>> registerSensorDataSubscription: subId: ", subId)
+	log.Debug(">>> registerSensorDataSubscription: currentSensorDataSubscription: ", currentSensorDataSubscription)
+	log.Debug(">>> registerSensorDataSubscription: sensorDataSubscription: ", sensorDataSubscription)
+
+	subsId, _ := strconv.Atoi(subId)
+	log.Info("registerSensorDataSubscription: subsId: ", subsId)
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	log.Info("registerSensorDataSubscription: Before subscriptionExpiryMap: ", subscriptionExpiryMap)
+	// Replace the current subscription by the new one
+	sensorDataSubscriptionMap[subsId] = sensorDataSubscription
+	if currentSensorDataSubscription != nil {
+		// Update the subscriptionExpiryMap
+		// 1. Find the old one if any
+		if currentSensorDataSubscription.ExpiryDeadline != nil {
+			if *currentSensorDataSubscription.ExpiryDeadline != *sensorDataSubscription.ExpiryDeadline {
+				// 1.1 Remove the existing one
+				intList := subscriptionExpiryMap[int(currentSensorDataSubscription.ExpiryDeadline.Seconds)]
+				// TODO FSCOM Common code with delSubscription, create a function to remove an expiruDeadline from the subscriptionExpiryMap
+				for i, subsIndex := range intList {
+					log.Info("registerSensorDataSubscription: i: ", i)
+					log.Info("registerSensorDataSubscription: subsIndex: ", subsIndex)
+					if subsIndex == subsId {
+						//
+						log.Info("registerSensorDataSubscription: found index, delete entry")
+						// Remove item and update subscriptionExpiryMap
+						subscriptionExpiryMap[int(currentSensorDataSubscription.ExpiryDeadline.Seconds)] = append(intList[:i], intList[i+1:]...)
+						break
+					}
+				} // End of 'for' statement
+				log.Info("delSubscription: After removal: subscriptionExpiryMap: ", subscriptionExpiryMap)
+
+				// 1.2 And add the new one
+				subscriptionExpiryMap[int(sensorDataSubscription.ExpiryDeadline.Seconds)] = append(subscriptionExpiryMap[int(sensorDataSubscription.ExpiryDeadline.Seconds)], subsId)
+			}
+		} else {
+			// 2. Add new expiry if any
+			if sensorDataSubscription.ExpiryDeadline != nil {
+				intList := subscriptionExpiryMap[int(sensorDataSubscription.ExpiryDeadline.Seconds)]
+				intList = append(intList, subsId)
+				subscriptionExpiryMap[int(sensorDataSubscription.ExpiryDeadline.Seconds)] = intList
+			}
+		}
+	} else { // First registration
+		if sensorDataSubscription.ExpiryDeadline != nil {
+			intList := subscriptionExpiryMap[int(sensorDataSubscription.ExpiryDeadline.Seconds)]
+			intList = append(intList, subsId)
+			subscriptionExpiryMap[int(sensorDataSubscription.ExpiryDeadline.Seconds)] = intList
+		}
+	}
+	log.Info("registerSensorDataSubscription: After subscriptionExpiryMap: ", subscriptionExpiryMap)
+	log.Info("New registration: ", subsId, " type: ", SENS_DISCOVERY)
+}
+
+/*
+ * isSubscriptionIdRegisteredSensorData to verify if subscription is already registered
+ * @param {string} subsIdStr contains an Id to uniquely subscription
+ * @return {bool} true on success, false otherwise
+ */
+func isSubscriptionIdRegisteredSensorData(subsIdStr string) bool {
+	var returnVal bool
+	subsId, _ := strconv.Atoi(subsIdStr)
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	if sensorDataSubscriptionMap[subsId] != nil {
+		returnVal = true
+	} else {
+		returnVal = false
+	}
+	return returnVal
+}
+
+func createSubscriptionLinkList(subType string, sensorIdentifiers []string) *SubscriptionLinkList {
+	log.Debug(">>> createSubscriptionLinkList: subType: ", subType)
+	log.Debug(">>> createSubscriptionLinkList: sensorIdentifiers: ", sensorIdentifiers)
+
+	log.Debug("createSubscriptionLinkList: sensorDiscoveryEventSubscriptionMap: ", sensorDiscoveryEventSubscriptionMap)
+	log.Debug("createSubscriptionLinkList: sensorStatusSubscriptionMap: ", sensorStatusSubscriptionMap)
+	log.Debug("createSubscriptionLinkList: sensorDataSubscriptionMap: ", sensorDataSubscriptionMap)
+
+	subscriptionLinkList := new(SubscriptionLinkList)
+
+	links := new(SubscriptionLinkListLinks)
+	self := new(LinkType)
+	self.Href = hostUrl.String() + basePath + "subscriptions"
+
+	links.Self = self
+
+	//loop through all different types of subscription
+	mutex.Lock()
+	defer mutex.Unlock()
+
+	if subType == SENS_DISCOVERY {
+		for _, discoveryEventSubscription := range sensorDiscoveryEventSubscriptionMap {
+			if discoveryEventSubscription != nil {
+				var subscriptions SubscriptionLinkListSubscription
+				subscriptions.Href = discoveryEventSubscription.Links.Self.Href
+				subscriptions.SubscriptionType = SENS_DISCOVERY
+				links.Subscriptions = append(links.Subscriptions, subscriptions)
+			}
+		} // End of 'for' statement
+	} else if subType == SENS_STATUS {
+		for _, statusSubscription := range sensorStatusSubscriptionMap {
+			if statusSubscription != nil {
+				var subscriptions SubscriptionLinkListSubscription
+				subscriptions.Href = statusSubscription.Links.Self.Href
+				subscriptions.SubscriptionType = SENS_STATUS
+				links.Subscriptions = append(links.Subscriptions, subscriptions)
+			}
+		} // End of 'for' statement
+	} else if subType == SENS_DATA {
+		for _, dataSubscription := range sensorDataSubscriptionMap {
+			if dataSubscription != nil {
+				var subscriptions SubscriptionLinkListSubscription
+				subscriptions.Href = dataSubscription.Links.Self.Href
+				subscriptions.SubscriptionType = SENS_DATA_NOTIF
+				links.Subscriptions = append(links.Subscriptions, subscriptions)
+			}
+		} // End of 'for' statement
+	} else { // Build complete list
+		for _, discoveryEventSubscription := range sensorDiscoveryEventSubscriptionMap {
+			if discoveryEventSubscription != nil {
+				var subscriptions SubscriptionLinkListSubscription
+				subscriptions.Href = discoveryEventSubscription.Links.Self.Href
+				subscriptions.SubscriptionType = SENS_DISCOVERY
+				links.Subscriptions = append(links.Subscriptions, subscriptions)
+			}
+		} // End of 'for' statement
+		for _, statusSubscription := range sensorStatusSubscriptionMap {
+			if statusSubscription != nil {
+				var subscriptions SubscriptionLinkListSubscription
+				subscriptions.Href = statusSubscription.Links.Self.Href
+				subscriptions.SubscriptionType = SENS_STATUS
+				links.Subscriptions = append(links.Subscriptions, subscriptions)
+			}
+		} // End of 'for' statement
+		for _, dataSubscription := range sensorDataSubscriptionMap {
+			if dataSubscription != nil {
+				var subscriptions SubscriptionLinkListSubscription
+				subscriptions.Href = dataSubscription.Links.Self.Href
+				subscriptions.SubscriptionType = SENS_DATA
+				links.Subscriptions = append(links.Subscriptions, subscriptions)
+			}
+		} // End of 'for' statement
+	}
+	log.Debug("createSubscriptionLinkList: links.Subscriptions: ", links.Subscriptions)
+
+	subscriptionLinkList.Links = links
+
+	return subscriptionLinkList
+}
+
+/*
+ * checkForExpiredSubscriptions delete those subscriptions whose expiryTime is reached
+ */
+func checkForExpiredSubscriptions() {
+	//log.Debug(">>> checkForExpiredSubscriptions")
+
+	nowTime := int(time.Now().Unix())
+	mutex.Lock()
+	defer mutex.Unlock()
+	for expiryTime, subsIndexList := range subscriptionExpiryMap {
+		if expiryTime <= nowTime {
+			subscriptionExpiryMap[expiryTime] = nil
+			for _, subsId := range subsIndexList {
+				subsIdStr := strconv.Itoa(subsId)
+				keyName := baseKey + "subscriptions:" + subsIdStr
+				log.Info("checkForExpiredSubscriptions: keyName: ", keyName)
+				subscription, err := rc.JSONGetEntry(keyName, ".")
+				if err != nil {
+					log.Error(err.Error())
+					continue
+				}
+				cbRef := ""
+				var notif = ExpiryNotification{}
+				if strings.Contains(subscription, SENS_DISCOVERY) {
+					if sensorDiscoveryEventSubscriptionMap[subsId] != nil {
+						cbRef = sensorDiscoveryEventSubscriptionMap[subsId].CallbackReference
+						notif.NotificationType = SENS_DISCOVERY_NOTIF
+					} else {
+						continue
+					}
+				} else if strings.Contains(subscription, SENS_STATUS) {
+					if sensorStatusSubscriptionMap[subsId] != nil {
+						cbRef = sensorStatusSubscriptionMap[subsId].CallbackReference
+						notif.NotificationType = SENS_SATUS_NOTIF
+					} else {
+						continue
+					}
+				} else if strings.Contains(subscription, SENS_DATA) {
+					if sensorDataSubscriptionMap[subsId] != nil {
+						cbRef = sensorDataSubscriptionMap[subsId].CallbackReference
+						notif.NotificationType = SENS_DATA_NOTIF
+					} else {
+						continue
+					}
+				}
+
+				var expiryTimeStamp TimeStamp
+				expiryTimeStamp.Seconds = int32(expiryTime)
+
+				link := new(ExpiryNotificationLinks)
+				link.Subscription.Href = cbRef
+				notif.Links = link
+
+				notif.ExpiryDeadline = &expiryTimeStamp
+				sendExpiryNotification(link.Subscription.Href, notif)
+
+				// Delete subscription
+				err = delSubscription(subsIdStr, "", true)
+				if err != nil {
+					log.Error(err.Error())
+				}
+			} // End of 'for' statement
+		}
+	} // End of 'for' statement
+}
+
+/*
+ * delSubscription delete expired subscriptions from redis DB
+ */
+func delSubscription(subsId string, subscription string, mutexTaken bool) error {
+	log.Debug(">>> delSubscription: ", subsId)
+
+	keyName := baseKey + "subscriptions:" + subsId
+	log.Info("delSubscription: keyName: ", keyName)
+	err := rc.JSONDelEntry(keyName, ".")
+	if err != nil {
+		log.Error(err.Error())
+		return err
+	}
+	log.Info("delSubscription: Before removal: subscriptionExpiryMap: ", subscriptionExpiryMap)
+	for i, subsIndexList := range subscriptionExpiryMap {
+		log.Info("delSubscription: subsIndexList: ", subsIndexList)
+		for j, subsIndex := range subsIndexList {
+			log.Info("delSubscription: j: ", j)
+			log.Info("delSubscription: subsIndex: ", subsIndex)
+			if strings.Compare(strconv.Itoa(subsIndex), subsId) == 0 {
+				// FIXME FSCOM How to manage it subscriptionExpiryMap
+				log.Info("delSubscription: found index, delete entry")
+				subscriptionExpiryMap[i] = append(subscriptionExpiryMap[i][:j], subscriptionExpiryMap[i][j+1:]...)
+				break
+			}
+		} // End of 'for' statement
+	} // End of 'for' statement
+	log.Info("delSubscription: After removal: subscriptionExpiryMap: ", subscriptionExpiryMap)
+
+	if strings.Contains(subscription, SENS_DISCOVERY) {
+		deregisterSensorDiscoveryEventSubscription(subsId, mutexTaken)
+	} else if strings.Contains(subscription, SENS_STATUS) {
+		deregisterSensorStatusSubscription(subsId, mutexTaken)
+	} else if strings.Contains(subscription, SENS_DATA) {
+		deregisterSensorDataSubscription(subsId, mutexTaken)
+	}
+
+	return nil
+}
+
+func deregisterSensorDiscoveryEventSubscription(subsIdStr string, mutexTaken bool) {
+	log.Debug(">>> deregisterSensorDiscoveryEventSubscription: subsId: ", subsIdStr)
+
+	subsId, _ := strconv.Atoi(subsIdStr)
+	if !mutexTaken {
+		mutex.Lock()
+		defer mutex.Unlock()
+	}
+	log.Info("deregisterSensorDiscoveryEventSubscription: Before sensorDiscoveryEventSubscriptionMap", sensorDiscoveryEventSubscriptionMap)
+	delete(sensorDiscoveryEventSubscriptionMap, subsId)
+	log.Info("deregisterSensorDiscoveryEventSubscription: After sensorDiscoveryEventSubscriptionMap", sensorDiscoveryEventSubscriptionMap)
+
+	log.Info("deregisterSensorDiscoveryEventSubscription: ", subsId, " type: ", SENS_DISCOVERY)
+}
+
+func deregisterSensorStatusSubscription(subsIdStr string, mutexTaken bool) {
+	log.Debug(">>> deregisterSensorStatusSubscription: subsId: ", subsIdStr)
+
+	subsId, _ := strconv.Atoi(subsIdStr)
+	if !mutexTaken {
+		mutex.Lock()
+		defer mutex.Unlock()
+	}
+	log.Info("deregisterSensorStatusSubscription: Before sensorStatusSubscriptionMap", sensorStatusSubscriptionMap)
+	delete(sensorStatusSubscriptionMap, subsId)
+	log.Info("deregisterSensorStatusSubscription: After sensorStatusSubscriptionMap", sensorStatusSubscriptionMap)
+
+	log.Info("deregisterSensorStatusSubscription: ", subsId, " type: ", SENS_STATUS)
+}
+
+func deregisterSensorDataSubscription(subsIdStr string, mutexTaken bool) {
+	log.Debug(">>> deregisterSensorDataSubscription: subsId: ", subsIdStr)
+
+	subsId, _ := strconv.Atoi(subsIdStr)
+	if !mutexTaken {
+		mutex.Lock()
+		defer mutex.Unlock()
+	}
+	log.Info("deregisterSensorDataSubscription: Before sensorDataSubscriptionMap", sensorDataSubscriptionMap)
+	delete(sensorDataSubscriptionMap, subsId)
+	log.Info("deregisterSensorDataSubscription: After sensorDataSubscriptionMap", sensorDataSubscriptionMap)
+
+	log.Info("deregisterSensorDataSubscription: ", subsId, " type: ", SENS_DATA)
+}
+
+/*
+ * sendTestNotification sends test notification to validate callback URI
+ * @param {string} notifyUrl contains the call reference address
+ * @param {struct} notification contains the test notification
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 6
+ */
+func sendTestNotification(notifyUrl string, notification TestNotification) {
+	log.Debug(">>> sendTestNotification: notifyUrl: ", notifyUrl)
+
+	startTime := time.Now()
+	jsonNotif, err := json.Marshal(notification)
+	if err != nil {
+		log.Error(err)
+		return
+	}
+	log.Info("sendTestNotification: jsonNotif: ", string(jsonNotif))
+
+	resp, err := http.Post(notifyUrl, "application/json", bytes.NewBuffer(jsonNotif))
+	log.Info("sendTestNotification: resp: ", resp)
+	duration := float64(time.Since(startTime).Microseconds()) / 1000.0
+	_ = httpLog.LogNotification(notifyUrl, "POST", "", "", string(jsonNotif), resp, startTime)
+	if err != nil {
+		log.Error(err)
+		met.ObserveNotification(sandboxName, serviceName, notification.NotificationType, notifyUrl, nil, duration)
+		return
+	}
+	met.ObserveNotification(sandboxName, serviceName, notification.NotificationType, notifyUrl, resp, duration)
+	defer resp.Body.Close()
+}
+
+/*
+ * sendExpiryNotification send expiry notification to the the corresponding callback reference address
+ * @param {string} notifyUrl contains callback reference address of service consumer
+ * @param {struct} notification struct of type ExpiryNotification
+ */
+func sendExpiryNotification(notifyUrl string, notification ExpiryNotification) {
+	startTime := time.Now()
+	jsonNotif, err := json.Marshal(notification)
+	if err != nil {
+		log.Error(err.Error())
+	}
+
+	resp, err := http.Post(notifyUrl, "application/json", bytes.NewBuffer(jsonNotif))
+	duration := float64(time.Since(startTime).Microseconds()) / 1000.0
+	_ = httpLog.LogNotification(notifyUrl, "POST", "", "", string(jsonNotif), resp, startTime)
+	if err != nil {
+		log.Error(err)
+		met.ObserveNotification(sandboxName, serviceName, notification.NotificationType, notifyUrl, nil, duration)
+		return
+	}
+	met.ObserveNotification(sandboxName, serviceName, notification.NotificationType, notifyUrl, resp, duration)
+	defer resp.Body.Close()
+}
+
+/*
+ * discoveryNotify sends notification to the call reference address
+ * @param {string} notifyUrl contains the call reference address
+ * @param {struct} notification contains notification body of type SensorDiscoveryEventNotification
+ * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7
+ */
+func discoveryNotify(map[string]interface{}) {
+	log.Debug(">>> sendTestNotification: discoveryNotify")
+
+}
+
+func statusNotify(map[string]interface{}) {
+	log.Debug(">>> sendTestNotification: statusNotify")
+
+}
+
+func dataNotify(map[string]interface{}) {
+	log.Debug(">>> sendTestNotification: dataNotify")
+
+}
+
+// func convertSensorDiscoveryInfoListFromSbi(s []sbi.SensorDiscoveryInfo) (sensors []SensorDiscoveryInfo) {
+// 	sensors = make([]SensorDiscoveryInfo, len(s))
+// 	for i, val := range s {
+// 		sensors[i] = convertSensorDiscoveryInfoFromSbi(val)
+// 	} // End of 'for' statement
+
+// 	return sensors
+// }
+
+func convertSensorDiscoveryInfoListFromSbi_with_filter(s []sbi.SensorDiscoveryInfo, filter url.Values) (sensors []SensorDiscoveryInfo) {
+	log.Debug(">>> convertSensorDiscoveryInfoListFromSbi_with_filter: s: ", s)
+	log.Debug(">>> convertSensorDiscoveryInfoListFromSbi_with_filter: filter: ", filter)
+
+	sensors = make([]SensorDiscoveryInfo, 0)
+	for _, val := range s {
+		log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: processing val: ", val.SensorPropertyList)
+		if filter["type"][0] != val.SensorType {
+			log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: ", filter["type"][0], " not found, discard it")
+			continue // Discard it
+		} else {
+			if len(val.SensorPropertyList) != 0 {
+				if f, ok := filter["sensorPropertyList"]; ok {
+					log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: f: ", f)
+					found := 0
+					for _, fu := range f {
+						log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: processing fu: ", fu)
+						l := strings.Split(fu, ",")
+						log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: l: ", l)
+						for _, s := range l {
+							log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: processing s: ", s)
+							for _, v := range val.SensorPropertyList {
+								log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: processing v: ", v)
+								if v == s {
+									found += 1
+									log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: matching: ", found)
+									break // Exit loop on sensor SensorPropertyList
+								}
+							} // End of 'for' statement
+						} // End of 'for' statement
+						log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: found: ", found, " compared to ", len(l))
+						if found == len(l) { // All filter iems found
+							sensors = append(sensors, convertSensorDiscoveryInfoFromSbi(val))
+						} else {
+							break // Exit loop on filter list
+						}
+					} // End of 'for' statement
+					// FIXME FSCOM Add filtering
+				} else {
+					sensors = append(sensors, convertSensorDiscoveryInfoFromSbi(val))
+				}
+			} else {
+				sensors = append(sensors, convertSensorDiscoveryInfoFromSbi(val))
+			}
+		}
+
+	} // End of 'for' statement
+	log.Debug("convertSensorDiscoveryInfoListFromSbi_with_filter: sensors: ", sensors)
+
+	return sensors
+}
+
+func convertSensorDiscoveryInfoFromSbi(s sbi.SensorDiscoveryInfo) (sensor SensorDiscoveryInfo) {
+	sensor = SensorDiscoveryInfo{
+		SensorIdentifier: s.SensorIdentifier,
+		SensorType:       s.SensorType,
+	}
+	if len(s.SensorPropertyList) != 0 {
+		copy(sensor.SensorPropertyList, s.SensorPropertyList)
+	}
+	if len(s.SensorCharacteristicList) != 0 {
+		sensor.SensorCharacteristicList = make([]SensorCharacteristic, len(s.SensorCharacteristicList))
+		for i, val := range s.SensorCharacteristicList {
+			sensor.SensorCharacteristicList[i] = SensorCharacteristic{
+				CharacteristicName:  val.CharacteristicName,
+				CharacteristicValue: val.CharacteristicValue,
+				// TODO FSCOM CharacteristicUnitOfMeasure: val.CharacteristicUnitOfMeasure,
+			}
+		} // End of 'for' statement
+	}
+	if s.SensorPosition != nil {
+		sensor.SensorPosition = &Point{
+			Latitude:  s.SensorPosition.Latitude,
+			Longitude: s.SensorPosition.Longitude,
+		}
+	}
+
+	return sensor
+}
+
+func convertSensorStatusInfoFromSbi(s sbi.SensorStatusInfo) (status SensorStatusInfo) {
+	status = SensorStatusInfo{
+		SensorIdentifier: s.SensorIdentifier,
+		SensorStatusType: s.SensorStatusType,
+		ErrorInformation: s.ErrorInformation,
+	}
+
+	return status
+}
diff --git a/go-apps/meep-sss/server/meep-sss_test.go b/go-apps/meep-sss/server/meep-sss_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..7e875ba0c097c0dc59178586550ac4682b501b8b
--- /dev/null
+++ b/go-apps/meep-sss/server/meep-sss_test.go
@@ -0,0 +1,1868 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on ance "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package server
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"net/http/httptest"
+	"os"
+	"strings"
+	"testing"
+	"time"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	//	met "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics"
+	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
+	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
+
+	"github.com/gorilla/mux"
+)
+
+const testScenario string = `
+ {
+	 "version":"1.5.3",
+	 "name":"test-scenario",
+	 "deployment":{
+		 "netChar":{
+			 "latency":50,
+			 "latencyVariation":5,
+			 "throughputDl":1000,
+			 "throughputUl":1000
+		 },
+		 "domains":[
+			 {
+				 "id":"PUBLIC",
+				 "name":"PUBLIC",
+				 "type":"PUBLIC",
+				 "netChar":{
+					 "latency":6,
+					 "latencyVariation":2,
+					 "throughputDl":1000000,
+					 "throughputUl":1000000
+				 },
+				 "zones":[
+					 {
+						 "id":"PUBLIC-COMMON",
+						 "name":"PUBLIC-COMMON",
+						 "type":"COMMON",
+						 "netChar":{
+							 "latency":5,
+							 "latencyVariation":1,
+							 "throughput":1000000
+						 },
+						 "networkLocations":[
+							 {
+								 "id":"PUBLIC-COMMON-DEFAULT",
+								 "name":"PUBLIC-COMMON-DEFAULT",
+								 "type":"DEFAULT",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":50000,
+									 "throughputUl":50000,
+									 "packetLoss":1
+								 }
+							 }
+						 ]
+					 }
+				 ]
+			 },
+			 {
+				 "id":"4da82f2d-1f44-4945-8fe7-00c0431ef8c7",
+				 "name":"operator-cell1",
+				 "type":"OPERATOR-CELLULAR",
+				 "netChar":{
+					 "latency":6,
+					 "latencyVariation":2,
+					 "throughputDl":1000,
+					 "throughputUl":1000
+				 },
+				 "cellularDomainConfig":{
+					 "mnc":"456",
+					 "mcc":"123",
+					 "defaultCellId":"1234567"
+				 },
+				 "zones":[
+					 {
+						 "id":"operator-cell1-COMMON",
+						 "name":"operator-cell1-COMMON",
+						 "type":"COMMON",
+						 "netChar":{
+							 "latency":5,
+							 "latencyVariation":1,
+							 "throughput":1000
+						 },
+						 "networkLocations":[
+							 {
+								 "id":"operator-cell1-COMMON-DEFAULT",
+								 "name":"operator-cell1-COMMON-DEFAULT",
+								 "type":"DEFAULT",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 }
+							 }
+						 ]
+					 },
+					 {
+						 "id":"0836975f-a7ea-41ec-b0e0-aff43178194d",
+						 "name":"zone1",
+						 "type":"ZONE",
+						 "netChar":{
+							 "latency":5,
+							 "latencyVariation":1,
+							 "throughput":1000
+						 },
+						 "networkLocations":[
+							 {
+								 "id":"zone1-DEFAULT",
+								 "name":"zone1-DEFAULT",
+								 "type":"DEFAULT",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 },
+								 "physicalLocations":[
+									 {
+										 "id":"97b80da7-a74a-4649-bb61-f7fa4fbb2d76",
+										 "name":"zone1-edge1",
+										 "type":"EDGE",
+										 "connected":true,
+										 "processes":[
+											 {
+												 "id":"fcf1269c-a061-448e-aa80-6dd9c2d4c548",
+												 "name":"zone1-edge1-iperf",
+												 "type":"EDGE-APP",
+												 "image":"meep-docker-registry:30001/iperf-server",
+												 "commandArguments":"-c, export; iperf -s -p $IPERF_SERVICE_PORT",
+												 "commandExe":"/bin/bash",
+												 "serviceConfig":{
+													 "name":"zone1-edge1-iperf",
+													 "meSvcName":"iperf",
+													 "ports":[
+														 {
+															 "protocol":"UDP",
+															 "port":80
+														 }
+													 ]
+												 },
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 },
+											 {
+												 "id":"35697e68-c627-4b8d-9cd7-ad8b8e226aee",
+												 "name":"zone1-edge1-svc",
+												 "type":"EDGE-APP",
+												 "image":"meep-docker-registry:30001/demo-server",
+												 "environment":"MGM_GROUP_NAME=svc, MGM_APP_ID=zone1-edge1-svc, MGM_APP_PORT=80",
+												 "serviceConfig":{
+													 "name":"zone1-edge1-svc",
+													 "meSvcName":"svc",
+													 "ports":[
+														 {
+															 "protocol":"TCP",
+															 "port":80
+														 }
+													 ]
+												 },
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 }
+										 ],
+										 "netChar":{
+											 "throughputDl":1000,
+											 "throughputUl":1000
+										 }
+									 }
+								 ]
+							 },
+							 {
+								 "id":"7a6f8077-b0b3-403d-b954-3351e21afeb7",
+								 "name":"zone1-poa-cell1",
+								 "type":"POA-4G",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 },
+								 "poa4GConfig":{
+									 "cellId":"2345678"
+								 },
+								 "geoData": {
+									 "location": {
+										 "type": "Point",
+											 "coordinates": [
+												 7.423547,
+												 43.731724
+									 ]
+									 },
+									 "radius": 400,
+									 "path": null,
+									 "eopMode": null,
+									 "velocity": null
+								 },
+								 "physicalLocations":[
+									 {
+										 "id":"32a2ced4-a262-49a8-8503-8489a94386a2",
+										 "name":"ue1",
+										 "type":"UE",
+										 "connected":true,
+										 "wireless":true,
+										 "processes":[
+											 {
+												 "id":"9bdd6acd-f6e4-44f6-a26c-8fd9abd338a7",
+												 "name":"ue1-iperf",
+												 "type":"UE-APP",
+												 "image":"meep-docker-registry:30001/iperf-client",
+												 "commandArguments":"-c, export; iperf -u -c $IPERF_SERVICE_HOST -p $IPERF_SERVICE_PORT\n-t 3600 -b 50M;",
+												 "commandExe":"/bin/bash",
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 }
+										 ],
+										 "netChar":{
+											 "throughputDl":1000,
+											 "throughputUl":1000
+										 }
+									 },
+									 {
+										 "id":"b1851da5-c9e1-4bd8-ad23-5925c82ee127",
+										 "name":"zone1-fog1",
+										 "type":"FOG",
+										 "connected":true,
+										 "processes":[
+											 {
+												 "id":"c2f2fb5d-4053-4cee-a0ee-e62bbb7751b6",
+												 "name":"zone1-fog1-iperf",
+												 "type":"EDGE-APP",
+												 "image":"meep-docker-registry:30001/iperf-server",
+												 "commandArguments":"-c, export; iperf -s -p $IPERF_SERVICE_PORT;",
+												 "commandExe":"/bin/bash",
+												 "serviceConfig":{
+													 "name":"zone1-fog1-iperf",
+													 "meSvcName":"iperf",
+													 "ports":[
+														 {
+															 "protocol":"UDP",
+															 "port":80
+														 }
+													 ]
+												 },
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 },
+											 {
+												 "id":"53b5806b-e213-4c5a-a181-f1c31c24287b",
+												 "name":"zone1-fog1-svc",
+												 "type":"EDGE-APP",
+												 "image":"meep-docker-registry:30001/demo-server",
+												 "environment":"MGM_GROUP_NAME=svc, MGM_APP_ID=zone1-fog1-svc, MGM_APP_PORT=80",
+												 "serviceConfig":{
+													 "name":"zone1-fog1-svc",
+													 "meSvcName":"svc",
+													 "ports":[
+														 {
+															 "protocol":"TCP",
+															 "port":80
+														 }
+													 ]
+												 },
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 }
+										 ],
+										 "netChar":{
+											 "throughputDl":1000,
+											 "throughputUl":1000
+										 }
+									 }
+								 ]
+							 },
+							 {
+								 "id":"7ff90180-2c1a-4c11-b59a-3608c5d8d874",
+								 "name":"zone1-poa-cell2",
+								 "type":"POA-4G",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 },
+								 "poa4GConfig":{
+									 "cellId":"3456789"
+								 },
+								 "geoData": {
+									 "location": {
+									 "type": "Point",
+									 "coordinates": [
+										 7.423547,
+										 43.731724
+									 ]
+									 },
+									 "radius": 400,
+									 "path": null,
+									 "eopMode": null,
+									 "velocity": null
+								 }
+							 }
+						 ]
+					 },
+					 {
+						 "id":"d1f06b00-4454-4d35-94a5-b573888e7ea9",
+						 "name":"zone2",
+						 "type":"ZONE",
+						 "netChar":{
+							 "latency":5,
+							 "latencyVariation":1,
+							 "throughput":1000
+						 },
+						 "networkLocations":[
+							 {
+								 "id":"zone2-DEFAULT",
+								 "name":"zone2-DEFAULT",
+								 "type":"DEFAULT",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 },
+								 "physicalLocations":[
+									 {
+										 "id":"fb130d18-fd81-43e0-900c-c584e7190302",
+										 "name":"zone2-edge1",
+										 "type":"EDGE",
+										 "connected":true,
+										 "processes":[
+											 {
+												 "id":"5c8276ba-0b78-429d-a0bf-d96f35ba2c77",
+												 "name":"zone2-edge1-iperf",
+												 "type":"EDGE-APP",
+												 "image":"meep-docker-registry:30001/iperf-server",
+												 "commandArguments":"-c, export; iperf -s -p $IPERF_SERVICE_PORT;",
+												 "commandExe":"/bin/bash",
+												 "serviceConfig":{
+													 "name":"zone2-edge1-iperf",
+													 "meSvcName":"iperf",
+													 "ports":[
+														 {
+															 "protocol":"UDP",
+															 "port":80
+														 }
+													 ]
+												 },
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 },
+											 {
+												 "id":"53fa28f0-80e2-414c-8841-86db9bd37d51",
+												 "name":"zone2-edge1-svc",
+												 "type":"EDGE-APP",
+												 "image":"meep-docker-registry:30001/demo-server",
+												 "environment":"MGM_GROUP_NAME=svc, MGM_APP_ID=zone2-edge1-svc, MGM_APP_PORT=80",
+												 "serviceConfig":{
+													 "name":"zone2-edge1-svc",
+													 "meSvcName":"svc",
+													 "ports":[
+														 {
+															 "protocol":"TCP",
+															 "port":80
+														 }
+													 ]
+												 },
+												 "netChar":{
+													 "throughputDl":1000,
+													 "throughputUl":1000
+												 }
+											 }
+										 ],
+										 "netChar":{
+											 "throughputDl":1000,
+											 "throughputUl":1000
+										 }
+									 }
+								 ]
+							 },
+							 {
+								 "id":"c44b8937-58af-44b2-acdb-e4d1c4a1510b",
+								 "name":"zone2-poa1",
+								 "type":"POA",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":20,
+									 "throughputUl":20
+								 }
+							 }
+						 ]
+					 }
+				 ]
+			 },
+			 {
+				 "id":"e29138fb-cf03-4372-8335-fd2665b77a11",
+				 "name":"operator1",
+				 "type":"OPERATOR",
+				 "netChar":{
+					 "latency":6,
+					 "latencyVariation":2,
+					 "throughputDl":1000,
+					 "throughputUl":1000
+				 },
+				 "zones":[
+					 {
+						 "id":"operator1-COMMON",
+						 "name":"operator1-COMMON",
+						 "type":"COMMON",
+						 "netChar":{
+							 "latency":5,
+							 "latencyVariation":1,
+							 "throughputDl":1000,
+							 "throughputUl":1000
+						 },
+						 "networkLocations":[
+							 {
+								 "id":"operator1-COMMON-DEFAULT",
+								 "name":"operator1-COMMON-DEFAULT",
+								 "type":"DEFAULT",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 }
+							 }
+						 ]
+					 },
+					 {
+						 "id":"7d8bee73-6d5c-4c5a-a3a0-49ebe3cd2c71",
+						 "name":"zone3",
+						 "type":"ZONE",
+						 "netChar":{
+							 "latency":5,
+							 "latencyVariation":1,
+							 "throughputDl":1000,
+							 "throughputUl":1000
+						 },
+						 "networkLocations":[
+							 {
+								 "id":"zone3-DEFAULT",
+								 "name":"zone3-DEFAULT",
+								 "type":"DEFAULT",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 }
+							 },
+							 {
+								 "id":"ecc2a41b-7381-4108-a037-52862c520733",
+								 "name":"poa1",
+								 "type":"POA",
+								 "netChar":{
+									 "latency":1,
+									 "latencyVariation":1,
+									 "throughputDl":1000,
+									 "throughputUl":1000
+								 }
+							 }
+						 ]
+					 }
+				 ]
+			 }
+		 ]
+	 }
+ }
+ `
+
+const redisTestAddr = "localhost:30380"
+const influxTestAddr = "http://localhost:30986"
+const testScenarioName = "testScenario"
+
+var m *mod.Model
+var mqLocal *mq.MsgQueue
+
+// func TestSensorDiscoveryLookupGET(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	initializeVars()
+// 	err := Init()
+// 	if err != nil {
+// 		t.Fatalf("Error initializing test basic procedure")
+// 	}
+// 	err = Run()
+// 	if err != nil {
+// 		t.Fatalf("Error running test basic procedure")
+// 	}
+// 	fmt.Println("Set a scenario")
+// 	initialiseScenario(testScenario)
+// 	time.Sleep(1000 * time.Millisecond)
+// 	updateScenario("mobility1")
+
+// 	/******************************
+// 	 * expected response section
+// 	 ******************************/
+
+// 	/******************************
+// 	 * request queries section
+// 	 ******************************/
+// 	queries := make(map[string]string) // Mandatory filter
+// 	queries["type"] = "4"
+
+// 	/******************************
+// 	 * request body section
+// 	 ******************************/
+
+// 	/******************************
+// 	 * request execution section
+// 	 ******************************/
+// 	rr, err := sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusOK, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Respone: rr: ", rr)
+// 	var sensors []SensorDiscoveryInfo
+// 	err = json.Unmarshal([]byte(rr), &sensors)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	if len(sensors) == 0 {
+// 		t.Fatalf("SensorDiscoveryInfo list expected")
+// 	}
+
+// 	fmt.Println("Received expected response")
+// 	/******************************
+// 	 * back to initial state section
+// 	 ******************************/
+// 	terminateScenario()
+// }
+
+// func TestSensorDiscoveryLookupGET_with_opt_filter(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	initializeVars()
+// 	err := Init()
+// 	if err != nil {
+// 		t.Fatalf("Error initializing test basic procedure")
+// 	}
+// 	err = Run()
+// 	if err != nil {
+// 		t.Fatalf("Error running test basic procedure")
+// 	}
+// 	fmt.Println("Set a scenario")
+// 	initialiseScenario(testScenario)
+// 	time.Sleep(1000 * time.Millisecond)
+// 	updateScenario("mobility1")
+
+// 	/******************************
+// 	 * request queries section
+// 	 ******************************/
+// 	queries := make(map[string]string) // Mandatory filter
+// 	queries["type"] = "4"
+
+// 	/******************************
+// 	 * request body section
+// 	 ******************************/
+
+// 	/******************************
+// 	 * request execution section
+// 	 ******************************/
+// 	rr, err := sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusOK, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Respone: rr: ", rr)
+// 	var ref_sensors []SensorDiscoveryInfo
+// 	err = json.Unmarshal([]byte(rr), &ref_sensors)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	if len(ref_sensors) == 0 {
+// 		t.Fatalf("SensorDiscoveryInfo list expected")
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	queries = make(map[string]string)
+// 	queries["type"] = "4"
+// 	queries["sensorPropertyList"] = "rn,cnf,con"
+// 	rr, err = sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusOK, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Respone: rr: ", rr)
+// 	var sensors []SensorDiscoveryInfo
+// 	err = json.Unmarshal([]byte(rr), &sensors)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	if len(sensors) != len(ref_sensors) {
+// 		t.Fatalf("SensorDiscoveryInfo list length invalid")
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	queries = make(map[string]string)
+// 	queries["type"] = "4"
+// 	queries["sensorPropertyList"] = "john,doe"
+// 	_, err = sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusNotFound, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	queries = make(map[string]string)
+// 	queries["type"] = "4"
+// 	queries["sensorPropertyList"] = "rn,john,doe"
+// 	_, err = sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusNotFound, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	/******************************
+// 	 * back to initial state section
+// 	 ******************************/
+// 	terminateScenario()
+// }
+
+// func TestSensorDiscoveryLookupGET_Fail(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	initializeVars()
+// 	err := Init()
+// 	if err != nil {
+// 		t.Fatalf("Error initializing test basic procedure")
+// 	}
+// 	err = Run()
+// 	if err != nil {
+// 		t.Fatalf("Error running test basic procedure")
+// 	}
+// 	fmt.Println("Set a scenario")
+// 	initialiseScenario(testScenario)
+// 	time.Sleep(1000 * time.Millisecond)
+// 	updateScenario("mobility1")
+
+// 	/******************************
+// 	 * request queries section
+// 	 ******************************/
+// 	//  queries := make(map[string]string) // No queries
+// 	//  queries["type"] = "4"
+
+// 	_, err = sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, nil, nil, http.StatusBadRequest, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	queries := make(map[string]string) // No queries
+// 	queries["type"] = "5"
+// 	_, err = sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusNotFound, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	/******************************
+// 	 * back to initial state section
+// 	 ******************************/
+// 	terminateScenario()
+// }
+
+// func TestSensorStatusLookupGET(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	initializeVars()
+// 	err := Init()
+// 	if err != nil {
+// 		t.Fatalf("Error initializing test basic procedure")
+// 	}
+// 	err = Run()
+// 	if err != nil {
+// 		t.Fatalf("Error running test basic procedure")
+// 	}
+// 	fmt.Println("Set a scenario")
+// 	initialiseScenario(testScenario)
+// 	time.Sleep(1000 * time.Millisecond)
+// 	updateScenario("mobility1")
+
+// 	queries := make(map[string]string) // Mandatory filter
+// 	queries["type"] = "4"
+// 	rr, err := sendRequest(http.MethodGet, "/sens/v1/queries/sensor_discovery", nil, nil, queries, nil, http.StatusOK, SensorDiscoveryLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Respone: rr: ", rr)
+// 	var sensors []SensorDiscoveryInfo
+// 	err = json.Unmarshal([]byte(rr), &sensors)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	if len(sensors) == 0 {
+// 		t.Fatalf("SensorDiscoveryInfo list expected")
+// 	}
+// 	fmt.Println("Received expected response")
+
+// 	queries = make(map[string]string)
+// 	queries["sensorIdentifier"] = sensors[0].SensorIdentifier
+// 	rr, err = sendRequest(http.MethodGet, "/sens/v1/queries/sensor_status", nil, nil, queries, nil, http.StatusOK, SensorStatusLookupGET)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("Respone: rr: ", rr)
+// 	var status SensorStatusInfo
+// 	err = json.Unmarshal([]byte(rr), &status)
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	if status.SensorIdentifier != sensors[0].SensorIdentifier {
+// 		t.Fatalf("SensorIdentifier mismatch")
+// 	}
+// 	fmt.Println("Received expected response")
+// 	/******************************
+// 	 * back to initial state section
+// 	 ******************************/
+// 	terminateScenario()
+// }
+
+func TestSensorDiscoveryEventSubscriptionPOST_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	subscriptionType := SENSOR_DISCOVERY_EVENT_SUBSCRIPTION
+	var expected = SensorDiscoveryEventSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	jsonInfo, err := json.Marshal(&expected)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	expected_response := string(jsonInfo)
+	fmt.Println("expected_response: ", expected_response)
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+	var sensorDiscoveryEventSubscription = SensorDiscoveryEventSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorDiscoveryEventSubscription)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_discovery", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, SensorDiscoverySubscriptionPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SensorDiscoveryEventSubscription
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	if !validateSensorDiscoveryEventSubscription(expected, resp) {
+		t.Fatalf("handler returned unexpected body: got %v want %v", rr, expected_response)
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorDiscoveryEventSubscription(resp)
+	terminateScenario()
+}
+
+func TestSensorDiscoveryEventSubscriptionPOST_Fail(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+	var sensorDiscoveryEventSubscription = SensorDiscoveryEventSubscription{
+		// SubscriptionType:  &subscriptionType, // No subscription type
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorDiscoveryEventSubscription)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_discovery", bytes.NewBuffer(body), nil, nil, nil, http.StatusBadRequest, SensorDiscoverySubscriptionPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Received expected response")
+
+	/******************************
+	 * request body section
+	 ******************************/
+	subscriptionType := SENSOR_DISCOVERY_EVENT_SUBSCRIPTION
+	sensorDiscoveryEventSubscription = SensorDiscoveryEventSubscription{
+		SubscriptionType: &subscriptionType,
+		//CallbackReference: "http://test.org", // No callback
+	}
+	body, err = json.Marshal(sensorDiscoveryEventSubscription)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_discovery", bytes.NewBuffer(body), nil, nil, nil, http.StatusBadRequest, SensorDiscoverySubscriptionPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Received expected response")
+
+	/******************************
+	 * request body section
+	 ******************************/
+	sensorDiscoveryEventSubscription = SensorDiscoveryEventSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org", // callback
+		WebsockNotifConfig: &WebsockNotifConfig{ // And WebsockNotifConfig
+			WebsocketUri:        "ws://test.org",
+			RequestWebsocketUri: true,
+		},
+	}
+	body, err = json.Marshal(sensorDiscoveryEventSubscription)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_discovery", bytes.NewBuffer(body), nil, nil, nil, http.StatusInternalServerError, SensorDiscoverySubscriptionPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Received expected response")
+
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	terminateScenario()
+}
+
+func TestSensorDiscoveryEventSubscriptionGET_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	sensorDiscoveryEventSubscription, err := createSensorDiscoveryEventSubscription_no_query()
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("sensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	var expected = SubscriptionLinkList{
+		Links: &SubscriptionLinkListLinks{
+			Self: &LinkType{
+				Href: "http://localhost/testScenario/sens/v1/subscriptions",
+			},
+		},
+	}
+	expected.Links.Subscriptions = append(expected.Links.Subscriptions, SubscriptionLinkListSubscription{Href: "http://localhost/testScenario/sens/v1/subscriptions/2", SubscriptionType: "SensorDiscoveryEventSubscription"})
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/sens/v1/subscriptions/sensor_discovery", nil, nil, nil, nil, http.StatusOK, SensorDiscoverySubscriptionGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SubscriptionLinkList
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("resp", resp)
+	if !validateSubscriptionLinkList(expected, resp) {
+		t.Fatalf("SubscriptionLinkList mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorDiscoveryEventSubscription(sensorDiscoveryEventSubscription)
+	terminateScenario()
+}
+
+func TestSensorDiscoveryEventSubscriptionDELETE(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	sensorDiscoveryEventSubscription, err := createSensorDiscoveryEventSubscription_no_query()
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("sensorDiscoveryEventSubscription: ", sensorDiscoveryEventSubscription)
+	selfUrl := strings.Split(sensorDiscoveryEventSubscription.Links.Self.Href, "/")
+	subscriptionId := selfUrl[len(selfUrl)-1]
+	fmt.Println("subscriptionId = ", subscriptionId)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	vars := make(map[string]string)
+	vars["subscriptionId"] = subscriptionId
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	_, err = sendRequest(http.MethodDelete, "/sens/v1/subscriptions/sensor_discovery", nil, vars, nil, nil, http.StatusNoContent, SensorDiscoverySubscriptionDELETE)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	fmt.Println("Received expected response")
+
+	_, err = sendRequest(http.MethodGet, "/sens/v1/subscriptions/sensor_discovery", nil, vars, nil, nil, http.StatusNotFound, SensorDiscoveryIndividualSubscriptionGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	terminateScenario()
+}
+
+func TestSensorDiscoveryEventSubscriptionByIdGET_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	expected, err := createSensorDiscoveryEventSubscription_no_query()
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	jsonInfo, err := json.Marshal(&expected)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	expected_response := string(jsonInfo)
+	fmt.Println("expected_response: ", expected_response)
+	selfUrl := strings.Split(expected.Links.Self.Href, "/")
+	subscriptionId := selfUrl[len(selfUrl)-1]
+	fmt.Println("subscriptionId = ", subscriptionId)
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	vars := make(map[string]string)
+	vars["subscriptionId"] = subscriptionId
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/sens/v1/subscriptions/sensor_discovery", nil, vars, nil, nil, http.StatusOK, SensorDiscoveryIndividualSubscriptionGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SensorDiscoveryEventSubscription
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	if !validateSensorDiscoveryEventSubscription(expected, resp) {
+		t.Fatalf("handler returned unexpected body: got %v want %v", rr, expected_response)
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorDiscoveryEventSubscription(expected /*resp*/)
+	terminateScenario()
+}
+
+func createSensorDiscoveryEventSubscription_no_query() (sensorDiscoveryEventSubscription SensorDiscoveryEventSubscription, err error) {
+	subscriptionType := SENSOR_DISCOVERY_EVENT_SUBSCRIPTION
+	sensorDiscoveryEventSubscription = SensorDiscoveryEventSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorDiscoveryEventSubscription)
+	if err != nil {
+		return sensorDiscoveryEventSubscription, err
+	}
+
+	rr, err := sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_discovery", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, SensorDiscoverySubscriptionPOST)
+	if err != nil {
+		return sensorDiscoveryEventSubscription, err
+	}
+	err = json.Unmarshal([]byte(rr), &sensorDiscoveryEventSubscription)
+	if err != nil {
+		return sensorDiscoveryEventSubscription, err
+	}
+
+	return sensorDiscoveryEventSubscription, nil
+}
+
+func deleteSensorDiscoveryEventSubscription(sensorDiscoveryEventSubscription SensorDiscoveryEventSubscription) (err error) {
+
+	selfUrl := strings.Split(sensorDiscoveryEventSubscription.Links.Self.Href, "/")
+	subscriptionId := selfUrl[len(selfUrl)-1]
+	fmt.Println("subscriptionId = ", subscriptionId)
+
+	vars := make(map[string]string)
+	vars["subscriptionId"] = subscriptionId
+
+	_, err = sendRequest(http.MethodDelete, "/sens/v1/subscriptions/sensor_discovery", nil, vars, nil, nil, http.StatusNoContent, SensorDiscoverySubscriptionDELETE)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func validateSensorDiscoveryEventSubscription(expected SensorDiscoveryEventSubscription, resp SensorDiscoveryEventSubscription) bool {
+	fmt.Println(">>> validateSensorDiscoveryEventSubscription: expected: ", expected)
+	fmt.Println(">>> validateSensorDiscoveryEventSubscription: resp: ", resp)
+
+	if *expected.SubscriptionType != *resp.SubscriptionType {
+		fmt.Println("expected.SubscriptionType != resp.SubscriptionType")
+		return false
+	}
+	if expected.CallbackReference != resp.CallbackReference {
+		fmt.Println("expected.SubscriptionType != resp.SubscriptionType")
+		return false
+	}
+	if expected.RequestTestNotification != resp.RequestTestNotification {
+		fmt.Println("expected.RequestTestNotification != resp.RequestTestNotification")
+		return false
+	}
+
+	return true
+}
+
+func TestSensorStatusSubscriptionPOST_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	subscriptionType := SENSOR_STATUS_SUBSCRIPTION
+	var expected = SensorStatusSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	jsonInfo, err := json.Marshal(&expected)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	expected_response := string(jsonInfo)
+	fmt.Println("expected_response: ", expected_response)
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+	var sensorStatusSubscription = SensorStatusSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorStatusSubscription)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_status", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, SensorStatusSubscriptionPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SensorStatusSubscription
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	if !validateSensorStatusSubscription(expected, resp) {
+		t.Fatalf("handler returned unexpected body: got %v want %v", rr, expected_response)
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorStatusSubscription(resp)
+	terminateScenario()
+}
+
+func TestSensorStatusSubscriptionGET_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	sensorStatusSubscription, err := createSensorStatusSubscription_no_query()
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("sensorStatusSubscription: ", sensorStatusSubscription)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	var expected = SubscriptionLinkList{
+		Links: &SubscriptionLinkListLinks{
+			Self: &LinkType{
+				Href: "http://localhost/testScenario/sens/v1/subscriptions",
+			},
+		},
+	}
+	expected.Links.Subscriptions = append(expected.Links.Subscriptions, SubscriptionLinkListSubscription{Href: "http://localhost/testScenario/sens/v1/subscriptions/6", SubscriptionType: "SensorStatusSubscription"})
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/sens/v1/subscriptions/sensor_status", nil, nil, nil, nil, http.StatusOK, SensorStatusSubscriptionGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SubscriptionLinkList
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("resp", resp)
+	if !validateSubscriptionLinkList(expected, resp) {
+		t.Fatalf("SubscriptionLinkList mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorStatusSubscription(sensorStatusSubscription)
+	terminateScenario()
+}
+
+func createSensorStatusSubscription_no_query() (sensorStatusSubscription SensorStatusSubscription, err error) {
+	subscriptionType := SENSOR_STATUS_SUBSCRIPTION
+	sensorStatusSubscription = SensorStatusSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorStatusSubscription)
+	if err != nil {
+		return sensorStatusSubscription, err
+	}
+
+	rr, err := sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_status", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, SensorStatusSubscriptionPOST)
+	if err != nil {
+		return sensorStatusSubscription, err
+	}
+	err = json.Unmarshal([]byte(rr), &sensorStatusSubscription)
+	if err != nil {
+		return sensorStatusSubscription, err
+	}
+
+	return sensorStatusSubscription, nil
+}
+
+func deleteSensorStatusSubscription(sensorStatusSubscription SensorStatusSubscription) (err error) {
+
+	selfUrl := strings.Split(sensorStatusSubscription.Links.Self.Href, "/")
+	subscriptionId := selfUrl[len(selfUrl)-1]
+	fmt.Println("subscriptionId = ", subscriptionId)
+
+	vars := make(map[string]string)
+	vars["subscriptionId"] = subscriptionId
+
+	_, err = sendRequest(http.MethodDelete, "/sens/v1/subscriptions/sensor_status", nil, vars, nil, nil, http.StatusNoContent, SensorDiscoverySubscriptionDELETE)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func validateSensorStatusSubscription(expected SensorStatusSubscription, resp SensorStatusSubscription) bool {
+	fmt.Println(">>> validateSensorStatusSubscription: expected: ", expected)
+	fmt.Println(">>> validateSensorStatusSubscription: resp: ", resp)
+
+	if *expected.SubscriptionType != *resp.SubscriptionType {
+		fmt.Println("expected.SubscriptionType != resp.SubscriptionType")
+		return false
+	}
+	if expected.CallbackReference != resp.CallbackReference {
+		fmt.Println("expected.SubscriptionType != resp.SubscriptionType")
+		return false
+	}
+	if expected.RequestTestNotification != resp.RequestTestNotification {
+		fmt.Println("expected.RequestTestNotification != resp.RequestTestNotification")
+		return false
+	}
+
+	return true
+}
+
+func TestSensorDataSubscriptionPOST_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	subscriptionType := SENSOR_STATUS_SUBSCRIPTION
+	var expected = SensorDataSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	jsonInfo, err := json.Marshal(&expected)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	expected_response := string(jsonInfo)
+	fmt.Println("expected_response: ", expected_response)
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+	var sensorDataSubscription = SensorDataSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorDataSubscription)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_data", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, SensorDataSubscriptionPOST)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SensorDataSubscription
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	if !validateSensorDataSubscription(expected, resp) {
+		t.Fatalf("handler returned unexpected body: got %v want %v", rr, expected_response)
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorDataSubscription(resp)
+	terminateScenario()
+}
+
+func TestSensorDataSubscriptionGET_no_query(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+	initializeVars()
+	err := Init()
+	if err != nil {
+		t.Fatalf("Error initializing test basic procedure")
+	}
+	err = Run()
+	if err != nil {
+		t.Fatalf("Error running test basic procedure")
+	}
+	fmt.Println("Set a scenario")
+	initialiseScenario(testScenario)
+	time.Sleep(1000 * time.Millisecond)
+	updateScenario("mobility1")
+
+	sensorDataSubscription, err := createSensorDataSubscription_no_query()
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("sensorDataSubscription: ", sensorDataSubscription)
+
+	/******************************
+	 * expected response section
+	 ******************************/
+	var expected = SubscriptionLinkList{
+		Links: &SubscriptionLinkListLinks{
+			Self: &LinkType{
+				Href: "http://localhost/testScenario/sens/v1/subscriptions",
+			},
+		},
+	}
+	expected.Links.Subscriptions = append(expected.Links.Subscriptions, SubscriptionLinkListSubscription{Href: "http://localhost/testScenario/sens/v1/subscriptions/8", SubscriptionType: "SensorDataSubscription"})
+
+	/******************************
+	 * request vars section
+	 ******************************/
+	//vars := make(map[string]string)
+	//vars["subscriptionId"] = subscription_id
+
+	/******************************
+	 * request queries section
+	 ******************************/
+	//queries := make(map[string]string)
+	//queries["sensorIdentifier"] = "4,5,6"
+
+	/******************************
+	 * request body section
+	 ******************************/
+
+	/******************************
+	 * request execution section
+	 ******************************/
+	rr, err := sendRequest(http.MethodGet, "/sens/v1/subscriptions/sensor_data", nil, nil, nil, nil, http.StatusOK, SensorDataSubscriptionGET)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("Respone: rr: ", rr)
+	var resp SubscriptionLinkList
+	err = json.Unmarshal([]byte(rr), &resp)
+	if err != nil {
+		t.Fatalf(err.Error())
+	}
+	fmt.Println("resp", resp)
+	if !validateSubscriptionLinkList(expected, resp) {
+		t.Fatalf("SubscriptionLinkList mismatch")
+	}
+
+	fmt.Println("Received expected response")
+	/******************************
+	 * back to initial state section
+	 ******************************/
+	_ = deleteSensorDataSubscription(sensorDataSubscription)
+	terminateScenario()
+}
+
+func createSensorDataSubscription_no_query() (sensorDataSubscription SensorDataSubscription, err error) {
+	subscriptionType := SENSOR_DATA_SUBSCRIPTION
+	sensorDataSubscription = SensorDataSubscription{
+		SubscriptionType:  &subscriptionType,
+		CallbackReference: "http://test.org",
+	}
+	body, err := json.Marshal(sensorDataSubscription)
+	if err != nil {
+		return sensorDataSubscription, err
+	}
+
+	rr, err := sendRequest(http.MethodPost, "/sens/v1/subscriptions/sensor_data", bytes.NewBuffer(body), nil, nil, nil, http.StatusCreated, SensorDataSubscriptionPOST)
+	if err != nil {
+		return sensorDataSubscription, err
+	}
+	err = json.Unmarshal([]byte(rr), &sensorDataSubscription)
+	if err != nil {
+		return sensorDataSubscription, err
+	}
+
+	return sensorDataSubscription, nil
+}
+
+func deleteSensorDataSubscription(sensorDataSubscription SensorDataSubscription) (err error) {
+
+	selfUrl := strings.Split(sensorDataSubscription.Links.Self.Href, "/")
+	subscriptionId := selfUrl[len(selfUrl)-1]
+	fmt.Println("subscriptionId = ", subscriptionId)
+
+	vars := make(map[string]string)
+	vars["subscriptionId"] = subscriptionId
+
+	_, err = sendRequest(http.MethodDelete, "/sens/v1/subscriptions/sensor_data", nil, vars, nil, nil, http.StatusNoContent, SensorDiscoverySubscriptionDELETE)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func validateSensorDataSubscription(expected SensorDataSubscription, resp SensorDataSubscription) bool {
+	fmt.Println(">>> validateSensorDataSubscription: expected: ", expected)
+	fmt.Println(">>> validateSensorDataSubscription: resp: ", resp)
+
+	if *expected.SubscriptionType != *resp.SubscriptionType {
+		fmt.Println("expected.SubscriptionType != resp.SubscriptionType")
+		return false
+	}
+	if expected.CallbackReference != resp.CallbackReference {
+		fmt.Println("expected.SubscriptionType != resp.SubscriptionType")
+		return false
+	}
+	if expected.RequestTestNotification != resp.RequestTestNotification {
+		fmt.Println("expected.RequestTestNotification != resp.RequestTestNotification")
+		return false
+	}
+
+	return true
+}
+
+func validateSubscriptionLinkList(expected SubscriptionLinkList, resp SubscriptionLinkList) bool {
+	fmt.Println(">>> validateSubscriptionLinkList: expected: ", expected)
+	fmt.Println(">>> validateSubscriptionLinkList: resp: ", resp)
+
+	if expected.Links.Self.Href != resp.Links.Self.Href {
+		fmt.Println("expected.Links.Self.Href != resp.Links.Self.Href")
+		return false
+	}
+	if len(expected.Links.Subscriptions) != len(resp.Links.Subscriptions) {
+		fmt.Println("expected.Links.Subscriptions length mismatch")
+		fmt.Println("len(expected.Links.Subscriptions): ", len(expected.Links.Subscriptions))
+		fmt.Println("len(resp.Links.Subscriptions: ", len(resp.Links.Subscriptions))
+		return false
+	} else {
+		for i, sub := range expected.Links.Subscriptions {
+			if sub.Href != resp.Links.Subscriptions[i].Href {
+				fmt.Println("sub.Href != resp.Links.Subscriptions[i].Href")
+				return false
+			}
+			if sub.SubscriptionType != resp.Links.Subscriptions[i].SubscriptionType {
+				fmt.Println("sub.SubscriptionType != resp.Links.Subscriptions[i].SubscriptionType")
+				fmt.Println("Index: ", i)
+				fmt.Println("sub.SubscriptionType: ", sub.SubscriptionType)
+				fmt.Println("resp.Links.Subscriptions[i].SubscriptionType: ", resp.Links.Subscriptions[i].SubscriptionType)
+				return false
+			}
+		}
+	}
+
+	return true
+}
+
+func initializeVars() {
+	mod.DbAddress = redisTestAddr
+	redisAddr = redisTestAddr
+	influxAddr = influxTestAddr
+	sandboxName = testScenarioName
+	os.Setenv("MEEP_PREDICT_MODEL_SUPPORTED", "true")
+	os.Setenv("MEEP_SANDBOX_NAME", testScenarioName)
+	os.Setenv("MEEP_PUBLIC_URL", "http://localhost")
+}
+
+func initialiseScenario(testScenario string) {
+
+	//clear DB
+	cleanUp()
+
+	cfg := mod.ModelCfg{
+		Name:      testScenarioName,
+		Namespace: sandboxName,
+		Module:    "test-mod",
+		UpdateCb:  nil,
+		DbAddr:    redisAddr,
+	}
+	var err error
+	m, err = mod.NewModel(cfg)
+	if err != nil {
+		log.Error("Failed to create model: ", err)
+		return
+	}
+	fmt.Println("initialiseScenario: model created")
+
+	// Create message queue
+	mqLocal, err = mq.NewMsgQueue(mq.GetLocalName(testScenarioName), "test-mod", testScenarioName, redisAddr)
+	if err != nil {
+		log.Error("Failed to create Message Queue with error: ", err)
+		return
+	}
+	fmt.Println("Message Queue created")
+
+	fmt.Println("Set Model")
+	err = m.SetScenario([]byte(testScenario))
+	if err != nil {
+		log.Error("Failed to set model: ", err)
+		return
+	}
+
+	err = m.Activate()
+	if err != nil {
+		log.Error("Failed to activate scenario with err: ", err.Error())
+		return
+	}
+
+	msg := mqLocal.CreateMsg(mq.MsgScenarioActivate, mq.TargetAll, testScenarioName)
+	err = mqLocal.SendMsg(msg)
+	if err != nil {
+		log.Error("Failed to send message: ", err)
+		return
+	}
+
+	time.Sleep(100 * time.Millisecond)
+
+}
+
+func updateScenario(testUpdate string) {
+
+	switch testUpdate {
+	case "mobility1":
+		// mobility event of ue1 to zone2-poa1
+		elemName := "ue1"
+		destName := "zone2-poa1"
+
+		_, _, err := m.MoveNode(elemName, destName, nil)
+		if err != nil {
+			log.Error("Error sending mobility event")
+		}
+
+		msg := mqLocal.CreateMsg(mq.MsgScenarioUpdate, mq.TargetAll, testScenarioName)
+		err = mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+	case "mobility2":
+		// mobility event of ue1 to zone2-poa1
+		elemName := "ue1"
+		destName := "zone1-poa-cell1"
+
+		_, _, err := m.MoveNode(elemName, destName, nil)
+		if err != nil {
+			log.Error("Error sending mobility event")
+		}
+
+		msg := mqLocal.CreateMsg(mq.MsgScenarioUpdate, mq.TargetAll, testScenarioName)
+		err = mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+	case "mobility3":
+		// mobility event of ue1 to zone1-poa-cell2
+		elemName := "ue1"
+		destName := "zone1-poa-cell2"
+
+		_, _, err := m.MoveNode(elemName, destName, nil)
+		if err != nil {
+			log.Error("Error sending mobility event")
+		}
+
+		msg := mqLocal.CreateMsg(mq.MsgScenarioUpdate, mq.TargetAll, testScenarioName)
+		err = mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+	default:
+	}
+	time.Sleep(100 * time.Millisecond)
+}
+
+func terminateScenario() {
+	if mqLocal != nil {
+		_ = Stop()
+		msg := mqLocal.CreateMsg(mq.MsgScenarioTerminate, mq.TargetAll, testScenarioName)
+		err := mqLocal.SendMsg(msg)
+		if err != nil {
+			log.Error("Failed to send message: ", err)
+		}
+		time.Sleep(100 * time.Millisecond)
+	}
+}
+
+func sendRequest(method string, url string, body io.Reader, vars map[string]string, query map[string]string, location *string, code int, f http.HandlerFunc) (string, error) {
+	req, err := http.NewRequest(method, url, body)
+	if err != nil || req == nil {
+		return "", err
+	}
+	if vars != nil {
+		req = mux.SetURLVars(req, vars)
+	}
+	if query != nil {
+		q := req.URL.Query()
+		for k, v := range query {
+			q.Add(k, v)
+		}
+		req.URL.RawQuery = q.Encode()
+	}
+	// We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response.
+	rr := httptest.NewRecorder()
+	handler := http.HandlerFunc(f)
+
+	// Our handlers satisfy http.Handler, so we can call their ServeHTTP method
+	// directly and pass in our Request and ResponseRecorder.
+	handler.ServeHTTP(rr, req)
+
+	time.Sleep(50 * time.Millisecond)
+
+	// Check the status code is what we expect.
+	if status := rr.Code; status != code {
+		s := fmt.Sprintf("Wrong status code - got %v want %v", status, code)
+		return "", errors.New(s)
+	}
+
+	// Set Location header in case of POST
+	if location != nil {
+		s := rr.Header().Get("Location")
+		if rr == nil {
+			return "", fmt.Errorf("Header Location expected")
+		} else if !strings.Contains(s, *location) {
+			s := fmt.Sprintf("Wrong Header Location - got %s want %s", s, *location)
+			return "", errors.New(s)
+		}
+	}
+
+	return string(rr.Body.String()), nil
+}
diff --git a/go-apps/meep-sss/server/model_app_termination_notification.go b/go-apps/meep-sss/server/model_app_termination_notification.go
new file mode 100644
index 0000000000000000000000000000000000000000..2593cd5c2f7b6161318509cbd5a519c384c7adea
--- /dev/null
+++ b/go-apps/meep-sss/server/model_app_termination_notification.go
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/yright (c) ETSI 2024](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-vis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-vis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// This type represents the information that the MEC platform notifies the subscribed application instance about  the corresponding application instance termination/stop.
+type AppTerminationNotification struct {
+	// Shall be set to AppTerminationNotification.
+	NotificationType string `json:"notificationType"`
+
+	OperationAction *OperationActionType `json:"operationAction"`
+	// Maximum timeout value in seconds for graceful termination or graceful stop of an application instance.
+	MaxGracefulTimeout int32 `json:"maxGracefulTimeout"`
+
+	Links *AppTerminationNotificationLinks `json:"_links"`
+}
diff --git a/go-apps/meep-sss/server/model_app_termination_notification__links.go b/go-apps/meep-sss/server/model_app_termination_notification__links.go
new file mode 100644
index 0000000000000000000000000000000000000000..3035fbaeb9196721b6f537e9845b9ff18fc978ca
--- /dev/null
+++ b/go-apps/meep-sss/server/model_app_termination_notification__links.go
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/) ETSI 2024](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-vis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-vis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Object containing hyperlinks related to the resource.
+type AppTerminationNotificationLinks struct {
+	Subscription *LinkType `json:"subscription"`
+
+	ConfirmTermination *LinkType `json:"confirmTermination,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_area_info.go b/go-apps/meep-sss/server/model_area_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..df29f04a2c142ba7b927211e1f6fd64faad9b9cc
--- /dev/null
+++ b/go-apps/meep-sss/server/model_area_info.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type AreaInfo struct {
+	Shape *ShapeType `json:"shape"`
+	// Shall include one point if the shape is CIRCLE. Shall include 3-15 points if the shape is POLYGON
+	Points []Point `json:"points"`
+	// Shall be present if the shape is CIRCLE
+	Radius int32 `json:"radius,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_expiry_notification.go b/go-apps/meep-sss/server/model_expiry_notification.go
new file mode 100644
index 0000000000000000000000000000000000000000..d9bcbff72c94e110107570d4d6493bc97d10d958
--- /dev/null
+++ b/go-apps/meep-sss/server/model_expiry_notification.go
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2022  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE WLAN Access Information API
+ *
+ * WLAN Access Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC028 WAI API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/028/02.02.01_60/gs_MEC028v020201p.pdf) <p>[Copyright (c) ETSI 2020](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-wais](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-wais) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about WLAN access information in the network <p>**Note**<br>AdvantEDGE supports a selected subset of WAI API subscription types. <p>Supported subscriptions: <p> - AssocStaSubscription <p> - StaDataRateSubscription
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type ExpiryNotification struct {
+	Links *ExpiryNotificationLinks `json:"_links"`
+
+	ExpiryDeadline *TimeStamp `json:"expiryDeadline"`
+	// Shall be set to \"ExpiryNotification\".
+	NotificationType string `json:"notificationType"`
+}
diff --git a/go-apps/meep-sss/server/model_expiry_notification__links.go b/go-apps/meep-sss/server/model_expiry_notification__links.go
new file mode 100644
index 0000000000000000000000000000000000000000..81fd074ecdc5a80749f3f870eee1531175baea5b
--- /dev/null
+++ b/go-apps/meep-sss/server/model_expiry_notification__links.go
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2022  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE WLAN Access Information API
+ *
+ * WLAN Access Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC028 WAI API](http://www.etsi.org/deliver/etsi_gs/MEC/001_099/028/02.02.01_60/gs_MEC028v020201p.pdf) <p>[Copyright (c) ETSI 2020](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-wais](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-wais) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about WLAN access information in the network <p>**Note**<br>AdvantEDGE supports a selected subset of WAI API subscription types. <p>Supported subscriptions: <p> - AssocStaSubscription <p> - StaDataRateSubscription
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Hyperlink related to the resource.
+type ExpiryNotificationLinks struct {
+	Subscription *LinkType `json:"subscription"`
+}
diff --git a/go-apps/meep-sss/server/model_link_type.go b/go-apps/meep-sss/server/model_link_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..711c5bfe311d6b4470404cc35f550cd2236e117a
--- /dev/null
+++ b/go-apps/meep-sss/server/model_link_type.go
@@ -0,0 +1,16 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// 'This data type represents a type of link'
+type LinkType struct {
+	// The URI referring to the subscription.
+	Href string `json:"href"`
+}
diff --git a/go-apps/meep-sss/server/model_operation_action_type.go b/go-apps/meep-sss/server/model_operation_action_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..8122ab94e70dbf831bd2de08249de7c8ae4fdd68
--- /dev/null
+++ b/go-apps/meep-sss/server/model_operation_action_type.go
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/) <p>[Copyright (c) ETSI 2024](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-vis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-vis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// OperationActionType : Operation that is being performed on the MEC application instance.
+type OperationActionType string
+
+// List of OperationActionType
+const (
+	STOPPING_OperationActionType    OperationActionType = "STOPPING"
+	TERMINATING_OperationActionType OperationActionType = "TERMINATING"
+)
diff --git a/go-apps/meep-sss/server/model_point.go b/go-apps/meep-sss/server/model_point.go
new file mode 100644
index 0000000000000000000000000000000000000000..0478bf6da56b91935396e3ca4f0999be1ac4da12
--- /dev/null
+++ b/go-apps/meep-sss/server/model_point.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// This type represents the geographical location of a point
+type Point struct {
+	// Location latitude, expressed in the range -90° to +90°
+	Latitude float64 `json:"latitude"`
+	// Location longitude, expressed in the range -180° to +180°.
+	Longitude float64 `json:"longitude"`
+}
diff --git a/go-apps/meep-sss/server/model_problem_details.go b/go-apps/meep-sss/server/model_problem_details.go
new file mode 100644
index 0000000000000000000000000000000000000000..3b2e107fb4509beec55f269d2436e3b7ae2077c8
--- /dev/null
+++ b/go-apps/meep-sss/server/model_problem_details.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type ProblemDetails struct {
+	// A URI reference according to IETF RFC 3986 that identifies the problem type
+	Type_ string `json:"type,omitempty"`
+	// A short, human-readable summary of the problem type
+	Title string `json:"title,omitempty"`
+	// The HTTP status code for this occurrence of the problem
+	Status int32 `json:"status,omitempty"`
+	// A human-readable explanation specific to this occurrence of the problem
+	Detail string `json:"detail,omitempty"`
+	// A URI reference that identifies the specific occurrence of the problem
+	Instance string `json:"instance,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_characteristic.go b/go-apps/meep-sss/server/model_sensor_characteristic.go
new file mode 100644
index 0000000000000000000000000000000000000000..6e49441512dc04b3ff489420c4aedd4e3c994793
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_characteristic.go
@@ -0,0 +1,20 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// This type represents a sensor' characteristic which details the type of sensor and its working functionalities, such as the model of the sensor, the sampling frequency, the operating range, the accuracy
+type SensorCharacteristic struct {
+	// The name of the characteristic
+	CharacteristicName string `json:"characteristicName"`
+	// The value of the characteristic.
+	CharacteristicValue string `json:"characteristicValue"`
+	// The unit of measure of the characteristic (see saref:UnitOfMeasure in ETSI TS 103 264 [4], clause 4.3.8).
+	CharacteristicUnitOfMeasure string `json:"characteristicUnitOfMeasure,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_data.go b/go-apps/meep-sss/server/model_sensor_data.go
new file mode 100644
index 0000000000000000000000000000000000000000..dbe6f942c99260ff3bb47f552623dae027da7cec
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_data.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorData struct {
+	// Unique identifier of the sensor
+	SensorIdentifier string `json:"sensorIdentifier"`
+	// The status of the sensor
+	Data string `json:"data"`
+	// String explaining the error of the sensor
+	DataFormat string `json:"dataFormat"`
+	// String explaining the error of the sensor
+	DataUnitOfMeasure string `json:"dataUnitOfMeasure"`
+
+	DataTimestamp *TimeStamp `json:"dataTimestamp,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_data_subscription.go b/go-apps/meep-sss/server/model_sensor_data_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..168f6b43885e63555dd648f882395747e1f2ba86
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_data_subscription.go
@@ -0,0 +1,24 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorDataSubscription struct {
+	SubscriptionType *SubscriptionType `json:"subscriptionType"`
+	// URI exposed by the client on which to receive notifications via HTTP
+	CallbackReference string `json:"callbackReference,omitempty"`
+	// Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI,
+	RequestTestNotification bool `json:"requestTestNotification,omitempty"`
+
+	WebsockNotifConfig *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+
+	Links *SubscriptionLinks `json:"_links,omitempty"`
+
+	ExpiryDeadline *TimeStamp `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_discovery_event_subscription.go b/go-apps/meep-sss/server/model_sensor_discovery_event_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..457d61c6a88ff9d74ff49c6d138a8c91815610ef
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_discovery_event_subscription.go
@@ -0,0 +1,28 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorDiscoveryEventSubscription struct {
+	SubscriptionType *SubscriptionType `json:"subscriptionType"`
+	// URI exposed by the client on which to receive notifications via HTTP
+	CallbackReference string `json:"callbackReference,omitempty"`
+	// Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI,
+	RequestTestNotification bool `json:"requestTestNotification,omitempty"`
+
+	WebsockNotifConfig *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+
+	Links *SubscriptionLinks `json:"_links,omitempty"`
+	// Object containing the characteristics of the sensor(s) to be selected for the subscription
+	SensorInfoList []string `json:"sensorInfoList,omitempty"`
+	// The parameters describing the area to subscribe
+	GeographicalArea []AreaInfo `json:"geographicalArea,omitempty"`
+
+	ExpiryDeadline *TimeStamp `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_discovery_info.go b/go-apps/meep-sss/server/model_sensor_discovery_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..b64da57abcec5f758c7da0f309136cd8fba58adf
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_discovery_info.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorDiscoveryInfo struct {
+	// Unique identifier of the sensor
+	SensorIdentifier string `json:"sensorIdentifier"`
+	// Type of the Sensor
+	SensorType string `json:"sensorType"`
+	// It indicates the list of properties that the sensor can sense
+	SensorPropertyList []string `json:"sensorPropertyList"`
+	// The sensor' characteristics
+	SensorCharacteristicList []SensorCharacteristic `json:"sensorCharacteristicList,omitempty"`
+
+	SensorPosition *Point `json:"sensorPosition,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_discovery_subscription_id_body.go b/go-apps/meep-sss/server/model_sensor_discovery_subscription_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..7a854d77d74354e75132f9a166382c65e18b91f1
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_discovery_subscription_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorDiscoverySubscriptionIdBody struct {
+	SensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription `json:"SensorDiscoveryEventSubscription,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_info.go b/go-apps/meep-sss/server/model_sensor_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..ff90e2d520b20ef338d8890a1f90d2d965a84168
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorInfo struct {
+	// Type of the sensor
+	Type_ string `json:"type"`
+	// It indicates the list of properties that the sensor can sense (see saref:Property in ETSI TS 103 264 [4], clause 4.3.8).
+	SensorPropertyList []string `json:"sensorPropertyList"`
+	// The sensor' characteristics to be matched
+	SensorCharacteristicList []SensorCharacteristic `json:"sensorCharacteristicList,omitempty"`
+	// The parameters describing the area
+	GeographicalArea []AreaInfo `json:"geographicalArea,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_status_info.go b/go-apps/meep-sss/server/model_sensor_status_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..1384d113a54116cac082039ad54e95b84d85ccda
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_status_info.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorStatusInfo struct {
+	// Unique identifier of the sensor
+	SensorIdentifier string `json:"sensorIdentifier"`
+	// The status of the sensor
+	SensorStatusType string `json:"sensorStatusType"`
+	// String explaining the error of the sensor
+	ErrorInformation string `json:"errorInformation,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_status_subscription.go b/go-apps/meep-sss/server/model_sensor_status_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..8b48fb5d6ff88b86bc3e9ba10e557395c0a30342
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_status_subscription.go
@@ -0,0 +1,24 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorStatusSubscription struct {
+	SubscriptionType *SubscriptionType `json:"subscriptionType"`
+	// URI exposed by the client on which to receive notifications via HTTP
+	CallbackReference string `json:"callbackReference,omitempty"`
+	// Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI,
+	RequestTestNotification bool `json:"requestTestNotification,omitempty"`
+
+	WebsockNotifConfig *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+
+	Links *SubscriptionLinks `json:"_links,omitempty"`
+
+	ExpiryDeadline *TimeStamp `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_sensor_status_subscription_id_body.go b/go-apps/meep-sss/server/model_sensor_status_subscription_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..a0675e58a7af28d44b46ab9ad3d5c0a594bbe7c8
--- /dev/null
+++ b/go-apps/meep-sss/server/model_sensor_status_subscription_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SensorStatusSubscriptionIdBody struct {
+	SensorStatusSubscription *SensorStatusSubscription `json:"SensorStatusSubscription,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_shape_type.go b/go-apps/meep-sss/server/model_shape_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..42eb43c68263ccc897a70a4c5fa86a599357d2a6
--- /dev/null
+++ b/go-apps/meep-sss/server/model_shape_type.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type ShapeType int32
+
+// List of ShapeType
+const (
+	CIRCLE_ShapeType  ShapeType = 0
+	POLYGON_ShapeType ShapeType = 0
+)
diff --git a/go-apps/meep-sss/server/model_status_data_subscription_id_body.go b/go-apps/meep-sss/server/model_status_data_subscription_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..f6b6594b6a0a485869e7d20725293c33ad90228c
--- /dev/null
+++ b/go-apps/meep-sss/server/model_status_data_subscription_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type StatusDataSubscriptionIdBody struct {
+	SensorStatusSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_subscription_link_list.go b/go-apps/meep-sss/server/model_subscription_link_list.go
new file mode 100644
index 0000000000000000000000000000000000000000..5511b21859b1def80c9669d0b42a98ff80962fba
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscription_link_list.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionLinkList struct {
+	Links *SubscriptionLinkListLinks `json:"_links"`
+}
diff --git a/go-apps/meep-sss/server/model_subscription_link_list_links.go b/go-apps/meep-sss/server/model_subscription_link_list_links.go
new file mode 100644
index 0000000000000000000000000000000000000000..a646573f50c66df31263899ad4348219919dfbbf
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscription_link_list_links.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// List of hyperlinks related to the resource.
+type SubscriptionLinkListLinks struct {
+	Self *LinkType `json:"self"`
+	// The MEC application's subscriptions
+	Subscriptions []SubscriptionLinkListSubscription `json:"subscriptions,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_subscription_link_list_subscription.go b/go-apps/meep-sss/server/model_subscription_link_list_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..ca6adcac3f8028c3e3e61081a0e112207b71b1a5
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscription_link_list_subscription.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionLinkListSubscription struct {
+	// The URI referring to the subscription
+	Href string `json:"href"`
+	// Type of the subscription
+	SubscriptionType string `json:"subscriptionType"`
+}
diff --git a/go-apps/meep-sss/server/model_subscription_links.go b/go-apps/meep-sss/server/model_subscription_links.go
new file mode 100644
index 0000000000000000000000000000000000000000..dacb811a1c3e2f8b5ee6b56b2e098063f500ae4a
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscription_links.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionLinks struct {
+	Self *LinkType `json:"self"`
+}
diff --git a/go-apps/meep-sss/server/model_subscription_type.go b/go-apps/meep-sss/server/model_subscription_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..ca90c053ba4de0cc067cbddebca03635e48eada4
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscription_type.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionType string
+
+// List of SubscriptionType
+const (
+	SENSOR_DISCOVERY_EVENT_SUBSCRIPTION SubscriptionType = "SensorDiscoveryEventSubscription"
+	SENSOR_STATUS_SUBSCRIPTION          SubscriptionType = "SensorStatusSubscription"
+	SENSOR_DATA_SUBSCRIPTION            SubscriptionType = "SensorDataSubscription"
+)
diff --git a/go-apps/meep-sss/server/model_subscriptions_sensor_data_body.go b/go-apps/meep-sss/server/model_subscriptions_sensor_data_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..e1b819ba94c8eecf3313952b6a00b218f7a67c12
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscriptions_sensor_data_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionsSensorDataBody struct {
+	SensorDataSubscription *SensorDataSubscription `json:"SensorDataSubscription,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_subscriptions_sensor_discovery_body.go b/go-apps/meep-sss/server/model_subscriptions_sensor_discovery_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..721b853da74c83c8316160b985337f571d57ebe8
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscriptions_sensor_discovery_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionsSensorDiscoveryBody struct {
+	SensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription `json:"SensorDiscoveryEventSubscription,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_subscriptions_sensor_status_body.go b/go-apps/meep-sss/server/model_subscriptions_sensor_status_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..a233916c5a6def42062c097c2dab81913b3f926f
--- /dev/null
+++ b/go-apps/meep-sss/server/model_subscriptions_sensor_status_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionsSensorStatusBody struct {
+	SensorStatusSubscription *SensorStatusSubscription `json:"SensorStatusSubscription,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/model_test_notification.go b/go-apps/meep-sss/server/model_test_notification.go
new file mode 100644
index 0000000000000000000000000000000000000000..c38a63a1519d5b9e57a09f3b66769156942b5bdc
--- /dev/null
+++ b/go-apps/meep-sss/server/model_test_notification.go
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2024  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-vis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-vis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type TestNotification struct {
+	Links *TestNotificationLinks `json:"_links"`
+	// Shall be set to \"TestNotification\".
+	NotificationType string `json:"notificationType"`
+}
diff --git a/go-apps/meep-sss/server/model_test_notification__links.go b/go-apps/meep-sss/server/model_test_notification__links.go
new file mode 100644
index 0000000000000000000000000000000000000000..6300eeac2bc3933c390a39b8734a918711fc4818
--- /dev/null
+++ b/go-apps/meep-sss/server/model_test_notification__links.go
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2024  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/yright (c) ETSI 2024](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-vis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-vis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// Hyperlink related to the resource.
+type TestNotificationLinks struct {
+	Subscription *LinkType `json:"subscription"`
+}
diff --git a/go-apps/meep-sss/server/model_time_stamp.go b/go-apps/meep-sss/server/model_time_stamp.go
new file mode 100644
index 0000000000000000000000000000000000000000..079043c87a23b65e4f17ff0edfa6122302d3bd3f
--- /dev/null
+++ b/go-apps/meep-sss/server/model_time_stamp.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+// 'This data type represents the time stamp as Unix-time since January 1, 1970, 00:00:00 UTC'
+type TimeStamp struct {
+	// 'The seconds part of the Time. Time is defined as Unix-time since January 1, 1970, 00:00:00 UTC.'
+	Seconds int32 `json:"seconds"`
+	// 'The nanoseconds part of the Time. Time is defined as Unix-time since January 1, 1970, 00:00:00 UTC.'
+	NanoSeconds int32 `json:"nanoSeconds"`
+}
diff --git a/go-apps/meep-sss/server/model_websock_notif_config.go b/go-apps/meep-sss/server/model_websock_notif_config.go
new file mode 100644
index 0000000000000000000000000000000000000000..dfa89d144bfe777e412d3abc9a9316b79d6b9e62
--- /dev/null
+++ b/go-apps/meep-sss/server/model_websock_notif_config.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type WebsockNotifConfig struct {
+	// Set by AMS to indicate to the service consumer the Websocket URI to be used for delivering notifications.
+	WebsocketUri string `json:"websocketUri,omitempty"`
+	// Set to true by the service consumer to indicate that Websocket delivery is requested.
+	RequestWebsocketUri bool `json:"requestWebsocketUri,omitempty"`
+}
diff --git a/go-apps/meep-sss/server/routers.go b/go-apps/meep-sss/server/routers.go
new file mode 100644
index 0000000000000000000000000000000000000000..35b06a0dbc8d6ef324419a306f9265eb16458575
--- /dev/null
+++ b/go-apps/meep-sss/server/routers.go
@@ -0,0 +1,229 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+import (
+	"fmt"
+	"net/http"
+	"strings"
+
+	httpLog "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-http-logger"
+	met "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metrics"
+
+	"github.com/gorilla/mux"
+)
+
+type Route struct {
+	Name        string
+	Method      string
+	Pattern     string
+	HandlerFunc http.HandlerFunc
+}
+
+type Routes []Route
+
+func NewRouter() *mux.Router {
+	var handler http.Handler
+	router := mux.NewRouter().StrictSlash(true)
+	for _, route := range routes {
+		handler = route.HandlerFunc
+		handler = Logger(handler, route.Name)
+		handler = met.MetricsHandler(handler, sandboxName, serviceName)
+		handler = httpLog.LogRx(handler)
+		router.
+			Methods(route.Method).
+			Path(route.Pattern).
+			Name(route.Name).
+			Handler(handler)
+	}
+
+	// Path prefix router order is important
+	// Service Api files
+	handler = http.StripPrefix("/sens/v1/api/", http.FileServer(http.Dir("./api/")))
+	router.
+		PathPrefix("/sens/v1/api/").
+		Name("Api").
+		Handler(handler)
+	// User supplied service API files
+	handler = http.StripPrefix("/sens/v1/user-api/", http.FileServer(http.Dir("./user-api/")))
+	router.
+		PathPrefix("/sens/v1/user-api/").
+		Name("UserApi").
+		Handler(handler)
+
+	return router
+}
+
+func Index(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintf(w, "Hello World!")
+}
+
+var routes = Routes{
+	Route{
+		"Index",
+		"GET",
+		"/sens/v1/",
+		Index,
+	},
+
+	Route{
+		"SensorMgmtPUT",
+		strings.ToUpper("Put"),
+		"/sens/v1/sensor_management",
+		SensorMgmtPUT,
+	},
+
+	Route{
+		"SensorDataLookupGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/queries/status_data",
+		SensorDataLookupGET,
+	},
+
+	Route{
+		"SensorDataIndividualSubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/queries/status_data/{subscriptionId}",
+		SensorDataIndividualSubscriptionGET,
+	},
+
+	Route{
+		"SensorDataSubscriptionDELETE",
+		strings.ToUpper("Delete"),
+		"/sens/v1/queries/status_data/{subscriptionId}",
+		SensorDataSubscriptionDELETE,
+	},
+
+	Route{
+		"SensorDataSubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/subscriptions/sensor_data",
+		SensorDataSubscriptionGET,
+	},
+
+	Route{
+		"SensorDataSubscriptionPOST",
+		strings.ToUpper("Post"),
+		"/sens/v1/subscriptions/sensor_data",
+		SensorDataSubscriptionPOST,
+	},
+
+	Route{
+		"SensorDataSubscriptionPUT",
+		strings.ToUpper("Put"),
+		"/sens/v1/queries/status_data/{subscriptionId}",
+		SensorDataSubscriptionPUT,
+	},
+
+	Route{
+		"SensorDiscoveryLookupGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/queries/sensor_discovery",
+		SensorDiscoveryLookupGET,
+	},
+
+	Route{
+		"SensorDiscoveryIndividualSubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/subscriptions/sensor_discovery/{subscriptionId}",
+		SensorDiscoveryIndividualSubscriptionGET,
+	},
+
+	Route{
+		"SensorDiscoverySubscriptionDELETE",
+		strings.ToUpper("Delete"),
+		"/sens/v1/subscriptions/sensor_discovery/{subscriptionId}",
+		SensorDiscoverySubscriptionDELETE,
+	},
+
+	Route{
+		"SensorDiscoverySubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/subscriptions/sensor_discovery",
+		SensorDiscoverySubscriptionGET,
+	},
+
+	Route{
+		"SensorDiscoverySubscriptionPOST",
+		strings.ToUpper("Post"),
+		"/sens/v1/subscriptions/sensor_discovery",
+		SensorDiscoverySubscriptionPOST,
+	},
+
+	Route{
+		"SensorDiscoverySubscriptionPUT",
+		strings.ToUpper("Put"),
+		"/sens/v1/subscriptions/sensor_discovery/{subscriptionId}",
+		SensorDiscoverySubscriptionPUT,
+	},
+
+	Route{
+		"SensorMgmtGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/sensor_management",
+		SensorMgmtGET,
+	},
+
+	Route{
+		"SensorStatusLookupGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/queries/sensor_status",
+		SensorStatusLookupGET,
+	},
+
+	Route{
+		"SensorStatusIndividualSubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/subscriptions/sensor_status/{subscriptionId}",
+		SensorStatusIndividualSubscriptionGET,
+	},
+
+	Route{
+		"SensorStatusIndividualSubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/subscriptions/sensor_status",
+		SensorStatusSubscriptionGET,
+	},
+
+	Route{
+		"SensorStatusSubscriptionDELETE",
+		strings.ToUpper("Delete"),
+		"/sens/v1/subscriptions/sensor_status/{subscriptionId}",
+		SensorStatusSubscriptionDELETE,
+	},
+
+	Route{
+		"SensorStatusSubscriptionPUT",
+		strings.ToUpper("Put"),
+		"/sens/v1/subscriptions/sensor_status/{subscriptionId}",
+		SensorStatusSubscriptionPUT,
+	},
+
+	Route{
+		"SensorStatusSubscriptionGET",
+		strings.ToUpper("Get"),
+		"/sens/v1/subscriptions/sensor_status",
+		SensorStatusSubscriptionGET,
+	},
+
+	Route{
+		"SensorStatusSubscriptionPOST",
+		strings.ToUpper("Post"),
+		"/sens/v1/subscriptions/sensor_status",
+		SensorStatusSubscriptionPOST,
+	},
+
+	Route{
+		"Mec011AppTerminationPOST",
+		strings.ToUpper("Post"),
+		"/sens/v1/notifications/mec046/appTermination",
+		Mec011AppTerminationPOST,
+	},
+}
diff --git a/go-apps/meep-sss/server/subscriptionCommon.go b/go-apps/meep-sss/server/subscriptionCommon.go
new file mode 100644
index 0000000000000000000000000000000000000000..059567bf6d66933fbe1f97fece3c90eafa9459b3
--- /dev/null
+++ b/go-apps/meep-sss/server/subscriptionCommon.go
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2024  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * AdvantEDGE V2X Information Service REST API
+ *
+ * V2X Information Service is AdvantEDGE's implementation of [ETSI MEC ISG MEC030 V2XI API](.https://www.etsi.org/deliver/etsi_gs/MEC/001_099/030/03.02.01_60/) ETSI 2024](https://forge.etsi.org/etsi-forge-copyright-notice.txt) <p>**Micro-service**<br>[meep-vis](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-vis) <p>**Type & Usage**<br>Edge Service used by edge applications that want to get information about radio conditions in the network <p>**Note**<br>AdvantEDGE supports a selected subset of VIS API endpoints (see below) and a subset of subscription types.
+ *
+ * API version: 3.2.2
+ * Contact: AdvantEDGE@InterDigital.com
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package server
+
+type SubscriptionCommon struct {
+	Links *SubscriptionLinks `json:"_links,omitempty"`
+	// URI selected by the service consumer, to receive notifications on the subscribed RNIS information. This shall be included in the request and response.
+	SubscriptionType        string              `json:"subscriptionType"`
+	RequestTestNotification bool                `json:"requestTestNotification"`
+	CallbackReference       string              `json:"callbackReference"`
+	WebsockNotifConfig      *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+	ExpiryDeadline          *TimeStamp          `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-apps/meep-virt-engine/entrypoint.sh b/go-apps/meep-virt-engine/entrypoint.sh
index 0eb84b7a20590a29dbb5ae78d33f3d4cbb634c81..b24fd7242ac98a1c440be02265fbe7ad2da3be4a 100755
--- a/go-apps/meep-virt-engine/entrypoint.sh
+++ b/go-apps/meep-virt-engine/entrypoint.sh
@@ -20,6 +20,8 @@ mv /meep-ams /templates/sandbox/meep-ams
 mv /meep-sandbox-ctrl /templates/sandbox/meep-sandbox-ctrl
 mv /meep-tc-engine /templates/sandbox/meep-tc-engine
 mv /meep-vis /templates/sandbox/meep-vis
+mv /meep-iot /templates/sandbox/meep-iot
+mv /meep-sss /templates/sandbox/meep-sss
 mv /meep-dai /templates/sandbox/meep-dai
 mv /meep-tm /templates/sandbox/meep-tm
 
diff --git a/go-packages/meep-applications/application-store.go b/go-packages/meep-applications/application-store.go
index a239ecd709bc7cdb8524a6ac4f920455c7d4f4fd..779c7184eecd0a58ddd18567239db575628e2d92 100644
--- a/go-packages/meep-applications/application-store.go
+++ b/go-packages/meep-applications/application-store.go
@@ -69,7 +69,7 @@ type ApplicationStore struct {
 	mutex    sync.Mutex
 }
 
-var SysAppNames []string = []string{"meep-app-enablement", "meep-ams", "meep-loc-serv", "meep-dai", "meep-rnis", "meep-federation", "meep-wais", "meep-vis"}
+var SysAppNames []string = []string{"meep-app-enablement", "meep-ams", "meep-loc-serv", "meep-dai", "meep-rnis", "meep-federation", "meep-wais", "meep-vis", "meep-iot", "meep-sss"}
 
 // NewApplicationStore - Creates and initialize an Application Store instance
 func NewApplicationStore(cfg *ApplicationStoreCfg) (as *ApplicationStore, err error) {
diff --git a/go-packages/meep-iot-client/.gitignore b/go-packages/meep-iot-client/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..daf913b1b347aae6de6f48d599bc89ef8c8693d6
--- /dev/null
+++ b/go-packages/meep-iot-client/.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/go-packages/meep-iot-client/.swagger-codegen-ignore b/go-packages/meep-iot-client/.swagger-codegen-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..c5fa491b4c557bf997d5dd21797de782545dc9e5
--- /dev/null
+++ b/go-packages/meep-iot-client/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# 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 Swagger Codgen 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/go-packages/meep-iot-client/.swagger-codegen/VERSION b/go-packages/meep-iot-client/.swagger-codegen/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..0667b5ffc7ae803493efb90a1f4ee6224b1f6a17
--- /dev/null
+++ b/go-packages/meep-iot-client/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.29
\ No newline at end of file
diff --git a/go-packages/meep-iot-client/.travis.yml b/go-packages/meep-iot-client/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f5cb2ce9a5aad73c57eed886e845d2e79c2899d1
--- /dev/null
+++ b/go-packages/meep-iot-client/.travis.yml
@@ -0,0 +1,8 @@
+language: go
+
+install:
+  - go get -d -v .
+
+script:
+  - go build -v ./
+
diff --git a/go-packages/meep-iot-client/README.md b/go-packages/meep-iot-client/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b7c10a4112b6f85fb27010d77121ba44bf74257c
--- /dev/null
+++ b/go-packages/meep-iot-client/README.md
@@ -0,0 +1,72 @@
+# Go API client for swagger
+
+ETSI GS MEC 033 IoT API described using OpenAPI.
+
+## Overview
+This API client was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project.  By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate an API client.
+
+- API version: 3.1.1
+- Package version: 1.0.0
+- Build package: io.swagger.codegen.v3.generators.go.GoClientCodegen
+For more information, please visit [https://forge.etsi.org/rep/mec/gs021-amsi-api](https://forge.etsi.org/rep/mec/gs021-amsi-api)
+
+## Installation
+Put the package under your project folder and add the following in import:
+```golang
+import "./swagger"
+```
+
+## Documentation for API Endpoints
+
+All URIs are relative to *https://localhost/sandboxname/sandboxname/amsi/v1*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*RegDevApi* | [**RegistereddevicesByIdDELETE**](docs/RegDevApi.md#registereddevicesbyiddelete) | **Delete** /registered_devices/{registeredDeviceId} | Deregister a device - see clause 5.2.6.
+*RegDevApi* | [**RegistereddevicesByIdGET**](docs/RegDevApi.md#registereddevicesbyidget) | **Get** /registered_devices/{registeredDeviceId} | Retrieve information about a device - see clause 5.2.4.
+*RegDevApi* | [**RegistereddevicesByIdPUT**](docs/RegDevApi.md#registereddevicesbyidput) | **Put** /registered_devices/{registeredDeviceId} | Update information about a  device including its association to a valid traffic rule - see clauses 5.2.5 and 5.4.3.
+*RegDevApi* | [**RegistereddevicesGET**](docs/RegDevApi.md#registereddevicesget) | **Get** /registered_devices | Retrieve information about all devices with a valid traffic rule association - see clause 5.2.2.
+*RegDevApi* | [**RegistereddevicesPOST**](docs/RegDevApi.md#registereddevicespost) | **Post** /registered_devices | Register a new device - see clause 5.2.3.
+*RegIotPlatApi* | [**RegisterediotplatformsByIdDELETE**](docs/RegIotPlatApi.md#registerediotplatformsbyiddelete) | **Delete** /registered_iot_platforms/{registeredIotPlatformId} | Deregister a IoT platform - see clause 5.3.6.
+*RegIotPlatApi* | [**RegisterediotplatformsByIdGET**](docs/RegIotPlatApi.md#registerediotplatformsbyidget) | **Get** /registered_iot_platforms/{registeredIotPlatformId} | Discover native services and obtain information about user transports provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+*RegIotPlatApi* | [**RegisterediotplatformsByIdPUT**](docs/RegIotPlatApi.md#registerediotplatformsbyidput) | **Put** /registered_iot_platforms/{registeredIotPlatformId} | Update information about a IoT platform - see clause 5.3.5.
+*RegIotPlatApi* | [**RegisterediotplatformsGET**](docs/RegIotPlatApi.md#registerediotplatformsget) | **Get** /registered_iot_platforms | Retrieve information about all IoT platforms - see clause 5.3.2.
+*RegIotPlatApi* | [**RegisterediotplatformsPOST**](docs/RegIotPlatApi.md#registerediotplatformspost) | **Post** /registered_iot_platforms | Register a IoT platform - see clause 5.3.4.
+
+## Documentation For Models
+
+ - [Addresses](docs/Addresses.md)
+ - [DeviceInfo](docs/DeviceInfo.md)
+ - [DeviceSpecificMessageFormats](docs/DeviceSpecificMessageFormats.md)
+ - [DownlinkInfo](docs/DownlinkInfo.md)
+ - [EndPointInfo](docs/EndPointInfo.md)
+ - [EventMsg](docs/EventMsg.md)
+ - [ImplSpecificInfo](docs/ImplSpecificInfo.md)
+ - [InlineResponse200](docs/InlineResponse200.md)
+ - [InlineResponse2001](docs/InlineResponse2001.md)
+ - [InterfaceDescriptor](docs/InterfaceDescriptor.md)
+ - [IotPlatformInfo](docs/IotPlatformInfo.md)
+ - [KeyValuePair](docs/KeyValuePair.md)
+ - [MbTransportInfo](docs/MbTransportInfo.md)
+ - [OAuth2Info](docs/OAuth2Info.md)
+ - [ProblemDetails](docs/ProblemDetails.md)
+ - [RegisteredDevicesBody](docs/RegisteredDevicesBody.md)
+ - [RegisteredDevicesRegisteredDeviceIdBody](docs/RegisteredDevicesRegisteredDeviceIdBody.md)
+ - [RegisteredIotPlatformsBody](docs/RegisteredIotPlatformsBody.md)
+ - [RegisteredIotPlatformsRegisteredIotPlatformIdBody](docs/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md)
+ - [SecurityInfo](docs/SecurityInfo.md)
+ - [SerializerType](docs/SerializerType.md)
+ - [TrafficFilter](docs/TrafficFilter.md)
+ - [TrafficRuleDescriptor](docs/TrafficRuleDescriptor.md)
+ - [TransportInfo](docs/TransportInfo.md)
+ - [TransportType](docs/TransportType.md)
+ - [TunnelInfo](docs/TunnelInfo.md)
+ - [UplinkMsg](docs/UplinkMsg.md)
+
+## Documentation For Authorization
+ Endpoints do not require authorization.
+
+
+## Author
+
+cti_support@etsi.org
diff --git a/go-packages/meep-iot-client/api/swagger.yaml b/go-packages/meep-iot-client/api/swagger.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..14640b74bed7dd9cde653d5fd752a22dadeac288
--- /dev/null
+++ b/go-packages/meep-iot-client/api/swagger.yaml
@@ -0,0 +1,2858 @@
+openapi: 3.0.0
+info:
+  title: ETSI GS MEC 033 IoT API
+  description: ETSI GS MEC 033 IoT API described using OpenAPI.
+  contact:
+    name: ETSI Forge
+    url: https://forge.etsi.org/rep/mec/gs021-amsi-api
+    email: cti_support@etsi.org
+  license:
+    name: BSD-3-Clause
+    url: https://forge.etsi.org/legal-matters
+  version: 3.1.1
+externalDocs:
+  description: "ETSI GS MEC 033 IoT API, v3.3.1"
+  url: https://www.etsi.org/deliver/etsi_gs/MEC/001_099/033/03.01.01_60/gs_mec033v030101p.pdf
+servers:
+- url: https://localhost/sandboxname/iots/v1
+tags:
+- name: reg-dev
+  description: registered_devices
+- name: reg-iot-plat
+  description: registered_iot_platforms
+paths:
+  /registered_devices:
+    get:
+      tags:
+      - reg-dev
+      summary: Retrieve information about all devices with a valid traffic rule association
+        - see clause 5.2.2.
+      description: The GET method may be used by a service consumer to retrieve information
+        about all devices with a valid traffic rule association. This method is typically
+        used in the "registered devices query" procedure as described in clause 5.2.2.
+      operationId: registereddevicesGET
+      parameters:
+      - name: filter
+        in: query
+        description: "Attribute-based filtering parameters according to ETSI GS MEC\
+          \ 009 [i.1]. The API producer shall support receiving the following filtering\
+          \ parameters as part of the URI query string: \"(eq,enabled,TRUE)\".\n"
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: string
+      - name: fields
+        in: query
+        description: |
+          The list may contain one or more of the following attributes from the DeviceInfo data type:
+          - deviceMetadata
+          - gpsi
+          - msisdn
+          - deviceId
+          - requestedMecTrafficRule
+          - requestedIotPlatformId
+          - requestedUserTransportId
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of registered\
+            \ devices is returned. The response body shall contain a list of resources\
+            \ that match the attribute filter."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/inline_response_200'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - reg-dev
+      summary: Register a new device - see clause 5.2.3.
+      description: The POST method may be used by a service consumer to register a
+        new device. This method is typically used in the "device registration" procedure
+        as described in clause 5.2.3.
+      operationId: registereddevicesPOST
+      requestBody:
+        description: Payload body in the request contains the information associated
+          to the IoT device to be registered.
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_devices_body'
+        required: true
+      responses:
+        "201":
+          description: "Upon success, the HTTP response shall include a \"Location\"\
+            \ HTTP header that contains the resource URI of the registered device."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_devices_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /registered_devices/{registeredDeviceId}:
+    get:
+      tags:
+      - reg-dev
+      summary: Retrieve information about a device - see clause 5.2.4.
+      description: The GET method may be used by a service consumer to retrieve information
+        about a device. This method is typically used in the "device registration
+        query" procedure as described in clause 5.2.4.
+      operationId: registereddevicesByIdGET
+      parameters:
+      - name: registeredDeviceId
+        in: path
+        description: The unique identifier of the registered device.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing information about\
+            \ the registered device is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_devices_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - reg-dev
+      summary: Update information about a  device including its association to a valid
+        traffic rule - see clauses 5.2.5 and 5.4.3.
+      description: The PUT method may be used by a service consumer to update a device
+        registration including its association to a valid traffic rule. This method
+        is typically used in the "device registration update" procedure as described
+        in clause 5.2.5 and in the "user transport assignment" procedure as described
+        in clause 5.4.3.
+      operationId: registereddevicesByIdPUT
+      parameters:
+      - name: registeredDeviceId
+        in: path
+        description: The unique identifier of the registered device.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: One or more updated attributes that are allowed to be changed
+          are included in the DeviceInfo data structure in the payload body of the
+          request. .
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_devices_registeredDeviceId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated DeviceInfo is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_devices_registeredDeviceId_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "412":
+          description: "Precondition failed: used when a condition has failed during\
+            \ conditional requests, e.g. when using ETags to avoid write conflicts\
+            \ when using PUT"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - reg-dev
+      summary: Deregister a device - see clause 5.2.6.
+      description: The DELETE method may be used by a service consumer to deregister
+        a device. This method is typically used in the "device deregistration" procedure
+        as described in clause 5.2.6.
+      operationId: registereddevicesByIdDELETE
+      parameters:
+      - name: registeredDeviceId
+        in: path
+        description: The unique identifier of the registered device.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: No Content
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /registered_iot_platforms:
+    get:
+      tags:
+      - reg-iot-plat
+      summary: Retrieve information about all IoT platforms - see clause 5.3.2.
+      description: The GET method may be used by an authorized service consumer to
+        retrieve the information of all currently registered IoT platforms. This method
+        is typically used in the "registered IoT platforms query" procedure as described
+        in clause 5.3.2.
+      operationId: registerediotplatformsGET
+      parameters:
+      - name: fields
+        in: query
+        description: |
+          The list shall contain the following attributes from the IotPlatformInfo data type:
+          - iotPlatformId
+          - enabled
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of registered\
+            \ IoT platforms is returned."
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/IotPlatformInfo'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - reg-iot-plat
+      summary: Register a IoT platform - see clause 5.3.4.
+      description: The POST method may be used by a service consumer to register a
+        new IoT platform. This method is typically used in the "IoT platform registration"
+        procedure as described in clause 5.3.4.
+      operationId: registerediotplatformsPOST
+      requestBody:
+        description: Payload body in the request contains the information associated
+          to the IoT platform to be registered.
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_iot_platforms_body'
+        required: true
+      responses:
+        "201":
+          description: "Upon success, the HTTP response shall include a \"Location\"\
+            \ HTTP header that contains the resource URI of the registered IoT platform."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_iot_platforms_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /registered_iot_platforms/{registeredIotPlatformId}:
+    get:
+      tags:
+      - reg-iot-plat
+      summary: Discover native services and obtain information about user transports
+        provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+      description: 'The GET method may be used by a service consumer to obtain information
+        about a IoT platform. This method is typically used in the "IoT platform information
+        request" procedure as described in clause 5.3.3 and in the "user transport
+        query" procedure as described in clause 5.4.2. '
+      operationId: registerediotplatformsByIdGET
+      parameters:
+      - name: registeredIotPlatformId
+        in: path
+        description: The unique identifier of the registered IoT platform.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      - name: fields
+        in: query
+        description: |
+          The list may contain one or more of the following attributes from the IotPlatformInfo data type:
+          - userTransportInfo
+          - customServiceTransportInfo
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing information about\
+            \ the registered IoT platform is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/inline_response_200_1'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - reg-iot-plat
+      summary: Update information about a IoT platform - see clause 5.3.5.
+      description: The PUT method may be used by a service consumer to update a IoT
+        platform registration. This method is typically used in the "IoT platform
+        update" procedure as described in clause 5.3.5.
+      operationId: registerediotplatformsByIdPUT
+      parameters:
+      - name: registeredIotPlatformId
+        in: path
+        description: The unique identifier of the registered IoT platform.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: One or more updated attributes that are allowed to be changed
+          are included in the IotPlatformInfo data structure in the payload body of
+          the request. .
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/registered_iot_platforms_registeredIotPlatformId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated IotPlatformInfo is returned."
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/registered_iot_platforms_registeredIotPlatformId_body'
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "412":
+          description: "Precondition failed: used when a condition has failed during\
+            \ conditional requests, e.g. when using ETags to avoid write conflicts\
+            \ when using PUT"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - reg-iot-plat
+      summary: Deregister a IoT platform - see clause 5.3.6.
+      description: The DELETE method may be used by a service consumer to deregister
+        a IoT platform. This method is typically used in the "IoT platform deregistration"
+        procedure as described in clause 5.3.6.
+      operationId: registerediotplatformsByIdDELETE
+      parameters:
+      - name: registeredIotPlatformId
+        in: path
+        description: The unique identifier of the registered IoT platform.
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: No Content
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource."
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+components:
+  schemas:
+    ProblemDetails:
+      type: object
+      properties:
+        type:
+          type: string
+          description: A URI reference according to IETF RFC 3986 that identifies
+            the problem type
+          format: uri
+        title:
+          type: string
+          description: "A short, human-readable summary of the problem type"
+        status:
+          type: integer
+          description: The HTTP status code for this occurrence of the problem
+          format: uint32
+        detail:
+          type: string
+          description: A human-readable explanation specific to this occurrence of
+            the problem
+        instance:
+          type: string
+          description: A URI reference that identifies the specific occurrence of
+            the problem
+          format: uri
+    DeviceInfo:
+      title: DeviceInfo
+      required:
+      - deviceAuthenticationInfo
+      - deviceId
+      - enabled
+      type: object
+      properties:
+        deviceAuthenticationInfo:
+          type: string
+          description: "Information needed for secondary authentication of the IoT\
+            \ device to the data network - see ETSI TS 129 561 [i.4] and ETSI TS 129\
+            \ 061 [i.5] for 5G and LTE procedures, respectively. This attribute is\
+            \ implementation dependent and should be logically linked to the identifiers\
+            \ of the IoT device listed hereafter."
+        deviceMetadata:
+          type: array
+          description: 'Additional information about the IoT device. This attribute
+            is implementation dependent and may be expressed as an array of keyvalue
+            pairs. '
+          items:
+            $ref: '#/components/schemas/KeyValuePair'
+        gpsi:
+          type: string
+          description: GPSI of the IoT device if 5G-enabled (see note 1).
+        pei:
+          type: string
+          description: PEI of the IoT device if 5G-enabled (see note 1).
+        supi:
+          type: string
+          description: SUPI of the IoT device if 5G-enabled (see note 1).
+        msisdn:
+          type: string
+          description: MSISDN of the IoT device if LTE-enabled (see note 1).
+        imei:
+          type: string
+          description: IMEI of the IoT device if LTE-enabled (see note 1).
+        imsi:
+          type: string
+          description: IMSI of the IoT device if LTE-enabled (see note 1).
+        iccid:
+          type: string
+          description: ICCID of the IoT device (see note 1).
+        deviceId:
+          type: string
+          description: Human-readable identifier of the IoT device.
+        requestedMecTrafficRule:
+          type: array
+          description: "MEC traffic rules the IoT device is requested to be associated\
+            \ to (see note 2). The data type definition is as per ETSI GS\_MEC 010-2\
+            \ [i.6]."
+          items:
+            $ref: '#/components/schemas/TrafficRuleDescriptor'
+        requestedIotPlatformId:
+          type: string
+          description: IoT platform to which the IoT device is requested to be associated
+            to (see note 2).
+        requestedUserTransportId:
+          type: string
+          description: User transport to which the IoT device is requested to be associated
+            to (see note 2).
+        deviceSpecificMessageFormats:
+          $ref: '#/components/schemas/DeviceSpecificMessageFormats'
+        downlinkInfo:
+          $ref: '#/components/schemas/DownlinkInfo'
+        clientCertificate:
+          type: string
+          description: Client-side SSL/TLS certificate to be used by the MEC IoTS
+            to interact with the user transport provided by the associated IoT platform
+            in case the MEC IoTS acts on behalf of the IoT device.
+        enabled:
+          type: boolean
+          description: Indication whether the IoT device has a valid associated traffic
+            rule (TRUE) or not (FALSE). See note 3.
+      description: "NOTE 1: At least one attribute among gpsi, pei, supi, msisdn,\
+        \ imei, imsi, and iccid should be provided. Sufficient security\n        measures\
+        \ shall be put in place when any attribute among PEI, SUPI, IMEI, and IMSI\
+        \ is disclosed over the API.\nNOTE 2: Until a valid traffic rule is not provided,\
+        \ the device will not be able to use the IoTS. A valid traffic rule is provided\n\
+        \        by one of the following options:\n        • the requestedMecTrafficRule\
+        \ attribute;\n        • the requestedIotPlatformId attribute when the IoT\
+        \ platform offers only one user transport;\n        • the combination of requestedIotPlatformId\
+        \ and requestedUserTransportId.\nNOTE 3: Enabled is a pseudo-attribute which\
+        \ needs to be maintained by the IoTS based on the presence or not of a valid\n\
+        \        traffic rule associated to the device. It cannot be set directly\
+        \ by the service consumer. \n"
+      example:
+        deviceSpecificMessageFormats:
+          eventMsgFormat:
+            includeDeviceMetadata: true
+            includeIccid: true
+            includeDeviceAddr: true
+            includeImei: true
+            includeImsi: true
+            includeSupi: true
+            selectedSerializer: JSON
+            eventTopic: eventTopic
+            includeDeviceId: true
+            includePei: true
+          uplinkMsgFormat:
+            includeDeviceMetadata: true
+            includeIccid: true
+            includeDeviceAddr: true
+            includeImei: true
+            uplinkTopic: uplinkTopic
+            includeImsi: true
+            includeSupi: true
+            selectedSerializer: null
+            includeDevicePort: true
+            includeDeviceId: true
+            includePei: true
+        clientCertificate: clientCertificate
+        downlinkInfo:
+          downlinkTopic: downlinkTopic
+          devicePort: 5
+        imsi: imsi
+        supi: supi
+        deviceId: deviceId
+        requestedMecTrafficRule:
+        - action: SEE_DESCRIPTION
+          trafficRuleId: trafficRuleId
+          dstInterface:
+            interfaceType: TUNNEL
+            dstIPAddress: dstIPAddress
+            srcMACAddress: srcMACAddress
+            dstMACAddress: dstMACAddress
+            tunnelInfo:
+              tunnelSrcAddress: tunnelSrcAddress
+              tunnelType: GTP-U
+              tunnelSpecificData: tunnelSpecificData
+              tunnelDstAddress: tunnelDstAddress
+          filterType: per FLOW
+          priority: 0
+          trafficFilter:
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+        - action: SEE_DESCRIPTION
+          trafficRuleId: trafficRuleId
+          dstInterface:
+            interfaceType: TUNNEL
+            dstIPAddress: dstIPAddress
+            srcMACAddress: srcMACAddress
+            dstMACAddress: dstMACAddress
+            tunnelInfo:
+              tunnelSrcAddress: tunnelSrcAddress
+              tunnelType: GTP-U
+              tunnelSpecificData: tunnelSpecificData
+              tunnelDstAddress: tunnelDstAddress
+          filterType: per FLOW
+          priority: 0
+          trafficFilter:
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+          - srcTunnelPort:
+            - srcTunnelPort
+            - srcTunnelPort
+            dstAddress:
+            - dstAddress
+            - dstAddress
+            srcAddress:
+            - srcAddress
+            - srcAddress
+            srcPort:
+            - srcPort
+            - srcPort
+            uri:
+            - uri
+            - uri
+            tC: 5
+            protocol:
+            - protocol
+            - protocol
+            dstTunnelPort:
+            - dstTunnelPort
+            - dstTunnelPort
+            dSCP: 1
+            dstPort:
+            - dstPort
+            - dstPort
+            packetLabel:
+            - packetLabel
+            - packetLabel
+            qCI: 6
+            srcTunnelAddress:
+            - srcTunnelAddress
+            - srcTunnelAddress
+            tag:
+            - tag
+            - tag
+            tgtTunnelAddress:
+            - tgtTunnelAddress
+            - tgtTunnelAddress
+        enabled: true
+        gpsi: gpsi
+        requestedUserTransportId: requestedUserTransportId
+        iccid: iccid
+        pei: pei
+        requestedIotPlatformId: requestedIotPlatformId
+        deviceMetadata:
+        - value: value
+          key: key
+        - value: value
+          key: key
+        deviceAuthenticationInfo: deviceAuthenticationInfo
+        imei: imei
+        msisdn: msisdn
+    IotPlatformInfo:
+      title: IotPlatformInfo
+      required:
+      - enabled
+      - iotPlatformId
+      - userTransportInfo
+      type: object
+      properties:
+        iotPlatformId:
+          type: string
+          description: Identifier of the IoT platform.
+        userTransportInfo:
+          minItems: 1
+          type: array
+          description: Information about the user transport(s)  provided by the IoT
+            platform.
+          items:
+            $ref: '#/components/schemas/MBTransportInfo'
+        customServicesTransportInfo:
+          minItems: 0
+          type: array
+          description: "Transport enabling access to vendor-specific services provided\
+            \ by the IoT platform. The data type definition is as per ETSI GS MEC\
+            \ 011 [i.2]."
+          items:
+            $ref: '#/components/schemas/TransportInfo'
+        enabled:
+          type: boolean
+          description: Indication whether the IoT platform is capable of providing
+            user transports and vendor-specific services (TRUE) or not (FALSE).
+      example:
+        iotPlatformId: iotPlatformId
+        customServicesTransportInfo:
+        - implSpecificInfo: implSpecificInfo
+          protocol: protocol
+          endpoint: null
+          security: null
+          name: name
+          description: description
+          id: id
+          type: null
+          version: version
+        - implSpecificInfo: implSpecificInfo
+          protocol: protocol
+          endpoint: null
+          security: null
+          name: name
+          description: description
+          id: id
+          type: null
+          version: version
+        userTransportInfo:
+        - implSpecificInfo:
+            uplinkTopics:
+            - uplinkTopics
+            - uplinkTopics
+            downlinkTopics:
+            - downlinkTopics
+            - downlinkTopics
+            eventTopics:
+            - eventTopics
+            - eventTopics
+          protocol: protocol
+          endpoint:
+            uris:
+            - uris
+            - uris
+            addresses:
+            - port: 0
+              host: host
+            - port: 0
+              host: host
+            fqdn:
+            - fqdn
+            - fqdn
+            alternative: alternative
+          security:
+            extensions: extensions
+            oAuth2Info:
+              tokenEndpoint: http://example.com/aeiou
+              grantTypes:
+              - OAUTH2_AUTHORIZATION_CODE
+              - OAUTH2_AUTHORIZATION_CODE
+          name: name
+          description: description
+          id: id
+          type: REST_HTTP
+          version: version
+        - implSpecificInfo:
+            uplinkTopics:
+            - uplinkTopics
+            - uplinkTopics
+            downlinkTopics:
+            - downlinkTopics
+            - downlinkTopics
+            eventTopics:
+            - eventTopics
+            - eventTopics
+          protocol: protocol
+          endpoint:
+            uris:
+            - uris
+            - uris
+            addresses:
+            - port: 0
+              host: host
+            - port: 0
+              host: host
+            fqdn:
+            - fqdn
+            - fqdn
+            alternative: alternative
+          security:
+            extensions: extensions
+            oAuth2Info:
+              tokenEndpoint: http://example.com/aeiou
+              grantTypes:
+              - OAUTH2_AUTHORIZATION_CODE
+              - OAUTH2_AUTHORIZATION_CODE
+          name: name
+          description: description
+          id: id
+          type: REST_HTTP
+          version: version
+        enabled: true
+    MBTransportInfo:
+      title: MBTransportInfo
+      required:
+      - endpoint
+      - id
+      - implSpecificInfo
+      - name
+      - protocol
+      - security
+      - type
+      - version
+      type: object
+      properties:
+        id:
+          type: string
+          description: "The identifier of this transport as per ETSI GS\_MEC\_011\
+            \ [i.2]."
+        name:
+          type: string
+          description: "The name of this transport as per ETSI GS\_MEC\_011\_[i.2]."
+        description:
+          type: string
+          description: "Human-readable description of this transport as per ETSI GS\_\
+            MEC 011 [i.2]."
+        type:
+          $ref: '#/components/schemas/TransportType'
+        protocol:
+          type: string
+          description: "The name of the protocol used. Being the transport of MB_TOPIC_BASED\
+            \ type, this attribute should be typically set to \"MQTT\" or \"AMQP.\""
+        version:
+          type: string
+          description: "The version of the protocol used as per ETSI GS\_MEC\_011\_\
+            [i.2]."
+        endpoint:
+          $ref: '#/components/schemas/EndPointInfo'
+        security:
+          $ref: '#/components/schemas/SecurityInfo'
+        implSpecificInfo:
+          $ref: '#/components/schemas/ImplSpecificInfo'
+      example:
+        implSpecificInfo:
+          uplinkTopics:
+          - uplinkTopics
+          - uplinkTopics
+          downlinkTopics:
+          - downlinkTopics
+          - downlinkTopics
+          eventTopics:
+          - eventTopics
+          - eventTopics
+        protocol: protocol
+        endpoint:
+          uris:
+          - uris
+          - uris
+          addresses:
+          - port: 0
+            host: host
+          - port: 0
+            host: host
+          fqdn:
+          - fqdn
+          - fqdn
+          alternative: alternative
+        security:
+          extensions: extensions
+          oAuth2Info:
+            tokenEndpoint: http://example.com/aeiou
+            grantTypes:
+            - OAUTH2_AUTHORIZATION_CODE
+            - OAUTH2_AUTHORIZATION_CODE
+        name: name
+        description: description
+        id: id
+        type: REST_HTTP
+        version: version
+    EventMsg:
+      title: EventMsg
+      required:
+      - eventTopic
+      - selectedSerializer
+      type: object
+      properties:
+        eventTopic:
+          type: string
+          description: 'Topic where the message containing application-specific information
+            should be published. '
+        selectedSerializer:
+          $ref: '#/components/schemas/SerializerType'
+        includeDeviceAddr:
+          type: boolean
+          description: Indication whether to include the IP address of the IoT device
+            (TRUE) or not (FALSE).
+        includeDeviceMetadata:
+          type: boolean
+          description: Indication whether to include the metadata about the IoT device
+            (TRUE) or not (FALSE).
+        includePei:
+          type: boolean
+          description: Indication whether to include the PEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeSupi:
+          type: boolean
+          description: Indication whether to include the SUPI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImei:
+          type: boolean
+          description: Indication whether to include the IMEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImsi:
+          type: boolean
+          description: Indication whether to include the IMSI of the IoT device (TRUE)
+            or not (FALSE).
+        includeIccid:
+          type: boolean
+          description: Indication whether to include the ICCID of the IoT device (TRUE)
+            or not (FALSE).
+        includeDeviceId:
+          type: boolean
+          description: Indication whether to include the human-readable identified
+            of the IoT device (TRUE) or not (FALSE).
+      example:
+        includeDeviceMetadata: true
+        includeIccid: true
+        includeDeviceAddr: true
+        includeImei: true
+        includeImsi: true
+        includeSupi: true
+        selectedSerializer: JSON
+        eventTopic: eventTopic
+        includeDeviceId: true
+        includePei: true
+    UplinkMsg:
+      title: UplinkMsg
+      required:
+      - selectedSerializer
+      - uplinkTopic
+      type: object
+      properties:
+        uplinkTopic:
+          type: string
+          description: "Topic where the message containing the data generated by the\
+            \ IoT device(s) should be published, in order to be consumed by the end\
+            \ IoT application(s)."
+        selectedSerializer:
+          $ref: '#/components/schemas/SerializerType'
+        includeDevicePort:
+          type: boolean
+          description: Indication whether to include the UDP port of the remote IoT
+            device (TRUE) or not (FALSE).
+        includeDeviceAddr:
+          type: boolean
+          description: Indication whether to include the IP address of the IoT device
+            (TRUE) or not (FALSE).
+        includeDeviceMetadata:
+          type: boolean
+          description: Indication whether to include the metadata about the IoT device
+            (TRUE) or not (FALSE).
+        includePei:
+          type: boolean
+          description: Indication whether to include the PEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeSupi:
+          type: boolean
+          description: Indication whether to include the SUPI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImei:
+          type: boolean
+          description: Indication whether to include the IMEI of the IoT device (TRUE)
+            or not (FALSE).
+        includeImsi:
+          type: boolean
+          description: Indication whether to include the IMSI of the IoT device (TRUE)
+            or not (FALSE).
+        includeIccid:
+          type: boolean
+          description: Indication whether to include the ICCID of the IoT device (TRUE)
+            or not (FALSE).
+        includeDeviceId:
+          type: boolean
+          description: Indication whether to include the human-readable identified
+            of the IoT device (TRUE) or not (FALSE).
+      example:
+        includeDeviceMetadata: true
+        includeIccid: true
+        includeDeviceAddr: true
+        includeImei: true
+        uplinkTopic: uplinkTopic
+        includeImsi: true
+        includeSupi: true
+        selectedSerializer: null
+        includeDevicePort: true
+        includeDeviceId: true
+        includePei: true
+    DeviceSpecificMessageFormats:
+      type: object
+      properties:
+        eventMsgFormat:
+          $ref: '#/components/schemas/EventMsg'
+        uplinkMsgFormat:
+          $ref: '#/components/schemas/UplinkMsg'
+      description: Format of the messages to be published by the MEC IoTS on the user
+        transport provided by the associated IoT platform in case the MEC IoTS acts
+        on behalf of the IoT device.
+      example:
+        eventMsgFormat:
+          includeDeviceMetadata: true
+          includeIccid: true
+          includeDeviceAddr: true
+          includeImei: true
+          includeImsi: true
+          includeSupi: true
+          selectedSerializer: JSON
+          eventTopic: eventTopic
+          includeDeviceId: true
+          includePei: true
+        uplinkMsgFormat:
+          includeDeviceMetadata: true
+          includeIccid: true
+          includeDeviceAddr: true
+          includeImei: true
+          uplinkTopic: uplinkTopic
+          includeImsi: true
+          includeSupi: true
+          selectedSerializer: null
+          includeDevicePort: true
+          includeDeviceId: true
+          includePei: true
+    DownlinkInfo:
+      type: object
+      properties:
+        downlinkTopic:
+          type: string
+          description: Topic associated to the IoT device. This topic should be used
+            by an end IoT application to send downlink data to the IoT device.
+        devicePort:
+          type: integer
+          description: "UDP port to be used by the MEC IoTS for the outgoing downlink\
+            \ packets towards the IoT device. In case a default value is used, this\
+            \ attribute is optional."
+      description: Downlink communication configuration of the user transport provided
+        by the associated IoT platform in case the MEC IoTS acts on behalf of the
+        IoT device.
+      example:
+        downlinkTopic: downlinkTopic
+        devicePort: 5
+    ImplSpecificInfo:
+      type: object
+      properties:
+        eventTopics:
+          minItems: 0
+          type: array
+          description: Topics used to publish events related to the established session
+            between the IoT device(s) and the end IoT application(s) on the user transport.
+          items:
+            type: string
+        uplinkTopics:
+          type: array
+          description: "Topics used to publish data generated by the IoT device(s)\
+            \ on the user transport, in order to be consumed by the end IoT application(s)."
+          items:
+            type: string
+        downlinkTopics:
+          type: array
+          description: "Topics used to publish data generated by the IoT applications(s)\
+            \ on the user transport, in order to be consumed by the end IoT device(s)."
+          items:
+            type: string
+      description: Additional implementation specific details of the transport.
+      example:
+        uplinkTopics:
+        - uplinkTopics
+        - uplinkTopics
+        downlinkTopics:
+        - downlinkTopics
+        - downlinkTopics
+        eventTopics:
+        - eventTopics
+        - eventTopics
+    SerializerType:
+      type: string
+      description: The enumeration SerializerType represents types of serializers.
+      enum:
+      - JSON
+      - XML
+      - PROTOBUF3
+    TransportInfo:
+      title: TransportInfo
+      required:
+      - endpoint
+      - id
+      - name
+      - protocol
+      - security
+      - type
+      - version
+      type: object
+      properties:
+        id:
+          type: string
+          description: The identifier of this transport.
+        name:
+          type: string
+          description: The name of this transport.
+        description:
+          type: string
+          description: Human-readable description of this transport.
+        type:
+          $ref: '#/components/schemas/TransportType'
+        protocol:
+          type: string
+          description: The name of the protocol used. Shall be set to "HTTP" for a
+            REST API.
+        version:
+          type: string
+          description: The version of the protocol used.
+        endpoint:
+          $ref: '#/components/schemas/EndPointInfo'
+        security:
+          $ref: '#/components/schemas/SecurityInfo'
+        implSpecificInfo:
+          type: string
+          description: Additional implementation specific details of the transport.
+      example:
+        implSpecificInfo: implSpecificInfo
+        protocol: protocol
+        endpoint: null
+        security: null
+        name: name
+        description: description
+        id: id
+        type: null
+        version: version
+    TransportType:
+      type: string
+      description: Enumeration representing types of transports.
+      enum:
+      - REST_HTTP
+      - MB_TOPIC_BASED
+      - MB_ROUTING
+      - MB_PUBSUB
+      - RPC
+      - RPC_STREAMING
+      - WEBSOCKET
+    EndPointInfo:
+      title: EndPointInfo
+      type: object
+      properties:
+        uris:
+          type: array
+          description: "Entry point information of the service as string, formatted\
+            \ according to URI syntax (see IETF RFC 3986 [8]). Shall be used for REST\
+            \ APIs. See note."
+          items:
+            type: string
+        fqdn:
+          type: array
+          description: Fully Qualified Domain Name of the service. See note.
+          items:
+            type: string
+        addresses:
+          type: array
+          items:
+            $ref: '#/components/schemas/Addresses'
+        alternative:
+          type: string
+          description: "Entry point information of the service in a format defined\
+            \ by an implementation, or in an external specification. See\_note."
+      description: "NOTE: Exactly one of \"uris\", \"fqdn\", \"addresses\" or \"alternative\"\
+        \ shall be present. \n"
+      example:
+        uris:
+        - uris
+        - uris
+        addresses:
+        - port: 0
+          host: host
+        - port: 0
+          host: host
+        fqdn:
+        - fqdn
+        - fqdn
+        alternative: alternative
+    SecurityInfo:
+      type: object
+      properties:
+        oAuth2Info:
+          $ref: '#/components/schemas/OAuth2Info'
+        extensions:
+          type: string
+          description: "Extensions for alternative transport mechanisms. These extensions\
+            \ depend on the actual transport and are out of scope of the present document.\
+            \ For instance, such extensions may be used to signal the necessary parameters\
+            \ for the client to use TLS-based authorization defined for alternative\
+            \ transports (see ETSI GS MEC 009 [5] for more information).\n"
+      example:
+        extensions: extensions
+        oAuth2Info:
+          tokenEndpoint: http://example.com/aeiou
+          grantTypes:
+          - OAUTH2_AUTHORIZATION_CODE
+          - OAUTH2_AUTHORIZATION_CODE
+    Addresses:
+      required:
+      - host
+      - port
+      type: object
+      properties:
+        host:
+          type: string
+          description: Host portion of the address.
+        port:
+          type: integer
+          description: Port portion of the address.
+      description: Entry point information of the service as one or more pairs of
+        IP address and port. See note.
+      example:
+        port: 0
+        host: host
+    OAuth2Info:
+      required:
+      - grantTypes
+      type: object
+      properties:
+        grantTypes:
+          type: array
+          description: "List of supported OAuth 2.0 grant types.\nEach entry shall\
+            \ be one of the following permitted values:\n- OAUTH2_AUTHORIZATION_CODE:\
+            \ Authorization code grant type\n- OAUTH2_IMPLICIT_GRANT: Implicit grant\
+            \ type\n- OAUTH2_RESOURCE_OWNER: Resource owner password credentials grant\
+            \ type\n- OAUTH2_CLIENT_CREDENTIALS: Client credentials grant type\nOnly\
+            \ the value \"OAUTH2_CLIENT_CREDENTIALS\" is supported in the present\
+            \ document.\n"
+          items:
+            type: string
+            enum:
+            - OAUTH2_AUTHORIZATION_CODE
+            - OAUTH2_IMPLICIT_GRANT
+            - OAUTH2_RESOURCE_OWNER
+            - OAUTH2_CLIENT_CREDENTIALS
+        tokenEndpoint:
+          type: string
+          description: The token endpoint. Shall be present unless the grant type
+            is OAUTH2_IMPLICIT_GRANT.
+          format: uri
+      description: "Parameters related to use of OAuth 2.0. Shall be present in case\
+        \ OAuth 2.0 (see IETF RFC 6749 [13]) is supported to secure the provision\
+        \ of the service over the transport."
+      example:
+        tokenEndpoint: http://example.com/aeiou
+        grantTypes:
+        - OAUTH2_AUTHORIZATION_CODE
+        - OAUTH2_AUTHORIZATION_CODE
+    TrafficRuleDescriptor:
+      title: TrafficRuleDescriptor
+      required:
+      - action
+      - filterType
+      - priority
+      - trafficFilter
+      - trafficRuleId
+      type: object
+      properties:
+        trafficRuleId:
+          type: string
+          description: Identifies the traffic rule.
+        filterType:
+          type: string
+          description: "Definition of filter type: per FLOW or PACKET\n\nIf it is\
+            \ per FLOW, the filter matches upstream (e.g. UE->EPC) packets and downstream\
+            \ (e.g. EPC->UE) packets are handled by the same context.\n"
+          enum:
+          - per FLOW
+          - per PACKET
+        priority:
+          type: integer
+          description: "Priority of this traffic rule within the range 0 to 255. If\
+            \ traffic rule conflicts, the one with higher priority take precedence.\
+            \ See note\_1."
+        trafficFilter:
+          type: array
+          description: The filter used to identify specific flow/packets that need
+            to be handled by the MEC host.
+          items:
+            $ref: '#/components/schemas/TrafficFilter'
+        action:
+          type: string
+          description: "Identifies the action of the MEC host data plane, when a packet\
+            \ matches the trafficFilter, the example actions include:\nDROP,\nFORWARD_DECAPSULATED,\n\
+            FORWARD_ENCAPSULATED,\nPASSTHROUGH,\nDUPLICATE_DECAPSULATED,\nDUPLICATE_ENCAPSULATED "
+          enum:
+          - SEE_DESCRIPTION
+        dstInterface:
+          $ref: '#/components/schemas/InterfaceDescriptor'
+      description: "NOTE 1: Value indicates the priority in descending order, i.e.\
+        \ with 0 as the highest priority and 255 as the lowest\n        priority.\n\
+        NOTE 2: Some applications (like inline/tap) require two interfaces. The first\
+        \ interface in the case of inline/tap is on the\n        client (e.g. UE)\
+        \ side and the second on the core network (e.g. EPC) side. \n"
+      example:
+        action: SEE_DESCRIPTION
+        trafficRuleId: trafficRuleId
+        dstInterface:
+          interfaceType: TUNNEL
+          dstIPAddress: dstIPAddress
+          srcMACAddress: srcMACAddress
+          dstMACAddress: dstMACAddress
+          tunnelInfo:
+            tunnelSrcAddress: tunnelSrcAddress
+            tunnelType: GTP-U
+            tunnelSpecificData: tunnelSpecificData
+            tunnelDstAddress: tunnelDstAddress
+        filterType: per FLOW
+        priority: 0
+        trafficFilter:
+        - srcTunnelPort:
+          - srcTunnelPort
+          - srcTunnelPort
+          dstAddress:
+          - dstAddress
+          - dstAddress
+          srcAddress:
+          - srcAddress
+          - srcAddress
+          srcPort:
+          - srcPort
+          - srcPort
+          uri:
+          - uri
+          - uri
+          tC: 5
+          protocol:
+          - protocol
+          - protocol
+          dstTunnelPort:
+          - dstTunnelPort
+          - dstTunnelPort
+          dSCP: 1
+          dstPort:
+          - dstPort
+          - dstPort
+          packetLabel:
+          - packetLabel
+          - packetLabel
+          qCI: 6
+          srcTunnelAddress:
+          - srcTunnelAddress
+          - srcTunnelAddress
+          tag:
+          - tag
+          - tag
+          tgtTunnelAddress:
+          - tgtTunnelAddress
+          - tgtTunnelAddress
+        - srcTunnelPort:
+          - srcTunnelPort
+          - srcTunnelPort
+          dstAddress:
+          - dstAddress
+          - dstAddress
+          srcAddress:
+          - srcAddress
+          - srcAddress
+          srcPort:
+          - srcPort
+          - srcPort
+          uri:
+          - uri
+          - uri
+          tC: 5
+          protocol:
+          - protocol
+          - protocol
+          dstTunnelPort:
+          - dstTunnelPort
+          - dstTunnelPort
+          dSCP: 1
+          dstPort:
+          - dstPort
+          - dstPort
+          packetLabel:
+          - packetLabel
+          - packetLabel
+          qCI: 6
+          srcTunnelAddress:
+          - srcTunnelAddress
+          - srcTunnelAddress
+          tag:
+          - tag
+          - tag
+          tgtTunnelAddress:
+          - tgtTunnelAddress
+          - tgtTunnelAddress
+    TrafficFilter:
+      title: TrafficFilter
+      type: object
+      properties:
+        srcAddress:
+          type: array
+          description: "An IP address or a range of IP addresses.\nFor IPv4, the IP\
+            \ address could be an IP address plus mask, or an individual IP address,\
+            \ or a range of IP addresses.\nFor IPv6, the IP address could be an IP\
+            \ prefix, or a range of IP prefixes."
+          items:
+            type: string
+        dstAddress:
+          type: array
+          description: "An IP address or a range of IP addresses.\nFor IPv4, the IP\
+            \ address could be an IP address plus mask, or an individual IP address,\
+            \ or a range of IP addresses.\nFor IPv6, the IP address could be an IP\
+            \ prefix, or a range of IP prefixes."
+          items:
+            type: string
+        srcPort:
+          type: array
+          description: A port or a range of ports.
+          items:
+            type: string
+        dstPort:
+          type: array
+          description: A port or a range of ports.
+          items:
+            type: string
+        protocol:
+          type: array
+          description: Specify the protocol of the traffic filter.
+          items:
+            type: string
+        tag:
+          type: array
+          description: Used for tag based traffic rule.
+          items:
+            type: string
+        uri:
+          type: array
+          description: "An URI label, in application layer, i.e. in HTTP message,\
+            \ is used to filter the traffic."
+          items:
+            type: string
+        packetLabel:
+          type: array
+          description: "A customized packet label in network layer, as defined by\
+            \ the owner of the MEC platform, is used to filter the traffic."
+          items:
+            type: string
+        srcTunnelAddress:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        tgtTunnelAddress:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        srcTunnelPort:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        dstTunnelPort:
+          type: array
+          description: Used for GTP tunnel based traffic rule.
+          items:
+            type: string
+        qCI:
+          type: integer
+          description: Used to match all packets that have the same QCI.
+        dSCP:
+          type: integer
+          description: Used to match all IPv4 packets that have the same DSCP.
+        tC:
+          type: integer
+          description: Used to match all IPv6 packets that have the same TC.
+      example:
+        srcTunnelPort:
+        - srcTunnelPort
+        - srcTunnelPort
+        dstAddress:
+        - dstAddress
+        - dstAddress
+        srcAddress:
+        - srcAddress
+        - srcAddress
+        srcPort:
+        - srcPort
+        - srcPort
+        uri:
+        - uri
+        - uri
+        tC: 5
+        protocol:
+        - protocol
+        - protocol
+        dstTunnelPort:
+        - dstTunnelPort
+        - dstTunnelPort
+        dSCP: 1
+        dstPort:
+        - dstPort
+        - dstPort
+        packetLabel:
+        - packetLabel
+        - packetLabel
+        qCI: 6
+        srcTunnelAddress:
+        - srcTunnelAddress
+        - srcTunnelAddress
+        tag:
+        - tag
+        - tag
+        tgtTunnelAddress:
+        - tgtTunnelAddress
+        - tgtTunnelAddress
+    InterfaceDescriptor:
+      title: InterfaceDescriptor
+      required:
+      - interfaceType
+      type: object
+      properties:
+        interfaceType:
+          type: string
+          description: "Type of interface: TUNNEL, MAC, IP, etc."
+          enum:
+          - TUNNEL
+          - MAC
+          - IP
+        tunnelInfo:
+          $ref: '#/components/schemas/TunnelInfo'
+        srcMACAddress:
+          type: string
+          description: "If the interface type is MAC, the source address identifies\
+            \ the MAC address of the interface."
+        dstMACAddress:
+          type: string
+          description: "If the interface type is MAC, the destination address identifies\
+            \ the MAC address of the destination. Only used for dstInterface."
+        dstIPAddress:
+          type: string
+          description: "If the interface type is IP, the destination address identifies\
+            \ the IP address of the destination. Only used for dstInterface."
+      example:
+        interfaceType: TUNNEL
+        dstIPAddress: dstIPAddress
+        srcMACAddress: srcMACAddress
+        dstMACAddress: dstMACAddress
+        tunnelInfo:
+          tunnelSrcAddress: tunnelSrcAddress
+          tunnelType: GTP-U
+          tunnelSpecificData: tunnelSpecificData
+          tunnelDstAddress: tunnelDstAddress
+    TunnelInfo:
+      title: TunnelInfo
+      required:
+      - tunnelDstAddress
+      - tunnelSrcAddress
+      - tunnelType
+      type: object
+      properties:
+        tunnelType:
+          type: string
+          description: "Type of tunnel: GTP-U, GRE, etc."
+          enum:
+          - GTP-U
+          - GRE
+        tunnelDstAddress:
+          type: string
+          description: Destination address of the tunnel.
+        tunnelSrcAddress:
+          type: string
+          description: Source address of the tunnel.
+        tunnelSpecificData:
+          type: string
+          description: Parameters specific to the tunnel.
+      example:
+        tunnelSrcAddress: tunnelSrcAddress
+        tunnelType: GTP-U
+        tunnelSpecificData: tunnelSpecificData
+        tunnelDstAddress: tunnelDstAddress
+    KeyValuePair:
+      type: object
+      properties:
+        key:
+          type: string
+        value:
+          type: string
+      description: Key-value pairs for device metadata
+      example:
+        value: value
+        key: key
+    inline_response_200:
+      type: object
+      properties:
+        items:
+          $ref: '#/components/schemas/DeviceInfo'
+      example:
+        items:
+          deviceSpecificMessageFormats:
+            eventMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: JSON
+              eventTopic: eventTopic
+              includeDeviceId: true
+              includePei: true
+            uplinkMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              uplinkTopic: uplinkTopic
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: null
+              includeDevicePort: true
+              includeDeviceId: true
+              includePei: true
+          clientCertificate: clientCertificate
+          downlinkInfo:
+            downlinkTopic: downlinkTopic
+            devicePort: 5
+          imsi: imsi
+          supi: supi
+          deviceId: deviceId
+          requestedMecTrafficRule:
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          enabled: true
+          gpsi: gpsi
+          requestedUserTransportId: requestedUserTransportId
+          iccid: iccid
+          pei: pei
+          requestedIotPlatformId: requestedIotPlatformId
+          deviceMetadata:
+          - value: value
+            key: key
+          - value: value
+            key: key
+          deviceAuthenticationInfo: deviceAuthenticationInfo
+          imei: imei
+          msisdn: msisdn
+    registered_devices_body:
+      type: object
+      properties:
+        DeviceInfo:
+          $ref: '#/components/schemas/DeviceInfo'
+      example:
+        DeviceInfo:
+          deviceSpecificMessageFormats:
+            eventMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: JSON
+              eventTopic: eventTopic
+              includeDeviceId: true
+              includePei: true
+            uplinkMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              uplinkTopic: uplinkTopic
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: null
+              includeDevicePort: true
+              includeDeviceId: true
+              includePei: true
+          clientCertificate: clientCertificate
+          downlinkInfo:
+            downlinkTopic: downlinkTopic
+            devicePort: 5
+          imsi: imsi
+          supi: supi
+          deviceId: deviceId
+          requestedMecTrafficRule:
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          enabled: true
+          gpsi: gpsi
+          requestedUserTransportId: requestedUserTransportId
+          iccid: iccid
+          pei: pei
+          requestedIotPlatformId: requestedIotPlatformId
+          deviceMetadata:
+          - value: value
+            key: key
+          - value: value
+            key: key
+          deviceAuthenticationInfo: deviceAuthenticationInfo
+          imei: imei
+          msisdn: msisdn
+    registered_devices_registeredDeviceId_body:
+      type: object
+      properties:
+        DeviceInfo:
+          $ref: '#/components/schemas/DeviceInfo'
+      example:
+        DeviceInfo:
+          deviceSpecificMessageFormats:
+            eventMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: JSON
+              eventTopic: eventTopic
+              includeDeviceId: true
+              includePei: true
+            uplinkMsgFormat:
+              includeDeviceMetadata: true
+              includeIccid: true
+              includeDeviceAddr: true
+              includeImei: true
+              uplinkTopic: uplinkTopic
+              includeImsi: true
+              includeSupi: true
+              selectedSerializer: null
+              includeDevicePort: true
+              includeDeviceId: true
+              includePei: true
+          clientCertificate: clientCertificate
+          downlinkInfo:
+            downlinkTopic: downlinkTopic
+            devicePort: 5
+          imsi: imsi
+          supi: supi
+          deviceId: deviceId
+          requestedMecTrafficRule:
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          - action: SEE_DESCRIPTION
+            trafficRuleId: trafficRuleId
+            dstInterface:
+              interfaceType: TUNNEL
+              dstIPAddress: dstIPAddress
+              srcMACAddress: srcMACAddress
+              dstMACAddress: dstMACAddress
+              tunnelInfo:
+                tunnelSrcAddress: tunnelSrcAddress
+                tunnelType: GTP-U
+                tunnelSpecificData: tunnelSpecificData
+                tunnelDstAddress: tunnelDstAddress
+            filterType: per FLOW
+            priority: 0
+            trafficFilter:
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+            - srcTunnelPort:
+              - srcTunnelPort
+              - srcTunnelPort
+              dstAddress:
+              - dstAddress
+              - dstAddress
+              srcAddress:
+              - srcAddress
+              - srcAddress
+              srcPort:
+              - srcPort
+              - srcPort
+              uri:
+              - uri
+              - uri
+              tC: 5
+              protocol:
+              - protocol
+              - protocol
+              dstTunnelPort:
+              - dstTunnelPort
+              - dstTunnelPort
+              dSCP: 1
+              dstPort:
+              - dstPort
+              - dstPort
+              packetLabel:
+              - packetLabel
+              - packetLabel
+              qCI: 6
+              srcTunnelAddress:
+              - srcTunnelAddress
+              - srcTunnelAddress
+              tag:
+              - tag
+              - tag
+              tgtTunnelAddress:
+              - tgtTunnelAddress
+              - tgtTunnelAddress
+          enabled: true
+          gpsi: gpsi
+          requestedUserTransportId: requestedUserTransportId
+          iccid: iccid
+          pei: pei
+          requestedIotPlatformId: requestedIotPlatformId
+          deviceMetadata:
+          - value: value
+            key: key
+          - value: value
+            key: key
+          deviceAuthenticationInfo: deviceAuthenticationInfo
+          imei: imei
+          msisdn: msisdn
+    registered_iot_platforms_body:
+      type: object
+      properties:
+        IoTPlatformInfo:
+          $ref: '#/components/schemas/IotPlatformInfo'
+      example:
+        IoTPlatformInfo:
+          iotPlatformId: iotPlatformId
+          customServicesTransportInfo:
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          userTransportInfo:
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          enabled: true
+    inline_response_200_1:
+      type: object
+      properties:
+        IotPlatformInfo:
+          $ref: '#/components/schemas/IotPlatformInfo'
+      example:
+        IotPlatformInfo:
+          iotPlatformId: iotPlatformId
+          customServicesTransportInfo:
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          userTransportInfo:
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          enabled: true
+    registered_iot_platforms_registeredIotPlatformId_body:
+      type: object
+      properties:
+        IotPlatformInfo:
+          $ref: '#/components/schemas/IotPlatformInfo'
+      example:
+        IotPlatformInfo:
+          iotPlatformId: iotPlatformId
+          customServicesTransportInfo:
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          - implSpecificInfo: implSpecificInfo
+            protocol: protocol
+            endpoint: null
+            security: null
+            name: name
+            description: description
+            id: id
+            type: null
+            version: version
+          userTransportInfo:
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          - implSpecificInfo:
+              uplinkTopics:
+              - uplinkTopics
+              - uplinkTopics
+              downlinkTopics:
+              - downlinkTopics
+              - downlinkTopics
+              eventTopics:
+              - eventTopics
+              - eventTopics
+            protocol: protocol
+            endpoint:
+              uris:
+              - uris
+              - uris
+              addresses:
+              - port: 0
+                host: host
+              - port: 0
+                host: host
+              fqdn:
+              - fqdn
+              - fqdn
+              alternative: alternative
+            security:
+              extensions: extensions
+              oAuth2Info:
+                tokenEndpoint: http://example.com/aeiou
+                grantTypes:
+                - OAUTH2_AUTHORIZATION_CODE
+                - OAUTH2_AUTHORIZATION_CODE
+            name: name
+            description: description
+            id: id
+            type: REST_HTTP
+            version: version
+          enabled: true
+  responses:
+    "200":
+      description: OK
+    "204":
+      description: No Content
+    "400":
+      description: "Bad Request: used to indicate that incorrect parameters were passed\
+        \ to the request."
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
+    "403":
+      description: "Forbidden: operation is not allowed given the current status of\
+        \ the resource."
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
+    "404":
+      description: "Not Found: used when a client provided a URI that cannot be mapped\
+        \ to a valid resource URI."
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
+    "412":
+      description: "Precondition failed: used when a condition has failed during conditional\
+        \ requests, e.g. when using ETags to avoid write conflicts when using PUT"
+      content:
+        application/problem+json:
+          schema:
+            $ref: '#/components/schemas/ProblemDetails'
diff --git a/go-packages/meep-iot-client/api_reg_dev.go b/go-packages/meep-iot-client/api_reg_dev.go
new file mode 100644
index 0000000000000000000000000000000000000000..a3b3ebf9994182cf4d4120dc45d12bfb0d0e2b26
--- /dev/null
+++ b/go-packages/meep-iot-client/api_reg_dev.go
@@ -0,0 +1,603 @@
+
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+	"fmt"
+	"github.com/antihax/optional"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type RegDevApiService service
+/*
+RegDevApiService Deregister a device - see clause 5.2.6.
+The DELETE method may be used by a service consumer to deregister a device. This method is typically used in the \&quot;device deregistration\&quot; procedure as described in clause 5.2.6.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param registeredDeviceId The unique identifier of the registered device.
+
+*/
+func (a *RegDevApiService) RegistereddevicesByIdDELETE(ctx context.Context, registeredDeviceId string) (*http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Delete")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_devices/{registeredDeviceId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"registeredDeviceId"+"}", fmt.Sprintf("%v", registeredDeviceId), -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/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarHttpResponse, err
+	}
+
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarHttpResponse, newErr
+		}
+		return localVarHttpResponse, newErr
+	}
+
+	return localVarHttpResponse, nil
+}
+/*
+RegDevApiService Retrieve information about a device - see clause 5.2.4.
+The GET method may be used by a service consumer to retrieve information about a device. This method is typically used in the \&quot;device registration query\&quot; procedure as described in clause 5.2.4.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param registeredDeviceId The unique identifier of the registered device.
+@return RegisteredDevicesBody
+*/
+func (a *RegDevApiService) RegistereddevicesByIdGET(ctx context.Context, registeredDeviceId string) (RegisteredDevicesBody, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Get")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue RegisteredDevicesBody
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_devices/{registeredDeviceId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"registeredDeviceId"+"}", fmt.Sprintf("%v", registeredDeviceId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v RegisteredDevicesBody
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+/*
+RegDevApiService Update information about a  device including its association to a valid traffic rule - see clauses 5.2.5 and 5.4.3.
+The PUT method may be used by a service consumer to update a device registration including its association to a valid traffic rule. This method is typically used in the \&quot;device registration update\&quot; procedure as described in clause 5.2.5 and in the \&quot;user transport assignment\&quot; procedure as described in clause 5.4.3.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body One or more updated attributes that are allowed to be changed are included in the DeviceInfo data structure in the payload body of the request. .
+ * @param registeredDeviceId The unique identifier of the registered device.
+@return RegisteredDevicesRegisteredDeviceIdBody
+*/
+func (a *RegDevApiService) RegistereddevicesByIdPUT(ctx context.Context, body RegisteredDevicesRegisteredDeviceIdBody, registeredDeviceId string) (RegisteredDevicesRegisteredDeviceIdBody, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Put")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue RegisteredDevicesRegisteredDeviceIdBody
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_devices/{registeredDeviceId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"registeredDeviceId"+"}", fmt.Sprintf("%v", registeredDeviceId), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v RegisteredDevicesRegisteredDeviceIdBody
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 412 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+/*
+RegDevApiService Retrieve information about all devices with a valid traffic rule association - see clause 5.2.2.
+The GET method may be used by a service consumer to retrieve information about all devices with a valid traffic rule association. This method is typically used in the \&quot;registered devices query\&quot; procedure as described in clause 5.2.2.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param optional nil or *RegDevApiRegistereddevicesGETOpts - Optional Parameters:
+     * @param "Filter" (optional.String) -  Attribute-based filtering parameters according to ETSI GS MEC 009 [i.1]. The API producer shall support receiving the following filtering parameters as part of the URI query string: \&quot;(eq,enabled,TRUE)\&quot;. 
+     * @param "Fields" (optional.Interface of []string) -  The list may contain one or more of the following attributes from the DeviceInfo data type: - deviceMetadata - gpsi - msisdn - deviceId - requestedMecTrafficRule - requestedIotPlatformId - requestedUserTransportId 
+@return InlineResponse200
+*/
+
+type RegDevApiRegistereddevicesGETOpts struct {
+    Filter optional.String
+    Fields optional.Interface
+}
+
+func (a *RegDevApiService) RegistereddevicesGET(ctx context.Context, localVarOptionals *RegDevApiRegistereddevicesGETOpts) (InlineResponse200, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Get")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue InlineResponse200
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_devices"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	if localVarOptionals != nil && localVarOptionals.Filter.IsSet() {
+		localVarQueryParams.Add("filter", parameterToString(localVarOptionals.Filter.Value(), ""))
+	}
+	if localVarOptionals != nil && localVarOptionals.Fields.IsSet() {
+		localVarQueryParams.Add("fields", parameterToString(localVarOptionals.Fields.Value(), "multi"))
+	}
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v InlineResponse200
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+/*
+RegDevApiService Register a new device - see clause 5.2.3.
+The POST method may be used by a service consumer to register a new device. This method is typically used in the \&quot;device registration\&quot; procedure as described in clause 5.2.3.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body Payload body in the request contains the information associated to the IoT device to be registered.
+@return RegisteredDevicesBody
+*/
+func (a *RegDevApiService) RegistereddevicesPOST(ctx context.Context, body RegisteredDevicesBody) (RegisteredDevicesBody, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Post")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue RegisteredDevicesBody
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_devices"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 201 {
+			var v RegisteredDevicesBody
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-iot-client/api_reg_iot_plat.go b/go-packages/meep-iot-client/api_reg_iot_plat.go
new file mode 100644
index 0000000000000000000000000000000000000000..652d21c022576001be2468275d3b9d5d4f663660
--- /dev/null
+++ b/go-packages/meep-iot-client/api_reg_iot_plat.go
@@ -0,0 +1,608 @@
+
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+	"fmt"
+	"github.com/antihax/optional"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type RegIotPlatApiService service
+/*
+RegIotPlatApiService Deregister a IoT platform - see clause 5.3.6.
+The DELETE method may be used by a service consumer to deregister a IoT platform. This method is typically used in the \&quot;IoT platform deregistration\&quot; procedure as described in clause 5.3.6.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param registeredIotPlatformId The unique identifier of the registered IoT platform.
+
+*/
+func (a *RegIotPlatApiService) RegisterediotplatformsByIdDELETE(ctx context.Context, registeredIotPlatformId string) (*http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Delete")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_iot_platforms/{registeredIotPlatformId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"registeredIotPlatformId"+"}", fmt.Sprintf("%v", registeredIotPlatformId), -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/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarHttpResponse, err
+	}
+
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarHttpResponse, newErr
+		}
+		return localVarHttpResponse, newErr
+	}
+
+	return localVarHttpResponse, nil
+}
+/*
+RegIotPlatApiService Discover native services and obtain information about user transports provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+The GET method may be used by a service consumer to obtain information about a IoT platform. This method is typically used in the \&quot;IoT platform information request\&quot; procedure as described in clause 5.3.3 and in the \&quot;user transport query\&quot; procedure as described in clause 5.4.2. 
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param registeredIotPlatformId The unique identifier of the registered IoT platform.
+ * @param optional nil or *RegIotPlatApiRegisterediotplatformsByIdGETOpts - Optional Parameters:
+     * @param "Fields" (optional.Interface of []string) -  The list may contain one or more of the following attributes from the IotPlatformInfo data type: - userTransportInfo - customServiceTransportInfo 
+@return InlineResponse2001
+*/
+
+type RegIotPlatApiRegisterediotplatformsByIdGETOpts struct {
+    Fields optional.Interface
+}
+
+func (a *RegIotPlatApiService) RegisterediotplatformsByIdGET(ctx context.Context, registeredIotPlatformId string, localVarOptionals *RegIotPlatApiRegisterediotplatformsByIdGETOpts) (InlineResponse2001, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Get")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue InlineResponse2001
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_iot_platforms/{registeredIotPlatformId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"registeredIotPlatformId"+"}", fmt.Sprintf("%v", registeredIotPlatformId), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	if localVarOptionals != nil && localVarOptionals.Fields.IsSet() {
+		localVarQueryParams.Add("fields", parameterToString(localVarOptionals.Fields.Value(), "multi"))
+	}
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v InlineResponse2001
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+/*
+RegIotPlatApiService Update information about a IoT platform - see clause 5.3.5.
+The PUT method may be used by a service consumer to update a IoT platform registration. This method is typically used in the \&quot;IoT platform update\&quot; procedure as described in clause 5.3.5.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body One or more updated attributes that are allowed to be changed are included in the IotPlatformInfo data structure in the payload body of the request. .
+ * @param registeredIotPlatformId The unique identifier of the registered IoT platform.
+@return RegisteredIotPlatformsRegisteredIotPlatformIdBody
+*/
+func (a *RegIotPlatApiService) RegisterediotplatformsByIdPUT(ctx context.Context, body RegisteredIotPlatformsRegisteredIotPlatformIdBody, registeredIotPlatformId string) (RegisteredIotPlatformsRegisteredIotPlatformIdBody, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Put")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue RegisteredIotPlatformsRegisteredIotPlatformIdBody
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_iot_platforms/{registeredIotPlatformId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"registeredIotPlatformId"+"}", fmt.Sprintf("%v", registeredIotPlatformId), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v RegisteredIotPlatformsRegisteredIotPlatformIdBody
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 412 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+/*
+RegIotPlatApiService Retrieve information about all IoT platforms - see clause 5.3.2.
+The GET method may be used by an authorized service consumer to retrieve the information of all currently registered IoT platforms. This method is typically used in the \&quot;registered IoT platforms query\&quot; procedure as described in clause 5.3.2.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param optional nil or *RegIotPlatApiRegisterediotplatformsGETOpts - Optional Parameters:
+     * @param "Fields" (optional.Interface of []string) -  The list shall contain the following attributes from the IotPlatformInfo data type: - iotPlatformId - enabled 
+@return []IotPlatformInfo
+*/
+
+type RegIotPlatApiRegisterediotplatformsGETOpts struct {
+    Fields optional.Interface
+}
+
+func (a *RegIotPlatApiService) RegisterediotplatformsGET(ctx context.Context, localVarOptionals *RegIotPlatApiRegisterediotplatformsGETOpts) ([]IotPlatformInfo, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Get")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue []IotPlatformInfo
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_iot_platforms"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	if localVarOptionals != nil && localVarOptionals.Fields.IsSet() {
+		localVarQueryParams.Add("fields", parameterToString(localVarOptionals.Fields.Value(), "multi"))
+	}
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []IotPlatformInfo
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+/*
+RegIotPlatApiService Register a IoT platform - see clause 5.3.4.
+The POST method may be used by a service consumer to register a new IoT platform. This method is typically used in the \&quot;IoT platform registration\&quot; procedure as described in clause 5.3.4.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body Payload body in the request contains the information associated to the IoT platform to be registered.
+@return RegisteredIotPlatformsBody
+*/
+func (a *RegIotPlatApiService) RegisterediotplatformsPOST(ctx context.Context, body RegisteredIotPlatformsBody) (RegisteredIotPlatformsBody, *http.Response, error) {
+	var (
+		localVarHttpMethod = strings.ToUpper("Post")
+		localVarPostBody   interface{}
+		localVarFileName   string
+		localVarFileBytes  []byte
+		localVarReturnValue RegisteredIotPlatformsBody
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/registered_iot_platforms"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+		if err == nil { 
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body: localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 201 {
+			var v RegisteredIotPlatformsBody
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
+				if err != nil {
+					newErr.error = err.Error()
+					return localVarReturnValue, localVarHttpResponse, newErr
+				}
+				newErr.model = v
+				return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-iot-client/client.go b/go-packages/meep-iot-client/client.go
new file mode 100644
index 0000000000000000000000000000000000000000..a31ad6de39ef85721999c52a1fd42aa2c118f561
--- /dev/null
+++ b/go-packages/meep-iot-client/client.go
@@ -0,0 +1,477 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"encoding/xml"
+	"errors"
+	"fmt"
+	"io"
+	"mime/multipart"
+	"net/http"
+	"net/url"
+	"os"
+	"path/filepath"
+	"reflect"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+	"unicode/utf8"
+
+	"golang.org/x/oauth2"
+)
+
+var (
+	jsonCheck = regexp.MustCompile("(?i:[application|text]/json)")
+	xmlCheck  = regexp.MustCompile("(?i:[application|text]/xml)")
+)
+
+// APIClient manages communication with the ETSI GS MEC 033 IoT API API v3.1.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
+
+	RegDevApi *RegDevApiService
+
+	RegIotPlatApi *RegIotPlatApiService
+}
+
+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.RegDevApi = (*RegDevApiService)(&c.common)
+	c.RegIotPlatApi = (*RegIotPlatApiService)(&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 insenstive match, finding needle in a haystack
+func contains(haystack []string, needle string) bool {
+	for _, a := range haystack {
+		if strings.ToLower(a) == strings.ToLower(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
+}
+
+// parameterToString convert interface{} parameters to string, using a delimiter if format is provided.
+func parameterToString(obj interface{}, collectionFormat string) string {
+	var delimiter string
+
+	switch collectionFormat {
+	case "pipes":
+		delimiter = "|"
+	case "ssv":
+		delimiter = " "
+	case "tsv":
+		delimiter = "\t"
+	case "csv":
+		delimiter = ","
+	}
+
+	if reflect.TypeOf(obj).Kind() == reflect.Slice {
+		return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]")
+	}
+
+	return fmt.Sprintf("%v", obj)
+}
+
+// callAPI do the request.
+func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
+	return c.cfg.HTTPClient.Do(request)
+}
+
+// Change base path to allow switching to mocks
+func (c *APIClient) ChangeBasePath(path string) {
+	c.cfg.BasePath = path
+}
+
+// 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,
+	fileName string,
+	fileBytes []byte) (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(fileBytes) > 0 && fileName != "") {
+		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)
+				}
+			}
+		}
+		if len(fileBytes) > 0 && fileName != "" {
+			w.Boundary()
+			//_, fileNm := filepath.Split(fileName)
+			part, err := w.CreateFormFile("file", filepath.Base(fileName))
+			if err != nil {
+				return nil, err
+			}
+			_, err = part.Write(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
+	}
+
+	// Adding Query Param
+	query := url.Query()
+	for k, v := range queryParams {
+		for _, iv := range v {
+			query.Add(k, iv)
+		}
+	}
+
+	// Encode the parameters.
+	url.RawQuery = query.Encode()
+
+	// 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.Set(h, v)
+		}
+		localVarRequest.Header = headers
+	}
+
+	// Override request host, if applicable
+	if c.cfg.Host != "" {
+		localVarRequest.Host = c.cfg.Host
+	}
+
+	// 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.
+
+		// OAuth2 authentication
+		if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok {
+			// We were able to grab an oauth2 token from the context
+			var latestToken *oauth2.Token
+			if latestToken, err = tok.Token(); err != nil {
+				return nil, err
+			}
+
+			latestToken.SetAuthHeader(localVarRequest)
+		}
+
+		// Basic HTTP Authentication
+		if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok {
+			localVarRequest.SetBasicAuth(auth.UserName, auth.Password)
+		}
+
+		// AccessToken Authentication
+		if auth, ok := ctx.Value(ContextAccessToken).(string); ok {
+			localVarRequest.Header.Add("Authorization", "Bearer "+auth)
+		}
+	}
+
+	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 strings.Contains(contentType, "application/xml") {
+			if err = xml.Unmarshal(b, v); err != nil {
+				return err
+			}
+			return nil
+		} else if strings.Contains(contentType, "application/json") {
+			if err = json.Unmarshal(b, v); err != nil {
+				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(path)
+	if err != nil {
+		return err
+	}
+	defer file.Close()
+
+	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...)
+}
+
+// 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 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) {
+		xml.NewEncoder(bodyBuf).Encode(body)
+	}
+
+	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
+		}
+		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)
+}
+
+// GenericSwaggerError Provides access to the body, error and model on returned errors.
+type GenericSwaggerError struct {
+	body  []byte
+	error string
+	model interface{}
+}
+
+// Error returns non-empty string if there was an error.
+func (e GenericSwaggerError) Error() string {
+	return e.error
+}
+
+// Body returns the raw bytes of the response
+func (e GenericSwaggerError) Body() []byte {
+	return e.body
+}
+
+// Model returns the unpacked model of the error
+func (e GenericSwaggerError) Model() interface{} {
+	return e.model
+}
diff --git a/go-packages/meep-iot-client/configuration.go b/go-packages/meep-iot-client/configuration.go
new file mode 100644
index 0000000000000000000000000000000000000000..b2852ee53df3856c8370b2bf3494cb7cc6bc49d5
--- /dev/null
+++ b/go-packages/meep-iot-client/configuration.go
@@ -0,0 +1,72 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"net/http"
+)
+
+// 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 (
+	// ContextOAuth2 takes a oauth2.TokenSource as authentication for the request.
+	ContextOAuth2 = contextKey("token")
+
+	// ContextBasicAuth takes BasicAuth as authentication for the request.
+	ContextBasicAuth = contextKey("basic")
+
+	// ContextAccessToken takes a string oauth2 access token as authentication for the request.
+	ContextAccessToken = contextKey("accesstoken")
+
+	// ContextAPIKey takes an APIKey as authentication for the request
+	ContextAPIKey = contextKey("apikey")
+)
+
+// 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
+}
+
+type Configuration struct {
+	BasePath      string            `json:"basePath,omitempty"`
+	Host          string            `json:"host,omitempty"`
+	Scheme        string            `json:"scheme,omitempty"`
+	DefaultHeader map[string]string `json:"defaultHeader,omitempty"`
+	UserAgent     string            `json:"userAgent,omitempty"`
+	HTTPClient    *http.Client
+}
+
+func NewConfiguration() *Configuration {
+	cfg := &Configuration{
+		BasePath:      "https://localhost/sandboxname/sandboxname/amsi/v1",
+		DefaultHeader: make(map[string]string),
+		UserAgent:     "Swagger-Codegen/1.0.0/go",
+	}
+	return cfg
+}
+
+func (c *Configuration) AddDefaultHeader(key string, value string) {
+	c.DefaultHeader[key] = value
+}
diff --git a/go-packages/meep-iot-client/docs/Addresses.md b/go-packages/meep-iot-client/docs/Addresses.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ea47be3b641d731492a560a536ac47da04558e0
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/Addresses.md
@@ -0,0 +1,10 @@
+# Addresses
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Host** | **string** | Host portion of the address. | [default to null]
+**Port** | **int32** | Port portion of the address. | [default to null]
+
+[[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/go-packages/meep-iot-client/docs/DeviceInfo.md b/go-packages/meep-iot-client/docs/DeviceInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..58d4bea5a4fcabea494a2cb19d1ed0f4048399f2
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/DeviceInfo.md
@@ -0,0 +1,25 @@
+# DeviceInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DeviceAuthenticationInfo** | **string** | Information needed for secondary authentication of the IoT device to the data network - see ETSI TS 129 561 [i.4] and ETSI TS 129 061 [i.5] for 5G and LTE procedures, respectively. This attribute is implementation dependent and should be logically linked to the identifiers of the IoT device listed hereafter. | [default to null]
+**DeviceMetadata** | [**[]KeyValuePair**](KeyValuePair.md) | Additional information about the IoT device. This attribute is implementation dependent and may be expressed as an array of keyvalue pairs.  | [optional] [default to null]
+**Gpsi** | **string** | GPSI of the IoT device if 5G-enabled (see note 1). | [optional] [default to null]
+**Pei** | **string** | PEI of the IoT device if 5G-enabled (see note 1). | [optional] [default to null]
+**Supi** | **string** | SUPI of the IoT device if 5G-enabled (see note 1). | [optional] [default to null]
+**Msisdn** | **string** | MSISDN of the IoT device if LTE-enabled (see note 1). | [optional] [default to null]
+**Imei** | **string** | IMEI of the IoT device if LTE-enabled (see note 1). | [optional] [default to null]
+**Imsi** | **string** | IMSI of the IoT device if LTE-enabled (see note 1). | [optional] [default to null]
+**Iccid** | **string** | ICCID of the IoT device (see note 1). | [optional] [default to null]
+**DeviceId** | **string** | Human-readable identifier of the IoT device. | [default to null]
+**RequestedMecTrafficRule** | [**[]TrafficRuleDescriptor**](TrafficRuleDescriptor.md) | MEC traffic rules the IoT device is requested to be associated to (see note 2). The data type definition is as per ETSI GS MEC 010-2 [i.6]. | [optional] [default to null]
+**RequestedIotPlatformId** | **string** | IoT platform to which the IoT device is requested to be associated to (see note 2). | [optional] [default to null]
+**RequestedUserTransportId** | **string** | User transport to which the IoT device is requested to be associated to (see note 2). | [optional] [default to null]
+**DeviceSpecificMessageFormats** | [***DeviceSpecificMessageFormats**](DeviceSpecificMessageFormats.md) |  | [optional] [default to null]
+**DownlinkInfo** | [***DownlinkInfo**](DownlinkInfo.md) |  | [optional] [default to null]
+**ClientCertificate** | **string** | Client-side SSL/TLS certificate to be used by the MEC IoTS to interact with the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device. | [optional] [default to null]
+**Enabled** | **bool** | Indication whether the IoT device has a valid associated traffic rule (TRUE) or not (FALSE). See note 3. | [default to null]
+
+[[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/go-packages/meep-iot-client/docs/DeviceSpecificMessageFormats.md b/go-packages/meep-iot-client/docs/DeviceSpecificMessageFormats.md
new file mode 100644
index 0000000000000000000000000000000000000000..0869c5cb340204d6d1fa70ef89af5bb0c2bd1de9
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/DeviceSpecificMessageFormats.md
@@ -0,0 +1,10 @@
+# DeviceSpecificMessageFormats
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**EventMsgFormat** | [***EventMsg**](EventMsg.md) |  | [optional] [default to null]
+**UplinkMsgFormat** | [***UplinkMsg**](UplinkMsg.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/DownlinkInfo.md b/go-packages/meep-iot-client/docs/DownlinkInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..ba3d84cf2027f40553d755cf7db72df55f5f02ac
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/DownlinkInfo.md
@@ -0,0 +1,10 @@
+# DownlinkInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DownlinkTopic** | **string** | Topic associated to the IoT device. This topic should be used by an end IoT application to send downlink data to the IoT device. | [optional] [default to null]
+**DevicePort** | **int32** | UDP port to be used by the MEC IoTS for the outgoing downlink packets towards the IoT device. In case a default value is used, this attribute is optional. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/EndPointInfo.md b/go-packages/meep-iot-client/docs/EndPointInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..9c6821ec76242fbf621b7a23f5e57ff1a0be6cf9
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/EndPointInfo.md
@@ -0,0 +1,12 @@
+# EndPointInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Uris** | **[]string** | Entry point information of the service as string, formatted according to URI syntax (see IETF RFC 3986 [8]). Shall be used for REST APIs. See note. | [optional] [default to null]
+**Fqdn** | **[]string** | Fully Qualified Domain Name of the service. See note. | [optional] [default to null]
+**Addresses** | [**[]Addresses**](Addresses.md) |  | [optional] [default to null]
+**Alternative** | **string** | Entry point information of the service in a format defined by an implementation, or in an external specification. See note. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/EventMsg.md b/go-packages/meep-iot-client/docs/EventMsg.md
new file mode 100644
index 0000000000000000000000000000000000000000..c5af0adb4cac45b4ad4ae257c71d4e25f83fa63c
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/EventMsg.md
@@ -0,0 +1,18 @@
+# EventMsg
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**EventTopic** | **string** | Topic where the message containing application-specific information should be published.  | [default to null]
+**SelectedSerializer** | [***SerializerType**](SerializerType.md) |  | [default to null]
+**IncludeDeviceAddr** | **bool** | Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceMetadata** | **bool** | Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludePei** | **bool** | Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeSupi** | **bool** | Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImei** | **bool** | Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImsi** | **bool** | Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeIccid** | **bool** | Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceId** | **bool** | Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/ImplSpecificInfo.md b/go-packages/meep-iot-client/docs/ImplSpecificInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..80c29e783782c08ed12c835712f8e95d51511e0d
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/ImplSpecificInfo.md
@@ -0,0 +1,11 @@
+# ImplSpecificInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**EventTopics** | **[]string** | Topics used to publish events related to the established session between the IoT device(s) and the end IoT application(s) on the user transport. | [optional] [default to null]
+**UplinkTopics** | **[]string** | Topics used to publish data generated by the IoT device(s) on the user transport, in order to be consumed by the end IoT application(s). | [optional] [default to null]
+**DownlinkTopics** | **[]string** | Topics used to publish data generated by the IoT applications(s) on the user transport, in order to be consumed by the end IoT device(s). | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/InlineResponse200.md b/go-packages/meep-iot-client/docs/InlineResponse200.md
new file mode 100644
index 0000000000000000000000000000000000000000..09b79cb8416034f0564b3459c5294fffc71a585a
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/InlineResponse200.md
@@ -0,0 +1,9 @@
+# InlineResponse200
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Items** | [***DeviceInfo**](DeviceInfo.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/InlineResponse2001.md b/go-packages/meep-iot-client/docs/InlineResponse2001.md
new file mode 100644
index 0000000000000000000000000000000000000000..cacfbb80487867c65da1c653668bb468ce286d36
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/InlineResponse2001.md
@@ -0,0 +1,9 @@
+# InlineResponse2001
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IotPlatformInfo** | [***IotPlatformInfo**](IotPlatformInfo.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/InterfaceDescriptor.md b/go-packages/meep-iot-client/docs/InterfaceDescriptor.md
new file mode 100644
index 0000000000000000000000000000000000000000..6be8d4353e414ab89f0d904a2a0cba1517458172
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/InterfaceDescriptor.md
@@ -0,0 +1,13 @@
+# InterfaceDescriptor
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**InterfaceType** | **string** | Type of interface: TUNNEL, MAC, IP, etc. | [default to null]
+**TunnelInfo** | [***TunnelInfo**](TunnelInfo.md) |  | [optional] [default to null]
+**SrcMACAddress** | **string** | If the interface type is MAC, the source address identifies the MAC address of the interface. | [optional] [default to null]
+**DstMACAddress** | **string** | If the interface type is MAC, the destination address identifies the MAC address of the destination. Only used for dstInterface. | [optional] [default to null]
+**DstIPAddress** | **string** | If the interface type is IP, the destination address identifies the IP address of the destination. Only used for dstInterface. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/IotPlatformInfo.md b/go-packages/meep-iot-client/docs/IotPlatformInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..d96c7a45ccb0d3add34e21aaab469605d97bd177
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/IotPlatformInfo.md
@@ -0,0 +1,12 @@
+# IotPlatformInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IotPlatformId** | **string** | Identifier of the IoT platform. | [default to null]
+**UserTransportInfo** | [**[]MbTransportInfo**](MBTransportInfo.md) | Information about the user transport(s)  provided by the IoT platform. | [default to null]
+**CustomServicesTransportInfo** | [**[]TransportInfo**](TransportInfo.md) | Transport enabling access to vendor-specific services provided by the IoT platform. The data type definition is as per ETSI GS MEC 011 [i.2]. | [optional] [default to null]
+**Enabled** | **bool** | Indication whether the IoT platform is capable of providing user transports and vendor-specific services (TRUE) or not (FALSE). | [default to null]
+
+[[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/go-packages/meep-iot-client/docs/KeyValuePair.md b/go-packages/meep-iot-client/docs/KeyValuePair.md
new file mode 100644
index 0000000000000000000000000000000000000000..45ef9c0e85767dc613e04364bf3adfc577c57014
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/KeyValuePair.md
@@ -0,0 +1,10 @@
+# KeyValuePair
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Key** | **string** |  | [optional] [default to null]
+**Value** | **string** |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/MbTransportInfo.md b/go-packages/meep-iot-client/docs/MbTransportInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..6a68795f954541145bf1838304977b550a7cd68b
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/MbTransportInfo.md
@@ -0,0 +1,17 @@
+# MbTransportInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Id** | **string** | The identifier of this transport as per ETSI GS MEC 011 [i.2]. | [default to null]
+**Name** | **string** | The name of this transport as per ETSI GS MEC 011 [i.2]. | [default to null]
+**Description** | **string** | Human-readable description of this transport as per ETSI GS MEC 011 [i.2]. | [optional] [default to null]
+**Type_** | [***TransportType**](TransportType.md) |  | [default to null]
+**Protocol** | **string** | The name of the protocol used. Being the transport of MB_TOPIC_BASED type, this attribute should be typically set to \&quot;MQTT\&quot; or \&quot;AMQP.\&quot; | [default to null]
+**Version** | **string** | The version of the protocol used as per ETSI GS MEC 011 [i.2]. | [default to null]
+**Endpoint** | [***EndPointInfo**](EndPointInfo.md) |  | [default to null]
+**Security** | [***SecurityInfo**](SecurityInfo.md) |  | [default to null]
+**ImplSpecificInfo** | [***ImplSpecificInfo**](ImplSpecificInfo.md) |  | [default to null]
+
+[[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/go-packages/meep-iot-client/docs/OAuth2Info.md b/go-packages/meep-iot-client/docs/OAuth2Info.md
new file mode 100644
index 0000000000000000000000000000000000000000..2036501367684811b6b51823f52c3b4b64a26fcb
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/OAuth2Info.md
@@ -0,0 +1,10 @@
+# OAuth2Info
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**GrantTypes** | **[]string** | List of supported OAuth 2.0 grant types. Each entry shall be one of the following permitted values: - OAUTH2_AUTHORIZATION_CODE: Authorization code grant type - OAUTH2_IMPLICIT_GRANT: Implicit grant type - OAUTH2_RESOURCE_OWNER: Resource owner password credentials grant type - OAUTH2_CLIENT_CREDENTIALS: Client credentials grant type Only the value \&quot;OAUTH2_CLIENT_CREDENTIALS\&quot; is supported in the present document.  | [default to null]
+**TokenEndpoint** | **string** | The token endpoint. Shall be present unless the grant type is OAUTH2_IMPLICIT_GRANT. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/ProblemDetails.md b/go-packages/meep-iot-client/docs/ProblemDetails.md
new file mode 100644
index 0000000000000000000000000000000000000000..f2596ffa3944f557c5f98c6a7ff38b6430c3dd58
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/ProblemDetails.md
@@ -0,0 +1,13 @@
+# ProblemDetails
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Type_** | **string** | A URI reference according to IETF RFC 3986 that identifies the problem type | [optional] [default to null]
+**Title** | **string** | A short, human-readable summary of the problem type | [optional] [default to null]
+**Status** | **int32** | The HTTP status code for this occurrence of the problem | [optional] [default to null]
+**Detail** | **string** | A human-readable explanation specific to this occurrence of the problem | [optional] [default to null]
+**Instance** | **string** | A URI reference that identifies the specific occurrence of the problem | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/RegDevApi.md b/go-packages/meep-iot-client/docs/RegDevApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..6927235585df40767313da72af2385176f36bafb
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/RegDevApi.md
@@ -0,0 +1,160 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sandboxname/amsi/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**RegistereddevicesByIdDELETE**](RegDevApi.md#RegistereddevicesByIdDELETE) | **Delete** /registered_devices/{registeredDeviceId} | Deregister a device - see clause 5.2.6.
+[**RegistereddevicesByIdGET**](RegDevApi.md#RegistereddevicesByIdGET) | **Get** /registered_devices/{registeredDeviceId} | Retrieve information about a device - see clause 5.2.4.
+[**RegistereddevicesByIdPUT**](RegDevApi.md#RegistereddevicesByIdPUT) | **Put** /registered_devices/{registeredDeviceId} | Update information about a  device including its association to a valid traffic rule - see clauses 5.2.5 and 5.4.3.
+[**RegistereddevicesGET**](RegDevApi.md#RegistereddevicesGET) | **Get** /registered_devices | Retrieve information about all devices with a valid traffic rule association - see clause 5.2.2.
+[**RegistereddevicesPOST**](RegDevApi.md#RegistereddevicesPOST) | **Post** /registered_devices | Register a new device - see clause 5.2.3.
+
+# **RegistereddevicesByIdDELETE**
+> RegistereddevicesByIdDELETE(ctx, registeredDeviceId)
+Deregister a device - see clause 5.2.6.
+
+The DELETE method may be used by a service consumer to deregister a device. This method is typically used in the \"device deregistration\" procedure as described in clause 5.2.6.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredDeviceId** | **string**| The unique identifier of the registered device. | 
+
+### Return type
+
+ (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/problem+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)
+
+# **RegistereddevicesByIdGET**
+> RegisteredDevicesBody RegistereddevicesByIdGET(ctx, registeredDeviceId)
+Retrieve information about a device - see clause 5.2.4.
+
+The GET method may be used by a service consumer to retrieve information about a device. This method is typically used in the \"device registration query\" procedure as described in clause 5.2.4.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredDeviceId** | **string**| The unique identifier of the registered device. | 
+
+### Return type
+
+[**RegisteredDevicesBody**](registered_devices_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegistereddevicesByIdPUT**
+> RegisteredDevicesRegisteredDeviceIdBody RegistereddevicesByIdPUT(ctx, body, registeredDeviceId)
+Update information about a  device including its association to a valid traffic rule - see clauses 5.2.5 and 5.4.3.
+
+The PUT method may be used by a service consumer to update a device registration including its association to a valid traffic rule. This method is typically used in the \"device registration update\" procedure as described in clause 5.2.5 and in the \"user transport assignment\" procedure as described in clause 5.4.3.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredDevicesRegisteredDeviceIdBody**](RegisteredDevicesRegisteredDeviceIdBody.md)| One or more updated attributes that are allowed to be changed are included in the DeviceInfo data structure in the payload body of the request. . | 
+  **registeredDeviceId** | **string**| The unique identifier of the registered device. | 
+
+### Return type
+
+[**RegisteredDevicesRegisteredDeviceIdBody**](registered_devices_registeredDeviceId_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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)
+
+# **RegistereddevicesGET**
+> InlineResponse200 RegistereddevicesGET(ctx, optional)
+Retrieve information about all devices with a valid traffic rule association - see clause 5.2.2.
+
+The GET method may be used by a service consumer to retrieve information about all devices with a valid traffic rule association. This method is typically used in the \"registered devices query\" procedure as described in clause 5.2.2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***RegDevApiRegistereddevicesGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a RegDevApiRegistereddevicesGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **filter** | **optional.String**| Attribute-based filtering parameters according to ETSI GS MEC 009 [i.1]. The API producer shall support receiving the following filtering parameters as part of the URI query string: \&quot;(eq,enabled,TRUE)\&quot;.  | 
+ **fields** | [**optional.Interface of []string**](string.md)| The list may contain one or more of the following attributes from the DeviceInfo data type: - deviceMetadata - gpsi - msisdn - deviceId - requestedMecTrafficRule - requestedIotPlatformId - requestedUserTransportId  | 
+
+### Return type
+
+[**InlineResponse200**](inline_response_200.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegistereddevicesPOST**
+> RegisteredDevicesBody RegistereddevicesPOST(ctx, body)
+Register a new device - see clause 5.2.3.
+
+The POST method may be used by a service consumer to register a new device. This method is typically used in the \"device registration\" procedure as described in clause 5.2.3.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredDevicesBody**](RegisteredDevicesBody.md)| Payload body in the request contains the information associated to the IoT device to be registered. | 
+
+### Return type
+
+[**RegisteredDevicesBody**](registered_devices_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/go-packages/meep-iot-client/docs/RegIotPlatApi.md b/go-packages/meep-iot-client/docs/RegIotPlatApi.md
new file mode 100644
index 0000000000000000000000000000000000000000..3041d85f50b2c75458a2e2b7eb598263178aa413
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/RegIotPlatApi.md
@@ -0,0 +1,167 @@
+# {{classname}}
+
+All URIs are relative to *https://localhost/sandboxname/sandboxname/amsi/v1*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**RegisterediotplatformsByIdDELETE**](RegIotPlatApi.md#RegisterediotplatformsByIdDELETE) | **Delete** /registered_iot_platforms/{registeredIotPlatformId} | Deregister a IoT platform - see clause 5.3.6.
+[**RegisterediotplatformsByIdGET**](RegIotPlatApi.md#RegisterediotplatformsByIdGET) | **Get** /registered_iot_platforms/{registeredIotPlatformId} | Discover native services and obtain information about user transports provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+[**RegisterediotplatformsByIdPUT**](RegIotPlatApi.md#RegisterediotplatformsByIdPUT) | **Put** /registered_iot_platforms/{registeredIotPlatformId} | Update information about a IoT platform - see clause 5.3.5.
+[**RegisterediotplatformsGET**](RegIotPlatApi.md#RegisterediotplatformsGET) | **Get** /registered_iot_platforms | Retrieve information about all IoT platforms - see clause 5.3.2.
+[**RegisterediotplatformsPOST**](RegIotPlatApi.md#RegisterediotplatformsPOST) | **Post** /registered_iot_platforms | Register a IoT platform - see clause 5.3.4.
+
+# **RegisterediotplatformsByIdDELETE**
+> RegisterediotplatformsByIdDELETE(ctx, registeredIotPlatformId)
+Deregister a IoT platform - see clause 5.3.6.
+
+The DELETE method may be used by a service consumer to deregister a IoT platform. This method is typically used in the \"IoT platform deregistration\" procedure as described in clause 5.3.6.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredIotPlatformId** | **string**| The unique identifier of the registered IoT platform. | 
+
+### Return type
+
+ (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/problem+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)
+
+# **RegisterediotplatformsByIdGET**
+> InlineResponse2001 RegisterediotplatformsByIdGET(ctx, registeredIotPlatformId, optional)
+Discover native services and obtain information about user transports provided by a IoT platform - see clauses 5.3.3 and 5.4.2.
+
+The GET method may be used by a service consumer to obtain information about a IoT platform. This method is typically used in the \"IoT platform information request\" procedure as described in clause 5.3.3 and in the \"user transport query\" procedure as described in clause 5.4.2. 
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **registeredIotPlatformId** | **string**| The unique identifier of the registered IoT platform. | 
+ **optional** | ***RegIotPlatApiRegisterediotplatformsByIdGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a RegIotPlatApiRegisterediotplatformsByIdGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+
+ **fields** | [**optional.Interface of []string**](string.md)| The list may contain one or more of the following attributes from the IotPlatformInfo data type: - userTransportInfo - customServiceTransportInfo  | 
+
+### Return type
+
+[**InlineResponse2001**](inline_response_200_1.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegisterediotplatformsByIdPUT**
+> RegisteredIotPlatformsRegisteredIotPlatformIdBody RegisterediotplatformsByIdPUT(ctx, body, registeredIotPlatformId)
+Update information about a IoT platform - see clause 5.3.5.
+
+The PUT method may be used by a service consumer to update a IoT platform registration. This method is typically used in the \"IoT platform update\" procedure as described in clause 5.3.5.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredIotPlatformsRegisteredIotPlatformIdBody**](RegisteredIotPlatformsRegisteredIotPlatformIdBody.md)| One or more updated attributes that are allowed to be changed are included in the IotPlatformInfo data structure in the payload body of the request. . | 
+  **registeredIotPlatformId** | **string**| The unique identifier of the registered IoT platform. | 
+
+### Return type
+
+[**RegisteredIotPlatformsRegisteredIotPlatformIdBody**](registered_iot_platforms_registeredIotPlatformId_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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)
+
+# **RegisterediotplatformsGET**
+> []IotPlatformInfo RegisterediotplatformsGET(ctx, optional)
+Retrieve information about all IoT platforms - see clause 5.3.2.
+
+The GET method may be used by an authorized service consumer to retrieve the information of all currently registered IoT platforms. This method is typically used in the \"registered IoT platforms query\" procedure as described in clause 5.3.2.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+ **optional** | ***RegIotPlatApiRegisterediotplatformsGETOpts** | optional parameters | nil if no parameters
+
+### Optional Parameters
+Optional parameters are passed through a pointer to a RegIotPlatApiRegisterediotplatformsGETOpts struct
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **fields** | [**optional.Interface of []string**](string.md)| The list shall contain the following attributes from the IotPlatformInfo data type: - iotPlatformId - enabled  | 
+
+### Return type
+
+[**[]IotPlatformInfo**](IotPlatformInfo.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json, application/problem+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)
+
+# **RegisterediotplatformsPOST**
+> RegisteredIotPlatformsBody RegisterediotplatformsPOST(ctx, body)
+Register a IoT platform - see clause 5.3.4.
+
+The POST method may be used by a service consumer to register a new IoT platform. This method is typically used in the \"IoT platform registration\" procedure as described in clause 5.3.4.
+
+### Required Parameters
+
+Name | Type | Description  | Notes
+------------- | ------------- | ------------- | -------------
+ **ctx** | **context.Context** | context for authentication, logging, cancellation, deadlines, tracing, etc.
+  **body** | [**RegisteredIotPlatformsBody**](RegisteredIotPlatformsBody.md)| Payload body in the request contains the information associated to the IoT platform to be registered. | 
+
+### Return type
+
+[**RegisteredIotPlatformsBody**](registered_iot_platforms_body.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json, application/problem+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/go-packages/meep-iot-client/docs/RegisteredDevicesBody.md b/go-packages/meep-iot-client/docs/RegisteredDevicesBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..71941e93c2da461f6a7166fdf892e7241dac59b1
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/RegisteredDevicesBody.md
@@ -0,0 +1,9 @@
+# RegisteredDevicesBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DeviceInfo** | [***DeviceInfo**](DeviceInfo.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/RegisteredDevicesRegisteredDeviceIdBody.md b/go-packages/meep-iot-client/docs/RegisteredDevicesRegisteredDeviceIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..b12c05bbba03477ee220a3101e44540de80255d4
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/RegisteredDevicesRegisteredDeviceIdBody.md
@@ -0,0 +1,9 @@
+# RegisteredDevicesRegisteredDeviceIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**DeviceInfo** | [***DeviceInfo**](DeviceInfo.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/RegisteredIotPlatformsBody.md b/go-packages/meep-iot-client/docs/RegisteredIotPlatformsBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..a1c2c0aa18f7839ab30475ca7e21210738025c76
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/RegisteredIotPlatformsBody.md
@@ -0,0 +1,9 @@
+# RegisteredIotPlatformsBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IoTPlatformInfo** | [***IotPlatformInfo**](IotPlatformInfo.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md b/go-packages/meep-iot-client/docs/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md
new file mode 100644
index 0000000000000000000000000000000000000000..0c63b652609d88bdc3908e256ca1ac16037d4464
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/RegisteredIotPlatformsRegisteredIotPlatformIdBody.md
@@ -0,0 +1,9 @@
+# RegisteredIotPlatformsRegisteredIotPlatformIdBody
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**IotPlatformInfo** | [***IotPlatformInfo**](IotPlatformInfo.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/SecurityInfo.md b/go-packages/meep-iot-client/docs/SecurityInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..40559b94e7342cf62667b91ff104bb69886fab15
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/SecurityInfo.md
@@ -0,0 +1,10 @@
+# SecurityInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**OAuth2Info** | [***OAuth2Info**](OAuth2Info.md) |  | [optional] [default to null]
+**Extensions** | **string** | Extensions for alternative transport mechanisms. These extensions depend on the actual transport and are out of scope of the present document. For instance, such extensions may be used to signal the necessary parameters for the client to use TLS-based authorization defined for alternative transports (see ETSI GS MEC 009 [5] for more information).  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/SerializerType.md b/go-packages/meep-iot-client/docs/SerializerType.md
new file mode 100644
index 0000000000000000000000000000000000000000..210b392935244c534261a0ea886a64ca67431069
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/SerializerType.md
@@ -0,0 +1,8 @@
+# SerializerType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[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/go-packages/meep-iot-client/docs/TrafficFilter.md b/go-packages/meep-iot-client/docs/TrafficFilter.md
new file mode 100644
index 0000000000000000000000000000000000000000..12438dd2ff1d4674fd60d64dd12f6aaa46c06065
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/TrafficFilter.md
@@ -0,0 +1,23 @@
+# TrafficFilter
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**SrcAddress** | **[]string** | An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes. | [optional] [default to null]
+**DstAddress** | **[]string** | An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes. | [optional] [default to null]
+**SrcPort** | **[]string** | A port or a range of ports. | [optional] [default to null]
+**DstPort** | **[]string** | A port or a range of ports. | [optional] [default to null]
+**Protocol** | **[]string** | Specify the protocol of the traffic filter. | [optional] [default to null]
+**Tag** | **[]string** | Used for tag based traffic rule. | [optional] [default to null]
+**Uri** | **[]string** | An URI label, in application layer, i.e. in HTTP message, is used to filter the traffic. | [optional] [default to null]
+**PacketLabel** | **[]string** | A customized packet label in network layer, as defined by the owner of the MEC platform, is used to filter the traffic. | [optional] [default to null]
+**SrcTunnelAddress** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**TgtTunnelAddress** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**SrcTunnelPort** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**DstTunnelPort** | **[]string** | Used for GTP tunnel based traffic rule. | [optional] [default to null]
+**QCI** | **int32** | Used to match all packets that have the same QCI. | [optional] [default to null]
+**DSCP** | **int32** | Used to match all IPv4 packets that have the same DSCP. | [optional] [default to null]
+**TC** | **int32** | Used to match all IPv6 packets that have the same TC. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/TrafficRuleDescriptor.md b/go-packages/meep-iot-client/docs/TrafficRuleDescriptor.md
new file mode 100644
index 0000000000000000000000000000000000000000..149fa1216faed5688c8e68d05e72ee974ad63531
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/TrafficRuleDescriptor.md
@@ -0,0 +1,14 @@
+# TrafficRuleDescriptor
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**TrafficRuleId** | **string** | Identifies the traffic rule. | [default to null]
+**FilterType** | **string** | Definition of filter type: per FLOW or PACKET  If it is per FLOW, the filter matches upstream (e.g. UE-&gt;EPC) packets and downstream (e.g. EPC-&gt;UE) packets are handled by the same context.  | [default to null]
+**Priority** | **int32** | Priority of this traffic rule within the range 0 to 255. If traffic rule conflicts, the one with higher priority take precedence. See note 1. | [default to null]
+**TrafficFilter** | [**[]TrafficFilter**](TrafficFilter.md) | The filter used to identify specific flow/packets that need to be handled by the MEC host. | [default to null]
+**Action** | **string** | Identifies the action of the MEC host data plane, when a packet matches the trafficFilter, the example actions include: DROP, FORWARD_DECAPSULATED, FORWARD_ENCAPSULATED, PASSTHROUGH, DUPLICATE_DECAPSULATED, DUPLICATE_ENCAPSULATED  | [default to null]
+**DstInterface** | [***InterfaceDescriptor**](InterfaceDescriptor.md) |  | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/TransportInfo.md b/go-packages/meep-iot-client/docs/TransportInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..df89530928f7e66de6d6387ac8c39a1e2cdfd3f1
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/TransportInfo.md
@@ -0,0 +1,17 @@
+# TransportInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**Id** | **string** | The identifier of this transport. | [default to null]
+**Name** | **string** | The name of this transport. | [default to null]
+**Description** | **string** | Human-readable description of this transport. | [optional] [default to null]
+**Type_** | [***TransportType**](TransportType.md) |  | [default to null]
+**Protocol** | **string** | The name of the protocol used. Shall be set to \&quot;HTTP\&quot; for a REST API. | [default to null]
+**Version** | **string** | The version of the protocol used. | [default to null]
+**Endpoint** | [***EndPointInfo**](EndPointInfo.md) |  | [default to null]
+**Security** | [***SecurityInfo**](SecurityInfo.md) |  | [default to null]
+**ImplSpecificInfo** | **string** | Additional implementation specific details of the transport. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/TransportType.md b/go-packages/meep-iot-client/docs/TransportType.md
new file mode 100644
index 0000000000000000000000000000000000000000..46cc250c00bccbe02d268207efd77e07b56be0bf
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/TransportType.md
@@ -0,0 +1,8 @@
+# TransportType
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[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/go-packages/meep-iot-client/docs/TunnelInfo.md b/go-packages/meep-iot-client/docs/TunnelInfo.md
new file mode 100644
index 0000000000000000000000000000000000000000..e10e407945f89f1676ceb1140845e4e50e55652b
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/TunnelInfo.md
@@ -0,0 +1,12 @@
+# TunnelInfo
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**TunnelType** | **string** | Type of tunnel: GTP-U, GRE, etc. | [default to null]
+**TunnelDstAddress** | **string** | Destination address of the tunnel. | [default to null]
+**TunnelSrcAddress** | **string** | Source address of the tunnel. | [default to null]
+**TunnelSpecificData** | **string** | Parameters specific to the tunnel. | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/docs/UplinkMsg.md b/go-packages/meep-iot-client/docs/UplinkMsg.md
new file mode 100644
index 0000000000000000000000000000000000000000..e9b87571debb98fefdcadadeb4b12f622d23315d
--- /dev/null
+++ b/go-packages/meep-iot-client/docs/UplinkMsg.md
@@ -0,0 +1,19 @@
+# UplinkMsg
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**UplinkTopic** | **string** | Topic where the message containing the data generated by the IoT device(s) should be published, in order to be consumed by the end IoT application(s). | [default to null]
+**SelectedSerializer** | [***SerializerType**](SerializerType.md) |  | [default to null]
+**IncludeDevicePort** | **bool** | Indication whether to include the UDP port of the remote IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceAddr** | **bool** | Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceMetadata** | **bool** | Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludePei** | **bool** | Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeSupi** | **bool** | Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImei** | **bool** | Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeImsi** | **bool** | Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeIccid** | **bool** | Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+**IncludeDeviceId** | **bool** | Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE). | [optional] [default to null]
+
+[[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/go-packages/meep-iot-client/git_push.sh b/go-packages/meep-iot-client/git_push.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ae01b182ae9eb047d0999a496b060e62d7b01e5c
--- /dev/null
+++ b/go-packages/meep-iot-client/git_push.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+    git_user_id="GIT_USER_ID"
+    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+    git_repo_id="GIT_REPO_ID"
+    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+    release_note="Minor update"
+    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository. 
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+    if [ "$GIT_TOKEN" = "" ]; then
+        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+        git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+    else
+        git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+    fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/go-packages/meep-iot-client/go.mod b/go-packages/meep-iot-client/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..c7c885ac241e06a716355f6849a20932faff6d1d
--- /dev/null
+++ b/go-packages/meep-iot-client/go.mod
@@ -0,0 +1,8 @@
+module github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-iot-client
+
+go 1.16
+
+require (
+	github.com/antihax/optional v1.0.0
+	golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
+)
diff --git a/go-packages/meep-iot-client/go.sum b/go-packages/meep-iot-client/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..aafb344a88e584026c4ef64175c1fde271fe58ec
--- /dev/null
+++ b/go-packages/meep-iot-client/go.sum
@@ -0,0 +1,369 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/go-packages/meep-iot-client/model_addresses.go b/go-packages/meep-iot-client/model_addresses.go
new file mode 100644
index 0000000000000000000000000000000000000000..d80ec623492dc5fa2d525b060b6cd8af1551fcc4
--- /dev/null
+++ b/go-packages/meep-iot-client/model_addresses.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// Entry point information of the service as one or more pairs of IP address and port. See note.
+type Addresses struct {
+	// Host portion of the address.
+	Host string `json:"host"`
+	// Port portion of the address.
+	Port int32 `json:"port"`
+}
diff --git a/go-packages/meep-iot-client/model_device_info.go b/go-packages/meep-iot-client/model_device_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..07a4db86f903043a58a977da512a26e21e3e7538
--- /dev/null
+++ b/go-packages/meep-iot-client/model_device_info.go
@@ -0,0 +1,46 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// NOTE 1: At least one attribute among gpsi, pei, supi, msisdn, imei, imsi, and iccid should be provided. Sufficient security         measures shall be put in place when any attribute among PEI, SUPI, IMEI, and IMSI is disclosed over the API. NOTE 2: Until a valid traffic rule is not provided, the device will not be able to use the IoTS. A valid traffic rule is provided         by one of the following options:         • the requestedMecTrafficRule attribute;         • the requestedIotPlatformId attribute when the IoT platform offers only one user transport;         • the combination of requestedIotPlatformId and requestedUserTransportId. NOTE 3: Enabled is a pseudo-attribute which needs to be maintained by the IoTS based on the presence or not of a valid         traffic rule associated to the device. It cannot be set directly by the service consumer.  
+type DeviceInfo struct {
+	// Information needed for secondary authentication of the IoT device to the data network - see ETSI TS 129 561 [i.4] and ETSI TS 129 061 [i.5] for 5G and LTE procedures, respectively. This attribute is implementation dependent and should be logically linked to the identifiers of the IoT device listed hereafter.
+	DeviceAuthenticationInfo string `json:"deviceAuthenticationInfo"`
+	// Additional information about the IoT device. This attribute is implementation dependent and may be expressed as an array of keyvalue pairs. 
+	DeviceMetadata []KeyValuePair `json:"deviceMetadata,omitempty"`
+	// GPSI of the IoT device if 5G-enabled (see note 1).
+	Gpsi string `json:"gpsi,omitempty"`
+	// PEI of the IoT device if 5G-enabled (see note 1).
+	Pei string `json:"pei,omitempty"`
+	// SUPI of the IoT device if 5G-enabled (see note 1).
+	Supi string `json:"supi,omitempty"`
+	// MSISDN of the IoT device if LTE-enabled (see note 1).
+	Msisdn string `json:"msisdn,omitempty"`
+	// IMEI of the IoT device if LTE-enabled (see note 1).
+	Imei string `json:"imei,omitempty"`
+	// IMSI of the IoT device if LTE-enabled (see note 1).
+	Imsi string `json:"imsi,omitempty"`
+	// ICCID of the IoT device (see note 1).
+	Iccid string `json:"iccid,omitempty"`
+	// Human-readable identifier of the IoT device.
+	DeviceId string `json:"deviceId"`
+	// MEC traffic rules the IoT device is requested to be associated to (see note 2). The data type definition is as per ETSI GS MEC 010-2 [i.6].
+	RequestedMecTrafficRule []TrafficRuleDescriptor `json:"requestedMecTrafficRule,omitempty"`
+	// IoT platform to which the IoT device is requested to be associated to (see note 2).
+	RequestedIotPlatformId string `json:"requestedIotPlatformId,omitempty"`
+	// User transport to which the IoT device is requested to be associated to (see note 2).
+	RequestedUserTransportId string `json:"requestedUserTransportId,omitempty"`
+	DeviceSpecificMessageFormats *DeviceSpecificMessageFormats `json:"deviceSpecificMessageFormats,omitempty"`
+	DownlinkInfo *DownlinkInfo `json:"downlinkInfo,omitempty"`
+	// Client-side SSL/TLS certificate to be used by the MEC IoTS to interact with the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device.
+	ClientCertificate string `json:"clientCertificate,omitempty"`
+	// Indication whether the IoT device has a valid associated traffic rule (TRUE) or not (FALSE). See note 3.
+	Enabled bool `json:"enabled"`
+}
diff --git a/go-packages/meep-iot-client/model_device_specific_message_formats.go b/go-packages/meep-iot-client/model_device_specific_message_formats.go
new file mode 100644
index 0000000000000000000000000000000000000000..8a2acc77017cbe32a706e90347f9135e5c2ff65d
--- /dev/null
+++ b/go-packages/meep-iot-client/model_device_specific_message_formats.go
@@ -0,0 +1,16 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// Format of the messages to be published by the MEC IoTS on the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device.
+type DeviceSpecificMessageFormats struct {
+	EventMsgFormat *EventMsg `json:"eventMsgFormat,omitempty"`
+	UplinkMsgFormat *UplinkMsg `json:"uplinkMsgFormat,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_downlink_info.go b/go-packages/meep-iot-client/model_downlink_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..98e3c84481bd909ea349e9cacf4e5e463c7daaee
--- /dev/null
+++ b/go-packages/meep-iot-client/model_downlink_info.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// Downlink communication configuration of the user transport provided by the associated IoT platform in case the MEC IoTS acts on behalf of the IoT device.
+type DownlinkInfo struct {
+	// Topic associated to the IoT device. This topic should be used by an end IoT application to send downlink data to the IoT device.
+	DownlinkTopic string `json:"downlinkTopic,omitempty"`
+	// UDP port to be used by the MEC IoTS for the outgoing downlink packets towards the IoT device. In case a default value is used, this attribute is optional.
+	DevicePort int32 `json:"devicePort,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_end_point_info.go b/go-packages/meep-iot-client/model_end_point_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..838e53977baea16643f88eb2086f5d7c36f40cb3
--- /dev/null
+++ b/go-packages/meep-iot-client/model_end_point_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// NOTE: Exactly one of \"uris\", \"fqdn\", \"addresses\" or \"alternative\" shall be present.  
+type EndPointInfo struct {
+	// Entry point information of the service as string, formatted according to URI syntax (see IETF RFC 3986 [8]). Shall be used for REST APIs. See note.
+	Uris []string `json:"uris,omitempty"`
+	// Fully Qualified Domain Name of the service. See note.
+	Fqdn []string `json:"fqdn,omitempty"`
+	Addresses []Addresses `json:"addresses,omitempty"`
+	// Entry point information of the service in a format defined by an implementation, or in an external specification. See note.
+	Alternative string `json:"alternative,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_event_msg.go b/go-packages/meep-iot-client/model_event_msg.go
new file mode 100644
index 0000000000000000000000000000000000000000..b9f1541a82260b29dd79c8f3a94d7309744a4cde
--- /dev/null
+++ b/go-packages/meep-iot-client/model_event_msg.go
@@ -0,0 +1,32 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type EventMsg struct {
+	// Topic where the message containing application-specific information should be published. 
+	EventTopic string `json:"eventTopic"`
+	SelectedSerializer *SerializerType `json:"selectedSerializer"`
+	// Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceAddr bool `json:"includeDeviceAddr,omitempty"`
+	// Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceMetadata bool `json:"includeDeviceMetadata,omitempty"`
+	// Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE).
+	IncludePei bool `json:"includePei,omitempty"`
+	// Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE).
+	IncludeSupi bool `json:"includeSupi,omitempty"`
+	// Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE).
+	IncludeImei bool `json:"includeImei,omitempty"`
+	// Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE).
+	IncludeImsi bool `json:"includeImsi,omitempty"`
+	// Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE).
+	IncludeIccid bool `json:"includeIccid,omitempty"`
+	// Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceId bool `json:"includeDeviceId,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_impl_specific_info.go b/go-packages/meep-iot-client/model_impl_specific_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..421f8e0ca6d9c490f8897412ee4ff851a4d191f9
--- /dev/null
+++ b/go-packages/meep-iot-client/model_impl_specific_info.go
@@ -0,0 +1,20 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// Additional implementation specific details of the transport.
+type ImplSpecificInfo struct {
+	// Topics used to publish events related to the established session between the IoT device(s) and the end IoT application(s) on the user transport.
+	EventTopics []string `json:"eventTopics,omitempty"`
+	// Topics used to publish data generated by the IoT device(s) on the user transport, in order to be consumed by the end IoT application(s).
+	UplinkTopics []string `json:"uplinkTopics,omitempty"`
+	// Topics used to publish data generated by the IoT applications(s) on the user transport, in order to be consumed by the end IoT device(s).
+	DownlinkTopics []string `json:"downlinkTopics,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_inline_response_200.go b/go-packages/meep-iot-client/model_inline_response_200.go
new file mode 100644
index 0000000000000000000000000000000000000000..97b7b09433f0d63c0588ceecae36d4fff0075a86
--- /dev/null
+++ b/go-packages/meep-iot-client/model_inline_response_200.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type InlineResponse200 struct {
+	Items *DeviceInfo `json:"items,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_inline_response_200_1.go b/go-packages/meep-iot-client/model_inline_response_200_1.go
new file mode 100644
index 0000000000000000000000000000000000000000..d7c5953f54a7325ff762666461c4c3600174d682
--- /dev/null
+++ b/go-packages/meep-iot-client/model_inline_response_200_1.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type InlineResponse2001 struct {
+	IotPlatformInfo *IotPlatformInfo `json:"IotPlatformInfo,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_interface_descriptor.go b/go-packages/meep-iot-client/model_interface_descriptor.go
new file mode 100644
index 0000000000000000000000000000000000000000..374dc01da923bf104d55df32347fcd52ec068247
--- /dev/null
+++ b/go-packages/meep-iot-client/model_interface_descriptor.go
@@ -0,0 +1,22 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type InterfaceDescriptor struct {
+	// Type of interface: TUNNEL, MAC, IP, etc.
+	InterfaceType string `json:"interfaceType"`
+	TunnelInfo *TunnelInfo `json:"tunnelInfo,omitempty"`
+	// If the interface type is MAC, the source address identifies the MAC address of the interface.
+	SrcMACAddress string `json:"srcMACAddress,omitempty"`
+	// If the interface type is MAC, the destination address identifies the MAC address of the destination. Only used for dstInterface.
+	DstMACAddress string `json:"dstMACAddress,omitempty"`
+	// If the interface type is IP, the destination address identifies the IP address of the destination. Only used for dstInterface.
+	DstIPAddress string `json:"dstIPAddress,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_iot_platform_info.go b/go-packages/meep-iot-client/model_iot_platform_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..0805cad46814aaa5df433268e8df558f2bbd4b5a
--- /dev/null
+++ b/go-packages/meep-iot-client/model_iot_platform_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type IotPlatformInfo struct {
+	// Identifier of the IoT platform.
+	IotPlatformId string `json:"iotPlatformId"`
+	// Information about the user transport(s)  provided by the IoT platform.
+	UserTransportInfo []MbTransportInfo `json:"userTransportInfo"`
+	// Transport enabling access to vendor-specific services provided by the IoT platform. The data type definition is as per ETSI GS MEC 011 [i.2].
+	CustomServicesTransportInfo []TransportInfo `json:"customServicesTransportInfo,omitempty"`
+	// Indication whether the IoT platform is capable of providing user transports and vendor-specific services (TRUE) or not (FALSE).
+	Enabled bool `json:"enabled"`
+}
diff --git a/go-packages/meep-iot-client/model_key_value_pair.go b/go-packages/meep-iot-client/model_key_value_pair.go
new file mode 100644
index 0000000000000000000000000000000000000000..ce4568ff4825b45cf2f00b3abd42f91a466bb3bf
--- /dev/null
+++ b/go-packages/meep-iot-client/model_key_value_pair.go
@@ -0,0 +1,16 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// Key-value pairs for device metadata
+type KeyValuePair struct {
+	Key string `json:"key,omitempty"`
+	Value string `json:"value,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_mb_transport_info.go b/go-packages/meep-iot-client/model_mb_transport_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..d4007a27b07efaecec0a97103e3aafaadbd69980
--- /dev/null
+++ b/go-packages/meep-iot-client/model_mb_transport_info.go
@@ -0,0 +1,27 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type MbTransportInfo struct {
+	// The identifier of this transport as per ETSI GS MEC 011 [i.2].
+	Id string `json:"id"`
+	// The name of this transport as per ETSI GS MEC 011 [i.2].
+	Name string `json:"name"`
+	// Human-readable description of this transport as per ETSI GS MEC 011 [i.2].
+	Description string `json:"description,omitempty"`
+	Type_ *TransportType `json:"type"`
+	// The name of the protocol used. Being the transport of MB_TOPIC_BASED type, this attribute should be typically set to \"MQTT\" or \"AMQP.\"
+	Protocol string `json:"protocol"`
+	// The version of the protocol used as per ETSI GS MEC 011 [i.2].
+	Version string `json:"version"`
+	Endpoint *EndPointInfo `json:"endpoint"`
+	Security *SecurityInfo `json:"security"`
+	ImplSpecificInfo *ImplSpecificInfo `json:"implSpecificInfo"`
+}
diff --git a/go-packages/meep-iot-client/model_o_auth2_info.go b/go-packages/meep-iot-client/model_o_auth2_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..b97834477e85afecaa2621367b0265c10bb65dd0
--- /dev/null
+++ b/go-packages/meep-iot-client/model_o_auth2_info.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// Parameters related to use of OAuth 2.0. Shall be present in case OAuth 2.0 (see IETF RFC 6749 [13]) is supported to secure the provision of the service over the transport.
+type OAuth2Info struct {
+	// List of supported OAuth 2.0 grant types. Each entry shall be one of the following permitted values: - OAUTH2_AUTHORIZATION_CODE: Authorization code grant type - OAUTH2_IMPLICIT_GRANT: Implicit grant type - OAUTH2_RESOURCE_OWNER: Resource owner password credentials grant type - OAUTH2_CLIENT_CREDENTIALS: Client credentials grant type Only the value \"OAUTH2_CLIENT_CREDENTIALS\" is supported in the present document. 
+	GrantTypes []string `json:"grantTypes"`
+	// The token endpoint. Shall be present unless the grant type is OAUTH2_IMPLICIT_GRANT.
+	TokenEndpoint string `json:"tokenEndpoint,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_problem_details.go b/go-packages/meep-iot-client/model_problem_details.go
new file mode 100644
index 0000000000000000000000000000000000000000..8f559f963f1db13f623abe33d285e6bee3f53c60
--- /dev/null
+++ b/go-packages/meep-iot-client/model_problem_details.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type ProblemDetails struct {
+	// A URI reference according to IETF RFC 3986 that identifies the problem type
+	Type_ string `json:"type,omitempty"`
+	// A short, human-readable summary of the problem type
+	Title string `json:"title,omitempty"`
+	// The HTTP status code for this occurrence of the problem
+	Status int32 `json:"status,omitempty"`
+	// A human-readable explanation specific to this occurrence of the problem
+	Detail string `json:"detail,omitempty"`
+	// A URI reference that identifies the specific occurrence of the problem
+	Instance string `json:"instance,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_registered_devices_body.go b/go-packages/meep-iot-client/model_registered_devices_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..c35a6583cf52fd22a833ff7af98300739ea5fe7a
--- /dev/null
+++ b/go-packages/meep-iot-client/model_registered_devices_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type RegisteredDevicesBody struct {
+	DeviceInfo *DeviceInfo `json:"DeviceInfo,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_registered_devices_registered_device_id_body.go b/go-packages/meep-iot-client/model_registered_devices_registered_device_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..70b372ed0449c4f8eed608d32de99795893af4d5
--- /dev/null
+++ b/go-packages/meep-iot-client/model_registered_devices_registered_device_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type RegisteredDevicesRegisteredDeviceIdBody struct {
+	DeviceInfo *DeviceInfo `json:"DeviceInfo,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_registered_iot_platforms_body.go b/go-packages/meep-iot-client/model_registered_iot_platforms_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..263a42f55f07dbdaa5f33332a052e1a745a27cc3
--- /dev/null
+++ b/go-packages/meep-iot-client/model_registered_iot_platforms_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type RegisteredIotPlatformsBody struct {
+	IoTPlatformInfo *IotPlatformInfo `json:"IoTPlatformInfo,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_registered_iot_platforms_registered_iot_platform_id_body.go b/go-packages/meep-iot-client/model_registered_iot_platforms_registered_iot_platform_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..457cdf7fd7e9e2f880c391c9f01e6bde507f90b7
--- /dev/null
+++ b/go-packages/meep-iot-client/model_registered_iot_platforms_registered_iot_platform_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type RegisteredIotPlatformsRegisteredIotPlatformIdBody struct {
+	IotPlatformInfo *IotPlatformInfo `json:"IotPlatformInfo,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_security_info.go b/go-packages/meep-iot-client/model_security_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..7d16f152566fd106ad094869303438fe049990f7
--- /dev/null
+++ b/go-packages/meep-iot-client/model_security_info.go
@@ -0,0 +1,16 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SecurityInfo struct {
+	OAuth2Info *OAuth2Info `json:"oAuth2Info,omitempty"`
+	// Extensions for alternative transport mechanisms. These extensions depend on the actual transport and are out of scope of the present document. For instance, such extensions may be used to signal the necessary parameters for the client to use TLS-based authorization defined for alternative transports (see ETSI GS MEC 009 [5] for more information). 
+	Extensions string `json:"extensions,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_serializer_type.go b/go-packages/meep-iot-client/model_serializer_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..42df43415e84ec7b75eced6e259e162af178bf96
--- /dev/null
+++ b/go-packages/meep-iot-client/model_serializer_type.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+// SerializerType : The enumeration SerializerType represents types of serializers.
+type SerializerType string
+
+// List of SerializerType
+const (
+	JSON_SerializerType SerializerType = "JSON"
+	XML_SerializerType SerializerType = "XML"
+	PROTOBUF3_SerializerType SerializerType = "PROTOBUF3"
+)
diff --git a/go-packages/meep-iot-client/model_traffic_filter.go b/go-packages/meep-iot-client/model_traffic_filter.go
new file mode 100644
index 0000000000000000000000000000000000000000..211adf1ddd15479c3dada3182a3e5c606915a7c4
--- /dev/null
+++ b/go-packages/meep-iot-client/model_traffic_filter.go
@@ -0,0 +1,43 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type TrafficFilter struct {
+	// An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes.
+	SrcAddress []string `json:"srcAddress,omitempty"`
+	// An IP address or a range of IP addresses. For IPv4, the IP address could be an IP address plus mask, or an individual IP address, or a range of IP addresses. For IPv6, the IP address could be an IP prefix, or a range of IP prefixes.
+	DstAddress []string `json:"dstAddress,omitempty"`
+	// A port or a range of ports.
+	SrcPort []string `json:"srcPort,omitempty"`
+	// A port or a range of ports.
+	DstPort []string `json:"dstPort,omitempty"`
+	// Specify the protocol of the traffic filter.
+	Protocol []string `json:"protocol,omitempty"`
+	// Used for tag based traffic rule.
+	Tag []string `json:"tag,omitempty"`
+	// An URI label, in application layer, i.e. in HTTP message, is used to filter the traffic.
+	Uri []string `json:"uri,omitempty"`
+	// A customized packet label in network layer, as defined by the owner of the MEC platform, is used to filter the traffic.
+	PacketLabel []string `json:"packetLabel,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	SrcTunnelAddress []string `json:"srcTunnelAddress,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	TgtTunnelAddress []string `json:"tgtTunnelAddress,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	SrcTunnelPort []string `json:"srcTunnelPort,omitempty"`
+	// Used for GTP tunnel based traffic rule.
+	DstTunnelPort []string `json:"dstTunnelPort,omitempty"`
+	// Used to match all packets that have the same QCI.
+	QCI int32 `json:"qCI,omitempty"`
+	// Used to match all IPv4 packets that have the same DSCP.
+	DSCP int32 `json:"dSCP,omitempty"`
+	// Used to match all IPv6 packets that have the same TC.
+	TC int32 `json:"tC,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_traffic_rule_descriptor.go b/go-packages/meep-iot-client/model_traffic_rule_descriptor.go
new file mode 100644
index 0000000000000000000000000000000000000000..fb4ea67fa1414c2127d0bb03689394419f330f2a
--- /dev/null
+++ b/go-packages/meep-iot-client/model_traffic_rule_descriptor.go
@@ -0,0 +1,25 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// NOTE 1: Value indicates the priority in descending order, i.e. with 0 as the highest priority and 255 as the lowest         priority. NOTE 2: Some applications (like inline/tap) require two interfaces. The first interface in the case of inline/tap is on the         client (e.g. UE) side and the second on the core network (e.g. EPC) side.  
+type TrafficRuleDescriptor struct {
+	// Identifies the traffic rule.
+	TrafficRuleId string `json:"trafficRuleId"`
+	// Definition of filter type: per FLOW or PACKET  If it is per FLOW, the filter matches upstream (e.g. UE->EPC) packets and downstream (e.g. EPC->UE) packets are handled by the same context. 
+	FilterType string `json:"filterType"`
+	// Priority of this traffic rule within the range 0 to 255. If traffic rule conflicts, the one with higher priority take precedence. See note 1.
+	Priority int32 `json:"priority"`
+	// The filter used to identify specific flow/packets that need to be handled by the MEC host.
+	TrafficFilter []TrafficFilter `json:"trafficFilter"`
+	// Identifies the action of the MEC host data plane, when a packet matches the trafficFilter, the example actions include: DROP, FORWARD_DECAPSULATED, FORWARD_ENCAPSULATED, PASSTHROUGH, DUPLICATE_DECAPSULATED, DUPLICATE_ENCAPSULATED 
+	Action string `json:"action"`
+	DstInterface *InterfaceDescriptor `json:"dstInterface,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_transport_info.go b/go-packages/meep-iot-client/model_transport_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..079d91fb5da124205d6fd91e4826879867c6ebb7
--- /dev/null
+++ b/go-packages/meep-iot-client/model_transport_info.go
@@ -0,0 +1,28 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type TransportInfo struct {
+	// The identifier of this transport.
+	Id string `json:"id"`
+	// The name of this transport.
+	Name string `json:"name"`
+	// Human-readable description of this transport.
+	Description string `json:"description,omitempty"`
+	Type_ *TransportType `json:"type"`
+	// The name of the protocol used. Shall be set to \"HTTP\" for a REST API.
+	Protocol string `json:"protocol"`
+	// The version of the protocol used.
+	Version string `json:"version"`
+	Endpoint *EndPointInfo `json:"endpoint"`
+	Security *SecurityInfo `json:"security"`
+	// Additional implementation specific details of the transport.
+	ImplSpecificInfo string `json:"implSpecificInfo,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_transport_type.go b/go-packages/meep-iot-client/model_transport_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..2b6e348d578236f98c3f082de9937ab3f63c661e
--- /dev/null
+++ b/go-packages/meep-iot-client/model_transport_type.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+// TransportType : Enumeration representing types of transports.
+type TransportType string
+
+// List of TransportType
+const (
+	REST_HTTP_TransportType TransportType = "REST_HTTP"
+	MB_TOPIC_BASED_TransportType TransportType = "MB_TOPIC_BASED"
+	MB_ROUTING_TransportType TransportType = "MB_ROUTING"
+	MB_PUBSUB_TransportType TransportType = "MB_PUBSUB"
+	RPC_TransportType TransportType = "RPC"
+	RPC_STREAMING_TransportType TransportType = "RPC_STREAMING"
+	WEBSOCKET_TransportType TransportType = "WEBSOCKET"
+)
diff --git a/go-packages/meep-iot-client/model_tunnel_info.go b/go-packages/meep-iot-client/model_tunnel_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..a20dbc3ffbbc64f84e40d556e451e0a9852d5f93
--- /dev/null
+++ b/go-packages/meep-iot-client/model_tunnel_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type TunnelInfo struct {
+	// Type of tunnel: GTP-U, GRE, etc.
+	TunnelType string `json:"tunnelType"`
+	// Destination address of the tunnel.
+	TunnelDstAddress string `json:"tunnelDstAddress"`
+	// Source address of the tunnel.
+	TunnelSrcAddress string `json:"tunnelSrcAddress"`
+	// Parameters specific to the tunnel.
+	TunnelSpecificData string `json:"tunnelSpecificData,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/model_uplink_msg.go b/go-packages/meep-iot-client/model_uplink_msg.go
new file mode 100644
index 0000000000000000000000000000000000000000..2f54fe6a9454932b51e34592d75bbec3881b6ae4
--- /dev/null
+++ b/go-packages/meep-iot-client/model_uplink_msg.go
@@ -0,0 +1,34 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type UplinkMsg struct {
+	// Topic where the message containing the data generated by the IoT device(s) should be published, in order to be consumed by the end IoT application(s).
+	UplinkTopic string `json:"uplinkTopic"`
+	SelectedSerializer *SerializerType `json:"selectedSerializer"`
+	// Indication whether to include the UDP port of the remote IoT device (TRUE) or not (FALSE).
+	IncludeDevicePort bool `json:"includeDevicePort,omitempty"`
+	// Indication whether to include the IP address of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceAddr bool `json:"includeDeviceAddr,omitempty"`
+	// Indication whether to include the metadata about the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceMetadata bool `json:"includeDeviceMetadata,omitempty"`
+	// Indication whether to include the PEI of the IoT device (TRUE) or not (FALSE).
+	IncludePei bool `json:"includePei,omitempty"`
+	// Indication whether to include the SUPI of the IoT device (TRUE) or not (FALSE).
+	IncludeSupi bool `json:"includeSupi,omitempty"`
+	// Indication whether to include the IMEI of the IoT device (TRUE) or not (FALSE).
+	IncludeImei bool `json:"includeImei,omitempty"`
+	// Indication whether to include the IMSI of the IoT device (TRUE) or not (FALSE).
+	IncludeImsi bool `json:"includeImsi,omitempty"`
+	// Indication whether to include the ICCID of the IoT device (TRUE) or not (FALSE).
+	IncludeIccid bool `json:"includeIccid,omitempty"`
+	// Indication whether to include the human-readable identified of the IoT device (TRUE) or not (FALSE).
+	IncludeDeviceId bool `json:"includeDeviceId,omitempty"`
+}
diff --git a/go-packages/meep-iot-client/response.go b/go-packages/meep-iot-client/response.go
new file mode 100644
index 0000000000000000000000000000000000000000..f4a74a65b57da41e7c39fcf747a1621c429b84af
--- /dev/null
+++ b/go-packages/meep-iot-client/response.go
@@ -0,0 +1,43 @@
+/*
+ * ETSI GS MEC 033 IoT API
+ *
+ * ETSI GS MEC 033 IoT API described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"net/http"
+)
+
+type APIResponse struct {
+	*http.Response `json:"-"`
+	Message        string `json:"message,omitempty"`
+	// Operation is the name of the swagger 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:"-"`
+}
+
+func NewAPIResponse(r *http.Response) *APIResponse {
+
+	response := &APIResponse{Response: r}
+	return response
+}
+
+func NewAPIResponseWithError(errorMessage string) *APIResponse {
+
+	response := &APIResponse{Message: errorMessage}
+	return response
+}
diff --git a/go-packages/meep-iot-mgr/.gitignore b/go-packages/meep-iot-mgr/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..739ff46590540ad860b48535770503a5af9d0202
--- /dev/null
+++ b/go-packages/meep-iot-mgr/.gitignore
@@ -0,0 +1 @@
+grid_map.yaml
diff --git a/go-packages/meep-iot-mgr/go.mod b/go-packages/meep-iot-mgr/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..d9b09212a86a776b391f2f2ab8bc2a2bbe6f034f
--- /dev/null
+++ b/go-packages/meep-iot-mgr/go.mod
@@ -0,0 +1,19 @@
+module github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-iot-mgr
+
+go 1.16
+
+require (
+	github.com/BurntSushi/toml v1.2.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
+	github.com/eclipse/paho.mqtt.golang v1.4.2
+	github.com/google/uuid v1.6.0
+	github.com/gorilla/mux v1.8.1
+	github.com/lib/pq v1.10.7
+	github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3
+	github.com/streadway/amqp v1.1.0
+
+)
+
+replace (
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger
+)
diff --git a/go-packages/meep-iot-mgr/go.sum b/go-packages/meep-iot-mgr/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..d1cce7262a6e12b94827ec67b4ce44f690652c70
--- /dev/null
+++ b/go-packages/meep-iot-mgr/go.sum
@@ -0,0 +1,107 @@
+github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/InterDigitalInc/AdvantEDGE v1.9.2 h1:CAcF+bn5m0Va2mHFL2lE4awU/kjuF6CjC05phiz8vnk=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik=
+github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE=
+github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3 h1:lBNvYUFo7d4fHs8BXUmoTzbdUo4usq6PlP5qn894sGA=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3/go.mod h1:jo59Sv6xirZtbxbaZbCtrQd1CSufmcxJZIC8hm2tepw=
+github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM=
+github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U=
+golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/go-packages/meep-iot-mgr/iot-mgr.go b/go-packages/meep-iot-mgr/iot-mgr.go
new file mode 100644
index 0000000000000000000000000000000000000000..a517df845209a71ebd8e6be5a984b07d60aa7318
--- /dev/null
+++ b/go-packages/meep-iot-mgr/iot-mgr.go
@@ -0,0 +1,598 @@
+/*
+ * Copyright (c) 2024  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package iotmgr
+
+import (
+	"errors"
+	"sync"
+	"time"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	sssmgr "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr"
+)
+
+// IOT Manager
+type IotMgr struct {
+	name          string
+	namespace     string
+	mutex         sync.Mutex
+	wg            sync.WaitGroup
+	refreshTicker *time.Ticker
+}
+
+type IotPlatformInfo struct {
+	IotPlatformId               string
+	UserTransportInfo           []MbTransportInfo
+	CustomServicesTransportInfo []TransportInfo
+	Enabled                     bool
+	oneM2M                      *sssmgr.SssMgr
+}
+
+type MbTransportInfo struct {
+	Id               string
+	Name             string
+	Description      string
+	Type_            *string
+	Protocol         string
+	Version          string
+	Endpoint         *EndPointInfo
+	Security         *SecurityInfo
+	ImplSpecificInfo *ImplSpecificInfo
+}
+
+type TransportInfo struct {
+	Id               string
+	Name             string
+	Description      string
+	Type_            *string
+	Protocol         string
+	Version          string
+	Endpoint         *EndPointInfo
+	Security         *SecurityInfo
+	ImplSpecificInfo string
+}
+
+type EndPointInfo struct {
+	Uris        []string
+	Fqdn        []string
+	Addresses   []Addresses
+	Alternative string
+}
+
+type Addresses struct {
+	Host string
+	Port int32
+}
+
+type SecurityInfo struct {
+	OAuth2Info *OAuth2Info
+	Extensions string
+}
+
+type OAuth2Info struct {
+	GrantTypes    []string
+	TokenEndpoint string
+}
+
+type ImplSpecificInfo struct {
+	EventTopics    []string
+	UplinkTopics   []string
+	DownlinkTopics []string
+}
+
+type TrafficRuleDescriptor struct {
+	TrafficRuleId string
+	FilterType    string
+	Priority      int32
+	TrafficFilter []TrafficFilter
+	Action        string
+	DstInterface  *InterfaceDescriptor
+}
+
+type InterfaceDescriptor struct {
+	InterfaceType string
+	//TunnelInfo *TunnelInfo FSCOM Not supported
+	SrcMACAddress string
+	DstMACAddress string
+	DstIPAddress  string
+}
+
+type TrafficFilter struct {
+	SrcAddress       []string
+	DstAddress       []string
+	SrcPort          []string
+	DstPort          []string
+	Protocol         []string
+	Tag              []string
+	Uri              []string
+	PacketLabel      []string
+	SrcTunnelAddress []string
+	TgtTunnelAddress []string
+	SrcTunnelPort    []string
+	DstTunnelPort    []string
+	QCI              int32
+	TC               int32
+}
+
+type KeyValuePair struct {
+	Key   string
+	Value string
+}
+
+type DeviceInfo struct {
+	DeviceAuthenticationInfo string
+	DeviceMetadata           []KeyValuePair
+	Gpsi                     string
+	Pei                      string
+	Supi                     string
+	Msisdn                   string
+	Imei                     string
+	Imsi                     string
+	Iccid                    string
+	DeviceId                 string
+	RequestedMecTrafficRule  []TrafficRuleDescriptor
+	RequestedIotPlatformId   string
+	RequestedUserTransportId string
+	//DeviceSpecificMessageFormats *DeviceSpecificMessageFormats
+	//DownlinkInfo *DownlinkInfo
+	ClientCertificate string
+	Enabled           bool
+}
+
+var registeredIotPlatformsMap = map[string]IotPlatformInfo{} // List of discovered IOT Plateform
+var devicesMap = map[string]DeviceInfo{}                     // Map device by deviceId
+var devicesPerPlatformMap = map[string][]string{}            // Map deviceIds per platform
+var platformPerUserTransportIdMap = map[string][]string{}    // Map userTransportId per platform
+
+// Timer to refresh devices list for all IoT platform
+const refreshTickerExpeary = 30 // In seconds
+
+// Enable profiling
+const profiling = false
+
+var profilingTimers map[string]time.Time
+
+const (
+	headerAccept      = "application/json"
+	headerContentType = "application/json"
+)
+
+// NewIotMgr - Creates and initializes a new IOT Traffic Manager
+func NewIotMgr(name string, namespace string) (tm *IotMgr, err error) {
+	if name == "" {
+		err = errors.New("Missing connector name")
+		return nil, err
+	}
+
+	// Create new Traffic Manager
+	tm = new(IotMgr)
+	tm.name = name
+	if namespace != "" {
+		tm.namespace = namespace
+	} else {
+		tm.namespace = "default"
+	}
+
+	tm.init()
+
+	return tm, nil
+}
+
+// Profiling init
+func (tm *IotMgr) init() {
+	if profiling {
+		profilingTimers = make(map[string]time.Time)
+	}
+
+	registeredIotPlatformsMap = make(map[string]IotPlatformInfo, 0)
+	devicesMap = make(map[string]DeviceInfo, 0)
+	devicesPerPlatformMap = make(map[string][]string, 0)
+	platformPerUserTransportIdMap = make(map[string][]string, 0)
+	tm.refreshTicker = nil
+}
+
+// DeleteIotMgr -
+func (tm *IotMgr) DeleteIotMgr() (err error) {
+	return nil
+}
+
+func (tm *IotMgr) startRefreshTicker() {
+	log.Debug(">>> startRefreshTicker")
+
+	tm.refreshTicker = time.NewTicker(time.Duration(refreshTickerExpeary) * time.Second)
+	go func() {
+		if tm.refreshTicker != nil {
+			for range tm.refreshTicker.C {
+				// Refresh the list of devices
+				tm.wg.Add(1)
+				log.Debug("startRefreshTicker: registeredIotPlatformsMap: ", registeredIotPlatformsMap)
+				for _, v := range registeredIotPlatformsMap {
+					if v.oneM2M != nil {
+						err := tm.populateDevicesPerIotPlatforms(v)
+						if err != nil {
+							log.Error(err)
+						}
+					} else {
+						log.Debug("startRefreshTicker: Nothing to do")
+					}
+				} // End of 'for' statement
+				log.Debug("startRefreshTicker: Before Done()")
+				tm.wg.Done()
+				log.Debug("startRefreshTicker: After Done()")
+			} // End of 'for' statement
+			log.Debug("startRefreshTicker: Leaving time loop")
+		}
+	}()
+}
+
+func (tm *IotMgr) stopRefreshTicker() {
+	if tm.refreshTicker != nil {
+		// Refresh the list of devices
+		tm.wg.Add(1)
+		tm.refreshTicker.Stop()
+		tm.refreshTicker = nil
+		tm.wg.Done()
+		log.Debug("Refresh loop stopped")
+	}
+}
+
+func (tm *IotMgr) RegisterIotPlatformInfo(iotPlatformInfo IotPlatformInfo) (err error) {
+	if profiling {
+		profilingTimers["RegisterIotPlatformInfo"] = time.Now()
+	}
+
+	log.Info(">>> RegisterIotPlatformInfo: iotPlatformId: ", iotPlatformInfo)
+	if iotPlatformInfo.Enabled {
+		//{{\"iotPlatformId\": \"1a584db5-6a3e-4f56-b126-29180069ecf1\", \"userTransportInfo\": [{\"id\": \"ca22ca5e-e0ce-4da8-a2ce-2966f4759032\", \"name\": \"MQTT\", \"description\": \"MQTT\", \"type\": \"MB_TOPIC_BASED\", \"protocol\": \"MQTT\", \"version\": \"2\", \"endpoint\": {\"addresses\": [{\"host\": \"172.29.10.56\", \"port\": 1883}]}, \"security\": {}, \"implSpecificInfo\": {}}], \"customServicesTransportInfo\": [{\"id\": \"85fe5e7f-c371-4f71-b7f6-61a1f808fbb3\", \"name\": \"/laboai-acme-ic-cse\", \"description\": \"ACME oneM2M CSE\", \"type\": \"REST_HTTP\", \"protocol\": \"REST_HTTP\", \"version\": \"4\", \"endpoint\": {\"addresses\": [{\"host\": \"172.29.10.20\", \"port\": 31110}]}, \"security\": {}}], \"enabled\": true}}
+		iotPlatformInfo.oneM2M = nil
+		if len(iotPlatformInfo.CustomServicesTransportInfo) == 0 || iotPlatformInfo.CustomServicesTransportInfo[0].Endpoint == nil || len(iotPlatformInfo.CustomServicesTransportInfo[0].Endpoint.Addresses) == 0 {
+			log.Warn("RegisterIotPlatformInfo: Cannot use provided CustomServicesTransportInfo")
+		} else {
+			// FIXME FSCOM How to get the CSE_ID
+			// TODO FSCOM Add notification support?
+			pltf, err := sssmgr.NewSssMgr(tm.name, tm.namespace, iotPlatformInfo.CustomServicesTransportInfo[0].Protocol /*"MQTT"*/, iotPlatformInfo.CustomServicesTransportInfo[0].Endpoint.Addresses[0].Host /*"172.29.10.56"*/, int(iotPlatformInfo.CustomServicesTransportInfo[0].Endpoint.Addresses[0].Port) /*1883*/, iotPlatformInfo.IotPlatformId /*"7feaadbb0400"*/, iotPlatformInfo.CustomServicesTransportInfo[0].Name /*"laboai-acme-ic-cse"*/, nil, nil, nil)
+			if err != nil {
+				log.Error("RegisterIotPlatformInfo: ", err)
+				iotPlatformInfo.oneM2M = nil
+			} else {
+				log.Info("RegisterIotPlatformInfo: IoT pltf created")
+				iotPlatformInfo.oneM2M = pltf
+				if tm.refreshTicker == nil {
+					log.Info("RegisterIotPlatformInfo: Start RefreshTicker")
+					tm.startRefreshTicker()
+				}
+			}
+		}
+		registeredIotPlatformsMap[iotPlatformInfo.IotPlatformId] = iotPlatformInfo
+		log.Info("RegisterIotPlatformInfo: iotPlatformId: ", registeredIotPlatformsMap[iotPlatformInfo.IotPlatformId])
+
+	} // else, Skip disabled platform
+
+	if profiling {
+		now := time.Now()
+		log.Debug("RegisterIotPlatformInfo: ", now.Sub(profilingTimers["RegisterIotPlatformInfo"]))
+	}
+	return nil
+}
+
+func (tm *IotMgr) DeregisterIotPlatformInfo(iotPlatformId string) (err error) {
+	if profiling {
+		profilingTimers["DeregisterIotPlatformInfo"] = time.Now()
+	}
+
+	log.Info(">>> DeregisterIotPlatformInfo: iotPlatformId: ", iotPlatformId)
+	// Remove the list of the devices for this IoT platform
+	if val, ok := devicesPerPlatformMap[iotPlatformId]; ok {
+		// Free resources from devicesMap map
+		for _, dev := range val {
+			delete(devicesMap, dev)
+		} // End of 'for' statement
+		delete(devicesPerPlatformMap, iotPlatformId)
+		log.Info("DeregisterIotPlatformInfo: platformPerUserTransportIdMap (before): ", platformPerUserTransportIdMap)
+		for _, rule := range platformPerUserTransportIdMap {
+			for idx, pltf := range rule {
+				if pltf == iotPlatformId {
+					rule = append(rule[:idx], rule[idx+1:]...)
+				}
+			} // End of 'for' statement
+		} // End of 'for' statement
+		log.Info("DeregisterIotPlatformInfo: platformPerUserTransportIdMap (after): ", platformPerUserTransportIdMap)
+	}
+	if pltf, ok := registeredIotPlatformsMap[iotPlatformId]; ok {
+		if pltf.oneM2M != nil {
+			_ = pltf.oneM2M.DeleteSssMgr()
+			pltf.oneM2M = nil
+			log.Info("RegisterIotPlatformInfo: IoT pltf removed")
+		}
+		delete(registeredIotPlatformsMap, iotPlatformId)
+		if len(registeredIotPlatformsMap) == 0 {
+			if tm.refreshTicker != nil {
+				log.Info("RegisterIotPlatformInfo: Stop RefreshTicker")
+				tm.stopRefreshTicker()
+				tm.refreshTicker = nil
+			}
+
+		}
+	}
+
+	if profiling {
+		now := time.Now()
+		log.Debug("DeregisterIotPlatformInfo: ", now.Sub(profilingTimers["DeregisterIotPlatformInfo"]))
+	}
+	return nil
+}
+
+func (tm *IotMgr) GetDevices() (devices []DeviceInfo, err error) {
+	if profiling {
+		profilingTimers["GetDevices"] = time.Now()
+	}
+
+	log.Info(">>> GetDevices")
+
+	tm.wg.Wait()
+	log.Info("GetDevices: After Wait()")
+
+	devices = make([]DeviceInfo, 0)
+	if len(registeredIotPlatformsMap) == 0 {
+		return devices, nil
+	}
+
+	for _, v := range devicesMap {
+		log.Info("GetDevices: adding device: ", v)
+		devices = append(devices, v)
+	} // End of 'for' statement
+	log.Info("GetDevices: devices: ", devices)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("GetDevices: ", now.Sub(profilingTimers["GetDevices"]))
+	}
+
+	return devices, nil
+}
+
+func (tm *IotMgr) GetDevice(deviceId string) (device DeviceInfo, err error) {
+	if profiling {
+		profilingTimers["GetDevice"] = time.Now()
+	}
+
+	log.Info(">>> GetDevice: deviceId: ", deviceId)
+
+	tm.wg.Wait()
+	log.Info("GetDevices: After Wait()")
+
+	if val, ok := devicesMap[deviceId]; !ok {
+		err = errors.New("Wrong Device identifier")
+		return device, err
+	} else {
+		device = val
+	}
+
+	if profiling {
+		now := time.Now()
+		log.Debug("GetDevice: ", now.Sub(profilingTimers["GetDevice"]))
+	}
+	log.Info("GetDevice: device: ", device)
+
+	return device, nil
+}
+
+func (tm *IotMgr) CreateDevice(device DeviceInfo) (deviceResp DeviceInfo, err error) {
+	log.Info(">>> CreateDevice: ", device)
+
+	tm.wg.Wait()
+	log.Info("GetDevices: After Wait()")
+
+	// RequestedMecTrafficRule is not supported yet
+	if len(device.RequestedMecTrafficRule) != 0 {
+		err = errors.New("Unsupported traffic rule provided")
+		log.Error(err.Error())
+		return deviceResp, err
+	}
+	if len(device.RequestedIotPlatformId) != 0 {
+		deviceResp, err = tm.createDeviceWithIotPlatformId(device, device.RequestedIotPlatformId)
+	} else {
+		deviceResp, err = tm.createDeviceWithRequestedUserTransportId(device, device.RequestedUserTransportId)
+	}
+	if err != nil {
+		log.Error(err.Error())
+		return deviceResp, err
+	}
+	log.Info("CreateDevice: deviceResp: ", deviceResp)
+
+	return deviceResp, nil
+}
+
+func (tm *IotMgr) DeleteDevice(deviceId string) (err error) {
+	if profiling {
+		profilingTimers["DeleteDevice"] = time.Now()
+	}
+
+	log.Info(">>> DeleteDevice: device: ", deviceId)
+
+	tm.wg.Wait()
+	log.Info("GetDevices: After Wait()")
+
+	if _, ok := devicesMap[deviceId]; !ok {
+		err = errors.New("Invalid device identifier")
+		log.Error(err.Error())
+		return err
+	}
+
+	device := devicesMap[deviceId]
+	// Remove the list of the devices for this IoT platform
+	if val, ok := devicesPerPlatformMap[device.RequestedIotPlatformId]; ok {
+		// Free resource from devicesMap map
+		log.Info("DeleteDevice: devicesPerPlatformMap (before): ", devicesPerPlatformMap)
+		for idx, devId := range val {
+			if devId == device.DeviceId {
+				val = append(val[:idx], val[idx+1:]...)
+				break
+			}
+		} // End of 'for' statement
+	}
+	log.Info("DeleteDevice: devicesPerPlatformMap (after): ", devicesPerPlatformMap)
+	// Free resource from devicesMap map
+	log.Info("DeleteDevice: devicesMap (before): ", devicesMap)
+	delete(devicesMap, device.DeviceId)
+	log.Info("DeleteDevice: devicesMap (after): ", devicesMap)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("DeleteDevice: ", now.Sub(profilingTimers["DeleteDevice"]))
+	}
+
+	return nil
+}
+
+func (tm *IotMgr) createDeviceWithIotPlatformId(device DeviceInfo, requestedIotPlatformId string) (deviceResp DeviceInfo, err error) {
+	log.Info(">>> createDeviceWithIotPlatformId: ", device)
+
+	// Sanity checks
+	if _, ok := registeredIotPlatformsMap[requestedIotPlatformId]; !ok {
+		err = errors.New("Invalid IotPlatform identifier")
+		return deviceResp, err
+	}
+	if _, ok := devicesMap[device.DeviceId]; ok {
+		err = errors.New("Device already exist")
+		return deviceResp, err
+	}
+
+	if registeredIotPlatformsMap[requestedIotPlatformId].oneM2M != nil && device.Enabled == true {
+		log.Info("createDeviceWithIotPlatformId: Create device on IoT platform", device)
+		var sensor = sssmgr.SensorDiscoveryInfo{
+			SensorIdentifier: device.DeviceId,
+			SensorType:       "CNT", // FIXME FSCOM How to retrieve this info
+			SensorPosition:   nil,
+			IotPlatformId:    requestedIotPlatformId,
+		}
+		if len(device.DeviceMetadata) != 0 {
+			sensor.SensorCharacteristicList = make([]sssmgr.SensorCharacteristic, len(device.DeviceMetadata))
+			for i, c := range device.DeviceMetadata {
+				sensor.SensorCharacteristicList[i] = sssmgr.SensorCharacteristic{CharacteristicName: c.Key, CharacteristicValue: c.Value}
+			} // End of 'for' statement
+		}
+		// FIXME FSCOM How to manage these fields from DeviceInfo
+		// 	DeviceAuthenticationInfo string
+		// 	Gpsi                     string
+		// 	Pei                      string
+		// 	Supi                     string
+		// 	Msisdn                   string
+		// 	Imei                     string
+		// 	Imsi                     string
+		// 	Iccid                    string
+		// 	RequestedMecTrafficRule  []TrafficRuleDescriptor
+		// 	//DeviceSpecificMessageFormats *DeviceSpecificMessageFormats
+		// 	//DownlinkInfo *DownlinkInfo
+		// 	ClientCertificate string
+		// }
+		sensor, err := registeredIotPlatformsMap[requestedIotPlatformId].oneM2M.OneM2M_create(sensor, "")
+		if err != nil {
+			return deviceResp, err
+		}
+	}
+
+	devicesMap[device.DeviceId] = device
+	devicesPerPlatformMap[device.DeviceId] = append(devicesPerPlatformMap[device.DeviceId], requestedIotPlatformId)
+	platformPerUserTransportIdMap[requestedIotPlatformId] = append(platformPerUserTransportIdMap[requestedIotPlatformId], device.RequestedUserTransportId)
+
+	deviceResp = device
+	log.Debug("createDeviceWithIotPlatformId: deviceResp: ", deviceResp)
+
+	return deviceResp, nil
+}
+
+func (tm *IotMgr) createDeviceWithRequestedUserTransportId(device DeviceInfo, requestedUserTransportId string) (deviceResp DeviceInfo, err error) {
+	log.Info(">>> createDeviceWithRequestedUserTransportId: ", device)
+
+	if val, ok := platformPerUserTransportIdMap[requestedUserTransportId]; ok {
+		deviceResp, err = tm.createDeviceWithIotPlatformId(device, val[0])
+	} else {
+		err = errors.New("Invalid UserTransportId")
+	}
+	if err != nil {
+		log.Error("createDeviceWithIotPlatformId: ", err.Error())
+		return deviceResp, err
+	}
+	log.Info("createDeviceWithIotPlatformId: deviceResp: ", deviceResp)
+
+	return deviceResp, nil
+}
+
+func (tm *IotMgr) resetMaps(iotPlatformId string) {
+	log.Info(">>> resetMaps: ", iotPlatformId)
+
+	// Free resources from devicesMap map
+	// Remove all devices for this IoT platform
+	log.Info("resetMaps: devicesMap (before): ", devicesMap)
+	for _, deviceId := range devicesPerPlatformMap[iotPlatformId] {
+		delete(devicesMap, deviceId)
+	} // End of 'for' statement
+	log.Info("resetMaps: devicesMap (after): ", devicesMap)
+
+	// Remove all devices for this IoT platform
+	log.Info("resetMaps: devicesPerPlatformMap (before): ", devicesPerPlatformMap)
+	delete(devicesPerPlatformMap, iotPlatformId)
+	log.Info("resetMaps: devicesPerPlatformMap (after): ", devicesPerPlatformMap)
+
+	log.Info("resetMaps: platformPerUserTransportIdMap (before): ", platformPerUserTransportIdMap)
+	for _, rule := range platformPerUserTransportIdMap {
+		for idx, pltf := range rule {
+			if pltf == iotPlatformId {
+				rule = append(rule[:idx], rule[idx+1:]...)
+			}
+		} // End of 'for' statement
+	} // End of 'for' statement
+	log.Info("resetMaps: platformPerUserTransportIdMap (after): ", platformPerUserTransportIdMap)
+}
+
+func (tm *IotMgr) populateDevicesPerIotPlatforms(iotPlatformInfo IotPlatformInfo) (err error) {
+	log.Info(">>> populateDevicesPerIotPlatforms: ", iotPlatformInfo)
+
+	if iotPlatformInfo.oneM2M == nil {
+		log.Info("populateDevicesPerIotPlatforms: Nothing to do")
+		return nil
+	}
+
+	// Reset maps
+	tm.resetMaps(iotPlatformInfo.IotPlatformId)
+
+	sensors, err := iotPlatformInfo.oneM2M.SensorDiscoveryInfoAll()
+	if err != nil {
+		log.Error("populateDevicesPerIotPlatforms: ", err)
+		return err
+	}
+	log.Info("populateDevicesPerIotPlatforms: sensors: ", sensors)
+
+	for _, sensor := range sensors {
+		var deviceInfo = DeviceInfo{
+			DeviceId: sensor.SensorIdentifier,
+			Enabled:  true,
+		}
+		deviceInfo.DeviceMetadata = make([]KeyValuePair, len(sensor.SensorCharacteristicList))
+		for i, c := range sensor.SensorCharacteristicList {
+			deviceInfo.DeviceMetadata[i] = KeyValuePair{Key: c.CharacteristicName, Value: c.CharacteristicValue}
+		} // End of 'for' statement
+
+		devicesMap[deviceInfo.DeviceId] = deviceInfo
+		devicesPerPlatformMap[iotPlatformInfo.IotPlatformId] = append(devicesPerPlatformMap[iotPlatformInfo.IotPlatformId], deviceInfo.DeviceId)
+	} // End of 'for' statement
+	log.Info("populateDevicesPerIotPlatforms: devicesMap: ", devicesMap)
+	log.Info("populateDevicesPerIotPlatforms: devicesPerPlatformMap: ", devicesPerPlatformMap)
+
+	return nil
+}
diff --git a/go-packages/meep-iot-mgr/iot-mgr_test.go b/go-packages/meep-iot-mgr/iot-mgr_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..84ca215aa4d2d3c1ae0bff247d0b87452313fda6
--- /dev/null
+++ b/go-packages/meep-iot-mgr/iot-mgr_test.go
@@ -0,0 +1,615 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on ance "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package iotmgr
+
+import (
+	"fmt"
+	"testing"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+const tmName = "meep-iot"
+const tmNamespace = "sandboxtest"
+
+func TestNewIotMgr(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Invalid Connector
+	fmt.Println("Invalid IOT Asset Manager")
+	tm, err := NewIotMgr("", tmNamespace)
+	if err == nil || tm != nil {
+		t.Fatalf("DB connection should have failed")
+	}
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err = NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Cleanup
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+}
+
+func TestRegisterIotPlatformInfo(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Set a valid platform
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{
+		Id:          "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:        "MQTT",
+		Description: "MQTT",
+		Protocol:    "MQTT",
+		Version:     "2",
+		Endpoint:    &endpoint,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+	})
+	var iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	err = tm.RegisterIotPlatformInfo(iotPlatformInfo)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+
+	// Cleanup
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func TestCreateDeviceInfo(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Set a valid platform
+	fmt.Println("Create an IotPlatformInfo")
+	iotPlatformInfo, err := registerIotPltf(tm)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+
+	// Create a new basic device
+	fmt.Println("Create a new device")
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	var device = DeviceInfo{
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               requestedIotPlatformId,
+		Enabled:                true,
+	}
+	device, err = tm.CreateDevice(device)
+	if err != nil {
+		t.Fatalf("Failed to create a new device")
+	}
+
+	// Cleanup
+	_ = tm.DeleteDevice(device.DeviceId)
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func TestCreateDeviceInfoFail(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Set a valid platform
+	fmt.Println("Create an IotPlatformInfo")
+	iotPlatformInfo, err := registerIotPltf(tm)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+
+	// Create an invalid new basic device
+	fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo)
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	var device = DeviceInfo{
+		RequestedIotPlatformId: "12345", // Invalid IotPlatformId
+		DeviceId:               requestedIotPlatformId,
+		Enabled:                true,
+	}
+	device, err = tm.CreateDevice(device)
+	if err == nil {
+		t.Fatalf("Creation of an invalid new device shall fail")
+	}
+
+	// Cleanup
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func TestDeleteDeviceInfo(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Set a valid platform
+	fmt.Println("Create an IotPlatformInfo")
+	iotPlatformInfo, err := registerIotPltf(tm)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+
+	// Create a new basic device
+	fmt.Println("Create a new device")
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	var device = DeviceInfo{
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               requestedIotPlatformId,
+		Enabled:                true,
+	}
+	device, err = tm.CreateDevice(device)
+	if err != nil {
+		t.Fatalf("Failed to create a new device")
+	}
+
+	err = tm.DeleteDevice(device.DeviceId)
+	if err != nil {
+		t.Fatalf("Failed to delete a device")
+	}
+
+	// Cleanup
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func TestDeleteDeviceInfoFail(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Set a valid platform
+	fmt.Println("Create an IotPlatformInfo")
+	iotPlatformInfo, err := registerIotPltf(tm)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+
+	err = tm.DeleteDevice("12345")
+	if err == nil {
+		t.Fatalf("Deletion of an invalide device shall fail")
+	}
+
+	// Cleanup
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func TestGetDeviceInfo(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Set a valid platform and create a device
+	fmt.Println("Create an IotPlatformInfo")
+	iotPlatformInfo, device, err := registerIotPltfAndCreateDevice(tm)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform or to create a new device")
+	}
+
+	// Get a device
+	fmt.Println("Get a device")
+	device_rsp, err := tm.GetDevice(device.DeviceId)
+	if err != nil {
+		t.Fatalf("GetDevice failed")
+	}
+
+	// Check the response
+	if !validate_device_info(device, device_rsp) {
+		t.Fatalf("Devices mismatch")
+	}
+
+	fmt.Println("Get a devices")
+	devices_rsp, err := tm.GetDevices()
+	if err != nil {
+		t.Fatalf("GetDevices failed")
+	}
+	if len(devices_rsp) != 1 {
+		t.Fatalf("GetDevices: Unexpected response")
+	}
+
+	// Check the response
+	if !validate_device_info(device, devices_rsp[0]) {
+		t.Fatalf("Devices mismatch")
+	}
+
+	// Cleanup
+	_ = tm.DeleteDevice(device.DeviceId)
+
+	_ = tm.DeleteDevice(device.DeviceId)
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func TestGetDeviceInfoFail(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid IOT Asset Manager")
+	tm, err := NewIotMgr(tmName, tmNamespace)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create IOT Asset Manager")
+	}
+
+	// Get a device
+	fmt.Println("Get a device")
+	_, err = tm.GetDevice("12345")
+	if err == nil {
+		t.Fatalf("GetDevice shall failed")
+	}
+
+	// Set a valid platform and create a device
+	fmt.Println("Create an IotPlatformInfo")
+	iotPlatformInfo, device, err := registerIotPltfAndCreateDevice(tm)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform or to create a new device")
+	}
+
+	// Get a device
+	fmt.Println("Get a device")
+	_, err = tm.GetDevice("12345")
+	if err == nil {
+		t.Fatalf("GetDevice shall failed")
+	}
+
+	// Get a device
+	fmt.Println("Get a device")
+	device_rsp, err := tm.GetDevice(device.DeviceId)
+	if err != nil {
+		t.Fatalf("Failed to create a new device")
+	}
+
+	// Check the response
+	if !validate_device_info(device, device_rsp) {
+		t.Fatalf("Devices mismatch")
+	}
+
+	// Cleanup
+	_ = tm.DeleteDevice(device.DeviceId)
+
+	_ = tm.DeleteDevice(device.DeviceId)
+	err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId)
+	if err != nil {
+		t.Fatalf("Failed to register new IoT platform")
+	}
+	err = tm.DeleteIotMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup IOT Asset Manager")
+	}
+
+	// t.Fatalf("DONE")
+}
+
+func registerIotPltf(tm *IotMgr) (iotPlatformInfo IotPlatformInfo, err error) {
+
+	// Set a valid platform
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{
+		Id:          "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:        "MQTT",
+		Description: "MQTT",
+		Protocol:    "MQTT",
+		Version:     "2",
+		Endpoint:    &endpoint,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+	})
+	iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	err = tm.RegisterIotPlatformInfo(iotPlatformInfo)
+	if err != nil {
+		return iotPlatformInfo, err
+	}
+
+	return iotPlatformInfo, nil
+}
+
+func registerIotPltfAndCreateDevice(tm *IotMgr) (iotPlatformInfo IotPlatformInfo, device DeviceInfo, err error) {
+
+	// Set a valid platform
+	var adresses = []Addresses{}
+	adresses = append(adresses, Addresses{
+		Host: "172.29.10.56",
+		Port: 1883,
+	})
+	var endpoint = EndPointInfo{
+		Addresses: adresses,
+	}
+	var userTransportInfo = []MbTransportInfo{}
+	userTransportInfo = append(userTransportInfo, MbTransportInfo{
+		Id:          "d5673793-c55c-4969-b5bc-2121f84b9f8d",
+		Name:        "MQTT",
+		Description: "MQTT",
+		Protocol:    "MQTT",
+		Version:     "2",
+		Endpoint:    &endpoint,
+	})
+	var adresses_1 = []Addresses{}
+	adresses_1 = append(adresses_1, Addresses{
+		Host: "172.29.10.20",
+		Port: 31110,
+	})
+	var customServicesTransportInfo = []TransportInfo{}
+	var endPointInfo_1 = EndPointInfo{
+		Addresses: adresses_1,
+	}
+	customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{
+		Id:          "2ddb713c-2b41-4ded-a7ad-a5a047c5df13",
+		Name:        "/laboai-acme-ic-cse",
+		Description: "ACME oneM2M CSE",
+		Protocol:    "REST_HTTP",
+		Version:     "4",
+		Endpoint:    &endPointInfo_1,
+	})
+	iotPlatformInfo = IotPlatformInfo{
+		IotPlatformId:               "523f2df1-8927-429f-906c-56ba92d13762",
+		UserTransportInfo:           userTransportInfo,
+		CustomServicesTransportInfo: customServicesTransportInfo,
+		Enabled:                     true,
+	}
+	err = tm.RegisterIotPlatformInfo(iotPlatformInfo)
+	if err != nil {
+		return iotPlatformInfo, device, err
+	}
+
+	// Create a new basic device
+	fmt.Println("Create a new device")
+	requestedIotPlatformId := iotPlatformInfo.IotPlatformId
+	device = DeviceInfo{
+		RequestedIotPlatformId: requestedIotPlatformId,
+		DeviceId:               requestedIotPlatformId,
+		Enabled:                true,
+	}
+	device, err = tm.CreateDevice(device)
+	if err != nil {
+		return iotPlatformInfo, device, err
+	}
+
+	return iotPlatformInfo, device, nil
+}
+
+func validate_device_info(expected_device DeviceInfo, received_deviceResp DeviceInfo) bool {
+	if expected_device.DeviceId != received_deviceResp.DeviceId {
+		fmt.Println("received_deviceResp.DeviceId != DeviceId")
+		return false
+	}
+	if expected_device.Enabled != received_deviceResp.Enabled {
+		fmt.Println("received_deviceResp.Enabled != Enabled")
+		return false
+	}
+	if expected_device.DeviceAuthenticationInfo != received_deviceResp.DeviceAuthenticationInfo {
+		fmt.Println("received_deviceResp.DeviceAuthenticationInfo != DeviceAuthenticationInfo")
+		return false
+	}
+	if expected_device.Gpsi != received_deviceResp.Gpsi {
+		fmt.Println("received_deviceResp.Gpsi != Gpsi")
+		return false
+	}
+	if expected_device.Pei != received_deviceResp.Pei {
+		fmt.Println("received_deviceResp.Pei != Pei")
+		return false
+	}
+	if expected_device.Supi != received_deviceResp.Supi {
+		fmt.Println("received_deviceResp.Supi != Supi")
+		return false
+	}
+	if expected_device.Msisdn != received_deviceResp.Msisdn {
+		fmt.Println("received_deviceResp.Msisdn != Msisdn")
+		return false
+	}
+	if expected_device.Imei != received_deviceResp.Imei {
+		fmt.Println("received_deviceResp.Imei != Imei")
+		return false
+	}
+	if expected_device.Imsi != received_deviceResp.Imsi {
+		fmt.Println("received_deviceResp.Imsi != Imsi")
+		return false
+	}
+	if expected_device.Iccid != received_deviceResp.Iccid {
+		fmt.Println("received_deviceResp.Iccid != Iccid")
+		return false
+	}
+	if expected_device.RequestedIotPlatformId != received_deviceResp.RequestedIotPlatformId {
+		fmt.Println("received_deviceResp.RequestedIotPlatformId != RequestedIotPlatformId")
+		return false
+	}
+	if expected_device.RequestedUserTransportId != received_deviceResp.RequestedUserTransportId {
+		fmt.Println("received_deviceResp.RequestedUserTransportId != RequestedUserTransportId")
+		return false
+	}
+	if expected_device.ClientCertificate != received_deviceResp.ClientCertificate {
+		fmt.Println("received_deviceResp.ClientCertificate != ClientCertificate")
+		return false
+	}
+	if len(expected_device.DeviceMetadata) != len(received_deviceResp.DeviceMetadata) {
+		fmt.Println("received_deviceResp.DeviceMetadata != DeviceMetadata")
+		return false
+	} else {
+		for i, val := range expected_device.DeviceMetadata {
+			if val.Key != received_deviceResp.DeviceMetadata[i].Key {
+				fmt.Println("item #", i, ":received_deviceResp.DeviceMetadata.Key != DeviceMetadata.Key")
+				return false
+			}
+			if val.Value != received_deviceResp.DeviceMetadata[i].Value {
+				fmt.Println("item #", i, ":received_deviceResp.DeviceMetadata.Value != DeviceMetadata.Value")
+				return false
+
+			}
+		} // End of 'for' statement
+	}
+	if len(expected_device.RequestedMecTrafficRule) != len(received_deviceResp.RequestedMecTrafficRule) {
+		fmt.Println("received_deviceResp.RequestedMecTrafficRule != RequestedMecTrafficRule")
+		return false
+	} else {
+		// for i, val := range expected_device.RequestedMecTrafficRule {
+		// } // End of 'for' statement
+		// TODO To be continued
+		//RequestedMecTrafficRule  []TrafficRuleDescriptor
+	}
+	// TODO To be continued
+
+	return true
+}
diff --git a/go-packages/meep-sss-client/.gitignore b/go-packages/meep-sss-client/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..daf913b1b347aae6de6f48d599bc89ef8c8693d6
--- /dev/null
+++ b/go-packages/meep-sss-client/.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/go-packages/meep-sss-client/.swagger-codegen-ignore b/go-packages/meep-sss-client/.swagger-codegen-ignore
new file mode 100644
index 0000000000000000000000000000000000000000..c5fa491b4c557bf997d5dd21797de782545dc9e5
--- /dev/null
+++ b/go-packages/meep-sss-client/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# 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 Swagger Codgen 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/go-packages/meep-sss-client/.swagger-codegen/VERSION b/go-packages/meep-sss-client/.swagger-codegen/VERSION
new file mode 100644
index 0000000000000000000000000000000000000000..6187fa53f3d79636a7b3e6f59c36a1f4273d08b5
--- /dev/null
+++ b/go-packages/meep-sss-client/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.66
\ No newline at end of file
diff --git a/go-packages/meep-sss-client/.travis.yml b/go-packages/meep-sss-client/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f5cb2ce9a5aad73c57eed886e845d2e79c2899d1
--- /dev/null
+++ b/go-packages/meep-sss-client/.travis.yml
@@ -0,0 +1,8 @@
+language: go
+
+install:
+  - go get -d -v .
+
+script:
+  - go build -v ./
+
diff --git a/go-packages/meep-sss-client/README.md b/go-packages/meep-sss-client/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6bfa0a4cc2635c4fd08fda90227b5727b6360157
--- /dev/null
+++ b/go-packages/meep-sss-client/README.md
@@ -0,0 +1,81 @@
+# Go API client for swagger
+
+GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+
+## Overview
+This API client was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project.  By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate an API client.
+
+- API version: 3.1.1
+- Package version: 1.0.0
+- Build package: io.swagger.codegen.v3.generators.go.GoClientCodegen
+For more information, please visit [https://forge.etsi.org/rep/mec/gs046-ss-api](https://forge.etsi.org/rep/mec/gs046-ss-api)
+
+## Installation
+Put the package under your project folder and add the following in import:
+```golang
+import "./swagger"
+```
+
+## Documentation for API Endpoints
+
+All URIs are relative to *https://localhost/sandboxname/sens/v1*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*ManagementnApi* | [**SensorMgmtPUT**](docs/ManagementnApi.md#sensormgmtput) | **Put** /sensor_management | The PUT method is used to update the value of the characteristics that can be set on a sensor or on a group of sensors
+*SensorDataLookupApi* | [**SensorDataLookupGET**](docs/SensorDataLookupApi.md#sensordatalookupget) | **Get** /queries/status_data | The GET method is used to query the last sensor data from specific sensors
+*SensorDataSubscriptionApi* | [**SensorDataIndividualSubscriptionGET**](docs/SensorDataSubscriptionApi.md#sensordataindividualsubscriptionget) | **Get** /queries/status_data/{subscriptionId} | The GET method is used to retrieve information about this subscription
+*SensorDataSubscriptionApi* | [**SensorDataSubscriptionDELETE**](docs/SensorDataSubscriptionApi.md#sensordatasubscriptiondelete) | **Delete** /queries/status_data/{subscriptionId} | The DELETE method is used to cancel the existing subscription
+*SensorDataSubscriptionApi* | [**SensorDataSubscriptionGET**](docs/SensorDataSubscriptionApi.md#sensordatasubscriptionget) | **Get** /subscriptions/sensor_data | The GET method is used to request information about the subscriptions related to sensor data for this requestor
+*SensorDataSubscriptionApi* | [**SensorDataSubscriptionPOST**](docs/SensorDataSubscriptionApi.md#sensordatasubscriptionpost) | **Post** /subscriptions/sensor_data | The POST method is used to create a new subscription to sensor status notifications
+*SensorDataSubscriptionApi* | [**SensorDataSubscriptionPUT**](docs/SensorDataSubscriptionApi.md#sensordatasubscriptionput) | **Put** /queries/status_data/{subscriptionId} | The PUT method is used to update the existing subscription
+*SensorDiscoveryLookupApi* | [**SensorDiscoveryLookupGET**](docs/SensorDiscoveryLookupApi.md#sensordiscoverylookupget) | **Get** /queries/sensor_discovery | The GET method is used to query the available sensors
+*SensorDiscoverySubscriptionApi* | [**SensorDiscoveryIndividualSubscriptionGET**](docs/SensorDiscoverySubscriptionApi.md#sensordiscoveryindividualsubscriptionget) | **Get** /subscriptions/sensor_discovery/{subscriptionId} | The GET method is used to request information about the subscriptions related to sensor status for this requestor
+*SensorDiscoverySubscriptionApi* | [**SensorDiscoverySubscriptionDELETE**](docs/SensorDiscoverySubscriptionApi.md#sensordiscoverysubscriptiondelete) | **Delete** /subscriptions/sensor_discovery/{subscriptionId} | The DELETE method is used to cancel the existing subscription. Cancellation can be made by deleting the resource that represents existing sensor discovery subscription
+*SensorDiscoverySubscriptionApi* | [**SensorDiscoverySubscriptionGET**](docs/SensorDiscoverySubscriptionApi.md#sensordiscoverysubscriptionget) | **Get** /subscriptions/sensor_discovery | The GET method is used to request information about the subscriptions related to sensor discovery for this requestor
+*SensorDiscoverySubscriptionApi* | [**SensorDiscoverySubscriptionPOST**](docs/SensorDiscoverySubscriptionApi.md#sensordiscoverysubscriptionpost) | **Post** /subscriptions/sensor_discovery | The POST method is used to create a new subscription to sensor discovery notifications
+*SensorDiscoverySubscriptionApi* | [**SensorDiscoverySubscriptionPUT**](docs/SensorDiscoverySubscriptionApi.md#sensordiscoverysubscriptionput) | **Put** /subscriptions/sensor_discovery/{subscriptionId} | The POST method is used to create a new subscription to sensor discovery notifications
+*SensorManagementApi* | [**SensorMgmtGET**](docs/SensorManagementApi.md#sensormgmtget) | **Get** /sensor_management | The GET method is used to receive the sensor characteristics that can be modified on specific sensors
+*SensorStatusLookupApi* | [**SensorStatusLookupGET**](docs/SensorStatusLookupApi.md#sensorstatuslookupget) | **Get** /queries/sensor_status | The GET method is used to query the available status
+*SensorStatusSubscriptionApi* | [**SensorStatusIndividualSubscriptionGET**](docs/SensorStatusSubscriptionApi.md#sensorsatusindividualsubscriptionget) | **Get** /subscriptions/sensor_status/{subscriptionId} | The GET method is used to retrieve information about this subscription
+*SensorStatusSubscriptionApi* | [**SensorStatusIndividualSubscriptionGET**](docs/SensorStatusSubscriptionApi.md#sensorstatusindividualsubscriptionget) | **Get** /subscriptions/sensor_status | The GET method is used to request information about the subscriptions related to sensor status for this requestor
+*SensorStatusSubscriptionApi* | [**SensorStatusSubscriptionDELETE**](docs/SensorStatusSubscriptionApi.md#sensorstatussubscriptiondelete) | **Delete** /subscriptions/sensor_status/{subscriptionId} | The DELETE method is used to cancel the existing subscription
+*SensorStatusSubscriptionApi* | [**SensorStatusSubscriptionPUT**](docs/SensorStatusSubscriptionApi.md#sensorstatussubscriptionput) | **Put** /subscriptions/sensor_status/{subscriptionId} | The PUT method is used to update the existing subscription
+*StatusStatusSubscriptionApi* | [**SensorStatusSubscriptionPOST**](docs/StatusStatusSubscriptionApi.md#sensorstatussubscriptionpost) | **Post** /subscriptions/sensor_status | The POST method is used to create a new subscription to sensor status notifications
+
+## Documentation For Models
+
+ - [AreaInfo](docs/AreaInfo.md)
+ - [LinkType](docs/LinkType.md)
+ - [Point](docs/Point.md)
+ - [ProblemDetails](docs/ProblemDetails.md)
+ - [SensorCharacteristic](docs/SensorCharacteristic.md)
+ - [SensorData](docs/SensorData.md)
+ - [SensorDataSubscription](docs/SensorDataSubscription.md)
+ - [SensorDiscoveryEventSubscription](docs/SensorDiscoveryEventSubscription.md)
+ - [SensorDiscoveryInfo](docs/SensorDiscoveryInfo.md)
+ - [SensorDiscoverySubscriptionIdBody](docs/SensorDiscoverySubscriptionIdBody.md)
+ - [SensorInfo](docs/SensorInfo.md)
+ - [SensorStatusInfo](docs/SensorStatusInfo.md)
+ - [SensorStatusSubscription](docs/SensorStatusSubscription.md)
+ - [SensorStatusSubscriptionIdBody](docs/SensorStatusSubscriptionIdBody.md)
+ - [ShapeType](docs/ShapeType.md)
+ - [StatusDataSubscriptionIdBody](docs/StatusDataSubscriptionIdBody.md)
+ - [SubscriptionLinkList](docs/SubscriptionLinkList.md)
+ - [SubscriptionLinkListLinks](docs/SubscriptionLinkListLinks.md)
+ - [SubscriptionLinkListSubscription](docs/SubscriptionLinkListSubscription.md)
+ - [SubscriptionLinks](docs/SubscriptionLinks.md)
+ - [SubscriptionType](docs/SubscriptionType.md)
+ - [SubscriptionsSensorDataBody](docs/SubscriptionsSensorDataBody.md)
+ - [SubscriptionsSensorDiscoveryBody](docs/SubscriptionsSensorDiscoveryBody.md)
+ - [SubscriptionsSensorStatusBody](docs/SubscriptionsSensorStatusBody.md)
+ - [TimeStamp](docs/TimeStamp.md)
+ - [WebsockNotifConfig](docs/WebsockNotifConfig.md)
+
+## Documentation For Authorization
+ Endpoints do not require authorization.
+
+
+## Author
+
+cti_support@etsi.org
diff --git a/go-packages/meep-sss-client/api/swagger.yaml b/go-packages/meep-sss-client/api/swagger.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b77aa69a1d2b495d788250b147f6d20001735258
--- /dev/null
+++ b/go-packages/meep-sss-client/api/swagger.yaml
@@ -0,0 +1,1581 @@
+openapi: 3.0.0
+info:
+  title: ETSI GS MEC 046 Sensors Sharing Service APIs
+  description: GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+  contact:
+    name: ETSI Forge
+    url: https://forge.etsi.org/rep/mec/gs046-ss-api
+    email: cti_support@etsi.org
+  license:
+    name: BSD-3-Clause
+    url: https://forge.etsi.org/legal-matters
+  version: 3.1.1
+externalDocs:
+  description: "GS MEC 046 Sensors Sharing Service APIs, v3.3.1"
+  url: https://www.etsi.org/deliver/etsi_gs/MEC/001_099/033/03.01.01_60/gs_mec046v030101p.pdf
+servers:
+- url: https://localhost/sandboxname/sens/v1
+tags:
+- name: sensor-discovery-lookup
+  description: The Sensor Discovery Lookup is the procedure for applications acquiring
+    the sensor(s) currently available and the related characteristics
+- name: sensor-discovery-subscription
+  description: The Sensor Discovery Subscription is the procedure for applications
+    to request to receive notifications about sensors when sensor information changes
+- name: sensor-status-lookup
+  description: The Sensor Status Lookup is the procedure for applications acquiring
+    the status (e.g. active or error state) of sensor(s)
+- name: sensor-status-subscription
+  description: The Sensor Status Subscription is the procedure for applications to
+    request to receive notifications about sensors when they change their status
+- name: sensor-data-lookup
+  description: The Sensor Data Lookup is the procedure for applications to acquire
+    the last data collected by the sensor(s)
+- name: sensor-data-subscription
+  description: The Sensor Data Subscription is the procedure for applications to request
+    to receive notifications every time new data are collected from the sensor(s)
+- name: sensor-management
+  description: The Sensor Management is the procedure for a MEC application to configure
+    specific parameter(s) on the sensor(s)
+paths:
+  /queries/sensor_discovery:
+    get:
+      tags:
+      - sensor-discovery-lookup
+      summary: The GET method is used to query the available sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.3.3.1-1\
+        \ and 7.3.3.1-2."
+      operationId: SensorDiscoveryLookupGET
+      parameters:
+      - name: sensorInfo
+        in: query
+        description: Object containing the characteristics of the sensor(s) to be
+          selected for the query
+        required: false
+        style: form
+        explode: true
+        schema:
+          $ref: '#/components/schemas/SensorInfo'
+      responses:
+        "200":
+          description: "Upon success, a response body containing the available sensors\
+            \ is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDiscoveryInfo'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_discovery:
+    get:
+      tags:
+      - sensor-discovery-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor discovery for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.4.3.1-1\
+        \ and 7.4.3.1-2."
+      operationId: SensorDiscoverySubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: query
+        description: Object containing the characteristics of the sensor(s) to be
+          selected for the query
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor discovery subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - sensor-discovery-subscription
+      summary: The POST method is used to create a new subscription to sensor discovery
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.4.3.4-1"
+      operationId: SensorDiscoverySubscriptionPOST
+      requestBody:
+        description: This type represents a subscription to notifications from the
+          Sensor-sharing Service regarding events related to changes in sensor information
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/subscriptions_sensor_discovery_body'
+        required: true
+      responses:
+        "201":
+          description: "Indicates successful resource creation, where the resource\
+            \ URI shall be returned in the HTTP Location header field"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDiscoveryEventSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_discovery/{subscriptionId}:
+    get:
+      tags:
+      - sensor-discovery-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor status for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.7.3.1-1\
+        \ and 7.7.3.1-2."
+      operationId: SensorDiscoveryIndividualSubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of the subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor status subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - sensor-discovery-subscription
+      summary: The POST method is used to create a new subscription to sensor discovery
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.4.3.4-1"
+      operationId: SensorDiscoverySubscriptionPUT
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: New SensorDiscoveryEventSubscription is included as entity body
+          of the request
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/sensor_discovery_subscriptionId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor discovery subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - sensor-discovery-subscription
+      summary: The DELETE method is used to cancel the existing subscription. Cancellation
+        can be made by deleting the resource that represents existing sensor discovery
+        subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.5.3.5-1 and 7.5.3.5-2"
+      operationId: SensorDiscoverySubscriptionDELETE
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: "Upon success, a response 204 No Content without any response\
+            \ body is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /queries/sensor_status:
+    get:
+      tags:
+      - sensor-status-lookup
+      summary: The GET method is used to query the available status
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.6.3.1-1\
+        \ and 7.6.3.1-2"
+      operationId: SensorStatusLookupGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the status information\
+            \ of specific sensors is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusInfo'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_status:
+    get:
+      tags:
+      - sensor-status-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor status for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.7.3.1-1\
+        \ and 7.7.3.1-2"
+      operationId: SensorStatusIndividualSubscriptionGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: Unique identifiers of the sensors
+        required: false
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor status subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - status-status-subscription
+      summary: The POST method is used to create a new subscription to sensor status
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.7.3.4-1"
+      operationId: SensorStatusSubscriptionPOST
+      requestBody:
+        description: The entity body in the request contains data type of the specific
+          sensor status subscription that is to be created
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/subscriptions_sensor_status_body'
+        required: true
+      responses:
+        "201":
+          description: "Indicates successful resource creation, where the resource\
+            \ URI shall be returned in the HTTP Location header field."
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_status/{subscriptionId}:
+    get:
+      tags:
+      - sensor-status-subscription
+      summary: The GET method is used to retrieve information about this subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.8.3.1-1 and 7.8.3.1-2"
+      operationId: SensorStatusIndividualSubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of the subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the specific sensor status subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - sensor-status-subscription
+      summary: The PUT method is used to update the existing subscription
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.8.3.2-1\
+        \ and 7.8.3.2-2"
+      operationId: SensorStatusSubscriptionPUT
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: New SensorStatusSubscription is included as entity body of the
+          request
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/sensor_status_subscriptionId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor status subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - sensor-status-subscription
+      summary: The DELETE method is used to cancel the existing subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.8.3.5-1 and 7.8.3.5-2"
+      operationId: SensorStatusSubscriptionDELETE
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: "Upon success, a response 204 No Content without any response\
+            \ body is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /queries/status_data:
+    get:
+      tags:
+      - sensor-data-lookup
+      summary: The GET method is used to query the last sensor data from specific
+        sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.9.3.1-1\
+        \ and 7.9.3.1-2"
+      operationId: SensorDataLookupGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the last sensor data\
+            \ measured by the sensors is returned"
+          content:
+            application/json:
+              schema:
+                minItems: 1
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorData'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /subscriptions/sensor_data:
+    get:
+      tags:
+      - sensor-data-subscription
+      summary: The GET method is used to request information about the subscriptions
+        related to sensor data for this requestor
+      description: "This method shall support the URI query parameter, request and\
+        \ response data structures, and response codes, as specified in Tables 7.10.3.1-1\
+        \ and 7.10.3.1-2"
+      operationId: SensorDataSubscriptionGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: Unique identifiers of the sensors
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the list of links\
+            \ to requestor's sensor status subscriptions is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    post:
+      tags:
+      - sensor-data-subscription
+      summary: The POST method is used to create a new subscription to sensor status
+        notifications
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Table 7.7.3.4-1"
+      operationId: SensorDataSubscriptionPOST
+      requestBody:
+        description: The entity body in the request contains data type of the specific
+          sensor status subscription that is to be created
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/subscriptions_sensor_data_body'
+        required: true
+      responses:
+        "201":
+          description: "Indicates successful resource creation, where the resource\
+            \ URI shall be returned in the HTTP Location header field."
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorStatusSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /queries/status_data/{subscriptionId}:
+    get:
+      tags:
+      - sensor-data-subscription
+      summary: The GET method is used to retrieve information about this subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.11.3.1-1 and 7.11.3.1-2"
+      operationId: SensorDataIndividualSubscriptionGET
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the specific sensor data subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDataSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - sensor-data-subscription
+      summary: The PUT method is used to update the existing subscription
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.11.3.2-1\
+        \ and 7.11.3.2-2"
+      operationId: SensorDataSubscriptionPUT
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: Unique identifiers of a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      requestBody:
+        description: New SensorDataSubscription is included as entity body of the
+          request
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/status_data_subscriptionId_body'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor data subscription is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorDataSubscription'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    delete:
+      tags:
+      - sensor-data-subscription
+      summary: The DELETE method is used to cancel the existing subscription
+      description: "This method shall support the request and response data structures,\
+        \ and response codes, as specified in Tables 7.11.3.5-1 and 7.11.3.5-2"
+      operationId: SensorDataSubscriptionDELETE
+      parameters:
+      - name: subscriptionId
+        in: path
+        description: It uniquely identifies a subscription
+        required: true
+        style: simple
+        explode: false
+        schema:
+          type: string
+      responses:
+        "204":
+          description: "Upon success, a response 204 No Content without any response\
+            \ body is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SubscriptionLinkList'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+  /sensor_management:
+    get:
+      tags:
+      - sensor-management
+      summary: The GET method is used to receive the sensor characteristics that can
+        be modified on specific sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.12.3.1-1\
+        \ and 7.12.3.1-2"
+      operationId: SensorMgmtGET
+      parameters:
+      - name: sensorIdentifier
+        in: query
+        description: It uniquely identifies the created individual application mobility
+          service
+        required: true
+        style: form
+        explode: true
+        schema:
+          type: array
+          items:
+            type: string
+      responses:
+        "200":
+          description: "Upon success, a response body containing the characteristics\
+            \ that can be set on the specific sensors are returned"
+          content:
+            application/json:
+              schema:
+                minItems: 1
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorCharacteristic'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+    put:
+      tags:
+      - management
+      summary: The PUT method is used to update the value of the characteristics that
+        can be set on a sensor or on a group of sensors
+      description: "This method shall support the URI query parameters, request and\
+        \ response data structures, and response codes, as specified in Tables 7.12.3.2-1\
+        \ and 7.12.3.2-2"
+      operationId: SensorMgmtPUT
+      requestBody:
+        description: "The list of sensor characteristics to be updated, with the new\
+          \ values to set, is included as entity body of the request"
+        content:
+          application/json:
+            schema:
+              minItems: 1
+              type: array
+              items:
+                $ref: '#/components/schemas/SensorCharacteristic'
+        required: true
+      responses:
+        "200":
+          description: "Upon success, a response body containing data type describing\
+            \ the updated sensor characteristics is returned"
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/SensorCharacteristic'
+                x-content-type: application/json
+        "400":
+          description: "Bad Request: used to indicate that incorrect parameters were\
+            \ passed to the request"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "403":
+          description: "Forbidden: operation is not allowed given the current status\
+            \ of the resource"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+        "404":
+          description: "Not Found: used when a client provided a URI that cannot be\
+            \ mapped to a valid resource URI"
+          content:
+            application/problem+json:
+              schema:
+                $ref: '#/components/schemas/ProblemDetails'
+components:
+  schemas:
+    SensorStatusInfo:
+      required:
+      - sensorIdentifier
+      - sensorStatusType
+      type: object
+      properties:
+        sensorIdentifier:
+          type: string
+          description: Unique identifier of the sensor
+        sensorStatusType:
+          type: string
+          description: The status of the sensor
+        errorInformation:
+          type: string
+          description: String explaining the error of the sensor
+      example:
+        errorInformation: errorInformation
+        sensorIdentifier: sensorIdentifier
+        sensorStatusType: sensorStatusType
+    SensorData:
+      required:
+      - data
+      - dataFormat
+      - dataUnitOfMeasure
+      - sensorIdentifier
+      type: object
+      properties:
+        sensorIdentifier:
+          type: string
+          description: Unique identifier of the sensor
+        data:
+          type: string
+          description: The status of the sensor
+        dataFormat:
+          type: string
+          description: String explaining the error of the sensor
+        dataUnitOfMeasure:
+          type: string
+          description: String explaining the error of the sensor
+        dataTimestamp:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        dataTimestamp:
+          seconds: 1
+          nanoSeconds: 5
+        data: data
+        dataUnitOfMeasure: dataUnitOfMeasure
+        dataFormat: dataFormat
+        sensorIdentifier: sensorIdentifier
+    SensorInfo:
+      required:
+      - sensorPropertyList
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          description: Type of the sensor
+        sensorPropertyList:
+          type: array
+          description: "It indicates the list of properties that the sensor can sense\
+            \ (see saref:Property in ETSI TS 103 264 [4], clause 4.3.8)."
+          items:
+            minItems: 1
+            type: string
+        sensorCharacteristicList:
+          minItems: 0
+          type: array
+          description: The sensor' characteristics to be matched
+          items:
+            $ref: '#/components/schemas/SensorCharacteristic'
+        geographicalArea:
+          minItems: 0
+          type: array
+          description: The parameters describing the area
+          items:
+            $ref: '#/components/schemas/AreaInfo'
+    SensorDiscoveryInfo:
+      required:
+      - sensorIdentifier
+      - sensorPropertyList
+      - sensorType
+      type: object
+      properties:
+        sensorIdentifier:
+          type: string
+          description: Unique identifier of the sensor
+        sensorType:
+          type: string
+          description: Type of the Sensor
+        sensorPropertyList:
+          minItems: 1
+          type: array
+          description: It indicates the list of properties that the sensor can sense
+          items:
+            type: string
+        sensorCharacteristicList:
+          minItems: 0
+          type: array
+          description: The sensor' characteristics
+          items:
+            $ref: '#/components/schemas/SensorCharacteristic'
+        sensorPosition:
+          $ref: '#/components/schemas/Point'
+      example:
+        sensorPosition:
+          latitude: 0.80082819046101150206595775671303272247314453125
+          longitude: 6.02745618307040320615897144307382404804229736328125
+        sensorPropertyList:
+        - sensorPropertyList
+        - sensorPropertyList
+        sensorType: sensorType
+        sensorCharacteristicList:
+        - characteristicName: characteristicName
+          characteristicUnitOfMeasure: characteristicUnitOfMeasure
+          characteristicValue: characteristicValue
+        - characteristicName: characteristicName
+          characteristicUnitOfMeasure: characteristicUnitOfMeasure
+          characteristicValue: characteristicValue
+        sensorIdentifier: sensorIdentifier
+    SensorDiscoveryEventSubscription:
+      title: SensorDiscoveryEventSubscription
+      required:
+      - subscriptionType
+      type: object
+      properties:
+        subscriptionType:
+          $ref: '#/components/schemas/SubscriptionType'
+        callbackReference:
+          type: string
+          description: URI exposed by the client on which to receive notifications
+            via HTTP
+          format: uri
+        requestTestNotification:
+          type: boolean
+          description: "Set to TRUE by the MEC application to request a test notification\
+            \ via HTTP on the callbackReference URI,"
+        websockNotifConfig:
+          $ref: '#/components/schemas/WebsockNotifConfig'
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinks'
+        sensorInfoList:
+          type: array
+          description: Object containing the characteristics of the sensor(s) to be
+            selected for the subscription
+          items:
+            type: string
+        geographicalArea:
+          type: array
+          description: The parameters describing the area to subscribe
+          items:
+            $ref: '#/components/schemas/AreaInfo'
+        expiryDeadline:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        sensorInfoList:
+        - sensorInfoList
+        - sensorInfoList
+        subscriptionType: SensorDiscoveryEventSubscription
+        _links:
+          self:
+            href: href
+        callbackReference: http://example.com/aeiou
+        expiryDeadline:
+          seconds: 1
+          nanoSeconds: 5
+        websockNotifConfig:
+          requestWebsocketUri: true
+          websocketUri: http://example.com/aeiou
+        requestTestNotification: true
+        geographicalArea:
+        - shape: 0
+          radius: 6
+          points:
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+        - shape: 0
+          radius: 6
+          points:
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+          - latitude: 0.80082819046101150206595775671303272247314453125
+            longitude: 6.02745618307040320615897144307382404804229736328125
+    SensorStatusSubscription:
+      title: SensorStatusSubscription
+      required:
+      - subscriptionType
+      type: object
+      properties:
+        subscriptionType:
+          $ref: '#/components/schemas/SubscriptionType'
+        callbackReference:
+          type: string
+          description: URI exposed by the client on which to receive notifications
+            via HTTP
+          format: uri
+        requestTestNotification:
+          type: boolean
+          description: "Set to TRUE by the MEC application to request a test notification\
+            \ via HTTP on the callbackReference URI,"
+        websockNotifConfig:
+          $ref: '#/components/schemas/WebsockNotifConfig'
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinks'
+        expiryDeadline:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        subscriptionType: SensorDiscoveryEventSubscription
+        _links:
+          self:
+            href: href
+        callbackReference: http://example.com/aeiou
+        expiryDeadline:
+          seconds: 1
+          nanoSeconds: 5
+        websockNotifConfig:
+          requestWebsocketUri: true
+          websocketUri: http://example.com/aeiou
+        requestTestNotification: true
+    SensorDataSubscription:
+      title: SensorDataSubscription
+      required:
+      - subscriptionType
+      type: object
+      properties:
+        subscriptionType:
+          $ref: '#/components/schemas/SubscriptionType'
+        callbackReference:
+          type: string
+          description: URI exposed by the client on which to receive notifications
+            via HTTP
+          format: uri
+        requestTestNotification:
+          type: boolean
+          description: "Set to TRUE by the MEC application to request a test notification\
+            \ via HTTP on the callbackReference URI,"
+        websockNotifConfig:
+          $ref: '#/components/schemas/WebsockNotifConfig'
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinks'
+        expiryDeadline:
+          $ref: '#/components/schemas/TimeStamp'
+      example:
+        subscriptionType: SensorDiscoveryEventSubscription
+        _links:
+          self:
+            href: href
+        callbackReference: http://example.com/aeiou
+        expiryDeadline:
+          seconds: 1
+          nanoSeconds: 5
+        websockNotifConfig:
+          requestWebsocketUri: true
+          websocketUri: http://example.com/aeiou
+        requestTestNotification: true
+    SubscriptionType:
+      title: SubscriptionType
+      type: string
+      enum:
+      - SensorDiscoveryEventSubscription
+      - SensorStatusSubscription
+      - SensorDataSubscription
+    WebsockNotifConfig:
+      type: object
+      properties:
+        websocketUri:
+          type: string
+          description: Set by AMS to indicate to the service consumer the Websocket
+            URI to be used for delivering notifications.
+          format: uri
+        requestWebsocketUri:
+          type: boolean
+          description: Set to true by the service consumer to indicate that Websocket
+            delivery is requested.
+      example:
+        requestWebsocketUri: true
+        websocketUri: http://example.com/aeiou
+    SensorCharacteristic:
+      required:
+      - characteristicName
+      - characteristicValue
+      type: object
+      properties:
+        characteristicName:
+          type: string
+          description: The name of the characteristic
+        characteristicValue:
+          type: string
+          description: The value of the characteristic.
+        characteristicUnitOfMeasure:
+          type: string
+          description: "The unit of measure of the characteristic (see saref:UnitOfMeasure\
+            \ in ETSI TS 103 264 [4], clause 4.3.8)."
+      description: "This type represents a sensor' characteristic which details the\
+        \ type of sensor and its working functionalities, such as the model of the\
+        \ sensor, the sampling frequency, the operating range, the accuracy"
+      example:
+        characteristicName: characteristicName
+        characteristicUnitOfMeasure: characteristicUnitOfMeasure
+        characteristicValue: characteristicValue
+    Point:
+      required:
+      - latitude
+      - longitude
+      type: object
+      properties:
+        latitude:
+          type: number
+          description: "Location latitude, expressed in the range -90° to +90°"
+        longitude:
+          type: number
+          description: "Location longitude, expressed in the range -180° to +180°."
+      description: This type represents the geographical location of a point
+      example:
+        latitude: 0.80082819046101150206595775671303272247314453125
+        longitude: 6.02745618307040320615897144307382404804229736328125
+    SubscriptionLinks:
+      title: SubscriptionLinks
+      required:
+      - self
+      type: object
+      properties:
+        self:
+          $ref: '#/components/schemas/LinkType'
+      example:
+        self:
+          href: href
+    SubscriptionLinkList.links:
+      title: SubscriptionLinkList.links
+      required:
+      - self
+      type: object
+      properties:
+        self:
+          $ref: '#/components/schemas/LinkType'
+        subscriptions:
+          type: array
+          description: The MEC application's subscriptions
+          items:
+            $ref: '#/components/schemas/SubscriptionLinkList.subscription'
+      description: List of hyperlinks related to the resource.
+      example:
+        subscriptions:
+        - subscriptionType: subscriptionType
+          href: href
+        - subscriptionType: subscriptionType
+          href: href
+        self:
+          href: href
+    SubscriptionLinkList.subscription:
+      title: SubscriptionLinkList.subscription
+      required:
+      - href
+      - subscriptionType
+      type: object
+      properties:
+        href:
+          type: string
+          description: The URI referring to the subscription
+        subscriptionType:
+          type: string
+          description: Type of the subscription
+      example:
+        subscriptionType: subscriptionType
+        href: href
+    SubscriptionLinkList:
+      title: SubscriptionLinkList
+      required:
+      - _links
+      type: object
+      properties:
+        _links:
+          $ref: '#/components/schemas/SubscriptionLinkList.links'
+      example:
+        _links:
+          subscriptions:
+          - subscriptionType: subscriptionType
+            href: href
+          - subscriptionType: subscriptionType
+            href: href
+          self:
+            href: href
+    ProblemDetails:
+      type: object
+      properties:
+        type:
+          type: string
+          description: A URI reference according to IETF RFC 3986 that identifies
+            the problem type
+          format: uri
+        title:
+          type: string
+          description: "A short, human-readable summary of the problem type"
+        status:
+          type: integer
+          description: The HTTP status code for this occurrence of the problem
+          format: uint32
+        detail:
+          type: string
+          description: A human-readable explanation specific to this occurrence of
+            the problem
+        instance:
+          type: string
+          description: A URI reference that identifies the specific occurrence of
+            the problem
+          format: uri
+    LinkType:
+      title: LinkType
+      required:
+      - href
+      type: object
+      properties:
+        href:
+          type: string
+          description: The URI referring to the subscription.
+      description: '''This data type represents a type of link'''
+      example:
+        href: href
+    TimeStamp:
+      title: TimeStamp
+      required:
+      - nanoSeconds
+      - seconds
+      type: object
+      properties:
+        seconds:
+          type: integer
+          description: "'The seconds part of the Time. Time is defined as Unix-time\
+            \ since January 1, 1970, 00:00:00 UTC.'"
+        nanoSeconds:
+          type: integer
+          description: "'The nanoseconds part of the Time. Time is defined as Unix-time\
+            \ since January 1, 1970, 00:00:00 UTC.'"
+      description: "'This data type represents the time stamp as Unix-time since January\
+        \ 1, 1970, 00:00:00 UTC'"
+      example:
+        seconds: 1
+        nanoSeconds: 5
+    ShapeType:
+      title: ShapeType
+      type: integer
+      enum:
+      - null
+      - null
+    AreaInfo:
+      title: AreaInfo
+      required:
+      - points
+      - shape
+      type: object
+      properties:
+        shape:
+          $ref: '#/components/schemas/ShapeType'
+        points:
+          type: array
+          description: Shall include one point if the shape is CIRCLE. Shall include
+            3-15 points if the shape is POLYGON
+          items:
+            $ref: '#/components/schemas/Point'
+        radius:
+          type: integer
+          description: Shall be present if the shape is CIRCLE
+      example:
+        shape: 0
+        radius: 6
+        points:
+        - latitude: 0.80082819046101150206595775671303272247314453125
+          longitude: 6.02745618307040320615897144307382404804229736328125
+        - latitude: 0.80082819046101150206595775671303272247314453125
+          longitude: 6.02745618307040320615897144307382404804229736328125
+    subscriptions_sensor_discovery_body:
+      type: object
+      properties:
+        SensorDiscoveryEventSubscription:
+          $ref: '#/components/schemas/SensorDiscoveryEventSubscription'
+    sensor_discovery_subscriptionId_body:
+      type: object
+      properties:
+        SensorDiscoveryEventSubscription:
+          $ref: '#/components/schemas/SensorDiscoveryEventSubscription'
+    subscriptions_sensor_status_body:
+      type: object
+      properties:
+        SensorStatusSubscription:
+          $ref: '#/components/schemas/SensorStatusSubscription'
+    sensor_status_subscriptionId_body:
+      type: object
+      properties:
+        SensorStatusSubscription:
+          $ref: '#/components/schemas/SensorStatusSubscription'
+    subscriptions_sensor_data_body:
+      type: object
+      properties:
+        SensorDataSubscription:
+          $ref: '#/components/schemas/SensorDataSubscription'
+    status_data_subscriptionId_body:
+      type: object
+      properties:
+        SensorStatusSubscription:
+          $ref: '#/components/schemas/SensorDataSubscription'
diff --git a/go-packages/meep-sss-client/api_managementn.go b/go-packages/meep-sss-client/api_managementn.go
new file mode 100644
index 0000000000000000000000000000000000000000..582a1ed56e25f14784e355f4042eb97c72142185
--- /dev/null
+++ b/go-packages/meep-sss-client/api_managementn.go
@@ -0,0 +1,142 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type ManagementnApiService service
+
+/*
+ManagementnApiService The PUT method is used to update the value of the characteristics that can be set on a sensor or on a group of sensors
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.12.3.2-1 and 7.12.3.2-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body The list of sensor characteristics to be updated, with the new values to set, is included as entity body of the request
+@return []SensorCharacteristic
+*/
+func (a *ManagementnApiService) SensorMgmtPUT(ctx context.Context, body []SensorCharacteristic) ([]SensorCharacteristic, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Put")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorCharacteristic
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/sensor_management"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorCharacteristic
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_data_lookup.go b/go-packages/meep-sss-client/api_sensor_data_lookup.go
new file mode 100644
index 0000000000000000000000000000000000000000..7fe2635387b92075ee6e446abae03e0344eb3d3e
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_data_lookup.go
@@ -0,0 +1,141 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorDataLookupApiService service
+
+/*
+SensorDataLookupApiService The GET method is used to query the last sensor data from specific sensors
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.9.3.1-1 and 7.9.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param sensorIdentifier It uniquely identifies the created individual application mobility service
+@return []SensorData
+*/
+func (a *SensorDataLookupApiService) SensorDataLookupGET(ctx context.Context, sensorIdentifier []string) ([]SensorData, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorData
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/queries/status_data"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	localVarQueryParams.Add("sensorIdentifier", parameterToString(sensorIdentifier, "multi"))
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorData
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_data_subscription.go b/go-packages/meep-sss-client/api_sensor_data_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..c541e06a78dbcf889004fb49099286754d8d13c1
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_data_subscription.go
@@ -0,0 +1,610 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorDataSubscriptionApiService service
+
+/*
+SensorDataSubscriptionApiService The GET method is used to retrieve information about this subscription
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.11.3.1-1 and 7.11.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param subscriptionId Unique identifiers of a subscription
+@return []SensorDataSubscription
+*/
+func (a *SensorDataSubscriptionApiService) SensorDataIndividualSubscriptionGET(ctx context.Context, subscriptionId string) ([]SensorDataSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorDataSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/queries/status_data/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorDataSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDataSubscriptionApiService The DELETE method is used to cancel the existing subscription
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.11.3.5-1 and 7.11.3.5-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param subscriptionId It uniquely identifies a subscription
+@return []SubscriptionLinkList
+*/
+func (a *SensorDataSubscriptionApiService) SensorDataSubscriptionDELETE(ctx context.Context, subscriptionId string) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Delete")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/queries/status_data/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 204 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDataSubscriptionApiService The GET method is used to request information about the subscriptions related to sensor data for this requestor
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.10.3.1-1 and 7.10.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param sensorIdentifier Unique identifiers of the sensors
+@return []SubscriptionLinkList
+*/
+func (a *SensorDataSubscriptionApiService) SensorDataSubscriptionGET(ctx context.Context, sensorIdentifier []string) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_data"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	localVarQueryParams.Add("sensorIdentifier", parameterToString(sensorIdentifier, "multi"))
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDataSubscriptionApiService The POST method is used to create a new subscription to sensor status notifications
+This method shall support the request and response data structures, and response codes, as specified in Table 7.7.3.4-1
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body The entity body in the request contains data type of the specific sensor status subscription that is to be created
+@return []SensorStatusSubscription
+*/
+func (a *SensorDataSubscriptionApiService) SensorDataSubscriptionPOST(ctx context.Context, body SubscriptionsSensorDataBody) ([]SensorStatusSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Post")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorStatusSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_data"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 201 {
+			var v []SensorStatusSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDataSubscriptionApiService The PUT method is used to update the existing subscription
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.11.3.2-1 and 7.11.3.2-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body New SensorDataSubscription is included as entity body of the request
+ * @param subscriptionId Unique identifiers of a subscription
+@return []SensorDataSubscription
+*/
+func (a *SensorDataSubscriptionApiService) SensorDataSubscriptionPUT(ctx context.Context, body StatusDataSubscriptionIdBody, subscriptionId string) ([]SensorDataSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Put")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorDataSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/queries/status_data/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorDataSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_discovery_lookup.go b/go-packages/meep-sss-client/api_sensor_discovery_lookup.go
new file mode 100644
index 0000000000000000000000000000000000000000..e75eaec81954744b7c9da0f998dce4d78a0186fb
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_discovery_lookup.go
@@ -0,0 +1,151 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"github.com/antihax/optional"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorDiscoveryLookupApiService service
+
+/*
+SensorDiscoveryLookupApiService The GET method is used to query the available sensors
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.3.3.1-1 and 7.3.3.1-2.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param optional nil or *SensorDiscoveryLookupApiSensorDiscoveryLookupGETOpts - Optional Parameters:
+     * @param "SensorInfo" (optional.Interface of SensorInfo) -  Object containing the characteristics of the sensor(s) to be selected for the query
+@return []SensorDiscoveryInfo
+*/
+
+type SensorDiscoveryLookupApiSensorDiscoveryLookupGETOpts struct {
+	SensorInfo optional.Interface
+}
+
+func (a *SensorDiscoveryLookupApiService) SensorDiscoveryLookupGET(ctx context.Context, localVarOptionals *SensorDiscoveryLookupApiSensorDiscoveryLookupGETOpts) ([]SensorDiscoveryInfo, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorDiscoveryInfo
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/queries/sensor_discovery"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	if localVarOptionals != nil && localVarOptionals.SensorInfo.IsSet() {
+		localVarQueryParams.Add("sensorInfo", parameterToString(localVarOptionals.SensorInfo.Value(), ""))
+	}
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorDiscoveryInfo
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_discovery_subscription.go b/go-packages/meep-sss-client/api_sensor_discovery_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..d7ba1d57ee6e9e9296f23db60472c2da9273bb88
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_discovery_subscription.go
@@ -0,0 +1,620 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"github.com/antihax/optional"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorDiscoverySubscriptionApiService service
+
+/*
+SensorDiscoverySubscriptionApiService The GET method is used to request information about the subscriptions related to sensor status for this requestor
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.7.3.1-1 and 7.7.3.1-2.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param subscriptionId Unique identifiers of the subscription
+@return []SubscriptionLinkList
+*/
+func (a *SensorDiscoverySubscriptionApiService) SensorDiscoveryIndividualSubscriptionGET(ctx context.Context, subscriptionId string) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_discovery/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDiscoverySubscriptionApiService The DELETE method is used to cancel the existing subscription. Cancellation can be made by deleting the resource that represents existing sensor discovery subscription
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.5.3.5-1 and 7.5.3.5-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param subscriptionId It uniquely identifies the created individual application mobility service
+@return []SubscriptionLinkList
+*/
+func (a *SensorDiscoverySubscriptionApiService) SensorDiscoverySubscriptionDELETE(ctx context.Context, subscriptionId string) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Delete")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_discovery/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 204 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDiscoverySubscriptionApiService The GET method is used to request information about the subscriptions related to sensor discovery for this requestor
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.4.3.1-1 and 7.4.3.1-2.
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param optional nil or *SensorDiscoverySubscriptionApiSensorDiscoverySubscriptionGETOpts - Optional Parameters:
+     * @param "SubscriptionId" (optional.String) -  Object containing the characteristics of the sensor(s) to be selected for the query
+@return []SubscriptionLinkList
+*/
+
+type SensorDiscoverySubscriptionApiSensorDiscoverySubscriptionGETOpts struct {
+	SubscriptionId optional.String
+}
+
+func (a *SensorDiscoverySubscriptionApiService) SensorDiscoverySubscriptionGET(ctx context.Context, localVarOptionals *SensorDiscoverySubscriptionApiSensorDiscoverySubscriptionGETOpts) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_discovery"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	if localVarOptionals != nil && localVarOptionals.SubscriptionId.IsSet() {
+		localVarQueryParams.Add("subscriptionId", parameterToString(localVarOptionals.SubscriptionId.Value(), ""))
+	}
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDiscoverySubscriptionApiService The POST method is used to create a new subscription to sensor discovery notifications
+This method shall support the request and response data structures, and response codes, as specified in Table 7.4.3.4-1
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body This type represents a subscription to notifications from the Sensor-sharing Service regarding events related to changes in sensor information
+@return []SensorDiscoveryEventSubscription
+*/
+func (a *SensorDiscoverySubscriptionApiService) SensorDiscoverySubscriptionPOST(ctx context.Context, body SubscriptionsSensorDiscoveryBody) ([]SensorDiscoveryEventSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Post")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorDiscoveryEventSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_discovery"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 201 {
+			var v []SensorDiscoveryEventSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorDiscoverySubscriptionApiService The POST method is used to create a new subscription to sensor discovery notifications
+This method shall support the request and response data structures, and response codes, as specified in Table 7.4.3.4-1
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body New SensorDiscoveryEventSubscription is included as entity body of the request
+ * @param subscriptionId It uniquely identifies the created individual application mobility service
+@return []SubscriptionLinkList
+*/
+func (a *SensorDiscoverySubscriptionApiService) SensorDiscoverySubscriptionPUT(ctx context.Context, body SensorDiscoverySubscriptionIdBody, subscriptionId string) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Put")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_discovery/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_management.go b/go-packages/meep-sss-client/api_sensor_management.go
new file mode 100644
index 0000000000000000000000000000000000000000..e4c3b44ec4eab7e7eb1e6d1f5f7fb0d898ff437d
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_management.go
@@ -0,0 +1,141 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorManagementApiService service
+
+/*
+SensorManagementApiService The GET method is used to receive the sensor characteristics that can be modified on specific sensors
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.12.3.1-1 and 7.12.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param sensorIdentifier It uniquely identifies the created individual application mobility service
+@return []SensorCharacteristic
+*/
+func (a *SensorManagementApiService) SensorMgmtGET(ctx context.Context, sensorIdentifier []string) ([]SensorCharacteristic, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorCharacteristic
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/sensor_management"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	localVarQueryParams.Add("sensorIdentifier", parameterToString(sensorIdentifier, "multi"))
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorCharacteristic
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_status_lookup.go b/go-packages/meep-sss-client/api_sensor_status_lookup.go
new file mode 100644
index 0000000000000000000000000000000000000000..126696357f2b5eac2258b2394e6d7f3f535da48e
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_status_lookup.go
@@ -0,0 +1,141 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorStatusLookupApiService service
+
+/*
+SensorStatusLookupApiService The GET method is used to query the available status
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.6.3.1-1 and 7.6.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param sensorIdentifier It uniquely identifies the created individual application mobility service
+@return []SensorStatusInfo
+*/
+func (a *SensorStatusLookupApiService) SensorStatusLookupGET(ctx context.Context, sensorIdentifier []string) ([]SensorStatusInfo, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorStatusInfo
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/queries/sensor_status"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	localVarQueryParams.Add("sensorIdentifier", parameterToString(sensorIdentifier, "multi"))
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorStatusInfo
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_sensor_status_subscription.go b/go-packages/meep-sss-client/api_sensor_status_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..704336348cf8af943606476b3d8b897065789e08
--- /dev/null
+++ b/go-packages/meep-sss-client/api_sensor_status_subscription.go
@@ -0,0 +1,503 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"github.com/antihax/optional"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type SensorStatusSubscriptionApiService service
+
+/*
+SensorStatusSubscriptionApiService The GET method is used to retrieve information about this subscription
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.8.3.1-1 and 7.8.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param subscriptionId Unique identifiers of the subscription
+@return []SensorStatusSubscription
+*/
+func (a *SensorStatusSubscriptionApiService) SensorStatusIndividualSubscriptionGET(ctx context.Context, subscriptionId string) ([]SensorStatusSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorStatusSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_status/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorStatusSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorStatusSubscriptionApiService The GET method is used to request information about the subscriptions related to sensor status for this requestor
+This method shall support the URI query parameter, request and response data structures, and response codes, as specified in Tables 7.7.3.1-1 and 7.7.3.1-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param optional nil or *SensorStatusSubscriptionApiSensorStatusIndividualSubscriptionGETOpts - Optional Parameters:
+     * @param "SensorIdentifier" (optional.Interface of []string) -  Unique identifiers of the sensors
+@return []SubscriptionLinkList
+*/
+
+type SensorStatusSubscriptionApiSensorStatusIndividualSubscriptionGETOpts struct {
+	SensorIdentifier optional.Interface
+}
+
+func (a *SensorStatusSubscriptionApiService) SensorStatusIndividualSubscriptionGET(ctx context.Context, localVarOptionals *SensorStatusSubscriptionApiSensorStatusIndividualSubscriptionGETOpts) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Get")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_status"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	if localVarOptionals != nil && localVarOptionals.SensorIdentifier.IsSet() {
+		localVarQueryParams.Add("sensorIdentifier", parameterToString(localVarOptionals.SensorIdentifier.Value(), "multi"))
+	}
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorStatusSubscriptionApiService The DELETE method is used to cancel the existing subscription
+This method shall support the request and response data structures, and response codes, as specified in Tables 7.8.3.5-1 and 7.8.3.5-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param subscriptionId It uniquely identifies a subscription
+@return []SubscriptionLinkList
+*/
+func (a *SensorStatusSubscriptionApiService) SensorStatusSubscriptionDELETE(ctx context.Context, subscriptionId string) ([]SubscriptionLinkList, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Delete")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SubscriptionLinkList
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_status/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 204 {
+			var v []SubscriptionLinkList
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
+
+/*
+SensorStatusSubscriptionApiService The PUT method is used to update the existing subscription
+This method shall support the URI query parameters, request and response data structures, and response codes, as specified in Tables 7.8.3.2-1 and 7.8.3.2-2
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body New SensorStatusSubscription is included as entity body of the request
+ * @param subscriptionId It uniquely identifies the created individual application mobility service
+@return []SensorStatusSubscription
+*/
+func (a *SensorStatusSubscriptionApiService) SensorStatusSubscriptionPUT(ctx context.Context, body SensorStatusSubscriptionIdBody, subscriptionId string) ([]SensorStatusSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Put")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorStatusSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_status/{subscriptionId}"
+	localVarPath = strings.Replace(localVarPath, "{"+"subscriptionId"+"}", fmt.Sprintf("%v", subscriptionId), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 200 {
+			var v []SensorStatusSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/api_status_status_subscription.go b/go-packages/meep-sss-client/api_status_status_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..267052987ab6f573b682e3b8166a8742323fa5f8
--- /dev/null
+++ b/go-packages/meep-sss-client/api_status_status_subscription.go
@@ -0,0 +1,142 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"context"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ context.Context
+)
+
+type StatusStatusSubscriptionApiService service
+
+/*
+StatusStatusSubscriptionApiService The POST method is used to create a new subscription to sensor status notifications
+This method shall support the request and response data structures, and response codes, as specified in Table 7.7.3.4-1
+ * @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param body The entity body in the request contains data type of the specific sensor status subscription that is to be created
+@return []SensorStatusSubscription
+*/
+func (a *StatusStatusSubscriptionApiService) SensorStatusSubscriptionPOST(ctx context.Context, body SubscriptionsSensorStatusBody) ([]SensorStatusSubscription, *http.Response, error) {
+	var (
+		localVarHttpMethod  = strings.ToUpper("Post")
+		localVarPostBody    interface{}
+		localVarFileName    string
+		localVarFileBytes   []byte
+		localVarReturnValue []SensorStatusSubscription
+	)
+
+	// create path and map variables
+	localVarPath := a.client.cfg.BasePath + "/subscriptions/sensor_status"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := url.Values{}
+	localVarFormParams := url.Values{}
+
+	// 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", "application/problem+json"}
+
+	// set Accept header
+	localVarHttpHeaderAccept := selectHeaderAccept(localVarHttpHeaderAccepts)
+	if localVarHttpHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
+	}
+	// body params
+	localVarPostBody = &body
+	r, err := a.client.prepareRequest(ctx, localVarPath, localVarHttpMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHttpResponse, err := a.client.callAPI(r)
+	if err != nil || localVarHttpResponse == nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	localVarBody, err := ioutil.ReadAll(localVarHttpResponse.Body)
+	localVarHttpResponse.Body.Close()
+	if err != nil {
+		return localVarReturnValue, localVarHttpResponse, err
+	}
+
+	if localVarHttpResponse.StatusCode < 300 {
+		// If we succeed, return the data, otherwise pass on to decode error.
+		err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+		if err == nil {
+			return localVarReturnValue, localVarHttpResponse, err
+		}
+	}
+
+	if localVarHttpResponse.StatusCode >= 300 {
+		newErr := GenericSwaggerError{
+			body:  localVarBody,
+			error: localVarHttpResponse.Status,
+		}
+		if localVarHttpResponse.StatusCode == 201 {
+			var v []SensorStatusSubscription
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 400 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 403 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		if localVarHttpResponse.StatusCode == 404 {
+			var v ProblemDetails
+			err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHttpResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHttpResponse, newErr
+		}
+		return localVarReturnValue, localVarHttpResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHttpResponse, nil
+}
diff --git a/go-packages/meep-sss-client/client.go b/go-packages/meep-sss-client/client.go
new file mode 100644
index 0000000000000000000000000000000000000000..a5f8f0729ce27a21fd5d657f640a54109601f981
--- /dev/null
+++ b/go-packages/meep-sss-client/client.go
@@ -0,0 +1,498 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"encoding/xml"
+	"errors"
+	"fmt"
+	"io"
+	"mime/multipart"
+	"net/http"
+	"net/url"
+	"os"
+	"path/filepath"
+	"reflect"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+	"unicode/utf8"
+
+	"golang.org/x/oauth2"
+)
+
+var (
+	jsonCheck = regexp.MustCompile("(?i:[application|text]/json)")
+	xmlCheck  = regexp.MustCompile("(?i:[application|text]/xml)")
+)
+
+// APIClient manages communication with the ETSI GS MEC 046 Sensors Sharing Service APIs API v3.1.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
+
+	ManagementnApi *ManagementnApiService
+
+	SensorDataLookupApi *SensorDataLookupApiService
+
+	SensorDataSubscriptionApi *SensorDataSubscriptionApiService
+
+	SensorDiscoveryLookupApi *SensorDiscoveryLookupApiService
+
+	SensorDiscoverySubscriptionApi *SensorDiscoverySubscriptionApiService
+
+	SensorManagementApi *SensorManagementApiService
+
+	SensorStatusLookupApi *SensorStatusLookupApiService
+
+	SensorStatusSubscriptionApi *SensorStatusSubscriptionApiService
+
+	StatusStatusSubscriptionApi *StatusStatusSubscriptionApiService
+}
+
+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.ManagementnApi = (*ManagementnApiService)(&c.common)
+	c.SensorDataLookupApi = (*SensorDataLookupApiService)(&c.common)
+	c.SensorDataSubscriptionApi = (*SensorDataSubscriptionApiService)(&c.common)
+	c.SensorDiscoveryLookupApi = (*SensorDiscoveryLookupApiService)(&c.common)
+	c.SensorDiscoverySubscriptionApi = (*SensorDiscoverySubscriptionApiService)(&c.common)
+	c.SensorManagementApi = (*SensorManagementApiService)(&c.common)
+	c.SensorStatusLookupApi = (*SensorStatusLookupApiService)(&c.common)
+	c.SensorStatusSubscriptionApi = (*SensorStatusSubscriptionApiService)(&c.common)
+	c.StatusStatusSubscriptionApi = (*StatusStatusSubscriptionApiService)(&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 insenstive match, finding needle in a haystack
+func contains(haystack []string, needle string) bool {
+	for _, a := range haystack {
+		if strings.ToLower(a) == strings.ToLower(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
+}
+
+// parameterToString convert interface{} parameters to string, using a delimiter if format is provided.
+func parameterToString(obj interface{}, collectionFormat string) string {
+	var delimiter string
+
+	switch collectionFormat {
+	case "pipes":
+		delimiter = "|"
+	case "ssv":
+		delimiter = " "
+	case "tsv":
+		delimiter = "\t"
+	case "csv":
+		delimiter = ","
+	}
+
+	if reflect.TypeOf(obj).Kind() == reflect.Slice {
+		return strings.Trim(strings.Replace(fmt.Sprint(obj), " ", delimiter, -1), "[]")
+	}
+
+	return fmt.Sprintf("%v", obj)
+}
+
+// callAPI do the request.
+func (c *APIClient) callAPI(request *http.Request) (*http.Response, error) {
+	return c.cfg.HTTPClient.Do(request)
+}
+
+// Change base path to allow switching to mocks
+func (c *APIClient) ChangeBasePath(path string) {
+	c.cfg.BasePath = path
+}
+
+// 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,
+	fileName string,
+	fileBytes []byte) (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(fileBytes) > 0 && fileName != "") {
+		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)
+				}
+			}
+		}
+		if len(fileBytes) > 0 && fileName != "" {
+			w.Boundary()
+			//_, fileNm := filepath.Split(fileName)
+			part, err := w.CreateFormFile("file", filepath.Base(fileName))
+			if err != nil {
+				return nil, err
+			}
+			_, err = part.Write(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
+	}
+
+	// Adding Query Param
+	query := url.Query()
+	for k, v := range queryParams {
+		for _, iv := range v {
+			query.Add(k, iv)
+		}
+	}
+
+	// Encode the parameters.
+	url.RawQuery = query.Encode()
+
+	// 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.Set(h, v)
+		}
+		localVarRequest.Header = headers
+	}
+
+	// Override request host, if applicable
+	if c.cfg.Host != "" {
+		localVarRequest.Host = c.cfg.Host
+	}
+
+	// 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.
+
+		// OAuth2 authentication
+		if tok, ok := ctx.Value(ContextOAuth2).(oauth2.TokenSource); ok {
+			// We were able to grab an oauth2 token from the context
+			var latestToken *oauth2.Token
+			if latestToken, err = tok.Token(); err != nil {
+				return nil, err
+			}
+
+			latestToken.SetAuthHeader(localVarRequest)
+		}
+
+		// Basic HTTP Authentication
+		if auth, ok := ctx.Value(ContextBasicAuth).(BasicAuth); ok {
+			localVarRequest.SetBasicAuth(auth.UserName, auth.Password)
+		}
+
+		// AccessToken Authentication
+		if auth, ok := ctx.Value(ContextAccessToken).(string); ok {
+			localVarRequest.Header.Add("Authorization", "Bearer "+auth)
+		}
+	}
+
+	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 strings.Contains(contentType, "application/xml") {
+		if err = xml.Unmarshal(b, v); err != nil {
+			return err
+		}
+		return nil
+	} else if strings.Contains(contentType, "application/json") {
+		if err = json.Unmarshal(b, v); err != nil {
+			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(path)
+	if err != nil {
+		return err
+	}
+	defer file.Close()
+
+	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...)
+}
+
+// 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 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) {
+		xml.NewEncoder(bodyBuf).Encode(body)
+	}
+
+	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
+		}
+		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)
+}
+
+// GenericSwaggerError Provides access to the body, error and model on returned errors.
+type GenericSwaggerError struct {
+	body  []byte
+	error string
+	model interface{}
+}
+
+// Error returns non-empty string if there was an error.
+func (e GenericSwaggerError) Error() string {
+	return e.error
+}
+
+// Body returns the raw bytes of the response
+func (e GenericSwaggerError) Body() []byte {
+	return e.body
+}
+
+// Model returns the unpacked model of the error
+func (e GenericSwaggerError) Model() interface{} {
+	return e.model
+}
diff --git a/go-packages/meep-sss-client/configuration.go b/go-packages/meep-sss-client/configuration.go
new file mode 100644
index 0000000000000000000000000000000000000000..4ff6e04da0e24735f4b6363c9e3060581e252ca8
--- /dev/null
+++ b/go-packages/meep-sss-client/configuration.go
@@ -0,0 +1,72 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"net/http"
+)
+
+// 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 (
+	// ContextOAuth2 takes a oauth2.TokenSource as authentication for the request.
+	ContextOAuth2 = contextKey("token")
+
+	// ContextBasicAuth takes BasicAuth as authentication for the request.
+	ContextBasicAuth = contextKey("basic")
+
+	// ContextAccessToken takes a string oauth2 access token as authentication for the request.
+	ContextAccessToken = contextKey("accesstoken")
+
+	// ContextAPIKey takes an APIKey as authentication for the request
+	ContextAPIKey = contextKey("apikey")
+)
+
+// 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
+}
+
+type Configuration struct {
+	BasePath      string            `json:"basePath,omitempty"`
+	Host          string            `json:"host,omitempty"`
+	Scheme        string            `json:"scheme,omitempty"`
+	DefaultHeader map[string]string `json:"defaultHeader,omitempty"`
+	UserAgent     string            `json:"userAgent,omitempty"`
+	HTTPClient    *http.Client
+}
+
+func NewConfiguration() *Configuration {
+	cfg := &Configuration{
+		BasePath:      "https://localhost/sandboxname/sens/v1",
+		DefaultHeader: make(map[string]string),
+		UserAgent:     "Swagger-Codegen/1.0.0/go",
+	}
+	return cfg
+}
+
+func (c *Configuration) AddDefaultHeader(key string, value string) {
+	c.DefaultHeader[key] = value
+}
diff --git a/go-packages/meep-sss-client/git_push.sh b/go-packages/meep-sss-client/git_push.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ae01b182ae9eb047d0999a496b060e62d7b01e5c
--- /dev/null
+++ b/go-packages/meep-sss-client/git_push.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+    git_user_id="GIT_USER_ID"
+    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+    git_repo_id="GIT_REPO_ID"
+    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+    release_note="Minor update"
+    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository. 
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+    if [ "$GIT_TOKEN" = "" ]; then
+        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+        git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+    else
+        git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+    fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/go-packages/meep-sss-client/go.mod b/go-packages/meep-sss-client/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..c8839ed1bc6c5ea9bc1b4503f33a7009e66ac140
--- /dev/null
+++ b/go-packages/meep-sss-client/go.mod
@@ -0,0 +1,8 @@
+module github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-client
+
+go 1.16
+
+require (
+	github.com/antihax/optional v1.0.0
+	golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
+)
diff --git a/go-packages/meep-sss-client/go.sum b/go-packages/meep-sss-client/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..aafb344a88e584026c4ef64175c1fde271fe58ec
--- /dev/null
+++ b/go-packages/meep-sss-client/go.sum
@@ -0,0 +1,369 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/go-packages/meep-sss-client/model_area_info.go b/go-packages/meep-sss-client/model_area_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..f7d1a9ebee0850b0ec1c3dc03ad542ecb948a459
--- /dev/null
+++ b/go-packages/meep-sss-client/model_area_info.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type AreaInfo struct {
+	Shape *ShapeType `json:"shape"`
+	// Shall include one point if the shape is CIRCLE. Shall include 3-15 points if the shape is POLYGON
+	Points []Point `json:"points"`
+	// Shall be present if the shape is CIRCLE
+	Radius int32 `json:"radius,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_link_type.go b/go-packages/meep-sss-client/model_link_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..c64f4b286e93b8e5c8d325b34bff58170cf19e74
--- /dev/null
+++ b/go-packages/meep-sss-client/model_link_type.go
@@ -0,0 +1,16 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// 'This data type represents a type of link'
+type LinkType struct {
+	// The URI referring to the subscription.
+	Href string `json:"href"`
+}
diff --git a/go-packages/meep-sss-client/model_point.go b/go-packages/meep-sss-client/model_point.go
new file mode 100644
index 0000000000000000000000000000000000000000..bb22431ad1283ec09a268ee6b53dfd5ad8abae69
--- /dev/null
+++ b/go-packages/meep-sss-client/model_point.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// This type represents the geographical location of a point
+type Point struct {
+	// Location latitude, expressed in the range -90° to +90°
+	Latitude float64 `json:"latitude"`
+	// Location longitude, expressed in the range -180° to +180°.
+	Longitude float64 `json:"longitude"`
+}
diff --git a/go-packages/meep-sss-client/model_problem_details.go b/go-packages/meep-sss-client/model_problem_details.go
new file mode 100644
index 0000000000000000000000000000000000000000..b2fd68608b640b54f78bc1ea6723db9a987901b6
--- /dev/null
+++ b/go-packages/meep-sss-client/model_problem_details.go
@@ -0,0 +1,23 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type ProblemDetails struct {
+	// A URI reference according to IETF RFC 3986 that identifies the problem type
+	Type_ string `json:"type,omitempty"`
+	// A short, human-readable summary of the problem type
+	Title string `json:"title,omitempty"`
+	// The HTTP status code for this occurrence of the problem
+	Status int32 `json:"status,omitempty"`
+	// A human-readable explanation specific to this occurrence of the problem
+	Detail string `json:"detail,omitempty"`
+	// A URI reference that identifies the specific occurrence of the problem
+	Instance string `json:"instance,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_characteristic.go b/go-packages/meep-sss-client/model_sensor_characteristic.go
new file mode 100644
index 0000000000000000000000000000000000000000..6302a68e8e40cc6fff8b13c150bbe2bd3e5440a4
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_characteristic.go
@@ -0,0 +1,20 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// This type represents a sensor' characteristic which details the type of sensor and its working functionalities, such as the model of the sensor, the sampling frequency, the operating range, the accuracy
+type SensorCharacteristic struct {
+	// The name of the characteristic
+	CharacteristicName string `json:"characteristicName"`
+	// The value of the characteristic.
+	CharacteristicValue string `json:"characteristicValue"`
+	// The unit of measure of the characteristic (see saref:UnitOfMeasure in ETSI TS 103 264 [4], clause 4.3.8).
+	CharacteristicUnitOfMeasure string `json:"characteristicUnitOfMeasure,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_data.go b/go-packages/meep-sss-client/model_sensor_data.go
new file mode 100644
index 0000000000000000000000000000000000000000..f47a171ceecd3639826649c88b38a892146c6055
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_data.go
@@ -0,0 +1,22 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorData struct {
+	// Unique identifier of the sensor
+	SensorIdentifier string `json:"sensorIdentifier"`
+	// The status of the sensor
+	Data string `json:"data"`
+	// String explaining the error of the sensor
+	DataFormat string `json:"dataFormat"`
+	// String explaining the error of the sensor
+	DataUnitOfMeasure string     `json:"dataUnitOfMeasure"`
+	DataTimestamp     *TimeStamp `json:"dataTimestamp,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_data_subscription.go b/go-packages/meep-sss-client/model_sensor_data_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..793031433f590fef2b0742550524f02510ed87ff
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_data_subscription.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorDataSubscription struct {
+	SubscriptionType *SubscriptionType `json:"subscriptionType"`
+	// URI exposed by the client on which to receive notifications via HTTP
+	CallbackReference string `json:"callbackReference,omitempty"`
+	// Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI,
+	RequestTestNotification bool                `json:"requestTestNotification,omitempty"`
+	WebsockNotifConfig      *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+	Links                   *SubscriptionLinks  `json:"_links,omitempty"`
+	ExpiryDeadline          *TimeStamp          `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_discovery_event_subscription.go b/go-packages/meep-sss-client/model_sensor_discovery_event_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..0f8e04c00f676e488fed7c8c953f70937cfb0239
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_discovery_event_subscription.go
@@ -0,0 +1,25 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorDiscoveryEventSubscription struct {
+	SubscriptionType *SubscriptionType `json:"subscriptionType"`
+	// URI exposed by the client on which to receive notifications via HTTP
+	CallbackReference string `json:"callbackReference,omitempty"`
+	// Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI,
+	RequestTestNotification bool                `json:"requestTestNotification,omitempty"`
+	WebsockNotifConfig      *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+	Links                   *SubscriptionLinks  `json:"_links,omitempty"`
+	// Object containing the characteristics of the sensor(s) to be selected for the subscription
+	SensorInfoList []string `json:"sensorInfoList,omitempty"`
+	// The parameters describing the area to subscribe
+	GeographicalArea []AreaInfo `json:"geographicalArea,omitempty"`
+	ExpiryDeadline   *TimeStamp `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_discovery_info.go b/go-packages/meep-sss-client/model_sensor_discovery_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..fbad019bbd8e3360ec4fc9b26f2aeb98db0b8ddc
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_discovery_info.go
@@ -0,0 +1,22 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorDiscoveryInfo struct {
+	// Unique identifier of the sensor
+	SensorIdentifier string `json:"sensorIdentifier"`
+	// Type of the Sensor
+	SensorType string `json:"sensorType"`
+	// It indicates the list of properties that the sensor can sense
+	SensorPropertyList []string `json:"sensorPropertyList"`
+	// The sensor' characteristics
+	SensorCharacteristicList []SensorCharacteristic `json:"sensorCharacteristicList,omitempty"`
+	SensorPosition           *Point                 `json:"sensorPosition,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_discovery_subscription_id_body.go b/go-packages/meep-sss-client/model_sensor_discovery_subscription_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..a3a974a83689c6b5b11e395a330d6bead29e3a35
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_discovery_subscription_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorDiscoverySubscriptionIdBody struct {
+	SensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription `json:"SensorDiscoveryEventSubscription,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_info.go b/go-packages/meep-sss-client/model_sensor_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..ab9a8a980bc6a06991307afa2f3f8c879b1156e6
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_info.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorInfo struct {
+	// Type of the sensor
+	Type_ string `json:"type"`
+	// It indicates the list of properties that the sensor can sense (see saref:Property in ETSI TS 103 264 [4], clause 4.3.8).
+	SensorPropertyList []string `json:"sensorPropertyList"`
+	// The sensor' characteristics to be matched
+	SensorCharacteristicList []SensorCharacteristic `json:"sensorCharacteristicList,omitempty"`
+	// The parameters describing the area
+	GeographicalArea []AreaInfo `json:"geographicalArea,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_status_info.go b/go-packages/meep-sss-client/model_sensor_status_info.go
new file mode 100644
index 0000000000000000000000000000000000000000..8ca1c4504279c6f9ff4ffa2ee084594aa4d53cd0
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_status_info.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorStatusInfo struct {
+	// Unique identifier of the sensor
+	SensorIdentifier string `json:"sensorIdentifier"`
+	// The status of the sensor
+	SensorStatusType string `json:"sensorStatusType"`
+	// String explaining the error of the sensor
+	ErrorInformation string `json:"errorInformation,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_status_subscription.go b/go-packages/meep-sss-client/model_sensor_status_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..ea212d1442838019092758a34e3eb85a1f515604
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_status_subscription.go
@@ -0,0 +1,21 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorStatusSubscription struct {
+	SubscriptionType *SubscriptionType `json:"subscriptionType"`
+	// URI exposed by the client on which to receive notifications via HTTP
+	CallbackReference string `json:"callbackReference,omitempty"`
+	// Set to TRUE by the MEC application to request a test notification via HTTP on the callbackReference URI,
+	RequestTestNotification bool                `json:"requestTestNotification,omitempty"`
+	WebsockNotifConfig      *WebsockNotifConfig `json:"websockNotifConfig,omitempty"`
+	Links                   *SubscriptionLinks  `json:"_links,omitempty"`
+	ExpiryDeadline          *TimeStamp          `json:"expiryDeadline,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_sensor_status_subscription_id_body.go b/go-packages/meep-sss-client/model_sensor_status_subscription_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..8faaf03ed89b6d56bb87329b998e3545e5c698b1
--- /dev/null
+++ b/go-packages/meep-sss-client/model_sensor_status_subscription_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SensorStatusSubscriptionIdBody struct {
+	SensorStatusSubscription *SensorStatusSubscription `json:"SensorStatusSubscription,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_shape_type.go b/go-packages/meep-sss-client/model_shape_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..b04612db42929422b6a07d7636cf767191c3a3d8
--- /dev/null
+++ b/go-packages/meep-sss-client/model_shape_type.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type ShapeType int32
+
+// List of ShapeType
+const (
+	NULL_ShapeType ShapeType = ""
+	NULL_ShapeType ShapeType = ""
+)
diff --git a/go-packages/meep-sss-client/model_status_data_subscription_id_body.go b/go-packages/meep-sss-client/model_status_data_subscription_id_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..0b09d725c28b1300586e7ff603315696f0f8cfa3
--- /dev/null
+++ b/go-packages/meep-sss-client/model_status_data_subscription_id_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type StatusDataSubscriptionIdBody struct {
+	SensorStatusSubscription *SensorDataSubscription `json:"SensorStatusSubscription,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_subscription_link_list.go b/go-packages/meep-sss-client/model_subscription_link_list.go
new file mode 100644
index 0000000000000000000000000000000000000000..66f1eed19cdc897437ff873dac1129bb2d57c13f
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscription_link_list.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionLinkList struct {
+	Links *SubscriptionLinkListLinks `json:"_links"`
+}
diff --git a/go-packages/meep-sss-client/model_subscription_link_list_links.go b/go-packages/meep-sss-client/model_subscription_link_list_links.go
new file mode 100644
index 0000000000000000000000000000000000000000..28469f3e232b245649d3a1ec834a7758971410e2
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscription_link_list_links.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// List of hyperlinks related to the resource.
+type SubscriptionLinkListLinks struct {
+	Self *LinkType `json:"self"`
+	// The MEC application's subscriptions
+	Subscriptions []SubscriptionLinkListSubscription `json:"subscriptions,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_subscription_link_list_subscription.go b/go-packages/meep-sss-client/model_subscription_link_list_subscription.go
new file mode 100644
index 0000000000000000000000000000000000000000..63b70ad7d1b4c6a48399d5527b16db38f490612b
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscription_link_list_subscription.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionLinkListSubscription struct {
+	// The URI referring to the subscription
+	Href string `json:"href"`
+	// Type of the subscription
+	SubscriptionType string `json:"subscriptionType"`
+}
diff --git a/go-packages/meep-sss-client/model_subscription_links.go b/go-packages/meep-sss-client/model_subscription_links.go
new file mode 100644
index 0000000000000000000000000000000000000000..b67e512a2b44b76da8c43fb39cfbb1fa3565ebab
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscription_links.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionLinks struct {
+	Self *LinkType `json:"self"`
+}
diff --git a/go-packages/meep-sss-client/model_subscription_type.go b/go-packages/meep-sss-client/model_subscription_type.go
new file mode 100644
index 0000000000000000000000000000000000000000..dc6bf57877be09e8afd5dba6231482127f9178d4
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscription_type.go
@@ -0,0 +1,19 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionType string
+
+// List of SubscriptionType
+const (
+	SENSOR_DISCOVERY_EVENT_SUBSCRIPTION_SubscriptionType SubscriptionType = "SensorDiscoveryEventSubscription"
+	SENSOR_STATUS_SUBSCRIPTION_SubscriptionType          SubscriptionType = "SensorStatusSubscription"
+	SENSOR_DATA_SUBSCRIPTION_SubscriptionType            SubscriptionType = "SensorDataSubscription"
+)
diff --git a/go-packages/meep-sss-client/model_subscriptions_sensor_data_body.go b/go-packages/meep-sss-client/model_subscriptions_sensor_data_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..9a180635c613cee28389e3d14618f1e86e2eeb11
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscriptions_sensor_data_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionsSensorDataBody struct {
+	SensorDataSubscription *SensorDataSubscription `json:"SensorDataSubscription,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_subscriptions_sensor_discovery_body.go b/go-packages/meep-sss-client/model_subscriptions_sensor_discovery_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..b7ab405f5e8adbb5c6f6447113207d1c7673dad2
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscriptions_sensor_discovery_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionsSensorDiscoveryBody struct {
+	SensorDiscoveryEventSubscription *SensorDiscoveryEventSubscription `json:"SensorDiscoveryEventSubscription,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_subscriptions_sensor_status_body.go b/go-packages/meep-sss-client/model_subscriptions_sensor_status_body.go
new file mode 100644
index 0000000000000000000000000000000000000000..4ea045f9eb37a69562ca38be2fb8067112d4e324
--- /dev/null
+++ b/go-packages/meep-sss-client/model_subscriptions_sensor_status_body.go
@@ -0,0 +1,14 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type SubscriptionsSensorStatusBody struct {
+	SensorStatusSubscription *SensorStatusSubscription `json:"SensorStatusSubscription,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/model_time_stamp.go b/go-packages/meep-sss-client/model_time_stamp.go
new file mode 100644
index 0000000000000000000000000000000000000000..036a269a4754dcce2c28f1b7743bf4489a672d63
--- /dev/null
+++ b/go-packages/meep-sss-client/model_time_stamp.go
@@ -0,0 +1,18 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+// 'This data type represents the time stamp as Unix-time since January 1, 1970, 00:00:00 UTC'
+type TimeStamp struct {
+	// 'The seconds part of the Time. Time is defined as Unix-time since January 1, 1970, 00:00:00 UTC.'
+	Seconds int32 `json:"seconds"`
+	// 'The nanoseconds part of the Time. Time is defined as Unix-time since January 1, 1970, 00:00:00 UTC.'
+	NanoSeconds int32 `json:"nanoSeconds"`
+}
diff --git a/go-packages/meep-sss-client/model_websock_notif_config.go b/go-packages/meep-sss-client/model_websock_notif_config.go
new file mode 100644
index 0000000000000000000000000000000000000000..3b4ee4518ef958f85d60a4bc829a69d326d2f748
--- /dev/null
+++ b/go-packages/meep-sss-client/model_websock_notif_config.go
@@ -0,0 +1,17 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+type WebsockNotifConfig struct {
+	// Set by AMS to indicate to the service consumer the Websocket URI to be used for delivering notifications.
+	WebsocketUri string `json:"websocketUri,omitempty"`
+	// Set to true by the service consumer to indicate that Websocket delivery is requested.
+	RequestWebsocketUri bool `json:"requestWebsocketUri,omitempty"`
+}
diff --git a/go-packages/meep-sss-client/response.go b/go-packages/meep-sss-client/response.go
new file mode 100644
index 0000000000000000000000000000000000000000..6cd536b2cc328aba412f2e2b9b93e8c30a4753ce
--- /dev/null
+++ b/go-packages/meep-sss-client/response.go
@@ -0,0 +1,43 @@
+/*
+ * ETSI GS MEC 046 Sensors Sharing Service APIs
+ *
+ * GS MEC 046 Sensors Sharing Service APIs described using OpenAPI.
+ *
+ * API version: 3.1.1
+ * Contact: cti_support@etsi.org
+ * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
+ */
+package client
+
+import (
+	"net/http"
+)
+
+type APIResponse struct {
+	*http.Response `json:"-"`
+	Message        string `json:"message,omitempty"`
+	// Operation is the name of the swagger 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:"-"`
+}
+
+func NewAPIResponse(r *http.Response) *APIResponse {
+
+	response := &APIResponse{Response: r}
+	return response
+}
+
+func NewAPIResponseWithError(errorMessage string) *APIResponse {
+
+	response := &APIResponse{Message: errorMessage}
+	return response
+}
diff --git a/go-packages/meep-sss-mgr/.gitignore b/go-packages/meep-sss-mgr/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..739ff46590540ad860b48535770503a5af9d0202
--- /dev/null
+++ b/go-packages/meep-sss-mgr/.gitignore
@@ -0,0 +1 @@
+grid_map.yaml
diff --git a/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go b/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go
new file mode 100644
index 0000000000000000000000000000000000000000..86f4481c2eaf83f92c85f3fab8a0510b216bef4f
--- /dev/null
+++ b/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go
@@ -0,0 +1,27 @@
+package sssmgr
+
+type SssMgrBindingProtocol interface {
+	init(tm *SssMgr, notify func(map[string]interface{})) (err error)
+	send(p_ctx SssMgrBindingProtocolContext) (err error, resp interface{})
+	uninit() (err error)
+}
+
+type SssMgrBindingProtocolContext struct {
+	host    string
+	port    int
+	name    string
+	to      string
+	from    string
+	op      int
+	ty      int
+	rqi     string
+	rvi     []string
+	queries map[string]string
+	body    map[string]map[string]interface{}
+	code    int
+}
+
+/**
+TS-0001 V4.22 Table 9.6.2.3-1: Types of parameters in accessControlOperations
+TS-0004 V4.22 Table 6.3.4.2.5 1: Interpretation of m2m:operation
+**/
diff --git a/go-packages/meep-sss-mgr/go.mod b/go-packages/meep-sss-mgr/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..59f0675ff13db692acfccffcc99e8a3bf0b06bd0
--- /dev/null
+++ b/go-packages/meep-sss-mgr/go.mod
@@ -0,0 +1,17 @@
+module github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sss-mgr
+
+go 1.16
+
+require (
+	github.com/BurntSushi/toml v1.2.0 // indirect
+	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
+	github.com/eclipse/paho.mqtt.golang v1.4.2
+	github.com/google/uuid v1.6.0
+	github.com/gorilla/mux v1.8.1
+	github.com/lib/pq v1.10.7
+	github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3
+	github.com/streadway/amqp v1.1.0
+
+)
+
+replace github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger
diff --git a/go-packages/meep-sss-mgr/go.sum b/go-packages/meep-sss-mgr/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..6285c5a4a04f396c68dbaa04b0190eda89fe193d
--- /dev/null
+++ b/go-packages/meep-sss-mgr/go.sum
@@ -0,0 +1,455 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4=
+github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
+github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik=
+github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3 h1:lBNvYUFo7d4fHs8BXUmoTzbdUo4usq6PlP5qn894sGA=
+github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3/go.mod h1:jo59Sv6xirZtbxbaZbCtrQd1CSufmcxJZIC8hm2tepw=
+github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM=
+github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U=
+golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
+golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/go-packages/meep-sss-mgr/http.go b/go-packages/meep-sss-mgr/http.go
new file mode 100644
index 0000000000000000000000000000000000000000..ce9fcc5f11d5003d99c856b3629a72257b29dd46
--- /dev/null
+++ b/go-packages/meep-sss-mgr/http.go
@@ -0,0 +1,210 @@
+package sssmgr
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"reflect"
+	"strconv"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	"github.com/gorilla/mux"
+)
+
+type SssMgrHttp struct {
+	notify func(map[string]interface{})
+}
+
+const (
+	headerAccept      = "application/json"
+	headerContentType = "application/json"
+)
+
+func NewSssMgrHttp() (http_mgr *SssMgrHttp) {
+	log.Info(">>> NewSssMgrHttp")
+	return new(SssMgrHttp)
+}
+
+func (http_mgr *SssMgrHttp) init(tm *SssMgr, notify func(map[string]interface{})) (err error) {
+	log.Info(">>> init")
+
+	http_mgr.notify = notify
+
+	go func() {
+		log.Info("Init: Starting OneM2M Notification server")
+		http.HandleFunc("/", http_mgr.handleRoot)
+		err := http.ListenAndServe(":31122", nil)
+		if err != nil {
+			log.Error(err.Error())
+			return
+		}
+		log.Info("<<< Init: Terminating OneM2M Notification server")
+	}()
+
+	return nil
+}
+
+func (http_mgr *SssMgrHttp) handleRoot(w http.ResponseWriter, r *http.Request) {
+	log.Debug(">>> handleRoot: ", r)
+
+	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
+
+	// Get URL
+	u, _ := url.Parse(r.URL.String())
+	log.Info("url: ", u.RequestURI())
+
+	if r.Method == "POST" { // Notification
+		// Extract body
+		bodyBytes, _ := ioutil.ReadAll(r.Body)
+		log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes))
+		var body map[string]map[string]interface{}
+		err := json.Unmarshal(bodyBytes, &body)
+		if err != nil {
+			log.Error(err.Error())
+			w.WriteHeader(http.StatusInternalServerError)
+			fmt.Fprint(w, err.Error())
+			return
+		}
+		log.Info("handleRoot: body: ", body)
+		//map[m2m:sgn:map[nev:map[net:3 rep:map[m2m:cnt:map[cbs:0 cni:0 ct:20250327T111057,824274 et:20300326T111032,133324 lt:20250327T111057,824274 mbs:10000 mni:10 pi:C7feaadbb0400 ri:cnt8465776292050557472 rn:test st:0 ty:3]]] sur:/laboai-acme-ic-cse/sub3916638126520907910]]
+		if _, ok := body["m2m:sgn"]; !ok {
+			err := errors.New("Only m2m:sgn is expected")
+			log.Error(err.Error())
+			w.WriteHeader(http.StatusBadRequest)
+			fmt.Fprint(w, err.Error())
+			return
+		}
+		// Call callback
+		m := body["m2m:sgn"]
+		log.Info("handleRoot: m: ", m)
+		if http_mgr.notify != nil {
+			http_mgr.notify(m)
+		}
+	} else {
+		log.Warn("handleRoot: Unsupported method", r.Method)
+		w.WriteHeader(http.StatusNotImplemented)
+		return
+	}
+
+	w.WriteHeader(http.StatusOK)
+}
+
+func (http_mgr *SssMgrHttp) uninit() (err error) {
+	log.Info(">>> uninit")
+
+	return nil
+}
+
+func (http_mgr *SssMgrHttp) send(p_ctx SssMgrBindingProtocolContext) (err error, resp interface{}) {
+	log.Info(">>> send: ", p_ctx)
+
+	// Build the headers
+	var headers = http.Header{}
+	headers["Accept"] = []string{headerAccept}
+	headers["X-M2M-Origin"] = []string{"C" + p_ctx.from}
+	headers["X-M2M-RI"] = []string{p_ctx.rqi}
+	headers["X-M2M-RVI"] = p_ctx.rvi
+	s := headerContentType
+	if p_ctx.ty != -1 {
+		s = s + ";ty=" + strconv.Itoa(p_ctx.ty)
+	}
+	headers["Content-Type"] = []string{s}
+	// Build the url
+	url := "http://" + p_ctx.host + ":" + strconv.Itoa(p_ctx.port) + "/" + p_ctx.to
+	// Set the method
+	method := ""
+	if p_ctx.op == 1 {
+		method = "POST"
+	} else if p_ctx.op == 2 {
+		method = "GET"
+	} else if p_ctx.op == 3 {
+		method = "PATCH"
+	} else if p_ctx.op == 4 {
+		method = "DELETE"
+	} else {
+		err := errors.New("Invalid p_ctx.op")
+		log.Error("send: ", err.Error())
+		return err, nil
+	}
+	// Finalize the body
+	log.Debug("send: url=", url)
+	var response []byte
+	if p_ctx.body != nil { // With body
+		log.Debug("send: p_ctx.body=", p_ctx.body)
+		body, err := json.Marshal(p_ctx.body)
+		if err != nil {
+			log.Error("send: ", err.Error())
+			return err, nil
+		}
+		log.Debug("send: Request body: ", string(body))
+		response, err = sendRequest(method, url, headers, bytes.NewBuffer(body), nil, p_ctx.queries, 201)
+		if err != nil {
+			log.Error("send: ", err.Error())
+			return err, nil
+		}
+	} else { // Without body
+		response, err = sendRequest(method, url, headers, nil, nil, p_ctx.queries, p_ctx.code)
+		if err != nil {
+			log.Error("send: ", err.Error())
+			return err, nil
+		}
+	}
+	log.Debug("send: response: ", string(response))
+	if len(response) != 0 {
+		err = json.Unmarshal(response, &resp)
+		if err != nil {
+			log.Error("send: ", err.Error())
+			return err, nil
+		}
+		log.Debug("send: response: ", resp)
+		log.Debug("send: TypeOf(response): ", reflect.TypeOf(resp))
+	}
+
+	return nil, resp
+}
+func sendRequest(method string, url string, headers http.Header, body io.Reader, vars map[string]string, query map[string]string, code int) ([]byte, error) {
+	//log.Debug(">>> sendRequest: url: ", url)
+	//log.Debug(">>> sendRequest: headers: ", headers)
+
+	req, err := http.NewRequest(method, url, body)
+	if err != nil || req == nil {
+		return nil, err
+	}
+	if vars != nil {
+		req = mux.SetURLVars(req, vars)
+	}
+	if query != nil {
+		q := req.URL.Query()
+		for k, v := range query {
+			q.Add(k, v)
+		}
+		req.URL.RawQuery = q.Encode()
+	}
+	req.Header = headers
+	req.Close = true
+
+	//log.Debug("sendRequest: req: ", req)
+	rr, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return nil, err
+	}
+
+	// Check the status code is what we expect.
+	//log.Debug("sendRequest: rr: ", rr)
+	if status := rr.StatusCode; status != code {
+		s := fmt.Sprintf("Wrong status code - got %v want %v", status, code)
+		return nil, errors.New(s)
+	}
+	responseData, err := ioutil.ReadAll(rr.Body)
+	if err != nil {
+		return nil, err
+	}
+	//log.Debug("sendRequest: responseData: ", responseData)
+
+	return responseData, nil
+}
diff --git a/go-packages/meep-sss-mgr/mqtt.go b/go-packages/meep-sss-mgr/mqtt.go
new file mode 100644
index 0000000000000000000000000000000000000000..9eec0dde79d4c506852262f62f4d2adb553f0f3a
--- /dev/null
+++ b/go-packages/meep-sss-mgr/mqtt.go
@@ -0,0 +1,246 @@
+package sssmgr
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"reflect"
+	"strconv"
+	"sync"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+	mqtt "github.com/eclipse/paho.mqtt.golang"
+)
+
+type SssMgrMqtt struct {
+	running    bool
+	opts       *mqtt.ClientOptions
+	client     mqtt.Client
+	sent_topic string
+}
+
+var _notify func(map[string]interface{}) = nil
+
+var _sync_response *sync.WaitGroup = nil // Used to synchronize the response
+var _responses map[uint16]mqtt.Message
+
+func onMessageReceived(client mqtt.Client, msg mqtt.Message) {
+	go func() {
+		log.Info("onMessageReceived: Received message: ", msg.Payload(), " on topic ", msg.Topic())
+		// if _notify != nil {
+		// 	...
+		// } else {
+		// 	log.Info("onMessageReceived: null pointer for the callbacl")
+		// }
+	}()
+}
+
+func onMessageReceivedReq(client mqtt.Client, msg mqtt.Message) {
+	go func() {
+		log.Info("onMessageReceivedReq: Received message: ", string(msg.Payload()), " on topic ", msg.Topic())
+		// if _notify != nil {
+		// 	...
+		// } else {
+		// 	log.Info("onMessageReceivedReq: null pointer for the callbacl")
+		// }
+	}()
+}
+
+func onMessageReceivedResp(client mqtt.Client, msg mqtt.Message) {
+	go func() {
+		log.Info("onMessageReceivedResp: Received message: ", string(msg.Payload()), " on topic ", msg.Topic())
+		defer _sync_response.Done()
+		_responses[msg.MessageID()] = msg
+	}()
+}
+
+var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
+	log.Info("mqtt.OnConnectHandler: Connected")
+}
+
+var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
+	log.Info("Connect lost:", err)
+}
+
+func NewSssMgrMqtt() (broker_mqtt *SssMgrMqtt) {
+	log.Info(">>> NewSssMgrMqtt")
+	return new(SssMgrMqtt)
+}
+
+func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr, notify func(map[string]interface{})) (err error) {
+	log.Info(">>> init")
+
+	broker_mqtt.running = false
+
+	_notify = notify
+
+	broker_mqtt.opts = mqtt.NewClientOptions()
+	broker_mqtt.opts.SetDefaultPublishHandler(onMessageReceived)
+	broker_mqtt.opts.SetClientID("AdvantEDGE.meep-vis-traffic-mgr")
+	broker_mqtt.opts.OnConnect = connectHandler
+	broker_mqtt.opts.OnConnectionLost = connectLostHandler
+	broker_mqtt.opts.CleanSession = true
+	broker_mqtt.opts.SetUsername("")
+	broker_mqtt.opts.SetPassword("")
+	log.Info("init: Add brocker: ", fmt.Sprintf("tcp://%s:%d", tm.host, tm.port))
+	broker_mqtt.opts.AddBroker(fmt.Sprintf("tcp://%s:%d", tm.host, tm.port))
+	broker_mqtt.client = mqtt.NewClient(broker_mqtt.opts)
+
+	log.Info("init: Connect to MQTT server...")
+	token := broker_mqtt.client.Connect()
+	if token.Error() != nil {
+		log.Error(token.Error())
+		return token.Error()
+	}
+	token.Wait()
+
+	// Subscribe
+	log.Info("init: Subscribe to: ", "oneM2M/req/+")
+	token = broker_mqtt.client.Subscribe("oneM2M/req/+", 0, onMessageReceivedReq) // qos:0
+	if token.Error() != nil {
+		log.Error(token.Error())
+		return token.Error()
+	}
+	// token.Wait()
+	log.Info("init: Subscribe to: ", "/oneM2M/resp/#")
+	token = broker_mqtt.client.Subscribe("/oneM2M/resp/#", 0, onMessageReceivedResp) // qos:0
+	if token.Error() != nil {
+		log.Error(token.Error())
+		return token.Error()
+	}
+	token.Wait()
+
+	_sync_response = new(sync.WaitGroup) // Used to synchronize the response
+	_responses = make(map[uint16]mqtt.Message, 0)
+
+	broker_mqtt.running = true
+	log.Info("init: Client is connected")
+
+	return nil
+}
+
+func (broker_mqtt *SssMgrMqtt) uninit() (err error) {
+	log.Info(">>> uninit")
+
+	if !broker_mqtt.running {
+		err := errors.New("MQTT not initialized or diconnected")
+		log.Error(err.Error())
+		return err
+	}
+
+	token := broker_mqtt.client.Unsubscribe("/oneM2M")
+	if token.Error() != nil {
+		log.Error(token.Error())
+		// Continue
+	}
+	token.Wait()
+	broker_mqtt.client.Disconnect(250)
+	broker_mqtt.running = false
+
+	_sync_response = nil
+	_responses = nil
+
+	return nil
+}
+
+func (broker_mqtt *SssMgrMqtt) send(p_ctx SssMgrBindingProtocolContext) (err error, resp interface{}) {
+	log.Info(">>> send")
+
+	// Sanity checks
+	if !broker_mqtt.running {
+		err := errors.New("MQTT not initialized or diconnected")
+		log.Error(err.Error())
+		return err, nil
+	}
+
+	// Prepare the topic
+	broker_mqtt.sent_topic = "/oneM2M/req/" + "C" + p_ctx.from + "/" + p_ctx.name + "/json" // FIXME FSCOM Use parameter for type
+	// Complete payload dictionary
+	var body = map[string]interface{}{}
+	body["op"] = p_ctx.op
+	if err != nil {
+		log.Error(err.Error())
+		return err, nil
+	}
+	if p_ctx.ty != -1 {
+		body["ty"] = p_ctx.ty
+	}
+	body["fr"] = "C" + p_ctx.from
+	body["to"] = p_ctx.to
+	body["rqi"] = p_ctx.rqi
+	body["rvi"] = p_ctx.rvi[0]
+	if p_ctx.body != nil {
+		body["pc"] = p_ctx.body
+	}
+	if p_ctx.queries != nil && len(p_ctx.queries) != 0 {
+		d := make(map[string]interface{}, 0)
+		for k, v := range p_ctx.queries { // FIXME FSCOM Check in pure string is working too?
+			if k == "ty" {
+				s, err := strconv.Atoi(v)
+				if err != nil {
+					log.Error(err.Error())
+					return err, nil
+				}
+				d[k] = []int{s}
+				continue
+			}
+			d[k], err = strconv.Atoi(v)
+			if err != nil {
+				log.Error(err.Error())
+				return err, nil
+			}
+		} // End of 'for' statement
+		d["fo"] = 1
+		body["fc"] = d
+	}
+	log.Debug("send: body=", body)
+
+	content, err := json.Marshal(body)
+	if err != nil {
+		log.Error("send: ", err.Error())
+		return err, nil
+	}
+	log.Debug("send: content: ", string(content))
+	log.Debug("send: topic: ", broker_mqtt.sent_topic)
+
+	token := broker_mqtt.client.Publish(broker_mqtt.sent_topic, 0, false, string(content))
+	token.Wait()
+
+	// Syncronization with the response
+	log.Debug("send: Start waiting for the response")
+	_sync_response.Add(1)
+	_sync_response.Wait()
+	if val, ok := _responses[token.(*mqtt.PublishToken).MessageID()]; ok {
+		delete(_responses, token.(*mqtt.PublishToken).MessageID())
+		log.Debug("send: Get the response: ", string(val.Payload()))
+		var d map[string]interface{}
+		err = json.Unmarshal(val.Payload(), &d)
+		if err != nil {
+			log.Error("send: ", err.Error())
+			return err, nil
+		}
+		if r, ok := d["pc"]; ok {
+			log.Debug("send: r: ", r)
+			log.Debug("send: TypeOf(r): ", reflect.TypeOf(r))
+			// var b []byte
+			// b, err = json.Marshal(r)
+			// if err != nil {
+			// 	log.Error("send: ", err.Error())
+			// 	return err, nil
+			// }
+			// log.Info("send: b: ", b)
+			// log.Info("send: TypeOf(b): ", reflect.TypeOf(b))
+			// err = json.Unmarshal(b, &resp)
+			// if err != nil {
+			// 	log.Error("send: ", err.Error())
+			// 	return err, nil
+			// }
+			return nil, r
+		}
+		return err, nil
+	} else {
+		log.Info("send: No response for messageID: ", token.(*mqtt.PublishToken).MessageID())
+	}
+
+	return nil, nil
+}
diff --git a/go-packages/meep-sss-mgr/onem2m-mgr.go b/go-packages/meep-sss-mgr/onem2m-mgr.go
new file mode 100644
index 0000000000000000000000000000000000000000..ceebba77f64920186eb82b0434c1b7e6981f24b5
--- /dev/null
+++ b/go-packages/meep-sss-mgr/onem2m-mgr.go
@@ -0,0 +1,1062 @@
+/*
+ * Copyright (c) 2024-2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sssmgr
+
+import (
+	"encoding/json"
+	"errors"
+	"reflect"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+
+	uuid "github.com/google/uuid"
+)
+
+// Sensors-Sharing Service Manager
+type SssMgr struct {
+	name                 string
+	namespace            string
+	bindingProtocol      string
+	host                 string
+	port                 int
+	cse_name             string
+	hostId               string
+	mutex                sync.Mutex
+	wg                   sync.WaitGroup
+	refreshTicker        *time.Ticker
+	sss_discovery_notify func(map[string]interface{})
+	sss_status_notify    func(map[string]interface{})
+	sss_data_notify      func(map[string]interface{})
+}
+
+type IotPlatformInfo struct {
+	Address       string
+	Port          int
+	Name          string
+	IotPlatformId string
+}
+
+type Point struct {
+	Latitude  float64
+	Longitude float64
+}
+
+type SensorCharacteristic struct {
+	CharacteristicName          string
+	CharacteristicValue         string
+	CharacteristicUnitOfMeasure *string
+}
+
+type SensorDiscoveryInfo struct {
+	SensorIdentifier         string
+	SensorType               string
+	SensorPropertyList       []string
+	SensorCharacteristicList []SensorCharacteristic
+	SensorPosition           *Point
+	IotPlatformId            string
+}
+
+var registeredIotPlatformsMap = map[string]IotPlatformInfo{} // List of discovered IOT Plateform
+var sensorsMap = map[string]SensorDiscoveryInfo{}            // Map sensors by sensorIdentifier
+var sensorsPerPlatformMap = map[string][]string{}            // Map dsensorIdentifiers per platform
+
+// Timer to refresh devices list for all IoT platform
+const refreshTickerExpeary = 10 // In seconds
+
+// Enable profiling
+const profiling = false
+
+var profilingTimers map[string]time.Time
+
+var protocol SssMgrBindingProtocol
+
+var subscriptionListPerSubId map[string]SensorDiscoveryInfo
+
+// NewSssMgr - Creates and initializes a new SSS Traffic Manager
+func NewSssMgr(name string, namespace string, bindingProtocol string, host string, port int, hostId string, cse_name string, sss_discovery_notify func(map[string]interface{}), sss_status_notify func(map[string]interface{}), sss_data_notify func(map[string]interface{})) (tm *SssMgr, err error) {
+	if name == "" {
+		err = errors.New("Missing connector name")
+		return nil, err
+	}
+
+	// Create new Traffic Manager
+	tm = new(SssMgr)
+	tm.name = name
+	if namespace != "" {
+		tm.namespace = namespace
+	} else {
+		tm.namespace = "default"
+	}
+
+	tm.bindingProtocol = bindingProtocol
+	tm.host = host
+	tm.port = port
+	tm.cse_name = cse_name
+	tm.hostId = hostId
+	if tm.bindingProtocol == "MQTT" {
+		if tm.host == "" {
+			err := errors.New("Host not set for MQTTP protocol")
+			log.Error(err.Error())
+			return nil, err
+		}
+		if tm.port == 0 {
+			tm.port = 1883
+		}
+		protocol = NewSssMgrMqtt()
+	} else if tm.bindingProtocol == "REST_HTTP" {
+		if tm.port == 0 {
+			tm.port = 80
+		}
+		protocol = NewSssMgrHttp()
+	} else {
+		err := errors.New("Binding protocol not set")
+		log.Error(err.Error())
+		return nil, err
+	}
+	if hostId == "" {
+		err := errors.New("hostId not set")
+		log.Error(err.Error())
+		return nil, err
+	}
+	if cse_name == "" {
+		err := errors.New("cse_name not set")
+		log.Error(err.Error())
+		return nil, err
+	}
+
+	err = protocol.init(tm, tm.notify)
+	if err != nil {
+		log.Error(err.Error())
+		return nil, err
+	}
+
+	tm.sss_discovery_notify = sss_discovery_notify
+	tm.sss_status_notify = sss_status_notify
+	tm.sss_data_notify = sss_data_notify
+
+	tm.init()
+
+	return tm, nil
+}
+
+// Profiling init
+func (tm *SssMgr) init() {
+	if profiling {
+		profilingTimers = make(map[string]time.Time)
+	}
+
+	registeredIotPlatformsMap = make(map[string]IotPlatformInfo, 1)
+	registeredIotPlatformsMap[tm.hostId] = IotPlatformInfo{
+		Address:       tm.host,
+		Port:          tm.port,
+		Name:          tm.cse_name,
+		IotPlatformId: tm.hostId,
+	}
+	sensorsMap = make(map[string]SensorDiscoveryInfo, 0)
+	sensorsPerPlatformMap = make(map[string][]string, 0)
+	tm.refreshTicker = nil
+	subscriptionListPerSubId = make(map[string]SensorDiscoveryInfo, 0)
+}
+
+// DeleteSssMgr -
+func (tm *SssMgr) DeleteSssMgr() (err error) {
+	tm.stopRefreshTicker()
+
+	if protocol != nil {
+		protocol.uninit()
+		protocol = nil
+	}
+
+	sensorsMap = nil
+	sensorsPerPlatformMap = nil
+	subscriptionListPerSubId = nil
+
+	return nil
+}
+
+func (tm *SssMgr) startRefreshTicker() {
+	log.Debug("Starting refresh loop")
+	tm.refreshTicker = time.NewTicker(refreshTickerExpeary * time.Second)
+	go func() {
+		if tm.refreshTicker != nil {
+			for range tm.refreshTicker.C {
+				// Refresh the list of devices
+				tm.wg.Add(1)
+				err := tm.populateDevicesPerIotPlatforms()
+				if err != nil {
+					log.Error(err)
+				}
+				tm.wg.Done()
+			}
+		}
+	}()
+}
+
+func (tm *SssMgr) stopRefreshTicker() {
+	if tm.refreshTicker != nil {
+		// Refresh the list of devices
+		tm.wg.Add(1)
+		tm.refreshTicker.Stop()
+		tm.refreshTicker = nil
+		registeredIotPlatformsMap = nil
+		sensorsMap = nil
+		sensorsPerPlatformMap = nil
+		tm.wg.Done()
+		log.Debug("Refresh loop stopped")
+	}
+}
+
+func (tm *SssMgr) SensorDiscoveryInfoAll() (sensors []SensorDiscoveryInfo, err error) {
+	if profiling {
+		profilingTimers["SensorDiscoveryInfoAll"] = time.Now()
+	}
+
+	log.Info(">>> SensorDiscoveryInfoAll")
+
+	err = tm.populateDevicesPerIotPlatforms() // FIXME FSCOM User timer. See startRefreshTicker
+	if err != nil {
+		return sensors, err
+	}
+
+	tm.wg.Wait()
+	log.Info("SensorDiscoveryInfoAll: After Synchro")
+
+	sensors = make([]SensorDiscoveryInfo, 0)
+	if len(registeredIotPlatformsMap) == 0 {
+		return sensors, nil
+	}
+
+	for _, v := range sensorsMap {
+		log.Info("SensorDiscoveryInfoAll: adding sensor: ", v)
+		sensors = append(sensors, v)
+	} // End of 'for' statement
+	log.Info("SensorDiscoveryInfoAll: sensors: ", sensors)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("SensorDiscoveryInfoAll: ", now.Sub(profilingTimers["SensorDiscoveryInfoAll"]))
+	}
+
+	return sensors, nil
+}
+
+func (tm *SssMgr) GetSensor(sensorIdentifier string) (sensor SensorDiscoveryInfo, err error) {
+	if profiling {
+		profilingTimers["GetSensor"] = time.Now()
+	}
+
+	log.Info(">>> GetSensor: sensorIdentifier: ", sensorIdentifier)
+
+	tm.wg.Wait()
+	log.Info("GetSensor: After Synchro")
+
+	if val, ok := sensorsMap[sensorIdentifier]; !ok {
+		err = errors.New("Wrong Device identifier")
+		return sensor, err
+	} else {
+		sensor = val
+	}
+
+	if profiling {
+		now := time.Now()
+		log.Debug("GetSensor: ", now.Sub(profilingTimers["GetSensor"]))
+	}
+	log.Info("GetSensor: sensor: ", sensor)
+
+	return sensor, nil
+}
+
+/*
+ * func populateDevicesPerIotPlatforms IoT devices for all registered Iot platform
+ * @return {struct} nil on success, error otherwise
+ */
+func (tm *SssMgr) populateDevicesPerIotPlatforms() error {
+
+	tm.mutex.Lock()
+	defer tm.mutex.Unlock()
+
+	if profiling {
+		profilingTimers["populateDevicesPerIotPlatforms"] = time.Now()
+	}
+
+	if len(registeredIotPlatformsMap) == 0 {
+		return nil
+	}
+
+	// Refresh the list of devices for all registered Iot platform
+	for _, iotPlatform := range registeredIotPlatformsMap {
+		log.Debug("populateDevicesPerIotPlatforms: processing: ", iotPlatform.Address)
+		err := tm.populateSensors(iotPlatform)
+		if err != nil {
+			log.Error("populateDevicesPerIotPlatforms: ", err)
+			continue
+		}
+	} // End of 'for' statement
+
+	if profiling {
+		now := time.Now()
+		log.Debug("populateDevicesPerIotPlatforms: ", now.Sub(profilingTimers["populateDevicesPerIotPlatforms"]))
+	}
+
+	return nil
+}
+
+/*
+ * func PopulateDevices IoT devices for the specified Iot platform
+ * @param {string} iotPlatformId contains the IoT platform identifier
+ * @return {struct} nil on success, error otherwise
+ */
+func (tm *SssMgr) populateSensors(iotPlatformInfo IotPlatformInfo) error {
+	if profiling {
+		profilingTimers["populateSensors"] = time.Now()
+	}
+
+	log.Info(">>> populateSensors: iotPlatformInfo=", iotPlatformInfo)
+
+	// 1. Get the list of the AE
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: iotPlatformInfo.Address,
+		port: iotPlatformInfo.Port,
+		name: iotPlatformInfo.Name,
+		to:   iotPlatformInfo.Name,
+		from: "Admin", // FIXME FSCOM How to get it
+		op:   2,       // RETRIEVE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	// Build the queries
+	queries := map[string]string{}
+	queries["fu"] = "1" // Filter usage
+	queries["ty"] = "3" // FIXME FSCOM Filter on oneM2M CNT for sensors or on AE because AE if the platform and CNT is a sensor and CIN the values
+	ctx.queries = queries
+
+	err, resp := protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_create: ", err.Error())
+		return err
+	}
+	log.Debug("populateSensors: resp: ", resp)
+	log.Debug("populateSensors: TypeOf(resp): ", reflect.TypeOf(resp))
+	oneM2M_uril := resp.(map[string]interface{})
+	log.Debug("populateSensors: oneM2M_uril: ", oneM2M_uril)
+	log.Debug("populateSensors: TypeOf(oneM2M_uril): ", reflect.TypeOf(oneM2M_uril))
+	log.Debug("populateSensors: len(oneM2M_uril): ", len(oneM2M_uril))
+	// Loop for each CIN and build the sensor list
+	for _, v := range oneM2M_uril["m2m:uril"].([]interface{}) {
+		log.Debug("populateSensors: Processing key: v: ", v)
+		log.Debug("populateSensors: Processing key: TypeOf(v): ", reflect.TypeOf(v))
+		s := v.(string)
+		if s == "laboai-cse-in/acpCreateACPs" || s == "laboai-cse-in/CAdmin" {
+			// FIXME FSCOM Bug in MQTT DISCOVERY request which does not provide the same response that HTTP DISCOVERY with the same filter criteria
+			continue // Discard it
+		}
+		ctx.to = s
+		ctx.queries["fu"] = "2"
+		err, resp := protocol.send(ctx)
+		if err != nil {
+			log.Error("OneM2M_create: ", err.Error())
+			continue
+		}
+		log.Debug("populateSensors: resp: ", resp)
+		log.Debug("populateSensors: type(resp): ", reflect.TypeOf(resp))
+		if resp.(map[string]interface{}) == nil || resp.(map[string]interface{})["m2m:cnt"] == nil {
+			continue
+		}
+		// oneM2M_cin := resp.(map[string]interface{})["m2m:cnt"].(map[string]interface{})
+		// log.Debug("populateSensors: type(oneM2M_cin): ", reflect.TypeOf(oneM2M_cin))
+		// log.Debug("populateSensors: len(oneM2M_cin): ", len(oneM2M_cin))
+		// log.Debug("populateSensors: oneM2M_cin: ", oneM2M_cin)
+		var sensor = SensorDiscoveryInfo{
+			IotPlatformId: iotPlatformInfo.IotPlatformId,
+		}
+		sensor, err = tm.oneM2M_deserialize(sensor, resp.(map[string]interface{}))
+		if err != nil {
+			log.Warn("populateSensors: ", err.Error())
+			continue
+		}
+
+		log.Info("populateSensors: sensor: ", sensor)
+		sensorsMap[sensor.SensorIdentifier] = sensor
+		sensorsPerPlatformMap[sensor.IotPlatformId] = append(sensorsPerPlatformMap[sensor.IotPlatformId], sensor.SensorIdentifier)
+	} // End of 'for' statement
+
+	log.Info("populateSensors: sensorsMap: ", sensorsMap)
+	log.Info("populateSensors: sensorsPerPlatformMap: ", sensorsPerPlatformMap)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("populateSensors: ", now.Sub(profilingTimers["populateSensors"]))
+	}
+
+	return nil
+}
+
+func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensorResp SensorDiscoveryInfo, err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_create"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_create: sensor=", sensor)
+
+	if sensor.IotPlatformId == "" {
+		err = errors.New("IotPlatformId fiels shall be set")
+		log.Error("OneM2M_create: ", err.Error())
+		return sensorResp, err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_create: After Synchro")
+
+	// Create the initial payload dictionary
+	var bodyMap = map[string]map[string]interface{}{}
+	// Initialize the entry
+	if sensor.SensorType == "AE" { // FIXME FSCOM Clarify how to map Deviceinfo with oneM2M AE/CNT/fexContainer
+		bodyMap["m2m:ae"] = make(map[string]interface{}, 0)
+		bodyMap["m2m:ae"]["api"] = "Norg.etsi." + sensor.IotPlatformId + "." + sensor.SensorIdentifier
+		bodyMap["m2m:ae"]["rn"] = sensor.SensorIdentifier
+		bodyMap["m2m:ae"]["rr"] = false
+		bodyMap["m2m:ae"]["srv"] = []string{"4"}
+		// Add metadata
+		if len(sensor.SensorCharacteristicList) != 0 {
+			for _, val := range sensor.SensorCharacteristicList {
+				log.Debug("OneM2M_create: Adding AE metadata: ", val)
+				bodyMap["m2m:ae"][val.CharacteristicName] = val.CharacteristicValue
+			} // End of 'for' statement
+		}
+	} else if sensor.SensorType == "CNT" {
+		bodyMap["m2m:cnt"] = make(map[string]interface{}, 0)
+		bodyMap["m2m:cnt"]["mbs"] = 10000
+		bodyMap["m2m:cnt"]["mni"] = 10
+		bodyMap["m2m:cnt"]["rn"] = sensor.SensorIdentifier
+		// Add metadata
+		if len(sensor.SensorCharacteristicList) != 0 {
+			for _, val := range sensor.SensorCharacteristicList {
+				log.Debug("OneM2M_create: Adding CNT metadata: ", val)
+				bodyMap["m2m:cnt"][val.CharacteristicName] = val.CharacteristicValue
+			} // End of 'for' statement
+		}
+	} else if sensor.SensorType == "CIN" {
+		bodyMap["m2m:cin"] = make(map[string]interface{}, 0)
+		bodyMap["m2m:cin"]["cnf"] = "text/plain:0"
+		bodyMap["m2m:cin"]["rn"] = sensor.SensorIdentifier
+		// Add metadata
+		if len(sensor.SensorCharacteristicList) != 0 {
+			for _, val := range sensor.SensorCharacteristicList {
+				log.Debug("OneM2M_create: Adding CIN metadata: ", val)
+				bodyMap["m2m:cin"][val.CharacteristicName] = val.CharacteristicValue
+			} // End of 'for' statement
+		}
+	} else {
+		err = errors.New("OneM2M_create: Invalid type")
+		log.Error("OneM2M_create: ", err.Error())
+		return sensorResp, err
+	}
+
+	// Send it and get the result
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[sensor.IotPlatformId].Address,
+		port: registeredIotPlatformsMap[sensor.IotPlatformId].Port,
+		name: registeredIotPlatformsMap[sensor.IotPlatformId].Name,
+		to:   registeredIotPlatformsMap[sensor.IotPlatformId].Name,
+		from: sensor.IotPlatformId,
+		op:   1, // CREATE
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		body: bodyMap,
+		code: 201,
+	}
+	if path != "" {
+		ctx.to = path
+	}
+	if sensor.SensorType == "AE" {
+		ctx.ty = 2
+	} else if sensor.SensorType == "CNT" {
+		ctx.ty = 3
+	} else if sensor.SensorType == "CIN" {
+		ctx.ty = 4
+	} else {
+		err = errors.New("OneM2M_create: Invalid type")
+		log.Error("send: ", err.Error())
+		return sensorResp, err
+	}
+
+	err, resp := protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_create: ", err.Error())
+		return sensorResp, err
+	}
+	log.Debug("OneM2M_create: resp: ", resp)
+	log.Debug("OneM2M_create: TypeOf(resp): ", reflect.TypeOf(resp))
+	if _, ok := resp.(map[string]interface{}); !ok {
+		log.Error("OneM2M_create: Interface not available")
+		return sensorResp, err
+	}
+
+	// Add additional entries
+	sensorResp.SensorIdentifier = sensor.SensorIdentifier
+	sensorResp.SensorType = sensor.SensorType
+	sensorResp.IotPlatformId = sensor.IotPlatformId
+	sensorResp.SensorPosition = sensor.SensorPosition
+	sensorResp, err = tm.oneM2M_deserialize(sensorResp, resp.(map[string]interface{}))
+	if err != nil {
+		log.Error("OneM2M_create: ", err.Error())
+		return sensorResp, err
+	}
+	log.Debug("OneM2M_create: sensorResp: ", sensorResp)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_create: ", now.Sub(profilingTimers["OneM2M_create"]))
+	}
+
+	return sensorResp, nil
+}
+
+func (tm *SssMgr) OneM2M_discovery(type_ string, iotPlatformId string) (sensorResp []SensorDiscoveryInfo, err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_discovery"] = time.Now()
+	}
+
+	log.Info(">>> OneM2OneM2M_discovery_get: path: ", type_)
+	log.Info(">>> OneM2M_discovery: iotPlatformId: ", iotPlatformId)
+
+	if iotPlatformId == "" {
+		err = errors.New("IotPlatformId fiels shall be set")
+		log.Error("OneM2M_discovery: ", err.Error())
+		return nil, err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_discovery: After Synchro")
+
+	// 1. Get the list of the AE
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[iotPlatformId].Address,
+		port: registeredIotPlatformsMap[iotPlatformId].Port,
+		name: registeredIotPlatformsMap[iotPlatformId].Name,
+		to:   registeredIotPlatformsMap[iotPlatformId].Name,
+		from: "Admin", // FIXME FSCOM How to get it
+		op:   2,       // RETRIEVE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	// Build the queries parameters
+	queries := map[string]string{}
+	queries["fu"] = "1" // Filter usage
+	if type_ == "AE" {
+		ctx.ty = 2
+		queries["ty"] = "2"
+	} else if type_ == "CNT" {
+		ctx.ty = 3
+		queries["ty"] = "3"
+	} else if type_ == "CIN" {
+		ctx.ty = 4
+		queries["ty"] = "4"
+	} else {
+		err = errors.New("OneM2M_discovery: Invalid type")
+		log.Error("OneM2M_discovery: ", err.Error())
+		return nil, err
+	}
+	ctx.queries = queries
+
+	err, resp := protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_create: ", err.Error())
+		return nil, err
+	}
+	log.Debug("OneM2M_discovery: resp: ", resp)
+	log.Debug("OneM2M_discovery: TypeOf(resp): ", reflect.TypeOf(resp))
+	oneM2M_uril := resp.(map[string]interface{})
+	log.Debug("OneM2M_discovery: oneM2M_uril: ", oneM2M_uril)
+	log.Debug("OneM2M_discovery: TypeOf(oneM2M_uril): ", reflect.TypeOf(oneM2M_uril))
+	log.Debug("OneM2M_discovery: len(oneM2M_uril): ", len(oneM2M_uril))
+	sensorResp = make([]SensorDiscoveryInfo, len(oneM2M_uril))
+	// Loop for each CIN and build the sensor list
+	sensorResp = make([]SensorDiscoveryInfo, 0)
+	for _, v := range oneM2M_uril["m2m:uril"].([]interface{}) {
+		log.Debug("OneM2M_discovery: Processing key: v: ", v)
+		log.Debug("OneM2M_discovery: Processing key: TypeOf(v): ", reflect.TypeOf(v))
+		s := v.(string)
+		if s == "laboai-cse-in/acpCreateACPs" || s == "laboai-cse-in/CAdmin" {
+			// FIXME FSCOM Bug in MQTT DISCOVERY request which does not provide the same response that HTTP DISCOVERY with the same filter criteria
+			continue // Discard it
+		}
+		r, err := tm.OneM2M_get(v.(string), iotPlatformId)
+		if err != nil {
+			log.Error("OneM2M_discovery: ", err.Error())
+			return nil, err
+		}
+		sensorResp = append(sensorResp, r)
+	} // End of 'for' statement
+	log.Debug("OneM2M_discovery: len(sensorResp): ", len(sensorResp))
+	log.Debug("OneM2M_discovery: sensorResp: ", sensorResp)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_discovery: ", now.Sub(profilingTimers["OneM2M_discovery"]))
+	}
+
+	return sensorResp, nil
+}
+
+func (tm *SssMgr) OneM2M_get(path string, iotPlatformId string) (sensorResp SensorDiscoveryInfo, err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_get"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_get: path: ", path)
+	log.Info(">>> OneM2M_get: iotPlatformId: ", iotPlatformId)
+
+	if path == "" || iotPlatformId == "" {
+		err = errors.New("OneM2M_get: Invalid parameters")
+		log.Error("OneM2M_get: ", err.Error())
+		return sensorResp, err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_get: After Synchro")
+
+	// 1. Get the list of the AE
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[iotPlatformId].Address,
+		port: registeredIotPlatformsMap[iotPlatformId].Port,
+		name: registeredIotPlatformsMap[iotPlatformId].Name,
+		to:   path,
+		from: "Admin", // FIXME FSCOM How to get it
+		op:   2,       // RETRIEVE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+
+	err, resp := protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_get: ", err.Error())
+		return sensorResp, err
+	}
+	log.Debug("OneM2M_get: resp: ", resp)
+	log.Debug("OneM2M_get: TypeOf(resp): ", reflect.TypeOf(resp))
+	if _, ok := resp.(map[string]interface{}); !ok {
+		log.Error("OneM2M_get: Interface not available")
+		return sensorResp, err
+	}
+
+	// Add additional entries
+	sensorResp.IotPlatformId = iotPlatformId
+	sensorResp, err = tm.oneM2M_deserialize(sensorResp, resp.(map[string]interface{}))
+
+	if err != nil {
+		log.Error("OneM2M_get: ", err.Error())
+		return sensorResp, err
+	}
+	log.Debug("OneM2M_get: sensorResp: ", sensorResp)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_get: ", now.Sub(profilingTimers["OneM2M_get"]))
+	}
+
+	return sensorResp, nil
+}
+
+func (tm *SssMgr) OneM2M_subscribe(iotPlatformId string, path string) (subscription string, err error) {
+	if profiling {
+		profilingTimers["OneM2M_subscribe"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_subscribe: path: ", path)
+	log.Info(">>> OneM2M_subscribe: iotPlatformId: ", iotPlatformId)
+
+	if path == "" || iotPlatformId == "" {
+		err = errors.New("OneM2M_subscribe: Invalid parameters")
+		log.Error("OneM2M_subscribe: ", err.Error())
+		return "", err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_subscribe: After Synchro")
+
+	// 1. Get the list of the AE
+	// Build the context
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[iotPlatformId].Address,
+		port: registeredIotPlatformsMap[iotPlatformId].Port,
+		name: registeredIotPlatformsMap[iotPlatformId].Name,
+		to:   path,
+		from: registeredIotPlatformsMap[iotPlatformId].IotPlatformId,
+		op:   1, // SUBSCRIBE
+		ty:   23,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	var bodyMap = map[string]map[string]interface{}{}
+	bodyMap["m2m:sub"] = make(map[string]interface{}, 0)
+	net := make(map[string][]int)
+	net["net"] = []int{2, 3, 4}
+	bodyMap["m2m:sub"]["enc"] = net
+	bodyMap["m2m:sub"]["nu"] = []string{"http://172.29.10.52:31122/"} // FIXME FSCOM The URI of the listener
+	bodyMap["m2m:sub"]["rn"] = uuid.New().String()
+	ctx.body = bodyMap
+
+	err, resp := protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_subscribe: ", err.Error())
+		return "", err
+	}
+	log.Debug("OneM2M_subscribe: resp: ", resp)
+	log.Debug("OneM2M_subscribe: TypeOf(resp): ", reflect.TypeOf(resp))
+	if _, ok := resp.(map[string]interface{}); !ok {
+		log.Error("OneM2M_create: Interface not available")
+		return "", err
+	}
+
+	if _, ok := resp.(map[string]interface{})["m2m:sub"].(map[string]interface{})["ri"]; !ok {
+		err = errors.New("Subsciption identifier not present")
+		log.Error("OneM2M_subscribe: ", err.Error())
+		return "", err
+	}
+	subId := resp.(map[string]interface{})["m2m:sub"].(map[string]interface{})["ri"].(string)
+	log.Debug("OneM2M_subscribe: subId: ", subId)
+
+	// Add additional entries
+	var v = SensorDiscoveryInfo{
+		SensorIdentifier: subId,
+		SensorType:       "SUB",
+		IotPlatformId:    iotPlatformId,
+	}
+	v, err = tm.oneM2M_deserialize(v, resp.(map[string]interface{}))
+	if err != nil {
+		log.Error("OneM2M_subscribe: ", err.Error())
+		return "", err
+	}
+	log.Debug("OneM2M_cOneM2M_subscribereate: sensvorResp: ", v)
+
+	subscriptionListPerSubId[subId] = v
+
+	//map[m2m:sub:map[ct:20250327T065259,502192 enc:map[net:[1 2 3 4]] et:20300326T065259,314830 lt:20250327T065259,502192 nct:1 nu:[http://172.29.10.52:31122] pi:C7feaadbb0400 ri:sub415201783625924167 rn:e31e93f4-8514-4c83-8854-364eee1ad305 ty:23]]
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_subscribe: ", now.Sub(profilingTimers["OneM2M_subscribe"]))
+	}
+
+	return subId, nil
+}
+
+func (tm *SssMgr) OneM2M_Delete(sensor SensorDiscoveryInfo) (err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_Delete"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_Delete: sensor=", sensor)
+
+	if sensor.SensorIdentifier == "" {
+		err = errors.New("OneM2M_Delete: Cannot find \"ri\" value")
+		log.Error("OneM2M_Delete: ", err.Error())
+		return err
+	}
+
+	if sensor.IotPlatformId == "" {
+		err = errors.New("IotPlatformId fiels shall be set")
+		log.Error("OneM2M_Delete: ", err.Error())
+		return err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_Delete: After Synchro")
+
+	// Send it and get the result
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[sensor.IotPlatformId].Address,
+		port: registeredIotPlatformsMap[sensor.IotPlatformId].Port,
+		name: registeredIotPlatformsMap[sensor.IotPlatformId].Name,
+		to:   sensor.SensorIdentifier,
+		from: sensor.IotPlatformId,
+		op:   4, // DELETE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	err, _ = protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_Delete: ", err.Error())
+		return err
+	}
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_Delete: ", now.Sub(profilingTimers["OneM2M_Delete"]))
+	}
+
+	return nil
+}
+
+func (tm *SssMgr) OneM2M_DeleteSub(subId string) (err error) {
+
+	if profiling {
+		profilingTimers["OneM2M_DeleteSub"] = time.Now()
+	}
+
+	log.Info(">>> OneM2M_DeleteSub: sensor=", subId)
+
+	if subId == "" {
+		err = errors.New("subId fiels shall be set")
+		log.Error("OneM2M_DeleteSub: ", err.Error())
+		return err
+	}
+
+	if _, ok := subscriptionListPerSubId[subId]; !ok {
+		err = errors.New("Unkmown subscription identifier")
+		log.Error("OneM2M_DeleteSub: ", err.Error())
+		return err
+	}
+
+	tm.wg.Wait()
+	log.Info("OneM2M_DeleteSub: After Synchro")
+
+	// Send it and get the result
+	var ctx = SssMgrBindingProtocolContext{
+		host: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Address,
+		port: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Port,
+		name: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Name,
+		to:   subscriptionListPerSubId[subId].SensorIdentifier,
+		from: subscriptionListPerSubId[subId].IotPlatformId,
+		op:   4, // DELETE
+		ty:   -1,
+		rqi:  uuid.New().String(),
+		rvi:  []string{"4"}, // FIXME FSCOM How to get it
+		code: 200,
+	}
+	err, _ = protocol.send(ctx)
+	if err != nil {
+		log.Error("OneM2M_DeleteSub: ", err.Error())
+		return err
+	}
+
+	delete(subscriptionListPerSubId, subId)
+	log.Info("OneM2M_DeleteSub: New subscriptionListPerSubId: ", subscriptionListPerSubId)
+
+	if profiling {
+		now := time.Now()
+		log.Debug("OneM2M_DeleteSub: ", now.Sub(profilingTimers["OneM2M_DeleteSub"]))
+	}
+
+	return nil
+}
+
+func (tm *SssMgr) notify(sub map[string]interface{}) {
+	log.Debug(">>> notify: sub: ", sub)
+
+	// Sanity checks
+	if _, ok := sub["nev"]; !ok {
+		log.Warn("notify: nev entry is missing")
+		return
+	}
+	if _, ok := sub["nev"].(map[string]interface{}); !ok {
+		log.Warn("notify: nev entry has unexpected type")
+		return
+	}
+	if _, ok := sub["nev"].(map[string]interface{}); !ok {
+		log.Warn("notify: nev entry has unexpected type")
+		return
+	}
+	if _, ok := sub["sur"]; !ok {
+		log.Warn("notify: sur entry is missing")
+		return
+	}
+
+	// Process subscription
+	s := strings.Split(sub["sur"].(string), "/")
+	log.Debug("notify: s: ", s)
+	log.Debug("notify: CSE-ID: ", s[1])
+	log.Debug("notify: subURL: ", strings.Join(s[2:], "/"))
+
+	rep := sub["nev"].(map[string]interface{})
+	log.Debug("notify: rep: ", rep["rep"].(map[string]interface{}))
+	if _, ok := rep["rep"]; !ok {
+		log.Warn("notify: rep entry is missing")
+		return
+	}
+	if _, ok := rep["rep"].(map[string]interface{}); !ok {
+		log.Warn("notify: rep entry has unexpected type")
+		return
+	}
+	r := rep["rep"].(map[string]interface{})
+	log.Debug("notify: r: ", r)
+	// FIXME FSCOM How to mange the 3 levels of subscriptions???
+	if v, ok := r["m2m:ae"]; ok { // Discovery notification
+		log.Debug("notify: AE level")
+		if tm.sss_discovery_notify != nil {
+			go func() {
+				tm.sss_discovery_notify(v.(map[string]interface{}))
+			}()
+		}
+		return
+	} else if v, ok := r["m2m:cnt"]; ok { // Status notification
+		log.Debug("notify: CNT level")
+		if tm.sss_status_notify != nil {
+			go func() {
+				tm.sss_status_notify(v.(map[string]interface{}))
+			}()
+		}
+		return
+	} else if v, ok := r["m2m:cin"]; ok { // Data notification
+		if tm.sss_data_notify != nil {
+			go func() {
+				tm.sss_data_notify(v.(map[string]interface{}))
+			}()
+		}
+		log.Debug("notify: CIN level")
+		return
+	} else {
+		log.Debug("notify: Unexpected level")
+		return
+	}
+}
+
+func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[string]interface{}) (sensorResp SensorDiscoveryInfo, err error) {
+	log.Debug(">>> oneM2M_deserialize: response: ", response)
+
+	sensorResp = sensor // Same data structure
+
+	for i, m := range response {
+		log.Debug("==> ", i, " value is ", m)
+		if _, ok := m.(map[string]interface{}); !ok {
+			// Skip it
+			log.Warn("oneM2M_deserialize: m is not map[string]interface{}")
+			continue
+		}
+		// m is a map[string]interface.
+		// loop over keys and values in the map.
+		for k, v := range m.(map[string]interface{}) {
+			log.Debug(k, " value is ", v)
+			log.Debug("oneM2M_deserialize: type(v): ", reflect.TypeOf(v))
+
+			if k == "ri" {
+				if item, ok := v.(string); ok {
+					sensorResp.SensorIdentifier = item
+				} else {
+					log.Error("oneM2M_deserialize: Failed to process ", k)
+				}
+			} else if k == "ty" {
+				if item, ok := v.(float64); ok {
+					switch item {
+					case 2:
+						sensorResp.SensorType = "AE"
+					case 3:
+						sensorResp.SensorType = "CNT"
+					case 4:
+						sensorResp.SensorType = "CIN"
+					default:
+						sensorResp.SensorType = strconv.FormatFloat(item, 'f', -1, 64)
+					}
+				} else {
+					log.Error("oneM2M_deserialize: Failed to process ", k)
+				}
+			} else {
+				if item, ok := v.(string); ok {
+					sensorResp.SensorCharacteristicList = append(
+						sensorResp.SensorCharacteristicList,
+						SensorCharacteristic{
+							CharacteristicName:  k,
+							CharacteristicValue: string(item),
+						})
+				} else if item, ok := v.(float64); ok {
+					sensorResp.SensorCharacteristicList = append(
+						sensorResp.SensorCharacteristicList,
+						SensorCharacteristic{
+							CharacteristicName:  k,
+							CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64),
+						})
+				} else if item, ok := v.(int64); ok {
+					sensorResp.SensorCharacteristicList = append(
+						sensorResp.SensorCharacteristicList,
+						SensorCharacteristic{
+							CharacteristicName:  k,
+							CharacteristicValue: strconv.FormatInt(item, 10),
+						})
+				} else if item, ok := v.(bool); ok {
+					sensorResp.SensorCharacteristicList = append(
+						sensorResp.SensorCharacteristicList,
+						SensorCharacteristic{
+							CharacteristicName:  k,
+							CharacteristicValue: strconv.FormatBool(item),
+						})
+				} else if item, ok := v.([]string); ok {
+					sensorResp.SensorCharacteristicList = append(
+						sensorResp.SensorCharacteristicList,
+						SensorCharacteristic{
+							CharacteristicName:  k,
+							CharacteristicValue: strings.Join(item, ","),
+						})
+				} else if item, ok := v.([]int64); ok {
+					log.Warn("oneM2M_deserialize: Failed to convert list of int64 into string: ", item)
+				} else if item, ok := v.(map[string]interface{}); ok {
+					v, err := json.Marshal(item)
+					if err == nil {
+						sensorResp.SensorCharacteristicList = append(
+							sensorResp.SensorCharacteristicList,
+							SensorCharacteristic{
+								CharacteristicName:  k,
+								CharacteristicValue: string(v),
+							})
+					} else {
+						log.Warn("oneM2M_deserialize: ", err.Error())
+					}
+				} else if item, ok := v.([]interface{}); ok {
+					log.Debug("oneM2M_deserialize: Got []interface {} for ", k)
+					log.Debug("oneM2M_deserialize: ValueOf ", reflect.ValueOf(item))
+					v, err := json.Marshal(item)
+					if err == nil {
+						sensorResp.SensorCharacteristicList = append(
+							sensorResp.SensorCharacteristicList,
+							SensorCharacteristic{
+								CharacteristicName:  k,
+								CharacteristicValue: string(v),
+							})
+					} else {
+						log.Warn("oneM2M_deserialize: ", err.Error())
+					}
+				} else {
+					log.Warn("oneM2M_deserialize: Failed to process: ", k)
+				}
+			}
+		} // End of 'for' loop
+
+	} // End of 'for' loop
+	log.Debug("oneM2M_deserialize: sensorResp: ", sensorResp)
+
+	return sensorResp, nil
+}
diff --git a/go-packages/meep-sss-mgr/onem2m-mgr_test.go b/go-packages/meep-sss-mgr/onem2m-mgr_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..e3b43d099c1ca495f0b170e9c7d95d53541f552e
--- /dev/null
+++ b/go-packages/meep-sss-mgr/onem2m-mgr_test.go
@@ -0,0 +1,1223 @@
+/*
+ * Copyright (c) 2025  The AdvantEDGE Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on ance "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package sssmgr
+
+import (
+	"fmt"
+	"reflect"
+	"testing"
+	"time"
+
+	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
+)
+
+const tmName = "meep-iot"
+const tmNamespace = "sandboxtest"
+
+// func TestNewSssMgr(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Invalid Connector
+// 	fmt.Println("Invalid SSS Asset Manager")
+// 	tm, err := NewSssMgr("", tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Service name not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Binding protocol not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Host not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("Host id not set")
+// 	}
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "", nil, nil, nil)
+// 	if err == nil || tm != nil {
+// 		t.Fatalf("CSE name not set")
+// 	}
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err = NewSssMgr(tmName, tmNamespace, "REST_HTTP", "172.29.10.56", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	err = tm.populateDevicesPerIotPlatforms()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestSensorDiscoveryInfoAllHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("len=", len(sensors))
+// 	fmt.Println("sensors", sensors)
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestGetSensorHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+
+// 	for _, v := range sensors {
+// 		fmt.Println("v", v)
+// 		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
+
+// 		sensor, err := tm.GetSensor(v.SensorIdentifier)
+// 		if !validate_sensor_discovery_info(v, sensor) {
+// 			t.Fatalf(err.Error())
+// 		}
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_createAEHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor, err := tm.OneM2M_create(sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor, new_sensor) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(new_sensor)
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_createAE_CNTHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	// sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	// sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new CNT sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_createAE_CNT_CNIHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new CNT sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	var sensor_cin = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNI",
+// 		SensorType:       "CIN",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath = new_sensor_cnt.SensorIdentifier
+// 	new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_cin(sensor_cin, new_sensor_cin) {
+// 		t.Fatalf("Failed to validate CIN content")
+// 	}
+
+// 	err = tm.OneM2M_Delete(new_sensor_cin)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_deleteHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var new_sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor, err := oneM2M_create(tm, new_sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
+
+// 	err = tm.OneM2M_Delete(sensor)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_getHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Verify content
+// 	if len(sensors) != 3 || len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Get one sensor
+// 	sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cin(received_sensors["CIN"], sensorResp) {
+// 		t.Fatalf("Failed to validate CIN content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_discoveryHttp(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Verify content
+// 	if len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Discover CNTs
+// 	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	// Discover AEs
+// 	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover AE sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+func TestOneM2M_subscribeHttp(t *testing.T) {
+	fmt.Println("--- ", t.Name())
+	log.MeepTextLogInit(t.Name())
+
+	// Valid Connector
+	fmt.Println("Create valid SSS Asset Manager")
+	tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", discoveryNotify, statusNotify, dataNotify)
+	if err != nil || tm == nil {
+		t.Fatalf("Failed to create SSS Asset Manager")
+	}
+
+	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+	if err != nil {
+		t.Fatalf("Failed to create sensors")
+	}
+
+	subscriptionMap := make(map[string]interface{})
+	subId, err := tm.OneM2M_subscribe(received_sensors["AE"].IotPlatformId, received_sensors["AE"].SensorIdentifier)
+	if err != nil {
+		t.Fatalf("Failed to subscribe")
+	}
+	fmt.Println("subId=" + subId)
+	subscriptionMap[subId] = received_sensors["AE"]
+
+	subId, err = tm.OneM2M_subscribe(received_sensors["CNT"].IotPlatformId, received_sensors["CNT"].SensorIdentifier)
+	if err != nil {
+		t.Fatalf("Failed to subscribe")
+	}
+	fmt.Println("subId=" + subId)
+	subscriptionMap[subId] = received_sensors["CNT"]
+
+	fmt.Println("len(subscriptionMap)=" + fmt.Sprint(len(subscriptionMap)))
+
+	fmt.Println("You have 120 seconds to trigger subscriptions")
+	time.Sleep(time.Duration(120) * time.Second)
+
+	for k := range subscriptionMap {
+		err = tm.OneM2M_DeleteSub(k)
+		if err != nil {
+			t.Fatalf("Failed to cancel subscription")
+		}
+	} // End of 'for' statement
+
+	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+	_ = tm.OneM2M_Delete(received_sensors["AE"])
+
+	// Cleanup
+	err = tm.DeleteSssMgr()
+	if err != nil {
+		t.Fatalf("Failed to cleanup SSS Asset Manager")
+	}
+	tm = nil
+}
+
+// func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+// 	err = tm.populateDevicesPerIotPlatforms()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestSensorDiscoveryInfoAllMqtt(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	err = tm.populateDevicesPerIotPlatforms()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+// 	fmt.Println("sensors: ", sensors)
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// }
+
+// func TestGetSensorMqtt(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	sensors, err := tm.SensorDiscoveryInfoAll()
+// 	if err != nil {
+// 		t.Fatalf(err.Error())
+// 	}
+
+// 	for _, v := range sensors {
+// 		fmt.Println("v", v)
+// 		fmt.Println("TypeOf(v)", reflect.TypeOf(v))
+
+// 		sensor, err := tm.GetSensor(v.SensorIdentifier)
+// 		if !validate_sensor_discovery_info(v, sensor) {
+// 			t.Fatalf(err.Error())
+// 		}
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_createAEMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor, err := tm.OneM2M_create(sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor, new_sensor) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(new_sensor)
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_createAE_CNTMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	// sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	// sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_createAE_CNT_CNIMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var sensor_ae = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyAE",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new AE sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_ae(sensor_ae, new_sensor_ae) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	var sensor_cnt = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNT",
+// 		SensorType:       "CNT",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensorPath := new_sensor_ae.SensorIdentifier
+// 	new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Verify content
+// 	if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	var sensor_cin = SensorDiscoveryInfo{
+// 		SensorIdentifier: "CMyCNI",
+// 		SensorType:       "CIN",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+// 	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+// 	sensorPath = new_sensor_cnt.SensorIdentifier
+// 	new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	if new_sensor_cin.SensorType != sensor_cin.SensorType {
+// 		t.Fatalf("received_sensor.SensorType != SensorType")
+// 	}
+// 	if new_sensor_cin.IotPlatformId != sensor_cin.IotPlatformId {
+// 		t.Fatalf("received_sensor.IotPlatformId != IotPlatformId")
+// 	}
+// 	if len(new_sensor_cin.SensorCharacteristicList) == 0 {
+// 		t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty")
+// 	}
+
+// 	err = tm.OneM2M_Delete(new_sensor_cin)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_cnt)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+// 	err = tm.OneM2M_Delete(new_sensor_ae)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor")
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_deleteMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	var new_sensor = SensorDiscoveryInfo{
+// 		SensorIdentifier: "12345",
+// 		SensorType:       "AE",
+// 		SensorPosition:   nil,
+// 		IotPlatformId:    "7feaadbb0400",
+// 	}
+// 	sensor, err := oneM2M_create(tm, new_sensor, "")
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
+
+// 	err = tm.OneM2M_Delete(sensor)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create new sensor: " + err.Error())
+// 	}
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_getMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Verify content
+// 	if len(sensors) != 3 || len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Get one sensor
+// 	sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cin(received_sensors["CIN"], sensorResp) {
+// 		t.Fatalf("Failed to validate CIN content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestOneM2M_discoveryMQTT(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	_, received_sensors, err := oneM2M_createAE_CNT_CIN(tm)
+// 	if err != nil {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Verify content
+// 	if len(received_sensors) != 3 {
+// 		t.Fatalf("Failed to create sensors")
+// 	}
+
+// 	// Discover CNTs
+// 	sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover CNT sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate CNT content")
+// 	}
+
+// 	// Discover AEs
+// 	sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId)
+// 	if err != nil {
+// 		t.Fatalf("Failed to discover AE sensor")
+// 	}
+// 	if len(sensorList) != 1 {
+// 		t.Fatalf("Wrong discover result")
+// 	}
+// 	// Verify content
+// 	if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) {
+// 		t.Fatalf("Failed to validate AE content")
+// 	}
+
+// 	_ = tm.OneM2M_Delete(received_sensors["CIN"])
+// 	_ = tm.OneM2M_Delete(received_sensors["CNT"])
+// 	_ = tm.OneM2M_Delete(received_sensors["AE"])
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// 	tm = nil
+// }
+
+// func TestVaidateOneM2MNotificationServer(t *testing.T) {
+// 	fmt.Println("--- ", t.Name())
+// 	log.MeepTextLogInit(t.Name())
+
+// 	// Valid Connector
+// 	fmt.Println("Create valid SSS Asset Manager")
+// 	tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil)
+// 	if err != nil || tm == nil {
+// 		t.Fatalf("Failed to create SSS Asset Manager")
+// 	}
+
+// 	tm.init()
+// 	fmt.Println("Waiting for 2 minutes to do curl request: curl -v http://mec-platform.etsi.org:31122/sbxykqjr17/mep1/sens/v1 ")
+
+// 	// Cleanup
+// 	err = tm.DeleteSssMgr()
+// 	if err != nil {
+// 		t.Fatalf("Failed to cleanup SSS Asset Manager")
+// 	}
+// }
+
+func oneM2M_create(tm *SssMgr, sensor SensorDiscoveryInfo, path string) (sensorResp SensorDiscoveryInfo, err error) {
+	sensorResp, err = tm.OneM2M_create(sensor, path)
+	if err != nil {
+		return sensorResp, err
+	}
+
+	return sensorResp, nil
+}
+
+func oneM2M_createAE_CNT_CIN(tm *SssMgr) (sensors map[string]SensorDiscoveryInfo, received_sensors map[string]SensorDiscoveryInfo, err error) {
+	sensors = make(map[string]SensorDiscoveryInfo, 0)
+	received_sensors = make(map[string]SensorDiscoveryInfo, 0)
+
+	var sensor_ae = SensorDiscoveryInfo{
+		SensorIdentifier: "CMyAE",
+		SensorType:       "AE",
+		SensorPosition:   nil,
+		IotPlatformId:    "7feaadbb0400",
+	}
+	sensors[sensor_ae.SensorType] = sensor_ae
+	new_sensor_ae, err := oneM2M_create(tm, sensor_ae, "")
+	if err != nil {
+		return nil, nil, err
+	}
+	received_sensors[new_sensor_ae.SensorType] = new_sensor_ae
+
+	var sensor_cnt = SensorDiscoveryInfo{
+		SensorIdentifier: "CMyCNT",
+		SensorType:       "CNT",
+		SensorPosition:   nil,
+		IotPlatformId:    "7feaadbb0400",
+	}
+	sensorPath := new_sensor_ae.SensorIdentifier
+	sensors[sensor_cnt.SensorType] = sensor_cnt
+	new_sensor_cnt, err := oneM2M_create(tm, sensor_cnt, sensorPath)
+	if err != nil {
+		return nil, nil, err
+	}
+	received_sensors[new_sensor_cnt.SensorType] = new_sensor_cnt
+
+	var sensor_cin = SensorDiscoveryInfo{
+		SensorIdentifier: "CMyCNI",
+		SensorType:       "CIN",
+		SensorPosition:   nil,
+		IotPlatformId:    "7feaadbb0400",
+	}
+	sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1)
+	sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"}
+	sensorPath = new_sensor_cnt.SensorIdentifier
+	sensors[sensor_cin.SensorType] = sensor_cin
+	new_sensor_cin, err := oneM2M_create(tm, sensor_cin, sensorPath)
+	if err != nil {
+		return nil, nil, err
+	}
+	received_sensors[new_sensor_cin.SensorType] = new_sensor_cin
+
+	return sensors, received_sensors, nil
+}
+
+func validate_sensor_discovery_info(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_discovery_info: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_discovery_info: received_sensor: ", received_sensor)
+
+	if expected_sensor.SensorIdentifier == received_sensor.SensorIdentifier {
+		fmt.Println("received_sensor.SensorIdentifier == SensorIdentifier")
+		return false
+	}
+	if len(expected_sensor.SensorPropertyList) != len(received_sensor.SensorPropertyList) {
+		fmt.Println("len(received_sensor.SensorPropertyList) != len(SensorPropertyList)")
+		return false
+	} else if !reflect.DeepEqual(expected_sensor.SensorPropertyList, received_sensor.SensorPropertyList) {
+		fmt.Println("received_sensor.SensorPropertyList != SensorPropertyList")
+	}
+	if len(expected_sensor.SensorCharacteristicList) != len(received_sensor.SensorCharacteristicList) {
+		fmt.Println("len(received_sensor.SensorCharacteristicList) != len(SensorCharacteristicList)")
+		return false
+	} else if !reflect.DeepEqual(expected_sensor.SensorCharacteristicList, received_sensor.SensorCharacteristicList) {
+		fmt.Println("received_sensor.SensorCharacteristicList != SensorCharacteristicList")
+	}
+	// TODO To be continued
+
+	return true
+}
+
+func validate_sensor_ae(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_ae: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_ae: received_sensor: ", received_sensor)
+
+	if received_sensor.SensorIdentifier == "" {
+		fmt.Println("validate_sensor_ae.SensorIdentifier shall be set")
+		return false
+	}
+	if received_sensor.SensorType == "" {
+		fmt.Println("validate_sensor_ae.SensorType shall be set")
+		return false
+	}
+	if received_sensor.IotPlatformId != expected_sensor.IotPlatformId {
+		fmt.Println("validate_sensor_ae.IotPlatformId != IotPlatformId")
+		return false
+	}
+	if len(received_sensor.SensorCharacteristicList) == 0 {
+		fmt.Println("validate_sensor_ae.SensorCharacteristicList shall not be empty")
+		return false
+	}
+
+	for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined
+		found := true
+		switch c.CharacteristicName {
+		case "api":
+		case "srv":
+		case "pi":
+		case "ct":
+		case "et":
+		case "lt":
+		case "aei":
+		case "rn":
+		case "rr":
+		default:
+			found = true
+		} // End of 'switch' statement
+		if !found {
+			fmt.Println("Incomplete SensorCharacteristicList")
+			return false
+		}
+	}
+
+	return true
+}
+
+func validate_sensor_cnt(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_cnt: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_cnt: received_sensor: ", received_sensor)
+
+	if received_sensor.SensorIdentifier == "" {
+		fmt.Println("validate_sensor_ae.SensorIdentifier shall be set")
+		return false
+	}
+	if received_sensor.SensorType != received_sensor.SensorType {
+		fmt.Println("validate_sensor_cnt.SensorType != SensorType")
+		return false
+	}
+	if received_sensor.IotPlatformId != expected_sensor.IotPlatformId {
+		fmt.Println("validate_sensor_cnt.IotPlatformId != IotPlatformId")
+		return false
+	}
+	if len(received_sensor.SensorCharacteristicList) == 0 {
+		fmt.Println("validate_sensor_cnt.SensorCharacteristicList shall not be empty")
+		return false
+	}
+
+	for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined
+		found := true
+		switch c.CharacteristicName {
+		case "cni":
+		case "pi":
+		case "ct":
+		case "et":
+		case "lt":
+		case "st":
+		case "cbs":
+		case "mbs":
+		case "mni":
+		case "rn":
+		default:
+			found = true
+		} // End of 'switch' statement
+		if !found {
+			fmt.Println("Incomplete SensorCharacteristicList")
+			return false
+		}
+	}
+
+	return true
+}
+
+func validate_sensor_cin(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool {
+	fmt.Println(">>> validate_sensor_cin: expected_sensor: ", expected_sensor)
+	fmt.Println(">>> validate_sensor_cin: received_sensor: ", received_sensor)
+
+	if received_sensor.SensorIdentifier == "" {
+		fmt.Println("validate_sensor_ae.SensorIdentifier shall be set")
+		return false
+	}
+	if received_sensor.SensorType != received_sensor.SensorType {
+		fmt.Println("validate_sensor_cin.SensorType != SensorType")
+		return false
+	}
+	if received_sensor.IotPlatformId != expected_sensor.IotPlatformId {
+		fmt.Println("validate_sensor_cin.IotPlatformId != IotPlatformId")
+		return false
+	}
+	if len(received_sensor.SensorCharacteristicList) == 0 {
+		fmt.Println("validate_sensor_cin.SensorCharacteristicList shall not be empty")
+		return false
+	}
+
+	for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined
+		found := true
+		switch c.CharacteristicName {
+		case "pi":
+		case "lt":
+		case "cs":
+		case "et":
+		case "cnf":
+		case "con":
+		case "ct":
+		case "rn":
+		default:
+			found = true
+		} // End of 'switch' statement
+		if !found {
+			fmt.Println("Incomplete SensorCharacteristicList")
+			return false
+		}
+	}
+
+	return true
+}
+
+func discoveryNotify(map[string]interface{}) {
+	log.Debug(">>> discoveryNotify")
+
+}
+
+func statusNotify(map[string]interface{}) {
+	log.Debug(">>> statusNotify")
+
+}
+
+func dataNotify(map[string]interface{}) {
+	log.Debug(">>> dataNotify")
+
+}
diff --git a/go-packages/meep-vis-traffic-mgr/mqtt.go b/go-packages/meep-vis-traffic-mgr/mqtt.go
index 9b2af487a8e35d115f08d947740771cb0d6181d9..07cec8eb26404ed432a676af8b86f6b6bb4269ee 100644
--- a/go-packages/meep-vis-traffic-mgr/mqtt.go
+++ b/go-packages/meep-vis-traffic-mgr/mqtt.go
@@ -161,9 +161,9 @@ func (broker_mqtt *message_broker_mqtt) Send(tm *TrafficMgr, msgContent string,
 			log.Error(err.Error())
 			return err
 		}
-		log.Info("message_broker_simu: Send: Publish content : ", content)
-		log.Info("message_broker_simu: Send: msgEncodeFormat: ", msgEncodeFormat)
-		log.Info("message_broker_simu: Send: stdOrganization: ", stdOrganization)
+		log.Info("message_broker_mqtt: Send: Publish content : ", content)
+		log.Info("message_broker_mqtt: Send: msgEncodeFormat: ", msgEncodeFormat)
+		log.Info("message_broker_mqtt: Send: stdOrganization: ", stdOrganization)
 		token := broker_mqtt.client.Publish(tm.topic, 0, false, content)
 		token.Wait()
 
diff --git a/test/run-ut.sh b/test/run-ut.sh
index cec25b25db65e617ded7dc7d34f522612edf71fb..834895d6ff9e2a2ff33283ee8315649ad7a776c0 100755
--- a/test/run-ut.sh
+++ b/test/run-ut.sh
@@ -21,6 +21,8 @@ GOPKGS=(
     meep-gis-asset-mgr
     meep-vis-traffic-mgr
     meep-dai-mgr
+    meep-iot-mgr
+    meep-sss-mgr
     meep-metrics
     meep-model
     meep-mq