Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9123)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9124)
@@ -42,5 +42,5 @@
 from waeup.kofa.interfaces import (
     IKofaObject, IUserAccount, IExtFileStore, IPasswordValidator, IContactForm,
-    IKofaUtils, IUniversity)
+    IKofaUtils, IUniversity, IObjectHistory)
 from waeup.kofa.interfaces import MessageFactory as _
 from waeup.kofa.widgets.datewidget import (
@@ -299,5 +299,5 @@
     def label(self):
         if self.context.suspended:
-            return _('${a}: Base Data (account suspended)',
+            return _('${a}: Base Data (account deactivated)',
                 mapping = {'a':self.context.display_fullname})
         return  _('${a}: Base Data',
@@ -353,5 +353,6 @@
     grok.name('manage_base')
     grok.require('waeup.manageStudent')
-    form_fields = grok.AutoFields(IStudentBase).omit('student_id', 'adm_code')
+    form_fields = grok.AutoFields(IStudentBase).omit(
+        'student_id', 'adm_code', 'suspended')
     grok.template('basemanagepage')
     label = _('Manage base data')
@@ -414,4 +415,42 @@
         if fields_string:
             self.context.writeLogMessage(self, 'saved: % s' % fields_string)
+        return
+
+class StudentActivatePage(UtilityView, grok.View):
+    """ Activate student account
+    """
+    grok.context(IStudent)
+    grok.name('activate')
+    grok.require('waeup.manageStudent')
+
+    def update(self):
+        self.context.suspended = False
+        self.context.writeLogMessage(self, 'account activated')
+        history = IObjectHistory(self.context)
+        history.addMessage('Student account activated')
+        self.flash(_('Student account has been activated.'))
+        self.redirect(self.url(self.context))
+        return
+
+    def render(self):
+        return
+
+class StudentDeactivatePage(UtilityView, grok.View):
+    """ Deactivate student account
+    """
+    grok.context(IStudent)
+    grok.name('deactivate')
+    grok.require('waeup.manageStudent')
+
+    def update(self):
+        self.context.suspended = True
+        self.context.writeLogMessage(self, 'account deactivated')
+        history = IObjectHistory(self.context)
+        history.addMessage('Student account deactivated')
+        self.flash(_('Student account has been deactivated.'))
+        self.redirect(self.url(self.context))
+        return
+
+    def render(self):
         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 9123)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 9124)
@@ -1918,4 +1918,34 @@
         self.assertTrue('Employer' in self.browser.contents)
 
+    def test_activate_deactivate_buttons(self):
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.student_path)
+        self.browser.getLink("Deactivate").click()
+        self.assertTrue(
+            'Student account has been deactivated.' in self.browser.contents)
+        self.assertTrue(
+            'Base Data (account deactivated)' in self.browser.contents)
+        self.assertTrue(self.student.suspended)
+        self.browser.getLink("Activate").click()
+        self.assertTrue(
+            'Student account has been activated.' in self.browser.contents)
+        self.assertFalse(
+            'Base Data (account deactivated)' in self.browser.contents)
+        self.assertFalse(self.student.suspended)
+        # History messages have been added ...
+        self.browser.getLink("History").click()
+        self.assertTrue(
+            'Student account deactivated by Manager<br />' in self.browser.contents)
+        self.assertTrue(
+            'Student account activated by Manager<br />' in self.browser.contents)
+        # ... and actions have been logged.
+        logfile = os.path.join(
+            self.app['datacenter'].storage, 'logs', 'students.log')
+        logcontent = open(logfile).read()
+        self.assertTrue('zope.mgr - students.browser.StudentDeactivatePage - '
+                        'K1000000 - account deactivated' in logcontent)
+        self.assertTrue('zope.mgr - students.browser.StudentActivatePage - '
+                        'K1000000 - account activated' in logcontent)
+
 class StudentRequestPWTests(StudentsFullSetup):
     # Tests for student registration
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 9123)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py	(revision 9124)
@@ -166,4 +166,34 @@
     target = 'manage_base'
 
+class StudentDeactivateActionButton(ManageActionButton):
+    grok.order(5)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.manageStudent')
+    text = _('Deactivate account')
+    target = 'deactivate'
+    icon = 'actionicon_traffic_lights_red.png'
+
+    @property
+    def target_url(self):
+        if self.context.suspended:
+            return ''
+        return self.view.url(self.view.context, self.target)
+
+class StudentActivateActionButton(ManageActionButton):
+    grok.order(5)
+    grok.context(IStudent)
+    grok.view(StudentBaseDisplayFormPage)
+    grok.require('waeup.manageStudent')
+    text = _('Activate account')
+    target = 'activate'
+    icon = 'actionicon_traffic_lights_green.png'
+
+    @property
+    def target_url(self):
+        if not self.context.suspended:
+            return ''
+        return self.view.url(self.view.context, self.target)
+
 class StudentClearanceManageActionButton(ManageActionButton):
     grok.order(1)
