Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/browser.txt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/browser.txt	(revision 7148)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/browser.txt	(revision 7149)
@@ -125,5 +125,6 @@
   >>> browser.getLink("Add user").click()
   >>> browser.getControl(name="form.name").value = 'bob'
-  >>> browser.getControl(name="form.password").value = 'secret'
+  >>> browser.getControl(name="password").value = 'secret'
+  >>> browser.getControl(name="control_password").value = 'secret'
   >>> browser.getControl("Add user").click()
   >>> print browser.contents
@@ -136,6 +137,4 @@
   >>> browser.getControl("edit", index=0).click()
   >>> browser.getControl("Save", index=0).click()
-  >>> browser.getControl("Save and return", index=0).click()
-  >>> browser.getControl("edit", index=0).click()
   >>> browser.getControl("Cancel", index=0).click()
 
@@ -159,5 +158,6 @@
   >>> browser.open('http://localhost/myuniversity/users/add')
   >>> browser.getControl(name="form.name").value = 'bob'
-  >>> browser.getControl(name="form.password").value = 'secret'
+  >>> browser.getControl(name="password").value = 'secret'
+  >>> browser.getControl(name="control_password").value = 'secret'
   >>> browser.getControl("Add user").click()
   >>> 'The userid chosen already exists' in browser.contents
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/pages.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/pages.py	(revision 7148)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/pages.py	(revision 7149)
@@ -35,5 +35,6 @@
     IWAeUPXMLImporter, IWAeUPXMLExporter, IBatchProcessor,
     ILocalRolesAssignable, DuplicationError, IConfigurationContainer,
-    ISessionConfiguration, ISessionConfigurationAdd, academic_sessions_vocab)
+    ISessionConfiguration, ISessionConfigurationAdd, academic_sessions_vocab,
+    IPasswordValidator)
 from waeup.sirp.permissions import get_users_with_local_roles, getRoles
 from waeup.sirp.university.catalog import search
@@ -285,4 +286,5 @@
     grok.context(IUserContainer)
     grok.name('add')
+    grok.template('usereditformpage')
     form_fields = grok.AutoFields(IUserAccount)
     label = 'Add user'
@@ -294,6 +296,15 @@
         title = data['title']
         description = data['description']
-        password = data['password']
+        #password = data['password']
         roles = data['roles']
+        form = self.request.form
+        password = form.get('password', None)
+        password_ctl = form.get('control_password', None)
+        if password:
+            validator = getUtility(IPasswordValidator)
+            errors = validator.validate_password(password, password_ctl)
+            if errors:
+                self.flash( ' '.join(errors))
+                return
         try:
             self.context.addUser(name, password, title=title,
@@ -318,13 +329,18 @@
     @grok.action('Save')
     def save(self, **data):
+        form = self.request.form
+        password = form.get('password', None)
+        password_ctl = form.get('control_password', None)
+        if password:
+            validator = getUtility(IPasswordValidator)
+            errors = validator.validate_password(password, password_ctl)
+            if errors:
+                self.flash( ' '.join(errors))
+                return
         self.applyData(self.context, **data)
+        if password:
+            # Now we know that the form has no errors and can set password ...
+            self.context.setPassword(password)
         self.flash('User settings have been saved.')
-        return
-
-    @grok.action('Save and return')
-    def saveAndReturn(self, **data):
-        self.applyData(self.context, **data)
-        self.flash('User settings have been saved.')
-        self.redirect(self.url(self.context.__parent__))
         return
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/usereditformpage.pt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/usereditformpage.pt	(revision 7149)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/templates/usereditformpage.pt	(revision 7149)
@@ -0,0 +1,65 @@
+<form action="." tal:attributes="action request/URL" method="post"
+      class="edit-form" enctype="multipart/form-data">
+
+  <h2 i18n:translate=""
+    tal:condition="view/label"
+    tal:content="view/label">Label</h2>
+
+  <div class="form-status"
+      tal:define="status view/status"
+      tal:condition="status">
+      Form Status:
+      <span i18n:translate="" tal:content="view/status">
+        Form status summary
+      </span>
+      <ul tal:condition="view/errors">
+        <li tal:repeat="error view/error_views">
+           <span tal:replace="structure error">Error Type</span>
+        </li>
+      </ul>
+  </div>
+
+  <table class="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>
+      <tr>
+        <td class="label"><label>Password:</label></td>
+        <td>
+          <input name="password" type="password"  />
+        </td>
+      </tr>
+      <tr>
+        <td class="label"><label>Retype password:</label></td>
+        <td>
+          <input name="control_password" type="password" />
+        </td>
+      </tr>
+      <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/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/interfaces.py	(revision 7148)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/interfaces.py	(revision 7149)
@@ -188,7 +188,4 @@
         title = u'Description',
         required = False,)
-    password = schema.Password(
-        title = u'Password',
-        required = True,)
     roles = schema.List(
         title = u'Global roles',
