Index: main/waeup.kofa/trunk/CHANGES.txt
===================================================================
--- main/waeup.kofa/trunk/CHANGES.txt	(revision 17781)
+++ main/waeup.kofa/trunk/CHANGES.txt	(revision 17782)
@@ -4,4 +4,6 @@
 1.8.2.dev0 (unreleased)
 =======================
+
+* Add `ConfigurationContainerExporter`.
 
 * Add `ApplicantRefereeReportProcessor`.
Index: main/waeup.kofa/trunk/src/waeup/kofa/configuration.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/configuration.py	(revision 17781)
+++ main/waeup.kofa/trunk/src/waeup/kofa/configuration.py	(revision 17782)
@@ -80,4 +80,30 @@
         return implementedBy(SessionConfiguration)
 
+class ConfigurationContainerExporter(grok.GlobalUtility, ExporterBase):
+    """The Configuration Container Exporter exports all configuration base data.
+    It also exports the last used student id.
+    """
+    grok.implements(ICSVExporter)
+    grok.name('base_configuration')
+
+    title = _(u'Base Configuration')
+    fields = tuple(sorted(iface_names(IConfigurationContainer))) + ('curr_stud_id',)
+
+    def mangle_value(self, value, name, context=None):
+        if name == 'curr_stud_id':
+            value = context.__parent__['students']._curr_stud_id
+        return super(
+            ConfigurationContainerExporter, self).mangle_value(
+            value, name, context=context)
+
+    def export_all(self, site, filepath=None):
+        """Export base configuration into filepath as CSV data.
+        If `filepath` is ``None``, a raw string with CSV data is returned.
+        """
+        writer, outfile = self.get_csv_writer(filepath)
+        configuration = site.get('configuration')
+        self.write_item(configuration, writer)
+        return self.close_outfile(filepath, outfile)
+
 class ConfigurationExporter(grok.GlobalUtility, ExporterBase):
     """The Configuration Exporter exports all configuration data. It iterates over all
Index: main/waeup.kofa/trunk/src/waeup/kofa/tests/test_configuration.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/tests/test_configuration.py	(revision 17781)
+++ main/waeup.kofa/trunk/src/waeup/kofa/tests/test_configuration.py	(revision 17782)
@@ -18,10 +18,18 @@
 """Tests for configuration containers and related.
 """
+import os
+import shutil
+import tempfile
+import unittest
+from zope.component import queryUtility
+from zope.component.hooks import setSite, clearSite
 from zope.component.interfaces import IFactory
 from zope.interface import verify
 from waeup.kofa.testing import FunctionalLayer, FunctionalTestCase
+from waeup.kofa.app import University
 from waeup.kofa.configuration import (
-    ConfigurationContainer, SessionConfiguration, SessionConfigurationFactory)
-from waeup.kofa.interfaces import(
+    ConfigurationContainer, SessionConfiguration, SessionConfigurationFactory,
+    ConfigurationContainerExporter, ConfigurationExporter)
+from waeup.kofa.interfaces import(ICSVExporter,
     IConfigurationContainer, ISessionConfiguration, ISessionConfigurationAdd)
 
@@ -70,2 +78,88 @@
         implemented_by = self.factory.getInterfaces()
         assert implemented_by.isOrExtends(ISessionConfiguration)
+
+
+class ConfigurationImportExportSetup(FunctionalTestCase):
+
+    layer = FunctionalLayer
+
+    def setUp(self):
+        super(ConfigurationImportExportSetup, self).setUp()
+        # Setup a sample site for each test
+        app = University()
+        self.dc_root = tempfile.mkdtemp()
+        app['datacenter'].setStoragePath(self.dc_root)
+        self.getRootFolder()['app'] = app
+        self.app = self.getRootFolder()['app']
+        setSite(app)
+        self.workdir = tempfile.mkdtemp()
+        self.outfile = os.path.join(self.workdir, 'myoutput.csv')
+        return
+
+    def tearDown(self):
+        super(ConfigurationImportExportSetup, self).tearDown()
+        shutil.rmtree(self.workdir)
+        shutil.rmtree(self.dc_root)
+        clearSite()
+        return
+
+class BaseConfigurationExportTests(ConfigurationImportExportSetup):
+
+    def test_ifaces(self):
+        # make sure we fullfill interface contracts
+        obj = ConfigurationContainerExporter()
+        verify.verifyObject(ICSVExporter, obj)
+        verify.verifyClass(ICSVExporter, ConfigurationContainerExporter)
+        return
+
+    def test_get_as_utility(self):
+        # we can get a faculty exporter as utility
+        result = queryUtility(ICSVExporter, name="base_configuration")
+        self.assertTrue(result is not None)
+        return
+
+    def test_export_all(self):
+        exporter = ConfigurationContainerExporter()
+        exporter.export_all(self.app, self.outfile)
+        result = open(self.outfile, 'rb').read()
+        self.assertTrue(
+            'acronym,captcha,carry_over,current_academic_session,email_admin,'
+            'email_subject,export_disabled_message,frontpage,frontpage_dict,'
+            'maintmode_enabled_by,name,name_admin,next_matric_integer,'
+            'next_matric_integer_2,next_matric_integer_3,'
+            'next_matric_integer_4,smtp_mailer,curr_stud_id\r\n'
+            'WAeUP.Kofa,No captcha,0,,contact@waeup.org,Kofa Contact,,'
+            '"<h1>Welcome to WAeUP.Kofa\n<br>' in result
+            )
+        return
+
+class SessionConfigurationExportTests(ConfigurationImportExportSetup):
+
+    def test_ifaces(self):
+        # make sure we fullfill interface contracts
+        obj = ConfigurationExporter()
+        verify.verifyObject(ICSVExporter, obj)
+        verify.verifyClass(ICSVExporter, ConfigurationExporter)
+        return
+
+    def test_get_as_utility(self):
+        # we can get a faculty exporter as utility
+        result = queryUtility(ICSVExporter, name="configurations")
+        self.assertTrue(result is not None)
+        return
+
+    def test_export_all(self):
+        self.sessionconfig = SessionConfiguration()
+        self.sessionconfig.academic_session = 2022
+        self.sessionconfig.clearance_fee = 3000.6
+        self.app['configuration'].addSessionConfiguration(self.sessionconfig)
+        exporter = ConfigurationExporter()
+        exporter.export_all(self.app, self.outfile)
+        result = open(self.outfile, 'rb').read()
+        self.assertEqual(result,
+            'academic_session,booking_fee,clearance_enabled,clearance_fee,'
+            'coursereg_deadline,late_registration_fee,maint_fee,'
+            'payment_disabled,transcript_fee,transfer_fee\r\n'
+            '2022,0.0,0,3000.6,,0.0,0.0,[],0.0,0.0\r\n'
+            )
+        return
