diff --git a/contracts/forms.py b/contracts/forms.py
index c4c9133299415671599c4a480efd93a00d9277eb..98a03e60fbeb0c057c0a60e40bbac903c6304754 100644
--- a/contracts/forms.py
+++ b/contracts/forms.py
@@ -54,10 +54,28 @@ class ContractAdminForm(forms.ModelForm):
                     )
                     continue
 
-                if self.instance.status in (
-                    Contract.StatusTypes.WORK_IN_PROGRESS,
-                    Contract.StatusTypes.TO_BE_APPROVED,
+                if (
+                    choice_key == Contract.StatusTypes.TO_BE_APPROVED
+                    and self.instance.status != Contract.StatusTypes.APPROVED
+                    and (
+                        self.current_user == self.instance.created_by
+                        or self.current_user.has_perm("contract.edit_others")
+                    )
                 ):
+                    allowed_choices.append((choice_key, choice_label))
+
+                if self.instance.status == Contract.StatusTypes.APPROVED:
+                    if self.current_user.has_perm("contract.approve"):
+                        if choice_key == Contract.StatusTypes.WORK_IN_PROGRESS:
+                            allowed_choices.append(
+                                (
+                                    choice_key,
+                                    choice_label,
+                                )
+                            )
+                            continue
+
+                if self.instance.status == Contract.StatusTypes.TO_BE_APPROVED:
                     if self.current_user.has_perm("contract.approve"):
                         if choice_key in (
                             Contract.StatusTypes.APPROVED,
@@ -99,7 +117,8 @@ class ContractAdminForm(forms.ModelForm):
             )
 
         if (
-            clean_data.get("status", self.instance.status)
+            not self.current_user.is_superuser
+            and clean_data.get("status", self.instance.status)
             in (self.instance.StatusTypes.APPROVED, self.instance.StatusTypes.REJECTED)
             and self.instance.status != clean_data.get("status", self.instance.status)
             and self.current_user == self.instance.created_by