diff --git a/opentech/news/migrations/0003_newspageauthor.py b/opentech/news/migrations/0003_newspageauthor.py
new file mode 100644
index 0000000000000000000000000000000000000000..e6835c505ddb98c98100f9301074413194dd4477
--- /dev/null
+++ b/opentech/news/migrations/0003_newspageauthor.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.8 on 2018-01-08 12:05
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import modelcluster.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('wagtailcore', '0040_page_draft_title'),
+        ('news', '0002_add_header_image'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='NewsPageAuthor',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('sort_order', models.IntegerField(blank=True, editable=False, null=True)),
+                ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailcore.Page')),
+                ('source_page', modelcluster.fields.ParentalKey(on_delete=django.db.models.deletion.CASCADE, related_name='authors', to='news.NewsPage')),
+            ],
+            options={
+                'ordering': ['sort_order'],
+                'abstract': False,
+            },
+        ),
+    ]
diff --git a/opentech/news/models.py b/opentech/news/models.py
index 978efefa0e2dbdbea2fb2d94920385a9be667155..7210cdbcd89f7d640692d301787bcc58bd6f5b62 100644
--- a/opentech/news/models.py
+++ b/opentech/news/models.py
@@ -5,9 +5,13 @@ from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
 
 from modelcluster.fields import ParentalKey
 
+from wagtail.wagtailcore.models import Orderable
 from wagtail.wagtailcore.fields import StreamField
 from wagtail.wagtailadmin.edit_handlers import (
-    StreamFieldPanel, FieldPanel, InlinePanel
+    InlinePanel,
+    FieldPanel,
+    PageChooserPanel,
+    StreamFieldPanel,
 )
 from wagtail.wagtailsearch import index
 
@@ -48,6 +52,24 @@ class NewsPageRelatedPage(RelatedPage):
     )
 
 
+class NewsPageAuthor(Orderable):
+    source_page = ParentalKey(
+        'news.NewsPage',
+        related_name='authors'
+    )
+    author = models.ForeignKey(
+        'wagtailcore.Page',
+        null=True,
+        blank=True,
+        on_delete=models.SET_NULL,
+        related_name='+',
+    )
+
+    panels = [
+        PageChooserPanel('author', 'people.PersonPage')
+    ]
+
+
 class NewsPage(BasePage):
     subpage_types = []
     parent_page_types = ['NewsIndex']
@@ -68,6 +90,7 @@ class NewsPage(BasePage):
 
     content_panels = BasePage.content_panels + [
         FieldPanel('publication_date'),
+        InlinePanel('authors', label="Authors"),
         FieldPanel('introduction'),
         StreamFieldPanel('body'),
         InlinePanel('news_types', label="News types"),
diff --git a/opentech/news/templates/news/news_page.html b/opentech/news/templates/news/news_page.html
index 1fe1d6b8940c65abc199b8d1e8be82f11531ba7c..c51afac6c3058dc158e471f09b033ff3592bfa21 100644
--- a/opentech/news/templates/news/news_page.html
+++ b/opentech/news/templates/news/news_page.html
@@ -5,6 +5,11 @@
 <div class="wrapper wrapper--small">
 
     <h1>{{ page.title }}</h1>
+
+    {% for author in page.authors.all %}
+        <p><a href="{% pageurl author.author %}">{{ author.author }}</a><p>
+    {% endfor %}
+
     <p>{{ page.introduction }}</p>
 
     <section class="main-body">