diff --git a/.release b/.release
index 29f0fa7ecdb74ff387e9e687a48285baae0b45d5..de450897a25f0135877012985df72c05b2ee11c6 100644
--- a/.release
+++ b/.release
@@ -1,2 +1,2 @@
-release=0.3.11
-tag=0.3.11
+release=0.3.12
+tag=0.3.12
diff --git a/Makefile b/Makefile
index c2c9f529780100eb1ce43a7d34c9e1682d6c8b32..94e3adf04e10f3852abc468b81ccce5e245b924b 100644
--- a/Makefile
+++ b/Makefile
@@ -165,10 +165,13 @@ package: helm-pre-publish ## package charts
 	cd ./repository && helm repo index .; \
 	rm -rf ./tmp
 
+
 helm-pre-publish: ## hook before helm chart publish
 	@echo "helm-pre-publish: generating charts/ska-tango-base/values.yaml"
 	@cd charts/ska-tango-base && bash ./values.yaml.sh
 
+helm-pre-build: helm-pre-publish
+
 helm-pre-lint: helm-pre-publish ## make sure auto-generate values.yaml happens
 
 # use pre update hook to update chart values
diff --git a/charts/ska-tango-base/Chart.yaml b/charts/ska-tango-base/Chart.yaml
index a8003f4d54ad4cd87842bdce1ec6d5fc185c338c..cb56d89a1fe2e2538b10f8757138109e2fc48a3a 100644
--- a/charts/ska-tango-base/Chart.yaml
+++ b/charts/ska-tango-base/Chart.yaml
@@ -1,10 +1,10 @@
 apiVersion: v2
-appVersion: 0.3.11
+appVersion: 0.3.12
 description: A Helm chart for deploying the TANGO base system on Kubernetes
 name: ska-tango-base
-version: 0.3.11
+version: 0.3.12
 icon: https://www.skatelescope.org/wp-content/uploads/2016/07/09545_NEW_LOGO_2014.png
 dependencies:
 - name: ska-tango-util
-  version: 0.3.11
+  version: 0.3.12
   repository: file://../ska-tango-util
diff --git a/charts/ska-tango-umbrella/Chart.yaml b/charts/ska-tango-umbrella/Chart.yaml
index 4dd73523fae958b6d7a05eae112930ac40ef70b9..f76bc37d2a5f09ed83f65d7579247963a8b621b7 100644
--- a/charts/ska-tango-umbrella/Chart.yaml
+++ b/charts/ska-tango-umbrella/Chart.yaml
@@ -1,15 +1,15 @@
 apiVersion: v2
-appVersion: 0.2.3
+appVersion: 0.2.4
 description: A Helm chart for deploying the TANGO base system on Kubernetes
 name: ska-tango-umbrella
-version: 0.2.3
+version: 0.2.4
 icon: https://www.skatelescope.org/wp-content/uploads/2016/07/09545_NEW_LOGO_2014.png
 dependencies:
 - name: ska-tango-base
-  version: 0.3.11
+  version: 0.3.12
   repository: file://../ska-tango-base
   condition: ska-tango-base.enabled,global.sub-system.ska-tango-base.enabled
 - name: ska-tango-util
-  version: 0.3.11
+  version: 0.3.12
   repository: file://../ska-tango-util
 
diff --git a/charts/ska-tango-util/Chart.yaml b/charts/ska-tango-util/Chart.yaml
index 36e3967ea3611a5cd8518d51bbb31f71c3715935..313837d1fc25ed094d309ddc0d769b9ce4ff4543 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.11
-version: 0.3.11
+appVersion: 0.3.12
+version: 0.3.12
 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/_deviceserver-pvc.yaml b/charts/ska-tango-util/templates/_deviceserver-pvc.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..151bb024b8d509a144aaa14923602f14f04ea562
--- /dev/null
+++ b/charts/ska-tango-util/templates/_deviceserver-pvc.yaml
@@ -0,0 +1,90 @@
+{{- /*
+Creates persistent volume claim and a management pod for the data it contains.
+It is ONE claim per deviceserver definition not per instance!
+These will only be created if the key "deviceserver.volume" is defined.
+It assumes dynamic persistent volumes.
+
+Parameters are:
+
+- volume.name         name of the volume, e.g. "firmware"
+- volume.mountPath    mount path inside the container, e.g. "/firmware"
+- volume.size         (optional and set to 250Mi by default)
+- volume.admin_image  structure composed by registry, image, tag and policy for the OCI image to use
+- local (the local chart)
+
+*/}}
+{{ define "ska-tango-util.deviceserver-pvc.tpl" }}
+
+---
+{{- if .volume }}
+
+{{ $volume_name := .volume.name }}
+{{ $volume_path := .volume.mountPath }}
+{{ $volume_size := coalesce .volume.storage "250Mi" }}
+{{ $labels := coalesce .local.Values.global.labels .local.Values.labels "label:none" }}
+{{ $annotations := coalesce .local.Values.global.annotations .local.Values.annotations }}
+
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: {{ $volume_name | toString }}-pvc-{{ .local.Release.Name }}
+  namespace: {{ .local.Release.Namespace }}
+  labels:
+{{ toYaml $labels | indent 4 }}
+{{ if $annotations }}
+  annotations:
+{{ toYaml $annotations | indent 4 }}
+{{ end }}
+spec:
+{{ if (coalesce .local.Values.global.minikube .local.Values.minikube false)  }}
+  storageClassName: standard
+{{ else }}
+  storageClassName: nfss1
+{{ end }}
+  accessModes:
+    - ReadWriteMany
+  resources:
+    requests:
+      storage: {{ $volume_size }}
+
+---
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    vol: {{ $volume_name | toString }}-admin
+{{ toYaml $labels | indent 4 }}
+  name: {{ $volume_name | toString }}-admin-{{ .local.Release.Name }}
+{{ if $annotations }}
+  annotations:
+{{ toYaml $annotations | indent 4 }}
+{{ end }}
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      vol: {{ $volume_name | toString }}-admin
+  template:
+    metadata:
+      labels:
+        vol: {{ $volume_name | toString }}-admin
+    spec:
+      containers:
+      - name: volume-admin
+        image: "{{ $.volume.admin_image.registry }}/{{ $.volume.admin_image.image }}:{{ $.volume.admin_image.tag }}"
+        imagePullPolicy: {{ $.volume.admin_image.pullPolicy }}
+        command: [ "/bin/sh", "-c", "--" ]
+        args: [ "touch {{ $volume_path }}/started; while true; do sleep 30; done;" ]
+        volumeMounts:
+          - name: volume-data
+            mountPath: {{ $volume_path }}
+      volumes:
+      - name: volume-data
+        persistentVolumeClaim: 
+          claimName: {{ $volume_name | toString }}-pvc-{{ .local.Release.Name }}
+
+{{- end }}
+
+{{ end }} # deviceserver-pvc.tpl
\ No newline at end of file
diff --git a/charts/ska-tango-util/templates/_multidevice-svc.yaml b/charts/ska-tango-util/templates/_multidevice-svc.yaml
index a28203b94a30c6ef4b3bfc494b249e46656b66ce..85ad76f21b7d09a0d36d428d24ab6fa02cc05a3c 100644
--- a/charts/ska-tango-util/templates/_multidevice-svc.yaml
+++ b/charts/ska-tango-util/templates/_multidevice-svc.yaml
@@ -129,6 +129,11 @@ spec:
         - name: configuration
           configMap:
             name: {{$deviceserver_name | toString }}-{{ $chart.Release.Name }}-dsconfig-json
+        {{ if hasKey $deviceserver "volume" }}
+        - name: volume-data
+          persistentVolumeClaim: 
+            claimName: {{ $deviceserver.volume.name | toString }}-pvc-{{ $chart.Release.Name }}
+        {{ end }}
       serviceAccountName: {{ $deviceserver_name | toString }}-sa-{{ $chart.Release.Name }}
       initContainers:
       - name: wait-for-configuration
@@ -236,6 +241,11 @@ spec:
           - name: configuration
             mountPath: data
             readOnly: true
+          {{ if hasKey $deviceserver "volume" }}
+          - name: volume-data
+            mountPath: {{ $deviceserver.volume.mountPath }}
+            readOnly: true
+          {{ end }}
         livenessProbe:
           exec:
             command:
diff --git a/docs/src/helm_charts.rst b/docs/src/helm_charts.rst
index bfd356df181433d1a5b47cbe0f8affa5680791c2..7f689fc0d98dcc4020e6525fa95714a576c8faed 100644
--- a/docs/src/helm_charts.rst
+++ b/docs/src/helm_charts.rst
@@ -29,6 +29,7 @@ In specific it defines the following helm named template:
  - multidevice-job: it creates a job for the `dsconfig <https://github.com/MaxIV-KitsControls/lib-maxiv-dsconfig>`_ application to apply a configuration json file set into the values file;
  - multidevice-sacc-role: it creates a k8s service account, a role and role binding for waiting the configuration job to be done;
  - multidevice-svc: it creates a k8s service and a k8s statefulset for a device server tag specified in the values file.
+ - deviceserver-pvc: it optionally creates a volume for the deviceserver when it contains the dictionary `volume`. The subkeys are `name`, `mountPath` and `storage`. See example below.
 
 
 Dsconfig generation
@@ -107,6 +108,9 @@ Below there is an example of a values file that can be used with the ska-tango-u
                 image: "{{.Values.tango_example.image.image}}"
                 tag: "{{.Values.tango_example.image.tag}}"
                 pullPolicy: "{{.Values.tango_example.image.pullPolicy}}"
+            volume:
+                name: firmware
+                mountPath: /firmware
 
 
 Fields explained:
@@ -163,6 +167,8 @@ This templates are called by the below `template <https://gitlab.com/ska-telesco
     {{ template "ska-tango-util.multidevice-sacc-role.tpl" $context }}
     {{ template "ska-tango-util.multidevice-job.tpl" $context }}
     {{ template "ska-tango-util.multidevice-svc.tpl" $context }}
+    {{ template "ska-tango-util.deviceserver-pvc.tpl" $context }}
+
 
     {{- else }}
 
@@ -172,6 +178,7 @@ This templates are called by the below `template <https://gitlab.com/ska-telesco
     {{ template "ska-tango-util.multidevice-sacc-role.tpl" $context }}
     {{ template "ska-tango-util.multidevice-job.tpl" $context }}
     {{ template "ska-tango-util.multidevice-svc.tpl" $context }}
+    {{ template "ska-tango-util.deviceserver-pvc.tpl" $context }}
 
     {{- end }}
 
@@ -184,4 +191,4 @@ Tango-example template description:
     - **Line 8**  : As discussed before it is possible to have a instances field in the values.yaml file and in the data file, it is also possible to have instances defined as a global field. It is being used a coalesced function that takes the first not null value of the list. The priority is, first it takes the instance value from the global variable if there is none it takes it from the values file and then from the data file.
     - **Line 27** : Same as line 8 but without the possibility of having the instance field on the data file.
     - **Line 9** and **Line 18** : Context is a list of variables that will passed as arguments to the templates.
-    - **Templates** : There are four templates already described before. Each template will be called for each deviceServer as they are inside the range loop (line 3).
+    - **Templates** : There are five templates already described before. Each template will be called for each deviceServer as they are inside the range loop (line 3).