diff --git a/organizations/forms.py b/organizations/forms.py
index 522bf16918f1c219f791da95d1046ba285b7b11e..cfffa61ad9cba951343aaeb452e9129b4dd46645 100644
--- a/organizations/forms.py
+++ b/organizations/forms.py
@@ -151,3 +151,16 @@ class ContactActivationForm(forms.ModelForm):
         self.instance.save()
 
         return self.instance
+
+
+class ContactRoleForm(forms.ModelForm):
+
+    class Meta:
+        model = ContactRole
+        fields = '__all__'
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        if self.instance.id:
+            self.fields['organization'].disabled = True
+            self.fields['contact'].disabled = True
diff --git a/organizations/models.py b/organizations/models.py
index 146b37936cf4620751ae02b5ceda69865e4f6054..a86ebe8a363639096b81800a7fd7490f727ad540 100644
--- a/organizations/models.py
+++ b/organizations/models.py
@@ -269,6 +269,9 @@ class ContactRole(models.Model):
     date_from = models.DateField()
     date_until = models.DateField()
 
+    def __str__(self):
+        return '%s, %s for %s' % (self.contact, self.get_kind_display, self.organization)
+
     @property
     def get_kind_display(self):
         """
diff --git a/organizations/templates/organizations/_organization_card.html b/organizations/templates/organizations/_organization_card.html
index 3b33311f2b74b58be48fe07cd66a9dca90dab808..13a745358b6a23ac1f1f6eb9a9e27d8b5abf2eb4 100644
--- a/organizations/templates/organizations/_organization_card.html
+++ b/organizations/templates/organizations/_organization_card.html
@@ -198,6 +198,7 @@ $(document).ready(function($) {
 	      <th>Kind</th>
 	      <th>Date from</th>
 	      <th>Date until</th>
+	      <th>Actions</th>
 	    </tr>
 	    {% for contactrole in org.contactrole_set.all %}
 	    <tr>
@@ -205,6 +206,7 @@ $(document).ready(function($) {
 	      <td>{{ contactrole.get_kind_display }}</td>
 	      <td>{{ contactrole.date_from|date:"Y-m-d" }}</td>
 	      <td>{{ contactrole.date_until|date:"Y-m-d" }}</td>
+	      <td><a href="{% url 'organizations:contactrole_update' pk=contactrole.id %}"><span class="text-warning">Update</span></a>&nbsp;&nbsp;<a href="{% url 'organizations:contactrole_delete' pk=contactrole.id %}"><span class="text-danger">Delete</span></a></td>
 	    </tr>
 	    {% endfor %}
 	  </table>
diff --git a/organizations/templates/organizations/contactrole_confirm_delete.html b/organizations/templates/organizations/contactrole_confirm_delete.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0d3ccfbc02ab888d393c54bb93144ced7e8bf39
--- /dev/null
+++ b/organizations/templates/organizations/contactrole_confirm_delete.html
@@ -0,0 +1,30 @@
+{% extends 'scipost/base.html' %}
+
+{% load bootstrap %}
+
+{% block breadcrumb_items %}
+{{ block.super }}
+<span class="breadcrumb-item"><a href="{% url 'organizations:organizations' %}">Organizations</a></span>
+<span class="breadcrumb-item">Confirm deletetion</span>
+{% endblock %}
+
+{% block pagetitle %}: Delete ContactRole{% endblock pagetitle %}
+
+{% block content %}
+<div class="row">
+    <div class="col-12">
+        <h1 class="highlight">Delete ContactRole</h1>
+	{{ object }}
+    </div>
+</div>
+<div class="row">
+  <div class="col-12">
+    <form method="post">
+      {% csrf_token %}
+      <h3 class="mb-2">Are you sure you want to delete this ContactRole?</h3>
+      <input type="submit" class="btn btn-danger" value="Yes, delete it" />
+    </form>
+  </div>
+</div>
+
+{% endblock content %}
diff --git a/organizations/templates/organizations/contactrole_form.html b/organizations/templates/organizations/contactrole_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..211764a47a2a367cf71f2e1bd0e3c63bcae587ae
--- /dev/null
+++ b/organizations/templates/organizations/contactrole_form.html
@@ -0,0 +1,28 @@
+{% extends 'scipost/base.html' %}
+
+{% load bootstrap %}
+
+{% block breadcrumb_items %}
+{{ block.super }}
+<span class="breadcrumb-item"><a href="{% url 'organizations:organizations' %}">Organizations</a></span>
+<span class="breadcrumb-item">{% if form.instance.id %}Update {{ form.instance }}{% else %}Add new ContactRole{% endif %}</span>
+{% endblock %}
+
+{% block pagetitle %}: ContactRole{% endblock pagetitle %}
+
+
+{% block content %}
+<div class="row">
+  <div class="col-12">
+    <form action="" method="post">
+      {% csrf_token %}
+      {{ form|bootstrap }}
+      <input type="submit" value="Submit" class="btn btn-primary">
+  </div>
+</div>
+{% endblock content %}
+
+{% block footer_script %}
+{{ block.super }}
+{{ form.media }}
+{% endblock footer_script %}
diff --git a/organizations/urls.py b/organizations/urls.py
index ea491532d1584d7d1db8323393669bcca2d7530d..b8425bf93b2f4e8545e7b3a8c21406ceed3a6c62 100644
--- a/organizations/urls.py
+++ b/organizations/urls.py
@@ -37,6 +37,16 @@ urlpatterns = [
         views.organization_add_contact,
         name='add_contact'
     ),
+    url(
+        r'^contactrole/(?P<pk>[0-9]+)/update/$',
+        views.ContactRoleUpdateView.as_view(),
+        name='contactrole_update'
+    ),
+    url(
+        r'^contactrole/(?P<pk>[0-9]+)/delete/$',
+        views.ContactRoleDeleteView.as_view(),
+        name='contactrole_delete'
+    ),
     url(
         r'^activate/(?P<activation_key>.+)$',
         views.activate_account,
diff --git a/organizations/views.py b/organizations/views.py
index 31da78e1f4f6f68996b5659242b5f64600235939..523f5943b58710136f63f6088b821ee1125101b0 100644
--- a/organizations/views.py
+++ b/organizations/views.py
@@ -15,8 +15,8 @@ from django.views.generic.list import ListView
 from guardian.decorators import permission_required
 
 from .constants import ORGTYPE_PRIVATE_BENEFACTOR
-from .forms import NewContactForm, ContactActivationForm
-from .models import Organization, Contact
+from .forms import NewContactForm, ContactActivationForm, ContactRoleForm
+from .models import Organization, Contact, ContactRole
 
 from funders.models import Funder
 from mails.utils import DirectMailUtil
@@ -159,3 +159,29 @@ def dashboard(request):
     }
 
     return render(request, 'organizations/dashboard.html', context)
+
+
+class ContactRoleUpdateView(PermissionsMixin, UpdateView):
+    """
+    Update a ContactRole.
+    """
+    permission_required = 'scipost.can_manage_organizations'
+    model = ContactRole
+    form_class = ContactRoleForm
+    template_name = 'organizations/contactrole_form.html'
+
+    def get_success_url(self):
+        return reverse_lazy('organizations:organization_details',
+                            kwargs={'pk': self.object.organization.id})
+
+
+class ContactRoleDeleteView(PermissionsMixin, DeleteView):
+    """
+    Delete a ContactRole.
+    """
+    permission_required = 'scipost.can_manage_organizations'
+    model = ContactRole
+
+    def get_success_url(self):
+        return reverse_lazy('organizations:organization_details',
+                            kwargs={'pk': self.object.organization.id})