diff --git a/packages/components-faraday/package.json b/packages/components-faraday/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..3d216b81db74a068cc8e59fe5d5a46e3576a31f9
--- /dev/null
+++ b/packages/components-faraday/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "pubsweet-components-faraday",
+  "version": "0.0.1",
+  "main": "src",
+  "license": "MIT",
+  "dependencies": {
+    "@pubsweet/ui": "^0.1.1",
+    "moment": "^2.20.1",
+    "prop-types": "^15.5.10",
+    "react": "^15.6.1",
+    "react-dnd": "^2.5.4",
+    "react-dnd-html5-backend": "^2.5.4",
+    "react-dom": "^15.6.1",
+    "react-router-dom": "^4.2.2",
+    "recompose": "^0.26.0",
+    "redux": "^3.6.0",
+    "redux-form": "^7.0.3"
+  }
+}
diff --git a/packages/components-faraday/src/components/SortableList/README.md b/packages/components-faraday/src/components/SortableList/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/packages/components-faraday/src/components/SortableList/SortableList.js b/packages/components-faraday/src/components/SortableList/SortableList.js
new file mode 100644
index 0000000000000000000000000000000000000000..0d50669039c0331d11c17d961850fb463b9e0592
--- /dev/null
+++ b/packages/components-faraday/src/components/SortableList/SortableList.js
@@ -0,0 +1,132 @@
+import React from 'react'
+import { compose } from 'recompose'
+import { findDOMNode } from 'react-dom'
+import HTML5Backend from 'react-dnd-html5-backend'
+import { DragSource, DropTarget, DragDropContext } from 'react-dnd'
+
+const itemSource = {
+  beginDrag(props) {
+    return { index: props.index }
+  },
+}
+
+const itemTarget = {
+  hover({ moveItem, index }, monitor, component) {
+    const dragIndex = monitor.getItem().index
+    const hoverIndex = index
+
+    // Don't replace items with themselves
+    if (dragIndex === hoverIndex) {
+      return
+    }
+
+    const hoverBoundingRect = findDOMNode(component).getBoundingClientRect() // eslint-disable-line
+    const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2
+    const clientOffset = monitor.getClientOffset()
+    const hoverClientY = clientOffset.y - hoverBoundingRect.top
+
+    if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {
+      return
+    }
+
+    if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {
+      return
+    }
+    if (typeof moveItem === 'function') {
+      moveItem(dragIndex, hoverIndex)
+    }
+    monitor.getItem().index = hoverIndex
+  },
+  drop({ dropItem }) {
+    if (dropItem && typeof dropItem === 'function') dropItem()
+  },
+}
+
+const Item = ({
+  connectDragPreview,
+  connectDragSource,
+  connectDropTarget,
+  listItem,
+  dragHandle,
+  isEditing,
+  ...rest
+}) =>
+  dragHandle
+    ? connectDragPreview(
+        connectDropTarget(
+          <div style={{ flex: 1 }}>
+            {React.createElement(listItem, {
+              ...rest,
+              dragHandle: connectDragSource(
+                <div style={{ display: 'flex' }}>
+                  {React.createElement(dragHandle)}
+                </div>,
+              ),
+            })}
+          </div>,
+        ),
+      )
+    : connectDropTarget(
+        connectDragSource(
+          <div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>,
+        ),
+      )
+
+const DecoratedItem = compose(
+  DropTarget('item', itemTarget, (connect, monitor) => ({
+    connectDropTarget: connect.dropTarget(),
+    isOver: monitor.isOver(),
+  })),
+  DragSource('item', itemSource, (connect, monitor) => ({
+    connectDragSource: connect.dragSource(),
+    connectDragPreview: connect.dragPreview(),
+    isDragging: monitor.isDragging(),
+  })),
+)(Item)
+
+const SortableList = ({
+  items,
+  moveItem,
+  listItem,
+  dragHandle,
+  editItem,
+  ...rest
+}) => {
+  console.log('Sortablelist', rest)
+  return (
+    <div>
+      {items.map((item, i) => (
+        <DecoratedItem
+          dragHandle={dragHandle}
+          index={i}
+          isEditing={rest.editedAuthor !== -1}
+          key={item.name || Math.random()}
+          listItem={listItem}
+          moveItem={moveItem}
+          {...item}
+          {...rest}
+        />
+      ))}
+    </div>
+  )
+}
+
+// helper function for sortable lists
+SortableList.moveItem = (items, dragIndex, hoverIndex) => {
+  if (dragIndex <= hoverIndex) {
+    return [
+      ...items.slice(0, dragIndex),
+      items[hoverIndex],
+      items[dragIndex],
+      ...items.slice(hoverIndex + 1),
+    ]
+  }
+  return [
+    ...items.slice(0, hoverIndex),
+    items[dragIndex],
+    items[hoverIndex],
+    ...items.slice(dragIndex + 1),
+  ]
+}
+
+export default DragDropContext(HTML5Backend)(SortableList)
diff --git a/packages/components-faraday/src/components/index.js b/packages/components-faraday/src/components/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..24c30260c17c0f676b0874076af771db6022f475
--- /dev/null
+++ b/packages/components-faraday/src/components/index.js
@@ -0,0 +1 @@
+export { default as SortableList } from './SortableList/SortableList'
diff --git a/packages/components-faraday/src/index.js b/packages/components-faraday/src/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d52f148e8c8927db1d86494ca404451da5a917d
--- /dev/null
+++ b/packages/components-faraday/src/index.js
@@ -0,0 +1,5 @@
+module.exports = {
+  client: {
+    components: [() => require('./components')],
+  },
+}
diff --git a/packages/components-faraday/webpack.config.js b/packages/components-faraday/webpack.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..4aa149ad2cbf750326137fc79ccd7e7685271ad3
--- /dev/null
+++ b/packages/components-faraday/webpack.config.js
@@ -0,0 +1,3 @@
+const webpackConfig = require('xpub-styleguide/src/webpack-config')
+
+module.exports = webpackConfig(__dirname)