diff --git a/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties
index ec727bf7a84dbfa4e1ffbb1d51f052f0c5a4b51c..77c270482a95b2d11c6576765b2417eba1eb0691 100644
--- a/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/security/_i18n/LocalStrings_fr.properties
@@ -1,2 +1,14 @@
-#Tue Apr 01 21:16:32 CEST 2014
+#Tue Apr 15 21:59:54 CEST 2014
+admin.menu.title=S\u00E9curit\u00E9
+admin.menu.title.alt=Modifier les param\u00E8tres de s\u00E9curit\u00E9
+chelp.ced-sec.title=Les param\u00E8tres de s\u00E9curit\u00E9 du syst\u00E8me
+chelp.sec.force.download=S\u00E9lectionnez ce param\u00E8tre de s\u00E9curit\u00E9 pour forcer le t\u00E9l\u00E9chargement des fichiers dans les dossiers et emp\u00EAcher de les ouvrir directement dans le navigateur. Cela emp\u00EAche de possible attaques de type Cross-Site-Scripting (XSS). Lorsque cette fonction est activ\u00E9e tous les documents sont t\u00E9l\u00E9charg\u00E9s sous forme de fichiers et ne seront pas affich\u00E9s dans le navigateur directement, y compris les documents HTML. Ce comportement ne s'applique pas \u00E0 l'\u00E9l\u00E9ment de cours "Page simple".
+chelp.sec.intro=Les exigences \u00E0 l'\u00E9gard de la s\u00E9curit\u00E9 peuvent varier consid\u00E9rablement en fonction de l'institution. Le niveau de s\u00E9curit\u00E9 n\u00E9cessaire peut \u00EAtre configur\u00E9 ici en tenant compte du risque associ\u00E9.
+chelp.sec.topframe=S\u00E9lectionnez cette option de s\u00E9curit\u00E9 pour emp\u00EAcher OpenOLAT d'\u00EAtre charg\u00E9 dans un cadre HTML ou iFrame. Cela permettra d'\u00E9viter d'\u00E9ventuelles attaques de type Cross-Frame-Scripting (XFS). Si vous activez cette fonction, il n'est plus possible d'int\u00E9grer OpenOLAT dans un site existant en utilisant des cadres/frames.
+chelp.sec.wiki=S\u00E9lectionnez cette option de s\u00E9curit\u00E9 pour d\u00E9sactiver les ressources de type wiki. En ce moment, le module wiki pr\u00E9sente toujours un risque face \u00E0 des attaques de type Cross-Site-Scripting (XSS-). Lorsque cette fonction est activ\u00E9e, les ressources wiki ne peuvent plus \u00EAtre utilis\u00E9s. Lorsqu'elle est d\u00E9sactiv\u00E9e, le wiki peut \u00EAtre utilis\u00E9 avec le risque d'une attaque XSS. Cependant, comme le wiki dispose d'un m\u00E9canisme de r\u00E9vision automatique, il sera difficile pour les attaquants de se cacher apr\u00E8s une attaque.
+help.hover.sec=Aide \u00E0 la configuration des param\u00E8tres de s\u00E9curit\u00E9
 sec.description=S\u00E9curit\u00E9
+sec.force.download=Forcer le t\u00E9l\u00E9chargement dans les dossiers
+sec.title=Param\u00E8tres de s\u00E9curit\u00E9
+sec.topframe=Emp\u00EAcher l'int\u00E9gration dans les cadres/frames
+sec.wiki=Bloquer la resource de type wiki
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
index f03cf5aed5d00ec7b01e588e0e5978803b98b0bc..3b86ad08f6f179e32dccf2b4b9d364323a72ba5b 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
@@ -637,7 +637,9 @@ public class GroupController extends BasicController {
 		
 		// in the end
 		if (enableTablePreferences) {
-			tableCtr.addColumnDescriptor(true, new DefaultColumnDescriptor("table.subject.addeddate", 2, COMMAND_VCARD, ureq.getLocale()));
+			DefaultColumnDescriptor dcd =  new DefaultColumnDescriptor("table.subject.addeddate", 2, COMMAND_VCARD, ureq.getLocale());
+			dcd.setIsPopUpWindowAction(true, "height=700, width=900, location=no, menubar=no, resizable=yes, status=no, scrollbars=yes, toolbar=no");
+			tableCtr.addColumnDescriptor(true, dcd);
 			tableCtr.setSortColumn(++visibleColId,true);	
 		}
 		if (enableUserSelection) {
diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
index f68ac727d16fa4e20757388a44cffd35344b5c5e..ac4438260513bb634717da63c0953e5ec82e8158 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
@@ -58,6 +58,7 @@ import org.olat.core.util.i18n.I18nManager;
 import org.olat.core.util.i18n.I18nModule;
 import org.olat.registration.RegistrationManager;
 import org.olat.registration.TemporaryKey;
+import org.olat.shibboleth.ShibbolethModule;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 
@@ -197,7 +198,10 @@ class ImportStep00 extends BasicStep {
 					if (parts.length > columnId) {
 						pwd = parts[columnId].trim();
 						if (StringHelper.containsNonWhitespace(pwd)) {
-							if (!UserManager.getInstance().syntaxCheckOlatPassword(pwd)) {
+							if(pwd.startsWith(UserImportController.SHIBBOLETH_MARKER)
+									&& ShibbolethModule.isEnableShibbolethLogins()) {
+								//something to check?
+							} else if (!UserManager.getInstance().syntaxCheckOlatPassword(pwd)) {
 								textAreaElement.setErrorKey("error.pwd", new String[] { String.valueOf(i + 1), pwd });
 								importDataError = true;
 								break;
@@ -241,7 +245,7 @@ class ImportStep00 extends BasicStep {
 					idents.add(uIdentity);
 					updateIdents.add(uIdentity);
 					
-					importDataError = updateUserProperties(uIdentity, parts, i, columnId, tempEmailsInUse, importedEmails, true);
+					importDataError = updateUserProperties(uIdentity, parts, i, columnId, tempEmailsInUse, importedEmails);
 					if(importDataError) break;
 				} else {
 					// no identity/user yet, create
@@ -260,7 +264,7 @@ class ImportStep00 extends BasicStep {
 					ud.setName(login);
 					ud.setPassword(pwd);
 					ud.setLanguage(lang);
-					importDataError = updateUserProperties(ud, parts, i, columnId, tempEmailsInUse, importedEmails, false);
+					importDataError = updateUserProperties(ud, parts, i, columnId, tempEmailsInUse, importedEmails);
 					if(importDataError) break;
 					
 					idents.add(ud);
@@ -290,7 +294,7 @@ class ImportStep00 extends BasicStep {
 		}
 		
 		private boolean updateUserProperties(Identity ud, String[] parts, int i, int columnId,
-				Set<String> tempEmailsInUse, List<String> importedEmails, boolean update) {
+				Set<String> tempEmailsInUse, List<String> importedEmails) {
 			
 			boolean importDataError = false;
 			for (int j = 0; j < userPropertyHandlers.size(); j++) {
diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java
index 8e69ff2a751645f9999917dfab89bd63701e472c..bae0dfd4a2791e5b8163b2a1f517ed97c70049ca 100644
--- a/src/main/java/org/olat/admin/user/imp/UserImportController.java
+++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java
@@ -30,6 +30,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.olat.basesecurity.AuthHelper;
 import org.olat.basesecurity.Authentication;
@@ -56,6 +57,8 @@ import org.olat.core.util.mail.MailPackage;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.model.BusinessGroupMembershipChange;
 import org.olat.login.auth.OLATAuthManager;
+import org.olat.shibboleth.ShibbolethDispatcher;
+import org.olat.shibboleth.ShibbolethModule;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 
@@ -71,6 +74,8 @@ import org.olat.user.propertyhandlers.UserPropertyHandler;
  */
 public class UserImportController extends BasicController {
 
+	public static final String SHIBBOLETH_MARKER = "SHIBBOLETH::";
+
 	private List<UserPropertyHandler> userPropertyHandlers;
 	private static final String usageIdentifyer = UserImportController.class.getCanonicalName();
 	private boolean canCreateOLATPassword;
@@ -106,6 +111,7 @@ public class UserImportController extends BasicController {
 	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
 	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
 	 */
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (source==importStepsController){
 			if (event == Event.CANCELLED_EVENT) {
@@ -113,13 +119,25 @@ public class UserImportController extends BasicController {
 				removeAsListenerAndDispose(importStepsController);
 			} else if (event == Event.CHANGED_EVENT || event == Event.DONE_EVENT) {
 				getWindowControl().pop();
+				StepsRunContext ctxt = importStepsController.getRunContext();
+				ImportReport report = (ImportReport)ctxt.get("report");
 				removeAsListenerAndDispose(importStepsController);
-				showInfo("import.success");
+				if(report.isHasErrors()) {
+					StringBuilder errorMsg = new StringBuilder();
+					errorMsg.append("<ul>");
+					for(String error:report.getErrors()) {
+						errorMsg.append("<li>").append(error).append("</li>");
+					}
+					errorMsg.append("</ul>");
+					showError("import.errors", errorMsg.toString());
+				} else {
+					showInfo("import.success");
+				}
 			}
 		}
 	}
 
-	private Identity doCreateAndPersistIdentity(TransientIdentity singleUser) {
+	private Identity doCreateAndPersistIdentity(TransientIdentity singleUser, ImportReport report) {
 		// Create new user and identity and put user to users group
 		String login = singleUser.getName(); //pos 0 is used for existing/non-existing user flag
 		String pwd = singleUser.getPassword();
@@ -148,24 +166,52 @@ public class UserImportController extends BasicController {
 		newUser.getPreferences().setLanguage(lang);
 		newUser.getPreferences().setInformSessionTimeout(true);
 		// Save everything in database
-		Identity ident = AuthHelper.createAndPersistIdentityAndUserWithUserGroup(login, pwd, newUser);
+		Identity ident;
+		if(pwd.startsWith(SHIBBOLETH_MARKER) && ShibbolethModule.isEnableShibbolethLogins()) {
+			String uniqueID = pwd.substring(SHIBBOLETH_MARKER.length());
+			ident = AuthHelper.createAndPersistIdentityAndUserWithUserGroup(login, ShibbolethDispatcher.PROVIDER_SHIB, uniqueID, newUser);
+			report.incrementCreatedUser();
+			report.incrementUpdatedShibboletAuthentication();
+		} else {
+			ident = AuthHelper.createAndPersistIdentityAndUserWithUserGroup(login, pwd, newUser);
+			report.incrementCreatedUser();
+		}
 		return ident;
 	}
 	
-	private Identity doUpdateIdentity(UpdateIdentity userToUpdate, Boolean updateUsers, Boolean updatePassword) {
+	private Identity doUpdateIdentity(UpdateIdentity userToUpdate, Boolean updateUsers, Boolean updatePassword, ImportReport report) {
 		Identity identity;
 		if(updateUsers != null && updateUsers.booleanValue()) {
 			identity = userToUpdate.getIdentity(true);
-			um.updateUserFromIdentity(identity);
+			if(um.updateUserFromIdentity(identity)) {
+				report.incrementUpdatedUser();
+			}
 		} else {
 			identity = userToUpdate.getIdentity();
 		}
 		
 		String password = userToUpdate.getPassword();
-		if(StringHelper.containsNonWhitespace(password) && updatePassword != null && updatePassword.booleanValue()) {
-			Authentication auth = securityManager.findAuthentication(identity, "OLAT");
-			if(auth != null) {
-				olatAuthManager.changePassword(getIdentity(), identity, password);
+		if(StringHelper.containsNonWhitespace(password)) {
+			if(password.startsWith(SHIBBOLETH_MARKER) && ShibbolethModule.isEnableShibbolethLogins()) {
+				String uniqueID = password.substring(SHIBBOLETH_MARKER.length());
+				Authentication auth = securityManager.findAuthentication(identity, ShibbolethDispatcher.PROVIDER_SHIB);
+				if(auth == null) {
+					securityManager.createAndPersistAuthentication(identity, ShibbolethDispatcher.PROVIDER_SHIB, uniqueID, null, null);
+					report.incrementUpdatedShibboletAuthentication();
+				} else if(!uniqueID.equals(auth.getAuthusername())) {
+					//remove the old authentication
+					securityManager.deleteAuthentication(auth);
+					DBFactory.getInstance().commit();
+					//create the new one with the new authusername
+					securityManager.createAndPersistAuthentication(identity, ShibbolethDispatcher.PROVIDER_SHIB, uniqueID, null, null);
+					report.incrementUpdatedShibboletAuthentication();
+				}
+			} else if(updatePassword != null && updatePassword.booleanValue()) {
+				Authentication auth = securityManager.findAuthentication(identity, "OLAT");
+				if(auth != null) {
+					olatAuthManager.changePassword(getIdentity(), identity, password);
+					report.incrementUpdatedPassword();
+				}
 			}
 		}
 		return userToUpdate.getIdentity();
@@ -190,14 +236,15 @@ public class UserImportController extends BasicController {
 		StepRunnerCallback finish = new StepRunnerCallback() {
 			public Step execute(UserRequest ureq1, WindowControl wControl1, StepsRunContext runContext) {
 				// all information to do now is within the runContext saved
-				boolean hasChanges = false;
+				ImportReport report = new ImportReport();
+				runContext.put("report", report);
 				try {
 					if (runContext.containsKey("validImport") && ((Boolean) runContext.get("validImport")).booleanValue()) {
 						// create new users and persist
 						@SuppressWarnings("unchecked")
 						List<TransientIdentity> newIdents = (List<TransientIdentity>) runContext.get("newIdents");
 						for (TransientIdentity newIdent:newIdents) {
-							doCreateAndPersistIdentity(newIdent);
+							doCreateAndPersistIdentity(newIdent, report);
 						}
 
 						Boolean updateUsers = (Boolean)runContext.get("updateUsers");
@@ -205,7 +252,7 @@ public class UserImportController extends BasicController {
 						@SuppressWarnings("unchecked")
 						List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) runContext.get("updateIdents");
 						for (UpdateIdentity updateIdent:updateIdents) {
-							doUpdateIdentity(updateIdent, updateUsers, updatePasswords);
+							doUpdateIdentity(updateIdent, updateUsers, updatePasswords, report);
 						}
 
 						@SuppressWarnings("unchecked")
@@ -213,22 +260,22 @@ public class UserImportController extends BasicController {
 						@SuppressWarnings("unchecked")
 						List<Long> partGroups = (List<Long>) runContext.get("partGroups");
 
-						if (ownGroups.size() > 0 || partGroups.size() > 0){
+						if ((ownGroups != null && ownGroups.size() > 0) || (partGroups != null && partGroups.size() > 0)) {
 							@SuppressWarnings("unchecked")
 							List<Identity> allIdents = (List<Identity>) runContext.get("idents");
 							Boolean sendMailObj = (Boolean)runContext.get("sendMail");
 							boolean sendmail = sendMailObj == null ? true : sendMailObj.booleanValue();
 							processGroupAdditionForAllIdents(allIdents, ownGroups, partGroups, sendmail);
 						}
-						hasChanges = true;
+						report.setHasChanges(true);
 					}
 				} catch (Exception any) {
-					// return new ErrorStep
+					logError("", any);
+					report.addError("Unexpected error, see log files or call your system administrator");
 				}
 				// signal correct completion and tell if changes were made or not.
-				return hasChanges ? StepsMainRunController.DONE_MODIFIED : StepsMainRunController.DONE_UNCHANGED;
+				return report.isHasChanges() ? StepsMainRunController.DONE_MODIFIED : StepsMainRunController.DONE_UNCHANGED;
 			}
-
 		};
 
 		importStepsController = new StepsMainRunController(ureq, getWindowControl(), start, finish, null,
@@ -281,4 +328,73 @@ public class UserImportController extends BasicController {
 		businessGroupService.updateMemberships(getIdentity(), changes, mailing);
 		DBFactory.getInstance().commit();
 	}
+	
+	public static class ImportReport {
+		
+		private boolean hasChanges = false;
+		private boolean hasErrors = false;
+		
+		private AtomicInteger updatedUser = new AtomicInteger(0);
+		private AtomicInteger createdUser = new AtomicInteger(0);
+		private AtomicInteger updatedPassword = new AtomicInteger(0);
+		private AtomicInteger updatedShibboletAuthentication = new AtomicInteger(0);
+		
+		private List<String> errors = new ArrayList<>();
+
+		public boolean isHasChanges() {
+			return hasChanges;
+		}
+
+		public void setHasChanges(boolean hasChanges) {
+			this.hasChanges = hasChanges;
+		}
+
+		public boolean isHasErrors() {
+			return hasErrors;
+		}
+
+		public void setHasErrors(boolean hasErrors) {
+			this.hasErrors = hasErrors;
+		}
+
+		public List<String> getErrors() {
+			return errors;
+		}
+
+		public void addError(String error) {
+			errors.add(error);
+		}
+
+		public int getNumOfUpdatedUser() {
+			return updatedUser.get();
+		}
+
+		public void incrementUpdatedUser() {
+			updatedUser.incrementAndGet();
+		}
+
+		public int getCreatedUser() {
+			return createdUser.get();
+		}
+
+		public void incrementCreatedUser() {
+			createdUser.incrementAndGet();
+		}
+
+		public int getUpdatedPassword() {
+			return updatedPassword.get();
+		}
+
+		public void incrementUpdatedPassword() {
+			updatedPassword.incrementAndGet();
+		}
+
+		public int getUpdatedShibboletAuthentication() {
+			return updatedShibboletAuthentication.get();
+		}
+
+		public void incrementUpdatedShibboletAuthentication() {
+			updatedShibboletAuthentication.incrementAndGet();
+		}
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties
index 603b13f1f0580b9d8cd92c3809319b94857202be..10076212197875f9d55cfa72dd78860dd6c476c9 100644
--- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties
@@ -26,6 +26,7 @@ import.description2=<i>Datenbeispiele\:</i> Sie sehen in einer Beispielabbildung
 import.description3=<i>Dateneingabe\:</i> Sie kopieren die Zeilen aus der Excel-Datei
 import.description4=<i>Vorschau der Benutzerdaten\:</i> Sie sehen, welche Benutzer bereits im System sind und welche neu angelegt werden.
 import.example=Beispielabbildung
+import.errors=Die Benutzer wurden teilweise angelegt. Es gab Fehler während den Import Prozess: {0}
 import.start=Benutzerimport starten
 import.success=Die neuen Benutzer wurden erfolgreich angelegt.
 import.user.existing.alt=Dieser Benutzer existiert bereits, er wird nicht neu angelegt
diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties
index ce36eadc12853a9b8b1ff02f142cf505f405e284..947a7dedf60a386185676ade10ce564f80709b12 100644
--- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Tue Apr 01 18:12:45 CEST 2014
+#Tue Apr 15 22:00:46 CEST 2014
 download.example=T\u00E9l\u00E9charger le mod\u00E8le Excel
 error.columncount=Erreur \u00E0 la ligne {0}\: pas assez d'\u00E9l\u00E9ments
 error.email=Erreur \u00E0 la ligne {0}\: l'adresse e-mail "{1}" n'est pas valide. Veuillez indiquer une adresse e-mail compl\u00E8te et valide.
@@ -25,6 +25,7 @@ import.description1=Ce qui vous attend pendant l'assistant\:
 import.description2=<i>Exemple de donn\u00E9es\:</i> Gr\u00E2ce \u00E0 cet exemple, vous voyez comment le fichier Excel peut \u00EAtre rempli. En plus, un fichier-exemple excel est pr\u00EAt pour \u00EAtre t\u00E9l\u00E9charg\u00E9. 
 import.description3=<i>Exemple de donn\u00E9es\:</i> Vous copiez les lignes du fichier excel.
 import.description4=<i>Aper\u00E7u des donn\u00E9es d'utilisateurs\:</i> Vous voyez quels utilisateurs sont d\u00E9j\u00E0 dans le syst\u00E8me et lesquels seront nouvellement inscrits.
+import.errors=Les utilisateurs ont \u00E9t\u00E9 partiellement import\u00E9s. Il s'est produit un ou plusieurs erreurs lors du processus d'importation\: {0}
 import.example=reproduction d'exemple
 import.start=D\u00E9marrer l'importation des utilisateurs
 import.success=Les nouveaux utilisateurs ont \u00E9t\u00E9 enregistr\u00E9s avec succ\u00E8s.
diff --git a/src/main/java/org/olat/basesecurity/AuthHelper.java b/src/main/java/org/olat/basesecurity/AuthHelper.java
index 6dc07fe69fb773b56ff7e39482a54ae99e9b6ba5..a4fb1649fd07155f1293a8ed03f38f7d951083fd 100644
--- a/src/main/java/org/olat/basesecurity/AuthHelper.java
+++ b/src/main/java/org/olat/basesecurity/AuthHelper.java
@@ -338,7 +338,7 @@ public class AuthHelper {
 	 * @param newUser unpersisted user
 	 * @return Identity
 	 */
-	public static Identity createAndPersistIdentityAndUser(String loginName, String pwd, User newUser) {
+	private static Identity createAndPersistIdentityAndUser(String loginName, String pwd, User newUser) {
 		Identity ident = null;
 		if (pwd == null) {
 			// when no password is used the provider must be set to null to not generate
@@ -362,7 +362,7 @@ public class AuthHelper {
 	 * @param newUser unpersisted users
 	 * @return Identity
 	 */
-	public static Identity createAndPersistIdentityAndUserWithUserGroup(String loginName, String pwd, User newUser) {
+	public static Identity createAndPersistIdentityAndUserWithUserGroup(String loginName, String pwd,  User newUser) {
 		Identity ident = createAndPersistIdentityAndUser(loginName, pwd, newUser);
 		// Add user to system users group
 		BaseSecurity securityManager = BaseSecurityManager.getInstance();
@@ -370,6 +370,25 @@ public class AuthHelper {
 		securityManager.addIdentityToSecurityGroup(ident, olatuserGroup);
 		return ident;
 	}
+	
+	/**
+	 * Persists the given user, creates an identity for it and adds the user to
+	 * the users system group, create an authentication for an external provider
+	 * 
+	 * @param loginName
+	 * @param provider
+	 * @param authusername
+	 * @param newUser
+	 * @return
+	 */
+	public static Identity createAndPersistIdentityAndUserWithUserGroup(String loginName, String provider, String authusername, User newUser) {
+		BaseSecurity securityManager = BaseSecurityManager.getInstance();
+		Identity ident = securityManager.createAndPersistIdentityAndUser(loginName, newUser, provider, authusername, null);
+		// Add user to system users group
+		SecurityGroup olatuserGroup = securityManager.findSecurityGroupByName(Constants.GROUP_OLATUSERS);
+		securityManager.addIdentityToSecurityGroup(ident, olatuserGroup);
+		return ident;
+	}
 
 	/**
 	 * This is a convenience method to log out. IMPORTANT: This method initiates a
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index 8e9b897973da95b7842b253d415b84d734520a41..8c9bd474711246f5964d9fdc6cf08116a54cae20 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -1453,7 +1453,7 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity {
 			public Authentication execute() {
 				Authentication auth = findAuthentication(ident, provider);
 				if(auth == null) {
-					if(algorithm != null) {
+					if(algorithm != null && credentials != null) {
 						String salt = algorithm.isSalted() ? Encoder.getSalt() : null;
 						String hash = Encoder.encrypt(credentials, salt, algorithm);
 						auth = new AuthenticationImpl(ident, provider, authUserName, hash, salt, algorithm.name());
diff --git a/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties
index da65fc10024bcf0ec97bbcc670d2e3cb69538edc..d9300465c66c2f2d7a1ac6642a9bf0245d00a109 100644
--- a/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties
@@ -79,7 +79,7 @@ table.forward=Suivant
 table.header.choice=Selection
 table.sEmptyTable=Cette table ne contient aucune donn\u00E9e
 table.sInfo=Affiche _START_ de _END_ sur _TOTAL_ entr\u00E9es
-table.showall=Afficher tout
+table.showall=Tout afficher
 table.showpages=Pages
 this.language.in.english=French
 this.language.translated=Fran\u00E7ais
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
index 54cc04d6bc21eaf877092ee4ea13cf26d24e201e..9a196c45f45b1db147f45e1f3cd1503ad8ab9623 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
@@ -36,6 +36,8 @@ import org.olat.core.commons.modules.bc.FolderEvent;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.MetaInfoFactory;
+import org.olat.core.commons.services.notifications.NotificationsManager;
+import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.panel.StackedPanel;
@@ -54,6 +56,7 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 import org.olat.core.util.vfs.util.ContainerAndFile;
 
 /**
@@ -135,16 +138,16 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 			if (event == Event.DONE_EVENT) {
 				// we're done, notify listerers
 				fireEvent(ureq, new FolderEvent(FolderEvent.NEW_FILE_EVENT, fileName));	
-				fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
+				notifyFinished(ureq);
 			} else if(event == Event.CANCELLED_EVENT){
-				fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
+				fireEvent(ureq, FOLDERCOMMAND_FINISHED);
 			}
 		} else if(source == createFileForm) {
 			if(event == Event.CANCELLED_EVENT){
-				fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
+				fireEvent(ureq, FOLDERCOMMAND_FINISHED);
 			} else if (event == Event.FAILED_EVENT) {				
 				status = FolderCommandStatus.STATUS_FAILED;
-				fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
+				notifyFinished(ureq);
 			}
 			else if (event == Event.DONE_EVENT) {
         // start HTML editor with the folders root folder as base and the file
@@ -180,6 +183,18 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 			}
 		}
 	}
+	
+	private void notifyFinished(UserRequest ureq) {
+		VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getRootContainer());
+		VFSSecurityCallback secCallback = container.getLocalSecurityCallback();
+		if(secCallback != null) {
+			SubscriptionContext subsContext = secCallback.getSubscriptionContext();
+			if (subsContext != null) {
+				NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true);
+			}
+		}
+		fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+	}
 
 	public String getFileName() {
 		return fileName;
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditContent.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditContent.java
index 8fbdc3f633c657ed28d849ed81901da1bbc64960..7128835de1628ffae10a78164628e9eea1fc6088 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditContent.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditContent.java
@@ -37,6 +37,8 @@ import org.olat.core.commons.editor.plaintexteditor.PlainTextEditorController;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.modules.bc.components.ListRenderer;
 import org.olat.core.commons.modules.bc.version.VersionCommentController;
+import org.olat.core.commons.services.notifications.NotificationsManager;
+import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.Controller;
@@ -52,12 +54,14 @@ import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSLockManager;
 import org.olat.core.util.vfs.VFSManager;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 import org.olat.core.util.vfs.util.ContainerAndFile;
 
 public class CmdEditContent extends BasicController implements FolderCommand {
 
 	private int status = FolderCommandStatus.STATUS_SUCCESS;
 	private VFSItem currentItem;
+	private FolderComponent folderComponent;
 	private Controller editorc;
 	private DialogBoxController lockedFiledCtr;
 
@@ -74,7 +78,7 @@ public class CmdEditContent extends BasicController implements FolderCommand {
 	 * @see org.olat.modules.bc.commands.FolderCommand#execute(org.olat.modules.bc.components.FolderComponent, org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl, org.olat.core.gui.translator.Translator)
 	 */
 	public Controller execute(FolderComponent folderComponent, UserRequest ureq, WindowControl wControl, Translator translator) {
-
+		this.folderComponent = folderComponent;
 		String pos = ureq.getParameter(ListRenderer.PARAM_CONTENTEDITID);
 		if (!StringHelper.containsNonWhitespace(pos)) {
 			// somehow parameter did not make it to us
@@ -153,7 +157,9 @@ public class CmdEditContent extends BasicController implements FolderCommand {
 		return this;
 	}
 
-	public int getStatus() { return status; }
+	public int getStatus() {
+		return status;
+	}
 	
 	public String getFileName() {
 		return currentItem.getName();
@@ -179,7 +185,7 @@ public class CmdEditContent extends BasicController implements FolderCommand {
 					unlockDialogBox = new CloseableModalController(getWindowControl(), translate("ok"), unlockCtr.getInitialComponent());
 					unlockDialogBox.activate();
 				} else {
-					fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+					notifyFinished(ureq);
 				}
 				// cleanup editor
 				removeAsListenerAndDispose(editorc);
@@ -202,6 +208,18 @@ public class CmdEditContent extends BasicController implements FolderCommand {
 		}
 	}
 	
+	private void notifyFinished(UserRequest ureq) {
+		VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getRootContainer());
+		VFSSecurityCallback secCallback = container.getLocalSecurityCallback();
+		if(secCallback != null) {
+			SubscriptionContext subsContext = secCallback.getSubscriptionContext();
+			if (subsContext != null) {
+				NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true);
+			}
+		}
+		fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+	}
+	
 	private void cleanUpUnlockDialog() {
 		if(unlockDialogBox != null) {
 			unlockDialogBox.deactivate();
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java
index 6f27fea66d8636c793098bba2587b98e50e0236e..4c2817675ab8b93239c62a57e2a086b8ea44d2c4 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdEditMeta.java
@@ -33,6 +33,8 @@ import org.olat.core.commons.modules.bc.components.ListRenderer;
 import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.MetaInfoController;
 import org.olat.core.commons.modules.bc.meta.MetaInfoFormController;
+import org.olat.core.commons.services.notifications.NotificationsManager;
+import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.Controller;
@@ -45,6 +47,8 @@ import org.olat.core.util.vfs.VFSConstants;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLockManager;
+import org.olat.core.util.vfs.VFSManager;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 
 public class CmdEditMeta extends BasicController implements FolderCommand {
 
@@ -53,6 +57,7 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 	private MetaInfoController metaCtr;
 	private MetaInfoFormController metaInfoCtr;
 	private VFSItem currentItem;
+	private FolderComponent folderComponent;
 	private Translator translator;
 
 	private final VFSLockManager vfsLockManager;
@@ -72,7 +77,7 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 	public Controller execute(FolderComponent folderComponent,
 			UserRequest ureq, WindowControl wControl, Translator trans) {
 		this.translator = trans;
-
+		this.folderComponent = folderComponent;
 		String pos = ureq.getParameter(ListRenderer.PARAM_EDTID);
 		if (!StringHelper.containsNonWhitespace(pos)) {
 			// somehow parameter did not make it to us
@@ -123,6 +128,7 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 	 *      org.olat.core.gui.control.Controller,
 	 *      org.olat.core.gui.control.Event)
 	 */
+	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
 		if (source == metaInfoCtr && event == Event.DONE_EVENT) {
 			MetaInfo meta = metaInfoCtr.getMetaInfo();
@@ -148,11 +154,23 @@ public class CmdEditMeta extends BasicController implements FolderCommand {
 				}
 			}
 			fireEvent(ureq, new FolderEvent(FolderEvent.EDIT_EVENT, fileName));
-			fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+			notifyFinished(ureq);
 		} else if (event == Event.CANCELLED_EVENT) {
 			fireEvent(ureq, FOLDERCOMMAND_FINISHED);
 		}
 	}
+	
+	private void notifyFinished(UserRequest ureq) {
+		VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getRootContainer());
+		VFSSecurityCallback secCallback = container.getLocalSecurityCallback();
+		if(secCallback != null) {
+			SubscriptionContext subsContext = secCallback.getSubscriptionContext();
+			if (subsContext != null) {
+				NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true);
+			}
+		}
+		fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+	}
 
 	protected void doDispose() {
 		// metaInfoCtr should be auto-disposed
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdMoveCopy.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdMoveCopy.java
index ce80abd00a398c0910d1567ed9aae87a41732f13..5f6d0e9db3f11f1e53dcf521c0b9201081dee9e6 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdMoveCopy.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdMoveCopy.java
@@ -191,7 +191,7 @@ public class CmdMoveCopy extends DefaultController implements FolderCommand {
 					}
 				}
 				fireEvent(ureq, new FolderEvent(move ? FolderEvent.MOVE_EVENT : FolderEvent.COPY_EVENT, fileSelection.renderAsHtml()));
-				fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+				notifyFinished(ureq);
 			} else {
 				// abort
 				status = FolderCommandStatus.STATUS_CANCELED;
@@ -199,6 +199,18 @@ public class CmdMoveCopy extends DefaultController implements FolderCommand {
 			}
 		}
 	}
+	
+	private void notifyFinished(UserRequest ureq) {
+		VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getRootContainer());
+		VFSSecurityCallback secCallback = container.getLocalSecurityCallback();
+		if(secCallback != null) {
+			SubscriptionContext subsContext = secCallback.getSubscriptionContext();
+			if (subsContext != null) {
+				NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true);
+			}
+		}
+		fireEvent(ureq, FOLDERCOMMAND_FINISHED);
+	}
 
 	/**
 	 * Get the list of source files. Sanity check if resolveable, overlapping or
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdUnzip.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdUnzip.java
index 44c10089ddee349b78adf7229d11833341f93871..b47d0cbf11bf35ed8a17ccbc9908d334cf851839 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdUnzip.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdUnzip.java
@@ -35,6 +35,8 @@ import org.olat.core.commons.modules.bc.FolderConfig;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged;
+import org.olat.core.commons.services.notifications.NotificationsManager;
+import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.Controller;
@@ -53,6 +55,7 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 
 public class CmdUnzip extends BasicController implements FolderCommand {
 
@@ -120,6 +123,17 @@ public class CmdUnzip extends BasicController implements FolderCommand {
 				status = FolderCommandStatus.STATUS_FAILED;
 				getWindowControl().setError(translator.translate("FileDoesNotExist"));
 			}
+			
+			VFSContainer inheritingCont = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getRootContainer());
+			if(inheritingCont != null) {
+				VFSSecurityCallback secCallback = inheritingCont.getLocalSecurityCallback();
+				if(secCallback != null) {
+					SubscriptionContext subsContext = secCallback.getSubscriptionContext();
+					if (subsContext != null) {
+						NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true);
+					}
+				}
+			}
 		} catch (IllegalArgumentException e) {
 			logError("Corrupted ZIP", e);
 			String name = currentVfsItem == null ? "NULL" : currentVfsItem.getName();
diff --git a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java
index c72f370a1452e3d5d65d5215b5ee4b7b9d770588..f26c5977d8243312e4c950ced8e5a04abdeaa2d3 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/meta/MetaInfoFormController.java
@@ -197,27 +197,27 @@ public class MetaInfoFormController extends FormBasicController {
 		MetaInfo meta = item == null ? null : metaInfoFactory.createMetaInfoFor((OlatRelPathImpl)item);
 
 		// title
-		String titleVal = StringHelper.escapeHtml(meta != null ? meta.getTitle() : null);
+		String titleVal = (meta != null ? meta.getTitle() : null);
 		title = uifactory.addTextElement("title", "mf.title", -1, titleVal, formLayout);
 
 		// comment/description
-		String commentVal =  StringHelper.xssScan(meta != null ? meta.getComment() : null);
+		String commentVal = (meta != null ? meta.getComment() : null);
 		comment = uifactory.addTextAreaElement("comment", "mf.comment", -1, 3, 1, true, commentVal, formLayout);
 
 		// creator
-		String creatorVal = StringHelper.escapeHtml(meta != null ? meta.getCreator() : null);
+		String creatorVal = (meta != null ? meta.getCreator() : null);
 		creator = uifactory.addTextElement("creator", "mf.creator", -1, creatorVal, formLayout);
 
 		// publisher
-		String publisherVal = StringHelper.escapeHtml(meta != null ? meta.getPublisher() : null);
+		String publisherVal = (meta != null ? meta.getPublisher() : null);
 		publisher = uifactory.addTextElement("publisher", "mf.publisher", -1, publisherVal, formLayout);
 
 		// source/origin
-		String sourceVal = StringHelper.escapeHtml(meta != null ? meta.getSource() : null);
+		String sourceVal = (meta != null ? meta.getSource() : null);
 		source = uifactory.addTextElement("source", "mf.source", -1, sourceVal, formLayout);
 
 		// city
-		String cityVal = StringHelper.escapeHtml(meta != null ? meta.getCity() : null);
+		String cityVal = (meta != null ? meta.getCity() : null);
 		city = uifactory.addTextElement("city", "mf.city", -1, cityVal, formLayout);
 
 		// publish date
@@ -235,15 +235,15 @@ public class MetaInfoFormController extends FormBasicController {
 		publicationYear.setDisplaySize(4);
 
 		// number of pages
-		String pageVal = StringHelper.escapeHtml(meta != null ? meta.getPages() : null);
+		String pageVal = (meta != null ? meta.getPages() : null);
 		pages = uifactory.addTextElement("pages", "mf.pages", -1, pageVal, formLayout);
 
 		// language
-		String langVal = StringHelper.escapeHtml(meta != null ? meta.getLanguage() : null);
+		String langVal = (meta != null ? meta.getLanguage() : null);
 		language = uifactory.addTextElement("language", "mf.language", -1, langVal, formLayout);
 
 		// url/link
-		String urlVal = StringHelper.escapeHtml(meta != null ? meta.getUrl() : null);
+		String urlVal = (meta != null ? meta.getUrl() : null);
 		url = uifactory.addTextElement("url", "mf.url", -1, urlVal, formLayout);
 
 		/* static fields */
diff --git a/src/main/java/org/olat/core/commons/modules/glossary/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/commons/modules/glossary/_i18n/LocalStrings_fr.properties
index 698838b9db32494434e1abf926221c136c105769..06b33aeb4ecefc7e750a7cf26ba699cef1c151ba 100644
--- a/src/main/java/org/olat/core/commons/modules/glossary/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/core/commons/modules/glossary/_i18n/LocalStrings_fr.properties
@@ -42,7 +42,7 @@ glossary.item.at=\u00E0 {0}
 glossary.item.modified.by.on=chang\u00E9 par
 glossary.item.published.by=de
 glossary.list.filter=Filtrer la liste par\:
-glossary.list.showall=Afficher tout
+glossary.list.showall=Tout afficher
 glossary.locked=Ce glossaire est \u00E9dit\u00E9 en ce moment par <b>{0}</b>. Les fonctions d'\u00E9ditions sont donc d\u00E9sactiv\u00E9es.
 glossary.term.synonym=Synonymes
 glossary.title=Glossaire
diff --git a/src/main/java/org/olat/core/commons/services/notifications/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/commons/services/notifications/ui/_i18n/LocalStrings_fr.properties
index 888ab066a9653e4a0069cffcc868dffc2ad0bcf9..076b3d8d6a5fdecb45c6e21596fe2857e30e86be 100644
--- a/src/main/java/org/olat/core/commons/services/notifications/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/core/commons/services/notifications/ui/_i18n/LocalStrings_fr.properties
@@ -52,7 +52,7 @@ notifcations.rss.title=Flux RSS personnel
 notificationsPortlet.description=Raccourci vers les notifications sur vos ressources didactiques abonn\u00E9es
 notificationsPortlet.multiple.news.in={0} modifications dans {1}
 notificationsPortlet.nonotifications=Vous n'avez pas de notification.
-notificationsPortlet.showAll=Afficher toutes
+notificationsPortlet.showAll=Tout afficher
 notificationsPortlet.single.news.in=1 modification dans {0}
 notificationsPortlet.title=Mes notifications
 overview.column.action=Action
diff --git a/src/main/java/org/olat/core/commons/services/webdav/manager/VFSResourceRoot.java b/src/main/java/org/olat/core/commons/services/webdav/manager/VFSResourceRoot.java
index 852aa317779b8cd3d67dda22d29c7e32c34b1d7e..2c4cd1294a67adff37b781df2222d80198d72064 100644
--- a/src/main/java/org/olat/core/commons/services/webdav/manager/VFSResourceRoot.java
+++ b/src/main/java/org/olat/core/commons/services/webdav/manager/VFSResourceRoot.java
@@ -217,11 +217,13 @@ public class VFSResourceRoot implements WebResourceRoot  {
 			return false;
 		}
 
-		VFSContainer folder = childLeaf.getParentContainer();
-		VFSSecurityCallback callback = folder.getLocalSecurityCallback();
-		if(callback != null && callback.getSubscriptionContext() != null) {
-			SubscriptionContext subContext = callback.getSubscriptionContext();
-			NotificationsManager.getInstance().markPublisherNews(subContext, null, true);
+		VFSContainer inheritingCont = VFSManager.findInheritingSecurityCallbackContainer(childLeaf.getParentContainer());
+		if(inheritingCont != null) {
+			VFSSecurityCallback callback = inheritingCont.getLocalSecurityCallback();
+			if(callback != null && callback.getSubscriptionContext() != null) {
+				SubscriptionContext subContext = callback.getSubscriptionContext();
+				NotificationsManager.getInstance().markPublisherNews(subContext, null, true);
+			}
 		}
 		
 		if(childLeaf instanceof MetaTagged && identity != null) {
diff --git a/src/main/java/org/olat/core/gui/components/chart/BarSeries.java b/src/main/java/org/olat/core/gui/components/chart/BarSeries.java
index d22d3ea8447c4d4f07edf85db8bfd14f335338a6..1e8b209ca52e9e004593f8192e681149c7de2b95 100644
--- a/src/main/java/org/olat/core/gui/components/chart/BarSeries.java
+++ b/src/main/java/org/olat/core/gui/components/chart/BarSeries.java
@@ -31,15 +31,17 @@ import java.util.Map;
  */
 public class BarSeries {
 
+	private final String color;
 	private final String legend;
 	private final String cssClass;
 	private List<BarPoint> points = new ArrayList<BarPoint>();
 	
 	public BarSeries() {
-		this(null, null);
+		this(null, null, null);
 	}
 	
-	public BarSeries(String cssClass, String legend) {
+	public BarSeries(String cssClass, String color, String legend) {
+		this.color = color;
 		this.legend = legend;
 		this.cssClass = cssClass;
 	}
@@ -47,6 +49,10 @@ public class BarSeries {
 	public String getCssClass() {
 		return cssClass;
 	}
+	
+	public String getColor() {
+		return color;
+	}
 
 	public String getLegend() {
 		return legend;
diff --git a/src/main/java/org/olat/core/gui/control/controller/BasicController.java b/src/main/java/org/olat/core/gui/control/controller/BasicController.java
index dda5de79331aecdf060d00dc24ad3acb0902baec..277bb3c1abba24f094c4cfdca61cb88f59a86043 100644
--- a/src/main/java/org/olat/core/gui/control/controller/BasicController.java
+++ b/src/main/java/org/olat/core/gui/control/controller/BasicController.java
@@ -453,6 +453,22 @@ public abstract class BasicController extends DefaultController {
 		getWindowControl().setInfo(
 				getTranslator().translate(key, new String[] { arg }));
 	}
+	
+	/**
+	 * convenience method to inform the user. this will call
+	 * 
+	 * <pre>
+	 * getWindowControl().setInfo(getTranslator().translate(key, args));
+	 * </pre>
+	 * 
+	 * @param key
+	 *            the key to use (in the LocalStrings_curlanguage file of your
+	 *            controller)
+	 * @param args
+	 */
+	protected void showInfo(String key, String[] args) {
+		getWindowControl().setInfo(getTranslator().translate(key, args));
+	}
 
 	/**
 	 * convenience method to inform the user with a warning message. this will
diff --git a/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_fr.properties
index 69aa24e58fcc34044f010d690e92ed806af0678c..511f582470c05dca4741d369dd8c2bcaaa07b3b6 100644
--- a/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_fr.properties
@@ -34,7 +34,7 @@ efficiencyStatements.course.noexists=Ce cours a \u00E9t\u00E9 effac\u00E9, vous
 efficiencyStatements.delete.confirm=Voulez-vous vraiment effacer l'attestation de performance du cours <i>{0}</i> ?
 efficiencyStatementsPortlet.description=Raccourci vers les attestation de performance les plus utilis\u00E9es
 efficiencyStatementsPortlet.nostatements=Vous n'avez pas d'attestation de performance.
-efficiencyStatementsPortlet.showAll=Afficher toutes
+efficiencyStatementsPortlet.showAll=Tout afficher
 efficiencyStatementsPortlet.title=Mes attestations 
 efficiencystatement.config=Changer la configuration
 efficiencystatement.config.off=d\u00E9sactiv\u00E9
diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java
index 248c7cc702298c5a149fccd95d01c3ed5e26efdd..64f753eee9733f8b70a7d4d1edb316f0f5b8421a 100644
--- a/src/main/java/org/olat/course/editor/EditorMainController.java
+++ b/src/main/java/org/olat/course/editor/EditorMainController.java
@@ -815,7 +815,7 @@ public class EditorMainController extends MainLayoutBasicController implements G
 			menuTree.setSelectedNodeId(rootNodeIdent);
 			updateViewForSelectedNodeId(ureq, rootNodeIdent);
 			if(event == Event.CHANGED_EVENT){					
-				showInfo("pbl.success", null);
+				showInfo("pbl.success");
 				// do logging
 				ThreadLocalUserActivityLogger.log(CourseLoggingAction.COURSE_EDITOR_PUBLISHED, getClass());
 			}//else Event.DONE -> nothing changed / else Event.CANCELLED -> cancelled wizard	
diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
index 64d4a86f1c7bf0aeb38825584aaf36949f9e9a6d..732413fb277a59c713ec0600a5238e868c0b0292 100644
--- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
@@ -591,7 +591,11 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 		if(passed) {
 			Boolean scoreGrantedBool = (Boolean)config.get(MSCourseNode.CONFIG_KEY_HAS_SCORE_FIELD);
 			if(scoreGrantedBool != null && scoreGrantedBool.booleanValue()) {
-				score = (Float)config.get(MSCourseNode.CONFIG_KEY_SCORE_MAX);
+				score = checkboxManager.calculateScore(assessedIdentity, courseOres, getIdent());
+				Float maxScore = (Float)config.get(MSCourseNode.CONFIG_KEY_SCORE_MAX);
+				if(maxScore != null && maxScore.floatValue() < score) {
+					score = maxScore.floatValue();
+				}
 			}
 		}
 
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_en.properties
index 186ba5b6f92b38e791031eb0271630a24dfe7b83..72bd1238dbbb4b75494f4a021d9b44bca3a88d4f 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_en.properties
@@ -94,7 +94,7 @@ form.error.wrongFloat=$org.olat.course.nodes.ms\:form.error.wrongFloat
 help.hover.checkbox=Help regarding checkboxes edition
 help.hover.config=Help regarding configuration
 help.hover.coach.assessment=Help regarding assessment and management of checklists
-help.hover.assessment.checkbox=help regarding assessment per box
+help.hover.assessment.checkbox=Help regarding assessment per box
 help.hover.checkboxtemplate=Help regarding template
 help.hover.metadatas=Help regarding title and deadline
 help.hover.templateconfiguration=Help regarding configuration
@@ -107,6 +107,7 @@ label.done=Done
 label.inWork=Processed
 label.present=Attendant
 label.presented=Presented
+num.of.checklist=Quantity
 pane.tab.accessibility=Access
 pane.tab.checkbox=Checkboxes
 pane.tab.clconfig=Configuration
@@ -138,3 +139,4 @@ signature=Signature
 sum.cutvalue=Number of checks needed to pass
 table.header.title=$\:checkbox.title
 table.header.edit.checkbox=Edit
+title.prefix=Title
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties
index c98792200168fc598102074e4e2c929cb77f6e5d..3de2225dca9ab299a6028c6b59de4fb87e452979 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/nodes/cl/ui/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Fri Apr 04 17:39:42 CEST 2014
+#Tue Apr 15 23:08:27 CEST 2014
 add.checkbox=Ajouter une case \u00E0 cocher
 assessment=Evaluation
 assessment.checkbox.description=Modifier en fonction de la case \u00E0 cocher\: modifier la case \u00E0 cocher s\u00E9lectionner gr\u00E2ce au filtre de tous les participants.
@@ -17,6 +17,7 @@ chelp.assessment.checkbox.2=La pr\u00E9s\u00E9lection des groupes permet de filt
 chelp.checkbox.1=Ici, vous pouvez cr\u00E9er et \u00E9diter les cases \u00E0 cocher de la liste de contr\u00F4le que vous avez pr\u00E9alablement configur\u00E9e. Dans le tableau, vous trouverez les cases \u00E0 cocher existant d\u00E9j\u00E0 dans cette liste de contr\u00F4le. Cliquez "Ajouter une case \u00E0 cocher" pour cr\u00E9er \u00E0 une nouvelle case \u00E0 cocher. Cela ouvre un nouvel formulaire.
 chelp.checkbox.2=<strong>$\:checkbox.title</strong>\: saisissez un titre court mais descriptif pour la nouvelle case \u00E0 cocher.
 chelp.checkbox.3=<strong>$\:release</strong>\: d\u00E9fini qui peut effectivement s\u00E9lectionn\u00E9 la case. Pour "Participant et entra\u00EEneur", tous deux peuvent cocher la case. Si "Entra\u00EEneur" est choisi, les participants verront la case, mais ne seront pas en mesure de la s\u00E9lectionner.
+chelp.cl-assessment-checkbox.title=Liste de contr\u00F4le\: \u00E9valuation par case \u00E0 cocher
 coach.desc=Dans la liste ci-dessous vous trouverez tous les participants du cours que vous supervisez. S\u00E9lectionnez "$\:table.header.edit.checkbox" pour changer les cases \u00E0 cocher ou le score d'un participant.
 coach.due.date.desc=S'il vous pla\u00EEt noter que cette liste de contr\u00F4le fixe un d\u00E9lai. En tant que coach, vous ne devez effectuer des changements qu'apr\u00E8s la date limite d'expiration.
 comment.nocomment=$org.olat.course.nodes.ms\:comment.nocomment
@@ -41,5 +42,62 @@ config.points.on=Total des cases \u00E0 cocher
 config.tip.coach=Indication pour les coaches
 config.tip.user=Indication pour tous les utilisateurs
 config.title=Configuration des listes de contr\u00F4le
+config.warning.inuse=Les utilisateurs ont d\u00E9j\u00E0 coch\u00E9 une ou plusieurs cases. Les modification des points peuvent affecter leurs r\u00E9sultats.
 description=Description
 done.by=Compl\u00E9t\u00E9 par\:
+edit.checkbox=Editer case \u00E0 cocher
+file=Fichier
+filter.all=Tout afficher
+form.error.scoreOutOfRange=$org.olat.course.assessment\:form.error.scoreOutOfRange
+form.error.wrongFloat=$org.olat.course.nodes.ms\:form.error.wrongFloat
+help.hover.assessment.checkbox=Aide pour l'\u00E9valuation par case \u00E0 cocher
+help.hover.checkbox=Aide pour l'\u00E9dition des cases \u00E0 cocher
+help.hover.checkboxtemplate=Aide concernant les mod\u00E8les
+help.hover.choach=Aide \u00E0 l'\u00E9valuation d'une liste de contr\u00F4le
+help.hover.coach.assessment=Aide concernant l'\u00E9valuation et la gestion des listes de contr\u00F4le
+help.hover.config=Aide \u00E0 la configuration
+help.hover.metadatas=Aide concernant le titre et le d\u00E9lai
+help.hover.structurenodeconfig=Aide concernant la configuration de l'\u00E9l\u00E9ment de structure
+help.hover.templateconfiguration=Aide \u00E0 la configuration
+info.title=$org.olat.course.nodes.ms\:info.title
+label=Etiquette
+label.controlled=V\u00E9rifi\u00E9
+label.done=Termin\u00E9
+label.inWork=Trait\u00E9
+label.present=Pr\u00E9sent
+label.presented=Pr\u00E9sent\u00E9
+num.of.checklist=Nombre
+pane.tab.accessibility=Acc\u00E8s
+pane.tab.checkbox=Cases \u00E0 cocher
+pane.tab.clconfig=Configuration
+participants=Membres
+passed.cut=$org.olat.course.nodes.ms\:passed.cut
+passed.no=$org.olat.course.nodes.ms\:passed.no
+passed.nopassed=$org.olat.course.nodes.ms\:passed.nopassed
+passed.title=$org.olat.course.nodes.ms\:passed.title
+passed.yes=$org.olat.course.nodes.ms\:passed.yes
+passed.yourpassed=$org.olat.course.nodes.ms\:passed.yourpassed
+pdf.export=Aper\u00E7u PDF
+pdf.export.checked=Cases \u00E0 cocher compl\u00E9t\u00E9es (PDF)
+points=Note
+release=Acc\u00E8s
+release.coachOnly=Seulement le coach
+release.userAndCoach=Participant et coach
+run.coach=G\u00E9rer les listes de contr\u00F4le
+run.due.date=D\u00E9lai\: <span class\="o_cl_duedate">{0}</span>
+run.due.date.desc=Veuillez noter que cette liste de contr\u00F4le dispose d'un d\u00E9lai. Vous ne serez plus en mesure de la modifier apr\u00E8s la date limite d'expiration.
+run.info=Informations
+run.mark=Coches
+run.run=Mes listes de contr\u00F4le
+score.max=$org.olat.course.nodes.ms\:score.max
+score.min=$org.olat.course.nodes.ms\:score.min
+score.noscore=$org.olat.course.nodes.ms\:score.noscore
+score.title=$org.olat.course.nodes.ms\:score.title
+score.yourscore=$org.olat.course.nodes.ms\:score.yourscore
+select.checkbox=Filtre case \u00E0 cocher
+selectall=Tout s\u00E9lectionner
+signature=Signature
+sum.cutvalue=Nombre de cases \u00E0 coacher pour "r\u00E9ussi"
+table.header.edit.checkbox=Editer
+table.header.title=$\:checkbox.title
+title.prefix=Titre
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListConfigurationStepController.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListConfigurationStepController.java
index 9df2c644fe36258642a50595d58e4182a84caf5d..731735343578bc9690e14ab920628c0662a0ebb5 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListConfigurationStepController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListConfigurationStepController.java
@@ -66,7 +66,7 @@ public class CheckListConfigurationStepController extends StepFormBasicControlle
 
 	@Override
 	protected void doDispose() {
-		//
+		mainForm.removeSubFormListener(configController);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_de.properties
index 81031c26e38412398632b1885013ca1271d09666..f7b31afc989858a71623a1af13a17b1cd7038e1e 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_de.properties
@@ -4,7 +4,7 @@ checkbox.template.description=Erstellen Sie eine Checklistenvorlage. Diese wird
 configuration.template=Konfiguration
 configuration.template.description=Legen Sie in diesem Schritt fest wie viele Checklisten anhand der Vorlage erzeugt werden sollen. Der Titel wird jeweils mit der aktuellen Laufnummer ergänzt.
 metadatas.details=Titel und Datum
-metadatas.details.description=Passen Sie die generierten Titel und f\u00FCgen Sie das F\u00E4lligkeitsdatum inzu.
+metadatas.details.description=Passen Sie die generierten Titel an und f\u00FCgen Sie ein F\u00E4lligkeitsdatum hinzu.
 structurenode.configuration=Strukturdaten
 structurenode.configuration.description=Geben Sie die Informationen zum übergeordneten Strukturbaustein ein, der die neu generierten Checklisten enthalten wird. Sie können die Daten später jederzeit direkt im Baustein ändern.
 nodeConfigForm.menutitle=$org.olat.course.editor\:nodeConfigForm.menutitle
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_en.properties
index 026c3b2eacd70bb2137414878650f3a526f4cc13..611cac5bda7c858ff46e33b898f05fd90e3c4338 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_en.properties
@@ -2,7 +2,7 @@
 checkbox.template=Template
 checkbox.template.description=Create a template for your set of checklists. It will be applied to the specified number of checklists.
 configuration.template=Configuration
-configuration.template.description=Determine the number of checklists to be created based on the template. The checklists individual titles are composed of the title and the sequential number.
+configuration.template.description=Determine the number of checklists to be created based on the template. The checklists' individual titles are composed of the title and the sequential number.
 metadatas.details=Title and deadline
 metadatas.details.description=Adapt the generated titles based on your input in step 2 and add a due date.
 nodeConfigForm.menutitle=$org.olat.course.editor\:nodeConfigForm.menutitle
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_fr.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6268c8f378e1942ba319649ffee29c81ab1168af
--- /dev/null
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/_i18n/LocalStrings_fr.properties
@@ -0,0 +1,15 @@
+#Tue Apr 15 23:07:43 CEST 2014
+checkbox.template=Mod\u00E8le
+checkbox.template.description=Cr\u00E9er un mod\u00E8le pour l'ensemble de vos listes. Il sera appliqu\u00E9 au nombre de listes de contr\u00F4le sp\u00E9cifi\u00E9.
+configuration.template=Configuration
+configuration.template.description=D\u00E9terminez le nombre de listes de contr\u00F4le \u00E0 cr\u00E9er sur la base du mod\u00E8le. Les titres des listes de contr\u00F4le se composent du titre sp\u00E9cifi\u00E9 et un num\u00E9ro s\u00E9quentiel.
+error.needone.checklist=Vous avez besoin d'une case \u00E0 cocher au minimum
+metadatas.details=Titre et d\u00E9lai
+metadatas.details.description=Adaptez les titres g\u00E9n\u00E9r\u00E9s en fonction de votre entr\u00E9e \u00E0 l'\u00E9tape 2 et ajouter \u00E9ventuellement une date d'\u00E9ch\u00E9ance.
+nodeConfigForm.displaytitle=$org.olat.course.editor\:nodeConfigForm.displaytitle
+nodeConfigForm.learningobjectives=$org.olat.course.editor\:nodeConfigForm.learningobjectives
+nodeConfigForm.menutitle=$org.olat.course.editor\:nodeConfigForm.menutitle
+points.sum.checklists=Somme des listes de contr\u00F4le
+scform.passedtype.inherit=$org.olat.course.nodes.st\:scform.passedtype.inherit
+structurenode.configuration=Informations de l'\u00E9l\u00E9ment structure
+structurenode.configuration.description=Entrez les informations pour l'\u00E9l\u00E9ment structure qui englobera les listes de contr\u00F4le nouvellement g\u00E9n\u00E9r\u00E9s. Vous pouvez modifier toutes les informations \u00E0 tout moment directement dans les \u00E9l\u00E9ment de cours.
diff --git a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
index 24a7a886666e81a45e3810c1e88cf70fe3389158..7ef3f1799ff7b05182e84f081a2d695ce4b9b5a2 100644
--- a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
+++ b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
@@ -163,11 +163,13 @@ public class DropboxScoringViewController extends BasicController {
 		
 		myContent.put("dropbox", dropboxFolderRunController.getInitialComponent());
 
+		Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
 		// returnbox display
 		OlatRootFolderImpl rootReturnbox = new OlatRootFolderImpl(getReturnboxFilePath(assesseeName), null);
-		rootReturnbox.setLocalSecurityCallback( getReturnboxVfsSecurityCallback(rootReturnbox.getRelPath()) );
+		VFSSecurityCallback secCallback = getReturnboxVfsSecurityCallback(rootReturnbox.getRelPath(), assessedIdentity);
+		rootReturnbox.setLocalSecurityCallback(secCallback);
 		OlatNamedContainerImpl namedReturnbox = new OlatNamedContainerImpl(assesseeFullName, rootReturnbox);
-		namedReturnbox.setLocalSecurityCallback(getReturnboxVfsSecurityCallback(rootReturnbox.getRelPath()));
+		namedReturnbox.setLocalSecurityCallback(secCallback);
 
 		returnboxFolderRunController = new FolderRunController(namedReturnbox, false, ureq, getWindowControl());
 		returnboxFolderRunController.disableSubscriptionController();
@@ -188,7 +190,7 @@ public class DropboxScoringViewController extends BasicController {
 			myContent.put("statusForm",statusForm.getInitialComponent());
 		}
 		
-		assignedTask = TaskController.getAssignedTask(userCourseEnv.getIdentityEnvironment().getIdentity(), userCourseEnv.getCourseEnvironment(), node);
+		assignedTask = TaskController.getAssignedTask(assessedIdentity, userCourseEnv.getCourseEnvironment(), node);
 		if (assignedTask != null) {
 			myContent.contextPut("assignedtask", assignedTask);
 			if (!(assignedTask.toLowerCase().endsWith(".html") || assignedTask.toLowerCase().endsWith(".htm") || assignedTask.toLowerCase().endsWith(".txt"))){
@@ -201,9 +203,9 @@ public class DropboxScoringViewController extends BasicController {
 		return new ReadOnlyAndDeleteCallback();
 	}
 
-	protected VFSSecurityCallback getReturnboxVfsSecurityCallback(String returnboxRelPath) {
+	protected VFSSecurityCallback getReturnboxVfsSecurityCallback(String returnboxRelPath, Identity assessedIdentity) {
 		SubscriptionContext subscriptionContext = ReturnboxFileUploadNotificationHandler
-				.getSubscriptionContext(userCourseEnv.getCourseEnvironment(), node, getIdentity());
+				.getSubscriptionContext(userCourseEnv.getCourseEnvironment(), node, assessedIdentity);
 		return new ReturnboxFullAccessCallback(returnboxRelPath, subscriptionContext);
 	}
 
diff --git a/src/main/java/org/olat/group/ui/BusinessGroupFormController.java b/src/main/java/org/olat/group/ui/BusinessGroupFormController.java
index a504c36d2572d0f5a9b1e4a22578c8049fa0bb2c..7b104165898cd7a6c7c4a70f5aaafdf98df18860 100644
--- a/src/main/java/org/olat/group/ui/BusinessGroupFormController.java
+++ b/src/main/java/org/olat/group/ui/BusinessGroupFormController.java
@@ -222,7 +222,7 @@ public class BusinessGroupFormController extends FormBasicController {
 			Integer minimumMembers = businessGroup.getMinParticipants();
 			Integer maximumMembers = businessGroup.getMaxParticipants();
 			businessGroupMinimumMembers.setValue(minimumMembers == null || minimumMembers.intValue() <= 0 ? "" : minimumMembers.toString());
-			businessGroupMaximumMembers.setValue(maximumMembers == null || maximumMembers.intValue() <= 0 ? "" : maximumMembers.toString());
+			businessGroupMaximumMembers.setValue(maximumMembers == null || maximumMembers.intValue() < 0 ? "" : maximumMembers.toString());
 			if (businessGroup.getWaitingListEnabled() != null) {
 				enableWaitingList.select("create.form.enableWaitinglist", businessGroup.getWaitingListEnabled());
 			}
diff --git a/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java b/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java
index dd685b760746941c113483041e0cd5535e41ad8e..ed6f0d565f3acba8c808105121d5261d99073b52 100644
--- a/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java
+++ b/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.dialog.DialogController;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.helpers.Settings;
 import org.olat.core.util.Util;
 import org.olat.ims.qti.editor.beecom.objects.ChoiceQuestion;
 import org.olat.ims.qti.editor.beecom.objects.ChoiceResponse;
@@ -88,7 +89,12 @@ public class ChoiceItemController extends DefaultController implements Controlle
 		main.contextPut("question", item.getQuestion());
 		main.contextPut("isSurveyMode", qtiPackage.getQTIDocument().isSurvey() ? "true" : "false");
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
-		main.contextPut("mediaBaseURL", qtiPackage.getMediaBaseURL());
+		
+		String mediaBaseUrl = qtiPackage.getMediaBaseURL();
+		if(mediaBaseUrl != null && !mediaBaseUrl.startsWith("http")) {
+			mediaBaseUrl = Settings.getServerContextPathURI() + mediaBaseUrl;
+		}
+		main.contextPut("mediaBaseURL", mediaBaseUrl);
 		if (item.getQuestion().getType() == Question.TYPE_MC) main.setPage(VC_ROOT + "/tab_mcItem.html");
 		else if (item.getQuestion().getType() == Question.TYPE_KPRIM) main.setPage(VC_ROOT + "/tab_kprimItem.html");
 		setInitialComponent(main);
diff --git a/src/main/java/org/olat/ims/qti/editor/EssayItemController.java b/src/main/java/org/olat/ims/qti/editor/EssayItemController.java
index 34ec7d258961970dd15f606a78f778100944c441..48eb4c21e5e49557e2524024d1f4d45cdf715648 100644
--- a/src/main/java/org/olat/ims/qti/editor/EssayItemController.java
+++ b/src/main/java/org/olat/ims/qti/editor/EssayItemController.java
@@ -35,6 +35,7 @@ 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.translator.Translator;
+import org.olat.core.helpers.Settings;
 import org.olat.core.util.Util;
 import org.olat.ims.qti.editor.beecom.objects.EssayQuestion;
 import org.olat.ims.qti.editor.beecom.objects.Item;
@@ -79,7 +80,11 @@ public class EssayItemController extends DefaultController implements Controller
 		essayQuestion = (EssayQuestion) item.getQuestion();
 		main.contextPut("question", essayQuestion);
 		main.contextPut("response", essayQuestion.getEssayResponse());
-		main.contextPut("mediaBaseURL", qtiPackage.getMediaBaseURL());
+		String mediaBaseUrl = qtiPackage.getMediaBaseURL();
+		if(mediaBaseUrl != null && !mediaBaseUrl.startsWith("http")) {
+			mediaBaseUrl = Settings.getServerContextPathURI() + mediaBaseUrl;
+		}
+		main.contextPut("mediaBaseURL", mediaBaseUrl);
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
 		main.contextPut("isSurveyMode", qtiPackage.getQTIDocument().isSurvey() ? "true" : "false");
 		
diff --git a/src/main/java/org/olat/ims/qti/editor/FIBItemController.java b/src/main/java/org/olat/ims/qti/editor/FIBItemController.java
index edf0f287324c744efcaafcd81af5c56cc8d1794b..27c3bba1dba4b7d670518b7c2e9a3454f81662de 100644
--- a/src/main/java/org/olat/ims/qti/editor/FIBItemController.java
+++ b/src/main/java/org/olat/ims/qti/editor/FIBItemController.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.dialog.DialogController;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.helpers.Settings;
 import org.olat.core.util.Util;
 import org.olat.ims.qti.editor.beecom.objects.FIBQuestion;
 import org.olat.ims.qti.editor.beecom.objects.FIBResponse;
@@ -89,7 +90,12 @@ public class FIBItemController extends DefaultController implements ControllerEv
 		surveyMode = qtiPackage.getQTIDocument().isSurvey();
 		main.contextPut("isSurveyMode", surveyMode ? "true" : "false");
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
-		main.contextPut("mediaBaseURL", qtiPackage.getMediaBaseURL());
+		
+		String mediaBaseUrl = qtiPackage.getMediaBaseURL();
+		if(mediaBaseUrl != null && !mediaBaseUrl.startsWith("http")) {
+			mediaBaseUrl = Settings.getServerContextPathURI() + mediaBaseUrl;
+		}
+		main.contextPut("mediaBaseURL", mediaBaseUrl);
 		setInitialComponent(main);
 	}
 
diff --git a/src/main/java/org/olat/ims/qti/editor/ItemPreviewController.java b/src/main/java/org/olat/ims/qti/editor/ItemPreviewController.java
index f1ba2e8ca7ac33675df9dee933f19385e77bf4c7..d8ab53d631e1fb758457febe30b8d4c589de634a 100644
--- a/src/main/java/org/olat/ims/qti/editor/ItemPreviewController.java
+++ b/src/main/java/org/olat/ims/qti/editor/ItemPreviewController.java
@@ -37,6 +37,7 @@ import org.olat.core.gui.control.DefaultController;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.helpers.Settings;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Formatter;
@@ -75,6 +76,9 @@ public class ItemPreviewController extends DefaultController implements Controll
 		this.item = item;
 		this.mediaBaseUrl = mediaBaseUrl;
 		renderInstructions = new RenderInstructions();
+		if(mediaBaseUrl != null && !mediaBaseUrl.startsWith("http")) {
+			mediaBaseUrl = Settings.getServerContextPathURI() + mediaBaseUrl;
+		}
 		renderInstructions.put(RenderInstructions.KEY_STATICS_PATH, mediaBaseUrl + "/");
 		renderInstructions.put(RenderInstructions.KEY_LOCALE, translator.getLocale());
 		renderInstructions.put(RenderInstructions.KEY_RENDER_TITLE, Boolean.TRUE);
diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
index f364ce9835d71043e2b940d10513be21d4fa38cc..392c00ea3da48794b5017578d2b419ddcaf5bf5c 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
@@ -282,7 +282,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 			if (qtiPackage.getQTIDocument() == null) {
 				notEditable = true;				
 			} else if (qtiPackage.isResumed()) {
-				showInfo("info.resumed", null);
+				showInfo("info.resumed");
 			}
 			//
 			init(ureq); // initialize the gui
diff --git a/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_fr.properties
index ab78fd55fe5574313b911fce8adefc667b662545..ebbcb536ebb2972dc1bbbd50b89e02e685c408f6 100644
--- a/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti/export/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Wed Oct 30 21:06:42 CET 2013
+#Tue Apr 15 21:40:32 CEST 2014
 action.choose=Archiver
 archive.noresults=Aucun r\u00E9sultat n'a encore \u00E9t\u00E9 sauvegard\u00E9 pour cet \u00E9l\u00E9ment de cours.
 archive.results.successfully=<b>Les r\u00E9sultats ont \u00E9t\u00E9 sauvegard\u00E9s dans votre dossier personnel.</b>
@@ -29,6 +29,7 @@ column.header.assesspoints=Points test
 column.header.date=Date
 column.header.details=D\u00E9tails
 column.header.duration=Dur\u00E9e totale (s)
+column.header.homepage=Page d'accueil
 column.header.instUsrIdent=Num\u00E9ro de l'institut
 column.header.ipaddress=Adresse IP
 column.header.login=Nom d'utilisateur
diff --git a/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java b/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java
index ad720db8e99d928ccaa5b1f24d7bbb668f7d4738..57e9250aeaeac7a767a16c891d827134eaaac246 100644
--- a/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java
+++ b/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java
@@ -79,6 +79,8 @@ class QTIImportProcessor {
 	
 	private static final OLog log = Tracing.createLoggerFor(QTIImportProcessor.class);
 	
+	private static final String OPENOLAT_MOVIE_MARKER = "BPlayer.insertPlayer(";
+	
 	private final Identity owner;
 	private final Locale defaultLocale;
 	private final String importedFilename;
@@ -408,6 +410,8 @@ class QTIImportProcessor {
 	private static class HTMLHandler extends DefaultHandler {
 		private final List<String> materialPath;
 		
+		private StringBuffer scriptBuffer;
+		
 		public HTMLHandler(List<String> materialPath) {
 			this.materialPath = materialPath;
 		}
@@ -420,6 +424,42 @@ class QTIImportProcessor {
 				if(StringHelper.containsNonWhitespace(imgSrc)) {
 					materialPath.add(imgSrc);
 				}
+			} else if("script".equals(elem)) {
+				scriptBuffer = new StringBuffer();
+			}
+		}
+
+		@Override
+		public void characters(char[] ch, int start, int length)
+		throws SAXException {
+			if(scriptBuffer != null) {
+				scriptBuffer.append(ch, start, length);
+			}
+		}
+
+		@Override
+		public void endElement(String uri, String localName, String qName)
+		throws SAXException {
+			String elem = localName.toLowerCase();
+			if("script".equals(elem)) {
+				String content = scriptBuffer == null ? "" : scriptBuffer.toString();
+				processScriptContent(content);
+				scriptBuffer = null;
+			}
+		}
+		
+		private void processScriptContent(String content) {
+			int markerIndex = content.indexOf(OPENOLAT_MOVIE_MARKER);
+			if(markerIndex >= 0) {
+				int beginIndex = markerIndex + OPENOLAT_MOVIE_MARKER.length();
+				char quote = content.charAt(beginIndex);
+				int endIndex = content.indexOf(quote, beginIndex + 1);
+				if(endIndex > beginIndex) {
+					String media = content.substring(beginIndex + 1, endIndex);
+					if(StringHelper.containsNonWhitespace(media)) {
+						materialPath.add(media.trim());
+					}
+				}
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java b/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java
index 44954dc3efa197d83f3617193bc40e40c1c1ebb6..b5870af8f73e92ddda42900aaf84248595f468bb 100644
--- a/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java
+++ b/src/main/java/org/olat/ims/qti/statistics/QTIStatisticResourceResult.java
@@ -29,6 +29,7 @@ import org.olat.core.gui.components.tree.TreeNode;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.nodes.CourseNodeConfiguration;
 import org.olat.course.nodes.CourseNodeFactory;
@@ -158,8 +159,13 @@ public class QTIStatisticResourceResult implements StatisticResourceResult {
 		} else if(selectedNode instanceof SectionNode) {
 			return createAssessmentController(ureq, wControl, printMode);	
 		} else if(selectedNode instanceof ItemNode) {
+			Section section = null;
+			INode sectionNode = selectedNode.getParent();
+			if(sectionNode instanceof SectionNode) {
+				section = (Section) ((SectionNode)sectionNode).getUserObject();
+			}
 			Item item = (Item)((ItemNode)selectedNode).getUserObject();
-			return createItemController(ureq, wControl, item, printMode);
+			return createItemController(ureq, wControl, section, item, printMode);
 		}
 		return null;
 	}
@@ -177,12 +183,8 @@ public class QTIStatisticResourceResult implements StatisticResourceResult {
 		return TitledWrapperHelper.getWrapper(ureq, wControl, ctrl, courseNode, iconCssClass);
 	}
 	
-	private Controller createItemController(UserRequest ureq, WindowControl wControl, Item item, boolean printMode) {
-		if(type == QTIType.survey) {
-			return new QTI12ItemStatisticsController(ureq, wControl, item, this, printMode);
-		} else {
-			return new QTI12ItemStatisticsController(ureq, wControl, item, this, printMode);
-		}
+	private Controller createItemController(UserRequest ureq, WindowControl wControl, Section section, Item item, boolean printMode) {
+		return new QTI12ItemStatisticsController(ureq, wControl, section, item, this, printMode);
 	}
 	
 	private void buildQTICourseNodeSubTree(QTIDocument qtiDocument, GenericTreeNode rootNode) {	
diff --git a/src/main/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerImpl.java b/src/main/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerImpl.java
index 09d2620584338ed27cf3e2899df25ae963104ad1..6c42d98f7fc7668b70a065a46e9d7552378a1c2a 100644
--- a/src/main/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerImpl.java
+++ b/src/main/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerImpl.java
@@ -300,7 +300,8 @@ public class QTIStatisticsManagerImpl implements QTIStatisticsManager {
 		}
 
 		double averageScore = totalScore / totalResults;
-		double difficulty = averageScore / maxScore;
+		//difficulty (p-value)
+		double difficulty = numOfCorrectAnswers / totalResults;
 		double averageDuration = totalDuration / totalResults;
 		
 		StatisticsItem stats = new StatisticsItem();
@@ -415,6 +416,8 @@ public class QTIStatisticsManagerImpl implements QTIStatisticsManager {
 		List<StatisticFIBOption> options = new ArrayList<>();
 		Map<String,StatisticFIBOption> optionMap = new HashMap<>();
 		
+		boolean groupBy = true;
+		
 		List<Response> responses = item.getQuestion().getResponses();
 		for(Response response:responses) {
 			if(response instanceof FIBResponse) {
@@ -429,7 +432,9 @@ public class QTIStatisticsManagerImpl implements QTIStatisticsManager {
 					StatisticFIBOption option = new StatisticFIBOption();
 					option.setCorrectBlank(correctFIBs[0]);
 					option.setAlternatives(Arrays.asList(correctFIBs));
-					option.setCaseSensitive("Yes".equals(fibResponse.getCaseSensitive()));
+					boolean caseSensitive = "Yes".equals(fibResponse.getCaseSensitive());
+					groupBy &= !caseSensitive;
+					option.setCaseSensitive(caseSensitive);
 					option.setPoints(fibResponse.getPoints());
 					options.add(option);
 					optionMap.put(ident, option);
@@ -438,7 +443,7 @@ public class QTIStatisticsManagerImpl implements QTIStatisticsManager {
 		}
 		
 		
-		List<StatisticAnswerOption> answerOptions = getStatisticAnswerOptionsOfItem(item.getIdent(), searchParams);
+		List<StatisticAnswerOption> answerOptions = getStatisticAnswerOptionsOfItem(item.getIdent(), searchParams, groupBy);
 		
 		for(StatisticAnswerOption answerOption:answerOptions) {
 			long count = answerOption.getCount();
@@ -446,7 +451,6 @@ public class QTIStatisticsManagerImpl implements QTIStatisticsManager {
 			Map<String,String> parsedAnswerMap = QTIResultManager.parseResponseStrAnswers(concatenedAnswer);
 			for(Map.Entry<String, String> parsedAnswerEntry: parsedAnswerMap.entrySet()) {
 				String ident = parsedAnswerEntry.getKey();
-
 				StatisticFIBOption option = optionMap.get(ident);
 				if(option == null) {
 					continue;
@@ -479,11 +483,20 @@ public class QTIStatisticsManagerImpl implements QTIStatisticsManager {
 	
 	@Override
 	public List<StatisticAnswerOption> getStatisticAnswerOptionsOfItem(String itemIdent, QTIStatisticSearchParams searchParams) {
+		return getStatisticAnswerOptionsOfItem(itemIdent, searchParams, true);
+	}
+	
+	private List<StatisticAnswerOption> getStatisticAnswerOptionsOfItem(String itemIdent, QTIStatisticSearchParams searchParams, boolean groupBy) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select res.answer, count(res.key) from qtistatsresult res ")
 		  .append(" inner join res.resultSet rset");
 		decorateRSet(sb, searchParams);
-		sb.append(" and res.itemIdent=:itemIdent and res.duration > 0 group by res.answer");
+		sb.append(" and res.itemIdent=:itemIdent and res.duration > 0 ");
+		if(groupBy) {
+			sb.append("group by res.answer");
+		} else {
+			sb.append("group by res.key");
+		}
 		
 		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Object[].class)
 			.setParameter("itemIdent", itemIdent);
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12AssessmentStatisticsController.java b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12AssessmentStatisticsController.java
index 507b8845f06e2d10e06813f005f31535a7a15992..3e036eb6a88e91f4a2227c0b2695a30498cdea3b 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12AssessmentStatisticsController.java
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12AssessmentStatisticsController.java
@@ -111,7 +111,7 @@ public class QTI12AssessmentStatisticsController extends BasicController {
 		for(Section section:qtiDocument.getAssessment().getSections()) {
 			for(Item item:section.getItems()) {
 				items.add(item);
-				if(item.getQuestion().getType() == Question.TYPE_FIB) {
+				if(item.getQuestion().getType() == Question.TYPE_ESSAY) {
 					hasEssay = true;
 				}
 			}
@@ -120,7 +120,7 @@ public class QTI12AssessmentStatisticsController extends BasicController {
 		if(hasEssay) {
 			mainVC.contextPut("hasEssay", Boolean.TRUE);
 		}
-		
+
 		cutValue = getCutValueSetting(testNode);
 		maxScore = getMaxScoreSetting(testNode, items);
 
@@ -245,6 +245,7 @@ public class QTI12AssessmentStatisticsController extends BasicController {
 		VelocityContainer percentRightAnswersPerItemVC = createVelocityContainer("hbar_right_answer_per_item");
 		Stringuified data2 = BarSeries.getDatasAndColors(Collections.singletonList(d2), "bar_green");
 		percentRightAnswersPerItemVC.contextPut("datas", data2);
+		percentRightAnswersPerItemVC.contextPut("numOfParticipants", Long.toString(Math.round(numOfParticipants)));
 		mainVC.put("percentRightAnswersPerItemChart", percentRightAnswersPerItemVC);
 	}
 
@@ -299,6 +300,7 @@ public class QTI12AssessmentStatisticsController extends BasicController {
 				Controller printCtr = new QTI12PrintController(lureq, lwControl, resourceResult);
 				Component view = printCtr.getInitialComponent();
 				LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, null, null, view, null);
+				layoutCtr.addCssClassToMain("o_qti_print");
 				return layoutCtr;
 			}					
 		};
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12ItemStatisticsController.java b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12ItemStatisticsController.java
index 96fdc43a968739d7d3645970b57cfb9f0f3b5731..da2b8878aff1335946d239b8a079649a60b0e1cf 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12ItemStatisticsController.java
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12ItemStatisticsController.java
@@ -33,8 +33,11 @@ import org.olat.core.gui.components.velocity.VelocityContainer;
 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.ims.qti.editor.beecom.objects.FIBResponse;
 import org.olat.ims.qti.editor.beecom.objects.Item;
 import org.olat.ims.qti.editor.beecom.objects.Question;
+import org.olat.ims.qti.editor.beecom.objects.Response;
+import org.olat.ims.qti.editor.beecom.objects.Section;
 import org.olat.ims.qti.statistics.QTIStatisticResourceResult;
 import org.olat.ims.qti.statistics.QTIStatisticSearchParams;
 import org.olat.ims.qti.statistics.QTIStatisticsManager;
@@ -61,7 +64,7 @@ public class QTI12ItemStatisticsController extends BasicController {
 	private final SeriesFactory seriesfactory;
 	
 	public QTI12ItemStatisticsController(UserRequest ureq, WindowControl wControl,
-			Item item, QTIStatisticResourceResult resourceResult, boolean printMode) {
+			Section section, Item item, QTIStatisticResourceResult resourceResult, boolean printMode) {
 		super(ureq, wControl);
 		this.item = item;
 		seriesfactory = new SeriesFactory(resourceResult, getTranslator());
@@ -82,9 +85,13 @@ public class QTI12ItemStatisticsController extends BasicController {
 			initItem(itemStats);
 		}
 		mainVC.put("d3loader", new StatisticsComponent("d3loader"));
-		mainVC.contextPut("question", item.getQuestion().getQuestion().renderAsHtml(mediaBaseURL));
-		mainVC.contextPut("questionType", questionType);
 		mainVC.contextPut("title", item.getTitle());
+		if(section != null) {
+			mainVC.contextPut("sectionTitle", section.getTitle());
+		}
+		mainVC.contextPut("questionType", item.getQuestion().getType());
+		mainVC.contextPut("question", getQuestion());
+		mainVC.contextPut("numOfParticipants", resourceResult.getQTIStatisticAssessment().getNumOfParticipants());
 		mainVC.contextPut("printMode", new Boolean(printMode));
 		putInitialPanel(mainVC);
 	}
@@ -112,9 +119,6 @@ public class QTI12ItemStatisticsController extends BasicController {
 		StatisticsItem itemStats = qtiStatisticsManager
 				.getItemStatistics(item.getIdent(), maxScore, searchParams);
 
-		mainVC.contextPut("question", item.getQuestion().getQuestion().renderAsHtml(mediaBaseURL));
-		mainVC.contextPut("questionType", item.getQuestion().getType());
-		mainVC.contextPut("title", item.getTitle());
 		if(!survey) {
 			long rightAnswers = itemStats.getNumOfCorrectAnswers();
 			long wrongAnswers = itemStats.getNumOfIncorrectAnswers();
@@ -133,6 +137,31 @@ public class QTI12ItemStatisticsController extends BasicController {
 		return itemStats;
 	}
 	
+	private String getQuestion() {
+		String question;
+		if(item.getQuestion().getType() == Question.TYPE_FIB) {
+			StringBuilder questionSb = new StringBuilder();
+			List<Response> elements = item.getQuestion().getResponses();
+			if(elements != null) {
+				for(Response element:elements) {
+					if(element instanceof FIBResponse) {
+						FIBResponse response = (FIBResponse)element;
+						if(FIBResponse.TYPE_CONTENT.equals(response.getType())) {
+							String content = response.getContent().renderAsHtml(mediaBaseURL);
+							questionSb.append(content);
+						} else if(FIBResponse.TYPE_BLANK.equals(response.getType())) {
+							questionSb.append(" ___________________ ");
+						}
+					}
+				}
+			}
+			question = questionSb.toString();
+		} else {
+			question = item.getQuestion().getQuestion().renderAsHtml(mediaBaseURL);
+		}
+		return question;
+	}
+	
 	protected void initItem(StatisticsItem itemStats) {
 		Series series = seriesfactory.getSeries(item, itemStats);
 
@@ -143,9 +172,26 @@ public class QTI12ItemStatisticsController extends BasicController {
 	}
 	
 	protected void initEssay() {
-		mainVC.contextPut("question", item.getQuestion().getQuestion().renderAsHtml(mediaBaseURL));
-		mainVC.contextPut("title", item.getTitle());
+		boolean survey = QTIType.survey.equals(resourceResult.getType());
 		
+		double maxScore;
+		if(survey) {
+			maxScore = 1d;
+		} else if(item.getQuestion().isSingleCorrect()) {
+			maxScore = item.getQuestion().getSingleCorrectScore();
+		} else {
+			maxScore = item.getQuestion().getMaxValue();
+		}
+		StatisticsItem itemStats = qtiStatisticsManager
+				.getItemStatistics(item.getIdent(), maxScore, searchParams);
+
+		mainVC.contextPut("solution", item.getQuestion().getSolutionText());
+		mainVC.contextPut("numOfResults", itemStats.getNumOfResults());
+		if(!survey) {
+			mainVC.contextPut("maxScore", maxScore);
+		}
+		mainVC.contextPut("averageDuration", duration(itemStats.getAverageDuration()));
+
 		List<String> answers = qtiStatisticsManager.getAnswers(item.getIdent(), searchParams);
 
 		List<String> cleanedAnswers = new ArrayList<String>();
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PrintController.java b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PrintController.java
index 482d554e34c5e0302b163607135fee3df64e8506..4f49d53656ae4b9df510158b4b3ecb4e4cfcc041 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PrintController.java
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PrintController.java
@@ -31,6 +31,8 @@ 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.nodes.INode;
+import org.olat.course.CourseFactory;
+import org.olat.course.ICourse;
 import org.olat.course.statistic.StatisticResourceNode;
 import org.olat.ims.qti.statistics.QTIStatisticResourceResult;
 
@@ -55,6 +57,11 @@ public class QTI12PrintController extends BasicController {
 	private void initView(UserRequest ureq, QTIStatisticResourceResult resourceResult) {
 		StatisticResourceNode rootNode = (StatisticResourceNode)resourceResult.getSubTreeModel().getRootNode();
 		
+		ICourse course = CourseFactory.loadCourse(resourceResult.getCourseOres());
+		mainVC.contextPut("courseTitle", course.getCourseTitle());
+		String testTitle = resourceResult.getQTIRepositoryEntry().getDisplayname();
+		mainVC.contextPut("testTitle", testTitle);
+		
 		int count = 0;
 		List<String> pageNames = new ArrayList<>();
 
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/SeriesFactory.java b/src/main/java/org/olat/ims/qti/statistics/ui/SeriesFactory.java
index 891f4529d66870aacb238a6b69e2abb7539aa7a9..536cb4c7d01f151688abd804637cb11e027d9996 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/SeriesFactory.java
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/SeriesFactory.java
@@ -129,11 +129,10 @@ public class SeriesFactory {
 		List<StatisticChoiceOption> statisticResponses = qtiStatisticsManager
 				.getNumOfRightAnsweredMultipleChoice(item, resourceResult.getSearchParams());
 
-		BarSeries d1 = new BarSeries("bar_green", translate("answer.correct"));
-		BarSeries d2 = new BarSeries("bar_red", translate("answer.false"));
-		BarSeries d3 = new BarSeries("bar_grey", translate("answer.noanswer"));
+		BarSeries d1 = new BarSeries("bar_green", "green", translate("answer.correct"));
+		BarSeries d2 = new BarSeries("bar_red", "red", translate("answer.false"));
+		BarSeries d3 = new BarSeries("bar_grey", "grey", translate("answer.noanswer"));
 		
-
 		String mediaBaseURL = resourceResult.getMediaBaseURL();
 		boolean survey = QTIType.survey.equals(resourceResult.getType());
 		int numOfParticipants = resourceResult.getQTIStatisticAssessment().getNumOfParticipants();
@@ -143,13 +142,14 @@ public class SeriesFactory {
 		List<ResponseInfos> responseInfos = new ArrayList<>();
 		for(StatisticChoiceOption statisticResponse:statisticResponses) {
 			Response response = statisticResponse.getResponse();
+			String text = response.getContent().renderAsHtml(mediaBaseURL);
 
 			float points = response.getPoints();
 			double answersPerAnswerOption = statisticResponse.getCount();
 
 			double rightA;
 			double wrongA;
-			if (points >= 0f) {
+			if (points > 0.00001f) {
 				rightA = answersPerAnswerOption;
 				wrongA = numOfParticipants - notAnswered - answersPerAnswerOption;
 			} else {
@@ -163,7 +163,6 @@ public class SeriesFactory {
 			d2.add(wrongA, label);
 			d3.add(notAnswered, label);
 			
-			String text = response.getContent().renderAsHtml(mediaBaseURL);
 			Float pointsObj = survey ? null : points;
 			responseInfos.add(new ResponseInfos(label, text, pointsObj, (points > 0f), survey, false));
 		}
@@ -190,9 +189,9 @@ public class SeriesFactory {
 		int numOfParticipants = resourceResult.getQTIStatisticAssessment().getNumOfParticipants();
 		
 		int i = 0;
-		BarSeries d1 = new BarSeries("bar_green", translate("answer.correct"));
-		BarSeries d2 = new BarSeries("bar_red", translate("answer.false"));
-		BarSeries d3 = new BarSeries("bar_grey", translate("answer.noanswer"));
+		BarSeries d1 = new BarSeries("bar_green", "green", translate("answer.correct"));
+		BarSeries d2 = new BarSeries("bar_red", "red", translate("answer.false"));
+		BarSeries d3 = new BarSeries("bar_grey", "grey", translate("answer.noanswer"));
 
 		List<ResponseInfos> responseInfos = new ArrayList<>();
 		for (StatisticKPrimOption statisticResponse:statisticResponses) {
@@ -225,7 +224,6 @@ public class SeriesFactory {
 	public Series getFIB(Item item) {
 		List<StatisticFIBOption> processedAnswers = qtiStatisticsManager
 				.getStatisticAnswerOptionsFIB(item, resourceResult.getSearchParams());
-		Collections.reverse(processedAnswers);
 
 		boolean survey = QTIType.survey.equals(resourceResult.getType());
 		boolean singleCorrectScore = item.getQuestion().getSingleCorrectScore() > 0.0f;
@@ -233,7 +231,8 @@ public class SeriesFactory {
 
 		int i = 0;
 		String cssColor = survey ? "bar_default" : "bar_green";
-		BarSeries d1 = new BarSeries(cssColor, null);
+		String color = survey ? null : "green";
+		BarSeries d1 = new BarSeries(cssColor, color, null);
 		List<ResponseInfos> responseInfos = new ArrayList<>();
 		for (StatisticFIBOption entry : processedAnswers) {
 
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_average_score_per_item.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_average_score_per_item.html
index e5d24f09f972f66a6e4698e4cbdddb7c7361847d..c8309dcfaaac7c3d8a98dfa98183ce3cdef06d49 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_average_score_per_item.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_average_score_per_item.html
@@ -4,7 +4,7 @@
 jQuery(function () {
 	jQuery('#$r.getId("d3holder")').qtiStatistics('averageScorePerItem', {
 		values: [$datas.data],
-		barHeight: 25,
+		barHeight: 20,
 		xBottomLegend: ' $r.translate("chart.answer.averageScoreQuestions.y")',
 		yLeftLegend: '$r.translate("chart.item")'
 	});
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item.html
index 3d0f2ef87c848507c1f3fbcfbd9fb9bd956303d7..1195ec9269d10e4328cd28e43ecaca833e0b9a7b 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item.html
@@ -6,6 +6,7 @@ jQuery(function () {
 		values: [$series.datas.data],
 		colors: #if($series.colorsCustom) [$series.datas.colors] #else null #end,
 		participants: $series.numOfParticipants,
+		barHeight: 20,
 		xTopLegend: '$r.translate("chart.percent.participants.num")',
 		xBottomLegend: '$r.translate("chart.percent.participants")',
 		yLeftLegend: '$r.translate("chart.item")',
@@ -17,7 +18,7 @@ jQuery(function () {
 <div class="o_qti_statistics_legend">
 	<ul class="legend">
 		#foreach($barserie in $series.series)
-	    	<li><span class="$barserie.cssClass"></span> $barserie.legend</li>
+	    	<li><span class="$barserie.cssClass"><img src='$r.staticLink("images/qti/${barserie.color}.png")' width='16' height='16' /></span> $barserie.legend</li>
 	    #end
 	</ul>
 </div>
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item_overview.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item_overview.html
index 91b1a2db8ec32bde1885ed44b9c34aff7f2d70ea..e85b85e35b99e2206203be208f9e859437365054 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item_overview.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_item_overview.html
@@ -10,7 +10,7 @@
 			values: [$series.datas.data],
 			colors: #if($series.colorsCustom) [$series.datas.colors] #else null #end,
 			participants: $series.numOfParticipants,
-			barHeight: 25,
+			barHeight: 20,
 			xTopLegend: '$r.translate("chart.percent.participants.num")',
 			xBottomLegend: '$r.translate("chart.percent.participants")',
 			yLeftLegend: '$r.translate("chart.item")',
@@ -29,9 +29,18 @@
 			<li class="o_qti_statistics-ncorrect">
 		#end
 		<strong>$responseInfo.label.</strong> 
-		#if($responseInfo.points) $r.translate("answer.points", $responseInfo.formattedPoints) <br />#end
-		<span class="o_qti_statistics_answer">$responseInfo.text</span>
-		#if($responseInfo.wrongAnswersAvailable) <br/><i>$r.translate("wrong.answer")</i>  $responseInfo.formattedWrongAnswers #end
+		#if($responseInfo.points) $r.translate("answer.points", $responseInfo.formattedPoints) #end
+		#if($responseInfo.wrongAnswersAvailable)
+			<span class="o_qti_statistics_answer"><strong>$responseInfo.text</strong></span>
+			<p>#if($responseInfo.survey)
+			<i>$r.translate("fib.answer")</i>
+			#else
+			<i>$r.translate("fib.wrong.answer")</i>
+			#end
+			$responseInfo.formattedWrongAnswers</p>
+		#else
+			<span class="o_qti_statistics_answer">$responseInfo.text</span>
+		#end
 		 </li>
 	#end 	
 </div>
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_right_answer_per_item.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_right_answer_per_item.html
index e47e2d362331fd09e6a43173ec3ea005bd80be4b..349f6f4b29a1185ed3c1d03520d0b1908bbf7151 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_right_answer_per_item.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/hbar_right_answer_per_item.html
@@ -4,7 +4,8 @@
 jQuery(function () {
 	jQuery('#$r.getId("d3holder")').qtiStatistics('rightAnswerPerItem', {
 		values: [$datas.data],
-		barHeight: 25,
+		barHeight: 20,
+		participants: $numOfParticipants,
 		xBottomLegend: '$r.translate("chart.percent.participants.num")',
 		xTopLegend: '$r.translate("chart.percent.participants")',
 		yLeftLegend: '$r.translate("chart.item")'
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/print.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/print.html
index e25b97e9a9aa589d0f399c24cbbc5ed3c1904985..24140a91b78f0b931dbe219f102c9c7e17a15b20 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/print.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/print.html
@@ -1,3 +1,6 @@
+<h3>$courseTitle</h3>
+<h3>$testTitle</h3>
+
 #foreach($pageName in $pageNames)
 	<div #if ($velocityCount > 1) class="b_print_break_before" #end>
 	$r.render($pageName)
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_assessment.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_assessment.html
index d7229bdd6c02743de6508121c0ef9b376e65dee8..e7afbb8aaf474092d8760909a47730f04e236bbe 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_assessment.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_assessment.html
@@ -1,10 +1,12 @@
+#if($printMode)
+<div class="o_qti_statistics o_qti_statistics_print">
+#else
 <div class="o_qti_statistics">
-#if(!$printMode)
 	<div class="o_buttons_box_right">
 		<script type="text/javascript">
 		function $r.getId("print")() {
 			try {
-				var ww = window.open('$r.commandURI("print")', '$winid', 'height=400, width=800, left=0, top=0, location=no, menubar=no, resizable=yes, scrollbars=yes, toolbar=no');
+				var ww = window.open('$r.commandURI("print")', '$winid', 'height=400, width=600, left=0, top=0, location=no, menubar=no, resizable=yes, scrollbars=yes, toolbar=no');
 				ww.focus();
 			} catch(e) {
 				if(jQuery(document).ooLog().isDebugEnabled()) jQuery(document).ooLog('debug','Error when trying to print qti statistics' , "");
@@ -17,7 +19,7 @@
 		$r.render("download")
 	</div>
 	#if($hasEssay)
-		<div class="b_warning">$r.translate("essay.warning")</div>
+		<div class="b_warning">#if($type == "survey") $r.translate("essay.warning.survey") #else $r.translate("essay.warning.test") #end</div>
 	#end
 #end
 <h4>$r.translate("fig.title")</h4>
@@ -101,7 +103,7 @@
 </div>
 #end
 
-#if($overviewList)
+#if(!$printMode && $overviewList)
 	#foreach($overview in $overviewList)
 		$r.render($overview)	
 	#end
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item.html
index 6ba8f6e58847da7ab2c67f82fcbadce290e1c99f..6850d2a89b743cf212ee65e14ba1437df38f7680 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item.html
@@ -1,6 +1,10 @@
 <div class="o_qti_statistics">
+	#if($sectionTitle)
+	<h5>$r.translate("section"): $sectionTitle</h5>
+	#end
 	<h3 class="b_with_small_icon_left $series.itemCss">$title</h3>
 	#if ($question && $question != "")
+		<h4>$r.translate("chart.item")</h4>
 		<div class="o_qti_statistics_question">$question</div>
 	#end
 	
@@ -60,9 +64,18 @@
 			#end
 		#end
 		<strong>$responseInfo.label.</strong> 
-		#if($responseInfo.points) $r.translate("answer.points", $responseInfo.formattedPoints) <br />#end
-		<span class="o_qti_statistics_answer">$responseInfo.text</span>
-		#if($responseInfo.wrongAnswersAvailable) <br/><i>$r.translate("wrong.answer")</i>  $responseInfo.formattedWrongAnswers #end
+		#if($responseInfo.points) $r.translate("answer.points", $responseInfo.formattedPoints) #end
+		#if($responseInfo.wrongAnswersAvailable)
+			<span class="o_qti_statistics_answer"><strong>$responseInfo.text</strong></span>
+			<p class="o_qti_statistics_wrong_answer">#if($responseInfo.survey)
+			<i>$r.translate("fib.answer")</i>
+			#else
+			<i>$r.translate("fib.wrong.answer")</i>
+			#end
+			$responseInfo.formattedWrongAnswers</p>
+		#else
+			<span class="o_qti_statistics_answer">$responseInfo.text</span>
+		#end
 		 </li>
 	#end 	
 	</ul>
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item_essai.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item_essai.html
index 2d6b5a6c28dd6089449d5b8c0074ad98bf821220..3fb2c312b2b394563199858e9ddd93175daa1a97 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item_essai.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_item_essai.html
@@ -1,8 +1,39 @@
 <div class="o_qti_statistics">
-	<h3 class="b_with_small_icon_left $series.itemCss">$title</h3>
-	<div class="o_qti_statistics_question">$question</div>
+	#if($sectionTitle)
+	<h5>$r.translate("section"): $sectionTitle</h5>
+	#end
+	<h3 class="b_with_small_icon_left o_mi_qtiessay">$title</h3>
+	#if ($question && $question != "")
+		<h4>$r.translate("chart.item")</h4>
+		<div class="o_qti_statistics_question">$question</div>
+	#end
+	#if ($solution && $solution != "")
+		<h4>$r.translate("solution")</h4>
+		<div class="o_qti_statistics_solution">$solution</div>
+	#end
+	
+	<h4>$r.translate("fig.title")</h4>
+	<table class="o_qti_statistics_figures"><tbody>
+		#if($numOfParticipants)
+		<tr><td>$r.translate("fig.participants")</td>
+			<td>$numOfParticipants</td></tr>
+		#end
+		#if($maxScore)
+		<tr><td>$r.translate("chart.maxscore")</td>
+			<td>$maxScore</td></tr>
+		#end
+		#if($averageDuration)
+		<tr><td>$r.translate("fig.averagedur")</td>
+			<td>$averageDuration</td></tr>
+		#end
+		#if($numOfResults)
+		<tr><td>$r.translate("chart.answerscount")</td>
+			<td>$numOfResults</td></tr>
+		#end
+	</tbody></table>
 	
 	#foreach($studentAnswer in $studentAnswers)
+		<hr/>
 		<div>$studentAnswer</div>
 	#end
 </div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_onyx.html b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_onyx.html
index b5002c15eb15144d32b18cb923a085cec2b883a9..a4baa6542d687966246f9eabeece33ef0c6c634f 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_onyx.html
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_content/statistics_onyx.html
@@ -4,7 +4,7 @@
 		<script type="text/javascript">
 		function $r.getId("print")() {
 			try {
-				var ww = window.open('$r.commandURI("print")', '$winid', 'height=400, width=800, left=0, top=0, location=no, menubar=no, resizable=yes, scrollbars=yes, toolbar=no');
+				var ww = window.open('$r.commandURI("print")', '$winid', 'height=400, width=750, left=0, top=0, location=no, menubar=no, resizable=yes, scrollbars=yes, toolbar=no');
 				ww.focus();
 			} catch(e) {
 				if(jQuery(document).ooLog().isDebugEnabled()) jQuery(document).ooLog('debug','Error when trying to print qti statistics' , "");
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties
index 2ae9769757822ec89d365eb9d602f769133f9f1a..71db5437f1f7dd6cde3f176e5ef3c42bdb258300 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_de.properties
@@ -1,13 +1,12 @@
 
 menu.title=Test Statistiken
-assessment.tool.button=menu.title
 splash.choosetest=Wählen Sie einen Test aus
 splash.notenoughresults=Für diesen Test/Umfrage gibt es noch zu wenig Resultate ({0} Teilnehmer)
 
 
 chart.answer.averageScoreQuestions.y=Durschnittliche Punkte
 chart.percent.participants=% Teilnehmer
-chart.percent.participants.num=# Teilnehmer
+chart.percent.participants.num=Anzahl Teilnehmer
 
 chart.score.histogramm=Punkteverteilung
 chart.duration.histogramm=Bearbeitungsdauer
@@ -15,7 +14,7 @@ chart.duration.histogramm.legend=Bearbeitungsdauer (Min.)
 chart.averagescore.peritem=Durschnittliche Punkte pro Frage
 chart.rightanswers.peritem=Richtige Antworten pro Frage in Prozenten
 chart.responses=Antworten
-chart.survey.overview=Üersicht
+chart.survey.overview=Übersicht
 chart.item=Frage
 
 chart.points=Punkte
@@ -49,15 +48,18 @@ chart.sc.answeroptionchecked={0} Teilnehmer ({1}%) haben diese Anwortm
 
 chart.msgb.sorrytitle=Entschuldigung
 chart.msgb.sorrycontent=Es existieren zu wenig Daten für eine statistische Auswertung dieser Frage
-essay.warning=Dieser Fragebogen enthält Essayfrage(n). Bitte navigieren Sie zu den entsprechenden Fragen zur Auswertung.
+essay.warning.test=Dieser Test enthält Essayfragen. Bitte navigieren Sie zu den entsprechenden Fragen zur Auswertung.
+essay.warning.survey=Dieser Fragebogen enthält Essayfragen. Bitte navigieren Sie zu den entsprechenden Fragen zur Auswertung.
 answer.correct=richtig
 answer.false=falsch
 answer.noanswer=keine Antwort
 answer.yes=Ja
 answer.no=Nein
-wrong.answer=Liste der falschen Antworten: 
+fib.wrong.answer=Liste der falschen Antworten: 
+fib.answer=Liste der Antworten: 
 answer.points=({0} Punkte)
 download.raw.data=Rohdaten herunterladen
+solution=Musterlösung
 fig.courseId=Kurs-ID
 fig.testId=Test-ID
 fig.surveyId=Fragebogen-ID
@@ -78,3 +80,4 @@ fig.avg=Mittelwert
 fig.span=Spannweite
 fig.median=Median
 print=Drucken
+section=Sektion
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties
index 36aba40fa40359a7e1c01218dc97438d7a725e4b..e2de125304d3ff3fcd5de08eed4d0ca1e107ce97 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_en.properties
@@ -1,65 +1,71 @@
-
-menu.title=Test Statistics
-splash.choosetest=Please choose a Test
-splash.notenoughresults=We don't have enough data for the selected test/survey. ({0} Participant(s) so far...)
-
-chart.points=Points
-chart.tests=Number of Tests
-chart.answerscount=Number of answers
+#Tue Apr 15 11:18:52 CEST 2014
+answer.correct=correct
+answer.false=wrong
+answer.no=No
+answer.noanswer=no answer
+answer.points=({0} points)
+answer.yes=Yes
+chart.answer.averageScoreQuestions.y=Average score
 chart.answers=Answers
+chart.answerscount=Number of answers
+chart.averagescore.peritem=Average score per question
+chart.cutscore=Cut-Score
+chart.duration=Completion time in seconds
+chart.duration.histogramm=Test duration
+chart.duration.histogramm.legend=Test duration (min.)
+chart.gainedscoreabs={0} participants scored {1} points
+chart.gainedscorepercent={0} participants scored {1}% of the points
+chart.item=Question
+chart.maxscore=Max Score
+chart.msgb.sorrycontent=We cannot display statistical data for this question because there are too few result sets...
+chart.msgb.sorrytitle=Sorry
 chart.participants=Participants
 chart.participantspercentage=Participants in percent
-chart.questions=Questions
-chart.duration=Completion time in seconds
 chart.percent=Percent
-chart.maxscore=Max Score
-chart.cutscore=Cut-Score
-
-chart.title.ovpassedfailed=Passed / Failed
-chart.title.completiontime=Completion time
-
-chart.gainedscorepercent={0} participants scored {1}% of the points
-chart.gainedscoreabs={0} participants scored {1} points
+chart.percent.participants=% Participants
+chart.percent.participants.num=Number of participants
+chart.points=Points
 chart.questioncorrectansweredpercent={1}% of the participants answered {0} correctly
-
-chart.thisquestioncorrectansweredpercent={0}% of the participants answered this question correctly
-chart.thisquestionwrongansweredpercent={0}% of the participants did not answer this question&nbsp;correctly
-chart.thisquestionnotansweredpercent={0}% of the participants did not answer this question
-
 chart.questionpointsscoredabs=Average gained score in {0} was {1} points
-
-chart.testpassed={0} participants passed the test
-chart.testfailed={0} participants failed the test
-
+chart.questions=Questions
+chart.responses=Answers
+chart.rightanswers.peritem=Percentage of correct answers per question
 chart.sc.answeroptionchecked={0} participants ({1}%) chose this answer-option
-
-chart.msgb.sorrytitle=Sorry
-chart.msgb.sorrycontent=We cannot display statistical data for this question because there are too few result sets...
-
-answer.correct=correct
-answer.false=wrong
-answer.noanswer=no answer
-answer.yes=Yes
-answer.no=No
-
-fig.courseId=Course-ID
-fig.testId=Test-ID
-fig.surveyId=Survey-ID
-fig.title=Key figures
-fig.participants=Participants
-fig.passed=Passed
-fig.failed=Failed
+chart.score.histogramm=Score distribution
+chart.survey.overview=Overview
+chart.testfailed={0} participants failed the test
+chart.testpassed={0} participants passed the test
+chart.tests=Number of Tests
+chart.thisquestioncorrectansweredpercent={0}% of the participants answered this question correctly
+chart.thisquestionnotansweredpercent={0}% of the participants did not answer this question
+chart.thisquestionwrongansweredpercent={0}% of the participants did not answer this question&nbsp;correctly
+chart.title.completiontime=Completion time
+chart.title.ovpassedfailed=Passed / Failed
+download.raw.data=Download raw data
 fig.averagedur=Average completion time
-fig.itemdiff=Item difficulty
 fig.averagescore=Average score
-fig.wronganswers=Number of wrong answers
+fig.avg=Arithmetic average
 fig.correctanswers=Number of correct answers
-fig.notanswered=Not answered
-
+fig.courseId=Course-ID
+fig.failed=Failed
+fig.itemdiff=Item difficulty
+fig.median=Median
 fig.mode=Mode
-fig.stddev=Standard deviation
-fig.avg=Arithmetic average
+fig.notanswered=Not answered
+fig.participants=Participants
+fig.passed=Passed
 fig.span=Range
-
+fig.stddev=Standard deviation
+fig.surveyId=Survey-ID
+fig.testId=Test-ID
+fig.title=Key figures
+fig.wronganswers=Number of wrong answers
+menu.title=Test Statistics
 print=Print
+solution=Solution
+splash.choosetest=Please choose a Test
+splash.notenoughresults=We don't have enough data for the selected test/survey. ({0} Participant(s) so far...)
+fib.wrong.answer=List of wrong answers
+fib.answer=List of answers
+section=Section
 
diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_fr.properties
index 8bb6697a722fa722e025c711299b741484901225..087851861cc8817ff861e462e84218759b2e9edb 100644
--- a/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti/statistics/ui/_i18n/LocalStrings_fr.properties
@@ -1,26 +1,38 @@
-#Wed Oct 24 08:59:18 CEST 2012
+#Tue Apr 15 21:49:06 CEST 2014
 answer.correct=correct
 answer.false=faux
 answer.no=Non
 answer.noanswer=aucune r\u00E9ponse
+answer.points=({0} points)
 answer.yes=Oui
+chart.answer.averageScoreQuestions.y=Note moyenne
 chart.answers=R\u00E9ponses
 chart.answerscount=Nombre de r\u00E9ponses
+chart.averagescore.peritem=Note moyenne par question
 chart.cutscore=Cut-Score
 chart.duration=Temps de travail en secondes
+chart.duration.histogramm=Dur\u00E9e du test
+chart.duration.histogramm.legend=Dur\u00E9e du test (min.)
 chart.gainedscoreabs=Participant {0} a obtenu {1} points
 chart.gainedscorepercent=Participant {0} a obtenu {1}% des points
+chart.item=Question
 chart.maxscore=Nombre maximum de points
 chart.msgb.sorrycontent=Pour cette question, il n'y a pas de donn\u00E9es suffisante pour une analyse statistique
 chart.msgb.sorrytitle=Excuses
 chart.participants=Participants
 chart.participantspercentage=Participation en pour-cent
 chart.percent=Pour-cent
+chart.percent.participants=% Participants
+chart.percent.participants.num=Nbre de participants
 chart.points=Points
 chart.questioncorrectansweredpercent={1}% des participants ont r\u00E9pondu correctement \u00E0 la question {0}
 chart.questionpointsscoredabs=En {0}, {1} points ont \u00E9t\u00E9 r\u00E9colt\u00E9s
 chart.questions=Questions
+chart.responses=R\u00E9ponses
+chart.rightanswers.peritem=Pourcentage de r\u00E9ponses correctes par question
 chart.sc.answeroptionchecked={0} participants ({1}%) ont choisi cette r\u00E9ponse
+chart.score.histogramm=Distribution des r\u00E9sultats
+chart.survey.overview=Aper\u00E7u
 chart.testfailed={0} des participants n'ont pas r\u00E9ussi le test
 chart.testpassed={0} des participants ont r\u00E9ussi le test
 chart.tests=Nombre de tests
@@ -29,20 +41,32 @@ chart.thisquestionnotansweredpercent={0}% des participants n'ont pas r\u00E9pond
 chart.thisquestionwrongansweredpercent={0}% des participants n'ont pas r\u00E9pond correctement \u00E0 cette question
 chart.title.completiontime=Dur\u00E9e
 chart.title.ovpassedfailed=R\u00E9ussite / \u00E9chec
+download.raw.data=T\u00E9l\u00E9charger les donn\u00E9es brutes
+essay.warning.test=Ce test contient une ou plusieurs questions de type dissertation. S'il vous pla\u00EEt, naviguez jusqu'aux questions appropri\u00E9es pour \u00E9valuation.
+essay.warning.survey=Ce questionnaire contient une ou plusieurs questions de type dissertation. S'il vous pla\u00EEt, naviguez jusqu'aux questions appropri\u00E9es pour \u00E9valuation.
+fib.answer=Listes des r\u00E9ponses
+fib.wrong.answer=Listes des r\u00E9ponses incorrectes\:
 fig.averagedur=Dur\u00E9e moyenne
 fig.averagescore=Nombre de points en moyenne
 fig.avg=Moyenne arithm\u00E9tique
 fig.correctanswers=Nombre de r\u00E9ponses correctes
+fig.courseId=ID cours
 fig.failed=Echec
 fig.itemdiff=Difficult\u00E9
+fig.median=M\u00E9diane
 fig.mode=Valeur modale
 fig.notanswered=Nombre sans r\u00E9ponse
 fig.participants=Participants
 fig.passed=R\u00E9ussi
 fig.span=Largeur
 fig.stddev=Ecart-type
+fig.surveyId=ID questionnaire
+fig.testId=ID test
 fig.title=Ratio
 fig.wronganswers=Nombre de r\u00E9ponses incorrectes
 menu.title=Statistiques des tests
+print=Imprimer
+section=Section
+solution=Solution
 splash.choosetest=Choisissez un test
 splash.notenoughresults=Pour ce test / sondage, il n'y a pas suffisamment de r\u00E9sultats ({0} Teilnehmer)
diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
index 8bd27e19d7fa012ab6d51f1ed291345b51113ce1..1a95a6c7ed96769f2a2f16bca2237ac5d397130c 100644
--- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
+++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
@@ -374,7 +374,7 @@ public class QuestionItemDAO {
 		if(StringHelper.containsNonWhitespace(params.getFormat())) {
 			sb.append(" and item.format=:format");
 		}
-		if(PersistenceHelper.appendGroupBy(sb, "item", orderBy)) {
+		if(!PersistenceHelper.appendGroupBy(sb, "item", orderBy)) {
 			sb.append(" order by item.key asc ");
 		}
 
@@ -458,7 +458,7 @@ public class QuestionItemDAO {
 		if(inKeys != null && !inKeys.isEmpty()) {
 			sb.append(" and item.key in (:itemKeys)");
 		}
-		if(PersistenceHelper.appendGroupBy(sb, "item", orderBy)) {
+		if(!PersistenceHelper.appendGroupBy(sb, "item", orderBy)) {
 			sb.append(" order by item.key asc ");
 		}
 
diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
index 4bec3f375b19259202ce21b85af6f8ab6d86cc0b..3eaf63442a5491b77a779dd59e4ac75298050bfd 100644
--- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_en.properties
@@ -1,4 +1,4 @@
-#Wed Nov 20 11:40:02 CET 2013
+#Tue Apr 15 11:12:45 CEST 2014
 add=+
 add.to.list=Add to list
 applications=Applications
@@ -133,6 +133,8 @@ menu.pools.main=Catalog
 menu.pools.main.alt=Catalog
 menu.share=Public shares
 metadatas=Metadata
+my.list=My lists
+my.share=My shares
 new.item=Create question
 next=Next
 pool.key=ID
diff --git a/src/main/java/org/olat/modules/qpool/ui/metadata/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/qpool/ui/metadata/_i18n/LocalStrings_de.properties
index 7019212d021099de4f0cd577901221cb0d5e4326..ed22c9832477f8584ef5f877423006b49712e5bb 100644
--- a/src/main/java/org/olat/modules/qpool/ui/metadata/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/qpool/ui/metadata/_i18n/LocalStrings_de.properties
@@ -8,7 +8,7 @@ chelp.general.title=Fragenpool\: Detailansicht Allgemein
 chelp.lifecycle.1=Der <b>Lebenszyklus</b> gibt Aufschluss \u00FCber Versionsnummer und Status des Items, wie z.B. "in \u00DCberarbeitung" oder "Nicht verf\u00FCgbar".
 chelp.lifecycle.title=Fragenpool\: Detailansicht Lebenszyklus
 chelp.question.1=Die\u00A0<b>Itemanalyse</b>\u00A0ist ein Set von (statistischen) Verfahren, mit dem einzelne Fragenitems\u00A0derart bewertet und beurteilt werden, dass ihre Eignung in Bezug auf die Wissensmessung respektive Wissensabfrage im Hinblick auf die Untersuchungsziele gepr\u00FCft werden kann. Typische Kennwerte sind die Itemschwierigkeit und die Trennsch\u00E4rfe.
-chelp.question.2=Die\u00A0<b>Itemschwierigkeit</b>\u00A0dr\u00FCckt mit einem Wert zwischen 0 und 1 aus, wie schwer eine Frage zu beantworten ist, und gibt damit an wie viele Personen einer Kandidatengruppe die Frage korrekt l\u00F6sen im Verh\u00E4ltnis zur maximal erreichbaren Punktzahl.\u00A0Zweck des Schwierigkeitsindexes ist die Unterscheidung von Personen mit hoher Merkmalsauspr\u00E4gung und Personen mit niedriger Merkmalsauspr\u00E4gung. Unbrauchbar sind demzufolge alle Items, die von allen Personen, bzw. Items, die von keiner Person gel\u00F6st werden konnten oder bejaht wurden (Index-Wert nahe \u00A00 bzw. 1).\u00A0Items mit Werten nahe 0 sind zu einfach und unterscheiden nicht zwischen den Leistungen von Personen und Items mit Werten nahe 1 sind zu schwierig. Beachten Sie, dass bei einer Multiple Choice Frage mit 5 Antwortalternativen (4 Distraktoren) die Ratewahrscheinlichkeit bereits 20% betr\u00E4gt.\u00A0F\u00FCr eine gute Leistungsdifferenzierung eignen sich Items im Bereich 0.4-0.9 oder 40-90%.
+chelp.question.2=Die\u00A0<b>Itemschwierigkeit</b>\u00A0dr\u00FCckt mit einem Wert zwischen 0 und 1 aus, wie schwer eine Frage zu beantworten ist, und gibt damit an wie viele Personen einer Kandidatengruppe die Frage korrekt l\u00F6sen im Verh\u00E4ltnis zur maximal erreichbaren Punktzahl. Zweck des Schwierigkeitsindexes ist die Unterscheidung von Personen mit hoher Merkmalsauspr\u00E4gung und Personen mit niedriger Merkmalsauspr\u00E4gung. Unbrauchbar sind demzufolge alle Items, die von allen Personen, bzw. Items, die von keiner Person gel\u00F6st werden konnten oder bejaht wurden (Index-Wert nahe  1 bzw. 0). Items mit Werten nahe 1 sind zu einfach und unterscheiden nicht zwischen den Leistungen von Personen und Items mit Werten nahe 0 sind zu schwierig. Beachten Sie, dass bei einer Multiple Choice Frage mit 5 Antwortalternativen (4 Distraktoren) die Ratewahrscheinlichkeit bereits 20% betr\u00E4gt. F\u00FCr eine gute Leistungsdifferenzierung eignen sich Items im Bereich 0.4-0.9 oder 40-90%.
 chelp.question.3=Die\u00A0<b>Standardabweichung</b>\u00A0(der Itemschwierigkeit) gibt mit einem Index-Wert zwischen 0 und 1 an,\u00A0\u00A0wie stark sich die Antworten auf eine Frage zwischen mehreren Personen unterscheiden, wie hoch die Antworten um den Mittelwert streuen (Schwankungsbreite). Eine Standardabweichung umfasst etwas mehr als 68% aller Werte um den Mittelwert, zwei Standardabweichungen umfassen knapp 95.5% aller Werte in der Werteverteilung. Je kleiner die Standardabweichung ist, desto "stabiler" ist die Itemschwierigkeit \u00FCber eine oder auch mehrere Testkandidatenpopulationen, je gr\u00F6sser, desto "instabiler" ist sie. Items mit einer hohen Standardabweichung sind demzufolge mit etwas Vorsicht auszuw\u00E4hlen.
 chelp.question.4=Die\u00A0<b>Trennsch\u00E4rfe</b>\u00A0gibt mit einem Wert zwischen -1 und +1 die F\u00E4higkeit eines Items an, Kandidaten mit guter und schlechter Leistung in der Gesamtpr\u00FCfung zu trennen. Sie gibt an, ob eine Frage etwas \u00C4hnliches abfragt wie der \u00FCbrige Test. Die Trennsch\u00E4rfe ist daher der wichtigste Kennwert in der Itemselektion.\u00A0Sie wird berechnet als Korrelationskoeffizient zwischen der erreichten Punktzahl in diesem Item und der Gesamtpunktzahl in der Pr\u00FCfung ohne dieses Item. F\u00FCr eine gute Leistungsdifferenzierung sind Items mit klar positiver Trennsch\u00E4rfe erforderlich, wenn m\u00F6glich gr\u00F6sser oder gleich 0.2, sicher aber gr\u00F6sser als 0.1. Items mit Trennsch\u00E4rfen um 0 tragen nichts zur Differenzierung bei, solche mit negativer Trennsch\u00E4rfe laufen sogar dem Differenzierungsziel entgegen und sollten in Folgetests nicht mehr verwendet werden.
 chelp.question.5=Des weiteren erhalten Sie in dieser Sektion Informationen zu der in der Frage enthaltenen Anzahl Distraktoren, also wieviele Antwortalternativen zur Verf\u00FCgung stehen.\u00A0
diff --git a/src/main/java/org/olat/note/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/note/_i18n/LocalStrings_fr.properties
index c765ea6a3f82b609d7aecf3145a615343eab5bfc..260bb908198257de9951b7d7d6502686a29065bf 100644
--- a/src/main/java/org/olat/note/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/note/_i18n/LocalStrings_fr.properties
@@ -8,7 +8,7 @@ note.header=Mes notes
 note.nonotes=Il n'y a pas de notes.
 notesPortlet.description=Raccourci vers vos notes les plus utilis\u00E9es
 notesPortlet.nonotes=Vous n'avez pas r\u00E9dig\u00E9 de notes.
-notesPortlet.showAll=Afficher toutes
+notesPortlet.showAll=Tout afficher
 notesPortlet.title=Mes notes
 table.header.delete=Supprimer
 table.note.resource=Ressource didactique
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
index d4d45251d9710cc175b7836f433cbddc132d3492..2540199d28e63566f6bd14b21c22d1e88823d8ae 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Tue Apr 01 21:16:06 CEST 2014
+#Tue Apr 15 21:40:02 CEST 2014
 CourseModule=Cours
 EPStructuredMapTemplate=Mod\u00E8le de portfolio
 Failed=La transmission du fichier a \u00E9chou\u00E9.
@@ -399,6 +399,7 @@ search.survey=Questionnaires
 search.test=Tests
 search.wiki=Wiki
 security.disabled.info=Cette ressource didactique est d\u00E9sactiv\u00E9e sur ce syst\u00E8me pour des raisons de s\u00E9curit\u00E9. Demandez \u00E0 votre administrateur syst\u00E8me de plus amples informations.
+security.disabled.title=Resource didactique d\u00E9sactiv\u00E9e
 sf.notconfigured=Pas de dossier ressources s\u00E9lectionn\u00E9 
 sf.resourcetitle=Dossier ressources s\u00E9lectionn\u00E9 
 tab.accesscontrol=Contr\u00F4le d'acc\u00E8s
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java
index c2ee397dc1f9cc357800925c3f9d90d89c4416d1..61e1cfa7e6cd1338ea0cc800de8bf142fee1c1a7 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java
@@ -58,6 +58,7 @@ import org.olat.repository.handlers.SCORMCPHandler;
 import org.olat.repository.handlers.SharedFolderHandler;
 import org.olat.repository.handlers.WebDocumentHandler;
 import org.olat.repository.handlers.WikiHandler;
+import org.olat.repository.model.RepositoryEntryLifecycle;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 import org.olat.util.logging.activity.LoggingResourceable;
@@ -323,8 +324,9 @@ public class RepositoryAddController extends BasicController {
 			//save current name and description from create from
 			String displayName = addedEntry.getDisplayname();
 			String description = addedEntry.getDescription();
+			RepositoryEntryLifecycle lifecycle = addedEntry.getLifecycle();
 			// Do set access for owner at the end, because unfinished course should be invisible
-			addedEntry = RepositoryManager.getInstance().setDescriptionAndName(addedEntry, displayName, description);
+			addedEntry = RepositoryManager.getInstance().setDescriptionAndName(addedEntry, displayName, description, lifecycle);
 			addedEntry = RepositoryManager.getInstance().setAccess(addedEntry, RepositoryEntry.ACC_OWNERS, false);
 			addController.repositoryEntryCreated(addedEntry);
 			
diff --git a/src/main/java/org/olat/repository/portlet/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/repository/portlet/_i18n/LocalStrings_fr.properties
index 809cc43fd96077630f7405cb05b2ab4ec8301e15..c4819be38c68aff785f303403712cd1f9b609e0b 100644
--- a/src/main/java/org/olat/repository/portlet/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/repository/portlet/_i18n/LocalStrings_fr.properties
@@ -1,6 +1,6 @@
 #Sun Mar 14 22:58:52 CET 2010
 repositoryPortlet.noentry=Il n'y a pas de cours actuel pour vous.
-repositoryPortlet.showAll=Afficher tout
+repositoryPortlet.showAll=Tout afficher
 repositoryPortlet.student.description=Une liste de tous les cours que je prends
 repositoryPortlet.student.title=Mes cours
 repositoryPortlet.teacher.description=Une liste de tous les cours, dans lequel je suis auteur ou tuteur de groupe d'\u00E9tude.
diff --git a/src/main/webapp/static/images/qti/green.png b/src/main/webapp/static/images/qti/green.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4103724241daf615c58aea001a3fec27896b5a2
Binary files /dev/null and b/src/main/webapp/static/images/qti/green.png differ
diff --git a/src/main/webapp/static/images/qti/grey.png b/src/main/webapp/static/images/qti/grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..71941603f0825c3d6e8e112b9de670c8c665e882
Binary files /dev/null and b/src/main/webapp/static/images/qti/grey.png differ
diff --git a/src/main/webapp/static/images/qti/red.png b/src/main/webapp/static/images/qti/red.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea500f29d8953946dd9911dde04e692697a6a6df
Binary files /dev/null and b/src/main/webapp/static/images/qti/red.png differ
diff --git a/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.js b/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.js
index 8d09ec7136ffd3d90597e02dc5cad859bc220da5..751117d62117700f6dcff4f77cbecfb7ad11aba5 100644
--- a/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.js
+++ b/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.js
@@ -79,13 +79,26 @@
     	svg.selectAll('.bar0')
     	    .data(data)
     	  .enter().append('rect')
-    	    .attr('class', 'bar bar0 bar_default')
+    	    .attr('class', 'bar bar_default')
     	    .attr('fill', 'bar_default')
     	    .attr('x', 0)
     	    .attr('y', function(d) { return y(d[0]) + 2; })
     	    .attr('width', function(d) { return x(d[1]); })
     	    .attr('height', y.rangeBand() - 4);
     	
+       	var valDy = ((y.rangeBand() / 2) + 3) + "px";
+    	svg.selectAll('.bar0')
+    	     .data(data)
+    	   .enter().append('text')
+    	    .attr('x', function(d) { return x(d[1]); })
+    	    .attr('y', function(d) { return y(d[0]) + 2; })
+    	    .attr('dx', -3)
+    	    .attr('dy', valDy)
+    	    .attr('text-anchor', 'end')
+    	    .attr('fill', 'rgb(48,48,48)')
+    	    .attr('stroke', 'none')
+    	    .text(function(d) { return (d[1] <= 0) ? '' : d3.round(d[1], 2); });
+    	
     	svg.append('g')
     	    .attr('class', 'y axis')
     	    .call(yAxis)
@@ -104,24 +117,19 @@
     	
     	var data = settings.values.reverse();
     	
-    	var margin = {top: 40, right: 60, bottom: 40, left: 60},
+    	var margin = {top: 15, right: 60, bottom: 40, left: 60},
     	   width = placeholderwidth - margin.left - margin.right;
     	
     	var height = data.length * settings.barHeight;
     	$obj.height(height + margin.top + margin.bottom + 'px');
     	
-    	var sum = d3.sum(data, function(d) { return d[1]; });
+    	var sum =  settings.participants;
     	
     	var x = d3.scale.linear()
-    	  .domain([0, d3.max(data, function(d) { return d[1]; })])
+    	  .domain([0, sum])
     	   .range([0, width]);
-    	var xAxis = d3.svg.axis()
-    	   .scale(x)
-    	   .orient('top')
-    	   .ticks(10);
-    	
     	var x2 = d3.scale.linear()
-    	  .domain([0, d3.max(data, function(d) { return d[1] / sum; })])
+    	  .domain([0, 1])
     	   .range([0, width]);
     	var x2Axis = d3.svg.axis()
     	   .scale(x2)
@@ -140,17 +148,7 @@
     	   .attr('height', height + margin.top + margin.bottom)
     	  .append('g')
     	   .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
-    	
-    	svg.append('g')
-    	     .attr('class', 'x axis')
-    	     .attr('transform', 'translate(0,0)')
-    	     .call(xAxis)  .append('text')
-    	    .attr('y', 0 - (margin.top / 1.1))
-    	    .attr('x', (width / 2))
-    	    .attr('dy', '1em')
-    	    .style('text-anchor', 'middle')
-    	    .text(settings.xBottomLegend);
-    	
+
     	svg.append('g')
     	     .attr('class', 'x axis')
     	     .attr('transform', 'translate(0,' + height + ')')
@@ -164,13 +162,26 @@
     	svg.selectAll('.bar0')
     	    .data(data)
     	  .enter().append('rect')
-    	    .attr('class', 'bar bar0 bar_green')
+    	    .attr('class', 'bar bar_green')
     	    .attr('fill', 'bar_green')
     	    .attr('x', 0)
     	    .attr('y', function(d) { return y(d[0]) + 2; })
     	    .attr('width', function(d) { return x(d[1]); })
     	    .attr('height', y.rangeBand() - 4);
     	
+    	var valDy = ((y.rangeBand() / 2) + 3) + "px";
+    	svg.selectAll('.bar0')
+    	     .data(data)
+    	   .enter().append('text')
+    	    .attr('x', function(d) { return x(d[1]); })
+    	    .attr('y', function(d) { return y(d[0]) + 2; })
+    	    .attr('dx', -3)
+    	    .attr('dy', valDy)
+    	    .attr('text-anchor', 'end')
+    	    .attr('fill', 'rgb(48,48,48)')
+    	    .attr('stroke', 'none')
+    	    .text(function(d) { return (d[1] <= 0) ? '' : d[1]; });
+    	
     	svg.append('g')
     	    .attr('class', 'y axis')
     	   .call(yAxis)
@@ -187,24 +198,21 @@
     	var placeholderwidth = $obj.width();
     	var data = settings.values.reverse();
     	
-    	var margin = {top: 40, right: 10, bottom: 40, left: 40};
+    	var margin = {top: 40, right: 15, bottom: 40, left: 40};
     	var height = data.length * settings.barHeight;
     	$obj.height(height + margin.top + margin.bottom + 'px');
     	var width = placeholderwidth - margin.left - margin.right;
     	
     	var sum =  settings.participants;
-    	var max = d3.max(data, function(d) { return d[1]; });
+    	var max = sum;
+    	
+    	console.log(settings.colors);
 
     	var x = d3.scale.linear()
     	  .domain([0, max])
     	   .range([0, width]);
-    	var xAxis = d3.svg.axis()
-    	   .scale(x)
-    	   .orient('top')
-    	   .ticks(max);
-    	
     	var x2 = d3.scale.linear()
-    	  .domain([0, d3.max(data, function(d) { return (d[1]) / sum; })])
+    	  .domain([0, 1])
     	   .range([0, width]);
     	var x2Axis = d3.svg.axis()
     	   .scale(x2)
@@ -224,16 +232,6 @@
     	  .append('g')
     	   .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
     	
-    	svg.append('g')
-    	     .attr('class', 'x axis')
-    	     .attr('transform', 'translate(0,0)')
-    	     .call(xAxis)  .append('text')
-    	    .attr('y', 0 - (margin.top / 1.1))
-    	    .attr('x', (width / 2))
-    	    .attr('dy', '1em')
-    	    .style('text-anchor', 'middle')
-    	    .text(settings.xTopLegend);
-    	
     	svg.append('g')
     	     .attr('class', 'x axis')
     	     .attr('transform', 'translate(0,' + height + ')')
@@ -264,6 +262,19 @@
     	    .attr('y', function(d) { return y(d[0]) + 2; })
     	    .attr('width', function(d) { return x(d[1]); })
     	    .attr('height', y.rangeBand() - 4);
+    	
+    	var valDy = ((y.rangeBand() / 2) + 3) + "px";
+    	svg.selectAll('.bar0')
+    	     .data(data)
+    	   .enter().append('text')
+    	    .attr('x', function(d) { return x(d[1]); })
+    	    .attr('y', function(d) { return y(d[0]) + 2; })
+    	    .attr('dx', -3) // padding-left
+    	    .attr('dy', valDy) // vertical-align: middle
+    	    .attr('text-anchor', 'end') // text-align: right
+    	    .attr('fill', 'rgb(48,48,48)')
+    	    .attr('stroke', 'none')
+    	    .text(function(d) { return (d[1] <= 0) ? '' : d[1]; });
     };
     
     horizontalBarMultipleChoice = function($obj, settings) {
@@ -271,24 +282,19 @@
     	
     	var data = settings.values.reverse();
     	
-    	var margin = {top: 40, right: 10, bottom: 40, left: 40};
+    	var margin = {top: 40, right: 15, bottom: 40, left: 40};
     	var height = data.length * settings.barHeight;
     	$obj.height(height + margin.top + margin.bottom + 'px');
     	var width = placeholderwidth - margin.left - margin.right;
     	
     	var sum = settings.participants;
-    	var max = d3.max(data, function(d) { return d[1] + d[2] + d[3]; });
+    	var max = sum;
 
     	var x = d3.scale.linear()
     	  .domain([0, max])
     	   .range([0, width]);
-    	var xAxis = d3.svg.axis()
-    	   .scale(x)
-    	   .orient('top')
-    	   .ticks(max);
-    	
     	var x2 = d3.scale.linear()
-    	  .domain([0, d3.max(data, function(d) { return (d[1] + d[2] + d[3]) / sum; })])
+    	  .domain([0, 1])
     	   .range([0, width]);
     	var x2Axis = d3.svg.axis()
     	   .scale(x2)
@@ -307,17 +313,7 @@
     	   .attr('height', height + margin.top + margin.bottom)
     	  .append('g')
     	   .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
-    	
-    	svg.append('g')
-    	     .attr('class', 'x axis')
-    	     .attr('transform', 'translate(0,0)')
-    	     .call(xAxis)  .append('text')
-    	    .attr('y', 0 - (margin.top / 1.1))
-    	    .attr('x', (width / 2))
-    	    .attr('dy', '1em')
-    	    .style('text-anchor', 'middle')
-    	    .text(settings.xTopLegend);
-    	
+
     	svg.append('g')
     	     .attr('class', 'x axis')
     	     .attr('transform', 'translate(0,' + height + ')')
@@ -349,6 +345,19 @@
     	    .attr('width', function(d) { return x(d[1]); })
     	    .attr('height', y.rangeBand() - 4);
     	
+    	var valDy = ((y.rangeBand() / 2) + 3) + "px";
+    	svg.selectAll('.bar0')
+    	     .data(data)
+    	   .enter().append('text')
+    	    .attr('x', function(d) { return x(d[1]); })
+    	    .attr('y', function(d) { return y(d[0]) + 2; })
+    	    .attr('dx', -3)
+    	    .attr('dy', valDy)
+    	    .attr('text-anchor', 'end')
+    	    .attr('fill', 'rgb(48,48,48)')
+    	    .attr('stroke', 'none')
+    	    .text(function(d) { return (d[1] <= 0) ? '' : d[1]; });
+    	
     	svg.selectAll('.bar1')
     	    .data(data)
     	  .enter().append('rect')
@@ -359,6 +368,18 @@
     	    .attr('width', function(d) { return x(d[2]); })
     	    .attr('height', y.rangeBand() - 4);
     	
+    	svg.selectAll('.bar1')
+	     	.data(data)
+		   .enter().append('text')
+		    .attr('x', function(d) { return x(d[1] + d[2]); })
+		    .attr('y', function(d) { return y(d[0]) + 2; })
+		    .attr('dx', -3)
+		    .attr('dy', valDy)
+		    .attr('text-anchor', 'end')
+		    .attr('fill', 'rgb(48,48,48)')
+		    .attr('stroke', 'none')
+		    .text(function(d) { return (d[2] <= 0) ? '' : d[2]; });
+    	
     	svg.selectAll('.bar2')
     	    .data(data)
     	  .enter().append('rect')
@@ -368,6 +389,18 @@
     	    .attr('y', function(d) { return y(d[0]) + 2; })
     	    .attr('width', function(d) { return x(d[3]); })
     	    .attr('height', y.rangeBand() - 4);
+    	
+    	svg.selectAll('.bar2')
+	     	.data(data)
+		   .enter().append('text')
+		    .attr('x', function(d) { return x(d[1] + d[2] + d[3]); })
+		    .attr('y', function(d) { return y(d[0]) + 2; })
+		    .attr('dx', -3) // padding-left
+		    .attr('dy', valDy) // vertical-align: middle
+		    .attr('text-anchor', 'end') // text-align: right
+		    .attr('fill', 'rgb(48,48,48)')
+		    .attr('stroke', 'none')
+		    .text(function(d) { return (d[3] <= 0) ? '' : d[3]; });
     };
     
     horizontalBarSingleChoice = function($obj, settings) {
@@ -376,24 +409,19 @@
     	var data = settings.values.reverse();
     	var colors = settings.colors.reverse();
     	
-    	var margin = {top: 40, right: 10, bottom: 40, left: 40};
+    	var margin = {top: 15, right: 15, bottom: 40, left: 40};
     	var height = data.length * settings.barHeight;
     	$obj.height(height + margin.top + margin.bottom + 'px');
     	var width = placeholderwidth - margin.left - margin.right;
     	
-    	var sum = settings.participants;// d3.sum(data, function(d) { return d[1]; });
-    	var max = d3.max(data, function(d) { return d[1]; });
+    	var sum = settings.participants;
+    	var max = sum;
 
     	var x = d3.scale.linear()
     	  .domain([0, max])
     	   .range([0, width]);
-    	var xAxis = d3.svg.axis()
-    	   .scale(x)
-    	   .orient('top')
-    	   .ticks(max);
-    	
     	var x2 = d3.scale.linear()
-    	  .domain([0, d3.max(data, function(d) { return d[1] / sum; })])
+    	  .domain([0, 1])
     	   .range([0, width]);
     	var x2Axis = d3.svg.axis()
     	   .scale(x2)
@@ -413,17 +441,6 @@
     	  .append('g')
     	   .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
     	
-    	svg.append('g')
-    	     .attr('class', 'x axis')
-    	     .attr('transform', 'translate(0,0)')
-    	    .call(xAxis)
-    	     .append('text')
-    	    .attr('y', 0 - (margin.top / 1.1))
-    	    .attr('x', (width / 2))
-    	    .attr('dy', '1em')
-    	    .style('text-anchor', 'middle')
-    	    .text(settings.xTopLegend);
-    	
     	svg.append('g')
     	     .attr('class', 'x axis')
     	     .attr('transform', 'translate(0,' + height + ')')
@@ -448,6 +465,19 @@
     	    .attr('width', function(d) { return x(d[1]); })
     	    .attr('height', y.rangeBand() - 4);
     	
+    	var valDy = ((y.rangeBand() / 2) + 3) + "px";
+    	svg.selectAll('.bar0')
+    	     .data(data)
+    	   .enter().append('text')
+    	    .attr('x', function(d) { return x(d[1]); })
+    	    .attr('y', function(d) { return y(d[0]) + 2; })
+    	    .attr('dx', -3) // padding-left
+    	    .attr('dy', valDy) // vertical-align: middle
+    	    .attr('text-anchor', 'end') // text-align: right
+    	    .attr('fill', 'rgb(48,48,48)')
+    	    .attr('stroke', 'none')
+    	    .text(function(d) { return (d[1] <= 0) ? '' : d[1]; });
+    	
     	svg.append('g')
     	    .attr('class', 'y axis')
     	   .call(yAxis)
@@ -464,6 +494,7 @@
     	var placeholderheight = $obj.height();
     	var placeholderwidth = $obj.width();
     	var values = settings.values;
+    	var minTime = d3.min(values, function(d) { return d; });
     	var maxTime = d3.max(values, function(d) { return d; });
     	
     	var timeFormat = '%M:%S';
@@ -485,6 +516,7 @@
     	  .range([0, width]);
     	
     	var data = d3.layout.histogram()
+    	  //.range([0, maxTime])
     	  .bins(x.ticks(20))
     	  (values);
     	
diff --git a/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.min.js b/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.min.js
index ce339fa429b7beefba0d949201cc115130dc7742..759b11bffdd7822c8ccd887eaa37ec83dbf26f71 100644
--- a/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.min.js
+++ b/src/main/webapp/static/js/jquery/openolat/jquery.statistics.chart.min.js
@@ -1 +1 @@
-(function(a){a.fn.qtiStatistics=function(d,b){var c=a.extend({values:[],colors:[],cut:null,participants:-1,barHeight:40,xTopLegend:"x Top",xBottomLegend:"x Bottom",yLeftLegend:"y Left",yRightLegend:"y Right"},b);try{if(d=="histogramScore"){histogramScore(this,c)}else{if(d=="histogramDuration"){histogramDuration(this,c)}else{if(d=="horizontalBarSingleChoice"){horizontalBarSingleChoice(this,c)}else{if(d=="rightAnswerPerItem"){rightAnswerPerItem(this,c)}else{if(d=="averageScorePerItem"){averageScorePerItem(this,c)}else{if(d=="horizontalBarMultipleChoice"){horizontalBarMultipleChoice(this,c)}else{if(d=="horizontalBarMultipleChoiceSurvey"){horizontalBarMultipleChoiceSurvey(this,c)}}}}}}}}catch(f){if(console){console.log(f)}}return this};averageScorePerItem=function(b,f){var j=b.width();var h=f.values.reverse();var m=b.height();var g={top:10,right:60,bottom:40,left:60},d=j-g.left-g.right;var n=h.length*f.barHeight;b.height(n+g.top+g.bottom+"px");var l=d3.scale.linear().domain([0,d3.max(h,function(o){return o[1]})]).range([0,d]);var e=d3.svg.axis().scale(l).orient("bottom").ticks(10);var k=d3.scale.ordinal().domain(h.map(function(o){return o[0]})).rangeRoundBands([n,0]);var c=d3.svg.axis().scale(k).orient("left");var i=d3.select("#"+b.attr("id")).append("svg").attr("width",d+g.left+g.right).attr("height",n+g.top+g.bottom).append("g").attr("transform","translate("+g.left+","+g.top+")");i.append("g").attr("class","x axis").attr("transform","translate(0,"+n+")").call(e).append("text").attr("y",(g.bottom/1.7)).attr("x",(d/2)).attr("dy","1em").style("text-anchor","middle").text(f.xBottomLegend);i.selectAll(".bar0").data(h).enter().append("rect").attr("class","bar bar0 bar_default").attr("fill","bar_default").attr("x",0).attr("y",function(o){return k(o[0])+2}).attr("width",function(o){return l(o[1])}).attr("height",k.rangeBand()-4);i.append("g").attr("class","y axis").call(c).append("text").attr("transform","rotate(-90)").attr("y",0-(g.right/1.7)).attr("x",0-(n/2)).attr("dy","1em").style("text-anchor","middle").text(f.yLeftLegend)};rightAnswerPerItem=function(c,h){var p=c.height();var l=c.width();var j=h.values.reverse();var i={top:40,right:60,bottom:40,left:60},f=l-i.left-i.right;var q=j.length*h.barHeight;c.height(q+i.top+i.bottom+"px");var m=d3.sum(j,function(r){return r[1]});var o=d3.scale.linear().domain([0,d3.max(j,function(r){return r[1]})]).range([0,f]);var g=d3.svg.axis().scale(o).orient("top").ticks(10);var e=d3.scale.linear().domain([0,d3.max(j,function(r){return r[1]/m})]).range([0,f]);var b=d3.svg.axis().scale(e).orient("bottom").ticks(10,"%");var n=d3.scale.ordinal().domain(j.map(function(r){return r[0]})).rangeRoundBands([q,0]);var d=d3.svg.axis().scale(n).orient("left");var k=d3.select("#"+c.attr("id")).append("svg").attr("width",f+i.left+i.right).attr("height",q+i.top+i.bottom).append("g").attr("transform","translate("+i.left+","+i.top+")");k.append("g").attr("class","x axis").attr("transform","translate(0,0)").call(g).append("text").attr("y",0-(i.top/1.1)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(h.xBottomLegend);k.append("g").attr("class","x axis").attr("transform","translate(0,"+q+")").call(b).append("text").attr("y",(i.bottom/1.7)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(h.xTopLegend);k.selectAll(".bar0").data(j).enter().append("rect").attr("class","bar bar0 bar_green").attr("fill","bar_green").attr("x",0).attr("y",function(r){return n(r[0])+2}).attr("width",function(r){return o(r[1])}).attr("height",n.rangeBand()-4);k.append("g").attr("class","y axis").call(d).append("text").attr("transform","rotate(-90)").attr("y",0-(i.right/1.7)).attr("x",0-(q/2)).attr("dy","1em").style("text-anchor","middle").text(h.yLeftLegend)};horizontalBarMultipleChoiceSurvey=function(c,h){var l=c.width();var j=h.values.reverse();var i={top:40,right:10,bottom:40,left:40};var q=j.length*h.barHeight;c.height(q+i.top+i.bottom+"px");var f=l-i.left-i.right;var m=h.participants;var o=d3.max(j,function(r){return r[1]});var p=d3.scale.linear().domain([0,o]).range([0,f]);var g=d3.svg.axis().scale(p).orient("top").ticks(o);var e=d3.scale.linear().domain([0,d3.max(j,function(r){return(r[1])/m})]).range([0,f]);var b=d3.svg.axis().scale(e).orient("bottom").ticks(10,"%");var n=d3.scale.ordinal().domain(j.map(function(r){return r[0]})).rangeRoundBands([q,0]);var d=d3.svg.axis().scale(n).orient("left");var k=d3.select("#"+c.attr("id")).append("svg").attr("width",f+i.left+i.right).attr("height",q+i.top+i.bottom).append("g").attr("transform","translate("+i.left+","+i.top+")");k.append("g").attr("class","x axis").attr("transform","translate(0,0)").call(g).append("text").attr("y",0-(i.top/1.1)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(h.xTopLegend);k.append("g").attr("class","x axis").attr("transform","translate(0,"+q+")").call(b).append("text").attr("y",(i.bottom/1.7)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(h.xBottomLegend);k.append("g").attr("class","y axis").call(d).append("text").attr("transform","rotate(-90)").attr("y",0-i.left).attr("x",0-(q/2)).attr("dy","1em").style("text-anchor","middle").text(h.yLeftLegend);k.selectAll(".bar0").data(j).enter().append("rect").attr("class","bar bar_default").attr("fill","bar_default").attr("x",0).attr("y",function(r){return n(r[0])+2}).attr("width",function(r){return p(r[1])}).attr("height",n.rangeBand()-4)};horizontalBarMultipleChoice=function(c,h){var l=c.width();var j=h.values.reverse();var i={top:40,right:10,bottom:40,left:40};var q=j.length*h.barHeight;c.height(q+i.top+i.bottom+"px");var f=l-i.left-i.right;var m=h.participants;var o=d3.max(j,function(r){return r[1]+r[2]+r[3]});var p=d3.scale.linear().domain([0,o]).range([0,f]);var g=d3.svg.axis().scale(p).orient("top").ticks(o);var e=d3.scale.linear().domain([0,d3.max(j,function(r){return(r[1]+r[2]+r[3])/m})]).range([0,f]);var b=d3.svg.axis().scale(e).orient("bottom").ticks(10,"%");var n=d3.scale.ordinal().domain(j.map(function(r){return r[0]})).rangeRoundBands([q,0]);var d=d3.svg.axis().scale(n).orient("left");var k=d3.select("#"+c.attr("id")).append("svg").attr("width",f+i.left+i.right).attr("height",q+i.top+i.bottom).append("g").attr("transform","translate("+i.left+","+i.top+")");k.append("g").attr("class","x axis").attr("transform","translate(0,0)").call(g).append("text").attr("y",0-(i.top/1.1)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(h.xTopLegend);k.append("g").attr("class","x axis").attr("transform","translate(0,"+q+")").call(b).append("text").attr("y",(i.bottom/1.7)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(h.xBottomlegend);k.append("g").attr("class","y axis").call(d).append("text").attr("transform","rotate(-90)").attr("y",0-i.left).attr("x",0-(q/2)).attr("dy","1em").style("text-anchor","middle").text(h.yLeftLegend);k.selectAll(".bar0").data(j).enter().append("rect").attr("class","bar bar_green").attr("fill","bar_green").attr("x",0).attr("y",function(r){return n(r[0])+2}).attr("width",function(r){return p(r[1])}).attr("height",n.rangeBand()-4);k.selectAll(".bar1").data(j).enter().append("rect").attr("class","bar bar_red").attr("fill","bar_red").attr("x",function(r){return p(r[1])}).attr("y",function(r){return n(r[0])+2}).attr("width",function(r){return p(r[2])}).attr("height",n.rangeBand()-4);k.selectAll(".bar2").data(j).enter().append("rect").attr("class","bar bar_grey").attr("fill","bar_grey").attr("x",function(r){return p(r[1]+r[2])}).attr("y",function(r){return n(r[0])+2}).attr("width",function(r){return p(r[3])}).attr("height",n.rangeBand()-4)};horizontalBarSingleChoice=function(c,i){var m=c.width();var k=i.values.reverse();var d=i.colors.reverse();var j={top:40,right:10,bottom:40,left:40};var r=k.length*i.barHeight;c.height(r+j.top+j.bottom+"px");var g=m-j.left-j.right;var n=i.participants;var p=d3.max(k,function(s){return s[1]});var q=d3.scale.linear().domain([0,p]).range([0,g]);var h=d3.svg.axis().scale(q).orient("top").ticks(p);var f=d3.scale.linear().domain([0,d3.max(k,function(s){return s[1]/n})]).range([0,g]);var b=d3.svg.axis().scale(f).orient("bottom").ticks(10,"%");var o=d3.scale.ordinal().domain(k.map(function(s){return s[0]})).rangeRoundBands([r,0]);var e=d3.svg.axis().scale(o).orient("left");var l=d3.select("#"+c.attr("id")).append("svg").attr("width",g+j.left+j.right).attr("height",r+j.top+j.bottom).append("g").attr("transform","translate("+j.left+","+j.top+")");l.append("g").attr("class","x axis").attr("transform","translate(0,0)").call(h).append("text").attr("y",0-(j.top/1.1)).attr("x",(g/2)).attr("dy","1em").style("text-anchor","middle").text(i.xTopLegend);l.append("g").attr("class","x axis").attr("transform","translate(0,"+r+")").call(b).append("text").attr("y",(j.bottom/1.7)).attr("x",(g/2)).attr("dy","1em").style("text-anchor","middle").text(i.xBottomLegend);l.selectAll(".bar0").data(k).enter().append("rect").attr("class",function(t,s){if(d==null){return"bar bar0 bar_default"}else{if(d.length>s){return d[s]}else{return"bar bar0 bar_default"}}}).attr("fill","bar_green").attr("x",0).attr("y",function(s){return o(s[0])+2}).attr("width",function(s){return q(s[1])}).attr("height",o.rangeBand()-4);l.append("g").attr("class","y axis").call(e).append("text").attr("transform","rotate(-90)").attr("y",0-j.left).attr("x",0-(r/2)).attr("dy","1em").style("text-anchor","middle").text(i.yLeftLegend)};histogramDuration=function(u,t){var c=u.height();var q=u.width();var f=t.values;var w=d3.max(f,function(x){return x});var d="%M:%S";if(w<10){d+=":%L"}var i=new Date(2012,0,1,0,0),v=d3.format(",.f"),z=d3.time.format(d),l=function(x){return z(new Date(i.getTime()+(x*1000)))};var n={top:10,right:60,bottom:40,left:60},r=q-n.left-n.right,p=c-n.top-n.bottom;var m=d3.scale.linear().domain([0,w]).range([0,r]);var A=d3.layout.histogram().bins(m.ticks(20))(f);var h=d3.sum(A,function(x){return x.y});var k=d3.scale.linear().domain([0,d3.max(A,function(x){return x.y})]).range([p,0]);var g=d3.scale.linear().domain([0,d3.max(A,function(x){return x.y/h})]).range([p,0]);var j=d3.svg.axis().scale(m).orient("bottom").tickFormat(l);var b=d3.svg.axis().scale(k).orient("right").ticks(k.domain()[1]).tickSubdivide(0);var e=d3.svg.axis().scale(g).orient("left").ticks(10,"%");var o=d3.select("#"+u.attr("id")).append("svg").attr("width",r+n.left+n.right).attr("height",p+n.top+n.bottom).append("g").attr("transform","translate("+n.left+","+n.top+")");var s=o.selectAll(".bar").data(A).enter().append("g").attr("class","bar bar_default").attr("transform",function(x){return"translate("+m(x.x)+","+k(x.y)+")"}).append("rect").attr("x",2).attr("width",m(A[0].dx)-4).attr("height",function(x){return p-k(x.y)});o.append("g").attr("class","y axis").call(e).append("text").attr("transform","rotate(-90)").attr("y",0-n.left).attr("x",0-(p/2)).attr("dy","1em").style("text-anchor","middle").text(t.yLeftLegend);o.append("g").attr("class","x axis").attr("transform","translate(0,"+p+")").call(j).append("text").attr("y",(n.bottom/1.1)).attr("x",(r/2)).attr("dx","1em").style("text-anchor","middle").text(t.xBottomLegend);o.append("g").attr("class","y axis").attr("transform","translate("+r+",0)").call(b).append("text").attr("transform","rotate(90)").attr("y",0-(n.right)).attr("x",(p/2)).attr("dy","1em").style("text-anchor","middle").text(t.yRightLegend)};histogramScore=function(s,r){var c=s.height();var o=s.width();var d=r.values;var l={top:10,right:60,bottom:40,left:60},p=o-l.left-l.right,n=c-l.top-l.bottom;var f=r.cut;var k=d3.scale.linear().domain([0,3]).range([0,p]);var t=d3.layout.histogram().bins(k.ticks(20))(d);var h=d3.sum(t,function(u){return u.y});var j=d3.scale.linear().domain([0,d3.max(t,function(u){return u.y})]).range([n,0]);var g=d3.scale.linear().domain([0,d3.max(t,function(u){return u.y/h})]).range([n,0]);var i=d3.svg.axis().scale(k).orient("bottom").tickFormat(d3.format(".01f"));var b=d3.svg.axis().scale(j).orient("right").ticks(j.domain()[1]).tickSubdivide(0);var e=d3.svg.axis().scale(g).orient("left").ticks(10,"%");var m=d3.select("#"+s.attr("id")).append("svg").attr("width",p+l.left+l.right).attr("height",n+l.top+l.bottom).append("g").attr("transform","translate("+l.left+","+l.top+")");var q=m.selectAll(".bar").data(t).enter().append("g").attr("class",function(v,u){if(f==null){return"bar bar_default"}else{if(t[u].x<f){return"bar bar_red"}else{return"bar bar_green"}}}).attr("transform",function(u){return"translate("+k(u.x)+","+j(u.y)+")"}).append("rect").attr("x",2).attr("width",k(t[0].dx)-4).attr("height",function(u){return n-j(u.y)});m.append("g").attr("class","y axis").call(e).append("text").attr("transform","rotate(-90)").attr("y",0-l.left).attr("x",0-(n/2)).attr("dy","1em").style("text-anchor","middle").text(r.yLeftLegend);m.append("g").attr("class","x axis").attr("transform","translate(0,"+n+")").call(i).append("text").attr("y",(l.bottom/1.1)).attr("x",(p/2)).attr("dx","1em").style("text-anchor","middle").text(r.xBottomLegend);m.append("g").attr("class","y axis").attr("transform","translate("+p+",0)").call(b).append("text").attr("transform","rotate(90)").attr("y",0-(l.right)).attr("x",(n/2)).attr("dy","1em").style("text-anchor","middle").text(r.yRightLegend)}}(jQuery));
\ No newline at end of file
+(function(a){a.fn.qtiStatistics=function(d,b){var c=a.extend({values:[],colors:[],cut:null,participants:-1,barHeight:40,xTopLegend:"x Top",xBottomLegend:"x Bottom",yLeftLegend:"y Left",yRightLegend:"y Right"},b);try{if(d=="histogramScore"){histogramScore(this,c)}else{if(d=="histogramDuration"){histogramDuration(this,c)}else{if(d=="horizontalBarSingleChoice"){horizontalBarSingleChoice(this,c)}else{if(d=="rightAnswerPerItem"){rightAnswerPerItem(this,c)}else{if(d=="averageScorePerItem"){averageScorePerItem(this,c)}else{if(d=="horizontalBarMultipleChoice"){horizontalBarMultipleChoice(this,c)}else{if(d=="horizontalBarMultipleChoiceSurvey"){horizontalBarMultipleChoiceSurvey(this,c)}}}}}}}}catch(f){if(console){console.log(f)}}return this};averageScorePerItem=function(b,f){var j=b.width();var h=f.values.reverse();var m=b.height();var g={top:10,right:60,bottom:40,left:60},d=j-g.left-g.right;var n=h.length*f.barHeight;b.height(n+g.top+g.bottom+"px");var l=d3.scale.linear().domain([0,d3.max(h,function(p){return p[1]})]).range([0,d]);var e=d3.svg.axis().scale(l).orient("bottom").ticks(10);var k=d3.scale.ordinal().domain(h.map(function(p){return p[0]})).rangeRoundBands([n,0]);var c=d3.svg.axis().scale(k).orient("left");var i=d3.select("#"+b.attr("id")).append("svg").attr("width",d+g.left+g.right).attr("height",n+g.top+g.bottom).append("g").attr("transform","translate("+g.left+","+g.top+")");i.append("g").attr("class","x axis").attr("transform","translate(0,"+n+")").call(e).append("text").attr("y",(g.bottom/1.7)).attr("x",(d/2)).attr("dy","1em").style("text-anchor","middle").text(f.xBottomLegend);i.selectAll(".bar0").data(h).enter().append("rect").attr("class","bar bar_default").attr("fill","bar_default").attr("x",0).attr("y",function(p){return k(p[0])+2}).attr("width",function(p){return l(p[1])}).attr("height",k.rangeBand()-4);var o=((k.rangeBand()/2)+3)+"px";i.selectAll(".bar0").data(h).enter().append("text").attr("x",function(p){return l(p[1])}).attr("y",function(p){return k(p[0])+2}).attr("dx",-3).attr("dy",o).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(p){return(p[1]<=0)?"":d3.round(p[1],2)});i.append("g").attr("class","y axis").call(c).append("text").attr("transform","rotate(-90)").attr("y",0-(g.right/1.7)).attr("x",0-(n/2)).attr("dy","1em").style("text-anchor","middle").text(f.yLeftLegend)};rightAnswerPerItem=function(c,g){var o=c.height();var k=c.width();var i=g.values.reverse();var h={top:15,right:60,bottom:40,left:60},f=k-h.left-h.right;var p=i.length*g.barHeight;c.height(p+h.top+h.bottom+"px");var l=g.participants;var n=d3.scale.linear().domain([0,l]).range([0,f]);var e=d3.scale.linear().domain([0,1]).range([0,f]);var b=d3.svg.axis().scale(e).orient("bottom").ticks(10,"%");var m=d3.scale.ordinal().domain(i.map(function(r){return r[0]})).rangeRoundBands([p,0]);var d=d3.svg.axis().scale(m).orient("left");var j=d3.select("#"+c.attr("id")).append("svg").attr("width",f+h.left+h.right).attr("height",p+h.top+h.bottom).append("g").attr("transform","translate("+h.left+","+h.top+")");j.append("g").attr("class","x axis").attr("transform","translate(0,"+p+")").call(b).append("text").attr("y",(h.bottom/1.7)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(g.xTopLegend);j.selectAll(".bar0").data(i).enter().append("rect").attr("class","bar bar_green").attr("fill","bar_green").attr("x",0).attr("y",function(r){return m(r[0])+2}).attr("width",function(r){return n(r[1])}).attr("height",m.rangeBand()-4);var q=((m.rangeBand()/2)+3)+"px";j.selectAll(".bar0").data(i).enter().append("text").attr("x",function(r){return n(r[1])}).attr("y",function(r){return m(r[0])+2}).attr("dx",-3).attr("dy",q).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(r){return(r[1]<=0)?"":r[1]});j.append("g").attr("class","y axis").call(d).append("text").attr("transform","rotate(-90)").attr("y",0-(h.right/1.7)).attr("x",0-(p/2)).attr("dy","1em").style("text-anchor","middle").text(g.yLeftLegend)};horizontalBarMultipleChoiceSurvey=function(c,g){var k=c.width();var i=g.values.reverse();var h={top:40,right:15,bottom:40,left:40};var p=i.length*g.barHeight;c.height(p+h.top+h.bottom+"px");var f=k-h.left-h.right;var l=g.participants;var n=l;console.log(g.colors);var o=d3.scale.linear().domain([0,n]).range([0,f]);var e=d3.scale.linear().domain([0,1]).range([0,f]);var b=d3.svg.axis().scale(e).orient("bottom").ticks(10,"%");var m=d3.scale.ordinal().domain(i.map(function(r){return r[0]})).rangeRoundBands([p,0]);var d=d3.svg.axis().scale(m).orient("left");var j=d3.select("#"+c.attr("id")).append("svg").attr("width",f+h.left+h.right).attr("height",p+h.top+h.bottom).append("g").attr("transform","translate("+h.left+","+h.top+")");j.append("g").attr("class","x axis").attr("transform","translate(0,"+p+")").call(b).append("text").attr("y",(h.bottom/1.7)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(g.xBottomLegend);j.append("g").attr("class","y axis").call(d).append("text").attr("transform","rotate(-90)").attr("y",0-h.left).attr("x",0-(p/2)).attr("dy","1em").style("text-anchor","middle").text(g.yLeftLegend);j.selectAll(".bar0").data(i).enter().append("rect").attr("class","bar bar_default").attr("fill","bar_default").attr("x",0).attr("y",function(r){return m(r[0])+2}).attr("width",function(r){return o(r[1])}).attr("height",m.rangeBand()-4);var q=((m.rangeBand()/2)+3)+"px";j.selectAll(".bar0").data(i).enter().append("text").attr("x",function(r){return o(r[1])}).attr("y",function(r){return m(r[0])+2}).attr("dx",-3).attr("dy",q).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(r){return(r[1]<=0)?"":r[1]})};horizontalBarMultipleChoice=function(c,g){var k=c.width();var i=g.values.reverse();var h={top:40,right:15,bottom:40,left:40};var p=i.length*g.barHeight;c.height(p+h.top+h.bottom+"px");var f=k-h.left-h.right;var l=g.participants;var n=l;var o=d3.scale.linear().domain([0,n]).range([0,f]);var e=d3.scale.linear().domain([0,1]).range([0,f]);var b=d3.svg.axis().scale(e).orient("bottom").ticks(10,"%");var m=d3.scale.ordinal().domain(i.map(function(r){return r[0]})).rangeRoundBands([p,0]);var d=d3.svg.axis().scale(m).orient("left");var j=d3.select("#"+c.attr("id")).append("svg").attr("width",f+h.left+h.right).attr("height",p+h.top+h.bottom).append("g").attr("transform","translate("+h.left+","+h.top+")");j.append("g").attr("class","x axis").attr("transform","translate(0,"+p+")").call(b).append("text").attr("y",(h.bottom/1.7)).attr("x",(f/2)).attr("dy","1em").style("text-anchor","middle").text(g.xBottomlegend);j.append("g").attr("class","y axis").call(d).append("text").attr("transform","rotate(-90)").attr("y",0-h.left).attr("x",0-(p/2)).attr("dy","1em").style("text-anchor","middle").text(g.yLeftLegend);j.selectAll(".bar0").data(i).enter().append("rect").attr("class","bar bar_green").attr("fill","bar_green").attr("x",0).attr("y",function(r){return m(r[0])+2}).attr("width",function(r){return o(r[1])}).attr("height",m.rangeBand()-4);var q=((m.rangeBand()/2)+3)+"px";j.selectAll(".bar0").data(i).enter().append("text").attr("x",function(r){return o(r[1])}).attr("y",function(r){return m(r[0])+2}).attr("dx",-3).attr("dy",q).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(r){return(r[1]<=0)?"":r[1]});j.selectAll(".bar1").data(i).enter().append("rect").attr("class","bar bar_red").attr("fill","bar_red").attr("x",function(r){return o(r[1])}).attr("y",function(r){return m(r[0])+2}).attr("width",function(r){return o(r[2])}).attr("height",m.rangeBand()-4);j.selectAll(".bar1").data(i).enter().append("text").attr("x",function(r){return o(r[1]+r[2])}).attr("y",function(r){return m(r[0])+2}).attr("dx",-3).attr("dy",q).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(r){return(r[2]<=0)?"":r[2]});j.selectAll(".bar2").data(i).enter().append("rect").attr("class","bar bar_grey").attr("fill","bar_grey").attr("x",function(r){return o(r[1]+r[2])}).attr("y",function(r){return m(r[0])+2}).attr("width",function(r){return o(r[3])}).attr("height",m.rangeBand()-4);j.selectAll(".bar2").data(i).enter().append("text").attr("x",function(r){return o(r[1]+r[2]+r[3])}).attr("y",function(r){return m(r[0])+2}).attr("dx",-3).attr("dy",q).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(r){return(r[3]<=0)?"":r[3]})};horizontalBarSingleChoice=function(c,h){var l=c.width();var j=h.values.reverse();var d=h.colors.reverse();var i={top:15,right:15,bottom:40,left:40};var q=j.length*h.barHeight;c.height(q+i.top+i.bottom+"px");var g=l-i.left-i.right;var m=h.participants;var o=m;var p=d3.scale.linear().domain([0,o]).range([0,g]);var f=d3.scale.linear().domain([0,1]).range([0,g]);var b=d3.svg.axis().scale(f).orient("bottom").ticks(10,"%");var n=d3.scale.ordinal().domain(j.map(function(s){return s[0]})).rangeRoundBands([q,0]);var e=d3.svg.axis().scale(n).orient("left");var k=d3.select("#"+c.attr("id")).append("svg").attr("width",g+i.left+i.right).attr("height",q+i.top+i.bottom).append("g").attr("transform","translate("+i.left+","+i.top+")");k.append("g").attr("class","x axis").attr("transform","translate(0,"+q+")").call(b).append("text").attr("y",(i.bottom/1.7)).attr("x",(g/2)).attr("dy","1em").style("text-anchor","middle").text(h.xBottomLegend);k.selectAll(".bar0").data(j).enter().append("rect").attr("class",function(t,s){if(d==null){return"bar bar0 bar_default"}else{if(d.length>s){return d[s]}else{return"bar bar0 bar_default"}}}).attr("fill","bar_green").attr("x",0).attr("y",function(s){return n(s[0])+2}).attr("width",function(s){return p(s[1])}).attr("height",n.rangeBand()-4);var r=((n.rangeBand()/2)+3)+"px";k.selectAll(".bar0").data(j).enter().append("text").attr("x",function(s){return p(s[1])}).attr("y",function(s){return n(s[0])+2}).attr("dx",-3).attr("dy",r).attr("text-anchor","end").attr("fill","rgb(48,48,48)").attr("stroke","none").text(function(s){return(s[1]<=0)?"":s[1]});k.append("g").attr("class","y axis").call(e).append("text").attr("transform","rotate(-90)").attr("y",0-i.left).attr("x",0-(q/2)).attr("dy","1em").style("text-anchor","middle").text(h.yLeftLegend)};histogramDuration=function(v,u){var c=v.height();var q=v.width();var f=u.values;var s=d3.min(f,function(x){return x});var z=d3.max(f,function(x){return x});var d="%M:%S";if(z<10){d+=":%L"}var i=new Date(2012,0,1,0,0),w=d3.format(",.f"),A=d3.time.format(d),l=function(x){return A(new Date(i.getTime()+(x*1000)))};var n={top:10,right:60,bottom:40,left:60},r=q-n.left-n.right,p=c-n.top-n.bottom;var m=d3.scale.linear().domain([0,z]).range([0,r]);var B=d3.layout.histogram().bins(m.ticks(20))(f);var h=d3.sum(B,function(x){return x.y});var k=d3.scale.linear().domain([0,d3.max(B,function(x){return x.y})]).range([p,0]);var g=d3.scale.linear().domain([0,d3.max(B,function(x){return x.y/h})]).range([p,0]);var j=d3.svg.axis().scale(m).orient("bottom").tickFormat(l);var b=d3.svg.axis().scale(k).orient("right").ticks(k.domain()[1]).tickSubdivide(0);var e=d3.svg.axis().scale(g).orient("left").ticks(10,"%");var o=d3.select("#"+v.attr("id")).append("svg").attr("width",r+n.left+n.right).attr("height",p+n.top+n.bottom).append("g").attr("transform","translate("+n.left+","+n.top+")");var t=o.selectAll(".bar").data(B).enter().append("g").attr("class","bar bar_default").attr("transform",function(x){return"translate("+m(x.x)+","+k(x.y)+")"}).append("rect").attr("x",2).attr("width",m(B[0].dx)-4).attr("height",function(x){return p-k(x.y)});o.append("g").attr("class","y axis").call(e).append("text").attr("transform","rotate(-90)").attr("y",0-n.left).attr("x",0-(p/2)).attr("dy","1em").style("text-anchor","middle").text(u.yLeftLegend);o.append("g").attr("class","x axis").attr("transform","translate(0,"+p+")").call(j).append("text").attr("y",(n.bottom/1.1)).attr("x",(r/2)).attr("dx","1em").style("text-anchor","middle").text(u.xBottomLegend);o.append("g").attr("class","y axis").attr("transform","translate("+r+",0)").call(b).append("text").attr("transform","rotate(90)").attr("y",0-(n.right)).attr("x",(p/2)).attr("dy","1em").style("text-anchor","middle").text(u.yRightLegend)};histogramScore=function(s,r){var c=s.height();var o=s.width();var d=r.values;var l={top:10,right:60,bottom:40,left:60},p=o-l.left-l.right,n=c-l.top-l.bottom;var f=r.cut;var k=d3.scale.linear().domain([0,3]).range([0,p]);var t=d3.layout.histogram().bins(k.ticks(20))(d);var h=d3.sum(t,function(u){return u.y});var j=d3.scale.linear().domain([0,d3.max(t,function(u){return u.y})]).range([n,0]);var g=d3.scale.linear().domain([0,d3.max(t,function(u){return u.y/h})]).range([n,0]);var i=d3.svg.axis().scale(k).orient("bottom").tickFormat(d3.format(".01f"));var b=d3.svg.axis().scale(j).orient("right").ticks(j.domain()[1]).tickSubdivide(0);var e=d3.svg.axis().scale(g).orient("left").ticks(10,"%");var m=d3.select("#"+s.attr("id")).append("svg").attr("width",p+l.left+l.right).attr("height",n+l.top+l.bottom).append("g").attr("transform","translate("+l.left+","+l.top+")");var q=m.selectAll(".bar").data(t).enter().append("g").attr("class",function(v,u){if(f==null){return"bar bar_default"}else{if(t[u].x<f){return"bar bar_red"}else{return"bar bar_green"}}}).attr("transform",function(u){return"translate("+k(u.x)+","+j(u.y)+")"}).append("rect").attr("x",2).attr("width",k(t[0].dx)-4).attr("height",function(u){return n-j(u.y)});m.append("g").attr("class","y axis").call(e).append("text").attr("transform","rotate(-90)").attr("y",0-l.left).attr("x",0-(n/2)).attr("dy","1em").style("text-anchor","middle").text(r.yLeftLegend);m.append("g").attr("class","x axis").attr("transform","translate(0,"+n+")").call(i).append("text").attr("y",(l.bottom/1.1)).attr("x",(p/2)).attr("dx","1em").style("text-anchor","middle").text(r.xBottomLegend);m.append("g").attr("class","y axis").attr("transform","translate("+p+",0)").call(b).append("text").attr("transform","rotate(90)").attr("y",0-(l.right)).attr("x",(n/2)).attr("dy","1em").style("text-anchor","middle").text(r.yRightLegend)}}(jQuery));
\ No newline at end of file
diff --git a/src/main/webapp/static/themes/openolat/all/modules/_qti.scss b/src/main/webapp/static/themes/openolat/all/modules/_qti.scss
index 6c1a5150808428b5f65d5c756d10e6e250e3e679..ac3b0d295a8044917534a85e3d1523f9fc0ac473 100644
--- a/src/main/webapp/static/themes/openolat/all/modules/_qti.scss
+++ b/src/main/webapp/static/themes/openolat/all/modules/_qti.scss
@@ -9,6 +9,7 @@ a.o_print_icon span { display:none; }
 }
 
 div.o_qti_statistics {
+
 	h4 { margin-top: 2em; }
 
 	ul { 
@@ -22,14 +23,10 @@ div.o_qti_statistics {
 			padding-left: 48px; 
 			margin-left: 0;
 			margin-bottom: 10px;	
-		
-			&.o_qti_statistics-survey-item 	{ padding-left: 27px; }
-			&.o_qti_statistics-ncorrect 	{ padding-left: 27px; background: url(../openolat/images/decorator/deco_error.png) no-repeat 10px 2px }
-			&.o_qti_statistics-correct 		{ padding-left: 27px; background: url(../openolat/images/decorator/deco_ok.png) no-repeat 10px 2px }
-			&.o_qti_statistics-kplus		{ padding-left: 27px; }
-			&.o_qti_statistics-kplus:before { content:'+'; }
-			&.o_qti_statistics-kminus 		{ padding-left: 27px; }
-			&.o_qti_statistics-kminus:before{ content:'-'; }
+			&.o_qti_statistics-ncorrect:before { font-size: 125%; content:'\2A2F\00A0\00A0'; }
+			&.o_qti_statistics-correct:before { font-size: 125%; content:'\2713\00A0\00A0'; }
+			&.o_qti_statistics-kplus:before { font-size: 125%; content:'\2713\00A0\2A2F\00A0\00A0'; }
+			&.o_qti_statistics-kminus:before { font-size: 125%; content:'\2A2F\00A0\2713\00A0\00A0'; }
 			img { vertical-align: top;}
 		}
 	}
@@ -45,13 +42,6 @@ div.o_qti_statistics {
 		td+td { width: 100px; }
 	}
 	
-	.o_qti_statistics_question {
-		background: #F5F5F5;
-		padding: 10px; 
-		margin: 1.5em 0; 
-		border:1px solid #ccc; 
-		@include o-border-radius(4px);
-	}
 	.o_qti_statistics_answer {
 		background: #F5F5F5;
 		padding: 1px 2px;
@@ -61,7 +51,7 @@ div.o_qti_statistics {
 	div.o_qti_statistics_legend {
 		padding: 10px;
 		margin: 0 auto;
-		width: 250px;
+		width: 270px;
 		height: 1.2em;
 		border: 1px solid #ccc;
 		@include o-border-radius(4px);
@@ -74,7 +64,7 @@ div.o_qti_statistics {
 				margin: 0 10px 0 0;
 				padding: 0;
 			
-				span { float:left; width:1.2em; height:1.2em; margin: 2px 5px; }
+				span { float:left; width:16px; height:16px; margin: 2px 5px; }
 				.bar_green { background-color:#9dd53a; }
 				.bar_red { background-color:#f85032; }
 				.bar_grey { background-color:lightgrey; }
@@ -82,6 +72,24 @@ div.o_qti_statistics {
 		}
 	}
 }
+/* Instead of media print because Firefox doesn't take some rules in account */
+.o_qti_print div.o_qti_statistics { width:680px; }
+
+@media print {
+	h3.o_iqself_icon:before { content: url(../openolat/images/le_resources/selftest.png); margin-right:6px; }
+	h3.o_iqsurv_icon:before { content: url(../openolat/images/le_resources/survey.png); margin-right:6px; }
+	h3.o_iqtest_icon:before { content: url(../openolat/images/le_resources/test.png); margin-right:6px; }
+
+	div.o_qti_statistics {
+		width:680px;
+
+		h3.o_mi_qtisc:before { content: url(../openolat/images/qti/scItem.png); margin-right:6px; }
+		h3.o_mi_qtimc:before { content: url(../openolat/images/qti/mcItem.png); margin-right:6px; }
+		h3.o_mi_qtikprim:before { content: url(../openolat/images/qti/kprimItem.png); margin-right:6px; }
+		h3.o_mi_qtifib:before { content: url(../openolat/images/qti/fibItem.png); margin-right:6px; }
+		h3.o_mi_qtiessay:before { content: url(../openolat/images/qti/essayItem.png); margin-right:6px; }
+	}
+}
 
 /* QTI legacy styles */
 	#o_qti_run {}
@@ -192,6 +200,4 @@ div.o_qti_statistics {
 		height: 100%;
 		border: none;
 		min-height: 60em;
-	}
-	
-	
\ No newline at end of file
+	}
\ No newline at end of file
diff --git a/src/test/java/org/olat/ims/qti/qpool/QTIImportProcessorTest.java b/src/test/java/org/olat/ims/qti/qpool/QTIImportProcessorTest.java
index 850d51dc4e4f513967ddc32496f38b7f2174d918..95352b76fadb48698477f3f0ac16fe3866d57ba6 100644
--- a/src/test/java/org/olat/ims/qti/qpool/QTIImportProcessorTest.java
+++ b/src/test/java/org/olat/ims/qti/qpool/QTIImportProcessorTest.java
@@ -30,6 +30,7 @@ import java.util.Locale;
 import junit.framework.Assert;
 
 import org.dom4j.Document;
+import org.dom4j.Element;
 import org.dom4j.Node;
 import org.jgroups.util.UUID;
 import org.junit.Before;
@@ -48,9 +49,9 @@ import org.olat.modules.qpool.QuestionItem;
 import org.olat.modules.qpool.QuestionItemFull;
 import org.olat.modules.qpool.QuestionStatus;
 import org.olat.modules.qpool.QuestionType;
-import org.olat.modules.qpool.manager.QPoolFileStorage;
 import org.olat.modules.qpool.manager.QEducationalContextDAO;
 import org.olat.modules.qpool.manager.QItemTypeDAO;
+import org.olat.modules.qpool.manager.QPoolFileStorage;
 import org.olat.modules.qpool.manager.QuestionItemDAO;
 import org.olat.modules.qpool.model.QEducationalContext;
 import org.olat.modules.qpool.model.QItemType;
@@ -380,6 +381,29 @@ public class QTIImportProcessorTest extends OlatTestCase {
 		Assert.assertEquals("QTITools", item.getEditor());	
 	}
 	
+	@Test
+	public void testImport_QTI12_film() throws IOException, URISyntaxException {
+		URL itemUrl = QTIImportProcessorTest.class.getResource("sc_with_film.xml");
+		Assert.assertNotNull(itemUrl);
+		File itemFile = new File(itemUrl.toURI());
+		
+		//get the document informations
+		QTIImportProcessor proc = new QTIImportProcessor(owner, Locale.ENGLISH, itemFile.getName(), itemFile, questionItemDao, qItemTypeDao, qEduContextDao, qpoolFileStorage);
+		List<QuestionItem> items = proc.process();
+		Assert.assertNotNull(items);
+		
+		DocInfos docInfos = proc.getDocInfos();
+		List<ItemInfos> itemInfos = proc.getItemList(docInfos);
+		Assert.assertNotNull(itemInfos);
+		Assert.assertEquals(1, itemInfos.size());
+		
+		Element el = itemInfos.get(0).getItemEl();
+		List<String> materials = proc.getMaterials(el);
+		Assert.assertNotNull(materials);
+		Assert.assertEquals(1, materials.size());
+		Assert.assertEquals("media/filmH264.mp4", materials.get(0));
+	}
+	
 	private boolean exists(QuestionItemFull itemFull, String path) {
 		String dir = itemFull.getDirectory();
 		VFSContainer itemContainer = qpoolFileStorage.getContainer(dir);
diff --git a/src/test/java/org/olat/ims/qti/qpool/sc_with_film.xml b/src/test/java/org/olat/ims/qti/qpool/sc_with_film.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3d699d19f6e648c2f33354f689833a7107067ac8
--- /dev/null
+++ b/src/test/java/org/olat/ims/qti/qpool/sc_with_film.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv1p2p1.dtd">
+
+<questestinterop>
+  <item ident="QTIEDIT:SCQ:1000001850" title="A film question">
+    <itemcontrol feedbackswitch="No" hintswitch="No" solutionswitch="No"/>
+    <presentation>
+      <material>
+        <mattext texttype="text/html"><![CDATA[Nouvelle question]]></mattext>
+      </material>
+      <response_lid ident="1000001852" rcardinality="Single" rtiming="No">
+        <render_choice shuffle="No" minnumber="1" maxnumber="1">
+          <flow_label class="List">
+            <response_label ident="1000001855" rshuffle="Yes">
+              <material>
+                <mattext texttype="text/html"><![CDATA[Nouvelle r&eacute;ponse<br /><span id="olatFlashMovieViewer0" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:352px; height:312px;"> <script src="/raw/_noversion_/movie/player.js"></script> <script defer="defer"> BPlayer.insertPlayer("media/filmH264.mp4","olatFlashMovieViewer0",352,312,0,0,"video",undefined,false,false,false); </script> </span>]]></mattext>
+              </material>
+            </response_label>
+          </flow_label>
+        </render_choice>
+      </response_lid>
+    </presentation>
+    <resprocessing>
+      <outcomes>
+        <decvar varname="SCORE" vartype="Decimal" defaultval="0" minvalue="0.0" maxvalue="1.0" cutvalue="1.0"/>
+      </outcomes>
+      <respcondition title="Mastery" continue="Yes">
+        <conditionvar>
+          <varequal respident="1000001852" case="Yes">1000001855</varequal>
+        </conditionvar>
+        <setvar varname="SCORE" action="Set">1.0</setvar>
+        <displayfeedback feedbacktype="Response" linkrefid="Mastery"/>
+      </respcondition>
+      <respcondition title="_olat_resp_feedback" continue="Yes">
+        <conditionvar>
+          <varequal respident="1000001852" case="Yes">1000001855</varequal>
+        </conditionvar>
+        <displayfeedback feedbacktype="Response" linkrefid="1000001855"/>
+      </respcondition>
+      <respcondition title="Fail" continue="Yes">
+        <conditionvar>
+          <other/>
+        </conditionvar>
+        <setvar varname="SCORE" action="Set">0</setvar>
+        <displayfeedback feedbacktype="Response" linkrefid="Fail"/>
+        <displayfeedback feedbacktype="Solution" linkrefid="Solution"/>
+        <displayfeedback feedbacktype="Hint" linkrefid="Hint"/>
+      </respcondition>
+    </resprocessing>
+    <itemfeedback ident="Hint" view="All">
+      <hint feedbackstyle="Incremental">
+        <hintmaterial>
+          <material>
+            <mattext><![CDATA[
+]]></mattext>
+          </material>
+        </hintmaterial>
+      </hint>
+    </itemfeedback>
+    <itemfeedback ident="Solution" view="All">
+      <solution>
+        <solutionmaterial>
+          <material>
+            <mattext><![CDATA[
+]]></mattext>
+          </material>
+        </solutionmaterial>
+      </solution>
+    </itemfeedback>
+  </item>
+</questestinterop>
diff --git a/src/test/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerLargeTest.java b/src/test/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerLargeTest.java
index 8b98d879977ed8648ad861b8023b81f2eb382bdb..f2aafcaefb9a67c334fc9d5f56d1f3f71451168c 100644
--- a/src/test/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerLargeTest.java
+++ b/src/test/java/org/olat/ims/qti/statistics/manager/QTIStatisticsManagerLargeTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNotNull;
 
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -93,6 +94,7 @@ public class QTIStatisticsManagerLargeTest extends OlatTestCase {
 	private static float durationQ3 = 0.0f;
 	private static float scoreQ1 = 0.0f;
 	private static float scoreQ2 = 0.0f;
+	private static int rightAnswersQ2 = 0;
 	private static int wrongAnswersQ2 = 0;
 	private static List<String> fibAnswers = new ArrayList<String>();
 
@@ -142,7 +144,9 @@ public class QTIStatisticsManagerLargeTest extends OlatTestCase {
 			test.setDuration(tempTestDuration);
 			test.setIdentity(JunitTestHelper.createAndPersistIdentityAsUser("test" + i));
 			test.setAssessmentID(111L);
-			test.setLastModified(new Date(200, 8, 23, (int) (Math.random() * 1000 % 60), (int) (Math.random() * 1000 % 60), (int) (Math.random() * 1000 % 60)));
+			Calendar cal = Calendar.getInstance();
+			cal.set(2013, 8, 23, (int) (Math.random() * 1000 % 60), (int) (Math.random() * 1000 % 60), (int) (Math.random() * 1000 % 60));
+			test.setLastModified(cal.getTime());
 			dbInstance.saveObject(test);
 			// insert values into result
 			for (int j = 0; j < numberOfQuestions; j++) {
@@ -180,6 +184,7 @@ public class QTIStatisticsManagerLargeTest extends OlatTestCase {
 					if (score < 3.0f) {
 						wrongAnswersQ2++;
 					} else {
+						rightAnswersQ2++;
 						maxScoreQ2++;
 					}
 				} else if (j == 2) {
@@ -292,7 +297,7 @@ public class QTIStatisticsManagerLargeTest extends OlatTestCase {
 		QTIStatisticSearchParams searchParams = new QTIStatisticSearchParams(olatResource, olatResourceDetail);
 		StatisticsItem stats  = qtim.getItemStatistics(itemObject.getItemIdent(), maxValue, searchParams);
 
-		double difficulty = scoreQ2 / maxValue;
+		double difficulty = rightAnswersQ2 / numberOfParticipants;
 		Assert.assertEquals(difficulty, stats.getDifficulty(), 0.1);
 		Assert.assertEquals(scoreQ2, stats.getAverageScore(), 0.1);
 		Assert.assertEquals(wrongAnswersQ2, stats.getNumOfIncorrectAnswers());
diff --git a/src/test/java/org/olat/restapi/CourseGroupMgmtTest.java b/src/test/java/org/olat/restapi/CourseGroupMgmtTest.java
index 55c6c64f8d5fef30ae61cfd446ed60ced178c5fa..cac54f091dabe98391069b271e28814fa77cd481 100644
--- a/src/test/java/org/olat/restapi/CourseGroupMgmtTest.java
+++ b/src/test/java/org/olat/restapi/CourseGroupMgmtTest.java
@@ -57,16 +57,15 @@ import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
-import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.core.util.resource.OresHelper;
+import org.olat.course.ICourse;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.manager.BusinessGroupRelationDAO;
 import org.olat.repository.RepositoryEntry;
-import org.olat.resource.OLATResource;
-import org.olat.resource.OLATResourceManager;
+import org.olat.repository.RepositoryManager;
+import org.olat.restapi.repository.course.CoursesWebService;
 import org.olat.restapi.support.vo.GroupVO;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatJerseyTestCase;
@@ -94,13 +93,15 @@ public class CourseGroupMgmtTest extends OlatJerseyTestCase {
 	private RestConnection conn;
 	
 	@Autowired
-	DB dbInstance;
+	private DB dbInstance;
 	@Autowired
 	private BusinessGroupService businessGroupService;
 	@Autowired
 	private BusinessGroupRelationDAO businessGroupRelationDao;
 	@Autowired
 	private BaseSecurity securityManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
 	
 	
 	/**
@@ -117,15 +118,11 @@ public class CourseGroupMgmtTest extends OlatJerseyTestCase {
 		id1 = JunitTestHelper.createAndPersistIdentityAsUser("rest-c-g-1");
 		id2 = JunitTestHelper.createAndPersistIdentityAsUser("rest-c-g-2");
 		JunitTestHelper.createAndPersistIdentityAsUser("rest-c-g-3");
-		
-		OLATResourceManager rm = OLATResourceManager.getInstance();
-		// create course and persist as OLATResourceImpl
-		OLATResourceable resourceable = OresHelper.createOLATResourceableInstance("junitcourse",System.currentTimeMillis());
-		OLATResource r =  rm.createOLATResourceInstance(resourceable);
-		rm.saveOLATResource(r);
-		courseRepoEntry =  JunitTestHelper.createAndPersistRepositoryEntry(r, false);
-		dbInstance.saveObject(courseRepoEntry);
+		Identity auth = JunitTestHelper.createAndPersistIdentityAsUser("rest-course-grp-one");
+		ICourse course = CoursesWebService.createEmptyCourse(auth, "course for groups", "course with groups for REST API testing", null);
 		dbInstance.commitAndCloseSession();
+		courseRepoEntry = repositoryManager.lookupRepositoryEntry(course, true);
+
 		
     // create groups without waiting list
     g1 = businessGroupService.createBusinessGroup(null, "rest-g1", null, 0, 10, false, false, courseRepoEntry);