Index: WAeUP_SRP/base/Academics.py
===================================================================
--- WAeUP_SRP/base/Academics.py	(revision 2608)
+++ WAeUP_SRP/base/Academics.py	(revision 2609)
@@ -762,8 +762,9 @@
     def Title(self):
         """compose title"""
-        try:
-            return "Level %s" % self.aq_parent.getId()
-        except:
-            return "no Title for %s" % self.getId()
+        return self.portal_vocabularies.levels.get(self.aq_parent.getId())
+        # try:
+        #     #return "Level %s" % self.aq_parent.getId()
+        # except:
+        #     return "no Title for %s" % self.getId()
 
 
Index: WAeUP_SRP/base/skins/waeup_academics/getLevelInfo.py
===================================================================
--- WAeUP_SRP/base/skins/waeup_academics/getLevelInfo.py	(revision 2608)
+++ WAeUP_SRP/base/skins/waeup_academics/getLevelInfo.py	(revision 2609)
@@ -32,26 +32,50 @@
 info['choosen_ids'] = request.get('ids',[])
 info['doc'] = context.getContent()
-brain = context.portal_catalog(meta_type="Certificate",id = cert_id)[-1]
-cp = brain.getPath()
-info['container_path'] = cp
+# brain = context.portal_catalog(meta_type="Certificate",id = cert_id)[-1]
+# cp = brain.getPath()
+# info['container_path'] = cp
 info['dep_id'] = dep_id
 info['cert_id'] = cert_id
 
-res = context.portal_catalog(meta_type="CertificateCourse", container_path="%s/%s" % (cp,level_id))
+# res = context.portal_catalog(meta_type="CertificateCourse", container_path="%s/%s" % (cp,level_id))
+# first = []
+# second = []
+# for r in res:
+#     row = {}
+#     ro = r.getObject()
+#     rd = ro.getContent()
+#     course_id = r.getId 
+#     row = context.getCourseInfo(course_id)
+#     row['id'] = course_id
+#     # row['title'] = rd.Title()
+#     # row['semester'] = rd.semester
+#     row['core'] = rd.core_or_elective
+#     row['url'] = ro.absolute_url()
+#     row['review_state'] = wf.getInfoFor(ro,'review_state','None')
+#     editable = row['is_editable'] = mtool.checkPermission('Modify portal content', ro)
+#     if editable:
+#         row['real_course_path'] = "%s/%s/%s/courses/%s" % (academics_path,
+#                                                            row['faculty'],
+#                                                            row['department'],
+#                                                            course_id)
+#     if row['semester'] == 1:
+#         first.append(row)
+#     else:
+#         second.append(row)
 first = []
 second = []
-for r in res:
+for course_id,course in context.objectItems():
     row = {}
-    ro = r.getObject()
-    rd = ro.getContent()
-    course_id = r.getId 
+    # ro = r.getObject()
+    course_doc = course.getContent()
+    # course_id = r.getId 
     row = context.getCourseInfo(course_id)
     row['id'] = course_id
-    # row['title'] = rd.Title()
-    # row['semester'] = rd.semester
-    row['core'] = rd.core_or_elective
-    row['url'] = ro.absolute_url()
-    row['review_state'] = wf.getInfoFor(ro,'review_state','None')
-    editable = row['is_editable'] = mtool.checkPermission('Modify portal content', ro)
+    # row['title'] = course_doc.Title()
+    # row['semester'] = course_doc.semester
+    row['core'] = course_doc.core_or_elective
+    row['url'] = course.absolute_url()
+    row['review_state'] = wf.getInfoFor(course,'review_state','None')
+    editable = row['is_editable'] = mtool.checkPermission('Modify portal content', course)
     if editable:
         row['real_course_path'] = "%s/%s/%s/courses/%s" % (academics_path,
Index: WAeUP_SRP/base/skins/waeup_utilities/ti_391_resolve.py
===================================================================
--- WAeUP_SRP/base/skins/waeup_utilities/ti_391_resolve.py	(revision 2608)
+++ WAeUP_SRP/base/skins/waeup_utilities/ti_391_resolve.py	(revision 2609)
@@ -28,4 +28,5 @@
 from Products.AdvancedQuery import Eq, Between, Le,In
 aq_portal = context.portal_catalog_real.evalAdvancedQuery
+students_folder = context.portal_url.getPortalObject().campus.students
 
 request = context.REQUEST
@@ -39,7 +40,7 @@
 #logger.info('')
 
-query = Eq('portal_type','StudentPersonal')
-#brains = context.students_catalog()
-brains = aq_portal(query)
+#query = Eq('portal_type','StudentPersonal')
+#brains = aq_portal(query)
+brains = context.students_catalog()
 total = len(brains)
 #rwrite("found %d " % total)
@@ -47,23 +48,35 @@
 edited = 0
 count = 0
+commit_after = 50
 logger.info('started for %d' % total)
 for brain in brains:
     count += 1
-    doc = brain.getObject().getContent()
-    if doc.email and doc.email.find('@') < 0:
+    if no_email and not no_email % commit_after:
+        context.waeup_tool.doCommit()
+        logger.info("Committing %s transactions, total %s" % (commit_after,count))
+    if not brain.email or brain.email.find('@') < 0:
         no_email += 1
-        #rwrite ("%s email = %s" % (brain.getId,doc.email))
         try:
-            app_doc = getattr(brain.getObject().aq_parent,'application').getContent()
-            logger.info("setting email of %s from %s to %s" % (brain.getPath().split('/')[-2],
-                                                               doc.email,
-                                                               app_doc.app_email))
-            doc.edit(mapping={'email': app_doc.app_email})
-            edited += 1
+            app_doc = getattr(getattr(students_folder,brain.id),'application').getContent()
+            #rwrite ("%s email = %s" % (brain.getId,doc.email))
         except:
-            logger.info("failed to set email of %s from %s" % (brain.getPath().split('/')[-2],
-                                                               doc.email,
-                                                               ))
-            pass
+            logger.info("failed to get application object of %s" % (brain.id,))
+            continue
+        if not app_doc.app_email or app_doc.app_email.find('@') < 0:
+            logger.info("%s both emails %s/%s are invalid" % (brain.id, 
+                                                              app_doc.app_email,
+                                                              brain.email))
+            continue
+        try:
+            per_doc = getattr(getattr(students_folder,brain.id),'personal').getContent()
+            #rwrite ("%s email = %s" % (brain.getId,doc.email))
+        except:
+            logger.info("failed to get personal object of %s" % (brain.id,))
+            continue
+        logger.info("setting email of %s from %s to %s" % (brain.id,
+                                                            per_doc.email,
+                                                            app_doc.app_email))
+        per_doc.edit(mapping={'email': app_doc.app_email})
+        edited += 1
     else:
         #rwrite ("%s email = %s" % (brain.getPath(),doc.email))
Index: WAeUP_SRP/uniben/profiles/default/layouts/study_level.xml
===================================================================
--- WAeUP_SRP/uniben/profiles/default/layouts/study_level.xml	(revision 2608)
+++ WAeUP_SRP/uniben/profiles/default/layouts/study_level.xml	(revision 2609)
@@ -8,5 +8,5 @@
  <property name="flexible_widgets"/>
  <property name="validate_values_expr"></property>
- <widget name="code" meta_type="String Widget">
+ <widget name="code" meta_type="Select Widget">
   <property name="title">Level No</property>
   <property name="fields">
@@ -17,4 +17,5 @@
   <property name="label_edit">Level No</property>
   <property name="readonly_layout_modes"/>
+  <property name="vocabulary">levels</property>
  <property name="hidden_layout_modes">
   <element value="edit"/>
