Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/container.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/container.py	(revision 13076)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/container.py	(revision 13077)
@@ -24,5 +24,5 @@
 from datetime import datetime
 import zope.location.location
-from zope.component import getUtility
+from zope.component import getUtility, ComponentLookupError
 from zope.component.factory import Factory
 from zope.component.interfaces import IFactory
@@ -53,40 +53,7 @@
     grok.implements(IApplicantsContainer,IApplicantsContainerAdd)
 
-    #: A dictionary to hold per language translations of description string.
     description_dict = {}
 
     local_roles = []
-
-    def archive(self, app_ids=None):
-        """Create on-dist archive of applicants stored in this term.
-
-        If app_ids is `None`, all applicants are archived.
-
-        If app_ids contains a single id string, only the respective
-        applicants are archived.
-
-        If app_ids contains a list of id strings all of the respective
-        applicants types are saved to disk.
-        """
-        raise NotImplementedError()
-
-    def clear(self, app_ids=None, archive=True):
-        """Remove applicants of type given by 'id'.
-
-        Optionally archive the applicants.
-
-        If id is `None`, all applicants are archived.
-
-        If id contains a single id string, only the respective
-        applicants are archived.
-
-        If id contains a list of id strings all of the respective
-        applicant types are saved to disk.
-
-        If `archive` is ``False`` none of the archive-handling is done
-        and respective applicants are simply removed from the
-        database.
-        """
-        raise NotImplementedError()
 
     def addApplicant(self, applicant):
@@ -104,5 +71,10 @@
     @property
     def statistics(self):
-        return getUtility(IApplicantsUtils).getApplicantsStatistics(self)
+        try:
+          statistics = getUtility(
+              IApplicantsUtils).getApplicantsStatistics(self)
+        except ComponentLookupError:  # happens in unit tests
+            return
+        return statistics
 
     @property
@@ -125,5 +97,5 @@
 
     def traverse(self, name):
-        """Deliver appropriate containers.
+        """Deliver virtual export container.
         """
         if name == 'exports':
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 13076)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 13077)
@@ -149,5 +149,4 @@
     """A collection of methods which are subject to customization.
     """
-
     APP_TYPES_DICT = Attribute('dict of application types')
 
@@ -169,6 +168,10 @@
 
 class IApplicantsRoot(IKofaObject, IContainer):
-    """A container for university applicants containers.
-    """
+    """A container for applicants containers.
+    """
+    description_dict = Attribute('Language translation dictionary with values in HTML format')
+    local_roles = Attribute('List of local role names')
+    logger_name = Attribute('Name of the logger')
+    logger_filename = Attribute('Name of the logger file')
 
     description = schema.Text(
@@ -182,11 +185,13 @@
         )
 
-    description_dict = Attribute(
-        """Content as language dictionary with values in HTML format.""")
-
 class IApplicantsContainer(IKofaObject):
-    """An applicants container contains university applicants.
-
-    """
+    """An applicants container contains applicants.
+    """
+    statistics = Attribute('Applicant counts')
+    expired = Attribute('True if application has started but not ended')
+
+    description_dict = Attribute('Language translation dictionary with values in HTML format')
+    local_roles = Attribute('List of local role names')
+
 
     code = schema.TextLine(
@@ -246,7 +251,4 @@
         )
 
-    description_dict = Attribute(
-        """Content as language dictionary with values in HTML format.""")
-
     startdate = schema.Datetime(
         title = _(u'Application Start Date'),
@@ -285,36 +287,14 @@
         )
 
-    def archive(id=None):
-        """Create on-dist archive of applicants stored in this term.
-
-        If id is `None`, all applicants are archived.
-
-        If id contains a single id string, only the respective
-        applicants are archived.
-
-        If id contains a list of id strings all of the respective
-        applicants types are saved to disk.
-        """
-
-    def clear(id=None, archive=True):
-        """Remove applicants of type given by 'id'.
-
-        Optionally archive the applicants.
-
-        If id is `None`, all applicants are archived.
-
-        If id contains a single id string, only the respective
-        applicants are archived.
-
-        If id contains a list of id strings all of the respective
-        applicant types are saved to disk.
-
-        If `archive` is ``False`` none of the archive-handling is done
-        and respective applicants are simply removed from the
-        database.
+    def addApplicant(applicant):
+        """Add an applicant.
         """
 
     def writeLogMessage(view, comment):
-        """Adds an INFO message to the log file
+        """Add an INFO message to the log file.
+        """
+
+    def traverse(name):
+        """Deliver appropriate containers.
         """
 
@@ -342,12 +322,9 @@
 
 class IApplicantBaseData(IApplicantBase):
-    """The data for an applicant.
-
-    This is a base interface with no field
+    """This is a base interface of an applicant with no field
     required. For use with processors, forms, etc., please use one of
     the derived interfaces below, which set more fields to required
     state, depending on use-case.
     """
-
     history = Attribute('Object history, a list of messages')
     state = Attribute('The application state of an applicant')
@@ -368,4 +345,5 @@
         readonly = False,
         )
+
     reg_number = TextLineChoice(
         title = _(u'Registration Number'),
@@ -374,27 +352,26 @@
         source = contextual_reg_num_source,
         )
-    #access_code = schema.TextLine(
-    #    title = u'Activation Code',
-    #    required = False,
-    #    readonly = True,
-    #    )
+
     firstname = schema.TextLine(
         title = _(u'First Name'),
         required = True,
         )
+
     middlename = schema.TextLine(
         title = _(u'Middle Name'),
         required = False,
         )
+
     lastname = schema.TextLine(
         title = _(u'Last Name (Surname)'),
         required = True,
         )
+
     date_of_birth = FormattedDate(
         title = _(u'Date of Birth'),
         required = False,
-        #date_format = u'%d/%m/%Y', # Use grok-instance-wide default
         show_year = True,
         )
+
     sex = schema.Choice(
         title = _(u'Sex'),
@@ -402,4 +379,5 @@
         required = True,
         )
+
     email = schema.ASCIILine(
         title = _(u'Email Address'),
@@ -407,4 +385,5 @@
         constraint=validate_email,
         )
+
     phone = PhoneNumber(
         title = _(u'Phone'),
@@ -412,4 +391,5 @@
         required = False,
         )
+
     course1 = schema.Choice(
         title = _(u'1st Choice Course of Study'),
@@ -417,4 +397,5 @@
         required = True,
         )
+
     course2 = schema.Choice(
         title = _(u'2nd Choice Course of Study'),
@@ -422,4 +403,5 @@
         required = False,
         )
+
     #school_grades = schema.List(
     #    title = _(u'School Grades'),
@@ -456,7 +438,5 @@
 
 class IApplicant(IApplicantBaseData):
-    """An applicant.
-
-    This is basically the applicant base data. Here we repeat the
+    """This is basically the applicant base data. Here we repeat the
     fields from base data if we have to set the `required` attribute
     to True (which is the default).
@@ -473,7 +453,5 @@
 
 class ISpecialApplicant(IApplicantBase):
-    """A special applicant.
-
-    This reduced interface is for former students or students who are not
+    """This reduced interface is for former students or students who are not
     student users of the portal but have to pay supplementary fees.
 
@@ -482,5 +460,4 @@
     only 'customize' fields.
     """
-
     history = Attribute('Object history, a list of messages')
     state = Attribute('The application state of an applicant')
@@ -557,5 +534,5 @@
 
 class IApplicantEdit(IApplicant):
-    """An applicant interface for editing.
+    """This is an applicant interface for editing.
 
     Here we can repeat the fields from base data and set the
@@ -573,4 +550,5 @@
         constraint=validate_email,
         )
+
     course1 = schema.Choice(
         title = _(u'1st Choice Course of Study'),
@@ -578,4 +556,5 @@
         required = True,
         )
+
     course2 = schema.Choice(
         title = _(u'2nd Choice Course of Study'),
@@ -583,4 +562,5 @@
         required = False,
         )
+
     course_admitted = schema.Choice(
         title = _(u'Admitted Course of Study'),
@@ -589,4 +569,5 @@
         readonly = True,
         )
+
     notice = schema.Text(
         title = _(u'Notice'),
@@ -599,7 +580,5 @@
 
 class IApplicantUpdateByRegNo(IApplicant):
-    """Representation of an applicant.
-
-    Skip regular reg_number validation if reg_number is used for finding
+    """Skip regular reg_number validation if reg_number is used for finding
     the applicant object.
     """
@@ -610,6 +589,5 @@
 
 class IApplicantRegisterUpdate(IApplicant):
-    """Representation of an applicant for first-time registration.
-
+    """This is a representation of an applicant for first-time registration.
     This interface is used when applicants use the registration page to
     update their records.
@@ -643,14 +621,11 @@
     def doAfterApplicantPayment():
         """Process applicant after payment was made.
-
         """
 
     def doAfterApplicantPaymentApproval():
         """Process applicant after payment was approved.
-
         """
 
     def approveApplicantPayment():
         """Approve payment and process applicant.
-
-        """
+        """
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/root.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/root.py	(revision 13076)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/root.py	(revision 13077)
@@ -36,8 +36,5 @@
 
     local_roles = []
-
-    #: A dictionary to hold per language translations of description string.
     description_dict = {}
-
     logger_name = 'waeup.kofa.${sitename}.applicants'
     logger_filename = 'applicants.log'
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_container.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_container.py	(revision 13076)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_container.py	(revision 13077)
@@ -40,12 +40,4 @@
         return
 
-    def test_base(self):
-        # We cannot call the fundamental methods of a base in that case
-        container = ApplicantsContainer()
-        self.assertRaises(
-            NotImplementedError, container.archive)
-        self.assertRaises(
-            NotImplementedError, container.clear)
-
 def suite():
     suite = unittest.TestSuite()
Index: /main/waeup.kofa/trunk/src/waeup/kofa/utils/helpers.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/utils/helpers.py	(revision 13076)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/utils/helpers.py	(revision 13077)
@@ -811,9 +811,8 @@
     """Transforms a localized HTML text string into a dictionary.
 
-    Different languages must be separated by `>>xy<<` whereas
+    Different languages must be separated by ``>>xy<<`` whereas
     xy is the language code. Text parts without correct leading
     language separator - usually the first part has no language
     descriptor - are interpreted as texts in the portal's language.
-    The latter can be configured in waeup.srp.utils.utils.IkobaUtils.
     """
     try:
@@ -838,9 +837,8 @@
     """Transforms a localized REST text string into a dictionary.
 
-    Different languages must be separated by `>>xy<<` whereas
+    Different languages must be separated by ``>>xy<<``` whereas
     xy is the language code. Text parts without correct leading
     language separator - usually the first part has no language
     descriptor - are interpreted as texts in the portal's language.
-    The latter can be configured in waeup.srp.utils.utils.IkobaUtils.
     """
     try:
