diff --git a/opentech/apply/funds/forms.py b/opentech/apply/funds/forms.py
index b95c8d12239cab8a6f8aae7ac2689b737e069311..1d5dcf0b060cb0d644aa8c6ec3571eec4a9f1d94 100644
--- a/opentech/apply/funds/forms.py
+++ b/opentech/apply/funds/forms.py
@@ -69,11 +69,15 @@ class UpdateReviewersForm(forms.ModelForm):
         self.request = kwargs.pop('request', None)
         super().__init__(*args, **kwargs)
 
-        reviewers = self.instance.reviewers.all()
         self.submitted_reviewers = User.objects.filter(id__in=self.instance.reviews.values('author'))
 
         if self.can_alter_external_reviewers(self.instance, self.user):
-            self.prepare_field('reviewer_reviewers', reviewers, self.submitted_reviewers)
+            reviewers = self.instance.reviewers.all()
+            self.prepare_field(
+                'reviewer_reviewers',
+                initial=reviewers,
+                excluded=self.submitted_reviewers
+            )
         else:
             self.fields.pop('reviewer_reviewers')
 
@@ -82,8 +86,7 @@ class UpdateReviewersForm(forms.ModelForm):
 
         assigned_roles = {
             assigned.role: assigned.reviewer
-            for assigned in AssignedReviewers.objects.filter(
-                submission=self.instance,
+            for assigned in self.instance.assigned.filter(
                 role__isnull=False
             )
         }
@@ -127,21 +130,37 @@ class UpdateReviewersForm(forms.ModelForm):
 
     def save(self, *args, **kwargs):
         instance = super().save(*args, **kwargs)
+
+        assigned_roles = {
+            role: self.cleaned_data[field]
+            for field, role in self.roles.items()
+        }
+
+        missing_staff = instance.staff_not_reviewed.filter(
+            assignedreviewers__submission=instance,
+            assignedreviewers__role__isnull=True
+        ).exclude(
+            id__in=[user.id for user in assigned_roles.values()]
+        )
+
         if self.can_alter_external_reviewers(self.instance, self.user):
             reviewers = self.cleaned_data.get('reviewer_reviewers')
         else:
             reviewers = instance.reviewers_not_reviewed
 
-        current_reviewers = set(reviewers | self.submitted_reviewers)
-        for reviewer in current_reviewers:
-            AssignedReviewers.objects.update_or_create(
+        current_reviewers = set(reviewers | self.submitted_reviewers | missing_staff)
+
+        instance.assigned.filter(role=None).delete()
+
+        AssignedReviewers.objects.bulk_create(
+            AssignedReviewers(
                 submission=instance,
                 role=None,
-                defaults={'reviewer': reviewer},
-            )
+                reviewer=reviewer,
+            ) for reviewer in current_reviewers
+        )
 
-        for field, role in self.roles.items():
-            reviewer = self.cleaned_data[field]
+        for role, reviewer in assigned_roles.items():
             if reviewer:
                 AssignedReviewers.objects.update_or_create(
                     submission=instance,
diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py
index f1e3a27ce4459465004b890ee931e54495d8667d..2d36b39f6286baf37935108596b1ebf1dbaa020e 100644
--- a/opentech/apply/funds/models/submissions.py
+++ b/opentech/apply/funds/models/submissions.py
@@ -685,7 +685,9 @@ class AssignedReviewers(models.Model):
     )
     submission = models.ForeignKey(
         ApplicationSubmission,
-        on_delete=models.CASCADE)
+        related_name='assigned',
+        on_delete=models.CASCADE
+    )
     role = models.ForeignKey(
         'funds.ReviewerRole',
         related_name='+',
@@ -695,3 +697,6 @@ class AssignedReviewers(models.Model):
 
     class Meta:
         unique_together = ('submission', 'role')
+
+    def __str__(self):
+        return f'{self.reviewer} as {self.role}'