diff --git a/packages/component-aws-ses/index.js b/packages/component-aws-ses/index.js
deleted file mode 100644
index b54639e30fd890a999ba73bcf5ab581788aeaa82..0000000000000000000000000000000000000000
--- a/packages/component-aws-ses/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('dotenv').config()
-
-module.exports = require('./src/EmailBackend')
diff --git a/packages/component-aws-ses/src/EmailBackend.js b/packages/component-aws-ses/src/EmailBackend.js
deleted file mode 100644
index 5c8682c9d4356ae6e24e0eea80b8985483bd20d4..0000000000000000000000000000000000000000
--- a/packages/component-aws-ses/src/EmailBackend.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const nodemailer = require('nodemailer')
-const config = require('config')
-const logger = require('@pubsweet/logger')
-const AWS = require('aws-sdk')
-
-const mailerConfig = config.get('mailer')
-
-module.exports = {
-  sendEmail: (toEmail, subject, textBody, htmlBody) => {
-    const transporter = nodemailer.createTransport({
-      SES: new AWS.SES({
-        secretAccessKey: process.env.AWS_SES_SECRET_KEY,
-        accessKeyId: process.env.AWS_SES_ACCESS_KEY,
-        region: process.env.AWS_SES_REGION,
-      }),
-    })
-    transporter.sendMail(
-      {
-        from: mailerConfig.from,
-        to: toEmail,
-        subject,
-        text: textBody,
-        html: htmlBody,
-      },
-      (err, info) => {
-        if (err) {
-          logger.error(err)
-        }
-        logger.debug(info)
-      },
-    )
-  },
-}
diff --git a/packages/component-mail-service/package.json b/packages/component-mail-service/package.json
index cf598f847e35150270a8612d6bde0a87bae64a66..cb79ab3a4626231243fd6149417cd338d179da7a 100644
--- a/packages/component-mail-service/package.json
+++ b/packages/component-mail-service/package.json
@@ -18,7 +18,7 @@
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
     "pubsweet-server": "^1.0.1",
-    "@pubsweet/component-aws-ses": "^0.1.0"
+    "@pubsweet/component-send-email": "^0.1.0"
   },
   "publishConfig": {
     "access": "public"
diff --git a/packages/component-mail-service/src/Mail.js b/packages/component-mail-service/src/Mail.js
index 42981c188ba0cc72b56f3cd719c26272f3164388..cbcc4b2db8d718ec75fb899025eae7751b70f65b 100644
--- a/packages/component-mail-service/src/Mail.js
+++ b/packages/component-mail-service/src/Mail.js
@@ -1,7 +1,7 @@
 const fs = require('fs')
 const handlebars = require('handlebars')
 const querystring = require('querystring')
-const SES = require('@pubsweet/component-aws-ses')
+const Email = require('@pubsweet/component-send-email')
 const config = require('config')
 
 const resetUrl = config.get('invite-reset-password.url')
@@ -33,7 +33,7 @@ module.exports = {
     const htmlBody = htmlTemplate(replacements)
     const textBody = textTemplate(replacements)
 
-    SES.sendEmail(email, subject, textBody, htmlBody)
+    Email.send(email, subject, textBody, htmlBody)
   },
 }
 
diff --git a/packages/component-aws-ses/.gitignore b/packages/component-send-email/.gitignore
similarity index 100%
rename from packages/component-aws-ses/.gitignore
rename to packages/component-send-email/.gitignore
diff --git a/packages/component-aws-ses/README.md b/packages/component-send-email/README.md
similarity index 100%
rename from packages/component-aws-ses/README.md
rename to packages/component-send-email/README.md
diff --git a/packages/component-send-email/index.js b/packages/component-send-email/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..638be56beb2320e02d60ee4601a570c689d7ba95
--- /dev/null
+++ b/packages/component-send-email/index.js
@@ -0,0 +1,3 @@
+require('dotenv').config()
+
+module.exports = require('./src/SendEmail')
diff --git a/packages/component-aws-ses/package.json b/packages/component-send-email/package.json
similarity index 56%
rename from packages/component-aws-ses/package.json
rename to packages/component-send-email/package.json
index 4ba5168e166742135891dc8ba4373f404b4c7dfc..abbf0d9257e7efe49f3b7a4b13ad1c9e7bbae14f 100644
--- a/packages/component-aws-ses/package.json
+++ b/packages/component-send-email/package.json
@@ -1,5 +1,5 @@
 {
-  "name": "@pubsweet/component-aws-ses",
+  "name": "@pubsweet/component-send-email",
   "version": "0.2.0",
   "description": "xpub aws ses configured for faraday",
   "license": "MIT",
@@ -13,17 +13,9 @@
   "dependencies": {
     "aws-sdk": "^2.185.0",
     "body-parser": "^1.17.2",
-    "node-mocks-http": "^1.6.6",
     "nodemailer": "^4.4.2"
   },
   "peerDependencies": {
-    "@pubsweet/logger": "^0.0.1",
-    "pubsweet": "^1.1.1",
-    "pubsweet-client": "^1.1.1",
-    "pubsweet-server": "^1.0.1"
-  },
-  "devDependencies": {
-    "jest": "^22.1.1",
-    "supertest": "^3.0.0"
+    "@pubsweet/logger": "^0.0.1"
   }
 }
diff --git a/packages/component-send-email/src/SendEmail.js b/packages/component-send-email/src/SendEmail.js
new file mode 100644
index 0000000000000000000000000000000000000000..42dba99b77913f39d78d4d3b78f8ff66a7147b3d
--- /dev/null
+++ b/packages/component-send-email/src/SendEmail.js
@@ -0,0 +1,25 @@
+const nodemailer = require('nodemailer')
+const logger = require('@pubsweet/logger')
+const config = require('./config')
+
+module.exports = {
+  send: (toEmail, subject, textBody, htmlBody) => {
+    const mailerConfig = config.mailer
+    const transporter = nodemailer.createTransport(mailerConfig.transport)
+    transporter.sendMail(
+      {
+        from: mailerConfig.from,
+        to: toEmail,
+        subject,
+        text: textBody,
+        html: htmlBody,
+      },
+      (err, info) => {
+        if (err) {
+          logger.error(err)
+        }
+        logger.debug(info)
+      },
+    )
+  },
+}
diff --git a/packages/component-send-email/src/config.js b/packages/component-send-email/src/config.js
new file mode 100644
index 0000000000000000000000000000000000000000..4a0e2fcec8b011a955002f6a207eba89245f0aba
--- /dev/null
+++ b/packages/component-send-email/src/config.js
@@ -0,0 +1,14 @@
+const AWS = require('aws-sdk')
+
+module.exports = {
+  mailer: {
+    from: process.env.EMAIL_SENDER,
+    transport: {
+      SES: new AWS.SES({
+        accessKeyId: process.env.AWS_SES_ACCESS_KEY,
+        secretAccessKey: process.env.AWS_SES_SECRET_KEY,
+        region: process.env.AWS_SES_REGION,
+      }),
+    },
+  },
+}
diff --git a/packages/components-faraday/src/components/Dashboard/DashboardCard.js b/packages/components-faraday/src/components/Dashboard/DashboardCard.js
index a3fcd76c5fa64844b93750e3b8a422112fb8bba9..12e1a9a94db35e3eff061b9893655f897c30ca3c 100644
--- a/packages/components-faraday/src/components/Dashboard/DashboardCard.js
+++ b/packages/components-faraday/src/components/Dashboard/DashboardCard.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import { get, isEmpty } from 'lodash'
-import styled from 'styled-components'
+import styled, { css } from 'styled-components'
 import { Button, Icon } from '@pubsweet/ui'
 import { compose, getContext } from 'recompose'
 
@@ -118,15 +118,19 @@ const DashboardCard = ({
 export default compose(getContext({ journal: PropTypes.object }))(DashboardCard)
 
 // #region styled-components
+const defaultText = css`
+  color: ${({ theme }) => theme.colorText};
+  font-family: ${({ theme }) => theme.fontReading};
+  font-size: ${({ theme }) => theme.fontSizeBaseSmall};
+`
+
 const PreviewContainer = styled.div`
   display: flex;
   margin-top: 18px;
 `
 
 const AuthorList = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 14px;
+  ${defaultText};
   overflow: hidden;
   text-overflow: ellipsis;
   text-align: left;
@@ -143,9 +147,7 @@ const Authors = styled.div`
   margin-top: 15px;
 
   span:first-child {
-    color: #667080;
-    font-family: Helvetica;
-    font-size: 12px;
+    ${defaultText};
     margin-right: 8px;
     text-align: left;
     text-transform: uppercase;
@@ -153,15 +155,12 @@ const Authors = styled.div`
 `
 
 const ActionButtons = styled(Button)`
+  ${defaultText};
   align-items: center;
-  background-color: #667080;
+  background-color: #${({ theme }) => theme.colorPrimary};
   display: flex;
-  height: 20px;
   padding: 4px 8px;
-  font-family: Helvetica;
-  font-size: 12px;
   text-align: center;
-  color: #ffffff;
 `
 
 const LeftDetails = styled.div`
@@ -186,26 +185,21 @@ const RightDetails = styled.div`
 `
 
 const Label = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 12px;
+  ${defaultText};
   text-align: left;
   text-transform: uppercase;
   width: 150px;
 `
 
 const JournalTitle = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 14px;
+  ${defaultText};
+  font-size: ${({ theme }) => theme.fontSizeHeading6};
   font-weight: bold;
   text-align: left;
 `
 
 const Issue = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 14px;
+  ${defaultText};
   text-align: left;
 `
 
@@ -227,9 +221,7 @@ const ListView = styled.div`
 `
 
 const ManuscriptId = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 12px;
+  ${defaultText};
   margin-left: 8px;
   text-align: left;
   text-decoration: underline;
@@ -237,18 +229,14 @@ const ManuscriptId = styled.span`
 `
 
 const Version = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 13px;
+  ${defaultText};
   text-align: left;
 `
 const Details = styled.div`
   align-items: center;
-  color: #667080;
   cursor: pointer;
   display: flex;
-  font-family: Helvetica;
-  font-size: 14px;
+  ${defaultText};
   margin-left: 8px;
   text-decoration: underline;
   text-align: center;
@@ -259,13 +247,14 @@ const ClickableIcon = styled.div`
   margin: 0 7px;
 
   svg {
-    stroke: ${({ disabled }) => (disabled ? '#eee' : '#667080')};
+    stroke: ${({ disabled, theme }) =>
+      disabled ? theme.colorBackgroundHue : theme.colorPrimary};
   }
 `
 
 const Card = styled.div`
   align-items: center;
-  border: 1px solid #667080;
+  border: ${({ theme }) => theme.borderDefault};
   display: flex;
   flex-direction: column;
   justify-content: flex-start;
@@ -282,7 +271,7 @@ const Right = styled.div`
 `
 
 const Left = styled.div`
-  border-right: 1px solid #667080;
+  border-right: ${({ theme }) => theme.borderDefault};
   display: flex;
   flex-direction: column;
   flex: 5;
@@ -304,10 +293,8 @@ const ManuscriptInfo = styled.div`
 `
 
 const ManuscriptType = styled.div`
-  border: 1px solid #667080;
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 12px;
+  border: ${({ theme }) => theme.borderDefault};
+  ${defaultText};
   font-weight: bold;
   padding: 6px 4px;
   margin-left: 10px;
@@ -316,28 +303,23 @@ const ManuscriptType = styled.div`
 `
 
 const Title = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 18px;
+  ${defaultText};
+  font-size: ${({ theme }) => theme.fontSizeHeading5};
   text-align: left;
 `
 
 const Status = styled.div`
-  border: 1px solid #667080;
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 12px;
+  border: ${({ theme }) => theme.borderDefault};
+  ${defaultText};
   font-weight: bold;
-  text-align: left;
   margin: 0.5em 0;
   padding: 0.2em 0.5em;
+  text-align: left;
   text-transform: uppercase;
 `
 
 const DateField = styled.span`
-  color: #667080;
-  font-family: Helvetica;
-  font-size: 13px;
+  ${defaultText};
   margin: 0 8px;
   text-align: left;
 `
@@ -349,9 +331,7 @@ const ClickableIconContainer = styled.div`
   margin-right: 8px;
 
   span:last-child {
-    color: #667080;
-    font-family: Helvetica;
-    font-size: 14px;
+    ${defaultText};
     margin-left: 8px;
     text-align: left;
     text-decoration: underline;
diff --git a/packages/xpub-faraday/app/theme.js b/packages/xpub-faraday/app/theme.js
index 417964772097fd2979dae7d2684fb2eebd81f01e..767092b519efd992f8215074c90a565f88235414 100644
--- a/packages/xpub-faraday/app/theme.js
+++ b/packages/xpub-faraday/app/theme.js
@@ -26,6 +26,7 @@ const theme = {
 
   gridUnit: '32px', // Base interface space measurement used by elements and typography
 
+  borderDefault: '1px solid #667080',
   borderRadius: '2px', // Radius value applied to borders throughout the user interface
   borderWidth: '1px', // Width value applied to borders
   borderStyle: 'solid', // Style applied to borders (eg. solid, dashed)
diff --git a/packages/xpub-faraday/package.json b/packages/xpub-faraday/package.json
index 5a394862a73771f994ca598581472b3d3677f5eb..b5f745123b8d861d432231839d87cf365a6a1657 100644
--- a/packages/xpub-faraday/package.json
+++ b/packages/xpub-faraday/package.json
@@ -8,12 +8,13 @@
     "url": "https://gitlab.coko.foundation/xpub/xpub"
   },
   "dependencies": {
-    "aws-sdk": "^2.197.0",
-    "@pubsweet/ui": "^2.0.0",
     "@pubsweet/component-aws-s3": "^0.1.1",
+    "@pubsweet/ui": "^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",
     "fs-extra": "^4.0.2",
     "history": "^4.7.2",
@@ -26,16 +27,16 @@
     "pubsweet-client": "^2.1.0",
     "pubsweet-component-ink-backend": "^0.1.1",
     "pubsweet-component-ink-frontend": "^1.0.0",
+    "pubsweet-component-invite": "^0.0.1",
     "pubsweet-component-login": "^1.0.1",
     "pubsweet-component-signup": "^1.0.0",
     "pubsweet-component-xpub-manuscript": "^0.0.2",
     "pubsweet-server": "^1.0.1",
-    "pubsweet-component-invite": "^0.0.1",
     "react": "^16.2.0",
-    "react-dom": "^16.2.0",
-    "react-router-dom": "^4.2.2",
     "react-dnd": "^2.5.4",
     "react-dnd-html5-backend": "^2.5.4",
+    "react-dom": "^16.2.0",
+    "react-router-dom": "^4.2.2",
     "recompose": "^0.26.0",
     "redux": "^3.6.0",
     "redux-form": "^7.0.3",
diff --git a/yarn.lock b/yarn.lock
index 17a9872bc795a46e40d990c3e2a83bfadcf21904..0de9ae2cde82b8f8e7a379139f09d91bd020b0e6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2981,6 +2981,10 @@ deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
+deepmerge@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312"
+
 default-require-extensions@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
@@ -4257,6 +4261,12 @@ flatten@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
 
+flavors@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/flavors/-/flavors-3.3.1.tgz#352baa433b4d6875474509612596ca95b9b7c81d"
+  dependencies:
+    deepmerge "^2.0.1"
+
 flush-write-stream@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
@@ -11717,10 +11727,22 @@ typeface-fira-sans@^0.0.43:
   version "0.0.43"
   resolved "https://registry.yarnpkg.com/typeface-fira-sans/-/typeface-fira-sans-0.0.43.tgz#f9c026ae5b7ad5f1fb727f9947bd1e10e13702e6"
 
+typeface-noto-sans@0.0.54:
+  version "0.0.54"
+  resolved "https://registry.yarnpkg.com/typeface-noto-sans/-/typeface-noto-sans-0.0.54.tgz#16989ef56a5220b0503495ab8c1036f66b517b55"
+
+typeface-noto-serif@0.0.54:
+  version "0.0.54"
+  resolved "https://registry.yarnpkg.com/typeface-noto-serif/-/typeface-noto-serif-0.0.54.tgz#26a552df3557c54f2f0c7f9bdbd28a95c9aab06b"
+
 typeface-open-sans@0.0.35:
   version "0.0.35"
   resolved "https://registry.yarnpkg.com/typeface-open-sans/-/typeface-open-sans-0.0.35.tgz#170dc36bbbd63829c9ea64b991c2b0fd65017708"
 
+typeface-ubuntu-mono@0.0.54:
+  version "0.0.54"
+  resolved "https://registry.yarnpkg.com/typeface-ubuntu-mono/-/typeface-ubuntu-mono-0.0.54.tgz#773582617ff60dc252acbaaeb22880ba7f559fe6"
+
 typeface-vollkorn@^0.0.43:
   version "0.0.43"
   resolved "https://registry.yarnpkg.com/typeface-vollkorn/-/typeface-vollkorn-0.0.43.tgz#4ee1a03f90000b0be3ebd8cac360ee777456465b"