Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 9805)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/pages.py	(revision 9806)
@@ -62,6 +62,4 @@
     get_users_with_role)
 
-from waeup.kofa.students.catalog import search as searchstudents
-from waeup.kofa.students.catalog import StudentQueryResultItem
 from waeup.kofa.university.catalog import search
 from waeup.kofa.university.vocabularies import course_levels
@@ -1881,128 +1879,4 @@
             yield(dict(url=url, name=key, container=val))
 
-class FilterStudentsInDepartmentPage(KofaPage):
-    """Page that filters and lists students.
-    """
-    grok.context(IDepartment)
-    grok.require('waeup.showStudents')
-    grok.name('students')
-    grok.template('filterstudentspage')
-    pnav = 1
-    session_label = _('in session')
-    level_label = _('at level')
-
-    def label(self):
-        return 'Students in %s ...' % self.context.longtitle()
-
-    def _set_session_values(self):
-        vocab_terms = academic_sessions_vocab.by_value.values()
-        self.sessions = sorted(
-            [(x.title, x.token) for x in vocab_terms], reverse=True)
-        self.sessions += [('All Sessions', 'all')]
-        return
-
-    def _set_level_values(self):
-        vocab_terms = course_levels.by_value.values()
-        self.levels = sorted(
-            [(x.title, x.token) for x in vocab_terms])
-        self.levels += [('All Levels', 'all')]
-        return
-
-    def _searchCatalog(self, session, level):
-        if level not in (10, 999, None):
-            start_level = 100 * (level // 100)
-            end_level = start_level + 90
-        else:
-            start_level = end_level = level
-        cat = queryUtility(ICatalog, name='students_catalog')
-        students = cat.searchResults(
-            current_session=(session, session),
-            current_level=(start_level, end_level),
-            depcode=(self.context.code, self.context.code)
-            )
-        hitlist = []
-        for student in students:
-            hitlist.append(StudentQueryResultItem(student, view=self))
-        return hitlist
-
-    def update(self, SHOW=None, session=None, level=None):
-        datatable.need()
-        self.parent_url = self.url(self.context.__parent__)
-        self._set_session_values()
-        self._set_level_values()
-        self.hitlist = []
-        self.session_default = session
-        self.level_default = level
-        if SHOW is not None:
-            if session != 'all':
-                self.session = int(session)
-                self.session_string = '%s %s/%s' % (
-                    self.session_label, self.session, self.session+1)
-            else:
-                self.session = None
-                self.session_string = _('in any session')
-            if level != 'all':
-                self.level = int(level)
-                self.level_string = '%s %s' % (self.level_label, self.level)
-            else:
-                self.level = None
-                self.level_string = _('at any level')
-            self.hitlist = self._searchCatalog(self.session, self.level)
-            if not self.hitlist:
-                self.flash(_('No student found.'))
-        return
-
-class FilterStudentsInCertificatePage(FilterStudentsInDepartmentPage):
-    """Page that filters and lists students.
-    """
-    grok.context(ICertificate)
-
-    def label(self):
-        return 'Students studying %s ...' % self.context.longtitle()
-
-    def _searchCatalog(self, session, level):
-        if level not in (10, 999, None):
-            start_level = 100 * (level // 100)
-            end_level = start_level + 90
-        else:
-            start_level = end_level = level
-        cat = queryUtility(ICatalog, name='students_catalog')
-        students = cat.searchResults(
-            current_session=(session, session),
-            current_level=(start_level, end_level),
-            certcode=(self.context.code, self.context.code)
-            )
-        hitlist = []
-        for student in students:
-            hitlist.append(StudentQueryResultItem(student, view=self))
-        return hitlist
-
-class FilterStudentsInCoursePage(FilterStudentsInDepartmentPage):
-    """Page that filters and lists students.
-    """
-    grok.context(ICourse)
-
-    def label(self):
-        return 'Students registered for %s ...' % self.context.longtitle()
-
-    def _searchCatalog(self, session, level):
-        if level not in (10, 999, None):
-            start_level = 100 * (level // 100)
-            end_level = start_level + 90
-        else:
-            start_level = end_level = level
-        cat = queryUtility(ICatalog, name='coursetickets_catalog')
-        coursetickets = cat.searchResults(
-            session=(session, session),
-            level=(start_level, end_level),
-            code=(self.context.code, self.context.code)
-            )
-        hitlist = []
-        for ticket in coursetickets:
-            # XXX: If students have registered the same courses twice
-            # they will be listed twice.
-            hitlist.append(StudentQueryResultItem(ticket.student, view=self))
-        return hitlist
-
 class DepartmentManageFormPage(KofaEditFormPage):
     """Manage the basic properties of a `Department` instance.
Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/filterstudentspage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/templates/filterstudentspage.pt	(revision 9805)
+++ 	(revision )
@@ -1,86 +1,0 @@
-<form  i18n:domain="waeup.kofa"  method="POST">
-  <br />
-  <label for="session">
-    <span tal:replace="view/session_label">SESSION</span>:
-  </label>
-  <div class="input">
-    <select name="session">
-      <span tal:repeat="item view/sessions" tal:omit-tag="">
-        <option
-            tal:define="name python: item[1];
-                        title python: item[0];
-                        selected python: view.session_default == name"
-            tal:attributes="value name; selected selected">
-          <span tal:replace="title">TITLE</span>
-        </option>
-      </span>
-    </select>
-  </div>
-  <br /><br />
-  <label for="levels">
-    <span tal:replace="view/level_label">LEVEL</span>:
-  </label>
-  <div class="input">
-  <select name="level">
-    <span tal:repeat="item view/levels" tal:omit-tag="">
-      <option
-          tal:define="name python: item[1];
-                      title python: item[0];
-                      selected python: view.level_default == name"
-          tal:attributes="value name; selected selected">
-        <span tal:replace="title">TITLE</span>
-      </option>
-    </span>
-  </select>
-  </div>
-  <br /><br />
-  <div class="input">
-    <input i18n:translate="" type="submit" class="btn primary"
-           name="SHOW" value="Show" />
-    <a class="btn secondary" href=""
-       tal:attributes="href view/parent_url">Cancel</a>
-  </div>
-
-  <br /><br />
-
-  <div tal:condition="view/hitlist">
-    <h3>
-      ...
-      <span tal:replace="view/session_string">SESSION</span>
-      <span i18n:translate="">and</span>
-      <span tal:replace="view/level_string">LEVEL</span>
-    </h3>
-    <table class="display dataTable">
-      <thead>
-    	<tr>
-    	  <th i18n:translate="">Student Id</th>
-        <th i18n:translate="">Fullname</th>
-        <th i18n:translate="">Status</th>
-        <th i18n:translate="">Certificate</th>
-        <th i18n:translate="">Current Session</th>
-        <th i18n:translate="">Current Level</th>
-        <th i18n:translate="">Comment</th>
-    	</tr>
-      </thead>
-      <tbody>
-    	<tr tal:repeat="item view/hitlist" class="gradeC">
-    	  <td> <a tal:attributes="href item/url"
-                target="_blank">
-          <span tal:content="item/student_id">A123456</span></a>
-        </td>
-    	  <td tal:content="item/display_fullname">FULLNAME</td>
-        <td tal:content="item/translated_state">STATE</td>
-        <td>
-          <a tal:attributes="href python: view.url(item.certificate)"
-             tal:content="item/certificate/code">
-             CERTIFICATE
-          </a>
-        </td>
-        <td tal:content="item/current_session">SESSION</td>
-        <td tal:content="item/current_level">LEVEL</td>
-        <td><span tal:condition="item/comment">yes</span></td>
-    	</tr>
-      </tbody>
-    </table>
-  </div>
-</form>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9805)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9806)
@@ -52,4 +52,6 @@
     FriendlyDatetimeDisplayWidget)
 from waeup.kofa.mandates.mandate import PasswordMandate
+from waeup.kofa.university.interfaces import (
+    IDepartment, ICertificate, ICourse)
 from waeup.kofa.university.department import (
     VirtualDepartmentExportJobContainer,)
@@ -67,5 +69,5 @@
     IBedTicket, IStudentsUtils, IStudentRequestPW
     )
-from waeup.kofa.students.catalog import search, StudentsQuery
+from waeup.kofa.students.catalog import search, StudentQueryResultItem
 from waeup.kofa.students.export import EXPORTER_NAMES
 from waeup.kofa.students.studylevel import StudentStudyLevel, CourseTicket
@@ -2503,4 +2505,128 @@
         return
 
+class FilterStudentsInDepartmentPage(KofaPage):
+    """Page that filters and lists students.
+    """
+    grok.context(IDepartment)
+    grok.require('waeup.showStudents')
+    grok.name('students')
+    grok.template('filterstudentspage')
+    pnav = 1
+    session_label = _('in session')
+    level_label = _('at level')
+
+    def label(self):
+        return 'Students in %s ...' % self.context.longtitle()
+
+    def _set_session_values(self):
+        vocab_terms = academic_sessions_vocab.by_value.values()
+        self.sessions = sorted(
+            [(x.title, x.token) for x in vocab_terms], reverse=True)
+        self.sessions += [('All Sessions', 'all')]
+        return
+
+    def _set_level_values(self):
+        vocab_terms = course_levels.by_value.values()
+        self.levels = sorted(
+            [(x.title, x.token) for x in vocab_terms])
+        self.levels += [('All Levels', 'all')]
+        return
+
+    def _searchCatalog(self, session, level):
+        if level not in (10, 999, None):
+            start_level = 100 * (level // 100)
+            end_level = start_level + 90
+        else:
+            start_level = end_level = level
+        cat = queryUtility(ICatalog, name='students_catalog')
+        students = cat.searchResults(
+            current_session=(session, session),
+            current_level=(start_level, end_level),
+            depcode=(self.context.code, self.context.code)
+            )
+        hitlist = []
+        for student in students:
+            hitlist.append(StudentQueryResultItem(student, view=self))
+        return hitlist
+
+    def update(self, SHOW=None, session=None, level=None):
+        datatable.need()
+        self.parent_url = self.url(self.context.__parent__)
+        self._set_session_values()
+        self._set_level_values()
+        self.hitlist = []
+        self.session_default = session
+        self.level_default = level
+        if SHOW is not None:
+            if session != 'all':
+                self.session = int(session)
+                self.session_string = '%s %s/%s' % (
+                    self.session_label, self.session, self.session+1)
+            else:
+                self.session = None
+                self.session_string = _('in any session')
+            if level != 'all':
+                self.level = int(level)
+                self.level_string = '%s %s' % (self.level_label, self.level)
+            else:
+                self.level = None
+                self.level_string = _('at any level')
+            self.hitlist = self._searchCatalog(self.session, self.level)
+            if not self.hitlist:
+                self.flash(_('No student found.'))
+        return
+
+class FilterStudentsInCertificatePage(FilterStudentsInDepartmentPage):
+    """Page that filters and lists students.
+    """
+    grok.context(ICertificate)
+
+    def label(self):
+        return 'Students studying %s ...' % self.context.longtitle()
+
+    def _searchCatalog(self, session, level):
+        if level not in (10, 999, None):
+            start_level = 100 * (level // 100)
+            end_level = start_level + 90
+        else:
+            start_level = end_level = level
+        cat = queryUtility(ICatalog, name='students_catalog')
+        students = cat.searchResults(
+            current_session=(session, session),
+            current_level=(start_level, end_level),
+            certcode=(self.context.code, self.context.code)
+            )
+        hitlist = []
+        for student in students:
+            hitlist.append(StudentQueryResultItem(student, view=self))
+        return hitlist
+
+class FilterStudentsInCoursePage(FilterStudentsInDepartmentPage):
+    """Page that filters and lists students.
+    """
+    grok.context(ICourse)
+
+    def label(self):
+        return 'Students registered for %s ...' % self.context.longtitle()
+
+    def _searchCatalog(self, session, level):
+        if level not in (10, 999, None):
+            start_level = 100 * (level // 100)
+            end_level = start_level + 90
+        else:
+            start_level = end_level = level
+        cat = queryUtility(ICatalog, name='coursetickets_catalog')
+        coursetickets = cat.searchResults(
+            session=(session, session),
+            level=(start_level, end_level),
+            code=(self.context.code, self.context.code)
+            )
+        hitlist = []
+        for ticket in coursetickets:
+            # XXX: If students have registered the same courses twice
+            # they will be listed twice.
+            hitlist.append(StudentQueryResultItem(ticket.student, view=self))
+        return hitlist
+
 class DepartmentExportJobContainerOverview(KofaPage):
     """Page that filters and lists students.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/filterstudentspage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/filterstudentspage.pt	(revision 9806)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/filterstudentspage.pt	(revision 9806)
@@ -0,0 +1,86 @@
+<form  i18n:domain="waeup.kofa"  method="POST">
+  <br />
+  <label for="session">
+    <span tal:replace="view/session_label">SESSION</span>:
+  </label>
+  <div class="input">
+    <select name="session">
+      <span tal:repeat="item view/sessions" tal:omit-tag="">
+        <option
+            tal:define="name python: item[1];
+                        title python: item[0];
+                        selected python: view.session_default == name"
+            tal:attributes="value name; selected selected">
+          <span tal:replace="title">TITLE</span>
+        </option>
+      </span>
+    </select>
+  </div>
+  <br /><br />
+  <label for="levels">
+    <span tal:replace="view/level_label">LEVEL</span>:
+  </label>
+  <div class="input">
+  <select name="level">
+    <span tal:repeat="item view/levels" tal:omit-tag="">
+      <option
+          tal:define="name python: item[1];
+                      title python: item[0];
+                      selected python: view.level_default == name"
+          tal:attributes="value name; selected selected">
+        <span tal:replace="title">TITLE</span>
+      </option>
+    </span>
+  </select>
+  </div>
+  <br /><br />
+  <div class="input">
+    <input i18n:translate="" type="submit" class="btn primary"
+           name="SHOW" value="Show" />
+    <a class="btn secondary" href=""
+       tal:attributes="href view/parent_url">Cancel</a>
+  </div>
+
+  <br /><br />
+
+  <div tal:condition="view/hitlist">
+    <h3>
+      ...
+      <span tal:replace="view/session_string">SESSION</span>
+      <span i18n:translate="">and</span>
+      <span tal:replace="view/level_string">LEVEL</span>
+    </h3>
+    <table class="display dataTable">
+      <thead>
+    	<tr>
+    	  <th i18n:translate="">Student Id</th>
+        <th i18n:translate="">Fullname</th>
+        <th i18n:translate="">Status</th>
+        <th i18n:translate="">Certificate</th>
+        <th i18n:translate="">Current Session</th>
+        <th i18n:translate="">Current Level</th>
+        <th i18n:translate="">Comment</th>
+    	</tr>
+      </thead>
+      <tbody>
+    	<tr tal:repeat="item view/hitlist" class="gradeC">
+    	  <td> <a tal:attributes="href item/url"
+                target="_blank">
+          <span tal:content="item/student_id">A123456</span></a>
+        </td>
+    	  <td tal:content="item/display_fullname">FULLNAME</td>
+        <td tal:content="item/translated_state">STATE</td>
+        <td>
+          <a tal:attributes="href python: view.url(item.certificate)"
+             tal:content="item/certificate/code">
+             CERTIFICATE
+          </a>
+        </td>
+        <td tal:content="item/current_session">SESSION</td>
+        <td tal:content="item/current_level">LEVEL</td>
+        <td><span tal:condition="item/comment">yes</span></td>
+    	</tr>
+      </tbody>
+    </table>
+  </div>
+</form>
