diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html
index 491cc0b8689e8232d66fd83faeaa68fdbf3dbb17..e4b1c8ba12d48345d75727b924599761e28d1031 100644
--- a/aleksis/core/templates/core/base.html
+++ b/aleksis/core/templates/core/base.html
@@ -72,7 +72,7 @@
       </a>
     </li>
     <li class="search">
-      <form method="post" action="#" class="autocomplete">
+      <form method="get" action="{% url "haystack_search" %}" class="autocomplete">
         <div class="search-wrapper">
           <input id="search" name="q" placeholder="{% trans "Search" %}">
           <i class="material-icons">search</i>
diff --git a/aleksis/core/templates/search/search.html b/aleksis/core/templates/search/search.html
new file mode 100644
index 0000000000000000000000000000000000000000..acb130e0e2fe3797720196b8e8448b83e3341baa
--- /dev/null
+++ b/aleksis/core/templates/search/search.html
@@ -0,0 +1,66 @@
+{# -*- engine:django -*- #}
+
+{% extends "core/base.html" %}
+
+{% load i18n material_form %}
+
+{% block browser_title %}{% blocktrans %}Search{% endblocktrans %}{% endblock %}
+{% block page_title %}{% blocktrans %}Global Search{% endblocktrans %}{% endblock %}
+
+{% block content %}
+  <form method="get">
+    {% form form=form %}{% endform %}
+    <button type="submit" class="btn waves-effect waves-light green">
+      {% blocktrans %}Search{% endblocktrans %}
+    </button>
+  </form>
+
+   {% if query %}
+     <h3>Results</h3>
+
+     {% for result in page.object_list %}
+       <p>
+         <i class="material-icons">{{ result.object.icon_ }}</i>
+         <a href="{{ result.object.get_absolute_url|default:"#" }}">
+           {{ result.object }}
+         </a>
+       </p>
+     {% empty %}
+       {# FIXME Add a note if no results were found #}
+     {% endfor %}
+
+     {% if page.has_other_pages %}
+       <ul class="pagination">
+         {% if page.has_previous %}
+           <li class="waves-effect">
+             <a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">
+               <i class="material-icons">chevron_left</i>
+             </a>
+           </li>
+         {% else %}
+           <li class="disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>
+         {% endif %}
+
+         {% for page_num in page.paginator.page_range %}
+           {% if page.number == page_num %}
+             <li class="active"><a href="#">{{ page_num }}</a></li>
+           {% else %}
+             <li class="waves-effect"><a href="?q={{ query }}&amp;page={{ page_num }}">{{ page_num }}</a></li>
+           {% endif %}
+         {% endfor %}
+
+         {% if page.has_next %}
+           <li class="waves-effect">
+             <a href="?q={{ query }}&amp;page={{ page.next_page_number }}">
+               <i class="material-icons">chevron_right</i>
+             </a>
+           </li>
+         {% else %}
+           <li class="disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>
+         {% endif %}
+       </ul>
+     {% endif %}
+   {% else %}
+     {# FIXME Add a note to show before making a query #}
+   {% endif %}
+{% endblock %}
diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py
index 406e8d500c05247ec142a0c2a40d05cadc2c7f5f..4bb7d10fbbaa6774d5f5beed3a1d7e034f020260 100644
--- a/aleksis/core/urls.py
+++ b/aleksis/core/urls.py
@@ -40,6 +40,7 @@ urlpatterns = [
     path("announcement/edit/<int:pk>/", views.announcement_form, name="edit_announcement"),
     path("announcement/delete/<int:pk>/", views.delete_announcement, name="delete_announcement"),
     path("search/searchbar/", views.searchbar_snippets, name="searchbar_snippets"),
+    path("search/", include("haystack.urls")),
     path("maintenance-mode/", include("maintenance_mode.urls")),
     path("impersonate/", include("impersonate.urls")),
     path("__i18n__/", include("django.conf.urls.i18n")),