diff --git a/CHANGELOG b/CHANGELOG
index c6ea8144353b47e293961fb127ac505aff75654f..a33000d99580862e54ffa6a6da1531eb35291c50 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,8 @@ smasch (1.0.1-1) stable; urgency=low
   * bug fix: unfinish visit button was always disabled (#386)
   * bug fix: generating documents for templates did not work for subjects
     created before custom field was added to the study (#388)
+  * bug fix: readonly custom Date Field was improperly persisted in forms
+    (#383)
 
  -- Piotr Gawron <piotr.gawron@uni.lu>  Mon, 15 Mar 2021 14:00:00 +0200
 
diff --git a/smash/web/forms/study_subject_forms.py b/smash/web/forms/study_subject_forms.py
index c22662cd92ab569560c54da23d79d165d8b322ed..529e04b8c56eb65d60ebcc0d026a7a18e554e15d 100644
--- a/smash/web/forms/study_subject_forms.py
+++ b/smash/web/forms/study_subject_forms.py
@@ -7,8 +7,8 @@ from django.forms import ModelForm
 
 from web.forms.forms import DATETIMEPICKER_DATE_ATTRS, get_worker_from_args, DATEPICKER_DATE_ATTRS
 from web.models import StudySubject, Study, StudyColumns, VoucherType, Worker
-from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE, CUSTOM_FIELD_TYPE_TEXT, CUSTOM_FIELD_TYPE_BOOLEAN, \
-    CUSTOM_FIELD_TYPE_INTEGER, CUSTOM_FIELD_TYPE_DOUBLE, \
+from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE, CUSTOM_FIELD_TYPE_TEXT, \
+    CUSTOM_FIELD_TYPE_BOOLEAN, CUSTOM_FIELD_TYPE_INTEGER, CUSTOM_FIELD_TYPE_DOUBLE, \
     CUSTOM_FIELD_TYPE_DATE, CUSTOM_FIELD_TYPE_SELECT_LIST, CUSTOM_FIELD_TYPE_FILE
 from web.models.custom_data import CustomStudySubjectField, CustomStudySubjectValue
 from web.models.custom_data.custom_study_subject_field import get_study_subject_field_id
@@ -158,8 +158,9 @@ class StudySubjectAddForm(StudySubjectForm):
         instance = super(StudySubjectAddForm, self).save(commit)
         # we can add custom values only after object exists in the database
         for field_type in CustomStudySubjectField.objects.filter(study=self.study):
-            self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
-                get_study_subject_field_id(field_type)]))
+            if not field_type.readonly:
+                self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
+                    get_study_subject_field_id(field_type)]))
         return instance
 
     def build_screening_number(self, cleaned_data):
@@ -289,8 +290,9 @@ class StudySubjectEditForm(StudySubjectForm):
 
     def save(self, commit=True) -> StudySubject:
         for field_type in CustomStudySubjectField.objects.filter(study=self.study):
-            self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
-                get_study_subject_field_id(field_type)]))
+            if not field_type.readonly:
+                self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
+                    get_study_subject_field_id(field_type)]))
         return super(StudySubjectForm, self).save(commit)
 
     class Meta: