Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8387)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8388)
@@ -61,8 +61,10 @@
 grok.context(IKofaObject) # Make IKofaObject the default context
 
-class ApplicantsRootPage(KofaPage):
+class ApplicantsRootPage(KofaDisplayFormPage):
     grok.context(IApplicantsRoot)
     grok.name('index')
     grok.require('waeup.Public')
+    form_fields = grok.AutoFields(IApplicantsRoot)
+    form_fields['description'].custom_widget = HTMLDisplayWidget
     label = _('Application Section')
     pnav = 3
@@ -70,6 +72,15 @@
     def update(self):
         super(ApplicantsRootPage, self).update()
-        #datatable.need()
-        return
+        return
+
+    @property
+    def introduction(self):
+        # Here we know that the cookie has been set
+        lang = self.request.cookies.get('kofa.language')
+        html = self.context.description_dict.get(lang,'')
+        if html == '':
+            portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
+            html = self.context.description_dict.get(portal_language,'')
+        return html
 
 class ApplicantsRootManageFormPage(KofaEditFormPage):
@@ -77,11 +88,12 @@
     grok.name('manage')
     grok.template('applicantsrootmanagepage')
+    form_fields = grok.AutoFields(IApplicantsRoot)
     label = _('Manage application section')
     pnav = 3
     grok.require('waeup.manageApplication')
-    taboneactions = [_('Add applicants container'), _('Remove selected'),
-        _('Cancel')]
-    tabtwoactions1 = [_('Remove selected local roles')]
-    tabtwoactions2 = [_('Add local role')]
+    taboneactions = [_('Save')]
+    tabtwoactions = [_('Add applicants container'), _('Remove selected')]
+    tabthreeactions1 = [_('Remove selected local roles')]
+    tabthreeactions2 = [_('Add local role')]
     subunits = _('Applicants Containers')
 
@@ -90,4 +102,9 @@
         datatable.need()
         warning.need()
+        self.tab1 = self.tab2 = self.tab3 = ''
+        qs = self.request.get('QUERY_STRING', '')
+        if not qs:
+            qs = 'tab1'
+        setattr(self, qs, 'active')
         return super(ApplicantsRootManageFormPage, self).update()
 
@@ -109,5 +126,10 @@
     def delApplicantsContainers(self, **data):
         form = self.request.form
-        child_id = form['val_id']
+        if form.has_key('val_id'):
+            child_id = form['val_id']
+        else:
+            self.flash(_('No container selected!'))
+            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            return
         if not isinstance(child_id, list):
             child_id = [child_id]
@@ -123,5 +145,5 @@
             self.flash(_('Successfully removed: ${a}',
                 mapping = {'a':', '.join(deleted)}))
-        self.redirect(self.url(self.context, '@@manage'))
+        self.redirect(self.url(self.context, '@@manage')+'?tab2')
         return
 
@@ -131,9 +153,4 @@
         return
 
-    @action(_('Cancel'), validator=NullValidator)
-    def cancel(self, **data):
-        self.redirect(self.url(self.context))
-        return
-
     @action(_('Add local role'), validator=NullValidator)
     def addLocalRole(self, **data):
@@ -143,4 +160,17 @@
     def delLocalRoles(self, **data):
         return del_local_roles(self,3,**data)
+
+    def _description(self):
+        view = ApplicantsRootPage(
+            self.context,self.request)
+        view.setUpWidgets()
+        return view.widgets['description']()
+
+    @action(_('Save'), style='primary')
+    def save(self, **data):
+        self.applyData(self.context, **data)
+        self.context.description_dict = self._description()
+        self.flash(_('Form has been saved.')+'?tab1')
+        return
 
 class ApplicantsContainerAddFormPage(KofaAddFormPage):
@@ -236,11 +266,8 @@
         lang = self.request.cookies.get('kofa.language')
         html = self.context.description_dict.get(lang,'')
-        if html =='':
+        if html == '':
             portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
             html = self.context.description_dict.get(portal_language,'')
-        if html =='':
-            return ''
-        else:
-            return html
+        return html
 
     @property
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootmanagepage.pt	(revision 8387)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootmanagepage.pt	(revision 8388)
@@ -2,11 +2,16 @@
   i18n:domain="waeup.kofa" method="POST"  enctype="multipart/form-data">
   <ul class="tabs" data-tabs="tabs">
-    <li class="active">
+    <li tal:attributes="class view/tab1">
     <a href="#tab-1">
+      <span i18n:translate="">Introduction
+      </span></a>
+    </li>
+    <li tal:attributes="class view/tab2">
+    <a href="#tab-2">
       <span tal:content="view/subunits">Contents
       </span></a>
     </li>
-    <li>
-    <a href="#tab-2">
+    <li tal:attributes="class view/tab3">
+    <a href="#tab-3">
       <span i18n:translate="">Local Roles
       </span></a>
@@ -14,5 +19,19 @@
   </ul>
   <div class="tab-content">
-    <div id="tab-1" class="active">
+    <div id="tab-1" tal:attributes="class view/tab1">
+      <table class="form-table">
+        <tbody>
+          <tal:widgets content="structure provider:widgets" />
+        </tbody>
+      </table>
+
+      <div tal:condition="view/availableActions">
+        <span tal:repeat="action view/actions" tal:omit-tag="">
+          <input tal:condition="python:action.label in view.taboneactions"
+            tal:replace="structure action/render"/>
+        </span>
+      </div>
+    </div>
+    <div id="tab-2" tal:attributes="class view/tab2">
       <h3 tal:content="view/subunits">SUBUNITS</h3>
       <table class="display dataTableManage">
@@ -43,10 +62,11 @@
       <div tal:condition="view/availableActions">
         <span tal:repeat="action view/actions" tal:omit-tag="">
-          <input tal:condition="python:action.label in view.taboneactions"
+          <input tal:condition="python:action.label in view.tabtwoactions"
             tal:replace="structure action/render"/>
         </span>
       </div>
     </div>
-    <div id="tab-2"> <br />
+    <div id="tab-3" tal:attributes="class view/tab3">
+      <br />
       <table class="display dataTableManage">
         <thead>
@@ -74,5 +94,5 @@
       <div tal:condition="view/availableActions">
         <span tal:repeat="action view/actions" tal:omit-tag="">
-          <input tal:condition="python:action.label in view.tabtwoactions1"
+          <input tal:condition="python:action.label in view.tabthreeactions1"
             tal:replace="structure action/render"/>
         </span>
@@ -96,5 +116,5 @@
             <div tal:condition="view/availableActions">
               <span tal:repeat="action view/actions" tal:omit-tag="">
-                <input tal:condition="python:action.label in view.tabtwoactions2"
+                <input tal:condition="python:action.label in view.tabthreeactions2"
                   tal:replace="structure action/render"/>
               </span>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt	(revision 8387)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantsrootpage.pt	(revision 8388)
@@ -1,2 +1,7 @@
+<span tal:condition="view/introduction" tal:omit-tag="">
+  <span tal:content="structure view/introduction">INTRODUCTION</span>
+  <br />
+</span>
+
 <table i18n:domain="waeup.kofa">
   <thead>
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 8387)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/interfaces.py	(revision 8388)
@@ -149,5 +149,17 @@
     """A container for university applicants containers.
     """
-    pass
+
+    description = schema.Text(
+        title = _(u'Human readable description in HTML format'),
+        required = False,
+        default = u'''This text can been seen by anonymous users.
+Here we put multi-lingual general information about the application procedure.
+>>de<<
+Dieser Text kann von anonymen Benutzern gelesen werden.
+Hier koennen mehrsprachige Informationen fuer Antragsteller hinterlegt werden.'''
+        )
+
+    description_dict = Attribute(
+        """Content as language dictionary with values in HTML format.""")
 
 class IApplicantsContainer(IKofaObject):
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/root.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/root.py	(revision 8387)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/root.py	(revision 8388)
@@ -23,7 +23,9 @@
 from hurry.query.interfaces import IQuery
 from zope.component import getUtility
+from zope.schema import getFields
 from waeup.kofa.interfaces import IKofaPluggable
 from waeup.kofa.applicants.interfaces import IApplicantsRoot
 from waeup.kofa.utils.logger import Logger
+from waeup.kofa.utils.helpers import attrs_to_fields
 
 class ApplicantsRoot(grok.Container, Logger):
@@ -34,4 +36,7 @@
 
     local_roles = []
+
+    #: A dictionary to hold per language translations of description string.
+    description_dict = {}
 
     logger_name = 'waeup.kofa.${sitename}.applicants'
@@ -44,4 +49,6 @@
                 target, ob_class, comment))
         return
+
+ApplicantsRoot = attrs_to_fields(ApplicantsRoot)
 
 class ApplicantsPlugin(grok.GlobalUtility):
@@ -78,9 +85,23 @@
         site_name = getattr(site, '__name__', '<Unnamed Site>')
         if IApplicantsRoot.providedBy(app_folder):
-            # Applicants up to date. Return.
-            logger.info(
-                '%s: Updating site at %s: Nothing to do.' % (
-                    self.log_prefix, site_name,)
-                )
+            items = getFields(IApplicantsRoot).items()
+            nothing_to_do = True
+            for i in items:
+                if not hasattr(app_folder,i[0]):
+                    nothing_to_do = False
+                    setattr(app_folder,i[0],i[1].missing_value)
+                    logger.info(
+                        '%s: %s added to root.' % (self.log_prefix,i[0]))
+            # can be removed after upgrading uniben
+            if not hasattr(app_folder, 'description_dict'):
+                nothing_to_do = False
+                setattr(app_folder,'description_dict',{})
+                logger.info(
+                    '%s: description_dict added to root.' % self.log_prefix)
+            if nothing_to_do:
+                logger.info(
+                    '%s: Updating site at %s: Nothing to do.' % (
+                        self.log_prefix, site_name,)
+                    )
             return
         elif app_folder is not None:
Index: main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 8387)
+++ main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py	(revision 8388)
@@ -237,7 +237,4 @@
         # Managers can add and delete applicants containers
         self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
-        self.browser.open(self.manage_root_path)
-        self.browser.getControl("Cancel").click()
-        self.assertEqual(self.browser.url, self.root_path)
         self.browser.open(self.manage_root_path)
         self.browser.getControl("Add applicants container").click()
