diff --git a/contracts/admin.py b/contracts/admin.py
index a5474b072572315009a6e7951f313b3fedb9333b..f528005365d039ae6b9d4771fb711a6d790f613e 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -1,3 +1,5 @@
+from admin_extra_buttons.api import ExtraButtonsMixin, button
+from admin_extra_buttons.utils import HttpResponseRedirectToReferrer
 from dal_admin_filters import AutocompleteFilter
 from django.contrib import admin
 from django.utils.html import format_html
@@ -73,7 +75,7 @@ class ContractIntentInline(admin.TabularInline):
     extra = 0
 
 
-class ContractAdmin(MarkdownxGuardedModelAdmin):
+class ContractAdmin(ExtraButtonsMixin, MarkdownxGuardedModelAdmin):
     form = ContractAdminForm
 
     readonly_fields = ("created_by",)
@@ -85,6 +87,22 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
         ContractIntentInline,
     )
 
+    @button(
+        permission="contracts.approve",
+        label="Schválit",
+        change_form=True,
+        html_attrs={
+            "style": "background-color:var(--admin-interface-save-button-background-color);"
+                "color:var(--admin-interface-save-button-text-color)"
+        }
+    )
+    def approve(self, request):
+        
+        
+        self.message_user(request, "Smlouva schválena.")
+        
+        return HttpResponseRedirectToReferrer(request)
+
     def get_fieldsets(self, request, obj=None):
         fieldsets = [
             (
diff --git a/registry/settings/base.py b/registry/settings/base.py
index 333f1295adbd8915a4b3d015f9eccde2e3dd59f0..7849f65dec14b7860058d04fc1493f201d5819cb 100644
--- a/registry/settings/base.py
+++ b/registry/settings/base.py
@@ -50,19 +50,20 @@ INSTALLED_APPS = [
     "dal_admin_filters",
     "django_admin_index",
     "ordered_model",
-    "shared",
     "django.contrib.admin",
     "django.contrib.auth",
     "django.contrib.contenttypes",
     "django.contrib.sessions",
     "django.contrib.messages",
     "django.contrib.staticfiles",
+    "admin_extra_buttons",
     "import_export",
     "rangefilter",
     "guardian",
     "markdownx",
     "pirates",
     "webpack_loader",
+    "shared",
     "contracts",
     "oidc",
     "users",
@@ -86,7 +87,7 @@ TEMPLATES = [
     {
         "BACKEND": "django.template.backends.django.DjangoTemplates",
         "DIRS": [
-            os.path.join(BASE_DIR, "registry")
+            os.path.join(BASE_DIR, "registry", "templates")
         ],
         "APP_DIRS": True,
         "OPTIONS": {
diff --git a/registry/templates/admin/base.html b/registry/templates/admin/base.html
deleted file mode 100644
index 103f27d5a47f2943608c2b206ded2e578beb3297..0000000000000000000000000000000000000000
--- a/registry/templates/admin/base.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% extends 'admin/base.html' %}
-
-{% block extrastyle %}{{ block.super }}
-<style>
-    :root {
-        --djai-tab-bg: #ff0080;
-        --djai-tab-bg--hover: #a91b60;
-    }
-</style>
-{% endblock %} 
diff --git a/registry/templates/admin/base_site.html b/registry/templates/admin/base_site.html
new file mode 100644
index 0000000000000000000000000000000000000000..20560f91810163da950f74064fc5c50f9580c662
--- /dev/null
+++ b/registry/templates/admin/base_site.html
@@ -0,0 +1,34 @@
+{% extends 'admin/base_site.html' %}
+
+{% block extrastyle %}{{ block.super }}
+<style>
+    :root {
+        --djai-tab-bg: #000 !important;
+        --djai-tab-bg--active: #424242 !important;
+        --djai-tab-bg--hover: #424242 !important;
+        --djai-dropdown-bg: #424242 !important;
+        --djai-dropdown-bg--active: #5e5e5e !important;
+        --djai-dropdown-bg--hover: #5e5e5e !important;
+    }
+    
+    .index-action-buttons {
+        display: flex;
+        flex-direction: row;
+        row-gap: 10px;
+    }
+    
+    .index-action-buttons button,
+    .index-action-buttons [aria-role="button"],
+    .index-action-buttons button:visited,
+    .index-action-buttons [aria-role="button"]:visited,
+    .index-action-buttons button:hover,
+    .index-action-buttons [aria-role="button"]:hover {
+        padding: 10px 15px;
+        margin-bottom: 15px;
+        background-color: var(--admin-interface-module-background-color) !important;
+        color: var(--admin-interface-module-text-color) !important;
+        border-radius: var(--admin-interface-module-border-radius) !important;
+        text-decoration: none !important;
+    }
+</style>
+{% endblock %} 
diff --git a/registry/templates/admin/index.html b/registry/templates/admin/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..be5f8f584b9ea89b3e92aeb306b25de32b31e639
--- /dev/null
+++ b/registry/templates/admin/index.html
@@ -0,0 +1,16 @@
+{% extends "admin/index.html" %}
+
+{% block content %}
+
+{% if request.user.can_approve_contracts %}
+    <div class="index-action-buttons">
+        <a
+            href="contracts/contract/?approval_state__exact=no"
+            aria-role="button"
+        >Smlouvy ke schválení ({{ request.user.contracts_to_approve_count }})</a>
+    </div>
+{% endif %}
+
+{{ block.super }}
+
+{% endblock %}
diff --git a/requirements/base.txt b/requirements/base.txt
index 9fd8bfa52a579ef340992f7d117b5ac379d74d29..ade0d47a3c92ea62029ee484bb974c6a3e36a264 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -1,5 +1,6 @@
 dal-admin-filters==1.1.0
 django==4.1.4
+django-admin-extra-buttons==1.5.6
 django-admin-index==2.0.2
 django-admin-interface==0.24.2
 django-admin-rangefilter==0.9.0
diff --git a/users/models.py b/users/models.py
index 6334f7199c12eed982f8859e6ce109b424be1f9c..52074a4ad16afef593a5d1413baecf7f4be6cc79 100644
--- a/users/models.py
+++ b/users/models.py
@@ -14,6 +14,22 @@ class User(pirates_models.AbstractUser):
 
         return f"{first_name}{self.last_name}"
 
+    @property
+    def can_approve_contracts(self) -> bool:
+        # TODO: Do we need the superuser check?
+        return self.is_superuser or self.has_perm("contracts.approve")
+
+    @property
+    def contracts_to_approve_count(self) -> int:
+        if not self.can_approve_contracts:
+            return 0
+
+        from contracts.models import Contract
+
+        return Contract.objects.filter(
+            approval_state=Contract.ApprovalStates.NO
+        ).count()
+
     class Meta:
         app_label = "users"
         verbose_name = "Uživatel"