diff --git a/reviewboard/notifications/tests.py b/reviewboard/notifications/tests.py
index 197049fe690e7ef3c28f4b3e1fe258bc91e5875b..2d9aaf3b08ee2713adc422a50f8c8c7f12c9b72f 100644
--- a/reviewboard/notifications/tests.py
+++ b/reviewboard/notifications/tests.py
@@ -910,7 +910,7 @@ class WebHookSignalDispatchTests(SpyAgency, TestCase):
         target = WebHookTarget.objects.create(events='review_request_closed',
                                               url=self.ENDPOINT_URL)
 
-        review_request = self.create_review_request()
+        review_request = self.create_review_request(publish=True)
         review_request.close(review_request.SUBMITTED)
 
         spy = dispatch_webhook_event.spy
@@ -987,7 +987,7 @@ class WebHookSignalDispatchTests(SpyAgency, TestCase):
             events='review_request_reopened',
             url=self.ENDPOINT_URL)
 
-        review_request = self.create_review_request()
+        review_request = self.create_review_request(publish=True)
         review_request.close(review_request.SUBMITTED)
         review_request.reopen()
 
diff --git a/reviewboard/reviews/models/review_request.py b/reviewboard/reviews/models/review_request.py
index f82b468cb8eb742b27137990b39c608dfe4f636a..c3211a42a1d3512f030716690c4191a86d13ec3e 100644
--- a/reviewboard/reviews/models/review_request.py
+++ b/reviewboard/reviews/models/review_request.py
@@ -17,7 +17,8 @@ from reviewboard.attachments.models import (FileAttachment,
                                             FileAttachmentHistory)
 from reviewboard.changedescs.models import ChangeDescription
 from reviewboard.diffviewer.models import DiffSet, DiffSetHistory
-from reviewboard.reviews.errors import PermissionError
+from reviewboard.reviews.errors import (PermissionError,
+                                        PublishError)
 from reviewboard.reviews.managers import ReviewRequestManager
 from reviewboard.reviews.models.base_comment import BaseComment
 from reviewboard.reviews.models.base_review_request_details import \
@@ -703,7 +704,8 @@ class ReviewRequest(BaseReviewRequestDetails):
             self.changedescs.add(changedesc)
 
             if type == self.SUBMITTED:
-                self.public = True
+                if not self.public:
+                    raise PublishError("The draft must be public first.")
             else:
                 self.commit_id = None
 
diff --git a/reviewboard/reviews/tests.py b/reviewboard/reviews/tests.py
index dda1a19a0e5f4cadaa1b477f3feb9b2104160c6d..e376e25aa0cf08ee036a6e1c4de154adc1dc83d8 100644
--- a/reviewboard/reviews/tests.py
+++ b/reviewboard/reviews/tests.py
@@ -18,6 +18,7 @@ from kgb import SpyAgency
 from reviewboard.accounts.models import Profile, LocalSiteProfile
 from reviewboard.attachments.models import FileAttachment
 from reviewboard.changedescs.models import ChangeDescription
+from reviewboard.reviews.errors import PublishError
 from reviewboard.reviews.forms import DefaultReviewerForm, GroupForm
 from reviewboard.reviews.markdown_utils import (get_markdown_element_tree,
                                                 iter_markdown_lines,
@@ -666,6 +667,8 @@ class ReviewRequestTests(SpyAgency, TestCase):
         review_request.reopen()
         self.assertFalse(review_request.public)
 
+        review_request.publish(review_request.submitter)
+
         review_request.close(ReviewRequest.SUBMITTED)
         self.assertTrue(review_request.public)
 
@@ -803,6 +806,24 @@ class ReviewRequestTests(SpyAgency, TestCase):
         with self.assertRaises(ChangeDescription.DoesNotExist):
             review_request.changedescs.filter(public=True).latest()
 
+    def test_submit_nonpublic(self):
+        """ Testing ReviewRequest.close with non-public requests to ensure state
+        transitions to SUBMITTED from non-public review request is not allowed
+        """
+        review_request = self.create_review_request(public=False)
+
+        with self.assertRaises(PublishError):
+            review_request.close(ReviewRequest.SUBMITTED)
+
+    def test_submit_public(self):
+        """ Testing ReviewRequest.close with public requests to ensure
+        public requests can be transferred to SUBMITTED
+        """
+        review_request = self.create_review_request(public=True)
+
+        review_request.close(ReviewRequest.SUBMITTED)
+
+
 class ViewTests(TestCase):
     """Tests for views in reviewboard.reviews.views"""
     fixtures = ['test_users', 'test_scmtools', 'test_site']
@@ -1909,7 +1930,13 @@ class ReviewRequestCounterTests(TestCase):
         self._check_counters(total_outgoing=1,
                              pending_outgoing=1)
 
-        self.assertFalse(self.review_request.public)
+        self.review_request.publish(self.user)
+
+        self._check_counters(total_outgoing=1,
+                             pending_outgoing=1,
+                             starred_public=1)
+
+        self.assertTrue(self.review_request.public)
         self.assertEqual(self.review_request.status,
                          ReviewRequest.PENDING_REVIEW)
 
@@ -2061,7 +2088,7 @@ class ReviewRequestCounterTests(TestCase):
 
     def test_reopen_submitted_draft_requests(self):
         """Testing counters with reopening submitted draft review requests"""
-        self.test_closing_draft_requests(ReviewRequest.SUBMITTED)
+        self.test_closing_requests(ReviewRequest.SUBMITTED)
 
         # We're simulating what a DefaultReviewer would do by populating
         # the ReviewRequest's target users and groups while not public and
diff --git a/reviewboard/templates/reviews/review_request_actions_secondary.html b/reviewboard/templates/reviews/review_request_actions_secondary.html
index 4399617702d2023b418a5429b16525d74c9fb677..5065897b30394c43ccb597e96547b184ac29b0e2 100644
--- a/reviewboard/templates/reviews/review_request_actions_secondary.html
+++ b/reviewboard/templates/reviews/review_request_actions_secondary.html
@@ -5,7 +5,9 @@
  <li class="has-menu">
   <a class="menu-title" id="close-review-request-link" href="#">{% trans "Close" %} &#9662;</a>
   <ul class="menu" style="display: none;">
+{%   if review_request.public %}
    <li><a id="link-review-request-close-submitted" href="#">{% trans "Submitted" %}</a></li>
+{%   endif %}
    <li><a id="discard-review-request-link" href="#">{% trans "Discarded" %}</a></li>
 {%   if perms.reviews.delete_reviewrequest %}
    <li><a id="delete-review-request-link" href="#">{% trans "Delete Permanently" %}</a></li>
