diff --git a/packages/component-manuscript/src/components/ReviewerReportForm.js b/packages/component-manuscript/src/components/ReviewerReportForm.js
index b8ca662a4109bdd916cf195c0690bda6bc6e1c17..2da95ea14fcfeb5d219f7f47a57829a27facb1c6 100644
--- a/packages/component-manuscript/src/components/ReviewerReportForm.js
+++ b/packages/component-manuscript/src/components/ReviewerReportForm.js
@@ -25,7 +25,6 @@ import AutosaveIndicator from 'pubsweet-component-wizard/src/components/Autosave
 import {
   uploadFile,
   deleteFile,
-  getFileError,
   getSignedUrl,
   getRequestStatus,
 } from 'pubsweet-components-faraday/src/redux/files'
@@ -40,8 +39,6 @@ import {
 } from 'pubsweet-component-modal/src/components'
 
 import {
-  selectError,
-  selectFetching,
   createRecommendation,
   updateRecommendation,
 } from 'pubsweet-components-faraday/src/redux/recommendations'
@@ -62,7 +59,6 @@ const ReviewerReportForm = ({
   fileError,
   removeFile,
   changeField,
-  errorRequest,
   isSubmitting,
   handleSubmit,
   fileFetching,
@@ -172,11 +168,6 @@ const ReviewerReportForm = ({
         <ErrorText>{fileError}</ErrorText>
       </Row>
     )}
-    {errorRequest && (
-      <Row>
-        <ErrorText>{errorRequest}</ErrorText>
-      </Row>
-    )}
     <Row>
       <ActionButton onClick={handleSubmit}> Submit report </ActionButton>
       <AutosaveIndicator
@@ -189,8 +180,7 @@ const ReviewerReportForm = ({
 
 const ModalWrapper = compose(
   connect(state => ({
-    modalError: selectError(state),
-    fetching: selectFetching(state),
+    fetching: false,
   })),
 )(({ fetching, ...rest }) => (
   <ConfirmationModal {...rest} isFetching={fetching} />
@@ -200,8 +190,6 @@ export default compose(
   withJournal,
   connect(
     state => ({
-      fileError: getFileError(state),
-      errorRequest: selectError(state),
       fileFetching: getRequestStatus(state),
       formValues: getFormValues('reviewerReport')(state),
       isSubmitting: isSubmitting('reviewerReport')(state),
diff --git a/packages/component-manuscript/src/components/ReviewsAndReports.js b/packages/component-manuscript/src/components/ReviewsAndReports.js
index 7248a6a1502bef9da4171683a8b09b8eb161981a..ced7097c6c243e89b12228118c210f16fa3caedf 100644
--- a/packages/component-manuscript/src/components/ReviewsAndReports.js
+++ b/packages/component-manuscript/src/components/ReviewsAndReports.js
@@ -1,6 +1,6 @@
 import React, { Fragment } from 'react'
-import { head } from 'lodash'
 import { th } from '@pubsweet/ui'
+import { head, get } from 'lodash'
 import { connect } from 'react-redux'
 import styled from 'styled-components'
 import { compose, withHandlers, lifecycle, withProps } from 'recompose'
@@ -51,6 +51,9 @@ const ReviewsAndReports = ({
   mappedReviewers,
   mappedRecommendations,
   canSeeReviewersReports,
+  //
+  reviewerRecommendation,
+  //
   review = {},
   reviewers = [],
   recommendations = [],
@@ -82,13 +85,13 @@ const ReviewsAndReports = ({
     {isReviewer && (
       <Root id="review-report">
         <Expandable label="Your Report" startExpanded>
-          {report ? (
-            <ReviewReportCard report={report} />
+          {get(reviewerRecommendation, 'submittedOn') ? (
+            <ReviewReportCard report={reviewerRecommendation} />
           ) : (
             <ReviewerReportForm
               modalKey={`review-${project.id}`}
               project={project}
-              review={review}
+              review={reviewerRecommendation}
               version={version}
             />
           )}
@@ -127,6 +130,7 @@ export default compose(
   withProps(({ recommendations = [] }) => ({
     review: head(recommendations),
     report: head(recommendations.filter(r => r.submittedOn)),
+    reviewerRecommendation: head(recommendations),
   })),
   lifecycle({
     componentDidMount() {
diff --git a/packages/component-manuscript/src/components/utils.js b/packages/component-manuscript/src/components/utils.js
index 47c080f7ea60b9ea2b4bc412f01c06a36bdc17e8..ed5e3885bbfad9c55e488500582ab05c8ed6ca66 100644
--- a/packages/component-manuscript/src/components/utils.js
+++ b/packages/component-manuscript/src/components/utils.js
@@ -1,6 +1,8 @@
 import moment from 'moment'
 import { get, find, capitalize, omit, isEmpty, isEqual, debounce } from 'lodash'
 
+import { actions } from 'pubsweet-client/src'
+import { change as changeForm } from 'redux-form'
 import {
   autosaveRequest,
   autosaveSuccess,
@@ -88,7 +90,7 @@ export const redirectToError = redirectFn => err => {
 }
 
 export const parseReviewResponseToForm = (review = {}) => {
-  if (isEmpty(review)) return null
+  if (isEmpty(review)) return {}
   const comments = review.comments || []
   const publicComment = comments.find(c => c.public)
   const privateComment = comments.find(c => !c.public)
@@ -102,7 +104,7 @@ export const parseReviewResponseToForm = (review = {}) => {
 }
 
 export const parseReviewRequest = (review = {}) => {
-  if (isEmpty(review)) return null
+  if (isEmpty(review)) return {}
   const comments = [
     {
       public: true,
@@ -147,7 +149,10 @@ const onChange = (
         .catch(e => dispatch(autosaveFailure(e)))
     } else {
       createRecommendation(project.id, version.id, newValues)
-        .then(r => dispatch(autosaveSuccess(get(r, 'updatedOn'))))
+        .then(r => {
+          dispatch(changeForm('reviewerReport', 'id', r.id))
+          return dispatch(autosaveSuccess(get(r, 'updatedOn')))
+        })
         .catch(e => dispatch(autosaveFailure(e)))
     }
   }
@@ -177,7 +182,10 @@ export const onReviewSubmit = (
       dispatch(autosaveRequest())
       updateRecommendation(project.id, version.id, newValues)
         .then(r => dispatch(autosaveSuccess(get(r, 'updatedOn'))))
-        .then(hideModal)
+        .then(() => {
+          dispatch(actions.getFragments())
+          hideModal()
+        })
     },
     onCancel: hideModal,
   })
diff --git a/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js b/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js
index c4d020c9a5ac49a0ed5b160476429a3f64b640de..08bfbff9dc1dbd96821f8b40eb6e881604117aea 100644
--- a/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js
+++ b/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js
@@ -31,12 +31,14 @@ export default compose(
   connect(null, {
     reviewerDecision,
     getFragments: actions.getFragments,
+    getCollections: actions.getCollections,
   }),
   withModal(props => ({
     modalComponent: ModalComponent,
   })),
   withHandlers({
-    decisionSuccess: ({ getFragments, hideModal }) => () => {
+    decisionSuccess: ({ getFragments, getCollections, hideModal }) => () => {
+      getCollections()
       getFragments()
       hideModal()
     },
diff --git a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
index 262a8cfbe8297cd9a0ca7e3c18c2d5241a3e73fc..0a53c9423317ac06571ebf6470b6ee16b957fb0f 100644
--- a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
+++ b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
@@ -1,24 +1,19 @@
 import React from 'react'
 import { get } from 'lodash'
 import { connect } from 'react-redux'
+import styled from 'styled-components'
 import { actions } from 'pubsweet-client'
 import { required } from 'xpub-validators'
-import styled from 'styled-components'
 import { reduxForm, formValueSelector } from 'redux-form'
 import { compose, setDisplayName, withProps } from 'recompose'
-import { Icon, Button, Spinner, RadioGroup, ValidatedField } from '@pubsweet/ui'
+import { Icon, Button, RadioGroup, ValidatedField } from '@pubsweet/ui'
 
 import { FormItems } from '../UIComponents'
-import {
-  selectError,
-  selectFetching,
-  createRecommendation,
-} from '../../redux/recommendations'
+import { createRecommendation } from '../../redux/recommendations'
 import { subtitleParser, decisions, parseFormValues } from './utils'
 import { getHERecommendation } from '../../../../component-faraday-selectors'
 
 const {
-  Err,
   Row,
   Title,
   Label,
@@ -35,9 +30,7 @@ const DecisionForm = ({
   aHERec,
   decision,
   hideModal,
-  isFetching,
   handleSubmit,
-  recommendationError,
   heRecommendation: { reason, message = '' },
 }) => (
   <Form onSubmit={handleSubmit}>
@@ -90,25 +83,14 @@ const DecisionForm = ({
         </RowItem>
       </Row>
     )}
-    {recommendationError && (
-      <Row>
-        <RowItem centered>
-          <Err>{recommendationError}</Err>
-        </RowItem>
-      </Row>
-    )}
     <Row>
       <RowItem centered>
         <Button onClick={hideModal}>Cancel</Button>
       </RowItem>
       <RowItem centered>
-        {isFetching ? (
-          <Spinner size={3} />
-        ) : (
-          <Button primary type="submit">
-            Submit
-          </Button>
-        )}
+        <Button primary type="submit">
+          Submit
+        </Button>
       </RowItem>
     </Row>
   </Form>
@@ -119,9 +101,7 @@ export default compose(
   setDisplayName('DecisionForm'),
   connect(
     (state, { fragmentId, collectionId }) => ({
-      isFetching: selectFetching(state),
       decision: selector(state, 'decision'),
-      recommendationError: selectError(state),
       heRecommendation: getHERecommendation(state, collectionId, fragmentId),
     }),
     {
diff --git a/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js b/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js
index 555a8979f77c7987940721aaa25d2be1e0c2b570..fb7452baf0ba87d8e6d3edb530511df05a9a4bfa 100644
--- a/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js
+++ b/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js
@@ -9,11 +9,7 @@ import { getFormValues, reset as resetForm } from 'redux-form'
 
 import { FormItems } from '../UIComponents'
 import { StepOne, StepTwo, utils } from './'
-import {
-  selectError,
-  selectFetching,
-  createRecommendation,
-} from '../../redux/recommendations'
+import { createRecommendation } from '../../redux/recommendations'
 
 const RecommendWizard = ({
   step,
@@ -22,8 +18,6 @@ const RecommendWizard = ({
   prevStep,
   closeModal,
   submitForm,
-  isFetching,
-  recommendationError,
   ...rest
 }) => (
   <FormItems.RootContainer>
@@ -39,13 +33,7 @@ const RecommendWizard = ({
       />
     )}
     {step === 1 && (
-      <StepTwo
-        decision={decision}
-        goBack={prevStep}
-        isFetching={isFetching}
-        onSubmit={submitForm}
-        recommendationError={recommendationError}
-      />
+      <StepTwo decision={decision} goBack={prevStep} onSubmit={submitForm} />
     )}
   </FormItems.RootContainer>
 )
@@ -53,8 +41,6 @@ const RecommendWizard = ({
 export default compose(
   connect(
     state => ({
-      isFetching: selectFetching(state),
-      recommendationError: selectError(state),
       decision: get(getFormValues('recommendation')(state), 'decision'),
     }),
     {
diff --git a/packages/components-faraday/src/redux/recommendations.js b/packages/components-faraday/src/redux/recommendations.js
index 9936ff3d16989380edfa015d086c45a37ed8dafe..4a3e1f70ff1efd7ef18b9fb4e1191a3e503a5361 100644
--- a/packages/components-faraday/src/redux/recommendations.js
+++ b/packages/components-faraday/src/redux/recommendations.js
@@ -1,46 +1,7 @@
 import { get } from 'lodash'
 import { create, update } from 'pubsweet-client/src/helpers/api'
 
-// #region Constants
-const REQUEST = 'recommendations/REQUEST'
-const ERROR = 'recommendations/ERROR'
-
-const GET_FRAGMENT_SUCCESS = 'GET_FRAGMENT_SUCCESS'
-const GET_RECOMMENDATIONS_SUCCESS = 'recommendations/GET_SUCCESS'
-const CREATE_RECOMMENDATION_SUCCESS = 'recommendations/CREATE_SUCCESS'
-const UPDATE_RECOMMENDATION_SUCCESS = 'recommendations/UPDATE_SUCCESS'
-// #endregion
-
-// #region Action Creators
-export const recommendationsRequest = () => ({
-  type: REQUEST,
-})
-
-export const recommendationsError = error => ({
-  type: ERROR,
-  error,
-})
-
-export const getRecommendationsSuccess = recommendation => ({
-  type: GET_RECOMMENDATIONS_SUCCESS,
-  payload: { recommendation },
-})
-
-export const createRecommendationSuccess = recommendation => ({
-  type: CREATE_RECOMMENDATION_SUCCESS,
-  payload: { recommendation },
-})
-
-export const updateRecommendationSuccess = recommendation => ({
-  type: UPDATE_RECOMMENDATION_SUCCESS,
-  payload: { recommendation },
-})
-// #endregion
-
 // #region Selectors
-export const selectFetching = state =>
-  get(state, 'recommendations.fetching') || false
-export const selectError = state => get(state, 'recommendations.error')
 export const selectRecommendations = (state, fragmentId) =>
   get(state, `fragments.${fragmentId}.recommendations`) || []
 export const selectEditorialRecommendations = (state, fragmentId) =>
@@ -50,105 +11,26 @@ export const selectEditorialRecommendations = (state, fragmentId) =>
 // #endregion
 
 // #region Actions
+// error handling and fetching is handled by the autosave reducer
 export const createRecommendation = (
   collId,
   fragId,
   recommendation,
-) => dispatch => {
-  dispatch(recommendationsRequest())
-  return create(
+) => dispatch =>
+  create(
     `/collections/${collId}/fragments/${fragId}/recommendations`,
     recommendation,
-  ).then(
-    r => {
-      dispatch(getRecommendationsSuccess(r))
-      return r
-    },
-    err => {
-      const error = get(err, 'response')
-      if (error) {
-        const errorMessage = get(JSON.parse(error), 'error')
-        dispatch(recommendationsError(errorMessage))
-      }
-      throw err
-    },
   )
-}
 
 export const updateRecommendation = (
   collId,
   fragId,
   recommendation,
-) => dispatch => {
-  dispatch(recommendationsRequest())
-  return update(
+) => dispatch =>
+  update(
     `/collections/${collId}/fragments/${fragId}/recommendations/${
       recommendation.id
     }`,
     recommendation,
-  ).then(
-    r => {
-      dispatch(getRecommendationsSuccess(r))
-      return r
-    },
-    err => {
-      const error = get(err, 'response')
-      if (error) {
-        const errorMessage = get(JSON.parse(error), 'error')
-        dispatch(recommendationsError(errorMessage))
-      }
-      throw err
-    },
   )
-}
-// #endregion
-
-// #region State
-const initialState = {
-  fetching: false,
-  error: null,
-  recommendations: [],
-}
-
-export default (state = initialState, action = {}) => {
-  switch (action.type) {
-    case REQUEST:
-      return {
-        ...state,
-        fetching: true,
-      }
-    case ERROR:
-      return {
-        ...state,
-        fetching: false,
-        error: action.error,
-      }
-    case GET_FRAGMENT_SUCCESS:
-      return {
-        ...state,
-        fetching: false,
-        error: null,
-        recommendations: get(action, 'fragment.recommendations'),
-      }
-    case GET_RECOMMENDATIONS_SUCCESS:
-      return {
-        ...state,
-        fetching: false,
-        error: null,
-        recommendations: state.recommendations
-          ? [...state.recommendations, action.payload.recommendation]
-          : action.payload.recommendation,
-      }
-    case UPDATE_RECOMMENDATION_SUCCESS:
-    case CREATE_RECOMMENDATION_SUCCESS:
-      return {
-        ...state,
-        fetching: false,
-        error: null,
-        recommendations: [action.payload.recommendation],
-      }
-    default:
-      return state
-  }
-}
 // #endregion
diff --git a/packages/xpub-faraday/config/authsome-mode.js b/packages/xpub-faraday/config/authsome-mode.js
index 2c80868ddf05885664bdaa937bcf571bb32d264a..a8e5d2349b827eb0986a5c9d5ea688c8a1d7f9e8 100644
--- a/packages/xpub-faraday/config/authsome-mode.js
+++ b/packages/xpub-faraday/config/authsome-mode.js
@@ -141,6 +141,9 @@ async function authenticatedUser(user, operation, object, context) {
           if (permission.role === 'reviewer') {
             fragment.files = omit(fragment.files, ['coverLetter'])
             fragment.authors = fragment.authors.map(a => omit(a, ['email']))
+            fragment.recommendations = fragment.recommendations
+              ? fragment.recommendations.filter(r => r.userId === user.id)
+              : []
           }
           return fragment
         },