Index: main/waeup.kofa/trunk/src/waeup/kofa/browser/static/waeup-base.css
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/browser/static/waeup-base.css	(revision 9893)
+++ main/waeup.kofa/trunk/src/waeup/kofa/browser/static/waeup-base.css	(revision 9895)
@@ -160,5 +160,9 @@
 }
 
-.form-table td {
+.input-table {
+  width: 50%;
+}
+
+.form-table td, .input-table td {
   padding: 5px 0px 5px 4px;
   border-top: none;
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9893)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser.py	(revision 9895)
@@ -139,4 +139,25 @@
     return None
 
+
+def addCourseTicket(view, course=None):
+    students_utils = getUtility(IStudentsUtils)
+    ticket = createObject(u'waeup.CourseTicket')
+    ticket.automatic = False
+    ticket.carry_over = False
+    max_credits = students_utils.maxCreditsExceeded(view.context, course)
+    if max_credits:
+        view.flash(_(
+            'Total credits exceed ${a}.',
+            mapping = {'a': max_credits}))
+        return False
+    try:
+        view.context.addCourseTicket(ticket, course)
+    except KeyError:
+        view.flash(_('The ticket exists.'))
+        return False
+    view.flash(_('Successfully added ${a}.',
+        mapping = {'a':ticket.code}))
+    return True
+
 class StudentsBreadcrumb(Breadcrumb):
     """A breadcrumb for the students container.
@@ -1157,5 +1178,5 @@
         _('Remove selected tickets'),_('Cancel')]
 
-    def update(self):
+    def update(self, ADD=None, course=None):
         if not self.context.__parent__.is_current:
             emit_lock_message(self)
@@ -1170,4 +1191,17 @@
         warning.need()
         datatable.need()
+        if ADD is not None:
+            if not course:
+                self.flash(_('No valid course code entered.'))
+                self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+                return
+            cat = queryUtility(ICatalog, name='courses_catalog')
+            result = cat.searchResults(code=(course, course))
+            if len(result) != 1:
+                self.flash(_('Course not found.'))
+            else:
+                course = list(result)[0]
+                addCourseTicket(self, course)
+            self.redirect(self.url(self.context, u'@@manage')+'?tab2')
         return
 
@@ -1189,8 +1223,4 @@
         msave(self, **data)
         return
-
-    @action(_('Add course ticket'))
-    def addCourseTicket(self, **data):
-        self.redirect(self.url(self.context, '@@add'))
 
     @jsaction(_('Remove selected tickets'))
@@ -1296,23 +1326,8 @@
     @action(_('Add course ticket'))
     def addCourseTicket(self, **data):
-        students_utils = getUtility(IStudentsUtils)
-        ticket = createObject(u'waeup.CourseTicket')
         course = data['course']
-        ticket.automatic = False
-        ticket.carry_over = False
-        max_credits = students_utils.maxCreditsExceeded(self.context, course)
-        if max_credits:
-            self.flash(_(
-                'Total credits exceed ${a}.',
-                mapping = {'a': max_credits}))
-            return
-        try:
-            self.context.addCourseTicket(ticket, course)
-        except KeyError:
-            self.flash(_('The ticket exists.'))
-            return
-        self.flash(_('Successfully added ${a}.',
-            mapping = {'a':ticket.code}))
-        self.redirect(self.url(self.context, u'@@manage')+'?tab2')
+        success = addCourseTicket(self, course)
+        if success:
+            self.redirect(self.url(self.context, u'@@manage')+'?tab2')
         return
 
@@ -2294,5 +2309,5 @@
     pnav = 4
 
-    def update(self):
+    def update(self, ADD=None, course=None):
         if not self.context.__parent__.is_current:
             emit_lock_message(self)
@@ -2305,4 +2320,15 @@
         datatable.need()
         warning.need()
+        if ADD is not None:
+            if not course:
+                self.flash(_('No valid course code entered.'))
+                return
+            cat = queryUtility(ICatalog, name='courses_catalog')
+            result = cat.searchResults(code=(course, course))
+            if len(result) != 1:
+                self.flash(_('Course not found.'))
+                return
+            course = list(result)[0]
+            addCourseTicket(self, course)
         return
 
@@ -2319,8 +2345,4 @@
     def translated_values(self):
         return translated_values(self)
-
-    @action(_('Add course ticket'))
-    def addCourseTicket(self, **data):
-        self.redirect(self.url(self.context, 'ctadd'))
 
     def _delCourseTicket(self, **data):
@@ -2373,9 +2395,8 @@
         return
 
-    @action(_('Register course list'), style='primary')
+    @action(_('Register course list'))
     def registerCourses(self, **data):
         self._registerCourses(**data)
         return
-
 
 class CourseTicketAddFormPage2(CourseTicketAddFormPage):
@@ -2396,28 +2417,12 @@
     @action(_('Add course ticket'))
     def addCourseTicket(self, **data):
-        students_utils = getUtility(IStudentsUtils)
         # Safety belt
         if self.context.student.state != PAID:
             return
-        ticket = createObject(u'waeup.CourseTicket')
         course = data['course']
-        ticket.automatic = False
-        ticket.carry_over = False
-        max_credits = students_utils.maxCreditsExceeded(self.context, course)
-        if max_credits:
-            self.flash(_(
-                'Your total credits exceed ${a}.',
-                mapping = {'a': max_credits}))
-            return
-        try:
-            self.context.addCourseTicket(ticket, course)
-        except KeyError:
-            self.flash(_('The ticket exists.'))
-            return
-        self.flash(_('Successfully added ${a}.',
-            mapping = {'a':ticket.code}))
-        self.redirect(self.url(self.context, u'@@edit'))
-        return
-
+        success = addCourseTicket(self, course)
+        if success:
+            self.redirect(self.url(self.context, u'@@edit'))
+        return
 
 class SetPasswordPage(KofaPage):
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studyleveleditpage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studyleveleditpage.pt	(revision 9893)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studyleveleditpage.pt	(revision 9895)
@@ -50,4 +50,24 @@
   </div>
 
+  <br /><br /><br />
+  <table class="input-table">
+    <tr>
+      <td>
+        <input class="btn primary" type="submit" name="ADD"
+               i18n:translate=""
+               value="Add course ticket" />
+      </td>
+      <td>
+        <input type="text" name="course" />
+        <div class="hint" i18n:translate="">
+            Enter valid course code.
+        </div>
+      </td>
+    </tr>
+  </table>
+  <p i18n:translate="">
+    You don't know the course code? Then select a course
+    <a href="ctadd">here</a>.
+  </p>
 </form>  
 
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelmanagepage.pt
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelmanagepage.pt	(revision 9893)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/browser_templates/studylevelmanagepage.pt	(revision 9895)
@@ -75,4 +75,25 @@
       </div>
 
+      <br /><br /><br />
+      <table class="input-table">
+        <tr>
+          <td>
+            <input class="btn primary" type="submit" name="ADD"
+                   i18n:translate=""
+                   value="Add course ticket" />
+          </td>
+          <td>
+            <input type="text" name="course" />
+            <div class="hint" i18n:translate="">
+                Enter valid course code.
+            </div>
+          </td>
+        </tr>
+      </table>
+      <p i18n:translate="">
+        You don't know the course code? Then select a course
+        <a href="add">here</a>.
+      </p>
+
     </div>
   </div>
Index: main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
===================================================================
--- main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 9893)
+++ main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py	(revision 9895)
@@ -750,5 +750,5 @@
         self.assertTrue('zope.mgr - students.browser.StudyLevelManageFormPage '
         '- K1000000 - removed: COURSE1' in logcontent)
-        self.browser.getControl("Add course ticket").click()
+        self.browser.getLink("here").click()
         self.browser.getControl(name="form.course").value = ['COURSE1']
         self.course.credits = 100
@@ -759,5 +759,10 @@
         self.browser.getControl("Add course ticket").click()
         self.assertTrue('Successfully added' in self.browser.contents)
+        # We can do the same by adding the course on the manage page directly
+        del self.student['studycourse']['100']['COURSE1']
+        self.browser.getControl(name="course").value = 'COURSE1'
         self.browser.getControl("Add course ticket").click()
+        self.assertTrue('Successfully added' in self.browser.contents)
+        self.browser.getLink("here").click()
         self.browser.getControl(name="form.course").value = ['COURSE1']
         self.browser.getControl("Add course ticket").click()
@@ -2018,5 +2023,5 @@
         self.browser.getLink("100").click()
         self.browser.getLink("Edit course list").click()
-        self.browser.getControl("Add course ticket").click()
+        self.browser.getLink("here").click()
         self.browser.getControl(name="form.course").value = ['COURSE1']
         self.browser.getControl("Add course ticket").click()
@@ -2031,10 +2036,10 @@
         self.browser.getLink("200").click()
         self.browser.getLink("Edit course list").click()
-        self.browser.getControl("Add course ticket").click()
+        self.browser.getLink("here").click()
         self.browser.getControl(name="form.course").value = ['COURSE1']
         self.course.credits = 100
         self.browser.getControl("Add course ticket").click()
         self.assertMatches(
-            '...Your total credits exceed 50...', self.browser.contents)
+            '...Total credits exceed 50...', self.browser.contents)
         self.course.credits = 10
         self.browser.getControl("Add course ticket").click()
@@ -2063,10 +2068,14 @@
         self.browser.getControl("Register course list").click()
         self.assertTrue('Maximum credits of 50 exceeded' in self.browser.contents)
-        # Student can now remove the ticket
+        # Student can now remove the ticket ...
         ctrl = self.browser.getControl(name='val_id')
         ctrl.getControl(value='COURSE1').selected = True
         self.browser.getControl("Remove selected", index=0).click()
         self.assertTrue('Successfully removed' in self.browser.contents)
-        # Course list can be registered, even if it's empty
+        # ... and add the same ticket using the edit page directly.
+        # We can do the same by adding the course on the manage page directly
+        self.browser.getControl(name="course").value = 'COURSE1'
+        self.browser.getControl("Add course ticket").click()
+        # Course list can be registered
         self.browser.getControl("Register course list").click()
         self.assertTrue('Course list has been registered' in self.browser.contents)
@@ -2096,5 +2105,5 @@
         self.browser.getLink("999").click()
         self.browser.getLink("Edit course list").click()
-        self.browser.getControl("Add course ticket").click()
+        self.browser.getLink("here").click()
         self.browser.getControl(name="form.course").value = ['COURSE1']
         self.browser.getControl("Add course ticket").click()
