diff --git a/.make b/.make
index f3c36666eb1b1b7fa4b01bc4047b9209ed47126b..5af9b3e0ca97633f77ac472b43797a7d0f6bb60d 160000
--- a/.make
+++ b/.make
@@ -1 +1 @@
-Subproject commit f3c36666eb1b1b7fa4b01bc4047b9209ed47126b
+Subproject commit 5af9b3e0ca97633f77ac472b43797a7d0f6bb60d
diff --git a/charts/ci-values.yaml b/charts/ci-values.yaml
deleted file mode 100644
index 696b3422973890628a8bde70590bd2fa4a16bd34..0000000000000000000000000000000000000000
--- a/charts/ci-values.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-global:
-  annotations:
-    app.gitlab.com/app: CI_PROJECT_PATH_SLUG
-    app.gitlab.com/env: CI_ENVIRONMENT_SLUG
-  # by setting this parameter we can disable the lower level sub-system tango-base, archiver and webjive
-  # sub-system:
-  #   tango-base:
-  #     enabled: false
-  #   archiver:
-  #     enabled: false
-  #   webjive:
-  #     enabled: false
-
-# tango-base:
-#   enabled: true
-
-
diff --git a/charts/ska-tango-base/Chart.yaml b/charts/ska-tango-base/Chart.yaml
index 87652141a471581bf8157f0bab875665634419e4..c49d114f773905d0336aefebf61e118f8e01db96 100644
--- a/charts/ska-tango-base/Chart.yaml
+++ b/charts/ska-tango-base/Chart.yaml
@@ -2,9 +2,9 @@ apiVersion: v2
 appVersion: 0.3.23
 description: A Helm chart for deploying the TANGO base system on Kubernetes
 name: ska-tango-base
-version: 0.3.26
+version: 0.4.0
 icon: https://www.skatelescope.org/wp-content/uploads/2016/07/09545_NEW_LOGO_2014.png
 dependencies:
 - name: ska-tango-util
-  version: 0.3.23
+  version: 0.4.0
   repository: file://../ska-tango-util
diff --git a/charts/ska-tango-base/templates/databaseds.yaml b/charts/ska-tango-base/templates/databaseds.yaml
index 6e4aa2f915786ac329641ed0f55b0873a186919b..7175751eabe004f71fe77a16af74cd8f3aea815f 100644
--- a/charts/ska-tango-base/templates/databaseds.yaml
+++ b/charts/ska-tango-base/templates/databaseds.yaml
@@ -4,8 +4,47 @@
 {{ $tries := coalesce  .Values.global.tries 10}}
 {{ $sleep := coalesce  .Values.global.sleep 5}}
 
+{{ if .Values.global.operator }}
+
 ---
+apiVersion: tango.tango-controls.org/v1
+kind: DatabaseDS
+metadata:
+  name: {{ tpl ($databaseds_name | toString) . }}
+  namespace: {{ .Release.Namespace }}
+  labels:
+    component: {{ .Values.databaseds.component }}
+    function: {{ .Values.databaseds.function }}
+    domain: {{ .Values.databaseds.domain }}
+    intent: {{ .Values.databaseds.intent }}
+{{ toYaml (coalesce .Values.global.labels .Values.labels "label:none") | indent 4 }}
+{{- if or (.Values.global.annotations) (.Values.annotations) ((.Values.databaseds.vault).useVault) }}
+  annotations: 
+    vault.hashicorp.com/agent-inject: "true"
+    vault.hashicorp.com/agent-inject-status: "update"
+    vault.hashicorp.com/agent-inject-secret-config: "{{ .Values.databaseds.vault.secretPath }}/ska-tango-base/databaseds"
+    vault.hashicorp.com/agent-inject-template-config: |
+      {{`{{- with secret `}}"{{ .Values.databaseds.vault.secretPath }}/ska-tango-base/databaseds"{{` -}}`}}
+      {{`{{- range $k, $v := .Data.data }}`}}
+      {{`export {{ $k }}={{ $v }}`}}
+      {{`{{- end }}`}}
+      {{`{{- end }}`}}
+    vault.hashicorp.com/role: "{{ .Values.databaseds.vault.role }}"
+{{ toYaml (coalesce .Values.global.annotations .Values.annotations) | indent 4 }}
+{{- end }}
+spec:
+{{- if or (.Values.global.minikube) (.Values.global.exposeAllDS) }}
+  enableLoadBalancer: true
+{{- end }}
+  imagePullPolicy: IfNotPresent
+{{- if (coalesce .Values.global.minikube .Values.minikube false)  }}
+  tangDBStorageClass: standard
+{{- else }}
+  tangDBStorageClass: nfss1
+{{- end }}
 
+{{- else }}
+---
 apiVersion: v1
 kind: Service
 metadata:
@@ -72,8 +111,8 @@ spec:
         domain: {{ .Values.databaseds.domain }}
         intent: {{ .Values.databaseds.intent }}
 {{ toYaml (coalesce .Values.global.labels .Values.labels "label:none") | indent 8 }}
-      annotations:
-{{ if ((.Values.databaseds.vault).useVault) }}         
+{{ if or (.Values.global.annotations) (.Values.annotations) ((.Values.databaseds.vault).useVault) }}
+      annotations: 
         vault.hashicorp.com/agent-inject: "true"
         vault.hashicorp.com/agent-inject-status: "update"
         vault.hashicorp.com/agent-inject-secret-config: "{{ .Values.databaseds.vault.secretPath }}/ska-tango-base/databaseds"
@@ -84,8 +123,6 @@ spec:
           {{`{{- end }}`}}
           {{`{{- end }}`}}
         vault.hashicorp.com/role: "{{ .Values.databaseds.vault.role }}"
-{{ end }}        
-{{ if or (.Values.global.annotations) (.Values.annotations) }}
 {{ toYaml (coalesce .Values.global.annotations .Values.annotations) | indent 8 }}
 {{ end }}
     spec:
@@ -161,3 +198,5 @@ spec:
       tolerations:
 {{ toYaml . | indent 8 }}
 {{- end }}
+
+{{- end }}
\ No newline at end of file
diff --git a/charts/ska-tango-base/values.yaml.sh b/charts/ska-tango-base/values.yaml.sh
index 4f60ea29d62f56048c89c5d572c8e4c1a0465aeb..6b4fb9759b4567dd52df3ee80bfccb421df4c83d 100644
--- a/charts/ska-tango-base/values.yaml.sh
+++ b/charts/ska-tango-base/values.yaml.sh
@@ -60,9 +60,6 @@ telescope: SKA-mid
 
 labels:
   app: ska-tango-images
-annotations:
-  app.gitlab.com/app: CI_PROJECT_PATH_SLUG
-  app.gitlab.com/env: CI_ENVIRONMENT_SLUG
 
 dsconfig:
   image:
diff --git a/charts/ska-tango-umbrella/Chart.yaml b/charts/ska-tango-umbrella/Chart.yaml
index 3b464e622f54ac8539e22d5159be3ee46b23eaed..d60bf23d996f159ef0a16912f81dc1210aaabb89 100644
--- a/charts/ska-tango-umbrella/Chart.yaml
+++ b/charts/ska-tango-umbrella/Chart.yaml
@@ -1,15 +1,15 @@
 apiVersion: v2
-appVersion: 0.2.5
 description: A Helm chart for deploying the TANGO base system on Kubernetes
 name: ska-tango-umbrella
-version: 0.2.6
+version: 0.2.7
+appVersion: 0.2.7
 icon: https://www.skatelescope.org/wp-content/uploads/2016/07/09545_NEW_LOGO_2014.png
 dependencies:
 - name: ska-tango-base
-  version: 0.3.26
+  version: 0.4.0
   repository: file://../ska-tango-base
   condition: ska-tango-base.enabled,global.sub-system.ska-tango-base.enabled
 - name: ska-tango-util
-  version: 0.3.23
+  version: 0.4.0
   repository: file://../ska-tango-util
 
diff --git a/charts/ska-tango-util/Chart.yaml b/charts/ska-tango-util/Chart.yaml
index 8a64a070d1ad25689613b880c3e874bb918d7a7c..e5433d08d0e0dfda8de282341c9b7482d7a2ebf0 100644
--- a/charts/ska-tango-util/Chart.yaml
+++ b/charts/ska-tango-util/Chart.yaml
@@ -2,8 +2,8 @@ apiVersion: v2
 description: A Helm chart library of utilities for TANGO deployents
 name: ska-tango-util
 type: library
-appVersion: 0.3.23
-version: 0.3.23
+appVersion: 0.4.0
+version: 0.4.0
 icon: https://www.skatelescope.org/wp-content/uploads/2016/07/09545_NEW_LOGO_2014.png
 maintainers:
 - name: Matteo Di Carlo
diff --git a/charts/ska-tango-util/templates/_configuration.yaml b/charts/ska-tango-util/templates/_configuration.yaml
index 4e3b9444dda91aa38a6898d4072fc944d1bf44b8..c1dceb832f9fd515ebaedc2574dd67719857de07 100644
--- a/charts/ska-tango-util/templates/_configuration.yaml
+++ b/charts/ska-tango-util/templates/_configuration.yaml
@@ -5,6 +5,7 @@
 {{ $dsconfig := coalesce .Values.global.dsconfig .Values.dsconfig}}
 {{ $itango := coalesce .Values.global.itango .Values.itango}}
 
+{{- if not .Values.global.operator }}
 ---
 apiVersion: v1
 kind: ServiceAccount
@@ -144,4 +145,5 @@ spec:
             name: {{ .Values.subsystem }}-configuration-{{ .Release.Name }}
       restartPolicy: Never
 
-{{- end -}}
+{{- end }}
+{{- end }}
diff --git a/charts/ska-tango-util/templates/_deviceserver.yaml b/charts/ska-tango-util/templates/_deviceserver.yaml
index a17ab0923ffd68badf802ef08b98773257df079f..ce63a671c7129cfaf4b7747c339225e66913a395 100644
--- a/charts/ska-tango-util/templates/_deviceserver.yaml
+++ b/charts/ska-tango-util/templates/_deviceserver.yaml
@@ -4,14 +4,18 @@
 {{ $annotations := coalesce .local.Values.global.annotations .local.Values.annotations }}
 {{ $default_tango_host := printf "%s-%s:10000" "databaseds-tango-base" .local.Release.Name }}
 {{ $tango_host := tpl (coalesce .local.Values.global.tango_host .local.Values.tango_host $default_tango_host | toString) .local }}
+{{- $databaseds_name := (split ":" $tango_host)._0 }} 
 {{ $dsconfig := coalesce .local.Values.global.dsconfig .local.Values.dsconfig}}
 {{ $chart := .local }}
 {{ $safe_instance := .instance |toString | replace "_" "-" }}
 {{ $kubectl_wait_timeout := coalesce $dsconfig.timeout "120s" }}
+
+{{- if not .local.Values.global.operator }}
 ---
 # Device Server Service
 # Parameter: deviceserver struct, global.Values.dsconfig struct, project image struct
 # giving a dummy Service entry ensures that the single pod is DNS addressable
+
 apiVersion: v1
 kind: Service
 metadata:
@@ -186,4 +190,75 @@ spec:
 {{ toYaml . | indent 8 }}
 {{- end }}
 
+{{- else }} #operator
+
+---
+apiVersion: tango.tango-controls.org/v1
+kind: DeviceServer
+metadata:
+  name: {{.deviceserver.name | toString }}-{{ $safe_instance }}
+  namespace: {{ $chart.Release.Namespace }}
+  labels:
+{{ toYaml $labels | indent 4 }}
+    component: {{tpl (.deviceserver.name | toString) $chart }}-{{ $safe_instance }}
+    function: {{ .deviceserver.function }}
+    domain: {{ .deviceserver.domain }}
+    subsystem: {{ $chart.Values.subsystem }}
+{{ if $annotations }}
+  annotations:
+{{ toYaml $annotations | indent 4 }}
 {{ end }}
+spec:
+{{- if or ($chart.Values.global.minikube) ($chart.Values.global.exposeAllDS) (.deviceserver.exposeDS) }}
+  enableLoadBalancer: true
+{{- end }}
+  databaseds: {{ $databaseds_name }}
+  image: "{{ tpl (.deviceserver.image.registry | toString) $chart }}/{{ tpl (.deviceserver.image.image | toString) $chart }}:{{ tpl (.deviceserver.image.tag | toString) $chart }}"
+  imagePullPolicy: {{ tpl (.deviceserver.image.pullPolicy | toString) $chart }}
+  args: "{{ $safe_instance | toString }}"
+{{- if $chart.Values.dsconfig.configuration_file }}
+  config: |
+{{ $chart.Files.Get $chart.Values.dsconfig.configuration_file | indent 4 }}
+{{- end }}
+  script: "{{ .deviceserver.command }}"
+{{- if (.deviceserver.depends_on) }}
+  dependsOn:
+{{- range $index, $device := .deviceserver.depends_on }}
+  - "{{ $device.device | toString }}"
+{{- end }}
+{{- end }}
+{{- if or ($chart.Values.global.environment_variables) (.deviceserver.environment_variables) }}
+  env:
+{{- range $index, $envvar := $chart.Values.global.environment_variables }}
+  - name: {{$envvar.name}}
+    value: {{tpl ($envvar.value | toString) $chart }}
+{{- end }}
+{{- range $index, $envvar := .deviceserver.environment_variables }}
+  - name: {{$envvar.name}}
+    value: {{tpl ($envvar.value | toString) $chart | quote }}
+{{- end }}
+{{- end }}
+{{- if not $chart.Values.do_not_constraint_resources }}
+  resources:
+{{ toYaml (coalesce .deviceserver.resources $chart.Values.resources) | indent 4 }}
+{{ end }}
+{{- with (coalesce .deviceserver.securityContext $chart.Values.securityContext) }}
+  securityContext:
+    {{- toYaml . | nindent 4 }}
+{{ end }}
+{{- with (coalesce .deviceserver.nodeSelector $chart.Values.nodeSelector) }}
+  nodeSelector:
+    {{- toYaml . | nindent 4 }}
+{{- end }}
+{{- with $chart.Values.affinity }}
+  affinity:
+    {{- toYaml . | nindent 4 }}
+{{- end }}
+{{- with $chart.Values.tolerations }}
+  tolerations:
+    {{- toYaml . | nindent 4 }}
+{{- end }}
+
+
+{{- end }} # end if operator
+{{- end }} #device server
diff --git a/charts/ska-tango-util/templates/_multidevice-config.yaml b/charts/ska-tango-util/templates/_multidevice-config.yaml
index 228de1e042c3ec17d8b309a07a2f5a7a50afff22..ae1d5e31cc76714dce57343e618ad04ab6891030 100644
--- a/charts/ska-tango-util/templates/_multidevice-config.yaml
+++ b/charts/ska-tango-util/templates/_multidevice-config.yaml
@@ -1,5 +1,4 @@
 {{ define "ska-tango-util.multidevice-config.tpl" }}
-
 ---
 {{ $labels := coalesce .local.Values.global.labels .local.Values.labels "label: none" }}
 {{ $annotations := coalesce .local.Values.global.annotations .local.Values.annotations }}
@@ -23,6 +22,7 @@ metadata:
   annotations:
 {{ toYaml $annotations | indent 4 }}
 data:
+{{- if not .local.Values.global.operator }}
   configuration.json: |
     {
       "servers": {
@@ -115,6 +115,7 @@ data:
         exit $rc
       fi
     fi
+{{- end }}
   {{ $deviceserver.server.name }}.py: |
     import importlib
     import importlib.util
@@ -152,8 +153,4 @@ data:
         main()
 
 
-
-
-
-
 {{ end }} # multidevice-config.tpl
diff --git a/charts/ska-tango-util/templates/_multidevice-job.yaml b/charts/ska-tango-util/templates/_multidevice-job.yaml
index 3f8918918d6e5629052b0386132568aafe68241b..021d4743ddb67c5044143a40a346001ab2cc279b 100644
--- a/charts/ska-tango-util/templates/_multidevice-job.yaml
+++ b/charts/ska-tango-util/templates/_multidevice-job.yaml
@@ -1,5 +1,7 @@
 {{ define "ska-tango-util.multidevice-job.tpl" }}
 
+{{- if not .local.Values.global.operator }}
+
 ---
 {{ $labels := coalesce .local.Values.global.labels .local.Values.labels "label:none" }}
 {{ $annotations := coalesce .local.Values.global.annotations .local.Values.annotations }}
@@ -94,5 +96,5 @@ spec:
 
 
 
-
+{{ end }}
 {{ end }} # multidevice-job.tpl
diff --git a/charts/ska-tango-util/templates/_multidevice-sacc-role.yaml b/charts/ska-tango-util/templates/_multidevice-sacc-role.yaml
index d82a3724b32903ad788d9cf4870d357b3389e8e7..b8246630706758451492aeba3cfac11de8a9dec0 100644
--- a/charts/ska-tango-util/templates/_multidevice-sacc-role.yaml
+++ b/charts/ska-tango-util/templates/_multidevice-sacc-role.yaml
@@ -1,4 +1,6 @@
 {{ define "ska-tango-util.multidevice-sacc-role.tpl" }}
+{{- if not .local.Values.global.operator }}
+
 ---
 {{ $deviceserver_name := tpl (coalesce .name .deviceserver.name | toString) .local }}
 ---
@@ -35,4 +37,5 @@ rules:
   verbs: ["list", "get", "watch"]
 
 
+{{ end }}
 {{ end }} # multidevice-sacc-role.tpl
diff --git a/charts/ska-tango-util/templates/_multidevice-svc.yaml b/charts/ska-tango-util/templates/_multidevice-svc.yaml
index 1c4cb850e643a0d26986603c26d5ed0b67d9fee8..2b03160a5ea0d78a107b24c49e2713561d7d33d8 100644
--- a/charts/ska-tango-util/templates/_multidevice-svc.yaml
+++ b/charts/ska-tango-util/templates/_multidevice-svc.yaml
@@ -7,6 +7,9 @@ Parameters:
 - instance (of the device server)
 */}}
 {{ define "ska-tango-util.multidevice-svc.tpl" }}
+
+{{- if not .local.Values.global.operator }}
+
 ---
 {{ $labels := coalesce .local.Values.global.labels .local.Values.labels "label:none" }}
 {{ $annotations := coalesce .local.Values.global.annotations .local.Values.annotations }}
@@ -143,7 +146,7 @@ spec:
           - sh
           - -c
         args:
-          - kubectl wait job --for=condition=complete {{ $deviceserver_name | toString }}-{{ $chart.Release.Name }}-config --timeout={{ $kubectl_wait_timeout }}
+          - kubectl wait job --for=jsonpath='{.status.succeeded}'=1 {{ $deviceserver_name | toString }}-{{ $chart.Release.Name }}-config --timeout={{ $kubectl_wait_timeout }}
 {{ if ($deviceserver.depends_on) }}
 {{ range $index, $device := $deviceserver.depends_on }}
 {{ if ($device.host) }}
@@ -350,4 +353,10 @@ spec:
 
 {{ end }} # range instances
 
+{{ else }} ## else operator
+
+{{- $context := dict "name" .name "deviceserver" .deviceserver "image" .image "local" .local }}
+{{ template "ska-tango-util.operator-svc.tpl" $context }}
+
+{{ end }}
 {{ end }} # multidevice-svc.tpl
diff --git a/charts/ska-tango-util/templates/_operator-ds.yaml b/charts/ska-tango-util/templates/_operator-ds.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c74392462a52f35d992219dbc744c28684de24bc
--- /dev/null
+++ b/charts/ska-tango-util/templates/_operator-ds.yaml
@@ -0,0 +1,187 @@
+{{- /*
+tango-util.operator.tpl
+Parameters:
+- deviceserver (the deviceserver entire yaml tag)
+- image (to be used for the deviceserver)
+- local (the local chart)
+- instance (of the device server)
+*/}}
+{{ define "ska-tango-util.operator-svc.tpl" }}
+---
+{{- $labels := coalesce .local.Values.global.labels .local.Values.labels "label:none" }}
+{{- $annotations := coalesce .local.Values.global.annotations .local.Values.annotations }}
+{{- $default_tango_host := printf "%s-%s:10000" "databaseds-tango-base-" .local.Release.Name }}
+{{- $tango_host := tpl (coalesce .local.Values.global.tango_host .local.Values.tango_host $default_tango_host | toString) .local }}
+{{- $databaseds_name := (split ":" $tango_host)._0 }} 
+{{- $chart := .local }}
+{{- $deviceserver := .deviceserver }}
+{{- $deviceserver_name := tpl (coalesce .name .deviceserver.name | toString) .local }}
+{{- range $instance := $deviceserver.server.instances }}
+{{- $safe_instance := $instance.name | toString | replace "_" "-" }}
+{{- if has $safe_instance $deviceserver.instances }}
+---
+apiVersion: tango.tango-controls.org/v1
+kind: DeviceServer
+metadata:
+  name: {{$deviceserver_name | toString }}-{{ $safe_instance }}
+  namespace: {{ $chart.Release.Namespace }}
+  labels:
+{{ toYaml $labels | indent 4 }}
+    component: {{tpl ($deviceserver_name | toString) $chart }}-{{ $safe_instance }}
+    function: {{ $deviceserver.function }}
+    domain: {{ $deviceserver.domain }}
+    subsystem: {{ $chart.Values.subsystem }}
+{{ if $annotations }}
+  annotations:
+{{ toYaml $annotations | indent 4 }}
+{{ end }}
+spec:
+{{- if or ($chart.Values.global.minikube) ($chart.Values.global.exposeAllDS) ($deviceserver.exposeDS) }}
+  enableLoadBalancer: true
+{{- end }}
+  databaseds: {{ $databaseds_name }}
+  image: "{{ tpl ($deviceserver.image.registry | toString) $chart }}/{{ tpl ($deviceserver.image.image | toString) $chart }}:{{ tpl ($deviceserver.image.tag | toString) $chart }}"
+  imagePullPolicy: {{ tpl ($deviceserver.image.pullPolicy | toString) $chart }}
+  args: "{{ $safe_instance | toString }}"
+  volumes:
+  - name: configuration
+    configMap:
+      name: {{$deviceserver_name | toString }}-{{ $chart.Release.Name }}-dsconfig-json
+  {{ if hasKey $deviceserver "volume" }}
+  - name: volume-data
+    persistentVolumeClaim:
+      claimName: {{ $deviceserver.volume.existingClaimName | default (printf "%s-pvc-%s" $deviceserver.volume.name $chart.Release.Name) }}
+  {{ end }}
+  volumeMounts:
+  - name: configuration
+    mountPath: data
+    readOnly: true
+  {{ with $deviceserver.volume }}
+  - name: volume-data
+    mountPath: {{ .mountPath }}
+    readOnly: {{ (hasKey . "readOnly" | ternary .readOnly true) }}{{/* https://github.com/helm/helm/issues/3308 */}}
+  {{ end }}
+  config: |
+    {
+      "servers": {
+        "{{ $deviceserver.server.name }}" : {
+          {{- range $index_instance,$instance := $deviceserver.server.instances }}
+          {{- if has $instance.name $deviceserver.instances }}
+          {{- if hasKey $deviceserver "tmp_start_instance" }},{{end}}
+          {{- $_ := set $deviceserver "tmp_start_instance" "1" }}
+          "{{ $instance.name }}": {
+            {{- range $index_class, $class := $instance.classes }}
+            {{- if $index_class}},{{end}}
+            "{{ $class.name }}": {
+              {{- range $index_device, $device := $class.devices }}
+              {{- if $index_device}},{{end}}
+              "{{ $device.name }}": {
+                {{- if $device.properties }}
+                "properties": {
+                  {{- range $index_property, $property := $device.properties }}
+                  {{- if $index_property}},{{end}}
+                  "{{ $property.name }}": [
+                    {{- range $index_value, $value := $property.values }}
+                    {{- if $index_value}},{{end}}
+                    "{{ tpl $value $chart }}"
+                    {{- end }}
+                    ]
+                  {{- end }}
+                }{{ if $device.attribute_properties }},{{ end }}
+                {{- end }}
+                {{- if $device.attribute_properties }}
+                "attribute_properties": {
+                  {{- range $index_attr_prop, $attr_prop := $device.attribute_properties }}
+                  {{- if $index_attr_prop}},{{end}}
+                  "{{ $attr_prop.attribute }}": {
+                    {{- range $index_prop, $prop := $attr_prop.properties }}
+                    {{- if $index_prop}},{{end}}
+                    "{{ $prop.name }}": [
+                    {{- range $index_value, $value := $prop.values }}
+                    {{- if $index_value}},{{end}}
+                    "{{ tpl $value $chart }}"
+                    {{- end }}
+                    ]
+                    {{- end }}
+                  }
+                {{- end }}
+                }
+                {{- end }}
+              }
+              {{- end }}
+            }
+            {{- end }}
+          }
+          {{- end }}
+          {{- end }}
+        }
+      }{{ if $deviceserver.class_properties }},
+      "classes": {
+        {{- range $index_class_prop_group, $class_prop_group := $deviceserver.class_properties }}
+        {{- if $index_class_prop_group}},{{end}}
+          "{{ $class_prop_group.name }}": {
+              "properties": {
+                {{- range $index_class_prop, $class_prop := $class_prop_group.properties }}
+                {{- if $index_class_prop}},{{end}}
+                  "{{ $class_prop.name }}": [
+                    {{- range $index_value, $value := $class_prop.values }}
+                    {{- if $index_value}},{{end}}
+                    "{{ tpl $value $chart }}"
+                    {{- end }}
+                  ]
+                {{- end }}
+              }
+          }
+        {{- end }}
+      }
+      {{- end }}
+    }
+    {{- $_ := unset $deviceserver "tmp_start_instance" }}
+{{- if $deviceserver.command }}
+  script: "{{ $deviceserver.command }}"
+{{- else }}
+  script: "/data/{{ $deviceserver.server.name }}.py"
+{{- end }}
+{{- if ($deviceserver.depends_on) }}
+  dependsOn:
+{{- range $index, $device := $deviceserver.depends_on }}
+  - "{{ $device.device | toString }}"
+{{- end }}
+{{- end }}
+{{- if or ($chart.Values.global.environment_variables) ($deviceserver.environment_variables) }}
+  env:
+{{- range $index, $envvar := $chart.Values.global.environment_variables }}
+  - name: {{$envvar.name}}
+    value: {{tpl ($envvar.value | toString) $chart }}
+{{- end }}
+{{- range $index, $envvar := $deviceserver.environment_variables }}
+  - name: {{$envvar.name}}
+    value: {{tpl ($envvar.value | toString) $chart | quote }}
+{{- end }}
+{{- end }}
+{{- if not $chart.Values.do_not_constraint_resources }}
+  resources:
+{{ toYaml (coalesce $instance.resources $deviceserver.resources $chart.Values.resources) | indent 4 }}
+{{ end }}
+{{- with (coalesce $deviceserver.securityContext $chart.Values.securityContext) }}
+  securityContext:
+    {{- toYaml . | nindent 4 }}
+{{ end }}
+{{- with (coalesce $deviceserver.nodeSelector $chart.Values.nodeSelector) }}
+  nodeSelector:
+    {{- toYaml . | nindent 4 }}
+{{- end }}
+{{- with $chart.Values.affinity }}
+  affinity:
+    {{- toYaml . | nindent 4 }}
+{{- end }}
+{{- with $chart.Values.tolerations }}
+  tolerations:
+    {{- toYaml . | nindent 4 }}
+{{- end }}
+
+{{ end }} ## if has
+
+{{ end }} # range instances
+
+{{ end }} # ska-tango-util.operator-svc.tpl