Index: /main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 10645)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 10646)
@@ -26,4 +26,6 @@
 from datetime import datetime, timedelta
 from urllib import urlencode
+from hurry.query import Eq, Text
+from hurry.query.query import Query
 from zope import schema
 from zope.i18n import translate
@@ -72,4 +74,5 @@
 
 from waeup.kofa.students.export import EXPORTER_NAMES as STUDENT_EXPORTERS
+from waeup.kofa.students.catalog import StudentQueryResultItem
 
 FORBIDDEN_CHARACTERS = (160,)
@@ -1850,4 +1853,51 @@
         return del_local_roles(self,3,**data)
 
+class FindStudentsPage(KofaPage):
+    """Search students in faculty.
+    """
+    grok.context(IFaculty)
+    grok.name('find_students')
+    grok.require('waeup.showStudents')
+    grok.template('findstudentspage')
+    label = _('Find students')
+    search_button = _('Find student')
+    pnav = 1
+
+    def _find_students(self,query=None, searchtype=None, view=None):
+        hitlist = []
+        if searchtype in ('fullname',):
+            results = Query().searchResults(
+                Text(('students_catalog', searchtype), query) &
+                Eq(('students_catalog', 'faccode'), self.context.code)
+                )
+        else:
+            results = Query().searchResults(
+                Eq(('students_catalog', searchtype), query) &
+                Eq(('students_catalog', 'faccode'), self.context.code)
+                )
+        for result in results:
+            hitlist.append(StudentQueryResultItem(result, view=view))
+        return hitlist
+
+    def update(self, *args, **kw):
+        datatable.need()
+        form = self.request.form
+        self.hitlist = []
+        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.hitlist = self._find_students(query=self.searchterm,
+            searchtype=self.searchtype, view=self)
+        if not self.hitlist:
+            self.flash(_('No student found.'))
+        return
+
 class DepartmentAddFormPage(KofaAddFormPage):
     """Add a department to a faculty.
Index: /main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/findstudentspage.pt
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/findstudentspage.pt	(revision 10646)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/findstudentspage.pt	(revision 10646)
@@ -0,0 +1,50 @@
+<form method="POST" i18n:domain="waeup.kofa">
+<br />
+  <input class="btn primary" type="submit" name="search"
+    tal:attributes="value view/search_button" />
+
+  <select name="searchtype">
+    <option i18n:translate="" value="student_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="matric_number">with matriculation number</option>
+  </select>
+
+  <input type="text" name="searchterm" />
+
+  <p>&nbsp;</p>
+  <div tal:condition="view/hitlist">
+    <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="">Student Id</th>
+        <th i18n:translate="">Reg. Number</th>
+        <th i18n:translate="">Matric. Number</th>
+        <th i18n:translate="">State</th>
+        <th i18n:translate="">Full Name</th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr tal:repeat="item view/hitlist" class="gradeC">
+        <td> <a tal:attributes="href item/url">
+          <span tal:content="item/student_id">A123456</span></a>
+        </td>
+        <td class="center"> <a tal:attributes="href item/url">
+          <span tal:content="item/reg_number">9999999</span></a>
+        </td>
+        <td class="center"> <a tal:attributes="href item/url">
+          <span tal:content="item/matric_number">9999999</span></a>
+        </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/browser/viewlets.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py	(revision 10645)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/browser/viewlets.py	(revision 10646)
@@ -446,4 +446,13 @@
     text = _('Manage faculty')
 
+class StudentSearchActionButton(ManageActionButton):
+    grok.order(2)
+    grok.context(IFaculty)
+    grok.view(FacultyPage)
+    grok.require('waeup.showStudents')
+    text = _('Find students')
+    icon = 'actionicon_search.png'
+    target = 'find_students'
+
 class ManageDepartmentActionButton(ManageActionButton):
     """ 'Manage settings' button for departments.
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 10645)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 10646)
@@ -1763,4 +1763,40 @@
         self.assertTrue('Employer' in self.browser.contents)
 
+    def test_find_students_in_faculties(self):
+        # Create local students manager in faculty
+        self.app['users'].addUser('mrmanager', 'mrmanagersecret')
+        self.app['users']['mrmanager'].email = 'mrmanager@foo.ng'
+        self.app['users']['mrmanager'].title = u'Volk Wagen'
+        # Assign LocalStudentsManager role for faculty
+        fac = self.app['faculties']['fac1']
+        prmlocal = IPrincipalRoleManager(fac)
+        prmlocal.assignRoleToPrincipal(
+            'waeup.local.LocalStudentsManager', 'mrmanager')
+        notify(LocalRoleSetEvent(
+            fac, 'waeup.local.LocalStudentsManager', 'mrmanager',
+            granted=True))
+        # Login as manager
+        self.browser.open(self.login_path)
+        self.browser.getControl(name="form.login").value = 'mrmanager'
+        self.browser.getControl(name="form.password").value = 'mrmanagersecret'
+        self.browser.getControl("Login").click()
+        self.assertMatches('...You logged in...', self.browser.contents)
+        # Manager can see his roles
+        self.browser.getLink("My Roles").click()
+        self.assertMatches(
+            '...<span>Students Manager</span>...',
+            self.browser.contents)
+        # The manager can go to his faculty
+        self.browser.getLink(
+            "http://localhost/app/faculties/fac1").click()
+        # and find students
+        self.browser.getLink("Find students").click()
+        self.browser.getControl("Find student").click()
+        self.assertTrue('Empty search string' in self.browser.contents)
+        self.browser.getControl(name="searchtype").value = ['student_id']
+        self.browser.getControl(name="searchterm").value = self.student_id
+        self.browser.getControl("Find student").click()
+        self.assertTrue('Anna Tester' in self.browser.contents)
+
     def test_activate_deactivate_buttons(self):
         self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
