Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/authentication.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/authentication.py	(revision 7143)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/authentication.py	(revision 7144)
@@ -215,6 +215,6 @@
     loginpagename = 'login'
     loginfield = 'student_id'
-    passwordfield = 'form.password'
-    repeatfield = 'form.password_repeat'
+    passwordfield = 'change_password'
+    repeatfield = 'change_password_repeat'
 
     def extractCredentials(self, request):
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 7143)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 7144)
@@ -40,5 +40,5 @@
 from waeup.sirp.university.vocabularies import study_modes
 from waeup.sirp.students.interfaces import (
-    IStudentsContainer, IStudent, IStudentClearance, IStudentPasswordSetting,
+    IStudentsContainer, IStudent, IStudentClearance,
     IStudentPersonal, IStudentBase, IStudentStudyCourse,
     IStudentAccommodation, IStudentClearanceEdit, IStudentStudyLevel,
@@ -52,5 +52,6 @@
 from waeup.sirp.students.vocabularies import StudyLevelSource
 from waeup.sirp.students.utils import (
-    getPaymentDetails, getAccommodationDetails, selectBed, renderPDF)
+    getPaymentDetails, getAccommodationDetails, selectBed,
+    renderPDF, validatePassword)
 from waeup.sirp.browser.resources import toggleall
 from waeup.sirp.authentication import get_principal_role_manager
@@ -1496,5 +1497,4 @@
     form_fields = grok.AutoFields(IStudentBase).select(
         'email', 'phone')
-    #grok.template('basemanagepage')
     label = 'Edit base data'
     title = 'Base Data'
@@ -1506,67 +1506,31 @@
         return
 
-class StudentPasswordSetting(grok.Adapter):
-    """Adapt IStudent to data needed for password settings.
-
-    We provide password getters/setters for the attached context (an
-    IStudent object) that cooperate seamless with the usual
-    formlib/form techniques.
-    """
-    grok.context(IStudent)
-    grok.provides(IStudentPasswordSetting)
-
-    def __init__(self, context):
-        self.name = context.fullname
-        self.password_repeat = context.password
-        self.context = context
-        return
-
-    def getPassword(self):
-        return self.context.password
-
-    def setPassword(self, password):
-        IUserAccount(self.context).setPassword(password)
-        return
-
-    password = property(getPassword, setPassword)
-
-class StudentPasswordFormPage(WAeUPEditFormPage):
-    """ View to edit the password by student
+class StudentChangePasswordPage(WAeUPEditFormPage):
+    """ View to manage student base data
     """
     grok.context(IStudent)
     grok.name('change_password')
     grok.require('waeup.handleStudent')
-    form_fields = grok.AutoFields(IStudentPasswordSetting)
-    grok.template('baseeditpage')
+    grok.template('change_password')
     label = 'Change password'
     title = 'Base Data'
     pnav = 4
 
-    def update(self):
-        super(StudentPasswordFormPage, self).update()
-        return
-
-    def onFailure(self, action, data, errors):
-        new_status = []
-        other_errors = False
-        for error in errors:
-            msg = getattr(error, 'message', '')
-            if isinstance(msg, basestring) and msg != '':
-                # invariant error
-                new_status.append(msg)
+    @grok.action('Save')
+    def save(self, **data):
+        form = self.request.form
+        password = form.get('change_password', None)
+        password_ctl = form.get('change_password_repeat', None)
+        if password:
+            if (password != password_ctl):
+                self.flash('Passwords do not match.')
             else:
-                # field error
-                new_status.append('see below for details')
-                continue
-        self.status = u'Error: %s' % ', '.join(new_status)
-        return
-
-    @grok.action('Save', failure=onFailure)
-    def save(self, **data):
-        if not isinstance(data.get('password', None), basestring):
-            self.flash('Password unchanged.')
-            return
-        self.applyData(self.context, **data)
-        self.flash('Password has been set.')
+                error = validatePassword(password)
+                if not error:
+                    IUserAccount(self.context).setPassword(password)
+                    write_log_message(self, 'password changed')
+                    self.flash('Password changed.')
+                else:
+                    self.flash(error)
         return
 
Index: in/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/baseeditpage.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/baseeditpage.pt	(revision 7143)
+++ 	(revision )
@@ -1,51 +1,0 @@
-<h2 i18n:translate=""
-    tal:condition="view/label"
-    tal:content="view/label">Label</h2>
-
-<form action="." tal:attributes="action request/URL" method="post"
-      class="edit-form" enctype="multipart/form-data">
-
-  <div class="form-status"
-    tal:define="status view/status"
-    tal:condition="status">
-    <span i18n:translate="" tal:content="view/status">
-      Form status summary
-    </span>
-  </div>
-
-  <input type="hidden" name="student_id" value=""
-         tal:attributes="value context/student_id" />
-
-  <table class="form-fields zebra">
-    <tbody>
-      <tal:block repeat="widget view/widgets">
-        <tr>
-          <td class="label">
-            <label tal:attributes="for widget/name">
-              <span class="required" tal:condition="widget/required">*</span>
-              <span i18n:translate="" tal:content="widget/label">label</span>:
-            </label>
-          </td>
-          <td class="field">
-            <span class="widget" tal:content="structure widget">
-              <input type="text" />
-            </span>
-            <tal:error tal:condition="widget/error">
-              <span tal:replace="structure widget/error">error</span>
-            </tal:error>
-            <tal:hint tal:condition="widget/hint">
-              <span class="hint" tal:content="structure widget/hint">hint</span>
-            </tal:hint>
-          </td>
-        </tr>
-      </tal:block>
-      <tal:files content="structure provider:files" />
-    </tbody>
-  </table>
-
-  <div class="actionButtons" tal:condition="view/availableActions">
-    <input tal:repeat="action view/actions"
-           tal:replace="structure action/render"
-           />
-  </div>
-</form>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/change_password.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/change_password.pt	(revision 7144)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/change_password.pt	(revision 7144)
@@ -0,0 +1,33 @@
+<h2 i18n:translate=""
+    tal:condition="view/label"
+    tal:content="view/label">Label</h2>
+
+<form action="." tal:attributes="action request/URL" method="post"
+      class="edit-form" enctype="multipart/form-data">
+
+  <input type="hidden" name="student_id" value=""
+         tal:attributes="value context/student_id" />
+
+  <table class="form-fields zebra">
+    <tbody>
+      <tr>
+        <td class="label"><label>Password:</label></td>
+        <td>
+          <input name="change_password" type="password"  />
+        </td>
+      </tr>
+      <tr>
+        <td class="label"><label>Retype password:</label></td>
+        <td>
+          <input name="change_password_repeat" type="password" />
+        </td>
+      </tr>
+    </tbody>
+  </table>
+
+  <div class="actionButtons" tal:condition="view/availableActions">
+    <input tal:repeat="action view/actions"
+           tal:replace="structure action/render"
+           />
+  </div>
+</form>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 7143)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 7144)
@@ -74,26 +74,4 @@
         """
 
-class IStudentPasswordSetting(IWAeUPObject):
-    """Data needed for password setting.
-    """
-
-    password = schema.Password(
-        title = u'New password',
-        description = u'min. length: 3',
-        min_length = 3,
-        required = False,
-        )
-
-    password_repeat = schema.Password(
-        title = u'Retype new password',
-        required = False,
-        )
-
-    @invariant
-    def passwords_match(obj):
-        if obj.password == obj.password_repeat:
-            return
-        raise Invalid('passwords do not match')
-
 class IStudentBase(IWAeUPObject):
     """Representation of student base data.
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 7143)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py	(revision 7144)
@@ -653,19 +653,19 @@
         # Change password
         self.browser.getLink("Change password").click()
-        self.browser.getControl(name="form.password").value = 'pw'
-        self.browser.getControl(
-            name="form.password_repeat").value = 'pw'
+        self.browser.getControl(name="change_password").value = 'pw'
+        self.browser.getControl(
+            name="change_password_repeat").value = 'pw'
         self.browser.getControl("Save").click()
         self.assertTrue('Value is too short' in self.browser.contents)
-        self.browser.getControl(name="form.password").value = 'new_password'
-        self.browser.getControl(
-            name="form.password_repeat").value = 'new_passssword'
-        self.browser.getControl("Save").click()
-        self.assertTrue('passwords do not match' in self.browser.contents)
-        self.browser.getControl(name="form.password").value = 'new_password'
-        self.browser.getControl(
-            name="form.password_repeat").value = 'new_password'
-        self.browser.getControl("Save").click()
-        self.assertTrue('Password has been set' in self.browser.contents)
+        self.browser.getControl(name="change_password").value = 'new_password'
+        self.browser.getControl(
+            name="change_password_repeat").value = 'new_passssword'
+        self.browser.getControl("Save").click()
+        self.assertTrue('Passwords do not match' in self.browser.contents)
+        self.browser.getControl(name="change_password").value = 'new_password'
+        self.browser.getControl(
+            name="change_password_repeat").value = 'new_password'
+        self.browser.getControl("Save").click()
+        self.assertTrue('Password changed' in self.browser.contents)
         # We are still logged in. Changing the password hasn't thrown us out.
         self.browser.getLink("My Data").click()
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/utils.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/utils.py	(revision 7143)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/utils.py	(revision 7144)
@@ -33,4 +33,9 @@
     student['studycourse'].previous_verdict = verdict
     return
+
+def validatePassword(password):
+    if len(password) < 4:
+        return u'Value is too short.'
+    return None
 
 # To be specified in customization packages, see also the view which
