diff --git a/opentech/apply/funds/models/mixins.py b/opentech/apply/funds/models/mixins.py
index a907e669c187d393f19009930f956dcee14edb6e..3e99beab2861a56117c28e64d89df0ade73c9166 100644
--- a/opentech/apply/funds/models/mixins.py
+++ b/opentech/apply/funds/models/mixins.py
@@ -31,24 +31,37 @@ class AccessFormData:
                 data[field_id] = response
         return data
 
-    def deserialise_file(self, file):
+    @classmethod
+    def stream_file(cls, file):
         if isinstance(file, StreamFieldFile):
             return file
         if isinstance(file, File):
             return StreamFieldFile(file.file, name=file.name)
         return StreamFieldFile(None, name=file['name'], filename=file.get('filename'))
 
-    @property
-    def deserialised_data(self):
+    @classmethod
+    def process_file(cls, file):
+        try:
+            return cls.stream_file(file)
+        except TypeError:
+            return [cls.stream_file(f) for f in file]
+
+    @classmethod
+    def from_db(cls, db, field_names, values):
+        instance = super().from_db(db, field_names, values)
+        if 'form_data' in field_names:
+            # When the form_data is loaded from the DB deserialise it
+            instance.form_data = cls.deserialised_data(instance.form_data, instance.form_fields)
+        return instance
+
+    @classmethod
+    def deserialised_data(cls, data, form_fields):
         # Converts the file dicts into actual file objects
-        data = self.raw_data.copy()
-        for field in self.form_fields:
+        data = data.copy()
+        for field in form_fields:
             if isinstance(field.block, UploadableMediaBlock):
                 file = data.get(field.id, [])
-                try:
-                    data[field.id] = self.deserialise_file(file)
-                except TypeError:
-                    data[field.id] = [self.deserialise_file(f) for f in file]
+                data[field.id] = cls.process_file(file)
         return data
 
     def get_definitive_id(self, id):
@@ -63,7 +76,7 @@ class AccessFormData:
     def data(self, id):
         definitive_id = self.get_definitive_id(id)
         try:
-            return self.deserialised_data[definitive_id]
+            return self.raw_data[definitive_id]
         except KeyError as e:
             # We have most likely progressed application forms so the data isnt in form_data
             return None
diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py
index 432ef41ec11ad4d0652bc486f984b1175d3fa00f..e6bb7b7d2a428aef64a705f73015a2c3abed1f9a 100644
--- a/opentech/apply/funds/models/submissions.py
+++ b/opentech/apply/funds/models/submissions.py
@@ -456,8 +456,8 @@ class ApplicationSubmission(
         # Will return True/False if the revision was created or not
         self.clean_submission()
         current_submission = ApplicationSubmission.objects.get(id=self.id)
-        current_data = current_submission.deserialised_data
-        if current_data != self.deserialised_data or force:
+        current_data = current_submission.form_data
+        if current_data != self.form_data or force:
             if self.live_revision == self.draft_revision:
                 revision = ApplicationRevision.objects.create(submission=self, form_data=self.form_data, author=by)
             else:
@@ -479,7 +479,7 @@ class ApplicationSubmission(
     def clean_submission(self):
         self.process_form_data()
         self.ensure_user_has_account()
-        self.process_file_data(self.deserialised_data)
+        self.process_file_data(self.form_data)
 
     def process_form_data(self):
         for field_name, field_id in self.must_include.items():
@@ -491,14 +491,14 @@ class ApplicationSubmission(
         files = {}
         for field in self.form_fields:
             if isinstance(field.block, UploadableMediaBlock):
-                files[field.id] = self.deserialised_data[field.id]
+                files[field.id] = self.data(field.id) or []
                 self.form_data.pop(field.id, None)
         return files
 
     def process_file_data(self, data):
         for field in self.form_fields:
             if isinstance(field.block, UploadableMediaBlock):
-                file = data.get(field.id, [])
+                file = self.process_file(data.get(field.id, []))
                 folder = os.path.join('submission', str(self.id), field.id)
                 try:
                     file.save(folder)
diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py
index be1fbddd81574d6f84a76d289cfba62bc5e8b5aa..702fbb8ca60f47df698dbb8409c3ecc0794b0c23 100644
--- a/opentech/apply/funds/tests/test_models.py
+++ b/opentech/apply/funds/tests/test_models.py
@@ -392,11 +392,11 @@ class TestApplicationSubmission(TestCase):
     def test_create_revision_on_data_change(self):
         submission = ApplicationSubmissionFactory()
         submission.form_data['title'] = 'My Awesome Title'
-        new_data = submission.deserialised_data
+        new_data = submission.form_data
         submission.create_revision()
         submission = self.refresh(submission)
         self.assertEqual(submission.revisions.count(), 2)
-        self.assertDictEqual(submission.live_revision.deserialised_data, new_data)
+        self.assertDictEqual(submission.live_revision.form_data, new_data)
 
     def test_dont_create_revision_on_data_same(self):
         submission = ApplicationSubmissionFactory()
diff --git a/opentech/apply/funds/tests/test_views.py b/opentech/apply/funds/tests/test_views.py
index ebc1659d22c2c412f87512c0849d582a730269b4..6131353fc2f6838764545666b11ff868342a4882 100644
--- a/opentech/apply/funds/tests/test_views.py
+++ b/opentech/apply/funds/tests/test_views.py
@@ -303,7 +303,7 @@ class TestApplicantSubmissionView(BaseSubmissionViewTestCase):
         self.draft_proposal_submission.save()
 
         response = self.get_page(self.draft_proposal_submission, 'edit')
-        self.assertDictEqual(response.context['object'].deserialised_data, draft_revision.deserialised_data)
+        self.assertDictEqual(response.context['object'].form_data, draft_revision.form_data)
 
     def test_cant_edit_submission_incorrect_state(self):
         submission = InvitedToProposalFactory(user=self.user)
@@ -321,7 +321,7 @@ class TestRevisionsView(BaseSubmissionViewTestCase):
 
     def test_create_revisions_on_submit(self):
         submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user)
-        old_data = submission.deserialised_data.copy()
+        old_data = submission.form_data.copy()
 
         new_title = 'New title'
         new_data = prepare_form_data(submission, title=new_title)
@@ -332,14 +332,14 @@ class TestRevisionsView(BaseSubmissionViewTestCase):
 
         self.assertEqual(submission.status, 'proposal_discussion')
         self.assertEqual(submission.revisions.count(), 2)
-        self.assertDictEqual(submission.revisions.last().deserialised_data, old_data)
-        self.assertDictEqual(submission.live_revision.deserialised_data, submission.deserialised_data)
+        self.assertDictEqual(submission.revisions.last().form_data, old_data)
+        self.assertDictEqual(submission.live_revision.form_data, submission.form_data)
         self.assertEqual(submission.live_revision.author, self.user)
         self.assertEqual(submission.title, new_title)
 
     def test_dont_update_live_revision_on_save(self):
         submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user)
-        old_data = submission.deserialised_data.copy()
+        old_data = submission.form_data.copy()
 
         new_data = prepare_form_data(submission, title='New title')
 
@@ -349,9 +349,9 @@ class TestRevisionsView(BaseSubmissionViewTestCase):
 
         self.assertEqual(submission.status, 'draft_proposal')
         self.assertEqual(submission.revisions.count(), 2)
-        self.assertDictEqual(submission.draft_revision.deserialised_data, submission.from_draft().deserialised_data)
+        self.assertDictEqual(submission.draft_revision.form_data, submission.from_draft().form_data)
         self.assertEqual(submission.draft_revision.author, self.user)
-        self.assertDictEqual(submission.live_revision.deserialised_data, old_data)
+        self.assertDictEqual(submission.live_revision.form_data, old_data)
 
     def test_existing_draft_edit_and_submit(self):
         submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user)