Index: /main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py	(revision 10626)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py	(revision 10627)
@@ -642,4 +642,12 @@
         )
 
+    current_academic_session = schema.Choice(
+        title = _(u'Current Academic Session'),
+        source = academic_sessions_vocab,
+        default = None,
+        required = False,
+        readonly = False,
+        )
+
 class ISessionConfiguration(IKofaObject):
     """A session configuration object.
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 10626)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 10627)
@@ -146,4 +146,9 @@
     return None
 
+def score_editing_disabled_message(student):
+    config = grok.getSite()['configuration']
+    if student.current_session != config.current_academic_session:
+        return _('Score editing is disabled for this session.')
+    return None
 
 def addCourseTicket(view, course=None):
@@ -3044,4 +3049,59 @@
         return list(set(hitlist))
 
+class EditScoresPage(KofaPage):
+    """Page that filters and lists students.
+    """
+    grok.context(ICourse)
+    grok.require('waeup.manageStudent')
+    grok.name('edit_scores')
+    grok.template('editscorespage')
+    pnav = 1
+
+    def label(self):
+        session = academic_sessions_vocab.getTerm(
+            self.current_academic_session).title
+        return 'Students registered for %s in academic session %s' % (
+            self.context.longtitle(), session)
+
+    def _searchCatalog(self, session):
+        cat = queryUtility(ICatalog, name='coursetickets_catalog')
+        coursetickets = cat.searchResults(
+            session=(session, session),
+            code=(self.context.code, self.context.code)
+            )
+        return list(coursetickets)
+
+    def update(self,  *args, **kw):
+        form = self.request.form
+        ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
+        self.current_academic_session = grok.getSite()[
+            'configuration'].current_academic_session
+        datatable.need()
+        self.tickets = self._searchCatalog(self.current_academic_session)
+        if not self.tickets:
+            self.flash(_('No student found.'))
+            return
+        if 'UPDATE' in form:
+            tno = 0
+            error = ''
+            for ticket in self.tickets:
+                score = ticket.score
+                try:
+                    score = int(form['scores'][tno])
+                except ValueError:
+                    error += '%s, ' % ticket.student.display_fullname
+                if ticket.score != score:
+                    ticket.score = score
+                    ticket.student.__parent__.logger.info(
+                        '%s - %s %s/%s score updated (%s)' %
+                        (ob_class, ticket.student.student_id,
+                         ticket.level, ticket.code, score))
+                    #notify(grok.ObjectModifiedEvent(ticket))
+                tno += 1
+            if error:
+                self.flash(_('Error: Score(s) of %s have not be updated. '
+                  'Only integers are allowed.' % error.strip(', ')))
+        return
+
 class ExportJobContainerOverview(KofaPage):
     """Page that lists active student data export jobs and provides links
Index: /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/editscorespage.pt
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/editscorespage.pt	(revision 10627)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/editscorespage.pt	(revision 10627)
@@ -0,0 +1,37 @@
+<form  i18n:domain="waeup.kofa"  method="POST">
+  <br />
+
+
+  <table class="display dataTable">
+    <thead>
+  	<tr>
+      <th i18n:translate="">Matric No.</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="">Course Level</th>
+      <th i18n:translate="">Score</th>
+  	</tr>
+    </thead>
+    <tbody>
+  	<tr tal:repeat="ticket view/tickets" class="gradeC">
+      <td tal:content="ticket/student/matric_number">MATRIC_NUMBER</td>
+  	  <td tal:content="ticket/student/display_fullname">FULLNAME</td>
+      <td tal:content="ticket/student/translated_state">STATE</td>
+      <td tal:content="ticket/student/certcode">CERTCODE</td>
+      <td tal:content="ticket/student/current_session">SESSION</td>
+      <td tal:content="ticket/student/current_level">LEVEL</td>
+      <td tal:content="ticket/level">LEVEL</td>
+  	  <td><input type="text" name="scores" class="span1"
+  	             tal:attributes="value ticket/score" /></td>
+  	</tr>
+    </tbody>
+  </table>
+
+  <input type="submit" name="UPDATE"
+         value="Update scores" class="btn primary"
+         />
+
+</form>
