diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb
index 14abd825..d70ade71 100644
--- a/app/controllers/api/submissions_controller.rb
+++ b/app/controllers/api/submissions_controller.rb
@@ -106,7 +106,8 @@ module Api
 
     def submissions_params
       params.permit(submission: [{
-                      submitters: [[:uuid, :name, :email, :role, :completed, :phone, { values: {} }]]
+                      submitters: [[:uuid, :name, :email, :role, :completed, :phone,
+                                    { values: {}, readonly_fields: [] }]]
                     }])
     end
 
diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue
index ed47c14e..eea283fe 100644
--- a/app/javascript/submission_form/form.vue
+++ b/app/javascript/submission_form/form.vue
@@ -484,7 +484,7 @@ export default {
       return this.currentStepFields[0]
     },
     stepFields () {
-      return this.fields.reduce((acc, f) => {
+      return this.fields.filter((f) => !f.readonly).reduce((acc, f) => {
         const prevStep = acc[acc.length - 1]
 
         if (f.type === 'checkbox' && Array.isArray(prevStep) && prevStep[0].type === 'checkbox') {
diff --git a/app/views/submit_form/show.html.erb b/app/views/submit_form/show.html.erb
index 7813e0c4..ab659e2d 100644
--- a/app/views/submit_form/show.html.erb
+++ b/app/views/submit_form/show.html.erb
@@ -1,5 +1,5 @@
 <% fields_index = Templates.build_field_areas_index(@submitter.submission.template_fields || @submitter.submission.template.fields) %>
-<% values = @submitter.submission.submitters.where.not(id: @submitter.id).reduce({}) { |acc, sub| acc.merge(sub.values) } %>
+<% values = @submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } %>
 <% attachments_index = ActiveStorage::Attachment.where(record: @submitter.submission.submitters, name: :attachments).preload(:blob).index_by(&:uuid) %>
 
   
@@ -20,6 +20,7 @@
               <% fields_index.dig(document.uuid, index)&.each do |(area, field)| %>
                 <% value = values[field['uuid']] %>
                 <% next if value.blank? %>
+                <% next if !field['readonly'] && field['submitter_uuid'] == @submitter.uuid %>
                 <%= render 'submissions/value', area:, field:, attachments_index:, value:, locale: @submitter.submission.template.account.locale %>
               <% end %>
             
diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb
index 60a0b43c..c571d6a3 100644
--- a/lib/submissions/create_from_submitters.rb
+++ b/lib/submissions/create_from_submitters.rb
@@ -9,11 +9,10 @@ module Submissions
         submission = template.submissions.new(created_by_user: user, source:,
                                               template_submitters: template.submitters, submitters_order:)
 
+        maybe_set_template_fields(submission, attrs[:submitters])
+
         attrs[:submitters].each_with_index do |submitter_attrs, index|
-          uuid =
-            submitter_attrs[:uuid].presence ||
-            template.submitters.find { |e| e['name'] == submitter_attrs[:role] }&.dig('uuid') ||
-            template.submitters[index]&.dig('uuid')
+          uuid = find_submitter_uuid(template, submitter_attrs, index)
 
           next if uuid.blank?
 
@@ -26,6 +25,37 @@ module Submissions
       end
     end
 
+    def maybe_set_template_fields(submission, submitters_attrs)
+      template_fields = submission.template.fields.deep_dup
+
+      submitters_attrs.each_with_index do |submitter_attrs, index|
+        next if submitter_attrs[:readonly_fields].blank?
+
+        uuid = find_submitter_uuid(submission.template, submitter_attrs, index)
+
+        template_fields.each do |f|
+          next if f['submitter_uuid'] != uuid ||
+                  (!f['name'].in?(submitter_attrs[:readonly_fields]) &&
+                   !f['name'].parameterize.underscore.in?(submitter_attrs[:readonly_fields]))
+
+          f['readonly'] = true
+        end
+      end
+
+      if template_fields != submission.template.fields
+        submission.template_fields = template_fields
+        submission.template_schema = submission.template.schema
+      end
+
+      submission
+    end
+
+    def find_submitter_uuid(template, attrs, index)
+      attrs[:uuid].presence ||
+        template.submitters.find { |e| e['name'] == attrs[:role] }&.dig('uuid') ||
+        template.submitters[index]&.dig('uuid')
+    end
+
     def build_submitter(submission:, attrs:, uuid:, is_order_sent:, mark_as_sent:)
       email = Submissions.normalize_email(attrs[:email])