diff --git a/contracts/templates/contracts/search.html b/contracts/templates/contracts/search.html
new file mode 100644
index 0000000000000000000000000000000000000000..e6eaf277859a0d3f759889fdac87b537268f8df4
--- /dev/null
+++ b/contracts/templates/contracts/search.html
@@ -0,0 +1,36 @@
+{% extends "shared/includes/base.html" %}
+{% load add %}
+
+{% block content %}
+    {% include "contracts/includes/double_heading.html" with icon="ico--search" heading="Vyhledávání" subheading="dle názvu smlouvy" %}
+
+    <div class="flex flex-row justify-center">
+        <form method="post">
+            {% csrf_token %}
+            <input
+                class="bg-grey-150 w-56 h-10 px-4 text-lg xl:h-14 xl:px-5"
+                type="text"
+                value="{% if query %}{{ query }}{% endif %}"
+                placeholder="Hledaný název"
+                aria-label="Vyhledávací box"
+            >
+            <button type="submit" class="btn text-lg">
+                <div class="btn__body">
+                    <i class="ico--search"></i>
+                </div>
+            </button>
+        </form>
+    </div>
+
+    {% if query %}
+        <h2 class="text-lg font-bold mb-10">
+            Výsledky vyhledávání
+        </h2>
+
+        {% if page|length != 0 %}
+            {% include "contracts/includes/contract_list.html" with page=page paginator=paginator %}
+        {% else %}
+            <span class="text-gray-300">Žádné výsledky.</span>
+        {% endif %}
+    {% endif %}
+{% endblock %}
diff --git a/contracts/views.py b/contracts/views.py
index 27e352a5ec0f13ffc9897c5bc5da85cff47d129b..b84ce38a1aa147fe31f82ef7d51697e50801672e 100644
--- a/contracts/views.py
+++ b/contracts/views.py
@@ -119,6 +119,33 @@ def view_contract(request, id: int):
     )
 
 
+def search(request):
+    query = request.GET.get("q")
+    page = paginator = None
+    title = "Vyhledávání"
+
+    if query is not None:
+        title = f"Vyhledávání - {query}"
+
+        # WARNING: PostgreSQL-dependent
+        page, paginator = get_paginated_contracts(
+            request,
+            models.Q(name__search=query)
+        )
+
+    return render(
+        "contracts/search.html",
+        {
+            **get_base_context(request),
+            "title": title,
+            "description": "Vyhledávání smluv v registru České Pirátské Strany.",
+            "page": page,
+            "paginator": paginator,
+            "query": query,
+        }
+    )
+
+
 # BEGIN Filtered contract + submodel views