diff --git a/opentech/apply/funds/models/mixins.py b/opentech/apply/funds/models/mixins.py
index 8c768d156bff230ca83228f349b02b06756bbefd..d0da58924f6f1d3c3ee4b38153262692615a7390 100644
--- a/opentech/apply/funds/models/mixins.py
+++ b/opentech/apply/funds/models/mixins.py
@@ -1,4 +1,5 @@
 from django.utils.text import mark_safe
+from django.core.files import File
 
 from opentech.apply.stream_forms.blocks import FormFieldBlock
 from opentech.apply.utils.blocks import MustIncludeFieldBlock
@@ -30,6 +31,14 @@ class AccessFormData:
                 data[field_id] = response
         return data
 
+    def deserialise_file(self, file):
+        print(file)
+        if isinstance(file, StreamFieldFile):
+            return file
+        if isinstance(file, File):
+            return StreamFieldFile(file.file, name=file.name)
+        return StreamFieldFile(None, name=file['name'])
+
     @property
     def deserialised_data(self):
         # Converts the file dicts into actual file objects
@@ -38,9 +47,9 @@ class AccessFormData:
             if isinstance(field.block, UploadableMediaBlock):
                 file = data.get(field.id, [])
                 try:
-                    data[field.id] = StreamFieldFile(file.file, name=file.name)
+                    data[field.id] = self.deserialise_file(file)
                 except AttributeError:
-                    data[field.id] = [StreamFieldFile(f.file, name=f.name) for f in file]
+                    data[field.id] = [self.deserialise_file(f) for f in file]
         return data
 
     def get_definitive_id(self, id):
diff --git a/opentech/apply/stream_forms/files.py b/opentech/apply/stream_forms/files.py
index 4dccf00cbbb0e51a4aa8b67649af51a4d6227ccf..946609c1d9754bdf27c6a15d3f2cf1f60d6f0a3f 100644
--- a/opentech/apply/stream_forms/files.py
+++ b/opentech/apply/stream_forms/files.py
@@ -9,7 +9,8 @@ class StreamFieldDataEncoder(DjangoJSONEncoder):
     def default(self, o):
         if isinstance(o, StreamFieldFile):
             return {
-                'path': o.name,
+                'name': o.name,
+                'path': o.path,
             }
         return super().default(o)
 
@@ -59,15 +60,14 @@ class StreamFieldFile(File):
         else:
             self.file.open(mode)
         return self
-    # open() doesn't alter the file's contents, but it does reset the pointer
-    open.alters_data = True
 
     def save(self, folder):
-        file_path = os.path.join(folder, self.name)
-        name = self.storage.generate_filename(file_path)
+        name = self.name
+        if not name.startswith(folder):
+            name = os.path.join(folder, name)
+        name = self.storage.generate_filename(name)
         self.name = self.storage.save(name, self.file)
         self._committed = True
-    save.alters_data = True
 
     def delete(self, save=True):
         if not self:
@@ -83,8 +83,6 @@ class StreamFieldFile(File):
         self.name = None
         self._committed = False
 
-    delete.alters_data = True
-
     @property
     def closed(self):
         file = getattr(self, '_file', None)