diff --git a/packages/component-helper-service/src/services/Collection.js b/packages/component-helper-service/src/services/Collection.js
index b0789f05aa93601db62053ce8f5f18382b944973..741461e4ef2b933dbd03a8bcf952f2f34bf2cd9b 100644
--- a/packages/component-helper-service/src/services/Collection.js
+++ b/packages/component-helper-service/src/services/Collection.js
@@ -1,4 +1,7 @@
-const { findLast, isEmpty, maxBy, get, flatMap } = require('lodash')
+const config = require('config')
+const { findLast, isEmpty, maxBy, get, flatMap, last } = require('lodash')
+
+const { features = {}, recommendations: configRecommendations } = config
 
 const Fragment = require('./Fragment')
 
@@ -169,6 +172,10 @@ class Collection {
       ),
     )
   }
+
+  isLatestVersion(fragmentId) {
+    return last(this.collection.fragments) === fragmentId
+  }
 }
 
 module.exports = Collection
diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js
index 7a0f27ae03d656269c6e5c757c094dd083f1ddb8..c95fce7fec085e78da45654a08d795692db65ff7 100644
--- a/packages/component-helper-service/src/services/Fragment.js
+++ b/packages/component-helper-service/src/services/Fragment.js
@@ -1,4 +1,4 @@
-const { get, remove, findLast, last } = require('lodash')
+const { get, remove, findLast } = require('lodash')
 const config = require('config')
 const User = require('./User')
 
@@ -150,16 +150,18 @@ class Fragment {
     )
   }
 
-  canHEMakeAnotherRecommendation(currentUserRecommendations) {
-    const lastHERecommendation = last(currentUserRecommendations)
+  canHEMakeAnotherRecommendation(lastHERecommendation) {
     const { fragment: { recommendations = [] } } = this
+
     const returnToHERecommendation = findLast(
       recommendations,
       r => r.recommendation === 'return-to-handling-editor',
     )
+
     if (!returnToHERecommendation) return false
     return returnToHERecommendation.createdOn > lastHERecommendation.createdOn
   }
+
   async getReviewersAndEditorsData({ collection, UserModel }) {
     const {
       invitations = [],
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
index b47234c1f1a017149269ba6e415ee49d5af6b159..5f2bfbed5cc51996469d6191be2a3b8352d6bf74 100644
--- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js
@@ -1,5 +1,14 @@
 const uuid = require('uuid')
-const { pick, get, set, has, isEmpty, last, chain } = require('lodash')
+const {
+  pick,
+  get,
+  set,
+  has,
+  isEmpty,
+  last,
+  chain,
+  findLast,
+} = require('lodash')
 const config = require('config')
 const { v4 } = require('uuid')
 const logger = require('@pubsweet/logger')
@@ -14,10 +23,11 @@ const {
 const { features = {}, recommendations } = config
 
 const Notification = require('../../notifications/notification')
+const publishAsHE = require('./strategies/hePublish')
 
 module.exports = models => async (req, res) => {
   const { recommendation, comments, recommendationType } = req.body
-  if (!services.checkForUndefinedParams(recommendationType))
+  if (!services.checkForUndefinedParams(recommendationType, recommendation))
     return res.status(400).json({ error: 'Recommendation type is required.' })
 
   const reqUser = await models.User.find(req.user)
@@ -54,16 +64,6 @@ module.exports = models => async (req, res) => {
       error: notFoundError.message,
     })
   }
-  const currentUserRecommendations = get(
-    fragment,
-    'recommendations',
-    [],
-  ).filter(r => r.userId === req.user)
-
-  const lastFragmentRecommendation = chain(fragment)
-    .get('recommendations', [])
-    .last()
-    .value()
 
   const authsome = authsomeHelper.getAuthsome(models)
   const target = {
@@ -77,41 +77,47 @@ module.exports = models => async (req, res) => {
     })
 
   const fragmentHelper = new Fragment({ fragment })
-  if (
-    recommendationType === recommendations.type.editor &&
-    last(collection.fragments) !== fragmentId
-  ) {
-    return res
-      .status(400)
-      .json({ error: 'Cannot make a recommendation on an older version.' })
-  }
 
-  if (
-    recommendationType === recommendations.type.review &&
-    last(collection.fragments) !== fragmentId
-  ) {
-    return res
-      .status(400)
-      .json({ error: 'Cannot write a review on an older version.' })
+  if (!collectionHelper.isLatestVersion(fragmentId)) {
+    const error =
+      recommendationType === recommendations.type.editor
+        ? 'Cannot make a recommendation on an older version.'
+        : 'Cannot write a review on an older version.'
+    return res.status(400).json({ error })
   }
-  if (
-    last(collection.fragments) === fragmentId &&
-    !isEmpty(currentUserRecommendations)
-  ) {
+
+  // const currentUserRecommendations = get(
+  //   fragment,
+  //   'recommendations',
+  //   [],
+  // ).filter(r => r.userId === req.user)
+
+  const latestUserRecommendation = findLast(
+    fragment.recommendations,
+    r => r.userId === req.user,
+  )
+
+  if (latestUserRecommendation) {
     if (recommendationType === recommendations.type.review) {
       return res
         .status(400)
         .json({ error: 'Cannot write another review on this version.' })
     }
+
     if (
       recommendationType === recommendations.type.editor &&
       !isEditorInChief &&
-      !fragmentHelper.canHEMakeAnotherRecommendation(currentUserRecommendations)
+      !fragmentHelper.canHEMakeAnotherRecommendation(latestUserRecommendation)
     ) {
       return res.status(400).json({
         error: 'Cannot make another recommendation on this version.',
       })
     }
+
+    const lastFragmentRecommendation = chain(fragment)
+      .get('recommendations', [])
+      .last()
+      .value()
     if (
       recommendationType === recommendations.type.editor &&
       isEditorInChief &&
@@ -124,18 +130,34 @@ module.exports = models => async (req, res) => {
     }
   }
 
-  if (
-    recommendation === recommendations.publish &&
-    recommendationType === recommendations.type.editor &&
-    collection.handlingEditor &&
-    collection.handlingEditor.id === req.user
-  ) {
-    if (!collectionHelper.canHEMakeRecommendation(fragments, fragmentHelper)) {
-      return res.status(400).json({
-        error: 'Cannot publish without at least one reviewer report.',
-      })
-    }
+  const strategies = {
+    he: {
+      publish: publishAsHE,
+    },
   }
+  const role = 'he'
+  try {
+    strategies[role][recommendation].execute({
+      collectionHelper,
+      fragments,
+      fragmentHelper,
+    })
+  } catch (e) {
+    return res.status(400).json({ error: e.message })
+  }
+
+  // if (
+  //   recommendation === recommendations.publish &&
+  //   recommendationType === recommendations.type.editor &&
+  //   collection.handlingEditor &&
+  //   collection.handlingEditor.id === req.user
+  // ) {
+  //   if (!collectionHelper.canHEMakeRecommendation(fragments, fragmentHelper)) {
+  //     return res.status(400).json({
+  //       error: 'Cannot publish without at least one reviewer report.',
+  //     })
+  //   }
+  // }
 
   fragment.recommendations = fragment.recommendations || []
   const newRecommendation = {
@@ -146,8 +168,8 @@ module.exports = models => async (req, res) => {
     recommendationType,
   }
 
-  newRecommendation.recommendation = recommendation || undefined
-  newRecommendation.comments = comments || undefined
+  // newRecommendation.recommendation = recommendation || undefined
+  newRecommendation.comments = comments || []
 
   if (recommendationType === 'editorRecommendation') {
     await collectionHelper.updateStatusOnRecommendation({
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/eicPublish.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/eicPublish.js
new file mode 100644
index 0000000000000000000000000000000000000000..27c02f47892b24bcad11ee63a977d8a024f1eaf5
--- /dev/null
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/eicPublish.js
@@ -0,0 +1,3 @@
+module.exports = {
+  execute: ({ fragment, collection, recommendation }) => {},
+}
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/hePublish.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/hePublish.js
new file mode 100644
index 0000000000000000000000000000000000000000..0decbde6373f03ea6300c13c730085530ff520be
--- /dev/null
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/strategies/hePublish.js
@@ -0,0 +1,7 @@
+module.exports = {
+  execute: ({ collectionHelper, fragments, fragmentHelper }) => {
+    if (!collectionHelper.canHEMakeRecommendation(fragments, fragmentHelper)) {
+      throw new Error('Cannot publish without at least one reviewer report.')
+    }
+  },
+}