Index: main/waeup.ikoba/trunk/README.txt
===================================================================
--- main/waeup.ikoba/trunk/README.txt	(revision 12522)
+++ main/waeup.ikoba/trunk/README.txt	(revision 12523)
@@ -85,5 +85,5 @@
 Only approved customers can conclude contracts (see below).
 
-Customers can register themselves. They need a valid email address fo self-registration.
+Customers can register themselves. They need a valid email address for self-registration.
 
 
@@ -115,5 +115,6 @@
 5. submitting the documents for verification,
 6. linking the submitted documents on the contract form,
-7. submitting the contract form for approval.
+7. paying the contract fees,
+8. submitting the contract form for approval.
 
 A customer has to register first but must not wait for approval before s/he can add contracts. Only after registration the customer can proceed to the contracts section and add, pay and submit contracts. If documents have to be uploaded and attached to the contract, these documents must be at least submitted for verification. Otherwise they cannot be attached. This ensures that documents can't be modified after application (= submission of contracts). Thus, a new customer can register, add and submit documents and then add, pay and submit contracts in just one single session.
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/browser/templates/loginpage.pt
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/browser/templates/loginpage.pt	(revision 12522)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/browser/templates/loginpage.pt	(revision 12523)
@@ -2,7 +2,10 @@
   <br />
   <div class="form-group">
-    <label i18n:translate="" class="col-sm-2 control-label">User Name or Id</label>
+    <label i18n:translate="" class="col-sm-2 control-label">Identifier</label>
     <div class="col-sm-10">
       <input name="form.login" type="text" class="form-control" id="login">
+      <div class="hint" i18n:translate="identifier_hint">Customers can enter
+      either their customer id, registration number or email address. 
+      Officers must enter their user name.</div>
     </div>
   </div>
@@ -11,11 +14,14 @@
     <div class="col-sm-10">
       <input name="form.password" type="password" class="form-control" id="password">
-      <font  i18n:translate="" color="red"> Notice: User names, ids and passwords are case sensitive.</font>
     </div>
   </div>
+  <br />
   <input type="hidden" name="camefrom"   tal:attributes="value view/camefrom" />
   <input class="btn btn-primary" type="submit" name="SUBMIT"
     tal:attributes="value view/login_button" />
   <br /><br /><br />
+  <p>
+  All identifiers and passwords are case sensitive.
+  </p>
   <p  i18n:translate="login_trouble1">Don't forget to logout or exit your browser when you're done.
     If you are having trouble logging in, make sure to enable  cookies in your web browser.
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/authentication.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/authentication.py	(revision 12522)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/authentication.py	(revision 12523)
@@ -1,3 +1,3 @@
-## $Id: authentication.py 10055 2013-04-04 15:12:43Z uli $
+## $Id$
 ##
 ## Copyright (C) 2014 Uli Fouquet & Henrik Bettermann
@@ -22,4 +22,5 @@
 import time
 from zope.component import getUtility
+from zope.catalog.interfaces import ICatalog
 from zope.password.interfaces import IPasswordManager
 from zope.pluggableauth.interfaces import (
@@ -187,5 +188,10 @@
         customer = customerscontainer.get(login, None)
         if customer is None:
-            return None
+            cat = getUtility(ICatalog, name='customers_catalog')
+            results = list(
+                cat.searchResults(email=(login, login)))
+            if len(results) != 1:
+                return None
+            customer = results[0]
         return IUserAccount(customer)
 
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12522)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/interfaces.py	(revision 12523)
@@ -227,5 +227,5 @@
     email = TextLineChoice(
         title = _(u'Email'),
-        required = False,
+        required = True,
         constraint=validate_email,
         source = contextual_email_source,
Index: main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py
===================================================================
--- main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12522)
+++ main/waeup.ikoba/trunk/src/waeup/ikoba/customers/tests/test_browser.py	(revision 12523)
@@ -550,4 +550,16 @@
     # Tests for Customer class views and pages
 
+    def test_customer_login_with_email(self):
+        self.assertEqual(self.customer.state, 'created')
+        self.browser.open(self.login_path)
+        self.browser.getControl(name="form.login").value = self.customer.email
+        self.browser.getControl(name="form.password").value = 'cpwd'
+        self.browser.getControl("Login").click()
+        self.assertEqual(self.browser.url, self.customer_path)
+        self.assertTrue('You logged in' in self.browser.contents)
+        # Status has changed
+        self.assertEqual(self.customer.state, 'started')
+        return
+
     def test_customer_change_password(self):
         # Customers can change the password
