diff --git a/opentech/apply/activity/messaging.py b/opentech/apply/activity/messaging.py
index bac259cb56bce6f76f000c97f0cc2dfef14e2b9f..415b9e029570c14c53072f8104181599d7f9667d 100644
--- a/opentech/apply/activity/messaging.py
+++ b/opentech/apply/activity/messaging.py
@@ -22,6 +22,7 @@ class MESSAGES(Enum):
     REVIEWERS_UPDATED = 'reviewers_updated'
     NEW_REVIEW = 'new_review'
     COMMENT = 'comment'
+    PROPOSAL_SUBMITTED = 'proposal_submitted'
 
 
 class AdapterBase:
@@ -98,6 +99,9 @@ class SlackAdapter(AdapterBase):
         MESSAGES.UPDATE_LEAD: 'The lead of <{link}|{submission.title}> has been updated from {old.lead} to {submission.lead} by {user}',
         MESSAGES.COMMENT: 'A new comment has been posted on <{link}|{submission.title}>',
         MESSAGES.REVIEWERS_UPDATED: '{user} has updated the reviewers on <{link}|{submission.title}>',
+        MESSAGES.TRANSITION: '{user} has updated the status of <{link}|{submission.title}>: {old_phase.display_name} → {submission.phase}',
+        MESSAGES.DETERMINATION_OUTCOME: 'A determination for <{link}|{submission.title}> was sent by email: {submission.determination.get_outcome_display}',
+        MESSAGES.PROPOSAL_SUBMITTED: 'A proposal has been submitted for review: <{link}|{submission.title}>',
     }
 
     def __init__(self):
diff --git a/opentech/apply/determinations/forms.py b/opentech/apply/determinations/forms.py
index 9ad3f2652d48bb74d482974f057be2b3c6e2bb35..900485459eaa106c56c3c8a0662af876cbb5474b 100644
--- a/opentech/apply/determinations/forms.py
+++ b/opentech/apply/determinations/forms.py
@@ -1,7 +1,7 @@
 from django import forms
 from django.core.exceptions import NON_FIELD_ERRORS
 
-from opentech.apply.funds.workflow import DETERMINATION_RESPONSE_TRANSITIONS
+from opentech.apply.funds.workflow import DETERMINATION_OUTCOMES
 from .models import Determination, DETERMINATION_CHOICES, NEEDS_MORE_INFO, REJECTED, ACCEPTED, \
     DETERMINATION_TRANSITION_SUFFIX
 
@@ -75,7 +75,7 @@ class BaseDeterminationForm(forms.ModelForm):
         return super().save(commit)
 
     def get_determination_from_action_name(self, action_name):
-        if action_name in DETERMINATION_RESPONSE_TRANSITIONS:
+        if action_name in DETERMINATION_OUTCOMES:
             if 'more_info' in action_name:
                 return NEEDS_MORE_INFO
             elif 'accepted' in action_name or 'invited_to_proposal' in action_name:
diff --git a/opentech/apply/funds/models.py b/opentech/apply/funds/models.py
index 8c93ec46e2204bf1ae788b33eeac0fd5922a15f7..be3a73359a05c4701bddbac37534ab8a662a0942 100644
--- a/opentech/apply/funds/models.py
+++ b/opentech/apply/funds/models.py
@@ -46,13 +46,14 @@ from .blocks import ApplicationCustomFormFieldsBlock, REQUIRED_BLOCK_NAMES
 from .edit_handlers import FilteredFieldPanel, ReadOnlyPanel, ReadOnlyInlinePanel
 from .workflow import (
     active_statuses,
+    DETERMINATION_OUTCOMES,
+    DETERMINATION_PHASES,
+    DETERMINATION_RESPONSE_PHASES,
     get_review_statuses,
     INITIAL_STATE,
     review_statuses,
     UserPermissions,
     WORKFLOWS,
-    DETERMINATION_PHASES,
-    DETERMINATION_RESPONSE_PHASES,
 )
 
 LIMIT_TO_STAFF = {'groups__name': STAFF_GROUP_NAME}
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index 0f0f962f0db72ca0b110b69ff4a810d82543152f..30fb9d80fd5730485399f4515dd6f2a9c551b60d 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -19,7 +19,7 @@ from opentech.apply.activity.views import (
     DelegatedViewMixin,
 )
 from opentech.apply.activity.messaging import messenger, MESSAGES
-from opentech.apply.funds.workflow import DETERMINATION_RESPONSE_TRANSITIONS
+from opentech.apply.funds.workflow import DETERMINATION_OUTCOMES
 from opentech.apply.review.views import ReviewContextMixin
 from opentech.apply.users.decorators import staff_required
 from opentech.apply.utils.views import DelegateableView, ViewDispatcher
@@ -38,7 +38,7 @@ class SubmissionListView(AllActivityContextMixin, SingleTableMixin, FilterView):
     filterset_class = SubmissionFilter
 
     def get_queryset(self):
-        return self.filterset_class._meta.model.objects.current()
+        return self.filterset_class._meta.model.objects.active().current()
 
     def get_context_data(self, **kwargs):
         active_filters = self.filterset.data
@@ -77,13 +77,21 @@ class ProgressSubmissionView(DelegatedViewMixin, UpdateView):
     def form_valid(self, form):
         action = form.cleaned_data.get('action')
         # Defer to the determination form for any of the determination transitions
-        if action in DETERMINATION_RESPONSE_TRANSITIONS:
+        if action in DETERMINATION_OUTCOMES and not self.object.determination.submitted:
             return HttpResponseRedirect(reverse_lazy(
                 'apply:submissions:determinations:form',
                 args=(form.instance.id,)) + "?action=" + action)
 
         self.object.perform_transition(action, self.request.user, request=self.request)
 
+        if object.phase.name == 'proposal_discussion' and action == 'proposal_discussion':
+            messenger(
+                MESSAGES.PROPOSAL_SUBMITTED,
+                request=self.request,
+                user=self.request.user,
+                submission=self.object.instance,
+            )
+
         return super().form_valid(form)
 
 
diff --git a/opentech/apply/funds/workflow.py b/opentech/apply/funds/workflow.py
index 3d1afa63f60c6fbd89f7500fd9a2de78d46f6013..2f7dca237e69fa403973684ea27a4d5c93519226 100644
--- a/opentech/apply/funds/workflow.py
+++ b/opentech/apply/funds/workflow.py
@@ -427,4 +427,4 @@ def get_determination_transitions():
     return transitions
 
 
-DETERMINATION_RESPONSE_TRANSITIONS = get_determination_transitions()
+DETERMINATION_OUTCOMES = get_determination_transitions()