Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 13577)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 13610)
@@ -1513,5 +1513,5 @@
             return
         if str(self.context.__parent__.current_level) != self.context.__name__:
-            self.flash(_('This level does not correspond current level.'),
+            self.flash(_('This is not the student\'s current level.'),
                        type="danger")
         elif self.context.student.state == REGISTERED:
@@ -1539,5 +1539,5 @@
             return
         if str(self.context.__parent__.current_level) != self.context.__name__:
-            self.flash(_('This level does not correspond current level.'),
+            self.flash(_('This is not the student\'s current level.'),
                        type="danger")
             self.redirect(self.url(self.context))
@@ -1549,5 +1549,5 @@
         elif self.context.student.state == REGISTERED:
             IWorkflowInfo(self.context.student).fireTransition('reset7')
-            message = _('Course list request has been rejected.')
+            message = _('Course list has been unregistered.')
             self.flash(message)
         else:
@@ -1558,4 +1558,33 @@
         self.redirect(self.url(self.context.student) +
             '/contactstudent?%s' % urlencode(args))
+        return
+
+    def render(self):
+        return
+
+class UnregisterCoursesView(UtilityView, grok.View):
+    """Unegister course list by student
+    """
+    grok.context(IStudentStudyLevel)
+    grok.name('unregister_courses')
+    grok.require('waeup.handleStudent')
+
+    def update(self):
+        if not self.context.__parent__.is_current:
+            emit_lock_message(self)
+            return
+        elif not self.context.course_registration_allowed:
+            self.flash(_(
+                "Course registration has ended. "
+                "Unregistration is disabled."), type="warning")
+        elif str(self.context.__parent__.current_level) != self.context.__name__:
+            self.flash(_('This is not your current level.'), type="danger")
+        elif self.context.student.state == REGISTERED:
+            IWorkflowInfo(self.context.student).fireTransition('reset7')
+            message = _('Course list has been unregistered.')
+            self.flash(message)
+        else:
+            self.flash(_('You are in the wrong state.'), type="warning")
+        self.redirect(self.url(self.context))
         return
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 13577)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 13610)
@@ -1748,5 +1748,5 @@
         self.browser.open(L110_student_path)
         self.browser.getLink("Reject courses").click()
-        self.assertTrue('Course list request has been rejected'
+        self.assertTrue('Course list has been unregistered'
             in self.browser.contents)
         self.assertTrue('school fee paid' in self.browser.contents)
@@ -2627,4 +2627,10 @@
         self.assertTrue('Course list has been registered' in self.browser.contents)
         self.assertEqual(self.student.state, 'courses registered')
+        # Course list can be unregistered
+        self.browser.getLink("Unregister courses").click()
+        self.assertEqual(self.student.state, 'school fee paid')
+        self.assertTrue('Course list has been unregistered' in self.browser.contents)
+        self.browser.open(self.student_path + '/studycourse/200/unregister_courses')
+        self.assertTrue('You are in the wrong state' in self.browser.contents)
         # Students can view the transcript
         #self.browser.open(self.studycourse_path)
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 13577)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 13610)
@@ -439,6 +439,24 @@
         return self.view.url(self.view.context, self.target)
 
+class StudentUnregisterCoursesActionButton(ManageActionButton):
+    grok.order(5)
+    grok.context(IStudentStudyLevel)
+    grok.view(StudyLevelDisplayFormPage)
+    grok.require('waeup.handleStudent')
+    text = _('Unregister courses')
+    target = 'unregister_courses'
+    icon = 'actionicon_reject.png'
+
+    @property
+    def target_url(self):
+        is_current = self.context.__parent__.is_current
+        if self.context.student.state != REGISTERED or \
+            str(self.context.__parent__.current_level) != self.context.__name__ or\
+            not is_current:
+            return ''
+        return self.view.url(self.view.context, self.target)
+
 class CourseRegistrationSlipActionButton(ManageActionButton):
-    grok.order(5)
+    grok.order(6)
     grok.context(IStudentStudyLevel)
     grok.view(StudyLevelDisplayFormPage)
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 13577)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/workflow.py	(revision 13610)
@@ -151,6 +151,6 @@
     Transition(
         transition_id = 'reset7',
-        title = _('Reset to school fee paid'),
-        msg = _("Reset to 'school fee paid'"),
+        title = _('Unregister courses'),
+        msg = _("Courses unregistered"),
         source = REGISTERED,
         destination = PAID),
