diff --git a/SciPost_v1/settings/base.py b/SciPost_v1/settings/base.py
index 2a1404f88877baba08a8e5633a507329205cda19..8b0c8de82ac6e42c417b7c69e4bfc05c74302037 100644
--- a/SciPost_v1/settings/base.py
+++ b/SciPost_v1/settings/base.py
@@ -226,7 +226,7 @@ TIME_ZONE = 'CET'
 USE_I18N = True
 
 USE_L10N = False
-DATE_FORMAT = 'Y-m-d'
+SHORT_DATE_FORMAT = DATE_FORMAT = 'Y-m-d'
 DATETIME_FORMAT = 'Y-m-d H:i'
 
 USE_TZ = True
diff --git a/comments/templates/partials/comments/comments_list.html b/comments/templates/partials/comments/comments_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..ea3e9ac08e398d5ad273a886e34f42cd4e4f6f0d
--- /dev/null
+++ b/comments/templates/partials/comments/comments_list.html
@@ -0,0 +1,8 @@
+{% if comments %}
+    <ul class="{{ css_class|default:'' }}">
+        {% for comment in comments %}
+            <li><a href="{{ comment.get_absolute_url }}"{% if target_blank %} target="_blank"{% endif %}>{% if comment.is_author_reply %}Author Reply{% else %}Comment{% endif %} by {{ comment.author.get_title_display }} {{ comment.author.user.last_name }} on {{ comment.date_submitted|date:'DATE_FORMAT' }}</a></li>
+            {% include 'partials/comments/comments_list.html' with comments=comment.nested_comments.vetted css_class='m-0 pl-4' %}
+        {% endfor %}
+    </ul>
+{% endif %}
diff --git a/general.py b/general.py
deleted file mode 100644
index 5570b662718dd4458c5d43ddd33f02efb8df178d..0000000000000000000000000000000000000000
--- a/general.py
+++ /dev/null
@@ -1,110 +0,0 @@
-from django.conf.urls import url
-from django.urls import reverse_lazy
-from django.views.generic import TemplateView, RedirectView
-
-from journals import views as journals_views
-
-urlpatterns = [
-    # Journals
-    url(r'^$', journals_views.journals, name='journals'),
-    url(r'scipost_physics', RedirectView.as_view(url=reverse_lazy('scipost:landing_page',
-                                                 args=['SciPostPhys']))),
-    url(r'^journals_terms_and_conditions$',
-        TemplateView.as_view(template_name='journals/journals_terms_and_conditions.html'),
-        name='journals_terms_and_conditions'),
-    url(r'^crossmark_policy$',
-        TemplateView.as_view(template_name='journals/crossmark_policy.html'),
-        name='crossmark_policy'),
-
-    # Editorial and Administrative Workflow
-    url(r'^initiate_publication$',
-        journals_views.initiate_publication,
-        name='initiate_publication'),
-    url(r'^validate_publication$',
-        journals_views.validate_publication,
-        name='validate_publication'),
-    url(r'^mark_first_author/(?P<publication_id>[0-9]+)/(?P<contributor_id>[0-9]+)$',
-        journals_views.mark_first_author,
-        name='mark_first_author'),
-    url(r'^mark_first_author_unregistered/(?P<publication_id>[0-9]+)/(?P<unregistered_author_id>[0-9]+)$',
-        journals_views.mark_first_author_unregistered,
-        name='mark_first_author_unregistered'),
-    url(r'^add_author/(?P<publication_id>[0-9]+)/(?P<contributor_id>[0-9]+)$',
-        journals_views.add_author,
-        name='add_author'),
-    url(r'^add_author/(?P<publication_id>[0-9]+)$',
-        journals_views.add_author,
-        name='add_author'),
-    url(r'^add_unregistered_author/(?P<publication_id>[0-9]+)/(?P<unregistered_author_id>[0-9]+)$',
-        journals_views.add_unregistered_author,
-        name='add_unregistered_author'),
-    url(r'^add_new_unreg_author/(?P<publication_id>[0-9]+)$',
-        journals_views.add_new_unreg_author,
-        name='add_new_unreg_author'),
-    url(r'^manage_metadata/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.manage_metadata,
-        name='manage_metadata'),
-    url(r'^manage_metadata/(?P<issue_doi_label>[a-zA-Z]+.[0-9]+.[0-9]+)$',
-        journals_views.manage_metadata,
-        name='manage_metadata'),
-    url(r'^manage_metadata/$',
-        journals_views.manage_metadata,
-        name='manage_metadata'),
-    url(r'^create_citation_list_metadata/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.create_citation_list_metadata,
-        name='create_citation_list_metadata'),
-    url(r'^create_funding_info_metadata/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.create_funding_info_metadata,
-        name='create_funding_info_metadata'),
-    url(r'^add_associated_grant/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.add_associated_grant,
-        name='add_associated_grant'),
-    url(r'^add_generic_funder/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.add_generic_funder,
-        name='add_generic_funder'),
-    url(r'^create_metadata_xml/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.create_metadata_xml,
-        name='create_metadata_xml'),
-    url(r'^metadata_xml_deposit/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})/(?P<option>[a-z]+)$',
-        journals_views.metadata_xml_deposit,
-        name='metadata_xml_deposit'),
-    url(r'^mark_deposit_success/(?P<deposit_id>[0-9]+)/(?P<success>[0-1])$',
-        journals_views.mark_deposit_success,
-        name='mark_deposit_success'),
-    url(r'^produce_metadata_DOAJ/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.produce_metadata_DOAJ,
-        name='produce_metadata_DOAJ'),
-    url(r'^metadata_DOAJ_deposit/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.metadata_DOAJ_deposit,
-        name='metadata_DOAJ_deposit'),
-    url(r'^mark_doaj_deposit_success/(?P<deposit_id>[0-9]+)/(?P<success>[0-1])$',
-        journals_views.mark_doaj_deposit_success,
-        name='mark_doaj_deposit_success'),
-    url(r'^harvest_citedby_list/$',
-        journals_views.harvest_citedby_list,
-        name='harvest_citedby_list'),
-    url(r'^harvest_citedby_links/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
-        journals_views.harvest_citedby_links,
-        name='harvest_citedby_links'),
-    url(r'^sign_existing_report/(?P<report_id>[0-9]+)$',
-        journals_views.sign_existing_report,
-        name='sign_existing_report'),
-    url(r'^manage_report_metadata/$',
-        journals_views.manage_report_metadata,
-        name='manage_report_metadata'),
-    url(r'^manage_comment_metadata/$',
-        journals_views.manage_comment_metadata,
-        name='manage_comment_metadata'),
-    url(r'^mark_report_doi_needed/(?P<report_id>[0-9]+)/(?P<needed>[0-1])$',
-        journals_views.mark_report_doi_needed,
-        name='mark_report_doi_needed'),
-    url(r'^mark_comment_doi_needed/(?P<comment_id>[0-9]+)/(?P<needed>[0-1])$',
-        journals_views.mark_comment_doi_needed,
-        name='mark_comment_doi_needed'),
-    url(r'^generic_metadata_xml_deposit/(?P<type_of_object>[a-z]+)/(?P<object_id>[0-9]+)$',
-        journals_views.generic_metadata_xml_deposit,
-        name='generic_metadata_xml_deposit'),
-    url(r'^mark_generic_deposit_success/(?P<deposit_id>[0-9]+)/(?P<success>[0-1])$',
-        journals_views.mark_generic_deposit_success,
-        name='mark_generic_deposit_success'),
-]
diff --git a/journals/admin.py b/journals/admin.py
index 1011ffaea461237dfb56b9a384b174c7d80d64da..18468831ac764f2d2ff54862f5052828fb56044f 100644
--- a/journals/admin.py
+++ b/journals/admin.py
@@ -2,18 +2,17 @@ from django.contrib import admin, messages
 from django import forms
 
 from journals.models import UnregisteredAuthor, Journal, Volume, Issue, Publication, \
-    Deposit, DOAJDeposit, GenericDOIDeposit, Reference
+    Deposit, DOAJDeposit, GenericDOIDeposit, Reference, PublicationAuthorsTable
 
 from scipost.models import Contributor
 from submissions.models import Submission
 
-admin.site.register(Reference)
-
 
 class UnregisteredAuthorAdmin(admin.ModelAdmin):
     search_fields = ['last_name']
     ordering = ['last_name']
 
+
 admin.site.register(UnregisteredAuthor, UnregisteredAuthorAdmin)
 
 
@@ -56,15 +55,25 @@ class PublicationAdminForm(forms.ModelForm):
         fields = '__all__'
 
 
+class ReferenceInline(admin.TabularInline):
+    model = Reference
+
+
+class AuthorsInline(admin.TabularInline):
+    model = PublicationAuthorsTable
+    extra = 0
+
+
 class PublicationAdmin(admin.ModelAdmin):
     search_fields = ['title', 'author_list']
     list_display = ['title', 'author_list', 'in_issue', 'doi_string', 'publication_date']
     date_hierarchy = 'publication_date'
     list_filter = ['in_issue']
+    inlines = [AuthorsInline, ReferenceInline]
     form = PublicationAdminForm
 
-admin.site.register(Publication, PublicationAdmin)
 
+admin.site.register(Publication, PublicationAdmin)
 
 
 class DepositAdmin(admin.ModelAdmin):
diff --git a/journals/forms.py b/journals/forms.py
index 12ec2553258242d43497e4b735ba05d325ccb7ad..44462b752ef726690395007f2765d454a0e597fa 100644
--- a/journals/forms.py
+++ b/journals/forms.py
@@ -6,7 +6,7 @@ from django import forms
 from django.forms import BaseModelFormSet, modelformset_factory
 from django.utils import timezone
 
-from .models import UnregisteredAuthor, Issue, Publication, Reference
+from .models import Issue, Publication, Reference, UnregisteredAuthor
 
 from scipost.services import DOICaller
 from submissions.models import Submission
@@ -32,7 +32,7 @@ class ValidatePublicationForm(forms.ModelForm):
 class UnregisteredAuthorForm(forms.ModelForm):
     class Meta:
         model = UnregisteredAuthor
-        fields = ['first_name', 'last_name']
+        fields = ('first_name', 'last_name')
 
 
 class CitationListBibitemsForm(forms.Form):
@@ -113,16 +113,15 @@ class BaseReferenceFormSet(BaseModelFormSet):
                     except KeyError:
                         author_list.append(author['name'])
 
-                if len(author_list) > 3:
-                    authors = author_list[0] + ' et al.'
-                elif len(author_list) == 3:
-                    authors = '{}, {} and {}'.format(
-                        author_list[0], author_list[1], author_list[2])
+                if len(author_list) > 2:
+                    authors = ', '.join(author_list[:-1])
+                    authors += ' and ' + author_list[-1]
                 else:
                     authors = ' and '.join(author_list)
 
                 # Citation
-                citation = '{} <b>{}</b>, {} ({})'.format(
+                citation = '<em>{}</em> {} <b>{}</b>, {} ({})'.format(
+                    caller.data['title'],
                     caller.data['journal'],
                     caller.data['volume'],
                     caller.data['pages'],
@@ -131,16 +130,15 @@ class BaseReferenceFormSet(BaseModelFormSet):
                 self.initial_references.append({
                     'reference_number': cite['key'][3:],
                     'authors': authors,
-                    'title': caller.data['title'],
                     'citation': citation,
-                    'vor': cite['doi'],
-                    'vor_url': 'https://doi.org/{}'.format(cite['doi']),
+                    'identifier': cite['doi'],
+                    'link': 'https://doi.org/{}'.format(cite['doi']),
                 })
             else:
                 self.initial_references.append({
                     'reference_number': cite['key'][3:],
-                    'vor': cite['doi'],
-                    'vor_url': 'https://doi.org/{}'.format(cite['doi']),
+                    'identifier': cite['doi'],
+                    'link': 'https://doi.org/{}'.format(cite['doi']),
                 })
 
         # Add prefill information to the form
@@ -157,10 +155,9 @@ class ReferenceForm(forms.ModelForm):
         fields = [
             'reference_number',
             'authors',
-            'title',
             'citation',
-            'vor',
-            'vor_url',
+            'identifier',
+            'link',
         ]
 
     def __init__(self, *args, **kwargs):
diff --git a/journals/migrations/0007_auto_20180129_1814.py b/journals/migrations/0007_auto_20180129_1814.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4b27d63bcaed2fd792e3958580c5a2938d5c070
--- /dev/null
+++ b/journals/migrations/0007_auto_20180129_1814.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-01-29 17:14
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0006_merge_20180123_2040'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='reference',
+            name='vor',
+            field=models.CharField(blank=True, max_length=128),
+        ),
+        migrations.AlterField(
+            model_name='reference',
+            name='vor_url',
+            field=models.URLField(blank=True),
+        ),
+    ]
diff --git a/journals/migrations/0008_auto_20180203_1229.py b/journals/migrations/0008_auto_20180203_1229.py
new file mode 100644
index 0000000000000000000000000000000000000000..dfe8d465222f55212f57eff4ffd76e3a640072bd
--- /dev/null
+++ b/journals/migrations/0008_auto_20180203_1229.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-03 11:29
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0007_auto_20180129_1814'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='reference',
+            old_name='vor',
+            new_name='identifier',
+        ),
+        migrations.RenameField(
+            model_name='reference',
+            old_name='vor_url',
+            new_name='link',
+        ),
+        migrations.RemoveField(
+            model_name='reference',
+            name='title',
+        ),
+        migrations.AlterField(
+            model_name='reference',
+            name='authors',
+            field=models.CharField(max_length=1028),
+        ),
+        migrations.AlterField(
+            model_name='reference',
+            name='citation',
+            field=models.CharField(blank=True, max_length=1028),
+        ),
+    ]
diff --git a/journals/migrations/0009_auto_20180212_1947.py b/journals/migrations/0009_auto_20180212_1947.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b45ebe54173af16e913f2dc9bbae27edffeec70
--- /dev/null
+++ b/journals/migrations/0009_auto_20180212_1947.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-12 18:47
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0008_auto_20180203_1229'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='publication',
+            old_name='authors',
+            new_name='authors_old',
+        ),
+        migrations.RenameField(
+            model_name='publication',
+            old_name='authors_unregistered',
+            new_name='authors_unregistered_old',
+        ),
+    ]
diff --git a/journals/migrations/0010_auto_20180212_1947.py b/journals/migrations/0010_auto_20180212_1947.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b60b98e106555c74c4a014fb5363a68dc642a8d
--- /dev/null
+++ b/journals/migrations/0010_auto_20180212_1947.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-12 18:47
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0009_auto_20180212_1947'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='publication',
+            name='authors_old',
+            field=models.ManyToManyField(blank=True, related_name='publications_old', to='scipost.Contributor'),
+        ),
+        migrations.AlterField(
+            model_name='publication',
+            name='authors_unregistered_old',
+            field=models.ManyToManyField(blank=True, related_name='publications_old', to='journals.UnregisteredAuthor'),
+        ),
+    ]
diff --git a/journals/migrations/0011_auto_20180212_1950.py b/journals/migrations/0011_auto_20180212_1950.py
new file mode 100644
index 0000000000000000000000000000000000000000..a6003ecac3699d13d09452f5c629a5f212f3c487
--- /dev/null
+++ b/journals/migrations/0011_auto_20180212_1950.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-12 18:50
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0004_auto_20180212_1932'),
+        ('journals', '0010_auto_20180212_1947'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='PublicationAuthorsTable',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('order', models.PositiveSmallIntegerField()),
+                ('contributor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='scipost.Contributor')),
+                ('publication', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='authors', to='journals.Publication')),
+                ('unregistered_author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='journals.UnregisteredAuthor')),
+            ],
+            options={
+                'ordering': ('order',),
+            },
+        ),
+        migrations.AddField(
+            model_name='publication',
+            name='authors_registered',
+            field=models.ManyToManyField(blank=True, related_name='publications', through='journals.PublicationAuthorsTable', to='scipost.Contributor'),
+        ),
+        migrations.AddField(
+            model_name='publication',
+            name='authors_unregistered',
+            field=models.ManyToManyField(blank=True, related_name='publications', through='journals.PublicationAuthorsTable', to='journals.UnregisteredAuthor'),
+        ),
+    ]
diff --git a/journals/migrations/0012_auto_20180212_1950.py b/journals/migrations/0012_auto_20180212_1950.py
new file mode 100644
index 0000000000000000000000000000000000000000..69128e76f801ab5d082083e6c4405eb244bc5042
--- /dev/null
+++ b/journals/migrations/0012_auto_20180212_1950.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-12 18:50
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+def transfer_publication_authors_to_separate_table(apps, schema_editor):
+    Contributor = apps.get_model('scipost', 'Contributor')
+    Publication = apps.get_model('journals', 'Publication')
+    UnregisteredAuthor = apps.get_model('journals', 'UnregisteredAuthor')
+    PublicationAuthorsTable = apps.get_model('journals', 'PublicationAuthorsTable')
+
+    for publication in Publication.objects.all():
+        registered_authors = Contributor.objects.filter(publications_old__id=publication.id)
+        unregistered_authors = UnregisteredAuthor.objects.filter(publications_old__id=publication.id)
+
+        count = 1
+        for author in registered_authors:
+            PublicationAuthorsTable.objects.create(
+                publication=publication,
+                contributor=author,
+                order=count,
+            )
+            count += 1
+
+        for author in unregistered_authors:
+            PublicationAuthorsTable.objects.create(
+                publication=publication,
+                unregistered_author=author,
+                order=count,
+            )
+            count += 1
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('journals', '0011_auto_20180212_1950'),
+    ]
+
+    operations = [
+        migrations.RunPython(transfer_publication_authors_to_separate_table)
+    ]
diff --git a/journals/models.py b/journals/models.py
index 5ca16ad8fe0dbe6dab6e636209d9ff728154e276..41cd2052cc1ad1bdaba0b9852ff8219190edc51e 100644
--- a/journals/models.py
+++ b/journals/models.py
@@ -30,6 +30,46 @@ class UnregisteredAuthor(models.Model):
         return self.last_name + ', ' + self.first_name
 
 
+class PublicationAuthorsTable(models.Model):
+    publication = models.ForeignKey('journals.Publication', related_name='authors')
+    unregistered_author = models.ForeignKey('journals.UnregisteredAuthor', null=True, blank=True,
+                                            related_name='+')
+    contributor = models.ForeignKey('scipost.Contributor', null=True, blank=True, related_name='+')
+    order = models.PositiveSmallIntegerField()
+
+    class Meta:
+        ordering = ('order',)
+
+    def __str__(self):
+        if self.contributor:
+            return str(self.contributor)
+        elif self.unregistered_author:
+            return str(self.unregistered_author)
+
+    def save(self, *args, **kwargs):
+        if not self.order:
+            self.order = self.publication.authors.count() + 1
+        return super().save(*args, **kwargs)
+
+    @property
+    def is_registered(self):
+        return self.contributor is not None
+
+    @property
+    def first_name(self):
+        if self.contributor:
+            return self.contributor.user.first_name
+        if self.unregistered_author:
+            return self.unregistered_author.first_name
+
+    @property
+    def last_name(self):
+        if self.contributor:
+            return self.contributor.user.last_name
+        if self.unregistered_author:
+            return self.unregistered_author.last_name
+
+
 class Journal(models.Model):
     name = models.CharField(max_length=100, choices=SCIPOST_JOURNALS, unique=True)
     doi_label = models.CharField(max_length=200, unique=True, db_index=True,
@@ -240,9 +280,15 @@ class Publication(models.Model):
         models.CharField(max_length=10, choices=SCIPOST_SUBJECT_AREAS), blank=True, null=True)
 
     # Authors
-    authors = models.ManyToManyField('scipost.Contributor', blank=True,
-                                     related_name='publications')
+    authors_registered = models.ManyToManyField('scipost.Contributor', blank=True,
+                                                through='PublicationAuthorsTable',
+                                                through_fields=('publication', 'contributor'),
+                                                related_name='publications')
     authors_unregistered = models.ManyToManyField('journals.UnregisteredAuthor', blank=True,
+                                                  through='PublicationAuthorsTable',
+                                                  through_fields=(
+                                                    'publication',
+                                                    'unregistered_author'),
                                                   related_name='publications')
     first_author = models.ForeignKey('scipost.Contributor', blank=True, null=True,
                                      on_delete=models.CASCADE,
@@ -282,6 +328,12 @@ class Publication(models.Model):
     latest_metadata_update = models.DateTimeField(blank=True, null=True)
     latest_activity = models.DateTimeField(default=timezone.now)
 
+    # Deprecated fields. About to be removed after successful database migration on production.
+    authors_old = models.ManyToManyField('scipost.Contributor', blank=True,
+                                         related_name='publications_old')
+    authors_unregistered_old = models.ManyToManyField('journals.UnregisteredAuthor', blank=True,
+                                                      related_name='publications_old')
+
     objects = PublicationQuerySet.as_manager()
 
     def __str__(self):
@@ -331,12 +383,10 @@ class Reference(models.Model):
     reference_number = models.IntegerField()
     publication = models.ForeignKey('journals.Publication', on_delete=models.CASCADE)
 
-    authors = models.CharField(max_length=512)
-    title = models.CharField(max_length=512)
-    citation = models.CharField(max_length=512, blank=True)
-
-    vor = models.CharField(max_length=128)
-    vor_url = models.URLField()
+    authors = models.CharField(max_length=1028)
+    citation = models.CharField(max_length=1028, blank=True)
+    identifier = models.CharField(blank=True, max_length=128)
+    link = models.URLField(blank=True)
 
     class Meta:
         unique_together = ('reference_number', 'publication')
@@ -344,7 +394,7 @@ class Reference(models.Model):
         default_related_name = 'references'
 
     def __str__(self):
-        return '[{}] {}'.format(self.reference_number, self.publication.doi_label)
+        return '[{}] {}, {}'.format(self.reference_number, self.authors[:30], self.citation[:30])
 
 
 class Deposit(models.Model):
diff --git a/journals/templates/journals/add_author.html b/journals/templates/journals/add_author.html
index ab992648f64fb3493cddf54a540158efd4478983..b49a3a0408821feaf3c8ddcc5ca28cb7e9dc1e94 100644
--- a/journals/templates/journals/add_author.html
+++ b/journals/templates/journals/add_author.html
@@ -29,18 +29,16 @@
 
 <div class="row">
     <div class="col-12">
-      <h3>Current list of authors as contributors:</h3>
+      <h3>Current list of authors</h3>
       <ul>
         {% for author in publication.authors.all %}
-            <li><a href="{% url 'scipost:contributor_info' author.id %}">{{ author.user.first_name }} {{ author.user.last_name }}</a></li>
-        {% empty %}
-            <li>No unregistered authors known.</li>
-        {% endfor %}
-      </ul>
-      <h3>Current list of additional authors (unregistered):</h3>
-      <ul>
-        {% for author in publication.authors_unregistered.all %}
-            <li>{{ author }}</li>
+            <li>
+                {% if author.is_registered %}
+                    <a href="{{ author.contributor.get_absolute_url }}">{{ author.contributor }}</a>
+                {% else %}
+                    {{ author.unregistered_author }}
+                {% endif %}
+            </li>
         {% empty %}
             <li>No unregistered authors known.</li>
         {% endfor %}
@@ -49,54 +47,38 @@
       <br>
       <h2 class="highlight">Add an (unregistered) author</h2>
 
-      <h3>Search for missing author:</h3>
-      <form action="{% url 'journals:add_author' publication.id %}" method="post">
-            {% csrf_token %}
-            {{form|bootstrap}}
+      <h3>Search for missing author</h3>
+      <form method="get">
+            {{ form|bootstrap }}
             <input class="btn btn-primary" type="submit" value="Search">
       </form>
 
       {% if form.has_changed %}
-            <br>
-            <h3 class="mt-2">Identified as contributor:</h3>
-            <ul class="list-group">
+          <br>
+            <h3>Identified as Contributor:</h3>
+            <ul>
               {% for contributor in contributors_found %}
-                  <li class="list-group-item p-2">
-                    <div class="d-block w-100 font-weight-bold">{{ contributor.user.first_name }} {{ contributor.user.last_name }}</div>
-                    <a class="d-block" href="{% url 'journals:add_author' publication_id=publication.id contributor_id=contributor.id %}">Add this Contributor as author of this Publication</a>
+                  <li>
+                    <div class="font-weight-bold">{{ contributor.user.first_name }} {{ contributor.user.last_name }}</div>
+                    <a href="{% url 'journals:add_author' publication_id=publication.id contributor_id=contributor.id %}">Add this Contributor as author of this Publication</a>
                   </li>
               {% empty %}
-                  <span class="text-danger">No Contributor with this name could be identified.</span>
+                  <li><span class="text-danger">No Contributor with this name could be identified.</span></li>
               {% endfor %}
             </ul>
 
-            <h3 class="mt-2">Identified as existing unregistered author:</h3>
-            <ul class="list-group">
-              {% for unreg_auth in unregistered_authors_found %}
-                <li class="list-group-item">
-                    <div class="d-block w-100 font-weight-bold">{{ unreg_auth }}
-                    <a class="d-block" href="{% url 'journals:add_unregistered_author' publication_id=publication.id unregistered_author_id=unreg_auth.id %}">Add this unregistered author as author of this Publication</a>
-                </li>
-                {% empty %}
-                    <span class="text-danger">No UnregisteredAuthor with this name could be found in the database.</span>
-                {% endfor %}
-            </ul>
-
-            <h3 class="mt-3">You can otherwise create an UnregisteredAuthor object instance and link it to this publication:</h3>
-            <form action="{% url 'journals:add_new_unreg_author' publication_id=publication.id %}" method="post">
+            <h3>You can otherwise add the author manually and link it to the publication</h3>
+            <form action="{% url 'journals:add_author' publication_id=publication.id %}" method="post">
                 {% csrf_token %}
-                {{ new_unreg_author_form|bootstrap }}
+                {{ form|bootstrap }}
                 <input class="btn btn-primary" type="submit" value="Add">
             </form>
-
+        <br>
       {% endif %}
-
-      <br>
-      <h3>
-          <a href="{{publication.get_absolute_url}}">Return to the publication's page</a> or to the <a href="{% url 'journals:manage_metadata' %}">metadata management page</a>.
-      </h3>
     </div>
 </div>
 
+<p>Return to the <a href="{{publication.get_absolute_url}}">publication's page</a> or to the <a href="{% url 'journals:manage_metadata' %}">metadata management page</a>.</p>
+
 
 {% endblock content %}
diff --git a/journals/templates/journals/manage_comment_metadata.html b/journals/templates/journals/manage_comment_metadata.html
index efd231d30dac48b5caf5cf6addf0c04f7f0663c8..d51e10289d8b5cf78f7e63ad757bf83667252c82 100644
--- a/journals/templates/journals/manage_comment_metadata.html
+++ b/journals/templates/journals/manage_comment_metadata.html
@@ -48,6 +48,7 @@ event: "focusin"
         <ul>
 	  <li>Mark DOI as <a href="{% url 'journals:mark_comment_doi_needed' comment_id=comment.id needed=1 %}">needed</a> / <a href="{% url 'journals:mark_comment_doi_needed' comment_id=comment.id needed=0 %}">not needed</a></li>
           <li><a href="{% url 'journals:generic_metadata_xml_deposit' type_of_object='comment' object_id=comment.id %}">Create the metadata and deposit it to Crossref</a></li>
+	  <li><a href="{% url 'journals:email_object_made_citable' type_of_object='comment' object_id=comment.id %}">Email comment author: made citable</a>
 	</ul>
 
 	<h2 class="ml-3">Crossref Deposits</h2>
diff --git a/journals/templates/journals/manage_metadata.html b/journals/templates/journals/manage_metadata.html
index 56f960111f3f71caae0111c8e6ca43e3a8150e75..0b0547b47c5be8f52046bbf7b3036ac80089d857 100644
--- a/journals/templates/journals/manage_metadata.html
+++ b/journals/templates/journals/manage_metadata.html
@@ -74,20 +74,11 @@ event: "focusin"
 	<div class="row">
           <div class="col-md-5">
             <ul>
-              <li>Mark the first author (currently: {% if publication.first_author %}{{ publication.first_author }} {% elif publication.first_author_unregistered %}{{ publication.first_author_unregistered }} (unregistered){% endif %})
-                <p>registered authors:</p>
-                <ul>
+              <li>Mark the first author (currently: {% if publication.first_author %}{{ publication.first_author }}{% elif publication.first_author_unregistered %}{{ publication.first_author_unregistered }} (unregistered){% endif %})
+                <ul class="list-unstyled pl-4">
                   {% for author in publication.authors.all %}
                   <li>
-                    <a href="{% url 'journals:mark_first_author' publication_id=publication.id contributor_id=author.id %}">{{ author }}</a>
-                  </li>
-                  {% endfor %}
-                </ul>
-                <p>unregistered authors:</p>
-                <ul>
-                  {% for author_unreg in publication.authors_unregistered.all %}
-                  <li>
-                    <a href="{% url 'journals:mark_first_author_unregistered' publication_id=publication.id unregistered_author_id=author_unreg.id %}">{{ author_unreg }}</a>
+                    {{ author.order }}. <a href="{% url 'journals:mark_first_author' publication_id=publication.id author_object_id=author.id %}">{{ author }}</a>
                   </li>
                   {% endfor %}
                 </ul>
diff --git a/journals/templates/journals/manage_report_metadata.html b/journals/templates/journals/manage_report_metadata.html
index 9d491ccecc3aa31612ba24beca5503d0e33114cf..d3527992536cd500a9f7c344ef0c527634906504 100644
--- a/journals/templates/journals/manage_report_metadata.html
+++ b/journals/templates/journals/manage_report_metadata.html
@@ -63,6 +63,7 @@ event: "focusin"
         <ul>
 	  <li>Mark DOI as <a href="{% url 'journals:mark_report_doi_needed' report_id=report.id needed=1 %}">needed</a> / <a href="{% url 'journals:mark_report_doi_needed' report_id=report.id needed=0 %}">not needed</a></li>
           <li><a href="{% url 'journals:generic_metadata_xml_deposit' type_of_object='report' object_id=report.id %}">Create the metadata and deposit it to Crossref</a></li>
+	  <li><a href="{% url 'journals:email_object_made_citable' type_of_object='report' object_id=report.id %}">Email report author: made citable</a>
 	</ul>
 
 	<h2 class="ml-3">Crossref Deposits</h2>
diff --git a/journals/templates/journals/publication_detail.html b/journals/templates/journals/publication_detail.html
index 67fbaf1ab5263eba5682c59cc0dcf7b7f3dcbcf0..358a8bbca484f3651103a84b22d9df4e010f28b9 100644
--- a/journals/templates/journals/publication_detail.html
+++ b/journals/templates/journals/publication_detail.html
@@ -20,10 +20,11 @@
 
     <meta name="citation_title" content="{{ publication.title }}"/>
     {% for author in publication.authors.all %}
-    <meta name="citation_author" content="{{ author.user.last_name }}, {{ author.user.first_name }}"/>
-    {% endfor %}
-    {% for author in publication.authors_unregistered.all %}
-    <meta name="citation_author" content="{{ author.last_name }}, {{ author.first_name }}"/>
+        {% if author.contributor %}
+            <meta name="citation_author" content="{{ author.contributor.user.last_name }}, {{ author.contributor.user.first_name }}"/>
+        {% elif author.unregistered_author %}
+            <meta name="citation_author" content="{{ author.unregistered_author.last_name }}, {{ author.unregistered_author.first_name }}"/>
+        {% endif %}
     {% endfor %}
     <meta name="citation_doi" content="{{ publication.doi_string }}"/>
     <meta name="citation_publication_date" content="{{ publication.publication_date|date:'Y/m/d' }}"/>
@@ -83,18 +84,21 @@
             <h3>Authors</h3>
             <ul>
                 {% for author in publication.authors.all %}
-                      <li><a href="{{author.get_absolute_url}}">{{ author }}</a></li>
-                {% endfor %}
-                {% for author in publication.authors_unregistered.all %}
-                      <li>{{ author }}</li>
+                    {% if author.is_registered %}
+                        <li><a href="{{ author.contributor.get_absolute_url }}">{{ author.contributor }}</a></li>
+                    {% else %}
+                        <li>{{ author.unregistered_author }}</li>
+                    {% endif %}
                 {% endfor %}
             </ul>
 
-            {% include 'partials/journals/references.html' with publication=publication %}
+
 
             {% if is_edcol_admin %}
                 {# This function is not available for public yet! #}
                 <em>The following is not available for the public yet:</em>
+                {% include 'partials/journals/references.html' with publication=publication %}
+
                 {% if publication.funders_generic.exists %}
                     <h3>Funder{{ publication.funders_generic.count|pluralize }} for this publication:</h3>
                     <ul>
@@ -116,7 +120,7 @@
         </div>
     </div>
 
-    {% if request.user and request.user.contributor in publication.authors.all %}
+    {% if request.user and request.user.contributor in publication.registered_authors.all %}
         <h3>Author actions</h3>
         <ul>
             <li><a href="{% url 'commentaries:comment_on_publication' publication.doi_label %}">Place a comment on this publication</a></li>
@@ -129,29 +133,15 @@
         <div class="col-12">
             <h3>Editorial Administration tools: </h3>
             <ul>
-              <li>Mark the first author (currently: {% if publication.first_author %}{{ publication.first_author }} {% elif publication.first_author_unregistered %}{{ publication.first_author_unregistered }} (unregistered){% endif %})
-                <div class="row">
-                    <div class="col-md-5">
-                      <p>registered authors:</p>
-                      <ul>
-                        {% for author in publication.authors.all %}
-                          <li>
-                            <a href="{% url 'journals:mark_first_author' publication_id=publication.id contributor_id=author.id %}">{{ author }}</a>
-                          </li>
-                        {% endfor %}
-                      </ul>
-                    </div>
-                    <div class="col-md-5">
-                      <p>unregistered authors:</p>
-                      <ul>
-                        {% for author_unreg in publication.authors_unregistered.all %}
-                          <li>
-                            <a href="{% url 'journals:mark_first_author_unregistered' publication_id=publication.id unregistered_author_id=author_unreg.id %}">{{ author_unreg }}</a>
-                          </li>
-                        {% endfor %}
-                      </ul>
-                    </div>
-                </div>
+              <li>
+                  Mark the first author (currently: {% if publication.first_author %}{{ publication.first_author }}{% elif publication.first_author_unregistered %}{{ publication.first_author_unregistered }} (unregistered){% endif %})
+                  <ul class="list-unstyled pl-4">
+                    {% for author in publication.authors.all %}
+                      <li>
+                        {{ author.order }}. <a href="{% url 'journals:mark_first_author' publication_id=publication.id author_object_id=author.id %}">{{ author }}</a>
+                      </li>
+                    {% endfor %}
+                  </ul>
               </li>
               <li><a href="{% url 'journals:add_author' publication.id %}">Add a missing author</a></li>
               <li><a href="{% url 'journals:create_citation_list_metadata' publication.doi_label %}">Create/update citation list metadata</a></li>
diff --git a/journals/templates/partials/journals/references.html b/journals/templates/partials/journals/references.html
index 6467b62ea35106c4f7295bb502a4ac5954e4adac..466487979c9624ab686722b8605e2914baa29769 100644
--- a/journals/templates/partials/journals/references.html
+++ b/journals/templates/partials/journals/references.html
@@ -3,11 +3,27 @@
     <a class="mb-2 d-block" href="javascript:;" data-toggle="toggle" data-target="#reference_list">Click to expand</a>
     <ul class="references" id="reference_list" style="display:none;">
         {% for reference in publication.references.all %}
-            <li>
-                <span class="counter">[{{ reference.reference_number }}]</span>
-                <span class="authors">{{ reference.authors }}</span>,
-                <span class="title">{{ reference.title }}</span>{% if reference.citation %}, <span class="citation">{{ reference.citation|safe }}</span>{% endif %}
-                <span class="doi">doi: <a href="{{ reference.vor_url }}" target="_blank">{{ reference.vor }}</a></span>
+            <li class="mt-1">
+                <div class="d-flex flex-row">
+                    <div class="px-1">
+                        <span class="counter">[{{ reference.reference_number }}]</span>
+                    </div>
+                    <div class="px-1">
+                        <div class="authors">{{ reference.authors }}</div>
+                        {% if reference.citation %}
+                            <div class="citation">{{ reference.citation|safe }}</div>
+                        {% endif %}
+                        <div class="reference">
+                            {% if reference.link and reference.identifier %}
+                                <a href="{{ reference.link }}" target="_blank">{{ reference.identifier }}</a>
+                            {% elif reference.link %}
+                                <a href="{{ reference.link }}" target="_blank">link</a>
+                            {% elif reference.identifier %}
+                                <span>{{ reference.identifier }}</span>
+                            {% endif %}
+                        </div>
+                    </div>
+                </div>
             </li>
         {% endfor %}
     </ul>
diff --git a/journals/urls/general.py b/journals/urls/general.py
index fe28da6578e252e6d3521331a7673122159998ba..c57c961fd9e4985efee6e2e2b7fc310190e2547c 100644
--- a/journals/urls/general.py
+++ b/journals/urls/general.py
@@ -23,24 +23,15 @@ urlpatterns = [
     url(r'^validate_publication$',
         journals_views.validate_publication,
         name='validate_publication'),
-    url(r'^mark_first_author/(?P<publication_id>[0-9]+)/(?P<contributor_id>[0-9]+)$',
+    url(r'^mark_first_author/(?P<publication_id>[0-9]+)/(?P<author_object_id>[0-9]+)$',
         journals_views.mark_first_author,
         name='mark_first_author'),
-    url(r'^mark_first_author_unregistered/(?P<publication_id>[0-9]+)/(?P<unregistered_author_id>[0-9]+)$',
-        journals_views.mark_first_author_unregistered,
-        name='mark_first_author_unregistered'),
     url(r'^add_author/(?P<publication_id>[0-9]+)/(?P<contributor_id>[0-9]+)$',
         journals_views.add_author,
         name='add_author'),
     url(r'^add_author/(?P<publication_id>[0-9]+)$',
         journals_views.add_author,
         name='add_author'),
-    url(r'^add_unregistered_author/(?P<publication_id>[0-9]+)/(?P<unregistered_author_id>[0-9]+)$',
-        journals_views.add_unregistered_author,
-        name='add_unregistered_author'),
-    url(r'^add_new_unreg_author/(?P<publication_id>[0-9]+)$',
-        journals_views.add_new_unreg_author,
-        name='add_new_unreg_author'),
     url(r'^manage_metadata/(?P<doi_label>[a-zA-Z]+.[0-9]+.[0-9]+.[0-9]{3,})$',
         journals_views.manage_metadata,
         name='manage_metadata'),
@@ -109,4 +100,7 @@ urlpatterns = [
     url(r'^mark_generic_deposit_success/(?P<deposit_id>[0-9]+)/(?P<success>[0-1])$',
         journals_views.mark_generic_deposit_success,
         name='mark_generic_deposit_success'),
+    url(r'^email_object_made_citable/(?P<type_of_object>[a-z]+)/(?P<object_id>[0-9]+)$',
+        journals_views.email_object_made_citable,
+        name='email_object_made_citable'),
 ]
diff --git a/journals/utils.py b/journals/utils.py
index e80f921bf073307bae433d1060bcafff19f6f17c..da14da589fed0cdb9713666f5c451ad1c6263108 100644
--- a/journals/utils.py
+++ b/journals/utils.py
@@ -1,12 +1,11 @@
 from django.core.mail import EmailMessage
 
+from common.utils import BaseMailUtil
 
-class JournalUtils(object):
 
-    @classmethod
-    def load(cls, dict):
-        for var_name in dict:
-            setattr(cls, var_name, dict[var_name])
+class JournalUtils(BaseMailUtil):
+    mail_sender = 'edadmin@scipost.org'
+    mail_sender_title = 'SciPost Editorial Admin'
 
     @classmethod
     def send_authors_paper_published_email(cls):
@@ -88,3 +87,17 @@ class JournalUtils(object):
             }
         }
         return md
+
+    @classmethod
+    def email_report_made_citable(cls):
+        """ Requires loading 'report' attribute. """
+        cls._send_mail(cls, 'email_report_made_citable',
+                       [cls._context['report'].author.user.email],
+                       'Report made citable')
+
+    @classmethod
+    def email_comment_made_citable(cls):
+        """ Requires loading 'comment' attribute. """
+        cls._send_mail(cls, 'email_comment_made_citable',
+                       [cls._context['comment'].author.user.email],
+                       'Comment made citable')
diff --git a/journals/views.py b/journals/views.py
index 06edc2905c7199c411b8dce3f7207e9d0adf349d..2456765e8afcf0601a8725e8b6efbec92db10d3d 100644
--- a/journals/views.py
+++ b/journals/views.py
@@ -21,8 +21,8 @@ from django.shortcuts import get_object_or_404, render, redirect
 
 from .exceptions import PaperNumberingError
 from .helpers import paper_nr_string, issue_doi_label_from_doi_label
-from .models import Journal, Issue, Publication, UnregisteredAuthor, Deposit, DOAJDeposit,\
-                    GenericDOIDeposit
+from .models import Journal, Issue, Publication, Deposit, DOAJDeposit,\
+                    GenericDOIDeposit, PublicationAuthorsTable
 from .forms import FundingInfoForm, InitiatePublicationForm, ValidatePublicationForm,\
                    UnregisteredAuthorForm, CreateMetadataXMLForm, CitationListBibitemsForm,\
                    ReferenceFormSet
@@ -246,18 +246,22 @@ def validate_publication(request):
     if validate_publication_form.is_valid():
         publication = validate_publication_form.save()
 
-        # Fill in remaining data
+        # Fill remaining data
         submission = publication.accepted_submission
-        publication.authors.add(*submission.authors.all())
-        if publication.first_author:
-            publication.authors.add(publication.first_author)
         if publication.first_author_unregistered:
-            publication.authors_unregistered.add(publication.first_author_unregistered)
+            PublicationAuthorsTable.objects.create(
+                order=1,
+                publication=publication,
+                unregistered_author=publication.first_author_unregistered)
+
+        for submission_author in submission.authors.all():
+            PublicationAuthorsTable.objects.create(
+                publication=publication, contributor=submission_author)
         publication.authors_claims.add(*submission.authors_claims.all())
         publication.authors_false_claims.add(*submission.authors_false_claims.all())
 
         # Add Institutions to the publication
-        for author in publication.authors.all():
+        for author in publication.authors_registered.all():
             for current_affiliation in author.affiliations.active():
                 publication.institutions.add(current_affiliation.institution)
 
@@ -280,8 +284,8 @@ def validate_publication(request):
         submission.save()
 
         # Update ProductionStream
-        stream = submission.production_stream
-        if stream:
+        if hasattr(submission, 'production_stream'):
+            stream = submission.production_stream
             stream.status = PROOFS_PUBLISHED
             stream.save()
             if request.user.production_user:
@@ -334,25 +338,29 @@ def manage_metadata(request, issue_doi_label=None, doi_label=None):
 
 
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
-@transaction.atomic
-def mark_first_author(request, publication_id, contributor_id):
+def mark_first_author(request, publication_id, author_object_id):
     publication = get_object_or_404(Publication, id=publication_id)
-    contributor = get_object_or_404(Contributor, id=contributor_id)
-    publication.first_author = contributor
-    publication.first_author_unregistered = None
-    publication.save()
-    return redirect(reverse('journals:manage_metadata',
-                            kwargs={'doi_label': publication.doi_label}))
+    author_object = get_object_or_404(publication.authors, id=author_object_id)
 
-
-@permission_required('scipost.can_publish_accepted_submission', return_403=True)
-@transaction.atomic
-def mark_first_author_unregistered(request, publication_id, unregistered_author_id):
-    publication = get_object_or_404(Publication, id=publication_id)
-    unregistered_author = get_object_or_404(UnregisteredAuthor, id=unregistered_author_id)
-    publication.first_author = None
-    publication.first_author_unregistered = unregistered_author
+    # Save explicit relation
+    if author_object.is_registered:
+        publication.first_author = author_object.contributor
+        publication.first_author_unregistered = None
+    else:
+        publication.first_author = None
+        publication.first_author_unregistered = author_object.unregistered_author
     publication.save()
+
+    # Redo ordering
+    author_object.order = 1
+    author_object.save()
+    author_objects = publication.authors.exclude(id=author_object.id)
+    count = 2
+    for author in author_objects:
+        author.order = count
+        author.save()
+        count += 1
+    messages.success(request, 'Marked {} first author'.format(author_object))
     return redirect(reverse('journals:manage_metadata',
                             kwargs={'doi_label': publication.doi_label}))
 
@@ -369,62 +377,37 @@ def add_author(request, publication_id, contributor_id=None, unregistered_author
     publication = get_object_or_404(Publication, id=publication_id)
     if contributor_id:
         contributor = get_object_or_404(Contributor, id=contributor_id)
-        publication.authors.add(contributor)
+        PublicationAuthorsTable.objects.create(contributor=contributor, publication=publication)
         publication.save()
+        messages.success(request, 'Added {} as an author.'.format(contributor))
         return redirect(reverse('journals:manage_metadata',
                                 kwargs={'doi_label': publication.doi_label}))
 
-    if request.method == 'POST':
-        form = UnregisteredAuthorForm(request.POST)
-        if form.is_valid():
-            contributors_found = Contributor.objects.filter(
-                user__last_name__icontains=form.cleaned_data['last_name'])
-            unregistered_authors_found = UnregisteredAuthor.objects.filter(
-                last_name__icontains=form.cleaned_data['last_name'])
-            new_unreg_author_form = UnregisteredAuthorForm(
-                initial={'first_name': form.cleaned_data['first_name'],
-                         'last_name': form.cleaned_data['last_name'], })
-        else:
-            errormessage = 'Please fill in the form properly'
-            return render(request, 'scipost/error.html', context={'errormessage': errormessage})
-    else:
-        form = UnregisteredAuthorForm()
-        contributors_found = None
-        unregistered_authors_found = None
-        new_unreg_author_form = UnregisteredAuthorForm()
-    context = {'publication': publication,
-               'contributors_found': contributors_found,
-               'unregistered_authors_found': unregistered_authors_found,
-               'form': form,
-               'new_unreg_author_form': new_unreg_author_form, }
+    contributors_found = None
+    form = UnregisteredAuthorForm(request.POST or request.GET or None)
+
+    if request.POST and form.is_valid():
+        unregistered_author = form.save()
+        PublicationAuthorsTable.objects.create(
+            publication=publication,
+            unregistered_author=unregistered_author)
+        messages.success(request, 'Added {} as an unregistered author.'.format(
+            unregistered_author
+        ))
+        return redirect(reverse('journals:manage_metadata',
+                                kwargs={'doi_label': publication.doi_label}))
+    elif form.is_valid():
+        contributors_found = Contributor.objects.filter(
+            # user__first_name__icontains=form.cleaned_data['first_name'],
+            user__last_name__icontains=form.cleaned_data['last_name'])
+    context = {
+        'publication': publication,
+        'contributors_found': contributors_found,
+        'form': form,
+    }
     return render(request, 'journals/add_author.html', context)
 
 
-@permission_required('scipost.can_publish_accepted_submission', return_403=True)
-@transaction.atomic
-def add_unregistered_author(request, publication_id, unregistered_author_id):
-    publication = get_object_or_404(Publication, id=publication_id)
-    unregistered_author = get_object_or_404(UnregisteredAuthor, id=unregistered_author_id)
-    publication.authors_unregistered.add(unregistered_author)
-    publication.save()
-    return redirect(reverse('journals:manage_metadata',
-                            kwargs={'doi_label': publication.doi_label}))
-
-
-@permission_required('scipost.can_publish_accepted_submission', return_403=True)
-@transaction.atomic
-def add_new_unreg_author(request, publication_id):
-    publication = get_object_or_404(Publication, id=publication_id)
-    if request.method == 'POST':
-        new_unreg_author_form = UnregisteredAuthorForm(request.POST)
-        if new_unreg_author_form.is_valid():
-            new_unreg_author = new_unreg_author_form.save()
-            publication.authors_unregistered.add(new_unreg_author)
-            return redirect(reverse('journals:manage_metadata',
-                                    kwargs={'doi_label': publication.doi_label}))
-    raise Http404
-
-
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
 @transaction.atomic
 def create_citation_list_metadata(request, doi_label):
@@ -611,40 +594,27 @@ def create_metadata_xml(request, doi_label):
         '</journal_issue>\n'
         '<journal_article publication_type=\'full_text\'>\n'
         '<titles><title>' + publication.title + '</title></titles>\n'
-        '<contributors>\n'
     )
 
     # Precondition: all authors MUST be listed in authors field of publication instance,
     # this to be checked by EdAdmin before publishing.
-    for author in publication.authors.all():
-        if author == publication.first_author:
+    initial['metadata_xml'] += '<contributors>\n'
+    for author_object in publication.authors.all():
+        if author_object.order == 1:
             initial['metadata_xml'] += (
                 '<person_name sequence=\'first\' contributor_role=\'author\'> '
-                '<given_name>' + author.user.first_name + '</given_name> '
-                '<surname>' + author.user.last_name + '</surname> '
+                '<given_name>' + author_object.first_name + '</given_name> '
+                '<surname>' + author_object.last_name + '</surname> '
             )
         else:
             initial['metadata_xml'] += (
                 '<person_name sequence=\'additional\' contributor_role=\'author\'> '
-                '<given_name>' + author.user.first_name + '</given_name> '
-                '<surname>' + author.user.last_name + '</surname> '
+                '<given_name>' + author_object.first_name + '</given_name> '
+                '<surname>' + author_object.last_name + '</surname> '
             )
-        if author.orcid_id:
-            initial['metadata_xml'] += '<ORCID>http://orcid.org/' + author.orcid_id + '</ORCID>'
-        initial['metadata_xml'] += '</person_name>\n'
-
-    for author_unreg in publication.authors_unregistered.all():
-        if author_unreg == publication.first_author_unregistered:
+        if author_object.contributor and author_object.contributor.orcid_id:
             initial['metadata_xml'] += (
-                '<person_name sequence=\'first\' contributor_role=\'author\'> '
-                '<given_name>' + author_unreg.first_name + '</given_name> '
-                '<surname>' + author_unreg.last_name + '</surname> '
-            )
-        else:
-            initial['metadata_xml'] += (
-                '<person_name sequence=\'additional\' contributor_role=\'author\'> '
-                '<given_name>' + author_unreg.first_name + '</given_name> '
-                '<surname>' + author_unreg.last_name + '</surname> '
+                '<ORCID>http://orcid.org/' + author_object.contributor.orcid_id + '</ORCID>'
             )
         initial['metadata_xml'] += '</person_name>\n'
     initial['metadata_xml'] += '</contributors>\n'
@@ -1263,6 +1233,49 @@ def mark_generic_deposit_success(request, deposit_id, success):
         return redirect(reverse('journals:manage_comment_metadata'))
 
 
+@permission_required('scipost.can_publish_accepted_submission', return_403=True)
+def email_object_made_citable(request, **kwargs):
+    """
+    This method sends an email to the author of a Report or a Comment,
+    to notify that the object has been made citable (doi registered).
+    """
+    type_of_object = kwargs['type_of_object']
+    object_id = int(kwargs['object_id'])
+
+    if type_of_object == 'report':
+        _object = get_object_or_404(Report, id=object_id)
+        redirect_to = reverse('journals:manage_report_metadata')
+        publication_citation=None
+        publication_doi=None
+        try:
+            publication=Publication.objects.get(
+                accepted_submission__arxiv_identifier_wo_vn_nr=_object.submission.arxiv_identifier_wo_vn_nr)
+            publication_citation = publication.citation()
+            publication_doi = publication.doi_string
+        except Publication.DoesNotExist:
+            pass
+    elif type_of_object == 'comment':
+        _object = get_object_or_404(Comment, id=object_id)
+        redirect_to = reverse('journals:manage_comment_metadata')
+    else:
+        raise Http404
+
+    if not _object.doi_label:
+        messages.warning(request, 'This object does not have a DOI yet.')
+        return redirect(redirect_to)
+
+    if type_of_object == 'report':
+        JournalUtils.load({'report': _object,
+                           'publication_citation': publication_citation,
+                           'publication_doi': publication_doi})
+        JournalUtils.email_report_made_citable()
+    else:
+        JournalUtils.load({'comment': _object, })
+        JournalUtils.email_comment_made_citable()
+    messages.success(request, 'Email sent')
+    return redirect(redirect_to)
+
+
 ###########
 # Viewing #
 ###########
diff --git a/scipost/forms.py b/scipost/forms.py
index 854726e9340cde25096fd105d51395ddd1ca7ec5..60c748382e617c1bc3a971b3caefdddb3ebb3f63 100644
--- a/scipost/forms.py
+++ b/scipost/forms.py
@@ -121,7 +121,7 @@ class RegistrationForm(forms.Form):
             country=self.cleaned_data['country_of_employment'],
             name=self.cleaned_data['affiliation'],
         )
-        contributor, new = Contributor.objects.get_or_create(**{
+        contributor, __ = Contributor.objects.get_or_create(**{
             'user': user,
             'invitation_key': self.cleaned_data.get('invitation_key', ''),
             'title': self.cleaned_data['title'],
@@ -133,10 +133,6 @@ class RegistrationForm(forms.Form):
             contributor=contributor,
             institution=institution,
         )
-
-        if contributor.activation_key == '':
-            # Seems redundant?
-            contributor.generate_key()
         contributor.save()
         return contributor
 
@@ -188,6 +184,31 @@ class DraftInvitationForm(forms.ModelForm):
         return invitation_type
 
 
+class ContributorsFilterForm(forms.Form):
+    names = forms.CharField(widget=forms.Textarea())
+    include_invitations = forms.BooleanField(required=False, initial=True,
+                                             label='Include invitations in the filter.')
+
+    def filter(self):
+        names_found = []
+        names_not_found = []
+        invitations_found = []
+        r = self.cleaned_data['names'].replace('\r', '\n').split('\n')
+        include_invitations = self.cleaned_data.get('include_invitations', False)
+        for name in r:
+            last_name = name.split(',')[0]
+            if not last_name:
+                continue
+            if Contributor.objects.filter(user__last_name__istartswith=last_name).exists():
+                names_found.append(name)
+            elif include_invitations and RegistrationInvitation.objects.pending_response().filter(
+              last_name__istartswith=last_name).exists():
+                invitations_found.append(name)
+            else:
+                names_not_found.append(name)
+        return names_found, names_not_found, invitations_found
+
+
 class RegistrationInvitationForm(forms.ModelForm):
     cited_in_submission = AutoCompleteSelectField('submissions_lookup', required=False)
     cited_in_publication = AutoCompleteSelectField('publication_lookup', required=False)
@@ -299,7 +320,7 @@ class UpdatePersonalDataForm(forms.ModelForm):
         and changes the orcid_id. It marks all Publications, Reports and Comments
         authors by this Contributor with a deposit_requires_update == True.
         """
-        publications = Publication.objects.filter(authors=self.instance)
+        publications = Publication.objects.filter(authors_registered=self.instance)
         for publication in publications:
             publication.doideposit_needs_updating = True
             publication.save()
diff --git a/scipost/managers.py b/scipost/managers.py
index 5ed6efd72c6b6dd4ee64791308fa36efafb79cfe..72557dcef9879842d124f5960986d443cdc913b0 100644
--- a/scipost/managers.py
+++ b/scipost/managers.py
@@ -49,6 +49,9 @@ class RegistrationInvitationManager(models.Manager):
     def declined(self):
         return self.filter(responded=True, declined=True)
 
+    def pending_response(self):
+        return self.filter(responded=False)
+
     def declined_or_without_response(self):
         return self.filter(Q(responded=True, declined=True) | Q(responded=False))
 
diff --git a/scipost/migrations/0003_auto_20180206_1940.py b/scipost/migrations/0003_auto_20180206_1940.py
new file mode 100644
index 0000000000000000000000000000000000000000..49b00fcebc59e03bb54e71967c6c4965b2fa43d5
--- /dev/null
+++ b/scipost/migrations/0003_auto_20180206_1940.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-06 18:40
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0002_auto_20171229_1435'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contributor',
+            name='user',
+            field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+        ),
+    ]
diff --git a/scipost/migrations/0004_auto_20180212_1932.py b/scipost/migrations/0004_auto_20180212_1932.py
new file mode 100644
index 0000000000000000000000000000000000000000..f7e69e16c0bd73c4f52dec139d09ff200360a64a
--- /dev/null
+++ b/scipost/migrations/0004_auto_20180212_1932.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.4 on 2018-02-12 18:32
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0003_auto_20180206_1940'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='contributor',
+            name='user',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
+        ),
+    ]
diff --git a/scipost/models.py b/scipost/models.py
index 03121a51bf68120856deb74203694cd5482c2fd3..b217d78e78b1c207bbb7cb6aab19ae709dc0438d 100644
--- a/scipost/models.py
+++ b/scipost/models.py
@@ -4,7 +4,8 @@ import random
 import string
 
 from django.core.urlresolvers import reverse
-from django.contrib.auth.models import User
+from django.conf import settings
+from django.contrib.auth import get_user_model
 from django.contrib.postgres.fields import ArrayField
 from django.db import models
 from django.utils import timezone
@@ -14,7 +15,8 @@ from .constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS,\
                        subject_areas_dict, CONTRIBUTOR_STATUS, TITLE_CHOICES,\
                        INVITATION_STYLE, INVITATION_TYPE,\
                        INVITATION_CONTRIBUTOR, INVITATION_FORMAL,\
-                       AUTHORSHIP_CLAIM_PENDING, AUTHORSHIP_CLAIM_STATUS
+                       AUTHORSHIP_CLAIM_PENDING, AUTHORSHIP_CLAIM_STATUS,\
+                       CONTRIBUTOR_NEWLY_REGISTERED
 from .fields import ChoiceArrayField
 from .managers import FellowManager, ContributorQuerySet, RegistrationInvitationManager,\
                       UnavailabilityPeriodManager, AuthorshipClaimQuerySet
@@ -28,7 +30,7 @@ def get_sentinel_user():
     status: "deactivated" and anonymized.
     Fallback user for models relying on Contributor that is being deleted.
     '''
-    user, new = User.objects.get_or_create(username='deleted')
+    user, __ = get_user_model().objects.get_or_create(username='deleted')
     return Contributor.objects.get_or_create(status=-4, user=user)[0]
 
 
@@ -37,11 +39,12 @@ class Contributor(models.Model):
     All *science* users of SciPost are Contributors.
     username, password, email, first_name and last_name are inherited from User.
     """
-    user = models.OneToOneField(User, on_delete=models.PROTECT, unique=True)
+    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, unique=True)
     invitation_key = models.CharField(max_length=40, blank=True)
     activation_key = models.CharField(max_length=40, blank=True)
     key_expires = models.DateTimeField(default=timezone.now)
-    status = models.SmallIntegerField(default=0, choices=CONTRIBUTOR_STATUS)
+    status = models.SmallIntegerField(default=CONTRIBUTOR_NEWLY_REGISTERED,
+                                      choices=CONTRIBUTOR_STATUS)
     title = models.CharField(max_length=4, choices=TITLE_CHOICES)
     discipline = models.CharField(max_length=20, choices=SCIPOST_DISCIPLINES,
                                   default='physics', verbose_name='Main discipline')
@@ -69,7 +72,7 @@ class Contributor(models.Model):
     def save(self, *args, **kwargs):
         if not self.activation_key:
             self.generate_key()
-        super().save(*args, **kwargs)
+        return super().save(*args, **kwargs)
 
     def get_absolute_url(self):
         return reverse('scipost:contributor_info', args=(self.id,))
diff --git a/scipost/static/scipost/assets/css/_list_group.scss b/scipost/static/scipost/assets/css/_list_group.scss
index 6bf5d2d7e491a3d7bcfea4be366bfaa8f00d9884..b598898a08caa9faf14f2f59088a2c2f1045e000 100644
--- a/scipost/static/scipost/assets/css/_list_group.scss
+++ b/scipost/static/scipost/assets/css/_list_group.scss
@@ -42,6 +42,6 @@ ul.references {
     }
     .doi {
         display: block;
-        margin: 0 0 0.2rem 1.5rem;
+        margin: 0 0 0.2rem 2rem;
     }
 }
diff --git a/scipost/static/scipost/assets/js/dynamic_loading.js b/scipost/static/scipost/assets/js/dynamic_loading.js
index f7cd54c7384f91c03420ffc389d6c8b3d4d5907c..8b7d43de70cc45ce5a726183b757d474e181444b 100644
--- a/scipost/static/scipost/assets/js/dynamic_loading.js
+++ b/scipost/static/scipost/assets/js/dynamic_loading.js
@@ -22,7 +22,7 @@ function dynamic_load_tab( target_tab ) {
 
 $(function(){
     // Change `tab` GET parameter for page-reload
-    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+    $('.tab-nav-container.dynamic a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
         dynamic_load_tab( e.target )
     })
     $('[data-toggle="tab"][sp-autoload="true"]').tab('show');
diff --git a/scipost/templates/partials/scipost/personal_page/editorial_actions.html b/scipost/templates/partials/scipost/personal_page/editorial_actions.html
index ffd9844f50aeebf31bc1b66010cab5049542eb23..c614b2e48e939a29a9d7fcfbf319392c95bc6379 100644
--- a/scipost/templates/partials/scipost/personal_page/editorial_actions.html
+++ b/scipost/templates/partials/scipost/personal_page/editorial_actions.html
@@ -21,6 +21,7 @@
                 <li><a href="{% url 'scipost:registration_requests' %}">Awaiting validation</a> ({{ nr_reg_awaiting_validation }})</li>
             {% endif %}
             {% if perms.scipost.can_draft_registration_invitations %}
+                <li><a href="{% url 'scipost:contributors_filter' %}">Contributors filter</a></li>
                 <li><a href="{% url 'scipost:draft_registration_invitation' %}">Draft a Registration Invitation</a></li>
             {% endif %}
             {% if perms.scipost.can_manage_registration_invitations %}
diff --git a/scipost/templates/partials/scipost/personal_page/submissions.html b/scipost/templates/partials/scipost/personal_page/submissions.html
index 0e9c098facb4ad2ada8762c20f92b591de04c308..2af5125f616fa08dae91440a3704a180b2b6e801 100644
--- a/scipost/templates/partials/scipost/personal_page/submissions.html
+++ b/scipost/templates/partials/scipost/personal_page/submissions.html
@@ -21,7 +21,7 @@
     </div>
     <div class="col-12">
         <ul class="list-group list-group-flush">
-            {% for sub in own_submissions %},
+            {% for sub in own_submissions %}
                 <li class="list-group-item">
                     <div class="card-body px-0">
                         {% include 'partials/submissions/submission_card_content.html' with submission=sub %}
diff --git a/scipost/templates/scipost/contributors_filter.html b/scipost/templates/scipost/contributors_filter.html
new file mode 100644
index 0000000000000000000000000000000000000000..12418bd8a252a1be98829df8c4ee790cd806ce2a
--- /dev/null
+++ b/scipost/templates/scipost/contributors_filter.html
@@ -0,0 +1,50 @@
+{% extends 'scipost/_personal_page_base.html' %}
+
+{% load bootstrap %}
+
+{% block pagetitle %}: contributors filter{% endblock pagetitle %}
+
+{% block breadcrumb_items %}
+    {{block.super}}
+    <a href="{% url 'scipost:draft_registration_invitation' %}" class="breadcrumb-item">Draft registration invitation</a>
+    <span class="breadcrumb-item">Contributors filter</span>
+{% endblock %}
+
+{% block content %}
+
+<div class="row">
+    <div class="col-12">
+        <h1 class="highlight">Contributors filter</h1>
+
+        <p>This form can be used to split your list of names into a list of names with registered or already invited Contributors and a list of unknown names according to the current database.</p>
+        <p>Please, for every name use the format <code>{last name}</code> or  <code>{last name}, {first name}</code> and use one name per line.</p>
+
+        <form method="post">
+              {% csrf_token %}
+              {{ form|bootstrap }}
+              <input type="submit" class="btn btn-primary" value="Filter"/>
+        </form>
+    </div>
+</div>
+
+{% if form.is_bound %}
+
+    <hr class="divider">
+    <h2>Filter result</h2>
+    {% if names_not_found %}
+        <h3>New names</h3>
+        <pre class="mb-3"><code>{% for name in names_not_found %}{{ name }}{% if not forloop.last %}<br>{% endif %}{% endfor %}</code></pre>
+    {% endif %}
+
+    {% if names_found %}
+        <h3>Names found in the system</h3>
+        <pre class="mb-3"><code>{% for name in names_found %}{{ name }}{% if not forloop.last %}<br>{% endif %}{% endfor %}</code></pre>
+    {% endif %}
+
+    {% if invitations_found %}
+        <h3>Invitations (pending response) found in database</h3>
+        <pre class="mb-3"><code>{% for name in invitations_found %}{{ name }}{% if not forloop.last %}<br>{% endif %}{% endfor %}</code></pre>
+    {% endif %}
+{% endif %}
+
+{% endblock %}
diff --git a/scipost/templates/scipost/draft_registration_invitation.html b/scipost/templates/scipost/draft_registration_invitation.html
index fe8d1f61f63f3f9364dd233cc4815a3398ea742b..4f8900f25de969cfeed59c63bbccb061a33c4c6d 100644
--- a/scipost/templates/scipost/draft_registration_invitation.html
+++ b/scipost/templates/scipost/draft_registration_invitation.html
@@ -6,7 +6,7 @@
 
 {% block breadcrumb_items %}
     {{block.super}}
-    <span class="breadcrumb-item">Pool</span>
+    <span class="breadcrumb-item">Draft registration invitation</span>
 {% endblock %}
 
 {% block content %}
@@ -35,6 +35,7 @@ $(document).ready(function(){
 <div class="row">
     <div class="col-12">
         <h1 class="highlight">Draft a registration invitation</h1>
+        <p>If you have a list of names you want to check with the current database of users, <a href="{% url 'scipost:contributors_filter' %}">please click here</a>.</p>
     </div>
 </div>
 
@@ -47,8 +48,8 @@ $(document).ready(function(){
 
         <form action="{% url 'scipost:draft_registration_invitation' %}" method="post">
               {% csrf_token %}
-              {{draft_inv_form.media}}
-              {{draft_inv_form|bootstrap}}
+              {{ form.media }}
+              {{ form|bootstrap }}
               <input type="submit" class="btn btn-primary" value="Submit"/>
         </form>
     </div>
@@ -95,6 +96,4 @@ $(document).ready(function(){
     </div>
 </div>
 
-{% include 'scipost/_draft_registration_tables.html' %}
-
 {% endblock %}
diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html
index 07ef2154191f647be2d7e03d1addc02b35542ea6..d76a139812f815609e76571cf0e32d251cc28a70 100644
--- a/scipost/templates/scipost/personal_page.html
+++ b/scipost/templates/scipost/personal_page.html
@@ -40,7 +40,7 @@
 
         <div class="row">
             <div class="col-12">
-                <div class="tab-nav-container">
+                <div class="tab-nav-container dynamic">
                     <div class="tab-nav-inner">
                         <!-- Nav tabs -->
                         <ul class="nav btn-group personal-page-nav" role="tablist">
diff --git a/scipost/templatetags/request_filters.py b/scipost/templatetags/request_filters.py
index d28599705956a345fecefd81acf1492296bc6e14..124ebd9aeae4a9c3852d32ab5bccea0271b8bad5 100644
--- a/scipost/templatetags/request_filters.py
+++ b/scipost/templatetags/request_filters.py
@@ -1,4 +1,8 @@
+import re
+
 from django import template
+from django.core.urlresolvers import reverse, NoReverseMatch
+
 from urllib.parse import urlencode
 
 register = template.Library()
@@ -9,3 +13,15 @@ def url_replace(context, **kwargs):
     query = context['request'].GET.dict()
     query.update(kwargs)
     return urlencode(query)
+
+
+@register.simple_tag(takes_context=True)
+def active(context, pattern_or_urlname):
+    try:
+        pattern = '^' + reverse(pattern_or_urlname)
+    except NoReverseMatch:
+        pattern = pattern_or_urlname
+    path = context['request'].path
+    if re.search(pattern, path):
+        return 'active'
+    return ''
diff --git a/scipost/urls.py b/scipost/urls.py
index 3c8fb02160d11ca9f26401a791166ca34be9bffb..9ab0cf02bef3b221475c65d090119be5b56fd827 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -89,6 +89,7 @@ urlpatterns = [
         views.registration_invitations, name="registration_invitations"),
     url(r'^draft_registration_invitation$',
         views.draft_registration_invitation, name="draft_registration_invitation"),
+    url(r'^contributors_filter$', views.contributors_filter, name="contributors_filter"),
     url(r'^edit_draft_reg_inv/(?P<draft_id>[0-9]+)$',
         views.edit_draft_reg_inv, name="edit_draft_reg_inv"),
     url(r'^map_draft_reg_inv_to_contributor/(?P<draft_id>[0-9]+)/(?P<contributor_id>[0-9]+)$',
diff --git a/scipost/views.py b/scipost/views.py
index 992def46ff62caf21d8143621e142890cefefba7..b9d8656f910498ac50b5d7993d097c7f8b7eb00b 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -36,14 +36,15 @@ from .forms import AuthenticationForm, DraftInvitationForm, UnavailabilityPeriod
                    RegistrationForm, RegistrationInvitationForm, AuthorshipClaimForm,\
                    ModifyPersonalMessageForm, SearchForm, VetRegistrationForm, reg_ref_dict,\
                    UpdatePersonalDataForm, UpdateUserDataForm, PasswordChangeForm,\
-                   EmailGroupMembersForm, EmailParticularForm, SendPrecookedEmailForm
+                   EmailGroupMembersForm, EmailParticularForm, SendPrecookedEmailForm,\
+                   ContributorsFilterForm
 from .utils import Utils, EMAIL_FOOTER, SCIPOST_SUMMARY_FOOTER, SCIPOST_SUMMARY_FOOTER_HTML
 
 from affiliations.forms import AffiliationsFormset
 from colleges.permissions import fellowship_or_admin_required
 from commentaries.models import Commentary
 from comments.models import Comment
-from journals.models import Publication, Journal
+from journals.models import Publication, Journal, PublicationAuthorsTable
 from mails.views import MailEditingSubView
 from news.models import NewsItem
 from submissions.models import Submission, RefereeInvitation,\
@@ -358,9 +359,9 @@ def draft_registration_invitation(request):
     This is similar to the registration_invitations method,
     which is used to complete the invitation process.
     """
-    draft_inv_form = DraftInvitationForm(request.POST or None, current_user=request.user)
-    if draft_inv_form.is_valid():
-        invitation = draft_inv_form.save(commit=False)
+    form = DraftInvitationForm(request.POST or None, current_user=request.user)
+    if form.is_valid():
+        invitation = form.save(commit=False)
         invitation.drafted_by = request.user.contributor
         invitation.save()
 
@@ -369,48 +370,41 @@ def draft_registration_invitation(request):
         messages.success(request, 'Draft invitation saved.')
         return redirect(reverse('scipost:draft_registration_invitation'))
 
-    sent_reg_inv = RegistrationInvitation.objects.filter(responded=False, declined=False)
-    sent_reg_inv_fellows = sent_reg_inv.filter(invitation_type='F').order_by('last_name')
-    sent_reg_inv_contrib = sent_reg_inv.filter(invitation_type='C').order_by('last_name')
-    sent_reg_inv_ref = sent_reg_inv.filter(invitation_type='R').order_by('last_name')
-    sent_reg_inv_cited_sub = sent_reg_inv.filter(invitation_type='ci').order_by('last_name')
-    sent_reg_inv_cited_pub = sent_reg_inv.filter(invitation_type='cp').order_by('last_name')
-
-    resp_reg_inv = RegistrationInvitation.objects.filter(responded=True, declined=False)
-    resp_reg_inv_fellows = resp_reg_inv.filter(invitation_type='F').order_by('last_name')
-    resp_reg_inv_contrib = resp_reg_inv.filter(invitation_type='C').order_by('last_name')
-    resp_reg_inv_ref = resp_reg_inv.filter(invitation_type='R').order_by('last_name')
-    resp_reg_inv_cited_sub = resp_reg_inv.filter(invitation_type='ci').order_by('last_name')
-    resp_reg_inv_cited_pub = resp_reg_inv.filter(invitation_type='cp').order_by('last_name')
-
-    decl_reg_inv = RegistrationInvitation.objects.filter(
-        responded=True, declined=True).order_by('last_name')
-
-    names_reg_contributors = (Contributor.objects.filter(status=1).order_by('user__last_name')
-                              .values_list('user__first_name', 'user__last_name'))
     existing_drafts = DraftInvitation.objects.filter(processed=False).order_by('last_name')
 
     context = {
-        'draft_inv_form': draft_inv_form,
-        'sent_reg_inv_fellows': sent_reg_inv_fellows,
-        'sent_reg_inv_contrib': sent_reg_inv_contrib,
-        'sent_reg_inv_ref': sent_reg_inv_ref,
-        'sent_reg_inv_cited_sub': sent_reg_inv_cited_sub,
-        'sent_reg_inv_cited_pub': sent_reg_inv_cited_pub,
-        'resp_reg_inv_fellows': resp_reg_inv_fellows,
-        'resp_reg_inv_contrib': resp_reg_inv_contrib,
-        'resp_reg_inv_ref': resp_reg_inv_ref,
-        'resp_reg_inv_cited_sub': resp_reg_inv_cited_sub,
-        'resp_reg_inv_cited_pub': resp_reg_inv_cited_pub,
-        'decl_reg_inv': decl_reg_inv,
-        'names_reg_contributors': names_reg_contributors,
+        'form': form,
         'existing_drafts': existing_drafts,
     }
     return render(request, 'scipost/draft_registration_invitation.html', context)
 
 
+@permission_required('scipost.can_draft_registration_invitations', return_403=True)
+def contributors_filter(request):
+    """
+    For Invitation Officers that use lists of scientists as a to-do. This
+    view returns all entries of those lists with users that are certainly not registered
+    or invitated.
+    """
+    names_found = names_not_found = invitations_found = None
+    form = ContributorsFilterForm(request.POST or None)
+    if form.is_valid():
+        names_found, names_not_found, invitations_found = form.filter()
+
+    context = {
+        'form': form,
+        'names_found': names_found,
+        'names_not_found': names_not_found,
+        'invitations_found': invitations_found,
+    }
+    return render(request, 'scipost/contributors_filter.html', context)
+
+
 @login_required
 def edit_draft_reg_inv(request, draft_id):
+    """
+    Edit DraftInvitation instance. It's only possible to edit istances created by the User itself.
+    """
     draft = get_object_or_404((get_objects_for_user(request.user, 'scipost.change_draftinvitation')
                                .filter(processed=False)),
                               id=draft_id)
@@ -803,7 +797,7 @@ def _personal_page_publications(request):
     }
     context['nr_publication_authorships_to_claim'] = Publication.objects.filter(
         author_list__contains=request.user.last_name).exclude(
-        authors=contributor).exclude(
+        authors_registered=contributor).exclude(
         authors_claims=contributor).exclude(
         authors_false_claims=contributor).count()
     return render(request, 'partials/scipost/personal_page/publications.html', context)
@@ -1031,28 +1025,28 @@ def claim_authorships(request):
     contributor = Contributor.objects.get(user=request.user)
 
     publication_authorships_to_claim = (Publication.objects
-                                       .filter(author_list__contains=contributor.user.last_name)
-                                       .exclude(authors__in=[contributor])
-                                       .exclude(authors_claims__in=[contributor])
-                                       .exclude(authors_false_claims__in=[contributor]))
+                                        .filter(author_list__contains=contributor.user.last_name)
+                                        .exclude(authors_registered=contributor)
+                                        .exclude(authors_claims=contributor)
+                                        .exclude(authors_false_claims=contributor))
     pub_auth_claim_form = AuthorshipClaimForm()
     submission_authorships_to_claim = (Submission.objects
                                        .filter(author_list__contains=contributor.user.last_name)
-                                       .exclude(authors__in=[contributor])
-                                       .exclude(authors_claims__in=[contributor])
-                                       .exclude(authors_false_claims__in=[contributor]))
+                                       .exclude(authors=contributor)
+                                       .exclude(authors_claims=contributor)
+                                       .exclude(authors_false_claims=contributor))
     sub_auth_claim_form = AuthorshipClaimForm()
     commentary_authorships_to_claim = (Commentary.objects
                                        .filter(author_list__contains=contributor.user.last_name)
-                                       .exclude(authors__in=[contributor])
-                                       .exclude(authors_claims__in=[contributor])
-                                       .exclude(authors_false_claims__in=[contributor]))
+                                       .exclude(authors=contributor)
+                                       .exclude(authors_claims=contributor)
+                                       .exclude(authors_false_claims=contributor))
     com_auth_claim_form = AuthorshipClaimForm()
     thesis_authorships_to_claim = (ThesisLink.objects
                                    .filter(author__contains=contributor.user.last_name)
-                                   .exclude(author_as_cont__in=[contributor])
-                                   .exclude(author_claims__in=[contributor])
-                                   .exclude(author_false_claims__in=[contributor]))
+                                   .exclude(author_as_cont=contributor)
+                                   .exclude(author_claims=contributor)
+                                   .exclude(author_false_claims=contributor))
     thesis_auth_claim_form = AuthorshipClaimForm()
 
     context = {
@@ -1145,16 +1139,17 @@ def vet_authorship_claim(request, claim_id, claim):
         vetting_contributor = Contributor.objects.get(user=request.user)
         claim_to_vet = AuthorshipClaim.objects.get(pk=claim_id)
 
-        if claim_to_vet.publication is not None:
+        if claim_to_vet.publication:
             claim_to_vet.publication.authors_claims.remove(claim_to_vet.claimant)
             if claim == '1':
-                claim_to_vet.publication.authors.add(claim_to_vet.claimant)
+                PublicationAuthorsTable.objects.create(
+                    publication=claim_to_vet.publication, contributor=claim_to_vet.claimant)
                 claim_to_vet.status = '1'
             elif claim == '0':
                 claim_to_vet.publication.authors_false_claims.add(claim_to_vet.claimant)
                 claim_to_vet.status = '-1'
             claim_to_vet.publication.save()
-        if claim_to_vet.submission is not None:
+        if claim_to_vet.submission:
             claim_to_vet.submission.authors_claims.remove(claim_to_vet.claimant)
             if claim == '1':
                 claim_to_vet.submission.authors.add(claim_to_vet.claimant)
@@ -1163,7 +1158,7 @@ def vet_authorship_claim(request, claim_id, claim):
                 claim_to_vet.submission.authors_false_claims.add(claim_to_vet.claimant)
                 claim_to_vet.status = '-1'
             claim_to_vet.submission.save()
-        if claim_to_vet.commentary is not None:
+        if claim_to_vet.commentary:
             claim_to_vet.commentary.authors_claims.remove(claim_to_vet.claimant)
             if claim == '1':
                 claim_to_vet.commentary.authors.add(claim_to_vet.claimant)
@@ -1172,7 +1167,7 @@ def vet_authorship_claim(request, claim_id, claim):
                 claim_to_vet.commentary.authors_false_claims.add(claim_to_vet.claimant)
                 claim_to_vet.status = '-1'
             claim_to_vet.commentary.save()
-        if claim_to_vet.thesislink is not None:
+        if claim_to_vet.thesislink:
             claim_to_vet.thesislink.author_claims.remove(claim_to_vet.claimant)
             if claim == '1':
                 claim_to_vet.thesislink.author_as_cont.add(claim_to_vet.claimant)
@@ -1194,7 +1189,7 @@ def contributor_info(request, contributor_id):
     on the relevant name (in listing headers of Submissions, ...).
     """
     contributor = get_object_or_404(Contributor, pk=contributor_id)
-    contributor_publications = Publication.objects.published().filter(authors=contributor)
+    contributor_publications = Publication.objects.published().filter(authors_registered=contributor)
     contributor_submissions = Submission.objects.public_unlisted().filter(authors=contributor)
     contributor_commentaries = Commentary.objects.filter(authors=contributor)
     contributor_theses = ThesisLink.objects.vetted().filter(author_as_cont=contributor)
diff --git a/submissions/constants.py b/submissions/constants.py
index 5d9c0a2b25974dfe02f6f05c7e5e0cca899004f4..aa9be27dc7e48407998958972538552bcde607d5 100644
--- a/submissions/constants.py
+++ b/submissions/constants.py
@@ -103,9 +103,12 @@ SUBMISSION_TYPE = (
     ('Review', 'Review (candid snapshot of current research in a given area)'),
 )
 
-NO_REQUIRED_ACTION_STATUSES = SUBMISSION_STATUS_PUBLICLY_INVISIBLE + [
+NO_REQUIRED_ACTION_STATUSES = [
     STATUS_UNASSIGNED,
-    STATUS_RESUBMISSION_INCOMING
+    STATUS_ASSIGNMENT_FAILED,
+    STATUS_RESUBMITTED_REJECTED,
+    STATUS_REJECTED,
+    STATUS_WITHDRAWN,
 ]
 
 ED_COMM_CHOICES = (
@@ -253,6 +256,6 @@ SUBMISSIONS_COMPLETE_REGEX = '(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{4,}v[
 #
 # CAUTION: *triple* check whether the `default` regex also meets any other explicit journal regex!
 EXPLICIT_REGEX_MANUSCRIPT_CONSTRAINTS = {
-    SCIPOST_JOURNAL_PHYSICS: '(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{5,}v[0-9]{1,2})',
+    SCIPOST_JOURNAL_PHYSICS: '(?P<arxiv_identifier_w_vn_nr>[0-9]{4,}.[0-9]{4,}v[0-9]{1,2})',
     'default': SUBMISSIONS_COMPLETE_REGEX
 }
diff --git a/submissions/forms.py b/submissions/forms.py
index a25a3b5022e656561dc64c6354b6f670f32546b3..3784031645d090097fa265db42b42111e08258cb 100644
--- a/submissions/forms.py
+++ b/submissions/forms.py
@@ -779,6 +779,7 @@ class EICRecommendationForm(forms.ModelForm):
                 # The EIC has fulfilled this editorial assignment.
                 self.assignment.completed = True
                 self.assignment.save()
+        return recommendation
 
     def revision_requested(self):
         return self.instance.recommendation in [-1, -2]
diff --git a/submissions/management/commands/email_fellows_tasklist.py b/submissions/management/commands/email_fellows_tasklist.py
new file mode 100644
index 0000000000000000000000000000000000000000..36c562ecfc30fceb0e165a22d32baeec33f0a275
--- /dev/null
+++ b/submissions/management/commands/email_fellows_tasklist.py
@@ -0,0 +1,29 @@
+from django.core.management import BaseCommand
+
+from ...models import Submission, EditorialAssignment
+from ...utils import SubmissionUtils
+
+from scipost.models import Contributor
+
+
+class Command(BaseCommand):
+    help = 'Sends an email to Fellows with current and upcoming tasks list'
+    def handle(self, *args, **kwargs):
+        fellows = Contributor.objects.fellows(
+#        ).filter(user__last_name__istartswith='C' # temporary limitation, to ease testing
+        ).order_by('user__last_name')
+
+        for fellow in fellows:
+            assignments_ongoing = fellow.editorial_assignments.ongoing()
+            assignments_to_consider = fellow.editorial_assignments.open()
+            assignments_upcoming_deadline = assignments_ongoing.refereeing_deadline_within(days=7)
+            if assignments_ongoing or assignments_to_consider or assignments_upcoming_deadline:
+                SubmissionUtils.load(
+                    {
+                        'fellow': fellow,
+                        'assignments_ongoing': assignments_ongoing,
+                        'assignments_to_consider': assignments_to_consider,
+                        'assignments_upcoming_deadline': assignments_upcoming_deadline,
+                    }
+                )
+                SubmissionUtils.email_Fellow_tasklist()
diff --git a/submissions/managers.py b/submissions/managers.py
index e85f7218cbfaf72c5d5479d5b316e59a8aab5c87..c31adb4fce82e763def9e11c969cea246e5d2223 100644
--- a/submissions/managers.py
+++ b/submissions/managers.py
@@ -50,7 +50,7 @@ class SubmissionQuerySet(models.QuerySet):
 
     def _pool(self, user):
         """
-        This filter creates 'the complete pool' for an user. This new-style pool does
+        This filter creates 'the complete pool' for a user. This new-style pool does
         explicitly not have the author filter anymore, but registered pools for every Submission.
 
         !!!  IMPORTANT SECURITY NOTICE  !!!
@@ -251,11 +251,16 @@ class EditorialAssignmentQuerySet(models.QuerySet):
         return self.filter(completed=True)
 
     def ongoing(self):
-        return self.filter(completed=False).accepted()
+        return self.filter(completed=False, deprecated=False).accepted()
 
     def open(self):
         return self.filter(accepted=None, deprecated=False)
 
+    def refereeing_deadline_within(self, days=7):
+        return self.exclude(
+            submission__reporting_deadline__gt=timezone.now() + timezone.timedelta(days=days)
+            ).exclude(submission__reporting_deadline__lt=timezone.now())
+
 
 class EICRecommendationQuerySet(models.QuerySet):
     def get_for_user_in_pool(self, user):
diff --git a/submissions/models.py b/submissions/models.py
index d322603d05fbd16a1dd2b9e39a1f2fb2282590aa..99b5b94ce18dec2828e43db2d9f45e4ae93668c9 100644
--- a/submissions/models.py
+++ b/submissions/models.py
@@ -128,8 +128,9 @@ class Submission(models.Model):
             version=self.arxiv_vn_nr)
         self.arxiv_identifier_w_vn_nr = arxiv_w_vn
 
-        super().save(*args, **kwargs)
+        obj = super().save(*args, **kwargs)
         self._update_cycle()
+        return obj
 
     def __str__(self):
         header = (self.arxiv_identifier_w_vn_nr + ', '
@@ -192,6 +193,15 @@ class Submission(models.Model):
         return Submission.objects.filter(
             arxiv_identifier_wo_vn_nr=self.arxiv_identifier_wo_vn_nr).first().submission_date
 
+    @cached_property
+    def thread(self):
+        """
+        Return all versions of the Submission with that arxiv id.
+        """
+        return Submission.objects.public().filter(
+            arxiv_identifier_wo_vn_nr=self.arxiv_identifier_wo_vn_nr
+        ).order_by('-arxiv_vn_nr')
+
     @cached_property
     def other_versions(self):
         """
diff --git a/submissions/templates/partials/submissions/pool/submission_details.html b/submissions/templates/partials/submissions/pool/submission_details.html
index 7673c8703ef52d88590e9465e2278d26221de999..766d9c28591f67b1a6b8aa8b0a9e760197b49da2 100644
--- a/submissions/templates/partials/submissions/pool/submission_details.html
+++ b/submissions/templates/partials/submissions/pool/submission_details.html
@@ -13,7 +13,14 @@
     </div>
 
     <div class="card-body px-0">
-        {% include 'partials/submissions/pool/submission_info_table.html' with submission=submission %}
+        <div class="row">
+            <div class="col-md-8">
+                {% include 'partials/submissions/pool/submission_info_table.html' with submission=submission %}
+            </div>
+            <div class="col-md-4">
+                {% include 'partials/submissions/submission_refereeing_history.html' with submission=submission target_blank=1 %}
+            </div>
+        </div>
     </div>
 
     <div>
diff --git a/submissions/templates/partials/submissions/submission_refereeing_history.html b/submissions/templates/partials/submissions/submission_refereeing_history.html
new file mode 100644
index 0000000000000000000000000000000000000000..d06060785ea20def89f97497bb88d4a7887dc469
--- /dev/null
+++ b/submissions/templates/partials/submissions/submission_refereeing_history.html
@@ -0,0 +1,20 @@
+{% load request_filters %}
+
+<div class="card">
+    <div class="card-body">
+        <h3 class="card-title">Submission & Refereeing History</h3>
+        {% for sibling in submission.thread %}
+            <div class="my-2">
+                {% if forloop.last %}Submission{% else %}Resubmission{% endif %} <a href="{{ sibling.get_absolute_url }}" class="pubtitleli"{% if target_blank %} target="_blank"{% endif %}>{{ sibling.arxiv_identifier_w_vn_nr }}</a> ({{ sibling.submission_date|date:'j F Y' }})
+            </div>
+            <ul class="m-0 pl-4">
+                {% for report in sibling.reports.accepted %}
+                    <li><a href="{{ report.get_absolute_url }}"{% if target_blank %} target="_blank"{% endif %}>Report {{ report.report_nr }} submitted on {{ report.date_submitted }} by {% if report.anonymous %}<em>Anonymous</em>{% else %}{{ report.author.get_title_display }} {{ report.author.user.last_name }}{% endif %}</a></li>
+                    {% include 'partials/comments/comments_list.html' with comments=report.comments.vetted css_class='my-1 pl-4' target_blank=target_blank %}
+                {% endfor %}
+            </ul>
+
+            {% include 'partials/comments/comments_list.html' with comments=sibling.comments.vetted css_class='my-1 pl-4' target_blank=target_blank %}
+        {% endfor %}
+    </div>
+</div>
diff --git a/submissions/templates/submissions/editorial_page.html b/submissions/templates/submissions/editorial_page.html
index bb0048c3e0cdd2752a92d6fa7162209dd270641b..2711220d5e2bcb6800d0401fb1d3b272e5a152bd 100644
--- a/submissions/templates/submissions/editorial_page.html
+++ b/submissions/templates/submissions/editorial_page.html
@@ -15,36 +15,16 @@
 
 {% is_edcol_admin request.user as is_editorial_admin %}
 
-<h2>Editorial Page for Submission</h2>
-<h1 class="text-primary">{{submission.title}}</h1>
-<h3>by {{submission.author_list}}</h3>
-
-<div class="ml-2 mt-2">
-    <h3>- Go to the <a href="{% url 'submissions:submission' arxiv_identifier_w_vn_nr=submission.arxiv_identifier_w_vn_nr %}">Submissions Page</a> to view Reports and Comments</h3>
-
-    {% if submission.other_versions_pool or not submission.is_current %}
-        <ul class="mt-3 mb-1 list-unstyled pl-4">
-            {% if not submission.is_current %}
-                <li>
-                    <h4><span class="text-danger"><b>This is not the editorial page for the current version.</b> Please go to the current version's page.</span></h4>
-                </li>
-            {% endif %}
-
-            {% if submission.other_versions_pool %}
-                <li>Other versions of this Submission exist:</li>
-                <ul class="list-unstyled">
-                    {% for vn in submission.other_versions_pool %}
-                        <li>{% include 'submissions/_submission_version.html' with submission=vn editorial_page=1 %}</li>
-                    {% endfor %}
-                </ul>
-            {% endif %}
-        </ul>
-    {% endif %}
-</div>
+<div class="row">
+    <div class="col-md-8">
+        <h2>Editorial Page for Submission</h2>
+        <h1 class="text-primary">{{submission.title}}</h1>
+        <h3>by {{submission.author_list}}</h3>
 
+        <div class="ml-2 mt-2">
+            <h3>- Go to the <a href="{% url 'submissions:submission' arxiv_identifier_w_vn_nr=submission.arxiv_identifier_w_vn_nr %}">Submissions Page</a> to view Reports and Comments</h3>
+        </div>
 
-<div class="row">
-    <div class="col-12">
         <h3 class="mt-4">Submission summary</h3>
         {% include 'submissions/_submission_summary_short.html' with submission=submission hide_title=1 %}
 
@@ -73,11 +53,8 @@
           <h3>Referees flagged upon submission (treat reports with caution):</h3>
           <div class="pl-md-4">{{ submission.referees_flagged }}</div>
         {% endif %}
-    </div>
-</div>
 
-<div class="row">
-    <div class="col-12">
+
         {% for recommendation in submission.eicrecommendations.all %}
             {% include 'submissions/_recommendation_author_content.html' with recommendation=recommendation %}
             {% if recommendation.may_be_reformulated %}
@@ -85,8 +62,12 @@
             {% endif %}
         {% endfor %}
     </div>
+    <div class="col-md-4">
+        {% include 'partials/submissions/submission_refereeing_history.html' with submission=submission %}
+    </div>
 </div>
 
+
 <div class="card card-grey my-4">
     <div class="card-body">
         <h2 class="card-title">Editorial Workflow</h2>
diff --git a/submissions/templates/submissions/submission_detail.html b/submissions/templates/submissions/submission_detail.html
index dfd390661a321543e2c64ad961c8f6b529e7063c..3642ad9bda4636c439c99105244da83e4edd0e7c 100644
--- a/submissions/templates/submissions/submission_detail.html
+++ b/submissions/templates/submissions/submission_detail.html
@@ -20,7 +20,7 @@
 {% block content %}
 
 <div class="row">
-    <div class="col">
+    <div class="col-md-8">
         <h2>SciPost Submission Page</h2>
         <h1 class="text-primary">{{submission.title}}</h1>
         <h3 class="mb-3">by {{submission.author_list}}</h3>
@@ -36,28 +36,34 @@
             {% endif %}
 
             {% if unfinished_report_for_user %}
-                <h3 class="mt-0">- <span class="circle text-danger border-danger">!</span> You have an unfinished report for this submission, <a href="{% url 'submissions:submit_report' arxiv_identifier_w_vn_nr=submission.arxiv_identifier_w_vn_nr %}">finish your report here.</a></h3>
+                <h3>- <span class="circle text-danger border-danger">!</span> You have an unfinished report for this submission, <a href="{% url 'submissions:submit_report' arxiv_identifier_w_vn_nr=submission.arxiv_identifier_w_vn_nr %}">finish your report here.</a></h3>
             {% endif %}
 
-            {% if submission.other_versions or not submission.is_current %}
-                <ul class="mt-3 mb-1 list-unstyled pl-4">
-                    {% if not submission.is_current %}
-                        <li><h3 class="text-danger">This is not the current version.</h3></li>
-                    {% endif %}
-
-                    {% if submission.other_versions %}
-                        <li>Other versions of this Submission (with Reports) exist:</li>
-                        <ul class="list-unstyled">
-                            {% for vn in submission.other_versions %}
-                                <li>{% include 'submissions/_submission_version.html' with submission=vn %}</li>
-                            {% endfor %}
-                        </ul>
-                    {% endif %}
-                </ul>
+            {% if not submission.is_current %}
+                <h3><span class="text-danger">- This is not the current version.</span></h3>
             {% endif %}
+
+            {% comment %}
+                {% if submission.other_versions or not submission.is_current %}
+                    <ul class="mt-3 mb-1 list-unstyled pl-4">
+                        {% if not submission.is_current %}
+                            <li><h3 class="text-danger">This is not the current version.</h3></li>
+                        {% endif %}
+
+                        {% if submission.other_versions %}
+                            <li>Other versions of this Submission (with Reports) exist:</li>
+                            <ul class="list-unstyled">
+                                {% for vn in submission.other_versions %}
+                                    <li>{% include 'submissions/_submission_version.html' with submission=vn %}</li>
+                                {% endfor %}
+                            </ul>
+                        {% endif %}
+                    </ul>
+                {% endif %}
+            {% endcomment %}
         </div>
 
-        <h3>Submission summary</h3>
+        <h3 class="mt-2">Submission summary</h3>
         {% include 'submissions/_submission_summary.html' with submission=submission hide_title=1 %}
 
         {% include 'submissions/_submission_status_block.html' with submission=submission %}
@@ -77,13 +83,14 @@
         {% endif %}
     </div>
 
-    {% if invitations %}
-        <div class="col-md-4">
-            {% for invitation in invitations %}
-                {% include 'partials/submissions/refereeing_status_card.html' with invitation=invitation %}
-            {% endfor %}
-        </div>
-    {% endif %}
+    <div class="col-md-4">
+        {% for invitation in invitations %}
+            {% include 'partials/submissions/refereeing_status_card.html' with invitation=invitation %}
+        {% endfor %}
+
+        {% include 'partials/submissions/submission_refereeing_history.html' with submission=submission %}
+    </div>
+
 </div>
 
 {% if is_author or user|is_in_group:'Editorial College' or user|is_in_group:'Editorial Administrators' %}
diff --git a/submissions/utils.py b/submissions/utils.py
index 90fad6bad125cb646f92ac9ceea5b9094835cbef..2649daa1e9642b86928dda011a82799710a92cf7 100644
--- a/submissions/utils.py
+++ b/submissions/utils.py
@@ -169,7 +169,7 @@ class BaseRefereeSubmissionCycle(BaseSubmissionCycle):
         for ref_inv in self.submission.referee_invitations.all():
             if not ref_inv.cancelled:
                 if ref_inv.accepted is None:
-                    '''An invited referee may have not responsed yet.'''
+                    '''An invited referee may have not responded yet.'''
                     timelapse = timezone.now() - ref_inv.date_invited
                     if timelapse > datetime.timedelta(days=3):
                         text = ('Referee %s has not responded for %i days. '
@@ -185,10 +185,10 @@ class BaseRefereeSubmissionCycle(BaseSubmissionCycle):
                         if timeleft.days < 0:
                             text += '(%i days overdue). ' % (- timeleft.days)
                         elif timeleft.days == 1:
-                            text += '(with 1 day left). '
+                            text += '(with 1 day left). Consider sending an urgent reminder.'
                         else:
-                            text += '(with %i days left). ' % timeleft.days
-                        text += 'Consider sending a reminder or cancelling the invitation.'
+                            text += ('(with %i days left). Consider sending a reminder if '
+                                     'you think it can ensure a timely Report.' % timeleft.days)
                         self.required_actions.append(('referee_no_delivery', text,))
 
         if self.submission.reporting_deadline < timezone.now():
@@ -262,12 +262,9 @@ class SubmissionUtils(BaseMailUtil):
         # Import here due to circular import error
         from .models import EditorialAssignment
 
-        assignments_to_deprecate = (EditorialAssignment.objects
-                                    .filter(submission=cls.assignment.submission, accepted=None)
-                                    .exclude(to=cls.assignment.to))
-        for atd in assignments_to_deprecate:
-            atd.deprecated = True
-            atd.save()
+        EditorialAssignment.objects.filter(submission=cls.assignment.submission, accepted=None)\
+            .exclude(to=cls.assignment.to)\
+            .update(deprecated=True)
 
     @classmethod
     def deprecate_all_assignments(cls):
@@ -1368,3 +1365,16 @@ class SubmissionUtils(BaseMailUtil):
             reply_to=['admin@scipost.org'])
         emailmessage.attach_alternative(html_version, 'text/html')
         emailmessage.send(fail_silently=False)
+
+    @classmethod
+    def email_Fellow_tasklist(cls):
+        """
+        Email list of current and upcoming tasks to an individual Fellow.
+
+        Requires context to contain:
+        - `fellow`
+        """
+        cls._send_mail(cls, 'email_fellow_tasklist',
+#                       [cls._context['fellow'].email_address],
+                       ['jscaux@scipost.org'], # temporary, for testing
+                       'Current and upcoming tasks')
diff --git a/submissions/views.py b/submissions/views.py
index 2ecd5d295baffa8ed75b62ebee75399c44d8c5fa..1e1cc60d55ffb75580a290a3a9f9282faee27773 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -481,7 +481,7 @@ def assignment_request(request, assignment_id):
         if form.cleaned_data['accept'] == 'True':
             assignment.accepted = True
             assignment.to = request.user.contributor
-            assignment.submission.status = 'EICassigned'
+            assignment.submission.status = STATUS_EIC_ASSIGNED
             assignment.submission.editor_in_charge = request.user.contributor
             assignment.submission.open_for_reporting = True
             deadline = timezone.now() + datetime.timedelta(days=28)  # for papers
@@ -546,22 +546,28 @@ def volunteer_as_EIC(request, arxiv_identifier_w_vn_nr):
         messages.warning(request, errormessage)
         return redirect(reverse('submissions:pool'))
     contributor = Contributor.objects.get(user=request.user)
-    assignment = EditorialAssignment(submission=submission,
-                                     to=contributor,
-                                     accepted=True,
-                                     date_created=timezone.now(),
-                                     date_answered=timezone.now())
+
+    # The Contributor may already have an EditorialAssignment due to an earlier invitation.
+    assignment, __ = EditorialAssignment.objects.get_or_create(
+        submission=submission,
+        to=contributor)
+    assignment.accepted = True
+    assignment.date_answered = timezone.now()
+    assignment.save()
+
+    # Set deadlines
     deadline = timezone.now() + datetime.timedelta(days=28)  # for papers
     if submission.submitted_to_journal == 'SciPostPhysLectNotes':
         deadline += datetime.timedelta(days=28)
-    submission.status = 'EICassigned'
+
+    # Update Submission data
+    submission.status = STATUS_EIC_ASSIGNED
     submission.editor_in_charge = contributor
     submission.open_for_reporting = True
     submission.reporting_deadline = deadline
     submission.open_for_commenting = True
-    submission.latest_activity = timezone.now()
-    assignment.save()
     submission.save()
+    submission.touch()
 
     SubmissionUtils.load({'assignment': assignment})
     SubmissionUtils.deprecate_other_assignments()
diff --git a/templates/email/email_comment_made_citable.html b/templates/email/email_comment_made_citable.html
new file mode 100644
index 0000000000000000000000000000000000000000..eeae17f15511c40c2e24852f3a1d25e2a4ddb91a
--- /dev/null
+++ b/templates/email/email_comment_made_citable.html
@@ -0,0 +1,18 @@
+<p>Dear {{ comment.author.get_title_display }} {{ comment.author.user.last_name }},</p>
+
+<p>
+    The Comment you have submitted, concerning publication with title
+
+    {{comment.core_content_object.title}} by {% if comment.core_content_object.author_list %}{{comment.core_content_object.author_list}}{% elif comment.core_content_object.author %}{{comment.core_content_object.author}}{% endif %} (<a href="https://scipost.org{{comment.get_absolute_url}}">see on SciPost.org</a>)
+    has been ascribed DOI <a href="//doi.org/{{ comment.doi_string }}">{{ comment.doi_string }}</a> (https://doi.org/{{ comment.doi_string }}), and is thus now citable in the form:
+</p>
+<p>
+  {{ comment.citation }}.
+</p>
+<p>
+    Thank you again very much for your contribution.<br><br>
+    The SciPost Team
+</p>
+
+
+{% include 'email/_footer.html' %}
diff --git a/templates/email/email_comment_made_citable.txt b/templates/email/email_comment_made_citable.txt
new file mode 100644
index 0000000000000000000000000000000000000000..8a456b2a7cdb4fbf3a14deb2ebf77c8d9477238b
--- /dev/null
+++ b/templates/email/email_comment_made_citable.txt
@@ -0,0 +1,7 @@
+Dear {{ comment.author.get_title_display }} {{ comment.author.user.last_name }},\n\n
+The Comment you have submitted, concerning publication with title\n
+{{comment.core_content_object.title}} by {% if comment.core_content_object.author_list %}{{comment.core_content_object.author_list}}{% elif comment.core_content_object.author %}{{comment.core_content_object.author}}{% endif %} (https://scipost.org{{comment.get_absolute_url}})\n
+has been ascribed DOI {{ comment.doi_string }}  (https://doi.org/{{ comment.doi_string }}), and is thus now citable in the form:\n\n
+{{ comment.citation }}.\n\n
+Thank you again very much for your contribution.\n
+The SciPost Team
diff --git a/templates/email/email_fellow_tasklist.html b/templates/email/email_fellow_tasklist.html
new file mode 100644
index 0000000000000000000000000000000000000000..1168cd5d0bf51e6f26e327a843520a002722d27b
--- /dev/null
+++ b/templates/email/email_fellow_tasklist.html
@@ -0,0 +1,61 @@
+{% load bootstrap %}
+{% load submissions_extras %}
+<p>Dear {{ fellow.get_title_display }} {{ fellow.user.last_name }},</p>
+<p>Please find below a digest of your current assignments, with (if applicable) pending and upcoming required actions. Many thanks in advance for your timely intervention on any point in need of attention.</p>
+{% if assignments_to_consider %}
+<h3>Assignments for you to consider:</h3>
+<ul>
+{% for assignment in assignments_to_consider %}
+<li>On submission: {{ assignment.submission }}<br>
+  <a href="https://scipost.org{% url 'submissions:assignment_request' assignment.id %}">Accept or decline here</a>
+</li>
+{% endfor %}
+</ul>
+{% endif %}
+{% if assignments_ongoing %}
+<h3>Current assignments (Submissions for which you are Editor-in-charge):</h3>
+<ul>
+  {% for assignment in assignments_ongoing %}
+  <li>
+    <h3><a href="https://scipost.org{% url 'submissions:submission' assignment.submission.arxiv_identifier_w_vn_nr %}">{{ assignment.submission.title }}</a></h3>
+    <p>
+      <em>by {{ assignment.submission.author_list }}</em>
+    </p>
+    {% if assignment.submission.cycle.has_required_actions %}
+    <h3>Required actions (go to the <a href="https://scipost.org{% url 'submissions:editorial_page' assignment.submission.arxiv_identifier_w_vn_nr %}">Editorial page</a>):</h3>
+    <ul>
+      {% for action in assignment.submission.cycle.get_required_actions %}
+      <li>{{action.1}}</li>
+      {% empty %}
+      <li>No actions required</li>
+      {% endfor %}
+    </ul>
+    {% endif %}
+  </li>
+  {% endfor %}
+</ul>
+{% endif %}
+{% if assignments_upcoming_deadline %}
+<h3>Upcoming refereeing deadlines:</h3>
+<ul>
+  {% for assignment in assignments_upcoming_deadline %}
+  <li>
+    <h3><a href="https://scipost.org{% url 'submissions:pool' assignment.submission.arxiv_identifier_w_vn_nr %}">{{ assignment.submission.title }}</a></h3>
+    <p>
+      <em>by {{ assignment.submission.author_list }}</em>
+    </p>
+    <p>Refereeing deadline: {{ assignment.submission.reporting_deadline|date:"Y-m-d" }}.</p>
+    <p><em>You can manage this Submission from its </em><a href="https://scipost.org{% url 'submissions:editorial_page' assignment.submission.arxiv_identifier_w_vn_nr %}">Editorial page</a></p>
+  </li>
+  {% endfor %}
+</ul>
+{% endif %}
+<h3>Need help or assistance?</h3>
+<p>
+  Don't hesitate to <a href="mailto:edadmin@scipost.org">email the editorial administration</a> if you need any assistance.
+</p>
+<p>
+    Many thanks,<br>
+    The SciPost Team.
+</p>
+{% include 'email/_footer.html' %}
diff --git a/templates/email/email_fellow_tasklist.txt b/templates/email/email_fellow_tasklist.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6444d5a2c99caca945f96ffe94e099772517812f
--- /dev/null
+++ b/templates/email/email_fellow_tasklist.txt
@@ -0,0 +1,38 @@
+{% load submissions_extras %}
+Dear {{ fellow.get_title_display }} {{ fellow.user.last_name }},\n\n
+Please find below a digest of your current assignments, with (if applicable) pending and upcoming required actions. Many thanks in advance for your timely intervention on any point in need of attention.\n\n
+{% if assignments_to_consider %}
+Assignments for you to consider:\n\n
+{% for assignment in assignments_to_consider %}
+On submission: {{ assignment.submission }}\n
+Accept or decline at {% url 'submissions:assignment_request' assignment.id %}"
+{% endfor %}
+{% endif %}
+{% if assignments_ongoing %}
+Current assignments (Submissions for which you are Editor-in-charge):\n\n
+{% for assignment in assignments_ongoing %}
+{{ assignment.submission.title }}\n
+by {{ assignment.submission.author_list }}\n\n
+{% if assignment.submission.cycle.has_required_actions %}
+Required actions:\n
+{% for action in assignment.submission.cycle.get_required_actions %}
+{{action.1}}\n
+{% empty %}
+No actions required\n
+{% endfor %}
+{% endif %}
+{% endfor %}
+{% endif %}
+\n
+{% if assignments_upcoming_deadline %}
+Upcoming refereeing deadlines:\n\n
+{% for assignment in assignments_upcoming_deadline %}
+{{ assignment.submission.title }}\n
+by {{ assignment.submission.author_list }}\n
+Refereeing deadline: {{ assignment.submission.reporting_deadline|date:"Y-m-d" }}.\n
+{% endfor %}
+{% endif %}
+\n
+You can take action on all of these starting from your personal page at https://scipost.org/personal_page. Don't hesitate to email the editorial administration at edadmin@scipost.org if you need any assistance.\n\n
+Many thanks,\n
+The SciPost Team.
diff --git a/templates/email/email_report_made_citable.html b/templates/email/email_report_made_citable.html
new file mode 100644
index 0000000000000000000000000000000000000000..1c871e5d6b251d88d732be89f5401adf5896d5ea
--- /dev/null
+++ b/templates/email/email_report_made_citable.html
@@ -0,0 +1,31 @@
+<p>Dear {{ report.author.get_title_display }} {{ report.author.user.last_name }},</p>
+
+<p>
+  Your Report on Submission:
+</p>
+<p>
+  {{ report.submission.title }}
+  <br/>
+  by {{ report.submission.author_list }}
+  {% if publication_citation %}
+  <br/>
+  (published as {{ publication_citation }}, <a href="https://doi.org/{{ publication_doi }}">doi:{{ publication_doi }}</a>)
+  {% endif %}
+</p>
+<p>
+  has been ascribed DOI <a href="https://doi.org/{{ report.doi_string }}">{{ report.doi_string }}</a> (https://doi.org/{{ report.doi_string }}), and is thus now citable in the form:
+</p>
+<p>
+  {{ report.citation }}.
+</p>
+<p>
+  We thank you again very much for your valuable contribution.<br/>
+  The SciPost Team
+</p>
+{% if report.anonymous %}
+<p>
+  P.S.: When submitting your Report, you chose to remain anonymous. We generally encourage (but in no way require) our referees to sign their contributions, in order to foster greater transparency and allow you to get full recognition for your valuable refereeing work. Should you wish to sign your Report (even post-facto; this can be done at any time), simply navigate to your <a href="https://scipost.org/personal_page">personal page</a> under the Refereeing tab, where you will find a link allowing you to do so (after which we will update your Report's DOI metadata, and make your signature publicly visible).
+</p>
+{% endif %}
+
+{% include 'email/_footer.html' %}
diff --git a/templates/email/email_report_made_citable.txt b/templates/email/email_report_made_citable.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e62e8b5e8860a5b964ef6d3124faca024dfced49
--- /dev/null
+++ b/templates/email/email_report_made_citable.txt
@@ -0,0 +1,14 @@
+Dear {{ report.author.get_title_display }} {{ report.author.user.last_name }},\n\n
+Your Report on Submission:\n\n
+{{ report.submission.title }}\n
+by {{ report.submission.author_list }}\n
+{% if publication_citation %}
+(published as {{ publication_citation }}, https://doi.org/{{ publication_doi }})\n\n
+{% endif %}
+has been ascribed DOI {{ report.doi_string }} (https://doi.org/{{ report.doi_string }}), and is thus now citable in the form:\n\n
+{{ report.citation }}.\n\n
+We thank you again very much for your contribution.\n
+The SciPost Team\n\n
+{% if report.anonymous %}
+P.S.: When submitting your Report, you chose to remain anonymous. We generally encourage (but in no way require) our referees to sign their contributions, in order to foster greater transparency and allow you to get full recognition for your valuable refereeing work. Should you wish to sign your Report (even post-facto; this can be done at any time), simply navigate to your <a href="https://scipost.org/personal_page">personal page</a> under the Refereeing tab, where you will find a link allowing you to do so (after which we will update your Report's DOI metadata, and make your signature publicly visible).
+{% endif %}
diff --git a/theses/forms.py b/theses/forms.py
index da91cf710bac5da9774880bee6ef696eaeec6ec0..e41bead8cc6d63181214e30fc03477e1916f6069 100644
--- a/theses/forms.py
+++ b/theses/forms.py
@@ -1,7 +1,6 @@
 from django import forms
 from django.core.mail import EmailMessage
 from django.template.loader import render_to_string
-from django.urls import reverse
 
 from scipost.models import Contributor
 
@@ -66,7 +65,7 @@ class VetThesisLinkForm(BaseRequestThesisLinkForm):
         mail_params = {
             'vocative_title': thesislink.requested_by.get_title_display(),
             'thesislink': thesislink,
-            'full_url': thesislink.get_absolute_url()
+            'full_url': 'https//www.scipost.org{url}'.format(url=thesislink.get_absolute_url())
         }
         action = int(self.cleaned_data['action_option'])