Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/applicant.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/applicant.py	(revision 8403)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/applicant.py	(revision 8404)
@@ -20,4 +20,6 @@
 from cStringIO import StringIO
 from grok import index
+from hurry.query import Eq, Text
+from hurry.query.query import Query
 from zope.component import getUtility, createObject, getAdapter
 from zope.component.interfaces import IFactory
@@ -37,4 +39,13 @@
 from waeup.kofa.applicants.interfaces import IApplicant, IApplicantEdit
 from waeup.kofa.applicants.workflow import application_states_dict
+
+def search(query=None, searchtype=None, view=None):
+    if searchtype in ('fullname',):
+        results = Query().searchResults(
+            Text(('applicants_catalog', searchtype), query))
+    else:
+        results = Query().searchResults(
+            Eq(('applicants_catalog', searchtype), query))
+    return results
 
 class Applicant(grok.Container):
@@ -157,5 +168,5 @@
 Applicant = attrs_to_fields(Applicant)
 
-class ApplicantCatalog(grok.Indexes):
+class ApplicantsCatalog(grok.Indexes):
     """A catalog indexing :class:`Applicant` instances in the ZODB.
     """
@@ -164,5 +175,5 @@
     grok.context(IApplicant)
 
-    #access_code = index.Field(attribute='access_code')
+    fullname = index.Text(attribute='display_fullname')
     applicant_id = index.Field(attribute='applicant_id')
     reg_number = index.Field(attribute='reg_number')
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8403)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8404)
@@ -36,4 +36,5 @@
     IApplicantRegisterUpdate
     )
+from waeup.kofa.applicants.applicant import search
 from waeup.kofa.applicants.workflow import INITIALIZED, STARTED, PAID, SUBMITTED
 from waeup.kofa.browser import (
@@ -68,4 +69,5 @@
     form_fields['description'].custom_widget = HTMLDisplayWidget
     label = _('Application Section')
+    search_button = _('Search')
     pnav = 3
 
@@ -83,4 +85,32 @@
             html = self.context.description_dict.get(portal_language,'')
         return html
+
+class ApplicantsSearchPage(KofaPage):
+    grok.context(IApplicantsRoot)
+    grok.name('search')
+    grok.require('waeup.viewApplication')
+    label = _('Search applicants')
+    search_button = _('Search')
+    pnav = 3
+
+    def update(self, *args, **kw):
+        datatable.need()
+        form = self.request.form
+        self.results = []
+        if 'searchterm' in form and form['searchterm']:
+            self.searchterm = form['searchterm']
+            self.searchtype = form['searchtype']
+        elif 'old_searchterm' in form:
+            self.searchterm = form['old_searchterm']
+            self.searchtype = form['old_searchtype']
+        else:
+            if 'search' in form:
+                self.flash(_('Empty search string'))
+            return
+        self.results = search(query=self.searchterm,
+            searchtype=self.searchtype, view=self)
+        if not self.results:
+            self.flash(_('No applicant found.'))
+        return
 
 class ApplicantsRootManageFormPage(KofaEditFormPage):
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantssearchpage.pt
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantssearchpage.pt	(revision 8404)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantssearchpage.pt	(revision 8404)
@@ -0,0 +1,47 @@
+<form method="POST" i18n:domain="waeup.kofa">
+<br />
+  <input class="btn primary" type="submit" name="search"
+    tal:attributes="value view/search_button" />
+  <span i18n:translate="">for applicant</span>
+
+  <select name="searchtype">
+    <option i18n:translate="" value="applicant_id">with id</option>
+    <option i18n:translate="" value="fullname">with name</option>
+    <option i18n:translate="" value="reg_number">with registration number</option>
+    <option i18n:translate="" value="email">with email address</option>
+  </select>
+
+  <input type="text" name="searchterm" />
+
+  <p>&nbsp;</p>
+  <div tal:condition="view/results">
+    <h3 i18n:translate="">Search Results</h3>
+    <input type="hidden" name="old_searchterm"
+         tal:attributes="value view/searchterm" />
+    <input type="hidden" name="old_searchtype"
+         tal:attributes="value view/searchtype" />
+    <table class="display dataTable">
+      <thead>
+      <tr>
+        <th i18n:translate="">Applicant Id</th>
+        <th i18n:translate="">Reg. Number</th>
+        <th i18n:translate="">Application State</th>
+        <th i18n:translate="">Full Name</th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr tal:repeat="item view/results" class="gradeC">
+        <td> <a tal:attributes="href python:view.url(item)">
+          <span tal:content="item/applicant_id">XXXX_1234</span></a>
+        </td>
+        <td class="center">
+          <span tal:content="item/reg_number">9999999</span>
+        </td>
+        <td tal:content="item/state">admitted</td>
+        <td tal:content="item/display_fullname">Bob</td>
+      </tr>
+      </tbody>
+    </table>
+    <br />
+  </div>
+</form>
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/viewlets.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/viewlets.py	(revision 8403)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/viewlets.py	(revision 8404)
@@ -82,5 +82,15 @@
         return self.view.application_url() + rel_link
 
+class SearchApplicantsActionButton(ManageActionButton):
+    grok.order(1)
+    grok.context(IApplicantsRoot)
+    grok.view(ApplicantsRootPage)
+    grok.require('waeup.viewApplication')
+    text = _('Search applicants')
+    icon = 'actionicon_search.png'
+    target = '@@search'
+
 class ManageApplicantsRootActionButton(ManageActionButton):
+    grok.order(2)
     grok.context(IApplicantsRoot)
     grok.view(ApplicantsRootPage)
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 8403)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 8404)
@@ -189,10 +189,10 @@
                 self.searchterm = int(self.searchterm)
             except ValueError:
-                self.flash('Only year dates allowed (e.g. 2011).')
+                self.flash(_('Only year dates allowed (e.g. 2011).'))
                 return
         self.hitlist = search(query=self.searchterm,
             searchtype=self.searchtype, view=self)
         if not self.hitlist:
-            self.flash('No student found.')
+            self.flash(_('No student found.'))
         return
 
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/catalog.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/catalog.py	(revision 8403)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/catalog.py	(revision 8404)
@@ -30,5 +30,5 @@
 from waeup.kofa.university.vocabularies import course_levels
 
-class StudentIndexes(grok.Indexes):
+class StudentsCatalog(grok.Indexes):
     """A catalog for students.
     """
