Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8313)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py	(revision 8314)
@@ -42,4 +42,5 @@
 from waeup.kofa.browser.interfaces import ICaptchaManager
 from waeup.kofa.browser.breadcrumbs import Breadcrumb
+from waeup.kofa.browser.resources import toggleall
 from waeup.kofa.browser.layout import (
     NullValidator, jsaction, action, UtilityView)
@@ -253,5 +254,6 @@
     form_fields = grok.AutoFields(IApplicantsContainer).omit('title')
     taboneactions = [_('Save'),_('Cancel')]
-    tabtwoactions = [_('Add applicant'), _('Remove selected'),_('Cancel')]
+    tabtwoactions = [_('Add applicant'), _('Remove selected'),_('Cancel'),
+        _('Create students from selected')]
     tabthreeactions1 = [_('Remove selected local roles')]
     tabthreeactions2 = [_('Add local role')]
@@ -268,4 +270,5 @@
         datepicker.need() # Enable jQuery datepicker in date fields.
         tabs.need()
+        toggleall.need()
         self.tab1 = self.tab2 = self.tab3 = ''
         qs = self.request.get('QUERY_STRING', '')
@@ -334,4 +337,28 @@
         return
 
+    @action(_('Create students from selected'))
+    def createStudents(self, **data):
+        form = self.request.form
+        if form.has_key('val_id'):
+            child_id = form['val_id']
+        else:
+            self.flash(_('No applicant selected!'))
+            self.redirect(self.url(self.context, '@@manage')+'?tab2')
+            return
+        if not isinstance(child_id, list):
+            child_id = [child_id]
+        created = []
+        for id in child_id:
+            success, msg = self.context[id].createStudent(view=self)
+            if success:
+                created.append(id)
+        if len(created):
+            self.flash(_('${a} students successfully created.',
+                mapping = {'a': len(created)}))
+        else:
+            self.flash(_('No student could be created.'))
+        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        return
+
     @action(_('Cancel'), validator=NullValidator)
     def cancel(self, **data):
@@ -434,5 +461,5 @@
 
     def update(self):
-        msg = self.context.createStudent()[1]
+        msg = self.context.createStudent(view=self)[1]
         self.flash(msg)
         self.redirect(self.url(self.context))
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontainermanagepage.pt
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontainermanagepage.pt	(revision 8313)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/applicantscontainermanagepage.pt	(revision 8314)
@@ -34,5 +34,9 @@
     </div>
     <div id="tab-2" tal:attributes="class view/tab2">
-      <h3 i18n:translate="">Applicants</h3>
+
+    <input type="checkbox" onClick="toggle(this, 'val_id')" />
+    <span  i18n:translate="">Select all</span>
+    <br /><br />
+
       <table class="display dataTableManage">
         <thead>
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/sample_container_data.csv
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/sample_container_data.csv	(revision 8313)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/sample_container_data.csv	(revision 8314)
@@ -1,7 +1,7 @@
-code,title,prefix,entry_level,year,application_category,description,startdate,enddate,strict_deadline,mode
-app2012,General Studies 2012/2013,app,100,2012,basic,"This text can been seen by anonymous users.
+code,title,prefix,year,application_category,description,startdate,enddate,strict_deadline,mode
+app2012,General Studies 2012/2013,app,2012,basic,"This text can been seen by anonymous users.
 >>de<<
 Dieser Text kann von anonymen Benutzern gelesen werden.",2012-03-01,2012-04-25,1,create
-app2013,General Studies 2013/2014,app,100,2012,basic,"This text can been seen by anonymous users.
+app2013,General Studies 2013/2014,app,2012,basic,"This text can been seen by anonymous users.
 >>de<<
 Dieser Text kann von anonymen Benutzern gelesen werden.",2013-03-01,2013-04-25,1,create
Index: /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_applicantcopier.py
===================================================================
--- /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_applicantcopier.py	(revision 8313)
+++ /main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_applicantcopier.py	(revision 8314)
@@ -20,5 +20,5 @@
 """
 import os
-from hurry.workflow.interfaces import IWorkflowInfo
+from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
 from zope.component import getUtility
 from waeup.kofa.testing import FunctionalLayer
@@ -54,8 +54,5 @@
         (success, msg) = self.applicant.createStudent()
         self.assertTrue(msg == 'Applicant has not yet been admitted.')
-        IWorkflowInfo(self.applicant).fireTransition('start')
-        IWorkflowInfo(self.applicant).fireTransition('pay')
-        IWorkflowInfo(self.applicant).fireTransition('submit')
-        IWorkflowInfo(self.applicant).fireTransition('admit')
+        IWorkflowState(self.applicant).setState('admitted')
         (success, msg) = self.applicant.createStudent()
         self.assertTrue(msg == 'No course admitted provided.')
@@ -99,4 +96,27 @@
         self.assertMatches('...John Tester...', self.browser.contents)
 
+    def test_batch_copying(self):
+        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+        self.browser.open(self.manage_path)
+        self.fill_correct_values()
+        self.browser.getControl("Save").click()
+        # Upload a passport picture
+        ctrl = self.browser.getControl(name='form.passport')
+        file_obj = open(
+            os.path.join(os.path.dirname(__file__), 'test_image.jpg'),'rb')
+        file_ctrl = ctrl.mech_control
+        file_ctrl.add_file(file_obj, filename='my_photo.jpg')
+        self.browser.getControl("Save").click() # submit form
+        IWorkflowState(self.applicant).setState('admitted')
+        self.browser.getControl(name="form.course_admitted").value = ['CERT1']
+        self.browser.getControl("Save").click()
+        self.browser.open(self.manage_container_path)
+        self.browser.getControl("Create students from selected", index=0).click()
+        self.assertTrue('No applicant selected' in self.browser.contents)
+        ctrl = self.browser.getControl(name='val_id')
+        ctrl.getControl(value=self.applicant.application_number).selected = True
+        self.browser.getControl("Create students from selected", index=0).click()
+        self.assertTrue('1 students successfully created' in self.browser.contents)
+
     def test_copier_wo_passport(self):
         self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
@@ -104,8 +124,5 @@
         self.fill_correct_values()
         # Let's try to create the student
-        IWorkflowInfo(self.applicant).fireTransition('start')
-        IWorkflowInfo(self.applicant).fireTransition('pay')
-        IWorkflowInfo(self.applicant).fireTransition('submit')
-        IWorkflowInfo(self.applicant).fireTransition('admit')
+        IWorkflowState(self.applicant).setState('admitted')
         self.browser.getControl(name="form.course_admitted").value = ['CERT1']
         self.browser.getControl("Save").click()
