diff --git a/contracts/admin.py b/contracts/admin.py
index 2f405d237350d1f477fdea2845aecb0e221063bb..f3ba18b2e2e47dca71480f24c7486c500074e1f4 100644
--- a/contracts/admin.py
+++ b/contracts/admin.py
@@ -121,7 +121,34 @@ class ContractFileAdmin(
     form = ContractFileAdminForm
 
 
-class ContracteeSignatureRepresentativeInline(NestedStackedInline):
+class ParentContractInlineMixin:
+    def has_add_permission(self, request, obj=None):
+        if (
+            obj is not None
+            and not request.user.has_perm("contracts.edit_when_approved")
+            and not obj.is_editable_without_approve_permission
+        ):
+            return False
+
+        return super().has_add_permission(request, obj)
+
+    def has_change_permission(self, request, obj=None):
+        return self.has_add_permission(request, obj)
+
+    def has_delete_permission(self, request, obj=None):
+        if (
+            obj is not None
+            and not request.user.has_perm("contracts.delete_when_approved")
+            and not obj.is_editable_without_approve_permission
+        ):
+            return False
+
+        return super().has_change_permission(request, obj)
+
+
+class ContracteeSignatureRepresentativeInline(
+    ParentContractInlineMixin, NestedStackedInline
+):
     model = ContracteeSignatureRepresentative
     extra = 1
     formset = SingnatureRepresentativeFormSet
@@ -133,48 +160,45 @@ class ContracteeSignatureRepresentativeInline(NestedStackedInline):
         return formset
 
 
-class ContracteeSignatureInline(NestedStackedInline):
+class ContracteeSignatureInline(ParentContractInlineMixin, NestedStackedInline):
     model = ContracteeSignature
     autocomplete_fields = ("contractee",)
     inlines = (ContracteeSignatureRepresentativeInline,)
     extra = 0
 
 
-class SigneeSignatureRepresentativeInline(NestedStackedInline):
+class SigneeSignatureRepresentativeInline(
+    ParentContractInlineMixin, NestedStackedInline
+):
     model = SigneeSignatureRepresentative
     extra = 0
 
 
-class SigneeSignatureInline(NestedStackedInline):
+class SigneeSignatureInline(ParentContractInlineMixin, NestedStackedInline):
     model = SigneeSignature
     autocomplete_fields = ("signee",)
     inlines = (SigneeSignatureRepresentativeInline,)
     extra = 0
 
 
-class ContractFileInline(NestedTabularInline):
+class ContractFileInline(ParentContractInlineMixin, NestedTabularInline):
     model = ContractFile
     form = ContractFileAdminForm
     extra = 0
 
 
-class ContractApprovalInline(NestedTabularInline):
+class ContractApprovalInline(ParentContractInlineMixin, NestedTabularInline):
     model = ContractApproval
     extra = 0
 
 
-class ContractIntentInline(NestedTabularInline):
+class ContractIntentInline(ParentContractInlineMixin, NestedTabularInline):
     model = ContractIntent
     extra = 0
 
 
 class ContractAdmin(
     OwnPermissionsMixin,
-    permissions_mixin_factory(
-        "contracts.edit_when_approved",
-        "contracts.delete_when_approved",
-        obj_conditional=lambda request, obj: not obj.is_editable_without_approve_permission,
-    ),
     MarkdownxGuardedModelAdmin,
     NestedModelAdmin,
 ):
@@ -538,11 +562,32 @@ class ContractAdmin(
 
         return parent_save_response
 
+    def get_readonly_fields(self, request, obj=None):
+        readonly_fields = []
+
+        fields = []
+
+        for fieldset in self.get_fieldsets(request):
+            fields += fieldset[1]["fields"]
+
+        if (
+            obj.created_by == request.user
+            and obj.status == obj.StatusTypes.TO_BE_APPROVED
+            and not request.user.has_perm("contracts.edit_when_approved")
+        ):
+            fields.remove("status")
+
+            print("returning", fields)
+
+            return fields
+
+        return list(self.readonly_fields)
+
     def has_change_permission(self, request, obj=None):
         if (
             obj is not None
             and not request.user.has_perm("contracts.edit_when_approved")
-            and not obj.is_editable_without_approve_permission
+            and obj.status == obj.StatusTypes.APPROVED
         ):
             return False
 
@@ -556,7 +601,7 @@ class ContractAdmin(
         ):
             return False
 
-        return super().has_change_permission(request, obj)
+        return super().has_delete_permission(request, obj)
 
     list_filter = (
         AutocompleteFilterFactory("Typ", "types"),
diff --git a/contracts/forms.py b/contracts/forms.py
index 3a898eb046c5c996fbd1c3e97f2fc843f712ecf2..350a9ba6369c23c2a7795bcdc44e23acd46c4012 100644
--- a/contracts/forms.py
+++ b/contracts/forms.py
@@ -131,7 +131,17 @@ class ContractAdminForm(forms.ModelForm):
                                     choice_label,
                                 )
                             )
+
                             continue
+                    elif choice_key == Contract.StatusTypes.WORK_IN_PROGRESS:
+                        allowed_choices.append(
+                            (
+                                choice_key,
+                                choice_label,
+                            )
+                        )
+
+                        continue
 
                 if self.instance.status == Contract.StatusTypes.REJECTED:
                     if choice_key in (