Index: /main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/applicants/interfaces.py	(revision 7681)
@@ -32,5 +32,5 @@
     ISIRPObject, year_range, validate_email, academic_sessions_vocab)
 from waeup.sirp.university.vocabularies import (
-    application_categories, course_levels)
+    course_levels, AppCatSource)
 from waeup.sirp.students.vocabularies import (
     lgas_vocab, CertificateSource, GenderSource)
@@ -188,5 +188,5 @@
         required = True,
         default = None,
-        source = application_categories,
+        source = AppCatSource(),
         )
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/browser/browser.txt
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/browser/browser.txt	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/browser/browser.txt	(revision 7681)
@@ -568,8 +568,8 @@
   >>> ctrl = browser.getControl(name='form.semester')
   >>> ctrl.options
-  ['9', '1', '2', '3']
+  ['1', '2', '3', '9']
 
   >>> ctrl.displayOptions
-  ['N/A', 'First Semester', 'Second Semester', 'Combined']
+  ['First Semester', 'Second Semester', 'Combined', 'N/A']
 
   >>> ctrl.value = ['1']
Index: /main/waeup.sirp/trunk/src/waeup/sirp/locales/waeup.sirp.pot
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/locales/waeup.sirp.pot	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/locales/waeup.sirp.pot	(revision 7681)
@@ -15,5 +15,5 @@
 msgstr ""
 "Project-Id-Version: Development/Unknown\n"
-"POT-Creation-Date: Wed Feb 22 12:23:01 2012\n"
+"POT-Creation-Date: Wed Feb 22 22:06:51 2012\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
@@ -130,5 +130,5 @@
 msgstr ""
 
-#: waeup/sirp/objecthistory.py:69
+#: waeup/sirp/objecthistory.py:73
 msgid "by"
 msgstr ""
@@ -290,2 +290,38 @@
 msgstr ""
 
+#: waeup/sirp/university/vocabularies.py:28
+msgid "Pre-Studies"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:29
+msgid "100 (Year 1)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:30
+msgid "200 (Year 2)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:31
+msgid "300 (Year 3)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:32
+msgid "400 (Year 4)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:33
+msgid "500 (Year 5)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:34
+msgid "600 (Year 6)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:35
+msgid "700 (Year 7)"
+msgstr ""
+
+#: waeup/sirp/university/vocabularies.py:36
+msgid "800 (Year 8)"
+msgstr ""
+
Index: /main/waeup.sirp/trunk/src/waeup/sirp/objecthistory.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/objecthistory.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/objecthistory.py	(revision 7681)
@@ -72,5 +72,5 @@
         if portal_language != 'en':
             by = translate(_('by'),'waeup.sirp',target_language=portal_language)
-        msg = '%s - %s %s %s' % (timestamp, msg, by, user)
+        msg = u'%s - %s %s %s' % (timestamp, msg, by, user)
         msgs.append(msg)
         self._annotations[self.history_key] = msgs
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py	(revision 7681)
@@ -44,5 +44,4 @@
     FriendlyDateWidget, FriendlyDateDisplayWidget,
     FriendlyDatetimeDisplayWidget)
-from waeup.sirp.university.vocabularies import study_modes
 from waeup.sirp.students.interfaces import (
     IStudentsContainer, IStudent, IStudentClearance,
@@ -533,7 +532,6 @@
     def current_mode(self):
         if self.context.certificate is not None:
-            current_mode = study_modes.getTermByToken(
-                self.context.certificate.study_mode).title
-            return current_mode
+            studymodes_dict = getUtility(ISIRPUtils).getStudyModesDict()
+            return studymodes_dict[self.context.certificate.study_mode]
         return
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py	(revision 7681)
@@ -22,7 +22,7 @@
 from zc.sourcefactory.contextual import BasicContextualSourceFactory
 from waeup.sirp.interfaces import (
-    ISIRPObject, academic_sessions_vocab, validate_email)
+    ISIRPObject, academic_sessions_vocab, validate_email, ISIRPUtils)
 from waeup.sirp.schema import TextLineChoice
-from waeup.sirp.university.vocabularies import CourseSource, study_modes
+from waeup.sirp.university.vocabularies import CourseSource, StudyModeSource
 from waeup.sirp.students.vocabularies import (
   CertificateSource, StudyLevelSource,
@@ -47,4 +47,5 @@
     def getTitle(self, context, value):
         return self.verdicts_dict[value]
+
 
 class IStudentsUtils(Interface):
@@ -278,5 +279,5 @@
     entry_mode = schema.Choice(
         title = u'Entry Mode',
-        vocabulary = study_modes,
+        source = StudyModeSource(),
         default = u'ug_ft',
         required = True,
Index: /main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/students/workflow.py	(revision 7681)
@@ -182,5 +182,5 @@
     """Append message to student history and log file when transition happened.
 
-      Lock and unlock clearance form.
+    Lock and unlock clearance form.
     """
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/__init__.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/__init__.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/__init__.py	(revision 7681)
@@ -2,6 +2,11 @@
 from waeup.sirp.university.course import Course
 from waeup.sirp.university.coursescontainer import CoursesContainer
+from waeup.sirp.university.certificate import Certificate
+from waeup.sirp.university.certificatescontainer import CertificatesContainer
 from waeup.sirp.university.faculty import Faculty
+from waeup.sirp.university.department import Department
 from waeup.sirp.university.facultiescontainer import FacultiesContainer
 __all__ = (
-    'Course', 'CoursesContainer', 'Faculty', 'FacultiesContainer')
+    'Course', 'CoursesContainer',
+    'Certificate', 'CertificatesContainer',
+    'Faculty', 'FacultiesContainer', 'Department')
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/department.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/department.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/department.py	(revision 7681)
@@ -19,9 +19,11 @@
 """
 import grok
-from zope.component import createObject
 from zope.component.interfaces import IFactory
 from zope.interface import implementedBy
+from zope.component import getUtility
+from waeup.sirp.university.coursescontainer import CoursesContainer
+from waeup.sirp.university.certificatescontainer import CertificatesContainer
+from waeup.sirp.interfaces import ISIRPUtils
 from waeup.sirp.university.interfaces import IDepartment, IDepartmentAdd
-from waeup.sirp.university.vocabularies import inst_types
 
 class Department(grok.Container):
@@ -53,8 +55,8 @@
         self.title_prefix = title_prefix
         self.code = code
-        self.courses = createObject(u'waeup.CoursesContainer')
+        self.courses = CoursesContainer()
         self.courses.__parent__ = self
         self.courses.__name__ = 'courses'
-        self.certificates = createObject(u'waeup.CertificatesContainer')
+        self.certificates = CertificatesContainer()
         self.certificates.__parent__ = self
         self.certificates.__name__ = 'certificates'
@@ -71,6 +73,7 @@
 
     def longtitle(self):
+        insttypes_dict = getUtility(ISIRPUtils).getInstTypeDict()
         return "%s %s (%s)" % (
-            inst_types.getTerm(self.title_prefix).title,
+            insttypes_dict[self.title_prefix],
             self.title, self.code)
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/faculty.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/faculty.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/faculty.py	(revision 7681)
@@ -22,7 +22,8 @@
 from zope.component.interfaces import IFactory
 from zope.interface import implementedBy
+from zope.component import getUtility
+from waeup.sirp.interfaces import ISIRPUtils
 from waeup.sirp.university.interfaces import (
     IFaculty, IFacultyAdd, IDepartment)
-from waeup.sirp.university.vocabularies import inst_types
 
 class Faculty(grok.Container):
@@ -60,11 +61,8 @@
 
     def longtitle(self):
-        try:
-            result = "%s %s (%s)" % (
-                inst_types.getTerm(
-                    self.title_prefix).title,
-                self.title, self.code)
-        except:
-            result = "%s (%s)" % (self.title, self.code)
+        insttypes_dict = getUtility(ISIRPUtils).getInstTypeDict()
+        result = "%s %s (%s)" % (
+            insttypes_dict[self.title_prefix],
+            self.title, self.code)
         return result
 
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/interfaces.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/interfaces.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/interfaces.py	(revision 7681)
@@ -26,9 +26,9 @@
 from waeup.sirp.university.vocabularies import (
     course_levels,
-    semester,
-    application_categories,
-    study_modes,
-    inst_types,
     CourseSource,
+    StudyModeSource,
+    AppCatSource,
+    InstTypeSource,
+    SemesterSource,
     )
 
@@ -53,5 +53,5 @@
         title = u'Name prefix',
         default = u'faculty',
-        vocabulary = inst_types,
+        source = InstTypeSource(),
         required = True,
         )
@@ -100,5 +100,5 @@
     title_prefix = schema.Choice(
         title = u'Name prefix',
-        vocabulary = inst_types,
+        source = InstTypeSource(),
         default = u'department',
         required = True,
@@ -166,5 +166,5 @@
         title = u'Semester/Term',
         default = 9,
-        vocabulary = semester,
+        source = SemesterSource(),
         required = True,
         )
@@ -206,5 +206,5 @@
     study_mode = schema.Choice(
         title = u'Study Mode',
-        vocabulary = study_modes,
+        source = StudyModeSource(),
         default = u'ug_ft',
         required = True,
@@ -227,5 +227,5 @@
     application_category = schema.Choice(
         title = u'Application Category',
-        vocabulary = application_categories,
+        source = AppCatSource(),
         default = u'basic',
         required = True,
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/tests/test_faculty.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/tests/test_faculty.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/tests/test_faculty.py	(revision 7681)
@@ -22,8 +22,8 @@
 import unittest
 from zope.interface.verify import verifyObject, verifyClass
-from waeup.sirp.university import Faculty
-from waeup.sirp.university.interfaces import IFaculty
+from waeup.sirp.university import Faculty, Department
+from waeup.sirp.university.interfaces import IFaculty, IDepartment
 
-class FacultyTests(unittest.TestCase):
+class FacultyAndDepartmentTests(unittest.TestCase):
 
     def test_ifaces(self):
@@ -32,17 +32,6 @@
         verifyClass(IFaculty, Faculty)
         verifyObject(IFaculty, fac)
+        dep = Department()
+        verifyClass(IDepartment, Department)
+        verifyObject(IDepartment, dep)
         return
-
-    def test_longtitle(self):
-        # Make sure we get a longtitle
-        fac = Faculty()
-        self.assertEqual(fac.longtitle(),
-                         u'Faculty of Unnamed Faculty (NA)')
-
-    def test_longtitle_no_terms(self):
-        # Make sure we get a longtitle also if no term for the title
-        # prefix is available
-        fac = Faculty()
-        fac.title_prefix = 'Studio for' # Not a valid prefix
-        self.assertEqual(fac.longtitle(),
-                         u'Unnamed Faculty (NA)')
Index: /main/waeup.sirp/trunk/src/waeup/sirp/university/vocabularies.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/university/vocabularies.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/university/vocabularies.py	(revision 7681)
@@ -19,65 +19,76 @@
 """
 from zc.sourcefactory.basic import BasicSourceFactory
+from zc.sourcefactory.contextual import BasicContextualSourceFactory
 from zope.catalog.interfaces import ICatalog
 from zope.component import getUtility
-from waeup.sirp.interfaces import SimpleSIRPVocabulary
+from waeup.sirp.interfaces import SimpleSIRPVocabulary, ISIRPUtils
+from waeup.sirp.interfaces import MessageFactory as _
 
-inst_types = SimpleSIRPVocabulary(
-    ('Faculty of','faculty'),
-    ('Department of','department'),
-    ('School of','school'),
-    ('School for','school_for'),
-    ('Institute of','institute'),
-    ('Office for','office'),
-    ('Centre for','centre'),
-    ('College','college'),
+course_levels = SimpleSIRPVocabulary(
+    (_('Pre-Studies'),10),
+    (_('100 (Year 1)'),100),
+    (_('200 (Year 2)'),200),
+    (_('300 (Year 3)'),300),
+    (_('400 (Year 4)'),400),
+    (_('500 (Year 5)'),500),
+    (_('600 (Year 6)'),600),
+    (_('700 (Year 7)'),700),
+    (_('800 (Year 8)'),800),
     )
 
-course_levels = SimpleSIRPVocabulary(
-    ('Pre-Studies', 10),
-    ('100 (Year 1)',100),
-    ('200 (Year 2)',200),
-    ('300 (Year 3)',300),
-    ('400 (Year 4)',400),
-    ('500 (Year 5)',500),
-    ('600 (Year 6)',600),
-    ('700 (Year 7)',700),
-    ('800 (Year 8)',800),
-    )
+class SemesterSource(BasicContextualSourceFactory):
+    """An institution type source delivers semester or term descriptors.
+    """
+    def getValues(self, context):
+        self.semesters_dict = getUtility(ISIRPUtils).getSemesterDict()
+        return self.semesters_dict.keys()
 
-semester = SimpleSIRPVocabulary(
-    ('N/A', 9),
-    ('First Semester', 1),
-    ('Second Semester', 2),
-    ('Combined', 3)
-    )
+    def getToken(self, context, value):
+        return str(value)
 
-application_categories = SimpleSIRPVocabulary(
-    ('PUME, PDE, PCE, PRENCE','basic'),
-    ('Part-Time, Diploma, Certificate','cest'),
-    ('Sandwich','sandwich'),
-    ('Postgraduate','pg'),
-    ('no application','no'),
-    )
+    def getTitle(self, context, value):
+        return self.semesters_dict[value]
 
-study_modes = SimpleSIRPVocabulary(
-    ('UME Full Time','ume_ft'),
-    ('Direct Entry Full Time','de_ft'),
-    ('Direct Entry Part Time','de_pt'),
-    ('Diploma Full Time','dp_ft'),
-    ('Diploma Part Time','dp_pt'),
-    ('Undergraduate Full Time','ug_ft'),
-    ('Undergraduate Part Time','ug_pt'),
-    ('Postgraduate Full Time','pg_ft'),
-    ('Postgraduate Part Time','pg_pt'),
-    ('Certificate Full Time','ct_ft'),
-    ('Certificate Part Time','ct_pt'),
-    ('Remedial','rm_ft'),
-    ('Remedial with deficiencies','rmd_ft'),
-    ('Post Higher Education Full Time','ph_ft'),
-    ('Joint Matriculation Full Time','jm_ft'),
-    ('Transfer Full Time','transfer_ft'),
-    ('Transfer Part Time','transfer_pt'),
-    )
+class InstTypeSource(BasicContextualSourceFactory):
+    """An institution type source delivers types of institutions
+    in the portal.
+    """
+    def getValues(self, context):
+        self.insttypes_dict = getUtility(ISIRPUtils).getInstTypeDict()
+        return sorted(self.insttypes_dict.keys())
+
+    def getToken(self, context, value):
+        return value
+
+    def getTitle(self, context, value):
+        return self.insttypes_dict[value]
+
+class AppCatSource(BasicContextualSourceFactory):
+    """A application category source delivers all application categories
+    provided in the portal.
+    """
+    def getValues(self, context):
+        self.appcats_dict = getUtility(ISIRPUtils).getAppCatDict()
+        return sorted(self.appcats_dict.keys())
+
+    def getToken(self, context, value):
+        return value
+
+    def getTitle(self, context, value):
+        return self.appcats_dict[value]
+
+class StudyModeSource(BasicContextualSourceFactory):
+    """A study modes source delivers all study modes provided
+    in the portal.
+    """
+    def getValues(self, context):
+        self.studymodes_dict = getUtility(ISIRPUtils).getStudyModesDict()
+        return sorted(self.studymodes_dict.keys())
+
+    def getToken(self, context, value):
+        return value
+
+    def getTitle(self, context, value):
+        return self.studymodes_dict[value]
 
 class CourseSource(BasicSourceFactory):
Index: /main/waeup.sirp/trunk/src/waeup/sirp/utils/utils.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/utils/utils.py	(revision 7680)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/utils/utils.py	(revision 7681)
@@ -43,4 +43,61 @@
     # (e.g. object histories).
     PORTAL_LANGUAGE = 'en'
+
+    def getInstTypeDict(self):
+        """Provide a dictionary of study modes.
+        """
+        return {
+        'faculty': 'Faculty of',
+        'department': 'Department of',
+        'school': 'School of',
+        'office': 'Office for',
+        'centre': 'Centre for',
+        'institute': 'Institute of',
+        'school_for': 'School for',
+        }
+
+    def getStudyModesDict(self):
+        """Provide a dictionary of study modes.
+        """
+        return {
+        'rmd_ft': 'Remedial with deficiencies',
+        'dp_pt': 'Diploma Part Time',
+        'ct_ft': 'Certificate Full Time',
+        'dp_ft': 'Diploma Full Time',
+        'de_pt': 'Direct Entry Part Time',
+        'pg_ft': 'Postgraduate Full Time',
+        'pg_pt': 'Postgraduate Part Time',
+        'jm_ft': 'Joint Matriculation Full Time',
+        'ume_ft': 'UME Full Time',
+        'de_ft': 'Direct Entry Full Time',
+        'ph_ft': 'Post Higher Education Full Time',
+        'transfer_pt': 'Transfer Part Time',
+        'ug_pt': 'Undergraduate Part Time',
+        'transfer_ft': 'Transfer Full Time',
+        'ct_pt': 'Certificate Part Time',
+        'ug_ft': 'Undergraduate Full Time',
+        'rm_ft': 'Remedial'
+        }
+
+    def getAppCatDict(self):
+        """Provide a dictionary of study modes.
+        """
+        return {
+        'basic': 'PUME, PDE, PCE, PRENCE',
+        'no': 'no application',
+        'pg': 'Postgraduate',
+        'sandwich': 'Sandwich',
+        'cest': 'Part-Time, Diploma, Certificate'
+        }
+
+    def getSemesterDict(self):
+        """Provide a dictionary of semester or trimester types.
+        """
+        return {
+        1: 'First Semester',
+        2: 'Second Semester',
+        3: 'Combined',
+        9: 'N/A'
+        }
 
     def sendContactForm(self,from_name,from_addr,rcpt_name,rcpt_addr,
