diff --git a/contracts/admin.py b/contracts/admin.py
index 553feb8addfdad5d59833a5e04bc4aeb155bf92d..027c6b6da32bd4c296ef275a7c8e79ee5691f3d0 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -4,7 +4,6 @@ import typing
 from django.contrib import admin
 from django.contrib.auth.models import Permission
 from django.utils.html import format_html
-from fieldsets_with_inlines import FieldsetsInlineMixin
 from import_export import resources
 from nested_admin import (NestedModelAdmin, NestedStackedInline,
                           NestedTabularInline)
@@ -153,7 +152,6 @@ class ContractAdmin(
         lambda request, obj: obj.is_approved,
     ),
     MarkdownxGuardedModelAdmin,
-    FieldsetsInlineMixin,
     NestedModelAdmin,
 ):
     form = ContractAdminForm
@@ -165,71 +163,12 @@ class ContractAdmin(
         "issues",
     )
 
-    fieldsets_with_inlines = [
-        (
-            "Základní informace",
-            {
-                "fields": [
-                    "name",
-                    "id_number",
-                    "types",
-                    "summary",
-                    "is_public",
-                    "legal_state",
-                    "primary_contract",
-                ]
-            },
-        ),
-        (
-            "Data",
-            {
-                "fields": [
-                    "valid_start_date",
-                    "valid_end_date",
-                ]
-            },
-        ),
-        (
-            "Náklady",
-            {
-                "fields": [
-                    "cost_amount",
-                    "cost_unit",
-                ]
-            },
-        ),
+    inlines = (
         ContractFileInline,
         ContracteeSignatureInline,
         SigneeSignatureInline,
-        (
-            "Odkazy",
-            {
-                "fields": [
-                    "tender_url",
-                    "agreement_url",
-                ]
-            },
-        ),
         ContractIntentInline,
-        (
-            "Fyzický dokument",
-            {
-                "fields": [
-                    "paper_form_state",
-                    "filing_area",
-                ]
-            },
-        ),
-        (
-            "Doplňující informace",
-            {
-                "fields": [
-                    "issues",
-                    "notes",
-                ]
-            },
-        ),
-    ]
+    )
 
     def get_form(self, request, *args, **kwargs) -> ContractAdminForm:
         form = super().get_form(request, *args, **kwargs)
@@ -237,30 +176,109 @@ class ContractAdmin(
 
         return form
 
-    def get_fieldsets(self, request, obj=None):
-        fieldsets_with_inlines = copy.deepcopy(self.fieldsets_with_inlines)
+    def get_fieldsets(self, request, obj=None) -> list:
+        fieldsets = [
+            (
+                "Základní informace",
+                {
+                    "fields": [
+                        "name",
+                        "id_number",
+                        "types",
+                        "summary",
+                        "is_public",
+                        "legal_state",
+                        "primary_contract",
+                    ]
+                },
+            ),
+            (
+                "Data",
+                {
+                    "fields": [
+                        "valid_start_date",
+                        "valid_end_date",
+                    ]
+                },
+            ),
+            (
+                "Náklady",
+                {
+                    "fields": [
+                        "cost_amount",
+                        "cost_unit",
+                    ]
+                },
+            ),
+            (
+                "Odkazy",
+                {
+                    "fields": [
+                        "tender_url",
+                        "agreement_url",
+                    ]
+                },
+            ),
+            (
+                "Fyzický dokument",
+                {
+                    "fields": [
+                        "paper_form_state",
+                        "filing_area",
+                    ]
+                },
+            ),
+            (
+                "Doplňující informace",
+                {
+                    "fields": [
+                        "issues",
+                        "notes",
+                    ]
+                },
+            ),
+        ]
 
         if (
             obj is None  # Creating confidential data, creator will be request.user
             or obj.created_by == request.user
             or request.user.has_perm("view_confidential", obj)
         ):
-            fieldsets_with_inlines[0][1]["fields"].insert(
-                fieldsets_with_inlines[0][1]["fields"].index("is_public") + 1,
+            fieldsets[0][1]["fields"].insert(
+                fieldsets[0][1]["fields"].index("is_public") + 1,
                 "publishing_rejection_comment",
             )
 
-        if request.user.is_superuser or request.user.has_perm("approve", self):
-            fieldsets_with_inlines.insert(
-                8,
+        if request.user.has_perm("approve", self):
+            fieldsets.insert(
+                5,
                 ("Schválení", {"fields": ["is_approved"]}),
             )
 
-        return [
-            self.make_placeholder(index, fieldset)
-            for index, fieldset in enumerate(fieldsets_with_inlines)
+        return fieldsets
+
+    def get_fieldsets_and_inlines_order(self, context) -> list:
+        order = [
+            "f",
+            "f",
+            "f",
+            "i",
+            "i",
+            "i",
+            "f",
+            "i",
+            "f",
+            "f",
         ]
 
+        if context["user"].has_perm("approve", self):
+            order.insert(
+                10,
+                "f"
+            )
+
+        return order
+
     def get_queryset(self, request):
         queryset = super().get_queryset(request)
 
diff --git a/contracts/templatetags/admin_extras.py b/contracts/templatetags/admin_extras.py
new file mode 100644
index 0000000000000000000000000000000000000000..f93b4b1495c10b4e17956be67df4e588c1e1522d
--- /dev/null
+++ b/contracts/templatetags/admin_extras.py
@@ -0,0 +1,31 @@
+from django.template import Library
+
+
+register = Library()
+
+
+@register.simple_tag(takes_context=True)
+def get_fieldsets_and_inlines(context):
+    adminform = context["adminform"]
+    model_admin = adminform.model_admin
+    adminform = iter(adminform)
+    inlines = iter(context["inline_admin_formsets"])
+
+    fieldsets_and_inlines = []
+
+    for choice in (
+        model_admin.get_fieldsets_and_inlines_order(context)
+        if hasattr(model_admin, "get_fieldsets_and_inlines_order")
+        else model_admin.fieldsets_and_inlines_order
+    ):
+        if choice == "f":
+            fieldsets_and_inlines.append(("f", next(adminform)))
+        elif choice == "i":
+            fieldsets_and_inlines.append(("i", next(inlines)))
+
+    for fieldset in adminform:
+        fieldsets_and_inlines.append(("f", fieldset))
+    for inline in inlines:
+        fieldsets_and_inlines.append(("i", inline))
+
+    return fieldsets_and_inlines 
diff --git a/registry/settings/base.py b/registry/settings/base.py
index c2dc7c76c3f4c73ed435b5fa819f9266b89f47d5..e4da047817f8374fa8f90347816e334394286302 100644
--- a/registry/settings/base.py
+++ b/registry/settings/base.py
@@ -53,7 +53,6 @@ INSTALLED_APPS = [
     "django.contrib.sessions",
     "django.contrib.messages",
     "django.contrib.staticfiles",
-    "fieldsets_with_inlines",
     "nested_admin",
     "import_export",
     "rangefilter",
diff --git a/registry/templates/admin/change_form.html b/registry/templates/admin/change_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..39083cb94785c4ce04155d9c8e525bb723a746f9
--- /dev/null
+++ b/registry/templates/admin/change_form.html
@@ -0,0 +1,20 @@
+{% extends "admin/change_form.html" %}
+
+{% load admin_extras %}
+
+{% block field_sets %}
+    {% get_fieldsets_and_inlines as fieldsets_and_inlines %}
+    {% for type, fieldset_or_inline in fieldsets_and_inlines %}
+        {% if type == 'f' %}
+            {% with fieldset=fieldset_or_inline %}
+                {% include "admin/includes/fieldset.html" %}
+            {% endwith %}
+        {% elif type == 'i' %}
+            {% with inline_admin_formset=fieldset_or_inline %}
+                {% include inline_admin_formset.opts.template %}
+            {% endwith %}
+        {% endif %}
+    {% endfor %}
+{% endblock %}
+
+{% block inline_field_sets %}{% endblock %} 
diff --git a/requirements/base.txt b/requirements/base.txt
index e45386af9ae22a45176fc7ddceb7b28ce5d767e5..dc65d55174714f9d285f0fede46f87f174af041d 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -5,7 +5,6 @@ django-admin-rangefilter==0.9.0
 django-autocomplete-light==3.9.4
 django-database-url==1.0.3
 django-downloadview==2.3.0
-django-fieldsets-with-inlines==0.6
 django-import-export==3.1.0
 django-nested-admin==4.0.2
 django-ordered-model==3.7.1