diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_ar.properties
index 999c93f872fe71b3471baed1a504c1d688d27eb5..48998f5c986cc29edab5d3ad837c725c7bf3b2ea 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_ar.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff=AJAX \u062A\u062D\u062F\u064A\u062F \u0645\u0631\u0628\u0639 \u0627\u0644\u0627\u062E\u062A\u064A\u0627\u0631 \u064A\u0639\u0646\u0649 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0625\u0639\u0627\u062F\u0629 \u0648\u0625\u0637\u0641\u0627\u0621
 bulkuserreplay.tt=\u0623\u0633\u0645\u0627\u0621 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646 \u0641\u0649 \u0633\u0637\u0648\u0631 \u0645\u0646\u0641\u0635\u0644\u0629\u060C \u0628\u062F\u0648\u0646 \u0641\u0648\u0627\u0635\u0644
 data.no.save=\u0627\u0646\u062A\u0628\u0627\u0647\: \u062A\u0639\u062F\u064A\u0644\u0627\u062A\u0643 \u0633\u0648\u0641 \u062A\u0636\u064A\u0639 \u0628\u0639\u062F \u0625\u0639\u0627\u062F\u0629 \u062A\u0634\u063A\u064A\u0644 \u0623\u0648\u0644\u0627\u062A\! \u0644\u062D\u0641\u0638 \u0627\u0644\u062A\u063A\u064A\u064A\u0631\u0627\u062A \u0628\u0634\u0643\u0644 \u062F\u0627\u0626\u0645 \u064A\u062C\u0628 \u0645\u0644\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\r\n \u0648\u0627\u0644\u0625\u0635\u062F\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644\u064A\u0629 \u0633\u0648\u0641 \u062A\u0648\u0641\u0631 \u0644\u0643 \u0627\u0645\u0643\u0627\u0646\u064A\u0629 \u062D\u0641\u0638 \u0627\u0644\u062A\u0639\u062F\u064A\u0644\u0627\u062A \u062A\u0644\u0642\u0627\u0626\u064A\u0627\u060C<code>olat.properties</code>
-error.deleteworkflow.locked.by=\u0645\u062E\u0637\u0637 \u0627\u0644\u0639\u0645\u0644 \u0644\u062D\u0630\u0641 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646 \u064A\u062A\u0645 \u062A\u0639\u062F\u064A\u0644\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 {0}\u060C \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0641\u0649 \u0648\u0642\u062A \u0644\u0627\u062D\u0642.
-manu.config.alt=\u064A\u0631\u062C\u0649 \u0625\u0639\u062F\u0627\u062F \u0646\u0638\u0627\u0645\u0643
 menu.admin=\u0627\u0644\u0625\u062F\u0627\u0631\u0629
 menu.admin.alt=\u0627\u0644\u0627\u062F\u0627\u0631\u0629
 menu.advancedproperties=\u062E\u0635\u0627\u0626\u0635 \u0645\u062A\u0642\u062F\u0645\u0629
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_bg.properties
index ad712355a52f52d44df0364653be31c1076176f0..9b4ee396bc42eca77d49a9847ed6d7ee61ec532b 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_bg.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_bg.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff=\u041E\u0442\u043C\u0435\u0442\u043D\u0435\u0442\u0435 \u043A\u0443\u0442\u0438\u044F\u0442\u0430, \u0437\u0430 \u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u0435 Replay \u0438 \u0438\u0437\u043A\u043B\u044E\u0447\u0438\u0442\u0435 AJAX
 bulkuserreplay.tt=\u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u0438 \u0438\u043C\u0435\u043D\u0430; \u0432\u0441\u044F\u043A\u043E \u043D\u0430 \u043D\u043E\u0432 \u0440\u0435\u0434
 data.no.save=\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435\: \u0432\u0430\u0448\u0438\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438 \u0449\u0435 \u0431\u044A\u0434\u0430\u0442 \u0437\u0430\u0433\u0443\u0431\u0435\u043D\u0438 \u0441\u043B\u0435\u0434 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043D\u0435 \u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430. \u0417\u0430 \u0434\u0430 \u0437\u0430\u043F\u0430\u0437\u0438\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0441\u0438 \u0437\u0430 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u043E, \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0430\u0434\u0430\u043F\u0442\u0438\u0440\u0430\u0442\u0435 \u0444\u0430\u0439\u043B\u0430 olat.properties. \u0412 \u0441\u043B\u0435\u0434\u0432\u0430\u0449\u0438\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u0442\u0430, \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0449\u0435 \u0441\u0435 \u0437\u0430\u043F\u0430\u0437\u0432\u0430\u0442 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E.
-error.deleteworkflow.locked.by=\u0420\u0430\u0431\u043E\u0442\u043D\u0430\u0442\u0430 \u0441\u0440\u0435\u0434\u0430, \u043E\u0442\u043D\u0430\u0441\u044F\u0449\u0430 \u0441\u0435 \u0434\u043E \u0438\u0437\u0442\u0440\u0438\u0432\u0430\u043D\u0435\u0442\u043E \u043D\u0430 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0438, \u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u0430\u043D\u0430 \u043E\u0442 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B {0}. \u041C\u043E\u043B\u044F, \u043E\u043F\u0438\u0442\u0430\u0439\u0442\u0435 \u043E\u0442\u043D\u043E\u0432\u043E \u043F\u043E-\u043A\u044A\u0441\u043D\u043E.
-manu.config.alt=\u041C\u043E\u043B\u044F, \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u0430\u0448\u0430\u0442\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430
 menu.admin=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043D\u0435
 menu.admin.alt=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u0430\u043D\u0435
 menu.advancedproperties=\u0422\u044A\u0440\u0441\u0435\u043D\u0435 \u0437\u0430 \u043D\u0430\u043F\u0440\u0435\u0434\u043D\u0430\u043B\u0438
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_cs.properties
index 968c89c31ff05e88f5061a65f95cda910da429d3..49c53c3f662af70891e35e77bb7732278bcae70e 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_cs.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_cs.properties
@@ -1,6 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
 data.no.save=Varov\u00E1n\u00ED\: P\u0159i restartov\u00E1n\u00ED OLATu budou va\u0161e zm\u011Bny ztraceny\! Pro uchov\u00E1n\u00ED zm\u011Bn mus\u00EDte upravit soubor olat.properties. Dal\u0161\u00ED releasi v\u00E1m umo\u017En\u00ED ulo\u017Eit zm\u011Bny automaticky.
-error.deleteworkflow.locked.by=Funk\u010Dnost maz\u00E1n\u00ED u\u017Eivatel\u016F je pr\u00E1v\u011B pou\u017E\u00EDv\u00E1na u\u017Eivateleme {0}. Zkuste to pros\u00EDm pozd\u011Bji.
 menu.admin=Administrace
 menu.admin.alt=Administrace
 menu.advancedproperties=Dal\u0161\u00ED vlastnosti
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_da.properties
index 72a7e9d5911da24435aad5ea8c6a5c2c329aa4ee..a331b5c7b26b224ed230ccd79f93c96412c66389 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_da.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_da.properties
@@ -1,5 +1,4 @@
 #Fri Mar 23 15:13:55 CET 2018
-error.deleteworkflow.locked.by=Den p\u00E5g\u00E6ldende workflow til sletning af brugere bliver rettet af bruger {0}. Pr\u00F8v venligst igen senere.  
 menu.admin=Administration
 menu.admin.alt=Administration
 menu.advancedproperties=Avancerede indstillinger
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties
index 314a9cdaa3297cefa6d705c9828a8a1f84f25c2a..7b41b9683b5e38890fee30842c2a2b11ecfd965a 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties
@@ -2,10 +2,8 @@
 bulkuserreplay.chkbx.onoff=Checkbox an heisst Replay ON und AJAX OFF
 bulkuserreplay.tt=Benutzername Linie f\u00FCr Linie (ohne Komma, oder dergleichen)
 data.no.save=Achtung\: die \u00C4nderungen gehen nach einem Neustart von OpenOlat verloren\! Um die Einstellung permanent zu speichern m\u00FCssen Sie die Anpassungen in der <code>olat.properties</code> Datei \u00E4ndern. In zuk\u00FCnftigen Releases wird ein automatisches Speichern m\u00F6glich sein.
-error.deleteworkflow.locked.by=Der Benutzer-L\u00F6sch-Workflow wird zurzeit von Benutzer {0} bearbeitet. Versuchen Sie es sp\u00E4ter noch einmal.
 main.menu.title=Administration
 main.menu.title.alt=Administration
-manu.config.alt=Bitte konfigurieren Sie Ihr System
 menu.admin=Administration
 menu.admin.alt=Administration
 menu.advancedproperties=Properties erweitert
@@ -30,6 +28,8 @@ menu.extensions=Software Module
 menu.extensions.alt=Liste der geladenen Software Module
 menu.external.tools=Externe Werkzeuge
 menu.external.tools.alt=Anbindung zu externen System
+menu.filesfolders=Dateien und Ordner
+menu.filesfolders.alt=Gro\u00dfe Dateien, Versionseinstellungen und mehr
 menu.hibernate=Database ORM
 menu.hibernate.alt=Database ORM / Hibernate
 menu.i18n=Sprachen
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_el.properties
index 17243a5e22df9bd1f291c2fd263ccef3da97a5ba..f465cbbac8a0169a91f14450326347c85c1e8595 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_el.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 Replay \u03BA\u03B1\u03B9 \u03B1\u03C0\u03B5\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 AJAX
 bulkuserreplay.tt=\u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD \u03C3\u03B5 \u03BE\u03B5\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AD\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AD\u03C2 (\u03C7\u03C9\u03C1\u03AF\u03C2 \u03BA\u03CC\u03BC\u03BC\u03B1\u03C4\u03B1, \u03BA\u03C4\u03BB.)
 data.no.save=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE\: \u039F\u03B9 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 \u03C7\u03AC\u03BD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BC\u03B5\u03C4\u03AC \u03B1\u03C0\u03BF \u03B5\u03C0\u03B1\u03BD\u03B5\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03C4\u03BF\u03C5 OLAT\! \u0393\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03CD\u03C3\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C4\u03C1\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF olat.properties. \u0389 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B1\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD \u03B8\u03B1 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03C3\u03B5 \u03BC\u03B5\u03BB\u03BB\u03BF\u03BD\u03C4\u03B9\u03BA\u03AE \u03AD\u03BA\u03B4\u03BF\u03C3\u03B7.
-error.deleteworkflow.locked.by=\u0397 \u03C1\u03BF\u03AE \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C0\u03BF \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 {0}. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1.
-manu.config.alt=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B4\u03B9\u03B1\u03BC\u03BF\u03C1\u03C6\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF \u03C3\u03CD\u03C3\u03C4\u03B7\u03BC\u03AC \u03C3\u03B1\u03C2
 menu.admin=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7
 menu.admin.alt=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7
 menu.advancedproperties=\u03A0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03B5\u03C2 \u03B9\u03B4\u03B9\u03CC\u03C4\u03B7\u03C4\u03B5\u03C2
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties
index 1f2fde050f1457ea075e1ff1627f08c4558a0807..3134eb03cbd60a0b9dff5f539dfd8d4ba3f2285e 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties
@@ -2,10 +2,8 @@
 bulkuserreplay.chkbx.onoff='Check box on' means 'Replay ON' and 'AJAX OFF'
 bulkuserreplay.tt=User names in separate lines (no comma, etc.)
 data.no.save=Attention\: your modifications will be lost after an OpenOlat reboot\! To save your changes permanently you have to adapt the file <code>olat.properties</code>. Future releases will provide you with the possibility to save modifications automatically.
-error.deleteworkflow.locked.by=The workflow regarding the deletion of users is being edited by user {0}. Please try again later.
 main.menu.title=Administration
 main.menu.title.alt=Administration
-manu.config.alt=Please configure your system
 menu.admin=Administration
 menu.admin.alt=Administration
 menu.advancedproperties=Advanced properties
@@ -31,6 +29,7 @@ menu.extensions.alt=List of uploaded software modules
 menu.external.tools=External tools
 menu.external.tools.alt=Integration to external tools
 menu.filesfolders=Files and folders
+menu.filesfolders.alt=Large files, version settings and more
 menu.hibernate=Database ORM
 menu.hibernate.alt=Database ORM / Hibernate
 menu.i18n=Languages
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_es.properties
index 2ea0059ca4da497b1dbc9d3196779c8f7da043a8..b23765136ef89f4e9073b411ef7f3c508ea04971 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_es.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_es.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff=Cuando la caja de comprobaci\u00F3n est\u00E1 activada se refiere a que REPLAY est\u00E1 activado y AJAX desactivado
 bulkuserreplay.tt=Nombres de usuarios en l\u00EDneas separadas
 data.no.save=Atenci\u00F3n\: \u00A1sus modificaciones ser\u00E1n perdidas despu\u00E9s de una reinicializaci\u00F3n de OLAT\! Para guardar sus cambios usted tiene que adaptar  el archivo olat.properties. Las versi\u00F3nes futuros proveer\u00E1n la posibilidad de ahorro de las modificaciones autom\u00E1ticamente.
-error.deleteworkflow.locked.by=El usuario {0} est\u00E1 borrando usuarios actualmente. Por favor int\u00E9ntelo de nuevo m\u00E1s tarde.
-manu.config.alt=Configure su sistema por favor
 menu.admin=Administraci\u00F3n
 menu.admin.alt=Administraci\u00F3n
 menu.advancedproperties=Propiedades avanzadas
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_fr.properties
index e1cfc75dc1dbefb32a764c21805a3708fa6faefb..3b8b62a2239d4dc6bd50ace4d13b0cfaa8ba170c 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_fr.properties
@@ -1,11 +1,9 @@
-#Tue Jan 07 21:59:45 CET 2020
+#Fri Jan 10 12:37:16 CET 2020
 bulkuserreplay.chkbx.onoff=Checkbox activ\u00E9e signifie Replay ON et AJAX OFF
 bulkuserreplay.tt=Nom d'utilisateur ligne par ligne (sans virgule ou similaires)
 data.no.save=Attention\: Les modifications seront perdues apr\u00E8s le red\u00E9marrage d'OLAT\! Pour enregistrer les r\u00E9glages de fa\u00E7on permanente, il faut enregistrer les modifications dans le fichier olat.properties. Dans une version future, un enregistrement automatique sera possible.
-error.deleteworkflow.locked.by=Le workfow de suppression d'utilisateurs est \u00E9dit\u00E9 en ce moment par {0}. Veuillez essayer plus tard SVP.
 main.menu.title=Administration
 main.menu.title.alt=Administration
-manu.config.alt=Veuillez configurer votre syst\u00E8me
 menu.admin=Administration
 menu.admin.alt=Administration
 menu.advancedproperties=Propri\u00E9t\u00E9s avanc\u00E9es
@@ -31,6 +29,7 @@ menu.extensions.alt=Liste des modules software t\u00E9l\u00E9charg\u00E9s
 menu.external.tools=Outils externes
 menu.external.tools.alt=Int\u00E9gration \u00E0 des outils externes
 menu.filesfolders=Fichiers et dossiers
+menu.filesfolders.alt=Fichiers volumineux, configuration des versions...
 menu.hibernate=Base de donn\u00E9es et ORM
 menu.hibernate.alt=Base de donn\u00E9es et ORM / Hibernate
 menu.i18n=Langues
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_it.properties
index b35a74bf2e91ffe8d80b415a812a799cec77c153..82b59a7cadeb3fcac7728794ba146ed4856455ba 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_it.properties
@@ -2,10 +2,8 @@
 bulkuserreplay.chkbx.onoff=Checkbox attivata significa Replay ON e AJAX OFF
 bulkuserreplay.tt=Nome d'utente linea per linea (senza virgole o simili)
 data.no.save=Attenzione\: le modifiche andranno perse in caso di un riavvio di OLAT\! Per salvare le preferenze in modo permanente \u00E8 necessario modificarle nel file olat.properties. In futuro offriremo la possibilit\u00E0 di salvarle direttamente.
-error.deleteworkflow.locked.by=Il workflow di eliminazione degli utenti viene attualmente elaborato dall'utente {0}. Riprovi pi\u00F9 tardi.
 main.menu.title=Amministrazione
 main.menu.title.alt=Amministrazione
-manu.config.alt=Configuri in Suo sistema, p.f.
 menu.admin=Amministrazione
 menu.admin.alt=Amministrazione
 menu.advancedproperties=Attributi esteso
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_jp.properties
index b86ecc63d0813d13562d2ce4cc7b55794aff2314..ceb9f1c2624bd8af49f44ca3e29cc4ae55b0a714 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_jp.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_jp.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff=\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9\u3092\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3053\u3068\u3067\u300C\u30EA\u30D7\u30EC\u30A4 ON\u300D\u304A\u3088\u3073\u300CAJAX OFF\u300D\u306B\u306A\u308A\u307E\u3059\u3002
 bulkuserreplay.tt=\u305D\u308C\u305E\u308C\u306E\u884C\u306B\u30E6\u30FC\u30B6\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044 (\u30AB\u30F3\u30DE\u3001\u305D\u306E\u4ED6\u4E0D\u8981)
 data.no.save=\u6CE8\u610F\: \u3042\u306A\u305F\u306E\u4FEE\u6B63\u306F\u3001OLAT\u306E\u518D\u8D77\u52D5\u5F8C\u3001\u5931\u308F\u308C\u307E\u3059\u3002\u5909\u66F4\u3092\u6C38\u7D9A\u7684\u306B\u4FDD\u5B58\u3059\u308B\u306B\u306F\u3001\u3042\u306A\u305F\u306F\u30D5\u30A1\u30A4\u30EB olat.properties \u3092\u9069\u7528\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u5C06\u6765\u7684\u306A\u30EA\u30EA\u30FC\u30B9\u3067\u306F\u3001\u4FEE\u6B63\u304C\u81EA\u52D5\u7684\u306B\u4FDD\u5B58\u3055\u308C\u308B\u6A5F\u80FD\u304C\u63D0\u4F9B\u3055\u308C\u308B\u4E88\u5B9A\u3067\u3059\u3002
-error.deleteworkflow.locked.by=\u30E6\u30FC\u30B6\u524A\u9664\u306B\u95A2\u3059\u308B\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u306F\u3001\u30E6\u30FC\u30B6 {0} \u306B\u3088\u3063\u3066\u7DE8\u96C6\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5F8C\u307B\u3069\u3001\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002
-manu.config.alt=\u3042\u306A\u305F\u306E\u30B7\u30B9\u30C6\u30E0\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
 menu.admin=\u7BA1\u7406
 menu.admin.alt=\u7BA1\u7406
 menu.advancedproperties=\u62E1\u5F35\u30D7\u30ED\u30D1\u30C6\u30A3
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_lt.properties
index a10c79ff13cb23f2d6c2311c7458986a4d01b906..b5a922933837687cccc9fca02709603d1d406546 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_lt.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_lt.properties
@@ -1,7 +1,6 @@
 #Fri Mar 23 15:13:55 CET 2018
 bulkuserreplay.tt=Vartotojo vardus atskirti linija
 data.no.save=D\u0117mesio\: J\u016Bs\u0173 pakeitimai bus prarasti po OLAT pakartotinio paleidimo\! Kad i\u0161saugotum\u0117te pakeitimus ilgam, J\u016Bs turite pritaikyti rinkmen\u0105 olat.properties. Naujas paleidimas suteiks Jums galimyb\u0119 i\u0161saugoti pakeitimus automati\u0161kai.
-error.deleteworkflow.locked.by=Darb\u0173 eiga d\u0117l vartotoj\u0173 panaikinimo yra redaguojama vartotojo {0}. Bandykite dar kart\u0105 v\u0117liau.
 menu.admin=Administravimas
 menu.admin.alt=Administravimas
 menu.advancedproperties=I\u0161pl\u0117stin\u0117s savyb\u0117s
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_nl_NL.properties
index 4b3de0cb2550727016a763c26a452bb5684edb9a..2aab77f23e718942a6ea2c31de843c7fce0d9065 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_nl_NL.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff='Check box on' betekent 'Replay ON' en 'AJAX OFF'
 bulkuserreplay.tt=Gebruikersnamen in gescheiden lijnen (geen komma, etc.)
 data.no.save=Opgelet\: Uw aanpassingen zullen verloren gaan na een OLAT reboot\! Om uw aanpassingen permanent op te slaan moet u het bestand <code>olat.properties</code> adapteren. Verdere uitgaves zullen u voorzien van de mogelijkheid om aanpassinen automatisch op te slaan.
-error.deleteworkflow.locked.by=De werkstroom betreffende de verwijdering van gebruikers wordt aangepast door gebruiker {0}. Gelieve het later opnieuw te proberen.
-manu.config.alt=Gelieve uw systeem te configureren
 menu.admin=Administratie
 menu.admin.alt=Administratie
 menu.advancedproperties=Geavanceerde eigendommen
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_pl.properties
index 93019bae02f97bb96eefad34d0a752efc2e4caa9..687fe629c0c5c44c8615d5ba71c93863d621e759 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_pl.properties
@@ -2,9 +2,7 @@
 bulkuserreplay.chkbx.onoff=Opcja Replay ON i AJAX OFF
 bulkuserreplay.tt=Nazwy u\u017Cytkownik\u00F3w - jeden w linii
 data.no.save=Uwaga\! Te zmiany nie zostan\u0105 zachowane po nast\u0119pnym restarcie systemu\! By zapisa\u0107 je na sta\u0142e zmodyfikuj plik olat.properties. W nast\u0119pnych wersjach OLAT ta zmiana b\u0119dzie wprowadzana automatycznie.
-error.deleteworkflow.locked.by=The workflow regarding the deletion of users is being edited by user {0}. Please try again later.
 main.menu.title=Administracja
-manu.config.alt=Skonfiguruj sw\u00F3j system
 menu.admin=Administrowanie
 menu.admin.alt=Administrowanie
 menu.advancedproperties=Zaawansowane w\u0142a\u015Bciwo\u015Bci
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_BR.properties
index e73f0a13f64c7375849240d9eb4ec65c07f18bb7..9c93306b334e3425d75fe2757ad60f4eecd678e3 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_BR.properties
@@ -2,7 +2,6 @@
 bulkuserreplay.chkbx.onoff=Checkbox no meio Replay ON e AJAX OFF
 bulkuserreplay.tt=Usernames separados por linha
 data.no.save=Aten\u00E7\u00E3o\: estas altera\u00E7\u00F5es ser\u00E3o perdidas no reboot\! Para salvar permanentemente modificar o aquivo olat.properties. No futuro as altera\u00E7\u00F5es ser\u00E3o salvas automaticamente.
-error.deleteworkflow.locked.by=O fluxo para dele\u00E7\u00E3o de usu\u00E1rios est\u00E1 sendo editado pelo usu\u00E1rio {0}. Tente novamente mais tarde.
 main.menu.title=Administra\u00E7\u00E3o
 main.menu.title.alt=Administra\u00E7\u00E3o
 manu.config.alt=Favor configure o seu sistema
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_PT.properties
index b3e0082a71e1051d160f1674d9bfcfd1f0f5d0be..38a09d1ab8480550f5d08735c3bb4b8ffd4f241d 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_PT.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_pt_PT.properties
@@ -1,5 +1,4 @@
 #Fri Mar 23 15:13:55 CET 2018
-error.deleteworkflow.locked.by=O fluxo para dele\u00E7\u00E3o de usu\u00E1rios est\u00E1 sendo editado pelo usu\u00E1rio {0}. Tente novamente mais tarde.
 menu.admin=Administra\u00E7\u00E3o
 menu.admin.alt=Administra\u00E7\u00E3o
 menu.advancedproperties=Propriedades avan\u00E7adas
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_ru.properties
index 7a5bcf65621e103d660d6b17dfbc6f4b5251eaf4..a843d8e9dfd7439d5ae5d362e6d2e8d1adc3bfe2 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_ru.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_ru.properties
@@ -2,7 +2,6 @@
 bulkuserreplay.chkbx.onoff=\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u043E\u043A\u043E\u0448\u043A\u043E \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 \u043E\u0437\u043D\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043E \u0412\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u0430 AJAX \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D
 bulkuserreplay.tt=\u0418\u043C\u0435\u043D\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u0441\u0442\u0440\u043E\u0447\u043A\u0430 \u0437\u0430 \u0441\u0442\u0440\u043E\u0447\u043A\u043E\u0439 (\u0431\u0435\u0437 \u0437\u0430\u043F\u044F\u0442\u044B\u0445 \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u043E\u0434\u043E\u0431\u043D\u044B\u0445 \u0437\u043D\u0430\u043A\u043E\u0432)
 data.no.save=\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435\: \u044D\u0442\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u0435\u0440\u044F\u043D\u044B \u043F\u043E\u0441\u043B\u0435 \u043D\u043E\u0432\u043E\u0433\u043E \u0432\u0445\u043E\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 OLAT\! \u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u044D\u0442\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043F\u0435\u0440\u043C\u0430\u043D\u0435\u043D\u0442\u043D\u043E, \u0412\u044B \u0434\u043E\u043B\u0436\u043D\u044B \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0432 \u0444\u0430\u0439\u043B\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 olat.properties. \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044F\u0445 \u0441\u0438\u0441\u0442\u0435\u043C\u044B.
-error.deleteworkflow.locked.by=\u0412 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0438\u0439 \u043C\u043E\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C {0}. \u041F\u043E\u043F\u044B\u0442\u0430\u0439\u0442\u0435\u0441\u044C \u043F\u043E\u0437\u0436\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.
 manu.config.alt=\u041F\u043E\u0436\u0430\u0439\u043B\u0443\u0441\u0442\u0430, \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0412\u0430\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0443
 menu.admin=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435
 menu.admin.alt=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_sq.properties
index b680ea4adc0ac0dda33b879d5f2ef068cdd96c55..06d265b5abc8e5eb3b471c961592c0763b6e92e1 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_sq.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_sq.properties
@@ -1,6 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
 data.no.save=V\u00EBrejtje\: k\u00EBto ndryshime humben pasi q\u00EB OLAT-i t\u00EB riniset\! P\u00EBr t\u00EB ruajtur ndryshimet p\u00EBrgjithnj\u00EB ju duhet t\u00EB ndryshoni skedarin olat.properties.  N\u00EB plasimet e ardhmshme ndryshimet do t\u00EB ruhen automatikisht.
-error.deleteworkflow.locked.by=Plani i pun\u00EBs p\u00EBr fshirjen e shfryt\u00EBzuesit tani p\u00EBr tani \u00EBsht\u00EB duke u p\u00EBrpunuar nga shfryt\u00EBzuesi {0}. Provoni m\u00EB von\u00EB p\u00EBrs\u00EBri.
 menu.admin=Administrimi
 menu.admin.alt=Administrimi
 menu.advancedproperties=Tiparet e avancuara
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_CN.properties
index 3b8b1a40427115695b9741c5cadddfaac4299bf7..13762f7ed627d4f9178d23b038b46fe2c8013adc 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_CN.properties
@@ -2,7 +2,6 @@
 bulkuserreplay.chkbx.onoff=\u68C0\u67E5\u76D2\u5F00\u542F\u610F\u5473\u7740\u91CD\u590D\u5F00\u542FAJAX\uFF08\u963F\u8D3E\u514B\u65AF\uFF09\u5173\u95ED
 bulkuserreplay.tt=\u7528\u6237\u540D\u7EBF\u5206\u79BB
 data.no.save=\u6CE8\u610F\uFF1A\u5728OLAT\u91CD\u65B0\u542F\u52A8\u7684\u65F6\u5019\u4F60\u7684\u4FEE\u6539\u4F1A\u88AB\u4E22\u5931\uFF01\u5982\u679C\u8981\u6C38\u4E45\u4FDD\u5B58\u4F60\u7684\u6539\u53D8\u4F60\u5C31\u8981\u8C03\u6574\u6587\u4EF6olat.properties.\u53D1\u884C\u7684\u65B0\u7248\u672C\u4F1A\u7ED9\u4F60\u63D0\u4F9B\u5168\u81EA\u52A8\u4FDD\u5B58\u7684\u529F\u80FD\u3002
-error.deleteworkflow.locked.by=\u5220\u9664\u7528\u6237\u7684\u5DE5\u4F5C\u6D41\u7A0B\u6B63\u5728\u88AB\u7528\u6237{{0}}\u7F16\u8F91,\u8BF7\u7A0D\u540E\u518D\u8BD5\u3002
 manu.config.alt=\u8BF7\u914D\u7F6E\u4F60\u7684\u7CFB\u7EDF\u73AF\u5883
 menu.admin=\u7BA1\u7406
 menu.admin.alt=\u7BA1\u7406
diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_TW.properties
index 301e96b3acb7e79e3e3f44bcdd4796cc4573250e..912a0b80d5f5e36f1d9706fc7e03cdd76757ef38 100644
--- a/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_TW.properties
+++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_zh_TW.properties
@@ -2,8 +2,6 @@
 bulkuserreplay.chkbx.onoff=\u6838\u9078\u6846\u6709\u52FE\u9078\u8868\u793A\u91CD\u64AD\u958B\u555F\u548C AJAX \u95DC\u9589
 bulkuserreplay.tt=\u4F7F\u7528\u8005\u540D\u7A31\u5206\u9694\u7DDA
 data.no.save=\u6CE8\u610F\: \u60A8\u7684\u4FEE\u6539\u5C07\u5728 OLAT \u91CD\u958B\u4E4B\u5F8C\u6D88\u5931\uFF01\u8981\u6C38\u4E45\u5132\u5B58\u60A8\u7684\u8B8A\u66F4\uFF0C\u60A8\u5FC5\u9808\u6539\u5BEB\u6A94\u6848 olat.properties\u3002\u672A\u4F86\u7684\u7248\u672C\u5C07\u6703\u63D0\u4F9B\u60A8\u81EA\u52D5\u5132\u5B58\u4FEE\u6539\u7684\u53EF\u80FD\u3002
-error.deleteworkflow.locked.by=\u95DC\u65BC\u522A\u9664\u4F7F\u7528\u8005\u7684\u5DE5\u4F5C\u6D41\u7A0B\u6B63\u88AB\u4F7F\u7528\u8005 {0} \u7DE8\u8F2F\u4E2D\u3002\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002
-manu.config.alt=\u8ACB\u8A2D\u5B9A\u60A8\u7684\u7CFB\u7D71
 menu.admin=\u7CFB\u7D71\u7BA1\u7406
 menu.admin.alt=\u7CFB\u7D71\u7BA1\u7406
 menu.advancedproperties=\u9032\u968E\u5C6C\u6027
diff --git a/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java b/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java
index 124150d74dd54bf87768bfe1ed36b43c85ad960d..03c628e6c23f18d29e9cc106d55762816f0d4500 100644
--- a/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java
+++ b/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java
@@ -136,7 +136,8 @@ public class LargeFilesController extends FormBasicController implements Extende
 			maxResults = Integer.parseInt(maxResultEl.getValue());
 		}
 		if(StringHelper.containsNonWhitespace(minSizeEl.getValue())) {
-			minSize = Integer.parseInt(minSizeEl.getValue());
+			minSize = (int) (Double.parseDouble(minSizeEl.getValue()) * Formatter.BYTE_UNIT * Formatter.BYTE_UNIT);
+			System.out.println(minSize);
 		}
 		if(StringHelper.containsNonWhitespace(downloadCountMinEl.getValue())) {
 			downloadCountMin = Integer.parseInt(downloadCountMinEl.getValue());
@@ -219,7 +220,7 @@ public class LargeFilesController extends FormBasicController implements Extende
 		lockedAtNewerChooser.reset();
 		lockedAtOlderChooser.reset();
 		editedAtNewerChooser.reset();
-		editedAtOlderChooser.reset();
+		editedAtOlderChooser.reset();	
 		revisionCountMinEl.reset();
 		downloadCountMinEl.reset();
 		trashedSelection.reset();
@@ -442,7 +443,7 @@ public class LargeFilesController extends FormBasicController implements Extende
 
 		if(minSizeEl.getValue() != "") {
 			try {
-				if(Integer.parseInt(minSizeEl.getValue()) <= 0) {
+				if(Double.parseDouble(minSizeEl.getValue()) <= 0) {
 					minSizeEl.setErrorKey("largefiles.filter.error.small", null);
 					allOK &= false;
 				}
diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
index 8023ce10b1d71d5fa61a76107ef2f2a61c6c1c84..f63248f0ad20f867506387cb0e9114dbca4f1dfe 100644
--- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
@@ -21,6 +21,11 @@ error.number=Fehlernummer
 error.retrieve=Fehler suchen
 error.title=Fehlermeldung suchen
 errors=Fehler
+filesfolders.menu.deletedFiles=Gel\u00f6schte Dateien
+filesfolders.menu.versions=Versionen
+filesfolders.menu.quota=Quotas
+filesfolders.menu.largefiles=Gro\u00dfe Dateien
+filesfolders.menu.overview=\u00dcberblick
 filesystemtest=Dateisystem Test (Verteilte File Tests mit write/read f\u00FCr clustering). Wichtig nicht auf produktiven Systemen starten, kann zu Performance Problemen f\u00FChren\! 
 filesystemtest.call.fs.sync.label=Aufruf von 'File-Descriptor.sync( )' nach File.close( ) 
 filesystemtest.check.with.retries.label=Mehrere Versuche beim Datei-Check erlaubt (Warten bis Datei vorhanden, max ...)
@@ -78,6 +83,64 @@ java.thread.interrupted=Unterbrochen
 java.thread.name=Name
 java.threads=Threads
 java.threads.title=Gleichzeitige Threads
+largefiles.age=Alter
+largefiles.author=Autor
+largefiles.comment=Kommentar
+largefiles.createdat=Erstellt am
+largefiles.creator=Ersteller
+largefiles.downloads=Downloads
+largefiles.filecategory=Kategorie
+largefiles.filetype=Typ
+largefiles.filter.button.reset=Reset
+largefiles.filter.button.search=Suche
+largefiles.filter.created.newer=Datei neuer als
+largefiles.filter.created.older=Datei \u00e4lter als
+largefiles.filter.download.count.min=Downlods Anzahl min
+largefiles.filter.edited.newer=Bearbeitet neuer als
+largefiles.filter.edited.older=Bearbeitet \u00e4lter als
+largefiles.filter.error.letter=Gib eine Zahl gr\u00f6\u00dfer 0 ein
+largefiles.filter.error.small=Gib eine Zahl gr\u00f6\u00dfer 0 ein
+largefiles.filter.locked.both=Beide
+largefiles.filter.locked.newer=Gesperrt neuer als
+largefiles.filter.locked.not=Nur nicht gesperrte
+largefiles.filter.locked.older=Gesperrt \u00e4lter als
+largefiles.filter.locked.only=Nur gesperrte
+largefiles.filter.locked=Gesperrt
+largefiles.filter.name=Name
+largefiles.filter.results.max=Max. Anzahl Ergebnisse
+largefiles.filter.revision.both=Beide
+largefiles.filter.revision.count.min=Min. Anzahl Versionen
+largefiles.filter.revision.not=Nur Dateien
+largefiles.filter.revision.only=Nur Versionen
+largefiles.filter.revision=Version
+largefiles.filter.size.min=Min. Gr\u00f6\u00dfe (MB)
+largefiles.filter.trashed.both=Beide
+largefiles.filter.trashed.not=Nicht gel\u00f6scht
+largefiles.filter.trashed.only=Nur gel\u00f6scht
+largefiles.filter.trashed=Gel\u00f6scht
+largefiles.id=ID
+largefiles.language=Sprache
+largefiles.lastmodifiedat=Zuletzt bearbeitet
+largefiles.license=Lizenz
+largefiles.locked=Gesperrt
+largefiles.lockedat=Gesperrt am
+largefiles.lockedby=Gesperrt von
+largefiles.mail.end=<br>Liebe Gr\u00fc\u00dfe<br>IT Administration
+largefiles.mail.start=<p>*** Das ist eine automatische Nachricht. Bitte nicht auf diese Nachricht antworten ***</p><p>Hallo {0},</p><p>es gitb einige gro\u00dfe Dateien in deinem Verzeichnis. Bite entferne folgende Dateien innerhalb der n\u00e4chsten 30 Tage.</p>
+largefiles.name=Name
+largefiles.path=Pfad
+largefiles.publishedAt=Ver\u00f6ffetlicht am
+largefiles.publisher=Herausgeber
+largefiles.revision=Version
+largefiles.revisioncomment=Versionskommentar
+largefiles.revisionnr=Versionsnummer
+largefiles.sendmail=E-Mail absenden
+largefiles.size=Gr\u00f6\u00dfe
+largefiles.source=Quelle
+largefiles.title=Dateisystem Statistiken
+largefiles.title=Gro\u00dfe Dateien
+largefiles.trashed=Gel\u00f6scht
+largefiles.uuid=UUID
 lock.aquiretime=Zeitsperrung
 lock.key=Sperrung
 lock.owner=Benutzersperrung
diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties
index 8c2fe9a2688256b0a14b98fb2363b1b47ee4df95..b07c6583292b996134e36a4337605e139af94f46 100644
--- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties
@@ -83,64 +83,64 @@ java.thread.interrupted=Interrupted
 java.thread.name=Name
 java.threads=Threads
 java.threads.title=Current threads
-largefiles.title=File System Statistics
-largefiles.id=ID
-largefiles.name=Name
-largefiles.size=Size
-largefiles.author=Author
-largefiles.path=Path
 largefiles.age=Age
-largefiles.revision=Revision
-largefiles.filetype=Type
-largefiles.filecategory=Category
-largefiles.license=License
-largefiles.createdat=Created
-largefiles.lastmodifiedat=Last modified
-largefiles.trashed=Trashed
-largefiles.uuid=UUID
-largefiles.downloads=Downloads
-largefiles.title=Large files
+largefiles.author=Author
 largefiles.comment=Comment
-largefiles.publisher=Publisher
+largefiles.createdat=Created
 largefiles.creator=Creator
-largefiles.source=Source
-largefiles.sendmail=Send mail
-largefiles.publishedAt=Pubished at
-largefiles.language=Language
-largefiles.locked=Locked
-largefiles.lockedby=Locked by
-largefiles.lockedat=Locked at
-largefiles.revisionnr=Revision Nr
-largefiles.revisioncomment=Revision Comment
-largefiles.filter.name=Name
-largefiles.filter.trashed=Trashed
-largefiles.filter.trashed.only=Trashed
-largefiles.filter.trashed.not=Not trashed
-largefiles.filter.trashed.both=Both
-largefiles.filter.revision=Revision
-largefiles.filter.revision.only=Revisions only
-largefiles.filter.revision.not=Files only
-largefiles.filter.revision.both=Both
-largefiles.filter.locked.only=Locked only
-largefiles.filter.locked.not=Not locked only
-largefiles.filter.locked.both=Both
+largefiles.downloads=Downloads
+largefiles.filecategory=Category
+largefiles.filetype=Type
+largefiles.filter.button.reset=Reset
+largefiles.filter.button.search=Search
 largefiles.filter.created.newer=File newer than
 largefiles.filter.created.older=File older than
+largefiles.filter.download.count.min=Download count min
 largefiles.filter.edited.newer=Edited newer than
 largefiles.filter.edited.older=Edited older than
+largefiles.filter.error.letter=Enter a numeric value greater than 0
+largefiles.filter.error.small=Enter a value greater than 0
+largefiles.filter.locked.both=Both
 largefiles.filter.locked.newer=Locked newer than
+largefiles.filter.locked.not=Not locked only
 largefiles.filter.locked.older=Locked older than
-largefiles.filter.revision.count.min=Revision count min
-largefiles.filter.download.count.min=Download count min
-largefiles.filter.button.reset=Reset
-largefiles.filter.button.search=Search
-largefiles.filter.results.max=Results max
+largefiles.filter.locked.only=Locked only
 largefiles.filter.locked=Locked
-largefiles.filter.size.min=Size min
-largefiles.filter.error.small=Enter a value greater than 0
-largefiles.filter.error.letter=Enter a numeric value greater than 0
-largefiles.mail.start=<p>*** This is an automatically generated message. Please do not answer to this message ***</p><p>Dear {0},</p><p>here are large files in your personal folder. Please remove them within the next 30 days.</p>
+largefiles.filter.name=Name
+largefiles.filter.results.max=Results max
+largefiles.filter.revision.both=Both
+largefiles.filter.revision.count.min=Revision count min
+largefiles.filter.revision.not=Files only
+largefiles.filter.revision.only=Revisions only
+largefiles.filter.revision=Revision
+largefiles.filter.size.min=Size min (MB)
+largefiles.filter.trashed.both=Both
+largefiles.filter.trashed.not=Not trashed
+largefiles.filter.trashed.only=Trashed
+largefiles.filter.trashed=Trashed
+largefiles.id=ID
+largefiles.language=Language
+largefiles.lastmodifiedat=Last modified
+largefiles.license=License
+largefiles.locked=Locked
+largefiles.lockedat=Locked at
+largefiles.lockedby=Locked by
 largefiles.mail.end=<br>Best regards<br>Your administration team
+largefiles.mail.start=<p>*** This is an automatically generated message. Please do not answer to this message ***</p><p>Dear {0},</p><p>here are large files in your personal folder. Please remove them within the next 30 days.</p>
+largefiles.name=Name
+largefiles.path=Path
+largefiles.publishedAt=Pubished at
+largefiles.publisher=Publisher
+largefiles.revision=Revision
+largefiles.revisioncomment=Revision Comment
+largefiles.revisionnr=Revision Nr
+largefiles.sendmail=Send mail
+largefiles.size=Size
+largefiles.source=Source
+largefiles.title=File System Statistics
+largefiles.title=Large files
+largefiles.trashed=Trashed
+largefiles.uuid=UUID
 lock.aquiretime=Lock time
 lock.key=Lock
 lock.owner=Lock user
diff --git a/src/main/java/org/olat/core/commons/services/commentAndRating/manager/UserCommentsDAO.java b/src/main/java/org/olat/core/commons/services/commentAndRating/manager/UserCommentsDAO.java
index 1cc11bab16bc910ea22de2c238582534b092102a..47410e91a24d37cc606f4ca535e53b11819ac0d4 100644
--- a/src/main/java/org/olat/core/commons/services/commentAndRating/manager/UserCommentsDAO.java
+++ b/src/main/java/org/olat/core/commons/services/commentAndRating/manager/UserCommentsDAO.java
@@ -30,6 +30,7 @@ import javax.persistence.TypedQuery;
 
 import org.olat.basesecurity.IdentityRef;
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.persistence.QueryBuilder;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingLoggingAction;
 import org.olat.core.commons.services.commentAndRating.UserCommentsDelegate;
 import org.olat.core.commons.services.commentAndRating.model.UserComment;
@@ -100,19 +101,25 @@ public class UserCommentsDAO {
 	}
 
 	public List<UserComment> getComments(OLATResourceable ores, String resSubPath) {
-		TypedQuery<UserComment> query;
+		QueryBuilder sb = new QueryBuilder(512);
+		sb.append("select comment from usercomment as comment")
+		  .append(" left join fetch comment.creator as creatorIdent")
+		  .append(" left join fetch creatorIdent.user as creatorUser")
+		  .append(" where resName=:resname and resId=:resId");
 		if (resSubPath == null) {
-			// special query when sub path is null
-			query = dbInstance.getCurrentEntityManager()
-					.createQuery("select comment from usercomment as comment where resName=:resname AND resId=:resId AND resSubPath is NULL", UserComment.class);
+			sb.append(" and resSubPath is null");
 		} else {
-			query = dbInstance.getCurrentEntityManager()
-					.createQuery("select comment from usercomment as comment where resName=:resname AND resId=:resId AND resSubPath=:resSubPath", UserComment.class)
-					.setParameter("resSubPath", resSubPath);
+			sb.append(" and resSubPath=:resSubPath");
 		}
-		return query.setParameter("resname", ores.getResourceableTypeName())
-		     .setParameter("resId", ores.getResourceableId())
-		     .getResultList();
+
+		TypedQuery<UserComment> query = dbInstance.getCurrentEntityManager()
+					.createQuery(sb.toString(), UserComment.class)
+					.setParameter("resname", ores.getResourceableTypeName())
+				    .setParameter("resId", ores.getResourceableId());
+		if(resSubPath != null) {
+			query.setParameter("resSubPath", resSubPath);
+		}
+		return query.getResultList();
 	}
 	
 	public List<UserComment> getComments(IdentityRef identity) {
diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java b/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java
index 1273a14b3fadf610c210e0e755478d9c76289695..32fc194736fe841cb179530ae9e83b2b26c54c1e 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java
@@ -25,6 +25,9 @@ import java.util.Date;
 import java.util.List;
 
 import org.olat.core.commons.services.license.License;
+import org.olat.core.commons.services.vfs.model.VFSFileStatistics;
+import org.olat.core.commons.services.vfs.model.VFSRevisionStatistics;
+import org.olat.core.commons.services.vfs.model.VFSThumbnailStatistics;
 import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -257,11 +260,11 @@ public interface VFSRepositoryService {
 	
 	public License getOrCreateLicense(VFSMetadata meta, Identity itentity);
 	
-	public Object[] getFileStats(); 
+	public VFSFileStatistics getFileStats(); 
 	
-	public Object[] getRevisionStats(); 
+	public VFSRevisionStatistics getRevisionStats(); 
 	
-	public Object[] getThumbnailStats(); 
+	public VFSThumbnailStatistics getThumbnailStats(); 
 	
 	/**
 	 * Returns the largest files from the VFS
diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
index 117f89f286ad1fa184bd4712936526eb7c8eb76b..264111e6721e1bc6f90796b843baa5506b8b009d 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
@@ -71,8 +71,11 @@ import org.olat.core.commons.services.vfs.VFSRevisionRef;
 import org.olat.core.commons.services.vfs.VFSThumbnailMetadata;
 import org.olat.core.commons.services.vfs.VFSVersionModule;
 import org.olat.core.commons.services.vfs.manager.MetaInfoReader.Thumbnail;
+import org.olat.core.commons.services.vfs.model.VFSFileStatistics;
 import org.olat.core.commons.services.vfs.model.VFSMetadataImpl;
 import org.olat.core.commons.services.vfs.model.VFSRevisionImpl;
+import org.olat.core.commons.services.vfs.model.VFSRevisionStatistics;
+import org.olat.core.commons.services.vfs.model.VFSThumbnailStatistics;
 import org.olat.core.gui.control.Event;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
@@ -1461,17 +1464,17 @@ public class VFSRepositoryServiceImpl implements VFSRepositoryService, GenericEv
 	}
 	
 	@Override 
-	public Object[] getFileStats() {
+	public VFSFileStatistics getFileStats() {
 		return statsDao.getFileStats();
 	}
 	
 	@Override 
-	public Object[] getRevisionStats() {
+	public VFSRevisionStatistics getRevisionStats() {
 		return statsDao.getRevisionStats();
 	}
 	
 	@Override 
-	public Object[] getThumbnailStats() {
+	public VFSThumbnailStatistics getThumbnailStats() {
 		return statsDao.getThumbnailStats();
 	}
 }
diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAO.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAO.java
index 780a1b5bdab44f5a6934dca2397e780b8a2ce422..c4aa083165e460588577017286e5ea5d5af4281b 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAO.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAO.java
@@ -22,6 +22,9 @@ package org.olat.core.commons.services.vfs.manager;
 import java.util.List;
 
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.services.vfs.model.VFSFileStatistics;
+import org.olat.core.commons.services.vfs.model.VFSRevisionStatistics;
+import org.olat.core.commons.services.vfs.model.VFSThumbnailStatistics;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -37,47 +40,51 @@ public class VFSStatsDAO {
 	@Autowired
 	private DB dbInstance;
 	
-	// TODO list array to object
-	// TODO Unit test 
-	public Object[] getFileStats() {
+	public VFSFileStatistics getFileStats() {
 		StringBuilder sb = new StringBuilder(256);
-		sb.append("select sum(case when metadata.deleted = false then 1 else 0 end) as filesAmount,");
+		sb.append("select new org.olat.core.commons.services.vfs.model.VFSFileStatistics(");
+		sb.append(" sum(case when metadata.deleted = false then 1 else 0 end) as filesAmount,");
 		sb.append(" sum(metadata.fileSize) as filesSize,");
 		sb.append(" sum(case when metadata.deleted = true then 1 else 0 end) as trashAmount,");
 		sb.append(" sum(case when metadata.deleted = true then metadata.fileSize else 0 end) as trashSize");
+		sb.append(")");
 		sb.append(" from filemetadata as metadata");
 		sb.append(" where metadata.directory = false");
 		
-		List<Object[]> filesAmount = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Object[].class)
+		List<VFSFileStatistics> queryResult = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), VFSFileStatistics.class)
 				.getResultList();
 		
-		return !filesAmount.isEmpty() ? filesAmount.get(0): null;
+		return queryResult.isEmpty() ? new VFSFileStatistics() : queryResult.get(0);
 	}
 	
-	public Object[] getRevisionStats() {
+	public VFSRevisionStatistics getRevisionStats() {
 		StringBuilder sb = new StringBuilder(256);
-		sb.append("select count(revision.key) as revisionAmount,");
+		sb.append("select new org.olat.core.commons.services.vfs.model.VFSRevisionStatistics(");
+		sb.append(" count(revision.key) as revisionAmount,");
 		sb.append(" sum(revision.size) as revisionSize");
+		sb.append(")");
 		sb.append(" from vfsrevision as revision");
 		
-		List<Object[]> filesAmount = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Object[].class)
+		List<VFSRevisionStatistics> queryResult = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), VFSRevisionStatistics.class)
 				.getResultList();
 		
-		return !filesAmount.isEmpty() ? filesAmount.get(0) : null;
+		return queryResult.isEmpty() ? new VFSRevisionStatistics() : queryResult.get(0);
 	}
 	
-	public Object[] getThumbnailStats() {
+	public VFSThumbnailStatistics getThumbnailStats() {
 		StringBuilder sb = new StringBuilder(256);
-		sb.append("select count(thumbnail.key) as thumbnailAmount,");
+		sb.append("select new org.olat.core.commons.services.vfs.model.VFSThumbnailStatistics(");
+		sb.append(" count(thumbnail.key) as thumbnailAmount,");
 		sb.append(" sum(thumbnail.fileSize) as thumbnailSize");
+		sb.append(")");
 		sb.append(" from vfsthumbnail as thumbnail");
 		
-		List<Object[]> filesAmount = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Object[].class)
+		List<VFSThumbnailStatistics> queryResult = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), VFSThumbnailStatistics.class)
 				.getResultList();
 		
-		return !filesAmount.isEmpty() ? filesAmount.get(0) : null;
+		return queryResult.isEmpty() ? new VFSThumbnailStatistics() : queryResult.get(0);
 	}
 }
diff --git a/src/main/java/org/olat/core/commons/services/vfs/model/VFSFileStatistics.java b/src/main/java/org/olat/core/commons/services/vfs/model/VFSFileStatistics.java
new file mode 100644
index 0000000000000000000000000000000000000000..b383f9bffa1ac59a36d7e7b2062b6ed7405a5e1d
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/vfs/model/VFSFileStatistics.java
@@ -0,0 +1,64 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.commons.services.vfs.model;
+
+/**
+ * 
+ * Initial date: 10 Jan 2020<br>
+ * @author aboeckle, alexander.boeckle@frentix.com, http://www.frentix.com
+ *
+ */
+public class VFSFileStatistics {
+
+	private Long filesAmount;
+	private Long filesSize;
+	private Long trashAmount;
+	private Long trashSize;
+
+	public VFSFileStatistics() {
+		filesAmount = Long.valueOf(0);
+		filesSize = Long.valueOf(0);
+		trashAmount = Long.valueOf(0);
+		trashSize = Long.valueOf(0);
+	}
+
+	public VFSFileStatistics(Long filesAmount, Long filesSize, Long trashAmount, Long trashSize) {
+		this.filesAmount = filesAmount;
+		this.filesSize = filesSize;
+		this.trashAmount = trashAmount;
+		this.trashSize = trashSize;
+	}
+	
+	public long getFilesAmount() {
+		return filesAmount == null ? 0 : filesAmount.longValue();
+	}
+
+	public long getFilesSize() {
+		return filesSize == null ? 0 : filesSize.longValue();
+	}
+
+	public long getTrashAmount() {
+		return trashAmount == null ? 0 : trashAmount.longValue();
+	}
+
+	public long getTrashSize() {
+		return trashSize == null ? 0 : trashSize.longValue();
+	}
+}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/model/VFSRevisionStatistics.java b/src/main/java/org/olat/core/commons/services/vfs/model/VFSRevisionStatistics.java
new file mode 100644
index 0000000000000000000000000000000000000000..552d6ed483b90194351a90b36edf92d909d0f6d4
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/vfs/model/VFSRevisionStatistics.java
@@ -0,0 +1,50 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.commons.services.vfs.model;
+
+/**
+ * 
+ * Initial date: 10 Jan 2020<br>
+ * @author aboeckle, alexander.boeckle@frentix.com, http://www.frentix.com
+ *
+ */
+public class VFSRevisionStatistics {
+
+	private Long revisionsAmount;
+	private Long revisionsSize;
+
+	public VFSRevisionStatistics() {
+		revisionsAmount = Long.valueOf(0);
+		revisionsSize = Long.valueOf(0);
+	}
+	
+	public VFSRevisionStatistics(Long revisionsAmount, Long revisionsSize) {
+		this.revisionsAmount = revisionsAmount;
+		this.revisionsSize = revisionsSize;
+	}
+	
+	public long getRevisionsAmount() {
+		return revisionsAmount == null ? 0 : revisionsAmount.longValue();
+	}
+
+	public long getRevisionsSize() {
+		return revisionsSize == null ? 0 : revisionsSize.longValue();
+	}
+}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/model/VFSThumbnailStatistics.java b/src/main/java/org/olat/core/commons/services/vfs/model/VFSThumbnailStatistics.java
new file mode 100644
index 0000000000000000000000000000000000000000..1eac116b850ddf4199e26957fa72185c97e7b879
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/vfs/model/VFSThumbnailStatistics.java
@@ -0,0 +1,50 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.commons.services.vfs.model;
+
+/**
+ * 
+ * Initial date: 10 Jan 2020<br>
+ * @author aboeckle, alexander.boeckle@frentix.com, http://www.frentix.com
+ *
+ */
+public class VFSThumbnailStatistics {
+
+	private Long thumbnailsAmount;
+	private Long thumbnailsSize;
+
+	public VFSThumbnailStatistics() {
+		thumbnailsAmount = Long.valueOf(0);
+		thumbnailsSize = Long.valueOf(0);
+	}
+	
+	public VFSThumbnailStatistics(Long thumbnailsAmount, Long thumbnailsSize) {
+		this.thumbnailsAmount = thumbnailsAmount;
+		this.thumbnailsSize = thumbnailsSize;
+	}
+	
+	public long getThumbnailsAmount() {
+		return thumbnailsAmount == null ? 0 : thumbnailsAmount.longValue();
+	}
+
+	public long getThumbnailsSize() {
+		return thumbnailsSize == null ? 0 : thumbnailsSize.longValue();
+	}
+}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/management/VFSOverviewController.java b/src/main/java/org/olat/core/commons/services/vfs/ui/management/VFSOverviewController.java
index 8a92a52d71a3ba80db4e363b5a389d90b700563a..e9d5121e52b97e2e308ba34c2661fca150b5a721 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/management/VFSOverviewController.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/ui/management/VFSOverviewController.java
@@ -26,6 +26,9 @@ import java.util.List;
 import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
+import org.olat.core.commons.services.vfs.model.VFSFileStatistics;
+import org.olat.core.commons.services.vfs.model.VFSRevisionStatistics;
+import org.olat.core.commons.services.vfs.model.VFSThumbnailStatistics;
 import org.olat.core.commons.services.vfs.ui.management.VFSOverviewTableModel.VFSOverviewColumns;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -85,14 +88,14 @@ public class VFSOverviewController extends FormBasicController {
 	public void updateModel() {
 		List<VFSOverviewTableContentRow> rows = new ArrayList<>();
 		
-		Object[] fileStats = vfsRepositoryService.getFileStats();
-		Object[] revisionStats = vfsRepositoryService.getRevisionStats();
-		Object[] thumbnailStats = vfsRepositoryService.getThumbnailStats();
-
-		rows.add(new VFSOverviewTableContentRow("vfs.overview.files", (Long) fileStats[0], (Long) fileStats[1], largeFilesLink));
-		rows.add(new VFSOverviewTableContentRow("vfs.overview.versions", (Long) revisionStats[0], (Long) revisionStats[1], versionsLink));
-		rows.add(new VFSOverviewTableContentRow("vfs.overview.trash", (Long) fileStats[2], (Long) fileStats[3], trashLink));
-		rows.add(new VFSOverviewTableContentRow("vfs.overview.thumbnails", (Long) thumbnailStats[0], (Long) thumbnailStats[1], thumbnailLink));
+		VFSFileStatistics fileStats = vfsRepositoryService.getFileStats();
+		VFSRevisionStatistics revisionStats = vfsRepositoryService.getRevisionStats();
+		VFSThumbnailStatistics thumbnailStats = vfsRepositoryService.getThumbnailStats();
+
+		rows.add(new VFSOverviewTableContentRow("vfs.overview.files", fileStats.getFilesAmount(), fileStats.getFilesSize(), largeFilesLink));
+		rows.add(new VFSOverviewTableContentRow("vfs.overview.versions", revisionStats.getRevisionsAmount(), revisionStats.getRevisionsSize(), versionsLink));
+		rows.add(new VFSOverviewTableContentRow("vfs.overview.trash", fileStats.getTrashAmount(), fileStats.getTrashSize(), trashLink));
+		rows.add(new VFSOverviewTableContentRow("vfs.overview.thumbnails", thumbnailStats.getThumbnailsAmount(), thumbnailStats.getThumbnailsSize(), thumbnailLink));
 
 		vfsOverviewTableElement.setFooter(true);
 		vfsOverviewTableModel.setObjects(rows);
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_de.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f6dac85de99c2a2d8006a5bbe1dd98af0a0e0f53
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_de.properties
@@ -0,0 +1,16 @@
+vfs.overview.action=Aktion
+vfs.overview.amount=Anzahl
+vfs.overview.files=Dateien
+vfs.overview.fileslink=Zeige gro\u00dfe Dateien
+vfs.overview.name=Name
+vfs.overview.size=Gr\u00f6\u00dfe
+vfs.overview.thumbnaillink=Miniaturansichten zur\u00fccksetzen
+vfs.overview.thumbnails.reset.confirm=Alle Miniaturansichten zur\u00fccksetzen?
+vfs.overview.thumbnails.reset.title=Miniaturansichten zur\u00fccksetzen
+vfs.overview.thumbnails=Miniaturansichten
+vfs.overview.title=Zusammenfassung
+vfs.overview.total=Gesamt
+vfs.overview.trash=Gel\u00f6scht
+vfs.overview.trashlink=Zeige gel\u00f6schte Dateien
+vfs.overview.versions=Versionen
+vfs.overview.versionslink=Zeige Versionseinstellungen
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_en.properties
index 013d924db3fb77c798b1efeda583bf74082768d9..48896144114a079f748d9b5ae683d8cce4019116 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/commons/services/vfs/ui/management/_i18n/LocalStrings_en.properties
@@ -1,16 +1,16 @@
-vfs.overview.title=Overview
-vfs.overview.name=Name
-vfs.overview.size=Size
-vfs.overview.amount=Amount
 vfs.overview.action=Action
+vfs.overview.amount=Amount
 vfs.overview.files=Files
-vfs.overview.versions=Versions
+vfs.overview.fileslink=Show large files
+vfs.overview.name=Name
+vfs.overview.size=Size
+vfs.overview.thumbnaillink=Reset thumbnails
+vfs.overview.thumbnails.reset.confirm=Do you want to reset all current thumbnails?
+vfs.overview.thumbnails.reset.title=Reset thumbnails
 vfs.overview.thumbnails=Thumbnails
+vfs.overview.title=Overview
 vfs.overview.total=Total
 vfs.overview.trash=In trash
 vfs.overview.trashlink=Show trash
-vfs.overview.versionslink=Show version settings
-vfs.overview.fileslink=Show large files
-vfs.overview.thumbnaillink=Reset thumbnails
-vfs.overview.thumbnails.reset.confirm=Do you want to reset all current thumbnails?
-vfs.overview.thumbnails.reset.title=Reset thumbnails
\ No newline at end of file
+vfs.overview.versions=Versions
+vfs.overview.versionslink=Show version settings
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/version/VFSTrashController.java b/src/main/java/org/olat/core/commons/services/vfs/ui/version/VFSTrashController.java
index 9dbb084e4f5c45db65e065d48d8b2b9c2850c52e..59821e12874556d9f96b2a3448a1d32d2a00801e 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/version/VFSTrashController.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/ui/version/VFSTrashController.java
@@ -19,26 +19,40 @@
  */
 package org.olat.core.commons.services.vfs.ui.version;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.olat.admin.SystemAdminMainController;
+import org.olat.core.commons.modules.bc.commands.FolderCommand;
 import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSMetadataRef;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.commons.services.vfs.VFSRevision;
 import org.olat.core.commons.services.vfs.VFSVersionModule;
+import org.olat.core.commons.services.vfs.model.VFSRevisionRefImpl;
+import org.olat.core.commons.services.vfs.ui.component.BytesCellRenderer;
+import org.olat.core.commons.services.vfs.ui.version.VersionsDeletedFileDataModel.VersionsDeletedCols;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
+import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.elements.StaticTextElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.progressbar.ProgressController;
 import org.olat.core.gui.control.Controller;
@@ -69,7 +83,6 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 	
 	private FormLink pruneLink;
 	private FormLink cleanUpLink;
-	private FormLink showOrphanLink;
 	private StaticTextElement orphanSizeEl;
 	private StaticTextElement versionsSizeEl;
 	
@@ -77,7 +90,12 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 	private ProgressController progressCtrl;
 	private DialogBoxController confirmPruneHistoryBox;
 	private DialogBoxController confirmDeleteOrphansBox;
-	private VersionsDeletedFileController orphansController; 
+	
+	private FormLink orphansDeleteButton;
+	private FlexiTableElement orphansListTableEl;
+	private VersionsDeletedFileDataModel versionsDeletedFileDataModel;
+	
+	private DialogBoxController dialogCtr;
 	
 	@Autowired
 	private DB dbInstance;
@@ -99,7 +117,8 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		FormLayoutContainer statsLayout = FormLayoutContainer.createDefaultFormLayout("orphansStats", getTranslator());
-		FormLayoutContainer tableLayout = FormLayoutContainer.createVerticalFormLayout("orphanTable", getTranslator());
+		String page = this.velocity_root + "/orphans.html";
+		FormLayoutContainer tableLayout = FormLayoutContainer.createCustomFormLayout("orphansTable", getTranslator(), page);
 		formLayout.add(statsLayout);
 		formLayout.add(tableLayout);
 		
@@ -119,10 +138,29 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 
 		
 		// Lower part
-		orphansController = new VersionsDeletedFileController(ureq, getWindowControl());			
-		listenTo(orphansController);
 		tableLayout.setFormTitle(translate("version.deletedFiles"));
-		tableLayout.add("orphansList", orphansController.getInitialFormItem());
+		
+		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, VersionsDeletedCols.id));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(VersionsDeletedCols.relativePath));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(VersionsDeletedCols.filename));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(VersionsDeletedCols.size, new BytesCellRenderer()));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("delete", translate("delete"), "delete"));
+		
+		versionsDeletedFileDataModel = new VersionsDeletedFileDataModel(columnsModel, getTranslator());
+		orphansListTableEl = uifactory.addTableElement(getWindowControl(), "orphansList", versionsDeletedFileDataModel, 24, false, getTranslator(), tableLayout);
+		orphansListTableEl.setEmtpyTableMessageKey("version.noDeletedFiles");
+		orphansListTableEl.setMultiSelect(true);
+		FlexiTableSortOptions sortOptions = new FlexiTableSortOptions(true);
+		sortOptions.setDefaultOrderBy(new SortKey(VersionsDeletedCols.size.name(), false));
+		orphansListTableEl.setSortSettings(sortOptions);
+		orphansListTableEl.setAndLoadPersistedPreferences(ureq, "deleted-rev-file-list");
+		
+		orphansDeleteButton = uifactory.addFormLink("delete", tableLayout, Link.BUTTON);
+		orphansDeleteButton.setIconLeftCSS(CSSHelper.getIconCssClassFor(CSSHelper.CSS_CLASS_TRASHED));
+		
+		tableLayout.add("orphansTable", orphansListTableEl);
+		tableLayout.add("orphansDelete", orphansDeleteButton);
 	}		
 
 	@Override
@@ -135,6 +173,14 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 		versionsSizeEl.setValue(Formatter.formatBytes(versionsSize));
 		long versionsDeletedFiles = vfsRepositoryService.getRevisionsTotalSizeOfDeletedFiles();
 		orphanSizeEl.setValue(Formatter.formatBytes(versionsDeletedFiles));
+		
+		List<VFSRevision> revisions = vfsRepositoryService.getRevisionsOfDeletedFiles();
+		List<VersionsDeletedFileRow> rows = revisions.stream()
+				.map(VersionsDeletedFileRow::new)
+				.collect(Collectors.toList());
+		versionsDeletedFileDataModel.setObjects(rows);
+		orphansListTableEl.reset(true, true, true);
+		orphansDeleteButton.setVisible(!rows.isEmpty());
 	}
 
 	@Override
@@ -149,15 +195,29 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 			}
 		} else if(source == cmc) {
 			cleanup();
+		} else if (source == dialogCtr) {
+			if (DialogBoxUIFactory.isYesEvent(event)) {	
+				@SuppressWarnings("unchecked")
+				List<VersionsDeletedFileRow> rowsToDelete =  (List<VersionsDeletedFileRow>)dialogCtr.getUserObject();
+				doDelete(rowsToDelete);
+				fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
+				loadModel();
+			}
 		}
 		super.event(ureq, source, event);
 	}
 	
+	private void doDelete(List<VersionsDeletedFileRow> rowsToDelete) {
+		for(VersionsDeletedFileRow row:rowsToDelete) {
+			VFSRevision revision = vfsRepositoryService.getRevision(new VFSRevisionRefImpl(row.getRevisionKey()));
+			vfsRepositoryService.deleteRevisions(getIdentity(), Collections.singletonList(revision));
+		}
+	}
+	
 	private void cleanup() {
-		removeAsListenerAndDispose(orphansController);
 		removeAsListenerAndDispose(cmc);
-		orphansController = null;
 		cmc = null;
+		loadModel();
 	}
 
 	@Override
@@ -173,10 +233,52 @@ public class VFSTrashController extends FormBasicController implements ProgressD
 		} else if(source == pruneLink) {
 			String text = translate("confirm.prune.history");
 			confirmPruneHistoryBox = activateYesNoDialog(ureq, null, text, confirmPruneHistoryBox);
+		} else if(orphansDeleteButton == source) {
+			doConfirmDelete(ureq);
+			loadModel();
+		} else if(orphansListTableEl == source) {
+			if(event instanceof SelectionEvent) {
+				SelectionEvent se = (SelectionEvent)event;
+				if("delete".equals(se.getCommand())) {
+					VersionsDeletedFileRow row = versionsDeletedFileDataModel.getObject(se.getIndex());
+					doConfirmDelete(ureq, Collections.singletonList(row));
+					loadModel();
+				}
+			}
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
 	
+	private void doConfirmDelete(UserRequest ureq, List<VersionsDeletedFileRow> rows) {
+		String msg = translate("version.del.confirm") + "<p>" + renderVersionsAsHtml(rows) + "</p>";
+		dialogCtr = activateYesNoDialog(ureq, translate("version.del.header"), msg, dialogCtr);
+		dialogCtr.setUserObject(rows);
+	}
+	
+	private String renderVersionsAsHtml(List<VersionsDeletedFileRow> rows) {
+		StringBuilder sb = new StringBuilder(256);
+		sb.append("<ul>");
+		for (VersionsDeletedFileRow row:rows) {
+			sb.append("<li>").append(row.getFilename()).append("</li>");
+		}
+		sb.append("</ul>");
+		return sb.toString();
+	}
+	
+	private void doConfirmDelete(UserRequest ureq) {
+		Set<Integer> selectedIndexes = orphansListTableEl.getMultiSelectedIndex();
+		List<VersionsDeletedFileRow> rowsToDelete = new ArrayList<>(selectedIndexes.size());
+		for(Integer selectedIndex:selectedIndexes) {
+			VersionsDeletedFileRow row = versionsDeletedFileDataModel.getObject(selectedIndex.intValue());
+			if(row != null) {
+				rowsToDelete.add(row);
+			}
+		}
+		if(!rowsToDelete.isEmpty()) {
+			doConfirmDelete(ureq, rowsToDelete);
+		}
+	}
+	
 	private void doDeleteOrphans(UserRequest ureq) {
 		final List<VFSMetadataRef> deleted = vfsRepositoryService.getMetadataOfDeletedFiles();
 		
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/version/VersionMaintenanceForm.java b/src/main/java/org/olat/core/commons/services/vfs/ui/version/VersionMaintenanceForm.java
deleted file mode 100644
index e1747f51c40ea7ec4946f97de1472d8bde2f6a40..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/version/VersionMaintenanceForm.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * <a href="http://www.openolat.org">
- * OpenOLAT - Online Learning and Training</a><br>
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); <br>
- * you may not use this file except in compliance with the License.<br>
- * You may obtain a copy of the License at the
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
- * <p>
- * Unless required by applicable law or agreed to in writing,<br>
- * software distributed under the License is distributed on an "AS IS" BASIS, <br>
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
- * See the License for the specific language governing permissions and <br>
- * limitations under the License.
- * <p>
- * Initial code contributed and copyrighted by<br>
- * frentix GmbH, http://www.frentix.com
- * <p>
- */
-package org.olat.core.commons.services.vfs.ui.version;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.olat.admin.SystemAdminMainController;
-import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
-import org.olat.core.commons.services.vfs.VFSMetadata;
-import org.olat.core.commons.services.vfs.VFSMetadataRef;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.VFSRevision;
-import org.olat.core.commons.services.vfs.VFSVersionModule;
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.form.flexible.FormItem;
-import org.olat.core.gui.components.form.flexible.FormItemContainer;
-import org.olat.core.gui.components.form.flexible.elements.FormLink;
-import org.olat.core.gui.components.form.flexible.elements.StaticTextElement;
-import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
-import org.olat.core.gui.components.form.flexible.impl.FormEvent;
-import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
-import org.olat.core.gui.components.link.Link;
-import org.olat.core.gui.components.progressbar.ProgressController;
-import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.Event;
-import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
-import org.olat.core.gui.control.generic.modal.DialogBoxController;
-import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
-import org.olat.core.id.Identity;
-import org.olat.core.util.Formatter;
-import org.olat.core.util.Util;
-import org.olat.core.util.async.ProgressDelegate;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * 
- * Description:<br>
- * This is a controller to configure the SimpleVersionConfig, the configuration
- * of the versioning system for briefcase.
- * 
- * <P>
- * Initial Date:  21 sept. 2009 <br>
- *
- * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
- */
-public class VersionMaintenanceForm extends FormBasicController implements ProgressDelegate {
-	
-	private FormLink pruneLink;
-	private FormLink cleanUpLink;
-	private FormLink showOrphanLink;
-	private StaticTextElement orphanSizeEl;
-	private StaticTextElement versionsSizeEl;
-	
-	private CloseableModalController cmc;
-	private ProgressController progressCtrl;
-	private DialogBoxController confirmPruneHistoryBox;
-	private DialogBoxController confirmDeleteOrphansBox;
-	private VersionsDeletedFileController orphansController; 
-	
-	@Autowired
-	private DB dbInstance;
-	@Autowired
-	private VFSVersionModule versionsModule;
-	@Autowired
-	private TaskExecutorManager taskExecutorManager;
-	@Autowired
-	private VFSRepositoryService vfsRepositoryService;
-	
-	public VersionMaintenanceForm(UserRequest ureq, WindowControl wControl) {
-		super(ureq, wControl);
-		// use combined translator from system admin main
-		setTranslator(Util.createPackageTranslator(SystemAdminMainController.class, ureq.getLocale(), getTranslator()));
-		initForm(ureq);
-		loadModel();
-	}
-	
-	@Override
-	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		// First add title and context help
-		setFormTitle("version.maintenance.title");
-		setFormDescription("version.maintenance.intro");
-		
-		versionsSizeEl = uifactory.addStaticTextElement("version.size", "version.size", "", formLayout);
-		orphanSizeEl = uifactory.addStaticTextElement("version.orphan.size", "version.orphan.size", "", formLayout);
-		
-		FormLayoutContainer buttonsLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
-		formLayout.add(buttonsLayout);
-		
-		showOrphanLink = uifactory.addFormLink("version.show.orphans", buttonsLayout, Link.BUTTON);
-		cleanUpLink = uifactory.addFormLink("version.clean.up", buttonsLayout, Link.BUTTON);
-		pruneLink = uifactory.addFormLink("version.prune.history", buttonsLayout, Link.BUTTON);
-
-		
-	}
-
-	@Override
-	protected void doDispose() {
-		//
-	}
-	
-	private void loadModel() {
-		long versionsSize = vfsRepositoryService.getRevisionsTotalSize();
-		versionsSizeEl.setValue(Formatter.formatBytes(versionsSize));
-		long versionsDeletedFiles = vfsRepositoryService.getRevisionsTotalSizeOfDeletedFiles();
-		orphanSizeEl.setValue(Formatter.formatBytes(versionsDeletedFiles));
-	}
-
-	@Override
-	protected void event(UserRequest ureq, Controller source, Event event) {
-		if(source == orphansController) {
-			cmc.deactivate();
-			cleanup();
-		} else if(source == confirmDeleteOrphansBox) {
-			if (DialogBoxUIFactory.isYesEvent(event)) {
-				doDeleteOrphans(ureq);
-			}
-		} else if(source == confirmPruneHistoryBox) {
-			if (DialogBoxUIFactory.isYesEvent(event)) {
-				doPruneHistory(ureq);
-			}
-		} else if(source == cmc) {
-			cleanup();
-		}
-		super.event(ureq, source, event);
-	}
-	
-	private void cleanup() {
-		removeAsListenerAndDispose(orphansController);
-		removeAsListenerAndDispose(cmc);
-		orphansController = null;
-		cmc = null;
-	}
-
-	@Override
-	protected void formOK(UserRequest ureq) {
-		//
-	}
-
-	@Override
-	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(source == showOrphanLink) {
-			doOpenOrphansList(ureq);
-		} else if(source == cleanUpLink) {
-			String text = translate("confirm.delete.orphans");
-			confirmDeleteOrphansBox = activateYesNoDialog(ureq, null, text, confirmDeleteOrphansBox);
-		} else if(source == pruneLink) {
-			String text = translate("confirm.prune.history");
-			confirmPruneHistoryBox = activateYesNoDialog(ureq, null, text, confirmPruneHistoryBox);
-		}
-		super.formInnerEvent(ureq, source, event);
-	}
-	
-	private void doOpenOrphansList(UserRequest ureq) {
-		if(guardModalController(orphansController)) return;
-		
-		orphansController = new VersionsDeletedFileController(ureq, getWindowControl());			
-		listenTo(orphansController);
-		
-		String title = translate("version.show.orphans");
-		cmc = new CloseableModalController(getWindowControl(), "close", orphansController.getInitialComponent(), true, title);
-		listenTo(cmc);
-		cmc.activate();
-	}
-	
-	private void doDeleteOrphans(UserRequest ureq) {
-		final List<VFSMetadataRef> deleted = vfsRepositoryService.getMetadataOfDeletedFiles();
-		
-		progressCtrl = new ProgressController(ureq, getWindowControl());
-		progressCtrl.setMessage(translate("version.clean.up"));
-		progressCtrl.setPercentagesEnabled(false);
-		progressCtrl.setUnitLabel("%");
-		progressCtrl.setActual(0.0f);
-		progressCtrl.setMax(100.0f);
-		listenTo(progressCtrl);
-		
-		taskExecutorManager.execute(() -> {
-			waitASecond();
-			deletedDeletedFilesRevisions(deleted);
-		});
-
-		synchronized(this) {
-			if(progressCtrl != null) {
-				String title = translate("version.clean.up");
-				cmc = new CloseableModalController(getWindowControl(), null, progressCtrl.getInitialComponent(), true, title, false);
-				cmc.activate();
-				listenTo(cmc);
-			}
-		}
-	}
-	
-	private void deletedDeletedFilesRevisions(List<VFSMetadataRef> toDeleteList) {
-		try {
-			int count = 0;
-			for(VFSMetadataRef toDelete:toDeleteList) {
-				VFSMetadata meta = vfsRepositoryService.getMetadata(toDelete);
-				vfsRepositoryService.deleteMetadata(meta);
-				dbInstance.commitAndCloseSession();
-				setActual((++count / (float)toDeleteList.size()) * 100.0f);
-			}	
-		} catch (Exception e) {
-			dbInstance.closeSession();
-			logError("", e);
-		}
-		finished();
-	}
-	
-	private void doPruneHistory(UserRequest ureq) {
-		final int numOfVersions = getNumOfVersions();
-		final List<VFSMetadataRef> metadata = vfsRepositoryService.getMetadataWithMoreRevisionsThan(numOfVersions);
-		progressCtrl = new ProgressController(ureq, getWindowControl());
-		progressCtrl.setMessage(translate("version.prune.history"));
-		progressCtrl.setPercentagesEnabled(false);
-		progressCtrl.setUnitLabel("%");
-		progressCtrl.setMax(100.0f);
-		progressCtrl.setActual(0.0f);
-		listenTo(progressCtrl);
-
-		taskExecutorManager.execute(() -> {
-			waitASecond();
-			pruneRevisions(metadata, numOfVersions); 
-		});
-
-		synchronized(this) {
-			if(progressCtrl != null) {
-				String title = translate("version.prune.history");
-				cmc = new CloseableModalController(getWindowControl(), null, progressCtrl.getInitialComponent(),
-						true, title, false);
-				cmc.activate();
-				listenTo(cmc);
-			}
-		}
-	}
-	
-	private void pruneRevisions(final List<VFSMetadataRef> metadata, final int numOfVersions) {
-		try {
-			final Identity actingIdentity = getIdentity();
-			int count = 0;
-			for(VFSMetadataRef data:metadata) {
-				List<VFSRevision> revs = vfsRepositoryService.getRevisions(data);
-				Collections.sort(revs, new AscendingRevisionNrComparator());
-				List<VFSRevision> toDelete = revs.subList(0, revs.size() - numOfVersions);
-				vfsRepositoryService.deleteRevisions(actingIdentity, toDelete);
-				dbInstance.commitAndCloseSession();
-				setActual((++count / (float)metadata.size()) * 100.0f);
-			}
-		} catch (Exception e) {
-			dbInstance.closeSession();
-			logError("", e);
-		}
-		finished();
-	}
-	
-	private final void waitASecond() {
-		try {
-			Thread.sleep(1000);
-		} catch (InterruptedException e) {
-			logError("Can't wait", e);
-		}
-	}
-	
-	public int getNumOfVersions() {
-		return versionsModule.getMaxNumberOfVersions();
-	}
-	
-	public final void calculateOrphanSize() {
-		long size = vfsRepositoryService.getRevisionsTotalSize();
-		String sizeStr =Formatter.formatBytes(size);
-
-		if(orphanSizeEl != null && !isDisposed()) {
-			orphanSizeEl.setValue(sizeStr);
-		}
-	}
-	
-	@Override
-	public void setMax(float max) {
-		if(progressCtrl != null && !progressCtrl.isDisposed()) {
-			progressCtrl.setMax(max);
-		}
-	}
-
-	@Override
-	public void setActual(float value) {
-		if(progressCtrl != null && !progressCtrl.isDisposed()) {
-			progressCtrl.setActual(value);
-		}
-	}
-
-	@Override
-	public void setInfo(String message) {
-		if(progressCtrl != null && !progressCtrl.isDisposed()) {
-			progressCtrl.setInfo(message);
-		}
-	}
-
-	@Override
-	public synchronized void finished() {
-		if(cmc != null && !cmc.isDisposed()) {
-			cmc.deactivate();
-		}
-		cleanup();
-	}
-	
-	private static class AscendingRevisionNrComparator implements Comparator<VFSRevision> {
-		@Override
-		public int compare(VFSRevision o1, VFSRevision o2) {
-			int n1 = o1.getRevisionNr();
-			int n2 = o2.getRevisionNr();
-			return Integer.compare(n1, n2);
-		}
-	}
-}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/version/VersionsDeletedFileController.java b/src/main/java/org/olat/core/commons/services/vfs/ui/version/VersionsDeletedFileController.java
deleted file mode 100644
index 3369d1fbeb17b1ff7014e0b3473f6f93386346e4..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/version/VersionsDeletedFileController.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * <a href="http://www.openolat.org">
- * OpenOLAT - Online Learning and Training</a><br>
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); <br>
- * you may not use this file except in compliance with the License.<br>
- * You may obtain a copy of the License at the
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
- * <p>
- * Unless required by applicable law or agreed to in writing,<br>
- * software distributed under the License is distributed on an "AS IS" BASIS, <br>
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
- * See the License for the specific language governing permissions and <br>
- * limitations under the License.
- * <p>
- * Initial code contributed and copyrighted by<br>
- * frentix GmbH, http://www.frentix.com
- * <p>
- */
-package org.olat.core.commons.services.vfs.ui.version;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.olat.core.commons.modules.bc.commands.FolderCommand;
-import org.olat.core.commons.persistence.SortKey;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.VFSRevision;
-import org.olat.core.commons.services.vfs.model.VFSRevisionRefImpl;
-import org.olat.core.commons.services.vfs.ui.component.BytesCellRenderer;
-import org.olat.core.commons.services.vfs.ui.version.VersionsDeletedFileDataModel.VersionsDeletedCols;
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.form.flexible.FormItem;
-import org.olat.core.gui.components.form.flexible.FormItemContainer;
-import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
-import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions;
-import org.olat.core.gui.components.form.flexible.elements.FormLink;
-import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
-import org.olat.core.gui.components.form.flexible.impl.FormEvent;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
-import org.olat.core.gui.components.link.Link;
-import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.Event;
-import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.control.generic.modal.DialogBoxController;
-import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
-import org.olat.core.gui.util.CSSHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * 
- * Initial date: 3 avr. 2019<br>
- * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
- *
- */
-public class VersionsDeletedFileController extends FormBasicController {
-
-	private FormLink deleteButton;
-	private FlexiTableElement tableEl;
-	private VersionsDeletedFileDataModel dataModel;
-	
-	private DialogBoxController dialogCtr;
-	
-	@Autowired
-	private VFSRepositoryService vfsRepositoryService;
-
-	public VersionsDeletedFileController(UserRequest ureq, WindowControl wControl) {
-		super(ureq, wControl, "deleted_files_revisions");
-		initForm(ureq);
-		loadModel();
-	}
-	
-	@Override
-	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, VersionsDeletedCols.id));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(VersionsDeletedCols.relativePath));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(VersionsDeletedCols.filename));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(VersionsDeletedCols.size, new BytesCellRenderer()));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("delete", translate("delete"), "delete"));
-		
-		dataModel = new VersionsDeletedFileDataModel(columnsModel, getTranslator());
-		tableEl = uifactory.addTableElement(getWindowControl(), "table", dataModel, 24, false, getTranslator(), formLayout);
-		tableEl.setEmtpyTableMessageKey("version.noDeletedFiles");
-		tableEl.setMultiSelect(true);
-		FlexiTableSortOptions sortOptions = new FlexiTableSortOptions(true);
-		sortOptions.setDefaultOrderBy(new SortKey(VersionsDeletedCols.size.name(), false));
-		tableEl.setSortSettings(sortOptions);
-		tableEl.setAndLoadPersistedPreferences(ureq, "deleted-rev-file-list");
-		
-		deleteButton = uifactory.addFormLink("delete", formLayout, Link.BUTTON);
-		deleteButton.setIconLeftCSS(CSSHelper.getIconCssClassFor(CSSHelper.CSS_CLASS_TRASHED));
-	}
-
-	@Override
-	protected void doDispose() {
-		//
-	}
-	
-	private void loadModel() {
-		List<VFSRevision> revisions = vfsRepositoryService.getRevisionsOfDeletedFiles();
-		List<VersionsDeletedFileRow> rows = revisions.stream()
-				.map(VersionsDeletedFileRow::new)
-				.collect(Collectors.toList());
-		dataModel.setObjects(rows);
-		tableEl.reset(true, true, true);
-		deleteButton.setVisible(!rows.isEmpty());
-	}
-	
-	@Override
-	protected void event(UserRequest ureq, Controller source, Event event) {
-		if (source == dialogCtr) {
-			if (DialogBoxUIFactory.isYesEvent(event)) {	
-				@SuppressWarnings("unchecked")
-				List<VersionsDeletedFileRow> rowsToDelete =  (List<VersionsDeletedFileRow>)dialogCtr.getUserObject();
-				doDelete(rowsToDelete);
-				fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
-			}
-		}
-		super.event(ureq, source, event);
-	}
-
-	@Override
-	protected void formOK(UserRequest ureq) {
-		//
-	}
-	
-	@Override
-	protected void formCancelled(UserRequest ureq) {
-		fireEvent(ureq, Event.CANCELLED_EVENT);
-	}
-
-	@Override
-	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(deleteButton == source) {
-			doConfirmDelete(ureq);
-		} else if(tableEl == source) {
-			if(event instanceof SelectionEvent) {
-				SelectionEvent se = (SelectionEvent)event;
-				if("delete".equals(se.getCommand())) {
-					VersionsDeletedFileRow row = dataModel.getObject(se.getIndex());
-					doConfirmDelete(ureq, Collections.singletonList(row));
-				}
-			}
-		}
-		super.formInnerEvent(ureq, source, event);
-	}
-	
-	private void doConfirmDelete(UserRequest ureq, List<VersionsDeletedFileRow> rows) {
-		String msg = translate("version.del.confirm") + "<p>" + renderVersionsAsHtml(rows) + "</p>";
-		dialogCtr = activateYesNoDialog(ureq, translate("version.del.header"), msg, dialogCtr);
-		dialogCtr.setUserObject(rows);
-	}
-	
-	private void doConfirmDelete(UserRequest ureq) {
-		Set<Integer> selectedIndexes = tableEl.getMultiSelectedIndex();
-		List<VersionsDeletedFileRow> rowsToDelete = new ArrayList<>(selectedIndexes.size());
-		for(Integer selectedIndex:selectedIndexes) {
-			VersionsDeletedFileRow row = dataModel.getObject(selectedIndex.intValue());
-			if(row != null) {
-				rowsToDelete.add(row);
-			}
-		}
-		if(!rowsToDelete.isEmpty()) {
-			doConfirmDelete(ureq, rowsToDelete);
-		}
-	}
-	
-	private void doDelete(List<VersionsDeletedFileRow> rowsToDelete) {
-		for(VersionsDeletedFileRow row:rowsToDelete) {
-			VFSRevision revision = vfsRepositoryService.getRevision(new VFSRevisionRefImpl(row.getRevisionKey()));
-			vfsRepositoryService.deleteRevisions(getIdentity(), Collections.singletonList(revision));
-		}
-	}
-	
-	private String renderVersionsAsHtml(List<VersionsDeletedFileRow> rows) {
-		StringBuilder sb = new StringBuilder(256);
-		sb.append("<ul>");
-		for (VersionsDeletedFileRow row:rows) {
-			sb.append("<li>").append(row.getFilename()).append("</li>");
-		}
-		sb.append("</ul>");
-		return sb.toString();
-	}
-}
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/version/_content/orphans.html b/src/main/java/org/olat/core/commons/services/vfs/ui/version/_content/orphans.html
new file mode 100644
index 0000000000000000000000000000000000000000..05396d8574cb002c225c792407a80d99084183d5
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/vfs/ui/version/_content/orphans.html
@@ -0,0 +1,7 @@
+<fieldset class="o_form_horizontal">
+	<legend class="o_text_right">$r.translate("version.deletedFiles")</legend>
+	$r.render("orphansTable")
+	<div class="o_button_group">
+		$r.render("orphansDelete")
+	</div>
+</fieldset>
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
index be725331260accea40239a66dbbd448295db82eb..e5aa092d2cfaca3bacd334832026093f338447f8 100644
--- a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
@@ -336,28 +336,25 @@ public class IFrameDisplayController extends BasicController implements GenericE
 		setPageDownload(isPageDownloadAllowed(currentUri));
 	}
 	
-	private boolean isPageDownloadAllowed(String uri) {
+	private boolean isPageDownloadAllowed(final String uri) {
 		if(!allowDownload || !StringHelper.containsNonWhitespace(uri)) {
 			return false;
 		}
 		// remove any URL parameters
 		String uriLc = uri.toLowerCase();
-		int qmarkPos = uriLc.indexOf("?");
+		int qmarkPos = uriLc.indexOf('?');
 		if (qmarkPos != -1) {
 			// e.g. index.html?olatraw=true
 			uriLc = uriLc.substring(0, qmarkPos);
 		}
 		// remove any anchor references
-		int hTagPos = uri.indexOf("#");
+		int hTagPos = uriLc.indexOf('#');
 		if (hTagPos != -1) {
 			// e.g. index.html#checkThisOut
 			uriLc = uriLc.substring(0, hTagPos);
 		}
 		// HTML pages are rendered inline, everything else is regarded as "downloadable"
-		if(uriLc.endsWith(".html") || uriLc.endsWith(".htm") || uriLc.endsWith(".xhtml")) {
-			return false;
-		}
-		return true;
+		return !uriLc.endsWith(".html") && !uriLc.endsWith(".htm") && !uriLc.endsWith(".xhtml");
 	}
 	
 	private void setPageDownload(boolean allow) {
@@ -385,8 +382,7 @@ public class IFrameDisplayController extends BasicController implements GenericE
 			if (NEW_URI_EVENT.equals(event.getCommand())) {
 				// This event gets triggered from the iframe content by calling a js function outside 
 				// Get new uri from JS method and fire to parents
-				String newUri = ureq.getModuleURI();
-				newUri = ureq.getHttpReq().getParameter("uri");
+				String newUri = ureq.getHttpReq().getParameter("uri");
 				int baseUriPos = newUri.indexOf(baseURI);
 				if (baseUriPos != -1) {
 					int newUriPos =  baseUriPos + baseURI.length();
diff --git a/src/main/java/org/olat/core/util/Formatter.java b/src/main/java/org/olat/core/util/Formatter.java
index f4481d73470e6d695968aa5cb114ebf6c772fc0b..eefc4554c0903065934b0aaaa50732df582b6a2f 100644
--- a/src/main/java/org/olat/core/util/Formatter.java
+++ b/src/main/java/org/olat/core/util/Formatter.java
@@ -63,7 +63,7 @@ import org.olat.core.util.filter.impl.HtmlMathScanner;
  */
 public class Formatter {
 
-	private static final int BYTE_UNIT = 1000;
+	public static final int BYTE_UNIT = 1000;
 	private static final DateFormat formatterDatetimeFilesystem = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm-ss_SSS");
 	private static final DateFormat formatterDatetimeWithMinutes = new SimpleDateFormat("yyyy-MM-dd'T'HH-mm");
 	private static final DateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
diff --git a/src/main/java/org/olat/course/nodes/video/VideoEditController.java b/src/main/java/org/olat/course/nodes/video/VideoEditController.java
index a6216771d22c5b95ee7b1dfc59f22fe94a87a8df..0f4c60e7721dd572a138e659e7828fbe9ca4191e 100644
--- a/src/main/java/org/olat/course/nodes/video/VideoEditController.java
+++ b/src/main/java/org/olat/course/nodes/video/VideoEditController.java
@@ -253,16 +253,16 @@ public class VideoEditController extends ActivateableTabbableDefaultController i
 		boolean showRating = config.getBooleanSafe(VideoEditController.CONFIG_KEY_RATING);
 		boolean showComments = config.getBooleanSafe(VideoEditController.CONFIG_KEY_COMMENTS);
 		
-		VideoDisplayOptions options = VideoDisplayOptions.valueOf(autoplay, showComments, showRating, true, false, false, "", true, true);
-		switch(config.getStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_SELECT)) {
-			case "resourceDescription": break;
+		VideoDisplayOptions options = VideoDisplayOptions.valueOf(autoplay, showComments, showRating, true, true, false, false, "", true, true);
+		switch(config.getStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_SELECT, "none")) {
 			case "customDescription":
 				options.setCustomDescription(true);
 				options.setDescriptionText(config.getStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_CUSTOMTEXT));
 				break;
 			case "none":
-				options.setCustomDescription(true);
-				options.setDescriptionText("");
+				options.setShowDescription(false);
+				break;
+			default:
 				break;
 		}
 
@@ -284,9 +284,7 @@ public class VideoEditController extends ActivateableTabbableDefaultController i
 			else return null;
 		}
 		RepositoryManager rm = RepositoryManager.getInstance();
-		RepositoryEntry entry = rm.lookupRepositoryEntryBySoftkey(repoSoftkey, strict);
-		// entry can be null only if !strict
-		return entry;
+		return rm.lookupRepositoryEntryBySoftkey(repoSoftkey, strict);
 	}
 
 	/**
@@ -373,7 +371,7 @@ class VideoOptionsForm extends FormBasicController{
 		config.setBooleanEntry(VideoEditController.CONFIG_KEY_RATING, videoRating.isSelected(0));
 		config.setBooleanEntry(VideoEditController.CONFIG_KEY_AUTOPLAY, videoAutoplay.isSelected(0));
 		config.setStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_SELECT, description.getSelectedKey());
-		if(description.getSelectedKey() == "customDescription"){
+		if("customDescription".equals(description.getSelectedKey())) {
 			config.setStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_CUSTOMTEXT, descriptionField.getValue());
 		}
 		fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
@@ -407,7 +405,7 @@ class VideoOptionsForm extends FormBasicController{
 		config.setBooleanEntry(VideoEditController.CONFIG_KEY_RATING, videoRating.isSelected(0));
 		config.setBooleanEntry(VideoEditController.CONFIG_KEY_AUTOPLAY, videoAutoplay.isSelected(0));
 		config.setStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_SELECT, description.getSelectedKey());
-		if(description.getSelectedKey() == "customDescription"){
+		if("customDescription".equals(description.getSelectedKey())) {
 			config.setStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_CUSTOMTEXT, descriptionField.getValue());
 		}
 	}
diff --git a/src/main/java/org/olat/course/nodes/video/VideoRunController.java b/src/main/java/org/olat/course/nodes/video/VideoRunController.java
index c01d8e4aba7f72f200655fe2c355122c32583702..1418706518329832439c665d3dee11f7d41ba1df 100644
--- a/src/main/java/org/olat/course/nodes/video/VideoRunController.java
+++ b/src/main/java/org/olat/course/nodes/video/VideoRunController.java
@@ -113,17 +113,17 @@ public class VideoRunController extends BasicController {
 		boolean comments = config.getBooleanSafe(VideoEditController.CONFIG_KEY_COMMENTS);
 		boolean ratings = config.getBooleanSafe(VideoEditController.CONFIG_KEY_RATING);
 		String customtext = config.getStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_CUSTOMTEXT);
-		
-		VideoDisplayOptions displayOptions = VideoDisplayOptions.valueOf(autoplay, comments, ratings, true, false, false, "", false, userCourseEnv.isCourseReadOnly());
+
+		VideoDisplayOptions displayOptions = VideoDisplayOptions.valueOf(autoplay, comments, ratings, true, true, false, false, null, false, userCourseEnv.isCourseReadOnly());
 		switch(config.getStringValue(VideoEditController.CONFIG_KEY_DESCRIPTION_SELECT,"none")) {
-			case "resourceDescription": break;
 			case "customDescription":
 				displayOptions.setCustomDescription(true);
 				displayOptions.setDescriptionText(customtext);
 				break;
 			case "none":
-				displayOptions.setCustomDescription(true);
-				displayOptions.setDescriptionText("");
+				displayOptions.setShowDescription(false);
+				break;
+			default:
 				break;
 		}
 		
diff --git a/src/main/java/org/olat/group/ui/main/EditMembershipController.java b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
index 1f5c8cd4f85c9f79c629d28ea0c53454413a32d2..125626549cdd25587a76ec83a81375b0736d8915 100644
--- a/src/main/java/org/olat/group/ui/main/EditMembershipController.java
+++ b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
@@ -47,6 +47,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFle
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
@@ -386,6 +387,8 @@ public class EditMembershipController extends FormBasicController {
 		} else {
 			curriculumTableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumCols.curriculumElement, new CurriculumElementIndentRenderer()));
 		}
+
+		curriculumTableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumCols.curriculumElementIdentifier));
 		curriculumTableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumCols.owner));
 		curriculumTableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumCols.coach));
 		curriculumTableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumCols.participant));
@@ -675,11 +678,12 @@ public class EditMembershipController extends FormBasicController {
 			switch(CurriculumCols.values()[col]) {
 				case curriculum: return option.getElement().getCurriculum().getDisplayName();
 				case curriculumElement: return option.getElement().getDisplayName();
+				case curriculumElementIdentifier: return option.getElement().getIdentifier();
 				case owner: return option.getOwner();
 				case coach: return option.getCoach();
 				case participant: return option.getParticipant();
+				default: return "ERROR";
 			}
-			return null;
 		}
 
 		@Override
@@ -749,9 +753,10 @@ public class EditMembershipController extends FormBasicController {
 	}
 	
 	
-	public static enum CurriculumCols implements FlexiColumnDef {
+	public enum CurriculumCols implements FlexiSortableColumnDef {
 		curriculum("table.header.curriculum"),
 		curriculumElement("table.header.curriculum.element"),
+		curriculumElementIdentifier("table.header.identifier"),
 		owner("table.header.owners"),
 		coach("table.header.tutors"),
 		participant("table.header.participants");
@@ -766,9 +771,19 @@ public class EditMembershipController extends FormBasicController {
 		public String i18nHeaderKey() {
 			return i18n;
 		}
+
+		@Override
+		public boolean sortable() {
+			return false;
+		}
+
+		@Override
+		public String sortKey() {
+			return name();
+		}
 	}
 	
-	public static enum GroupCols implements FlexiColumnDef {
+	public enum GroupCols implements FlexiColumnDef {
 		groupName("table.header.groups"),
 		tutorCount("table.header.tutorsCount"),
 		participantCount("table.header.participantsCount"),
diff --git a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties
index 06806f0a926c9f62b73f8885bba297937bffc69c..ec804267d14038d408aaaefda3f284e0d83cb578 100644
--- a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties
@@ -186,6 +186,7 @@ table.header.graduate=Zulassen
 tbl_graduate=$:table.header.graduate
 table.header.firstName=Vorname
 table.header.lastName=Name
+table.header.identifier=Bezeichnung
 table.header.mail=E-Mail
 table.header.firstTime=Beitritt
 table.header.lastTime=Zuletzt besucht
diff --git a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties
index 2d27817cc876d97f7a22a4a294b1bab568379830..32c23ba755c9af8d701c1d7db5886e4e22f898e7 100644
--- a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties
@@ -160,6 +160,7 @@ table.header.freePlaces=Slots
 table.header.graduate=Admit
 table.header.group.full=Full
 table.header.groups=Group
+table.header.identifier=Identifier
 table.header.key=ID
 table.header.lastName=Lastname
 table.header.lastTime=Last visit
diff --git a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_fr.properties
index 56cedc8bf35ffde6908f3d051e62c6a4442acc6e..977a90c8beb23744199575433ce7e707baa05b06 100644
--- a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_fr.properties
@@ -160,6 +160,7 @@ table.header.freePlaces=Places
 table.header.graduate=Promouvoir
 table.header.group.full=Plein
 table.header.groups=Groupes
+table.header.identifier=Identifiant
 table.header.key=ID
 table.header.lastName=Nom
 table.header.lastTime=Derni\u00E8re visite
diff --git a/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java b/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
index c08886894c27ed9b401f1f95ee03fcd5e0ead445..9da7d24c93378ab980c8f8a0fb4ffe4037e422af 100644
--- a/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
+++ b/src/main/java/org/olat/ims/qti21/questionimport/CSVToAssessmentItemConverter.java
@@ -184,6 +184,7 @@ public class CSVToAssessmentItemConverter {
 			case "language": processLanguage(parts); break;
 			case "durchschnittliche bearbeitungszeit":
 			case "typical learning time": processTypicalLearningTime(parts); break;
+			case "required grading time": processCorrectionTime(parts); break;
 			case "itemschwierigkeit":
 			case "difficulty index": processDifficultyIndex(parts); break;
 			case "standardabweichung itemschwierigkeit":
@@ -229,6 +230,19 @@ public class CSVToAssessmentItemConverter {
 		}
 	}
 	
+	private void processCorrectionTime(String[] parts) {
+		if(currentItem == null || parts.length < 2) return;
+		
+		String time = parts[1];
+		if(StringHelper.containsNonWhitespace(time) && StringHelper.isLong(time.trim())) {
+			try {
+				currentItem.setCorrectionTime(Integer.valueOf(time.trim()));
+			} catch (NumberFormatException e) {
+				log.error("Cannot parse correction time: {}", time, e);
+			}
+		}
+	}
+	
 	private void processLicense(String[] parts) {
 		if(currentItem == null || parts.length < 2) return;
 		
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
index ad41cfe8a8b63ce8c2d27bb5817be689826b152e..74d66c50efbb5efda6dc7d3cf10e45a761322c3e 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
@@ -70,6 +70,8 @@ import org.olat.ims.qti21.ui.editor.interactions.MultipleChoiceEditorController;
 import org.olat.ims.qti21.ui.editor.interactions.SingleChoiceEditorController;
 import org.olat.ims.qti21.ui.editor.interactions.TrueFalseEditorController;
 import org.olat.ims.qti21.ui.editor.interactions.UploadEditorController;
+import org.olat.ims.qti21.ui.editor.metadata.MetadataChangedEvent;
+import org.olat.ims.qti21.ui.editor.metadata.MetadataController;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.AssessmentService;
 import org.olat.modules.qpool.QPoolService;
@@ -211,11 +213,9 @@ public class AssessmentItemEditorController extends BasicController implements A
 				tabbedPane.addTab(translate("form.pool"), poolEditor);
 			}
 			
-			metadataCtrl = new MetadataController(ureq, getWindowControl(), metadataBuilder);
+			metadataCtrl = new MetadataController(ureq, getWindowControl(), metadataBuilder, readOnly);
 			listenTo(metadataCtrl);
-			if(metadataCtrl.hasMetadata()) {
-				tabbedPane.addTab(translate("form.metadata"), metadataCtrl);
-			}
+			tabbedPane.addTab(translate("form.metadata"), metadataCtrl);
 		}
 
 		putInitialPanel(mainVC);
@@ -597,6 +597,11 @@ public class AssessmentItemEditorController extends BasicController implements A
 			if(event instanceof DetachFromPoolEvent) {
 				fireEvent(ureq, event);
 			}
+		} else if(metadataCtrl == source) {
+			if(event instanceof MetadataChangedEvent) {
+				doBuildAndCommitMetadata();
+				fireEvent(ureq, event);
+			}
 		}
 		super.event(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
index 9facae8af191f76f9bc2c66850cb9f3394106ded..18b7ddfdb3126cd041224b8821cedbba10ee2da4 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
@@ -121,6 +121,7 @@ import org.olat.ims.qti21.ui.editor.events.AssessmentTestPartEvent;
 import org.olat.ims.qti21.ui.editor.events.DetachFromPoolEvent;
 import org.olat.ims.qti21.ui.editor.events.SelectEvent;
 import org.olat.ims.qti21.ui.editor.events.SelectEvent.SelectionTarget;
+import org.olat.ims.qti21.ui.editor.metadata.MetadataChangedEvent;
 import org.olat.ims.qti21.ui.editor.overview.AssessmentTestOverviewConfigurationController;
 import org.olat.imscp.xml.manifest.FileType;
 import org.olat.imscp.xml.manifest.ResourceType;
@@ -473,6 +474,8 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		} else if(event instanceof DetachFromPoolEvent) {
 			DetachFromPoolEvent dfpe = (DetachFromPoolEvent)event;
 			doDetachItemFromPool(ureq, dfpe.getItemRef());
+		} else if(event instanceof MetadataChangedEvent) {
+			doSaveManifest();
 		} else if(selectQItemCtrl == source) {
 			cmc.deactivate();
 			cleanUp();
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/MetadataController.java b/src/main/java/org/olat/ims/qti21/ui/editor/MetadataController.java
deleted file mode 100644
index a66705e1d2a63f67033bb1e761e6b55993176734..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/ims/qti21/ui/editor/MetadataController.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * <a href="http://www.openolat.org">
- * OpenOLAT - Online Learning and Training</a><br>
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); <br>
- * you may not use this file except in compliance with the License.<br>
- * You may obtain a copy of the License at the
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
- * <p>
- * Unless required by applicable law or agreed to in writing,<br>
- * software distributed under the License is distributed on an "AS IS" BASIS, <br>
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
- * See the License for the specific language governing permissions and <br>
- * limitations under the License.
- * <p>
- * Initial code contributed and copyrighted by<br>
- * frentix GmbH, http://www.frentix.com
- * <p>
- */
-package org.olat.ims.qti21.ui.editor;
-
-import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.form.flexible.FormItemContainer;
-import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
-import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.WindowControl;
-import org.olat.core.util.StringHelper;
-import org.olat.core.util.Util;
-import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder;
-import org.olat.modules.qpool.manager.MetadataConverterHelper;
-import org.olat.modules.qpool.model.LOMDuration;
-import org.olat.modules.qpool.ui.QuestionsController;
-
-/**
- * 
- * Initial date: 8 janv. 2020<br>
- * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
- *
- */
-public class MetadataController extends FormBasicController {
-	
-	private final ManifestMetadataBuilder metadataBuilder;
-	
-	public MetadataController(UserRequest ureq, WindowControl wControl, ManifestMetadataBuilder metadataBuilder) {
-		super(ureq, wControl, Util.createPackageTranslator(QuestionsController.class, ureq.getLocale()));
-		this.metadataBuilder = metadataBuilder;
-		initForm(ureq);
-	}
-
-	@Override
-	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		String learningTime = metadataBuilder.getEducationalLearningTime();
-		LOMDuration duration = MetadataConverterHelper.convertDuration(learningTime);
-		String formattedLearningTime = formatLearningTime(duration);
-		uifactory.addStaticTextElement("educational.learningTime", formattedLearningTime, formLayout);
-		
-		Integer correctionTime = metadataBuilder.getOpenOLATMetadataCorrectionTime();
-		String correctionTimeStr = null;
-		if(correctionTime != null) {
-			correctionTimeStr = translate("question.correctionTime.inMinutes", new String[] { correctionTime.toString() });
-		}
-		uifactory.addStaticTextElement("question.correctionTime", correctionTimeStr, formLayout);
-	}
-	
-	public boolean hasMetadata() {
-		return StringHelper.containsNonWhitespace(metadataBuilder.getEducationalLearningTime())
-				|| metadataBuilder.getOpenOLATMetadataCorrectionTime() != null;
-	}
-	
-	private String formatLearningTime(LOMDuration duration) {
-		StringBuilder sb = new StringBuilder(32);
-		boolean started = appendFormatLearningTime(duration.getDay(), "educational.learningTime.day", sb, false);
-		started |= appendFormatLearningTime(duration.getHour(), "educational.learningTime.hour", sb, started);
-		appendFormatLearningTime(duration.getMinute(), "educational.learningTime.minute", sb, started);
-		appendFormatLearningTime(duration.getSeconds(), "educational.learningTime.second", sb, false);
-		return sb.toString();
-	}
-	
-	private boolean appendFormatLearningTime(int value, String unit, StringBuilder sb, boolean append) {
-		if(append || value > 0) {
-			if(sb.length() > 0) sb.append(" ");
-			sb.append(value)
-			  .append(translate(unit));
-		}
-		return value > 0;
-	}
-
-	@Override
-	protected void doDispose() {
-		//
-	}
-
-	@Override
-	protected void formOK(UserRequest ureq) {
-		//
-	}
-	
-	
-
-}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
index c384cbee1ccc5b7aeda5c06f5ba21f3bb4a48392..883270a3cb00791e8bc4303601d3a2a032602458 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Tue Jan 07 21:36:43 CET 2020
+#Fri Jan 10 12:27:14 CET 2020
 Diff\u00E9rentes=alternatives
 MULTIPLE=Choix multiple
 SINGLE=Choix simple
@@ -250,6 +250,7 @@ preview.solution=Aper\u00E7u de la solution
 rights.owners=$org.olat.modules.qpool.ui\:rights.owners
 table.header.attempts=Tentatives
 table.header.comment=Autoriser commentaires
+table.header.correction.time=Temps pour correction
 table.header.feedback=Feedback
 table.header.identifier=ID question
 table.header.learning.time=Dur\u00E9e
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/metadata/AssessmentItemEditorMetadataSecurityCallback.java b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/AssessmentItemEditorMetadataSecurityCallback.java
new file mode 100644
index 0000000000000000000000000000000000000000..87ad3163934830a36c2cac5fe64b6e8fd38c5a98
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/AssessmentItemEditorMetadataSecurityCallback.java
@@ -0,0 +1,63 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.ims.qti21.ui.editor.metadata;
+
+import org.olat.modules.qpool.MetadataSecurityCallback;
+
+/**
+ * Allow to change metadata and taxonomy.
+ * 
+ * Initial date: 8 janv. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+class AssessmentItemEditorMetadataSecurityCallback implements MetadataSecurityCallback {
+	
+	private final boolean readOnly;
+	
+	AssessmentItemEditorMetadataSecurityCallback(boolean readOnly) {
+		this.readOnly = readOnly;
+	}
+
+	@Override
+	public boolean canEditMetadata() {
+		return !readOnly;
+	}
+
+	@Override
+	public boolean canRemoveTaxonomy() {
+		return !readOnly;
+	}
+
+	@Override
+	public boolean canChangeVersion() {
+		return false;
+	}
+
+	@Override
+	public boolean canEditAuthors() {
+		return false;
+	}
+
+	@Override
+	public boolean canViewReviews() {
+		return false;
+	}
+}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/metadata/AssessmentItemEditorQPoolSecurityCallback.java b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/AssessmentItemEditorQPoolSecurityCallback.java
new file mode 100644
index 0000000000000000000000000000000000000000..4803aa0d80cdb6777058130008f7f1b5058dea72
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/AssessmentItemEditorQPoolSecurityCallback.java
@@ -0,0 +1,102 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.ims.qti21.ui.editor.metadata;
+
+import org.olat.core.id.Roles;
+import org.olat.modules.qpool.QPoolSecurityCallback;
+
+/**
+ * 
+ * Initial date: 8 janv. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class AssessmentItemEditorQPoolSecurityCallback implements QPoolSecurityCallback {
+
+	@Override
+	public void setRoles(Roles roles) {
+		//
+	}
+
+	@Override
+	public boolean canUseCollections() {
+		return false;
+	}
+
+	@Override
+	public boolean canUsePools() {
+		return false;
+	}
+
+	@Override
+	public boolean canUseGroups() {
+		return false;
+	}
+
+	@Override
+	public boolean canUseReviewProcess() {
+		return false;
+	}
+
+	@Override
+	public boolean canUseTaxonomy() {
+		return true;
+	}
+
+	@Override
+	public boolean canUseEducationalContext() {
+		return true;
+	}
+
+	@Override
+	public boolean canCreateTest() {
+		return false;
+	}
+
+	@Override
+	public boolean canEditAllQuestions() {
+		return false;
+	}
+
+	@Override
+	public boolean canConfigReviewProcess() {
+		return false;
+	}
+
+	@Override
+	public boolean canConfigTaxonomies() {
+		return false;
+	}
+
+	@Override
+	public boolean canConfigPools() {
+		return false;
+	}
+
+	@Override
+	public boolean canConfigItemTypes() {
+		return false;
+	}
+
+	@Override
+	public boolean canConfigEducationalContext() {
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/metadata/ManifestMetadataItemized.java b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/ManifestMetadataItemized.java
new file mode 100644
index 0000000000000000000000000000000000000000..1228f2f63b8e6a6c6d7fabf11f0eb1017207e507
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/ManifestMetadataItemized.java
@@ -0,0 +1,373 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.ims.qti21.ui.editor.metadata;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.util.StringHelper;
+import org.olat.ims.qti.qpool.QTIMetadataConverter;
+import org.olat.ims.qti21.QTI21Constants;
+import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder;
+import org.olat.modules.qpool.QPoolService;
+import org.olat.modules.qpool.QuestionItem;
+import org.olat.modules.qpool.QuestionItemEditable;
+import org.olat.modules.qpool.QuestionStatus;
+import org.olat.modules.qpool.manager.QEducationalContextDAO;
+import org.olat.modules.qpool.manager.QItemTypeDAO;
+import org.olat.modules.qpool.model.QEducationalContext;
+import org.olat.modules.qpool.model.QItemType;
+import org.olat.modules.qpool.model.QLicense;
+import org.olat.modules.taxonomy.TaxonomyLevel;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Manifest based implementation of QuestionItem, editable.
+ * 
+ * Initial date: 8 janv. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+class ManifestMetadataItemized implements QuestionItem, QuestionItemEditable {
+	
+	private final ManifestMetadataBuilder metadataBuilder;
+	
+	private final QTIMetadataConverter metadataConverter;
+	
+	private String lang;
+	private String directory;
+	
+	private QItemType itemType;
+	private QEducationalContext context;
+	private TaxonomyLevel taxonomyLevel;
+	
+	@Autowired
+	private QItemTypeDAO itemTypeDao;
+	@Autowired
+	private QPoolService qpoolService;
+	@Autowired
+	private QEducationalContextDAO educationalContextDao;
+
+	
+	public ManifestMetadataItemized(ManifestMetadataBuilder metadataBuilder, String lang) {
+		CoreSpringFactory.autowireObject(this);
+		
+		this.metadataBuilder = metadataBuilder;
+		this.lang = lang;
+		metadataConverter = new QTIMetadataConverter(itemTypeDao, educationalContextDao, qpoolService);
+		if(StringHelper.containsNonWhitespace(metadataBuilder.getClassificationTaxonomy())) {
+			taxonomyLevel = metadataConverter.toTaxonomy(metadataBuilder.getClassificationTaxonomy());
+		}
+		if(StringHelper.containsNonWhitespace(metadataBuilder.getEducationContext())) {
+			context = metadataConverter.toEducationalContext(metadataBuilder.getEducationContext());
+		}
+		if(StringHelper.containsNonWhitespace(metadataBuilder.getOpenOLATMetadataQuestionType())) {
+			itemType = metadataConverter.toType(metadataBuilder.getOpenOLATMetadataQuestionType());
+		}
+	}
+
+	@Override
+	public Long getKey() {
+		return null;
+	}
+
+	@Override
+	public String getIdentifier() {
+		return metadataBuilder.getOpenOLATMetadataIdentifier();
+	}
+
+	@Override
+	public String getMasterIdentifier() {
+		return metadataBuilder.getOpenOLATMetadataMasterIdentifier();
+	}
+
+	@Override
+	public String getTitle() {
+		return metadataBuilder.getTitle();
+	}
+
+	@Override
+	public String getLanguage() {
+		return lang;
+	}
+
+	@Override
+	public String getKeywords() {
+		return metadataBuilder.getGeneralKeywords();
+	}
+
+	@Override
+	public void setKeywords(String keywords) {
+		metadataBuilder.setGeneralKeywords(keywords, lang);
+	}
+
+	@Override
+	public void setLanguage(String language) {
+		this.lang = language;
+		metadataBuilder.setLanguage(language, language);
+	}
+
+	@Override
+	public String getTaxonomyLevelName() {
+		if(taxonomyLevel != null) {
+			return taxonomyLevel.getDisplayName();
+		}
+		return metadataBuilder.getClassificationTaxonomy();
+	}
+
+	@Override
+	public String getTaxonomicPath() {
+		if(taxonomyLevel != null) {
+			return taxonomyLevel.getMaterializedPathIdentifiers();
+		}
+		return metadataBuilder.getClassificationTaxonomy();
+	}
+
+	@Override
+	public String getTopic() {
+		return metadataBuilder.getOpenOLATMetadataTopic();
+	}
+
+	@Override
+	public void setTopic(String topic) {
+		metadataBuilder.setOpenOLATMetadataTopic(topic);
+	}
+
+	@Override
+	public String getEducationalContextLevel() {
+		if(context != null) {
+			return context.getLevel();
+		}
+		return metadataBuilder.getEducationContext();
+	}
+
+	@Override
+	public String getEducationalLearningTime() {
+		return metadataBuilder.getEducationalLearningTime();
+	}	
+
+	@Override
+	public void setEducationalLearningTime(String time) {
+		metadataBuilder.setEducationalLearningTime(time);
+	}
+
+	@Override
+	public String getItemType() {
+		return metadataBuilder.getOpenOLATMetadataQuestionType();
+	}
+
+	@Override
+	public BigDecimal getDifficulty() {
+		Double val = metadataBuilder.getOpenOLATMetadataDifficulty();
+		return val == null ? null : BigDecimal.valueOf(val.doubleValue());
+	}
+	
+	@Override
+	public void setDifficulty(BigDecimal difficulty) {
+		metadataBuilder.setOpenOLATMetadataDifficulty(difficulty);
+	}
+
+	@Override
+	public BigDecimal getStdevDifficulty() {
+		Double val = metadataBuilder.getOpenOLATMetadataStandardDeviation();
+		return val == null ? null : BigDecimal.valueOf(val.doubleValue());
+	}
+
+	@Override
+	public void setStdevDifficulty(BigDecimal stdevDifficulty) {
+		metadataBuilder.setOpenOLATMetadataStandardDeviation(stdevDifficulty);
+	}
+
+	@Override
+	public BigDecimal getDifferentiation() {
+		Double val =  metadataBuilder.getOpenOLATMetadataDiscriminationIndex();
+		return val == null ? null : BigDecimal.valueOf(val.doubleValue());
+	}
+	
+	@Override
+	public void setDifferentiation(BigDecimal differentiation) {
+		metadataBuilder.setOpenOLATMetadataDiscriminationIndex(differentiation);
+	}
+
+	@Override
+	public int getNumOfAnswerAlternatives() {
+		Integer val = metadataBuilder.getOpenOLATMetadataDistractors();
+		return val == null ? 0 : val.intValue();
+	}
+
+	@Override
+	public void setNumOfAnswerAlternatives(int numOfAnswerAlternatives) {
+		metadataBuilder.setOpenOLATMetadataDistractors(Integer.valueOf(numOfAnswerAlternatives));
+	}
+
+	@Override
+	public int getUsage() {
+		Integer usage = metadataBuilder.getOpenOLATMetadataUsage();
+		return usage == null ? 0 : usage.intValue();
+	}
+	
+	@Override
+	public void setUsage(int numOfUsage) {
+		metadataBuilder.setOpenOLATMetadataUsage(Integer.valueOf(numOfUsage));
+	}
+
+	@Override
+	public QuestionStatus getQuestionStatus() {
+		return null;
+	}
+
+	@Override
+	public Date getQuestionStatusLastModified() {
+		return null;
+	}
+
+	@Override
+	public String getFormat() {
+		return QTI21Constants.QTI_21_FORMAT;
+	}
+
+	@Override
+	public Integer getCorrectionTime() {
+		return metadataBuilder.getOpenOLATMetadataCorrectionTime();
+	}
+	
+	@Override
+	public void setCorrectionTime(Integer timeInMinute) {
+		metadataBuilder.setOpenOLATMetadataCorrectionTime(timeInMinute);
+	}
+
+	@Override
+	public Date getLastModified() {
+		return null;
+	}
+
+	@Override
+	public void setLastModified(Date date) {
+		//
+	}
+
+	@Override
+	public Date getCreationDate() {
+		return null;
+	}
+
+	@Override
+	public String getResourceableTypeName() {
+		return null;
+	}
+
+	@Override
+	public Long getResourceableId() {
+		return null;
+	}
+
+	@Override
+	public String getDescription() {
+		return metadataBuilder.getDescription();
+	}
+
+	@Override
+	public String getCoverage() {
+		return metadataBuilder.getCoverage();
+	}
+
+	@Override
+	public void setCoverage(String coverage) {
+		metadataBuilder.setCoverage(coverage, lang);
+	}
+
+	@Override
+	public String getAdditionalInformations() {
+		return metadataBuilder.getOpenOLATMetadataAdditionalInformations();
+	}
+
+	@Override
+	public void setAdditionalInformations(String informations) {
+		metadataBuilder.setOpenOLATMetadataAdditionalInformations(informations);
+	}
+
+	@Override
+	public void setTaxonomyLevel(TaxonomyLevel taxonomyLevel) {
+		this.taxonomyLevel = taxonomyLevel;
+		metadataBuilder.setClassificationTaxonomy(getTaxonomicPath(), lang);
+	}
+
+	@Override
+	public TaxonomyLevel getTaxonomyLevel() {
+		return taxonomyLevel;
+	}
+
+	@Override
+	public QEducationalContext getEducationalContext() {
+		return context;
+	}
+
+	@Override
+	public void setEducationalContext(QEducationalContext context) {
+		this.context = context;
+		metadataBuilder.setEducationalContext(context.getLevel(), lang);
+	}
+
+	@Override
+	public QItemType getType() {
+		return itemType;
+	}
+
+	@Override
+	public String getAssessmentType() {
+		return metadataBuilder.getOpenOLATMetadataAssessmentType();
+	}
+
+	@Override
+	public void setAssessmentType(String type) {
+		metadataBuilder.setOpenOLATMetadataAssessmentType(type);
+	}
+
+	@Override
+	public String getItemVersion() {
+		return metadataBuilder.getLifecycleVersion();
+	}
+
+	@Override
+	public QLicense getLicense() {
+		return null;
+	}
+
+	@Override
+	public String getCreator() {
+		return metadataBuilder.getOpenOLATMetadataCreator();
+	}
+
+	@Override
+	public String getEditor() {
+		return metadataBuilder.getQtiMetadaToolVendor();
+	}
+
+	@Override
+	public String getEditorVersion() {
+		return metadataBuilder.getQtiMetadataToolVersion();
+	}
+
+	@Override
+	public String getDirectory() {
+		return directory;
+	}
+}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/metadata/MetadataChangedEvent.java b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/MetadataChangedEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..418c98e857203db87f17757770969e562109b9ba
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/MetadataChangedEvent.java
@@ -0,0 +1,39 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.ims.qti21.ui.editor.metadata;
+
+import org.olat.core.gui.control.Event;
+
+/**
+ * 
+ * Initial date: 8 janv. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class MetadataChangedEvent extends Event {
+
+	private static final long serialVersionUID = 978018182214795733L;
+	private static final String METADATA_CHANGED = "metadata-changed";
+	
+	public MetadataChangedEvent() {
+		super(METADATA_CHANGED);
+	}
+
+}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/metadata/MetadataController.java b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/MetadataController.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f3bda553b96efc116285cf5ded6c28b5d212e4f
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/metadata/MetadataController.java
@@ -0,0 +1,83 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.ims.qti21.ui.editor.metadata;
+
+import java.util.Locale;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.util.Util;
+import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder;
+import org.olat.modules.qpool.MetadataSecurityCallback;
+import org.olat.modules.qpool.QPoolSecurityCallback;
+import org.olat.modules.qpool.QuestionItem;
+import org.olat.modules.qpool.ui.QuestionsController;
+import org.olat.modules.qpool.ui.events.QItemEdited;
+import org.olat.modules.qpool.ui.metadata.MetadatasController;
+
+/**
+ * 
+ * Initial date: 8 janv. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class MetadataController extends BasicController {
+	
+	private MetadatasController metadataCtrl;
+	
+	
+	public MetadataController(UserRequest ureq, WindowControl wControl,
+			ManifestMetadataBuilder metadataBuilder, boolean readOnly) {
+		super(ureq, wControl, Util.createPackageTranslator(QuestionsController.class, ureq.getLocale()));
+
+		Locale locale = getLocale();
+		QuestionItem item = new ManifestMetadataItemized(metadataBuilder, locale.getLanguage());
+		QPoolSecurityCallback qPoolSecurityCallback = new AssessmentItemEditorQPoolSecurityCallback();
+		MetadataSecurityCallback metadataScurityCallback = new AssessmentItemEditorMetadataSecurityCallback(readOnly);
+			
+		metadataCtrl = new MetadatasController(ureq, wControl, qPoolSecurityCallback, item, metadataScurityCallback, false, true);
+		listenTo(metadataCtrl);
+		putInitialPanel(metadataCtrl.getInitialComponent());
+	}
+
+	@Override
+	protected void doDispose() {
+		//
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Component source, Event event) {
+		//
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Controller source, Event event) {
+		if(metadataCtrl == source) {
+			if(event instanceof QItemEdited) {
+				fireEvent(ureq, new MetadataChangedEvent());
+			}
+		}
+		super.event(ureq, source, event);
+	}
+}
diff --git a/src/main/java/org/olat/modules/lecture/ui/AbstractTeacherOverviewController.java b/src/main/java/org/olat/modules/lecture/ui/AbstractTeacherOverviewController.java
index e1986a76dec860869f519da4142d8fa5e1fdde9d..f639b41ec8389e992ce93e825fb02ef56383d946 100644
--- a/src/main/java/org/olat/modules/lecture/ui/AbstractTeacherOverviewController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/AbstractTeacherOverviewController.java
@@ -298,9 +298,6 @@ public abstract class AbstractTeacherOverviewController extends BasicController
 		} else if(searchCtrl == source) {
 			if(event instanceof SearchLecturesBlockEvent) {
 				doSearch((SearchLecturesBlockEvent)event);
-			} else if(event == Event.CANCELLED_EVENT) {
-				currentSearchParams = new LecturesBlockSearchParameters();
-				loadModel(currentSearchParams);
 			}
 		}
 		super.event(ureq, source, event);
diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewSearchController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewSearchController.java
index 8232e1c6766dc319403cbc2b4e2ded8c9ece2414..22876eefaf02be484f1990cb73ab5ea7a2fc9902 100644
--- a/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewSearchController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/TeacherOverviewSearchController.java
@@ -30,7 +30,6 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.context.ContextEntry;
@@ -167,7 +166,7 @@ public class TeacherOverviewSearchController extends FormBasicController impleme
 		searchEl.setValue(null);
 		startEl.setDate(defaultStartDate);
 		endEl.setDate(defaultEndDate);
-		fireEvent(ureq, Event.CANCELLED_EVENT);
+		doSearch(ureq);
 	}
 	
 	private void doSearch(UserRequest ureq) {
diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/AbsenceNoticesListController.java b/src/main/java/org/olat/modules/lecture/ui/coach/AbsenceNoticesListController.java
index 8f459f9471e3a0b03b98e732b77674f57fbfdc79..c1882aea0fdbe9e3bb37f58de5ffb9b48b50b5f7 100644
--- a/src/main/java/org/olat/modules/lecture/ui/coach/AbsenceNoticesListController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/coach/AbsenceNoticesListController.java
@@ -248,21 +248,23 @@ public class AbsenceNoticesListController extends FormBasicController {
 		}
 		
 		// decorate with teachers
-		LecturesBlockSearchParameters searchTeachersParams = new LecturesBlockSearchParameters();
-		List<LectureBlockRef> lectureBlocks = blockWithNotices.stream()
-				.map(LectureBlockWithNotice::getLectureBlock).collect(Collectors.toList());
-		searchTeachersParams.setLectureBlocks(lectureBlocks);
-		List<LectureBlockWithTeachers> teacherBlocks = lectureService.getLectureBlocksWithTeachers(searchTeachersParams);
 		Map<Long, List<Identity>> blockKeyWithTeachersMap = new HashMap<>();
-		Map<Identity,Identity> deduplicatesTeachers = new HashMap<>();
-		for(LectureBlockWithTeachers teacherBlock:teacherBlocks) {
-			Long lectureBlockKey = teacherBlock.getLectureBlock().getKey();
-			List<Identity> blockList = blockKeyWithTeachersMap
-					.computeIfAbsent(lectureBlockKey, key -> new ArrayList<>());
-			// prevent to load 100X the same identity object
-			for(Identity teacher:teacherBlock.getTeachers()) {
-				Identity uniqueTeacher = deduplicatesTeachers.computeIfAbsent(teacher, t -> t);
-				blockList.add(uniqueTeacher);
+		if(!blockWithNotices.isEmpty()) {
+			LecturesBlockSearchParameters searchTeachersParams = new LecturesBlockSearchParameters();
+			List<LectureBlockRef> lectureBlocks = blockWithNotices.stream()
+					.map(LectureBlockWithNotice::getLectureBlock).collect(Collectors.toList());
+			searchTeachersParams.setLectureBlocks(lectureBlocks);
+			List<LectureBlockWithTeachers> teacherBlocks = lectureService.getLectureBlocksWithTeachers(searchTeachersParams);
+			Map<Identity,Identity> deduplicatesTeachers = new HashMap<>();
+			for(LectureBlockWithTeachers teacherBlock:teacherBlocks) {
+				Long lectureBlockKey = teacherBlock.getLectureBlock().getKey();
+				List<Identity> blockList = blockKeyWithTeachersMap
+						.computeIfAbsent(lectureBlockKey, key -> new ArrayList<>());
+				// prevent to load 100X the same identity object
+				for(Identity teacher:teacherBlock.getTeachers()) {
+					Identity uniqueTeacher = deduplicatesTeachers.computeIfAbsent(teacher, t -> t);
+					blockList.add(uniqueTeacher);
+				}
 			}
 		}
 
diff --git a/src/main/java/org/olat/modules/qpool/QuestionItemEditable.java b/src/main/java/org/olat/modules/qpool/QuestionItemEditable.java
new file mode 100644
index 0000000000000000000000000000000000000000..196f622ffda384abae7288509368575a8a8c20ad
--- /dev/null
+++ b/src/main/java/org/olat/modules/qpool/QuestionItemEditable.java
@@ -0,0 +1,68 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.qpool;
+
+import java.math.BigDecimal;
+
+import org.olat.modules.qpool.model.QEducationalContext;
+import org.olat.modules.taxonomy.TaxonomyLevel;
+
+/**
+ * 
+ * Initial date: 8 janv. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public interface QuestionItemEditable {
+	
+	public void setTopic(String topic);
+	
+	public void setKeywords(String keywords);
+	
+	public void setCoverage(String coverage);
+	
+	public void setAdditionalInformations(String informations);
+
+	public void setLanguage(String language);
+
+	public void setAssessmentType(String type);
+	
+	public void setEducationalContext(QEducationalContext context);
+	
+	public void setTaxonomyLevel(TaxonomyLevel taxonomyLevel);
+	
+	
+	public void setEducationalLearningTime(String time);
+	
+	public void setCorrectionTime(Integer timeInMinutes);
+	
+	
+	public void setDifficulty(BigDecimal difficulty);
+	
+	public void setStdevDifficulty(BigDecimal stdevDifficulty);
+	
+	public void setDifferentiation(BigDecimal differentiation);
+	
+	public void setNumOfAnswerAlternatives(int numOfAnswerAlternatives);
+	
+	public void setUsage(int usage);
+	
+
+}
diff --git a/src/main/java/org/olat/modules/qpool/model/QuestionItemImpl.java b/src/main/java/org/olat/modules/qpool/model/QuestionItemImpl.java
index 94e8d2703c465e65c96fe6aed933107b0b66b2dd..c3762a1968232874d4e033e0cd897b2052173584 100644
--- a/src/main/java/org/olat/modules/qpool/model/QuestionItemImpl.java
+++ b/src/main/java/org/olat/modules/qpool/model/QuestionItemImpl.java
@@ -41,6 +41,7 @@ import org.olat.basesecurity.SecurityGroup;
 import org.olat.basesecurity.SecurityGroupImpl;
 import org.olat.core.id.Persistable;
 import org.olat.core.util.StringHelper;
+import org.olat.modules.qpool.QuestionItemEditable;
 import org.olat.modules.qpool.QuestionItemFull;
 import org.olat.modules.qpool.QuestionStatus;
 import org.olat.modules.taxonomy.TaxonomyLevel;
@@ -54,7 +55,7 @@ import org.olat.modules.taxonomy.model.TaxonomyLevelImpl;
 @Entity(name="questionitem")
 @Table(name="o_qp_item")
 @NamedQuery(name="loadQuestionItemByKey", query="select item from questionitem item where item.key=:itemKey")
-public class QuestionItemImpl implements QuestionItemFull, Persistable {
+public class QuestionItemImpl implements QuestionItemFull, QuestionItemEditable, Persistable {
 
 	private static final long serialVersionUID = 6264601750280239307L;
 
@@ -216,6 +217,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return topic;
 	}
 
+	@Override
 	public void setTopic(String topic) {
 		this.topic = topic;
 	}
@@ -234,6 +236,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return coverage;
 	}
 
+	@Override
 	public void setCoverage(String coverage) {
 		this.coverage = coverage;
 	}
@@ -243,6 +246,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return additionalInformations;
 	}
 
+	@Override
 	public void setAdditionalInformations(String additionalInformations) {
 		this.additionalInformations = additionalInformations;
 	}
@@ -252,6 +256,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return taxonomyLevel;
 	}
 
+	@Override
 	public void setTaxonomyLevel(TaxonomyLevel taxonomyLevel) {
 		this.taxonomyLevel = taxonomyLevel;
 	}
@@ -278,6 +283,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return educationalContext;
 	}
 
+	@Override
 	public void setEducationalContext(QEducationalContext educationalContext) {
 		this.educationalContext = educationalContext;
 	}
@@ -295,6 +301,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return educationalLearningTime;
 	}
 
+	@Override
 	public void setEducationalLearningTime(String educationalLearningTime) {
 		this.educationalLearningTime = educationalLearningTime;
 	}
@@ -304,6 +311,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return difficulty;
 	}
 
+	@Override
 	public void setDifficulty(BigDecimal difficulty) {
 		this.difficulty = difficulty;
 	}
@@ -313,6 +321,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return stdevDifficulty;
 	}
 
+	@Override
 	public void setStdevDifficulty(BigDecimal stdevDifficulty) {
 		this.stdevDifficulty = stdevDifficulty;
 	}
@@ -322,6 +331,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return differentiation;
 	}
 
+	@Override
 	public void setDifferentiation(BigDecimal differentiation) {
 		this.differentiation = differentiation;
 	}
@@ -331,6 +341,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return numOfAnswerAlternatives;
 	}
 
+	@Override
 	public void setNumOfAnswerAlternatives(int numOfAnswerAlternatives) {
 		this.numOfAnswerAlternatives = numOfAnswerAlternatives;
 	}
@@ -340,6 +351,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return usage;
 	}
 
+	@Override
 	public void setUsage(int usage) {
 		this.usage = usage;
 	}
@@ -349,6 +361,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return assessmentType;
 	}
 
+	@Override
 	public void setAssessmentType(String assessmentType) {
 		this.assessmentType = assessmentType;
 	}
@@ -386,6 +399,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return language;
 	}
 
+	@Override
 	public void setLanguage(String language) {
 		this.language = language;
 	}
@@ -420,6 +434,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return correctionTime;
 	}
 
+	@Override
 	public void setCorrectionTime(Integer correctionTime) {
 		this.correctionTime = correctionTime;
 	}
@@ -429,6 +444,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
 		return keywords;
 	}
 
+	@Override
 	public void setKeywords(String keywords) {
 		this.keywords = keywords;
 	}
diff --git a/src/main/java/org/olat/modules/qpool/security/ProcesslessSecurityCallback.java b/src/main/java/org/olat/modules/qpool/security/ProcesslessSecurityCallback.java
index 54635978bfd939651e4408af618419f8b7b6062d..f35a647c4c3860f5e35f28ab710249526153d181 100644
--- a/src/main/java/org/olat/modules/qpool/security/ProcesslessSecurityCallback.java
+++ b/src/main/java/org/olat/modules/qpool/security/ProcesslessSecurityCallback.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.qpool.security;
 
-import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItemSecurityCallback;
 import org.olat.modules.qpool.QuestionItemView;
 import org.olat.modules.qpool.QuestionPoolModule;
@@ -45,8 +44,6 @@ public class ProcesslessSecurityCallback implements QuestionItemSecurityCallback
 
 	@Autowired
 	private QuestionPoolModule qpoolModule;
-	@Autowired
-	private QPoolService qpoolService;
 	
 	@Override
 	public void setQuestionItemView(QuestionItemView itemView) {
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
index beedcb759a29ca9bf9f168fbe1ca101f53e77792..d2ffe82f263eb1aa847bf7deee4d1695d55656ca 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java
@@ -170,7 +170,7 @@ public class QuestionItemDetailsController extends BasicController implements To
 
 	private void setMetadatasController(UserRequest ureq, QuestionItem item, QuestionItemSecurityCallback securityCallback) {
 		metadatasCtrl = new MetadatasController(ureq, getWindowControl(), qPoolSecurityCallback, item, securityCallback,
-				itemSource.isAdminItemSource());
+				itemSource.isAdminItemSource(), false);
 		mainVC.put("metadatas", metadatasCtrl.getInitialComponent());
 		listenTo(metadatasCtrl);
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/QuickViewMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/QuickViewMetadataController.java
index d9afe6d55dba91dbc85d6809e35067271ba5f151..a84ba6e6b358134672e08ae4d4ab5c0f81f495c3 100644
--- a/src/main/java/org/olat/modules/qpool/ui/QuickViewMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/QuickViewMetadataController.java
@@ -60,7 +60,7 @@ public class QuickViewMetadataController extends BasicController {
 			metadataPanel.setContent(null);
 		} else {
 			removeAsListenerAndDispose(metadataCtrl);
-			metadataCtrl = new MetadatasController(ureq, getWindowControl(), qPoolSecurityCallback, item, metadataSecurityCallback, false);
+			metadataCtrl = new MetadatasController(ureq, getWindowControl(), qPoolSecurityCallback, item, metadataSecurityCallback, false, false);
 			metadataPanel.setContent(metadataCtrl.getInitialComponent());
 		}
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java
index 399917a9bb8a07dc78c5657a4410ffd33191a333..d6776d49a2a25c8573a469e0f4a6081955bf0782 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/GeneralMetadataEditController.java
@@ -40,6 +40,7 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItemAuditLog.Action;
 import org.olat.modules.qpool.QuestionItemAuditLogBuilder;
+import org.olat.modules.qpool.QuestionItemEditable;
 import org.olat.modules.qpool.model.QEducationalContext;
 import org.olat.modules.qpool.model.QuestionItemImpl;
 import org.olat.modules.qpool.ui.QuestionsController;
@@ -78,8 +79,8 @@ public class GeneralMetadataEditController extends FormBasicController {
 	
 	public GeneralMetadataEditController(UserRequest ureq, WindowControl wControl,
 			QPoolSecurityCallback qPoolSecurityCallback, QuestionItem item, MetadataSecurityCallback securityCallback,
-			boolean ignoreCompetences) {
-		super(ureq, wControl, LAYOUT_VERTICAL);
+			boolean ignoreCompetences, boolean wideLayout) {
+		super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
 		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.qPoolSecurityCallback = qPoolSecurityCallback;
@@ -144,8 +145,8 @@ public class GeneralMetadataEditController extends FormBasicController {
 		buttonsCont.setElementCssClass("o_sel_qpool_metadata_buttons");
 		buttonsCont.setRootForm(mainForm);
 		formLayout.add(buttonsCont);
-		uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
 		uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
+		uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
 	}
 
 	private void buildTaxonomyLevelEl() {
@@ -153,26 +154,25 @@ public class GeneralMetadataEditController extends FormBasicController {
 		String[] selectableKeys = qpoolTaxonomyTreeBuilder.getSelectableKeys();
 		String[] selectableValues = qpoolTaxonomyTreeBuilder.getSelectableValues();
 		taxonomyLevelEl.setKeysAndValues(selectableKeys, selectableValues, null);
-		if (item instanceof QuestionItemImpl) {
-			QuestionItemImpl itemImpl = (QuestionItemImpl) item;
-			TaxonomyLevel selectedTaxonomyLevel = itemImpl.getTaxonomyLevel();
-			if(selectedTaxonomyLevel != null) {
-				String selectedTaxonomyLevelKey = String.valueOf(selectedTaxonomyLevel.getKey());
-				for(String taxonomyKey: qpoolTaxonomyTreeBuilder.getSelectableKeys()) {
-					if(taxonomyKey.equals(selectedTaxonomyLevelKey)) {
-						taxonomyLevelEl.select(taxonomyKey, true);
-					}
+
+		TaxonomyLevel selectedTaxonomyLevel = item.getTaxonomyLevel();
+		if(selectedTaxonomyLevel != null) {
+			String selectedTaxonomyLevelKey = String.valueOf(selectedTaxonomyLevel.getKey());
+			for(String taxonomyKey: qpoolTaxonomyTreeBuilder.getSelectableKeys()) {
+				if(taxonomyKey.equals(selectedTaxonomyLevelKey)) {
+					taxonomyLevelEl.select(taxonomyKey, true);
 				}
-				if (!taxonomyLevelEl.isOneSelected() && itemImpl.getTaxonomyLevel() != null) {
-					if (selectableKeys.length == 0) {
-						selectableKeys = new String[] {"dummy"};
-						selectableValues = new String[1];
-					}
-					selectableValues[0] = itemImpl.getTaxonomyLevel().getDisplayName();
-					taxonomyLevelEl.setEnabled(false);
+			}
+			if (!taxonomyLevelEl.isOneSelected() && selectedTaxonomyLevel != null) {
+				if (selectableKeys.length == 0) {
+					selectableKeys = new String[] {"dummy"};
+					selectableValues = new String[1];
 				}
+				selectableValues[0] = selectedTaxonomyLevel.getDisplayName();
+				taxonomyLevelEl.setEnabled(false);
 			}
 		}
+
 		taxonomyLevelEl.addActionListener(FormEvent.ONCHANGE);
 		setTaxonomicPath();
 	}
@@ -240,11 +240,13 @@ public class GeneralMetadataEditController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		if(item instanceof QuestionItemImpl) {
-			QuestionItemImpl itemImpl = (QuestionItemImpl)item;
+		if(item instanceof QuestionItemEditable) {
+			QuestionItemEditable itemImpl = (QuestionItemEditable)item;
 			QuestionItemAuditLogBuilder builder = qpoolService.createAuditLogBuilder(getIdentity(),
 					Action.UPDATE_QUESTION_ITEM_METADATA);
-			builder.withBefore(itemImpl);
+			if(item instanceof QuestionItemImpl) {
+				builder.withBefore(item);
+			}
 			
 			itemImpl.setTopic(topicEl.getValue());
 			
@@ -284,9 +286,11 @@ public class GeneralMetadataEditController extends FormBasicController {
 			String assessmentType = assessmentTypeEl.isOneSelected()? assessmentTypeEl.getSelectedKey(): null;
 			itemImpl.setAssessmentType(assessmentType);
 
-			item = qpoolService.updateItem(item);
-			builder.withAfter(itemImpl);
-			qpoolService.persist(builder.create());
+			if(item instanceof QuestionItemImpl) {
+				item = qpoolService.updateItem(item);
+				builder.withAfter(item);
+				qpoolService.persist(builder.create());
+			}
 			fireEvent(ureq, new QItemEdited(item));
 		}
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java
index d002777654ba3fe128c843491f66d2fd33ccd2d5..766f8d0d7418356e19b4262ba8a69f190c6df797 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadataBulkChangeController.java
@@ -22,6 +22,7 @@ package org.olat.modules.qpool.ui.metadata;
 import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toBigDecimal;
 import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.toInt;
 import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateBigDecimal;
+import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateInteger;
 import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateElementLogic;
 import static org.olat.modules.qpool.ui.metadata.MetaUIFactory.validateSelection;
 
@@ -84,7 +85,11 @@ public class MetadataBulkChangeController extends FormBasicController {
 	private SingleSelection taxonomyLevelEl;
 	private SingleSelection contextEl;
 	private FormLayoutContainer learningTimeContainer;
-	private IntegerElement learningTimeDayElement, learningTimeHourElement, learningTimeMinuteElement, learningTimeSecondElement;
+	private IntegerElement learningTimeDayElement;
+	private IntegerElement learningTimeHourElement;
+	private IntegerElement learningTimeMinuteElement;
+	private IntegerElement learningTimeSecondElement;
+	private TextElement correctionTimeElement;
 	private SingleSelection assessmentTypeEl;
 	private TextElement difficultyEl, stdevDifficultyEl, differentiationEl, numAnswerAltEl;
 	private SingleSelection licenseEl;
@@ -216,6 +221,10 @@ public class MetadataBulkChangeController extends FormBasicController {
 		learningTimeSecondElement = uifactory.addIntegerElement("learningTime.second", "", 0, learningTimeContainer);
 		learningTimeSecondElement.setDisplaySize(3);
 		
+		correctionTimeElement = uifactory.addTextElement("question.correctionTime", "question.correctionTime", 10, null, questionCont);
+		correctionTimeElement.setDisplaySize(4);
+		decorate(correctionTimeElement, questionCont);
+		
 		difficultyEl = uifactory.addTextElement("question.difficulty", "question.difficulty", 10, null, questionCont);
 		difficultyEl.setExampleKey("question.difficulty.example", null);
 		difficultyEl.setDisplaySize(4);
@@ -331,7 +340,7 @@ public class MetadataBulkChangeController extends FormBasicController {
 	
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
-		boolean allOk = true;
+		boolean allOk = super.validateFormLogic(ureq);
 		
 		//general
 		allOk &= validateElementLogic(topicEl, topicEl.getMaxLength(), false, isEnabled(topicEl));
@@ -345,6 +354,8 @@ public class MetadataBulkChangeController extends FormBasicController {
 		allOk &= validateBigDecimal(stdevDifficultyEl, 0.0d, 1.0d, true);
 		allOk &= validateBigDecimal(differentiationEl, -1.0d, 1.0d, true);
 		
+		allOk &= validateInteger(correctionTimeElement, 0, 1000, isEnabled(correctionTimeElement));
+
 		//technical
 		allOk &= validateElementLogic(versionEl, versionEl.getMaxLength(), false, isEnabled(versionEl));
 		allOk &= validateSelection(statusEl, isEnabled(statusEl));
@@ -352,7 +363,7 @@ public class MetadataBulkChangeController extends FormBasicController {
 		//rights
 		allOk &= validateElementLogic(licensorEl, 1000, false, isEnabled(licensorEl));
 		
-		return allOk & super.validateFormLogic(ureq);
+		return allOk;
 	}
 	
 	private boolean isEnabled(FormItem item) {
@@ -422,14 +433,21 @@ public class MetadataBulkChangeController extends FormBasicController {
 			itemImpl.setEducationalLearningTime(timeStr);
 		}
 		
-		if(isEnabled(difficultyEl))
+		if(isEnabled(correctionTimeElement) && StringHelper.isLong(correctionTimeElement.getValue())) {
+			itemImpl.setCorrectionTime(Integer.valueOf(correctionTimeElement.getValue()));
+		}
+		if(isEnabled(difficultyEl)) {
 			itemImpl.setDifficulty(toBigDecimal(difficultyEl.getValue()));
-		if(isEnabled(stdevDifficultyEl))
+		}
+		if(isEnabled(stdevDifficultyEl)) {
 			itemImpl.setStdevDifficulty(toBigDecimal(stdevDifficultyEl.getValue()));
-		if(isEnabled(differentiationEl))
+		}
+		if(isEnabled(differentiationEl)) {
 			itemImpl.setDifferentiation(toBigDecimal(differentiationEl.getValue()));
-		if(isEnabled(numAnswerAltEl))
+		}
+		if(isEnabled(numAnswerAltEl)) {
 			itemImpl.setNumOfAnswerAlternatives(toInt(numAnswerAltEl.getValue()));
+		}
 		if(isEnabled(assessmentTypeEl)) {
 			String assessmentType = assessmentTypeEl.isOneSelected() ? assessmentTypeEl.getSelectedKey() : null;
 			itemImpl.setAssessmentType(assessmentType);
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java
index 4b85f41ca352cbfcefe3451566b72e1fdd800ff9..b8ea068c1cf0fe87f6eee6c6cb291d89505c40ff 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/MetadatasController.java
@@ -57,7 +57,7 @@ public class MetadatasController extends BasicController {
 	private QuestionItem item;
 	
 	public MetadatasController(UserRequest ureq, WindowControl wControl, QPoolSecurityCallback qPoolSecurityCallback,
-			QuestionItem item, MetadataSecurityCallback metadataScurityCallback, boolean ignoreCompetences) {
+			QuestionItem item, MetadataSecurityCallback metadataScurityCallback, boolean ignoreCompetences, boolean wideLayout) {
 		super(ureq, wControl);
 		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
@@ -65,19 +65,21 @@ public class MetadatasController extends BasicController {
 
 		mainVC = createVelocityContainer("item_metadatas");
 		generalEditCtrl = new GeneralMetadataEditController(ureq, wControl, qPoolSecurityCallback, item,
-				metadataScurityCallback, ignoreCompetences);
+				metadataScurityCallback, ignoreCompetences, wideLayout);
 		listenTo(generalEditCtrl);
 		mainVC.put("details_general", generalEditCtrl.getInitialComponent());
 
-		questionEditCtrl = new QuestionMetadataEditController(ureq, wControl, item, metadataScurityCallback);
+		questionEditCtrl = new QuestionMetadataEditController(ureq, wControl, item, metadataScurityCallback, wideLayout);
 		listenTo(questionEditCtrl);
 		mainVC.put("details_question", questionEditCtrl.getInitialComponent());
 		
-		rightsEditCtrl = new RightsMetadataEditController(ureq, wControl, item, metadataScurityCallback);
-		listenTo(rightsEditCtrl);
-		mainVC.put("details_rights", rightsEditCtrl.getInitialComponent());
+		if(item.getResourceableId() != null) {
+			rightsEditCtrl = new RightsMetadataEditController(ureq, wControl, item, metadataScurityCallback, wideLayout);
+			listenTo(rightsEditCtrl);
+			mainVC.put("details_rights", rightsEditCtrl.getInitialComponent());
+		}
 
-		technicalEditCtrl = new TechnicalMetadataEditController(ureq, wControl, item, metadataScurityCallback);
+		technicalEditCtrl = new TechnicalMetadataEditController(ureq, wControl, item, metadataScurityCallback, wideLayout);
 		listenTo(technicalEditCtrl);
 		mainVC.put("details_technical", technicalEditCtrl.getInitialComponent());
 
@@ -150,7 +152,9 @@ public class MetadatasController extends BasicController {
 		this.item = item;
 		generalEditCtrl.setItem(item, metadataSecurityCallback);
 		questionEditCtrl.setItem(item, metadataSecurityCallback);
-		rightsEditCtrl.setItem(item, metadataSecurityCallback);
+		if(rightsEditCtrl != null) {
+			rightsEditCtrl.setItem(item, metadataSecurityCallback);
+		}
 		technicalEditCtrl.setItem(item, metadataSecurityCallback);
 		if (ratingMetadataCtrl != null) {
 			ratingMetadataCtrl.setItem(item);
@@ -173,14 +177,14 @@ public class MetadatasController extends BasicController {
 		Preferences guiPrefs = ureq.getUserSession().getGuiPreferences();
 		String guiPref = (String) guiPrefs.get(MetadatasController.class, GUIPREF_KEY_OPEN_PANEL);
 		String openPanel = guiPref != null? guiPrefToPanel(guiPref): "general";
-		mainVC.contextRemove("inGeneral");
-		mainVC.contextRemove("inQuestion");
-		mainVC.contextRemove("inRights");
-		mainVC.contextRemove("inTechnical");
-		mainVC.contextRemove("inRatings");
-		mainVC.contextRemove("inPools");
-		mainVC.contextRemove("inShares");
-		mainVC.contextPut("in-" + openPanel, "in");
+		mainVC.contextRemove("ingeneral");
+		mainVC.contextRemove("inquestion");
+		mainVC.contextRemove("inrights");
+		mainVC.contextRemove("intechnical");
+		mainVC.contextRemove("inratings");
+		mainVC.contextRemove("inpools");
+		mainVC.contextRemove("inshares");
+		mainVC.contextPut("in" + openPanel.toLowerCase(), "in");
 	}
 	
 	private String guiPrefToPanel(String guiPref) {
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/PoolsMetadataController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/PoolsMetadataController.java
index 01e70b9c49883585bc8a1ba0d5bbcda290f0e08d..10d38a87dc38a4200ec7abd59270f37c937877ff 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/PoolsMetadataController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/PoolsMetadataController.java
@@ -113,7 +113,7 @@ public class PoolsMetadataController extends FormBasicController {
 		public Object getValueAt(int row, int col) {
 			QuestionItem2Pool info = getObject(row);
 			if(col == 0) {
-				return new Boolean(info.isEditable());
+				return Boolean.valueOf(info.isEditable());
 			}
 			return info.getPoolName();
 		}
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java
index b971e57d03cf80cdc5a0f0bb372a6d317f9ba16b..caeffb8e28f5eecc7a45f757c91b302ae1599e28 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/QuestionMetadataEditController.java
@@ -45,6 +45,7 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItemAuditLog.Action;
 import org.olat.modules.qpool.QuestionItemAuditLogBuilder;
+import org.olat.modules.qpool.QuestionItemEditable;
 import org.olat.modules.qpool.manager.MetadataConverterHelper;
 import org.olat.modules.qpool.model.LOMDuration;
 import org.olat.modules.qpool.model.QItemType;
@@ -80,8 +81,8 @@ public class QuestionMetadataEditController extends FormBasicController {
 	private QPoolService qpoolService;
 
 	public QuestionMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item,
-			MetadataSecurityCallback securityCallback) {
-		super(ureq, wControl, LAYOUT_VERTICAL);
+			MetadataSecurityCallback securityCallback, boolean wideLayout) {
+		super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
 		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
@@ -173,8 +174,8 @@ public class QuestionMetadataEditController extends FormBasicController {
 		buttonsCont.setElementCssClass("o_sel_qpool_metadata_buttons");
 		buttonsCont.setRootForm(mainForm);
 		formLayout.add(buttonsCont);
-		uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
 		uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
+		uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
 	}
 	
 	private void setReadOnly(MetadataSecurityCallback securityCallback) {
@@ -223,11 +224,13 @@ public class QuestionMetadataEditController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		if(item instanceof QuestionItemImpl) {
-			QuestionItemImpl itemImpl = (QuestionItemImpl)item;
+		if(item instanceof QuestionItemEditable) {
+			QuestionItemEditable itemImpl = (QuestionItemEditable)item;
 			QuestionItemAuditLogBuilder builder = qpoolService.createAuditLogBuilder(getIdentity(),
 					Action.UPDATE_QUESTION_ITEM_METADATA);
-			builder.withBefore(itemImpl);
+			if(itemImpl instanceof QuestionItemImpl) {
+				builder.withBefore(item);
+			}
 
 			int day = learningTimeDayElement.getIntValue();
 			int hour = learningTimeHourElement.getIntValue();
@@ -256,9 +259,11 @@ public class QuestionMetadataEditController extends FormBasicController {
 				itemImpl.setCorrectionTime(Integer.valueOf(correctionTimeMinuteElement.getValue()));
 			}
 
-			item = qpoolService.updateItem(itemImpl);
-			builder.withAfter(item);
-			qpoolService.persist(builder.create());
+			if(item instanceof QuestionItemImpl) {
+				item = qpoolService.updateItem(item);
+				builder.withAfter(item);
+				qpoolService.persist(builder.create());
+			}
 			fireEvent(ureq, new QItemEdited(item));
 		}
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java
index f6f645d17f471b44db8079e24cb3892ece06bb77..a85e123d0d2db6a6f2dd4d28d43d015e9a7cbfec 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/RightsMetadataEditController.java
@@ -103,8 +103,8 @@ public class RightsMetadataEditController extends FormBasicController {
 	private QuestionPoolLicenseHandler licenseHandler;
 
 	public RightsMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item,
-			MetadataSecurityCallback securityCallback) {
-		super(ureq, wControl, LAYOUT_VERTICAL);
+			MetadataSecurityCallback securityCallback, boolean wideLayout) {
+		super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
 		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
@@ -128,37 +128,47 @@ public class RightsMetadataEditController extends FormBasicController {
 		authorCont.put("manage.owners", managerOwners);
 		
 		if (licenseModule.isEnabled(licenseHandler)) {
-			license = licenseService.loadOrCreateLicense(item);
-
-			LicenseSelectionConfig licenseSelectionConfig = LicenseUIFactory
-					.createLicenseSelectionConfig(licenseHandler, license.getLicenseType());
-			licenseEl = uifactory.addDropdownSingleselect("rights.license", formLayout,
-					licenseSelectionConfig.getLicenseTypeKeys(),
-					licenseSelectionConfig.getLicenseTypeValues(getLocale()));
-			licenseEl.setElementCssClass("o_sel_repo_license");
-			licenseEl.setMandatory(licenseSelectionConfig.isLicenseMandatory());
-			if (licenseSelectionConfig.getSelectionLicenseTypeKey() != null) {
-				licenseEl.select(licenseSelectionConfig.getSelectionLicenseTypeKey(), true);
-			}
-			licenseEl.addActionListener(FormEvent.ONCHANGE);
+			license = loadLicense();
 			
-			licensorEl = uifactory.addTextElement("rights.licensor", 1000, license.getLicensor(), formLayout);
-
-			String freetext = licenseService.isFreetext(license.getLicenseType()) ? license.getFreetext() : "";
-			licenseFreetextEl = uifactory.addTextAreaElement("rights.freetext", 4, 72, freetext, formLayout);
-			LicenseUIFactory.updateVisibility(licenseEl, licensorEl, licenseFreetextEl);
-
-			licenseTextEl = uifactory.addStaticTextElement("rights.licenseText", "", "", formLayout);
-			updateLicenseText();
-
-			buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
-			buttonsCont.setRootForm(mainForm);
-			formLayout.add(buttonsCont);
-			okButton = uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
-			uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
+			if(license != null) {
+				LicenseSelectionConfig licenseSelectionConfig = LicenseUIFactory
+						.createLicenseSelectionConfig(licenseHandler, license.getLicenseType());
+				licenseEl = uifactory.addDropdownSingleselect("rights.license", formLayout,
+						licenseSelectionConfig.getLicenseTypeKeys(),
+						licenseSelectionConfig.getLicenseTypeValues(getLocale()));
+				licenseEl.setElementCssClass("o_sel_repo_license");
+				licenseEl.setMandatory(licenseSelectionConfig.isLicenseMandatory());
+				if (licenseSelectionConfig.getSelectionLicenseTypeKey() != null) {
+					licenseEl.select(licenseSelectionConfig.getSelectionLicenseTypeKey(), true);
+				}
+				licenseEl.addActionListener(FormEvent.ONCHANGE);
+				
+				licensorEl = uifactory.addTextElement("rights.licensor", 1000, license.getLicensor(), formLayout);
+	
+				String freetext = licenseService.isFreetext(license.getLicenseType()) ? license.getFreetext() : "";
+				licenseFreetextEl = uifactory.addTextAreaElement("rights.freetext", 4, 72, freetext, formLayout);
+				LicenseUIFactory.updateVisibility(licenseEl, licensorEl, licenseFreetextEl);
+	
+				licenseTextEl = uifactory.addStaticTextElement("rights.licenseText", "", "", formLayout);
+				updateLicenseText();
+	
+				buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
+				buttonsCont.setRootForm(mainForm);
+				formLayout.add(buttonsCont);
+				uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
+				okButton = uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
+			}
 		}
 	}
 	
+	private ResourceLicense loadLicense() {
+		ResourceLicense resourceLicense = null;
+		if(item.getResourceableId() != null) {
+			resourceLicense = licenseService.loadOrCreateLicense(item);
+		}
+		return resourceLicense;
+	}
+	
 	private void updateLicenseText() {
 		if (licenseTextEl != null && licenseEl != null && licenseEl.isOneSelected()) {
 			String selectedKey = licenseEl.getSelectedKey();
@@ -217,13 +227,15 @@ public class RightsMetadataEditController extends FormBasicController {
 	}
 
 	private void reloadAuthors() {
-		List<Identity> authors = qpoolService.getAuthors(item);
-		List<String> authorLinks = new ArrayList<>(authors.size());
-		for(Identity author:authors) {
-			String name = userManager.getUserDisplayName(author);
-			authorLinks.add(name);
+		if(item.getKey() != null) {
+			List<Identity> authors = qpoolService.getAuthors(item);
+			List<String> authorLinks = new ArrayList<>(authors.size());
+			for(Identity author:authors) {
+				String name = userManager.getUserDisplayName(author);
+				authorLinks.add(name);
+			}
+			authorCont.contextPut("authors", authorLinks);
 		}
-		authorCont.contextPut("authors", authorLinks);
 	}
 	
 	@Override
@@ -245,8 +257,6 @@ public class RightsMetadataEditController extends FormBasicController {
 				qpoolService.removeAuthors(list, Collections.<QuestionItemShort>singletonList(item));
 			}
 			reloadAuthors();
-			//cmc.deactivate();
-			//cleanUp();
 		} else if(source == cmc) {
 			fireEvent(ureq, new QItemEdited(item));
 			cleanUp();
@@ -288,7 +298,7 @@ public class RightsMetadataEditController extends FormBasicController {
 
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
-		boolean allOk = true;
+		boolean allOk = super.validateFormLogic(ureq);
 
 		if (licenseEl != null) {
 			licenseEl.clearError();
@@ -298,7 +308,7 @@ public class RightsMetadataEditController extends FormBasicController {
 			}
 		}
 		
-		return allOk &= super.validateFormLogic(ureq);
+		return allOk;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java
index 5fdde6273a3054fdde85f6cf2e8683a6d373d4e6..2e17ff342a8df1aadefa6f90dfbedb5d883c5cd7 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/TechnicalMetadataEditController.java
@@ -31,6 +31,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Formatter;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.modules.qpool.MetadataSecurityCallback;
 import org.olat.modules.qpool.QPoolService;
@@ -55,7 +56,7 @@ public class TechnicalMetadataEditController extends FormBasicController  {
 	private StaticTextElement formatEl;
 	private StaticTextElement editorVersionEl;
 	private StaticTextElement lastModifiedEl;
-	private StaticTextElement statusLastMdifiedEl;	
+	private StaticTextElement statusLastModifiedEl;	
 	private TextElement versionEl;
 	private FormLayoutContainer buttonsCont;
 	
@@ -65,8 +66,8 @@ public class TechnicalMetadataEditController extends FormBasicController  {
 	private QPoolService qpoolService;
 
 	public TechnicalMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item,
-			MetadataSecurityCallback securityCallback) {
-		super(ureq, wControl, LAYOUT_VERTICAL);
+			MetadataSecurityCallback securityCallback, boolean wideLayout) {
+		super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
 		setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
 		
 		this.item = item;
@@ -89,19 +90,21 @@ public class TechnicalMetadataEditController extends FormBasicController  {
 		
 		Formatter formatter = Formatter.getInstance(getLocale());
 		String creationDate = formatter.formatDateAndTime(item.getCreationDate());
-		uifactory.addStaticTextElement("technical.creation", creationDate, formLayout);
+		if(StringHelper.containsNonWhitespace(creationDate)) {
+			uifactory.addStaticTextElement("technical.creation", creationDate, formLayout);
+		}
 		
 		lastModifiedEl = uifactory.addStaticTextElement("technical.lastModified", "", formLayout);
 
 		versionEl = uifactory.addTextElement("lifecycle.version", "lifecycle.version", 50, "", formLayout);
 		
-		statusLastMdifiedEl = uifactory.addStaticTextElement("technical.statusLastModified", "", formLayout);
+		statusLastModifiedEl = uifactory.addStaticTextElement("technical.statusLastModified", "", formLayout);
 		
 		buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		buttonsCont.setRootForm(mainForm);
 		formLayout.add(buttonsCont);
-		uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
 		uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
+		uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
 	}
 	
 	private void setReadOnly(MetadataSecurityCallback securityCallback) {
@@ -124,12 +127,14 @@ public class TechnicalMetadataEditController extends FormBasicController  {
 		
 		String lastModified = formatter.formatDateAndTime(item.getLastModified());
 		lastModifiedEl.setValue(lastModified);
+		lastModifiedEl.setVisible(StringHelper.containsNonWhitespace(lastModified));
 		
 		versionEl.setValue(item.getItemVersion());
 		
 		String statusLastModified = formatter.formatDateAndTime(item.getQuestionStatusLastModified());
-		statusLastModified = statusLastModified != null? statusLastModified: "";
-		statusLastMdifiedEl.setValue(statusLastModified);
+		statusLastModified = statusLastModified != null ? statusLastModified: "";
+		statusLastModifiedEl.setValue(statusLastModified);
+		statusLastModifiedEl.setVisible(StringHelper.containsNonWhitespace(statusLastModified));
 	}
 
 	public void setItem(QuestionItem item, MetadataSecurityCallback securityCallback) {
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html
index d794cd318c15388b8fff2f8c0593ed074421cc30..9eb5ac9bd5b7727e92ba35cb7333482cadc0089c 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/_content/item_metadatas.html
@@ -2,11 +2,11 @@
 	<div class="panel panel-default o_sel_qpool_metadata_general">
 		<div class="panel-heading">
 			<h4 class="panel-title">
-				<i id="collapseGeneralToggler" class="o_icon o_icon-fw #if($inGeneral) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+				<i id="collapseGeneralToggler" class="o_icon o_icon-fw #if($ingeneral) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 				<a data-toggle="collapse" data-parent="#accordion" href="#general">$r.translate("general")</a>
 			</h4>
 		</div>
-		<div id="general" class="panel-collapse collapse $!inGeneral">
+		<div id="general" class="panel-collapse collapse $!ingeneral">
 			<div class="panel-body">
 				$r.render("details_general")
 			</div>
@@ -24,11 +24,11 @@
 	<div class="panel panel-default o_sel_qpool_metadata_item_analyse">
 		<div class="panel-heading">
 			<h4 class="panel-title">
-				<i id="collapseQuestionToggler" class="o_icon o_icon-fw #if($inQuestion) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+				<i id="collapseQuestionToggler" class="o_icon o_icon-fw #if($inquestion) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 				<a data-toggle="collapse" data-parent="#accordion" href="#question">$r.translate("question")</a>
 			</h4>
 		</div>
-		<div id="question" class="panel-collapse collapse $!inQuestion">
+		<div id="question" class="panel-collapse collapse $!inquestion">
 			<div class="panel-body">
 				$r.render("details_question")
 			</div>
@@ -43,42 +43,42 @@
 		})
 		</script>
 	</div>
+	#if($r.available("details_rights"))
 	<div class="panel panel-default">
 		<div class="panel-heading">
 			<h4 class="panel-title">
-				<i id="collapseRightsToggler" class="o_icon o_icon-fw #if($inRights) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+				<i id="collapseRightsToggler" class="o_icon o_icon-fw #if($inrights) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 				<a data-toggle="collapse" data-parent="#accordion" href="#rights">
 					$r.translate("rights")
 				</a>
 			</h4>
 		</div>
-		<div id="rights" class="panel-collapse collapse $!inRights">
+		<div id="rights" class="panel-collapse collapse $!inrights">
 			<div class="panel-body">
 				$r.render("details_rights")
 			</div>
 		</div>
 		<script>
-			/* <![CDATA[ */
-				jQuery('#rights').on('hide.bs.collapse', function () {
-					jQuery('#collapseRightsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
-				})
-				jQuery('#rights').on('show.bs.collapse', function () {
-					jQuery('#collapseRightsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
-					$r.backgroundCommand("show","panel","rights")
-				})
-			/* ]]> */
+		jQuery('#rights').on('hide.bs.collapse', function () {
+			jQuery('#collapseRightsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
+		})
+		jQuery('#rights').on('show.bs.collapse', function () {
+			jQuery('#collapseRightsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
+			$r.backgroundCommand("show","panel","rights")
+		})
 		</script>
 	</div>
+	#end
 	<div class="panel panel-default">
 		<div class="panel-heading">
 			<h4 class="panel-title">
-				<i id="collapseTechnicalToggler" class="o_icon o_icon-fw #if($inTechnical) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+				<i id="collapseTechnicalToggler" class="o_icon o_icon-fw #if($intechnical) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 				<a data-toggle="collapse" data-parent="#accordion" href="#technical">
 					$r.translate("technical")
 				</a>
 			</h4>
 		</div>
-		<div id="technical" class="panel-collapse collapse $!inTechnical">
+		<div id="technical" class="panel-collapse collapse $!intechnical">
 			<div class="panel-body">
 				$r.render("details_technical")
 			</div>
@@ -99,27 +99,25 @@
 		<div class="panel panel-default">
 			<div class="panel-heading">
 				<h4 class="panel-title">
-					<i id="collapsRatingsToggler" class="o_icon o_icon-fw #if($inRatings) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+					<i id="collapsRatingsToggler" class="o_icon o_icon-fw #if($inratings) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 					<a data-toggle="collapse" data-parent="#accordion" href="#ratings">
 						$r.translate("menu.ratings")
 					</a>
 				</h4>
 			</div>
-			<div id="ratings" class="panel-collapse collapse $!inRatings">
+			<div id="ratings" class="panel-collapse collapse $!inratings">
 				<div class="panel-body">
 					$r.render("details_ratings")
 				</div>
 			</div>
 			<script>
-				/* <![CDATA[ */
-					jQuery('#ratings').on('hide.bs.collapse', function () {
-						jQuery('#collapsRatingsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
-					})
-					jQuery('#ratings').on('show.bs.collapse', function () {
-						jQuery('#collapsRatingsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
-						$r.backgroundCommand("show","panel","ratings")
-					})
-				/* ]]> */
+			jQuery('#ratings').on('hide.bs.collapse', function () {
+				jQuery('#collapsRatingsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
+			})
+			jQuery('#ratings').on('show.bs.collapse', function () {
+				jQuery('#collapsRatingsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
+				$r.backgroundCommand("show","panel","ratings")
+			})
 			</script>
 		</div>
 	#end
@@ -127,27 +125,25 @@
 		<div class="panel panel-default">
 			<div class="panel-heading">
 				<h4 class="panel-title">
-					<i id="collapsePoolsToggler" class="o_icon o_icon-fw #if($inPools) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+					<i id="collapsePoolsToggler" class="o_icon o_icon-fw #if($inpools) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 					<a data-toggle="collapse" data-parent="#accordion" href="#pools">
 						$r.translate("menu.pools")
 					</a>
 				</h4>
 			</div>
-			<div id="pools" class="panel-collapse collapse $!inPools">
+			<div id="pools" class="panel-collapse collapse $!inpools">
 				<div class="panel-body">
 					$r.render("details_pools")
 				</div>
 			</div>
 			<script>
-				/* <![CDATA[ */
-					jQuery('#pools').on('hide.bs.collapse', function () {
-						jQuery('#collapsePoolsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
-					})
-					jQuery('#pools').on('show.bs.collapse', function () {
-						jQuery('#collapsePoolsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
-						$r.backgroundCommand("show","panel","pools")
-					})
-				/* ]]> */
+			jQuery('#pools').on('hide.bs.collapse', function () {
+				jQuery('#collapsePoolsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
+			})
+			jQuery('#pools').on('show.bs.collapse', function () {
+				jQuery('#collapsePoolsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
+				$r.backgroundCommand("show","panel","pools")
+			})
 			</script>
 		</div>
 	#end
@@ -155,27 +151,25 @@
 		<div class="panel panel-default">
 			<div class="panel-heading">
 				<h4 class="panel-title">
-					<i id="collapseSharesToggler" class="o_icon o_icon-fw #if($inShares) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
+					<i id="collapseSharesToggler" class="o_icon o_icon-fw #if($inshares) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
 					<a data-toggle="collapse" data-parent="#accordion" href="#shares">
 						$r.translate("sharing.shares")
 					</a>
 				</h4>
 			</div>
-			<div id="shares" class="panel-collapse collapse $!inShares">
+			<div id="shares" class="panel-collapse collapse $!inshares">
 				<div class="panel-body">
 					$r.render("details_shares")
 				</div>
 			</div>
 			<script>
-				/* <![CDATA[ */
-					jQuery('#shares').on('hide.bs.collapse', function () {
-						jQuery('#collapseSharesToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
-					})
-					jQuery('#shares').on('show.bs.collapse', function () {
-						jQuery('#collapseSharesToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
-						$r.backgroundCommand("show","panel","shares")
-					})
-				/* ]]> */
+			jQuery('#shares').on('hide.bs.collapse', function () {
+				jQuery('#collapseSharesToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
+			})
+			jQuery('#shares').on('show.bs.collapse', function () {
+				jQuery('#collapseSharesToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
+				$r.backgroundCommand("show","panel","shares")
+			})
 			</script>
 		</div>
 	#end
diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties
index d32036adacaef5fb0ccfa9a736c9a103518af6a9..94e3be847ce45c0a7ba7a5d4a4c3e9b2c8a6a76d 100644
--- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties
@@ -80,14 +80,10 @@ data.collection.topic.type.select=Gegenstandsart
 data.collections=Datenerhebungen
 error.deadline.before.start=Der Endtermin muss sp\u00E4ter sein als der Starttermin.
 error.email.invalid=Email-Adresse ung\u00FCltig.
-<<<<<<< Upstream, based on origin/master
 error.input.toolong=Der eingegebene Text ist mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen.
 error.number.greater=Die Zahl muss gr\u00F6sser oder gleich {0} sein.
 error.number.lower=Die Zahl muss kleiner oder gleich {0} sein.
-=======
 error.email.name.no.address=Sie k\u00F6nnen den Namen nur angeben, wenn Sie auch eine Email-Adresse angeben.
-error.input.toolong=Der eingegebene Text ist mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen.
->>>>>>> f9f79a8 OO-4390: Specific sender address of QM e-mails
 error.repo.entry.missing=Der Fragebogen, welchen Sie anzeigen m\u00F6chten, wurde in der Zwischenzeit aus der Ablage der Lernressourcen gel\u00F6scht.
 error.repo.entry.not.replaceable=Der Fragebogen kann nicht mehr ge\u00E4ndert werden.
 error.wrong.number=Ung\u00FCltiges Zahlenfomat.
diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_fr.properties
index 8ac2ea442563589bd9eb5c2905fcdb66884334a6..18deb849b40fea08145bf5c0de043b492d91b1e2 100644
--- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_fr.properties
@@ -1,6 +1,9 @@
-#Tue Jan 07 21:09:02 CET 2020
+#Fri Jan 10 12:35:19 CET 2020
 admin.config.title=Configuration gestion de la qualit\u00E9
 admin.enabled=Gestion de la qualit\u00E9
+admin.from.email=Adresse courriel exp\u00E9diteur
+admin.from.email.help=Ici vous pouvez configurer une adresse courriel pour les courriels envoyer par le module gestion de qualit\u00E9 (invitations, rappels). L'adresse est optionnelle.
+admin.from.name=Nom exp\u00E9diteur
 admin.menu.title=Gestion de la qualit\u00E9
 admin.menu.title.alt=$\:admin.menu.title
 admin.suggestion.email.addresses=Adresses courriels des destinataires
@@ -78,6 +81,7 @@ data.collection.topic.type.select=Type de sujet d'\u00E9valuation
 data.collections=Collectes de donn\u00E9es
 error.deadline.before.start=La date limite doit \u00EAtre apr\u00E8s la date du d\u00E9but.
 error.email.invalid=L'adresse courriel le n'est pas valide.
+error.email.name.no.address=Vous ne pouvez sp\u00E9cifier un nom que si vous avez sp\u00E9cifiez une adresse courrielle auparavant.
 error.input.toolong=Le texte que vous avez entr\u00E9 est trop long ({1} caract\u00E8res). Seulement {0} caract\u00E8res sont autoris\u00E9s.
 error.number.greater=Le nombre doit \u00EAtre plus grand ou \u00E9gal \u00E0 {0}.
 error.number.lower=Le nombre doit \u00EAtre plus petit ou \u00E9gal \u00E0 {0}.
diff --git a/src/main/java/org/olat/modules/video/ui/VideoDisplayController.java b/src/main/java/org/olat/modules/video/ui/VideoDisplayController.java
index 2fdc84fc49790b5317c8229e481486884379a651..d166f6cf904da62cdb6dbd2be5ae7eabece8ebf6 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoDisplayController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoDisplayController.java
@@ -119,11 +119,11 @@ public class VideoDisplayController extends BasicController {
 	private VideoManager videoManager;
 
 	public VideoDisplayController(UserRequest ureq, WindowControl wControl, RepositoryEntry videoEntry, boolean autoWidth) {
-		this(ureq, wControl, videoEntry, null, null, VideoDisplayOptions.valueOf(false, false, false, true, false, autoWidth, null, false, false));
+		this(ureq, wControl, videoEntry, null, null, VideoDisplayOptions.valueOf(false, false, false, true, true, false, autoWidth, null, false, false));
 	}
 	
 	public VideoDisplayController(UserRequest ureq, WindowControl wControl, RepositoryEntry videoEntry) {
-		this(ureq, wControl, videoEntry, null, null, VideoDisplayOptions.valueOf(false, false, false, true, false, false, null, false, false));
+		this(ureq, wControl, videoEntry, null, null, VideoDisplayOptions.valueOf(false, false, false, true, true, false, false, null, false, false));
 	}
 	
 	/**
@@ -196,7 +196,8 @@ public class VideoDisplayController extends BasicController {
 				listenTo(commentsAndRatingCtr);				
 				mainVC.put("commentsAndRating", commentsAndRatingCtr.getInitialComponent());
 			}
-			mainVC.contextPut("showTitleAndDescription", displayOptions.isShowTitleAndDescription());
+			mainVC.contextPut("showTitle", displayOptions.isShowTitle());
+			mainVC.contextPut("showDescription", displayOptions.isShowDescription());
 			mainVC.contextPut("alwaysShowControls", displayOptions.isAlwaysShowControls());
 			mainVC.contextPut("clickToPlayPause", displayOptions.isClickToPlayPause());
 			// Finally load the video, transcoded versions and tracks
@@ -411,8 +412,11 @@ public class VideoDisplayController extends BasicController {
 		mainVC.contextPut("masterUrl", masterUrl);
 		
 		mainVC.contextPut("title", videoEntry.getDisplayname());
-		String desc = (StringHelper.containsNonWhitespace(descriptionText) ? descriptionText : videoEntry.getDescription());
-		setText(desc, "description");
+		if(displayOptions == null || displayOptions.isShowDescription()) {
+			String desc = (StringHelper.containsNonWhitespace(descriptionText) ? descriptionText : videoEntry.getDescription());
+			setText(desc, "description");
+		}
+		
 		String authors = videoEntry.getAuthors();
 		mainVC.contextPut("authors", (StringHelper.containsNonWhitespace(authors) ? authors : null));
 		
diff --git a/src/main/java/org/olat/modules/video/ui/VideoDisplayOptions.java b/src/main/java/org/olat/modules/video/ui/VideoDisplayOptions.java
index 056d0ba6035712b9faf0f79a795d23d0adf31b5a..466bf607e35458b65f83beb24a067fe1fc5ee8ad 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoDisplayOptions.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoDisplayOptions.java
@@ -31,7 +31,8 @@ public class VideoDisplayOptions {
 	private boolean autoplay;
 	private boolean showComments;
 	private boolean showRating;
-	private boolean showTitleAndDescription;
+	private boolean showTitle;
+	private boolean showDescription;
 	private boolean customDescription;
 	private boolean autoWidth;
 	private boolean readOnly;
@@ -44,7 +45,7 @@ public class VideoDisplayOptions {
 	private boolean clickToPlayPause;
 	private boolean authorMode;
 	
-	public static VideoDisplayOptions valueOf(boolean autoplay, boolean showComments, boolean showRating, boolean showTitleAndDescription,
+	public static VideoDisplayOptions valueOf(boolean autoplay, boolean showComments, boolean showRating, boolean showTitle, boolean showDescription,
 			boolean customDescription, boolean autoWidth, String descriptionText, boolean authorMode, boolean readOnly) {
 		VideoDisplayOptions options = new VideoDisplayOptions();
 		options.setAutoplay(autoplay);
@@ -54,7 +55,8 @@ public class VideoDisplayOptions {
 		options.setReadOnly(readOnly);
 		options.setShowComments(showComments);
 		options.setShowRating(showRating);
-		options.setShowTitleAndDescription(showTitleAndDescription);
+		options.setShowTitle(showTitle);
+		options.setShowDescription(showDescription);
 		options.setShowPoster(true);
 		options.setShowQuestions(true);
 		options.setShowAnnotations(true);
@@ -74,7 +76,8 @@ public class VideoDisplayOptions {
 		options.setReadOnly(false);
 		options.setShowComments(false);
 		options.setShowRating(false);
-		options.setShowTitleAndDescription(false);
+		options.setShowTitle(false);
+		options.setShowDescription(false);
 		options.setShowPoster(true);
 		options.setShowQuestions(false);
 		options.setShowAnnotations(false);
@@ -149,14 +152,22 @@ public class VideoDisplayOptions {
 		this.showQuestions = showQuestions;
 	}
 
-	public boolean isShowTitleAndDescription() {
-		return showTitleAndDescription;
+	public boolean isShowTitle() {
+		return showTitle;
 	}
 	
-	public void setShowTitleAndDescription(boolean showTitleAndDescription) {
-		this.showTitleAndDescription = showTitleAndDescription;
+	public void setShowTitle(boolean showTitle) {
+		this.showTitle = showTitle;
 	}
 	
+	public boolean isShowDescription() {
+		return showDescription;
+	}
+
+	public void setShowDescription(boolean showDescription) {
+		this.showDescription = showDescription;
+	}
+
 	public boolean isCustomDescription() {
 		return customDescription;
 	}
diff --git a/src/main/java/org/olat/modules/video/ui/VideoListingController.java b/src/main/java/org/olat/modules/video/ui/VideoListingController.java
index e302d8fbb03083e09629c550436e641a572aeea7..f39b9a16ef1a898dab956d47336dcf8680570f1b 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoListingController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoListingController.java
@@ -166,7 +166,7 @@ public class VideoListingController extends FormBasicController implements Activ
 		RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(ureq, videoEntry);
 		if (reSecurity.canLaunch()) {// no booking implemented for video
 			boolean readOnly = videoEntry.getEntryStatus().decommissioned();
-			VideoDisplayOptions options = VideoDisplayOptions.valueOf(true, true, true, true, false, true, null, false, readOnly);
+			VideoDisplayOptions options = VideoDisplayOptions.valueOf(true, true, true, true, true, false, true, null, false, readOnly);
 			VideoDisplayController videoDisplayCtr = new VideoDisplayController(ureq, getWindowControl(), videoEntry, null, null, options);
 			listenTo(videoDisplayCtr);
 			toolbarPanel.pushController(videoEntry.getDisplayname(), videoDisplayCtr);
diff --git a/src/main/java/org/olat/modules/video/ui/_content/video_run.html b/src/main/java/org/olat/modules/video/ui/_content/video_run.html
index 36d48973cea7eb94f13a99eca11501eaac2c8ff0..3b00fdb4bcc9e37d2801ff1b510c83aea93bc535 100644
--- a/src/main/java/org/olat/modules/video/ui/_content/video_run.html
+++ b/src/main/java/org/olat/modules/video/ui/_content/video_run.html
@@ -137,7 +137,7 @@
 		</script>
 	</div>
 	
-	#if($showTitleAndDescription && $title)
+	#if($r.isTrue($showTitle) && $r.isNotEmpty($title))
 	<h1>$title</h1>
 	#end
 
@@ -147,10 +147,8 @@
 		$r.escapeHtml($authors)
 	</div>
 	#end
-	#if($showTitleAndDescription && $description)
-	<div class="o_desc clearfix">
-		$description
-	</div>
+	#if($r.isTrue($showDescription) && $r.isNotEmpty($description))
+	<div class="o_desc clearfix">$description</div>
 	#end
 	#if($r.available("commentsAndRating"))
 		$r.render("commentsAndRating")
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java
index 32fee0af386611a4d7e77e7e4f0774f06b49f6bd..b0f831047e2f2579336e9392470c4754cc9f87db 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java
@@ -58,6 +58,7 @@ import org.olat.repository.model.SearchMyRepositoryEntryViewParams;
 import org.olat.repository.model.SearchMyRepositoryEntryViewParams.Filter;
 import org.olat.repository.model.SearchMyRepositoryEntryViewParams.OrderBy;
 import org.olat.resource.OLATResource;
+import org.olat.resource.OLATResourceImpl;
 import org.olat.user.UserImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -448,7 +449,10 @@ public class RepositoryEntryMyCourseQueries {
 		switch(filter) {
 			case showAll: break;
 			case onlyCourses:
-				sb.append(" and res.resName='CourseModule'");
+				// much quicker with lot of data than res.resName = 'CourseModule'
+				sb.append(" and exists (select oresname.key from ").append(OLATResourceImpl.class.getName()).append(" as oresname")
+				  .append("    where oresname.key=v.olatResource.key and oresname.resName='CourseModule'")
+				  .append(" )");
 				break;
 			case currentCourses:
 				sb.append(" and lifecycle.validFrom<=:now and lifecycle.validTo>=:now");
diff --git a/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties
index 56ea056a6e699f05d8f37b36510355c244932b3d..c86ac9a36c73a53c282f053bd10c6b232b631875 100644
--- a/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/user/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Wed Jun 26 22:41:56 CEST 2019
+#Fri Jan 10 12:33:34 CET 2020
 Failed=La transmission du fichier a \u00E9chou\u00E9.
 NoImage=L'image ne peut pas \u00EAtre transmise sous ce format de fichier.
 ULLimitExceeded=L'image ne doit pas d\u00E9passer {0} KB.
@@ -138,6 +138,7 @@ reset.desc=Ci-dessous vous pouvez remettre votre configuration personnalis\u00E9
 reset.elements=R\u00E9glages
 reset.elements.guiprefs=Personnalisation des composants \u00E0 l'\u00E9cran (menu, bo\u00EEtes \u00E0 outils, tables, portail, calendrier, etc).
 reset.elements.resume=Restaurer la session
+reset.elements.sysprefs=Configuration syst\u00E8me (notifications, envois de courriels etc)
 reset.submit=R\u00E9initialiser
 reset.title=R\u00E9initialiser les r\u00E9glages
 resume.auto=Oui, automatiquement
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ar.properties
index d7d63c90a57fc79f4fc9b918c2b94458cbf02730..3cffa4ae690f8e798310e1c10f9b6161e8496702 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ar.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u0645\u062E\u0637\u0637 \u0627\u0644\u0639\u0645\u0644 \u0644\u062D\u0630\u0641 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646 \u064A\u062A\u0645 \u062A\u0639\u062F\u064A\u0644\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 {0}\u060C \u064A\u0631\u062C\u0649 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629 \u0641\u0649 \u0648\u0642\u062A \u0644\u0627\u062D\u0642.
 menu.inviteegroup=\u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646/\u0632\u0627\u0626\u0631\u064A\u0646 \u0645\u062C\u0647\u0648\u0644\u064A\u0646
 menu.inviteegroup.alt=\u0625\u062F\u0627\u0631\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 (\u0627\u0644\u0632\u0627\u0626\u0631\u064A\u0646) \u0627\u0644\u0645\u062C\u0647\u0648\u0644\u064A\u0646
 menu.authorgroup=\u0627\u0644\u0645\u0624\u0644\u0641\u064A\u0646
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_bg.properties
index a9051014ba54e254aa5521efc5b49cffceb22d1d..4fb595c1aaff0acccd64e7c3aa4d98c6430b9df6 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_bg.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_bg.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u0420\u0430\u0431\u043E\u0442\u043D\u0430\u0442\u0430 \u0441\u0440\u0435\u0434\u0430, \u043E\u0442\u043D\u0430\u0441\u044F\u0449\u0430 \u0441\u0435 \u0434\u043E \u0438\u0437\u0442\u0440\u0438\u0432\u0430\u043D\u0435\u0442\u043E \u043D\u0430 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0438, \u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u0430\u043D\u0430 \u043E\u0442 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B {0}. \u041C\u043E\u043B\u044F, \u043E\u043F\u0438\u0442\u0430\u0439\u0442\u0435 \u043E\u0442\u043D\u043E\u0432\u043E \u043F\u043E-\u043A\u044A\u0441\u043D\u043E.
 menu.inviteegroup=\u0410\u043D\u043E\u043D\u0438\u043C\u043D\u0438 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0438 / \u0433\u043E\u0441\u0442\u0438
 menu.inviteegroup.alt=\u041C\u0435\u043D\u0430\u0436\u0438\u0440\u0430\u0439\u0442\u0435 \u0433\u0440\u0443\u043F\u0430 \u0441 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438 \u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0438 (\u0433\u043E\u0441\u0442\u0438)
 menu.authorgroup=\u0410\u0432\u0442\u043E\u0440\u0438
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_cs.properties
index ffbc69336488605c89ea147d32b1116914dfc4bf..43f24abdc5e9b091af0b1d2cc3571676813bd1e1 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_cs.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_cs.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=Funk\u010Dnost maz\u00E1n\u00ED u\u017Eivatel\u016F je pr\u00E1v\u011B pou\u017E\u00EDv\u00E1na u\u017Eivateleme {0}. Zkuste to pros\u00EDm pozd\u011Bji.
 menu.administratorgroup=Administr\u00E1to\u0159i
 menu.administratorgroup.alt=Spr\u00E1va skupin administr\u00E1tor\u016F
 menu.inviteegroup=Anonymn\u00ED u\u017Eivatel\u00E9 / hosti
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_da.properties
index 5d3411b3c709bbd871ea622708a185dba43f624c..0b7bd3c0906bf9ff8ba3b9894ebd3bd66fec6d73 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_da.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_da.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=Den p\u00E5g\u00E6ldende workflow til sletning af brugere bliver rettet af bruger {0}. Pr\u00F8v venligst igen senere.
 menu.administratorgroup=Administratorer
 menu.administratorgroup.alt=Administrer administratorgruppen
 menu.inviteegroup=Anonyme brugere / g\u00E6ster
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties
index 77293cd09b12a5b6ab09ab1de02723e2af589cc3..2a8cba7b965406d5420d4ac3220f6828cb6dc1d0 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_de.properties
@@ -9,6 +9,7 @@ allow.request.delete.account.time=Benutzerkonto l\u00F6schen anfragen
 command.move.to.organisation=Organisationsrollen verschieben
 command.next=Weiter zur n\u00E4chsten Benutzer
 command.previous=Zur\u00FCck zur letzten Benutzer
+error.deleteworkflow.locked.by=Der Benutzer-L\u00F6sch-Workflow wird zurzeit von Benutzer {0} bearbeitet. Versuchen Sie es sp\u00E4ter noch einmal.
 error.mail.not.valid=Der Email Adresse ist nicht g\u00FCltig.
 menu.administratorgroup=Administratoren
 menu.administratorgroup.alt=Administratoren verwalten
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_el.properties
index 7c2471ec353ef780afc0779d31dbc03e83be0eaa..546413114a3eb9ba69d1b1164c189b79c3aa0f91 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_el.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u0397 \u03C1\u03BF\u03AE \u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03AC\u03B6\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C0\u03BF \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 {0}. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C1\u03B3\u03CC\u03C4\u03B5\u03C1\u03B1.
 menu.inviteegroup=\u0391\u03BD\u03CE\u03BD\u03C5\u03BC\u03BF\u03B9 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B5\u03C2 / \u03B5\u03C0\u03B9\u03C3\u03BA\u03AD\u03C0\u03C4\u03B5\u03C2
 menu.inviteegroup.alt=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2 \u03B1\u03BD\u03CE\u03BD\u03C5\u03BC\u03C9\u03BD \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD (\u03B5\u03C0\u03B9\u03C3\u03BA\u03AD\u03C0\u03C4\u03B5\u03C2)
 menu.authorgroup=\u03A3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF\u03C2
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties
index e15d30d6bd21ef665f7c828cb23fe01b2502e7a7..aaea44a3ea1e933285e31a07825a0757a5b11139 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_en.properties
@@ -9,7 +9,8 @@ allow.request.delete.account.time=Request user account deletion
 command.move.to.organisation=Move organisation's roles
 command.next=Go to next user
 command.previous=Go to previous user
-error.mail.not.valid=The E-mail addresse is not valid.
+error.deleteworkflow.locked.by=The workflow regarding the deletion of users is being edited by user {0}. Please try again later.
+error.mail.not.valid=The E-mail address is not valid.
 menu.administratorgroup=Administrators
 menu.administratorgroup.alt=Manage administrator group
 menu.authorgroup=Authors
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_es.properties
index f0286df0ca6936a08329dfec8e5fe28aa9b34e69..fd24f29a266dc9b4338de23a77cdafdca6cf759d 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_es.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_es.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=El usuario {0} est\u00E1 borrando usuarios actualmente. Por favor int\u00E9ntelo de nuevo m\u00E1s tarde.
 menu.administratorgroup=Administradores
 menu.administratorgroup.alt=Gestionar grupo de administradores
 menu.inviteegroup=Usuarios/invitados an\u00F3nimos
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_fr.properties
index c5e7b7ed39788e8a8724bfed03580b84c9dd331c..9a6d663f502f23a7b078e307ae29edd83a5c86f3 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,5 @@
 #Fri Jul 05 08:41:00 CEST 2019
+error.deleteworkflow.locked.by=Le workfow de suppression d'utilisateurs est \u00E9dit\u00E9 en ce moment par {0}. Veuillez essayer plus tard SVP.
 admin.menu.title.request=Effacement de comptes
 admin.menu.title.request.alt=Demandes d'effacement de comptes
 allow.request.delete.account=Autoriser les utilisateurs \u00E0 demander \u00E0 effacer leur compte
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_it.properties
index 4c4cc19068067d08b75e627827607bda5a2ca46f..95eb8fe397700b80dd55dd6ba13a9c573526c29e 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_it.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=Il workflow di eliminazione degli utenti viene attualmente elaborato dall'utente {0}. Riprovi pi\u00F9 tardi.
 menu.administratorgroup=Amministratori
 menu.administratorgroup.alt=Gestione del gruppo di amministrazione
 menu.inviteegroup=Utenti anonimi / Ospiti
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_jp.properties
index ba32c3903dd9303286c99372a49c8510196c60cc..ef128bae4707dad4cc13b758a375cdc34823f209 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_jp.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_jp.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u30E6\u30FC\u30B6\u524A\u9664\u306B\u95A2\u3059\u308B\u30EF\u30FC\u30AF\u30D5\u30ED\u30FC\u306F\u3001\u30E6\u30FC\u30B6 {0} \u306B\u3088\u3063\u3066\u7DE8\u96C6\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5F8C\u307B\u3069\u3001\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002
 menu.inviteegroup=\u533F\u540D\u30E6\u30FC\u30B6 / \u30B2\u30B9\u30C8
 menu.inviteegroup.alt=\u533F\u540D\u30E6\u30FC\u30B6\u30B0\u30EB\u30FC\u30D7 (\u30B2\u30B9\u30C8) \u3092\u7BA1\u7406\u3059\u308B
 menu.authorgroup=\u4F5C\u8005
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_lt.properties
index ba01232e7feea02a607245de00c225a917960a5a..f1f0005c6b7690c613a2458150de5916b70733ff 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_lt.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_lt.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=Darb\u0173 eiga d\u0117l vartotoj\u0173 panaikinimo yra redaguojama vartotojo {0}. Bandykite dar kart\u0105 v\u0117liau.
 menu.administratorgroup=administratoriai
 menu.administratorgroup.alt=Tvarkyti administravimo grup\u0119
 menu.inviteegroup=Anoniminiai naudotojai / sve\u010Diai
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_nl_NL.properties
index fdb22d5acd352e422a03ac24270bf87f4c56722c..81934dc3614afb00bf326d0ce24d9447aaf6841f 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_nl_NL.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=De werkstroom betreffende de verwijdering van gebruikers wordt aangepast door gebruiker {0}. Gelieve het later opnieuw te proberen.
 menu.administratorgroup=Administrators
 menu.administratorgroup.alt=Beheer de groep administrators
 menu.inviteegroup=Anonieme gebruikers/gasten
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pl.properties
index 75cda0fd63cca95b3e6218846c800a8a640b8641..1a47b03de0d00128f186cf97630223e5a699f5ca 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pl.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=The workflow regarding the deletion of users is being edited by user {0}. Please try again later.
 menu.administratorgroup=Administratorzy
 menu.administratorgroup.alt=Zarz\u0105dzaj grup\u0105 administrator\u00F3w
 menu.inviteegroup=Anonimowy u\u017Cytkownik/go\u015B\u0107
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_BR.properties
index 2771d6b86b0bcb092d6d29eba5077fb736a984b6..3bcd7d4cdbd3cd8cab8fe3414416b4771d61639c 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_BR.properties
@@ -9,6 +9,7 @@ allow.request.delete.account.time=Solicitar exclus\u00E3o da conta do usu\u00E1r
 command.move.to.organisation=Mover os pap\u00E9is da organiza\u00E7\u00E3o
 command.next=Ir para o pr\u00F3ximo usu\u00E1rio
 command.previous=Ir para o usu\u00E1rio anterior
+error.deleteworkflow.locked.by=O fluxo para dele\u00E7\u00E3o de usu\u00E1rios est\u00E1 sendo editado pelo usu\u00E1rio {0}. Tente novamente mais tarde.
 error.mail.not.valid=O endere\u00E7o de e-mail n\u00E3o \u00E9 v\u00E1lido.
 menu.administratorgroup=Administradores
 menu.administratorgroup.alt=Gerenciar grupo de administradores
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_PT.properties
index adb8fe10de7aa0c568eb5b73b3817d6af64a95f1..969efa6a3583136986ac538774e528195eedf78a 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_PT.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_pt_PT.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=O fluxo para dele\u00E7\u00E3o de usu\u00E1rios est\u00E1 sendo editado pelo usu\u00E1rio {0}. Tente novamente mais tarde.
 menu.administratorgroup=Administradores
 menu.administratorgroup.alt=Gerenciar grupo de administradores
 menu.inviteegroup=Usu\u00E1rios/convidados an\u00F4nimos
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ru.properties
index 911172f10843f570a9e7b5399be7d5acb3ffb26b..72b02237cb6fa8c664e30b3e6e47ccc603652e7c 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ru.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_ru.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u0412 \u043D\u0430\u0441\u0442\u043E\u044F\u0449\u0438\u0439 \u043C\u043E\u043C\u0435\u043D\u0442 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C {0}. \u041F\u043E\u043F\u044B\u0442\u0430\u0439\u0442\u0435\u0441\u044C \u043F\u043E\u0437\u0436\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.
 menu.inviteegroup=\u0410\u043D\u043E\u043D\u0438\u043C\u043D\u044B\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 / \u0413\u043E\u0441\u0442\u0438
 menu.inviteegroup.alt=\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0433\u0440\u0443\u043F\u043F\u044B \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 (\u0433\u043E\u0441\u0442\u0435\u0439)
 menu.authorgroup=\u0410\u0432\u0442\u043E\u0440\u044B
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_sq.properties
index a9b669c8abce0f29a82db2ffa27e3ad05c26a0e5..46f6b41ccef913edbaface5212388f9b3e26af73 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_sq.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_sq.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=Plani i pun\u00EBs p\u00EBr fshirjen e shfryt\u00EBzuesit tani p\u00EBr tani \u00EBsht\u00EB duke u p\u00EBrpunuar nga shfryt\u00EBzuesi {0}. Provoni m\u00EB von\u00EB p\u00EBrs\u00EBri.
 menu.administratorgroup=Administrator\u00EBt
 menu.administratorgroup.alt=Drejton grupin e administrator\u00EBve
 menu.inviteegroup=Shfryt\u00EBzuesit anonim / mysafir\u00EBt
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_CN.properties
index 11ca4c43aa9535230e5e38933d0ba97c59ac40d5..3b239a9c58c577cbd5d7120a8386331cdd61e12d 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_CN.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u5220\u9664\u7528\u6237\u7684\u5DE5\u4F5C\u6D41\u7A0B\u6B63\u5728\u88AB\u7528\u6237{{0}}\u7F16\u8F91,\u8BF7\u7A0D\u540E\u518D\u8BD5\u3002
 menu.inviteegroup=\u533F\u540D\u7528\u6237/\u6E38\u5BA2
 menu.inviteegroup.alt=\u5BF9\u533F\u540D\u7528\u6237(\u6E38\u5BA2)\u8FDB\u884C\u7BA1\u7406
 menu.authorgroup=\u521B\u5EFA\u4EBA
diff --git a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_TW.properties
index 7edc663dc3f5930c8b2054f5b52389fa6ec001b4..d30282c30ed87a61d0412ca0774144fd5519ccce 100644
--- a/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_TW.properties
+++ b/src/main/java/org/olat/user/ui/admin/_i18n/LocalStrings_zh_TW.properties
@@ -1,4 +1,5 @@
 #Fri Mar 23 15:13:55 CET 2018
+error.deleteworkflow.locked.by=\u95DC\u65BC\u522A\u9664\u4F7F\u7528\u8005\u7684\u5DE5\u4F5C\u6D41\u7A0B\u6B63\u88AB\u4F7F\u7528\u8005 {0} \u7DE8\u8F2F\u4E2D\u3002\u8ACB\u7A0D\u5F8C\u518D\u8A66\u3002
 menu.inviteegroup=\u533F\u540D\u4F7F\u7528\u8005 / \u8A2A\u5BA2
 menu.inviteegroup.alt=\u7BA1\u7406\u533F\u540D\u4F7F\u7528\u8005\u7FA4\u7D44(\u8A2A\u5BA2)
 menu.authorgroup=\u4F5C\u8005
diff --git a/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx b/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx
index 63dad9ed9c7f57f4fd6e1d72ab7d67165f39eb12..4db14381072ffe20f7b2837dad66c864c6d7571e 100644
Binary files a/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx and b/src/main/resources/org/olat/ims/qti21/questionimport/qti-import-metadata.xlsx differ
diff --git a/src/test/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAOTest.java b/src/test/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAOTest.java
index 78ef64539d0adb9cd9347dd1517fa75eeec135f5..f80be02ab64e6b78c56af5ba4ed3b632f71db964 100644
--- a/src/test/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAOTest.java
+++ b/src/test/java/org/olat/core/commons/services/vfs/manager/VFSMetadataDAOTest.java
@@ -19,14 +19,15 @@
  */
 package org.olat.core.commons.services.vfs.manager;
 
+import java.time.ZonedDateTime;
 import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 
 import org.junit.Assert;
 import org.junit.Test;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.services.vfs.VFSMetadata;
-import org.olat.core.commons.services.vfs.manager.VFSMetadataDAO;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -169,5 +170,26 @@ public class VFSMetadataDAOTest extends OlatTestCase {
 		Assert.assertEquals(metadata, loadedMetadata);
 		Assert.assertEquals(12345l, loadedMetadata.getFileSize());
 	}
-
+	
+	@Test
+	public void getLargest() {
+		int maxResult = 100;
+		Date createdAtNewer = Date.from(ZonedDateTime.now().minusMonths(5).toInstant());
+		Date createdAtOlder = Date.from(ZonedDateTime.now().toInstant());
+		Date editedAtNewer = Date.from(ZonedDateTime.now().minusMonths(5).toInstant());
+		Date editedAtOlder = Date.from(ZonedDateTime.now().toInstant());
+		
+		List<VFSMetadata> queryResult = vfsMetadataDao.getLargest(maxResult, createdAtNewer, createdAtOlder, editedAtNewer, editedAtOlder, null, null, null, null, 0, Long.valueOf(0), 0);
+		dbInstance.commitAndCloseSession();
+		
+		Assert.assertNotNull(queryResult);
+		Assert.assertTrue(queryResult.size() > 0);
+		Assert.assertTrue(queryResult.size() <= maxResult);
+		for (VFSMetadata vfsMetadata : queryResult) {
+			Assert.assertTrue(vfsMetadata.getCreationDate().compareTo(createdAtNewer) >= 0);
+			Assert.assertTrue(vfsMetadata.getCreationDate().compareTo(createdAtOlder) <= 0);
+			Assert.assertTrue(vfsMetadata.getLastModified().compareTo(editedAtNewer) >= 0);
+			Assert.assertTrue(vfsMetadata.getLastModified().compareTo(editedAtOlder) <= 0);
+		}
+	}
 }
diff --git a/src/test/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAOTest.java b/src/test/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAOTest.java
index ad92a601971827ae6d4a03042e5613e82d42aafe..c761c6bab5dcd62285f9f86ac24c4d96fe1b1a7e 100644
--- a/src/test/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAOTest.java
+++ b/src/test/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAOTest.java
@@ -19,12 +19,14 @@
  */
 package org.olat.core.commons.services.vfs.manager;
 
+import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.services.vfs.VFSMetadata;
@@ -221,4 +223,41 @@ public class VFSRevisionDAOTest extends OlatTestCase {
 		long size = revisionDao.calculateRevisionsSize();
 		Assert.assertTrue(size >= 25l);
 	}
+	
+	@Test
+	@Ignore
+	public void getLargest() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("rev-1");
+		VFSMetadata metadata1 = vfsMetadataDao.createMetadata(UUID.randomUUID().toString(), "test/revs", "text1.txt",
+				new Date(), 10l, false, "file:///text.tx", "file", null);
+		VFSRevision revision1 = revisionDao.createRevision(author, "._oo_vr_1_text.txt", 1, 25l, new Date(), "A comment", metadata1);
+		dbInstance.commitAndCloseSession();
+		VFSMetadata metadata2 = vfsMetadataDao.createMetadata(UUID.randomUUID().toString(), "test/revs", "text2.txt",
+				new Date(), 10l, false, "file:///text.tx", "file", null);
+		VFSRevision revision2 = revisionDao.createRevision(author, "._oo_vr_2_text.txt", 1, 25l, new Date(), "A comment", metadata2);
+		dbInstance.commitAndCloseSession();
+		VFSMetadata metadata3 = vfsMetadataDao.createMetadata(UUID.randomUUID().toString(), "test/revs", "text3.txt",
+				new Date(), 10l, false, "file:///text.tx", "file", null);
+		VFSRevision revision3 = revisionDao.createRevision(author, "._oo_vr_3_text.txt", 1, 25l, new Date(), "A comment", metadata3);
+		dbInstance.commitAndCloseSession();
+		
+		int maxResult = 100;
+		Date createdAtNewer = Date.from(ZonedDateTime.now().minusMonths(5).toInstant());
+		Date createdAtOlder = Date.from(ZonedDateTime.now().toInstant());
+		Date editedAtNewer = Date.from(ZonedDateTime.now().minusMonths(5).toInstant());
+		Date editedAtOlder = Date.from(ZonedDateTime.now().toInstant());
+		
+		List<VFSRevision> queryResult = revisionDao.getLargest(maxResult, createdAtNewer, createdAtOlder, editedAtNewer, editedAtOlder, null, null, null, null, 0, Long.valueOf(0), 0);
+		dbInstance.commitAndCloseSession();
+		
+		Assert.assertNotNull(queryResult);
+		Assert.assertTrue(queryResult.size() > 0);
+		Assert.assertTrue(queryResult.size() <= maxResult);
+		for (VFSRevision vfsMetadata : queryResult) {
+			Assert.assertTrue(vfsMetadata.getCreationDate().compareTo(createdAtNewer) >= 0);
+			Assert.assertTrue(vfsMetadata.getCreationDate().compareTo(createdAtOlder) <= 0);
+			Assert.assertTrue(vfsMetadata.getFileLastModified().compareTo(editedAtNewer) >= 0);
+			Assert.assertTrue(vfsMetadata.getFileLastModified().compareTo(editedAtOlder) <= 0);
+		}
+	}
 }
diff --git a/src/test/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAOTest.java b/src/test/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAOTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b9f7da8092b168b4795e0336621cdf1b66af558
--- /dev/null
+++ b/src/test/java/org/olat/core/commons/services/vfs/manager/VFSStatsDAOTest.java
@@ -0,0 +1,69 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.commons.services.vfs.manager;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.services.vfs.model.VFSFileStatistics;
+import org.olat.core.commons.services.vfs.model.VFSRevisionStatistics;
+import org.olat.core.commons.services.vfs.model.VFSThumbnailStatistics;
+import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 18 mars 2019<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class VFSStatsDAOTest extends OlatTestCase {
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private VFSStatsDAO vfsStatsDAO;
+	
+	@Test
+	public void getFileStats() {
+		VFSFileStatistics fileStatistics = vfsStatsDAO.getFileStats();
+		
+		Assert.assertTrue(fileStatistics.getFilesAmount() > 0);
+		Assert.assertTrue(fileStatistics.getFilesSize() > 0);
+		Assert.assertTrue(fileStatistics.getTrashAmount() > 0);
+		Assert.assertTrue(fileStatistics.getTrashSize() > 0);
+	}
+	
+	@Test
+	public void getRevisionStats() {
+		VFSRevisionStatistics revisionStatistics = vfsStatsDAO.getRevisionStats();
+		
+		Assert.assertTrue(revisionStatistics.getRevisionsAmount() >= 0);
+		Assert.assertTrue(revisionStatistics.getRevisionsSize() >= 0);
+	}
+	
+	@Test
+	public void getThumbnailStats() {
+		VFSThumbnailStatistics thumbnailStatistics = vfsStatsDAO.getThumbnailStats();
+		
+		Assert.assertTrue(thumbnailStatistics.getThumbnailsAmount() >= 0);
+		Assert.assertTrue(thumbnailStatistics.getThumbnailsSize() >= 0);
+	}
+}
diff --git a/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java b/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java
index 77f6aa86fd39625b326fe9cb7dc261e09bee62fd..9ab8225d65c34cd11cea8f712222eda05e0c1b62 100644
--- a/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java
+++ b/src/test/java/org/olat/selenium/page/qpool/QuestionMetadataPage.java
@@ -19,6 +19,8 @@
  */
 package org.olat.selenium.page.qpool;
 
+import java.util.List;
+
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
@@ -54,11 +56,17 @@ public class QuestionMetadataPage {
 	private QuestionMetadataPage openMetadata(String panelClass) {
 		By hrefBy = By.cssSelector("div." + panelClass + ">div>h4>a");
 		OOGraphene.waitElement(hrefBy, browser);
-		browser.findElement(hrefBy).click();
-		OOGraphene.waitingALittleLonger();// wait the accordion opens up
 		
-		By generalMetadata = By.cssSelector("div." + panelClass + " div.panel-body fieldset.o_form");
-		OOGraphene.waitElement(generalMetadata, browser);
+		By panelInBy = By.cssSelector("div." + panelClass + " div.panel-collapse.collapse.in");
+		List<WebElement> panelInEls = browser.findElements(panelInBy);
+		if(panelInEls.isEmpty()) {
+			browser.findElement(hrefBy).click();
+			OOGraphene.waitElement(panelInBy, browser);
+			OOGraphene.waitingALittleLonger();// wait the accordion opens up
+		}
+		
+		By formBy = By.cssSelector("div." + panelClass + " div.panel-body fieldset.o_form");
+		OOGraphene.waitElement(formBy, browser);
 		return this;
 	}
 	
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 7f804509c786c8ca99770789007486201511ebe4..cd5cda1c2b2501a8190eb5bed7076eecc1bb9624 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -106,6 +106,7 @@ import org.junit.runners.Suite;
 	org.olat.core.commons.services.vfs.manager.VFSXStreamTest.class,
 	org.olat.core.commons.services.vfs.manager.VFSMetadataDAOTest.class,
 	org.olat.core.commons.services.vfs.manager.VFSRevisionDAOTest.class,
+	org.olat.core.commons.services.vfs.manager.VFSStatsDAOTest.class,
 	org.olat.core.commons.services.vfs.manager.VFSThumbnailDAOTest.class,
 	org.olat.core.commons.services.vfs.manager.VFSRepositoryServiceTest.class,
 	org.olat.core.commons.services.vfs.manager.VFSLockManagerTest.class,