diff --git a/server/model-file/src/file.js b/server/model-file/src/file.js
index 64284826f7414791e1487bea8c05a5d25462abc3..de10f74af9ab6973e24f20e8ea98d661f3581e2f 100644
--- a/server/model-file/src/file.js
+++ b/server/model-file/src/file.js
@@ -1,5 +1,4 @@
 const BaseModel = require('@pubsweet/base-model')
-const logger = require('@pubsweet/logger')
 
 class File extends BaseModel {
   static get tableName() {
@@ -11,6 +10,29 @@ class File extends BaseModel {
     this.type = 'file'
   }
 
+  static get relationMappings() {
+    const { Manuscript, ReviewComment } = require('@pubsweet/models')
+
+    return {
+      manuscript: {
+        relation: BaseModel.BelongsToOneRelation,
+        modelClass: Manuscript,
+        join: {
+          from: 'manuscripts.id',
+          to: 'files.manuscript_id',
+        },
+      },
+      reviewComment: {
+        relation: BaseModel.BelongsToOneRelation,
+        modelClass: ReviewComment,
+        join: {
+          from: 'review_comments.id',
+          to: 'files.review_comments_id',
+        },
+      },
+    }
+  }
+
   static get schema() {
     return {
       properties: {
@@ -20,25 +42,11 @@ class File extends BaseModel {
         fileType: { type: ['string', 'null'] },
         filename: { type: ['string', 'null'] },
         size: { type: ['integer', 'null'] },
-        object: { type: ['string', 'null'] },
-        objectId: { type: 'string', format: 'uuid' },
+        reviewCommentId: { type: ['string', 'null'], format: 'uuid' },
+        manuscriptId: { type: ['string', 'null'], format: 'uuid' },
       },
     }
   }
-
-  static async findByObject({ object, object_id }) {
-    logger.debug('Finding Files by Object')
-
-    const results = await this.query()
-      .where('object', object)
-      .andWhere('object_id', object_id)
-
-    return results
-  }
-
-  // async $beforeDelete() {
-  //   await Team.deleteAssociated(this.data.type, this.id)
-  // }
 }
 
 File.type = 'file'
diff --git a/server/model-file/src/index.js b/server/model-file/src/index.js
index 5f1d108b1e4e4ec0e9e547db5bdbb08af74de6a6..3146f811a5304a8da93c489f57f81acad29efbd6 100644
--- a/server/model-file/src/index.js
+++ b/server/model-file/src/index.js
@@ -1,10 +1,8 @@
 const resolvers = require('./resolvers')
 const typeDefs = require('./typeDefs')
-const model = require('./file')
 
 module.exports = {
-  model,
-  modelName: 'File',
+  models: [{ modelName: 'File', model: require('./file') }],
   resolvers,
   typeDefs,
 }
diff --git a/server/model-file/src/migrations/1537450834-files.sql b/server/model-file/src/migrations/1537450834-files.sql
deleted file mode 100644
index c18083f7b9455aefcadbabe42d3821d1052f5d24..0000000000000000000000000000000000000000
--- a/server/model-file/src/migrations/1537450834-files.sql
+++ /dev/null
@@ -1,14 +0,0 @@
-CREATE TABLE files (
-    id UUID PRIMARY KEY,
-    created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp,
-    updated TIMESTAMP WITH TIME ZONE,
-    object TEXT, 
-    object_id UUID,
-    label TEXT,
-    file_type TEXT,
-    filename TEXT,
-    url TEXT,
-    mime_type TEXT,
-    size INTEGER,
-    type TEXT NOT NULL
-);
\ No newline at end of file
diff --git a/server/model-file/src/migrations/1596838897-files.sql b/server/model-file/src/migrations/1596838897-files.sql
new file mode 100644
index 0000000000000000000000000000000000000000..f823bc1ce840b4300e346776bf163aff24fdf889
--- /dev/null
+++ b/server/model-file/src/migrations/1596838897-files.sql
@@ -0,0 +1,24 @@
+CREATE TABLE files (
+    id UUID PRIMARY KEY,
+    created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp,
+    updated TIMESTAMP WITH TIME ZONE,
+    -- object_type TEXT,
+    -- object_id UUID,
+    label TEXT,
+    file_type TEXT,
+    filename TEXT,
+    url TEXT,
+    mime_type TEXT,
+    size INTEGER,
+    type TEXT NOT NULL,
+    -- Things that can have files
+    manuscript_id UUID REFERENCES manuscripts(id) ON DELETE CASCADE,
+    review_comment_id UUID REFERENCES review_comments(id) ON DELETE CASCADE,
+
+    constraint exactly_one_file_owner check(
+      (
+        (manuscript_id is not null)::integer +
+        (review_comment_id is not null)::integer
+      ) = 1
+    )
+);
\ No newline at end of file
diff --git a/server/model-file/src/resolvers.js b/server/model-file/src/resolvers.js
index da8ea91c7c9c0b3e9a1423ac232df849defd7a10..aa7af76dba0aad48f1ab53e039945b3f69ff2c75 100644
--- a/server/model-file/src/resolvers.js
+++ b/server/model-file/src/resolvers.js
@@ -32,6 +32,7 @@ const resolvers = {
       const path = await upload(file)
       meta.url = `/static/${path}`
       const data = await new File(meta).save()
+
       return data
     },
   },
diff --git a/server/model-file/src/typeDefs.js b/server/model-file/src/typeDefs.js
index 34050c96a91107418bba4e9e5951163a8bc5dc72..d9d84614fc758b9025cb5b5423fbe8a5b0c85967 100644
--- a/server/model-file/src/typeDefs.js
+++ b/server/model-file/src/typeDefs.js
@@ -8,8 +8,8 @@ const typeDefs = `
     fileType: String
     filename: String
     mimeType: String
-    object: String
-    objectId: ID!
+    manuscriptId: ID
+    reviewCommentId: ID
     label: String
     size: Int
   }
@@ -18,8 +18,8 @@ const typeDefs = `
     id: ID!
     created: DateTime!
     updated: DateTime
-    object: String
-    objectId: ID!
+    manuscriptId: ID
+    reviewCommentId: ID
     label: String
     fileType: String
     filename: String