diff --git a/packages/component-dashboard/src/components/metadata/MetadataSections.js b/packages/component-dashboard/src/components/metadata/MetadataSections.js
index 84594432b4a99a984e9e059be153a8d19d77dc17..bf2b7b8b7d1ee4c13598402dd6a71d5b6c638993 100644
--- a/packages/component-dashboard/src/components/metadata/MetadataSections.js
+++ b/packages/component-dashboard/src/components/metadata/MetadataSections.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { withJournal } from 'xpub-journal'
 
-const MetadataSections = ({ journal, sections }) => (
+const MetadataSections = ({ journal, sections = [] }) => (
   <span>
     {sections.map((section, index) => [
       index === 0 ? null : <span>, </span>,
diff --git a/packages/component-dashboard/src/components/metadata/MetadataType.js b/packages/component-dashboard/src/components/metadata/MetadataType.js
index c17906048df62880f62140366b45d11959a4c0f8..ef8d5ad2b60f5ff29e075a32c2db37463444d05a 100644
--- a/packages/component-dashboard/src/components/metadata/MetadataType.js
+++ b/packages/component-dashboard/src/components/metadata/MetadataType.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { withJournal } from 'xpub-journal'
 
-const MetadataType = ({ journal, type }) => (
+const MetadataType = ({ journal, type = 'review' }) => (
   <span>{journal.articleTypes.find(item => item.value === type).label}</span>
 )
 
diff --git a/packages/component-wizard/src/components/AuthorList.js b/packages/component-wizard/src/components/AuthorList.js
index 4d7f6281c87ecc90b1c92685a33dedfa1fb9b09c..879dba67eb9f3cb945d9c3d3575df5c35e7e30e6 100644
--- a/packages/component-wizard/src/components/AuthorList.js
+++ b/packages/component-wizard/src/components/AuthorList.js
@@ -1,10 +1,16 @@
 import React from 'react'
-import { get } from 'lodash'
+import PropTypes from 'prop-types'
 import classnames from 'classnames'
+import { connect } from 'react-redux'
+import { get, debounce } from 'lodash'
 import { reduxForm } from 'redux-form'
-import { compose, withState, withHandlers } from 'recompose'
-import { TextField, Menu, Icon, ValidatedField, Button } from '@pubsweet/ui'
+import { actions } from 'pubsweet-client'
 import { required } from 'xpub-validators'
+import { withRouter } from 'react-router-dom'
+import { compose, withHandlers, getContext, lifecycle } from 'recompose'
+import { TextField, Menu, Icon, ValidatedField, Button } from '@pubsweet/ui'
+
+import { addAuthor, getFragmentAuthors, setAuthors } from '../redux/authors'
 
 import classes from './AuthorList.local.scss'
 import SortableList from './SortableList'
@@ -41,33 +47,38 @@ const MenuItem = ({ label, name, options }) => (
     />
   </div>
 )
-const AuthorAdder = ({
-  author: { firstName, middleName, lastName, email, affiliation, country },
-  editAuthor,
-  addAuthor,
-  handleSubmit,
-  ...rest
-}) => (
+
+const AuthorAdder = ({ authors, handleSubmit, ...rest }) => (
   <div className={classnames(classes.adder)}>
     <Button onClick={handleSubmit} primary>
-      + Add author
+      {authors.length === 0 ? '+ Add submitting author' : '+ Add author'}
     </Button>
-    <span className={classnames(classes.title)}>Author</span>
+    <span className={classnames(classes.title)}>
+      {authors.length === 0 ? 'Submitting author' : 'Author'}
+    </span>
     <div className={classnames(classes.row)}>
-      <ValidatedTextField isRequired label="First name" name="firstName" />
-      <ValidatedTextField label="Middle name" name="middleName" />
-      <ValidatedTextField isRequired label="Last name" name="lastName" />
+      <ValidatedTextField
+        isRequired
+        label="First name"
+        name="author.firstName"
+      />
+      <ValidatedTextField label="Middle name" name="author.middleName" />
+      <ValidatedTextField isRequired label="Last name" name="author.lastName" />
     </div>
 
     <div className={classnames(classes.row)}>
       <ValidatedTextField
         isRequired
         label="Email"
-        name="email"
+        name="author.email"
         validators={[emailValidator]}
       />
-      <ValidatedTextField isRequired label="Affiliation" name="affiliation" />
-      <MenuItem label="Country" name="country" options={countries} />
+      <ValidatedTextField
+        isRequired
+        label="Affiliation"
+        name="author.affiliation"
+      />
+      <MenuItem label="Country" name="author.country" options={countries} />
     </div>
   </div>
 )
@@ -98,6 +109,11 @@ const Author = ({
   dragHandle,
   isOver,
   countryParser,
+  removeAuthor,
+  isSubmitting,
+  isCorresponding,
+  setAsCorresponding,
+  parseAuthorType,
 }) => (
   <div
     className={classnames({
@@ -112,7 +128,9 @@ const Author = ({
         [classes.hide]: isOver,
       })}
     >
-      <span className={classnames(classes.title)}>Author</span>
+      <span className={classnames(classes.title)}>
+        {parseAuthorType(isSubmitting, isCorresponding)}
+      </span>
       <div className={classnames(classes.row)}>
         <Label label="First name" value={firstName} />
         <Label label="Middle name" value={middleName} />
@@ -124,15 +142,44 @@ const Author = ({
         <Label label="Country" value={countryParser(country)} />
       </div>
     </div>
+    <div className={classnames(classes['button-container'])}>
+      {!isSubmitting && (
+        <div
+          className={classnames(classes['delete-button'])}
+          onClick={removeAuthor(email)}
+        >
+          <Icon>trash</Icon>
+        </div>
+      )}
+      {!isCorresponding && (
+        <div
+          className={classnames(classes.corresponding)}
+          onClick={setAsCorresponding(email)}
+        >
+          <Icon>mail</Icon>
+        </div>
+      )}
+    </div>
   </div>
 )
 
 const Adder = compose(
   reduxForm({
-    form: 'new-author',
-    onSubmit: (values, dispatch, { addAuthor, reset }) => {
-      addAuthor(values)
-      reset()
+    form: 'author',
+    destroyOnUnmount: false,
+    onSubmit: (values, dispatch, { authors, addAuthor, reset, match }) => {
+      const collectionId = get(match, 'params.project')
+      const fragmentId = get(match, 'params.version')
+      const isFirstAuthor = authors.length === 0
+      addAuthor(
+        {
+          ...values.author,
+          isSubmitting: isFirstAuthor,
+          isCorresponding: isFirstAuthor,
+        },
+        collectionId,
+        fragmentId,
+      ).then(reset)
     },
   })(AuthorAdder),
 )
@@ -143,12 +190,22 @@ const Authors = ({
   moveAuthor,
   addAuthor,
   editAuthor,
+  match,
+  version,
+  dropItem,
   ...rest
 }) => (
   <div>
-    <Adder addAuthor={addAuthor} author={author} editAuthor={editAuthor} />
+    <Adder
+      addAuthor={addAuthor}
+      author={author}
+      authors={authors}
+      editAuthor={editAuthor}
+      match={match}
+    />
     <SortableList
       dragHandle={DragHandle}
+      dropItem={dropItem}
       items={authors}
       listItem={Author}
       moveItem={moveAuthor}
@@ -157,33 +214,79 @@ const Authors = ({
   </div>
 )
 
-const initialAuthor = {
-  firstName: '',
-  middleName: '',
-  lastName: '',
-  email: '',
-  affiliation: '',
-  country: 'ro',
-}
 export default compose(
-  withState('author', 'changeAuthor', initialAuthor),
-  withState('authors', 'changeAuthors', []),
+  withRouter,
+  getContext({ version: PropTypes.object, project: PropTypes.object }),
+  connect(
+    (state, { match: { params: { version } } }) => ({
+      authors: getFragmentAuthors(state, version),
+    }),
+    {
+      addAuthor,
+      setAuthors,
+      updateFragment: actions.updateFragment,
+    },
+  ),
+  lifecycle({
+    componentDidMount() {
+      const { version, setAuthors } = this.props
+      setAuthors(version.authors, version.id)
+    },
+  }),
   withHandlers({
+    dropItem: ({ updateFragment, authors, project, version }) =>
+      debounce(() => {
+        updateFragment(project, {
+          ...version,
+          authors,
+        })
+      }, 500),
     countryParser: () => countryCode =>
       countries.find(c => c.value === countryCode).label,
-    addAuthor: ({ changeAuthors, changeAuthor }) => author => {
-      changeAuthors(prevAuthors => [author, ...prevAuthors])
-      changeAuthor(prev => initialAuthor)
+    parseAuthorType: () => (isSubmitting, isCorresponding) => {
+      if (isSubmitting) return 'Submitting author'
+      if (isCorresponding) return 'Corresponding author'
+      return 'Author'
+    },
+    moveAuthor: ({
+      authors,
+      setAuthors,
+      project,
+      version,
+      updateFragment,
+      match: { params },
+    }) => (dragIndex, hoverIndex) => {
+      const newAuthors = SortableList.moveItem(authors, dragIndex, hoverIndex)
+      setAuthors(newAuthors, params.version)
     },
-    moveAuthor: ({ changeAuthors }) => (dragIndex, hoverIndex) => {
-      changeAuthors(prev => SortableList.moveItem(prev, dragIndex, hoverIndex))
+    removeAuthor: ({
+      authors,
+      updateFragment,
+      project,
+      version,
+      setAuthors,
+    }) => authorEmail => () => {
+      const newAuthors = authors.filter(a => a.email !== authorEmail)
+      updateFragment(project, {
+        ...version,
+        authors: newAuthors,
+      }).then(() => setAuthors(newAuthors, version.id))
     },
-    editAuthor: ({ changeAuthor }) => field => e => {
-      const v = get(e, 'target.value') || e
-      changeAuthor(prev => ({
-        ...prev,
-        [field]: v,
+    setAsCorresponding: ({
+      authors,
+      updateFragment,
+      setAuthors,
+      version,
+      project,
+    }) => authorEmail => () => {
+      const newAuthors = authors.map(a => ({
+        ...a,
+        isCorresponding: a.isSubmitting || a.email === authorEmail,
       }))
+      updateFragment(project, {
+        ...version,
+        authors: newAuthors,
+      }).then(() => setAuthors(newAuthors, version.id))
     },
   }),
 )(Authors)
diff --git a/packages/component-wizard/src/components/AuthorList.local.scss b/packages/component-wizard/src/components/AuthorList.local.scss
index bfa0dcc4774c8d496dfa59f1fca31e5fd5702bc6..ea18aada1726cf751e7e5d29f87fe08ceffda286 100644
--- a/packages/component-wizard/src/components/AuthorList.local.scss
+++ b/packages/component-wizard/src/components/AuthorList.local.scss
@@ -26,6 +26,7 @@
 
   .container {
     flex: 1;
+    padding: 10px;
   }
 
   .title {
@@ -95,3 +96,26 @@
   flex: 1;
   margin-right: 20px;
 }
+
+.button-container {
+  display: flex;
+  flex-direction: column;
+  padding: 0 10px;
+}
+
+.delete-button {
+  align-items: center;
+  cursor: pointer;
+  display: flex;
+  flex: 1;
+  justify-content: center;
+}
+
+.corresponding {
+  align-items: center;
+  cursor: pointer;
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  justify-content: center;
+}
diff --git a/packages/component-wizard/src/components/SortableList.js b/packages/component-wizard/src/components/SortableList.js
index e7db078bf3b279bd486d425cf647f9d076c537a5..c566f4c63de5337bf218b660660c311efe308b92 100644
--- a/packages/component-wizard/src/components/SortableList.js
+++ b/packages/component-wizard/src/components/SortableList.js
@@ -36,6 +36,9 @@ const itemTarget = {
     }
     monitor.getItem().index = hoverIndex
   },
+  drop({ dropItem }) {
+    if (dropItem && typeof dropItem === 'function') dropItem()
+  },
 }
 
 const Item = ({
diff --git a/packages/component-wizard/src/components/WizardFormStep.js b/packages/component-wizard/src/components/WizardFormStep.js
index e031cbc24ad30ce519016da036ffdbdca52b0f1e..04bd7a4904a10928de6606e378d9353743daca3b 100644
--- a/packages/component-wizard/src/components/WizardFormStep.js
+++ b/packages/component-wizard/src/components/WizardFormStep.js
@@ -1,8 +1,8 @@
 import PropTypes from 'prop-types'
 import { connect } from 'react-redux'
-import { debounce, pick } from 'lodash'
+import { debounce, pick, get } from 'lodash'
 import { actions } from 'pubsweet-client'
-import { reduxForm, formValueSelector } from 'redux-form'
+import { reduxForm, formValueSelector, SubmissionError } from 'redux-form'
 import { compose, getContext, withProps } from 'recompose'
 
 import WizardStep from './WizardStep'
@@ -19,18 +19,59 @@ const onChange = (values, dispatch, { project, version }) => {
   )
 }
 
+const submitManuscript = (values, dispatch, project, version, history) => {
+  dispatch(
+    actions.updateFragment(project, {
+      id: version.id,
+      rev: version.rev,
+      submitted: new Date(),
+      ...values,
+    }),
+  )
+    .then(() =>
+      dispatch(
+        actions.updateCollection({
+          id: project.id,
+          rev: project.rev,
+          status: 'submitted',
+        }),
+      ),
+    )
+    .then(() => {
+      history.push('/')
+    })
+    .catch(error => {
+      if (error.validationErrors) {
+        throw new SubmissionError()
+      }
+    })
+}
+
+const onSubmit = (
+  values,
+  dispatch,
+  { nextStep, isFinal, history, project, version, ...rest },
+) => {
+  if (!isFinal) {
+    nextStep()
+  } else {
+    submitManuscript(values, dispatch, project, version, history)
+  }
+}
+
 export default compose(
   getContext({
-    goBack: PropTypes.func,
+    history: PropTypes.object,
     isFinal: PropTypes.bool,
     isFirst: PropTypes.bool,
     project: PropTypes.object,
     version: PropTypes.object,
     wizard: PropTypes.object,
+    dispatchFns: PropTypes.object,
   }),
   withProps(({ version, wizard }) => ({
     initialValues: pick(version, wizard.formSectionKeys),
-    readonly: !!version.submitted,
+    readonly: !!get(version, 'submitted'),
   })),
   connect((state, { wizard: { formSectionKeys } }) => ({
     formValues: formSectionKeys.reduce(
@@ -43,13 +84,8 @@ export default compose(
   })),
   reduxForm({
     form: 'wizard',
-    destroyOnUnmount: false,
     forceUnregisterOnUnmount: true,
-    onSubmit: (values, dispatch, { nextStep, isFinal }) => {
-      if (!isFinal) {
-        nextStep()
-      }
-    },
     onChange: debounce(onChange, 1000, { maxWait: 5000 }),
+    onSubmit,
   }),
 )(WizardStep)
diff --git a/packages/component-wizard/src/components/WizardPage.js b/packages/component-wizard/src/components/WizardPage.js
index 1e60878690186a6fdb83a0929fad500a7276c140..edc85ab088e30063f98ab106ffa843bde4bd0b1e 100644
--- a/packages/component-wizard/src/components/WizardPage.js
+++ b/packages/component-wizard/src/components/WizardPage.js
@@ -1,5 +1,6 @@
 import PropTypes from 'prop-types'
 import { connect } from 'react-redux'
+import { bindActionCreators } from 'redux'
 import { actions } from 'pubsweet-client'
 import { withJournal } from 'xpub-journal'
 import { ConnectPage } from 'xpub-connect'
@@ -16,13 +17,21 @@ export default compose(
       { id: match.params.version },
     ),
   ]),
-  connect((state, { match }) => {
-    const project = selectCollection(state, match.params.project)
-    const version = selectFragment(state, match.params.version)
-
-    return { project, version }
-  }),
   withJournal,
+  connect(
+    (state, { match }) => {
+      const project = selectCollection(state, match.params.project)
+      const version = selectFragment(state, match.params.version)
+
+      return { project, version }
+    },
+    (dispatch, { journal: { wizard } }) => ({
+      dispatchFns: wizard.dispatchFunctions.reduce((acc, f) => {
+        acc[f.name] = bindActionCreators(f, dispatch)
+        return acc
+      }, {}),
+    }),
+  ),
   withState('step', 'changeStep', 0),
   withHandlers({
     getSteps: ({ journal: { wizard: { steps } } }) => () =>
@@ -35,20 +44,29 @@ export default compose(
   }),
   withContext(
     {
-      goBack: PropTypes.func,
+      history: PropTypes.object,
       isFinal: PropTypes.bool,
       isFirst: PropTypes.bool,
       project: PropTypes.object,
       version: PropTypes.object,
       wizard: PropTypes.object,
+      dispatchFns: PropTypes.object,
     },
-    ({ history: { goBack }, step, project, version, journal: { wizard } }) => ({
-      goBack,
+    ({
+      history,
+      step,
+      project,
+      version,
+      journal: { wizard },
+      dispatchFns,
+    }) => ({
+      history,
       isFinal: step === wizard.steps.length - 1,
       isFirst: step === 0,
       project,
       version,
       wizard,
+      dispatchFns,
     }),
   ),
 )(Wizard)
diff --git a/packages/component-wizard/src/components/WizardStep.js b/packages/component-wizard/src/components/WizardStep.js
index 672f22d3fca3f1c9f28e85b3accd87251f04e636..afd2ba1fe3f436b1ff91c94b5aba45c21cad197c 100644
--- a/packages/component-wizard/src/components/WizardStep.js
+++ b/packages/component-wizard/src/components/WizardStep.js
@@ -8,18 +8,25 @@ import classes from './WizardStep.local.scss'
 export default ({
   children: stepChildren,
   title,
+  subtitle,
   buttons,
   nextStep,
   prevStep,
   handleSubmit,
   isFinal,
   isFirst,
-  goBack,
+  history,
   formValues,
+  wizard,
+  dispatchFns,
 }) => (
   <div className={classnames(classes.step)}>
     <form className={classnames(classes.form)} onSubmit={handleSubmit}>
       <h3 className={classnames(classes.title)}>{title}</h3>
+      <p
+        className={classnames(classes.subtitle)}
+        dangerouslySetInnerHTML={{ __html: subtitle }} // eslint-disable-line
+      />
       {stepChildren &&
         stepChildren.map(
           ({
@@ -27,6 +34,8 @@ export default ({
             validate,
             dependsOn,
             renderComponent: Comp,
+            format,
+            parse,
             ...rest
           }) => {
             if (
@@ -37,20 +46,28 @@ export default ({
             }
             return (
               <ValidatedField
-                component={input => <Comp {...rest} {...input} />}
+                component={input => (
+                  <Comp {...rest} {...input} {...dispatchFns} />
+                )}
+                format={format}
                 key={fieldId}
                 name={fieldId}
+                parse={parse}
                 validate={validate}
               />
             )
           },
         )}
       <div className={classnames(classes.buttons)}>
-        <Button onClick={isFirst ? goBack : prevStep}>
-          {isFirst ? 'Cancel' : 'Back'}
+        <Button onClick={isFirst ? () => history.push('/') : prevStep}>
+          {isFirst
+            ? `${wizard.cancelText || 'Cancel'}`
+            : `${wizard.backText || 'Back'}`}
         </Button>
         <Button primary type="submit">
-          {isFinal ? 'Finish' : 'Next'}
+          {isFinal
+            ? `${wizard.submitText || 'Submit Manuscript'}`
+            : `${wizard.nextText || 'Next'}`}
         </Button>
       </div>
     </form>
diff --git a/packages/component-wizard/src/components/WizardStep.local.scss b/packages/component-wizard/src/components/WizardStep.local.scss
index 1b69b7a3a10de57d2fc98531d1d5c2454ce9ac39..48627e47b6862fd47c8ce036a35e72fd342d1ab2 100644
--- a/packages/component-wizard/src/components/WizardStep.local.scss
+++ b/packages/component-wizard/src/components/WizardStep.local.scss
@@ -10,6 +10,11 @@
   .title {
     align-self: center;
   }
+
+  .subtitle {
+    align-self: center;
+    margin-bottom: 25px;
+  }
 }
 
 .form {
diff --git a/packages/component-wizard/src/components/countries.js b/packages/component-wizard/src/components/countries.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e30f2654c1ff9664915051f40b60aebd421e702
--- /dev/null
+++ b/packages/component-wizard/src/components/countries.js
@@ -0,0 +1,998 @@
+export default [
+  {
+    value: 'AF',
+    label: 'Afghanistan',
+  },
+  {
+    value: 'AX',
+    label: 'Ã…land Islands',
+  },
+  {
+    value: 'AL',
+    label: 'Albania',
+  },
+  {
+    value: 'DZ',
+    label: 'Algeria',
+  },
+  {
+    value: 'AS',
+    label: 'American Samoa',
+  },
+  {
+    value: 'AD',
+    label: 'Andorra',
+  },
+  {
+    value: 'AO',
+    label: 'Angola',
+  },
+  {
+    value: 'AI',
+    label: 'Anguilla',
+  },
+  {
+    value: 'AQ',
+    label: 'Antarctica',
+  },
+  {
+    value: 'AG',
+    label: 'Antigua and Barbuda',
+  },
+  {
+    value: 'AR',
+    label: 'Argentina',
+  },
+  {
+    value: 'AM',
+    label: 'Armenia',
+  },
+  {
+    value: 'AW',
+    label: 'Aruba',
+  },
+  {
+    value: 'AU',
+    label: 'Australia',
+  },
+  {
+    value: 'AT',
+    label: 'Austria',
+  },
+  {
+    value: 'AZ',
+    label: 'Azerbaijan',
+  },
+  {
+    value: 'BS',
+    label: 'Bahamas',
+  },
+  {
+    value: 'BH',
+    label: 'Bahrain',
+  },
+  {
+    value: 'BD',
+    label: 'Bangladesh',
+  },
+  {
+    value: 'BB',
+    label: 'Barbados',
+  },
+  {
+    value: 'BY',
+    label: 'Belarus',
+  },
+  {
+    value: 'BE',
+    label: 'Belgium',
+  },
+  {
+    value: 'BZ',
+    label: 'Belize',
+  },
+  {
+    value: 'BJ',
+    label: 'Benin',
+  },
+  {
+    value: 'BM',
+    label: 'Bermuda',
+  },
+  {
+    value: 'BT',
+    label: 'Bhutan',
+  },
+  {
+    value: 'BO',
+    label: 'Bolivia, Plurinational State of',
+  },
+  {
+    value: 'BQ',
+    label: 'Bonaire, Sint Eustatius and Saba',
+  },
+  {
+    value: 'BA',
+    label: 'Bosnia and Herzegovina',
+  },
+  {
+    value: 'BW',
+    label: 'Botswana',
+  },
+  {
+    value: 'BV',
+    label: 'Bouvet Island',
+  },
+  {
+    value: 'BR',
+    label: 'Brazil',
+  },
+  {
+    value: 'IO',
+    label: 'British Indian Ocean Territory',
+  },
+  {
+    value: 'BN',
+    label: 'Brunei Darussalam',
+  },
+  {
+    value: 'BG',
+    label: 'Bulgaria',
+  },
+  {
+    value: 'BF',
+    label: 'Burkina Faso',
+  },
+  {
+    value: 'BI',
+    label: 'Burundi',
+  },
+  {
+    value: 'KH',
+    label: 'Cambodia',
+  },
+  {
+    value: 'CM',
+    label: 'Cameroon',
+  },
+  {
+    value: 'CA',
+    label: 'Canada',
+  },
+  {
+    value: 'CV',
+    label: 'Cape Verde',
+  },
+  {
+    value: 'KY',
+    label: 'Cayman Islands',
+  },
+  {
+    value: 'CF',
+    label: 'Central African Republic',
+  },
+  {
+    value: 'TD',
+    label: 'Chad',
+  },
+  {
+    value: 'CL',
+    label: 'Chile',
+  },
+  {
+    value: 'CN',
+    label: 'China',
+  },
+  {
+    value: 'CX',
+    label: 'Christmas Island',
+  },
+  {
+    value: 'CC',
+    label: 'Cocos (Keeling) Islands',
+  },
+  {
+    value: 'CO',
+    label: 'Colombia',
+  },
+  {
+    value: 'KM',
+    label: 'Comoros',
+  },
+  {
+    value: 'CG',
+    label: 'Congo',
+  },
+  {
+    value: 'CD',
+    label: 'Congo, the Democratic Republic of the',
+  },
+  {
+    value: 'CK',
+    label: 'Cook Islands',
+  },
+  {
+    value: 'CR',
+    label: 'Costa Rica',
+  },
+  {
+    value: 'CI',
+    label: "Côte d'Ivoire",
+  },
+  {
+    value: 'HR',
+    label: 'Croatia',
+  },
+  {
+    value: 'CU',
+    label: 'Cuba',
+  },
+  {
+    value: 'CW',
+    label: 'Curaçao',
+  },
+  {
+    value: 'CY',
+    label: 'Cyprus',
+  },
+  {
+    value: 'CZ',
+    label: 'Czech Republic',
+  },
+  {
+    value: 'DK',
+    label: 'Denmark',
+  },
+  {
+    value: 'DJ',
+    label: 'Djibouti',
+  },
+  {
+    value: 'DM',
+    label: 'Dominica',
+  },
+  {
+    value: 'DO',
+    label: 'Dominican Republic',
+  },
+  {
+    value: 'EC',
+    label: 'Ecuador',
+  },
+  {
+    value: 'EG',
+    label: 'Egypt',
+  },
+  {
+    value: 'SV',
+    label: 'El Salvador',
+  },
+  {
+    value: 'GQ',
+    label: 'Equatorial Guinea',
+  },
+  {
+    value: 'ER',
+    label: 'Eritrea',
+  },
+  {
+    value: 'EE',
+    label: 'Estonia',
+  },
+  {
+    value: 'ET',
+    label: 'Ethiopia',
+  },
+  {
+    value: 'FK',
+    label: 'Falkland Islands (Malvinas)',
+  },
+  {
+    value: 'FO',
+    label: 'Faroe Islands',
+  },
+  {
+    value: 'FJ',
+    label: 'Fiji',
+  },
+  {
+    value: 'FI',
+    label: 'Finland',
+  },
+  {
+    value: 'FR',
+    label: 'France',
+  },
+  {
+    value: 'GF',
+    label: 'French Guiana',
+  },
+  {
+    value: 'PF',
+    label: 'French Polynesia',
+  },
+  {
+    value: 'TF',
+    label: 'French Southern Territories',
+  },
+  {
+    value: 'GA',
+    label: 'Gabon',
+  },
+  {
+    value: 'GM',
+    label: 'Gambia',
+  },
+  {
+    value: 'GE',
+    label: 'Georgia',
+  },
+  {
+    value: 'DE',
+    label: 'Germany',
+  },
+  {
+    value: 'GH',
+    label: 'Ghana',
+  },
+  {
+    value: 'GI',
+    label: 'Gibraltar',
+  },
+  {
+    value: 'GR',
+    label: 'Greece',
+  },
+  {
+    value: 'GL',
+    label: 'Greenland',
+  },
+  {
+    value: 'GD',
+    label: 'Grenada',
+  },
+  {
+    value: 'GP',
+    label: 'Guadeloupe',
+  },
+  {
+    value: 'GU',
+    label: 'Guam',
+  },
+  {
+    value: 'GT',
+    label: 'Guatemala',
+  },
+  {
+    value: 'GG',
+    label: 'Guernsey',
+  },
+  {
+    value: 'GN',
+    label: 'Guinea',
+  },
+  {
+    value: 'GW',
+    label: 'Guinea-Bissau',
+  },
+  {
+    value: 'GY',
+    label: 'Guyana',
+  },
+  {
+    value: 'HT',
+    label: 'Haiti',
+  },
+  {
+    value: 'HM',
+    label: 'Heard Island and McDonald Islands',
+  },
+  {
+    value: 'VA',
+    label: 'Holy See (Vatican City State)',
+  },
+  {
+    value: 'HN',
+    label: 'Honduras',
+  },
+  {
+    value: 'HK',
+    label: 'Hong Kong',
+  },
+  {
+    value: 'HU',
+    label: 'Hungary',
+  },
+  {
+    value: 'IS',
+    label: 'Iceland',
+  },
+  {
+    value: 'IN',
+    label: 'India',
+  },
+  {
+    value: 'ID',
+    label: 'Indonesia',
+  },
+  {
+    value: 'IR',
+    label: 'Iran, Islamic Republic of',
+  },
+  {
+    value: 'IQ',
+    label: 'Iraq',
+  },
+  {
+    value: 'IE',
+    label: 'Ireland',
+  },
+  {
+    value: 'IM',
+    label: 'Isle of Man',
+  },
+  {
+    value: 'IL',
+    label: 'Israel',
+  },
+  {
+    value: 'IT',
+    label: 'Italy',
+  },
+  {
+    value: 'JM',
+    label: 'Jamaica',
+  },
+  {
+    value: 'JP',
+    label: 'Japan',
+  },
+  {
+    value: 'JE',
+    label: 'Jersey',
+  },
+  {
+    value: 'JO',
+    label: 'Jordan',
+  },
+  {
+    value: 'KZ',
+    label: 'Kazakhstan',
+  },
+  {
+    value: 'KE',
+    label: 'Kenya',
+  },
+  {
+    value: 'KI',
+    label: 'Kiribati',
+  },
+  {
+    value: 'KP',
+    label: "Korea, Democratic People's Republic of",
+  },
+  {
+    value: 'KR',
+    label: 'Korea, Republic of',
+  },
+  {
+    value: 'KW',
+    label: 'Kuwait',
+  },
+  {
+    value: 'KG',
+    label: 'Kyrgyzstan',
+  },
+  {
+    value: 'LA',
+    label: "Lao People's Democratic Republic",
+  },
+  {
+    value: 'LV',
+    label: 'Latvia',
+  },
+  {
+    value: 'LB',
+    label: 'Lebanon',
+  },
+  {
+    value: 'LS',
+    label: 'Lesotho',
+  },
+  {
+    value: 'LR',
+    label: 'Liberia',
+  },
+  {
+    value: 'LY',
+    label: 'Libya',
+  },
+  {
+    value: 'LI',
+    label: 'Liechtenstein',
+  },
+  {
+    value: 'LT',
+    label: 'Lithuania',
+  },
+  {
+    value: 'LU',
+    label: 'Luxembourg',
+  },
+  {
+    value: 'MO',
+    label: 'Macao',
+  },
+  {
+    value: 'MK',
+    label: 'Macedonia, the Former Yugoslav Republic of',
+  },
+  {
+    value: 'MG',
+    label: 'Madagascar',
+  },
+  {
+    value: 'MW',
+    label: 'Malawi',
+  },
+  {
+    value: 'MY',
+    label: 'Malaysia',
+  },
+  {
+    value: 'MV',
+    label: 'Maldives',
+  },
+  {
+    value: 'ML',
+    label: 'Mali',
+  },
+  {
+    value: 'MT',
+    label: 'Malta',
+  },
+  {
+    value: 'MH',
+    label: 'Marshall Islands',
+  },
+  {
+    value: 'MQ',
+    label: 'Martinique',
+  },
+  {
+    value: 'MR',
+    label: 'Mauritania',
+  },
+  {
+    value: 'MU',
+    label: 'Mauritius',
+  },
+  {
+    value: 'YT',
+    label: 'Mayotte',
+  },
+  {
+    value: 'MX',
+    label: 'Mexico',
+  },
+  {
+    value: 'FM',
+    label: 'Micronesia, Federated States of',
+  },
+  {
+    value: 'MD',
+    label: 'Moldova, Republic of',
+  },
+  {
+    value: 'MC',
+    label: 'Monaco',
+  },
+  {
+    value: 'MN',
+    label: 'Mongolia',
+  },
+  {
+    value: 'ME',
+    label: 'Montenegro',
+  },
+  {
+    value: 'MS',
+    label: 'Montserrat',
+  },
+  {
+    value: 'MA',
+    label: 'Morocco',
+  },
+  {
+    value: 'MZ',
+    label: 'Mozambique',
+  },
+  {
+    value: 'MM',
+    label: 'Myanmar',
+  },
+  {
+    value: 'NA',
+    label: 'Namibia',
+  },
+  {
+    value: 'NR',
+    label: 'Nauru',
+  },
+  {
+    value: 'NP',
+    label: 'Nepal',
+  },
+  {
+    value: 'NL',
+    label: 'Netherlands',
+  },
+  {
+    value: 'NC',
+    label: 'New Caledonia',
+  },
+  {
+    value: 'NZ',
+    label: 'New Zealand',
+  },
+  {
+    value: 'NI',
+    label: 'Nicaragua',
+  },
+  {
+    value: 'NE',
+    label: 'Niger',
+  },
+  {
+    value: 'NG',
+    label: 'Nigeria',
+  },
+  {
+    value: 'NU',
+    label: 'Niue',
+  },
+  {
+    value: 'NF',
+    label: 'Norfolk Island',
+  },
+  {
+    value: 'MP',
+    label: 'Northern Mariana Islands',
+  },
+  {
+    value: 'NO',
+    label: 'Norway',
+  },
+  {
+    value: 'OM',
+    label: 'Oman',
+  },
+  {
+    value: 'PK',
+    label: 'Pakistan',
+  },
+  {
+    value: 'PW',
+    label: 'Palau',
+  },
+  {
+    value: 'PS',
+    label: 'Palestine, State of',
+  },
+  {
+    value: 'PA',
+    label: 'Panama',
+  },
+  {
+    value: 'PG',
+    label: 'Papua New Guinea',
+  },
+  {
+    value: 'PY',
+    label: 'Paraguay',
+  },
+  {
+    value: 'PE',
+    label: 'Peru',
+  },
+  {
+    value: 'PH',
+    label: 'Philippines',
+  },
+  {
+    value: 'PN',
+    label: 'Pitcairn',
+  },
+  {
+    value: 'PL',
+    label: 'Poland',
+  },
+  {
+    value: 'PT',
+    label: 'Portugal',
+  },
+  {
+    value: 'PR',
+    label: 'Puerto Rico',
+  },
+  {
+    value: 'QA',
+    label: 'Qatar',
+  },
+  {
+    value: 'RE',
+    label: 'Réunion',
+  },
+  {
+    value: 'RO',
+    label: 'Romania',
+  },
+  {
+    value: 'RU',
+    label: 'Russian Federation',
+  },
+  {
+    value: 'RW',
+    label: 'Rwanda',
+  },
+  {
+    value: 'BL',
+    label: 'Saint Barthélemy',
+  },
+  {
+    value: 'SH',
+    label: 'Saint Helena, Ascension and Tristan da Cunha',
+  },
+  {
+    value: 'KN',
+    label: 'Saint Kitts and Nevis',
+  },
+  {
+    value: 'LC',
+    label: 'Saint Lucia',
+  },
+  {
+    value: 'MF',
+    label: 'Saint Martin (French part)',
+  },
+  {
+    value: 'PM',
+    label: 'Saint Pierre and Miquelon',
+  },
+  {
+    value: 'VC',
+    label: 'Saint Vincent and the Grenadines',
+  },
+  {
+    value: 'WS',
+    label: 'Samoa',
+  },
+  {
+    value: 'SM',
+    label: 'San Marino',
+  },
+  {
+    value: 'ST',
+    label: 'Sao Tome and Principe',
+  },
+  {
+    value: 'SA',
+    label: 'Saudi Arabia',
+  },
+  {
+    value: 'SN',
+    label: 'Senegal',
+  },
+  {
+    value: 'RS',
+    label: 'Serbia',
+  },
+  {
+    value: 'SC',
+    label: 'Seychelles',
+  },
+  {
+    value: 'SL',
+    label: 'Sierra Leone',
+  },
+  {
+    value: 'SG',
+    label: 'Singapore',
+  },
+  {
+    value: 'SX',
+    label: 'Sint Maarten (Dutch part)',
+  },
+  {
+    value: 'SK',
+    label: 'Slovakia',
+  },
+  {
+    value: 'SI',
+    label: 'Slovenia',
+  },
+  {
+    value: 'SB',
+    label: 'Solomon Islands',
+  },
+  {
+    value: 'SO',
+    label: 'Somalia',
+  },
+  {
+    value: 'ZA',
+    label: 'South Africa',
+  },
+  {
+    value: 'GS',
+    label: 'South Georgia and the South Sandwich Islands',
+  },
+  {
+    value: 'SS',
+    label: 'South Sudan',
+  },
+  {
+    value: 'ES',
+    label: 'Spain',
+  },
+  {
+    value: 'LK',
+    label: 'Sri Lanka',
+  },
+  {
+    value: 'SD',
+    label: 'Sudan',
+  },
+  {
+    value: 'SR',
+    label: 'Surilabel',
+  },
+  {
+    value: 'SJ',
+    label: 'Svalbard and Jan Mayen',
+  },
+  {
+    value: 'SZ',
+    label: 'Swaziland',
+  },
+  {
+    value: 'SE',
+    label: 'Sweden',
+  },
+  {
+    value: 'CH',
+    label: 'Switzerland',
+  },
+  {
+    value: 'SY',
+    label: 'Syrian Arab Republic',
+  },
+  {
+    value: 'TW',
+    label: 'Taiwan, Province of China',
+  },
+  {
+    value: 'TJ',
+    label: 'Tajikistan',
+  },
+  {
+    value: 'TZ',
+    label: 'Tanzania, United Republic of',
+  },
+  {
+    value: 'TH',
+    label: 'Thailand',
+  },
+  {
+    value: 'TL',
+    label: 'Timor-Leste',
+  },
+  {
+    value: 'TG',
+    label: 'Togo',
+  },
+  {
+    value: 'TK',
+    label: 'Tokelau',
+  },
+  {
+    value: 'TO',
+    label: 'Tonga',
+  },
+  {
+    value: 'TT',
+    label: 'Trinidad and Tobago',
+  },
+  {
+    value: 'TN',
+    label: 'Tunisia',
+  },
+  {
+    value: 'TR',
+    label: 'Turkey',
+  },
+  {
+    value: 'TM',
+    label: 'Turkmenistan',
+  },
+  {
+    value: 'TC',
+    label: 'Turks and Caicos Islands',
+  },
+  {
+    value: 'TV',
+    label: 'Tuvalu',
+  },
+  {
+    value: 'UG',
+    label: 'Uganda',
+  },
+  {
+    value: 'UA',
+    label: 'Ukraine',
+  },
+  {
+    value: 'AE',
+    label: 'United Arab Emirates',
+  },
+  {
+    value: 'UK',
+    label: 'United Kingdom',
+  },
+  {
+    value: 'US',
+    label: 'United States',
+  },
+  {
+    value: 'UM',
+    label: 'United States Minor Outlying Islands',
+  },
+  {
+    value: 'UY',
+    label: 'Uruguay',
+  },
+  {
+    value: 'UZ',
+    label: 'Uzbekistan',
+  },
+  {
+    value: 'VU',
+    label: 'Vanuatu',
+  },
+  {
+    value: 'VE',
+    label: 'Venezuela, Bolivarian Republic of',
+  },
+  {
+    value: 'VN',
+    label: 'Viet Nam',
+  },
+  {
+    value: 'VG',
+    label: 'Virgin Islands, British',
+  },
+  {
+    value: 'VI',
+    label: 'Virgin Islands, U.S.',
+  },
+  {
+    value: 'WF',
+    label: 'Wallis and Futuna',
+  },
+  {
+    value: 'EH',
+    label: 'Western Sahara',
+  },
+  {
+    value: 'YE',
+    label: 'Yemen',
+  },
+  {
+    value: 'ZM',
+    label: 'Zambia',
+  },
+  {
+    value: 'ZW',
+    label: 'Zimbabwe',
+  },
+]
diff --git a/packages/component-wizard/src/index.js b/packages/component-wizard/src/index.js
index 0b08c7c2e246189b19c843458de6e02803ab7f56..abfc03ce45939f61cd39ff3ba9ec9ca37011bb01 100644
--- a/packages/component-wizard/src/index.js
+++ b/packages/component-wizard/src/index.js
@@ -3,6 +3,7 @@ module.exports = {
     components: [() => require('./components')],
     reducers: {
       conversion: () => require('./redux/conversion').default,
+      authors: () => require('./redux/authors').default,
     },
   },
 }
diff --git a/packages/component-wizard/src/redux/authors.js b/packages/component-wizard/src/redux/authors.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a7fb7c28d265541ce0c92cb75898eb35d52be8e
--- /dev/null
+++ b/packages/component-wizard/src/redux/authors.js
@@ -0,0 +1,37 @@
+import { get } from 'lodash'
+import { actions } from 'pubsweet-client'
+import * as api from 'pubsweet-client/src/helpers/api'
+
+// constants
+export const SET_AUTHORS = 'authors/SET_AUTHORS'
+
+// actions
+export const setAuthors = (authors, fragmentId) => ({
+  type: SET_AUTHORS,
+  authors,
+  fragmentId,
+})
+
+export const addAuthor = (author, collectionId, fragmentId) => dispatch =>
+  api
+    .create(`/fragments/${fragmentId}/authors`, author)
+    .then(() =>
+      dispatch(actions.getFragment({ id: collectionId }, { id: fragmentId })),
+    )
+    .then(({ fragment: { authors, id } }) => dispatch(setAuthors(authors, id)))
+
+// selectors
+export const getFragmentAuthors = (state, fragmentId) =>
+  get(state, `authors.${fragmentId}`) || []
+
+export default (state = {}, action) => {
+  switch (action.type) {
+    case SET_AUTHORS:
+      return {
+        ...state,
+        [action.fragmentId]: action.authors,
+      }
+    default:
+      return state
+  }
+}
diff --git a/packages/component-wizard/src/redux/index.js b/packages/component-wizard/src/redux/index.js
index 56f29b6f4e05afb38afa4fe6b06b760a401c5360..a0eee2ecd4a1e5776eea3e56ecc701cffe60897f 100644
--- a/packages/component-wizard/src/redux/index.js
+++ b/packages/component-wizard/src/redux/index.js
@@ -1 +1,2 @@
 export { default as conversion } from './conversion'
+export { default as authors } from './authors'
diff --git a/packages/xpub-faraday/app/app.js b/packages/xpub-faraday/app/app.js
index 6ca64de09e621859c51fcd7b0a9440c18ca96608..fb7eae11ea0bf59533f689f99ac71e48b38a0ed4 100644
--- a/packages/xpub-faraday/app/app.js
+++ b/packages/xpub-faraday/app/app.js
@@ -11,7 +11,7 @@ import * as journal from './config/journal'
 import Routes from './routes'
 
 const history = createHistory()
-export const store = configureStore(history, {})
+const store = configureStore(history, {})
 const theme = {}
 
 const render = () => {
diff --git a/packages/xpub-faraday/app/config/journal/article-sections-tbrm.js b/packages/xpub-faraday/app/config/journal/article-sections-tbrm.js
new file mode 100644
index 0000000000000000000000000000000000000000..ab5c5e94d62fc58cf8bb7b12a7ac462f1ddba050
--- /dev/null
+++ b/packages/xpub-faraday/app/config/journal/article-sections-tbrm.js
@@ -0,0 +1,30 @@
+export default [
+  {
+    label: 'Cognitive Psychology',
+    value: 'cognitive-psychology',
+  },
+  {
+    label: 'Social Psychology',
+    value: 'social-psychology',
+  },
+  {
+    label: 'Personality Psychology',
+    value: 'personality-psychology',
+  },
+  {
+    label: 'Developmental Psychology',
+    value: 'developmental-psychology',
+  },
+  {
+    label: 'Clinical Psychology',
+    value: 'clinical-psychology',
+  },
+  {
+    label: 'Organizational Behavior',
+    value: 'organizational-behavior',
+  },
+  {
+    label: 'Methodology and Research Practice',
+    value: 'methodology',
+  },
+]
diff --git a/packages/xpub-faraday/app/config/journal/article-types-tbrm.js b/packages/xpub-faraday/app/config/journal/article-types-tbrm.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5d08e5f9823fcce6aa1ff85435a1b798ac5629a
--- /dev/null
+++ b/packages/xpub-faraday/app/config/journal/article-types-tbrm.js
@@ -0,0 +1,18 @@
+export default [
+  {
+    label: 'Original Research Report',
+    value: 'original-research',
+  },
+  {
+    label: 'Review',
+    value: 'review',
+  },
+  {
+    label: 'Opinion/Commentary',
+    value: 'opinion',
+  },
+  {
+    label: 'Registered Report',
+    value: 'registered-report',
+  },
+]
diff --git a/packages/xpub-faraday/app/config/journal/index.js b/packages/xpub-faraday/app/config/journal/index.js
index fccf0c181b0ce99568dfa87bc07510ba18cbdd30..874f461288cd76f59551a4018215c1ff5408c99e 100644
--- a/packages/xpub-faraday/app/config/journal/index.js
+++ b/packages/xpub-faraday/app/config/journal/index.js
@@ -7,4 +7,6 @@ export { default as editors } from './editors'
 export { default as roles } from './roles'
 export { default as wizard } from './submit-wizard'
 export { default as issueTypes } from './issues-types'
+export { default as articleTypes } from './article-types-tbrm'
+export { default as articleSections } from './article-sections-tbrm'
 export { default as manuscriptTypes } from './manuscript-types'
diff --git a/packages/xpub-faraday/app/config/journal/submit-wizard.js b/packages/xpub-faraday/app/config/journal/submit-wizard.js
index 73318a55ec5ed0f135e8c0b247f321f96622d35a..6de83e0e56f36c8eb57dc1f728a7c1729619c247 100644
--- a/packages/xpub-faraday/app/config/journal/submit-wizard.js
+++ b/packages/xpub-faraday/app/config/journal/submit-wizard.js
@@ -7,7 +7,7 @@ import {
   TextField,
   Supplementary,
 } from '@pubsweet/ui'
-import uploadFile from 'xpub-upload'
+import uploadFileFn from 'xpub-upload'
 import { required, minChars, minSize } from 'xpub-validators'
 import { AuthorList } from 'pubsweet-component-wizard/src/components'
 
@@ -34,9 +34,12 @@ const journal = {
   value: 'hindawi-faraday',
 }
 
+const uploadFile = input => uploadFileFn(input)
+
 export default {
   showProgress: true,
   formSectionKeys: ['metadata', 'declarations', 'conflicts', 'notes', 'files'],
+  dispatchFunctions: [uploadFile],
   steps: [
     {
       label: 'Journal details',
@@ -107,6 +110,7 @@ export default {
           fieldId: 'conflicts.hasConflicts',
           renderComponent: yesNoWithLabel,
           label: 'Is there a potential conflict of interest?',
+          validate: [required],
         },
         {
           dependsOn: {
@@ -125,22 +129,19 @@ export default {
       title: 'Manuscript Files Upload',
       children: [
         {
-          fieldId: 'mainManuscripts',
+          fieldId: 'files.manuscripts',
           label: 'Main Manuscript',
           renderComponent: Supplementary,
-          uploadFile,
         },
         {
-          fieldId: 'supplementalFiles',
+          fieldId: 'files.supplementary',
           label: 'Supplemental Files',
           renderComponent: Supplementary,
-          uploadFile,
         },
         {
-          fieldId: 'coverLetter',
+          fieldId: 'files.coverLetter',
           label: 'Cover Letter',
           renderComponent: Supplementary,
-          uploadFile,
         },
       ],
     },
diff --git a/packages/xpub-faraday/app/config/journal/wizard-validators.js b/packages/xpub-faraday/app/config/journal/wizard-validators.js
index 9a9b0a9d4b086dda7d1efa2309355d0a1c14ceef..4f11c7640ccd08799e6a1b10aef91901552ad6f4 100644
--- a/packages/xpub-faraday/app/config/journal/wizard-validators.js
+++ b/packages/xpub-faraday/app/config/journal/wizard-validators.js
@@ -1,4 +1,4 @@
-import { get } from 'lodash'
+import { get, isEmpty } from 'lodash'
 
 import manuscriptTypes from './manuscript-types'
 
@@ -7,7 +7,10 @@ const requiredTypes = manuscriptTypes
   .map(t => t.value)
 
 export const requiredBasedOnType = (value, formValues) => {
-  if (requiredTypes.includes(get(formValues, 'metadata.type'))) {
+  if (
+    requiredTypes.includes(get(formValues, 'metadata.type')) &&
+    isEmpty(get(formValues, 'metadata.abstract'))
+  ) {
     return 'Required'
   }
   return undefined
diff --git a/packages/xpub-faraday/app/routes.js b/packages/xpub-faraday/app/routes.js
index 4a15dc071cb4d5c16b955d73a5bdb609f88ca814..525a7266e9c5701231d10709272c330c07ef3fed 100644
--- a/packages/xpub-faraday/app/routes.js
+++ b/packages/xpub-faraday/app/routes.js
@@ -7,6 +7,7 @@ import App from 'pubsweet-component-xpub-app/src/components'
 
 import {
   PrivateRoute,
+  SignupPage,
   LoginPage,
   LogoutPage,
 } from 'pubsweet-component-xpub-authentication/src/components'
@@ -20,6 +21,7 @@ import { WizardPage } from 'pubsweet-component-wizard/src/components'
 const Routes = () => (
   <App>
     <Route component={LoginPage} exact path="/login" />
+    <Route component={SignupPage} exact path="/signup" />
     <PrivateRoute component={DashboardPage} exact path="/" />
     <PrivateRoute component={LogoutPage} exact path="/logout" />
     <PrivateRoute
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index f9d3945aafba228c1ca996a5370ba4119198754f..8e82f6e4606256b1c0f2e0d3f60a28879f972057 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -29,12 +29,15 @@ module.exports = {
         message: Joi.string(),
       }),
       files: Joi.object({
-        manuscript: Joi.object({
-          name: Joi.string().required(),
-          type: Joi.string(),
-          size: Joi.number(),
-          url: Joi.string(),
-        }),
+        manuscript: Joi.any(),
+        manuscripts: Joi.array().items(
+          Joi.object({
+            name: Joi.string().required(),
+            type: Joi.string(),
+            size: Joi.number(),
+            url: Joi.string(),
+          }),
+        ),
         supplementary: Joi.array().items(
           Joi.object({
             name: Joi.string().required(),
@@ -43,6 +46,14 @@ module.exports = {
             url: Joi.string(),
           }),
         ),
+        coverLetter: Joi.array().items(
+          Joi.object({
+            name: Joi.string().required(),
+            type: Joi.string(),
+            size: Joi.number(),
+            url: Joi.string(),
+          }),
+        ),
       }),
       notes: Joi.object({
         fundingAcknowledgement: Joi.string(),