diff --git a/packages/component-invite/config/test.js b/packages/component-invite/config/test.js
index 6da7762b05361ae72d6841628918d2864fa1e9f6..9046f749c74d8697f323149d26e1b4b9ba81ab2c 100644
--- a/packages/component-invite/config/test.js
+++ b/packages/component-invite/config/test.js
@@ -8,10 +8,10 @@ module.exports = {
       'http://localhost:3000/invite',
   },
   roles: {
-    global: ['admin', 'editorInChief', 'author'],
+    global: ['admin', 'editorInChief', 'author', 'handlingEditor'],
     collection: ['handlingEditor', 'reviewer'],
     inviteRights: {
-      admin: ['admin', 'editorInChief', 'author'],
+      admin: ['admin', 'editorInChief', 'author', 'handlingEditor'],
       editorInChief: ['handlingEditor'],
       handlingEditor: ['reviewer'],
     },
diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js
index 2dc68984601b5ab8ddf8a60ea8ae01db49434cb0..36a16362ff3ab1e7002ce38375849053bd9802a9 100644
--- a/packages/component-invite/src/controllers/assignCollectionRole.js
+++ b/packages/component-invite/src/controllers/assignCollectionRole.js
@@ -63,12 +63,19 @@ module.exports = async (
   try {
     let user = await models.User.findByEmail(email)
 
-    const team = await teamHelper.setupManuscriptTeam(
-      models,
-      user,
+    let team = teamHelper.getTeamByGroupAndCollection(
       collectionId,
       role,
+      models.Team,
     )
+    if (team === undefined) {
+      team = await teamHelper.setupManuscriptTeam(
+        models,
+        user,
+        collectionId,
+        role,
+      )
+    }
 
     // getting the updated user from the DB - creating a team also updates the user
     user = await models.User.findByEmail(email)
@@ -84,7 +91,7 @@ module.exports = async (
       return res.status(200).json(user)
     } catch (e) {
       logger.error(e)
-      return res.status(500).json({ error: 'Mailing could not be sent.' })
+      return res.status(500).json({ error: 'Mail could not be sent.' })
     }
   } catch (e) {
     const notFoundError = await helpers.handleNotFoundError(e, 'user')
diff --git a/packages/component-invite/src/helpers/Team.js b/packages/component-invite/src/helpers/Team.js
index 553b4cd75f9d84eceecca548b54a851a94c77331..ae6758c967a6ddb379699ffeb1332d81967b55cc 100644
--- a/packages/component-invite/src/helpers/Team.js
+++ b/packages/component-invite/src/helpers/Team.js
@@ -166,6 +166,16 @@ const getInviteData = (invitations, collectionId, role) => {
   return { timestamp, status }
 }
 
+const getTeamByGroupAndCollection = async (collectionId, role, TeamModel) => {
+  const teams = await TeamModel.all()
+  return teams.find(
+    team =>
+      team.group === role &&
+      team.object.type === 'collection' &&
+      team.object.id === collectionId,
+  )
+}
+
 module.exports = {
   createNewTeam,
   setupEiCTeams,
@@ -175,4 +185,5 @@ module.exports = {
   removeTeamMember,
   getTeamMembersByCollection,
   getInviteData,
+  getTeamByGroupAndCollection,
 }
diff --git a/packages/component-invite/src/helpers/helpers.js b/packages/component-invite/src/helpers/helpers.js
index b575118780be1e6c3da1932adac332d543051a5b..2ec5f5f9f7d8ce52f0bba0f12417d8a3f9e09128 100644
--- a/packages/component-invite/src/helpers/helpers.js
+++ b/packages/component-invite/src/helpers/helpers.js
@@ -96,6 +96,7 @@ const createNewUser = async (
     title,
     editorInChief: role === 'editorInChief',
     admin: role === 'admin',
+    handlingEditor: role === 'handlingEditor',
   }
   let newUser = new UserModel(userBody)
   try {
diff --git a/packages/component-invite/src/routes/postInvite.js b/packages/component-invite/src/routes/postInvite.js
index 6c8d4de3a92bccf49ad4f3a4a5de8335796dafb1..c0f7b4affe79e61ee1fad8c167cd40d784c67963 100644
--- a/packages/component-invite/src/routes/postInvite.js
+++ b/packages/component-invite/src/routes/postInvite.js
@@ -30,7 +30,7 @@ module.exports = models => async (req, res) => {
   const collectionId = get(req, 'params.collectionId')
 
   const url = `${req.protocol}://${req.get('host')}`
-  if (collectionId) {
+  if (collectionId)
     return require('../controllers/assignCollectionRole')(
       email,
       role,
@@ -40,7 +40,6 @@ module.exports = models => async (req, res) => {
       models,
       url,
     )
-  }
 
   if (reqUser.admin)
     return require('../controllers/inviteGlobalRole')(
diff --git a/packages/component-invite/src/tests/postInvite.test.js b/packages/component-invite/src/tests/postInvite.test.js
index 74aff28e5e9e68ecda6dd0eba2ae819d8d78f7aa..a1a4d894374154483ff55736d04bdb903b1a51b3 100644
--- a/packages/component-invite/src/tests/postInvite.test.js
+++ b/packages/component-invite/src/tests/postInvite.test.js
@@ -6,6 +6,9 @@ const random = require('lodash/random')
 const fixtures = require('./fixtures/fixtures')
 const Chance = require('chance')
 const Model = require('./helpers/Model')
+const config = require('config')
+
+const configRoles = config.get('roles')
 
 const models = Model.build()
 jest.mock('pubsweet-component-mail-service', () => ({
@@ -13,9 +16,7 @@ jest.mock('pubsweet-component-mail-service', () => ({
   setupAssignEmail: jest.fn(),
 }))
 const chance = new Chance()
-const globalRoles = ['editorInChief', 'author', 'admin']
-const manuscriptRoles = ['handlingEditor', 'reviewer']
-
+const globalRoles = configRoles.global
 const body = {
   email: chance.email(),
   role: globalRoles[random(0, globalRoles.length - 1)],
@@ -48,7 +49,7 @@ describe('Post invite route handler', () => {
     expect(data.email).toEqual(body.email)
     expect(data.admin).toEqual(body.admin)
   })
-  it('should return an error when the admin invites an user on a collection', async () => {
+  it('should return an error when the admin invites a user on a collection', async () => {
     const req = httpMocks.createRequest({
       body,
     })
@@ -62,8 +63,8 @@ describe('Post invite route handler', () => {
       `admin cannot invite an ${body.role} to a collection`,
     )
   })
-  it('should return an error when the admin invites a manuscript role', async () => {
-    body.role = manuscriptRoles[random(0, manuscriptRoles.length - 1)]
+  it('should return an error when the admin invites a reviewer', async () => {
+    body.role = 'reviewer'
     body.admin = false
     const req = httpMocks.createRequest({
       body,
@@ -76,6 +77,7 @@ describe('Post invite route handler', () => {
     expect(data.error).toEqual(
       `admin tried to invite an invalid role: ${body.role}`,
     )
+    body.role = globalRoles[random(0, globalRoles.length - 1)]
   })
   it('should return an error params are missing', async () => {
     delete body.email
diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js
index 1c1b4105179b4f8c6c16ba02a2890736b5b9283b..d6b8a057e65d92cac258106b300f973bcff68971 100644
--- a/packages/xpub-faraday/config/default.js
+++ b/packages/xpub-faraday/config/default.js
@@ -48,10 +48,10 @@ module.exports = {
     url: process.env.PUBSWEET_INVITE_PASSWORD_RESET_URL || '/invite',
   },
   roles: {
-    global: ['admin', 'editorInChief', 'author'],
+    global: ['admin', 'editorInChief', 'author', 'handlingEditor'],
     collection: ['handlingEditor', 'reviewer'],
     inviteRights: {
-      admin: ['admin', 'editorInChief', 'author'],
+      admin: ['admin', 'editorInChief', 'author', 'handlingEditor'],
       editorInChief: ['handlingEditor'],
       handlingEditor: ['reviewer'],
     },
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index 1ed3e06f9bc48bce828e3542295611e8f748b23e..550c6caa6c0ae14212271b1f57d95e431079363c 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -97,6 +97,7 @@ module.exports = {
     invitations: Joi.array(),
     teams: Joi.array(),
     editorInChief: Joi.boolean(),
+    handlingEditor: Joi.boolean(),
   },
   team: {
     group: Joi.string(),