diff --git a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
index a749387a12db3ee72a6a1bc75954dc25a82cea9b..1b9c05e1026c4707c2c02248ba2cb115b4696bd6 100644
--- a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
+++ b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
@@ -200,14 +200,8 @@ public class GroupDAO {
 	}
 	
 	public List<String> getPermissions(IdentityRef identity, OLATResource resource) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select grant.permission from bgrant as grant")
-		  .append(" inner join grant.group as baseGroup")
-		  .append(" inner join baseGroup.members as membership")
-		  .append(" where membership.identity.key=:identityKey and grant.resource.key=:resourceKey")
-		  .append("   and membership.role=grant.role");
 		return dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), String.class)
+				.createNamedQuery("grantedPermissionByIdentityAndResource", String.class)
 				.setParameter("identityKey", identity.getKey())
 				.setParameter("resourceKey", resource.getKey())
 				.getResultList();
diff --git a/src/main/java/org/olat/basesecurity/model/GrantImpl.java b/src/main/java/org/olat/basesecurity/model/GrantImpl.java
index f760a9ee7b273fb6504e4e32636df799012d1a2a..af1807d90908748167bcaba603642c82fb276c4f 100644
--- a/src/main/java/org/olat/basesecurity/model/GrantImpl.java
+++ b/src/main/java/org/olat/basesecurity/model/GrantImpl.java
@@ -28,6 +28,8 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
@@ -47,6 +49,9 @@ import org.olat.resource.OLATResourceImpl;
  */
 @Entity(name="bgrant")
 @Table(name="o_bs_grant")
+@NamedQueries({
+	@NamedQuery(name="grantedPermissionByIdentityAndResource", query="select grant.permission from bgrant as grant inner join grant.group as baseGroup inner join baseGroup.members as membership where membership.identity.key=:identityKey and grant.resource.key=:resourceKey and membership.role=grant.role")
+})
 public class GrantImpl implements Grant, Persistable {
 
 	private static final long serialVersionUID = -9157469088175205845L;
diff --git a/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java b/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java
index ef7615defaec380506abea3d7393f0d97bb81286..1020ab6b3886db7863119d3d0fd34d1a493434af 100644
--- a/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java
+++ b/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java
@@ -105,11 +105,11 @@ public class ResumeController extends FormBasicController implements SupportsAft
 		if(isREST(ureq)) {
 			//do nothing
 		} else if(!historyModule.isResumeEnabled()) {
-			String bc = getLandingBC(ureq);
-			redirect(ureq, bc);
+			String url = toUrl(getLandingBC(ureq));
+			redirect(ureq, url);
 		} else if(usess.getRoles().isGuestOnly()) {
-			String bc = getLandingBC(ureq);
-			redirect(ureq, bc);
+			String url = toUrl(getLandingBC(ureq));
+			redirect(ureq, url);
 		} else {
 			Preferences prefs =  usess.getGuiPreferences();
 			String resumePrefs = (String)prefs.get(WindowManager.class, "resume-prefs");
@@ -118,8 +118,8 @@ public class ResumeController extends FormBasicController implements SupportsAft
 			}
 
 			if("none".equals(resumePrefs)) {
-				String bc = getLandingBC(ureq);
-				redirect(ureq, bc);
+				String url = toUrl(getLandingBC(ureq));
+				redirect(ureq, url);
 			} else if ("auto".equals(resumePrefs)) {
 				HistoryPoint historyEntry = HistoryManager.getInstance().readHistoryPoint(ureq.getIdentity());
 				if(historyEntry != null && StringHelper.containsNonWhitespace(historyEntry.getBusinessPath())) {
@@ -127,8 +127,8 @@ public class ResumeController extends FormBasicController implements SupportsAft
 					String bc = BusinessControlFactory.getInstance().getAsRestPart(cloneCes, true);
 					redirect(ureq, bc);
 				} else {
-					String bc = getLandingBC(ureq);
-					redirect(ureq, bc);
+					String url = toUrl(getLandingBC(ureq));
+					redirect(ureq, url);
 				}
 			} else if ("ondemand".equals(resumePrefs)) {
 				HistoryPoint historyEntry = historyManager.readHistoryPoint(ureq.getIdentity());
@@ -142,8 +142,8 @@ public class ResumeController extends FormBasicController implements SupportsAft
 						landingButton.setVisible(false);
 					}
 				} else {
-					String bc = getLandingBC(ureq);
-					redirect(ureq, bc);
+					String url = toUrl(getLandingBC(ureq));
+					redirect(ureq, url);
 				}
 			}
 		}
@@ -212,10 +212,13 @@ public class ResumeController extends FormBasicController implements SupportsAft
 		if(StringHelper.containsNonWhitespace(landingPage)) {
 			String path = Rules.cleanUpLandingPath(landingPage);
 			if(StringHelper.containsNonWhitespace(path)) {
-				return BusinessControlFactory.getInstance().formatFromURI(path);
+				landingPage = BusinessControlFactory.getInstance().formatFromURI(path);
 			}
 		}
-		return lpModule.getRules().match(ureq.getUserSession());
+		if(!StringHelper.containsNonWhitespace(landingPage)) {
+			landingPage = lpModule.getRules().match(ureq.getUserSession());
+		}
+		return landingPage;
 	}
 	
 	private void launch(UserRequest ureq, String businessPath) {
@@ -229,10 +232,24 @@ public class ResumeController extends FormBasicController implements SupportsAft
 		}
 	}
 	
-	private void redirect(UserRequest ureq, String businessPath) {
-		if(StringHelper.containsNonWhitespace(businessPath)) {
+	private String toUrl(String businessPath) {
+		String url = businessPath;
+		if(StringHelper.containsNonWhitespace(url)) {
+			if(url.startsWith("[")) {
+				List<ContextEntry> ces = BusinessControlFactory.getInstance().createCEListFromString(url);
+				url = BusinessControlFactory.getInstance().getAsRestPart(ces, true);
+			}
+			if(url.startsWith("/")) {
+				url = url.substring(1, url.length());
+			}
+		}
+		return url;
+	}
+	
+	private void redirect(UserRequest ureq, String url) {
+		if(StringHelper.containsNonWhitespace(url)) {
 			try {
-				ureq.getUserSession().putEntry("redirect-bc", businessPath);
+				ureq.getUserSession().putEntry("redirect-bc", url);
 			} catch (Exception e) {
 				logError("Error while resuming", e);
 			}
diff --git a/src/main/java/org/olat/core/configuration/AbstractSpringModule.java b/src/main/java/org/olat/core/configuration/AbstractSpringModule.java
index 9bae06e68190ef5028c99a2a90334284957e9eda..7e1ec8bb8e4d5219ea381006cb7537c5f0f7e798 100644
--- a/src/main/java/org/olat/core/configuration/AbstractSpringModule.java
+++ b/src/main/java/org/olat/core/configuration/AbstractSpringModule.java
@@ -19,7 +19,10 @@
  */
 package org.olat.core.configuration;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.olat.core.gui.control.Event;
 import org.olat.core.logging.OLog;
@@ -50,22 +53,48 @@ public abstract class AbstractSpringModule implements GenericEventListener, Init
 	
 	private static final OLog log = Tracing.createLoggerFor(AbstractSpringModule.class);
 	
+	@Value("${userdata.dir}")
+	private String userDataDirectory;
+	
 	private final PersistedProperties moduleConfigProperties;
 	
+	public static final Map<Class<?>,AtomicInteger> starts = new HashMap<Class<?>,AtomicInteger>();
+
 	public AbstractSpringModule(CoordinatorManager coordinatorManager) {
 		moduleConfigProperties = new PersistedProperties(coordinatorManager, this);
+		if(!starts.containsKey(this.getClass())) {
+			starts.put(this.getClass(), new AtomicInteger(1));
+		} else {
+			starts.get(this.getClass()).incrementAndGet();
+		}
 	}
 	
 	public AbstractSpringModule(CoordinatorManager coordinatorManager, boolean secured) {
 		moduleConfigProperties = new PersistedProperties(coordinatorManager, this, secured);
+		if(!starts.containsKey(this.getClass())) {
+			starts.put(this.getClass(), new AtomicInteger(1));
+		} else {
+			starts.get(this.getClass()).incrementAndGet();
+		}
 	}
 	
 	public AbstractSpringModule(CoordinatorManager coordinatorManager, String path, boolean secured) {
 		moduleConfigProperties = new PersistedProperties(coordinatorManager, this, path, secured);
+		if(!starts.containsKey(this.getClass())) {
+			starts.put(this.getClass(), new AtomicInteger(1));
+		} else {
+			starts.get(this.getClass()).incrementAndGet();
+		}
 	}
 	
-	@Value("${userdata.dir}")
-	private String userDataDirectory;
+	public static void printStats() {
+		OLog logger = Tracing.createLoggerFor(AbstractSpringModule.class);
+		for(Map.Entry<Class<?>, AtomicInteger> entry:starts.entrySet()) {
+			if(entry.getValue().get() > 1) {
+				logger.info(entry.getValue().get() + " :: " + entry.getKey());
+			}
+		}
+	}
 
 	@Override
 	public void afterPropertiesSet()  {
diff --git a/src/main/java/org/olat/core/servlets/OpenOLATServlet.java b/src/main/java/org/olat/core/servlets/OpenOLATServlet.java
index eee9b0e2b9acc96f67ab6f9d145b692bd57c03de..519eef9e4fe764483ed63813d841234d4d261887 100644
--- a/src/main/java/org/olat/core/servlets/OpenOLATServlet.java
+++ b/src/main/java/org/olat/core/servlets/OpenOLATServlet.java
@@ -37,6 +37,7 @@ import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.commons.services.webdav.WebDAVDispatcher;
 import org.olat.core.configuration.AbstractOLATModule;
+import org.olat.core.configuration.AbstractSpringModule;
 import org.olat.core.configuration.PreWarm;
 import org.olat.core.dispatcher.Dispatcher;
 import org.olat.core.dispatcher.DispatcherModule;
@@ -128,6 +129,7 @@ public class OpenOLATServlet extends HttpServlet {
 		ExtManager.getInstance().getExtensions();
 		
 		AbstractOLATModule.printStats();
+		AbstractSpringModule.printStats();
 		preWarm();
 	}
 	
diff --git a/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManager.java b/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManager.java
index d66a926ffeea30b9d68dd0a430544f75ea25baab..05ba4cb693314b3405588cd5cd23de3ca8f311fe 100644
--- a/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManager.java
+++ b/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManager.java
@@ -42,7 +42,7 @@ public interface UserCourseInformationsManager {
 	public List<UserCourseInformations> getUserCourseInformations(List<Long> keys);
 	
 	
-	public void updateUserCourseInformations(Long courseResId, Identity identity, boolean strict);
+	public void updateUserCourseInformations(OLATResource courseResource, Identity identity, boolean strict);
 	
 	public Date getInitialLaunchDate(Long courseResourceId, IdentityRef identity);
 	
diff --git a/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManagerImpl.java
index 0cdb16e5cbbcdab18e7c95ada7d3a352a1af4836..e532011d5911c9ee8889366d0f68f16593be1f06 100644
--- a/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/UserCourseInformationsManagerImpl.java
@@ -44,7 +44,6 @@ import org.olat.course.assessment.UserCourseInformations;
 import org.olat.course.assessment.model.UserCourseInfosImpl;
 import org.olat.repository.RepositoryEntry;
 import org.olat.resource.OLATResource;
-import org.olat.resource.OLATResourceManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -61,8 +60,6 @@ public class UserCourseInformationsManagerImpl implements UserCourseInformations
 
 	@Autowired
 	private DB dbInstance;
-	@Autowired
-	private OLATResourceManager resourceManager;
 
 	@Override
 	public UserCourseInfosImpl getUserCourseInformations(Long courseResourceId, IdentityRef identity) {
@@ -140,17 +137,16 @@ public class UserCourseInformationsManagerImpl implements UserCourseInformations
 	 * @return
 	 */
 	@Override
-	public void updateUserCourseInformations(final Long courseResourceableId, final Identity identity, final boolean strict) {
-		UltraLightInfos ulInfos = getUserCourseInformationsKey(courseResourceableId, identity);
+	public void updateUserCourseInformations(final OLATResource courseResource, final Identity identity, final boolean strict) {
+		UltraLightInfos ulInfos = getUserCourseInformationsKey(courseResource, identity);
 		if(ulInfos == null) {
 			OLATResourceable lockRes = OresHelper.createOLATResourceableInstance("CourseLaunchDate::Identity", identity.getKey());
 			CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(lockRes, new SyncerExecutor(){
 				@Override
 				public void execute() {
 					try {
-						UltraLightInfos reloadedUlInfos = getUserCourseInformationsKey(courseResourceableId, identity);
+						UltraLightInfos reloadedUlInfos = getUserCourseInformationsKey(courseResource, identity);
 						if(reloadedUlInfos == null) {
-							OLATResource courseResource = resourceManager.findResourceable(courseResourceableId, "CourseModule");
 							UserCourseInfosImpl infos = new UserCourseInfosImpl();
 							infos.setIdentity(identity);
 							infos.setCreationDate(new Date());
@@ -204,18 +200,18 @@ public class UserCourseInformationsManagerImpl implements UserCourseInformations
 		}
 	}
 	
-	private UltraLightInfos getUserCourseInformationsKey(Long courseResourceId, Identity identity) {
+	private UltraLightInfos getUserCourseInformationsKey(OLATResource courseResource, Identity identity) {
 		try {
 			StringBuilder sb = new StringBuilder();
 			sb.append("select infos.key, infos.lastModified from ").append(UserCourseInfosImpl.class.getName()).append(" as infos ")
 			  .append(" inner join infos.resource as resource")
 			  .append(" inner join infos.identity as identity")
-			  .append(" where identity.key=:identityKey and resource.resId=:resId and resource.resName='CourseModule'");
+			  .append(" where identity.key=:identityKey and resource.key=:resourceKey");
 
 			List<Object[]> infoList = dbInstance.getCurrentEntityManager()
 					.createQuery(sb.toString(), Object[].class)
 					.setParameter("identityKey", identity.getKey())
-					.setParameter("resId", courseResourceId)
+					.setParameter("resourceKey", courseResource.getKey())
 					.getResultList();
 
 			if(infoList.isEmpty()) {
diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java
index a58e5600ce0ae139199201a355cf4b707e69689c..1317c6d57f6d74a47e3de050c38ef4f01a48afc6 100644
--- a/src/main/java/org/olat/course/run/RunMainController.java
+++ b/src/main/java/org/olat/course/run/RunMainController.java
@@ -134,6 +134,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 	private Link nextLink, previousLink;
 	private GlossaryMarkupItemController glossaryMarkerCtr;
 	
+	
 	/**
 	 * Constructor for the run main controller
 	 * 
@@ -330,7 +331,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 	
 	private void setLaunchDates() {
 		UserCourseInformationsManager userCourseInfoMgr = CoreSpringFactory.getImpl(UserCourseInformationsManager.class);
-		userCourseInfoMgr.updateUserCourseInformations(uce.getCourseEnvironment().getCourseResourceableId(), getIdentity(), false);
+		userCourseInfoMgr.updateUserCourseInformations(uce.getCourseEnvironment().getCourseGroupManager().getCourseResource(), getIdentity(), false);
 	}
 	
 	private CourseNode updateAfterChanges(CourseNode courseNode) {
diff --git a/src/main/java/org/olat/repository/RepositoryEntry.java b/src/main/java/org/olat/repository/RepositoryEntry.java
index 26c6549909ff9c76e21f70ae6f0a2c921e86c9ad..5da47833b1a621205b7b31b67ebf9523f845e548 100644
--- a/src/main/java/org/olat/repository/RepositoryEntry.java
+++ b/src/main/java/org/olat/repository/RepositoryEntry.java
@@ -36,6 +36,8 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.Temporal;
@@ -64,6 +66,11 @@ import org.olat.resource.OLATResourceImpl;
  */
 @Entity(name="repositoryentry")
 @Table(name="o_repositoryentry")
+@NamedQueries({
+	@NamedQuery(name="getRepositoryEntryRoleAndDefaults", query="select membership.role, relGroup.defaultGroup from repositoryentry as v inner join v.groups as relGroup inner join relGroup.group as baseGroup inner join baseGroup.members as membership where v.key=:repoKey and membership.identity.key=:identityKey"),
+	@NamedQuery(name="filterRepositoryEntryMembership", query="select v.key, membership.identity.key from repositoryentry as v inner join v.groups as relGroup inner join relGroup.group as baseGroup inner join baseGroup.members as membership on membership.role in ('owner','coach','.participant') where membership.identity.key=:identityKey and v.key in (:repositoryEntryKey)"),
+	@NamedQuery(name="loadRepositoryEntryByKey", query="select v from repositoryentry as v  inner join fetch v.olatResource as ores inner join fetch v.statistics as statistics left join fetch v.lifecycle as lifecycle where v.key = :repoKey")
+})
 public class RepositoryEntry implements CreateInfo, Persistable , RepositoryEntryRef, ModifiedInfo, OLATResourceable {
 
 	private static final long serialVersionUID = 5319576295875289054L;
diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index 3fac8d2f438fd3a798ef93ca890fa0e90e5e4cc7..97b8c1797bc52e77aaa12a8371b7cc1ed7238ed0 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -230,15 +230,8 @@ public class RepositoryManager extends BasicManager {
 		if(strict) {
 			return lookupRepositoryEntry(key);
 		}
-		StringBuilder query = new StringBuilder();
-		query.append("select v from ").append(RepositoryEntry.class.getName()).append(" as v ")
-		     .append(" inner join fetch v.olatResource as ores")
-			 .append(" inner join fetch v.statistics as statistics")
-		     .append(" left join fetch v.lifecycle as lifecycle")
-		     .append(" where v.key = :repoKey");
-		
 		List<RepositoryEntry> entries = dbInstance.getCurrentEntityManager()
-				.createQuery(query.toString(), RepositoryEntry.class)
+				.createNamedQuery("loadRepositoryEntryByKey", RepositoryEntry.class)
 				.setParameter("repoKey", key)
 				//.setHint("org.hibernate.cacheable", Boolean.TRUE)
 				.getResultList();
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
index ece81e4c76fc0d8e6d91adf54ee57ab4986e8bff..9f5230282b91d02c3ecec543b54f635047c759db 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
@@ -88,15 +88,8 @@ public class RepositoryEntryRelationDAO {
 	 * @return Return an array with the role and true if the relation is the default one.
 	 */
 	public List<Object[]> getRoleAndDefaults(IdentityRef identity, RepositoryEntryRef re) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("select membership.role, relGroup.defaultGroup from ").append(RepositoryEntry.class.getName()).append(" as v")
-		  .append(" inner join v.groups as relGroup")
-		  .append(" inner join relGroup.group as baseGroup")
-		  .append(" inner join baseGroup.members as membership")
-		  .append(" where v.key=:repoKey and membership.identity.key=:identityKey");
-
 		return dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Object[].class)
+				.createNamedQuery("getRepositoryEntryRoleAndDefaults", Object[].class)
 				.setParameter("identityKey", identity.getKey())
 				.setParameter("repoKey", re.getKey())
 				.getResultList();
@@ -196,17 +189,9 @@ public class RepositoryEntryRelationDAO {
 	 */
 	public void filterMembership(IdentityRef identity, List<Long> entries) {
 		if(entries == null || entries.isEmpty()) return;
-		
-		StringBuilder sb = new StringBuilder();
-		sb.append("select v.key, membership.identity.key ")
-		  .append(" from ").append(RepositoryEntry.class.getName()).append(" as v ")
-		  .append(" inner join v.groups as relGroup")
-		  .append(" inner join relGroup.group as baseGroup")
-		  .append(" inner join baseGroup.members as membership on membership.role in ")
-		  .append("   ('").append(GroupRoles.owner.name()).append("','").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("')")
-		  .append(" where membership.identity.key=:identityKey and v.key in (:repositoryEntryKey)");
 
-		List<Object[]> membershipList = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Object[].class)
+		List<Object[]> membershipList = dbInstance.getCurrentEntityManager()
+				.createNamedQuery("filterRepositoryEntryMembership", Object[].class)
 				.setParameter("identityKey", identity.getKey())
 				.setParameter("repositoryEntryKey", entries)
 				.getResultList();
diff --git a/src/main/java/org/olat/repository/ui/catalog/CatalogEntryEditController.java b/src/main/java/org/olat/repository/ui/catalog/CatalogEntryEditController.java
index d1dc8431925643d62645dfc5638ec1e9a50a1869..e7789261c04e3b9afd51f106a40d7ed859c405b5 100644
--- a/src/main/java/org/olat/repository/ui/catalog/CatalogEntryEditController.java
+++ b/src/main/java/org/olat/repository/ui/catalog/CatalogEntryEditController.java
@@ -225,9 +225,14 @@ public class CatalogEntryEditController extends FormBasicController {
 			VFSContainer tmpHome = new LocalFolderImpl(new File(WebappHelper.getTmpDir()));
 			VFSContainer container = tmpHome.createChildContainer(UUID.randomUUID().toString());
 			VFSLeaf newFile = fileUpload.moveUploadFileTo(container, true);//give it it's real name and extension
-			boolean ok = catalogManager.setImage(newFile, catalogEntry);
-			if (!ok) {
-				showError("Failed");
+			if(newFile != null) {
+				boolean ok = catalogManager.setImage(newFile, catalogEntry);
+				if (!ok) {
+					showError("error.download.image");
+				}
+			} else {
+				logError("Cannot move and or crop: " + fileUpload.getUploadFileName() + " ( " + fileUpload.getUploadMimeType() + " )", null);
+				showError("error.download.image");
 			}
 		}
 		
diff --git a/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_de.properties
index 97a2564a1c33e24799f8c2ce9ae0748420629148..0ade05d882e6ab0efb30bfde36509a37e5382f44 100644
--- a/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_de.properties
@@ -30,6 +30,7 @@ dialog.modal.subtree.delete.text=Wollen Sie die Kategorie "{0}" und alle damit v
 entry.category=Name
 entry.description=Beschreibung
 entry.leaf=Lernressource
+error.download.image=Das Bild konnte nicht benutzt werden.
 filtered.first=Sie sind nicht eingeloggt. Die folgende Liste ist daher nicht vollst\u00E4ndig (
 filtered.second=).
 move=Verschieben
diff --git a/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_en.properties
index c01c9902b7fd5412bcfd9668e5285984826ef58a..768fbe69f8cca5d1841a14aaf90e537fbb4f1cea 100644
--- a/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/repository/ui/catalog/_i18n/LocalStrings_en.properties
@@ -27,6 +27,7 @@ entry.category=Name
 entry.description=Description
 entry.leaf=Learning resource
 entry.pic=Image
+error.download.image=The image cannot be used.
 filtered.first=You are not logged in. The following list is therefore incomplete (
 filtered.second=).
 list=List
diff --git a/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java b/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java
index 0505275d38538fe477ea8873e532ec7d3f0f9ac8..afb33a3a3fc799b9b2bef5de24485605fb281b4d 100644
--- a/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java
+++ b/src/test/java/org/olat/course/assessment/manager/UserCourseInformationsManagerTest.java
@@ -36,6 +36,7 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.UserCourseInformations;
+import org.olat.resource.OLATResource;
 import org.olat.restapi.repository.course.CoursesWebService;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
@@ -62,7 +63,8 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		ICourse course = CoursesWebService.createEmptyCourse(user, "course-launch-dates", "course long name", null);
 		dbInstance.commitAndCloseSession();
 		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user, true);
+		OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user, true);
 		dbInstance.commitAndCloseSession();
 		
 		UserCourseInformations infos = userCourseInformationsManager.getUserCourseInformations(course.getResourceableId(), user);
@@ -83,11 +85,12 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		Identity user = JunitTestHelper.createAndPersistIdentityAsUser("user-launch-1-" + UUID.randomUUID().toString());
 		ICourse course = CoursesWebService.createEmptyCourse(user, "course-launch-dates", "course long name", null);
 		dbInstance.commitAndCloseSession();
-		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user, true);
+
+		OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user, true);
 		dbInstance.commitAndCloseSession();
 		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user, true);
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user, true);
 		dbInstance.commitAndCloseSession();
 		
 		UserCourseInformations infos = userCourseInformationsManager.getUserCourseInformations(course.getResourceableId(), user);
@@ -101,7 +104,8 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		ICourse course = CoursesWebService.createEmptyCourse(user, "course-launch-dates", "course long name", null);
 		dbInstance.commitAndCloseSession();
 		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user, true);
+		OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user, true);
 		dbInstance.commitAndCloseSession();
 		
 		Date launchDate = userCourseInformationsManager.getRecentLaunchDate(course.getResourceableId(), user);
@@ -114,7 +118,8 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		ICourse course = CoursesWebService.createEmptyCourse(user, "course-launch-dates", "course long name", null);
 		dbInstance.commitAndCloseSession();
 		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user, true);
+		OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user, true);
 		dbInstance.commitAndCloseSession();
 		
 		Date launchDate = userCourseInformationsManager.getInitialLaunchDate(course.getResourceableId(), user);
@@ -128,8 +133,9 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		ICourse course = CoursesWebService.createEmptyCourse(user1, "course-launch-dates", "course long name", null);
 		dbInstance.commitAndCloseSession();
 		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user1, true);
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user2, true);
+		OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user1, true);
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user2, true);
 		dbInstance.commitAndCloseSession();
 		
 		List<Identity> users = new ArrayList<Identity>();
@@ -153,9 +159,10 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		ICourse course = CoursesWebService.createEmptyCourse(user1, "course-launch-dates", "course long name", null);
 		dbInstance.commitAndCloseSession();
 		
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user1, true);
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user2, true);
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user3, true);
+		OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user1, true);
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user2, true);
+		userCourseInformationsManager.updateUserCourseInformations(courseResource, user3, true);
 		dbInstance.commitAndCloseSession();
 		
 		//get all launch dates
@@ -182,7 +189,8 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		for(int i=0; i<10; i++) {
-			userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), user, true);
+			OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+			userCourseInformationsManager.updateUserCourseInformations(courseResource, user, true);
 		}
 		dbInstance.commitAndCloseSession();
 		
@@ -208,7 +216,8 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		CountDownLatch latch = new CountDownLatch(numThreads);
 		UpdateThread[] threads = new UpdateThread[numThreads];
 		for(int i=0; i<threads.length;i++) {
-			threads[i] = new UpdateThread(user, course.getResourceableId(), userCourseInformationsManager, latch, dbInstance);
+			OLATResource courseResource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+			threads[i] = new UpdateThread(user, courseResource, userCourseInformationsManager, latch, dbInstance);
 		}
 
 		for(int i=0; i<threads.length;i++) {
@@ -262,15 +271,15 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 		private final CountDownLatch latch;
 		private final UserCourseInformationsManager uciManager;
 		
-		private final Long courseResourceableId;
+		private final OLATResource courseResource;
 		private final Identity user;
 		
 		private int errors = 0;
 		
-		public UpdateThread(Identity user, Long courseResourceableId,
+		public UpdateThread(Identity user, OLATResource courseResource,
 				UserCourseInformationsManager uciManager, CountDownLatch latch, DB db) {
 			this.user = user;
-			this.courseResourceableId = courseResourceableId;
+			this.courseResource = courseResource;
 			this.uciManager = uciManager;
 			this.latch = latch;
 			this.db = db;
@@ -285,9 +294,9 @@ public class UserCourseInformationsManagerTest extends OlatTestCase {
 			try {
 				Thread.sleep(10);
 				for(int i=0; i<25;i++) {
-					uciManager.updateUserCourseInformations(courseResourceableId, user, true);
-					uciManager.getUserCourseInformations(courseResourceableId, user);
-					uciManager.updateUserCourseInformations(courseResourceableId, user, true);
+					uciManager.updateUserCourseInformations(courseResource, user, true);
+					uciManager.getUserCourseInformations(courseResource.getResourceableId(), user);
+					uciManager.updateUserCourseInformations(courseResource, user, true);
 					db.commitAndCloseSession();
 				}
 			} catch (Exception e) {
diff --git a/src/test/java/org/olat/course/nodes/gta/rule/GTAReminderRuleTest.java b/src/test/java/org/olat/course/nodes/gta/rule/GTAReminderRuleTest.java
index f482bfe454ad6afdd713ed23b7d0140c391855c9..fb9c7ed19f3fd6e060088e8a2eb92bd06e102004 100644
--- a/src/test/java/org/olat/course/nodes/gta/rule/GTAReminderRuleTest.java
+++ b/src/test/java/org/olat/course/nodes/gta/rule/GTAReminderRuleTest.java
@@ -318,9 +318,9 @@ public class GTAReminderRuleTest extends OlatTestCase {
 		
 		//create user course infos
 		Long courseResId = course.getCourseEnvironment().getCourseResourceableId();
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id1, true);
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id2, true);
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id3, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id3, true);
 		dbInstance.commit();
 		
 		//fake the date
diff --git a/src/test/java/org/olat/modules/coach/manager/CoachingDAOTest.java b/src/test/java/org/olat/modules/coach/manager/CoachingDAOTest.java
index 19ffcb76a719db4e13778ad3db5cba09669091bb..d393d69d0b3a3b96706883c56c4ccca698f4b5d3 100644
--- a/src/test/java/org/olat/modules/coach/manager/CoachingDAOTest.java
+++ b/src/test/java/org/olat/modules/coach/manager/CoachingDAOTest.java
@@ -104,7 +104,7 @@ public class CoachingDAOTest extends OlatTestCase {
 
 		dbInstance.commitAndCloseSession();
 		
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource().getResourceableId());			
+		ICourse course = CourseFactory.loadCourse(re);			
 		boolean enabled = course.getCourseEnvironment().getCourseConfig().isEfficencyStatementEnabled();
 		Assert.assertTrue(enabled);
 		
@@ -134,7 +134,7 @@ public class CoachingDAOTest extends OlatTestCase {
 	    effManager.createUserEfficiencyStatement(new Date(), 2.0f, false, participant2, re.getOlatResource());
 		dbInstance.commitAndCloseSession();
 		//make user infos
-		userCourseInformationsManager.updateUserCourseInformations(course.getResourceableId(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(course.getCourseEnvironment().getCourseGroupManager().getCourseResource(), participant1, true);
 		dbInstance.commitAndCloseSession();
 		
 		
@@ -243,11 +243,11 @@ public class CoachingDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//make user infos
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant2, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant2, true);
 		dbInstance.commitAndCloseSession();
 		
 		//check course
@@ -366,15 +366,15 @@ public class CoachingDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//make user infos
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant2, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant2, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant3, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant4, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant5, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant6, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant3, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant4, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant5, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant6, true);
 		dbInstance.commitAndCloseSession();
 		
 		//owner can see participant 1,2,3 and 4
@@ -538,20 +538,20 @@ public class CoachingDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//make user infos
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant11, true);
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participantG1, true);
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participantG11, true);
-		
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant2, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant21, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participantG2, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participantG21, true);
-		
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant3, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant31, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participantG3, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participantG31, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant11, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participantG1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participantG11, true);
+		
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant21, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participantG2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participantG21, true);
+		
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant3, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant31, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participantG3, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participantG31, true);
 		dbInstance.commitAndCloseSession();
 		
 
@@ -790,9 +790,9 @@ public class CoachingDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		//make user infos
-		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource().getResourceableId(), participant, true);
-		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource().getResourceableId(), participant, true);
-		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource().getResourceableId(), participant, true);
+		userCourseInformationsManager.updateUserCourseInformations(re1.getOlatResource(), participant, true);
+		userCourseInformationsManager.updateUserCourseInformations(re2.getOlatResource(), participant, true);
+		userCourseInformationsManager.updateUserCourseInformations(re3.getOlatResource(), participant, true);
 		dbInstance.commitAndCloseSession();
 
 		//update props
diff --git a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
index 611583147225376da22c35ac572bc2e85e0a3374..e65809e737ccee9869a7a5b503552ce8ecb904ef 100644
--- a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
+++ b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java
@@ -322,9 +322,9 @@ public class ReminderRuleEngineTest extends OlatTestCase {
 		
 		//create user course infos
 		Long courseResId = course.getCourseEnvironment().getCourseResourceableId();
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id1, true);
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id2, true);
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id3, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id3, true);
 		dbInstance.commit();
 		
 		//fake the date
@@ -443,9 +443,9 @@ public class ReminderRuleEngineTest extends OlatTestCase {
 		
 		//create user course infos
 		Long courseResId = course.getCourseEnvironment().getCourseResourceableId();
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id1, true);
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id2, true);
-		userCourseInformationsManager.updateUserCourseInformations(courseResId, id3, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id1, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id2, true);
+		userCourseInformationsManager.updateUserCourseInformations(re.getOlatResource(), id3, true);
 		dbInstance.commit();
 		
 		//fake the date