diff --git a/scipost_django/journals/urls/general.py b/scipost_django/journals/urls/general.py
index 5ae2a35b4bf357fbfeec4e1301126b373846336a..ac79842869a580628808aa3011f3aa6b8c85926b 100644
--- a/scipost_django/journals/urls/general.py
+++ b/scipost_django/journals/urls/general.py
@@ -6,9 +6,6 @@ from django.conf.urls import url
 from django.urls import path, re_path, reverse_lazy
 from django.views.generic import TemplateView, RedirectView
 
-from submissions.constants import SUBMISSIONS_COMPLETE_REGEX
-
-from journals.regexes import PUBLICATION_DOI_LABEL_REGEX
 from journals import views as journals_views
 
 
@@ -23,8 +20,8 @@ urlpatterns = [
         name='publication-autocomplete',
     ),
     # Journals
-    url(
-        r'^$',
+    path(
+        '',
         journals_views.JournalListView.as_view(),
         name='journals'
     ),
@@ -33,197 +30,273 @@ urlpatterns = [
         journals_views.JournalListView.as_view(),
         name='journals_in_acad_spec'
     ),
-    url(r'^publications$', journals_views.PublicationListView.as_view(), name='publications'),
-    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'),
+    path(
+        'publications',
+        journals_views.PublicationListView.as_view(),
+        name='publications'
+    ),
+    path(
+        'scipost_physics',
+        RedirectView.as_view(
+            url=reverse_lazy('scipost:landing_page', args=['SciPostPhys']))
+    ),
+    path(
+        'journals_terms_and_conditions',
+        TemplateView.as_view(
+            template_name='journals/journals_terms_and_conditions.html'),
+        name='journals_terms_and_conditions'
+    ),
+    path(
+        'crossmark_policy',
+        TemplateView.as_view(
+            template_name='journals/crossmark_policy.html'),
+        name='crossmark_policy'
+    ),
 
     # Publication creation
-    url(r'^admin/publications/{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'admin/publications/<identifier:identifier_w_vn_nr>/',
         journals_views.DraftPublicationUpdateView.as_view(),
-        name='update_publication'),
-    url(r'^admin/publications/(?P<doi_label>{regex})/publish$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='update_publication'
+    ),
+    path(
+        'admin/publications/<publication_doi_label:doi_label>/publish',
         journals_views.PublicationPublishView.as_view(),
-        name='publish_publication'),
-    url(r'^admin/publications/(?P<doi_label>{regex})/approval$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='publish_publication'
+    ),
+    path(
+        'admin/publications/<publication_doi_label:doi_label>/approval',
         journals_views.DraftPublicationApprovalView.as_view(),
-        name='send_publication_for_approval'),
-    url(r'^admin/publications/(?P<doi_label>{regex})/authors$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
-        # journals_views.PublicationAuthorOrderingView.as_view(),
+        name='send_publication_for_approval'
+    ),
+    path(
+        'admin/publications/<publication_doi_label:doi_label>/authors',
         journals_views.publication_authors_ordering,
-        name='update_author_ordering'),
-    url(r'^admin/publications/(?P<doi_label>{regex})/grants$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='update_author_ordering'
+    ),
+    path(
+        'admin/publications/<publication_doi_label:doi_label>/grants',
         journals_views.PublicationGrantsView.as_view(),
-        name='update_grants'),
-    url(r'^admin/publications/(?P<doi_label>{regex})/grants/(?P<grant_id>[0-9]+)/remove$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='update_grants'
+    ),
+    path(
+        'admin/publications/<publication_doi_label:doi_label>/grants/<int:grant_id>/remove',
         journals_views.PublicationGrantsRemovalView.as_view(),
-        name='remove_grant'),
+        name='remove_grant'
+    ),
 
     # Editorial and Administrative Workflow
-    url(r'^admin/(?P<doi_label>{regex})/authors/add$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+    path(
+        'admin/<publication_doi_label:doi_label>/authors/add',
         journals_views.add_author,
-        name='add_author'),
-    url(r'^admin/(?P<doi_label>{regex})/manage_metadata/$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='add_author'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/manage_metadata/',
         journals_views.manage_metadata,
-        name='manage_metadata'),
-    url(r'^admin/manage_metadata/$',
+        name='manage_metadata'
+    ),
+    path(
+        'admin/manage_metadata/',
         journals_views.manage_metadata,
-        name='manage_metadata'),
-    url(r'^admin/(?P<doi_label>{regex})/authoraffiliations/$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='manage_metadata'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/authoraffiliations/',
         journals_views.AuthorAffiliationView.as_view(),
-        name='author_affiliations'),
-    url(r'^admin/(?P<doi_label>{regex})/authoraffiliations/(?P<pk>[0-9]+)/add/$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
-        #journals_views.AddAffiliationView.as_view(),
+        name='author_affiliations'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/authoraffiliations/<int:pk>/add/',
         journals_views.add_affiliation,
-        name='author_affiliation_update'),
-    url(r'^admin/(?P<doi_label>{regex})/authoraffiliations/(?P<pk>[0-9]+)/remove/(?P<organization_id>[0-9]+)/$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
-        #journals_views.AddAffiliationView.as_view(),
+        name='author_affiliation_update'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/authoraffiliations/<int:pk>/remove/<int:organization_id>/',
         journals_views.remove_affiliation,
-        name='author_affiliation_remove'),
-    url(r'^admin/(?P<doi_label>{regex})/citation_list_metadata$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='author_affiliation_remove'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/citation_list_metadata',
         journals_views.CitationUpdateView.as_view(),
-        name='create_citation_list_metadata'),
-    url(r'^admin/(?P<doi_label>{regex})/abstract_jats$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='create_citation_list_metadata'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/abstract_jats',
         journals_views.AbstractJATSUpdateView.as_view(),
-        name='abstract_jats'),
-    url(r'^admin/(?P<doi_label>{regex})/update_references$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
-        journals_views.update_references, name='update_references'),
-    url(r'^admin/(?P<doi_label>{regex})/funders/create_metadata$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='abstract_jats'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/update_references',
+        journals_views.update_references,
+        name='update_references'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/funders/create_metadata',
         journals_views.FundingInfoView.as_view(),
-        name='create_funding_info_metadata'),
-    url(r'^admin/(?P<doi_label>{regex})/funders/add_generic$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='create_funding_info_metadata'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/funders/add_generic',
         journals_views.add_generic_funder,
-        name='add_generic_funder'),
-    url(r'^admin/(?P<doi_label>{regex})/grants/add$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='add_generic_funder'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/grants/add',
         journals_views.add_associated_grant,
-        name='add_associated_grant'),
+        name='add_associated_grant'
+    ),
 
     # Admin: Volumes and Issues
-    url(r'^admin/volumes/$',
+    path(
+        'admin/volumes/',
         journals_views.VolumesAdminListView.as_view(),
-        name='admin_volumes_list'),
-    url(r'^admin/volumes/add$',
+        name='admin_volumes_list'
+    ),
+    path(
+        'admin/volumes/add',
         journals_views.VolumesAdminAddView.as_view(),
-        name='add_volume'),
-    url(r'^admin/volumes/(?P<pk>[0-9]+)/$',
+        name='add_volume'
+    ),
+    path(
+        'admin/volumes/<int:pk>/',
         journals_views.VolumesAdminUpdateView.as_view(),
-        name='update_volume'),
-    url(r'^admin/issues/$',
+        name='update_volume'
+    ),
+    path(
+        'admin/issues/',
         journals_views.IssuesAdminListView.as_view(),
-        name='admin_issue_list'),
-    url(r'^admin/issues/add$',
+        name='admin_issue_list'
+    ),
+    path(
+        'admin/issues/add',
         journals_views.IssuesAdminAddView.as_view(),
-        name='add_issue'),
-    url(r'^admin/issues/(?P<pk>[0-9]+)/$',
+        name='add_issue'
+    ),
+    path(
+        'admin/issues/<int:pk>/',
         journals_views.IssuesAdminUpdateView.as_view(),
-        name='update_issue'),
+        name='update_issue'
+    ),
 
 
     # Metadata handling
-    url(r'^admin/(?P<doi_label>{regex})/metadata/crossref/create$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+    path(
+        'admin/<publication_doi_label:doi_label>/metadata/crossref/create',
         journals_views.CreateMetadataXMLView.as_view(),
-        name='create_metadata_xml'),
-    url(r'^admin/(?P<doi_label>{regex})/metadata/crossref/deposit/(?P<option>[a-z]+)$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='create_metadata_xml'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/metadata/crossref/deposit/<str:option>',
         journals_views.metadata_xml_deposit,
-        name='metadata_xml_deposit'),
-    url(r'^admin/(?P<doi_label>{regex})/metadata/DOAJ$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='metadata_xml_deposit'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/metadata/DOAJ',
         journals_views.produce_metadata_DOAJ,
-        name='produce_metadata_DOAJ'),
-    url(r'^admin/(?P<doi_label>{regex})/metadata/DOAJ/deposit$'.format(
-            regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='produce_metadata_DOAJ'
+    ),
+    path(
+        'admin/<publication_doi_label:doi_label>/metadata/DOAJ/deposit',
         journals_views.metadata_DOAJ_deposit,
-        name='metadata_DOAJ_deposit'),
-    url(r'^admin/metadata/crossref/(?P<deposit_id>[0-9]+)/mark/(?P<success>[0-1])$',
+        name='metadata_DOAJ_deposit'
+    ),
+    path(
+        'admin/metadata/crossref/<int:deposit_id>/mark/<int:success>',
         journals_views.mark_deposit_success,
-        name='mark_deposit_success'),
-    url(r'^admin/metadata/DOAJ/(?P<deposit_id>[0-9]+)/mark/(?P<success>[0-1])$',
+        name='mark_deposit_success'
+    ),
+    path(
+        'admin/metadata/DOAJ/<int:deposit_id>/mark/<int:success>',
         journals_views.mark_doaj_deposit_success,
-        name='mark_doaj_deposit_success'),
-    url(r'^admin/metadata/generic/(?P<type_of_object>[a-z]+)/(?P<object_id>[0-9]+)/metadata$',
+        name='mark_doaj_deposit_success'
+    ),
+    path(
+        'admin/metadata/generic/<str:type_of_object>/<int:object_id>/metadata',
         journals_views.generic_metadata_xml_deposit,
-        name='generic_metadata_xml_deposit'),
-    url(r'^admin/metadata/generic/(?P<deposit_id>[0-9]+)/mark/(?P<success>[0-1])$',
+        name='generic_metadata_xml_deposit'
+    ),
+    path(
+        'admin/metadata/generic/<int:deposit_id>/mark/<int:success>',
         journals_views.mark_generic_deposit_success,
-        name='mark_generic_deposit_success'),
-    url(r'^admin/generic/(?P<type_of_object>[a-z]+)/(?P<object_id>[0-9]+)/email_made_citable$',
+        name='mark_generic_deposit_success'
+    ),
+    path(
+        'admin/generic/<str:type_of_object>/<int:object_id>/email_made_citable',
         journals_views.email_object_made_citable,
-        name='email_object_made_citable'),
+        name='email_object_made_citable'
+    ),
 
     # Topics:
-    url(r'^publication_add_topic/(?P<doi_label>{regex})$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+    path(
+        'publication_add_topic/<publication_doi_label:doi_label>',
         journals_views.publication_add_topic,
-        name='publication_add_topic'),
-    url(r'^publication_remove_topic/(?P<doi_label>{regex})/(?P<slug>[-\w]+)/$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='publication_add_topic'
+    ),
+    path(
+        'publication_remove_topic/<publication_doi_label:doi_label>/<slug:slug>/',
         journals_views.publication_remove_topic,
-        name='publication_remove_topic'),
+        name='publication_remove_topic'
+    ),
 
     # PubFraction allocation:
-    url(r'^allocate_orgpubfractions/(?P<doi_label>{regex})$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+    path(
+        'allocate_orgpubfractions/<publication_doi_label:doi_label>',
         journals_views.allocate_orgpubfractions,
-        name='allocate_orgpubfractions'),
-    url(r'^request_pubfrac_check/(?P<doi_label>{regex})$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='allocate_orgpubfractions'
+    ),
+    path(
+        'request_pubfrac_check/<publication_doi_label:doi_label>',
         journals_views.request_pubfrac_check,
-        name='request_pubfrac_check'),
+        name='request_pubfrac_check'
+    ),
 
     # Citedby
-    url(r'^admin/citedby/$',
+    path(
+        'admin/citedby/',
         journals_views.harvest_citedby_list,
-        name='harvest_citedby_list'),
-    url(r'^admin/citedby/(?P<doi_label>{regex})/harvest$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='harvest_citedby_list'
+    ),
+    path(
+        'admin/citedby/<publication_doi_label:doi_label>/harvest',
         journals_views.harvest_citedby_links,
-        name='harvest_citedby_links'),
+        name='harvest_citedby_links'
+    ),
 
     # Reports
-    url(r'^reports/$',
+    path(
+        'reports/',
         journals_views.manage_report_metadata,
-        name='manage_report_metadata'),
-    url(r'^reports/(?P<report_id>[0-9]+)/sign$',
+        name='manage_report_metadata'
+    ),
+    path(
+        'reports/<int:report_id>/sign',
         journals_views.sign_existing_report,
-        name='sign_existing_report'),
-    url(r'^reports/(?P<report_id>[0-9]+)/mark_doi_needed/(?P<needed>[0-1])$',
+        name='sign_existing_report'
+    ),
+    path(
+        'reports/<int:report_id>/mark_doi_needed/<int:needed>',
         journals_views.mark_report_doi_needed,
-        name='mark_report_doi_needed'),
+        name='mark_report_doi_needed'
+    ),
 
     # Comments
-    url(r'^comments/$',
+    path(
+        'comments/',
         journals_views.manage_comment_metadata,
-        name='manage_comment_metadata'),
-    url(r'^comments/(?P<comment_id>[0-9]+)/mark_doi_needed/(?P<needed>[0-1])$',
+        name='manage_comment_metadata'
+    ),
+    path(
+        'comments/<int:comment_id>/mark_doi_needed/<int:needed>',
         journals_views.mark_comment_doi_needed,
-        name='mark_comment_doi_needed'),
+        name='mark_comment_doi_needed'
+    ),
 
     # PublicationUpdates
-    url(r'^updates/$',
+    path(
+        'updates/',
         journals_views.manage_update_metadata,
-        name='manage_update_metadata'),
+        name='manage_update_metadata'
+    ),
 
 ]
diff --git a/scipost_django/journals/urls/journal.py b/scipost_django/journals/urls/journal.py
index 9c7fa9d8fb9d14ad9f51de45a8854be1ae29c86b..9c2299ea55749b9c0098adcc78696bc5f02f9fc5 100644
--- a/scipost_django/journals/urls/journal.py
+++ b/scipost_django/journals/urls/journal.py
@@ -2,7 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
 from django.urls import path
 
 from journals import views as journals_views
@@ -12,12 +11,36 @@ app_name = 'urls.journals'
 
 urlpatterns = [
     # Journal routes
-    url(r'^issues$', journals_views.IssuesView.as_view(), name='issues'),
-    url(r'^recent$', journals_views.redirect_to_about, name='recent'),
-    url(r'^accepted$', journals_views.redirect_to_about, name='accepted'),
-    url(r'^authoring$', journals_views.authoring, name='authoring'),
-    url(r'^refereeing$', journals_views.refereeing, name='refereeing'),
-    url(r'^about$', journals_views.about, name='about'),
+    path(
+        'issues',
+        journals_views.IssuesView.as_view(),
+        name='issues'
+    ),
+    path(
+        'recent',
+        journals_views.redirect_to_about,
+        name='recent'
+    ),
+    path(
+        'accepted',
+        journals_views.redirect_to_about,
+        name='accepted'
+    ),
+    path(
+        'authoring',
+        journals_views.authoring,
+        name='authoring'
+    ),
+    path(
+        'refereeing',
+        journals_views.refereeing,
+        name='refereeing'
+    ),
+    path(
+        'about',
+        journals_views.about,
+        name='about'
+    ),
     path(
         'metrics/<specialty:specialty>',
         journals_views.metrics,
diff --git a/scipost_django/journals/views.py b/scipost_django/journals/views.py
index 635afdc2823b72559353c2d605536822c024536d..26a761a69ee33ddc24912826941df86c64bdfbde 100644
--- a/scipost_django/journals/views.py
+++ b/scipost_django/journals/views.py
@@ -210,7 +210,10 @@ def landing_page(request, doi_label):
     The landing page of a Journal lists either the latest and the current issue of a Journal
     or paginates its individual Publications.
     """
+    print(doi_label)
     journal = get_object_or_404(Journal, doi_label=doi_label)
+    print(journal)
+    print(len(Submission.objects.accepted()))
     accepted_submission_ids = [sub.id for sub in Submission.objects.accepted() \
                                if sub.editorial_decision.for_journal==journal]
     context = {
@@ -907,10 +910,12 @@ def metadata_xml_deposit(request, doi_label, option='test'):
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
 def mark_deposit_success(request, deposit_id, success):
     deposit = get_object_or_404(Deposit, pk=deposit_id)
-    if success == '1':
+    if success == 1:
         deposit.deposit_successful = True
-    elif success == '0':
+    elif success == 0:
         deposit.deposit_successful = False
+    else:
+        return Http404
     deposit.save()
     return redirect('journals:manage_metadata')
 
@@ -1097,10 +1102,12 @@ def request_pubfrac_check(request, doi_label):
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
 def mark_doaj_deposit_success(request, deposit_id, success):
     deposit = get_object_or_404(DOAJDeposit, pk=deposit_id)
-    if success == '1':
+    if success == 1:
         deposit.deposit_successful = True
-    elif success == '0':
+    elif success == 0:
         deposit.deposit_successful = False
+    else:
+        raise Http404
     deposit.save()
     return redirect('journals:manage_metadata')
 
@@ -1234,10 +1241,12 @@ def manage_update_metadata(request):
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
 def mark_report_doi_needed(request, report_id, needed):
     report = get_object_or_404(Report, pk=report_id)
-    if needed == '1':
+    if needed == 1:
         report.needs_doi = True
-    elif needed == '0':
+    elif needed == 0:
         report.needs_doi = False
+    else:
+        raise Http404
     report.save()
     return redirect(reverse('journals:manage_report_metadata'))
 
@@ -1245,10 +1254,12 @@ def mark_report_doi_needed(request, report_id, needed):
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
 def mark_comment_doi_needed(request, comment_id, needed):
     comment = get_object_or_404(Comment, pk=comment_id)
-    if needed == '1':
+    if needed == 1:
         comment.needs_doi = True
-    elif needed == '0':
+    elif needed == 0:
         comment.needs_doi = False
+    else:
+        raise Http404
     comment.save()
     return redirect(reverse('journals:manage_comment_metadata'))
 
@@ -1418,12 +1429,14 @@ def generic_metadata_xml_deposit(request, **kwargs):
 @permission_required('scipost.can_publish_accepted_submission', return_403=True)
 def mark_generic_deposit_success(request, deposit_id, success):
     deposit = get_object_or_404(GenericDOIDeposit, pk=deposit_id)
-    if success == '1':
+    if success == 1:
         deposit.deposit_successful = True
         deposit.content_object.doideposit_needs_updating = False
         deposit.content_object.save()
-    elif success == '0':
+    elif success == 0:
         deposit.deposit_successful = False
+    else:
+        raise Http404
     deposit.save()
     if deposit.content_type.name == 'report':
         return redirect(reverse('journals:manage_report_metadata'))
diff --git a/scipost_django/mailing_lists/urls.py b/scipost_django/mailing_lists/urls.py
index c3abb11cf84a1d963b086b940c1a4b9258da0295..cb5463424b2ba2dafa656fb15b4cc4fadf4ff52d 100644
--- a/scipost_django/mailing_lists/urls.py
+++ b/scipost_django/mailing_lists/urls.py
@@ -2,7 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
+from django.urls import path
 
 from . import views
 
@@ -10,10 +10,29 @@ app_name = 'mailing_lists'
 
 urlpatterns = [
     # Mailchimp
-    url(r'^$', views.MailchimpListView.as_view(), name='overview'),
-    url(r'^sync$', views.syncronize_lists, name='sync_lists'),
-    url(r'^sync/(?P<list_id>[0-9a-zA-Z]+)/members$', views.syncronize_members, name='sync_members'),
-    url(r'^(?P<list_id>[0-9a-zA-Z]+)/$', views.ListDetailView.as_view(), name='list_detail'),
-    url(r'^non_registered/export$', views.export_non_registered_invitations,
-        name='export_non_registered_invitations'),
+    path(
+        '',
+        views.MailchimpListView.as_view(),
+        name='overview'
+    ),
+    path(
+        'sync',
+        views.syncronize_lists,
+        name='sync_lists'
+    ),
+    path(
+        'sync/<str:list_id>/members',
+        views.syncronize_members,
+        name='sync_members'
+    ),
+    path(
+        '<str:list_id>/',
+        views.ListDetailView.as_view(),
+        name='list_detail'
+    ),
+    path(
+        'non_registered/export',
+        views.export_non_registered_invitations,
+        name='export_non_registered_invitations'
+    ),
 ]
diff --git a/scipost_django/markup/urls.py b/scipost_django/markup/urls.py
index dd40e75981328843a434980e57144cd64c8c689e..be914d898485676be8e6dbe73ab8e81d8fb216fa 100644
--- a/scipost_django/markup/urls.py
+++ b/scipost_django/markup/urls.py
@@ -2,7 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
+from django.urls import path
 
 from . import views
 
@@ -10,28 +10,28 @@ app_name = 'markup'
 
 urlpatterns = [
 
-    url(
-        r'^process/$',
+    path(
+        'process/',
         views.process,
         name='process'
     ),
-    url(
-        r'^help/$',
+    path(
+        'help/',
         views.markup_help,
         name='help'
     ),
-    url(
-        r'^help/plaintext$',
+    path(
+        'help/plaintext',
         views.plaintext_help,
         name='plaintext_help'
     ),
-    url(
-        r'^help/Markdown$',
+    path(
+        'help/Markdown',
         views.markdown_help,
         name='markdown_help'
     ),
-    url(
-        r'^help/reStructuredText$',
+    path(
+        'help/reStructuredText',
         views.restructuredtext_help,
         name='restructuredtext_help'
     ),
diff --git a/scipost_django/news/urls.py b/scipost_django/news/urls.py
index e6209bd7ed0993bd242bf420ca5658039de88941..116efb248331d1af99f8659d0dccb1cd2aad6c74 100644
--- a/scipost_django/news/urls.py
+++ b/scipost_django/news/urls.py
@@ -2,43 +2,64 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
+from django.urls import path
 
 from . import views
 
 app_name = 'news'
 
 urlpatterns = [
-    url(r'^manage/$',
+    path(
+        'manage/',
         views.NewsManageView.as_view(),
-        name='manage'),
-    url(r'^newsletter/(?P<year>[0-9]{4,})-(?P<month>[0-9]{2,})-(?P<day>[0-9]{2,})/$',
+        name='manage'
+    ),
+    path(
+        'newsletter/<YYYY:year>-<MM:month>-<DD:day>/',
         views.NewsLetterView.as_view(),
-        name='newsletter_detail'),
-    url(r'^newsletter/add/$',
+        name='newsletter_detail'
+    ),
+    path(
+        'newsletter/add/',
         views.NewsLetterCreateView.as_view(),
-        name='newsletter_create'),
-    url(r'^newsletter/(?P<pk>[0-9]+)/update/$',
+        name='newsletter_create'
+    ),
+    path(
+        'newsletter/<int:pk>/update/',
         views.NewsLetterUpdateView.as_view(),
-        name='newsletter_update'),
-    url(r'^newsletter/(?P<pk>[0-9]+)/update_ordering/$',
-        #views.NewsLetterNewsItemsOrderingUpdateView.as_view(),
+        name='newsletter_update'
+    ),
+    path(
+        'newsletter/<int:pk>/update_ordering/',
         views.newsletter_update_ordering,
-        name='newsletter_update_ordering'),
-    url(r'^newsletter/(?P<pk>[0-9]+)/delete/$',
+        name='newsletter_update_ordering'
+    ),
+    path(
+        'newsletter/<int:pk>/delete/',
         views.NewsLetterDeleteView.as_view(),
-        name='newsletter_delete'),
-    url(r'^newsitem/add/$',
+        name='newsletter_delete'
+    ),
+    path(
+        'newsitem/add/',
         views.NewsItemCreateView.as_view(),
-        name='newsitem_create'),
-    url(r'^newsitem/(?P<pk>[0-9]+)/update/$',
+        name='newsitem_create'
+    ),
+    path(
+        'newsitem/<int:pk>/update/',
         views.NewsItemUpdateView.as_view(),
-        name='newsitem_update'),
-    url(r'^newsitem/(?P<pk>[0-9]+)/delete/$',
+        name='newsitem_update'
+    ),
+    path(
+        'newsitem/<int:pk>/delete/',
         views.NewsItemDeleteView.as_view(),
-        name='newsitem_delete'),
-    url(r'^add_newsitem_to_newsletter/(?P<nlpk>[0-9]+)/$',
+        name='newsitem_delete'
+    ),
+    path(
+        'add_newsitem_to_newsletter/<int:nlpk>/',
         views.NewsLetterNewsItemsTableCreateView.as_view(),
-        name='add_newsitem_to_newsletter'),
-    url(r'^$', views.NewsListView.as_view(), name='news'),
+        name='add_newsitem_to_newsletter'
+    ),
+    path(
+        '', views.NewsListView.as_view(), name='news'
+    ),
 ]
diff --git a/scipost_django/news/views.py b/scipost_django/news/views.py
index 80f1864ccf8252349efe293e400446bf7027d80e..71cb4b805e6073a6721a6df607d5ed50d0ff72be 100644
--- a/scipost_django/news/views.py
+++ b/scipost_django/news/views.py
@@ -84,36 +84,6 @@ def newsletter_update_ordering(request, pk):
     return render(request, 'news/newsletter_update_ordering.html', context)
 
 
-class NewsLetterNewsItemsOrderingUpdateView(PermissionsMixin, UpdateView):
-    """
-    Update the ordering of News Items within a Newsletter.
-    """
-    permission_required = 'scipost.can_manage_news'
-    model = NewsLetterNewsItemsTable
-    fields = ['order']
-    template_name = 'news/newsletter_update_ordering.html'
-    success_url = reverse_lazy('news:news')
-
-    def get_context_data(self, **kwargs):
-        context = super().get_context_data(**kwargs)
-        newsletter = get_object_or_404(NewsLetter, id=self.kwargs['pk'])
-        context['ni_formset'] = NewsLetterNewsItemsOrderingFormSet(
-            self.request.POST or None,
-            queryset=newsletter.newsletternewsitemstable_set.order_by('order'))
-        return context
-
-    # def form_valid(self, form):
-    #     context = self.get_context_data()
-    #     ni_formset = context['ni_formset']
-    #     if ni_formset.is_valid():
-    #         # self.object = form.save()
-    #         # ni_formset.instance = self.object
-    #         ni_formset.save()
-    #         return redirect(self.success_url)
-    #     else:
-    #         return self.render_to_response(self.get_context_data(form=form))
-
-
 class NewsLetterDeleteView(PermissionsMixin, DeleteView):
     """
     Delete a NewsLetter.
diff --git a/scipost_django/ontology/urls.py b/scipost_django/ontology/urls.py
index dba3e54cb66b9d39f1a53c317023135bc695b9dc..f9b9bef54e6044129992018cbfa5fe8420eee37d 100644
--- a/scipost_django/ontology/urls.py
+++ b/scipost_django/ontology/urls.py
@@ -2,7 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
 from django.urls import path
 
 from . import views
@@ -35,48 +34,48 @@ urlpatterns = [
         views.TopicLinkedAutocompleteView.as_view(),
         name='topic-linked-autocomplete',
     ),
-    url(
-        r'^$',
+    path(
+        '',
         views.ontology,
         name='ontology'
     ),
-    url(
-        r'^topic/add/$',
+    path(
+        'topic/add/',
         views.TopicCreateView.as_view(),
         name='topic_create'
     ),
-    url(
-        r'^topic/(?P<slug>[-\w]+)/add_tags/$',
+    path(
+        'topic/<slug:slug>/add_tags/',
         views.topic_add_tags,
         name='topic_add_tags'
     ),
-    url(
-        r'^topic/(?P<slug>[-\w]+)/remove_tag/(?P<tag_id>[0-9]+)/$',
+    path(
+        'topic/<slug:slug>/remove_tag/<int:tag_id>/',
         views.topic_remove_tag,
         name='topic_remove_tag'
     ),
-    url(
-        r'^topic/(?P<slug>[-\w]+)/update/$',
+    path(
+        'topic/<slug:slug>/update/',
         views.TopicUpdateView.as_view(),
         name='topic_update'
     ),
-    url(
-        r'^topic/(?P<slug>[-\w]+)/$',
+    path(
+        'topic/<slug:slug>/',
         views.TopicDetailView.as_view(),
         name='topic_details'
     ),
-    url(
-        r'^topics/$',
+    path(
+        'topics/',
         views.TopicListView.as_view(),
         name='topics'
     ),
-    url(
-        r'^add_relation_asym/(?P<slug>[-\w]+)/$',
+    path(
+        'add_relation_asym/<slug:slug>/',
         views.add_relation_asym,
         name='add_relation_asym'
     ),
-    url(
-        r'^delete_relation_asym/(?P<relation_id>[0-9]+)/(?P<slug>[-\w]+)/$',
+    path(
+        'delete_relation_asym/<int:relation_id>/<slug:slug>/',
         views.delete_relation_asym,
         name='delete_relation_asym'
     ),
diff --git a/scipost_django/organizations/urls.py b/scipost_django/organizations/urls.py
index 4284fec2a6787fe425dccd668a6441d1f120dcbc..9cc17ef6188bcfec63934093701b4a89cab69a46 100644
--- a/scipost_django/organizations/urls.py
+++ b/scipost_django/organizations/urls.py
@@ -2,7 +2,6 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
 from django.urls import path
 
 from . import views
@@ -15,123 +14,124 @@ urlpatterns = [
         views.OrganizationAutocompleteView.as_view(),
         name='organization-autocomplete',
         ),
-    url(
-        r'^$',
+    path(
+        '',
         views.OrganizationListView.as_view(),
         name='organizations'
     ),
-    url(
-        r'^add/$',
+    path(
+        'add/',
         views.OrganizationCreateView.as_view(),
         name='organization_create'
     ),
-    url(
-        r'^(?P<pk>[0-9]+)/update/$',
+    path(
+        '<int:pk>/update/',
         views.OrganizationUpdateView.as_view(),
         name='organization_update'
     ),
-    url(
-        r'^(?P<pk>[0-9]+)/delete/$',
+    path(
+        '<int:pk>/delete/',
         views.OrganizationDeleteView.as_view(),
         name='organization_delete'
     ),
-    url(
-        r'^(?P<pk>[0-9]+)/$',
+    path(
+        '<int:pk>/',
         views.OrganizationDetailView.as_view(),
         name='organization_detail'
     ),
-    url(
-        r'^get_organization_detail$',
+    path(
+        'get_organization_detail',
         views.get_organization_detail,
         name='get_organization_detail'
     ),
-    url(
-        r'^(?P<pk>[0-9]+)/orgevent/add/$',
+    path(
+        '<int:pk>/orgevent/add/',
         views.OrganizationEventCreateView.as_view(),
         name='organizationevent_create'
     ),
-    url(
-        r'^organizationevents/$',
+    path(
+        'organizationevents/',
         views.OrganizationEventListView.as_view(),
         name='organizationevent_list'
     ),
-    url(
-        r'^add_contactperson/(?P<organization_id>[0-9]+)/$',
+    path(
+        'add_contactperson/<organization_id>/',
         views.ContactPersonCreateView.as_view(),
         name='contactperson_create'
     ),
-    url(
-        r'^contactperson/add/$',
+    path(
+        'contactperson/add/',
         views.ContactPersonCreateView.as_view(),
         name='contactperson_create'
     ),
-    url(
-        r'^contactperson/(?P<pk>[0-9]+)/update/$',
+    path(
+        'contactperson/<int:pk>/update/',
         views.ContactPersonUpdateView.as_view(),
         name='contactperson_update'
     ),
-    url(
-        r'^contactperson/(?P<pk>[0-9]+)/delete/$',
+    path(
+        'contactperson/<int:pk>/delete/',
         views.ContactPersonDeleteView.as_view(),
         name='contactperson_delete'
     ),
-    url(
-        r'^contactpersons/$',
+    path(
+        'contactpersons/',
         views.ContactPersonListView.as_view(),
         name='contactperson_list'
     ),
-    url(
-        r'^contactperson/(?P<contactperson_id>[0-9]+)/email/(?P<mail>followup)$',
+    path(
+        'contactperson/<int:contactperson_id>/email/<str:mail>',
         views.email_contactperson,
         name='email_contactperson'
     ),
-    url(
-        r'^contactperson/(?P<contactperson_id>[0-9]+)/email/$',
+    path(
+        'contactperson/<int:contactperson_id>/email/',
         views.email_contactperson,
         name='email_contactperson'
     ),
-    url(
+    path(
         # For upgrading a ContactPerson to a Contact
-        r'^add_contact/(?P<organization_id>[0-9]+)/(?P<contactperson_id>[0-9]+)/$',
+        'add_contact/<int:organization_id>/<int:contactperson_id>/',
         views.organization_add_contact,
         name='add_contact'
     ),
-    url(
-        r'^add_contact/(?P<organization_id>[0-9]+)/$',
+    path(
+        'add_contact/<int:organization_id>/',
         views.organization_add_contact,
         name='add_contact'
     ),
-    url(
-        r'^activate/(?P<activation_key>.+)$',
+    path(
+        'activate/<str:activation_key>',
         views.activate_account,
         name='activate_account'
     ),
-    url(
-        r'^dashboard/$',
+    path(
+        'dashboard/',
         views.dashboard,
         name='dashboard'
     ),
-    url(r'^contact/(?P<pk>[0-9]+)/$',
+    path(
+        'contact/<int:pk>/',
         views.ContactDetailView.as_view(),
         name='contact_details'
     ),
-    url(
-        r'^contactrole/(?P<pk>[0-9]+)/update/$',
+    path(
+        'contactrole/<int:pk>/update/',
         views.ContactRoleUpdateView.as_view(),
         name='contactrole_update'
     ),
-    url(
-        r'^contactrole/(?P<pk>[0-9]+)/delete/$',
+    path(
+        'contactrole/<int:pk>/delete/',
         views.ContactRoleDeleteView.as_view(),
         name='contactrole_delete'
     ),
-    url(
-        r'^contactrole/(?P<contactrole_id>[0-9]+)/email/(?P<mail>renewal)$',
+    path(
+        'contactrole/<contactrole_id>/email/<str:mail>',
         views.email_contactrole,
         name='email_contactrole'
     ),
-    url(
-        r'^contactrole/(?P<contactrole_id>[0-9]+)/email/$',
+    path(
+        'contactrole/<contactrole_id>/email/',
         views.email_contactrole,
         name='email_contactrole'
     ),
diff --git a/scipost_django/organizations/views.py b/scipost_django/organizations/views.py
index 077aa0819a7be1b33dd27dcb45ef4b6540773dbb..95e43ce0be3c82a8b2d53577e003d677c1bb014a 100644
--- a/scipost_django/organizations/views.py
+++ b/scipost_django/organizations/views.py
@@ -430,6 +430,7 @@ class ContactRoleDeleteView(PermissionsMixin, DeleteView):
 def email_contactrole(request, contactrole_id, mail=None):
     contactrole = get_object_or_404(ContactRole, pk=contactrole_id)
 
+    print(f'mail = {mail}')
     suffix = ''
     if mail == 'renewal':
         mail_code = 'org_contacts/contactrole_subsidy_renewal_mail'
diff --git a/scipost_django/petitions/urls.py b/scipost_django/petitions/urls.py
index e7e42d64db2fb27115b8b55c70b272953c728fbf..19c98d7f1e246aaae450928a36bb4b0ef4427485 100644
--- a/scipost_django/petitions/urls.py
+++ b/scipost_django/petitions/urls.py
@@ -2,14 +2,21 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
+from django.urls import path
 
 from . import views
 
 app_name = 'petitions'
 
 urlpatterns = [
-    url(r'^(?P<slug>[-\w]+)/verify_signature/(?P<key>.+)$',
-        views.verify_signature, name='verify_signature'),
-    url(r'^(?P<slug>[-\w]+)$', views.petition, name='petition'),
+    path(
+        '<slug:slug>/verify_signature/<str:key>',
+        views.verify_signature,
+        name='verify_signature'
+    ),
+    path(
+        '<slug:slug>',
+        views.petition,
+        name='petition'
+    ),
 ]
diff --git a/scipost_django/preprints/urls.py b/scipost_django/preprints/urls.py
index d683be114944e74633fb0313d210404cd1c99a44..71cc84bde5ba703098b6f07ede5ef73ed2d6ceea 100644
--- a/scipost_django/preprints/urls.py
+++ b/scipost_django/preprints/urls.py
@@ -2,19 +2,22 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
+from django.urls import path
 
 from . import views
 
-from submissions.constants import SUBMISSIONS_WO_VN_REGEX, SUBMISSIONS_COMPLETE_REGEX
 
 app_name = 'preprints'
 
 urlpatterns = [
-    url(r'^{regex}/$'.format(regex=SUBMISSIONS_WO_VN_REGEX),
+    path(
+        '<identifier_wo_vn_nr:identifier_wo_vn_nr>/',
         views.preprint_pdf_wo_vn_nr,
-        name='preprint_wo_vn_nr'),
-    url(r'^{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+        name='preprint_wo_vn_nr'
+    ),
+    path(
+        '<identifier:identifier_w_vn_nr>/',
         views.preprint_pdf,
-        name='pdf'),
+        name='pdf'
+    ),
 ]
diff --git a/scipost_django/preprints/views.py b/scipost_django/preprints/views.py
index fafc358b3bf3b8444ec66b2336b3f11542b708e8..212ee89f16fe61783d379173cb00a2653f526d93 100644
--- a/scipost_django/preprints/views.py
+++ b/scipost_django/preprints/views.py
@@ -17,6 +17,7 @@ def preprint_pdf_wo_vn_nr(request, identifier_wo_vn_nr):
     """
     submissions = get_list_or_404(
         Submission, preprint__identifier_w_vn_nr__startswith=identifier_wo_vn_nr)
+    print(submissions)
     latest = submissions[0].get_latest_version()
     return redirect(reverse(
         'preprints:pdf',
diff --git a/scipost_django/scipost/urls.py b/scipost_django/scipost/urls.py
index b58cf497f7401f1c001fe327f213885d896e0c13..a748fd02b57eb3d3192fd39bb68bc4bbcac9182c 100644
--- a/scipost_django/scipost/urls.py
+++ b/scipost_django/scipost/urls.py
@@ -29,12 +29,19 @@ app_name = 'scipost'
 urlpatterns = [
 
     # redirect for favicon
-    re_path(r'^favicon\.ico$', favicon_view),
+    path(
+        'favicon\.ico',
+        favicon_view
+    ),
 
     # Utilities:
 
     # Test Sentry installation
-    url(r'sentry-debug/$', views.trigger_error, name='trigger_error'),
+    path(
+        'sentry-debug/',
+        views.trigger_error,
+        name='trigger_error'
+    ),
 
     # Autocomplete
     path(
@@ -49,75 +56,162 @@ urlpatterns = [
     ),
 
     # Search
-    url(r'^search_old$', views.SearchView.as_view(), name='search_old'),
-    url(
-        r'^search$',
+    path(
+        'search_old',
+        views.SearchView.as_view(),
+        name='search_old'
+    ),
+    path(
+        'search',
         TemplateView.as_view(template_name='search/search.html'),
         name='search'
     ),
-    url(r'^$', views.index, name='index'),
-    url(r'^files/secure/(?P<path>.*)$', views.protected_serve, name='secure_file'),
+    path(
+        '',
+        views.index,
+        name='index'
+    ),
+    path(
+        'files/secure/<path:path>',
+        views.protected_serve,
+        name='secure_file'
+    ),
 
     # General use pages
-    url(r'^error$', TemplateView.as_view(template_name='scipost/error.html'), name='error'),
-    url(r'^acknowledgement$', TemplateView.as_view(template_name='scipost/acknowledgement.html'),
-        name='acknowledgement'),
+    path(
+        'error',
+        TemplateView.as_view(
+            template_name='scipost/error.html'),
+        name='error'
+    ),
+    path(
+        'acknowledgement',
+        TemplateView.as_view(
+            template_name='scipost/acknowledgement.html'),
+        name='acknowledgement'
+    ),
 
     # Info
-    url(r'^about$', TemplateView.as_view(template_name='scipost/about.html'), name='about'),
+    path(
+        'about',
+        TemplateView.as_view(
+            template_name='scipost/about.html'),
+        name='about'
+    ),
     path(
         'contact',
         TemplateView.as_view(template_name='scipost/contact.html'),
         name='contact'
     ),
-    url(r'^call$', TemplateView.as_view(template_name='scipost/call.html'), name='call'),
-    url(r'^donations/thank-you/$', TemplateView.as_view(template_name='scipost/donation_thank_you.html'), name='donation_thank_you'),
-    url(
-        r'^ExpSustDrive2018$',
+    path(
+        'call',
+        TemplateView.as_view(
+            template_name='scipost/call.html'),
+        name='call'
+    ),
+    path(
+        'donations/thank-you/',
+        TemplateView.as_view(
+            template_name='scipost/donation_thank_you.html'),
+        name='donation_thank_you'
+    ),
+    path(
+        'ExpSustDrive2018',
         TemplateView.as_view(template_name='scipost/ExpSustDrive2018.html'),
         name='ExpSustDrive2018'
     ),
-    url(
-        r'^PlanSciPost$',
+    path(
+        'PlanSciPost',
         TemplateView.as_view(template_name='scipost/PlanSciPost.html'),
         name='PlanSciPost'
     ),
-    url(r'^foundation$', TemplateView.as_view(template_name='scipost/foundation.html'),
-        name='foundation'),
-    url(r'^tour$', TemplateView.as_view(template_name='scipost/quick_tour.html'),
-        name='quick_tour'),
-    url(r'^FAQ$', TemplateView.as_view(template_name='scipost/FAQ.html'), name='FAQ'),
-    url(r'^terms_and_conditions$',
+    path(
+        'foundation',
+        TemplateView.as_view(template_name='scipost/foundation.html'),
+        name='foundation'
+    ),
+    path(
+        'tour',
+        TemplateView.as_view(template_name='scipost/quick_tour.html'),
+        name='quick_tour'
+    ),
+    path(
+        'FAQ',
+        TemplateView.as_view(template_name='scipost/FAQ.html'),
+        name='FAQ'
+    ),
+    path(
+        'terms_and_conditions',
         TemplateView.as_view(template_name='scipost/terms_and_conditions.html'),
-        name='terms_and_conditions'),
-    url(r'^privacy_policy$', TemplateView.as_view(template_name='scipost/privacy_policy.html'),
-        name='privacy_policy'),
+        name='terms_and_conditions'
+    ),
+    path(
+        'privacy_policy',
+        TemplateView.as_view(template_name='scipost/privacy_policy.html'),
+        name='privacy_policy'
+    ),
 
     # Feeds
-    url(r'^feeds$', views.feeds, name='feeds'),
-    url(r'^rss/news/$', LatestNewsFeedRSS(), name='feeds_rss_news'),
-    url(r'^atom/news/$', LatestNewsFeedAtom(), name='feeds_atom_news'),
-    url(r'^rss/comments/$', LatestCommentsFeedRSS(), name='feeds_rss_comments'),
-    url(r'^atom/comments/$', LatestCommentsFeedAtom(), name='feeds_atom_comments'),
-    url(r'^rss/submissions/$', LatestSubmissionsFeedRSS(), name='feeds_rss_submissions'),
+    path(
+        'feeds',
+        views.feeds,
+        name='feeds'
+    ),
+    path(
+        'rss/news/',
+        LatestNewsFeedRSS(),
+        name='feeds_rss_news'
+    ),
+    path(
+        'atom/news/',
+        LatestNewsFeedAtom(),
+        name='feeds_atom_news'
+    ),
+    path(
+        'rss/comments/',
+        LatestCommentsFeedRSS(),
+        name='feeds_rss_comments'
+    ),
+    path(
+        'atom/comments/',
+        LatestCommentsFeedAtom(),
+        name='feeds_atom_comments'
+    ),
+    path(
+        'rss/submissions/',
+        LatestSubmissionsFeedRSS(),
+        name='feeds_rss_submissions'
+    ),
     path(
         'rss/submissions/<specialty:specialty>',
         LatestSubmissionsFeedRSS(),
         name='sub_feed_spec_rss'
     ),
-    url(r'^atom/submissions/$', LatestSubmissionsFeedAtom(), name='feeds_atom_submissions'),
+    path(
+        'atom/submissions/',
+        LatestSubmissionsFeedAtom(),
+        name='feeds_atom_submissions'
+    ),
     path(
         'atom/submissions/<specialty:specialty>',
         LatestSubmissionsFeedAtom(),
         name='sub_feed_spec_atom'
     ),
-    url(r'^rss/publications/$', LatestPublicationsFeedRSS(), name='feeds_rss_publications'),
+    path(
+        'rss/publications/',
+        LatestPublicationsFeedRSS(),
+        name='feeds_rss_publications'
+    ),
     path(
         'rss/publications/<specialty:specialty>',
         LatestPublicationsFeedRSS(),
         name='pub_feed_spec_rss'
     ),
-    url(r'^atom/publications/$', LatestPublicationsFeedAtom(), name='feeds_atom_publications'),
+    path(
+        'atom/publications/',
+        LatestPublicationsFeedAtom(),
+        name='feeds_atom_publications'
+    ),
     path(
         'atom/publications/<specialty:specialty>',
         LatestPublicationsFeedAtom(),
@@ -130,54 +224,90 @@ urlpatterns = [
     ################
 
     # Contributor info (public view)
-    url(r'^contributor/(?P<contributor_id>[0-9]+)$', views.contributor_info,
-        name="contributor_info"),
+    path(
+        'contributor/<int:contributor_id>',
+        views.contributor_info,
+        name='contributor_info'
+    ),
 
     # Registration
-    url(r'^register$', views.register, name='register'),
-    url(r'^thanks_for_registering$',
-        TemplateView.as_view(template_name='scipost/thanks_for_registering.html'),
-        name='thanks_for_registering'),
-    url(r'^activation/(?P<contributor_id>[0-9]+)/(?P<key>.+)/$',
-        views.activation, name='activation'),
-    url(r'^activation/(?P<contributor_id>[0-9]+)/(?P<key>.+)/renew$',
-        views.request_new_activation_link, name='request_new_activation_link'),
-    url(r'^unsubscribe/(?P<contributor_id>[0-9]+)/(?P<key>.+)$', views.unsubscribe,
-        name='unsubscribe'),
-    url(r'^vet_registration_requests$',
-        views.vet_registration_requests, name='vet_registration_requests'),
-    url(r'^vet_registration_request_ack/(?P<contributor_id>[0-9]+)$',
-        views.vet_registration_request_ack, name='vet_registration_request_ack'),
-    url(r'^registration_requests$', views.registration_requests, name="registration_requests"),
-    url(r'^registration_requests/(?P<contributor_id>[0-9]+)/reset$',
-        views.registration_requests_reset, name="registration_requests_reset"),
+    path(
+        'register',
+        views.register,
+        name='register'
+    ),
+    path(
+        'thanks_for_registering',
+        TemplateView.as_view(
+            template_name='scipost/thanks_for_registering.html'),
+        name='thanks_for_registering'
+    ),
+    path(
+        'activation/<int:contributor_id>/<str:key>/',
+        views.activation,
+        name='activation'
+    ),
+    path(
+        'activation/<int:contributor_id>/<str:key>/renew',
+        views.request_new_activation_link,
+        name='request_new_activation_link'
+    ),
+    path(
+        'unsubscribe/<int:contributor_id>/<str:key>',
+        views.unsubscribe,
+        name='unsubscribe'
+    ),
+    path(
+        'vet_registration_requests',
+        views.vet_registration_requests,
+        name='vet_registration_requests'
+    ),
+    path(
+        'vet_registration_request_ack/<int:contributor_id>',
+        views.vet_registration_request_ack,
+        name='vet_registration_request_ack'
+    ),
+    path(
+        'registration_requests',
+        views.registration_requests,
+        name='registration_requests'
+    ),
+    path(
+        'registration_requests/<int:contributor_id>/reset',
+        views.registration_requests_reset,
+        name='registration_requests_reset'
+    ),
 
     # Registration invitations (Never change this route! Thank you.)
-    url(r'^invitation/(?P<key>.+)$', views.invitation, name='invitation'),
+    path(
+        'invitation/<str:key>',
+        views.invitation,
+        name='invitation'
+    ),
 
     # Authentication
-    url(
-        r'^login/$',
+    path(
+        'login/',
         views.SciPostLoginView.as_view(),
         name='login'
     ),
-    url(
-        r'^login/info/$',
+    path(
+        'login/info/',
         views.raw_user_auth_info,
         name='login_info'
     ),
-    url(
-        r'^logout/$',
+    path(
+        'logout/',
         views.SciPostLogoutView.as_view(),
         name='logout'
     ),
-    url(
-        r'^password_change$',
+    path(
+        'password_change',
         views.SciPostPasswordChangeView.as_view(),
         name='password_change'
     ),
-    url(
-        r'^password_reset/$',
+    path(
+        'password_reset/',
         views.SciPostPasswordResetView.as_view(),
         name='password_reset'
     ),
@@ -186,10 +316,26 @@ urlpatterns = [
         views.SciPostPasswordResetConfirmView.as_view(),
         name='password_reset_confirm'
     ),
-    url(r'^update_personal_data$', views.update_personal_data, name='update_personal_data'),
-    url(r'^totp/$', views.TOTPListView.as_view(), name='totp'),
-    url(r'^totp/create$', views.TOTPDeviceCreateView.as_view(), name='totp_create'),
-    url(r'^totp/(?P<device_id>[0-9]+)/delete$', views.TOTPDeviceDeleteView.as_view(), name='totp_delete'),
+    path(
+        'update_personal_data',
+        views.update_personal_data,
+        name='update_personal_data'
+    ),
+    path(
+        'totp/',
+        views.TOTPListView.as_view(),
+        name='totp'
+    ),
+    path(
+        'totp/create',
+        views.TOTPDeviceCreateView.as_view(),
+        name='totp_create'
+    ),
+    path(
+        'totp/<int:device_id>/delete',
+        views.TOTPDeviceDeleteView.as_view(),
+        name='totp_delete'
+    ),
 
     # Single sign-on [for GitLab: see api/urls]
     path(
@@ -199,128 +345,232 @@ urlpatterns = [
     ),
 
     # Personal Page
-    url(r'^personal_page/$', views.personal_page, name='personal_page'),
-    url(r'^personal_page/account$', views.personal_page,
-        name='personal_page_account', kwargs={'tab': 'account'}),
-    url(r'^personal_page/admin_actions$', views.personal_page,
-        name='personal_page_admin_actions', kwargs={'tab': 'admin_actions'}),
-    url(r'^personal_page/editorial_actions$', views.personal_page,
-        name='personal_page_editorial_actions', kwargs={'tab': 'editorial_actions'}),
-    url(r'^personal_page/refereeing$', views.personal_page,
-        name='personal_page_refereeing', kwargs={'tab': 'refereeing'}),
-    url(r'^personal_page/publications$', views.personal_page,
-        name='personal_page_publications', kwargs={'tab': 'publications'}),
-    url(r'^personal_page/submissions$', views.personal_page,
-        name='personal_page_submissions', kwargs={'tab': 'submissions'}),
-    url(r'^personal_page/commentaries$', views.personal_page,
-        name='personal_page_commentaries', kwargs={'tab': 'commentaries'}),
-    url(r'^personal_page/theses$', views.personal_page,
-        name='personal_page_theses', kwargs={'tab': 'theses'}),
-    url(r'^personal_page/comments$', views.personal_page,
-        name='personal_page_comments', kwargs={'tab': 'comments'}),
-    url(r'^personal_page/author_replies$', views.personal_page,
-        name='personal_page_author_replies', kwargs={'tab': 'author_replies'}),
+    path(
+        'personal_page/',
+        views.personal_page,
+        name='personal_page'
+    ),
+    path(
+        'personal_page/account',
+        views.personal_page,
+        name='personal_page_account', kwargs={'tab': 'account'}
+    ),
+    path(
+        'personal_page/admin_actions',
+        views.personal_page,
+        name='personal_page_admin_actions', kwargs={'tab': 'admin_actions'}
+    ),
+    path(
+        'personal_page/editorial_actions',
+        views.personal_page,
+        name='personal_page_editorial_actions', kwargs={'tab': 'editorial_actions'}
+    ),
+    path(
+        'personal_page/refereeing',
+        views.personal_page,
+        name='personal_page_refereeing', kwargs={'tab': 'refereeing'}
+    ),
+    path(
+        'personal_page/publications',
+        views.personal_page,
+        name='personal_page_publications', kwargs={'tab': 'publications'}
+    ),
+    path(
+        'personal_page/submissions',
+        views.personal_page,
+        name='personal_page_submissions', kwargs={'tab': 'submissions'}
+    ),
+    path(
+        'personal_page/commentaries',
+        views.personal_page,
+        name='personal_page_commentaries', kwargs={'tab': 'commentaries'}
+    ),
+    path(
+        'personal_page/theses',
+        views.personal_page,
+        name='personal_page_theses', kwargs={'tab': 'theses'}
+    ),
+    path(
+        'personal_page/comments',
+        views.personal_page,
+        name='personal_page_comments', kwargs={'tab': 'comments'}
+    ),
+    path(
+        'personal_page/author_replies',
+        views.personal_page,
+        name='personal_page_author_replies', kwargs={'tab': 'author_replies'}
+    ),
 
     # Unavailabilities
-    url(r'^unavailable_period$', views.mark_unavailable_period, name='mark_unavailable_period'),
-    url(r'^unavailable_period/(?P<period_id>[0-9]+)/delete$', views.delete_unavailable_period,
-        name='delete_unavailable_period'),
+    path(
+        'unavailable_period',
+        views.mark_unavailable_period,
+        name='mark_unavailable_period'
+    ),
+    path(
+        'unavailable_period/<int:period_id>/delete',
+        views.delete_unavailable_period,
+        name='delete_unavailable_period'
+    ),
 
     # Authorship claims
-    url(r'^claim_authorships$', views.claim_authorships, name="claim_authorships"),
-    url(r'^claim_sub_authorship/(?P<submission_id>[0-9]+)/(?P<claim>[0-1])$',
-        views.claim_sub_authorship, name='claim_sub_authorship'),
-    url(r'^claim_com_authorship/(?P<commentary_id>[0-9]+)/(?P<claim>[0-1])$',
-        views.claim_com_authorship, name='claim_com_authorship'),
-    url(r'^claim_thesis_authorship/(?P<thesis_id>[0-9]+)/(?P<claim>[0-1])$',
-        views.claim_thesis_authorship, name='claim_thesis_authorship'),
-    url(r'^vet_authorship_claims$', views.vet_authorship_claims, name="vet_authorship_claims"),
-    url(r'^vet_authorship_claim/(?P<claim_id>[0-9]+)/(?P<claim>[0-1])$',
-        views.vet_authorship_claim, name='vet_authorship_claim'),
+    path(
+        'claim_authorships',
+        views.claim_authorships,
+        name='claim_authorships'
+    ),
+    path(
+        'claim_sub_authorship/<int:submission_id>/<int:claim>',
+        views.claim_sub_authorship,
+        name='claim_sub_authorship'
+    ),
+    path(
+        'claim_com_authorship/<int:commentary_id>/<int:claim>',
+        views.claim_com_authorship,
+        name='claim_com_authorship'
+    ),
+    path(
+        'claim_thesis_authorship/<int:thesis_id>/<int:claim>',
+        views.claim_thesis_authorship,
+        name='claim_thesis_authorship'
+    ),
+    path(
+        'vet_authorship_claims',
+        views.vet_authorship_claims,
+        name='vet_authorship_claims'
+    ),
+    path(
+        'vet_authorship_claim/<int:claim_id>/<int:claim>',
+        views.vet_authorship_claim,
+        name='vet_authorship_claim'
+    ),
 
     # Potential duplicates
-    url(r'contributor_duplicates/$',
+    path(
+        'contributor_duplicates/',
         views.ContributorDuplicateListView.as_view(),
-        name='contributor_duplicates'),
-    url(r'contributor_merge/$',
+        name='contributor_duplicates'
+    ),
+    path(
+        'contributor_merge/',
         views.contributor_merge,
-        name='contributor_merge'),
+        name='contributor_merge'
+    ),
 
     ####################
     # Email facilities #
     ####################
-    url('^email_group_members$', views.email_group_members, name='email_group_members'),
-    url('^email_particular$', views.email_particular, name='email_particular'),
-    url('^send_precooked_email$', views.send_precooked_email, name='send_precooked_email'),
+    path(
+        'email_group_members',
+        views.email_group_members,
+        name='email_group_members'
+    ),
+    path(
+        'email_particular',
+        views.email_particular,
+        name='email_particular'
+    ),
+    path(
+        'send_precooked_email',
+        views.send_precooked_email,
+        name='send_precooked_email'
+    ),
 
     #####################
     # Editorial College #
     #####################
-    url(r'^EdCol_by-laws$', views.EdCol_bylaws, name='EdCol_by-laws'),
-    url(r'^EdCol_by-laws_Changes_2021_04$', views.EdCol_bylaws_Changes_2021_04, name='EdCol_by-laws_Changes_2021_04'),
+    path(
+        'EdCol_by-laws',
+        views.EdCol_bylaws,
+        name='EdCol_by-laws'
+    ),
+    path(
+        'EdCol_by-laws_Changes_2021_04',
+        views.EdCol_bylaws_Changes_2021_04,
+        name='EdCol_by-laws_Changes_2021_04'
+    ),
 
     ################
     # Publications #
     ################
 
     # Reports
-    url(r'^(?P<doi_label>SciPost.Report.[0-9]+)$',
-        journals_views.report_detail,
-        name='report_detail'),
-    url(r'^10.21468/(?P<doi_label>SciPost.Report.[0-9]+)$',
+    path(
+        '<report_doi_label:doi_label>',
         journals_views.report_detail,
-        name='report_detail'),
+        name='report_detail'
+    ),
 
     # Comments
-    url(r'^(?P<doi_label>SciPost.Comment.[0-9]+)$',
-        journals_views.comment_detail,
-        name='comment_detail'),
-    url(r'^10.21468/(?P<doi_label>SciPost.Comment.[0-9]+)$',
+    path(
+        '<comment_doi_label:doi_label>',
         journals_views.comment_detail,
-        name='comment_detail'),
+        name='comment_detail'
+    ),
 
     # Author Replies
-    url(r'^(?P<doi_label>SciPost.AuthorReply.[0-9]+)$',
-        journals_views.author_reply_detail,
-        name='author_reply_detail'),
-    url(r'^10.21468/(?P<doi_label>SciPost.AuthorReply.[0-9]+)$',
+    path(
+        '<author_reply_doi_label:doi_label>',
         journals_views.author_reply_detail,
-        name='author_reply_detail'),
+        name='author_reply_detail'
+    ),
 
     # Publication detail (+pdf)
-    url(r'^10.21468/{pattern}$'.format(pattern=DOI_DISPATCH_PATTERN),
-        journals_views.doi_dispatch, name='doi_dispatch'),
-    url(r'^{pattern}$'.format(pattern=DOI_DISPATCH_PATTERN),
-        journals_views.doi_dispatch, name='doi_dispatch'),
-    url(r'^10.21468/(?P<doi_label>{regex})$'.format(regex=PUBLICATION_DOI_LABEL_REGEX),
+    re_path(
+        '^10.21468/{pattern}$'.format(pattern=DOI_DISPATCH_PATTERN),
+        journals_views.doi_dispatch,
+        name='doi_dispatch'
+    ),
+    re_path(
+        '^{pattern}$'.format(pattern=DOI_DISPATCH_PATTERN),
+        journals_views.doi_dispatch,
+        name='doi_dispatch'
+    ),
+    path(
+        '10.21468/<publication_doi_label:doi_label>',
         journals_views.publication_detail,
-        name='publication_detail'),
-    url(r'^(?P<doi_label>{regex})$'.format(regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='publication_detail'
+    ),
+    path(
+        '<publication_doi_label:doi_label>',
         journals_views.publication_detail,
-        name='publication_detail'),
-    url(r'^10.21468/(?P<doi_label>{regex})/pdf$'.format(regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='publication_detail'
+    ),
+    path(
+        '10.21468/<publication_doi_label:doi_label>/pdf',
         journals_views.publication_detail_pdf,
-        name='publication_pdf'),
-    url(r'^(?P<doi_label>{regex})/pdf$'.format(regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='publication_pdf'
+    ),
+    path(
+        '<publication_doi_label:doi_label>/pdf',
         journals_views.publication_detail_pdf,
-        name='publication_pdf'),
+        name='publication_pdf'
+    ),
 
     # Publication updates
-    url(r'^(?P<doi_label>{regex})-update-(?P<update_nr>[0-9]+)$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+    path(
+        '<publication_doi_label:doi_label>-update-<int:update_nr>',
         journals_views.publication_update_detail,
-        name='publication_update_detail'),
-    url(r'^10.21468/(?P<doi_label>{regex})-update-(?P<update_nr>[0-9]+)$'.format(
-        regex=PUBLICATION_DOI_LABEL_REGEX),
+        name='publication_update_detail'
+    ),
+    path(
+        '10.21468/<publication_doi_label:doi_label>-update-<int:update_nr>',
         journals_views.publication_update_detail,
-        name='publication_update_detail'),
+        name='publication_update_detail'
+    ),
 
 
     # Journal issue
-    url(r'^10.21468/(?P<doi_label>{regex})$'.format(regex=ISSUE_DOI_LABEL_REGEX),
-        journals_views.issue_detail, name='issue_detail'),
-    url(r'^(?P<doi_label>{regex})$'.format(regex=ISSUE_DOI_LABEL_REGEX),
-        journals_views.issue_detail, name='issue_detail'),
+    path(
+        '10.21468/<issue_doi_label:doi_label>',
+        journals_views.issue_detail,
+        name='issue_detail'
+    ),
+    path(
+        '<issue_doi_label:doi_label>',
+        journals_views.issue_detail,
+        name='issue_detail'
+    ),
 
     # Journal landing page
     path(
@@ -344,23 +594,25 @@ urlpatterns = [
     # Howto guides #
     ################
 
-    url(r'^howto$',
+    path(
+        'howto',
         TemplateView.as_view(template_name='scipost/howto.html'),
-        name='howto'),
-    url(r'^howto/production$',
+        name='howto'
+    ),
+    path(
+        'howto/production',
         TemplateView.as_view(template_name='scipost/howto_production.html'),
-        name='howto_production'),
-
-    # Temporary fix, due to mails sent with wrong urls
-    url(r'^decline_ref_invitation/(?P<invitation_key>.+)$',
-        submission_views.decline_ref_invitation),
+        name='howto_production'
+    ),
 
 
     ########################
-    # Pawning verification #
+    # Pwning verification #
     ########################
 
-    url(r'^have-i-been-pwned-verification.txt$',
+    path(
+        'have-i-been-pwned-verification.txt',
         views.have_i_been_pwned,
-        name='have_i_been_pwned'),
+        name='have_i_been_pwned'
+    ),
 ]
diff --git a/scipost_django/scipost/views.py b/scipost_django/scipost/views.py
index a7b01bdf1a58228b64c9b89f89dc391ce558402a..418347755078f19565308d5024bab2d6b94c13e0 100644
--- a/scipost_django/scipost/views.py
+++ b/scipost_django/scipost/views.py
@@ -1017,12 +1017,14 @@ def claim_sub_authorship(request, submission_id, claim):
     if request.method == 'POST':
         contributor = Contributor.objects.get(user=request.user)
         submission = get_object_or_404(Submission, pk=submission_id)
-        if claim == '1':
+        if claim == 1:
             submission.authors_claims.add(contributor)
             newclaim = AuthorshipClaim(claimant=contributor, submission=submission)
             newclaim.save()
-        elif claim == '0':
+        elif claim == 0:
             submission.authors_false_claims.add(contributor)
+        else:
+            raise Http404
         submission.save()
     return redirect('scipost:claim_authorships')
 
@@ -1033,12 +1035,14 @@ def claim_com_authorship(request, commentary_id, claim):
     if request.method == 'POST':
         contributor = Contributor.objects.get(user=request.user)
         commentary = get_object_or_404(Commentary, pk=commentary_id)
-        if claim == '1':
+        if claim == 1:
             commentary.authors_claims.add(contributor)
             newclaim = AuthorshipClaim(claimant=contributor, commentary=commentary)
             newclaim.save()
-        elif claim == '0':
+        elif claim == 0:
             commentary.authors_false_claims.add(contributor)
+        else:
+            raise Http404
         commentary.save()
     return redirect('scipost:claim_authorships')
 
@@ -1049,12 +1053,14 @@ def claim_thesis_authorship(request, thesis_id, claim):
     if request.method == 'POST':
         contributor = Contributor.objects.get(user=request.user)
         thesislink = get_object_or_404(ThesisLink, pk=thesis_id)
-        if claim == '1':
+        if claim == 1:
             thesislink.author_claims.add(contributor)
             newclaim = AuthorshipClaim(claimant=contributor, thesislink=thesislink)
             newclaim.save()
-        elif claim == '0':
+        elif claim == 0:
             thesislink.author_false_claims.add(contributor)
+        else:
+            raise Http404
         thesislink.save()
     return redirect('scipost:claim_authorships')
 
diff --git a/scipost_django/submissions/converters.py b/scipost_django/submissions/converters.py
index 67294fb2cffb9a5d968928c7e85022bd90044951..5d67cc9a04e8ab43a2fa59a7285dea0315f0e8c0 100644
--- a/scipost_django/submissions/converters.py
+++ b/scipost_django/submissions/converters.py
@@ -4,8 +4,31 @@ __license__ = "AGPL v3"
 
 from django.urls.converters import StringConverter
 
-from .regexes import IDENTIFIER_REGEX
+from .regexes import IDENTIFIER_WO_VN_NR_REGEX, IDENTIFIER_REGEX
+
+
+class IdentifierWithoutVersionNumberConverter(StringConverter):
+    regex = IDENTIFIER_WO_VN_NR_REGEX
 
 
 class IdentifierConverter(StringConverter):
     regex = IDENTIFIER_REGEX
+
+
+class ReportDOILabelConverter:
+    regex = r'^(10.21468/)?SciPost.Report.[0-9]+'
+
+    def to_python(self, value):
+        """Strip the DOI prefix if present; check if Comment exists."""
+        doi_label = value
+        if doi_label.startswith('10.21468/'):
+            doi_label = doi_label.partition('10.21468/')[2]
+        from submissions.models import Report
+        try:
+            return Report.objects.get(doi_label=doi_label).doi_label
+        except Report.DoesNotExist:
+            return ValueError
+        return doi_label
+
+    def to_url(self, value):
+        return value
diff --git a/scipost_django/submissions/regexes.py b/scipost_django/submissions/regexes.py
index 63651859ec5921681186632732a3e84edbeb5223..88e2fefea31bfa36b886b11dab388f59bd5f08b4 100644
--- a/scipost_django/submissions/regexes.py
+++ b/scipost_django/submissions/regexes.py
@@ -21,7 +21,7 @@ socarxiv_regex = 'socarxiv_[a-z0-9]+'
 # Preprints with structurally no version number
 # (like OSFPreprints-based ones: SocArXiv, ...)
 # must not match SUBMISSIONS_WO_VN_REGEX to avoid ambiguities.
-SUBMISSIONS_WO_VN_REGEX = '|'.join([
+IDENTIFIER_WO_VN_NR_REGEX = '|'.join([
     scipost_regex_wo_vn,
     arxiv_regex_wo_vn,
     chemrxiv_regex_wo_vn,
diff --git a/scipost_django/submissions/urls.py b/scipost_django/submissions/urls.py
index ee8d3f336b2220df7f118d9152599d390c57fd48..91c4202ac3555c1200336f3d59e84483c19e080b 100644
--- a/scipost_django/submissions/urls.py
+++ b/scipost_django/submissions/urls.py
@@ -2,12 +2,10 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import url
 from django.urls import path, re_path
 from django.views.generic import TemplateView
 
 from . import views
-from .constants import SUBMISSIONS_WO_VN_REGEX, SUBMISSIONS_COMPLETE_REGEX
 
 app_name = 'submissions'
 
@@ -20,105 +18,169 @@ urlpatterns = [
         name='submission-autocomplete'
     ),
     # Submissions
-    url(r'^$', views.SubmissionListView.as_view(), name='submissions'),
-    url(r'^author_guidelines$',
-        TemplateView.as_view(template_name='submissions/author_guidelines.html'),
-        name='author_guidelines'),
-    url(r'^refereeing_procedure$',
-        TemplateView.as_view(template_name='submissions/refereeing_procedure.html'),
-        name='refereeing_procedure'),
-    url(r'^referee_guidelines$',
-        TemplateView.as_view(template_name='submissions/referee_guidelines.html'),
-        name='referee_guidelines'),
-    url(r'^{regex}/$'.format(regex=SUBMISSIONS_WO_VN_REGEX), views.submission_detail_wo_vn_nr,
-        name='submission_wo_vn_nr'),
-    url(r'^{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.submission_detail, name='submission'),
-    url(r'^{regex}/reports/(?P<report_nr>[0-9]+)/pdf$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.report_detail_pdf, name='report_detail_pdf'),
-    url(r'^{regex}/reports/(?P<report_nr>[0-9]+)/attachment$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX), views.report_attachment, name='report_attachment'),
-    url(r'^{regex}/reports/pdf$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.submission_refereeing_package_pdf, name='refereeing_package_pdf'),
+    path(
+        '',
+        views.SubmissionListView.as_view(),
+        name='submissions'
+    ),
+    path(
+        'author_guidelines',
+        TemplateView.as_view(
+            template_name='submissions/author_guidelines.html'),
+        name='author_guidelines'
+    ),
+    path(
+        'refereeing_procedure',
+        TemplateView.as_view(
+            template_name='submissions/refereeing_procedure.html'),
+        name='refereeing_procedure'
+    ),
+    path(
+        'referee_guidelines',
+        TemplateView.as_view(
+            template_name='submissions/referee_guidelines.html'),
+        name='referee_guidelines'
+    ),
+    path(
+        '<identifier_wo_vn_nr:identifier_wo_vn_nr>/',
+        views.submission_detail_wo_vn_nr,
+        name='submission_wo_vn_nr'
+    ),
+    path(
+        '<identifier:identifier_w_vn_nr>/',
+        views.submission_detail,
+        name='submission'
+    ),
+    path(
+        '<identifier:identifier_w_vn_nr>/reports/<int:report_nr>/pdf',
+        views.report_detail_pdf,
+        name='report_detail_pdf'
+    ),
+    path(
+        '<identifier:identifier_w_vn_nr>/reports/<int:report_nr>/attachment',
+        views.report_attachment,
+        name='report_attachment'
+    ),
+    path(
+        '<identifier:identifier_w_vn_nr>/reports/pdf',
+        views.submission_refereeing_package_pdf,
+        name='refereeing_package_pdf'
+    ),
 
     # Topics
-    url(r'^submission_add_topic/{regex}/'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'submission_add_topic/<identifier:identifier_w_vn_nr>/',
         views.submission_add_topic,
-        name='submission_add_topic'),
-    url(r'^submission_remove_topic/{regex}/(?P<slug>[-\w]+)/'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+        name='submission_add_topic'
+    ),
+    path(
+        'submission_remove_topic/<identifier:identifier_w_vn_nr>/<slug:slug>/',
         views.submission_remove_topic,
-        name='submission_remove_topic'),
+        name='submission_remove_topic'
+    ),
 
     # Editorial Administration
-    url(r'^admin/treated$', views.treated_submissions_list, name='treated_submissions_list'),
-    url(r'^admin/{regex}/prescreening$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.PreScreeningView.as_view(), name='do_prescreening'),
-    url(r'^admin/{regex}/conflicts$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.SubmissionConflictsView.as_view(), name='conflicts'),
-    url(r'^admin/{regex}/editor_invitations$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.editor_invitations, name='editor_invitations'),
-    url(r'^admin/{regex}/editor_invitations/(?P<assignment_id>[0-9]+)$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX), views.send_editorial_assignment_invitation,
-        name='send_editorial_assignment_invitation'),
-    url(r'^admin/{regex}/reassign_editor$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX), views.SubmissionReassignmentView.as_view(),
-        name='reassign_submission'),
-    url(r'^admin/{regex}/reports/compile$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.treated_submission_pdf_compile, name='treated_submission_pdf_compile'),
-    url(r'^admin/{regex}/plagiarism$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.PlagiarismView.as_view(), name='plagiarism'),
-    url(r'^admin/{regex}/plagiarism/report$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.PlagiarismReportPDFView.as_view(), name='plagiarism_report'),
-url(r'^admin/{regex}/plagiarism/internal$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.PlagiarismInternalView.as_view(), name='plagiarism_internal'),
-    url(
-        r'^admin/{regex}/recommendation$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX), views.EICRecommendationDetailView.as_view(),
+    path(
+        'admin/treated',
+        views.treated_submissions_list,
+        name='treated_submissions_list'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/prescreening',
+        views.PreScreeningView.as_view(),
+        name='do_prescreening'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/conflicts',
+        views.SubmissionConflictsView.as_view(),
+        name='conflicts'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/editor_invitations',
+        views.editor_invitations,
+        name='editor_invitations'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/editor_invitations/<int:assignment_id>',
+        views.send_editorial_assignment_invitation,
+        name='send_editorial_assignment_invitation'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/reassign_editor',
+        views.SubmissionReassignmentView.as_view(),
+        name='reassign_submission'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/reports/compile',
+        views.treated_submission_pdf_compile,
+        name='treated_submission_pdf_compile'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/plagiarism',
+        views.PlagiarismView.as_view(),
+        name='plagiarism'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/plagiarism/report',
+        views.PlagiarismReportPDFView.as_view(),
+        name='plagiarism_report'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/plagiarism/internal',
+        views.PlagiarismInternalView.as_view(),
+        name='plagiarism_internal'
+    ),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/recommendation',
+        views.EICRecommendationDetailView.as_view(),
         name='eic_recommendation_detail'
     ),
-    url(
-        r'^admin/{regex}/editorial_decision/create$'.format(
-            regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/editorial_decision/create',
         views.EditorialDecisionCreateView.as_view(),
         name='editorial_decision_create'
         ),
-    url(
-        r'^admin/{regex}/editorial_decision$'.format(
-            regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/editorial_decision',
         views.EditorialDecisionDetailView.as_view(),
         name='editorial_decision_detail'
         ),
-    url(
-        r'^admin/{regex}/editorial_decision/update$'.format(
-            regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/editorial_decision/update',
         views.EditorialDecisionUpdateView.as_view(),
         name='editorial_decision_update'
         ),
-    url(
-        r'^admin/{regex}/editorial_decision/fix$'.format(
-            regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/editorial_decision/fix',
         views.fix_editorial_decision,
         name='fix_editorial_decision'
         ),
-    url(
-        r'^{regex}/accept_puboffer$'.format(
-            regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        '<identifier:identifier_w_vn_nr>/accept_puboffer',
         views.accept_puboffer,
         name='accept_puboffer'
         ),
-    url(
-        r'admin/{regex}/restart_refereeing$'.format(
-            regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'admin/<identifier:identifier_w_vn_nr>/restart_refereeing',
         views.restart_refereeing,
         name='restart_refereeing'
     ),
 
-
-    url(r'^admin/reports$', views.reports_accepted_list, name='reports_accepted_list'),
-    url(r'^admin/reports/(?P<report_id>[0-9]+)/compile$',
-        views.report_pdf_compile, name='report_pdf_compile'),
-    url(r'^admin/reports/(?P<report_id>[0-9]+)/compile$',
-        views.report_pdf_compile, name='report_pdf_compile'),
+    path(
+        'admin/reports',
+        views.reports_accepted_list,
+        name='reports_accepted_list'
+    ),
+    path(
+        'admin/reports/<int:report_id>/compile',
+        views.report_pdf_compile,
+        name='report_pdf_compile'
+    ),
+    path(
+        'admin/reports/<int:report_id>/compile',
+        views.report_pdf_compile,
+        name='report_pdf_compile'
+    ),
 
 
     # Submission, resubmission, withdrawal
@@ -165,8 +227,8 @@ url(r'^admin/{regex}/plagiarism/internal$'.format(regex=SUBMISSIONS_COMPLETE_REG
         name='submit_manuscript_osfpreprints'
     ),
 
-    url(
-        r'^withdraw_manuscript/{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'withdraw_manuscript/<identifier:identifier_w_vn_nr>/',
         views.withdraw_manuscript,
         name='withdraw_manuscript'
     ),
@@ -182,97 +244,199 @@ url(r'^admin/{regex}/plagiarism/internal$'.format(regex=SUBMISSIONS_COMPLETE_REG
         views.pool_hx_submissions_list,
         name='pool_hx_submissions_list'
     ),
-    re_path(
-        'pool/submissions/{regex}'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
+    path(
+        'pool/submissions/<identifier:identifier_w_vn_nr>',
         views.pool_hx_submission_details,
         name='pool_hx_submission_details'
     ),
-    url(r'^pool/$', views.pool, name='pool'),
-    url(r'^pool/{regex}/$'.format(regex=SUBMISSIONS_COMPLETE_REGEX), views.pool, name='pool'),
-    url(r'^add_remark/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.add_remark, name='add_remark'),
+    path(
+        'pool/',
+        views.pool,
+        name='pool'
+    ),
+    path(
+        'pool/<identifier:identifier_w_vn_nr>/',
+        views.pool,
+        name='pool'
+    ),
+    path(
+        'add_remark/<identifier:identifier_w_vn_nr>',
+        views.add_remark,
+        name='add_remark'
+    ),
 
     # Assignment of Editor-in-charge
-    url(r'^pool/assignment_request/(?P<assignment_id>[0-9]+)$',
-        views.assignment_request, name='assignment_request'),
-    url(r'^pool/{regex}/editorial_assignment/$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX), views.editorial_assignment,
-        name='editorial_assignment'),
-    url(r'^pool/{regex}/editorial_assignment/(?P<assignment_id>[0-9]+)/$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX), views.editorial_assignment,
-        name='editorial_assignment'),
-    url(r'^update_authors_screening/{regex}/(?P<nrweeks>[1-2])$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.update_authors_screening, name='update_authors_screening'),
-    url(r'^assignment_failed/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.assignment_failed, name='assignment_failed'),
+    path(
+        'pool/assignment_request/<int:assignment_id>',
+        views.assignment_request,
+        name='assignment_request'
+    ),
+    path(
+        'pool/<identifier:identifier_w_vn_nr>/editorial_assignment/',
+        views.editorial_assignment,
+        name='editorial_assignment'
+    ),
+    path(
+        'pool/<identifier:identifier_w_vn_nr>/editorial_assignment/<int:assignment_id>/',
+        views.editorial_assignment,
+        name='editorial_assignment'
+    ),
+    path(
+        'update_authors_screening/<identifier:identifier_w_vn_nr>/<int:nrweeks>',
+        views.update_authors_screening,
+        name='update_authors_screening'
+    ),
+    path(
+        'assignment_failed/<identifier:identifier_w_vn_nr>',
+        views.assignment_failed,
+        name='assignment_failed'
+    ),
 
     # Editorial workflow and refereeing
-    url(r'^editorial_workflow$', views.editorial_workflow, name='editorial_workflow'),
-    url(r'^assignments$', views.assignments, name='assignments'),
-    url(r'^editorial_page/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.editorial_page, name='editorial_page'),
-    url(r'^select_referee/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.select_referee, name='select_referee'),
-    url(r'^add_referee_profile/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.add_referee_profile, name='add_referee_profile'),
-    url(r'^invite_referee/{regex}/(?P<profile_id>[0-9]+)'
-        '/(?P<auto_reminders_allowed>[0-1])$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.invite_referee, name='invite_referee'),
-    url(r'^set_refinv_auto_reminder/(?P<invitation_id>[0-9]+)/(?P<auto_reminders>[0-1])$',
-        views.set_refinv_auto_reminder, name='set_refinv_auto_reminder'),
-    url(r'^accept_or_decline_ref_invitations/$',
-        views.accept_or_decline_ref_invitations, name='accept_or_decline_ref_invitations'),
-    url(r'^accept_or_decline_ref_invitations/(?P<invitation_id>[0-9]+)$',
-        views.accept_or_decline_ref_invitations, name='accept_or_decline_ref_invitations'),
-    url(r'^decline_ref_invitation/(?P<invitation_key>.+)$',
-        views.decline_ref_invitation, name='decline_ref_invitation'),
-    url(r'^ref_invitation_reminder/{regex}/(?P<invitation_id>[0-9]+)$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.ref_invitation_reminder, name='ref_invitation_reminder'),
-    url(r'^cancel_ref_invitation/{regex}/(?P<invitation_id>[0-9]+)$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.cancel_ref_invitation, name='cancel_ref_invitation'),
-    url(r'^extend_refereeing_deadline/{regex}/(?P<days>[0-9]+)$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.extend_refereeing_deadline, name='extend_refereeing_deadline'),
-    url(r'^set_refereeing_deadline/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.set_refereeing_deadline, name='set_refereeing_deadline'),
-    url(r'^close_refereeing_round/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.close_refereeing_round, name='close_refereeing_round'),
-    url(r'^refereeing_overview$', views.refereeing_overview, name='refereeing_overview'),
-    url(r'^communication/{regex}/(?P<comtype>[a-zA-Z]{{4,}})$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.communication, name='communication'),
-    url(r'^communication/{regex}/(?P<comtype>[a-zA-Z]{{4,}})/(?P<referee_id>[0-9]+)$'.format(
-        regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.communication, name='communication'),
-    url(r'^eic_recommendation/{regex}$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.eic_recommendation, name='eic_recommendation'),
-    url(r'^eic_recommendation/{regex}/reformulate$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.reformulate_eic_recommendation, name='reformulate_eic_recommendation'),
-    url(r'^cycle/{regex}/submit$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.cycle_form_submit, name='cycle_confirmation'),
+    path(
+        'editorial_workflow',
+        views.editorial_workflow,
+        name='editorial_workflow'
+    ),
+    path(
+        'assignments',
+        views.assignments,
+        name='assignments'
+    ),
+    path(
+        'editorial_page/<identifier:identifier_w_vn_nr>',
+        views.editorial_page,
+        name='editorial_page'
+    ),
+    path(
+        'select_referee/<identifier:identifier_w_vn_nr>',
+        views.select_referee,
+        name='select_referee'
+    ),
+    path(
+        'add_referee_profile/<identifier:identifier_w_vn_nr>',
+        views.add_referee_profile,
+        name='add_referee_profile'
+    ),
+    path(
+        'invite_referee/<identifier:identifier_w_vn_nr>/<int:profile_id>/<int:auto_reminders_allowed>',
+        views.invite_referee,
+        name='invite_referee'
+    ),
+    path(
+        'set_refinv_auto_reminder/<int:invitation_id>/<int:auto_reminders>',
+        views.set_refinv_auto_reminder,
+        name='set_refinv_auto_reminder'
+    ),
+    path(
+        'accept_or_decline_ref_invitations/',
+        views.accept_or_decline_ref_invitations,
+        name='accept_or_decline_ref_invitations'
+    ),
+    path(
+        'accept_or_decline_ref_invitations/<int:invitation_id>',
+        views.accept_or_decline_ref_invitations,
+        name='accept_or_decline_ref_invitations'
+    ),
+    path(
+        'decline_ref_invitation/<str:invitation_key>',
+        views.decline_ref_invitation,
+        name='decline_ref_invitation'
+    ),
+    path(
+        'ref_invitation_reminder/<identifier:identifier_w_vn_nr>/<int:invitation_id>',
+        views.ref_invitation_reminder,
+        name='ref_invitation_reminder'
+    ),
+    path(
+        'cancel_ref_invitation/<identifier:identifier_w_vn_nr>/<int:invitation_id>',
+        views.cancel_ref_invitation,
+        name='cancel_ref_invitation'
+    ),
+    path(
+        'extend_refereeing_deadline/<identifier:identifier_w_vn_nr>/<int:days>',
+        views.extend_refereeing_deadline,
+        name='extend_refereeing_deadline'
+    ),
+    path(
+        'set_refereeing_deadline/<identifier:identifier_w_vn_nr>',
+        views.set_refereeing_deadline,
+        name='set_refereeing_deadline'
+    ),
+    path(
+        'close_refereeing_round/<identifier:identifier_w_vn_nr>',
+        views.close_refereeing_round,
+        name='close_refereeing_round'
+    ),
+    path(
+        'refereeing_overview',
+        views.refereeing_overview,
+        name='refereeing_overview'
+    ),
+    path(
+        'communication/<identifier:identifier_w_vn_nr>/<str:comtype>',
+        views.communication,
+        name='communication'
+    ),
+    path(
+        'communication/<identifier:identifier_w_vn_nr>/<str:comtype>/<int:referee_id>',
+        views.communication,
+        name='communication'
+    ),
+    path(
+        'eic_recommendation/<identifier:identifier_w_vn_nr>',
+        views.eic_recommendation,
+        name='eic_recommendation'
+    ),
+    path(
+        'eic_recommendation/<identifier:identifier_w_vn_nr>/reformulate',
+        views.reformulate_eic_recommendation,
+        name='reformulate_eic_recommendation'
+    ),
+    path(
+        'cycle/<identifier:identifier_w_vn_nr>/submit',
+        views.cycle_form_submit,
+        name='cycle_confirmation'
+    ),
 
     # Reports
-    url(r'^{regex}/reports/submit$'.format(regex=SUBMISSIONS_COMPLETE_REGEX),
-        views.submit_report, name='submit_report'),
-    url(r'^reports/vet$', views.vet_submitted_reports_list, name='vet_submitted_reports_list'),
-    url(r'^reports/(?P<report_id>[0-9]+)/vet$', views.vet_submitted_report,
-        name='vet_submitted_report'),
+    path(
+        '<identifier:identifier_w_vn_nr>/reports/submit',
+        views.submit_report,
+        name='submit_report'
+    ),
+    path(
+        'reports/vet',
+        views.vet_submitted_reports_list,
+        name='vet_submitted_reports_list'
+    ),
+    path(
+        'reports/<int:report_id>/vet',
+        views.vet_submitted_report,
+        name='vet_submitted_report'
+    ),
 
     # Voting
-    url(r'^prepare_for_voting/(?P<rec_id>[0-9]+)$', views.prepare_for_voting,
-        name='prepare_for_voting'),
-    url(r'^vote_on_rec/(?P<rec_id>[0-9]+)$', views.vote_on_rec, name='vote_on_rec'),
+    path(
+        'prepare_for_voting/<int:rec_id>',
+        views.prepare_for_voting,
+        name='prepare_for_voting'
+    ),
+    path(
+        'vote_on_rec/<int:rec_id>',
+        views.vote_on_rec,
+        name='vote_on_rec'
+    ),
     path(
         'claim_voting_right/<int:rec_id>',
         views.claim_voting_right,
         name='claim_voting_right'
     ),
-    url(r'^remind_Fellows_to_vote/(?P<rec_id>[0-9]+)$', views.remind_Fellows_to_vote,
-        name='remind_Fellows_to_vote'),
+    path(
+        'remind_Fellows_to_vote/<int:rec_id>',
+        views.remind_Fellows_to_vote,
+        name='remind_Fellows_to_vote'
+    ),
 
     # Monitoring
     path(
diff --git a/scipost_django/submissions/views.py b/scipost_django/submissions/views.py
index cb2bcb7e47b6706af29f347b0d47244be025ce8a..9a8a1851cd8c8120bc2c273e7c48b1f913ee913c 100644
--- a/scipost_django/submissions/views.py
+++ b/scipost_django/submissions/views.py
@@ -980,10 +980,12 @@ def update_authors_screening(request, identifier_w_vn_nr, nrweeks):
     """
     submission = get_object_or_404(Submission.objects.pool(request.user).unassigned(),
                                    preprint__identifier_w_vn_nr=identifier_w_vn_nr)
-    mail_code = 'authors/update_authors_screening_1week'
-    if nrweeks == '2':
+    if nrweeks == 1:
+        mail_code = 'authors/update_authors_screening_1week'
+    elif nrweeks == 2:
         mail_code = 'authors/update_authors_screening_2weeks'
-
+    else:
+        raise Http404
     mail_editor_view = MailEditorSubview(
         request, mail_code=mail_code, instance=submission)
     if mail_editor_view.is_valid():
diff --git a/scipost_django/theses/urls.py b/scipost_django/theses/urls.py
index 957ae942da90789f7b6fb73533b60ef8ed841dee..97dcd8a4b85e4ec0317f787ce2476eae8a63ff26 100644
--- a/scipost_django/theses/urls.py
+++ b/scipost_django/theses/urls.py
@@ -2,7 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
-from django.conf.urls import include, url
+from django.urls import include, path, re_path
 from django.views.generic import TemplateView
 
 from . import views
@@ -11,10 +11,34 @@ app_name = 'theses'
 
 urlpatterns = [
     # Thesis Links
-    url(r'^$', views.ThesisListView.as_view(), name='theses'),
-    url(r'^browse/(?P<nrweeksback>[0-9]{1,3})/$', views.ThesisListView.as_view(), name='browse'),
-    url(r'^(?P<thesislink_id>[0-9]+)/$', views.thesis_detail, name='thesis'),
-    url(r'^request_thesislink$', views.RequestThesisLink.as_view(), name='request_thesislink'),
-    url(r'^unvetted_thesislinks$', views.UnvettedThesisLinks.as_view(), name='unvetted_thesislinks'),
-    url(r'^vet_thesislink/(?P<pk>[0-9]+)/$', views.VetThesisLink.as_view(), name='vet_thesislink'),
+    path(
+        '',
+        views.ThesisListView.as_view(),
+        name='theses'
+    ),
+    re_path(
+        r'^browse/(?P<nrweeksback>[0-9]{1,3})/$',
+        views.ThesisListView.as_view(),
+        name='browse'
+    ),
+    path(
+        '<int:thesislink_id>/',
+        views.thesis_detail,
+        name='thesis'
+    ),
+    path(
+        'request_thesislink',
+        views.RequestThesisLink.as_view(),
+        name='request_thesislink'
+    ),
+    path(
+        'unvetted_thesislinks',
+        views.UnvettedThesisLinks.as_view(),
+        name='unvetted_thesislinks'
+    ),
+    path(
+        'vet_thesislink/<int:pk>/',
+        views.VetThesisLink.as_view(),
+        name='vet_thesislink'
+    ),
 ]