diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py
index d92fc2e17934e2c9c06a2067fc8e2e9b18de0d9d..593bca48a04f9752bbb0ec6d1b44cad49289e7ab 100644
--- a/opentech/apply/funds/models/submissions.py
+++ b/opentech/apply/funds/models/submissions.py
@@ -39,6 +39,7 @@ from ..workflow import (
     STAGE_CHANGE_ACTIONS,
     UserPermissions,
     WORKFLOWS,
+    COMMUNITY_REVIEW_PHASES,
 )
 
 
@@ -556,6 +557,10 @@ class ApplicationSubmission(
             self.draft_revision = first_revision
             self.save()
 
+    @property
+    def community_review(self):
+        return self.status in COMMUNITY_REVIEW_PHASES
+
     @property
     def missing_reviewers(self):
         reviews_submitted = self.reviews.submitted().values('author')
@@ -588,6 +593,9 @@ class ApplicationSubmission(
         if user in self.partners_not_reviewed:
             return True
 
+        if user.is_community_reviewer and self.community_review and not self.reviewed_by(user):
+            return True
+
         return False
 
     def can_review(self, user):
diff --git a/opentech/apply/funds/views.py b/opentech/apply/funds/views.py
index 51c2f5e50287379829e71a1cfd1ff83377b1d52a..f4a638a9bec5c88317e410e9022a619244f05b18 100644
--- a/opentech/apply/funds/views.py
+++ b/opentech/apply/funds/views.py
@@ -477,6 +477,9 @@ class ReviewerSubmissionDetailView(ReviewContextMixin, ActivityContextMixin, Del
             partner_has_access = submission.partners.filter(pk=request.user.pk).exists()
             if not partner_has_access:
                 raise PermissionDenied
+        # Only allow community reviewers in submission with a community review state.
+        if request.user.is_community_reviewer and not submission.community_review:
+            raise PermissionDenied
         return super().dispatch(request, *args, **kwargs)
 
 
diff --git a/opentech/apply/funds/workflow.py b/opentech/apply/funds/workflow.py
index c28f764fd933c8997c73ed14df204c1745873bcb..76958755c06ec00360f7d7accdd61c8a29703bb0 100644
--- a/opentech/apply/funds/workflow.py
+++ b/opentech/apply/funds/workflow.py
@@ -980,3 +980,7 @@ PHASES_MAPPING = {
 OPEN_CALL_PHASES = [
     'com_open_call',
 ]
+
+COMMUNITY_REVIEW_PHASES = [
+    'com_community_review',
+]
diff --git a/opentech/apply/utils/views.py b/opentech/apply/utils/views.py
index 4bbfe7ccc453408f6fe161790c864bdc05a852f7..d8968aa8dd83a17c06c28d85ff91abb0b0dc1aea 100644
--- a/opentech/apply/utils/views.py
+++ b/opentech/apply/utils/views.py
@@ -25,7 +25,7 @@ class ViewDispatcher(View):
         return request.user.is_apply_staff
 
     def reviewer_check(self, request):
-        return request.user.is_reviewer or request.user.is_partner
+        return request.user.is_reviewer or request.user.is_partner or request.user.is_community_reviewer
 
     def dispatch(self, request, *args, **kwargs):
         view = self.applicant_view