diff --git a/profiles/templates/profiles/profile_list.html b/profiles/templates/profiles/profile_list.html
index 8b05b7979509e305d193f32da802f2fba9c4329d..2cf81ab12bf8f440cc5c50fad9de3dffe44b636b 100644
--- a/profiles/templates/profiles/profile_list.html
+++ b/profiles/templates/profiles/profile_list.html
@@ -16,7 +16,10 @@
 <div class="row">
   <div class="col-12">
     <p>
-      View Profiles <a href="{% add_get_parameters contributor=True %}">with</a> or <a href="{% add_get_parameters contributor=False %}">without</a> an associated Contributor
+      <ul>
+	<li>View only Profiles <a href="{% add_get_parameters contributor=True %}">with</a> or <a href="{% add_get_parameters contributor=False %}">without</a> an associated Contributor</li>
+	<li><a href="{% url 'profiles:profile_create' from_type='contributor' pk=next_contributor_wo_profile.id %}">Create a Profile</a> for Contributors without one ({{ nr_contributors_wo_profile }} to handle)</li>
+      </ul>
       <ul class="list-inline">
 	<li class="list-inline-item">
 	  <a href="{% url 'profiles:profiles' %}">View all</a> or view by discipline/subject area:
diff --git a/profiles/urls.py b/profiles/urls.py
index b3bb01de2d12e405d5eb41e430c36e8520540786..a6026f0762f737472710ed2abd5815c1188a54a9 100644
--- a/profiles/urls.py
+++ b/profiles/urls.py
@@ -8,7 +8,12 @@ from . import views
 
 urlpatterns = [
     url(
-        r'^add/((?P<from_type>[a-z]+)/(?P<pk>[0-9]+))?$',
+        r"^add/(?P<from_type>[a-z]+)/(?P<pk>[0-9]+)$",
+        views.ProfileCreateView.as_view(),
+        name='profile_create'
+    ),
+    url(
+        r"^add/$",
         views.ProfileCreateView.as_view(),
         name='profile_create'
     ),
diff --git a/profiles/views.py b/profiles/views.py
index 04ea25cd2afa9032f75e74f576573d3c4300cbb1..e0b4e2511e27bfbd6b07ab0e442043eae4df9f78 100644
--- a/profiles/views.py
+++ b/profiles/views.py
@@ -2,6 +2,8 @@ __copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
+import random
+
 from django.core.urlresolvers import reverse_lazy
 from django.shortcuts import get_object_or_404, render
 from django.views.generic.edit import CreateView, UpdateView, DeleteView
@@ -32,6 +34,8 @@ class ProfileCreateView(PermissionsMixin, CreateView):
         initial = super().get_initial()
         from_type = self.kwargs.get('from_type', None)
         pk = self.kwargs.get('pk', None)
+        print(from_type)
+        print(pk)
         if pk:
             pk = int(pk)
             if from_type == 'contributor':
@@ -94,4 +98,7 @@ class ProfileListView(PermissionsMixin, ListView):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context['subject_areas'] = SCIPOST_SUBJECT_AREAS
+        contributors_wo_profile = Contributor.objects.filter(profile=None)
+        context['nr_contributors_wo_profile'] = contributors_wo_profile.count()
+        context['next_contributor_wo_profile'] = random.choice(contributors_wo_profile)
         return context
diff --git a/scipost/management/commands/add_groups_and_permissions.py b/scipost/management/commands/add_groups_and_permissions.py
index edc51182c1348ac4b0137aaac7a37b5ac732e66e..928cd548f77e93ba1c90057be7a816dc99726922 100644
--- a/scipost/management/commands/add_groups_and_permissions.py
+++ b/scipost/management/commands/add_groups_and_permissions.py
@@ -72,6 +72,10 @@ class Command(BaseCommand):
             content_type=content_type)
 
         # Registration and invitations
+        can_manage_contributors, created = Permission.objects.get_or_create(
+            codename='can_manage_contributors',
+            name='Can manage Contributors',
+            content_type=content_type)
         can_vet_registration_requests, created = Permission.objects.get_or_create(
             codename='can_vet_registration_requests',
             name='Can vet registration requests',
diff --git a/scipost/signals.py b/scipost/signals.py
index 0b525541e71290fd9f0d2399579093d9a0e3e912..92bc9d1429f3309e49b564564cb3064bf40a76e3 100644
--- a/scipost/signals.py
+++ b/scipost/signals.py
@@ -14,8 +14,16 @@ from .models import Contributor
 @receiver(post_save, sender=Profile)
 def link_created_profile_to_contributor(sender, instance, created, **kwargs):
     """
-    When a new Profile is created, it is linked to the corresponding
-    existing Contributor object.
+    When a new Profile is created, it is linked to a corresponding
+    existing Contributor object, provided it is unique (as defined by the email).
+    If it is not unique, no action is taken.
     """
     if created:
-        Contributor.objects.filter(user__email=instance.email).update(profile=instance)
+        try:
+            contributor = Contributor.objects.get(user__email=instance.email)
+            contributor.profile = instance
+            contributor.save()
+        except Contributor.DoesNotExist:
+            pass
+        except Contributor.MultipleObjectsReturned:
+            pass
diff --git a/scipost/urls.py b/scipost/urls.py
index 0aeb24a4e3b11cef3d315d86f86a96ee006d5c05..857e7ea35b14c2d183c5460434fc9974c42991aa 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -73,6 +73,10 @@ urlpatterns = [
     # Contributors:
     ################
 
+    # Contributor info (public view)
+    url(r'^contributor/(?P<contributor_id>[0-9]+)$', views.contributor_info,
+        name="contributor_info"),
+
     # Registration
     url(r'^register$', views.register, name='register'),
     url(r'^thanks_for_registering$',
@@ -130,10 +134,6 @@ urlpatterns = [
     url(r'^unavailable_period/(?P<period_id>[0-9]+)/delete$', views.delete_unavailable_period,
         name='delete_unavailable_period'),
 
-    # Contributor info
-    url(r'^contributor/(?P<contributor_id>[0-9]+)$', views.contributor_info,
-        name="contributor_info"),
-
     # Authorship claims
     url(r'^claim_authorships$', views.claim_authorships, name="claim_authorships"),
     url(r'^claim_pub_authorship/(?P<publication_id>[0-9]+)/(?P<claim>[0-1])$',