diff --git a/app/components/Admin/Blogpost.jsx b/app/components/Admin/Blogpost.jsx
index 91f82743023fe2e7a0f6bcea38b711d9f3930a7a..8de2022e790d44b8f073f694ae67d28406b2c1ae 100644
--- a/app/components/Admin/Blogpost.jsx
+++ b/app/components/Admin/Blogpost.jsx
@@ -3,7 +3,7 @@ import { Button, Row, Col } from 'react-bootstrap'
 import { LinkContainer } from 'react-router-bootstrap'
 
 import TextInput from './TextInput'
-import '../../scss/components/_blogpost'
+import '../../scss/components/Admin/blogpost'
 
 export default class Blogpost extends React.Component {
   constructor (props) {
diff --git a/app/components/Admin/SubstanceEditor.jsx b/app/components/Admin/SubstanceEditor.jsx
deleted file mode 100644
index f89d4594756a52cf96e629457a4bc8334ad70667..0000000000000000000000000000000000000000
--- a/app/components/Admin/SubstanceEditor.jsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import React from 'react'
-import LensWriter from 'lens/ReactLensWriter'
-import { bindActionCreators } from 'redux'
-import { connect } from 'react-redux'
-import * as Actions from '../../actions'
-import _ from 'lodash'
-
-// Styles
-import '../../../node_modules/lens/styles/lens-writer.scss'
-import '../../scss/components/_substanceEditor'
-
-export default class SubstanceEditor extends React.Component {
-  constructor (props) {
-    super(props)
-    this._onSave = this._onSave.bind(this)
-  }
-
-  _onSave (content, callback) {
-    let fragment = Object.assign(this.props.fragment, {
-      source: content,
-      presentation: content
-    })
-    this.props.actions.updateFragment(fragment)
-    callback(null, content)
-  }
-
-  _onFileUpload (file, callback) {
-    return callback(null, null)
-  }
-
-  render () {
-    let editor
-    let content
-    if (this.props.fragment.source === '') {
-      content = '<article xmlns="http://substance.io/science-article/0.1.0" lang="en"><metadata><title>' +
-      this.props.fragment.title + '</title><abstract>hello</abstract></metadata><resources></resources>' +
-      '<body><p id="p1">test</p></body></article>'
-    } else {
-      content = this.props.fragment.source
-    }
-
-    if (this.props.fragment) {
-      editor = <LensWriter
-        content={content}
-        onSave={this._onSave}
-        onFileUpload={this._onFileUpload}
-      />
-    } else {
-      editor = <p>Loading</p>
-    }
-
-    return (
-      <div>
-        {editor}
-      </div>
-    )
-  }
-}
-
-SubstanceEditor.propTypes = {
-  fragment: React.PropTypes.object,
-  actions: React.PropTypes.object
-}
-
-function mapStateToProps (state) {
-  console.log(state)
-  return {
-    fragment: _.find(state.fragments, function (f) {
-      return f._id === state.router.params.id
-    })
-  }
-}
-
-function mapDispatchToProps (dispatch) {
-  return {
-    actions: bindActionCreators(Actions, dispatch)
-  }
-}
-
-export default connect(
-  mapStateToProps,
-  mapDispatchToProps
-)(SubstanceEditor)
diff --git a/app/components/BlogRoll/Blogpost.jsx b/app/components/BlogRoll/Blogpost.jsx
index 80f069958b94ab23ac0ece314f189ea8022eabcc..1b042f2808d5dd23580739b954f463dc2f5bc308 100644
--- a/app/components/BlogRoll/Blogpost.jsx
+++ b/app/components/BlogRoll/Blogpost.jsx
@@ -2,8 +2,6 @@ import React from 'react'
 import { Row, Col } from 'react-bootstrap'
 import { LinkContainer } from 'react-router-bootstrap'
 
-import '../../scss/components/_blogpost'
-
 export default class Blogpost extends React.Component {
   render () {
     const { blogpost } = this.props
diff --git a/app/components/BlogRoll/LensBlogpostSummary.jsx b/app/components/BlogRoll/LensBlogpostSummary.jsx
deleted file mode 100644
index d5e4c6ae3d4afe518553f5ca6f90ed79a281b5a2..0000000000000000000000000000000000000000
--- a/app/components/BlogRoll/LensBlogpostSummary.jsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from 'react'
-import '../../scss/components/_blogpost'
-import { Row, Col } from 'react-bootstrap'
-import { LinkContainer } from 'react-router-bootstrap'
-
-export default class LensBlogpostSummary extends React.Component {
-  render () {
-    const { blogpost } = this.props
-    let summary = blogpost.presentation.match(/<abstract>(.*?)<\/abstract>/)
-    summary = summary[1]
-
-    return (
-      <div className='blogpost'>
-        <Row key={blogpost._id}>
-          <Col xs={12} md={8} mdOffset={2}>
-            <h2>{blogpost.title}</h2>
-            <div dangerouslySetInnerHTML={{__html: summary}}></div>
-            <LinkContainer to={`/${blogpost._id}`}><a>Read more</a></LinkContainer>&nbsp;
-          </Col>
-        </Row>
-      </div>
-    )
-  }
-}
-
-LensBlogpostSummary.propTypes = {
-  blogpost: React.PropTypes.object
-}
diff --git a/app/containers/BlogManager.jsx b/app/containers/Admin/BlogManager.jsx
similarity index 83%
rename from app/containers/BlogManager.jsx
rename to app/containers/Admin/BlogManager.jsx
index d666048074a1ed840c7e9b9a0b659bf3b1675e19..c6497c1a4bbc8414a4c28360f48fd5e6805fbf65 100644
--- a/app/containers/BlogManager.jsx
+++ b/app/containers/Admin/BlogManager.jsx
@@ -1,11 +1,11 @@
 import React from 'react'
 import { Grid } from 'react-bootstrap'
-import BlogpostList from '../components/Admin/BlogpostList'
-import BlogpostCreator from '../components/Admin/BlogpostCreator'
+import BlogpostList from '../../components/Admin/BlogpostList'
+import BlogpostCreator from '../../components/Admin/BlogpostCreator'
 import { bindActionCreators } from 'redux'
 import { connect } from 'react-redux'
-import styles from '../scss/components/_manage'
-import * as Actions from '../actions'
+import styles from '../../scss/components/_manage'
+import * as Actions from '../../actions'
 
 class BlogManager extends React.Component {
   constructor (props) {
diff --git a/app/containers/Admin/EditorWrapper.jsx b/app/containers/Admin/EditorWrapper.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..a76cbd1a0703f79e02e2ad37cf584c90e35b9bf0
--- /dev/null
+++ b/app/containers/Admin/EditorWrapper.jsx
@@ -0,0 +1,64 @@
+import React from 'react'
+import { bindActionCreators } from 'redux'
+import { connect } from 'react-redux'
+import * as Actions from '../../actions'
+import _ from 'lodash'
+
+// Which editor component to import?
+import Editor from 'pubsweet-substance-components/Writer'
+// import Editor from '../../../node_modules/pubsweet-components/QuillEditor'
+
+export default class EditorWrapper extends React.Component {
+  constructor (props) {
+    super(props)
+  }
+
+  fileUpload (file, callback) {
+    return callback(null, null)
+  }
+
+  render () {
+    let editor
+
+    if (this.props.fragment) {
+      editor = <Editor
+        fragment={this.props.fragment}
+        save={this.props.actions.updateFragment}
+        fileUpload={this.fileUpload}
+      />
+    } else {
+      editor = <p>Loading</p>
+    }
+
+    return (
+      <div>
+        {editor}
+      </div>
+    )
+  }
+}
+
+EditorWrapper.propTypes = {
+  fragment: React.PropTypes.object,
+  actions: React.PropTypes.object
+}
+
+function mapStateToProps (state) {
+  console.log(state)
+  return {
+    fragment: _.find(state.fragments, function (f) {
+      return f._id === state.router.params.id
+    })
+  }
+}
+
+function mapDispatchToProps (dispatch) {
+  return {
+    actions: bindActionCreators(Actions, dispatch)
+  }
+}
+
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(EditorWrapper)
diff --git a/app/containers/BlogRoll.jsx b/app/containers/Blog.jsx
similarity index 86%
rename from app/containers/BlogRoll.jsx
rename to app/containers/Blog.jsx
index 8e54caa03d25658a7b214aa6e381e6a40e6106cf..233623d10eb0fec443871c73f57130ae0fc2eaf3 100644
--- a/app/containers/BlogRoll.jsx
+++ b/app/containers/Blog.jsx
@@ -6,9 +6,9 @@ import '../scss/main'
 import * as Actions from '../actions'
 import { bindActionCreators } from 'redux'
 
-import Blogpost from '../components/BlogRoll/LensBlogpostSummary'
+import BlogpostSummary from 'pubsweet-substance-components/Summary'
 
-class BlogRoll extends React.Component {
+class Blog extends React.Component {
   constructor (props) {
     super(props)
     this.props.actions.hydrate()
@@ -17,9 +17,9 @@ class BlogRoll extends React.Component {
   render () {
     var fragments = this.props.fragments.map(function (blogpost) {
       if (blogpost.status === 'published') {
-        return (<Blogpost
+        return (<BlogpostSummary
           key={blogpost._id}
-          blogpost={blogpost}
+          fragment={blogpost}
         />)
       }
     })
@@ -31,7 +31,7 @@ class BlogRoll extends React.Component {
   }
 }
 
-BlogRoll.propTypes = {
+Blog.propTypes = {
   // Data
   collection: React.PropTypes.object,
   fragments: React.PropTypes.array,
@@ -62,4 +62,4 @@ function mapDispatchToProps (dispatch) {
 export default connect(
   mapStateToProps,
   mapDispatchToProps
-)(BlogRoll)
+)(Blog)
diff --git a/app/components/BlogRoll/LensBlogpost.jsx b/app/containers/BlogpostWrapper.jsx
similarity index 77%
rename from app/components/BlogRoll/LensBlogpost.jsx
rename to app/containers/BlogpostWrapper.jsx
index 29bdd7295a4ac5e8d83c29b20a1b88208cd46316..18384c7413eac979b3b93006b83e6f4deb688905 100644
--- a/app/components/BlogRoll/LensBlogpost.jsx
+++ b/app/containers/BlogpostWrapper.jsx
@@ -1,16 +1,15 @@
 import React from 'react'
-import LensReader from 'lens/ReactLensReader'
-import '../../scss/components/_blogpost'
 import _ from 'lodash'
 import { bindActionCreators } from 'redux'
 import { connect } from 'react-redux'
 import { pushState } from 'redux-router'
-import * as Actions from '../../actions'
+import * as Actions from '../actions'
 
-// Styles
-import '../../../node_modules/lens/styles/lens-reader.scss'
+// Which reader to use?
+import Blogpost from 'pubsweet-substance-components/Reader'
+// import Blogpost from 'pubsweet-components/QuillReader'
 
-export default class LensBlogpost extends React.Component {
+class BlogpostWrapper extends React.Component {
   constructor (props) {
     super(props)
     this.props.actions.hydrate()
@@ -22,7 +21,7 @@ export default class LensBlogpost extends React.Component {
     if (blogpost) {
       return (
         <div className='blogpost'>
-          <LensReader content={blogpost.source} />
+          <Blogpost content={blogpost.source} />
         </div>
       )
     } else {
@@ -33,7 +32,7 @@ export default class LensBlogpost extends React.Component {
   }
 }
 
-LensBlogpost.propTypes = {
+BlogpostWrapper.propTypes = {
   // Data
   blogpost: React.PropTypes.object,
   // Injected by React Redux
@@ -64,4 +63,4 @@ function mapDispatchToProps (dispatch) {
 export default connect(
   mapStateToProps,
   mapDispatchToProps
-)(LensBlogpost)
+)(BlogpostWrapper)
diff --git a/app/routes.jsx b/app/routes.jsx
index 16ee657d51fccc936760476b5cf49dd916131518..33a30ae55eb906c7ab080e60f83a2907d82710ed 100644
--- a/app/routes.jsx
+++ b/app/routes.jsx
@@ -4,16 +4,16 @@ import { Route } from 'react-router'
 // Admin
 import Admin from './containers/Admin'
 import About from './components/Admin/About'
-import BlogManager from './containers/BlogManager'
-import Editor from './components/Admin/SubstanceEditor'
+import BlogManager from './containers/Admin/BlogManager'
+import Editor from './containers/Admin/EditorWrapper'
 
 // Public
-import BlogRoll from './containers/BlogRoll'
-import Blogpost from './components/BlogRoll/LensBlogpost'
+import Blog from './containers/Blog'
+import Blogpost from './containers/BlogpostWrapper'
 
 export default (
   <Route>
-    <Route path='/' component={BlogRoll}/>
+    <Route path='/' component={Blog}/>
     <Route path='/admin' component={Admin}>
       <Route path='manager' component={BlogManager} />
       <Route path='editor/:id' component={Editor} />
diff --git a/app/scss/components/Admin/blogpost.scss b/app/scss/components/Admin/blogpost.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/scss/components/_blogpost.scss b/app/scss/components/_blogpost.scss
deleted file mode 100644
index 38886c96d0bb9613e5154d55b23a70afa10cc5b8..0000000000000000000000000000000000000000
--- a/app/scss/components/_blogpost.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.blogpost {
-  padding-bottom: 2em;
-}
diff --git a/app/scss/components/_substanceEditor.scss b/app/scss/components/_substanceEditor.scss
deleted file mode 100644
index 0780f1ac047ed9926379d93e13fd714da16d6b12..0000000000000000000000000000000000000000
--- a/app/scss/components/_substanceEditor.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-// .content-tools-component, .le-main, .le-workspace, .lc-writer {
-//   top: 52px;
-// }
-
-// .content-panel-component {
-//   top: 92px;
-// }
-
-// .panel-content-inner {
-//   z-index: 2;
-// }
-
-// .toc-panel-component, .le-resource {
-//   top: 92px;
-// }
-
-.lc-writer {
-  top: 52px;
-}
diff --git a/package.json b/package.json
index 24c456cd96a78392346ca75ca933059ef678460a..79daaf90d0a9db95651ad6b024a84ec2461ef31b 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,6 @@
     "react-bootstrap": "^0.25.100-react-pre.1",
     "react-dom": "^0.14.0-rc1",
     "react-helmet": "^1.0.1",
-    "react-quill": "jure/react-quill",
     "react-router": "^1.0.0-rc3",
     "react-router-bootstrap": "^0.19.0",
     "react-redux": "^4.0.0",
@@ -49,9 +48,7 @@
     "serve-favicon": "~2.3.0",
     "style-loader": "^0.12.3",
     "script-loader": "^0.6.1",
-    "lens": "substance/lens#969d3f0f1c1b13361317986ea91cc5dfc1073748",
-    "trix": "^0.9.0",
-    "simplemde": "^1.8.0",
+    "pubsweet-substance-components": "file:../substance-components",
     "webpack": "^1.12.2",
     "pouchdb": "^5.0.0",
     "leveldown": "^1.4.1",
diff --git a/webpack/webpack.dev.config.js b/webpack/webpack.dev.config.js
index f15236518b8b97e8f175fba0f6942f0fb06b87bd..b0609e0175b33c6deddfd3dffb5cd57018fa083a 100644
--- a/webpack/webpack.dev.config.js
+++ b/webpack/webpack.dev.config.js
@@ -8,6 +8,8 @@ var publicPath = 'http://localhost:3001/assets/'
 var WEBPACK_HOST = 'localhost'
 var WEBPACK_PORT = 3001
 
+// We're including JSX components from our components package,
+// but excluding its node_modules.
 var commonLoaders = [
   {
     test: /\.js$|\.jsx$/,
@@ -15,7 +17,20 @@ var commonLoaders = [
     include: [
       path.join(__dirname, '..', 'app'),
       path.join(__dirname, '..', 'routes'),
-      path.join(__dirname, '..', 'app.js')
+      path.join(__dirname, '..', 'app.js'),
+      path.join(__dirname,
+        '..',
+        'node_modules',
+        'pubsweet-substance-components'
+      )
+    ],
+    exclude: [
+      path.join(__dirname,
+        '..',
+        'node_modules',
+        'pubsweet-substance-components',
+        'node_modules'
+      )
     ]
   },
   { test: /\.png$/, loader: 'url-loader' },
@@ -47,7 +62,7 @@ module.exports = [
       // The output path from the view of the Javascript
       publicPath: publicPath
     },
-    devtool: 'eval-source-map',
+    devtool: 'inline-source-map',
     module: {
       preLoaders: [{
         test: /\.js$|\.jsx$/,