diff --git a/packages/components/model-team/test/team_test.js b/packages/components/model-team/test/team_test.js
index d5e8e8543baeaf00dce42ae70aaf72f99ee94f41..f08a41adaa53e8ea5ffaaa8f08528f688178704d 100644
--- a/packages/components/model-team/test/team_test.js
+++ b/packages/components/model-team/test/team_test.js
@@ -9,9 +9,22 @@ process.env.NODE_CONFIG = `{"pubsweet":{
 
 const { model: Team } = require('../src')
 const { model: User } = require('@pubsweet/model-user')
-
 const { dbCleaner } = require('pubsweet-server/test')
 
+const createTeamWithMember = async () => {
+  const user = await new User({
+    email: 'some@example.com',
+    username: 'test',
+  }).save()
+
+  const newTeam = await new Team({ name: 'Test', role: 'testRole' }).save()
+
+  const team = await Team.query().findById(newTeam.id)
+  await team.$relatedQuery('members').relate(user.id)
+
+  return { user, team }
+}
+
 describe('Team', () => {
   beforeEach(async () => {
     await dbCleaner()
@@ -43,83 +56,29 @@ describe('Team', () => {
   })
 
   it('can have some members', async () => {
-    const user = await new User({
-      email: 'some@example.com',
-      username: 'test',
-    }).save()
-    const newTeam = await new Team({ name: 'Test', role: 'testRole' }).save()
-
-    let team = await Team.query().findById(newTeam.id)
-    await team.$relatedQuery('members').relate(user.id)
-
-    team = await Team.query()
+    const newTeam = (await createTeamWithMember()).team
+    const team = await Team.query()
       .findById(newTeam.id)
       .eager('members')
 
     expect(team.members).toHaveLength(1)
   })
 
-  // it('can be found by property', async () => {
-  //   await new Manuscript({ title: 'Test' }).save()
-  //   const team = await Manuscript.findOneByField('title', 'Test')
-  //   expect(team.title).toEqual('Test')
-
-  //   let manuscripts = await Manuscript.findByField('title', 'Test')
-  //   expect(manuscripts[0].title).toEqual('Test')
-
-  //   async function findMissing() {
-  //     await Manuscript.findOneByField('title', 'Does not exist')
-  //   }
-
-  //   await expect(findMissing()).rejects.toThrow('Object not found')
-
-  //   manuscripts = await Manuscript.findByField('title', 'Does not exist')
-  //   expect(manuscripts).toEqual([])
-  // })
-
-  // it('can not be saved with non-valid properties', async () => {
-  //   async function createNonValidManuscript() {
-  //     await new Manuscript({ mumbo: 'jumbo' }).save()
-  //   }
-
-  //   await expect(createNonValidManuscript()).rejects.toThrow(
-  //     'mumbo: is an invalid additional property',
-  //   )
-  // })
-
-  // it('can assign to special properties', () => {
-  //   const manuscript = new Manuscript()
-  //   manuscript['#id'] = 'idref'
-  // })
-
-  // it('takes schema specified in config into account', async () => {
-  //   const manuscript = new Manuscript({ configField: 'hello' })
-  //   expect(manuscript.configField).toEqual('hello')
-  // })
-
-  // it('can save new entity with known ID', async () => {
-  //   const id = '1838d074-fb9d-4ed6-9c63-39e6bc7429ce'
-  //   const manuscript = await new Manuscript({ id }).save()
-  //   expect(manuscript.id).toEqual(id)
-  // })
-
-  // it('old data does not overwrite new', async () => {
-  //   // T0 - start time (A == B)
-  //   let manuscriptA = await new Manuscript({ title: 'T0' }).save()
-  //   expect(manuscriptA.title).toEqual('T0')
-  //   const manuscriptB = await Manuscript.find(manuscriptA.id)
-
-  //   // T1 - B is changed (not saved)
-  //   manuscriptB.title = 'T1'
-
-  //   // T2 - A is changed and saved
-  //   manuscriptA.title = 'T2'
-  //   manuscriptA = await manuscriptA.save()
-  //   expect(manuscriptA.updated).not.toBe(manuscriptB.updated)
-
-  //   // T4 - now save B, this should throw as `updated` is older than current.
-  //   await expect(manuscriptB.save()).rejects.toThrow(
-  //     'Data Integrity Error property updated',
-  //   )
-  // })
+  it('deletes memberships after team is deleted', async () => {
+    const { team, user } = await createTeamWithMember()
+
+    let foundUser = await User.query()
+      .findById(user.id)
+      .eager('teams')
+
+    expect(foundUser.teams).toHaveLength(1)
+
+    await Team.query().deleteById(team.id)
+
+    foundUser = await User.query()
+      .findById(user.id)
+      .eager('teams')
+
+    expect(foundUser.teams).toHaveLength(0)
+  })
 })
diff --git a/packages/components/model-user/src/user.js b/packages/components/model-user/src/user.js
index 6ebdfeb198f45419cc5d077b488b2d4f671dfa4c..64332bbf31a672f4f1277d9c448318838c9a90c4 100644
--- a/packages/components/model-user/src/user.js
+++ b/packages/components/model-user/src/user.js
@@ -24,6 +24,26 @@ class User extends BaseModel {
     return 'users'
   }
 
+  static get relationMappings() {
+    return {
+      teams: {
+        relation: BaseModel.ManyToManyRelation,
+        modelClass: require.resolve('@pubsweet/model-team/src/team'),
+        join: {
+          from: 'users.id',
+          through: {
+            modelClass: require.resolve(
+              '@pubsweet/model-team-member/src/team_member',
+            ),
+            from: 'team_members.user_id',
+            to: 'team_members.team_id',
+          },
+          to: 'teams.id',
+        },
+      },
+    }
+  }
+
   static get schema() {
     return {
       properties: {