diff --git a/ontology/templates/ontology/topic_list.html b/ontology/templates/ontology/topic_list.html
index b61a206ab5f93ef34279ce4f72ae72601e19125b..ccac22f92f3a19a85078878d7780ef10e128d219 100644
--- a/ontology/templates/ontology/topic_list.html
+++ b/ontology/templates/ontology/topic_list.html
@@ -12,11 +12,19 @@
 <div class="row">
   <div class="col-12">
     <h3 class="highlight">Topics</h3>
-    {% if perms.scipost.can_manage_ontology %}
     <ul>
+      {% if perms.scipost.can_manage_ontology %}
       <li><a href="{% url 'ontology:topic_create' %}">Add a Topic</a></li>
+      {% endif %}
+      <li>
+	<ul class="list-inline">
+	  <li class="list-inline-item">Filter to Topic name containing:</li>
+	  <li class="list-inline-item">
+	    <form action="" method="get">{{ searchform }}
+	  </li>
+	  <li class="list-inline-item"><input class="btn btn-outline-secondary" type="submit" value="Submit"></form></li>
+      </ul>
     </ul>
-    {% endif %}
   </div>
 </div>
 
diff --git a/ontology/views.py b/ontology/views.py
index 1dc5b8673f61107efc8d886b2409a75147aa53f8..def72669feae450cba74b89e3dd56b63a249f2e9 100644
--- a/ontology/views.py
+++ b/ontology/views.py
@@ -12,6 +12,7 @@ from django.views.generic.list import ListView
 
 from .models import Topic, RelationAsym, RelationSym
 
+from scipost.forms import SearchTextForm
 from scipost.mixins import PaginationMixin, PermissionsMixin
 
 
@@ -45,6 +46,22 @@ class TopicListView(PaginationMixin, ListView):
     model = Topic
     paginate_by = 25
 
+    def get_queryset(self):
+        """
+        Return a queryset of Topics using optional GET data.
+        """
+        queryset = Topic.objects.all()
+        if self.request.GET.get('text'):
+            queryset = queryset.filter(name__icontains=self.request.GET['text'])
+        return queryset
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            'searchform': SearchTextForm(initial={'text': self.request.GET.get('text')}),
+        })
+        return context
+
 
 class TopicDetailView(DetailView):
     model = Topic
diff --git a/profiles/forms.py b/profiles/forms.py
index e8dd84e0d5c9e9a0091eb9812c78198ddbd53611..ea6a53815eec0ee5634946f6c9bd4c3bfa94b5b9 100644
--- a/profiles/forms.py
+++ b/profiles/forms.py
@@ -57,7 +57,3 @@ class ProfileEmailForm(forms.ModelForm):
         """Save to a profile."""
         self.instance.profile = self.profile
         return super().save()
-
-
-class SearchTextForm(forms.Form):
-    text = forms.CharField(label='')
diff --git a/profiles/views.py b/profiles/views.py
index d447b1676d32a2b59e5fe93c08593e925032bdfd..4355197be38ed3af0e6927592a501bd46aedf5b7 100644
--- a/profiles/views.py
+++ b/profiles/views.py
@@ -15,12 +15,13 @@ from guardian.decorators import permission_required
 from scipost.constants import SCIPOST_SUBJECT_AREAS
 from scipost.mixins import PermissionsMixin, PaginationMixin
 from scipost.models import Contributor
+from scipost.forms import SearchTextForm
 
 from invitations.models import RegistrationInvitation
 from submissions.models import RefereeInvitation
 
 from .models import Profile, ProfileEmail
-from .forms import ProfileForm, ProfileEmailForm, SearchTextForm
+from .forms import ProfileForm, ProfileEmailForm
 
 
 
diff --git a/scipost/forms.py b/scipost/forms.py
index 8dfebf75ad30411b7f0e9d3e8e212695910483eb..3a42e63fe017cbb3680442ac345c0f1a94ab4d9d 100644
--- a/scipost/forms.py
+++ b/scipost/forms.py
@@ -431,6 +431,13 @@ def get_date_filter_choices():
     return months, years
 
 
+class SearchTextForm(forms.Form):
+    """
+    Simple text-based search form.
+    """
+    text = forms.CharField(label='')
+
+
 class SearchForm(HayStackSearchForm):
     # The date filters don't function well...
     start = forms.DateField(widget=MonthYearWidget(), required=False)  # Month