Index: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9130)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py	(revision 9131)
@@ -220,4 +220,10 @@
         )
 
+    def transfer(certificate, current_session,
+        current_level, current_verdict):
+        """ Creates a new studycourse and backups the old one.
+
+        """
+
 class IUGStudentClearance(IKofaObject):
     """Representation of undergraduate student clearance data.
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/student.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/student.py	(revision 9130)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/student.py	(revision 9131)
@@ -143,4 +143,30 @@
         return is_postgrad
 
+    def transfer(self, certificate, current_session=None,
+        current_level=None, current_verdict=None):
+        """ Creates a new studycourse and backups the old one.
+
+        """
+        studycourse = createObject(u'waeup.StudentStudyCourse')
+        studycourse.certificate = certificate
+        studycourse.entry_mode = 'transfer'
+        studycourse.current_session = current_session
+        studycourse.current_level = current_level
+        studycourse.current_verdict = current_verdict
+        old = self['studycourse']
+        # Students can be transferred only two times.
+        if 'studycourse_1' in self.keys():
+            if 'studycourse_2' in self.keys():
+                return False
+            self['studycourse_2'] = old
+        else:
+            self['studycourse_1'] = old
+        del self['studycourse']
+        self['studycourse'] = studycourse
+        self.__parent__.logger.info(
+            '%s - transferred from %s to %s' % (
+            self.student_id, old.certificate.code, studycourse.certificate.code))
+        return True
+
 
 # Set all attributes of Student required in IStudent as field
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/studycourse.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/studycourse.py	(revision 9130)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/studycourse.py	(revision 9131)
@@ -64,4 +64,10 @@
             return False
         return self.certificate.study_mode.startswith('pg')
+
+    @property
+    def is_current(self):
+        if '_' in self.__name__:
+            return False
+        return True
 
     def addStudentStudyLevel(self, cert, studylevel):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py	(revision 9130)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py	(revision 9131)
@@ -21,9 +21,13 @@
 import re
 import unittest
+import grok
 from cStringIO import StringIO
 from datetime import tzinfo
-from zope.component import getUtility
+from zope.component import getUtility, queryUtility, createObject
+from zope.catalog.interfaces import ICatalog
 from zope.component.interfaces import IFactory
+from zope.event import notify
 from zope.interface import verify
+from zope.schema.interfaces import RequiredMissing
 from waeup.kofa.interfaces import IExtFileStore, IFileStoreNameChooser
 from waeup.kofa.students.export import EXPORTER_NAMES
@@ -236,4 +240,73 @@
         return
 
+class StudentTransferTests(StudentImportExportSetup):
+
+    layer = FunctionalLayer
+
+    def setUp(self):
+        super(StudentTransferTests, self).setUp()
+
+        # Add additional certificate
+        self.certificate2 = createObject('waeup.Certificate')
+        self.certificate2.code = 'CERT2'
+        self.certificate2.application_category = 'basic'
+        self.certificate2.start_level = 200
+        self.certificate2.end_level = 500
+        self.app['faculties']['fac1']['dep1'].certificates.addCertificate(
+            self.certificate2)
+
+        # Add student with subobjects
+        student = Student()
+        self.app['students'].addStudent(student)
+        student = self.setup_student(student)
+        notify(grok.ObjectModifiedEvent(student))
+        self.student = self.app['students'][student.student_id]
+        return
+
+    def test_transfer_student(self):
+        self.assertRaises(
+            RequiredMissing, self.student.transfer, self.certificate2)
+        success = self.student.transfer(self.certificate2, current_session=2013)
+        self.assertEqual(self.student['studycourse_1'].certificate.code, 'CERT1')
+        self.assertEqual(self.student['studycourse'].certificate.code, 'CERT2')
+        self.assertEqual(self.student['studycourse_1'].current_session, 2012)
+        self.assertEqual(self.student['studycourse'].current_session, 2013)
+        self.assertEqual(self.student['studycourse_1'].__name__, 'studycourse_1')
+        logfile = os.path.join(
+            self.app['datacenter'].storage, 'logs', 'students.log')
+        logcontent = open(logfile).read()
+        self.assertTrue('system - K1000000 - transferred from CERT1 to CERT2'
+            in logcontent)
+
+        # The students_catalog has been updated.
+        cat = queryUtility(ICatalog, name='students_catalog')
+        results = cat.searchResults(certcode=('CERT1', 'CERT1'))
+        results = [x for x in results]
+        self.assertEqual(len(results), 0)
+        results = cat.searchResults(certcode=('CERT2', 'CERT2'))
+        results = [x for x in results]
+        self.assertEqual(len(results), 1)
+        assert results[0] is self.app['students'][self.student.student_id]
+        results = cat.searchResults(current_session=(2013,2013))
+        results = [x for x in results]
+        self.assertEqual(len(results), 1)
+        assert results[0] is self.app['students'][self.student.student_id]
+
+        # Students can be transferred (only) two times.
+        success = self.student.transfer(self.certificate, current_session=2013)
+        self.assertTrue(success)
+        success = self.student.transfer(self.certificate2, current_session=2013)
+        self.assertFalse(success)
+        self.assertEqual([i for i in self.student.keys()],
+            [u'accommodation', u'payments', u'studycourse',
+             u'studycourse_1', u'studycourse_2'])
+
+        # The students_catalog has been updated again.
+        cat = queryUtility(ICatalog, name='students_catalog')
+        results = cat.searchResults(certcode=('CERT1', 'CERT1'))
+        results = [x for x in results]
+        self.assertEqual(len(results), 1)
+        assert results[0] is self.app['students'][self.student.student_id]
+        return
 
 class StudentFactoryTest(FunctionalTestCase):
Index: main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 9130)
+++ main/waeup.kofa/trunk/src/waeup/kofa/utils/utils.py	(revision 9131)
@@ -123,4 +123,5 @@
 
     STUDY_MODES_DICT = {
+        'transfer': 'Transfer',
         'ug_ft': 'Undergraduate Full-Time',
         'ug_pt': 'Undergraduate Part-Time',
