diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py
index 45b0ccceb5719cc0c844ada1eab1d077a36c427f..c9de03f6f38e5bdc3e56cdc88761d65cf3717e5a 100644
--- a/SciPost_v1/urls.py
+++ b/SciPost_v1/urls.py
@@ -31,7 +31,6 @@ urlpatterns = [
     url(r'^10.21468/%s/' % JOURNAL_REGEX, include('journals.urls.journal', namespace="journal")),
     url(r'^%s/' % JOURNAL_REGEX, include('journals.urls.journal', namespace="journal")),
     url(r'^', include('scipost.urls', namespace="scipost")),
-    url(r'^contributor/', include('scipost.urls', namespace="scipost")),
     url(r'^commentaries/', include('commentaries.urls', namespace="commentaries")),
     url(r'^commentary/', include('commentaries.urls', namespace="commentaries")),
     url(r'^comments/', include('comments.urls', namespace="comments")),
diff --git a/common/utils.py b/common/utils.py
index f5293015c3ca7c8182515e2c5dea967199606d00..4a778d1002428a3cd1c2da6823a7c137df54f39c 100644
--- a/common/utils.py
+++ b/common/utils.py
@@ -7,12 +7,13 @@ class BaseMailUtil(object):
     mail_sender_title = ''
 
     @classmethod
-    def load(cls, _dict):
+    def load(cls, _dict, request=None):
         cls._context = _dict
+        cls._context['request'] = request
         for var_name in _dict:
             setattr(cls, var_name, _dict[var_name])
 
-    def _send_mail(cls, template_name, recipients, subject):
+    def _send_mail(cls, template_name, recipients, subject, extra_bcc=None):
         """
         Call this method from a classmethod to send emails.
         The template will have context variables defined appended from the `load` method.
@@ -29,8 +30,15 @@ class BaseMailUtil(object):
         html_template = loader.get_template('email/%s_html.html' % template_name)
         message = template.render(Context(cls._context))
         html_message = html_template.render(Context(cls._context))
+        bcc_list = [cls.mail_sender]
+        if extra_bcc:
+            bcc_list += extra_bcc
         email = EmailMultiAlternatives(
-            'SciPost: ' + subject, message, '%s <%s>' % (cls.mail_sender_title, cls.mail_sender),
-            recipients, bcc=[cls.mail_sender], reply_to=[cls.mail_sender])
+            'SciPost: ' + subject,  # message,
+            message,
+            '%s <%s>' % (cls.mail_sender_title, cls.mail_sender),
+            recipients,
+            bcc=bcc_list,
+            reply_to=[cls.mail_sender])
         email.attach_alternative(html_message, 'text/html')
         email.send(fail_silently=False)
diff --git a/journals/models.py b/journals/models.py
index ca059578375eeb65b45bfdf1c86d3a37423ee12e..a50ff645958b35c03815f9baf13f1276a3e01ff9 100644
--- a/journals/models.py
+++ b/journals/models.py
@@ -27,7 +27,7 @@ class UnregisteredAuthor(models.Model):
 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,
-                                  validators=[doi_journal_validator])
+                                 validators=[doi_journal_validator])
     issn = models.CharField(max_length=16, default='2542-4653')
     active = models.BooleanField(default=True)
 
@@ -51,7 +51,7 @@ class Volume(models.Model):
     start_date = models.DateField(default=timezone.now)
     until_date = models.DateField(default=timezone.now)
     doi_label = models.CharField(max_length=200, unique=True, db_index=True,
-                                  validators=[doi_volume_validator])
+                                 validators=[doi_volume_validator])
 
     class Meta:
         unique_together = ('number', 'in_journal')
diff --git a/journals/templates/journals/publication_detail.html b/journals/templates/journals/publication_detail.html
index 627d44a0a3c2c8fedd25916c52b7668dc18120b1..38ddbd0126458949676a818100764228b9277907 100644
--- a/journals/templates/journals/publication_detail.html
+++ b/journals/templates/journals/publication_detail.html
@@ -111,12 +111,12 @@
                 </div>
             </div>
           </li>
-          <li><a href="{% url 'journals:add_author' publication_id=publication.id %}">Add a missing author</a></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>
           <li><a href="{% url 'journals:create_funding_info_metadata' publication.doi_label %}">Create/update funding info metadata</a></li>
           <li><a href="{% url 'journals:create_metadata_xml' publication.doi_label %}">Create/update the XML metadata</a></li>
-          <li><a href="{% url 'journals:metadata_xml_deposit' publication.doi_label option='test' %}">Test metadata deposit (via Crossref test server)</a></li>
-          <li><a href="{% url 'journals:metadata_xml_deposit' publication.doi_label option='deposit' %}">Deposit the metadata to Crossref</a></li>
+          <li><a href="{% url 'journals:metadata_xml_deposit' publication.doi_label 'test' %}">Test metadata deposit (via Crossref test server)</a></li>
+          <li><a href="{% url 'journals:metadata_xml_deposit' publication.doi_label 'deposit' %}">Deposit the metadata to Crossref</a></li>
           <li><a href="{% url 'journals:harvest_citedby_links' publication.doi_label %}">Update Crossref cited-by links</a></li>
         </ul>
         </div>
diff --git a/journals/urls/general.py b/journals/urls/general.py
index ba5227eebec603f2907e5bda74351a6533b24a77..76d8ab0b758416a861fe8b654cdd747bb3c4b7be 100644
--- a/journals/urls/general.py
+++ b/journals/urls/general.py
@@ -1,12 +1,13 @@
 from django.conf.urls import url
-
-from django.views.generic import TemplateView
+from django.urls import reverse_lazy
+from django.views.generic import TemplateView, RedirectView
 
 from journals import views as journals_views
 
 urlpatterns = [
     # Journals
     url(r'^$', TemplateView.as_view(template_name='journals/journals.html'), 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'),
diff --git a/journals/urls/journal.py b/journals/urls/journal.py
index b50e08235b5ee5052843905743492225c9fa8dd4..c18136fa3d5a038dafe829b603e10ab8c461e2a5 100644
--- a/journals/urls/journal.py
+++ b/journals/urls/journal.py
@@ -4,7 +4,6 @@ from journals import views as journals_views
 
 urlpatterns = [
     # Journal routes
-    # url(r'^$', journals_views.landing_page, name='landing_page'),
     url(r'^issues$', journals_views.issues, name='issues'),
     url(r'^recent$', journals_views.recent, name='recent'),
     url(r'^accepted$', journals_views.accepted, name='accepted'),
diff --git a/journals/views.py b/journals/views.py
index 127b43c9f679e52dcaf5721ce7f9bb06fa1b1b5a..12cfe9538dc01491e980fb58a2d138c91aaf71f3 100644
--- a/journals/views.py
+++ b/journals/views.py
@@ -237,45 +237,42 @@ def validate_publication(request):
     # TODO: create metadata
     # TODO: set DOI, register with Crossref
     # TODO: add funding info
-    if request.method == 'POST':
-        validate_publication_form = ValidatePublicationForm(request.POST, request.FILES)
-        if validate_publication_form.is_valid():
-            publication = validate_publication_form.save()
-            # Fill in remaining data
-            publication.pdf_file = request.FILES['pdf_file']
-            submission = publication.accepted_submission
-            publication.authors.add(*submission.authors.all())
-            publication.authors_claims.add(*submission.authors_claims.all())
-            publication.authors_false_claims.add(*submission.authors_false_claims.all())
-            publication.save()
-            # Move file to final location
-            initial_path = publication.pdf_file.path
-            new_dir = (settings.MEDIA_ROOT + publication.in_issue.path + '/'
-                       + publication.get_paper_nr())
-            new_path = new_dir + '/' + publication.doi_string.replace('.', '_') + '.pdf'
-            os.makedirs(new_dir)
-            os.rename(initial_path, new_path)
-            publication.pdf_file.name = new_path
-            publication.save()
-            # Mark the submission as having been published:
-            publication.accepted_submission.published_as = publication
-            publication.accepted_submission.status = 'published'
-            publication.accepted_submission.save()
-            # TODO: Create a Commentary Page
-            # Email authors
-            JournalUtils.load({'publication': publication})
-            JournalUtils.send_authors_paper_published_email()
-            ack_header = 'The publication has been validated.'
-            context = {'ack_header': ack_header, }
-            return render(request, 'scipost/acknowledgement.html', context)
-        else:
-            errormessage = 'The form was invalid.'
-            context = {'validate_publication_form': validate_publication_form,
-                       'errormessage': errormessage}
-            return render(request, 'journals/validate_publication.html', context)
+    context = {}
+    validate_publication_form = ValidatePublicationForm(request.POST or None,
+                                                        request.FILES or None)
+    if validate_publication_form.is_valid():
+        publication = validate_publication_form.save()
+        # Fill in remaining data
+        publication.pdf_file = request.FILES['pdf_file']
+        submission = publication.accepted_submission
+        publication.authors.add(*submission.authors.all())
+        publication.authors_claims.add(*submission.authors_claims.all())
+        publication.authors_false_claims.add(*submission.authors_false_claims.all())
+        publication.save()
+        # Move file to final location
+        initial_path = publication.pdf_file.path
+        new_dir = (settings.MEDIA_ROOT + publication.in_issue.path + '/'
+                   + publication.get_paper_nr())
+        new_path = new_dir + '/' + publication.doi_label.replace('.', '_') + '.pdf'
+        os.makedirs(new_dir)
+        os.rename(initial_path, new_path)
+        publication.pdf_file.name = new_path
+        publication.save()
+        # Mark the submission as having been published:
+        publication.accepted_submission.published_as = publication
+        publication.accepted_submission.status = 'published'
+        publication.accepted_submission.save()
+        # TODO: Create a Commentary Page
+        # Email authors
+        JournalUtils.load({'publication': publication})
+        JournalUtils.send_authors_paper_published_email()
+        ack_header = 'The publication has been validated.'
+        context['ack_header'] = ack_header
+        return render(request, 'scipost/acknowledgement.html', context)
     else:
-        validate_publication_form = ValidatePublicationForm()
-    context = {'validate_publication_form': validate_publication_form}
+        context['errormessage'] = 'The form was invalid.'
+
+    context['validate_publication_form'] = validate_publication_form
     return render(request, 'journals/validate_publication.html', context)
 
 
@@ -478,7 +475,7 @@ def create_metadata_xml(request, doi_label):
         '<body>\n'
         '<journal>\n'
         '<journal_metadata>\n'
-        '<full_title>' + publication.in_issue.in_volume.in_journal.name + '</full_title>\n'
+        '<full_title>' + publication.in_issue.in_volume.in_journal.get_name_display() + '</full_title>\n'
         '<abbrev_title>'
         + publication.in_issue.in_volume.in_journal.get_abbreviation_citation() +
         '</abbrev_title>\n'
@@ -652,6 +649,10 @@ def harvest_citedby_links(request, doi_label):
               'qdata': query_xml,
               'doi': publication.doi_string, }
     r = requests.post(url, params=params,)
+    if r.status_code == 401:
+        messages.warning(request, ('<h3>Crossref credentials are invalid.</h3>'
+                                   'Please contact the SciPost Admin.'))
+        return redirect(publication.get_absolute_url())
     response_headers = r.headers
     response_text = r.text
     response_deserialized = ET.fromstring(r.text)
diff --git a/scipost/management/commands/export_contributors.py b/scipost/management/commands/export_contributors.py
index 889698b316759dc4055a850194ecece0878f4de4..153ace0457f0ce289e232cecbe259e0a62933075 100644
--- a/scipost/management/commands/export_contributors.py
+++ b/scipost/management/commands/export_contributors.py
@@ -32,7 +32,9 @@ class Command(BaseCommand):
         fieldnames = ['first_name', 'last_name', 'email_address']
 
         # Query
-        queryset = Contributor.objects.filter(user__is_active=True, status=CONTRIBUTOR_NORMAL)
+        queryset = Contributor.objects.filter(user__is_active=True,
+                                              status=CONTRIBUTOR_NORMAL,
+                                              accepts_SciPost_emails=True)
         if kwargs['group']:
             queryset = queryset.filter(user__groups__name=kwargs['group'])
 
diff --git a/scipost/urls.py b/scipost/urls.py
index ebbd67e5fb89ad0a5811e49ea46fdd445b7351fe..d12d2fc75c8e25a73214656aff7faab8e44f8238 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -136,7 +136,7 @@ urlpatterns = [
         name='mark_unavailable_period'),
 
     # Contributor info
-    url(r'^(?P<contributor_id>[0-9]+)$', views.contributor_info, name="contributor_info"),
+    url(r'^contributor/(?P<contributor_id>[0-9]+)$', views.contributor_info, name="contributor_info"),
 
     # Authorship claims
     url(r'^claim_authorships$', views.claim_authorships, name="claim_authorships"),
diff --git a/scipost/views.py b/scipost/views.py
index 0412865861c35f32090c89fa766322d850f72107..3ebfee4ad98394fa61eb6e0710b391eae1147eec 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -206,7 +206,7 @@ def register(request):
     form = RegistrationForm(request.POST or None)
     if form.is_valid():
         contributor = form.create_and_save_contributor()
-        Utils.load({'contributor': contributor})
+        Utils.load({'contributor': contributor}, request)
         Utils.send_registration_email()
 
         # Disable invitations related to the new Contributor
@@ -281,7 +281,7 @@ def request_new_activation_link(request, contributor_id, key):
     if request.GET.get('confirm', False):
         # Generate a new email activation key and link
         contributor.generate_key()
-        Utils.load({'contributor': contributor})
+        Utils.load({'contributor': contributor}, request)
         Utils.send_new_activation_link_email()
 
         context = {
@@ -1075,7 +1075,7 @@ def contributor_info(request, contributor_id):
     Contributor's activities/contributions by clicking
     on the relevant name (in listing headers of Submissions, ...).
     """
-    contributor = Contributor.objects.get(pk=contributor_id)
+    contributor = get_object_or_404(Contributor, pk=contributor_id)
     contributor_publications = Publication.objects.published().filter(authors=contributor)
     contributor_submissions = Submission.objects.public().filter(authors=contributor)
     contributor_commentaries = Commentary.objects.filter(authors=contributor)
diff --git a/submissions/templates/submissions/_form_submission_cycle_choice.html b/submissions/templates/submissions/_form_submission_cycle_choice.html
index 8b1a2d5b998df1dc54a8da16ba3bde1d38ffe6e1..3cfbd7176a6859a1a4a429a51acb45723fd894e9 100644
--- a/submissions/templates/submissions/_form_submission_cycle_choice.html
+++ b/submissions/templates/submissions/_form_submission_cycle_choice.html
@@ -1,77 +1,79 @@
+{% load bootstrap %}
 <form method="post" action="{% url 'submissions:cycle_confirmation' submission.arxiv_identifier_w_vn_nr %}">
     {% csrf_token %}
-    <h3 class="mb-2">This submission is a resubmission, please choose which submission cycle to proceed with</h3>
-    <div class="card-deck mb-5" id="id_submission_cycle">
-        {% for choice in form.refereeing_cycle %}
-            <div class="card radio-option" for="{{choice.id_for_label}}" data-reinvite="{% if choice.choice_value == 'direct_rec' %}0{% else %}1{% endif %}">
-                <div class="card-block text-center">
-                    <span class="hidden-xs-up">{{choice.tag}}</span>
-
-                        <h3 class="card-title">{{choice.choice_label}}</h3>
-                        <p class="card-text text-muted">
-                            {% if choice.choice_value == 'short' %}
-                                Run a speedy refereeing round: two weeks, with option of reinviting previous referees
-                            {% elif choice.choice_value == 'direct_rec' %}
-                                Immediately write an editorial recommendation.
-                            {% else %}
-                                Run a new full refereeing round: four weeks as usual, can invite previous referees and/or new ones.
-                            {% endif %}
-                        </p>
-                        <label for="{{choice.id_for_label}}" class="text-blue">Choose this cycle</label>
-
-                </div>
-            </div>
-        {% endfor %}
+    <div class="row">
+        <div class="col-12">
+            <h3>This submission is a resubmission, please choose which submission cycle to proceed with</h3>
+        </div>
     </div>
-    <div class="card-deck" id="id_referees_reinvite_block" style="display: none;">
-        <div class="card">
-            <div class="card-block">
-                <h3 class="card-title">The following referees were also invited in the last submission</h3>
-                <h4 class="card-subtitle text-muted pt-0">Please choose who you want to reinvite</h4>
-                <div class="form-group row" id="id_referees_reinvite">
-                    <label class="col-form-label col-md-2" for="id_referees_reinvite">Reinvite referees</label>
-                    <div class="col-md-10 multiple-checkbox">
-                        <ul class="mb-0 list-group list-group-flush">
-                            {% for referee in form.referees_reinvite.field.queryset %}
-                                <li class="list-group-item py-1">
-                                    <label for="{{form.referees_reinvite.name}}_{{forloop.counter0}}" class="mb-0">
-                                        <input checked="checked" id="{{form.referees_reinvite.name}}_{{forloop.counter0}}" name="{{form.referees_reinvite.name}}" type="checkbox" value="{{referee.id}}">
-                                        <div class="d-inline-block" style="vertical-align: top;">
-                                            {{referee.referee_str}}
-                                            <br>
-                                            <span class="text-muted">Originally invited on {{referee.date_invited}}</span>
-                                        </div>
-                                     </label>
-                                 </li>
-                            {% endfor %}
-                        </ul>
-                    </div>
+
+    <!-- Refereeing cycle -->
+    <div class="form-group row">
+        <label class="col-form-label col-md-2 ">Refereeing cycle</label>
+        <div class="col-md-10">
+            {% for field in form.refereeing_cycle %}
+                <div class="radio" data-reinvite="{% if field.choice_value == 'direct_rec' %}0{% else %}1{% endif %}">
+                    <label for="{{field.id_for_label}}" class="mb-0">
+                        {{field.tag}}
+                        {{field.choice_label}}
+                    </label>
                 </div>
+                <p class="help-block text-muted">
+                    {{ field.help_text|safe }}
+                    {% if field.choice_value == 'short' %}
+                        Run a speedy refereeing round: two weeks, with option of reinviting previous referees
+                    {% elif field.choice_value == 'direct_rec' %}
+                        Immediately write an editorial recommendation.
+                    {% else %}
+                        Run a new full refereeing round: four weeks as usual, can invite previous referees and/or new ones.
+                    {% endif %}
+                </p>
+
+                {% for error in field.errors %}
+                    <span class="help-block {{ form.error_css_class }}">{{ error }}</span>
+                {% endfor %}
+            {% endfor %}
+        </div>
+    </div><!-- end refereeing cycle -->
+
+    <!-- Reinvite referees -->
+    <div id="id_referees_reinvite_block" style="display: none;">
+        <div class="row">
+            <div class="col-12">
+                <h3>The following referees were also invited in the last submission</h3>
+                <h4 class="text-muted">Please choose who you want to reinvite (an invitation will be automatically emailed to the referee)</h4>
             </div>
         </div>
+        <div class="form-group row">
+            <label class="col-form-label col-md-2 ">Reinvite referees</label>
+            <div class="col-md-10">
+                <ul class="list-group list-group-flush">
+                    {% for referee in form.referees_reinvite.field.queryset %}
+                        <li class="list-group-item py-1">
+                            <label for="{{form.referees_reinvite.name}}_{{forloop.counter0}}" class="mb-0">
+                                <input checked="checked" id="{{form.referees_reinvite.name}}_{{forloop.counter0}}" name="{{form.referees_reinvite.name}}" type="checkbox" value="{{referee.id}}">
+                                <div class="d-inline-block" style="vertical-align: top;">
+                                    {{referee.referee_str}}
+                                    <br>
+                                    <span class="text-muted">Originally invited on {{referee.date_invited}}</span>
+                                </div>
+                             </label>
+                         </li>
+                    {% endfor %}
+                </ul>
+            </div>
+        </div><!-- end reinvite referees -->
     </div>
     <input type="submit" class="btn btn-primary" value="Confirm choice">
 </form>
 
 <script>
     $(function(){
-        $('#id_submission_cycle .radio-option').on('click change', function(){
-            var radio_clicked = $(this).find('input[type="radio"]');
-
-            // Uncheck all cycles except the one clicked and
-            $('#id_submission_cycle .radio-option input[type="radio"]')
-            .prop('checked', false)
-            .filter(radio_clicked)
-            .prop('checked', true);
-
-            // Toggle classes of cards
-            $('#id_submission_cycle .radio-option')
-            .removeClass('checked')
-            .filter(this)
-            .addClass('checked');
+        $('[name="{{form.refereeing_cycle.name}}"]').on('click change', function(){
+            var reinvite = $('[name="{{form.refereeing_cycle.name}}"]:checked').parents('.radio').attr('data-reinvite') == 1;
 
             // Show/hide invitation block
-            if($(this).attr('data-reinvite') > 0) {
+            if(reinvite > 0) {
                 $('#id_referees_reinvite_block').show();
             } else {
                 $('#id_referees_reinvite_block').hide();
diff --git a/submissions/utils.py b/submissions/utils.py
index 2534333d98fcace08ddd93619406c5c5414eea26..fb2039cc6df596f19c5dbce7b37985c794f9ee11 100644
--- a/submissions/utils.py
+++ b/submissions/utils.py
@@ -94,12 +94,13 @@ class BaseSubmissionCycle:
 
         return True
 
-    def reinvite_referees(self, referees):
+    def reinvite_referees(self, referees, request=None):
         """
         Reinvite referees if allowed. This method does not check if it really is
-        an reinvitation or just a new invitation.
+        a reinvitation or just a new invitation.
         """
         if self.may_reinvite_referees:
+            SubmissionUtils.load({'submission': self.submission})
             for referee in referees:
                 invitation = referee
                 invitation.pk = None  # Duplicate, do not remove the old invitation
@@ -107,6 +108,8 @@ class BaseSubmissionCycle:
                 invitation.reset_content()
                 invitation.date_invited = timezone.now()
                 invitation.save()
+                SubmissionUtils.load({'invitation': invitation}, request)
+                SubmissionUtils.reinvite_referees_email()
 
     def update_deadline(self, period=None):
         delta_d = period or self.default_days
@@ -272,6 +275,21 @@ class SubmissionUtils(BaseMailUtil):
             atd.deprecated = True
             atd.save()
 
+    @classmethod
+    def reinvite_referees_email(cls):
+        """
+        Email to be sent to referees when they are being reinvited by the EIC.
+
+        Requires context to contain:
+        - `invitation`
+        """
+        extra_bcc_list = [cls._context['invitation'].submission.editor_in_charge.user.email]
+        cls._send_mail(cls, 'submission_cycle_reinvite_referee',
+                       [cls._context['invitation'].email_address],
+                       'Invitation on resubmission',
+                       extra_bcc=extra_bcc_list)
+
+
     @classmethod
     def send_authors_submission_ack_email(cls):
         """ Requires loading 'submission' attribute. """
@@ -490,7 +508,7 @@ class SubmissionUtils(BaseMailUtil):
                       'Submission Page; you will be informed by email of any such Report or '
                       'Comment being delivered). In order to facilitate the work of the '
                       'Editorial College, we recommend limiting these replies to short '
-                      'to-the-point clarifications of any issue raised on your manuscript.\n\n '
+                      'to-the-point clarifications of any issue raised on your manuscript.\n\n'
                       'Please wait for the Editor-in-charge\'s Editorial Recommendation '
                       'before any resubmission of your manuscript.'
                       '\n\nTo facilitate metadata handling, we recommend that all authors '
diff --git a/submissions/views.py b/submissions/views.py
index 9c3bf34d067a6b8e2e897014505a4f45d9fba423..99eb79e517db0ff148d5620b5000dd9b9abb1151 100644
--- a/submissions/views.py
+++ b/submissions/views.py
@@ -27,7 +27,6 @@ from .forms import SubmissionIdentifierForm, SubmissionForm, SubmissionSearchFor
                    SubmissionCycleChoiceForm
 from .utils import SubmissionUtils
 
-from comments.models import Comment
 from scipost.forms import ModifyPersonalMessageForm, RemarkForm
 from scipost.models import Contributor, Remark, RegistrationInvitation
 
@@ -170,7 +169,7 @@ class SubmissionCreateView(PermissionRequiredMixin, CreateView):
             assignment.save()
 
             # Send emails
-            SubmissionUtils.load({'submission': submission})
+            SubmissionUtils.load({'submission': submission}, self.request)
             SubmissionUtils.send_authors_resubmission_ack_email()
             SubmissionUtils.send_EIC_reappointment_email()
         else:
@@ -333,8 +332,8 @@ def pool(request):
                                          .filter(submission__status__in=['put_to_EC_voting']))
     recommendations_to_prepare_for_voting = (EICRecommendation.objects
                                              .get_for_user_in_pool(request.user)
-                                             .filter(submission__status__in=
-                                                     ['voting_in_preparation']))
+                                             .filter(
+                                                submission__status__in=['voting_in_preparation']))
     contributor = Contributor.objects.get(user=request.user)
     assignments_to_consider = EditorialAssignment.objects.filter(
         to=contributor, accepted=None, deprecated=False)
@@ -649,7 +648,7 @@ def cycle_form_submit(request, arxiv_identifier_w_vn_nr):
         submission = form.save()
         submission.cycle.update_status()
         submission.cycle.update_deadline()
-        submission.cycle.reinvite_referees(form.cleaned_data['referees_reinvite'])
+        submission.cycle.reinvite_referees(form.cleaned_data['referees_reinvite'], request)
         messages.success(request, ('<h3>Your choice has been confirmed</h3>'
                                    'The new cycle will be <em>%s</em>'
                                    % submission.get_refereeing_cycle_display()))
@@ -835,7 +834,7 @@ def accept_or_decline_ref_invitation_ack(request, invitation_id):
             invitation.accepted = False
             invitation.refusal_reason = form.cleaned_data['refusal_reason']
         invitation.save()
-        SubmissionUtils.load({'invitation': invitation})
+        SubmissionUtils.load({'invitation': invitation}, request)
         SubmissionUtils.email_referee_response_to_EIC()
         SubmissionUtils.email_referee_in_response_to_decision()
 
@@ -1031,6 +1030,7 @@ def eic_recommendation(request, arxiv_identifier_w_vn_nr):
                                        submission=submission, to=request.user.contributor)
         assignment.completed = True
         assignment.save()
+        messages.success(request, 'Your Editorial Recommendation has been succesfully submitted')
         return redirect(reverse('submissions:editorial_page',
                                 kwargs={'arxiv_identifier_w_vn_nr': arxiv_identifier_w_vn_nr}))
 
@@ -1095,7 +1095,7 @@ def submit_report(request, arxiv_identifier_w_vn_nr):
         # Update user stats
         author.nr_reports = Report.objects.filter(author=author).count()
         author.save()
-        SubmissionUtils.load({'report': newreport})
+        SubmissionUtils.load({'report': newreport}, request)
         SubmissionUtils.email_EIC_report_delivered()
 
         # Why is this session update?
diff --git a/templates/email/_footer.html b/templates/email/_footer.html
index 41b50b80c1c2e210cb64a45f92fe1ec0658e8826..8dbca35955bcdbb9777d99b3f11f28b6b52ea7ed 100644
--- a/templates/email/_footer.html
+++ b/templates/email/_footer.html
@@ -4,18 +4,18 @@
 <br/>
 <div style="background-color: #f0f0f0; color: #002B49; align-items: center;">
     <div style="display: inline-block; padding: 8px;">
-        <a href="https://scipost.org/journals/">Journals</a>
+        <a href="{{request.get_host}}{% url 'journals:journals' %}">Journals</a>
     </div>
     <div style="display: inline-block; padding: 8px;">'
-        <a href="https://scipost.org/submissions/">Submissions</a>
+        <a href="{{request.get_host}}{% url 'submissions:submissions' %}">Submissions</a>
     </div>
     <div style="display: inline-block; padding: 8px;">
-        <a href="https://scipost.org/commentaries/">Commentaries</a>
+        <a href="{{request.get_host}}{% url 'commentaries:commentaries' %}">Commentaries</a>
     </div>
     <div style="display: inline-block; padding: 8px;">
-        <a href="https://scipost.org/theses/">Theses</a>
+        <a href="{{request.get_host}}{% url 'theses:theses' %}">Theses</a>
     </div>
     <div style="display: inline-block; padding: 8px;">
-        <a href="https://scipost.org/login/">Login</a>
+        <a href="{{request.get_host}}{% url 'scipost:login' %}">Login</a>
     </div>
 </div>
diff --git a/templates/email/new_activation_link.html b/templates/email/new_activation_link.html
index 3d8def3613888ad4377396c3c11972a053dd946f..755aaddd9f0aae366ba9884b84bbc11624b4746f 100644
--- a/templates/email/new_activation_link.html
+++ b/templates/email/new_activation_link.html
@@ -2,7 +2,7 @@ Dear {{contributor.get_title_display}} {{contributor.user.last_name}},\n\n
 
 Your request for a new email activation link for registration to the SciPost publication portal has been received. You now need to visit this link within the next 48 hours: \n\n
 
-{% url 'scipost:activation' contributor.id contributor.activation_key %}
+{{request.get_host}}{% url 'scipost:activation' contributor.id contributor.activation_key %}
 \n\n
 
 Your registration will thereafter be vetted. Many thanks for your interest.\n
diff --git a/templates/email/new_activation_link_html.html b/templates/email/new_activation_link_html.html
index 8ab56b93af64371f8dda5906ef741bedffa90ddb..48a6e019acecf05d6122fb79e8ddf6ce99525fae 100644
--- a/templates/email/new_activation_link_html.html
+++ b/templates/email/new_activation_link_html.html
@@ -4,7 +4,7 @@
     Your request for a new email activation link for registration to the SciPost publication portal has been received. You now need to visit this link within the next 48 hours:
 </p>
 <p>
-    <a href="{% url 'scipost:activation' contributor.id contributor.activation_key %}">Activate your account</a>
+    <a href="{{request.get_host}}{% url 'scipost:activation' contributor.id contributor.activation_key %}">Activate your account</a>
 </p>
 
 <p>
diff --git a/templates/email/referee_response_to_EIC.html b/templates/email/referee_response_to_EIC.html
index e4c185bf57304fb41a0b26488e1a991a4982e3f9..c3e7b18856e90284714941a74d3a529b134c5c5b 100644
--- a/templates/email/referee_response_to_EIC.html
+++ b/templates/email/referee_response_to_EIC.html
@@ -5,7 +5,7 @@ Referee {{invitation.referee.get_title_display}} {{invitation.referee.user.last_
 {{invitation.submission.title}} by {{invitation.submission.author_list}}\n\n
 
 {% if not invitation.accepted %}
-Please invite another referee from the Submission\'s editorial page at {% url 'submissions:editorial_page' invitation.submission.arxiv_identifier_w_vn_nr %}.\n\n
+Please invite another referee from the Submission\'s editorial page at {{request.get_host}}{% url 'submissions:editorial_page' invitation.submission.arxiv_identifier_w_vn_nr %}.\n\n
 {% endif %}
 
 Many thanks for your collaboration,\n
diff --git a/templates/email/referee_response_to_EIC_html.html b/templates/email/referee_response_to_EIC_html.html
index 2c50f00c02770229387d6797769ecad7de11b1a2..8a8ea2958a74a03a1419863f1d3c56733c7a6a8b 100644
--- a/templates/email/referee_response_to_EIC_html.html
+++ b/templates/email/referee_response_to_EIC_html.html
@@ -9,7 +9,7 @@
 
 {% if not invitation.accepted %}
     <p>
-        Please invite another referee from the Submission's <a href="{% url 'submissions:editorial_page' invitation.submission.arxiv_identifier_w_vn_nr %}">editorial page</a>.
+        Please invite another referee from the Submission's <a href="{{request.get_host}}{% url 'submissions:editorial_page' invitation.submission.arxiv_identifier_w_vn_nr %}">editorial page</a>.
     </p>
 {% endif %}
 
diff --git a/templates/email/registration_request_received.html b/templates/email/registration_request_received.html
index d18818fbfc929832f1e7815bf3771bb675e3a313..47d9124523bc8588a5b54536a7661618ebef5029 100644
--- a/templates/email/registration_request_received.html
+++ b/templates/email/registration_request_received.html
@@ -2,7 +2,7 @@ Dear {{contributor.get_title_display}} {{contributor.user.last_name}},\n\n
 
 Your request for registration to the SciPost publication portal has been received. You now need to validate your email by visiting this link within the next 48 hours: \n\n
 
-{% url 'scipost:activation' contributor.id contributor.activation_key %}
+{{request.get_host}}{% url 'scipost:activation' contributor.id contributor.activation_key %}
 \n\n
 
 Your registration will thereafter be vetted. Many thanks for your interest.\n
diff --git a/templates/email/registration_request_received_html.html b/templates/email/registration_request_received_html.html
index ca016a1a10a7d626ffa8646284a4e9e9c229fd65..c9eb3ff312a5e7e7f9525017f935cb9c4845ed51 100644
--- a/templates/email/registration_request_received_html.html
+++ b/templates/email/registration_request_received_html.html
@@ -4,7 +4,7 @@
     Your request for registration to the SciPost publication portal has been received. You now need to validate your email by visiting this link within the next 48 hours:
 </p>
 <p>
-    <a href="{% url 'scipost:activation' contributor.id contributor.activation_key %}">Activate your account</a>
+    <a href="{{request.get_host}}{% url 'scipost:activation' contributor.id contributor.activation_key %}">Activate your account</a>
 </p>
 
 <p>
diff --git a/templates/email/report_delivered_eic.html b/templates/email/report_delivered_eic.html
index f2051e9afcc7efb1a9995a5fa4daf6352d83aa59..4d326dd5d8105f4b24be2dca147eac53a36b1b5a 100644
--- a/templates/email/report_delivered_eic.html
+++ b/templates/email/report_delivered_eic.html
@@ -3,7 +3,8 @@ Dear {{report.submission.editor_in_charge.get_title_display}} {{report.submissio
 Referee {{report.author.get_title_display}} {{report.author.user.last_name}} has delivered a Report for Submission "{{report.submission.title}} by {{report.submission.author_list}}".
 \n\n
 
-Please vet this Report via your <a href="{% url 'scipost:personal_page' %}">personal page</a> under the Editorial Actions tab.
+Please vet this Report via your personal page under the Editorial Actions tab.\n
+{{request.get_host}}{% url 'scipost:personal_page' %}
 \n\n\n
 
 Many thanks in advance for your collaboration,\n
diff --git a/templates/email/report_delivered_eic_html.html b/templates/email/report_delivered_eic_html.html
index d9a2c2785483f90f54ed88d5ea052a3ef0534936..0a94697c09c2a8c7d68da68728a0b22b3b2111d2 100644
--- a/templates/email/report_delivered_eic_html.html
+++ b/templates/email/report_delivered_eic_html.html
@@ -4,7 +4,7 @@
     Referee {{report.author.get_title_display}} {{report.author.user.last_name}} has delivered a Report for Submission "<span style="color: grey;">{{report.submission.title}} by {{report.submission.author_list}}</span>".
 </p>
 <p>
-    Please vet this Report via your <a href="{% url 'scipost:personal_page' %}">personal page</a> under the Editorial Actions tab.
+    Please vet this Report via your <a href="{{request.get_host}}{% url 'scipost:personal_page' %}">personal page</a> under the Editorial Actions tab.
 </p>
 <p>
     Many thanks in advance for your collaboration,
diff --git a/templates/email/submission_cycle_reinvite_referee.html b/templates/email/submission_cycle_reinvite_referee.html
new file mode 100644
index 0000000000000000000000000000000000000000..3ae8ab59c207d451b19c0b3ad4e0da54de4ebd63
--- /dev/null
+++ b/templates/email/submission_cycle_reinvite_referee.html
@@ -0,0 +1,15 @@
+Dear {{invitation.get_title_display}} {{invitation.last_name}},\n\n\n
+
+The authors of submission\n\n
+
+{{invitation.submission.title}} by {{invitation.submission.author_list}} \n\n
+
+have resubmitted their manuscript to SciPost. On behalf of the Editor-in-charge {{invitation.submission.editor_in_charge.get_title_display}} {{invitation.submission.editor_in_charge.last_name}}, we would like to invite you to quickly review this new version.\n
+Please accept or decline the invitation (login required) as soon as possible (ideally within the next 2 days).\n\n
+
+If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on the Submission's Page before the reporting deadline (currently set at {{invitation.submission.reporting_deadline|date:'N j, Y'}}; your report will be automatically recognized as an invited report).\n\n
+
+You might want to make sure you are familiar with our refereeing code of conduct and with the refereeing procedure.\n\n
+
+We would be extremely grateful for your contribution, and thank you in advance for your consideration.\n
+The SciPost Team.
diff --git a/templates/email/submission_cycle_reinvite_referee_html.html b/templates/email/submission_cycle_reinvite_referee_html.html
new file mode 100644
index 0000000000000000000000000000000000000000..ec0eef3e764fb7e23b78723b275554efa664370b
--- /dev/null
+++ b/templates/email/submission_cycle_reinvite_referee_html.html
@@ -0,0 +1,28 @@
+<h3>Dear {{invitation.get_title_display}} {{invitation.last_name}},</h3>
+
+<p>
+    The authors of submission
+</p>
+
+<p>
+    {{invitation.submission.title}}
+    <br>
+    by {{invitation.submission.author_list}}
+    <br>
+    (<a href="{{request.get_host}}{{invitation.submission.get_absolute_url}}">see on SciPost.org</a>)
+<p>
+    have resubmitted their manuscript to SciPost. On behalf of the Editor-in-charge {{invitation.submission.editor_in_charge.get_title_display}} {{invitation.submission.editor_in_charge.last_name}}, we would like to invite you to quickly review this new version.
+    Please accept or decline the invitation (login required) as soon as possible (ideally within the next 2 days).
+</p>
+<p>
+    If you accept, your report can be submitted by simply clicking on the "Contribute a Report" link on the Submission's Page before the reporting deadline (currently set at {{invitation.submission.reporting_deadline|date:'N j, Y'}}; your report will be automatically recognized as an invited report).
+</p>
+<p>
+    You might want to make sure you are familiar with our refereeing code of conduct and with the refereeing procedure.
+</p>
+<p>
+    We would be extremely grateful for your contribution, and thank you in advance for your consideration.<br>
+    The SciPost Team.
+</p>
+
+{% include 'email/_footer.html' %}
diff --git a/templates/email/submission_eic_reappointment.html b/templates/email/submission_eic_reappointment.html
index 24cd530cb1236644316298e56fde0dd9e038ea8f..f5429e97b1fd9f0b19d1e566875bda11ae5b9540 100644
--- a/templates/email/submission_eic_reappointment.html
+++ b/templates/email/submission_eic_reappointment.html
@@ -1,11 +1,16 @@
-Dear {{submission.editor_in_charge.get_title_display}} {{submission.editor_in_charge.last_name}},\n\n
+Dear {{submission.editor_in_charge.get_title_display}} {{submission.editor_in_charge.user.last_name}},\n\n
 
-The authors of the SciPost Submission {{submission.title}} by {{submission.author_list}} have resubmitted their manuscript.\n\n
+The authors of the SciPost Submission\n\n
+{{submission.title}}
+\n\n
+by {{submission.author_list}}
+\n\n
+have resubmitted their manuscript.\n\n
 
-As Editor-in-charge, you can take your editorial actions from the submission\'s <a href="{% url 'submissions:editorial_page' submission.arxiv_identifier_w_vn_nr %}">editorial page</a>
-(also accessible from your <a href="{% url 'scipost:personal_page' %}">personal page</a> under the Editorial Actions tab).\n
+As Editor-in-charge, you can take your editorial actions from the submission\'s editorial page: {{request.get_host}}{% url 'submissions:editorial_page' submission.arxiv_identifier_w_vn_nr %}.\n
+(also accessible from your personal page under the Editorial Actions tab), see {{request.get_host}}{% url 'scipost:personal_page' %}. \n\n
 
-You can either take an immediate acceptance/rejection decision, or run a new refereeing round, in which case you should now invite at least 3 referees; you might want to make sure you are aware of the detailed procedure described in the <a href="{% url 'scipost:EdCol_by-laws' %}">Editorial College by-laws</a>.
+You can either take an immediate acceptance/rejection decision, quickly consult previous referees or run a new refereeing round, in which case you should now invite at least 3 referees; you might want to make sure you are aware of the detailed procedure described in the Editorial College by-laws. See {{request.get_host}}{% url 'scipost:EdCol_by-laws' %}.
 \n\n
 
 Many thanks in advance for your collaboration,\n
diff --git a/templates/email/submission_eic_reappointment_html.html b/templates/email/submission_eic_reappointment_html.html
index c0c08326e76be5ae162681e7e07b057e26e3c1f0..41b1ff0ce9ad308359476785e9c7dc94c6c1d30c 100644
--- a/templates/email/submission_eic_reappointment_html.html
+++ b/templates/email/submission_eic_reappointment_html.html
@@ -1,14 +1,14 @@
-<h3>Dear {{submission.editor_in_charge.get_title_display}} {{submission.editor_in_charge.last_name}},</h3>
+<h3>Dear {{submission.editor_in_charge.get_title_display}} {{submission.editor_in_charge.user.last_name}},</h3>
 
 <p>
     The authors of the SciPost Submission "<span style="color: grey;">{{submission.title}} by {{submission.author_list}}</span>" have resubmitted their manuscript.
 </p>
 <p>
-    As Editor-in-charge, you can take your editorial actions from the submission\'s <a href="{% url 'submissions:editorial_page' submission.arxiv_identifier_w_vn_nr %}">editorial page</a>.
-    (also accessible from your <a href="{% url 'scipost:personal_page' %}">personal page</a> under the Editorial Actions tab).
+    As Editor-in-charge, you can take your editorial actions from the submission\'s <a href="{{request.get_host}}{% url 'submissions:editorial_page' submission.arxiv_identifier_w_vn_nr %}">editorial page</a>.
+    (also accessible from your <a href="{{request.get_host}}{% url 'scipost:personal_page' %}">personal page</a> under the Editorial Actions tab).
 </p>
 <p>
-    You can either take an immediate acceptance/rejection decision, or run a new refereeing round, in which case you should now invite at least 3 referees; you might want to make sure you are aware of the detailed procedure described in the <a href="{% url 'scipost:EdCol_by-laws' %}">Editorial College by-laws</a>.
+    You can either take an immediate acceptance/rejection decision, quickly consult previous referees or run a new refereeing round, in which case you should now invite at least 3 referees; you might want to make sure you are aware of the detailed procedure described in the <a href="{{request.get_host}}{% url 'scipost:EdCol_by-laws' %}">Editorial College by-laws</a>.
 </p>
 <p>
     Many thanks in advance for your collaboration,