Index: main/waeup.aaue/trunk/src/waeup/aaue/interfaces.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/interfaces.py	(revision 15327)
+++ main/waeup.aaue/trunk/src/waeup/aaue/interfaces.py	(revision 15330)
@@ -302,4 +302,11 @@
         )
 
+    studylevel_repair_enabled = schema.Bool(
+        title = _(u'Course list repair enabled'),
+        description = _(u'If set, students will be able to add and delete courses.'),
+        default = False,
+        required = False,
+        )
+
 
     def getSessionString():
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 15327)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py	(revision 15330)
@@ -29,10 +29,10 @@
 from zope.formlib.textwidgets import BytesDisplayWidget
 from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
-from waeup.kofa.browser.layout import UtilityView
+from waeup.kofa.browser.layout import UtilityView, KofaEditFormPage, jsaction
 from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
 from waeup.kofa.interfaces import (
     IKofaUtils, academic_sessions_vocab, ICSVExporter, IKofaObject)
 from waeup.kofa.students.interfaces import (
-    IStudentsUtils, IStudent, IStudentRequestPW)
+    IStudentsUtils, IStudent, IStudentRequestPW, IStudentStudyLevel)
 from waeup.kofa.students.workflow import PAID, REGISTERED, RETURNING
 from waeup.kofa.students.browser import (
@@ -56,5 +56,7 @@
     StudentRequestPasswordPage,
     StudyCourseManageFormPage,
-    UnregisterCoursesView
+    UnregisterCoursesView,
+    addCourseTicket,
+    emit_lock_message
     )
 from kofacustom.nigeria.students.browser import (
@@ -391,4 +393,6 @@
                          'Student ID Card Fee, '
                          'Student Union Dues, '
+                         'Sports Fee, '
+                         'Library Levy, '
                          'Student Welfare Assurance Fee and ')
             else:
@@ -401,4 +405,6 @@
                 text += ('School Fee, '
                          'Student Union Dues, '
+                         'Sports Development Fee, '
+                         'Library Development Levy, '
                          'Student Welfare Assurance Fee and ')
         elif self.context.p_category in (
@@ -512,4 +518,82 @@
     """
     grok.context(ICustomStudentStudyLevel)
+
+class StudyLevelRepairFormPage(KofaEditFormPage):
+    """ Page to repair the student study level data by students
+    """
+    grok.context(IStudentStudyLevel)
+    grok.name('repair')
+    grok.require('waeup.editStudyLevel')
+    grok.template('studylevelrepairpage')
+    pnav = 4
+    placeholder = _('Enter valid course code')
+
+    def update(self, ADD=None, course=None):
+        try:
+            studylevel_repair_enabled = grok.getSite()['configuration'][
+                str(self.context.level_session)].studylevel_repair_enabled
+        except KeyError:
+            emit_lock_message(self)
+            return
+        if not studylevel_repair_enabled:
+            emit_lock_message(self)
+            return
+        super(StudyLevelRepairFormPage, self).update()
+        if ADD is not None:
+            if not course:
+                self.flash(_('No valid course code entered.'), type="warning")
+                return
+            cat = queryUtility(ICatalog, name='courses_catalog')
+            result = cat.searchResults(code=(course, course))
+            if len(result) != 1:
+                self.flash(_('Course not found.'), type="warning")
+                return
+            course = list(result)[0]
+            addCourseTicket(self, course)
+        return
+
+    @property
+    def label(self):
+        # Here we know that the cookie has been set
+        lang = self.request.cookies.get('kofa.language')
+        level_title = translate(self.context.level_title, 'waeup.kofa',
+            target_language=lang)
+        return _('Repair course list of ${a}',
+            mapping = {'a':level_title})
+
+    @property
+    def translated_values(self):
+        return translated_values(self)
+
+    def _delCourseTicket(self, **data):
+        form = self.request.form
+        if 'val_id' in form:
+            child_id = form['val_id']
+        else:
+            self.flash(_('No ticket selected.'), type="warning")
+            self.redirect(self.url(self.context, '@@edit'))
+            return
+        if not isinstance(child_id, list):
+            child_id = [child_id]
+        deleted = []
+        for id in child_id:
+            # Students are not allowed to remove core tickets
+            if id in self.context and \
+                self.context[id].removable_by_student:
+                del self.context[id]
+                deleted.append(id)
+        if len(deleted):
+            self.flash(_('Successfully removed: ${a}',
+                mapping = {'a':', '.join(deleted)}))
+            self.context.writeLogMessage(
+                self,'removed: %s at %s' %
+                (', '.join(deleted), self.context.level))
+        self.redirect(self.url(self.context, u'@@repair'))
+        return
+
+    @jsaction(_('Remove selected tickets'))
+    def delCourseTicket(self, **data):
+        self._delCourseTicket(**data)
+        return
 
 class CustomExportPDFCourseRegistrationSlip(
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/browser_templates/studylevelrepairpage.pt
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/browser_templates/studylevelrepairpage.pt	(revision 15330)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/browser_templates/studylevelrepairpage.pt	(revision 15330)
@@ -0,0 +1,64 @@
+<form action="." tal:attributes="action request/URL" method="POST"
+      i18n:domain="waeup.kofa" enctype="multipart/form-data">
+
+  <h3 i18n:translate="">
+    Course Tickets
+    (Total Credits:
+    <span i18n:name="total_credits"
+      tal:replace="view/context/total_credits">TOTAL</span>)
+  </h3>
+  <table class="kofa-data-table dataTableManage">
+  <thead>
+    <tr>
+      <th>&nbsp;</th>
+      <th i18n:translate="">Term</th>
+      <th i18n:translate="">Code</th>
+      <th i18n:translate="">Title</th>
+      <th i18n:translate="">Credits</th>
+      <th i18n:translate="">CO</th>
+      <th i18n:translate="">OS</th>
+      <th i18n:translate="">CC</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr tal:repeat="value view/translated_values">
+       <td>
+        <input type="checkbox" name="val_id"
+        tal:attributes="value value/__name__"
+        tal:condition="value/removable_by_student" />
+      </td>
+      <td tal:content="value/semester" nowrap>TERM</td>
+      <td> <a tal:attributes="href value/url">
+      <span tal:content="value/code">CODE</span>
+      </a></td>
+      <td tal:content="value/title">TITLE</td>
+      <td tal:content="value/credits">CREDITS</td>
+      <td tal:content="value/carry_over">CO</td>
+      <td tal:content="value/outstanding">OS</td>
+      <td tal:content="value/course_category">CC</td>
+    </tr>
+  </tbody>
+  </table>
+
+  <div tal:condition="view/availableActions">
+    <span tal:repeat="action view/actions"
+          tal:omit-tag="">
+      <input tal:replace="structure action/render"/>
+    </span>
+  </div>
+  <br /><br /><br />
+  <div class="form-inline">
+    <div class="form-group">
+        <input class="btn btn-primary" type="submit" name="ADD"
+               i18n:translate=""
+               value="Add course ticket" />
+    </div>
+    <div class="form-group">
+        <input type="text" name="course" class="form-control"
+               tal:attributes="placeholder view/placeholder" />
+    </div>
+  </div>
+</form>
+
+
+
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 15327)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py	(revision 15330)
@@ -1081,4 +1081,33 @@
         return
 
+    def test_repair_course_list(self):
+        IWorkflowState(self.student).setState('school fee paid')
+        self.student['studycourse'].entry_session = 2016
+        self.student['studycourse'].current_session = 2016
+        self.browser.open(self.login_path)
+        self.browser.getControl(name="form.login").value = self.student_id
+        self.browser.getControl(name="form.password").value = 'spwd'
+        self.browser.getControl("Login").click()
+        self.browser.getLink("Study Course").click()
+        self.browser.getLink("Add course list").click()
+        self.browser.getControl("Create course list now").click()
+        self.assertTrue('Edit course list' in self.browser.contents)
+        self.assertFalse('Repair course list' in self.browser.contents)
+        self.student['studycourse'].current_level = 200
+        self.browser.open(self.studycourse_path + '/100')
+        self.assertFalse('Edit course list' in self.browser.contents)
+        self.assertFalse('Repair course list' in self.browser.contents)
+        configuration = createObject('waeup.SessionConfiguration')
+        configuration.academic_session = 2016
+        self.app['configuration'].addSessionConfiguration(configuration)
+        self.app['configuration']['2016'].studylevel_repair_enabled = True
+        self.browser.open(self.studycourse_path + '/100')
+        self.assertFalse('Edit course list' in self.browser.contents)
+        self.assertTrue('Repair course list' in self.browser.contents)
+        self.browser.getLink("Repair").click()
+        self.assertEqual(self.browser.url, self.studycourse_path + '/100/repair')
+        self.assertTrue('Repair course list of 100' in self.browser.contents)
+        return
+
     def test_student_clearance(self):
         # Student cant login if their password is not set
Index: main/waeup.aaue/trunk/src/waeup/aaue/students/viewlets.py
===================================================================
--- main/waeup.aaue/trunk/src/waeup/aaue/students/viewlets.py	(revision 15327)
+++ main/waeup.aaue/trunk/src/waeup/aaue/students/viewlets.py	(revision 15330)
@@ -20,5 +20,6 @@
 from zope.component import getUtility
 from waeup.kofa.interfaces import REGISTERED
-from waeup.kofa.students.interfaces import IStudent, IStudentsUtils
+from waeup.kofa.students.interfaces import (
+    IStudent, IStudentsUtils, IStudentStudyLevel)
 from waeup.kofa.students.workflow import PAID
 from waeup.kofa.students.viewlets import (
@@ -168,2 +169,22 @@
             return ''
         return self.view.url(self.view.context, 'coursetickets.pdf')
+
+class StudyLevelRepairActionButton(ManageActionButton):
+    grok.order(2)
+    grok.context(IStudentStudyLevel)
+    grok.view(StudyLevelDisplayFormPage)
+    grok.require('waeup.editStudyLevel')
+    text = _('Repair course list')
+    target = 'repair'
+    icon = 'actionicon_repair1.png'
+
+    @property
+    def target_url(self):
+        try:
+            studylevel_repair_enabled = grok.getSite()['configuration'][
+                str(self.context.level_session)].studylevel_repair_enabled
+        except KeyError:
+            return ''
+        if not studylevel_repair_enabled:
+            return ''
+        return self.view.url(self.view.context, self.target)
