diff --git a/pgp/forms.py b/pgp/forms.py
new file mode 100644
index 0000000000000000000000000000000000000000..d8c0b58170edf154204544d6f453716affb83dc6
--- /dev/null
+++ b/pgp/forms.py
@@ -0,0 +1,10 @@
+
+from django import forms
+from . import models
+
+class PublicKeyForm(forms.ModelForm):
+    public = forms.BooleanField(required=False)
+
+    class Meta:
+        model = models.PublicKey
+        fields = ["email", "armor"]
diff --git a/pgp/templates/pgp/publickey_detail.html b/pgp/templates/pgp/publickey_detail.html
index 72f84cf3bd4fbb35f7a24eb12dbca2b459cf355a..05e0ac330cd36ffc2688414c7fbb3242a9b521c0 100644
--- a/pgp/templates/pgp/publickey_detail.html
+++ b/pgp/templates/pgp/publickey_detail.html
@@ -1,5 +1,6 @@
 {% extends 'pgp/base.html' %}
 
 {% block content %}
+<h2>Public key for: {{ publickey.email }}</h2>
 <pre>{{ publickey.armor }}</pre>
 {% endblock %}
diff --git a/pgp/templates/pgp/publickey_form.html b/pgp/templates/pgp/publickey_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..45033f7aa7d2a4420eddf8e68b91a0a4c397b170
--- /dev/null
+++ b/pgp/templates/pgp/publickey_form.html
@@ -0,0 +1,9 @@
+{% extends 'pgp/base.html' %}
+
+{% block content %}
+<form method="post">
+    {% csrf_token %}
+    {{ form.as_p }}
+    <button type="submit">Save</button>
+</form>
+{% endblock %}
diff --git a/pgp/templates/pgp/publickey_list.html b/pgp/templates/pgp/publickey_list.html
index 20923e5ce4b4eb75680c7d339fafc263c312a7ff..a7503cea8ef8a57baca9a4df1c046b3a348fc3f1 100644
--- a/pgp/templates/pgp/publickey_list.html
+++ b/pgp/templates/pgp/publickey_list.html
@@ -1,6 +1,9 @@
 {% extends 'pgp/base.html' %}
 
 {% block content %}
+{% if perms.pgp.add_publickey %}
+<a href="{% url 'publickey-create' %}">Add public key</a>
+{% endif %}
 {% if publickey_list %}
 <ul>
 {% for publickey in publickey_list %}
@@ -9,8 +12,8 @@
         {{ publickey.email }}
     </a>
   </li>
-</ul>
 {% endfor %}
+</ul>
 {% else %}
  <p>No public key has been published.</p>
 {% endif %}
diff --git a/pgp/urls.py b/pgp/urls.py
index 8ec363bc2731eca4b55179a621ba66589a3f60fd..81a26b0e586202c5779580c60db22646e2de3c47 100644
--- a/pgp/urls.py
+++ b/pgp/urls.py
@@ -20,5 +20,6 @@ from . import views
 
 urlpatterns = [
     path("", views.PublicKeyListView.as_view(), name="publickey-list"),
-    path("<int:pk>/", views.PublicKeyDetailView.as_view(), name="publickey-detail"),
+    path("<int:pk>", views.PublicKeyDetailView.as_view(), name="publickey-detail"),
+    path("new", views.PublicKeyCreateView.as_view(), name="publickey-create"),
 ]
diff --git a/pgp/views.py b/pgp/views.py
index 7244274e413c3000783a0e1ce6d76fdea8a13fab..88cb030953bc69d0b464d2fc8bdbdb123435178c 100644
--- a/pgp/views.py
+++ b/pgp/views.py
@@ -1,12 +1,34 @@
 from django.shortcuts import render
-
-from django.shortcuts import render
-from django.views.generic import DetailView, ListView
+from django.urls import reverse_lazy
+from django.views.generic import DetailView, ListView, CreateView
+from guardian.mixins import PermissionRequiredMixin, PermissionListMixin
+from guardian.shortcuts import assign_perm
+from guardian.utils import get_anonymous_user
 
 from . import models
+from . import forms
+
+class PublicKeyListView(PermissionListMixin, ListView):
+    model = models.PublicKey
+    permission_required = ['view_publickey']
 
-class PublicKeyListView(ListView):
+class PublicKeyDetailView(PermissionRequiredMixin, DetailView):
     model = models.PublicKey
+    permission_required = ['view_publickey']
 
-class PublicKeyDetailView(DetailView):
+class PublicKeyCreateView(PermissionRequiredMixin, CreateView):
+    form_class = forms.PublicKeyForm
     model = models.PublicKey
+    permission_required = ['add_publickey']
+    permission_object = None
+    success_url = reverse_lazy('publickey-list') 
+
+    def form_valid(self, form):
+        resp = super().form_valid(form)
+        assign_perm('view_publickey', self.request.user, self.object)
+        assign_perm('change_publickey', self.request.user, self.object)
+        if form.cleaned_data["public"]:
+            anonymous = get_anonymous_user()
+            assign_perm('view_publickey', anonymous, self.object)
+
+        return resp