diff --git a/opentech/apply/funds/models.py b/opentech/apply/funds/models.py
index 8f3558e6a329cdcf77523e946b93ae72318d0a4c..ee2ccd675365e9e4e32ad83a80423c921aadd819 100644
--- a/opentech/apply/funds/models.py
+++ b/opentech/apply/funds/models.py
@@ -637,7 +637,7 @@ class ApplicationSubmission(WorkflowHelpers, BaseStreamForm, AbstractFormSubmiss
             # We are a lab submission
             return getattr(self.page.specific, attribute)
 
-    def progress_application(self):
+    def progress_application(self, **kwargs):
         submission_in_db = ApplicationSubmission.objects.get(id=self.id)
 
         self.id = None
diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py
index e290e9527d84f53e3daad75b90316efbc0c0275f..5626409f60cf4a85be2b72d00097cbf5fbbca844 100644
--- a/opentech/apply/funds/tests/test_models.py
+++ b/opentech/apply/funds/tests/test_models.py
@@ -201,7 +201,7 @@ class TestFormSubmission(TestCase):
 
         page = page or self.round_page
         fields = page.get_form_fields()
-        data = {k: v for k, v in zip(fields, ['project', email, name])}
+        data = {k: v for k, v in zip(fields, ['project', 0, email, name])}
 
         request = self.request_factory.post('', data)
         request.user = user
diff --git a/opentech/apply/funds/tests/test_views.py b/opentech/apply/funds/tests/test_views.py
index c5d9713b5aa7578323f4791b183ca302df92406c..a78795c8c0830e6d8403ffe2adae845b928fe717 100644
--- a/opentech/apply/funds/tests/test_views.py
+++ b/opentech/apply/funds/tests/test_views.py
@@ -12,10 +12,15 @@ class SubmissionTestCase(TestCase):
         self.user = self.user_factory()
         self.client.force_login(self.user)
 
-    def get_submission_page(self, submission, view_name='detail'):
+    def submission_url(self, submission, view_name='detail'):
         view_name = f'funds:submissions:{ view_name }'
-        detail_url = reverse(view_name, kwargs={'pk': submission.id})
-        return self.client.get(detail_url)
+        return reverse(view_name, kwargs={'pk': submission.id})
+
+    def get_submission_page(self, submission, view_name='detail'):
+        return self.client.get(self.submission_url(submission, view_name))
+
+    def post_submission_page(self, submission, data, view_name='detail'):
+        return self.client.post(self.submission_url(submission, view_name), data)
 
 
 class TestStaffSubmissionView(SubmissionTestCase):
@@ -26,6 +31,18 @@ class TestStaffSubmissionView(SubmissionTestCase):
         response = self.get_submission_page(submission)
         self.assertContains(response, submission.title)
 
+    def test_can_progress_stage(self):
+        submission = ApplicationSubmissionFactory(status='concept_review_discussion', workflow_stages=2)
+        response = self.post_submission_page(submission, {'form-submitted-progress_form': '', 'action': 'invited_to_proposal'})
+
+        # Cant use refresh from DB with FSM
+        submission_origional = submission.__class__.objects.get(id=submission.id)
+        submission_next = submission_origional.next
+
+        self.assertRedirects(response, self.submission_url(submission_next))
+        self.assertEqual(submission_origional.status, 'invited_to_proposal')
+        self.assertEqual(submission_next.status, 'draft_proposal')
+
 
 class TestApplicantSubmissionView(SubmissionTestCase):
     user_factory = UserFactory
@@ -41,9 +58,7 @@ class TestApplicantSubmissionView(SubmissionTestCase):
         self.assertEqual(response.status_code, 403)
 
     def test_can_edit_own_submission(self):
-        submission = ApplicationSubmissionFactory(user=self.user)
-        submission.status = 'Proposal__invited-for-proposal__0'
-        submission.save()
+        submission = ApplicationSubmissionFactory(user=self.user, status='draft_proposal', workflow_stages=2)
         response = self.get_submission_page(submission, 'edit')
         self.assertContains(response, submission.title)
 
@@ -53,8 +68,6 @@ class TestApplicantSubmissionView(SubmissionTestCase):
         self.assertEqual(response.status_code, 403)
 
     def test_cant_edit_other_submission(self):
-        submission = ApplicationSubmissionFactory()
-        submission.status='Proposal__invited-for-proposal__0'
-        submission.save()
+        submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2)
         response = self.get_submission_page(submission, 'edit')
         self.assertEqual(response.status_code, 403)
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index 78d05fa3b93c6ee18df509b9d70a060c9bc80f7c..52e7d7fe96ef2ea6abfb113ad920cb0596148caf 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -80,7 +80,7 @@ class ProgressSubmissionView(DelegatedViewMixin, UpdateView):
             pass
         else:
             if can_proceed(proposal_transition):
-                proposal_transition()
+                proposal_transition(by=self.request.user)
                 instance.save()
             return HttpResponseRedirect(instance.get_absolute_url())
 
@@ -192,7 +192,7 @@ class SubmissionEditView(UpdateView):
 
     @property
     def transitions(self):
-        transitions =  self.object.get_available_user_status_transitions(self.request.user)
+        transitions = self.object.get_available_user_status_transitions(self.request.user)
         return {
             transition.name: transition
             for transition in transitions
@@ -236,7 +236,7 @@ class SubmissionEditView(UpdateView):
         transition = set(self.request.POST.keys()) & set(self.transitions.keys())
 
         if transition:
-            transition_object =self.transitions[transition.pop()]
+            transition_object = self.transitions[transition.pop()]
             self.object.get_transition(transition_object.target)(by=self.request.user)
             self.object.save()