diff --git a/common/djangoapps/course_modes/tests/test_views.py b/common/djangoapps/course_modes/tests/test_views.py
index 4df40ab2af722620cac6c679d5dd972aec532ed5..25dfad2a2ba88e396a96ec2037c62c1debf37b06 100644
--- a/common/djangoapps/course_modes/tests/test_views.py
+++ b/common/djangoapps/course_modes/tests/test_views.py
@@ -98,3 +98,45 @@ class CourseModeViewTest(TestCase):
         self.assertEquals(response.status_code, 200)
         # TODO: Fix it so that response.templates works w/ mako templates, and then assert
         # that the right template rendered
+
+
+class ProfessionalModeViewTest(TestCase):
+    """
+    Tests for redirects specific to the 'professional' course mode.
+    Can't really put this in the ddt-style tests in CourseModeViewTest,
+    since 'professional' mode implies it is the *only* mode for a course
+    """
+    def setUp(self):
+        self.course_id = SlashSeparatedCourseKey('org', 'course', 'run')
+        CourseModeFactory(mode_slug='professional', course_id=self.course_id)
+        self.user = UserFactory()
+
+    @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms')
+    def test_professional_registration(self):
+        self.client.login(
+            username=self.user.username,
+            password='test'
+        )
+
+        response = self.client.get(
+            reverse('course_modes_choose', args=[self.course_id.to_deprecated_string()]),
+            follow=False,
+        )
+
+        self.assertEquals(response.status_code, 302)
+        self.assertTrue(response['Location'].endswith(reverse('verify_student_show_requirements', args=[unicode(self.course_id)])))
+
+        CourseEnrollmentFactory(
+            user=self.user,
+            is_active=True,
+            mode="professional",
+            course_id=unicode(self.course_id),
+        )
+
+        response = self.client.get(
+            reverse('course_modes_choose', args=[self.course_id.to_deprecated_string()]),
+            follow=False,
+        )
+
+        self.assertEquals(response.status_code, 302)
+        self.assertTrue(response['Location'].endswith(reverse('dashboard')))
diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py
index 83c12ab69f125c39c343b0e16342f63aab3f7bb9..a773c77f623cb47425dc0b7ee26c5055dea5d532 100644
--- a/common/djangoapps/course_modes/views.py
+++ b/common/djangoapps/course_modes/views.py
@@ -41,12 +41,26 @@ class ChooseModeView(View):
         request.session['attempting_upgrade'] = upgrade
 
         # Inactive users always need to re-register
-        # verified users do not need to register or upgrade
+        # verified and professional users do not need to register or upgrade
         # registered users who are not trying to upgrade do not need to re-register
-        if is_active and (upgrade is False or enrollment_mode == 'verified'):
+        if is_active and (upgrade is False or enrollment_mode == 'verified' or enrollment_mode == 'professional'):
             return redirect(reverse('dashboard'))
 
         modes = CourseMode.modes_for_course_dict(course_key)
+
+        # We assume that, if 'professional' is one of the modes, it is the *only* mode.
+        # If we offer more modes alongside 'professional' in the future, this will need to route
+        # to the usual "choose your track" page.
+        if "professional" in modes:
+            return redirect(
+                reverse(
+                    'verify_student_show_requirements',
+                    kwargs={'course_id': course_key.to_deprecated_string()}
+                )
+            )
+
+
+
         donation_for_course = request.session.get("donation_for_course", {})
         chosen_price = donation_for_course.get(course_key, None)
 
diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py
index 8c23a0512b3bf2209e87c3707d87e39f4d1e123b..baadac464cb5716f74c2340888f274fd256e245c 100644
--- a/lms/djangoapps/courseware/views.py
+++ b/lms/djangoapps/courseware/views.py
@@ -708,7 +708,7 @@ def mktg_course_about(request, course_id):
 
     show_courseware_link = (has_access(request.user, 'load', course) or
                             settings.FEATURES.get('ENABLE_LMS_MIGRATION'))
-    course_modes = CourseMode.modes_for_course(course.id)
+    course_modes = CourseMode.modes_for_course_dict(course.id)
 
     return render_to_response('courseware/mktg_course_about.html', {
         'course': course,
diff --git a/lms/templates/courseware/mktg_course_about.html b/lms/templates/courseware/mktg_course_about.html
index e59ebb0f69cdbb06d8a3321985241f0ad97ff6ec..cb195b47f17b7a58ab8fd13a615a27ae746d378d 100644
--- a/lms/templates/courseware/mktg_course_about.html
+++ b/lms/templates/courseware/mktg_course_about.html
@@ -55,7 +55,15 @@
         <a class="action action-register register ${'has-option-verified' if len(course_modes) > 1 else ''}" href="#">${_("Register for")} <strong>${course.display_number_with_default | h}</strong>
             %if len(course_modes) > 1:
             <span class="track">
-            and choose your student track
+            ## Translators: This is the second line on a button users can click.  The first line is "Register for COURSE_NAME"
+            ## The "choose your student track" means users can select between taking the course as an auditor, as a verified student, etc
+            ${_("and choose your student track")}
+            </span>
+            %elif "professional" in course_modes:
+            <span class="track">
+            ## Translators: This is the second line on a button users can click.  The first line is "Register for COURSE_NAME"
+            ## 'Verification' here refers to verifying one's identity in order to receive a verified certificate.
+            ${_("and proceed to verification")}
             </span>
             %endif
         </a>