diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js
index 925aac7a881fce50bf971f765a560042755bf468..fab299296f67b3f089781024a0c9a37c4dd7ed81 100644
--- a/packages/component-faraday-selectors/src/index.js
+++ b/packages/component-faraday-selectors/src/index.js
@@ -53,6 +53,7 @@ const cannotViewReviewersDetails = [
   'submitted',
   'heInvited',
 ]
+
 export const canViewReviewersDetails = (state, collection = {}) => {
   if (cannotViewReviewersDetails.includes(get(collection, 'status', 'draft'))) {
     return false
@@ -60,6 +61,42 @@ export const canViewReviewersDetails = (state, collection = {}) => {
   return canViewReports(state, collection.id)
 }
 
+const canHeViewEditorialCommentsStatuses = [
+  'revisionRequested',
+  'rejected',
+  'accepted',
+  'inQA',
+  'pendingApproval',
+]
+export const canHeViewEditorialComments = (state, collection = {}) => {
+  const isHE = isHEToManuscript(state, collection.id)
+  const status = get(collection, 'status', 'draft')
+  return isHE && canHeViewEditorialCommentsStatuses.includes(status)
+}
+
+const canEICViewEditorialCommentsStatuses = ['rejected', 'accepted', 'inQA']
+export const canEICViewEditorialComments = (state, collection = {}) => {
+  const isEIC = currentUserIs(state, 'adminEiC')
+  const status = get(collection, 'status', 'draft')
+  return isEIC && canEICViewEditorialCommentsStatuses.includes(status)
+}
+
+export const canViewEditorialComments = (
+  state,
+  collection = {},
+  fragmentId,
+) => {
+  const editorialRecommentations = getFragmentEditorialComments(
+    state,
+    fragmentId,
+  )
+  return (
+    (canHeViewEditorialComments(state, collection) ||
+      canEICViewEditorialComments(state, collection)) &&
+    editorialRecommentations.length > 0
+  )
+}
+
 export const getUserToken = ({ currentUser }) =>
   get(currentUser, 'user.token', '')
 
@@ -254,6 +291,10 @@ export const getFragmentReviewerRecommendations = (state, fragmentId) =>
   getFragmentRecommendations(state, fragmentId).filter(
     r => r.recommendationType === 'review',
   )
+const getFragmentEditorialComments = (state, fragmentId) =>
+  getFragmentRecommendations(state, fragmentId).filter(
+    r => r.recommendationType === 'editorRecommendation',
+  )
 
 const getOwnRecommendations = (state, fragmentId) =>
   chain(state)
diff --git a/packages/component-faraday-ui/src/ActionLink.js b/packages/component-faraday-ui/src/ActionLink.js
index 2f61672b38c201090d65f40eba954d7a6e1a467f..9f27cec30d1ba8e1584fed2f753653c952e23f77 100644
--- a/packages/component-faraday-ui/src/ActionLink.js
+++ b/packages/component-faraday-ui/src/ActionLink.js
@@ -69,7 +69,6 @@ const ExternalLink = styled.a`
     text-decoration: underline;
   }
 `
-
 const CustomLink = ExternalLink.withComponent(Link)
 
 const Root = styled.div`
diff --git a/packages/component-faraday-ui/src/AppBar.js b/packages/component-faraday-ui/src/AppBar.js
index f1eef417786cbfbe861325e7bff8e2bb5304ac3d..80dc030cc5b325b62bc929a143d3500009f3a948 100644
--- a/packages/component-faraday-ui/src/AppBar.js
+++ b/packages/component-faraday-ui/src/AppBar.js
@@ -31,7 +31,7 @@ const AppBar = ({
           !isSubmit &&
           currentUser.user && (
             <Button
-              data-test="new-manuscript"
+              data-test-id="new-manuscript"
               disabled={!canCreateDraft}
               ml={2}
               mr={5}
diff --git a/packages/component-faraday-ui/src/AppBarMenu.js b/packages/component-faraday-ui/src/AppBarMenu.js
index 48952b453fbd702c5b4ec4257fd8aaa5c61f8ce8..3a3a93ba7b682469bdcd67ff340efc3ebf8996f7 100644
--- a/packages/component-faraday-ui/src/AppBarMenu.js
+++ b/packages/component-faraday-ui/src/AppBarMenu.js
@@ -75,7 +75,9 @@ const User = styled.div`
   display: flex;
   cursor: pointer;
 `
-const Dropdown = styled.div`
+const Dropdown = styled.div.attrs({
+  'data-test-id': props => props['data-test-id'] || 'admin-dropdown',
+})`
   background-color: ${th('appBar.colorBackground')};
   border-radius: ${th('borderRadius')};
   box-shadow: ${th('boxShadow')};
@@ -86,7 +88,9 @@ const Dropdown = styled.div`
   z-index: 10;
 `
 
-const DropdownOption = styled.div`
+const DropdownOption = styled.div.attrs({
+  'data-test-id': props => props['data-test-id'] || 'dropdown-option',
+})`
   align-items: center;
   color: ${th('colorText')};
   cursor: pointer;
diff --git a/packages/component-faraday-ui/src/AuthorCard.js b/packages/component-faraday-ui/src/AuthorCard.js
index 9ad8bda6301f4b275f51f534df01688a8d86edaa..8adbc518603f4a43cfa1bfd97a3db34fa007b25b 100644
--- a/packages/component-faraday-ui/src/AuthorCard.js
+++ b/packages/component-faraday-ui/src/AuthorCard.js
@@ -158,6 +158,7 @@ const AuthorEdit = ({
         <Label required>Email</Label>
         <ValidatedField
           component={TextField}
+          data-test-id="author-card-email"
           name="email"
           validate={[required, validators.emailValidator]}
         />
@@ -166,6 +167,7 @@ const AuthorEdit = ({
         <Label required>First name</Label>
         <ValidatedField
           component={TextField}
+          data-test-id="author-card-firstname"
           name="firstName"
           validate={[required]}
         />
@@ -174,6 +176,7 @@ const AuthorEdit = ({
         <Label required>Last name</Label>
         <ValidatedField
           component={TextField}
+          data-test-id="author-card-lastname"
           name="lastName"
           validate={[required]}
         />
@@ -182,6 +185,7 @@ const AuthorEdit = ({
         <Label required>Affiliation</Label>
         <ValidatedField
           component={TextField}
+          data-test-id="author-card-affiliation"
           name="affiliation"
           validate={[required]}
         />
@@ -192,6 +196,7 @@ const AuthorEdit = ({
           component={input => (
             <Menu {...input} options={countries} placeholder="Please select" />
           )}
+          data-test-id="author-card-country"
           name="country"
         />
       </Item>
diff --git a/packages/component-faraday-ui/src/AuthorTag.js b/packages/component-faraday-ui/src/AuthorTag.js
index de77649af2ef6640b21c315fe8cac3bf78bfa00c..1ac2a56a90bd18468d8235f90746e827801b37fc 100644
--- a/packages/component-faraday-ui/src/AuthorTag.js
+++ b/packages/component-faraday-ui/src/AuthorTag.js
@@ -7,6 +7,7 @@ import Text from './Text'
 
 const AuthorTag = ({
   author: {
+    id,
     firstName,
     lastName,
     isCorresponding,
@@ -14,7 +15,7 @@ const AuthorTag = ({
     affiliationNumber,
   },
 }) => (
-  <Root>
+  <Root data-test-id={`author-tag-${id}`}>
     <Text>{`${firstName} ${lastName}`}</Text>
     {isSubmitting && <Tag>SA</Tag>}
     {isCorresponding && <Tag>CA</Tag>}
diff --git a/packages/component-faraday-ui/src/AuthorTagList.js b/packages/component-faraday-ui/src/AuthorTagList.js
index 4e9cd757a62866f19b3c66298d084cee967cd80d..5aea50c288cf1b4dde73988203438d07ad0264d5 100644
--- a/packages/component-faraday-ui/src/AuthorTagList.js
+++ b/packages/component-faraday-ui/src/AuthorTagList.js
@@ -69,6 +69,7 @@ const AuthorTagList = ({
     {withAffiliations && (
       <Item flex={0} ml={1}>
         <ActionLink
+          data-test-id="author-affiliations"
           icon={showAffiliation ? 'minus' : 'plus'}
           onClick={toggleAffiliation}
         >
diff --git a/packages/component-faraday-ui/src/EditorialReportCard.js b/packages/component-faraday-ui/src/EditorialReportCard.js
index a294c039795914fe5e5333e95b395f938ee4f187..a89ca77499af8c0d0a6b6ceff3b6b5af97c617d5 100644
--- a/packages/component-faraday-ui/src/EditorialReportCard.js
+++ b/packages/component-faraday-ui/src/EditorialReportCard.js
@@ -9,26 +9,32 @@ import { Label, Item, Row, Text, Tag } from './'
 import { getReportComments } from './helpers'
 
 const EditorialReportCard = ({
+  publicLabel,
+  privateLabel,
   journal,
   publicReport,
   privateReport,
   recommendation,
-  reviewerName,
-  reviewerRole,
+  editorName,
+  editorRole,
   report: { createdOn, reviewer },
 }) => (
   <Root>
     <Row justify="space-between" mb={2}>
       <Item vertical>
-        <Label mb={1 / 2}>Decision</Label>
+        {editorRole === 'HE' ? (
+          <Label mb={1 / 2}>Recommendation</Label>
+        ) : (
+          <Label mb={1 / 2}>Decision</Label>
+        )}
         <Text>{recommendation}</Text>
       </Item>
 
       <Item justify="flex-end">
         {reviewer && (
           <Fragment>
-            <Text mr={1 / 2}>{reviewerName}</Text>
-            <Tag mr={2}>{reviewerRole}</Tag>
+            <Text mr={1 / 2}>{editorName}</Text>
+            <Tag mr={2}>{editorRole}</Tag>
           </Fragment>
         )}
         <DateParser timestamp={createdOn}>
@@ -40,7 +46,7 @@ const EditorialReportCard = ({
     {publicReport && (
       <Row mb={2}>
         <Item vertical>
-          <Label mb={1 / 2}>Message For Author</Label>
+          <Label mb={1 / 2}>{publicLabel}</Label>
           <Text>{publicReport}</Text>
         </Item>
       </Row>
@@ -49,7 +55,7 @@ const EditorialReportCard = ({
     {privateReport && (
       <Row mb={2}>
         <Item vertical>
-          <Label mb={1 / 2}>Message For Editorial Team</Label>
+          <Label mb={1 / 2}>{privateLabel}</Label>
           <Text>{privateReport}</Text>
         </Item>
       </Row>
@@ -85,8 +91,8 @@ export default compose(
       recommendation: getRecommendationLabel(),
       publicReport: getReportComments({ report, isPublic: true }),
       privateReport: getReportComments({ report, isPublic: false }),
-      reviewerName: getReviewerName(),
-      reviewerRole: getReviewerRole(),
+      editorName: getReviewerName(),
+      editorRole: getReviewerRole(),
     }),
   ),
 )(EditorialReportCard)
diff --git a/packages/component-faraday-ui/src/EditorialReportCard.md b/packages/component-faraday-ui/src/EditorialReportCard.md
index 26fd9dce55e7c917e5944b6baf617a3384c50407..0c81711ef2c425f242e7f7b7433347f78de2aa15 100644
--- a/packages/component-faraday-ui/src/EditorialReportCard.md
+++ b/packages/component-faraday-ui/src/EditorialReportCard.md
@@ -47,7 +47,12 @@ const journal = {
     },
   ],
 }
-;<EditorialReportCard report={report} journal={journal} />
+;<EditorialReportCard 
+    report={report} 
+    journal={journal} 
+    publicLabel="Message For Author" 
+    privateLabel="Message For Editorial Team" 
+  />
 ```
 
 Card with message for the editorial team
@@ -97,7 +102,12 @@ const journal = {
     },
   ],
 }
-;<EditorialReportCard report={report} journal={journal} />
+;<EditorialReportCard 
+    report={report} 
+    journal={journal} 
+    publicLabel="Message For Author" 
+    privateLabel="Message For Editorial Team"  
+  />
 ```
 
 Card with message for the editorial team and for the author
@@ -152,5 +162,11 @@ const journal = {
     },
   ],
 }
-;<EditorialReportCard report={report} journal={journal} />
+
+;<EditorialReportCard 
+    report={report} 
+    journal={journal} 
+    publicLabel="Message For Author" 
+    privateLabel="Message For Editorial Team" 
+  />
 ```
diff --git a/packages/component-faraday-ui/src/FileSection.js b/packages/component-faraday-ui/src/FileSection.js
index d36b670d1abe8b482b11a021e15d90f5f9362c79..596f65e8436d8362ab1fdf506c1f5b1dd822071c 100644
--- a/packages/component-faraday-ui/src/FileSection.js
+++ b/packages/component-faraday-ui/src/FileSection.js
@@ -70,6 +70,7 @@ const FileSection = ({
             onUpload={onFilePick}
           >
             <ActionLink
+              data-test-id={`add-file-${listId}`}
               disabled={files.length >= maxFiles}
               icon="plus"
               size="small"
diff --git a/packages/component-faraday-ui/src/Footer.js b/packages/component-faraday-ui/src/Footer.js
index 4a237f254c3afcb9c6c964495c0380ab54cdf75f..15c2d7588cc049f4cc3da02ac990b274665a407a 100644
--- a/packages/component-faraday-ui/src/Footer.js
+++ b/packages/component-faraday-ui/src/Footer.js
@@ -7,17 +7,30 @@ import { withJournal } from 'xpub-journal'
 import { ActionLink, Row, Text } from './'
 
 const Footer = ({ journal }) => (
-  <Root alignItems="center" justify="center">
-    <ActionLink to="https://hindawi.com">Hindawi</ActionLink>
-    <ActionLink ml={3} to="https://www.hindawi.com/privacy/">
+  <Root alignItems="center" data-test-id="footer-row-id" justify="center">
+    <ActionLink data-test-id="hindawi-redirect" to="https://hindawi.com">
+      Hindawi
+    </ActionLink>
+    <ActionLink
+      data-test-id="privacy-policy"
+      ml={3}
+      to="https://www.hindawi.com/privacy/"
+    >
       Privacy Policy
     </ActionLink>
-    <ActionLink ml={3} to="https://www.hindawi.com/terms/">
+    <ActionLink
+      data-test-id="terms-of-service"
+      ml={3}
+      to="https://www.hindawi.com/terms/"
+    >
       Terms of Service
     </ActionLink>
     <Text ml={4} secondary>
       {`Support: `}
-      <ActionLink to={`mailto:${get(journal, 'metadata.email')}`}>
+      <ActionLink
+        data-test-id="email-support"
+        to={`mailto:${get(journal, 'metadata.email')}`}
+      >
         {get(journal, 'metadata.email')}
       </ActionLink>
     </Text>
diff --git a/packages/component-faraday-ui/src/Logo.js b/packages/component-faraday-ui/src/Logo.js
index 655780803e2c2a3010dd1e243136376af4c6e8d1..338312793bdfef4b08c3b3cdbe138e5591248392 100644
--- a/packages/component-faraday-ui/src/Logo.js
+++ b/packages/component-faraday-ui/src/Logo.js
@@ -1,9 +1,17 @@
 /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
 
 import React from 'react'
+import { get } from 'lodash'
 
-const Logo = ({ src, onClick, title, height = 36 }) => (
-  <img alt={title} height={height} onClick={onClick} src={src} title={title} />
+const Logo = ({ src, onClick, title, height = 36, ...rest }) => (
+  <img
+    alt={title}
+    data-test-id={get(rest, 'data-test-id', 'journal-logo')}
+    height={height}
+    onClick={onClick}
+    src={src}
+    title={title}
+  />
 )
 
 export default Logo
diff --git a/packages/component-faraday-ui/src/PublonsTable.js b/packages/component-faraday-ui/src/PublonsTable.js
index d11c7d479ecb15cc49cbfe9d7ef2938335e444ce..4b7a53511d9312f03b61f77d11b52a83e8f5b85d 100644
--- a/packages/component-faraday-ui/src/PublonsTable.js
+++ b/packages/component-faraday-ui/src/PublonsTable.js
@@ -1,11 +1,11 @@
 import React, { Fragment } from 'react'
+import { get, last, head } from 'lodash'
 import styled from 'styled-components'
 import { th } from '@pubsweet/ui-toolkit'
 import { Button, Spinner } from '@pubsweet/ui'
-import { get } from 'lodash'
 import { compose, withHandlers, withProps } from 'recompose'
 
-import { Label, OpenModal, Text, withFetching } from '../'
+import { Label, OpenModal, Text, withFetching, ActionLink } from '../'
 
 const TableView = ({
   reviewers,
@@ -14,12 +14,13 @@ const TableView = ({
   isFetching,
   publonsError,
 }) => {
-  if (publonsError)
+  if (publonsError) {
     return (
       <Text align="center" error>
         {publonsError}
       </Text>
     )
+  }
   return reviewers.length === 0 ? (
     <Text align="center">No suggestions yet.</Text>
   ) : (
@@ -42,7 +43,11 @@ const TableView = ({
         {reviewers.map(reviewer => (
           <TableRow key={reviewer.email}>
             <td>
-              <Text>{`${get(reviewer, 'name', '')}`}</Text>
+              <ActionLink
+                to={get(reviewer, 'profileUrl', 'https://www.publons.com/')}
+              >
+                {`${get(reviewer, 'name', '')}`}
+              </ActionLink>
             </td>
             <td>
               <Text>{`${get(reviewer, 'affiliation', '')}`}</Text>
@@ -83,11 +88,12 @@ export default compose(
   })),
   withHandlers({
     onInviteReviewer: ({ onInvite }) => (reviewer, modalProps) => {
+      const names = reviewer.name.split(' ')
       const newReviewer = {
         email: reviewer.email,
         role: 'reviewer',
-        firstName: reviewer.name,
-        lastName: '',
+        firstName: head(names),
+        lastName: last(names),
       }
       onInvite(newReviewer, modalProps)
     },
diff --git a/packages/component-faraday-ui/src/SortableList.js b/packages/component-faraday-ui/src/SortableList.js
index f6bd63d6e33fc049676783818ffb6378691fb58a..e27f7158f2a2da12943106001a3008542c0b0506 100644
--- a/packages/component-faraday-ui/src/SortableList.js
+++ b/packages/component-faraday-ui/src/SortableList.js
@@ -60,7 +60,7 @@ const Item = ({
   dragHandle
     ? connectDragPreview(
         connectDropTarget(
-          <div style={{ flex: 1 }}>
+          <div data-test-id={`sortable-item-${rest.id}`} style={{ flex: 1 }}>
             {React.createElement(listItem, {
               ...rest,
               dragHandle: connectDragSource(
@@ -74,7 +74,9 @@ const Item = ({
       )
     : connectDropTarget(
         connectDragSource(
-          <div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>,
+          <div data-test-id={`sortable-item-${rest.id}`} style={{ flex: 1 }}>
+            {React.createElement(listItem, rest)}
+          </div>,
         ),
       )
 
@@ -101,6 +103,7 @@ const SortableList = ({
   <Fragment>
     {items.map((item, i) => (
       <DecoratedItem
+        data-test-id={`add-author-id-${i}`}
         dragHandle={dragHandle}
         index={i}
         item={item}
diff --git a/packages/component-faraday-ui/src/WizardAuthors.js b/packages/component-faraday-ui/src/WizardAuthors.js
index 43cb64bea7e4250eef65b23ff30c7528f88702d9..9bc023bd0da92f05d83611f0389b1557f0751496 100644
--- a/packages/component-faraday-ui/src/WizardAuthors.js
+++ b/packages/component-faraday-ui/src/WizardAuthors.js
@@ -72,7 +72,11 @@ const WizardAuthors = ({
     <Row alignItems="center" justify="flex-start">
       <Item>
         <Label>Authors</Label>
-        <ActionLink icon="plus" onClick={addNewAuthor}>
+        <ActionLink
+          data-test-id="add-author"
+          icon="plus"
+          onClick={addNewAuthor}
+        >
           ADD AUTHOR
         </ActionLink>
       </Item>
diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js
index b30f045ad4725e1502b54433ca631d168d17b359..ed9e04dfc0e67bd3844c512eee5a6a49f9b7a0ce 100644
--- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js
+++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js
@@ -11,6 +11,7 @@ const ManuscriptAssignHE = ({
 }) =>
   canAssignHE ? (
     <ContextualBox
+      data-test-id="assign-handling-editor"
       expanded={expanded}
       label="Assign Handling Editor"
       scrollIntoView
diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js
index a6f66d3736b655bb1835539cd73115feac761ceb..f0e5d8a3fd2392f511108c906a7861d73a73cec8 100644
--- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js
+++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js
@@ -1,6 +1,6 @@
 import React from 'react'
-import { get } from 'lodash'
-import { compose } from 'recompose'
+import { get, last } from 'lodash'
+import { compose, withProps } from 'recompose'
 import styled from 'styled-components'
 import { reduxForm } from 'redux-form'
 import { th } from '@pubsweet/ui-toolkit'
@@ -19,43 +19,76 @@ import {
   withFetching,
 } from '../'
 
+const eicDecisions = [
+  {
+    value: 'return-to-handling-editor',
+    label: 'Return to Handling Editor',
+    modalTitle: 'Return Manuscript',
+    modalSubtitle:
+      'A returning manuscript to Handling Editor decision is final',
+  },
+  {
+    value: 'publish',
+    label: 'Publish',
+    modalTitle: 'Publish Manuscript',
+    modalSubtitle: 'A publish decision is final',
+  },
+  {
+    value: 'reject',
+    label: 'Reject',
+    modalTitle: 'Reject Manuscript',
+    modalSubtitle: 'A rejection decision is final',
+  },
+]
+
 const ManuscriptEicDecision = ({
   isFetching,
   formValues,
   handleSubmit,
   messagesLabel,
-  options = [],
+  collection = {},
   ...rest
 }) => (
-  <ContextualBox label="Your Editorial Decision" {...rest}>
+  <ContextualBox
+    data-test-id="your-editorial-decision-id"
+    label="Your Editorial Decision"
+    {...rest}
+  >
     <Root>
       <Row justify="flex-start">
         <ItemOverrideAlert flex={0} vertical>
           <Label required>Decision</Label>
           <ValidatedField
-            component={input => <Menu {...input} options={options} />}
+            component={input => (
+              <Menu
+                {...input}
+                options={
+                  get(collection, 'status', 'submitted') === 'submitted'
+                    ? [last(eicDecisions)]
+                    : eicDecisions
+                }
+              />
+            )}
             name="decision"
             validate={[required]}
           />
         </ItemOverrideAlert>
       </Row>
 
-      <Row mt={2}>
-        <Item vertical>
-          <Label required>
-            {
-              messagesLabel[
-                get(formValues, 'decision', 'return-to-handling-editor')
-              ]
-            }
-          </Label>
-          <ValidatedField
-            component={ValidatedTextArea}
-            name="message"
-            validate={[required]}
-          />
-        </Item>
-      </Row>
+      {get(formValues, 'decision') !== 'publish' && (
+        <Row mt={2}>
+          <Item vertical>
+            <Label required>
+              {messagesLabel[get(formValues, 'decision', 'reject')]}
+            </Label>
+            <ValidatedField
+              component={ValidatedTextArea}
+              name="message"
+              validate={[required]}
+            />
+          </Item>
+        </Row>
+      )}
 
       <Row justify="flex-end" mt={4}>
         <Button onClick={handleSubmit} primary size="medium">
@@ -73,15 +106,32 @@ export default compose(
     modalKey: 'eic-decision',
     modalComponent: MultiAction,
   })),
+  withProps(({ formValues }) => ({
+    modalTitle: eicDecisions.find(
+      o => o.value === get(formValues, 'decision', 'publish'),
+    ).modalTitle,
+    modalSubtitle: eicDecisions.find(
+      o => o.value === get(formValues, 'decision', 'publish'),
+    ).modalSubtitle,
+  })),
   reduxForm({
     form: 'eic-decision',
     onSubmit: (
       values,
       dispatch,
-      { submitDecision, showModal, setFetching },
+      {
+        submitDecision,
+        showModal,
+        setFetching,
+        modalTitle,
+        confirmMessage,
+        modalSubtitle,
+      },
     ) => {
       showModal({
-        title: 'Are you sure you want to submit this decision?',
+        title: `${modalTitle}?`,
+        confirmText: modalTitle,
+        subtitle: modalSubtitle,
         onConfirm: modalProps => {
           submitDecision(values, { ...modalProps, setFetching })
         },
diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js
index cc79766601a6e3bf1461efb6c0c1eaa294624d95..268d7af507e41a54af7f5dd2088c905a7681d0ca 100644
--- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js
+++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js
@@ -28,19 +28,34 @@ const ManuscriptHeader = ({
   const { title = 'No title', journal = '', type = '' } = metadata
   return (
     <Fragment>
-      <Row alignItems="baseline" justify="space-between">
+      <Row
+        alignItems="baseline"
+        data-test-id="manuscript-title"
+        justify="space-between"
+      >
         <H2 mb={1}>{title}</H2>
         <Tag data-test-id="fragment-status" status>
           {visibleStatus}
         </Tag>
       </Row>
       {authors.length > 0 && (
-        <Row alignItems="center" justify="flex-start" mb={1}>
+        <Row
+          alignItems="center"
+          data-test-id="authors-row"
+          justify="flex-start"
+          mb={1}
+        >
           <AuthorTagList authors={authors} withAffiliations withTooltip />
         </Row>
       )}
       <Row alignItems="center" justify="flex-start" mb={1}>
-        {customId && <Text customId mr={1}>{`ID ${customId}`}</Text>}
+        {customId && (
+          <Text
+            customId
+            data-test-id="manuscript-id"
+            mr={1}
+          >{`ID ${customId}`}</Text>
+        )}
         {submitted && (
           <DateParser durationThreshold={0} timestamp={submitted}>
             {timestamp => <Text mr={3}>Submitted on {timestamp}</Text>}
diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js
index 205719b95fb817a3b67b0e0d8b18da2e807ca05d..f86208b45f71994aaf8ae38bec91a88df103ed40 100644
--- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js
+++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js
@@ -18,7 +18,12 @@ const ManuscriptMetadata = ({
   <Fragment>
     {!!abstract && (
       <Item mb={1}>
-        <ContextualBox label="Abstract" startExpanded transparent>
+        <ContextualBox
+          data-test-id="abstract-tab"
+          label="Abstract"
+          startExpanded
+          transparent
+        >
           <Text mb={1} mt={1}>
             {abstract}
           </Text>
@@ -27,7 +32,11 @@ const ManuscriptMetadata = ({
     )}
     {conflicts.hasConflicts === 'yes' && (
       <Item mb={1}>
-        <ContextualBox label="Conflict of Interest" transparent>
+        <ContextualBox
+          data-test-id="conflict-of-interest-tab"
+          label="Conflict of Interest"
+          transparent
+        >
           <Text mb={1} mt={1}>
             {get(conflicts, 'message', '')}
           </Text>
@@ -36,7 +45,7 @@ const ManuscriptMetadata = ({
     )}
     {!isEmpty(files) && (
       <Item mb={1}>
-        <ContextualBox label={filesLabel} transparent>
+        <ContextualBox data-test-id="files-tab" label={filesLabel} transparent>
           <ManuscriptFileList
             files={files}
             getSignedUrl={getSignedUrl}
diff --git a/packages/component-faraday-ui/src/modals/MultiAction.js b/packages/component-faraday-ui/src/modals/MultiAction.js
index a1beeaf592edb16b9df1a02bdab80e24027c9fab..3a9acf7d332be3e39d6270cdde72fbf637e81b57 100644
--- a/packages/component-faraday-ui/src/modals/MultiAction.js
+++ b/packages/component-faraday-ui/src/modals/MultiAction.js
@@ -20,10 +20,14 @@ const MultiAction = ({
   <Root>
     <IconButton icon="x" onClick={onClose} right={5} secondary top={5} />
     <H2>{title}</H2>
-    {subtitle && <Text secondary>{subtitle}</Text>}
+    {subtitle && (
+      <Text mb={1} secondary>
+        {subtitle}
+      </Text>
+    )}
     {renderContent()}
     {modalError && (
-      <Text error mt={1}>
+      <Text align="center" error mt={1}>
         {modalError}
       </Text>
     )}
@@ -32,8 +36,10 @@ const MultiAction = ({
         <Spinner size={3} />
       ) : (
         <Fragment>
-          <Button onClick={onClose}>{cancelText}</Button>
-          <Button onClick={onConfirm} primary>
+          <Button data-test-id="modal-cancel" onClick={onClose}>
+            {cancelText}
+          </Button>
+          <Button data-test-id="modal-confirm" onClick={onConfirm} primary>
             {confirmText}
           </Button>
         </Fragment>
@@ -79,7 +85,7 @@ const Root = styled.div`
   flex-direction: column;
   position: relative;
   padding: calc(${th('gridUnit')} * 5);
-  width: calc(${th('gridUnit')} * 60);
+  width: calc(${th('gridUnit')} * 70);
 
   ${H2} {
     margin: 0 0 ${th('gridUnit')} 0;
diff --git a/packages/component-faraday-ui/src/modals/SingleActionModal.js b/packages/component-faraday-ui/src/modals/SingleActionModal.js
index 49a9ec10906007ff593dcb0b087be7016f76b89d..44385a9e75b20df802e0bb1c0248563ad84b4bb2 100644
--- a/packages/component-faraday-ui/src/modals/SingleActionModal.js
+++ b/packages/component-faraday-ui/src/modals/SingleActionModal.js
@@ -21,7 +21,7 @@ const SingleActionModal = ({
     </Icon>
     {title && <H2>{title}</H2>}
     {subtitle && <Text secondary>{subtitle}</Text>}
-    <Button onClick={onClick} primary>
+    <Button data-test-id="modal-confirm" onClick={onClick} primary>
       {confirmText}
     </Button>
   </Root>
diff --git a/packages/component-invite/src/routes/fragmentsInvitations/post.js b/packages/component-invite/src/routes/fragmentsInvitations/post.js
index ae1eeb0282021d4211f9048abe2fc969e5396308..2eab3d2d1642e1aed6f2a9384bbf11b9058fd993 100644
--- a/packages/component-invite/src/routes/fragmentsInvitations/post.js
+++ b/packages/component-invite/src/routes/fragmentsInvitations/post.js
@@ -1,4 +1,5 @@
 const logger = require('@pubsweet/logger')
+
 const {
   Team,
   User,
@@ -123,17 +124,32 @@ module.exports = models => async (req, res) => {
     const userHelper = new User({ UserModel })
 
     const userData = req.body
-    const { firstName, lastName, isPublons } = userData
+    const { firstName = '', lastName = '', isPublons } = userData
+    if (!services.checkForUndefinedParams(firstName, lastName)) {
+      return res
+        .status(400)
+        .json({ error: 'First name and last name are required.' })
+    }
 
-    if (process.env.PUBLONS_MOCK_EMAIL && isPublons) {
+    if (isPublons && process.env.PUBLONS_MOCK_EMAIL) {
       const mockEmail = process.env.PUBLONS_MOCK_EMAIL
-      userData.email = mockEmail.replace('__NAME__', `${firstName}.${lastName}`)
+      userData.email = mockEmail.replace(
+        '__NAME__',
+        `${firstName.trim()}.${lastName.trim()}`,
+      )
     }
 
-    const newUser = await userHelper.createUser({
-      role,
-      body: userData,
-    })
+    let newUser
+    try {
+      newUser = await userHelper.createUser({
+        role,
+        body: userData,
+      })
+    } catch (e) {
+      return res
+        .status(400)
+        .json({ error: `User already exists with email: ${userData.email}` })
+    }
 
     if (collection.status === 'heAssigned')
       await collectionHelper.updateStatus({ newStatus: 'reviewersInvited' })
diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js
index eee5ba2fc9ee4eb1206172c29b7d6c298dfeeabd..9bb9c3a6cbd7d7b66222cb4b472e108c08304a06 100644
--- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js
+++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js
@@ -60,7 +60,11 @@ module.exports = {
 
     // the EiC recommends to publish so an email to the EQA needs to be sent,
     // one requesting approval or one informing them that the manuscript has been published
-    if (isEditorInChief && recommendation === 'publish') {
+    if (
+      isEditorInChief &&
+      recommendation === 'publish' &&
+      collection.technicalChecks.token
+    ) {
       sendEQAEmail({
         email,
         eicName,
@@ -77,7 +81,6 @@ module.exports = {
 
     // send HE emails when a review is submitted
     // or when the EiC makes a recommendation after peer review
-
     if (
       recommendationType === 'review' ||
       (isEditorInChief &&
diff --git a/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js b/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js
index 631f6719315bd164636fdb88b9632caa4c08d15a..8380da030638ce5c7d66293fd7531ac01841a237 100644
--- a/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js
+++ b/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js
@@ -1,5 +1,4 @@
 const config = require('config')
-const { get } = require('lodash')
 const Email = require('@pubsweet/component-email-templating')
 
 const {
@@ -9,12 +8,10 @@ const {
 } = require('pubsweet-component-helper-service')
 const { getEmailCopy } = require('./emailCopy')
 
-const unsubscribeSlug = config.get('unsubscribe.url')
 const { name: journalName, staffEmail } = config.get('journal')
 
 module.exports = {
   async sendNotifications({
-    isEQA,
     agree,
     baseUrl,
     collection,
@@ -28,10 +25,7 @@ module.exports = {
       handlingEditor: collection.handlingEditor,
     })
 
-    const {
-      activeAuthors: authors,
-      submittingAuthor,
-    } = await fragmentHelper.getAuthorData({
+    const { submittingAuthor } = await fragmentHelper.getAuthorData({
       UserModel,
     })
 
@@ -60,42 +54,14 @@ module.exports = {
       },
     })
 
-    if (agree && isEQA) {
-      email.content.signatureName = await userHelper.getEiCName()
-
-      sendHandlingEditorEmail({
-        email,
-        baseUrl,
-        titleText,
-        subjectBaseText,
-        handlingEditor: get(collection, 'handlingEditor', {}),
-      })
-      sendSubmittedReviewersEmail({
-        email,
-        baseUrl,
-        titleText,
-        UserModel,
-        fragmentHelper,
-        subjectBaseText,
-      })
-
-      sendAuthorsEmail({
-        email,
-        baseUrl,
-        titleText,
-        subjectBaseText,
-        fragmentAuthors: authors,
-      })
-    } else {
-      sendEditorsEmail({
-        email,
-        agree,
-        customId,
-        comments,
-        titleText,
-        userHelper,
-      })
-    }
+    sendEditorsEmail({
+      email,
+      agree,
+      customId,
+      comments,
+      titleText,
+      userHelper,
+    })
   },
 }
 
@@ -137,113 +103,3 @@ const sendEditorsEmail = async ({
     email.sendEmail({ html, text })
   })
 }
-
-const sendHandlingEditorEmail = ({
-  email,
-  baseUrl,
-  titleText,
-  handlingEditor,
-  subjectBaseText,
-}) => {
-  email.content.subject = `${subjectBaseText} Decision`
-  const emailType = 'he-manuscript-published'
-
-  email.toUser = {
-    email: handlingEditor.email,
-    name: handlingEditor.name,
-  }
-  email.content.unsubscribeLink = services.createUrl(baseUrl, unsubscribeSlug, {
-    id: handlingEditor.id,
-  })
-
-  const { html, text } = email.getNotificationBody({
-    emailBodyProps: getEmailCopy({
-      emailType,
-      titleText,
-    }),
-  })
-  email.sendEmail({ html, text })
-}
-
-const sendSubmittedReviewersEmail = async ({
-  email,
-  baseUrl,
-  titleText,
-  UserModel,
-  fragmentHelper,
-  subjectBaseText,
-}) => {
-  email.content.subject = `${subjectBaseText} Decision`
-
-  const reviewers = (await fragmentHelper.getReviewers({
-    UserModel,
-    type: 'submitted',
-  })).map(rev => ({
-    ...rev,
-    ...getEmailCopy({
-      emailType: 'submitted-reviewers-after-publish',
-      titleText,
-    }),
-  }))
-
-  reviewers.forEach(reviewer => {
-    email.toUser = {
-      email: reviewer.email,
-      name: `${reviewer.firstName} ${reviewer.lastName}`,
-    }
-    email.content.unsubscribeLink = services.createUrl(
-      baseUrl,
-      unsubscribeSlug,
-      {
-        id: reviewer.id,
-      },
-    )
-    const { html, text } = email.getNotificationBody({
-      emailBodyProps: {
-        paragraph: reviewer.paragraph,
-        hasLink: reviewer.hasLink,
-      },
-    })
-    email.sendEmail({ html, text })
-  })
-}
-
-const sendAuthorsEmail = ({
-  email,
-  baseUrl,
-  titleText,
-  subjectBaseText,
-  fragmentAuthors,
-}) => {
-  const emailType = 'author-manuscript-published'
-  email.content.subject = `${subjectBaseText} Published`
-
-  const authors = fragmentAuthors.map(author => ({
-    ...author,
-    ...getEmailCopy({
-      emailType,
-      titleText,
-    }),
-  }))
-
-  authors.forEach(author => {
-    email.toUser = {
-      email: author.email,
-      name: `${author.firstName} ${author.lastName}`,
-    }
-    email.content.unsubscribeLink = services.createUrl(
-      baseUrl,
-      unsubscribeSlug,
-      {
-        id: author.id,
-      },
-    )
-    const { html, text } = email.getNotificationBody({
-      emailBodyProps: {
-        paragraph: author.paragraph,
-        hasLink: author.hasLink,
-      },
-    })
-    email.sendEmail({ html, text })
-  })
-}
diff --git a/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js b/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js
index 4afb91c9d628e6a13e19bfea7d2360527dab8ab5..fcb8a59daf70b1bc7129fa23b1fe664d8de5750e 100644
--- a/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js
+++ b/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js
@@ -1,7 +1,13 @@
-const { get, find, isEmpty } = require('lodash')
+const { get, find, isEmpty, last } = require('lodash')
 const { services } = require('pubsweet-component-helper-service')
 
-const { sendNotifications } = require('./notifications/notifications')
+const {
+  sendNotifications: sendEQSNotifications,
+} = require('./notifications/notifications')
+
+const {
+  sendNotifications: sendEQANotifications,
+} = require('../fragmentsRecommendations/notifications/notifications')
 
 const TECHNICAL_STEPS = {
   EQS: 'eqs',
@@ -64,15 +70,33 @@ module.exports = ({ Collection, Fragment, User }) => async (req, res) => {
     collection.status = setNewStatus(step, agree)
     await collection.save()
 
-    sendNotifications({
-      User,
-      agree,
-      comments,
-      Fragment,
-      collection,
-      baseUrl: services.getBaseUrl(req),
-      isEQA: step === TECHNICAL_STEPS.EQA,
-    })
+    const isEQA = get(collection, 'technicalChecks.eqa', false)
+    const baseUrl = services.getBaseUrl(req)
+    if (isEQA) {
+      const fragment = await Fragment.find(last(collection.fragments))
+
+      sendEQANotifications({
+        baseUrl,
+        fragment,
+        collection,
+        hasEQA: true,
+        UserModel: User,
+        isEditorInChief: true,
+        newRecommendation: {
+          recommendation: 'publish',
+          recommendationType: 'editorRecommendation',
+        },
+      })
+    } else {
+      sendEQSNotifications({
+        User,
+        agree,
+        comments,
+        Fragment,
+        collection,
+        baseUrl,
+      })
+    }
 
     return res.status(200).json(collection)
   } catch (e) {
diff --git a/packages/component-manuscript/src/components/EditorialCommentCard.js b/packages/component-manuscript/src/components/EditorialCommentCard.js
index aa9187971fa82db28b3a3896b7fafb78c4520622..366200e4fba723bc2c2a7431b4d19b39ea0501b9 100644
--- a/packages/component-manuscript/src/components/EditorialCommentCard.js
+++ b/packages/component-manuscript/src/components/EditorialCommentCard.js
@@ -6,10 +6,22 @@ import {
   withFileDownload,
 } from 'pubsweet-component-faraday-ui'
 
-const EditorialCommentCard = ({ journal, reports = [] }) => (
-  <ContextualBox label="Editorial Comments" mb={2}>
+const EditorialCommentCard = ({ journal, reports = [], toggle, expanded }) => (
+  <ContextualBox
+    expanded={expanded}
+    label="Editorial Comments"
+    mb={2}
+    scrollIntoView
+    toggle={toggle}
+  >
     {reports.map(report => (
-      <EditorialReportCard journal={journal} key={report.id} report={report} />
+      <EditorialReportCard
+        journal={journal}
+        key={report.id}
+        privateLabel="Message For Editorial Team"
+        publicLabel="Message For Author"
+        report={report}
+      />
     ))}
   </ContextualBox>
 )
diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js
index 4840203f2a13dd02c8830bea39d985d0afab6174..cf3ed06611bb7deede31f739dfa2de172dbd571d 100644
--- a/packages/component-manuscript/src/components/ManuscriptLayout.js
+++ b/packages/component-manuscript/src/components/ManuscriptLayout.js
@@ -1,6 +1,6 @@
 import React, { Fragment } from 'react'
 import styled from 'styled-components'
-import { isEmpty, get, last } from 'lodash'
+import { isEmpty, get } from 'lodash'
 import {
   Text,
   paddingHelper,
@@ -19,15 +19,8 @@ import ReviewerReportCard from './ReviewReportCard'
 import ReviewerReportForm from './ReviewerReportForm'
 import EditorialCommentCard from './EditorialCommentCard'
 
-const eicDecisions = [
-  { value: 'return-to-handling-editor', label: 'Return to Handling Editor' },
-  { value: 'publish', label: 'Publish' },
-  { value: 'reject', label: 'Reject' },
-]
-
 const messagesLabel = {
   'return-to-handling-editor': 'Comments for Handling Editor',
-  publish: 'Comments for Author',
   reject: 'Comments for Author',
 }
 
@@ -71,6 +64,8 @@ const ManuscriptLayout = ({
   reviewerRecommendations,
   toggleReviewerDetails,
   reviewerDetailsExpanded,
+  toggleHeRecommendation,
+  heRecommendationExpanded,
   onInvitePublonReviewer,
   submitRevision,
 }) => (
@@ -106,13 +101,14 @@ const ManuscriptLayout = ({
 
         <SubmitRevision {...submitRevision} />
 
-        {get(currentUser, 'permissions.canViewReports', true) &&
-          !!editorialRecommendations.length && (
-            <EditorialCommentCard
-              journal={journal}
-              reports={editorialRecommendations}
-            />
-          )}
+        {get(currentUser, 'permissions.canViewEditorialComments', true) && (
+          <EditorialCommentCard
+            expanded={heRecommendationExpanded}
+            journal={journal}
+            reports={editorialRecommendations}
+            toggle={toggleHeRecommendation}
+          />
+        )}
 
         {submittedOwnRecommendation && (
           <ReviewerReportCard
@@ -205,14 +201,11 @@ const ManuscriptLayout = ({
 
         {get(currentUser, 'permissions.canMakeDecision', false) && (
           <ManuscriptEicDecision
+            collection={collection}
             formValues={get(formValues, 'eicDecision')}
+            highlight={editorialRecommendations.length > 0}
             messagesLabel={messagesLabel}
             mt={2}
-            options={
-              get(collection, 'status', 'submitted') === 'submitted'
-                ? [last(eicDecisions)]
-                : eicDecisions
-            }
             submitDecision={createRecommendation}
           />
         )}
diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js
index 689b1b516b547619427a352daeb34001672a1e3f..ff313bccab7df40660e2bc92e52860ff52b5f160 100644
--- a/packages/component-manuscript/src/components/ManuscriptPage.js
+++ b/packages/component-manuscript/src/components/ManuscriptPage.js
@@ -48,6 +48,7 @@ import {
   currentUserIsReviewer,
   parseCollectionDetails,
   canMakeHERecommendation,
+  canViewEditorialComments,
   canViewReviewersDetails,
   pendingReviewerInvitation,
   canOverrideTechnicalChecks,
@@ -85,7 +86,7 @@ export default compose(
   withJournal,
   withRouter,
   withFetching,
-  withState('publonReviewers', 'setPub', []),
+  withState('publonReviewers', 'setPublonsReviewers', []),
   withState('editorInChief', 'setEiC', 'N/A'),
   ConnectPage(({ match }) => [
     actions.getCollection({ id: match.params.project }),
@@ -167,6 +168,11 @@ export default compose(
           }),
           canAssignHE: canAssignHE(state, match.params.project),
           canViewReports: canViewReports(state, match.params.project),
+          canViewEditorialComments: canViewEditorialComments(
+            state,
+            collection,
+            match.params.version,
+          ),
           canInviteReviewers: canInviteReviewers(state, collection),
           canMakeRecommendation: !isUndefined(pendingOwnRecommendation),
           canMakeRevision: canMakeRevision(state, collection, fragment),
@@ -211,6 +217,22 @@ export default compose(
       getFragment(collection, fragment)
       getUsers()
     },
+    getPublonsReviewers: ({ clearError, setFetching, setPublonsReviewers }) => (
+      fragmentId,
+      errorFn,
+    ) => {
+      clearError()
+      setFetching(true)
+      getPublonsReviewers(fragmentId)
+        .then(res => {
+          setFetching(false)
+          setPublonsReviewers(res)
+        })
+        .catch(e => {
+          setFetching(false)
+          handleError(errorFn)(e)
+        })
+    },
   }),
   withHandlers({
     updateManuscript: ({ updateVersion, collection, fragment }) => data =>
@@ -224,8 +246,6 @@ export default compose(
         setEiC(`${firstName} ${lastName}`)
       }
     },
-    setPublons: ({ setPub }) => (publonReviewers = []) =>
-      setPub(publonReviewers),
     assignHE: ({
       assignHandlingEditor,
       fetchUpdatedCollection,
@@ -422,32 +442,26 @@ export default compose(
   }),
   withHandlers({
     onInvitePublonReviewer: ({
-      collection,
+      setError,
       fragment,
+      collection,
+      clearError,
+      getPublonsReviewers,
       fetchUpdatedCollection,
-      setPublons,
       setFetching: setListFetching,
-      setError,
-      clearError,
-    }) => (values, { hideModal, setModalError, setFetching }) => {
+    }) => (reviewerData, { hideModal, setModalError, setFetching }) => {
       setFetching(true)
       inviteReviewer({
-        reviewerData: values,
+        reviewerData,
+        isPublons: true,
         fragmentId: fragment.id,
         collectionId: collection.id,
-        isPublon: true,
       })
         .then(() => {
           setFetching(false)
           hideModal()
           fetchUpdatedCollection()
-          getPublonsReviewers({
-            fragmentId: fragment.id,
-            setPublons,
-            setFetching: setListFetching,
-            setError,
-            clearError,
-          })
+          getPublonsReviewers(fragment.id)
         })
         .catch(err => {
           setFetching(false)
@@ -475,6 +489,10 @@ export default compose(
     toggleReviewerDetails: toggle,
     reviewerDetailsExpanded: expanded,
   })),
+  fromRenderProps(RemoteOpener, ({ toggle, expanded }) => ({
+    toggleHeRecommendation: toggle,
+    heRecommendationExpanded: expanded,
+  })),
   withProps(({ currentUser, collection, submittedOwnRecommendation }) => ({
     submitRevisionModalKey: 'submitRevision',
     getSignedUrl,
@@ -488,23 +506,23 @@ export default compose(
       const {
         match,
         history,
+        setError,
         location,
-        setPublons,
         shouldReview,
         reviewerReports,
         setEditorInChief,
         clearCustomError,
+        getPublonsReviewers,
         hasManuscriptFailure,
         fetchUpdatedCollection,
+        editorialRecommendations,
         currentUser: {
           isInvitedHE,
           isInvitedToReview,
           isHEToManuscript,
+          isEIC,
           permissions: { canInviteReviewers },
         },
-        setFetching,
-        setError,
-        clearError,
       } = this.props
 
       if (hasManuscriptFailure) {
@@ -527,13 +545,7 @@ export default compose(
       )
 
       if (canInviteReviewers) {
-        getPublonsReviewers({
-          fragmentId,
-          setPublons,
-          setFetching,
-          setError,
-          clearError,
-        })
+        getPublonsReviewers(fragmentId, setError)
       }
 
       if (isInvitedHE) {
@@ -551,6 +563,10 @@ export default compose(
       if (isHEToManuscript && !!reviewerReports.length) {
         this.props.toggleReviewerDetails()
       }
+
+      if (isEIC && !!editorialRecommendations.length) {
+        this.props.toggleHeRecommendation()
+      }
     },
   }),
 )(ManuscriptLayout)
diff --git a/packages/component-manuscript/src/components/utils.js b/packages/component-manuscript/src/components/utils.js
index 3fd58fbc9af7b3c79394b81f3cfde6162c2d09a3..8d9a2d6cc3ad46d4304e2fc07dcfb57731c49c3b 100644
--- a/packages/component-manuscript/src/components/utils.js
+++ b/packages/component-manuscript/src/components/utils.js
@@ -306,22 +306,5 @@ export const parseEicDecision = ({ decision, message }) => ({
 })
 
 // handle publons
-export const getPublonsAPI = fragmentId =>
+export const getPublonsReviewers = fragmentId =>
   apiGet(`/fragments/${fragmentId}/publons`)
-
-export const getPublonsReviewers = ({
-  fragmentId,
-  setPublons,
-  setFetching,
-  setError,
-  clearError,
-}) => {
-  clearError()
-  setFetching(true)
-  getPublonsAPI(fragmentId)
-    .then(res => {
-      setPublons(res)
-      setFetching(false)
-    })
-    .catch(handleError(setError))
-}
diff --git a/packages/component-wizard/src/components/SubmissionConfirmation.js b/packages/component-wizard/src/components/SubmissionConfirmation.js
index f258b3153b15f1ba55b10483605929af2042a20f..032f737a3aedf8c580defb29364bd82d56f3227c 100644
--- a/packages/component-wizard/src/components/SubmissionConfirmation.js
+++ b/packages/component-wizard/src/components/SubmissionConfirmation.js
@@ -23,7 +23,11 @@ const SubmissionConfirmation = ({ history, journal }) => (
       </Text>
     </Row>
     <Row justify="center">
-      <Button onClick={() => history.push('/')} primary>
+      <Button
+        data-test-id="go-to-dashboard"
+        onClick={() => history.push('/')}
+        primary
+      >
         GO TO DASHBOARD
       </Button>
     </Row>
diff --git a/packages/component-wizard/src/components/SubmissionStatement.js b/packages/component-wizard/src/components/SubmissionStatement.js
index cdbc630458e7808c29651a8bd83520d476f30301..4769604cea17f535dd3b4fb239361d5bdc8b154d 100644
--- a/packages/component-wizard/src/components/SubmissionStatement.js
+++ b/packages/component-wizard/src/components/SubmissionStatement.js
@@ -3,23 +3,13 @@ import { ActionLink, Text, Row } from 'pubsweet-component-faraday-ui'
 
 const SubmissionStatement = () => (
   <Fragment>
-    <Row mb={1}>
+    <Row mb={1} mt={2}>
       <Text>
         This manuscript is not currently submitted to or under consideration in
         any other journals.
       </Text>
     </Row>
 
-    <Row mb={1}>
-      <Text>
-        The submission ensures that sources are given proper attribution (the
-        journal employs <b>Crossref Similarity Check</b> to compare submissions
-        against published scholarly content. If, in the judgement of an editor,
-        a submission is genuinely suspected of plagiarism, it will be returned
-        to the author(s) with a request for explanation).
-      </Text>
-    </Row>
-
     <Row mb={1}>
       <Text>
         The manuscript complies with all relevant{' '}
@@ -29,28 +19,13 @@ const SubmissionStatement = () => (
       </Text>
     </Row>
 
-    <Row mb={1}>
-      <Text>
-        If applicable - there is a Data Availability statement, containing
-        information about the location of any open data and materials in the
-        manuscript, and how others can access the data.
-      </Text>
-    </Row>
-
-    <Row mb={1}>
-      <Text>
-        A conflict of interest statement is present in the manuscript, even if
-        to state there is no conflict of interest.
-      </Text>
-    </Row>
-
-    <Row mb={1}>
+    <Row mb={3}>
       <Text>
         You have read and understood the{' '}
         <ActionLink to="https://www.hindawi.com/terms/">
           terms of service
-        </ActionLink>
-        {' & '}
+        </ActionLink>{' '}
+        and{' '}
         <ActionLink to="https://www.hindawi.com/privacy/">
           privacy policy
         </ActionLink>{' '}
diff --git a/packages/components-faraday/src/components/Admin/AdminUsers.js b/packages/components-faraday/src/components/Admin/AdminUsers.js
index 0fc5130192cda78f6ac5dba1b246dde4d7d1bc86..b29d70d4221431fbfdb750fbd965ccbb13dd00b0 100644
--- a/packages/components-faraday/src/components/Admin/AdminUsers.js
+++ b/packages/components-faraday/src/components/Admin/AdminUsers.js
@@ -45,7 +45,12 @@ const Users = ({
   <Fragment>
     <Row alignItems="center" justify="space-between" mb={1}>
       <Item alignItems="center">
-        <ActionLink icon="arrow-left" mr={2} onClick={history.goBack}>
+        <ActionLink
+          data-test-id="go-to-dashboard"
+          icon="arrow-left"
+          mr={2}
+          onClick={history.goBack}
+        >
           Admin Dashboard
         </ActionLink>
         <AddUser
diff --git a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js
index f9b3bab6f8aedca1accd5c05b3fd2beb4df5d314..2f1794281d784ee183df364b9322a61c56c5f251 100644
--- a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js
+++ b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js
@@ -8,7 +8,13 @@ const DashboardFilters = ({
   changeFilterValue,
   getDefaultFilterValue,
 }) => (
-  <Row alignItems="flex-end" justify="flex-start" mb={1} mt={2}>
+  <Row
+    alignItems="flex-end"
+    data-test-id="dashboard-filters"
+    justify="flex-start"
+    mb={1}
+    mt={2}
+  >
     <Text mr={1} pb={1} secondary>
       Filters
     </Text>
diff --git a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
index 3fab58f21c15bcdd312cc0fa0f8df64ef928350e..b698cf1f41d8b9c2fac0ba97fa7b01f588eac0ce 100644
--- a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
+++ b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
@@ -73,7 +73,7 @@ const DecisionForm = ({
     {decision === 'return-to-handling-editor' && (
       <Row>
         <RowItem vertical>
-          <Label>Comments for Handling Editor</Label>
+          <Label>Comments for Author</Label>
           <ValidatedField
             component={TextAreaField}
             name="messageToHE"
diff --git a/packages/components-faraday/src/components/SignUp/SignUpStep0.js b/packages/components-faraday/src/components/SignUp/SignUpStep0.js
index 51edb75af1575d53e615c6cff9db1f7081b682ca..f17aabd46a27554e01396ab0369eb5b3124769fd 100644
--- a/packages/components-faraday/src/components/SignUp/SignUpStep0.js
+++ b/packages/components-faraday/src/components/SignUp/SignUpStep0.js
@@ -42,7 +42,7 @@ const Step0 = ({
   !isUndefined(initialValues) ? (
     <Fragment>
       <Row mb={2} mt={3}>
-        <Item mr={1} vertical>
+        <Item data-test-id="sign-up-first-name" mr={1} vertical>
           <Label required>First Name</Label>
           <ValidatedField
             component={TextField}
@@ -50,7 +50,7 @@ const Step0 = ({
             validate={[requiredValidator]}
           />
         </Item>
-        <Item ml={1} vertical>
+        <Item data-test-id="sign-up-last-name" ml={1} vertical>
           <Label required>Last Name</Label>
           <ValidatedField
             component={TextField}
@@ -61,7 +61,7 @@ const Step0 = ({
       </Row>
 
       <Row mb={2}>
-        <ItemOverrideAlert mr={1} vertical>
+        <ItemOverrideAlert data-test-id="sign-up-title" mr={1} vertical>
           <Label required>Title</Label>
           <ValidatedField
             component={input => (
@@ -75,7 +75,7 @@ const Step0 = ({
             validate={[requiredValidator]}
           />
         </ItemOverrideAlert>
-        <ItemOverrideAlert ml={1} vertical>
+        <ItemOverrideAlert data-test-id="sign-up-country" ml={1} vertical>
           <Label required>Country</Label>
           <ValidatedField
             component={input => (
@@ -92,7 +92,7 @@ const Step0 = ({
       </Row>
 
       <Row>
-        <Item vertical>
+        <Item data-test-id="sign-up-affiliation" vertical>
           <Label required>Affiliation</Label>
           <ValidatedField
             component={TextField}
@@ -102,7 +102,7 @@ const Step0 = ({
         </Item>
       </Row>
 
-      <ValidationRow mb={2}>
+      <ValidationRow data-test-id="sign-up-agree-TC" mb={2}>
         <ValidatedField
           component={AgreeCheckbox}
           name="agreeTC"
@@ -123,7 +123,11 @@ const Step0 = ({
         </Text>
       </Row>
 
-      <Button mt={4} onClick={handleSubmit}>
+      <Button
+        data-test-id="sign-up-proceed-to-set-email-and-password"
+        mt={4}
+        onClick={handleSubmit}
+      >
         PROCEED TO SET {type === 'signup' && 'EMAIL AND'} PASSWORD
       </Button>
 
diff --git a/packages/components-faraday/src/components/SignUp/SignUpStep1.js b/packages/components-faraday/src/components/SignUp/SignUpStep1.js
index a9d6d4625b1fd6ca485b7de67d7765154a1bc020..2b704892b11d80f05b88ea4007b45d5ce8e9e0a5 100644
--- a/packages/components-faraday/src/components/SignUp/SignUpStep1.js
+++ b/packages/components-faraday/src/components/SignUp/SignUpStep1.js
@@ -12,7 +12,7 @@ const EmailField = input => <TextField {...input} type="email" />
 const SignUpForm = () => (
   <Fragment>
     <Row mb={2}>
-      <Item vertical>
+      <Item data-test-id="sign-up-email" vertical>
         <Label required>Email</Label>
         <ValidatedField
           component={EmailField}
@@ -22,7 +22,7 @@ const SignUpForm = () => (
       </Item>
     </Row>
     <Row mb={2}>
-      <Item vertical>
+      <Item data-test-id="sign-up-password" vertical>
         <Label required>Password</Label>
         <ValidatedField
           component={PasswordField}
@@ -32,7 +32,7 @@ const SignUpForm = () => (
       </Item>
     </Row>
     <Row mb={2}>
-      <Item vertical>
+      <Item data-test-id="sign-up-confirm-password" vertical>
         <Label required>Confirm password</Label>
         <ValidatedField
           component={PasswordField}
@@ -106,8 +106,17 @@ const Step1 = ({
     <Row />
 
     <Row justify={!withoutBack.includes(type) ? 'space-between' : 'center'}>
-      {!withoutBack.includes(type) && <Button onClick={onBack}>BACK</Button>}
-      <Button disabled={submitting} onClick={handleSubmit} primary>
+      {!withoutBack.includes(type) && (
+        <Button data-test-id="sign-up-back-button" onClick={onBack}>
+          BACK
+        </Button>
+      )}
+      <Button
+        data-test-id="sign-up-confirm-button"
+        disabled={submitting}
+        onClick={handleSubmit}
+        primary
+      >
         {onSubmitText}
       </Button>
     </Row>
diff --git a/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js b/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js
index ed37e20705475698d9d47fa0543fa819d00fe3c4..a2c978f8660d924d2b7b27bbadd607b8a6a27995 100644
--- a/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js
+++ b/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js
@@ -34,7 +34,7 @@ const sizeValidator = manuscriptIdSizeValidator(7)
 
 const Enhanched = () => (
   <Row>
-    <Item vertical>
+    <Item data-test-id="manuscript-id" vertical>
       <Label required>Manuscript ID</Label>
       <ValidatedField
         component={TextField}
@@ -77,7 +77,7 @@ const FormModal = reduxForm({
     title="Accept Manuscript"
   >
     {showModal => (
-      <Button onClick={showModal} primary>
+      <Button data-test-id="eqs-yes-button" onClick={showModal} primary>
         YES
       </Button>
     )}
@@ -116,7 +116,11 @@ const EQSDecisionPage = ({
           subtitle="Are you sure you want to reject this manuscript?"
           title="Reject manuscript"
         >
-          {showModal => <Button onClick={showModal}>NO</Button>}
+          {showModal => (
+            <Button data-test-id="eqs-no-button" onClick={showModal}>
+              NO
+            </Button>
+          )}
         </OpenModal>
         <FormModal
           isFetching={isFetching}
diff --git a/packages/components-faraday/src/redux/reviewers.js b/packages/components-faraday/src/redux/reviewers.js
index 9d2ee9b6333822535652d83f30b1802a21a879df..4cb9dd209e6d8d922a0e3ca394698743754b61c2 100644
--- a/packages/components-faraday/src/redux/reviewers.js
+++ b/packages/components-faraday/src/redux/reviewers.js
@@ -60,9 +60,9 @@ export const getCollectionReviewers = (collectionId, fragmentId) => dispatch =>
 // #endregion
 
 export const inviteReviewer = ({
+  fragmentId,
   reviewerData,
   collectionId,
-  fragmentId,
   isPublons = false,
 }) =>
   create(`/collections/${collectionId}/fragments/${fragmentId}/invitations`, {
diff --git a/packages/xpub-faraday/config/authsome-helpers.js b/packages/xpub-faraday/config/authsome-helpers.js
index 718190c444db9b5404cec625cf3109db0abea80e..c97f8b89a8f9acb1b7b626e5fc5b79636889bf65 100644
--- a/packages/xpub-faraday/config/authsome-helpers.js
+++ b/packages/xpub-faraday/config/authsome-helpers.js
@@ -184,7 +184,11 @@ const stripeFragmentByRole = ({
       return {
         ...fragment,
         recommendations: recommendations
-          ? recommendations.filter(r => r.submittedOn)
+          ? recommendations.filter(
+              r =>
+                r.submittedOn ||
+                r.recommendationType === 'editorRecommendation',
+            )
           : [],
       }
     default: