diff --git a/packages/component-email/package.json b/packages/component-email/package.json
index 3c2a4d4c7fa08d89c8690ae8f177f0b6135d7e71..58771b11aa78632c3669e80538150773704447f5 100644
--- a/packages/component-email/package.json
+++ b/packages/component-email/package.json
@@ -25,7 +25,7 @@
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
     "@pubsweet/component-send-email": "0.2.4",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^10.0.0"
   },
   "devDependencies": {
     "apidoc": "^0.17.6",
diff --git a/packages/component-faraday-ui/package.json b/packages/component-faraday-ui/package.json
index 020fd030a03d74398e998b9ed5488b05175e6d9a..9717e6c8fb31216981a2a7b1df6d3f1025d34c8a 100644
--- a/packages/component-faraday-ui/package.json
+++ b/packages/component-faraday-ui/package.json
@@ -4,13 +4,13 @@
   "main": "src",
   "license": "MIT",
   "dependencies": {
-    "@pubsweet/ui": "^8.6.0",
-    "@pubsweet/ui-toolkit": "^1.2.0",
+    "@pubsweet/ui": "^9.0.2",
+    "@pubsweet/ui-toolkit": "^2.0.0",
     "country-list": "^1.1.0",
-    "grid-styled": "5.0.2",
+    "formik": "^1.3.2",
     "prop-types": "^15.6.2",
     "querystring": "^0.2.0",
-    "react": "^16.4.2",
-    "styled-components": "^3.4.2"
+    "react": "^16.6.0",
+    "styled-components": "^4.1.0"
   }
 }
diff --git a/packages/component-faraday-ui/src/AppBarMenu.js b/packages/component-faraday-ui/src/AppBarMenu.js
index a4dd501c94d504b33d7273fa54f6d17df17d9d25..e934d21a9157c99452a37e98a0b1f587d10f0690 100644
--- a/packages/component-faraday-ui/src/AppBarMenu.js
+++ b/packages/component-faraday-ui/src/AppBarMenu.js
@@ -85,9 +85,9 @@ const User = styled.div`
   display: flex;
   cursor: pointer;
 `
-const Dropdown = styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'admin-dropdown',
-})`
+const Dropdown = styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'admin-dropdown',
+}))`
   background-color: ${th('appBar.colorBackground')};
   border-radius: ${th('borderRadius')};
   box-shadow: ${th('boxShadow')};
@@ -98,9 +98,9 @@ const Dropdown = styled.div.attrs({
   z-index: 10;
 `
 
-const DropdownOption = styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'dropdown-option',
-})`
+const DropdownOption = styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'dropdown-option',
+}))`
   align-items: center;
   color: ${th('colorText')};
   cursor: pointer;
diff --git a/packages/component-faraday-ui/src/ContextualBox.js b/packages/component-faraday-ui/src/ContextualBox.js
index 32ff2966e40f3884d0069955ea65d619a1e8c689..cbf2761870c26c3740af9e34f12ec5281787566d 100644
--- a/packages/component-faraday-ui/src/ContextualBox.js
+++ b/packages/component-faraday-ui/src/ContextualBox.js
@@ -57,9 +57,9 @@ const ContextualBox = ({ label, children, rightChildren, ...props }) =>
 export default ContextualBox
 
 // #region styles
-const Header = styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'accordion-header',
-})`
+const Header = styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'accordion-header',
+}))`
   align-items: center;
   cursor: pointer;
   display: flex;
diff --git a/packages/component-faraday-ui/src/FileSection.js b/packages/component-faraday-ui/src/FileSection.js
index 596f65e8436d8362ab1fdf506c1f5b1dd822071c..af022f6e5f62708b45a5460b8ce5bc456016553f 100644
--- a/packages/component-faraday-ui/src/FileSection.js
+++ b/packages/component-faraday-ui/src/FileSection.js
@@ -50,13 +50,13 @@ const FileSection = ({
   onDelete,
 }) => (
   <Root
-    innerRef={instance => {
-      connectFileDrop(instance)
-      connectDropTarget(instance)
-    }}
     isFileItemOver={isFileItemOver && canDropFileItem}
     isFirst={isFirst}
     isLast={isLast}
+    ref={instance => {
+      connectFileDrop(instance)
+      connectDropTarget(instance)
+    }}
   >
     <Row alignItems="center">
       <Item>
diff --git a/packages/component-faraday-ui/src/gridItems/Item.js b/packages/component-faraday-ui/src/gridItems/Item.js
index 32b29bc614cf063b2639125127f07bf76d54c549..060846c5310beecc5fb598646589fcfeff966b47 100644
--- a/packages/component-faraday-ui/src/gridItems/Item.js
+++ b/packages/component-faraday-ui/src/gridItems/Item.js
@@ -4,9 +4,9 @@ import styled from 'styled-components'
 import { marginHelper, paddingHelper } from 'pubsweet-component-faraday-ui'
 
 /** @component */
-export default styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'item',
-})`
+export default styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'item',
+}))`
   align-items: ${({ alignItems }) => alignItems || 'initial'};
   display: flex;
   flex: ${({ flex }) => (isNumber(flex) ? flex : 1)};
diff --git a/packages/component-faraday-ui/src/gridItems/Row.js b/packages/component-faraday-ui/src/gridItems/Row.js
index 794ed2b3f00faf6c82f720745b3826eed63bc3f2..facd07a3a394b4a7fe79be1a3c88bb1b2dec9fe0 100644
--- a/packages/component-faraday-ui/src/gridItems/Row.js
+++ b/packages/component-faraday-ui/src/gridItems/Row.js
@@ -4,9 +4,9 @@ import styled from 'styled-components'
 import { heightHelper, marginHelper, paddingHelper } from '../styledHelpers'
 
 /** @component */
-export default styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'row',
-})`
+export default styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'row',
+}))`
   align-items: ${props => get(props, 'alignItems', 'flex-start')};
   background-color: ${props => props.bgColor || 'transparent'};
   display: flex;
diff --git a/packages/component-faraday-ui/src/helpers/withRoles.js b/packages/component-faraday-ui/src/helpers/withRoles.js
index aa0e7a719cec95aa6f604cce4866dd5654975f59..e6f1b0387951c812176dd4ae55d99520d8f57995 100644
--- a/packages/component-faraday-ui/src/helpers/withRoles.js
+++ b/packages/component-faraday-ui/src/helpers/withRoles.js
@@ -1,15 +1,20 @@
 import { get } from 'lodash'
-import { withProps } from 'recompose'
+import { withJournal } from 'xpub-journal'
+import { compose, withProps } from 'recompose'
 
-export default withProps(({ journal }) => ({
-  roles: Object.entries(get(journal, 'roles', {})).reduce(
-    (acc, el) => [
-      ...acc,
-      {
-        value: el[0],
-        label: el[1],
-      },
-    ],
-    [],
-  ),
-}))
+export default compose(
+  withJournal,
+  withProps(({ journal }) => ({
+    titles: get(journal, 'title', []),
+    roles: Object.entries(get(journal, 'roles', {})).reduce(
+      (acc, el) => [
+        ...acc,
+        {
+          value: el[0],
+          label: el[1],
+        },
+      ],
+      [],
+    ),
+  })),
+)
diff --git a/packages/component-faraday-ui/src/modals/FormModal.js b/packages/component-faraday-ui/src/modals/FormModal.js
index e798227aac61a7a99b16813a0f56deec6fc3b117..a139df8e733baa7732263b383c066ba776220ed0 100644
--- a/packages/component-faraday-ui/src/modals/FormModal.js
+++ b/packages/component-faraday-ui/src/modals/FormModal.js
@@ -1,182 +1,24 @@
 import React, { Fragment } from 'react'
 import { get } from 'lodash'
+import { Formik } from 'formik'
 import styled from 'styled-components'
-import { reduxForm } from 'redux-form'
 import { th } from '@pubsweet/ui-toolkit'
 import { required } from 'xpub-validators'
+import { H2, Button, TextField, ValidatedFieldFormik } from '@pubsweet/ui'
 import { compose, setDisplayName, withHandlers, withProps } from 'recompose'
-import {
-  H2,
-  Menu,
-  Button,
-  Spinner,
-  Checkbox,
-  TextField,
-  ValidatedField,
-} from '@pubsweet/ui'
 import {
   Row,
-  Text,
   Item,
   Label,
-  MenuCountry,
   IconButton,
   RowOverrideAlert,
   ItemOverrideAlert,
+  withRoles,
+  withCountries,
 } from 'pubsweet-component-faraday-ui'
 
-const AddUserForm = ({ roles, titles }) => (
-  <Fragment>
-    <Row alignItems="baseline" mb={1} mt={1}>
-      <Item mr={1} vertical>
-        <Label required>Email</Label>
-        <ValidatedField
-          component={TextField}
-          name="email"
-          validate={[required]}
-        />
-      </Item>
-      <ItemOverrideAlert ml={1} vertical>
-        <Label required>Role</Label>
-        <ValidatedField
-          component={input => (
-            <Menu options={roles} {...input} placeholder="Please select" />
-          )}
-          name="role"
-          validate={[required]}
-        />
-      </ItemOverrideAlert>
-    </Row>
-
-    <Row mb={2}>
-      <Item mr={1} vertical>
-        <Label>First Name</Label>
-        <ValidatedField component={TextField} name="firstName" />
-      </Item>
-      <Item ml={1} vertical>
-        <Label>Last Name</Label>
-        <ValidatedField component={TextField} name="lastName" />
-      </Item>
-    </Row>
-
-    <RowOverrideAlert alignItems="center" mb={2}>
-      <ItemOverrideAlert mr={1} vertical>
-        <Label>Title</Label>
-        <ValidatedField
-          component={input => (
-            <Menu options={titles} {...input} placeholder="Please select" />
-          )}
-          name="title"
-        />
-      </ItemOverrideAlert>
-      <ItemOverrideAlert ml={1} vertical>
-        <Label>Country</Label>
-        <ValidatedField
-          component={input => (
-            <MenuCountry {...input} placeholder="Please select" />
-          )}
-          name="country"
-        />
-      </ItemOverrideAlert>
-    </RowOverrideAlert>
-
-    <Row mb={3}>
-      <Item vertical>
-        <Label>Affiliation</Label>
-        <ValidatedField component={TextField} name="affiliation" />
-      </Item>
-    </Row>
-  </Fragment>
-)
-
-const EditForm = ({ titles }) => (
-  <Fragment>
-    <Row alignItems="center" mb={2} mt={1}>
-      <Item mr={1} vertical>
-        <Label>First Name</Label>
-        <ValidatedField component={TextField} name="firstName" />
-      </Item>
-      <Item ml={1} vertical>
-        <Label>Last Name</Label>
-        <ValidatedField component={TextField} name="lastName" />
-      </Item>
-    </Row>
-
-    <RowOverrideAlert alignItems="center" mb={2}>
-      <ItemOverrideAlert mr={1} vertical>
-        <Label>Title</Label>
-        <ValidatedField
-          component={input => (
-            <Menu options={titles} {...input} placeholder="Please select" />
-          )}
-          name="title"
-        />
-      </ItemOverrideAlert>
-      <ItemOverrideAlert ml={1} vertical>
-        <Label>Country</Label>
-        <ValidatedField
-          component={input => (
-            <MenuCountry {...input} placeholder="Please select" />
-          )}
-          name="country"
-        />
-      </ItemOverrideAlert>
-    </RowOverrideAlert>
-
-    <Row mb={2}>
-      <Item vertical>
-        <Label>Affiliation</Label>
-        <ValidatedField component={TextField} name="affiliation" />
-      </Item>
-    </Row>
-    <Row>
-      <Item>
-        <Label>Roles</Label>
-      </Item>
-    </Row>
-    <RowOverrideAlert mb={3} mt={1}>
-      <Item>
-        <ValidatedField
-          component={({ value, onChange }) => (
-            <Checkbox
-              checked={value}
-              label="Editor in Chief"
-              onChange={onChange}
-              value={value}
-            />
-          )}
-          name="editorInChief"
-        />
-      </Item>
-      <Item>
-        <ValidatedField
-          component={({ value, onChange }) => (
-            <Checkbox
-              checked={value}
-              label="Admin"
-              onChange={onChange}
-              value={value}
-            />
-          )}
-          name="admin"
-        />
-      </Item>
-      <Item>
-        <ValidatedField
-          component={({ value, onChange }) => (
-            <Checkbox
-              checked={value}
-              label="Handling Editor"
-              onChange={onChange}
-              value={value}
-            />
-          )}
-          name="handlingEditor"
-        />
-      </Item>
-    </RowOverrideAlert>
-  </Fragment>
-)
+import ValidatedMenuField from './ValidatedMenuField'
+import ValidatedCheckboxField from './ValidatedCheckboxField'
 
 const FormModal = ({
   edit,
@@ -187,41 +29,95 @@ const FormModal = ({
   onClose,
   subtitle,
   onConfirm,
-  modalError,
-  isFetching,
-  handleSubmit,
+  countries,
   confirmText = 'OK',
   cancelText = 'Cancel',
+  onSubmit,
+  initialValues,
 }) => (
   <Root>
     <IconButton icon="x" onClick={onClose} right={5} secondary top={5} />
     <H2>{title}</H2>
-    {edit && <Text secondary>{user.email}</Text>}
-    {edit ? (
-      <EditForm titles={titles} />
-    ) : (
-      <AddUserForm roles={roles} titles={titles} />
-    )}
-    {modalError && (
-      <Row mb={1}>
-        <Text error>{modalError}</Text>
-      </Row>
-    )}
-    <Row>
-      {isFetching ? (
-        <Spinner size={3} />
-      ) : (
+    <Formik initialValues={initialValues} onSubmit={onSubmit}>
+      {({ handleSubmit }) => (
         <Fragment>
-          <Button onClick={onClose}>{cancelText}</Button>
-          <Button onClick={handleSubmit} primary>
-            {confirmText}
-          </Button>
+          <Row alignItems="baseline" mb={1} mt={1}>
+            <Item mr={1} vertical>
+              <Label required>Email</Label>
+              <ValidatedFieldFormik
+                component={TextField}
+                name="email"
+                validate={[required]}
+              />
+            </Item>
+            <ItemOverrideAlert ml={1} vertical>
+              <Label required>Role</Label>
+              <ValidatedMenuField name="role" options={roles} />
+            </ItemOverrideAlert>
+          </Row>
+
+          <Row mb={2}>
+            <Item mr={1} vertical>
+              <Label>First Name</Label>
+              <ValidatedFieldFormik component={TextField} name="firstName" />
+            </Item>
+            <Item ml={1} vertical>
+              <Label>Last Name</Label>
+              <ValidatedFieldFormik component={TextField} name="lastName" />
+            </Item>
+          </Row>
+
+          <RowOverrideAlert alignItems="center" mb={2}>
+            <ItemOverrideAlert mr={1} vertical>
+              <Label>Title</Label>
+              <ValidatedMenuField name="title" options={titles} />
+            </ItemOverrideAlert>
+            <ItemOverrideAlert ml={1} vertical>
+              <Label>Country</Label>
+              <ValidatedMenuField name="country" options={countries} />
+            </ItemOverrideAlert>
+          </RowOverrideAlert>
+
+          <Row mb={!edit && 3}>
+            <Item vertical>
+              <Label>Affiliation</Label>
+              <ValidatedFieldFormik component={TextField} name="affiliation" />
+            </Item>
+          </Row>
+
+          {edit && (
+            <RowOverrideAlert mb={3}>
+              <Item>
+                <ValidatedCheckboxField
+                  label="Editor in Chief"
+                  name="editorInChief"
+                />
+              </Item>
+              <Item>
+                <ValidatedCheckboxField label="Admin" name="admin" />
+              </Item>
+              <Item>
+                <ValidatedCheckboxField
+                  label="Handling Editor"
+                  name="handlingEditor"
+                />
+              </Item>
+            </RowOverrideAlert>
+          )}
+
+          <Row>
+            <Button onClick={onClose}>Cancel</Button>
+            <Button onClick={handleSubmit} primary>
+              {confirmText}
+            </Button>
+          </Row>
         </Fragment>
       )}
-    </Row>
+    </Formik>
   </Root>
 )
 
+// #region FormHelpers
 const setInitialRole = a => {
   if (get(a, 'handlingEditor')) {
     return 'handlingEditor'
@@ -232,30 +128,41 @@ const setInitialRole = a => {
   return 'author'
 }
 
+const parseValues = ({ email, role, ...rest }) => ({
+  email,
+  username: email,
+  admin: role === 'admin',
+  editorInChief: role === 'editorInChief',
+  handlingEditor: role === 'handlingEditor',
+  ...rest,
+})
+// #endregion
+
 export default compose(
+  withRoles,
+  withCountries,
+  withProps(({ user, edit }) => ({
+    initialValues: {
+      ...user,
+      role: setInitialRole(user),
+    },
+    confirmText: edit ? 'EDIT USER' : 'SAVE USER',
+    title: edit ? 'Edit User' : 'Add User',
+  })),
   withHandlers({
-    onConfirm: ({ onConfirm, ...props }) => () => {
-      if (onConfirm && typeof onConfirm === 'function') {
-        onConfirm(props)
+    onSubmit: ({ onSubmit, ...props }) => (values, formProps) => {
+      if (typeof onSubmit === 'function') {
+        onSubmit(parseValues(values), { formProps, props })
       }
     },
     onClose: ({ onCancel, ...props }) => () => {
-      if (onCancel && typeof onCancel === 'function') {
+      if (typeof onCancel === 'function') {
         onCancel(props)
       }
       props.hideModal()
     },
   }),
-  withProps(({ user, edit }) => ({
-    initialValues: {
-      ...user,
-      role: setInitialRole(user),
-    },
-    confirmText: edit ? 'EDIT USER' : 'SAVE USER',
-  })),
-  reduxForm({
-    form: 'add-edit',
-  }),
+
   setDisplayName('FormModal'),
 )(FormModal)
 
diff --git a/packages/component-faraday-ui/src/modals/MyMenu.js b/packages/component-faraday-ui/src/modals/MyMenu.js
new file mode 100644
index 0000000000000000000000000000000000000000..9fe37eb41ed0d80cc4c053850f8eecc5560a74cd
--- /dev/null
+++ b/packages/component-faraday-ui/src/modals/MyMenu.js
@@ -0,0 +1,26 @@
+import React, { Fragment } from 'react'
+import { compose, withStateHandlers } from 'recompose'
+
+const MyMenu = ({ open, toggleMenu, field, form }) => (
+  <div onClick={toggleMenu}>
+    Click to open
+    {open && (
+      <Fragment>
+        <span onClick={() => form.setFieldValue(field.name, 1)}>Option 1</span>
+        <span onClick={() => form.setFieldValue(field.name, 2)}>Option 2</span>
+        <span onClick={() => form.setFieldValue(field.name, 3)}>Option 3</span>
+      </Fragment>
+    )}
+  </div>
+)
+
+export default compose(
+  withStateHandlers(
+    { open: false },
+    {
+      toggleMenu: ({ open }) => () => ({
+        open: !open,
+      }),
+    },
+  ),
+)(MyMenu)
diff --git a/packages/component-faraday-ui/src/modals/ValidatedCheckboxField.js b/packages/component-faraday-ui/src/modals/ValidatedCheckboxField.js
new file mode 100644
index 0000000000000000000000000000000000000000..ca1f866feddb05394d2fc8feda3cf8a3314f343f
--- /dev/null
+++ b/packages/component-faraday-ui/src/modals/ValidatedCheckboxField.js
@@ -0,0 +1,19 @@
+import React from 'react'
+import { Field } from 'formik'
+import { Checkbox } from '@pubsweet/ui'
+
+const ValidatedCheckboxField = ({ name, label }) => (
+  <Field name={name}>
+    {({ field, form }) => (
+      <Checkbox
+        checked={field.value}
+        label={label}
+        onChange={() => {
+          form.setFieldValue(field.name, !field.value)
+        }}
+      />
+    )}
+  </Field>
+)
+
+export default ValidatedCheckboxField
diff --git a/packages/component-faraday-ui/src/modals/ValidatedMenuField.js b/packages/component-faraday-ui/src/modals/ValidatedMenuField.js
new file mode 100644
index 0000000000000000000000000000000000000000..9221c1025500265c60facb2f0a70d497e8a3a012
--- /dev/null
+++ b/packages/component-faraday-ui/src/modals/ValidatedMenuField.js
@@ -0,0 +1,20 @@
+import React from 'react'
+import { Field } from 'formik'
+import { Menu } from '@pubsweet/ui'
+
+const ValidatedMenuField = ({ options, name }) => (
+  <Field name={name}>
+    {({ field, form }) => (
+      <Menu
+        onChange={v => {
+          // field.onChange(v)
+          form.setFieldValue(field.name, v)
+        }}
+        options={options}
+        value={field.value}
+      />
+    )}
+  </Field>
+)
+
+export default ValidatedMenuField
diff --git a/packages/component-faraday-ui/src/pending/Accordion.js b/packages/component-faraday-ui/src/pending/Accordion.js
index 58343260b2f6f473bdba89868a9f6c461ea95ffc..9f93cb2a835bb45bb2ff7788cc8864bd1dbf0299 100644
--- a/packages/component-faraday-ui/src/pending/Accordion.js
+++ b/packages/component-faraday-ui/src/pending/Accordion.js
@@ -51,7 +51,7 @@ class Accordion extends React.Component {
     } = this.props
     const { expanded } = this.state
     return (
-      <Root expanded={expanded} innerRef={r => (this._accordion = r)} {...rest}>
+      <Root expanded={expanded} ref={r => (this._accordion = r)} {...rest}>
         <Header
           expanded={expanded}
           icon={icon}
@@ -90,9 +90,9 @@ const Root = styled.div`
   ${override('ui.Accordion')};
 `
 
-const Header = styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'accordion-header',
-})`
+const Header = styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'accordion-header',
+}))`
   align-items: center;
   cursor: pointer;
   display: flex;
diff --git a/packages/component-faraday-ui/src/pending/ControlledAccordion.js b/packages/component-faraday-ui/src/pending/ControlledAccordion.js
index 0c63d576edfad292aeb7f5be3d6509b82e9e52c5..e4f9b30f9df252bf1070d0d561ac527f9a55fc69 100644
--- a/packages/component-faraday-ui/src/pending/ControlledAccordion.js
+++ b/packages/component-faraday-ui/src/pending/ControlledAccordion.js
@@ -42,7 +42,7 @@ class ControlledAccordion extends React.Component {
       ...rest
     } = this.props
     return (
-      <Root expanded={expanded} innerRef={r => (this._accordion = r)} {...rest}>
+      <Root expanded={expanded} ref={r => (this._accordion = r)} {...rest}>
         <Header expanded={expanded} icon={icon} {...rest} />
         {expanded && children}
       </Root>
@@ -62,9 +62,9 @@ const Root = styled.div`
   ${override('ui.Accordion')};
 `
 
-const Header = styled.div.attrs({
-  'data-test-id': props => props['data-test-id'] || 'accordion-header',
-})`
+const Header = styled.div.attrs(props => ({
+  'data-test-id': props['data-test-id'] || 'accordion-header',
+}))`
   align-items: center;
   cursor: pointer;
   display: flex;
diff --git a/packages/component-fixture-manager/package.json b/packages/component-fixture-manager/package.json
index fe566ea163b877842eba597a058293b0a0af7fbe..06e3449497b1e5cc0d0a338a77afac39f450e1a4 100644
--- a/packages/component-fixture-manager/package.json
+++ b/packages/component-fixture-manager/package.json
@@ -4,20 +4,17 @@
   "description": "fixture service component for pubsweet",
   "license": "MIT",
   "author": "Collaborative Knowledge Foundation",
-  "files": [
-    "src"
-  ],
+  "files": ["src"],
   "main": "index.js",
   "repository": {
     "type": "git",
     "url": "https://gitlab.coko.foundation/xpub/xpub-faraday",
     "path": "component-fixture-service"
   },
-  "dependencies": {
-  },
+  "dependencies": {},
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^10.0.0"
   },
   "publishConfig": {
     "access": "public"
diff --git a/packages/component-helper-service/package.json b/packages/component-helper-service/package.json
index 6c707d470181361319f2e2ead30675bc8967562d..78746c04d63ef3c9379e00b891946a1de0230bb7 100644
--- a/packages/component-helper-service/package.json
+++ b/packages/component-helper-service/package.json
@@ -17,7 +17,7 @@
   },
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet-server": "^1.0.1",
+    "pubsweet-server": "^10.0.0",
     "@pubsweet/component-send-email": "0.2.4"
   },
   "publishConfig": {
diff --git a/packages/component-invite/package.json b/packages/component-invite/package.json
index 7dc311684293ed1b767baac50292f67902454255..8a54d4d73a1eb7cc4ae30891c1552f25c008ff35 100644
--- a/packages/component-invite/package.json
+++ b/packages/component-invite/package.json
@@ -24,7 +24,7 @@
   },
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet-server": "^1.0.1",
+    "pubsweet-server": "^10.0.0",
     "@pubsweet/component-send-email": "0.2.4"
   },
   "devDependencies": {
diff --git a/packages/component-manuscript-manager/package.json b/packages/component-manuscript-manager/package.json
index bff0f5f07707c9609f93c58a7061b45a90a39541..ffa309ba664608dc212d65da44088a299d1a1807 100644
--- a/packages/component-manuscript-manager/package.json
+++ b/packages/component-manuscript-manager/package.json
@@ -25,7 +25,7 @@
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
     "@pubsweet/component-send-email": "0.2.4",
-    "pubsweet-server": "^1.0.1",
+    "pubsweet-server": "^10.0.0",
     "component-helper-service": "0.0.1"
   },
   "devDependencies": {
diff --git a/packages/component-manuscript/package.json b/packages/component-manuscript/package.json
index 458f0a07fcdb726ae1724b51f0e63862a8bca9bd..e82ef648a9c7a0f1e5a8c404b3ff7fe132675809 100644
--- a/packages/component-manuscript/package.json
+++ b/packages/component-manuscript/package.json
@@ -11,8 +11,8 @@
     "xpub-selectors": "^0.1.0"
   },
   "peerDependencies": {
-    "pubsweet-client": "^4.0.4",
-    "react": "^16.4.2",
+    "pubsweet-client": "^7.0.0",
+    "react": "^16.6.0",
     "react-redux": ">=5.0.2",
     "react-router-dom": ">=4.2.2"
   }
diff --git a/packages/component-manuscript/src/components/EditorialComment.js b/packages/component-manuscript/src/components/EditorialComment.js
index fb9f9aa46bdfe2bd502a3fd04974ff9e47758675..04eb4a1175f62d68c248068a696b853f1f9a2cf0 100644
--- a/packages/component-manuscript/src/components/EditorialComment.js
+++ b/packages/component-manuscript/src/components/EditorialComment.js
@@ -79,7 +79,7 @@ const DefaultText = styled.span`
   ${defaultText};
 `
 
-const CommentAuthor = DefaultText.extend`
+const CommentAuthor = styled(DefaultText)`
   margin-left: calc(${th('subGridUnit')} * 2);
   text-decoration: underline;
 `
@@ -103,7 +103,7 @@ const HeaderContainer = styled.div`
   display: flex;
 `
 
-const ReasonText = DefaultText.extend`
+const ReasonText = styled(DefaultText)`
   font-family: ${th('fontHeading')};
   font-weight: bold;
   text-transform: uppercase;
diff --git a/packages/component-mts-package/package.json b/packages/component-mts-package/package.json
index 20b9f9c86d65c196ad5da70e266fa8bbf45b9e28..29f2320b6f40697ab52442dd2947c5dd1a9e310f 100644
--- a/packages/component-mts-package/package.json
+++ b/packages/component-mts-package/package.json
@@ -19,7 +19,7 @@
   "license": "MIT",
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^10.0.0"
   },
   "devDependencies": {
     "apidoc": "^0.17.6",
diff --git a/packages/component-publons/package.json b/packages/component-publons/package.json
index c478a960ee0a1d9520f236fde80aceccf5a5e0e0..e0af84947a689691bd3497480f995a907f4ba988 100644
--- a/packages/component-publons/package.json
+++ b/packages/component-publons/package.json
@@ -24,7 +24,7 @@
   },
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^10.0.0"
   },
   "devDependencies": {
     "apidoc": "^0.17.6",
diff --git a/packages/component-user-manager/package.json b/packages/component-user-manager/package.json
index 3008180e89d58577c35c345001d0cfbc1324b807..73b063024cbac9f9b30b77efd8c763f3fd40489b 100644
--- a/packages/component-user-manager/package.json
+++ b/packages/component-user-manager/package.json
@@ -27,7 +27,7 @@
     "@pubsweet/logger": "^0.0.1",
     "pubsweet-component-helper-service": "0.0.1",
     "@pubsweet/component-send-email": "0.2.4",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^10.0.0"
   },
   "devDependencies": {
     "apidoc": "^0.17.6",
diff --git a/packages/component-user/index.js b/packages/component-user/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..307f862c05b48216eedc7514a3a76bf38f06eb11
--- /dev/null
+++ b/packages/component-user/index.js
@@ -0,0 +1,10 @@
+const resolvers = require('./resolvers')
+const typeDefs = require('./typeDefs')
+const model = require('./user')
+
+module.exports = {
+  model,
+  modelName: 'User',
+  resolvers,
+  typeDefs,
+}
diff --git a/packages/component-user/migrations/001-user.sql b/packages/component-user/migrations/001-user.sql
new file mode 100644
index 0000000000000000000000000000000000000000..36c7a4ed58c8f9f0886888423b1afca27acdab3b
--- /dev/null
+++ b/packages/component-user/migrations/001-user.sql
@@ -0,0 +1,6 @@
+CREATE TABLE "user" (
+    id UUID PRIMARY KEY,
+    created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp,
+    updated TIMESTAMP WITH TIME ZONE,
+    default_identity TEXT
+);
\ No newline at end of file
diff --git a/packages/component-user/resolvers.js b/packages/component-user/resolvers.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/packages/component-user/typeDefs.js b/packages/component-user/typeDefs.js
new file mode 100644
index 0000000000000000000000000000000000000000..3583a27be3d3a91e4f8aeb6de76bb57b59a1a001
--- /dev/null
+++ b/packages/component-user/typeDefs.js
@@ -0,0 +1,31 @@
+module.exports = `
+  type Creasta {
+    id: String!
+    name: String
+  }
+
+  extend type User {
+    affiliation: String
+    country: String
+    editorInChief: Boolean
+    handlingEditor: Boolean
+    isActive: Boolean
+    isConfirmed: Boolean
+    firstName: String
+    lastName: String
+    title: String
+  }
+
+  extend input UserInput {
+    isActive: Boolean
+    isConfirmed: Boolean
+    firstName: String
+    lastName: String
+    title: String
+    country: String
+    affiliation: String
+    admin: Boolean
+    editorInChief: Boolean
+    handlingEditor: Boolean
+  }
+`
diff --git a/packages/component-user/user.js b/packages/component-user/user.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/packages/component-wizard/package.json b/packages/component-wizard/package.json
index 42283d163cdb6f874c3e1946fcdce4a0f1755b8d..048f177e5841cd29eb0429c5411b0e60187a7973 100644
--- a/packages/component-wizard/package.json
+++ b/packages/component-wizard/package.json
@@ -9,7 +9,7 @@
     "dist"
   ],
   "dependencies": {
-    "@pubsweet/ui": "^8.6.0",
+    "@pubsweet/ui": "^9.0.2",
     "@pubsweet/styleguide": "3.1.4",
     "@pubsweet/ui-toolkit": "latest",
     "moment": "^2.20.1",
@@ -25,11 +25,11 @@
     "xpub-journal": "^0.0.6",
     "xpub-selectors": "^0.1.0",
     "xpub-edit": "^2.4.1",
-    "styled-components": "^3.4.2"
+    "styled-components": "^4.1.0"
   },
   "peerDependencies": {
     "prop-types": "^15.5.10",
-    "pubsweet-client": "^4.0.4",
+    "pubsweet-client": "^7.0.0",
     "react": "^16.4.2",
     "react-dom": "^15.6.1",
     "react-redux": "^5.0.2",
diff --git a/packages/component-wizard/src/components/StepOne.js b/packages/component-wizard/src/components/StepOne.js
index 3c5d249e53299b8da34feefd52bf065cc94c8310..b43fd5629eb60c18a38fb80e14f2e875ea4a3f5d 100644
--- a/packages/component-wizard/src/components/StepOne.js
+++ b/packages/component-wizard/src/components/StepOne.js
@@ -94,9 +94,9 @@ const CustomCheckbox = input => (
 export default StepOne
 
 // #region styled-components
-const RootCheckbox = styled.div.attrs({
+const RootCheckbox = styled.div.attrs(props => ({
   className: 'custom-checkbox',
-})`
+}))`
   + div[role='alert'] {
     margin-top: 0;
   }
diff --git a/packages/components-faraday/package.json b/packages/components-faraday/package.json
index ba1165a34dbcfcd292dfa1ea7f9bfc5313435a46..cb9fc36cb58f25fb35b07356467a85d121e8887c 100644
--- a/packages/components-faraday/package.json
+++ b/packages/components-faraday/package.json
@@ -5,22 +5,25 @@
   "license": "MIT",
   "dependencies": {
     "@pubsweet/styleguide": "3.1.4",
-    "@pubsweet/ui": "^8.6.0",
+    "@pubsweet/ui": "^9.0.2",
     "@pubsweet/ui-toolkit": "latest",
     "country-list": "^1.1.0",
+    "formik": "^1.3.2",
+    "graphql-tag": "^2.10.0",
     "moment": "^2.22.1",
     "prop-types": "^15.5.10",
-    "pubsweet-component-login": "^1.2.2",
-    "react": "^16.4.2",
-    "react-dnd": "^2.5.4",
+    "pubsweet-component-login": "^1.2.0",
+    "react": "^16.6.0",
+    "react-apollo": "^2.3.2",
+    "react-dnd": "^7.0.0",
     "react-dnd-html5-backend": "^2.5.4",
-    "react-dom": "^16.1.0",
+    "react-dom": "^16.6.0",
     "react-router-dom": "^4.2.2",
     "react-tippy": "^1.2.2",
     "recompose": "^0.30.0",
     "redux": "^3.6.0",
     "redux-form": "7.0.3",
-    "styled-components": "^3.4.2",
+    "styled-components": "^4.1.0",
     "xpub-edit": "^2.4.1"
   },
   "scripts": {
diff --git a/packages/components-faraday/src/components/Admin/AdminUsers.js b/packages/components-faraday/src/components/Admin/AdminUsers.js
index b29d70d4221431fbfdb750fbd965ccbb13dd00b0..39697bbc1ff9f3d04a13bea911a9a1e5963163c6 100644
--- a/packages/components-faraday/src/components/Admin/AdminUsers.js
+++ b/packages/components-faraday/src/components/Admin/AdminUsers.js
@@ -1,14 +1,10 @@
 import React, { Fragment } from 'react'
 import { get } from 'lodash'
 import { Button } from '@pubsweet/ui'
-import { connect } from 'react-redux'
 import styled from 'styled-components'
 import { th } from '@pubsweet/ui-toolkit'
-import { actions } from 'pubsweet-client'
-import { ConnectPage } from 'xpub-connect'
 import { withJournal } from 'xpub-journal'
 import { compose, withHandlers, withProps } from 'recompose'
-import { getAdminUsers } from 'pubsweet-component-faraday-selectors'
 
 import {
   Row,
@@ -23,8 +19,8 @@ import {
   withPagination,
 } from 'pubsweet-component-faraday-ui'
 
-import { AddUser } from './'
-import { updateUserStatus, onSubmit } from './utils'
+import { updateUserStatus } from './utils'
+import { OpenUserForm, withUsersGQL } from './'
 
 const Users = ({
   page,
@@ -34,12 +30,16 @@ const Users = ({
   journal,
   getUsers,
   isFetching,
+  getUserName,
   getUserRoles,
   itemsPerPage,
   deactivateUser,
   getStatusLabel,
   paginatedItems,
   toggleUserStatus,
+  //
+  addUser,
+  updateUser,
   ...rest
 }) => (
   <Fragment>
@@ -53,12 +53,7 @@ const Users = ({
         >
           Admin Dashboard
         </ActionLink>
-        <AddUser
-          form="add-user"
-          getUsers={getUsers}
-          modalKey="addUser"
-          onSubmit={onSubmit}
-        />
+        <OpenUserForm modalKey="addUser" onSubmit={addUser} />
       </Item>
 
       <Pagination {...rest} itemsPerPage={itemsPerPage} page={page} />
@@ -89,11 +84,7 @@ const Users = ({
         {paginatedItems.map(user => (
           <UserRow key={user.id}>
             <td>
-              <Text pl={1}>{`${get(user, 'firstName', '')} ${get(
-                user,
-                'lastName',
-                '',
-              )}`}</Text>
+              <Text pl={1}>{getUserName(user)}</Text>
             </td>
             <td colSpan={2}>
               <Text>{user.email}</Text>
@@ -110,11 +101,10 @@ const Users = ({
 
             <HiddenCell>
               <Item alignItems="center" justify="flex-end">
-                <AddUser
+                <OpenUserForm
                   edit
-                  getUsers={getUsers}
                   modalKey={`edit-${user.id}`}
-                  onSubmit={onSubmit}
+                  onSubmit={updateUser}
                   user={user}
                 />
                 <OpenModal
@@ -147,23 +137,17 @@ const Users = ({
 )
 
 export default compose(
-  ConnectPage(() => [actions.getUsers()]),
-  connect(
-    state => ({
-      items: getAdminUsers(state),
-    }),
-    {
-      getUsers: actions.getUsers,
-    },
-  ),
   withJournal,
   withFetching,
-  withPagination,
-  withProps(({ journal: { roles = {} } }) => ({
+  withUsersGQL,
+  withProps(({ journal: { roles = {} }, users }) => ({
     roles: Object.keys(roles),
+    items: users,
   })),
+  withPagination,
   withHandlers({
-    getStatusLabel: () => ({ isConfirmed, isActive = true }) => {
+    getStatusLabel: () => ({ admin, isConfirmed, isActive = true }) => {
+      if (admin) return 'ACTIVE'
       if (!isActive) {
         return 'INACTIVE'
       }
@@ -185,6 +169,12 @@ export default compose(
           handleError(setModalError)(err)
         })
     },
+    getUserName: () => user => {
+      if (user.admin) {
+        return 'Admin'
+      }
+      return `${get(user, 'firstName', '')} ${get(user, 'lastName', '')}`
+    },
     getUserRoles: ({ journal: { roles = {} } }) => user => {
       const parsedRoles = Object.entries(roles)
         .reduce((acc, role) => (user[role[0]] ? [...acc, role[1]] : acc), [])
diff --git a/packages/components-faraday/src/components/Admin/AddUser.js b/packages/components-faraday/src/components/Admin/OpenUserForm.js
similarity index 53%
rename from packages/components-faraday/src/components/Admin/AddUser.js
rename to packages/components-faraday/src/components/Admin/OpenUserForm.js
index 7fd409d679850f3e7418baa28af3f82bc6f361cc..847237c6934c60535761a0d4acfc005d65a74b4f 100644
--- a/packages/components-faraday/src/components/Admin/AddUser.js
+++ b/packages/components-faraday/src/components/Admin/OpenUserForm.js
@@ -1,23 +1,18 @@
 import React from 'react'
-import { get } from 'lodash'
-import { compose } from 'recompose'
-import { withJournal } from 'xpub-journal'
 
 import {
   OpenModal,
   ActionLink,
   IconButton,
-  withRoles,
-  withFetching,
 } from 'pubsweet-component-faraday-ui'
 
-const AddUser = ({ edit, journal, handleSubmit, ...rest }) => (
+const OpenUserForm = ({ edit, user, onSubmit, modalKey }) => (
   <OpenModal
     edit={edit}
     formModal
-    title={edit ? 'Edit User' : 'Add User'}
-    titles={get(journal, 'title', [])}
-    {...rest}
+    modalKey={modalKey}
+    onSubmit={onSubmit}
+    user={user}
   >
     {showModal =>
       edit ? (
@@ -31,4 +26,4 @@ const AddUser = ({ edit, journal, handleSubmit, ...rest }) => (
   </OpenModal>
 )
 
-export default compose(withJournal, withRoles, withFetching)(AddUser)
+export default OpenUserForm
diff --git a/packages/components-faraday/src/components/Admin/index.js b/packages/components-faraday/src/components/Admin/index.js
index 2bc308a267345089b8602b3bb6c3daa9a7bc15c4..0bb7e9bedd5aa30878c77cf7bea2da6a179a7d31 100644
--- a/packages/components-faraday/src/components/Admin/index.js
+++ b/packages/components-faraday/src/components/Admin/index.js
@@ -1,4 +1,6 @@
-export { default as AddUser } from './AddUser'
+export { default as withUsersGQL } from './withUsersGQL'
+
 export { default as AdminUsers } from './AdminUsers'
 export { default as AdminRoute } from './AdminRoute'
+export { default as OpenUserForm } from './OpenUserForm'
 export { default as AdminDashboard } from './AdminDashboard'
diff --git a/packages/components-faraday/src/components/Admin/utils.js b/packages/components-faraday/src/components/Admin/utils.js
index a923d20778f4b6c7f3424cb69c88f7d85fd9fe88..14835de252aa01e7e57419f3f28edbb8eca00136 100644
--- a/packages/components-faraday/src/components/Admin/utils.js
+++ b/packages/components-faraday/src/components/Admin/utils.js
@@ -1,6 +1,5 @@
 import { pick, omit, isBoolean, replace } from 'lodash'
-import { handleError } from 'pubsweet-component-faraday-ui'
-import { update, create } from 'pubsweet-client/src/helpers/api'
+import { update } from 'pubsweet-client/src/helpers/api'
 
 const generatePasswordHash = () =>
   Array.from({ length: 4 }, () =>
@@ -85,39 +84,3 @@ export const updateUserStatus = user => {
   const updatedUser = toggleUserStatus(user)
   return update(`/users/${user.id}`, parseUpdateUser(updatedUser))
 }
-
-export const onSubmit = (
-  values,
-  dispatch,
-  { edit, setFetching, getUsers, hideModal, setModalError },
-) => {
-  setFetching(true)
-  if (!edit) {
-    const newValues = setAdmin(values)
-    return create('/users', newValues)
-      .then(r => {
-        create(`/emails`, {
-          email: r.email,
-          type: 'invite',
-          role: values.role,
-        })
-        setFetching(false)
-        getUsers()
-        hideModal()
-      })
-      .catch(err => {
-        setFetching(false)
-        handleError(setModalError)(err)
-      })
-  }
-  return update(`/users/${values.id}`, parseUpdateUser(values))
-    .then(() => {
-      setFetching(false)
-      getUsers()
-      hideModal()
-    })
-    .catch(err => {
-      setFetching(false)
-      handleError(setModalError)(err)
-    })
-}
diff --git a/packages/components-faraday/src/components/Admin/withUsersGQL.js b/packages/components-faraday/src/components/Admin/withUsersGQL.js
new file mode 100644
index 0000000000000000000000000000000000000000..807a319249eb930c93cbbd45f41b4779ee69b658
--- /dev/null
+++ b/packages/components-faraday/src/components/Admin/withUsersGQL.js
@@ -0,0 +1,75 @@
+import gql from 'graphql-tag'
+import { graphql } from 'react-apollo'
+import { compose, withHandlers, withProps } from 'recompose'
+
+const userFragment = gql`
+  fragment userDetails on User {
+    id
+    admin
+    email
+    title
+    country
+    username
+    lastName
+    isActive
+    firstName
+    affiliation
+    isConfirmed
+    editorInChief
+    handlingEditor
+  }
+`
+
+const getUsersQuery = gql`
+  {
+    users {
+      ...userDetails
+    }
+  }
+  ${userFragment}
+`
+
+const addUserMutation = gql`
+  mutation addUser($user: UserInput) {
+    createUser(input: $user) {
+      ...userDetails
+    }
+  }
+  ${userFragment}
+`
+
+const updateUserMutation = gql`
+  mutation updateUser($id: ID, $input: UserInput) {
+    updateUser(id: $id, input: $input) {
+      ...userDetails
+    }
+  }
+  ${userFragment}
+`
+
+export default compose(
+  graphql(getUsersQuery),
+  graphql(addUserMutation, {
+    name: 'addUser',
+  }),
+  graphql(updateUserMutation, {
+    name: 'updateUser',
+  }),
+  withHandlers({
+    addUser: ({ addUser }) => (values, props) => {},
+    updateUser: ({ updateUser }) => (
+      { __typename, id, ...input },
+      { props: { hideModal } },
+    ) => {
+      updateUser({
+        variables: {
+          id,
+          input,
+        },
+      }).then(hideModal)
+    },
+  }),
+  withProps(({ data }) => ({
+    users: data.users,
+  })),
+)
diff --git a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
index b698cf1f41d8b9c2fac0ba97fa7b01f588eac0ce..5ac2e932a667a91a7b71ccf843de3b034c87eea4 100644
--- a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
+++ b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js
@@ -154,14 +154,14 @@ const IconButton = styled.div`
   cursor: pointer;
 `
 
-const CustomSubtitle = Subtitle.extend`
+const CustomSubtitle = styled(Subtitle)`
   align-items: center;
   display: flex;
   flex-direction: row;
   justify-content: center;
 `
 
-const BoldSubtitle = Subtitle.extend`
+const BoldSubtitle = styled(Subtitle)`
   font-weight: bold;
   margin-left: 5px;
 `
diff --git a/packages/components-faraday/src/components/UIComponents/FormItems.js b/packages/components-faraday/src/components/UIComponents/FormItems.js
index c9290916b65b57cc542c10166a61792e95fe2638..39688ac0565191dac2d03561bf77a6e3dff8c4f1 100644
--- a/packages/components-faraday/src/components/UIComponents/FormItems.js
+++ b/packages/components-faraday/src/components/UIComponents/FormItems.js
@@ -66,9 +66,9 @@ export const Email = styled.div`
 
 export const FormContainer = styled.form``
 
-export const Row = styled.div.attrs({
+export const Row = styled.div.attrs(props => ({
   className: 'form-row',
-})`
+}))`
   align-items: ${props => get(props, 'alignItems', 'flex-start')};
   display: flex;
   flex-direction: row;
@@ -82,9 +82,9 @@ export const Row = styled.div.attrs({
   }
 `
 
-export const RowItem = styled.div.attrs({
+export const RowItem = styled.div.attrs(props => ({
   className: 'form-row-item',
-})`
+}))`
   display: flex;
   flex: ${({ flex }) => flex || 1};
   flex-direction: ${({ vertical }) => (vertical ? 'column' : 'row')};
@@ -101,9 +101,9 @@ export const RowItem = styled.div.attrs({
   }
 `
 
-export const Label = styled.div.attrs({
+export const Label = styled.div.attrs(props => ({
   className: 'form-label',
-})`
+}))`
   align-items: center;
   color: ${th('colorPrimary')};
   display: flex;
@@ -114,7 +114,7 @@ export const Label = styled.div.attrs({
   text-transform: uppercase;
 `
 
-export const LabelTitle = Label.extend`
+export const LabelTitle = styled(Label)`
   margin: calc(${th('subGridUnit')} * 2) 0 0;
   line-height: 1;
 `
diff --git a/packages/hindawi-theme/package-lock.json b/packages/hindawi-theme/package-lock.json
deleted file mode 100644
index a5c791ad483275a8c058ac05b66755c783170125..0000000000000000000000000000000000000000
--- a/packages/hindawi-theme/package-lock.json
+++ /dev/null
@@ -1,273 +0,0 @@
-{
-  "name": "hindawi-theme",
-  "version": "1.0.1",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@pubsweet/ui-toolkit": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@pubsweet/ui-toolkit/-/ui-toolkit-1.2.0.tgz",
-      "integrity": "sha512-HwnFt4eES5RopLLY7ajb//UvaCLXS29XCWOOB5cs90DkwysVZaH/GM5HB/QtClQ5tuXiR3BqfjLy2mHMA0Z+PQ==",
-      "requires": {
-        "color": "^3.0.0",
-        "lodash": "^4.17.4",
-        "styled-components": "^3.2.5"
-      }
-    },
-    "asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
-    },
-    "base64-js": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
-      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
-    },
-    "buffer": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.0.tgz",
-      "integrity": "sha512-nUJyfChH7PMJy75eRDCCKtszSEFokUNXC1hNVSe+o+VdcgvDPLs20k3v8UXI8ruRYAJiYtyRea8mYyqPxoHWDw==",
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "color": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
-      "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==",
-      "requires": {
-        "color-convert": "^1.9.1",
-        "color-string": "^1.5.2"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
-      "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
-      "requires": {
-        "color-name": "1.1.1"
-      }
-    },
-    "color-name": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok="
-    },
-    "color-string": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
-      "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
-      "requires": {
-        "color-name": "^1.0.0",
-        "simple-swizzle": "^0.2.2"
-      }
-    },
-    "core-js": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
-      "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
-    },
-    "css-color-keywords": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
-      "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU="
-    },
-    "css-to-react-native": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.2.1.tgz",
-      "integrity": "sha512-v++LRcf633phJiYZBDqtmGPj3+BVof0isd2jgwYLWZJ5YSuhCkrfYtDsNhM6oJthiEco0f9tDVJ1vUkDJNgGEA==",
-      "requires": {
-        "css-color-keywords": "^1.0.0",
-        "fbjs": "^0.8.5",
-        "postcss-value-parser": "^3.3.0"
-      }
-    },
-    "encoding": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
-      "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
-      "requires": {
-        "iconv-lite": "~0.4.13"
-      }
-    },
-    "fbjs": {
-      "version": "0.8.17",
-      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
-      "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
-      "requires": {
-        "core-js": "^1.0.0",
-        "isomorphic-fetch": "^2.1.1",
-        "loose-envify": "^1.0.0",
-        "object-assign": "^4.1.0",
-        "promise": "^7.1.1",
-        "setimmediate": "^1.0.5",
-        "ua-parser-js": "^0.7.18"
-      }
-    },
-    "has-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-      "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
-    },
-    "hoist-non-react-statics": {
-      "version": "2.5.5",
-      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
-      "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
-    },
-    "iconv-lite": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
-      "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ieee754": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
-      "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="
-    },
-    "is-arrayish": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
-    },
-    "isomorphic-fetch": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
-      "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
-      "requires": {
-        "node-fetch": "^1.0.1",
-        "whatwg-fetch": ">=0.10.0"
-      }
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "lodash": {
-      "version": "4.17.10",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
-      "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
-    },
-    "loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "requires": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      }
-    },
-    "node-fetch": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
-      "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
-      "requires": {
-        "encoding": "^0.1.11",
-        "is-stream": "^1.0.1"
-      }
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
-    "postcss-value-parser": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
-      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU="
-    },
-    "promise": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
-      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
-      "requires": {
-        "asap": "~2.0.3"
-      }
-    },
-    "prop-types": {
-      "version": "15.6.2",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
-      "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
-      "requires": {
-        "loose-envify": "^1.3.1",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "react-is": {
-      "version": "16.4.2",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.2.tgz",
-      "integrity": "sha512-rI3cGFj/obHbBz156PvErrS5xc6f1eWyTwyV4mo0vF2lGgXgS+mm7EKD5buLJq6jNgIagQescGSVG2YzgXt8Yg=="
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "setimmediate": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
-    },
-    "simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
-      "requires": {
-        "is-arrayish": "^0.3.1"
-      }
-    },
-    "styled-components": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.4.2.tgz",
-      "integrity": "sha512-eTmIiWstyDLccHZAyp+aCPirlkTvYiHlYGgWQxOYDv8Ko0o6mfnDo0+DnUnKinO8NzAfQXEDP7Bh0qlazwJgrw==",
-      "requires": {
-        "buffer": "^5.0.3",
-        "css-to-react-native": "^2.0.3",
-        "fbjs": "^0.8.16",
-        "hoist-non-react-statics": "^2.5.0",
-        "prop-types": "^15.5.4",
-        "react-is": "^16.3.1",
-        "stylis": "^3.5.0",
-        "stylis-rule-sheet": "^0.0.10",
-        "supports-color": "^3.2.3"
-      }
-    },
-    "stylis": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.3.tgz",
-      "integrity": "sha512-TxU0aAscJghF9I3V9q601xcK3Uw1JbXvpsBGj/HULqexKOKlOEzzlIpLFRbKkCK990ccuxfXUqmPbIIo7Fq/cQ=="
-    },
-    "stylis-rule-sheet": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
-      "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw=="
-    },
-    "supports-color": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-      "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-      "requires": {
-        "has-flag": "^1.0.0"
-      }
-    },
-    "ua-parser-js": {
-      "version": "0.7.18",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz",
-      "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA=="
-    },
-    "whatwg-fetch": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
-      "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
-    }
-  }
-}
diff --git a/packages/hindawi-theme/package.json b/packages/hindawi-theme/package.json
index be7b255ecdf14e887117c1c03362f0ea356a199e..a74c42acb57740a1e55e4eebe0f0a58a9140c98b 100644
--- a/packages/hindawi-theme/package.json
+++ b/packages/hindawi-theme/package.json
@@ -4,7 +4,6 @@
   "main": "src",
   "license": "MIT",
   "dependencies": {
-    "@pubsweet/ui-toolkit": "^1.1.3",
-    "styled-components": "^3.4.2"
+    "@pubsweet/ui-toolkit": "^2.0.0"
   }
 }
diff --git a/packages/hindawi-theme/src/index.js b/packages/hindawi-theme/src/index.js
index c4c383e86d2810b5a7681dd58df57cfd7ca828fc..fa72ae39d8eb011a3f3f752d89f6c74295f1558d 100644
--- a/packages/hindawi-theme/src/index.js
+++ b/packages/hindawi-theme/src/index.js
@@ -1,6 +1,4 @@
 /* eslint-disable import/extensions */
-import { injectGlobal } from 'styled-components'
-
 import './fonts/index.css'
 import {
   Icon,
@@ -16,18 +14,6 @@ import {
   ValidatedTextField,
 } from './elements'
 
-injectGlobal`
-  body {
-    height: 100vh;
-    -webkit-font-smoothing: antialiased;
-    -moz-osx-font-smoothing: grayscale;
-  }
-
-  #root, #root > div {
-    height: 100%;
-  }
-`
-
 const hindawiTheme = {
   /* Colors */
   colorBackground: '#ECF0F3',
diff --git a/packages/styleguide/package.json b/packages/styleguide/package.json
index fd526bd04f9e708f66748428613d96219172182d..a202f2fe3c95ef2c87fae864e9928a98f8cd457a 100644
--- a/packages/styleguide/package.json
+++ b/packages/styleguide/package.json
@@ -11,7 +11,6 @@
     "babel-preset-stage-2": "^6.24.1",
     "css-loader": "^0.28.4",
     "node-sass": "^4.5.3",
-    "react-styleguidist": "^7.2.1",
     "rimraf": "^2.6.1",
     "sass-loader": "^6.0.6",
     "style-loader": "^0.19.0",
@@ -19,11 +18,16 @@
     "webpack-node-externals": "^1.6.0"
   },
   "dependencies": {
-    "@pubsweet/ui": "^8.6.0",
-    "@pubsweet/ui-toolkit": "^1.2.0",
+    "@pubsweet/ui": "^9.0.2",
+    "@pubsweet/ui-toolkit": "^2.0.0",
     "hindawi-theme": "^1.0.1",
-    "react": "^16.4.2",
-    "styled-components": "^3.4.2"
+    "react": "^16.6.0",
+    "react-dom": "^16.6.0",
+    "react-router-dom": "^4.2.2",
+    "redux": "^3.6.0",
+    "redux-logger": "^3.0.6",
+    "styled-components": "^4.1.0",
+    "react-styleguidist": "^7.0.10"
   },
   "scripts": {
     "styleguide": "styleguidist server",
diff --git a/packages/styleguide/src/Wrapper.js b/packages/styleguide/src/Wrapper.js
index b7641fe72a28e8c036b9fedafa11bf4160950165..37385371012630f05b9f8370d2e8f8da52a3b7d3 100644
--- a/packages/styleguide/src/Wrapper.js
+++ b/packages/styleguide/src/Wrapper.js
@@ -4,8 +4,9 @@ import { reducer } from 'redux-form'
 import { Provider } from 'react-redux'
 import hindawiTheme from 'hindawi-theme'
 import { createLogger } from 'redux-logger'
-import { ThemeProvider } from 'styled-components'
+import { th } from '@pubsweet/ui-toolkit'
 import { client } from 'pubsweet-component-modal'
+import styled, { ThemeProvider } from 'styled-components'
 import { BrowserRouter as Router } from 'react-router-dom'
 import { createStore, combineReducers, applyMiddleware } from 'redux'
 
@@ -20,13 +21,25 @@ const store = createStore(
   applyMiddleware(logger),
 )
 
+const StyleRoot = styled.div`
+  background-color: ${th('colorBackground')};
+  font-family: ${th('fontInterface')}, sans-serif;
+  font-size: ${th('fontSizeBase')};
+  color: ${th('colorText')};
+  line-height: ${th('lineHeightBase')};
+
+  * {
+    box-sizing: border-box;
+  }
+`
+
 class Wrapper extends Component {
   render() {
     return (
       <Provider store={store}>
         <Router>
           <ThemeProvider theme={hindawiTheme}>
-            {this.props.children}
+            <StyleRoot>{this.props.children}</StyleRoot>
           </ThemeProvider>
         </Router>
       </Provider>
diff --git a/packages/styleguide/src/webpack-config.js b/packages/styleguide/src/webpack-config.js
index e76b0cf47f71f4c95f629092406bf66b447d38a2..29f13854e2cb65c8674d4f916868ec908960429f 100644
--- a/packages/styleguide/src/webpack-config.js
+++ b/packages/styleguide/src/webpack-config.js
@@ -44,7 +44,7 @@ module.exports = dir => {
             },
             // Files
             {
-              exclude: [/\.jsx?$/, /\.html$/, /\.json$/],
+              exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],
               loader: 'file-loader',
               options: {
                 name: 'static/media/[name].[hash:8].[ext]',
diff --git a/packages/xpub-faraday/app/app.js b/packages/xpub-faraday/app/app.js
index 0988df482437853ff3bbe0ee9f20354238071b85..e6466401f8fcb36af5e52be9b4a5efdc2fb14a3d 100644
--- a/packages/xpub-faraday/app/app.js
+++ b/packages/xpub-faraday/app/app.js
@@ -18,6 +18,7 @@ const render = () => {
     <AppContainer>
       <JournalProvider journal={journal}>
         <Root
+          connectToWebSocket={false}
           history={history}
           routes={<Routes />}
           store={store}
diff --git a/packages/xpub-faraday/app/routes.js b/packages/xpub-faraday/app/routes.js
index 8ca66e768f4bb881ab2444a8855c3ea9ff33c74d..95a60cdedf33e26ba516608667d3c78959b63bcc 100644
--- a/packages/xpub-faraday/app/routes.js
+++ b/packages/xpub-faraday/app/routes.js
@@ -1,6 +1,7 @@
 import React from 'react'
-import { Route, Switch, Redirect } from 'react-router-dom'
 import { AuthenticatedComponent } from 'pubsweet-client'
+import { Route, Switch, Redirect } from 'react-router-dom'
+import { createGlobalStyle } from 'styled-components'
 
 import {
   SubmissionWizard,
@@ -47,8 +48,21 @@ const PrivateRoute = ({ component: Component, ...rest }) => (
   />
 )
 
+const GlobalStyles = createGlobalStyle`
+  body {
+    height: 100vh;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+
+    #root, #root > div, #root > div > div {
+      height: 100%;
+    } 
+  }
+`
+
 const Routes = () => (
   <FaradayApp>
+    <GlobalStyles />
     <Switch>
       <Route component={LoginPage} exact path="/login" />
       <Route component={SignUpInvitationPage} exact path="/invite" />
diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js
index b6b853f993557128c1b32d7dcad8f9e5bbde5b2f..13eed68fde3e75c0cea41cde6d77d128783590d3 100644
--- a/packages/xpub-faraday/config/default.js
+++ b/packages/xpub-faraday/config/default.js
@@ -5,6 +5,8 @@ const logger = require('winston')
 const components = require('./components.json')
 const journalConfig = require('../app/config/journal')
 
+const users = require('../../component-user')
+
 const getDbConfig = () => {
   if (process.env.DATABASE) {
     return {
@@ -44,6 +46,10 @@ module.exports = {
     logger,
     uploads: 'uploads',
     secret: 'SECRET',
+    enableExperimentalGraphql: true,
+    graphiql: true,
+    typeDefs: `${users.typeDefs}`,
+    // resolvers,
   },
   'pubsweet-client': {
     API_ENDPOINT: '/api',
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index c60e5f85015904e4218550b1d78ab84567d28d33..562ea5242cef0bcd0c3268496b72e70be656cf4a 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -157,6 +157,7 @@ module.exports = {
     handlingEditor: Joi.boolean(),
     agreeTC: Joi.boolean(),
     isActive: Joi.boolean(),
+    passwordHash: Joi.string(),
     notifications: Joi.object({
       email: Joi.object({
         system: Joi.boolean().default(true),
diff --git a/packages/xpub-faraday/package.json b/packages/xpub-faraday/package.json
index 98832153f33a3a2edb0e90b0489c534d5a9c949e..62bd970139d9cf0904d2f4d1b74882c29b0a5cbe 100644
--- a/packages/xpub-faraday/package.json
+++ b/packages/xpub-faraday/package.json
@@ -9,37 +9,40 @@
   },
   "dependencies": {
     "@pubsweet/component-aws-s3": "^1.2.0",
-    "@pubsweet/component-send-email": "0.2.4",
     "@pubsweet/component-email-templating": "0.0.1",
-    "@pubsweet/styleguide": "3.1.4",
-    "@pubsweet/ui": "^8.6.0",
-    "@pubsweet/ui-toolkit": "latest",
+    "@pubsweet/component-send-email": "0.2.4",
+    "@pubsweet/styleguide": "^4.0.0",
+    "@pubsweet/ui": "^9.0.2",
+    "@pubsweet/ui-toolkit": "^2.0.0",
     "aws-sdk": "^2.197.0",
     "babel-core": "^6.26.0",
     "config": "^1.26.2",
     "dotenv": "^5.0.0",
     "flavors": "^3.3.1",
     "font-awesome": "^4.7.0",
+    "formik": "^1.3.2",
     "fs-extra": "^4.0.2",
+    "graphql-tag": "^2.10.0",
     "history": "^4.7.2",
     "joi": "^10.0.6",
     "loadable-components": "^0.3.0",
     "moment": "^2.18.1",
     "nodemailer-ses-transport": "^1.5.1",
     "prop-types": "^15.5.10",
-    "pubsweet": "3.0.6",
-    "pubsweet-client": "^4.0.4",
-    "pubsweet-component-login": "^1.2.2",
-    "pubsweet-server": "10.0.1",
-    "react": "^16.4.2",
-    "react-dnd": "^2.5.4",
-    "react-dnd-html5-backend": "^2.5.4",
-    "react-dom": "^16.2.0",
+    "pubsweet": "^3.0.0",
+    "pubsweet-client": "^7.0.0",
+    "pubsweet-component-login": "^1.2.0",
+    "pubsweet-server": "^10.0.0",
+    "react": "^16.6.0",
+    "react-dnd": "^7.0.0",
+    "react-dnd-html5-backend": "^7.0.0",
+    "react-dom": "^16.6.0",
     "react-router-dom": "^4.2.2",
     "recompose": "^0.30.0",
     "redux": "^3.6.0",
     "redux-form": "7.0.3",
     "redux-logger": "^3.0.1",
+    "styled-components": "^4.1.2",
     "typeface-noto-sans": "^0.0.54",
     "typeface-noto-serif": "^0.0.54",
     "typeface-ubuntu-mono": "^0.0.54",
@@ -81,8 +84,7 @@
     "start": "pubsweet start",
     "start:services": "docker-compose up postgres",
     "server": "pubsweet server",
-    "start-now":
-      "echo $secret > config/local-development.json && npm run server",
+    "start-now": "echo $secret > config/local-development.json && npm run server",
     "build": "NODE_ENV=production pubsweet build",
     "clean": "rm -rf node_modules",
     "debug": "pgrep -f startup/start.js | xargs kill -sigusr1",
diff --git a/packages/xpub-faraday/webpack/rules.development.js b/packages/xpub-faraday/webpack/rules.development.js
index 548c24f1621ff0d32061b20a1fdea2b4f884987b..f2426d6006062210c6685e63b5f2beb645482e51 100644
--- a/packages/xpub-faraday/webpack/rules.development.js
+++ b/packages/xpub-faraday/webpack/rules.development.js
@@ -44,7 +44,7 @@ module.exports = [
 
       // files
       {
-        exclude: [/\.jsx?$/, /\.html$/, /\.json$/],
+        exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],
         loader: 'file-loader',
         options: {
           name: 'static/media/[name].[hash:8].[ext]',
diff --git a/packages/xpub-faraday/webpack/rules.production.js b/packages/xpub-faraday/webpack/rules.production.js
index 0fe8d5b7e26111759ee1c581d90bfa22dd195de7..56eecf0b3db4ef61a3dcfb5f4828a0312383acd9 100644
--- a/packages/xpub-faraday/webpack/rules.production.js
+++ b/packages/xpub-faraday/webpack/rules.production.js
@@ -49,7 +49,7 @@ module.exports = [
 
       // files
       {
-        exclude: [/\.jsx?$/, /\.html$/, /\.json$/],
+        exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],
         loader: 'file-loader',
         options: {
           name: 'static/media/[name].[hash:8].[ext]',
diff --git a/packages/xpub-faraday/webpack/rules.test.js b/packages/xpub-faraday/webpack/rules.test.js
index 0fe8d5b7e26111759ee1c581d90bfa22dd195de7..56eecf0b3db4ef61a3dcfb5f4828a0312383acd9 100644
--- a/packages/xpub-faraday/webpack/rules.test.js
+++ b/packages/xpub-faraday/webpack/rules.test.js
@@ -49,7 +49,7 @@ module.exports = [
 
       // files
       {
-        exclude: [/\.jsx?$/, /\.html$/, /\.json$/],
+        exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/],
         loader: 'file-loader',
         options: {
           name: 'static/media/[name].[hash:8].[ext]',
diff --git a/yarn.lock b/yarn.lock
index ca779bf66066fb0570536a5f15d671e4852aed89..0800a7fa664a6c4a705bd6b8d6c6648f94854b68 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -110,9 +110,9 @@
     to-fast-properties "^2.0.0"
 
 "@babel/types@^7.0.0":
-  version "7.1.6"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.6.tgz#0adb330c3a281348a190263aceb540e10f04bcce"
-  integrity sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.0.tgz#7941c5b2d8060e06f9601d6be7c223eef906d5d8"
+  integrity sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==
   dependencies:
     esutils "^2.0.2"
     lodash "^4.17.10"
@@ -172,17 +172,17 @@
     aws-sdk "^2.185.0"
     nodemailer "^4.4.2"
 
-"@pubsweet/db-manager@^2.0.6":
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/@pubsweet/db-manager/-/db-manager-2.0.6.tgz#75e5dbc3946c3211ff2146ef914884c3711bb92b"
-  integrity sha512-rheDnoOSVyuzlV63AfesAY/IDYHEkEMWxq1RUugtz22QzBLTeMaBQK7Sdp7xhuU7NK4t0kvoWuSo4QRvNgeUyQ==
+"@pubsweet/db-manager@^2.1.2":
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/@pubsweet/db-manager/-/db-manager-2.1.2.tgz#0c65ccadcf51a456d63588e7dfe7ebca1cf0332a"
+  integrity sha512-R5Mv8eqY+VKEr8/8E2deE+TDTcwDgE91fyu3V12lx6WGdZjC4u99AznhyfUxRyxqCWi87pT++P0+acMPe/Z1Ug==
   dependencies:
     "@pubsweet/logger" "^0.2.7"
     fs-extra "^4.0.2"
     isomorphic-fetch "^2.2.1"
     joi "^13.6.0"
     pg "^7.4.1"
-    pubsweet-server "^10.0.1"
+    pubsweet-server "^10.1.3"
     tmp "^0.0.33"
     umzug "^2.1.0"
 
@@ -196,6 +196,16 @@
     typeface-noto-serif "^0.0.54"
     typeface-ubuntu-mono "^0.0.54"
 
+"@pubsweet/default-theme@^4.0.2":
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@pubsweet/default-theme/-/default-theme-4.0.2.tgz#ba1c4636e05d39b8daf1c28645077dc761b729a6"
+  integrity sha512-4uN3OLPO0itIlmJZSTeNQQuYVqZFvZYK3DRm7GOLnDfD5dTHBpqhq+2jHjD4ohtu3iZ/8lw/Oc+y+c5Suo4YOQ==
+  dependencies:
+    styled-components "^4.1.1"
+    typeface-noto-sans "^0.0.54"
+    typeface-noto-serif "^0.0.54"
+    typeface-ubuntu-mono "^0.0.54"
+
 "@pubsweet/logger@^0.2.7":
   version "0.2.7"
   resolved "https://registry.yarnpkg.com/@pubsweet/logger/-/logger-0.2.7.tgz#73e4b2a56c7d1145287da6081a0b6ede8abb4269"
@@ -227,6 +237,29 @@
     styled-components "^3.2.5"
     xpub-journal "^0.0.3"
 
+"@pubsweet/styleguide@^4.0.0":
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@pubsweet/styleguide/-/styleguide-4.0.2.tgz#5fa2b4884c47442e1849dd3dc562f95cc17e7d17"
+  integrity sha512-eSxkpLESMdkpM2EUuqY3/OjqSgz6jd+ONSSDS/2HLeNt9rv0NFxDmm+zHLmXqHMIfQC1kEf+PdqM1OJRnhsZGQ==
+  dependencies:
+    "@elifesciences/elife-theme" "^1.0.0"
+    "@pubsweet/default-theme" "^4.0.2"
+    "@pubsweet/ui" "^9.0.2"
+    "@pubsweet/ui-toolkit" "^2.0.2"
+    faker "^4.1.0"
+    lodash "^4.17.5"
+    react "^16.2.0"
+    react-dom "^16.2.0"
+    react-redux "^5.0.2"
+    react-router-dom "^4.2.2"
+    react-styleguidist "^7.0.10"
+    recompose "^0.26.0"
+    redux "^3.6.0"
+    redux-form "^7.0.3"
+    styled-components "^4.1.1"
+    styled-normalize "^8.0.4"
+    xpub-journal "^0.0.3"
+
 "@pubsweet/ui-toolkit@^1.0.0", "@pubsweet/ui-toolkit@^1.1.2", "@pubsweet/ui-toolkit@^1.1.3", "@pubsweet/ui-toolkit@^1.2.0":
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/@pubsweet/ui-toolkit/-/ui-toolkit-1.2.0.tgz#5531149fa2229acc06e76e964b8a412bf503c4ce"
@@ -236,10 +269,10 @@
     lodash "^4.17.4"
     styled-components "^3.2.5"
 
-"@pubsweet/ui-toolkit@^2.0.1":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@pubsweet/ui-toolkit/-/ui-toolkit-2.0.1.tgz#d500cd808125909d812aafa8b77732d4a96b4433"
-  integrity sha512-mAhBSLte7NhHHkrA5pYyRoDpXLlam11T8USsYGRRtWyho2W4DkrQb4pl+KHXUhcR/O8Sgd1FIeGtrRfPUBdoUw==
+"@pubsweet/ui-toolkit@^2.0.0", "@pubsweet/ui-toolkit@^2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@pubsweet/ui-toolkit/-/ui-toolkit-2.0.2.tgz#1dc8c7ac31eb53cce345ab85e982c51404f95bf7"
+  integrity sha512-keyBcNfnsXlg2A4wNpJbuYZ6i+rRq+BM0JQfI4qsdvY8yTsHS8Pvwrh752X6GneD80t4UsV0C8yG65mBOulCtQ==
   dependencies:
     color "^3.0.0"
     lodash "^4.17.4"
@@ -254,7 +287,7 @@
     lodash "^4.17.4"
     styled-components "^3.2.5"
 
-"@pubsweet/ui@^8.2.0", "@pubsweet/ui@^8.3.0":
+"@pubsweet/ui@^8.2.0":
   version "8.3.0"
   resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-8.3.0.tgz#b8da7be8d9110594abdd18476e3808c9606a74b4"
   integrity sha512-JEBRKh84TLNlBlXj/teUEHQAxFRpCCRse6OgJecQLRTOUkxCROqywpR+5fkkoDG+dXOJqV91Yq/yPURdhI+otQ==
@@ -279,37 +312,12 @@
     redux-form "^7.0.3"
     styled-components "^3.2.5"
 
-"@pubsweet/ui@^8.6.0":
-  version "8.6.0"
-  resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-8.6.0.tgz#8153cfbd3f2de5b07f04655b6f7b19a7aee5ca1e"
-  integrity sha512-75QFsnNwQ1qms1VxZxb+ewe6jb4cVDWRKnSx57ybjdR41kVRda4najv0Pjreck7WDQ2mQyq3x9/El+mK+mRyYg==
-  dependencies:
-    "@pubsweet/ui-toolkit" "^1.2.0"
-    babel-jest "^21.2.0"
-    classnames "^2.2.5"
-    enzyme "^3.2.0"
-    enzyme-adapter-react-16 "^1.1.1"
-    invariant "^2.2.3"
-    lodash "^4.17.4"
-    moment "^2.22.1"
-    prop-types "^15.5.10"
-    react "^16.2.0"
-    react-dom "^16.2.0"
-    react-feather "^1.0.8"
-    react-redux "^5.0.2"
-    react-router-dom "^4.2.2"
-    react-tag-autocomplete "^5.5.0"
-    recompose "^0.26.0"
-    redux "^3.6.0"
-    redux-form "^7.0.3"
-    styled-components "^3.2.5"
-
-"@pubsweet/ui@^9.0.1":
-  version "9.0.1"
-  resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-9.0.1.tgz#263feecd28b5cd87f8e1ac14a69605a30a21457c"
-  integrity sha512-RQfYF2zLRuinBBHtuGvegnIjc5kj1IzHfFXKCcd219+byj6RH4EQTtThn65jBsN/IDD6mldPwN+HkYWPnI8Pyg==
+"@pubsweet/ui@^9.0.2":
+  version "9.0.2"
+  resolved "https://registry.yarnpkg.com/@pubsweet/ui/-/ui-9.0.2.tgz#b0a2b944b2325a6ec446b2f93fda01acfa3a0b3c"
+  integrity sha512-Vayz5hcxQC2w4V962TgFNG5F5bXWhozeFPLp6KDAi17tqDunQP6bgVb53khLx8eZM43bSGnx8N8osaRe/cOV4A==
   dependencies:
-    "@pubsweet/ui-toolkit" "^2.0.1"
+    "@pubsweet/ui-toolkit" "^2.0.2"
     babel-jest "^21.2.0"
     classnames "^2.2.5"
     enzyme "^3.7.0"
@@ -687,6 +695,13 @@ apollo-link-http@^1.5.4:
     apollo-link "^1.2.2"
     apollo-link-http-common "^0.2.4"
 
+apollo-link-ws@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.10.tgz#9fb5489a36f5fcb0d139b6ada0eea979ecad3967"
+  integrity sha512-1Yx4iIUsWS8wuAdVJ2LF+LdIYAsqHSto8eShwJ/d2SovocsMCwN9hyS+JkaOPD/KHAkavTWzN6l3XwSOdOwevQ==
+  dependencies:
+    apollo-link "^1.2.4"
+
 apollo-link@^1.0.0, apollo-link@^1.2.1, apollo-link@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.2.tgz#54c84199b18ac1af8d63553a68ca389c05217a03"
@@ -704,6 +719,14 @@ apollo-link@^1.2.3:
     apollo-utilities "^1.0.0"
     zen-observable-ts "^0.8.10"
 
+apollo-link@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.4.tgz#ab4d21d2e428db848e88b5e8f4adc717b19c954b"
+  integrity sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==
+  dependencies:
+    apollo-utilities "^1.0.0"
+    zen-observable-ts "^0.8.11"
+
 apollo-server-core@^1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.3.2.tgz#f36855a3ebdc2d77b8b9c454380bf1d706105ffc"
@@ -2069,6 +2092,11 @@ bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1:
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
   integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
 
+bluebird@^3.5.2:
+  version "3.5.3"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
+  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
+
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@@ -3026,7 +3054,7 @@ concat-stream@^1.4.10, concat-stream@^1.5.0, concat-stream@^1.6.0:
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
-config@^1.21.0, config@^1.26.2:
+config@^1.26.2:
   version "1.29.4"
   resolved "https://registry.yarnpkg.com/config/-/config-1.29.4.tgz#1b42752ed86b363fc4025960569fd74978862a92"
   integrity sha1-G0J1LthrNj/EAllgVp/XSXiGKpI=
@@ -3343,6 +3371,11 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.3:
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
   integrity sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=
 
+core-js@^2.4.1:
+  version "2.5.7"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+  integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -4009,6 +4042,16 @@ dnd-core@^2.5.4:
     lodash "^4.2.0"
     redux "^3.7.1"
 
+dnd-core@^7.0.2:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-7.0.2.tgz#6c080eb57243fa0372fd083b3db242d9eb525010"
+  integrity sha512-InwRBi6zTndtE3+3nTYpLJkYMEr7utSR7OziAoSFhtQsbUfJE1KeqxM+ZFRIMKn6ehxUTAC+QU6QC7IG9u86Mg==
+  dependencies:
+    asap "^2.0.6"
+    invariant "^2.2.4"
+    lodash "^4.17.11"
+    redux "^4.0.1"
+
 dns-equal@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@@ -5124,6 +5167,11 @@ fb-watchman@^2.0.0:
   dependencies:
     bser "^2.0.0"
 
+fbjs-css-vars@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.1.tgz#836d876e887d702f45610f5ebd2fbeef649527fc"
+  integrity sha512-IM+v/C40MNZWqsLErc32e0TyIk/NhkkQZL0QmjBh6zi1eXv0/GeVKmKmueQX7nn9SXQBQbTUcB8zuexIF3/88w==
+
 fbjs@^0.8.0:
   version "0.8.17"
   resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
@@ -5150,6 +5198,20 @@ fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.5, fbjs@^0.8.9:
     setimmediate "^1.0.5"
     ua-parser-js "^0.7.9"
 
+fbjs@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a"
+  integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==
+  dependencies:
+    core-js "^2.4.1"
+    fbjs-css-vars "^1.0.0"
+    isomorphic-fetch "^2.1.1"
+    loose-envify "^1.0.0"
+    object-assign "^4.1.0"
+    promise "^7.1.1"
+    setimmediate "^1.0.5"
+    ua-parser-js "^0.7.18"
+
 figures@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
@@ -5439,6 +5501,21 @@ formik@1.3.0:
     tslib "^1.9.3"
     warning "^3.0.0"
 
+formik@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/formik/-/formik-1.3.2.tgz#f97b9e71084db4a51f7bde798584c094b3696738"
+  integrity sha512-WzKX8MGfSJTBF97oDDeP2meb2/I1bi1dLdkICmUfPB2KJ9mcdBOmsOPY8cE1cfV25ML3DzLomYsUezH+yedpvQ==
+  dependencies:
+    create-react-context "^0.2.2"
+    deepmerge "^2.1.1"
+    hoist-non-react-statics "^2.5.5"
+    lodash.clonedeep "^4.5.0"
+    lodash.topath "4.5.2"
+    prop-types "^15.6.1"
+    react-fast-compare "^1.0.0"
+    tslib "^1.9.3"
+    warning "^3.0.0"
+
 forwarded@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -5895,6 +5972,11 @@ graphql-subscriptions@^0.5.8:
   dependencies:
     iterall "^1.2.1"
 
+graphql-tag@^2.10.0:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae"
+  integrity sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w==
+
 graphql-tag@^2.7.3:
   version "2.9.1"
   resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.9.1.tgz#1ab090ef7d3518b06d8c97d1393672145fe91587"
@@ -5911,13 +5993,6 @@ graphql-tools@^4.0.0:
     iterall "^1.1.3"
     uuid "^3.1.0"
 
-graphql@^0.13.0:
-  version "0.13.2"
-  resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270"
-  integrity sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==
-  dependencies:
-    iterall "^1.2.1"
-
 graphql@^14.0.2:
   version "14.0.2"
   resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.0.2.tgz#7dded337a4c3fd2d075692323384034b357f5650"
@@ -5925,13 +6000,6 @@ graphql@^14.0.2:
   dependencies:
     iterall "^1.2.2"
 
-grid-styled@5.0.2:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/grid-styled/-/grid-styled-5.0.2.tgz#1e81d7d5bde50a9b43d81cf111b81399126fe595"
-  integrity sha512-kM3kewM77sBifQLZUZD9meoMSXOZE9ArxxM9XZ6qtwb4B2ylHYHH9Ylkt96hDMHA32J+LoEeYoHAvn6+j4fn9Q==
-  dependencies:
-    system-components "^3.0.0"
-
 growly@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -6210,6 +6278,20 @@ hoist-non-react-statics@^2.5.5:
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
   integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
 
+hoist-non-react-statics@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.0.tgz#d21b9fc72b50fdc38c5d88f6e2c52f2c2dbe5ee2"
+  integrity sha512-3IascCRfaEkbmHjJnUxWSspIUE1okLPjGTMVXW8zraUo1t3yg1BadKAxAGILHwgoBzmMnzrgeeaDGBvpuPz6dA==
+  dependencies:
+    react-is "^16.3.2"
+
+hoist-non-react-statics@^3.1.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e"
+  integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw==
+  dependencies:
+    react-is "^16.3.2"
+
 home-or-tmp@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
@@ -6564,7 +6646,7 @@ invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.0, invariant@^2.2.1, invarian
   dependencies:
     loose-envify "^1.0.0"
 
-invariant@^2.2.3:
+invariant@^2.2.3, invariant@^2.2.4:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
   integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -7524,6 +7606,11 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
   integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
 
+"js-tokens@^3.0.0 || ^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
 js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
@@ -8198,6 +8285,11 @@ lodash.flattendeep@^4.4.0:
   resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
   integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=
 
+lodash.flowright@^3.5.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.flowright/-/lodash.flowright-3.5.0.tgz#2b5fff399716d7e7dc5724fe9349f67065184d67"
+  integrity sha1-K1//OZcW1+fcVyT+k0n2cGUYTWc=
+
 lodash.isequal@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
@@ -8268,7 +8360,7 @@ lodash@4.17.5, lodash@^4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
   integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==
 
-lodash@^4.17.0:
+lodash@^4.17.0, lodash@^4.17.11:
   version "4.17.11"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
   integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@@ -8322,6 +8414,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3
   dependencies:
     js-tokens "^3.0.0"
 
+loose-envify@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+  dependencies:
+    js-tokens "^3.0.0 || ^4.0.0"
+
 loud-rejection@^1.0.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
@@ -9913,6 +10012,15 @@ performance-now@^2.1.0:
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
   integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
 
+pg-boss@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/pg-boss/-/pg-boss-3.1.2.tgz#efbe343b0bf01808f3d1d0a158c4bcc969d2776a"
+  integrity sha512-3Mwv2KS1dq4gCwS63IMhd9H2mqhJbjJU2lzxLFXnDzzOitcPy5UdX/UyslMpurkp5wPlV8KXBW1H0iyyExe80Q==
+  dependencies:
+    bluebird "^3.5.2"
+    pg "^7.4.1"
+    uuid "^3.2.1"
+
 pg-connection-string@0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7"
@@ -10696,24 +10804,25 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
-pubsweet-client@^4.0.4:
-  version "4.0.5"
-  resolved "https://registry.yarnpkg.com/pubsweet-client/-/pubsweet-client-4.0.5.tgz#60568218da77a3c7f32071f10f436fb2fa378a4d"
-  integrity sha512-jCcqCpNavDuyTHw/oXxFi2pu8L6T47tgeHKmJ6fQ7fusHZvU1PfrHqs08a4J+4GVoBTGXkW+wweOzzpgIr4y3g==
+pubsweet-client@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/pubsweet-client/-/pubsweet-client-7.0.2.tgz#58a05e8c9a2b5ba28712b3e2efbcd8f21f3fae36"
+  integrity sha512-kI5+S3kDdx7BC8ovWfG4uVJ+e6ct12kWZ52JOmlSlDkUcCxvvGvL9eQ1yP47Ul6blYe4G/6rHa6F96ajceGNCg==
   dependencies:
-    "@pubsweet/ui" "^8.3.0"
-    "@pubsweet/ui-toolkit" "^1.2.0"
+    "@pubsweet/ui" "^9.0.2"
+    "@pubsweet/ui-toolkit" "^2.0.2"
     apollo-cache-inmemory "^1.2.4"
     apollo-client "^2.3.4"
     apollo-link "^1.2.1"
     apollo-link-context "^1.0.5"
     apollo-link-http "^1.5.4"
+    apollo-link-ws "^1.0.8"
     apollo-upload-client "^8.0.0"
     authsome "^0.1.0"
-    config "^1.21.0"
+    config "^2.0.1"
     event-source-polyfill "^0.0.10"
     global "^4.3.1"
-    graphql "^0.13.0"
+    graphql "^14.0.2"
     graphql-tag "^2.7.3"
     isomorphic-fetch "^2.1.1"
     lint-staged "^6.0.0"
@@ -10729,15 +10838,16 @@ pubsweet-client@^4.0.4:
     redux-logger "^3.0.1"
     redux-thunk "^2.2.0"
     reselect "^3.0.1"
-    styled-components "^3.2.5"
-    styled-normalize "^3.0.1"
+    styled-components "^4.1.1"
+    styled-normalize "^8.0.4"
+    subscriptions-transport-ws "^0.9.12"
 
-pubsweet-component-login@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/pubsweet-component-login/-/pubsweet-component-login-1.2.2.tgz#c5f0c0f4355a3f157e000d46852e2bcb3395ab1d"
-  integrity sha512-vQk7VGNI5SEQQmLTLGph9PWT7Am/lrWf7gVs1K0m9dcsWaKYHZ1AeLocMTTMwTa6OAfaWF9Mf8cewZW17dFaIw==
+pubsweet-component-login@^1.2.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/pubsweet-component-login/-/pubsweet-component-login-1.2.3.tgz#4e6046c793c53db806a3ac3b84947c23257da27d"
+  integrity sha512-SzyuDG2Kk4Wrd7dG5cd2dD3pMhExWo/O891cMCqTYRBXJ/Qg2RG7g8/8Dbsolzg45phtQIjCjDRBDLDQK1OMfg==
   dependencies:
-    "@pubsweet/ui" "^9.0.1"
+    "@pubsweet/ui" "^9.0.2"
     formik "1.3.0"
     prop-types "^15.5.10"
     react-redux "^5.0.6"
@@ -10745,10 +10855,10 @@ pubsweet-component-login@^1.2.2:
     react-router-redux "^5.0.0-alpha.9"
     recompose "^0.26.0"
 
-pubsweet-server@10.0.1, pubsweet-server@^10.0.1:
-  version "10.0.1"
-  resolved "https://registry.yarnpkg.com/pubsweet-server/-/pubsweet-server-10.0.1.tgz#ac2ccc0ae1f42f2c97b044be3f90782b11b1d0fa"
-  integrity sha512-hUcOfVAV6rWeohgb93NO5sn414m03cOeKKUaOKxCXqn8CNgFmZQhmogLeEXH+MVbEXsnbpYnEuV0rcuwA0boNQ==
+pubsweet-server@^10.0.0, pubsweet-server@^10.1.3:
+  version "10.1.3"
+  resolved "https://registry.yarnpkg.com/pubsweet-server/-/pubsweet-server-10.1.3.tgz#f3286608ecc2f0280eb459412ff134897ddfaa37"
+  integrity sha512-2DnNJctFFglPfjmLzc+aJAoUsuu5LsDDdocHmo7K8k6QrwHvEa8eFevAAsqezNCFo+NbTVcPEjc53pm4ekAu0Q==
   dependencies:
     "@pubsweet/logger" "^0.2.7"
     apollo-server-express "^1.3.2"
@@ -10780,11 +10890,13 @@ pubsweet-server@10.0.1, pubsweet-server@^10.0.1:
     passport-http-bearer "^1.0.1"
     passport-local "^1.0.0"
     pg "^7.4.1"
+    pg-boss "^3.1.2"
     promise-queue "^2.2.3"
     prompt "^1.0.0"
     pubsweet-sse "^1.0.1"
     subscriptions-transport-ws "^0.9.12"
     uuid "^3.0.1"
+    waait "^1.0.2"
     winston "^2.2.0"
 
 pubsweet-sse@^1.0.1:
@@ -10792,12 +10904,12 @@ pubsweet-sse@^1.0.1:
   resolved "https://registry.yarnpkg.com/pubsweet-sse/-/pubsweet-sse-1.0.1.tgz#675f699213a7c228a448e7c9f272a5a9e7585fcf"
   integrity sha512-A5aDdSI38GmrfUhXc3bjXGExqUEzuzcWdm63Km7ww9KIMFQDnHl06ovap8OAP/+BmqxXvXooxHqqeQ/rhe0l7A==
 
-pubsweet@3.0.6:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/pubsweet/-/pubsweet-3.0.6.tgz#8f2543f8d101cea596be53edf3d559d6bd89a57f"
-  integrity sha512-eJIscLmMvLmZ5+DBsOh9fpMNmXDd1xYtwOHNYty8hMn5pP6+b93EOzXeI+ofoFzdCTVCeAIATWKMAJmzWutOnQ==
+pubsweet@^3.0.0:
+  version "3.0.12"
+  resolved "https://registry.yarnpkg.com/pubsweet/-/pubsweet-3.0.12.tgz#14d3c66ed0199f87e65216d3b8c18c45fe483e5e"
+  integrity sha512-28aGWbLhR5mTgPQIL3WFHr/9MyVikNc2EoOZ2DqzsVJ0KGXisG6ohQc4YtLP+5ORfoIJsoMKOpbjObEYqPAfng==
   dependencies:
-    "@pubsweet/db-manager" "^2.0.6"
+    "@pubsweet/db-manager" "^2.1.2"
     "@pubsweet/logger" "^0.2.7"
     bluebird "^3.5.0"
     colors "^1.1.2"
@@ -10807,7 +10919,7 @@ pubsweet@3.0.6:
     fs-extra "^4.0.2"
     inflection "^1.12.0"
     prompt flatiron/prompt#1c95d1d8d333b5fbc13fa5f0619f3dcf0d514f87
-    pubsweet-server "^10.0.1"
+    pubsweet-server "^10.1.3"
     uuid "^3.0.1"
     webpack "^3.8.1"
     webpack-dev-middleware "^1.12.0"
@@ -10986,6 +11098,18 @@ react-apollo@^2.1.0:
     lodash "4.17.5"
     prop-types "^15.6.0"
 
+react-apollo@^2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-2.3.2.tgz#b8e287d2813722b9e0a886cabf8149ab3b84a3b7"
+  integrity sha512-3lU9iqmj4KMIZvlWWSuLihxMGLEAL6oNmnSTWrb3/mRP36Zy0zJD4rdaonDx4WzqFYQAnUPaOiFnHGp0UQUTwA==
+  dependencies:
+    fbjs "^1.0.0"
+    hoist-non-react-statics "^3.0.0"
+    invariant "^2.2.2"
+    lodash.flowright "^3.5.0"
+    lodash.isequal "^4.5.0"
+    prop-types "^15.6.0"
+
 react-codemirror2@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-5.1.0.tgz#62de4460178adea40eb52eabf7491669bf3794b8"
@@ -11027,6 +11151,14 @@ react-dnd-html5-backend@^2.5.4:
   dependencies:
     lodash "^4.2.0"
 
+react-dnd-html5-backend@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-7.0.2.tgz#f74181ca0ff05be13eb6094629c5ad560f558a7e"
+  integrity sha512-BPhmHeQjvhPXRykHvFLbM+TJFrrarcuf/mIArNEmXzZuNhLfbOnHtMSzR8lPwodABcDAYj7hEF7vTABXX298vA==
+  dependencies:
+    dnd-core "^7.0.2"
+    lodash "^4.17.11"
+
 react-dnd@^2.5.4:
   version "2.5.4"
   resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-2.5.4.tgz#0b6dc5e9d0dfc2909f4f4fe736e5534f3afd1bd9"
@@ -11039,6 +11171,18 @@ react-dnd@^2.5.4:
     lodash "^4.2.0"
     prop-types "^15.5.10"
 
+react-dnd@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-7.0.2.tgz#8f5611a6e877592932c082d6280c64d1c817f420"
+  integrity sha512-nJnHJo/tNQjyod234+hPNopWHPvgH0gujf3pcdJWRe3l0GL+jSXXwXJ2SFwIHkVmxPYrx8+gbKU3+Pq26p6fkg==
+  dependencies:
+    dnd-core "^7.0.2"
+    hoist-non-react-statics "^3.1.0"
+    invariant "^2.1.0"
+    lodash "^4.17.11"
+    recompose "^0.30.0"
+    shallowequal "^1.1.0"
+
 react-docgen-annotation-resolver@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/react-docgen-annotation-resolver/-/react-docgen-annotation-resolver-1.0.0.tgz#abbb343698b3b319537142082b6bb7d835fe2f1f"
@@ -11072,7 +11216,7 @@ react-dom@^15.6.1:
     object-assign "^4.1.0"
     prop-types "^15.5.10"
 
-react-dom@^16.1.0, react-dom@^16.2.0:
+react-dom@^16.2.0:
   version "16.2.0"
   resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
   integrity sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==
@@ -11082,6 +11226,16 @@ react-dom@^16.1.0, react-dom@^16.2.0:
     object-assign "^4.1.1"
     prop-types "^15.6.0"
 
+react-dom@^16.6.0:
+  version "16.6.3"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0"
+  integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==
+  dependencies:
+    loose-envify "^1.1.0"
+    object-assign "^4.1.1"
+    prop-types "^15.6.2"
+    scheduler "^0.11.2"
+
 react-error-overlay@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4"
@@ -11132,7 +11286,7 @@ react-is@^16.3.1:
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22"
   integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==
 
-react-is@^16.6.0:
+react-is@^16.3.2, react-is@^16.6.0:
   version "16.6.3"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0"
   integrity sha512-u7FDWtthB4rWibG/+mFbVd5FvdI20yde86qKGx4lVUTWmPlSWQ4QxbBIrrs+HnXGbxOUlUzTAP/VDmvCwaP2yA==
@@ -11205,7 +11359,7 @@ react-router@^4.2.0:
     prop-types "^15.5.4"
     warning "^3.0.0"
 
-react-styleguidist@^7.0.10, react-styleguidist@^7.2.1:
+react-styleguidist@^7.0.10:
   version "7.2.1"
   resolved "https://registry.yarnpkg.com/react-styleguidist/-/react-styleguidist-7.2.1.tgz#2399b0451a37444931f0550a5a0c2990770bcdd5"
   integrity sha512-QT1v9BEs90Z7Z2+KzYRAbUsGVrkr0NbKOisWS5DED52IRzov83POVEU458gk71Q4Kq0WQ9ETby0qM2IMRT5vIA==
@@ -11311,6 +11465,16 @@ react@^16.4.2:
     object-assign "^4.1.1"
     prop-types "^15.6.0"
 
+react@^16.6.0:
+  version "16.6.3"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c"
+  integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==
+  dependencies:
+    loose-envify "^1.1.0"
+    object-assign "^4.1.1"
+    prop-types "^15.6.2"
+    scheduler "^0.11.2"
+
 read-cmd-shim@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
@@ -11555,7 +11719,7 @@ redux-form@^7.0.3:
     lodash-es "^4.17.3"
     prop-types "^15.5.9"
 
-redux-logger@^3.0.1:
+redux-logger@^3.0.1, redux-logger@^3.0.6:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf"
   integrity sha1-91VZZvMJjzyIYExEnPC69XeCdL8=
@@ -11577,6 +11741,14 @@ redux@^3.6.0, redux@^3.7.1:
     loose-envify "^1.1.0"
     symbol-observable "^1.0.3"
 
+redux@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5"
+  integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==
+  dependencies:
+    loose-envify "^1.4.0"
+    symbol-observable "^1.2.0"
+
 referrer-policy@1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79"
@@ -12181,6 +12353,14 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1:
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
+scheduler@^0.11.2:
+  version "0.11.3"
+  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b"
+  integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ==
+  dependencies:
+    loose-envify "^1.1.0"
+    object-assign "^4.1.1"
+
 schema-utils@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
@@ -12369,6 +12549,11 @@ shallow-clone@^1.0.0:
     kind-of "^5.0.0"
     mixin-object "^2.0.1"
 
+shallowequal@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+  integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
+
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -12972,22 +13157,7 @@ styled-components@^3.2.5:
     stylis-rule-sheet "^0.0.10"
     supports-color "^3.2.3"
 
-styled-components@^3.4.2:
-  version "3.4.2"
-  resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.4.2.tgz#8f518419932327e47fe9144824e3184b3e2da95d"
-  integrity sha512-eTmIiWstyDLccHZAyp+aCPirlkTvYiHlYGgWQxOYDv8Ko0o6mfnDo0+DnUnKinO8NzAfQXEDP7Bh0qlazwJgrw==
-  dependencies:
-    buffer "^5.0.3"
-    css-to-react-native "^2.0.3"
-    fbjs "^0.8.16"
-    hoist-non-react-statics "^2.5.0"
-    prop-types "^15.5.4"
-    react-is "^16.3.1"
-    stylis "^3.5.0"
-    stylis-rule-sheet "^0.0.10"
-    supports-color "^3.2.3"
-
-styled-components@^4.1.1:
+styled-components@^4.1.0, styled-components@^4.1.1, styled-components@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.1.2.tgz#f8a685e3b2bcd03c5beac7f2c02bb6ad237da9b3"
   integrity sha512-NdvWatJ2WLqZxAvto+oH0k7GAC/TlAUJTrHoXJddjbCrU6U23EmVbb9LXJBF+d6q6hH+g9nQYOWYPUeX/Vlc2w==
@@ -13003,17 +13173,10 @@ styled-components@^4.1.1:
     stylis-rule-sheet "^0.0.10"
     supports-color "^5.5.0"
 
-styled-normalize@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/styled-normalize/-/styled-normalize-3.0.1.tgz#217efb96598690addd04699ca71af0db3473fea2"
-  integrity sha512-EtTwCJDKMoJ+GU0YxklkHukltPGz7Swfq/fKyeP/WEQGF01DXGVXmuo1Rp2kMTQ9kz7o6dVBvvmT+KQyKe8Okw==
-
-styled-system@^3.0.1:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/styled-system/-/styled-system-3.0.2.tgz#2189a6d829117d212fb6ac8ebc4260fdb75d1109"
-  integrity sha512-1fsnk6JtRZVoPo3515+mvaWdLjCXNN0jHvbSKrrz6niaW9fR1VLsx6VO1SBeZgjWo9dtonMhoyTB3oECAoVtrA==
-  dependencies:
-    prop-types "^15.6.2"
+styled-normalize@^8.0.4:
+  version "8.0.4"
+  resolved "https://registry.yarnpkg.com/styled-normalize/-/styled-normalize-8.0.4.tgz#6a0885dc16c61d88813dab8f5137da928fe0c947"
+  integrity sha512-dXkKPnT+JcpqYnS0iQiBhUCOdheDz9xEm3H+ZARJV7l4WCXmRkwCx20ujkIYfESoYaiefbuX+F+rbtF6Ku5kvA==
 
 stylelint-config-pubsweet@^0.0.3:
   version "0.0.3"
@@ -13210,7 +13373,7 @@ symbol-observable@^0.2.2:
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
   integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=
 
-symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0:
+symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
   integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
@@ -13220,13 +13383,6 @@ symbol-tree@^3.2.2:
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
   integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=
 
-system-components@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/system-components/-/system-components-3.0.0.tgz#073e7c6712012c3c17375bae3ae986cb81866347"
-  integrity sha512-97jmSbZlDE6BBygRz72bU4hlSaJH15ypm7ZRWvdRp6c19XJFlnxswKfuaEMx0OKJdRkueF2DRF/rjA/wJ7V/IQ==
-  dependencies:
-    styled-system "^3.0.1"
-
 table@4.0.2, table@^4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
@@ -13994,7 +14150,7 @@ uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
   integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
 
-uuid@^3.3.2:
+uuid@^3.2.1, uuid@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
   integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
@@ -14089,6 +14245,11 @@ w3c-keyname@^1.1.8:
   resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-1.1.8.tgz#4e2219663760fd6535b7a1550f1552d71fc9372c"
   integrity sha512-2HAdug8GTiu3b4NYhssdtY8PXRue3ICnh1IlxvZYl+hiINRq0GfNWei3XOPDg8L0PsxbmYjWVLuLj6BMRR/9vA==
 
+waait@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/waait/-/waait-1.0.2.tgz#c234ed748a032cb7d5e83cb691567c6dc545b37d"
+  integrity sha512-amvD7uRx48U2gXOgzwV7PbcpSy8O3Fect2SqiLbBIVH9Zh0UMnDWckSLnsdKNwq7pvarWnPWrpYad2P3pgmRYw==
+
 walker@~1.0.5:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
@@ -14715,6 +14876,13 @@ zen-observable-ts@^0.8.10:
   dependencies:
     zen-observable "^0.8.0"
 
+zen-observable-ts@^0.8.11:
+  version "0.8.11"
+  resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz#d54a27cd17dc4b4bb6bd008e5c096af7fcb068a9"
+  integrity sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==
+  dependencies:
+    zen-observable "^0.8.0"
+
 zen-observable-ts@^0.8.9:
   version "0.8.9"
   resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.9.tgz#d3c97af08c0afdca37ebcadf7cc3ee96bda9bab1"