diff --git a/profiles/templates/profiles/_profile_card.html b/profiles/templates/profiles/_profile_card.html
index 1a6c72672eed64e0a2d50f141e61fd281d909297..6646b83f3f8e3d6d54035ff9efe9022e821cdb4a 100644
--- a/profiles/templates/profiles/_profile_card.html
+++ b/profiles/templates/profiles/_profile_card.html
@@ -11,6 +11,10 @@
 	{% if profile.webpage %}<a href="{{ profile.webpage }}" target="_blank">webpage</a>
 	{% else %}No personal webpage given
 	{% endif %}
+	{% if profile.contributor %}
+	<br/>
+	Registered as Contributor (see <a href="{% url 'scipost:contributor_info' contributor_id=profile.contributor.id %}">info page</a>)
+	{% endif %}
       </p>
     </div>
     <div class="col-6">
diff --git a/profiles/urls.py b/profiles/urls.py
index 01f07bc870dfcb82b1b1d30e83abd93ae48b1c91..047dcb44d1dda5d4ccc3f336500ae852adea05a4 100644
--- a/profiles/urls.py
+++ b/profiles/urls.py
@@ -8,7 +8,7 @@ from . import views
 
 urlpatterns = [
     url(
-        r'^add/$',
+        r'^add/((?P<from_type>[a-z]+)/(?P<pk>[0-9]+))?$',
         views.ProfileCreateView.as_view(),
         name='profile_create'
     ),
diff --git a/profiles/views.py b/profiles/views.py
index 767a2f1ab458008e81a904cf2698f99214e6ca66..4b0cd5c708059bc7cd67970366074413abfc273f 100644
--- a/profiles/views.py
+++ b/profiles/views.py
@@ -3,12 +3,13 @@ __license__ = "AGPL v3"
 
 
 from django.core.urlresolvers import reverse_lazy
-from django.shortcuts import render
+from django.shortcuts import get_object_or_404, render
 from django.views.generic.edit import CreateView, UpdateView, DeleteView
 from django.views.generic.list import ListView
 
 from scipost.constants import SCIPOST_SUBJECT_AREAS
 from scipost.mixins import PermissionsMixin
+from scipost.models import Contributor
 
 from .models import Profile
 from .forms import ProfileForm
@@ -23,6 +24,29 @@ class ProfileCreateView(PermissionsMixin, CreateView):
     template_name = 'profiles/profile_form.html'
     success_url = reverse_lazy('profiles:profiles')
 
+    def get_initial(self):
+        """
+        Provide initial data based on kwargs.
+        The data can come from a Contributor, Invitation, UnregisteredAuthor, ...
+        """
+        initial = super().get_initial()
+        from_type = self.kwargs.get('from_type', None)
+        pk = self.kwargs.get('pk', None)
+        if pk:
+            pk = int(pk)
+            if from_type == 'contributor':
+                contributor = get_object_or_404(Contributor, pk=pk)
+                initial['title'] = contributor.title
+                initial['first_name'] = contributor.user.first_name
+                initial['last_name'] = contributor.user.last_name
+                initial['email'] = contributor.user.email
+                initial['discipline'] = contributor.discipline
+                initial['expertises'] = contributor.expertises
+                initial['orcid_id'] = contributor.orcid_id
+                initial['webpage'] = contributor.personalwebpage
+                initial['accepts_SciPost_emails'] = contributor.accepts_SciPost_emails
+        return initial
+
 
 class ProfileUpdateView(PermissionsMixin, UpdateView):
     """
diff --git a/scipost/__init__.py b/scipost/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ba7a401eccd714a2ae882b411a299c3dec0511a3 100644
--- a/scipost/__init__.py
+++ b/scipost/__init__.py
@@ -0,0 +1,5 @@
+__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+default_app_config = 'scipost.apps.SciPostConfig'
diff --git a/scipost/apps.py b/scipost/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..dc85270be540e04f9e27b56e78435f2e25c5bc66
--- /dev/null
+++ b/scipost/apps.py
@@ -0,0 +1,18 @@
+__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from django.apps import AppConfig
+from django.db.models.signals import post_save
+
+
+class SciPostConfig(AppConfig):
+    name = 'scipost'
+
+    def ready(self):
+        super().ready()
+
+        from . import signals
+        from profiles.models import Profile
+        post_save.connect(signals.link_created_profile_to_contributor,
+                          sender=Profile)
diff --git a/scipost/signals.py b/scipost/signals.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b525541e71290fd9f0d2399579093d9a0e3e912
--- /dev/null
+++ b/scipost/signals.py
@@ -0,0 +1,21 @@
+__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
+__license__ = "AGPL v3"
+
+
+from django.core.exceptions import ObjectDoesNotExist
+from django.db.models.signals import post_save
+from django.dispatch import receiver
+
+from profiles.models import Profile
+
+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.
+    """
+    if created:
+        Contributor.objects.filter(user__email=instance.email).update(profile=instance)